Heroku 小記

安裝:wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh

在現有的 web application project 目錄裡輸入 heroku create ,這會自動去遠端 (就 heroku) 開一個 app project,然後把 git repository 放到 git remote 裡。
git remote -v 裡會多出一個 heroku ,當你把 master branch push 到 heroku 時 (git push heroku master),就會自動佈署到 heroku 上。
這裡要注意的是 heroku 只認定 master,只有推 master 上去時,才會真正的進行佈署,如果是其他 branch 名稱,heroku 不鳥你。

多台機器開發,我是指一下在 A 機器開發,一下又在 B 機器開發的情況。那這時候怎麼處理 project ?

第1種情況是,直接從 heroku 取得專案:heroku git:clone -a your_heroku_app_name the_directory

第2種情況是,你已經先從你的 git repository 取得專案,那麼這時候就先切換到專案目錄下,再用 heroku git:remote -a your_heroku_app_name 這個指令來自動在 git remote 裡增加一個 heroku 的 remote repository。


安裝資料庫的 Addon

MySQL
Heroku 本身不提供 MySQL,只有合作廠商所提供的 ClearDB,但實質上 ClearDB 就是 MySQL。
ClearDB 有提供4個方案,Ignite 是免費的,雖然免費,但是安裝前,還是要先填信用卡資訊。
安裝方法:heroku addons:create cleardb:ignite
安裝以後,連線字串會放在 CLEARDB_DATABASE_URL 這個環境變數裡,程式只要存取這個環境變數就可以取得連線字串,用 heroku config:get CLEARDB_DATABASE_URL 則可以看到連接字串。
參考這篇文,就可以用本地端的 MySQL Query Browser (MySQL GUI 工具) 連上遠端的 ClearDB。
簡單說,就是從連線字串拆解出 username/password/host ,然後套進去用就可以了。

PostgreSQL
Heroku 預設提供的 database,不過還是要安裝。
安裝方法:heroku addons:add heroku-postgresql:dev
連線字串一樣是在環境變數裡:HEROKU_POSTGRESQL_BRONZE_URL 。

Prometheus

Prometheus 是一個 Monitor 的服務,要收集 host 資訊要搭配 node-exporter,要有 dashboard ,可以搭配 promdash。

而這三者,都有 docker container image 可以下載,但是要怎麼搭在一起,可就讓人傷腦筋了。花了一些時間把他們三個兜在一起,寫成 docker-compose.yml ,這樣就可以用 docker-compose up 直接啟動這三個 container。

過程裡遇到幾個難題:

  1. 沒辦法用自訂的 prometheus 設定:這部份查了老半天,反覆查看 prometheus 的 Dockerfile 以後,確定要 overwrite,所以在 docker-compose.yml 裡,加上了 entrypoint 與 command,其實就是原來的 prometheus Dockerfile 裡的 entrypoint 跟 command,只是 -config.file 這邊修改掉了。
    另外就加掛了自訂的 conf 目錄到容器裡的 /etc/custom 。
  2. prometheus 無法找到 node-exporter:這邊要利用 docker 的 link 在 /etc/hosts 裡插入的主機名稱,不能用 node-exporter 文件裡提到的 localhost ,所以我填入 docker-compose.yml 裡定義的 nodeexporter。

大概就這樣,目前執行結果看起來是沒問題,用一陣子看看吧。另外有在 https://hub.docker.com/u/prom/ 這裡看到不少 container image 可以拉下來組合的,以及 google 的 cAdvisor,有機會再來看看。

後記:實驗結果發現 node-exporter 不適合放在 docker container 裏面執行(跟 node-exporter 對應的,還有一個 container-exporter 專案,是專門收集 container 資訊的),因為會無法收集到關於 host 的資訊,所以 node-exporter 最好還是放在 host 執行,然後讓 prometheus 能存取到。另外,在找關於連結到 host 的部份時,看到有人提報一個 issue 給 docker,建議應該提供一個 –link-host 的功能,讓 container 裏面也能存取到 host,而不需要額外繞路取得。一般的繞路手法是透過 route 取得 gateway 位址,在某些情況下是還蠻麻煩的。

電影流水帳(2015/8/24~2015/9/15)

Elizabeth Olsen
Elizabeth Olsen ,飾演奧創紀元裡,自願去做實驗的異變人姊姊 Scarlet Witch (緋紅女巫)。從 IMDB 的檔案看起來,她是個童星呢,從小就開始演戲,演過不少電影。

  • Avengers: Age of Ultron (IMDB, Wikipedia),台譯:復仇者聯盟二 – 奧創紀元。
    英雄們接到任務,去東歐要從 Hydra 手中搶回 Loki 的權杖,在爭奪的過程裡,他們遇到異變人姊弟 Wonda 與 Pietro,不過還是搶回了權杖。Tony 受到 Wonda 的暗示而強化了內心的恐懼,回去以後,說服其他英雄給他一點時間研究權杖,也說服 Hulk 跟他合作,他們兩人意外弄出了 Ultron ,一個具有高度人工智慧,能在網路活動的反派角色。
    Ultron 不受控制而且十分強大,這件事情導致了英雄們的不合,被 Ultron 打的一蹋糊塗。他們逃到 Hawkeye 家裡去避難,在這段期間,英雄們重拾信心。接著,他們搶回 Ultron 利用 Loki 權杖裡的心靈寶石製作的新身體,Tony 跟 Hulk 利用心靈寶石稍稍改造了這個身體,重新注入混合了 Jarvis 的新人工智慧,新的英雄 Vision 誕生了。
    最後要決戰了,Ultron 試圖讓東歐城市飛到外太空,以殞石撞擊的形式讓地球上的人類毀滅,於是 Ultron 與英雄們展開一場大戰。在 Vision 的幫忙下,他們打趴了 Ultron ,也讓東歐小鎮上的人們安全回到地面,解決這次難關。打敗 Ultron 以後,復仇者聯盟的某些成員離去,新的成員 Vision、Scarlet Witch (Wonda) 與 Falcon 加入團隊,為後續的續集鋪路。
    網路上有一個雷神索爾去找命運三女神的影片,裏面有比較詳細的描述了命運三女神跟索爾說了什麼,電影裡卻只把這段輕輕帶過,我覺得這段還蠻重要的。
  • The starving game (IMDB, Wikipedia),台譯:雞餓遊戲。仿飢餓遊戲的搞笑電影,加了一堆無厘頭的笑點,普普通通,看過就算了。女主角還蠻漂亮的,電影最後有拍攝花絮,還蠻逗的。
  • Matilda (IMDB, Wikipedia),台譯:小魔女。看好幾次了,可是翻以前的流水帳,發現都沒紀錄過…
    這是兩個小女孩的故事,只是一個小女孩已經長大當老師了。Matilda 是個小女孩,父母親只疼愛哥哥,忽略了她的存在。所以她自立自強,自己上圖書館找書來看,自己爭取上學的權利。在極力的爭取下,Maltilda 能上學了,只是學校裡的校長是個刻薄的人,還好有個好老師,Jennifer 。
    說到 Jeniffer 也是個可憐人,父母早亡,校長是她的阿姨或姑姑,成為她的監護人以後,謀奪了她父母給他的財產,長大以後,當了老師。Matilda 與老師一拍即合,在學校經過一段時間相處,Matilda 得知了老師小時候發生的事,而老師也發現 Matilda 很聰明,但家裡不給予重視。就在此時,Matilda 意外發現自己有超能力,而且父親被 FBI 跟蹤盯哨很久了,因此她就設計讓自己的父母罪狀被 FBI 發現,也用魔力嚇跑了校長。最後 Matilda 被老師收養,學校也改歸老師所有,一個快樂的結局這樣。
    飾演 Matilda 的小女孩後來長大沒有繼續走演藝圈這條路,成為了劇作家。
  • 新人皮燈籠。
    為什麼要加個「新」?這是因為 1982 年時,有部電影就叫作人皮燈籠,所以加上個「新」作為區別,從電影海報上看來,兩個故事其實沒什麼關係,一個發生在古代,一個發生在香港的現代。
    阿輝是個倒楣的人,他也不知道為什麼。經過幾番巧遇,才知道跟自己的前世有關係。阿輝的前世是在雄爺手下做事,意外結識了雄爺女人慧姐的師妹小芙蓉,開始交往。交往的過程並不順利,第一個原因是前世是在法律部門服務,到雄爺手下是為了蒐證,第二個原因是他被慧姐看上了。總之交往的過程曝光了,慧姐來找他們倆,發生了意外死了,雄爺殺了阿輝的前世,把他埋在三衰七敗穴,同時也殺了小芙蓉,把小芙蓉的皮剝下來做燈籠。
    知道前因後果並取得大眼光協助,他們從三衰七敗穴取出前世屍骨,阿輝決定至少要救出小芙蓉,就跟雄爺攤牌,想拿回燈籠。雄爺不肯,就開始要火拼了,幸好阿輝之前的朋友去荷蘭找到援兵,嚇阻了雄爺。雄爺跑去警局求助,阿輝單槍匹馬赴會,試圖說服雄爺,但你也知道,故事一定要讓雄爺死的,最後就在警局大打一場,結束了,大眼光也因此受到器重。但可惜,小芙蓉魂飛魄散,沒能順利轉世。
    我覺得故事有點爛尾,前半部鋪陳的很好,到了後面好像是為了趕時間似的,急轉直下,很快的演出復仇戲碼就收尾了,有點可惜。

其實還重看了「末日來臨怎麼伴」,這部電影還蠻能帶給人啟發的,我指的是像 About time 那部電影一樣的感覺,要珍惜時間。

Laravel 5 測試用的資料庫設定

參考這篇來做:How to specify a testing database in Laravel 5?

有打勾的 Best answer 就是了,主要修改部份有兩個,第一個是在 config/database.php 裡,這裡添加給測試環境用的資料庫設定;第二個是在基礎的 TestCase 類別裡,去放置給測試環境用的環境變數。

原理是這樣的,因為 Laravel 應用程式在啟動時,會根據環境變數或是 .env 來決定要啟用哪組資料庫設定,這部份可以在 .env 與 config/database.php 裡看到。所以就可以這樣動手腳來切換,避免 production 與 testing 的資料庫混用。

文章裡有一點是比較不建議的作法,這是我在 Two scoops of Django 這本書上看到的,就是 testing 與 production 的資料庫要一致,不要 production 用 mysql,testing 又用 sqlite 這樣子。畢竟在實際應用時,資料庫的不同仍有可能造成測試結果的不同,那就會導致測試時都沒問題,正式上線時卻出包的情況。

我這邊照著改的時候,有失敗的情況,仔細檢查以後,發現文章裡是用 DB_DEFAULT,而用 Laravel 產生出來的專案框架裡是用 DB_CONNECTION,這邊調整一下就沒有問題了,我猜想可能是 Laravel 版本的關係。