星期一, 5月 30, 2016

讓 docker-skype 顯示中文

公司的 skype 不知道因為裝了什麼爛掉了 (似乎是 cutegram 的樣子),怎麼弄都不行,用 web skype 過一段時間會斷線,收不到訊息。後來想到,不知道有沒有人包成 docker image,一找之下,果然有:docker-skype
試用之下,的確可以順利執行,但是中文字的部份都是方塊,看起來得自己重新包了。所以就 fork 了一份,修改了 Dockerfile 與 scripts/skype-wrapper 。
Dockerfile 主要是參考下面的文章,加上安裝字型、語言的套件與設定環境變數:
skype-wrapper 則是修改腳本,因為我在 build 時,是 tag 為 elleryq/skype ,所以這邊在 docker run 的時候,也要跟著調整,否則會執行到原來的 sameersbn/skype 。
這樣就可以用一份無汙染、無添加而且有中文的 skype 了,不過這一包真的還蠻大包,吃掉 4xxMB ...

星期一, 5月 23, 2016

golang debian package

Ubuntu 14.04 預載的 golang 是 1.2.1 版,想使用最新版的 golang ,除了可以用 gvm 以外,也可以用 debian package 來安裝。這篇要介紹的工具是 godeb ,這是一個會自動幫你將最新版的 golang binary 打包為 debian package 並安裝的工具。
首先下載 64-bit 的 godeb binary 檔案並解開:wget -qO - https://godeb.s3.amazonaws.com/godeb-amd64.tar.gz | tar xvz
執行 ./godeb list 就可以列出可安裝的 golang 版本,用 ./godeb install 就可以安裝了。
要注意的是,這會跟預裝的 golang 套件衝突,所以使用前必須先移除原本裝好的 golang 套件。

星期三, 5月 18, 2016

sort month in bash

今天用 sort 去排序月份字串,明明說可以用 -M 來排序,可是實際結果卻不行。使用 --debug 來察看如何排序,卻發現有 "no match for key" 的訊息,這就奇怪了。
找了半天,才找到這篇 bash - Shell sort by month ,才明白這跟 locale 有關係,因為我的 locale 設定為 zh_TW.utf-8 ,sort 在判讀月份時,是使用當地的月份來判讀,而不認英文的月份。解決方法就是加上 LANG 或 LC_TIME 即可:LANG=c sort -k1M your_file

星期三, 5月 11, 2016

電影流水帳(2016/4/14~2016/4/30)

Diana Lane 在 Under the Tuscan Sun 這張電影海報裡的笑容很漂亮,前幾年在鋼鐵英雄裡看到她演超人的養母才驚覺到她也有一定的年紀了。
  • World War Z (IMDB, Wikipedia),台譯:末日之戰。蠻有意思的故事,Brad Pitt 飾演一個為了家庭而退休的記者,擁有敏銳的觀察力。
    這是一個慵懶的早晨,兩個女兒跳到床上叫父母起床了,爸爸 (Gerry) 媽媽很開心的起床看著兩個調皮的女兒,非常溫馨的景象。但是就在邊吃早餐邊看新聞時,發現有大事發生,Gerry 跟妻子不以為意。在送女兒上學的路上塞滿了車子,Gerry 注意到街上的情況不太對勁,他們趁著垃圾車衝過去的空檔,跟著往外衝,不幸的是車子翻了。在車子翻覆的時候,Gerry 看到了一個僵屍咬到另外一個人以後,在很快的時間內,那個人就變成了另外一個僵屍。Gerry 一家人很幸運的沒事,並且逃離。在邊逃離的過程,Gerry 跟以前的舊長官連繫,並約定好地點碰面。
    Gerry 一家人逃到一棟大樓,有一戶人家幫助了他們。度過驚魂的一晚後,Gerry 感念他們的幫助,邀請他們一起逃走,但他們不肯。Gerry 一家人往樓頂走,快到樓頂的時候,看到這一家人的兒子緊跟在後,Gerry 就順便帶著他一起走了。
    Gerry 一家人來到聯合國,前長官跟他大致說明了一下情況。韓國發生奇怪的病情,這個病是靠著咬人傳播,會導致人變成跟僵屍一樣可怕,病情蔓延的很快,一發不可收 拾,聯合國正在調查這個病的原因並試圖找出治療方法。前長官需要 Gerry 幫忙調查,所以才接 Gerry 過來,以家人的安危做條件要求 Gerry 幫忙聯合國進行調查。
    Gerry 為了家人,只能答應這個條件,於是他就跟聯合國調查小組一同到韓國去,到了韓國,結果調查小組的博士出了意外,死了。Gerry 大致了解韓國狀況以後,隨即趕往以色列,去了解為什麼以色列能提早防範。到了以色列,總理告訴 Gerry ,是因為他們攔截了印度的消息才知道有這個病,並且講了一件事情,就是他們以前有遇過狀況,所以決定當前面九個人都投下同意票時,也就是這九個人都認為應 該不會有問題的時候,第十個人必須投下反對票,並且要為此做好準備。他們只是因為這樣而提早做了防範,然後很幸運的派上用場。Gerry 在以色列又再次發現了怪事,居然一群僵屍會繞過一個小鬼,不理會他往前跑。
    以色列雖然蓋了高牆防範,不過還是逃不掉僵屍的襲擊,Gerry 一行人開飛機逃離,在飛機上,Gerry 決定去瑞士的一個醫療中心,就在快要抵達時,因為僵屍攻擊墜機了。Gerry 跟女兵被醫療中心的人救起,經過兩三天,Gerry 醒來,醫療中心的人跟 Gerry 說明了情況,Gerry 也跟他們討論之後,Gerry 認為僵屍會自動避開不健康的人類個體,因此可以試試看把這些疾病的病菌注射到身上,這樣僵屍就不會攻擊人。醫療中心的人一致同意,可是,這些病毒的樣本放 在另外一棟大樓,而該棟大樓已經被一群僵屍佔領了。Gerry 決定冒著危險去拿,經歷一番冒險,Gerry 到了病毒樣本室,可是外面也跟著一個僵屍。Gerry 不得已,只好賭一下,隨便拿了一個病毒樣本注射到身上,很幸運的,僵屍真的不再攻擊他了。Gerry 拿著樣本回到原來的大樓,並且通知聯合國來接人,於是就這樣防止了人類繼續被感染,並爭取到研究僵屍病毒的時間,Gerry 與家人也團聚。
  • Under the Tuscan Sun (IMDB, Wikipedia),台譯:托斯卡尼艷陽下。蠻好看的電影,電影裡某種程度的反映了義大利人的直白,記得有一幕 Frances 在屋子裡哭著跟仲介訴苦,結果仲介跟他說,好了,再講下去可能就要做愛才行了,可是我已經有太太...
    Frances 是個作家,男友劈腿,她接受了是同性戀的好友 Patti 的建議,遠走他鄉,來到義大利的 Tuscan。Tuscan 是個鄰近佛羅倫斯的小鎮,風景很美,氣候宜人。Frances 買下了一間房子,找了人來裝修,在裝修房子的過程中,她從這些新的朋友、鄰居中,慢慢站起來,找回往日的自信與步調。沒多久,Frances 認識了男友,然後懷孕的 Patti 跑來找她。原來 Patti 跟她的女友分手了,想起了 Frances,就過來找她。
    日子看起來是一天比一天順利了,不過故事總是有轉折,有天 Frances 興沖沖的跑去找男友,結果發現男友劈腿了。Frances 很難過的回去,覺得萬念俱灰了。這時候,小情侶 (年輕的裝修工人與鄰居的女兒) 鬧著要出走,Frances 出面幫忙談成親事;然後好友 Patti 剛好臨盆。一些事情折騰下來,最後 Frances 發現這不就是她之前想要的嗎?房子有人結婚 (小情侶),有了一個家庭 (有了好友 Patti 跟孩子),也有好友圍繞,於是她把心裡的那個結給放下了。
  • 陀地驅魔人 (IMDB, Wikipedia)。個人覺得結尾交代的不好,前面都鋪陳的很好,後面硬生生插入人鬼戀的部份,蠻愕然的。
    發仔能看到鬼,幫人趕鬼維生。某天記者紫寧看到朋友幫發仔拍的趕鬼影片,對發仔很感興趣,就去採訪發仔,不過卻碰了軟釘子。接著就透過記者與趕鬼的過程, 慢慢帶出同住的女鬼阿雪與陰沉的惡鬼黑哥的故事。與女鬼阿雪的緣份是從小就開始,從發仔媽媽帶著發仔住進來,阿雪就發現發仔有陰陽眼,能看到她,之後,媽 媽自殺,就剩下發仔與阿雪相依為命,發仔也從阿雪身上學到趕鬼的技巧。而黑哥則是因為被警察陷害而全家被燒死,黑哥想找出當時害他的警察,就四處找能通靈 的師父幫忙,如果不幫忙,就下手殺人。發仔試圖化解黑哥與警察的惡緣,但始終沒辦法。後來是透過自殺,和阿雪到陰陽交界處找到黑哥的太太回來,才成功的化 解惡緣。
    最後就是我說的結尾交代不好的地方了,阿雪附身到紫寧身上,跟發仔快樂的度過一天後,轉世了。喔,對了,在電影中間的地方,黑哥有提到發仔其實早已經算死 掉了,到了電影中後段,交代了真相,原本是發仔跟媽媽都死於跳樓,但阿雪阻止了這件事情的發生,以自己轉世的時間交換了發仔的生命。
  • 九層妖塔 (IMDB, Wikipedia)。拿鬼吹燈之精絕古城來當作故事的主軸,前面我覺得鋪陳的還不錯,只是到後面整個就散了。故事的最後暗示了有續集的可能性,不過會有續集嗎?
    電影一開始先交代了胡八一的過去,胡八一參與了在崑崙山的考古行動,被教授帶去找神祕的九層妖塔。在考古行動中與教授的女兒楊萍互生好感,慢慢走到了一 起。然後他們發現了九層妖塔,原來教授帶胡八一跟楊萍來的目的是為了要打開九層妖塔,要阻止鬼族人在一定年紀就自燃的命運。就在妖塔即將被打開的時候,胡 八一的長官孫連長阻止了這件事情,孫連長表面上是連長,其實是守墓者,有不讓鬼族九層妖塔被打開的使命。妖塔被阻止了,胡八一、楊萍與教授,三人被鬼蝠追 著跑,逃命的最後只有一個斷崖,只能選擇跳下。這一跳,三人掉到懸崖底下。過了好一陣子以後,只有胡八一被救了起來,其他兩人都消失無蹤。胡八一恢復了以 後,被分派到北京的某個圖書館。
    胡八一在圖書館裡,不時會收到鬼族的資料,他非常的好奇,卻又找不到是誰。輾轉過了幾年,中國頻仍地出現異象,人們不知道原因。楊萍跟教授在某次的異象 中,橫空出世了,但官方隱瞞這消息。直到後來,教授失蹤,官方決定派出探險隊,才又找了胡八一,加上找到的楊萍重新組成探險隊。但奇怪的是,楊萍已經忘了 胡八一。
    探險隊來到石油小鎮,遇見了兇猛的異獸,就開打了啊。打著打著,胡八一遇見奇怪的事情,總之這交代了不少事情,異獸是楊萍控制的。胡八一殺死了楊萍,楊萍 在最後恢復了神智,交代了前因後果。在掉下斷崖時,胡八一其實已經死了,楊萍是鬼族的人,從小就有起死回生的能力,教授也是為此,想讓女兒擺脫鬼族自燃的 命運。楊萍為了愛,用自己的能力讓教授跟胡八一復活,卻也讓自己的身體變成空殼,被他人佔用。最後,就交代胡八一要找到她的父親。
除了電影以外,還看完了孤獨的美食家第五季,每次看主角在吃東西都有一種療癒的感覺,不過這個影集沒辦法連續看,畢竟每集的結構都一樣,連續看會有枯燥的感覺。偶爾看一下,真的很療癒。

星期一, 4月 18, 2016

Celery Best Practice 筆記

邊看這篇 Celery - Best Practices 邊做的簡單摘錄與筆記。
  1. 不要用資料庫當作 AMQP Broker。Celery 會建立數個 process 去 poll 資料庫來檢查是否有新的工作,這會導致資料庫的 disk I/O 增加,也會增加對資料庫的連接數目。
  2. 使用更多佇列 (不要只用一個)。
    並不是所有的 task 執行時間、次數跟權重都一樣,例如不重要的 task A 可能會執行很多次,但比較重要的 task B 只有零星幾個。一個佇列會導致 Celery 依序執行佇列裡的工作,所以前面可能會排了很多 task A 工作,就多花了許多時間執行,反而重要的 task B 工作延後了。依照 task 分佇列擺放,可以避免這樣的情況。
  3. 使用權重。Celery 可以針對佇列設定權重與分流,可以使用專門的 worker 來服務指定的佇列,讓 task 得到更好的服務。
    
       CELERY_QUEUES = (
        Queue('default', Exchange('default'), routing_key='default'),
        Queue('for_task_A', Exchange('for_task_A'), routing_key='for_task_A'),
        Queue('for_task_B', Exchange('for_task_B'), routing_key='for_task_B'),
       )
       CELERY_ROUTES = {
        'my_taskA': {'queue': 'for_task_A', 'routing_key': 'for_task_A'},
        'my_taskB': {'queue': 'for_task_B', 'routing_key': 'for_task_B'},
       }
    
    
       celery worker -E -l INFO -n workerA -Q for_task_A
       celery worker -E -l INFO -n workerB -Q for_task_B
    
  4. 使用 Celery 的錯誤處理機制。task 可以指定這些參數 default_retry_delay=300, max_retries=5 來指定重試間隔與重試次數。task 裏面只要使用 try...except 跟 self.retry 就可以了。
    
       @app.task(bind=True, default_retry_delay=300, max_retries=5)
       def my_task_A():
         try:
           print("doing stuff here...")
         except SomeNetworkException as e:
           print("maybe do some clenup here....")
           self.retry(e)     # Retry!
    
  5. 使用 Flower。這是一個只要裝上就能使用的 Module,可以用來觀察 Task/Queue 的狀況。
  6. 只有在真的需要時,才保留執行結果。不需要的話,就加上 CELERY_IGNORE_RESULT = True,Celery 會自動丟棄結果。
  7. 不 要傳遞 ORM 物件給 task。這是因為 Celery 是用 serialization 方式來傳遞參數到別的 Process (Task 是在其他的 Process 上執行),預設可以使用 pickle, cPickle, JSON, YAML ,但是 serialization/deserialization 是有負擔的,而且不保證所有狀態都能保存,建議最好是 pure 的物件或是用整數、字串等比較不容易出狀況的型態。

您或許對這些文章有興趣

Related Posts Plugin for WordPress, Blogger...