Deprecation of tags= in include

碰到這個訊息:

[DEPRECATION WARNING]: You should not specify tags in the include parameters. All tags should be specified using the task-level option. This feature will be removed in a future release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

這是因為這樣寫:

- include: setup.yml tags=myrole,setup
- include: myrole.yml tags=myrole

論壇有人問,開發團隊回答說,建議的作法是把 tags 拿下來,不要放在 include: xxx 的後面,也就是:

- include: setup.yml
  tags=myrole,setup
- include: myrole.yml
  tags=myrole

Automate Django createsuperuser in Ansible

Ansible 有個 django_manage 模組,可以很方便的執行 django 裡的 manage.py,但是受限於 createsuperuser 的關係,並沒辦法在建立 superuser 的同時,一併設定密碼。

一般網路上的解決方法是自己寫個小 python 腳本 (可以看這篇 How to automate createsuperuser on django? ),丟給 shell 去執行。我是想到可以利用 manage.py 提供的 changepassword 並搭配 expect 來做,大致上是這樣子:

另外也做了避免重複建 superuser 的機制。

Ansible notify

notify 很方便,可以先不執行 task,等到都執行完了才執行 handler 裡的 task。

但我遇到明明有 notify ,handler 裡的 task 卻沒有執行到,試了很久,找了好久才知道,必須 task 的狀態有改變的時候才會 notify ,而 ansible 的每個 task 的狀態並不是都會改變的,例如 ansible 發現檔案跟要變更的一致就不會改變狀態。

如果要強制改變,可以加上 changed_when: true ,這樣在執行完 task 時,永遠都把狀態設定為改變,也就會 notify 了。

- name: Install nginx configuration
  template: src=nginx.conf.j2 dest=/etc/nginx/sites-enabled/default
  notify:
    - reload nginx
  changed_when: true

電影流水帳(2015/12/13~2015/12/31)

Keira Knightley
Keira Knightley ,很厲害的英國女演員,演過很多電影,都有不錯的成績。

轉眼就年底了,真快~今年總共看完 60 部電影,重看了 2 部之前看過的電影,一部日劇跟一部美劇。

  • 神さまの言うとおり (IMDB, Wikipedia),台譯:要聽神明的話。從漫畫翻拍成電影,不過這部只算是上集,從結局看來,是還會有另外一部電影來解釋。
    故事是一個覺得自己人生很無聊的少年在教室上課,突然一個不倒翁出現在講台上,殺了老師,接著開始殺戮,班上的少年少女們發現不倒翁後面有個按鈕,得設法按下去才能停止這場殺戮,後來男主角在班長的幫助下,按下按鈕,過了這關。
    基本上後續就是連續的關卡,貓咪關、小熊關…等等,少年少女們必須通過這些關卡才能活下去,否則必須死。之後在一連串的關卡中,少年少女們發展出奇妙的關係,通過最後一關以後,他們來到某個大樓樓頂,卻只看到一個像是流浪漢的老人,然後就沒了,請期待下集。
  • Interstellar (IMDB, Wikipedia),台譯:星際效應。去年一上片就一直蠻想看的電影,終於等到 HBO 播出了。
    Cooper 原本是個太空人,後來 NASA 被廢掉,Cooper 成了一個農夫,努力的種田以解決植物枯萎症的問題。有一天女兒 Murphy 在書房發現了奇怪的現象,找老爸討論,Cooper 教了他要仔細觀察與紀錄,這樣才是科學。後來他們發現這是一組座標,就照著這組座標找到了原本應該廢棄卻還在運作的 NASA。有時候來的早不如來的巧,計劃的主持人正好想找一個知道怎麼開太空船的太空人,之前曾經開過太空船的他為了救女兒,也為了地球上的其他人,就被說服了。
    可是 Murphy 不諒解自己的父親,Cooper 試著哄 Murphy,Murphy 從話裡聽出了爸爸這次去也沒把握回來時,整個暴走,超級不諒解。Cooper 還是上了太空,心裡掛記的還是女兒。
    上了太空,一行人穿越黑洞,開始進行探險,第一個是最靠近黑洞的行星 – 米勒,在這裡因為時間受到黑洞影響,過的很慢,導致他們登陸再回到母船時,已經經過數十年,留守的人已經老了很多。接著去第二個星球探險,Mann 從那個星球上傳送出適合人類居住的訊息,不過到了那裡喚醒 Mann 以後,透過一些蛛絲馬跡,發現 Mann 說了謊話。更令人驚訝的是,Dr. Brand 也說了謊,原本讓全人類移民太空的計劃 A ,根本不可能實現。而 Mann 為了要回去,想殺人滅口,經過一番爭執,Mann 損壞了永續號太空船,Cooper 跟 Amelia 費盡了九牛二虎之力,重新接上永續號太空船,制定了接下來的計劃。Amelia 繼續前往第3個可能適合人居住的星球,而 Cooper 則跟 Tars 前往黑洞收集數據。Cooper 跟 Tars 觀測到黑洞的數據,並且運氣很好的,透過可能是未來的人類的幫助,他們掌握了第五維度,並且將數據傳送回過去。在這個時候,前面埋的梗一次爆發了,原來之前 Murphy 在書房所遇到的怪現象就是 Cooper 在這個維度所傳送的,接著 Cooper 將 Tars 觀測到的數據以手錶秒針擺動的形式傳送到手錶上,而在那個時間點的 Murphy 也不負父親期望的解開了父親傳送過來的數據,解開了 Dr. Brand 的方程式,讓全人類得以移民外太空。隨後,可能來自未來的人類解除了第五維度,Cooper 跟 Tars 在太空繼續漂流。
    又過了數十年,移民到外太空的人類在土星附近發現了被冰凍的 Cooper ,並將他救醒。父女再次團圓,只是 Murphy 已經老了很多,而 Cooper 還是年輕的樣子。Murphy 告訴 Cooper ,快去找 Amelia ,故事就結束了。
    也許是之前陸陸續續地看了太多劇透,等到真的看完時,反倒覺得還好。比較出人意料的是我家大公子居然很有興趣的陪我看完,而且隔天還記得電影在演些什麼,或許他有念物理的潛力也說不定。 🙂
  • 我的少女時代 (IMDB, Wikipedia)。今年上半年大賣的一部電影,蠻出人意料。說真的,當初看到片名,真覺得應該沒什麼,看了預告以後,整個改觀,覺得應該會不錯。
    故事蠻簡單的,一開始是成年後的林真心在現實生活的壓迫下想起了高中時的事情,接著就倒敘高中的事情。林真心在高中時是個不會打扮自己的璞玉,很善良。因為幸運信的關係,遇上了學校裡的惡霸徐太宇,因緣際會地相識。到了後來,其實兩人相互都有好感,林真心也打開了徐太宇的心結,眼看就有一點點的機會修成正果,卻發生了誤會。機會一旦錯過,就又是二十年後的事情了 (有這麼久嗎?我估計應該是差不多)。回憶完了以後,林真心下定決心不再慣老闆,也不再慣男友,想去看劉德華演唱會,卻沒買到票,只能去演唱會的外面逛。想不到真的很好運,巧遇劉德華,還一起拍了照,拿了簽名。劉德華這次來演唱會,是因為一個朋友的促成,知道眼前的女人就是林真心時,他留下電話,讓林真心打電話去拿演唱會的票。透過這支電話,林真心又跟徐太宇碰上了。
    網路上有人提到這故事跟「初戀這件小事」蠻像的,我個人覺得,的確,整個架構上是相似的,但是在一些轉折上,我覺得「我的少女時代」更勝一籌。故事裡有些不太合理,但還可以容許的地方,例如,林真心的個性似乎不太可能在外搶業務搶的那麼成功,又或者是成年後的徐太宇跟年輕時的徐太宇整個氣場差很多,不過這些就算了,瑕不掩瑜啦。
  • Begin Again (IMDB, Wikipedia),台譯:曼哈頓戀習曲。不得不說,英文片名比較好。
    Dan 是個失意落魄的音樂製作人,工作上不得意,家庭關係也不是很理想。而 Gretta 是個音樂創作人,跟著男朋友來到紐約,過了沒多久卻發現男朋友劈腿,於是跑去好友 Steve 家療傷。Steve 不放心 Gretta 一個人在家,就帶著他去酒吧,並推她上台演唱,結果歌聲被 Dan 聽到。Dan 覺得這歌真是太棒了,就搭訕了她,想找 Gretta 出唱片。
    Gretta 想了一晚上,就答應了。他們想出一個在城市裡到處錄音的點子,找了一群願意先無酬演奏的樂手,然後搭上 Gretta 創作的歌曲,就開始錄起來了。整個錄製的過程裡,非常的順利與融洽,Dan 解決了家庭關係的問題,Gretta 也走出了情傷。最後,專輯完成,Gretta 確實地跟男友分手,Dan 搬回家,跟唱片公司談了之後,Gretta 決定自己上網銷售這張唱片,不透過唱片公司。
    我覺得這有點像是公路電影的形式,在一個事件的過程裡,去處理掉情感上的問題,蠻好看的,歌曲也很好聽。

電影流水帳(2015/11/26~2015/12/12)

Hong Kong Tramways, Ltd | 102 / Crossing Hennessy | Hong Kong | China
我知道我這篇的照片必須選湯唯~她太正了~ 她在華麗上班族裡飾演會計主管蘇菲,感情使她盲目,為了感情的慰藉,她幫助王大偉做帳,想讓他避過這次危機。但是王大偉這次遇到的是金融海嘯啊,如果是早幾年或晚幾年,或許能全身而退,所以王大偉最後是逃不了,自殺了。

  • The Little Price (IMDB, Wikipedia),台譯:小王子。電影並不完全是書上的故事,不過改編的還不錯。剛剛在翻閱維基百科回想故事時,才發現書裡的人都沒名字耶~
    小女孩的媽媽希望小女孩照著計劃走,好好的唸書,她相信,只要這樣作,他們就能擺脫現在的生活,讓未來變得更好。他們搬到了一個老人的家附近,這個老人很怪異,小女孩原本覺得不要跟他接近,但讀了他射來的紙飛機上的故事以後,小女孩被這個故事吸引了,這個故事講的就是小王子的故事。小女孩接近了老人,於是在媽媽出門上班,小女孩應該照表操課的時候,她跑去老人家裡讀小王子的故事,一起玩,她覺得很開心。直到某天,老人開著車帶小女孩出門被警察攔下來,才被小女孩的媽媽發現這件事情,想當然爾,媽媽禁止小女孩繼續跟老人碰面。直到小女孩要入學的前一天,她跟媽媽回來,看到老人被送進醫院裡了,她知道老人一直想再去找小王子,於是她趁著夜色跑到老人家裡,開著老人的飛機展開冒險,去找尋小王子,打算讓老人跟小王子見上一面。小女孩並沒有飛到小王子的星球上,反而到了一個古怪、沉悶的星球,在一棟大樓上,她看到了一個很像是小王子的男人。她排除萬難去找小王子,卻發現小王子已經忘了初衷,她盡她最大的努力讓小王子回想起有個人在等他這件事情,經歷一番歷險之後,終於讓小王子回到原來的星球上,並且恢復了原來的樣子。
    隔天早上,小女孩的媽媽敲小女孩的房門,發現小女孩不見了,一轉頭,發現小女孩正刷著牙說,「媽媽,我們今天要早點出門,在上學前去看看老爺爺」鏡頭帶到醫院,小女孩拿出一本裝訂好的書,裏面就是小王子的故事 (之前被分拆成好多頁),老人流著淚,媽媽看著他們,也改變了原本既有的想法。
  • 華麗上班族 (IMDB, Wikipedia)。這是一部歌舞電影。
    電影裡的某些場景故意搭的很有舞台感,所以往往看著主角的同時,透明的牆外有街上的人走過去,這點很特別。故事算蠻簡單,但是人物之間的關係有點複雜。故事我就不寫了,只講我印象比較深的幾場戲。
    王大偉投資沒有見好就收,欠了一屁股債,不敢進公司,只敢打電話給同一條船上的蘇菲幫忙,但是蘇菲也很為難,只說快回公司。總經理張威在廁所遇到神色慌張的蘇菲,問她什麼事情,蘇菲說沒有就走開,此時,手機電話聲又再響起,張威拿起蘇菲忘在洗手台上的手機接聽,只聽到王大偉說約在天台碰面。到了天台,王大偉見到張威,自然的抱住她說,救我。緊跟著上來的蘇菲看到兩人抱著,心整個都碎了,我猜她心裡一定在想著「原來這男人還是騙了我~」,大偉也看到蘇菲了,他認定此時只有張威能救他,於是忍心不理蘇菲~
    另外一場是結尾的時候,張威要離開公司了,搭電梯下樓,問緊跟著來的李想說,「你滿幾個月了?」李想說「早滿3個月了」張威就說,「進來吧」兩人一起搭電梯下樓,出了電梯門口,張威再問:「你的名字是?」李想說:「李安的李、夢想的想」張威意味深長的說:「希望你以後不要忘了你的名字~」
  • The school of Rock (IMDB, Wikipedia),台譯:搖滾教室。前兩年看到一則新聞,說搖滾教室裡的學生們再次跟 Jack Black 重逢,就想到對喔,這部電影好像蠻久了,也常在第四台看到重播,不過都只看到最後一段,不如有機會就來看一下。
    故事是講想一直玩搖滾樂的 Dewey 被朋友催討房租,在此時,他接到電話說要找他朋友當代課老師,於是他心生一計,冒充他朋友去任教。到了班上,原本意興闌珊,後來卻發現學生都有學音樂,想去參加搖滾樂團大賽的他,就騙這些小孩,教他們唱搖滾樂、創作歌曲。
    不過故事一定要來個轉折,在參加比賽的前一天,校長找他去家長會。出發前,他朋友接到學校電話,事情曝光了。到了家長會場,他招架不住家長的問題,再加上看到外面的警察、校長跟朋友,有些慌張,只好把事情都如實講出來。隔天,家長疲勞轟炸校長,班上的學生在開會討論後,決定還是要參加比賽,就找了校車去找 Dewey ,然後就一起上台參加比賽。發現孩子不見的家長們跟校長也趕到比賽現場,發現了孩子的另一面,對教育的看法從此改觀。
    電影的結尾是 Dewey 跟班上同學練團的畫面,還蠻有趣的。

加上上面,到目前為止看完 56 部電影~要衝一下破 60 嗎? XD

keyring

試用 python keyring 這個模組的一些紀錄:

  • 用法就這麼簡單:keyring.set_password(service, username, password) 或 keyring.get_password(service, username, password)
  • keyring password 的長度幾乎沒有限制,至少到 8192 個字元是沒問題。
  • keyring 的密碼存放在哪裡? 可以看看 keyring.get_keyring().file_path 。如果想換位置,沒問題,有兩個方法:
    1. 設置 XDG_DATA_HOME 這個環境變數,這比較簡單
    2. 把 keyring.util.platform_ 裡的 data_root 與 config_root 這兩個函式替換掉。
  • 要有加密功能的話,安裝 pycrypto ,backend 會自動替換為 EncryptedKeyring ,預設是 PlaintextKeyring 。
  • 要看有哪些 backend ,可以看 keyring.backends ,除了檔案為基礎的 PlaintextKeyring、EncryptedKeyring 以外,還有其他的可用。
    目前真正能用的 backends ,是用 keyring.backend.get_all_keyring()
  • 替換 backend 則是用 keyring.set_keyring() ;看目前的 backend 是用 keyring.get_keyring()。

Swift 2.2

今天網路上除了 PHP 7 釋出的消息外,就是 Apple 開放 Swift 2.2 源碼的消息了。

上 Swift.org 看,現在已經可以安裝在 Ubuntu 上,就寫了一個簡單的腳本來安裝。

執行完會安裝到 /opt/swift-2.2 下,PATH 需要自己加。

中文的學習手冊可以看 The Swift Programming Language中文版

這篇則是知名開發者 zonble 的心得分享,但要注意的是,這篇心得分享文是在 Swift 剛剛推出的時候所寫的,與現在可能有不小的差距:Swift

關於接下來幾個月的變化可以參考 Apple 釋出的計劃表:https://github.com/apple/swift-evolution

電影流水帳(2015/11/1~2015/11/25)

Pimchanok Luevisadpaibul "baifern"
พิมพ์ชนก ลือวิเศษไพบูลย์ ,初戀那件小事的女主角,在電影裡扮醜。

 

隔了一段時間才想起來要寫。

  • 捉妖記 (IMDB, Wikipedia)。大公子跟我說他在學校裡有看過這電影,所以才找來看看。原本以為電影裡的妖是恐怖的,不過這部電影裡的妖是用 CG 繪製,相當可愛。以一部真人與動畫互動演出的電影來說,我覺得這部電影的成就蠻高的。主打孩童市場也相當正確,故事很溫馨,不過我個人覺得故事有點弱。
    妖界發生大事,妖后懷著小妖王逃到人間,遇到了主角宋天蔭,妖后死了,小妖王到了宋天蔭肚子裡。霍小嵐則是天師,天師是來捉拿妖的,遇到了宋天蔭,與宋天蔭合謀要帶著肚子裡的小妖王去領賞。後來小妖王在領賞的路上出生了,好歹總是肚子裡的一塊肉,於是宋天蔭跟小嵐就對小妖王有了感情。領賞的路上有不少阻礙,三人一一克服了,到了城裡找湯唯要領賞,宋天蔭雖然捨不得,卻還是留下小妖王。小妖王就被送去有錢人的廚房。在電影裡的設定,妖怪不是殺人,就是被人吃,所以有特別的妖怪廚房,專門宰殺妖怪供人食用。小妖王是皇族之後,被認為有特殊的療效,所以也特別珍貴。宋天蔭事後覺得捨不得,就說服了小嵐,想要贖回小妖王,但是小妖王已經被送到葛千戶那兒去了。於是兩人就上葛千戶那兒去找人。
    葛千戶就是下令要捉拿小妖王的人,小妖王送到他那兒去以後,他就預備了一桌筵席,並且讓人預約來食用。宋天蔭兩人潛入以後,開始救援計畫,原本帶著妖后一起逃亡的隨從也一起來攪和,一陣攪和之下,發現了葛千戶也是個妖,經過一番打鬥,消滅了葛千戶,救回小妖王。這一行人也發現妖並不全都是壞的,宋天蔭讓妖怪隨從帶著小妖王回到深山裡去,他則是跟著小嵐繼續營救妖怪。
  • สิ่งเล็กเล็กที่เรียกว่า…รัก (IMDB, Wikipedia),台譯:初戀那件小事。是因為「我的少女時代」的新聞才會想看這部電影。
    故事蠻簡單的,就是少女小嵐暗戀學長小莫,然後努力改變自己。到了畢業,兩人分開,但是經過9年以後,小莫成了攝影師,小嵐成了知名造型師,兩人重新在電視節目上相遇。
    電影還不錯,但也沒辦法說很好看就是。男主角是真的很帥,女主角也不錯,真正讓我驚訝的是女配角,如果我沒看錯的話,她也在「撞鬼那件小事」裡演出,在那部電影裡她看起來身材有點小胖,但是在這部電影裡,就判若兩人,整個漂亮很多。

截至目前看完 53 部電影啦!

Django model 的 validate

同事問,為什麼用 model 建立 instance 以後,呼叫 save 沒有觸發 validate?

上網找了一下,大致有兩種方法:

  1. 用 ModelForm 的 is_valid() 做檢查,Correct Way to Validate Django Model Objects?
  2. 覆寫 model 的 save(),Django model mixin to force Django to validate (i.e. call `full_clean`) before `save`

事情沒有這樣結束,因為很好奇 Django 的作法,就去追 Code。

如果是走 is_valid() :

  1. forms/models.py:ModelForm 繼承自 BaseModelForm,而 BaseModelForm 又繼承自 BaseForm,這個檔案裡,沒有看到 is_valid
  2. forms/forms.py:
    1. BaseForm.is_valid() 很簡單的只回傳 self.is_bound and not self.errors ,self.is_bound 跳過不看,self.errors 是一個 property,裏面呼叫了 self.full_clean()
    2. self.full_clean() 呼叫了 self._clean_fields(), self._clean_form() 與 self._post_clean() ,關鍵在 self._post_clean() 。BaseForm 裡的 _post_clean() 是空的,讓繼承 BaseForm 的類別去決定。
  3. forms/models.py: 回頭看 BaseModelForm._post_clean(),這裡呼叫了 self.instance.full_clean() ,並處理 ValidationError 。instance 就是 model 類別所創出的實體,Model 繼承自 ModelBase 所以接著看 ModelBase 類別。
  4. db/models/base.py: ModelBase 的 full_clean() 呼叫了 self.clean_fields(), self.clean() 與 self.validate_unique ,並且在這裡處理了 ValidationError 例外,最後判斷了 errors 裡是否有東西,有的話,丟出 ValidationError。先看 self.clean_fields() ,函式裡去取得定義在類別裡的欄位,並且呼叫每個欄位 (Field) 類別的 clean() 函式。如果有錯誤就丟出 ValidationError()
  5. db/models/fields/__init__.py:Field 類別定義在這個檔案裡,裏面的 clean() 呼叫了 self.validate() 、self.run_validators()

至此,ModelForm 的路徑就確定了。

來看看第二個方法,他是要求 Model 類別除了繼承 Django Model 之外,再繼承 ValidateModelMixin 這個自訂類別以覆寫 save() ,看看裏面的 save(),就只是多呼叫了 full_clean() 來檢查,也就是走上述步驟 4 以後的路線。

Django 官方網站不建議直接去呼叫 full_clean() 這件事,不過找了一下,也沒找到什麼更好的解法~

P.S.

Github ATOM

Github 推的編輯工具,還蠻好用,跟 Sublime Text 比起來,至少可以打中文… XD

安裝相當簡單,到 ATOM 網站,下載對應的安裝檔案安裝就可以了,我是用 Ubuntu,下載 .deb 用 dpkg -i 安裝就可以了。

安裝以後,需要調校一下,因為字型的關係,中文會顯示不出來。設定可以參考下面來進行調整:

不過說真的,我不是很常用這個,大部份還是用 vim。這兩天再拿出來用,才發現多了一個 apm 的指令,顧名思義就是管理 ATOM packages 用的,像是安裝、反安裝或更新等等,都可以透過這個指令進行。

不過,要檢查 ATOM 更新的話,就比較麻煩了,還好有 package 可以幫忙做這件事情,我是用 atom-update 這個 package。

補充:參考這篇 Atom 使用心得與 Package 推薦 跟根據自己需求,裝了一些 packages/themes:

  • atom-beautify
  • atom-hexo
  • atom-material-syntax
  • atom-material-ui
  • atom-update
  • autocomplete-python
  • color-picker
  • ex-mode
  • file-icons
  • git-blame
  • git-log
  • git-plus
  • highlight-selected
  • indent-helper
  • linter
  • linter-flake8
  • markdown-preview-plus
  • markdown-toc
  • merge-conflicts
  • minimap
  • project-manager
  • recent-projects
  • vim-mode