星期日, 2月 24, 2013

Raspberry Pi Boot Process

Raspberry Pi 的 SoC 是 BCM2835,看起來只能從 FAT32 的 SD 卡開機。以下是開機程序:
  1. [GPU] 執行 on-chip ROM,從 SD 卡載入 bootcode.bin 到 L2 cache。(一開始 ARM core 跟 SDRAM 是停用的)
  2. [GPU] 執行 bootcode.bin,啟用 SDRAM,並從 SD 卡載入 start.elf 到 SDRAM。(以前還有一個 loader.bin 步驟,現在整合在一起)
  3. [GPU] 執行 start.elf,讀取 config.txt、cmdline.txt 及 kernel.img,啟用 ARM (另外不確定是否還有 bcm2835.dtb)
  4. [ARM] 開始 Linux kernel booting,kernel.img 就是 kernel,而 cmdline.txt 放 kernel 開機參數。kernel 的 rootfs 可以是另一個分割
上述韌體可在 https://github.com/raspberrypi/firmware 取得,GPU 部份的原始碼並未開放。


參考:
  1. http://www.raspberrypi.org/phpBB3/viewtopic.php?f=63&t=6685
  2. https://github.com/dwelch67/raspberrypi (一些 non-OS 的低階程式)

[iptables] xt_recent

300 秒內最多只能有 10 次 ssh 連線嘗試

iptables -t filter -A "input_wan" -p "tcp" --dport 22 -m recent --set --name SSH_CHECK
iptables -t filter -A "input_wan" -m recent --update --seconds 300 --hitcount 10 --name SSH_CHECK -j DROP

指令格式
iptables -t filter -A "input_wan" 規則:新增規則到 filter 表格的 input_wan 鏈

使用 xt_recent 模組建立兩個規則,前者將 TCP port 22 連線的來源 IP 位址紀錄到名為 SSH_CHECK 的列表。後者更新列表,找出最近 300 秒內出現 10 次以上的連線,drop 掉它

/proc/net/xt_recent/* 可看或設定列表

http://snowman.net/projects/ipt_recent/ 有其它例子,詳細說明可見 `man iptables`

延伸閱讀

PWM 轉成聲音輸出

下面是從 Raspberry Pi Rev.20 電路圖剪下來的,只需要簡單的電路,就可以將 PWM 轉成聲音輸出
至於如何將 PCM 轉換成 PWM 訊號又是另一個問題。

Raspberry Pi 的 SPI

Raspberry Pi 使用 BCM2835,而 BCM2835 共有 1 組 SPI slave 跟 3 組 SPI master (SPI0, SPI1, SPI2),其中只有 SPI0 透過 Raspberry Pi 的 P1 接出,如下表。


Chip-SelectMISOMOSISCLK
Raspberry Pi
SPI slaveGPIO 21GPIO 20GPIO 18GPIO 19
只有部份接出 (P1, S5)
SPI0 masterGPIO 7/8GPIO 9GPIO 10GPIO 11
接到 P1
GPIO 35/36GPIO 37GPIO 38GPIO 39
未接出
SPI1 masterGPIO 16/17/18GPIO 19GPIO 20GPIO 21
只有部份接出 (LED, P1, S5)
SPI2 masterGPIO 43/44/45GPIO 40GPIO 41GPIO 42
只有部份接出 (S6)
Picture from http://ruten-proteus.blogspot.tw/2012/10/raspberry-pi-model-b.html

除了一般 3-wire SPI 外,SPI0 亦可將 MISO 跟 MOSI 合併成一條雙向的訊號,或者作為 LoSSI (Low Speed Serial Interface) 的 master。運作模式支援 polling、interrupt 及 DMA。

參考文獻
  1. BCM2835 ARM Peripherals datasheet
  2. Raspberry Pi 電路圖
  3. http://elinux.org/RPi_Low-level_peripherals

星期六, 2月 23, 2013

忽略 stdout 及 stderr 輸出

Linux 下要忽略 stdout 及 stderr 時,會將兩者輸出重新導向 /dev/null,常常看到的寫法是指令後面加上「>/dev/null」及「2>&1」。前者將標準輸出,也就是 stdout (檔案編號 1),導向 /dev/null。後者將檔案編號 2,也就是 stderr,導向已經導向 /dev/null 的檔案編號 1。在孤島日誌的《Unix 重新導向跟 2>&1》有細節解說。


此外「&>/dev/null」將所有輸出,不單只有 stdout 跟 stderr,全部導向 /dev/null。上述孤島日誌的作者查了一下回答說這是 bash 專用語法,不是 POSIX 標準語法。

另外「>/dev/null 2>/dev/null」是不是也可以呢?有什麼不同呢?

延伸閱讀
  • csh/tcsh 導向是用「> & file」

Cheap Linux Platform

最便宜的 Linux 平台,大概 Flash 要有 2-4MB 以上,RAM 16MB 以上
  • TP-LINK WR703N (約 NT$600)
    • MIPS CPU @400MHz, 4MB Flash, 32MB RAM
    • Wi-Fi, Ethernet, USB
    • UART 跟 GPIO 要另外拆開焊接
  • Raspberry Pi US$35 (在台灣購買要 NT$1850 或 256MB RAM 的 NT$1520)
    • ARM1176JZF-S CPU @700-1000MHz, 256MB DDR2,內建 GPU,外插 SD 卡開機
    • Ethernet, 2x USB, Audio out, Video/HDMI out
    • 有 UART、GPIO 等其它擴充接腳
    • 需要另外購買電源、SD 卡
  • 基於 S3C6410 的平台,通常含有觸控螢幕,要 NT$3000 以上
還有其它可跑 Linux 的便宜平台嗎?歡迎提供。

2012/12/20 補充:這個網頁整理了便宜的 ARM 平台小電腦

星期五, 2月 22, 2013

HTML <input> size Attribute

HTML <input> 設定同樣 size,單位是 character,但在不同瀏覽器顯示的寬度卻不同,找到兩種解法:
  1. 使用 CSS width Property[參考來源]
  2. 使用 FIXED space font[參考來源],例如
    input {font-family: monspace}
相關文章:

eval

有些 (還是大部份?) 指令檔語言都有 eval 函數,例如 JavaScript、bash,把臨時產生的字串當成程式碼執行。也就是當成程式碼的字串,可以臨時去別的地方抓過來,可以用任何處理字串的方式處理過。

eval 是 evaluate 或 evaluation 的縮寫。

例如下面用戶端 JavaScript 範例:

try {
    alert("Result: " + eval(prompt("Enter an expression:", "")));
}
catch(exception) {
    alert(exception);
}

瀏覽器開啟後會提示使用者輸入程式碼 (prompt),然後透過 eval 去執行,最後顯示結果。

使用 Ubuntu 12.10

安裝:參考 VAIO S13 安裝 Ubuntu 12.10
安裝 hime 輸入法

右上角
  • 系統設定值...
    • 亮度與鎖定
      • 鎖定 (關:不鎖定螢幕)
      • 從暫停狀態下喚醒需要密碼 (不選)
始動應用程式:Dash 尋找「始動應用程式」。[詳細參考]
Web App 整合功能

音檔

raw file
  • 播出來:play -f s -r 8000 -s w test.raw
  • 轉換成 wave 檔:sox -t raw -r 8000 -s -w -c 1 test.raw test.wav
  • 畫出波形:octave
wave file
  • 播出來:play test.wav
MPlayer 音樂播放去除人聲
Audacity 音樂檔編輯
聲音處理軟體Audacity & 語音分析軟體Praat

影像處理

sudo apti-get instsall gimp

sudo apt-get install pinta (這個是基於 mono 的)

註:gpaint 連 undo 也沒有。小畫家等級的程式似乎都沒有 cropping 功能,rgbprint 似乎是不錯的簡易版,mtPaint 預設黑背景及紅前景有些奇怪。kolourpaint 是基於 KDE 的。

Dropbox

安裝:「Ubuntu 軟體中心」搜尋「dropbox」

Dropbox Uploader:參考 Dropbox Uploader Bash Script: Useful For Servers, Raspberry Pi And More

Google Drive

Google 硬碟目前還沒有官方的用戶端程式
How To Use Google Drive on Linux: 2 Unofficial Solutions


舊文章:
參考:
  1. Linux 安裝與使用

Linux 架 tftp server

Ubuntu 12.10 架 tftp server,放 tftp 檔案目錄用 /tftp

步驟如下:
sudo apt-get install tftpd-hpa
sudo chmod 777 /var/lib/tftpboot
cd /
sudo ln -s /var/lib/tftpboot

或者
sudo chmod 777 /srv/tftp
cd /
sudo ln -s /srv/tftp /tftpboot

然後檔案放到 ~/tftpboot 就可給 tftp client 取用

停用 tftpd
sudo service tftpd-hpa stop

啟用 tftpd
sudo service tftpd-hpa start

設定檔:/etc/default/tftpd-hpa

需要加參數 --create?

HTML 表格排序:使用 tablesorter

想要讓網頁表格依某一欄排序,不想在伺服器端動手腳,看 jQuery 能不能在瀏覽器端達成。網路搜尋 jQuery 表格排序,得到的答案就是要加用 tablesorter plugin,那就來用看看。

使用 tablesorter 很簡單,前提是表格必須要有 <thead></thead> 及 <tbody></tbody> 讓 tablesorter 知道表頭跟表身在哪裡。除此之外只需要文件載入後呼叫 tablesorter(),並可作預設排序欄位等設定。tablesorter 會自動偵測大部分的資料格式,例如數字、日期、IP 位址等。

網頁 <head> 區範例如下:
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script>
$(document).ready(function() {
  $("table").tablesorter({ // 呼叫 tablesorter
    sortList: [[0,0]] // 預設排序:第一欄,由小而大
  });
});
</script>

星期三, 2月 06, 2013

CSS vertical-align

垂直對齊。例如文字跟圖片擺在同一行時,預設是 baseline 對齊,像是這樣:

An W3Schools image with a default alignment.

如果想要中間對齊,可加「style="vertical-align: middle;"」,結果如下:

An W3Schools image with a default alignment.

其它垂直對齊方式可見參考 1。

參考:
  1. http://www.w3schools.com/cssref/pr_pos_vertical-align.asp
  2. http://www.w3schools.com/css/tryit.asp?filename=trycss_vertical-align