2011年5月26日 星期四

shell programming - test argument

轉錄自鳥哥的 Linux 私房菜 [第十三章、學習 Shell Scripts]

測試的標誌代表意義
1. 關於某個檔名的『檔案類型』判斷,如 test -e filename 表示存在否
-e該『檔名』是否存在?(常用)
-f該『檔名』是否存在且為檔案(file)?(常用)
-d該『檔名』是否存在且為目錄(directory)?(常用)
-b該『檔名』是否存在且為一個 block device 裝置?
-c該『檔名』是否存在且為一個 character device 裝置?
-S該『檔名』是否存在且為一個 Socket 檔案?
-p該『檔名』是否存在且為一個 FIFO (pipe) 檔案?
-L該『檔名』是否存在且為一個連結檔?
2. 關於檔案的權限偵測,如 test -r filename 表示可讀否 (但 root 權限常有例外)
-r偵測該檔名是否存在且具有『可讀』的權限?
-w偵測該檔名是否存在且具有『可寫』的權限?
-x偵測該檔名是否存在且具有『可執行』的權限?
-u偵測該檔名是否存在且具有『SUID』的屬性?
-g偵測該檔名是否存在且具有『SGID』的屬性?
-k偵測該檔名是否存在且具有『Sticky bit』的屬性?
-s偵測該檔名是否存在且為『非空白檔案』?
3. 兩個檔案之間的比較,如: test file1 -nt file2
-nt(newer than)判斷 file1 是否比 file2 新
-ot(older than)判斷 file1 是否比 file2 舊
-ef判斷 file1 與 file2 是否為同一檔案,可用在判斷 hard link 的判定上。 主要意義在判定,兩個檔案是否均指向同一個 inode 哩!
4. 關於兩個整數之間的判定,例如 test n1 -eq n2
-eq兩數值相等 (equal)
-ne兩數值不等 (not equal)
-gtn1 大於 n2 (greater than)
-ltn1 小於 n2 (less than)
-gen1 大於等於 n2 (greater than or equal)
-len1 小於等於 n2 (less than or equal)
5. 判定字串的資料
test -z string判定字串是否為 0 ?若 string 為空字串,則為 true
test -n string判定字串是否非為 0 ?若 string 為空字串,則為 false。
註: -n 亦可省略
test str1 = str2判定 str1 是否等於 str2 ,若相等,則回傳 true
test str1 != str2判定 str1 是否不等於 str2 ,若相等,則回傳 false
6. 多重條件判定,例如: test -r filename -a -x filename
-a(and)兩狀況同時成立!例如 test -r file -a -x file,則 file 同時具有 r 與 x 權限時,才回傳 true。
-o(or)兩狀況任何一個成立!例如 test -r file -o -x file,則 file 具有 r 或 x 權限時,就可回傳 true。
!反相狀態,如 test ! -x file ,當 file 不具有 x 時,回傳 true
(... 閱讀「shell programming - test argument」全文)

2011年3月15日 星期二

curl 指令用法

轉錄整理自: Linux curl使用简单介绍

curl 是 Linux 下一個很強大的 http 命令列工具
1) 取得網頁內容,螢幕輸出
$ curl http://www.linuxidc.com

2) -o: 取得網頁內容,檔案輸出
$ curl -o page.html http://www.linuxidc.com

3) -x: 指定 http 使用的 proxy
$ curl -x 123.45.67.89:1080 -o page.html http://www.linuxidc.com
(... 閱讀「curl 指令用法」全文)

2010年6月20日 星期日

[DesignPattern] 觀察者模式 (Observer Pattern)

觀察者模式 (Observer Pattern) 定義了物件之間的一對多的關係,當一個物件 (subject/observable) 改變狀態,其他相依物件都會收到通知並做更新。

原則:
  • 設計時盡量讓需要互動的物間之間關係鬆綁(loose-coupling)。讓兩物件可以不知道彼此的實作細節,但透過已知的共通介面互動。

  • 例子:氣象觀測站
  • WeatherData 實作 Subject 介面(或者 java.util.* 中的 observable 介面)讓觀察者(Observer)可以隨時向他註冊(訂閱)新的消息通知,或者取消訂閱。一旦他的狀態改變時,會呼叫 Observer 的 update() 來通知他們有更新發生。
  • 消息的通知又可分為 push 與 pull 兩種,前者由 Subject 把所有資料廣播給所有 Observers,後者只是通知更新,Observers 自己用 Subject 提供的 getter 取得所需的資料。

  • 關係圖:
    (... 閱讀「[DesignPattern] 觀察者模式 (Observer Pattern)」全文)

    [DesignPattern] 策略模式 (Strategy Pattern)

    Strategy Pattern (策略模式) 定義了演算法家族,個別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變動獨立於使用操作的物件之外。

    原則:
  • 把應用中可能變化之處獨立出來,不要和那些不會變化的程式放在一起。
  • 針對介面寫程式,而非針對實踐編程:把實現的部分獨立出來,利用介面做連結,方便以後抽換。(而非透過繼承完成抽象類別的實作)
  • 多用合成(composition),少用繼承:合成是 has-a 的關係,某個物件中有另一個物件作為他的行為。

  • 例子:鴨子
  • Duck 是抽象類別,有各種鴨子繼承它,而在 Duck 之中有兩個行為物件(Quack, Fly),以及 setQuackObj(qObj), setFlyObj(fObj) 的介面可以動態抽換這些行為(演算法)的實作方式。
  • 這些行為(演算法)都是實作 QuackBehavior、 FlyBehavior 介面 (interface) 的類別。

  • 關係圖:
    (... 閱讀「[DesignPattern] 策略模式 (Strategy Pattern)」全文)

    2010年4月27日 星期二

    Solving TPB Package Problem on Ubuntu 9.10

    Here is a solution for ThinkPad button display on ubuntu 9.10.
    I try on my x60 and it works.

    The first thing is installing tpb package on ubuntu, type command:
    sudo apt-get install tpb
    After installing this package, you can press volume up/down buttons, and you would see a bar displayed on your screen. However, if you reboot ubuntu, tpb doesn't work anymore!

    The reason is tpb uses /dev/nvram device which is root privilege only.
    You should change its mode for tpb's access. Don't use chmod command, it will be recovered after rebooting. (I can't figure out the reason)

    Let's add one rule in /etc/udev/rules.d/ folder.
    In this folder, you can check if any rule file (*.rules) describes about nvram, and try to modify it.
    If not exist such file, you can copy a rule file from /lib/udev/rules.d/.
    I copy 50-udev-default.rules file:
    sudo cp /lib/udev/rules.d/50-udev-default.rules /etc/udev/rules.d/
    In this file, append a line in #mem part:
    KERNEL=="nvram", GROUP="nvram", MODE="0660"
    Let nvram in a group named nvram, and use 660 (group read/write) mode.

    Next, we should add the user in this group.
    sudo adduser <your user> nvram
    Restart your ubuntu, your Thinkpad button would work well!

    If you want to modify any settings of Thinkpad buttons, try editing this file: /etc/tpbrc

    Here are some references:
    1. [Linux] ThinkPad 的音量鈕圖示
    2. Ubuntu-Linux on IBM Thinkpad X31
    3. HOWTO: Ubuntu on IBM Thinkpad T42
    (... 閱讀「Solving TPB Package Problem on Ubuntu 9.10」全文)

    2010年1月11日 星期一

    TopCoder Algorithm Tutorials - 基本幾何學(2)

    摘錄自:Geometry Concepts: Line Intersection and its Applications

    給兩點求直線式
    給線上的兩點座標(x1, y1)、(x2, y2),求它們的直線時,把直線表示成 Ax + By = C 的形式。則:
    A = y2 - y1
    B = x1 - x2
    C = A * x1 + B * y1 (或者 A * x2 + B * y2,帶入兩點都會讓原式成立,就可以求 C)
    而 -A/B 是直線的斜率。
    (... 閱讀「TopCoder Algorithm Tutorials - 基本幾何學(2)」全文)

    2010年1月8日 星期五

    [Linux] Commands

    摘錄自: 例行性命令的建立 - 鳥哥的 Linux 私房菜

    at - 執行一次性的工作
    下面這個例子表示五分鐘後顯示 Hello 訊息,但要注意的是:
    1. 有 standard I/O 執行時不會在終端機顯示,而是用 email 的方式告訴執行者。(應該是避免未來執行時終端機有其他工作在顯示訊息,會互相干擾吧?)
    2. 指令中如果有檔案或資料夾相關的操作,最好使用絕對路徑,因為指令的下達與 PATH 變數有關, 同時與當時的工作目錄也有關連。
    at now + 5 minutes
    at> echo "Hello"
    at> <EOT> <==這裡輸入 [ctrl] + d 就會出現 的字樣!代表結束!
    這個工作會被存在 /var/spool/at/ 中,等待適當的時間點執行。可用 atq 查詢目前已存在的工作,用 atrm 刪除某個工作。
    /etc/at.allow/etc/at.deny 可以設定能執行 at 指令的使用找白名單與黑名單。
    註:batch 指令讓 CPU 工作負載小於 0.8 時才執行背景任務,需要時再研究。
    (... 閱讀「[Linux] Commands」全文)