mdadm 的該該叫: “YOUR SYSTEM IS NOW UNBOOTABLE!”

系統出現這樣的訊息:

W: mdadm: the array /dev/md/3_0 with UUID d6ef77fc:c2faf3d8:1f51fb89:78ee93fe
W: mdadm: is currently active, but it is not listed in mdadm.conf. if
W: mdadm: it is needed for boot, then YOUR SYSTEM IS NOW UNBOOTABLE!

UNBOOTABLE 耶,不能忽視,萬一又開不了機怎麼辦?

雖然錯誤訊息就有提到該怎麼處理,我還是使用錯誤訊息去搜尋,找到以下這幾篇:

我的作法是,先使用 sudo /usr/share/mdadm/mkconf 產生 mdadm.conf ,然後備份 /etc/mdadm/mdadm.conf ,再覆寫過去。最後使用 sudo update-initramfs -u 來驗證是否有出現錯誤。

電影流水帳(2018/6/4~2018/6/19)

Jurassic World: Fallen Kingdom Japan Premiere Red Carpet: Chris Pratt & Bryce Dallas Howard Bryce Dallas Howard ,是侏儸紀世界的女主角,可以穿著高跟鞋跑過森林的強者! 我覺得她跟 Jessica Chastain 蠻像的,之前都以為是同個人,後來才知道不同人。

    • Jurassic World: Fallen Kingdom (IMDB, Wikipedia),台譯:侏儸紀世界-殞落國度。Owen 跟 Claire 這次是接受 Benjamin Lockwood 的左右手 – Eli 的請求,回去原本侏儸紀世界的島上要運回恐龍。在運送的過程才發現被 Eli 欺騙。Owen 跟 Claire 等人被囚禁起來,而恐龍則被 Eli 當作拍賣品賣出。Owen 跟 Claire 在逃出的過程裡意外發現了 Benjamin 與這個家的祕密,最後也藉由迅猛龍的幫助,解決了基因合成的兇猛恐龍並解放了恐龍。恐龍已經都逃了出去,接下來會如何呢?
    • Going in style (IMDB, Wikipedia),台譯:瀟灑搶一回。老年人搶劫的故事。故事一開始先帶出老人為什麼會要搶劫的原因,原本指望退休金能過後半輩子的老人們,卻因為公司裁員的緣故都沒了。主角 Joe 親身經歷了銀行的搶案,想到不如也來搶一票,不管成與不成,老年的生活至少有著落。於是就透過女婿的牽線,找了師父來幫他們規劃與訓練。後面的搶案還算是成功,整個過程與不在場證明都非常的巧妙與順利。但在找一個在場的小女孩來指認時,我還真的是捏了一把冷汗,以為就要曝光了,但因為 Willie 在行搶現場時的善心,小女孩說了謊幫助他。總之,他們成功了。
      後面更溫馨的是,幫助 Joe 他們行搶的人居然就是當時 Joe 經歷的那個銀行搶案的搶匪,他認為國家應該要好好照顧老年人才是,所以才出手指導、訓練他們。
      透過這電影我才知道美國也有老年人的生活問題,值得去注意。

 

Celery log 出現 Received and deleted unknown message. Wrong destination

在查 Periodic task 為什麼沒執行,beat 是有發出訊息,但 task 卻沒被執行。在 worker log 裡找到

Received and deleted unknown message. Wrong destination

的訊息,查了以後,找到這些資料:

所有的矛頭都指向 librabbitmq ,所以解法有兩種,一種是移除 librabbitmq,一種則是將 protocol 改為 1

 CELERY_TASK_PROTOCOL = 1

棄用 keepass2,改用 keepassxc

最近用 keepass2 時,碰到 plugin 不能用的錯誤訊息,更新 plugin 以後也無法解決。在找解決方法時,意外看到 keepassxc ,一樣是跨平台,再加上瀏覽器的整合也不錯,乾脆就跳槽了。

使用方法不難:

我先用網站提供的 PPA 來安裝,執行 keepassxc ,可以開啟 keepass2 的資料檔案,但設定上遇到問題。我碰到的問題是在 Preferences 裡找不到 Browser integration 這選項,利用 Google 搜索以後 (詳見 keepassxc FAQ這個 issue),才知道是因為 Ubuntu trusy 的 QT 版本問題,所以無法提供 Browser integration,得使用網站提供的 AppImage 檔案才行。

所以就下載 AppImage 檔案,用 chmod +x 為檔案增加執行權限再執行,就可以看見,並且 Browser 的 extension/addon 也可以順利的跟 keepassxc 連接。

Ansible 需要 python

如果目標主機上沒有 Python 時,Ansible 可是會抗議的。

所以必須要先幫目標主機裝上 Python 才行。首先要將 gather_facts 設定為 no,再利用 raw 模組來進行安裝,不使用 gather_facts 跟其他模組的原因是這些都會使用到 Python。

---
- hosts: all
  become: yes
  gather_facts: no
  tasks:
    - name: install python in Ubuntu
      raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)

上面用的是 apt,表示適用於 Debian/Ubuntu 等 debian-like 的 distro,至於其他的 distro ,就看套件管理程式是什麼囉。

加速 SSH X11 forward 的速度

今天用 SSH 連回家裡電腦,開 thunderbird ,發現慢的要命,心裡想,照理來說,不傳圖片應該會比較快,難道是傳輸的內文太多嗎? 就利用 Google 找了一下,結果說是加密速度問題,改用較快的加密協定就可以了。

文章裡說改用 arcfour,blowfish-cbc ,但因為安全性的關係,新的 OpenSSH server 都沒有啟用,所以退而求其次,改用 aes128-ctr, aes192-ctr ,的確速度快了很多。

ssh -YC4c aes128-ctr,aes192-ctr user@server

 

另外附上測試 SSH 加密速度的腳本網址:https://gist.github.com/graysky2/0e265604bfd4856a2596

 

參考資料:

Pro Vagrant

今天翻了 Pro Vagrant 這本書,這本書是 2015 年出版的,到今天書裡已經有些資訊是過時的了。不過裏面介紹了如何使用 vagrant 、如何打包 box 以及使用上的觀念與建議作法,還蠻實用的。

書本的原始碼都在 https://github.com/pro-vagrant

裏面提到的 atlas.hashicorp.com ,現在 Hashicorp 已經不再繼續,並且在 2018/6/27 之後,hashicorp 把 vagrant boxes 都搬到  https://app.vagrantup.com 了,Ubuntu 的 box 都在 https://app.vagrantup.com/ubuntu

作者的網站 http://boxes.gajdaw.pl 也已經消失了。

幾個有用的 plugin:

另外就是知道有 vagrant share 跟 vagrant connect 這兩個子指令,vagrant share 可以讓 VM 有個對外的網址,對方或伙伴就可以用 vagrant connect 連上 VM 提供的服務,說真的,這兩個指令蠻讓我驚訝的。

電影流水帳(2018/4/13~2018/6/3)

Brie LarsonBrie Larson ,飾演驚奇隊長,雖然在 Infinity War 裡還沒正式出現,但很期待明年復仇者聯盟四裡她的演出!

  • The Fate of the Furious (IMDB, Wikipedia),台譯:玩命關頭8。原本以為不會很好看,畢竟也到了第八部,但還蠻出乎我意料的,故事比上一集來的有趣。電影末段轉折的不錯,飾演反派 Cipher 的 Charlize Theron 也很成功的刻畫出這個狠角色,相當不賴。
    這集主要是 Dominic 遭到 Cipher 威脅,而加入反方的一邊;正方的 Hobbs 等人則是丈二金剛摸不著頭緒,只能跟前兩集的反派蕭氏兄弟聯手,硬著頭皮跟 Cipher 對抗。後來憑著 Dominic 的裡應外合,終於打倒 Cipher 並救回 Dominic 的孩子。
  • Avengers: Infinity War (IMDB, Wikipedia),台譯:復仇者聯盟3-無限之戰。在看這部電影之前,趕緊去追了雷神索爾3,但沒看黑豹,還好並沒有影響。情節的安排相當緊湊,人物多,但故事線沒有因此而雜亂,絲絲入扣,沒有冷場。
    一開始是 Thanos 追擊了 Asgardians 的太空船,Thor 跟 Loki 跟 Hulk 被打的很慘,Hulk 被奄奄一息的 Heimdall 傳送回地球示警,Thanos 則從 Loki 手中得到了空間寶石。Thanos 派出手下,前往地球搶奪其他的寶石,跟地球上的英雄們展開大戰。Dr. Strange 因為身上有時間寶石,所以被擄走,Iron man 跟 Spider man 為了救回 Dr. Strange ,也上了太空船。星際異攻隊則是遇上了落難的 Thor,他們分成兩批人,一批協助 Thor 打造了新的武器,另外一批則是去保衛寶石,卻意外協助 Thanos 取得了靈魂寶石。美國隊長等其他的超級英雄則是到了瓦干達,保衛心靈寶石,對抗 Thanos 的手下。最後的大戰,Thanos 集齊了所有的寶石,以無限手套進行了無差別的攻擊,全宇宙有一半的生物都消失了,留下期待復仇者聯盟4的結局。
  • Big fish (IMDB, Wikipedia),台譯:大智若魚。趁這部電影在 Netflix 上架時,趕緊回味一次。這次重看,才發現 Will 的太太是 Marion Cotillard  飾演的,以前都沒注意到說。飾演 Edward 太太 Sandra 的 Jessica Lange ,有一幕讓我印象很深刻。本來陪 Will 在整理的 Sandra 離開去找 Edward,Edward 躺在浴缸裡,張開眼睛看到自己的妻子,浮出水面,而 Sandra 就直接穿著衣服進到浴缸裡,Edward 就擁著 Sandra 坐在裏面,在那個當下,我覺得好浪漫啊~
    Will 是 Edward 的兒子,從小聽父親說的不知是真還是假的故事,原本是崇拜父親的,但是父親經常在外奔波,到後來不知是否該繼續相信父親,所以他選擇了儘量不跟父親說話。某天接到媽媽 Sandra 的電話,得知父親 Edward 的病到了末期,於是他偕同妻子回到家中,陪 Edward 最後一段日子。在這段日子裡,就是父子倆的大和解,在整理父親事物的過程裡,知道了父親的故事並不全是造假的,而是帶著真實的,只是 Edward 加入了一些不尋常的元素,讓故事變得更加生動。最後 Edward 即將要走了,要求 Will 說故事給他聽,Will 很努力的說了一段生動的故事讓 Edward 好好的走完。在 Edward 的葬禮裡,Will 看到了故事裡的人物都來參加葬禮,送 Edward 最後一程,讓 Will 明白父親的用心。
  • ミックス。(IMDB, Wikipedia),台譯:乒乓少女大逆襲。這劇本根本就是幫新垣結衣跟瑛太寫的吧,很有意思的故事。廣末涼子跟蒼井優的演出真的是很讓人出乎意料之外啊,哈哈~
    多満子的媽媽是桌球選手,從小就讓多滿子接受地獄特訓,這讓多滿子極度的厭惡桌球。在媽媽死後,她解脫了,並且過著平順的生活。在工作的時候認識了明星桌球選手江島,陷入熱戀,但在愛莉出現以後,被江島甩了。多滿子回到故鄉,跟小時候的同學彌生一同經營媽媽的桌球教室。某天,多滿子在電視上看到全國的選拔賽,江島有參賽,為了報復,多滿子決定跟桌球教室裡的人一同組隊參加。第一次的比賽失利,但這讓桌球教室裡的人團結一心,也讓多滿子更加了解了荻原。經過一年的苦練,他們參加第二次比賽,但看似順利的這次,卻備受阻撓。首先是荻原似乎要跟前妻復合了,多滿子心裡的感受很複雜。其他人則因為這事,也無法出席比賽。但是最後,荻原回頭去找了多滿子,把事情說開。彌生則因為佐佐木的簡訊而決定做自己,去參加比賽。落合夫婦也覺得可惜,而前往比賽現場比賽。最後呢,當然是一個圓滿了大家心願的結局。
  • Pacific Rim Uprising (IMDB, Wikipedia),台譯:環太平洋2-起義時刻。故事的結尾有點弱,但故事中間的轉折我還滿喜歡的,想不到真正的敵人不是怪獸,而是被怪獸誘惑的 Dr. Newton Geiszler。整體來說,普普通通,相較之下,我還是喜歡第一集。
    時間快轉到第一集結尾的幾年後,Jake 是 Stacker (上集的將軍)的兒子,自我放逐,但被姊姊 Mako 拉回到 PPDC,姊姊 Mako 希望他指導後進的機器人駕駛。隨即,PPDC 跟中國在雪梨會談,此時,有個機器人入侵了雪梨,PPDC 的機器人出來阻止,但沒能完全阻擋住這波攻擊,姊姊 Mako 因此死了。Mako 留下了訊息,PPDC 展開調查,跟中國的合作案也發生變化。經過幾番轉折與調查,才知道原來 Dr. Newton Geiszler 之前跟怪獸大腦連接的關係,心智被控制了,製造出身體部份是怪獸細胞的機器人,要消滅人類的巨大機器人。於是眾人齊心協力阻止怪獸機器人引發火山爆發,最後也順利成功。
  • The intern (IMDB, Wikipedia),台譯:高年級實習生。溫馨的小品故事,幾次在第四台看到,都只看了片斷,這次終於在 Netflix 上完整看完。
    Jules 是新創公司的 CEO,因為政府政策,要僱用老年人來上班。Ben 是個不甘寂寞的老人,他不願意賦閒在家。某次他意外看到徵人廣告,就去 Jules 的公司面試,並且順利的被錄取。進公司以後,Ben 被分派給 Jules ,但 Jules 並沒有交代任何工作給 Ben,Ben 就盡自己的力量去幫助同事,並且去找事情來做。Jules 看在眼裡,慢慢改變自己的想法。後來,Ben 更幫助 Jules 做出了對職涯、家庭的決定。
    看完的想法,第一個是美國老人生活的問題似乎蠻嚴重,另外一部電影 Going in style 也提到了。第二個是 Ben 的主動,這是我要自我改進的地方,這方面我向來不夠積極,都是等人問了,才盡力去幫人,而不是主動去詢問、協助。

chronograf 使用 gitlab oauth2 認証

去年11月在試 chronograf 1.3 使用 gitlab oauth2 來認証登入時,沒試出來,就去 chronograf github repository 那邊發了 issue ,後來4月左右出了 1.4,開發者有回應,請我再試試看,昨天終於試出來了,下面紀錄一下過程與設定。

  1. 首先去 gitlab admin 頁面 (我用的是 gitlab 8.13.6) 新增 application,在 callback url 填入”http://your_chronograf_server:8888/oauth/generic/callback”。新增以後,把 “applicatoin id” and “secret” 記下來,後面會拿來填入 chronograf 的 “–generic-client-id ” / “–generic-client-secret “。
  2. 在啟動 chronograf 時,帶入以下參數 (gitlab_server 與 chronograf_server 請自行替換):
    • –generic-auth-url=http://gitlab_server/oauth/authorize?redirect_uri=http%3A%2F%2Fchronograf_server%3A8888%2Foauth%2Fgeneric%2Fcallback&response_type=code
    • –generic-token-url=http://gitlab_server/oauth/token?redirect_uri=http%3A%2F%2Fchronograf_server%3A8888%2Foauth%2Fgeneric%2Fcallback&grant_type=authorization_code
    • –generic-scopes=api
    • –token-secret=mysupersecret
    • –generic-api-url=http://gitlab_server/api/v3/user
  3. 到 chronograf 頁面時,就會看到 “Login with Generic”,點選按鈕,瀏覽器會帶到 gitlab 的登入頁面,在登入以後,會再帶回到 chronograf purgatory 頁面。

到這邊就算是成功了。但是我還沒去試怎麼去給予權限,讓使用者不要只能停留在 purgatory 頁面。

Django 節省記憶體的一些紀錄之二

這篇會順帶提一些提高效能的紀錄。

strftime

datetime.strftime 可以將日期時間格式化為需要的字串,但是,在經過 profiling 以後,我發現呼叫這個函式相當的花時間。在網路上搜尋以後,發現有人在 stackoverflow 上問相似的問題,有人回答說改用 python 的 string format 就可以大大的提高效能。

# 原作法
from datetime import datetime
dt = datetime.now()
dt.strftime("%Y/%m/%d")  # slower
"{:04d}/{:02d}/{:02d}".format(dt.year, dt.month, dt.day)  # Fast!!

JSONEncoder.iterencode

這是在Use StreamingHttpResponse by default for JSON 這個 gist 上看到的,裏面使用了 JSONEncoder.iterencode 搭配 StreamingHTTPResponse 處理。一般來說,在輸出為 JSON 時,都是整個物件或資料丟給 json.dumps(),但這樣在處理大量資料的情況時,其實是有可能佔用大量記憶體的。Python json 模組的 JSONEncoder 提供了 iterencode() 函式,iterncode() 會回傳 generator 回來,之前有提到使用 generator 可以確保在使用到的時候,才將值回傳出來,可以避免佔用過多的記憶體。再加上 StreamingHTTPResponse/HTTPResponse 的 content 都支援使用 generator,這樣就可以節省大量記憶體了。

日期時間時區的轉換

本來我是使用 Arrow 在處理時區的轉換,但是,在 profiling 以後,發現這個步驟會花掉蠻多時間,於是看過 Arrow 的原始碼以後,發現 Arrow 只是使用 python datetime 模組裡面的函式在做,所以將原本時區轉換的部份改寫掉,就大幅提升速度了。


from arrow import Arrow
from dateutil import tz
from django.utils import timezone

dt = timezone.now()  # utc time
new_timezone = tz.gettz('Asia/Taipei')  # get local timezone
new_local_time_1 = Arrow.fromdatetime(dt).to(new_timezone).datetime  # slower
new_local_time_2 = dt.astimezone(new_timezone)  # Fast!!