當我忍不住打開一道門之後…
就開始多多少少有東西加了進來
人事、聲囂……
越來越多、越來越多…不停的塞了進來
現在回頭看,已經是喧鬧不堪了!!
沒有多掌握到什麼,反而失了大局。
這就是衝動嗎??…………
2011年6月23日 星期四
[ linux ] ssh (1)
★ 大量使用 SSH 發送指令時,可以在 ~/.bash_profile 裡加入一些 alias 節省自己的時間
alias opssh='ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.op -lroot'
alias opscp='scp -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.op -o user=root'
StrictHostKeyChecking 這個參數設成 no 時,可能在第一次登入時,不用打 yes。
★ 從 batch 上灑 job 讓 worknodes 自行確認正反解
for((i=190; i<200; i++)); do ssh worknode-$i.doman.name "host \`hostname -i\`"; done
for i in `cat host_list2`; do opssh $i "hostname; kill -9 \`ps aux|grep job_snmp|awk 'BEGIN {FS=\" \" } {printf \$2 \"\t\"}'\` "; done
alias opssh='ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.op -lroot'
alias opscp='scp -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa.op -o user=root'
StrictHostKeyChecking 這個參數設成 no 時,可能在第一次登入時,不用打 yes。
★ 從 batch 上灑 job 讓 worknodes 自行確認正反解
for((i=190; i<200; i++)); do ssh worknode-$i.doman.name "host \`hostname -i\`"; done
★ 下面兩個例子,利用SSH 查看底下的 node 的特定 process
並執行 kill 來砍掉特定的 process ~~
for i in `cat host_list2`; do opssh $i "hostname; ps aux|grep job_snmp"; done
for i in `cat host_list2`; do opssh $i "hostname; kill -9 \`ps aux|grep job_snmp|awk 'BEGIN {FS=\" \" } {printf \$2 \"\t\"}'\` "; done
上面比較特別的是在兩個雙引號 " " 之間的指令~,如果有特殊字元要記得用反斜線跳脫。
像 執行會用到的 ` `
awk 內用的到的 " "
2011年6月19日 星期日
[ linux ] time 時間控制
在 linux 下使用 shell script,
要進行一些定時的動作,雖然沒有辦法像 c 直接摳 lib準給你看~
但也是有一些做法啦~~
下面是我使用的方法、有土法煉鋼的感覺XD
首先是用 date 來叫系統的時間,標計不同動作之間所花費的時間。
再利用 sleep 把剩下的時間花掉。
這裡 sleep 的時間是變數。會隨著每次執行時,經過不同時間標計,跟欲停等的時間相減。
這樣就可以讓程式更精確的掌握時間。
date 指定輸出時間,可以使用 %N 輸出位數到達 ns (雖然極限還是要看系統本身)。
這樣就可以讓 sleep 時間更精細。
下面的例子是假設我執行一個動作,是 sleep $1 輸入的時間。
那我想要每十秒做一次。
t1, t2 是兩個不同時間的標計
那 t3就是用來計算剩下來,要等待的時間。
現在改成真實情況下~~~現在我要監況系統上 每秒鐘 page 的變化。
再 pipe 一個 awk 的指令,指定抓出 dirty, active, inactive page 容量的這三個資訊。
從結果看來,每次抓取 data 的時間可以控制在 0.005秒左右的時間誤差。
[root@root local]# sh view_page.sh
1308418954.922866000 Active: 528868 Inactive: 14413628 Dirty: 0
1308418955.927929000 Active: 528768 Inactive: 14413628 Dirty: 24
1308418956.932796000 Active: 528772 Inactive: 14413624 Dirty: 32
1308418957.937796000 Active: 528836 Inactive: 14413624 Dirty: 32
1308418958.942785000 Active: 528828 Inactive: 14413624 Dirty: 32
1308418959.947850000 Active: 528840 Inactive: 14413624 Dirty: 120
1308418960.952689000 Active: 528856 Inactive: 14413624 Dirty: 120
1308418961.957697000 Active: 528848 Inactive: 14413628 Dirty: 120
1308418962.962704000 Active: 528836 Inactive: 14413628 Dirty: 148
1308418963.967793000 Active: 528848 Inactive: 14413628 Dirty: 148
1308418964.972579000 Active: 528876 Inactive: 14413620 Dirty: 8
要進行一些定時的動作,雖然沒有辦法像 c 直接摳 lib準給你看~
但也是有一些做法啦~~
下面是我使用的方法、有土法煉鋼的感覺XD
首先是用 date 來叫系統的時間,標計不同動作之間所花費的時間。
再利用 sleep 把剩下的時間花掉。
這裡 sleep 的時間是變數。會隨著每次執行時,經過不同時間標計,跟欲停等的時間相減。
這樣就可以讓程式更精確的掌握時間。
date 指定輸出時間,可以使用 %N 輸出位數到達 ns (雖然極限還是要看系統本身)。
這樣就可以讓 sleep 時間更精細。
下面的例子是假設我執行一個動作,是 sleep $1 輸入的時間。
那我想要每十秒做一次。
t1, t2 是兩個不同時間的標計
那 t3就是用來計算剩下來,要等待的時間。
[root@local tmp]# cat time_test.sh #!/bin/bash time_step=10.0 t1=`date -u +%s.%N` sleep $1 t2=`date -u +%s.%N` t3=` echo "scale=9; $time_step-($t2 - $t1)" |bc -l` sleep $t3 [root@local tmp]# for ((i=1; i<=3; i++)); do time sh time_test.sh 2.222; done real 0m10.015s user 0m0.000s sys 0m0.000s real 0m10.017s user 0m0.000s sys 0m0.000s real 0m10.017s user 0m0.000s sys 0m0.004s上面用 time 來幫忙測試修正後的準度是多 0.015秒左右。
現在改成真實情況下~~~現在我要監況系統上 每秒鐘 page 的變化。
#!/bin/bash while [ 1==1 ]; do tt=`date -u +%s.%N` #echo -ne "$tt"|awk 'BEGIN {FS="."} {printf $1 "\t" }' echo -ne "$tt\t" cat /proc/meminfo|awk '{ FS=" "} $1=="Dirty:"|| $1=="Active:"||$1=="Inactive:" {printf $1 "\t" $2 "\t" }' echo t2=`date -u +%s.%N` t3=`echo "scale=9;1-($t2-$tt)"|bc -l` sleep $t3 donecat /proc 下的一些系統資訊
再 pipe 一個 awk 的指令,指定抓出 dirty, active, inactive page 容量的這三個資訊。
從結果看來,每次抓取 data 的時間可以控制在 0.005秒左右的時間誤差。
[root@root local]# sh view_page.sh
1308418954.922866000 Active: 528868 Inactive: 14413628 Dirty: 0
1308418955.927929000 Active: 528768 Inactive: 14413628 Dirty: 24
1308418956.932796000 Active: 528772 Inactive: 14413624 Dirty: 32
1308418957.937796000 Active: 528836 Inactive: 14413624 Dirty: 32
1308418958.942785000 Active: 528828 Inactive: 14413624 Dirty: 32
1308418959.947850000 Active: 528840 Inactive: 14413624 Dirty: 120
1308418960.952689000 Active: 528856 Inactive: 14413624 Dirty: 120
1308418961.957697000 Active: 528848 Inactive: 14413628 Dirty: 120
1308418962.962704000 Active: 528836 Inactive: 14413628 Dirty: 148
1308418963.967793000 Active: 528848 Inactive: 14413628 Dirty: 148
1308418964.972579000 Active: 528876 Inactive: 14413620 Dirty: 8
當然,這些都只是以現有的 bash 組合一些工具,盡可能的做出來。
我相信如果使用程式語言,應該還有更精確、嚴謹的作法~~~
改天有機會再研究嘍~~~~
2011年6月5日 星期日
抽象化。
前一陣看到一個有趣的議題~它描述資訊世界中,眾多的抽象化處理。
雖然為我們帶來很多便利;提升不少程式設計師的產力。
但卻也在這個世界埋下了,有機會造成崩壞的因子。
它舉了 TCP/IP 為例子,TCP 是一個"可靠的網路傳輸協定,但是它卻是建在 IP 這個不可靠的通訊協定上。
這可以有兩種說法~一種是,利用 TCP 的各種確認機制盡力達到"非常可靠"。另一種說法就是…拿上層的協定來催眠自己,說這整個過程沒有問題了!!
(目前 TCP/IP 我完全沒有什麼概念,並沒有辦法很細節的解釋上面的例子)
不過,這個議題還是引起我的注意~~
它另外題到了 SQL語法的例子;相同動作,不同 query 的語法,會造成效率很大的差距。
這就是一個很常見,在抽象化之後,被架空的結構。
也就是就你眼前所見,完全沒辦法理解它發生的原因。因為底層有太多太多的步驟被包裝成來了!!
當這些包裝的發展越來越好的時候,能進入這個圈子的人就變多了~
可是懂得包裝下,複雜繁鎖、重重機關的人將變少了
大量的工具、語法,幫我們把背後的工作都包裝起來~
SQL 我們不用寫排序、列表的程式,不用去看現在最快的演算法是什麼。只要會下 SQL query 就好了。
寫 Email、寫網誌~我們不用手刻檔頭、不用自己加標籤。
在系統上,我們寫入檔案,不用管它要寫到哪個磁柱的那個磁區。它的上層還有 Block map , Block group 才到記憶體的 page layer 。
多的是抽象處理時,帶來的便利~~~
不過不知道哪天、哪個程式上,產生了一個 bug 會讓整個系統崩潰,讓大家措手不及。
避免那個世界末日的來臨?
在程式語言上,可能可以在編譯器上動手腳。確認程設工程師的語義。提高面對不同寫作習慣的理解~~bababa。
( 這些可能就是現在寫編譯器的人在做的事吧? 好好奇喔…)
但是程式言自己本身語法的正交性,這個就是天生的了…已經問世的語言,他們大概沒辦法在語法上做什麼太大的更動…除非是砍掉重練。
目前我還只是初涉資訊這個領域,對於發展的過程、歷史大多一知半解,打打嘴砲。或許改天了解更多之後,會再對這個議題有不同的看法~^ ^
題外話~~抽象化聯想到的一些往事……
大學在修量子物理時,就大量使用很多抽象的算子、算符來代替每個粒子位置、動量…
看到題目時,常常就只是無腦的把它的算符列一列,式子套一套就衝了。
埋頭算了一大票~~回頭看時,都忘記我算的這些都東東都不單單只是個數字,都還有他們要滿足的物理定律。
這應該也可以算是抽象化造成錯誤的直覺……。
裡頭…也因此有人的想法被架空了~~~ㄏㄏ
雖然為我們帶來很多便利;提升不少程式設計師的產力。
但卻也在這個世界埋下了,有機會造成崩壞的因子。
它舉了 TCP/IP 為例子,TCP 是一個"可靠的網路傳輸協定,但是它卻是建在 IP 這個不可靠的通訊協定上。
這可以有兩種說法~一種是,利用 TCP 的各種確認機制盡力達到"非常可靠"。另一種說法就是…拿上層的協定來催眠自己,說這整個過程沒有問題了!!
(目前 TCP/IP 我完全沒有什麼概念,並沒有辦法很細節的解釋上面的例子)
不過,這個議題還是引起我的注意~~
它另外題到了 SQL語法的例子;相同動作,不同 query 的語法,會造成效率很大的差距。
這就是一個很常見,在抽象化之後,被架空的結構。
也就是就你眼前所見,完全沒辦法理解它發生的原因。因為底層有太多太多的步驟被包裝成來了!!
當這些包裝的發展越來越好的時候,能進入這個圈子的人就變多了~
可是懂得包裝下,複雜繁鎖、重重機關的人將變少了
大量的工具、語法,幫我們把背後的工作都包裝起來~
SQL 我們不用寫排序、列表的程式,不用去看現在最快的演算法是什麼。只要會下 SQL query 就好了。
寫 Email、寫網誌~我們不用手刻檔頭、不用自己加標籤。
在系統上,我們寫入檔案,不用管它要寫到哪個磁柱的那個磁區。它的上層還有 Block map , Block group 才到記憶體的 page layer 。
多的是抽象處理時,帶來的便利~~~
不過不知道哪天、哪個程式上,產生了一個 bug 會讓整個系統崩潰,讓大家措手不及。
避免那個世界末日的來臨?
在程式語言上,可能可以在編譯器上動手腳。確認程設工程師的語義。提高面對不同寫作習慣的理解~~bababa。
( 這些可能就是現在寫編譯器的人在做的事吧? 好好奇喔…)
但是程式言自己本身語法的正交性,這個就是天生的了…已經問世的語言,他們大概沒辦法在語法上做什麼太大的更動…除非是砍掉重練。
目前我還只是初涉資訊這個領域,對於發展的過程、歷史大多一知半解,打打嘴砲。或許改天了解更多之後,會再對這個議題有不同的看法~^ ^
題外話~~抽象化聯想到的一些往事……
大學在修量子物理時,就大量使用很多抽象的算子、算符來代替每個粒子位置、動量…
看到題目時,常常就只是無腦的把它的算符列一列,式子套一套就衝了。
埋頭算了一大票~~回頭看時,都忘記我算的這些都東東都不單單只是個數字,都還有他們要滿足的物理定律。
這應該也可以算是抽象化造成錯誤的直覺……。
裡頭…也因此有人的想法被架空了~~~ㄏㄏ
2011年6月2日 星期四
[ chrome ] Yet Another Google Bookmarks Extension
Yet Another Google Bookmarks Extension
一套整合 google bookmarks 的外掛
可以直接在 chrome 的工具列上點開 google bookmarks
它把 bookmarks 的標簽做資料夾,遊覽起來非常方便。
要新加網頁到 google bookmarks 的話,可以直接右鍵。
它已經把選項放到右鍵的欄位裡了。
https://chrome.google.com/webstore/detail/jdnejaepfmacfdmhkplckpfdcjgbeode
一套整合 google bookmarks 的外掛
可以直接在 chrome 的工具列上點開 google bookmarks
它把 bookmarks 的標簽做資料夾,遊覽起來非常方便。
要新加網頁到 google bookmarks 的話,可以直接右鍵。
它已經把選項放到右鍵的欄位裡了。
https://chrome.google.com/webstore/detail/jdnejaepfmacfdmhkplckpfdcjgbeode
訂閱:
文章 (Atom)