2016年8月13日 星期六

新Top 介紹

top 一直是command line 上相當重要的工具,一打開就列出幾個高消耗的行程,等著kill (X,有時候不小心把電腦給炸掉的時候還滿好用的。
不過不知啥時更新後,新版的top 介面大改之後,我就不會用了OAO

最近決定把top 的用法給好好研究一遍,其實也就是把manpage 看過一遍啦,這裡做點筆記:

進到top 後,主要分成
1) Summary Area; 
2) Fields/Columns Header; 
3) Task Area

幾個沒變的命令:
h是help,q是quit沒變。
上下左右,page up/down, home, end,調位置

Summary Area 沒啥好說,顯示uptime, load average, Task 和CPU 的狀態
CPU 的狀態可用 t 來toggle顯示方式,可以關掉CPU 顯示,下面資料全部顯示,或者只顯示us+ni / sy total
用 1 來toggle 顯示全部的CPU 亦或合成一個

顯示的縮寫意思:
us, user : time running un-niced user processes
sy, system : time running kernel processes
ni, nice : time running niced user processes
id, idle : time spent in the kernel idle handler
wa, IO-wait : time waiting for I/O completion
hi : time spent servicing hardware interrupts
si : time spent servicing software interrupts
st : time stolen from this vm by the hypervisor

Memory 的狀態用 m 來選擇顯示方式 Used/Avail graph 或都純文字顯示

Field/Column 大概是跟舊版比起來變最多的,這裡可以用f 進到managing fields來設定要顯示的欄位,按f 後在想要的資訊用 space 或 d 來選擇要不要印出,用s 來設定用哪個欄位排序。

欄位基本上都有註解,我預設沒特別設定印出的欄位會是:
PID USER PR NI VIRT RES %CPU %MEM TIME+ S COMMAND
事實上可以印的東西很多,可以自行看manpage的介紹,不過我覺得實際上需要的其實也就預設這幾個。
其實寫這篇最主要的目的就是sort 了,因為開了top 都不知道要kill 誰了;現在自行設定用CPU 來sort,之後新的top 就像舊的top 一樣,把佔用最多CPU 的行程放在最上面,等著我們kill (X

另外也有些快捷鍵能設定排序欄位:
M: %MEM
N: PID
P: %CPU
T: TIME+

另外還有一些有趣的global command:
d: 設定更新的頻率
E/e: 設定Summary Area/Task Window記憶體的單位,從KiB 到EiB (真的有人有這麼多記憶體嗎XD)都行
g: 新的top 可以開四個不同的顯示視窗,可以有各自設定,用g 來選擇
k: 大殺四方行程,這跟原本的top 是一樣的
r: renice, 就…就是renice
L: 定位字串,如果要highlight 某個關鍵字可用,類似vim 裡面的 '/',找下一個則是 &

如果要改變畫面的顏色mapping,可以用Z 進到互動設定
用b/B toggle粗體顯示,z 設定是否彩色顯示,另外能設定各欄位的顏色:
S = Summary Data, M = Messages/Prompts,
H = Column Heads, T = Task Information
不過我是沒什麼美感的人,去改配色大概只會悲劇,所以就放著讓它用預設顏色就好。

初看新版的top ,應該是舊的top 功能不夠了,所以整個大翻修,還有許多功能本篇沒有介紹,剩下的大概都是平常用不太到的功能吧,就留給有興趣的人去研究了。

2016年8月2日 星期二

使用Facebook bot on GAE自動監控網頁更新

故事是這樣的,最近我有一位同學在申請日本留學試驗(EJU)的獎學金,最近會在網站上公佈複試的錄取名單,不過他八月又要去美洲大殺兩個星期,想託我幫他看一下複試結果什麼時候出來,出來的話跟他通知一下(說實話就算出來了在美洲是能幹嘛,還不如專心大殺四方)
不過you know,我這個人嘛,懶~~,每天上去看網頁多麻煩…要是哪天忘了看那可是賠不起呀,畢竟強者我同學成績猛高,成績都比平均高了兩個標準差,我去考大概只能考他的零頭出來QQ。
靈機一動,為啥我不找我的好友「葉闆大師」幫忙呢?心情不好的時候跟他聊聊天,他一字一句都是鼓勵的話,十足的激勵人心,檢查網頁這樣的小事能不能拜託他呢?決定就來試試看了。

概念其實很簡單,Google App Engine 本身就有cron 的設定,可以定時觸發一個function,最快每一分鐘觸發一次,到一個月一次都行;還有各種複雜的設定文件:
http://yhhuang1966.blogspot.tw/2013/03/gae-cron-job.html

首先我們先把向facebook 某user 發送訊息的函式獨立出來,再寫一個新的class 處理cron 的狀況,至於receiver 的ID (也就是我的ID) 是多少,那在之前寫bot 的時候,從log 裡面撈出來的:
CONSTANT_RECEIVER = "Fan ID Here"

class FBNotify(webapp2.RequestHandler):
    def get(self):
        logging.info("Fire periodically hello")
        send_fb_message(CONSTANT_RECEIVER, "Periodically Hello")

 app = webapp2.WSGIApplication([
     ('/webhook', FBwebhook),
     ('/fbnotify', FBNotify),
     ('/', MainPage),
 ], debug=True)

有了上面的設定,在project 中加上cron.yaml 先設定每分鐘觸發一次fbnotify get(注意雖然是 1分鐘可是要寫 minutes),時區在以分鐘為單位的狀況就不用設了,詳細請見參考資料:
cron:
- description: check eju website automatically
  url: /fbnotify
  schedule: every 1 minutes
  timezone: Asia/Taipei

用appcfg.py update之後葉闆大師就會熱情的每分鐘定期向你問好:

如果覺得它很煩,只要把cron.yaml 裡面的內容刪到剩下cron: 一行,再appcfg.py update_cron把cron 取消掉就行了。

當然這樣還不行,重點是要監看,EJU 的結果會公佈在這裡:
https://www.koryu.or.jp/taipei-tw/ez3_contents.nsf/14
方法就很正規了,把第一列的資料給拉出來,xpath 的部分先用chrome 的檢查看過,決定xpath 為:
//tr[@valign='top']/td/a[@title]/@title
受限於gae 的關係,我們只能用lxml (其實應該也可以裝 beautifulsoup 不過我有點懶),搭配urllib2把資料拉下來,取出第一列的資料若是和現在的資料不同就給我發送訊息,測試用時,就算沒變也會發一則:
URL = "https://www.koryu.or.jp/taipei-tw/ez3_contents.nsf/14"
FIRST_ROW = u"2016年度第二期日本交流協會獎學金(短期留學生)--合格發表"
res = urlfetch.fetch(self.URL)
s = res.content

root = lxml.html.fromstring(s)
firstTitle = root.xpath("//tr[@valign='top']/td/a[@title]/@title")[0]
isNew = (firstTitle != self.FIRST_ROW)
if isNew:
    send_fb_message(CONSTANT_RECEIVER, "Notification: There is new message")
else:
    send_fb_message(CONSTANT_RECEIVER, "Notification: There is no new message")
把它加到fbnotify 的get 裡面,先用cron 為1 minute 測試,確定真的會送出訊息;也可以直接開瀏覽器,造訪 xxxx.appspot.com/fbnotify 觸發檢查,看看有沒有發訊息給你:



接著就可以把cron 改為30 minutes了,安心去睡覺等葉闆大師的通知了……


才怪!

我還是超緊張的,還是會開網站檢查一下它有沒有更新,要是code 沒寫好怎麼辦,或者葉闆大師下線了呢?這個網站為啥不弄個RSS 之類的就好了Orz。老實說,寫這個花了一兩個小時,其實只要每天早上花 1 秒鐘開網頁看一下就好了,我覺得我這樣根本多此一舉。

參考文件:

GAE cron 相關文件,cron的佈署和 schedule format:
https://cloud.google.com/appengine/docs/python/config/cron
https://cloud.google.com/appengine/docs/python/config/cronref#schedule_format

其他相關文件,python built-in-libraries
https://cloud.google.com/appengine/docs/python/tools/built-in-libraries-27


ps :想靠北一下,GAE 用了兩年覺得網頁愈改愈亂,要找想要的東西都找不到,每每花一堆時間在找一些小東西。

----

按:剛剛在中午左右,已經收到葉闆大師的通知了,實驗成功,謝謝你葉闆大師XD