一時興起下載了 CentOS-6.3-x86_64-minimal.iso 在 VBox 安裝起來,開機後竟然沒有網路可用。應是是預設沒有開啟,於是在網路上找到解法,要改網路設定檔,把開機啟動的選項設為 yes:
..
..
改好設定 reboot 後,完成 VBox 的 NAT port forward 就可以開始練習操作嚕 :D
2012年8月2日 星期四
[ec2] 開啟 ssh login by password 筆記
使用 ec2 ami 建出的 instance 預設是使用 *.pem 登入的,若是計劃將讓一般的使用者也能登入,就必需修改 /etc/sshd_config:
PasswordAuthentication no
改成
PasswordAuthentication yes
如果需要允許 root 登入可加開(最好是不要,或是你有限制登入 ip 的前題下):
PermitRootLogin yes
改完後別忘了指定新密碼給 root,並重新載入 sshd_config:
/etc/init.d/sshd reload需注意的是在 /etc 下有二個檔 ssh_config 與 sshd_config,別改錯檔了。
千萬要記得限制可登入的 IP(/etc/hosts.allow 或使用 ec2 security group)
2012年6月20日 星期三
[ec2] 取得 EC2 Tags
工作的關係,開始大量使用 ec2 服務,其中一部分是撰寫『爬蟲』類。這些爬蟲大多數的內容是一樣的,但可能依爬的對向會使用不同的 rule 執行。並且有監控爬蟲的程式通知現在『生態系』不平衡了,需要多放一點特定類型的爬蟲。
在概念上,大家的程式幾乎都一樣的,那我就不用為每一種類型建一個 AMI 作為爬蟲的樣版。若將 ec2 instance 想成物件,大概是這種感覺:
我們只需在『建構子』指定不同的參數,當 ec2 instance 建立起來後,讓它『找尋生命的意義』(找到自己的參數)然後開始工作。有幾個方式能做到 cloud-init,這是蠻流行的方式,我曾試著使用它加速 instance 的初始安裝。在 ec2 instance 上能塞資料的地方很多,而我們的參數也不佔什麼空間,今天靈機一動,決定將它放到 tag 內,若將它表現成 java code 是這種感覺:
所以,我們需要做的事有:
本來以為 ec2 instance metadata 就會有 tag 資訊,查了一些資料發現在幾年前有人提議要將 tag 資訊加入,但目前仍沒看到。好在 aws api 蠻容易使用的,我們可以配合 ec2-metadata query tool 先取得 instance id,再查出此 instance id 擁有的 tag:
..
..
所以,實際上我們實作時,決定用 tag 內 handleClass 的值當作 Crawler 啟動參數:
將它設置好,建成 AMI。而建立 ec2 instance 時,記得指定需要的 handleClass 就能依需要動態建出不同功用的 instance。
在概念上,大家的程式幾乎都一樣的,那我就不用為每一種類型建一個 AMI 作為爬蟲的樣版。若將 ec2 instance 想成物件,大概是這種感覺:
Crawler c = new Crawler('type')c.run()
我們只需在『建構子』指定不同的參數,當 ec2 instance 建立起來後,讓它『找尋生命的意義』(找到自己的參數)然後開始工作。有幾個方式能做到 cloud-init,這是蠻流行的方式,我曾試著使用它加速 instance 的初始安裝。在 ec2 instance 上能塞資料的地方很多,而我們的參數也不佔什麼空間,今天靈機一動,決定將它放到 tag 內,若將它表現成 java code 是這種感覺:
Crawler c = new Crawler(EC2Instance.current().tag('type'))
c.run()
所以,我們需要做的事有:
- 撰寫啟動 script 並讓它接受參數指定我們要啟動的程式
- 實作取得特定 tag 的方法
本來以為 ec2 instance metadata 就會有 tag 資訊,查了一些資料發現在幾年前有人提議要將 tag 資訊加入,但目前仍沒看到。好在 aws api 蠻容易使用的,我們可以配合 ec2-metadata query tool 先取得 instance id,再查出此 instance id 擁有的 tag:
..
..
所以,實際上我們實作時,決定用 tag 內 handleClass 的值當作 Crawler 啟動參數:
Crawler c = new Crawler(EC2Instance.current().tag('handleClass'))
c.run()
將它設置好,建成 AMI。而建立 ec2 instance 時,記得指定需要的 handleClass 就能依需要動態建出不同功用的 instance。
2012年5月26日 星期六
[osx] 擠出可用記憶體
有時在 osx 上開開關關程式後會發現記憶體都變成『未啟用』的狀態。而『可用的』記憶體維持在相當少的數量:
依網路上的說法這是 osx 要最佳程式啟動的機制。當你曾開過一個程式,關閉後,他會被放入『未啟用的』這個區域。若你再打開能直接以記憶體內的『快取』啟動程式。可參考官方網頁的說明:
知道大概是怎麼一回事後,心理想:『那有工具來幫助我把那個快取的資料清掉嗎?』目前似乎沒有看到直接的工具,不過依據網路上的資料,普遍的看法都是當記憶體不夠用時會釋放『未啟用的』記憶體。這時就想起了平時被嫌棄記憶體用量大的 Java 程式,於是我寫了一個吃掉記體的程式:
..
這想法很單純,只是要把『未啟用』區的東西給擠出來:
因為每一隻程式約佔用 1 GB 的記憶體,我開 4 隻恰好為『未啟用』的大小。然後把他們關掉。我們又再度擁有 4 GB 的可用記憶體:
依網路上的說法這是 osx 要最佳程式啟動的機制。當你曾開過一個程式,關閉後,他會被放入『未啟用的』這個區域。若你再打開能直接以記憶體內的『快取』啟動程式。可參考官方網頁的說明:
未啟用的:這些資訊目前已經在 RAM 中,不過目前並未使用,只是最近曾經使用過。舉例來說,如果長時間使用 Mail 後結束此程式,系統會將 Mail 用過的 RAM 標示為“未啟用的”記憶體。其他應用程式可以使用“未啟用的”記憶體,這一點和“可用的”記憶體相同。 不過如果其他應用程式尚未使用 Mail 的“未啟用的”記憶體,您就已經先開啟 Mail,這時 Mail 開啟的速度就會比較快,因為這部分“未啟用的”記憶體已經轉換成“已啟用的”記憶體,而不是從比較慢的磁碟機載入。
知道大概是怎麼一回事後,心理想:『那有工具來幫助我把那個快取的資料清掉嗎?』目前似乎沒有看到直接的工具,不過依據網路上的資料,普遍的看法都是當記憶體不夠用時會釋放『未啟用的』記憶體。這時就想起了平時被嫌棄記憶體用量大的 Java 程式,於是我寫了一個吃掉記體的程式:
..
這想法很單純,只是要把『未啟用』區的東西給擠出來:
因為每一隻程式約佔用 1 GB 的記憶體,我開 4 隻恰好為『未啟用』的大小。然後把他們關掉。我們又再度擁有 4 GB 的可用記憶體:
2012年4月12日 星期四
MySQL 權限管理小技巧
由於過去的 MySQL 使用並沒太多的帳號規劃,只有個簡單的 user account,例如:myuser,配上 % any host 的認證組合。這個組合開的是最大的權限,雖然有在 iptables 下設定允許存取的 ip,但仍想針對特定的 ip 進行權限管理。在密碼是多數的人馬都知道的情況下,找到一個算是可用的方法。
因為 mysql 對於連線進來的 user account 會先替無萬用字元的組合配對(萬用字元的組合數較少者優先配對),我們可以針對某一個 ip 設同一個 user account 同一組密碼。並 grant 那一組特定的 ip 使用 USAGE 權限。如同手冊說的 USAGE 就是沒有權限。這樣即使拿到 user account 也無法做什麼,我們就可以強迫由特定 ip 上來的人用我們指定的 user account。而不是只能口頭相約,希望他使用我們替他額外準備好的帳號。
因為 mysql 對於連線進來的 user account 會先替無萬用字元的組合配對(萬用字元的組合數較少者優先配對),我們可以針對某一個 ip 設同一個 user account 同一組密碼。並 grant 那一組特定的 ip 使用 USAGE 權限。如同手冊說的 USAGE 就是沒有權限。這樣即使拿到 user account 也無法做什麼,我們就可以強迫由特定 ip 上來的人用我們指定的 user account。而不是只能口頭相約,希望他使用我們替他額外準備好的帳號。
2012年3月24日 星期六
2012年3月10日 星期六
[ffmpeg] 0.9 版後的新式 interrupt
這次試著更新專案內的 ffmpeg 至最新的 tag 版本 n0.9。發現專案內的『deprecated』比以往更多,但還都是能編譯的狀態。依慣例得確認一下在最新的 source code 裡,那些 deprecated 是真的被移除。於是編了 master branch 上的 code,發現 io interrupt callback 的寫法已經不再相容舊版了。
對於 ffmpeg 文件常跟不上 source code 的狀態,這連 changelog 也沒有記載這件事,我們可以簡單 diff n0.9 與前一版找出改變的部分,能利用一定會用到 io interrupt callback 的 ffmpeg.c 來作 diff:
..
舊式的 io interrupt callback 是一個 global function pointer:
..
新式的 io interrupt callback 使用一個 struct 包起來,設定在各別的 AVFormatContext:
..
要修改的部分雖然不太多,但 callback function 的參數有改,這是得注意的部分 :D
..
舊式的 io interrupt callback 是一個 global function pointer:
..
新式的 io interrupt callback 使用一個 struct 包起來,設定在各別的 AVFormatContext:
..
要修改的部分雖然不太多,但 callback function 的參數有改,這是得注意的部分 :D
訂閱:
文章 (Atom)


