GitHub 的 chatop (2016)

Velocity 2016 裡面,GitHub 分享了如何用 Slack 為平台,建立機器人來輔助開發流程(如 CI、Deployment、Monitor等等)。

對於開發者來說,可以一邊討論就一邊把事情完成,整合了 README 等文件撰寫的工作;對於 Operator 來說,由於討論的過程在 Slack 上,也可以設計一個流程,當有事件發生時就 Alert OP,這樣可以讓 OP 在開發過程中也被告知,獲得必要資訊。

缺點就是資訊流通太快了,可能開完一個一小時會議之後,事情跟前一個小時差距就變得很大 XD 這點是需要團隊成員適應的地方。

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone

安裝 Let’s Encrypt 的憑證與支援 HTTP/2

昨天花了一個多小時的時間,申請了 Let’s Encrypt 的憑證並更新上去,並且升級到 Apache 2.4.17 來安裝 HTTP/2 Module。

Let’s Encrypt 使用的 ACME Client 程式,目前有實驗性的支援 FreeBSD,基本上按照信件中的說明安裝即可。如果是 FreeBSD 9.x 的話,需要按照這個 GitHub Issue 的方式,自行編譯 trunk 版本的 pyca/cryptography,即可完成 ACME Client 的安裝。

安裝完成後,可以指定 webroot 當作認證檔案存放的位置,來給 Let’s Encrypt 驗證這個網域確實是申請人所有:


./letsencrypt-auto --agree-dev-preview --server https://acme-v01.api.letsencrypt.org/directory -a webroot --webroot-path /home/data/websites/jnlin.org/webroot certonly

簽好的憑證會放在 /etc/letsencrypt/ 裡面,效期 90 天。官方建議每 60 天 renew 一次。我自己打算先手動 renew 一次,沒問題的話就丟到 cron 裡面,兩個月自動 renew 一次。

安裝 Apache 2.4 + HTTP/2 Module 就沒什麼特別的,直接 ports 安裝,結束之後,把憑證設定上去,即可打開 HTTP/2 的功能。反倒是解決 WordPress 的 mixed content 問題花了比較多時間 XD

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone

Google Tag Manager 簡介 (3) – 自訂代碼

雖然 Google Tag Manager 有支援很多代碼,但沒有支援的代碼,一樣可以用自訂的方式設定上去。

自訂代碼分為兩種:HTML 與圖片代碼。當觸發條件被滿足時,指定的 HTML 或圖片代碼會被載入到頁面上。

在代碼中,可以用 {{ 變數名稱 }} 來帶入變數的值。
設定好之後,使用的方法跟套用 Google Analytics 一樣。

如果要利用 Google Tag Manager 來套用 Mixpanel 追蹤的話,可以參考這篇 Mixpanel 分享的說明

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone

Google Tag Manager 簡介 (2) – 建立變數與自訂事件

上一篇文章中,我們建立了簡單的事件。但除了 PV 之外,我們還要追蹤網站上元素的點擊,或是其他特殊的事件。Google Tag Manager 已經有內建一些變數,可以指定條件,讓我們不需要寫程式就能追蹤部份的事件。

我們必須到「變數」這個 Tab 去啟用這些內建的變數。

目前支援的變數列表如下:

  • Page URL
    • Page Hostname
    • Page Path
    • Referrer
  • 公用程式
    • Event
    • Container ID
    • Container Version
    • Random Number
    • HTML ID
  • 錯誤
    • Error Message
    • Error URL
    • Error Line
    • Debug Mode
  • 點擊
    • Click Element
    • Click Classes
    • Click ID
    • Click Target
    • Click URL
    • Click Text
  • 表單
    • Form Element
    • Form Classes
    • Form ID
    • Form Target
    • Form URL
    • Form Text
  • 歷史紀錄
    • New History Fragment
    • Old History Fragment
    • New History State
    • Old History State
    • History Source

以下我們以「當使用者點擊頁面上 id 為 “to-be-clicked” 的物件」為例,建立一個事件:

1. 首先到「變數」,啟用「Click ID」這個變數。

2. 新增一個「觸發條件」,事件類型為「點擊」,觸發條件為「所有元素」,啟動時機為「部分點擊」。接著在啟動時機內設定條件為「Click ID 等於 “to-be-clicked”」。

3. 新增一個「代碼」,指定該「觸發條件」要發出的 Event 內容與要記錄到的 Google Analytics ID。

如果我們想設定的變數不在預設列表中,也可以用程式自訂一個變數。作法如下:

1. 新增一個「使用者定義的變數」,類型選擇「自訂 javascript」。

2. 輸入一個 javascript 函式,傳回值為變數值。例如:

function () {return $('body').data('state'); }

表示傳回 <body> 的 state 這個 data attribute。

另外,我們也可以在程式裡面觸發 Tag Manager 的自訂事件。首先先建立一個觸發條件,選擇「自訂事件」:

接著在程式內觸發此事件:

dataLayer.push({"event": "custom-event"});

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone

Google Tag Manager 簡介 (1) – 建立事件

為了收集使用者資料與行為,現代的 Web App 或 Mobile App 都會埋很多 Tracking Code,例如 Google AnalyticsMixpanel 或是 Flurry 之類的。當埋的 Tracking Code 或需要追蹤的事件開始變多的時候,管理就會變的越來越複雜。另外,隨著分工越來越細,工程師們會常常接收到來自產品、數據或營運部門的資料紀錄需求。當資料需求越來愈多的時候,紀錄事件這件事情就變得很瑣碎。尤其,面對的是 Mobile App 時,由於每次要收集新的紀錄時,就必須將 App 重新送審,比起 Web App 來說會花費更多時間。

Google Tag Manager 提供一個「簡單滿足紀錄需求」的介面,讓紀錄事件這件事變得不一定要工程師寫程式來達成。不過需要對寫程式邏輯有一定的熟悉度,對於一般「企劃人員」可能還是有些門檻在。

在 Web 使用 Google Tag Manager 的方式很簡單,直接申請之後,會給你一串 HTML:

接著要到 Google Tag Manager 的頁面中建立要記錄到的服務。在 Google Tag Manager 介面中選擇「新增代碼」,可看到除了 Google Analytics 以外,還有以下的 Tracking Code 可以選擇:

設定完並存檔之後,我們就有一個代碼用來紀錄 Page View 了。接著在「觸發條件」這裡,設定想要追蹤的事件類型:

例如,建立一個「計時器」觸發條件,當網頁載入後超過 1 秒鐘,送出 timer1s 事件:

然後回到「代碼」這裡,再建立一個 GA 代碼,但這次「追蹤類型」要選擇「事件」,並且將剛剛建立的觸發條件設定為「啟動時機」:

這樣我們就順利建立了一個事件。最後,要記得要按下右上角的「發布」,剛剛設定的條件才會被佈署到正式的平台上,事件也才會被記錄到 Google Analytics 中:

下一篇文章,將會介紹「自訂事件」與「變數」的設定方式。

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone

[宿記] 宮島錦水館

這次去日本,總算去了一直想去的宮島(嚴島神社)

IMG_2661.JPG

因為是一人旅,在規劃行程的時候本來想住廣島然後搭首發電車上島看漲潮的大鳥居的。
不過在 jalan 上看到 錦水館 的一人旅方案,含早晚餐跟溫泉,於是就決定在島上住一晚了。

宮島是日本「三景」之一,另外兩個分別是京都的天橋立還有宮城縣的松島。

IMG_2675.JPG

旅館有免費的碼頭接送服務,但我沒有預約,一個人拉著行李慢慢走到旅館門口。路上有很多群非常兇的鹿,會咬人手上的紙類物品,甚至連塑膠袋都會被咬走…
如果有經過這條路的話,盡量還是不要再手上拿塑膠袋或紙袋比較好。

IMG_2676.JPG

一到了旅館,在外面打掃的飯店的女服務生一知道我是住宿的客人,就馬上放下手上的工作幫我搬行李。

IMG_2681.JPG

在旅館前台有一個小的咖啡廳,CHECK-IN 也是在這裡進行。CHECK-IN 時會先問預計用晚餐的時間。
客人坐著,由服務生一對一的服務,因為長途旅行而緊繃的精神感覺一下子放鬆下來。

鑰匙做成宮島名產「杓」的樣子。
IMG_2740.JPG

服務生幫忙把我的行李拿到了五樓的單人房。房間面對商店街,所以看不到瀨戶內海。
不過整體來說很舒服很好睡。浴室很小,不過都來溫泉旅館了,應該沒人會在房間浴室洗澡吧 XD

IMG_2679.JPG

旅館玄關的樣子:
IMG_2721.JPG

雖然是百年的旅館,但外觀經過整修過,也還蠻有現代感的。
IMG_2739.JPG

旅館在電梯旁提供浴衣,除了比較樸素的旅館版本外,還有各種花樣的版本,男女皆有,可以選一件自己喜歡的到房間換。大概男女各七八種款式,顏色比較淡一些。
另外玄關有提供外出用拖鞋,如果要穿浴衣外出,記得不要把室內拖鞋直接穿出去。

晚餐前先去泡個湯。說實在是有點小失望啦,男湯不大,大概跟 ドーミーイン 的差不多,而且因為在地下室所以也沒有景觀可看。
不過晚餐就超出我預料之外了。

一到了餐廳,馬上就在桌上看到我的名字,以及超豐盛的餐點。
2015-01-30 19.07.51
女服務生也馬上過來詢問要喝些什麼。我點了照片中的廣島地酒 Set,三杯共 1300 円。

到了廣島當然要吃牡蠣。除了炸牡蠣外,還有牡蠣釜飯可吃。
2015-01-30 20.01.48

2015-01-30 20.12.33

豐盛又好吃,酒也好喝,一整個滿足~

晚餐後,服務生會來詢問隔天早上的早餐時間,並送上名片。
2015-01-30 20.50.50

吃太飽了,出去散個步,看一下晚上的大鳥居~
IMG_2730.JPG

外面超冷,走了半小時就趕緊回房間睡覺了 XD

早上七點起來,先去看一下漲潮的大鳥居,然後又跑去泡了湯。
八點半的早餐也是豐盛到吃不完。一到餐廳,日式的早餐也是擺在桌上一整份,另外外加自助式的生菜沙拉。
由於實在太飽就沒拍照了

總評:

服務:五顆星,服務給人的感覺非常舒服,如果聽得懂日文,服務生會熱情跟你介紹旅館服務還有菜色。
溫泉:三顆星,普普。
食物:四顆半星,缺的半顆星是因為沒旅伴(喂)
房間:四顆星,單人房不錯,下次會想預約面海的和室。

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone

把 HTC M8 刷成 Google Play Edition (GPE)

先說重點:

  1. 你會失去保固!
  2. 刷機有風險,本文不保證一定會成功,刷完有可能開不了機,請自行評估是否能接受。
  3. 由於兩者的 partition 切法不同,刷成 GPE 之後,目前無法刷回 M8 Sense 的 ROM。
  4. 刷成 GPE 之後,更新會變快,會是原生的 Android 體驗。
  5. 可以進行 OTA
  6. 所有的 HTC 程式會被移除,但如果有保留 APK 的話,可以重新裝回去,也可以正常使用。
  7. Dotview 可以正常使用
  8. 升級到 Android 5.0 之後,介面變得真的很棒,而且在畫面切換的小細節也都有注意到。

在開始刷機之前,你需要:

  1. 一台電腦,裝有最新版的 adb
  2. 一隻 HTC M8,需要 S-OFF。目前 M8 + Android 4.4.4 以上尚未有免費的 S-OFF 方案,這部份需要付出一點成本

刷機的方法:

  1. 先把 cid 改為 11111111 (supercid)。
    < fastboot oem writecid
  2. 按照 xda 這篇,下載 GPE 的 RUU,但先不要安裝。
  3. 解開 RUU。
  4. 因為我們的手機是台灣版的,radio 驅動與美版的 M8 不同,所以要事先備份 radio 下來,取代 RUU 內的 radio,或是到 xda 這篇 下載台版的 radio。這篇也有其他地區的 radio image 可以下載。
  5. 取代完 radio 後,重新壓縮成 zip 檔案,接著就可以開始刷機了。
  6. 刷機第一次會失敗,直接重刷一次即可。
  7. 刷完之後,開機就會是 GPE 版本的 M8。接著還需要再把 cid 改成 GOOGL001,才能進行 OTA。

其他資訊,可以找 xda 論壇,有許多相關文章可以參考 :-)

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone

技術職位面試官心得

先說重點:我覺得面試的題目要準備夠充分,而且要從簡單到困難,循序漸進,直到求職者答不出來為止。這樣可以了解求職者的能力範圍。有好的能力,給的薪水也會比較高,作的事情也會比較難。但我問完之後,會跟他說明答不出來不代表不會錄取,只會作參考。

我會先把求職者分成兩個類型:新鮮人(完全沒有工作經驗)與轉職者。

對於新鮮人,如果是相關科系出身,我會比較期待他還記得比較多理論的東西,所以我會看他的成績單,修過什麼課程,然後拿該課程的內容來問。舉例來說,一般的資工系都有修過資料結構與演算法,我會問他 Stack, Queue, Hash 的用法,或是 Quick Sort, Bubble Sort,然後請他說明這些課程中,他印象最深刻的內容,再根據他的內容來繼續問下去。

通常後來被我刷掉的人,有很多是上課渾渾噩噩,所以根本就不知道上課內容是啥的。之前遇過一個求職者,問他對哪個課程最有印象,他的回答是都沒有印象 ~_~

如果他有作品(或專題),或是在外面有打工,就會問實作的東西,例如問作品的哪個部分是他做的,與其他人如何合作,還有對於作品的哪個部分印象最深刻,覺得哪裡最難,後來怎麼解決(解決未知問題的能力)。通常實作強的人,對於這個問題都能很快回答出來。如果作品他做的部分很少,就很容易支支吾吾。

接下來,會給一個實際的問題,請求職者用他最熟悉的程式語言現場說明解決方法,主要觀察的地方是解決問題的過程。之前有問過用 C 寫 string replace 的題目,基本上這個有寫過程式應該都回答的出來。

接著會給一篇英文技術文章,或是給一個技術文件,請求職者閱讀後,大致說明內容,並且講一下可以怎麼應用。通常前面沒問題,後面會死一堆新鮮人。

再來,會問求職者是否有用過常用的工具(版本控制、MVC、Framework),GitHub,以及有沒有參加 Open Source Conference 的經驗等等。這個部分主要是想了解他對 Open Source 的熟悉度,對於未來工作尋找資源上會有幫助。

最後,會問為什麼會來應徵這份工作,對於公司了解多少,有沒有用過公司的產品,舉出公司產品的優缺點。從這個問題可以了解這個人是不是有自己的想法,還是老闆說了就照做的人。

新鮮人的人格特質,只要是誠實、對自己負責的人,基本上就很 OK 了。公司裡面需要有想法的人,也需要老闆說了就照做的人,並不會因為沒有想法就被刷掉,除非是渾渾噩噩不思進取的特質。

轉職者的部份下次(會有嗎?)再來談吧。

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone

避免 PHP Imagick 把記憶體吃完…

PHP 的 Imagick 有 memory leak 的情形,當用 PHP-CGI 跑動態縮圖服務的時候,這個問題更加的嚴重。查了一下資料,可以設定參數限制使用的記憶體大小:


// set pixel cache max size to 256MB
IMagick::setResourceLimit(imagick::RESOURCETYPE_MEMORY, 256 * 1024 * 1024);
// maximum amount of memory map to allocate for the pixel cache
IMagick::setResourceLimit(imagick::RESOURCETYPE_MAP, 256 * 1024 * 1024);

單位是 Bytes。如果進行圖片處理時,所需的記憶體超過指定值時,會在 /tmp 寫入暫存檔案。可以使用 MAGICK_TMPDIR 這個環境變數來指定暫存目錄:


putenv('MAGICK_TMPDIR=/tmp/imagick');

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone

北海道自駕行:一些心得

本文同步刊登於:北海道自駕行:一些心得 @ あなたがいるから

這次去北海道,挑戰了人生第一次右駕。過程中雖然還算平順,不過也有差點轉到對向車道的時候 (爆)
最後開了八天,里程數是 1100 公里。以下大概條列式的整理一下要在北海道開車的重點。

2014-05-13 09.01.12

1. 事前準備
因為日本不承認台灣的國際駕照,所以在出國前,要帶著台灣的駕照到監理站去申請「日文譯本」,費用是新台幣 100 元。(臺日雙方駕照互惠措施須知)。日文譯本是一張 A4 大小的紙,租車的時候租車公司除了會看譯本外,也會看中文正本,所以不要忘記帶台灣的駕照。

2. 租車
我們是在格安租車 北海道這家公司租的。他是一家旅行社,會幫你跟租車公司聯絡租車事宜,線上刷卡付款後,會寄預約結果過來,列印出來後帶到現場就好。如果會開高速公路,要租 ETC 卡的話(日本的 ETC 跟遠通第一版 ETC 一樣,是機器跟卡分開),也可以寫在備註中請他聯絡租車公司。如果需要甲地租乙地還,通常需要多加一點錢。與大眾運輸工具比起來,三個人共乘一台車,費用差不多可以打平大眾交通工具的費用。

3. ETC
如果要開高速公路的話,強烈建議一定要租 ETC 卡。除了方便之外,在離峰時段還有打折,而且還可以還車的時候再結算。另外北海道有提供外國人 ETC 吃到飽的方案(Hokkaido Expressway Pass, HEP),如果會常常上高速公路的話,也是一個好選項。但是,如果要使用 HEP 的話,租車的全程都必須付費。也就是說,不能因為第三天開始才會上高速公路,指定讓 HEP 的效期從第三天開始。

4. GPS
日本的 GPS 非常方便,前提是一定要先查到景點的「電話」或是「Map Code」。有時景點的電話會是管理機構的電話,這時可以試著查附近景點,再按照指標過去。

5. 加油
一定要先摸消除靜電的裝置!很重要!北海道非常乾燥,只是開個車門每次都被電到,更不要說加油了。
加油有分「セルフ」(自助)、「セミセルフ」(人工加油但是沒有清潔服務)、「スタッフ」(人工加油,含車輛外觀基本清潔),基本上都是加便宜的セルフ和セミセルフ啦。另外油也有分等級,一般的車都是加レギュラー的油,除非租到柴油車。
加油的時候,用現金會比較便宜,先選擇油種,投錢後才開始加油。還車前,要加滿油,店員會檢查油表與加油的收據。另外,上高速公路前,請先確定油是夠的,因為可能有 100 公里以上的路段沒有加油站…

DSC02942
這次租的車有油耗顯示(每公升的油可以開多少公里),超過 20 公里的話會亮 ECO 的燈。如果一路上都能保持超過 20 公里的話,超有成就感的。

6. 高速公路
通常高速公路的速限是 100,但是有很大部分(道南、道東)只有 70。當地人開車都超猛,在 70 的路段開 100 還是追不上前車的車尾燈,而且還會被警察攔下來。遇到的時候,一定要減速停在路邊,配合警察的檢查。聽旅館的服務生說,警察會特別攔租車車牌的車(わ開頭的),不知是真是假。總之,保持速限,就算當路隊長(還蠻常當的,當地人開車真的猛,有時速限 100 開 105 也還是會當路隊長…)也不要害怕,當有超車道的時候其他車會自己超過去。另外,有雙線道的時候,內側車道是超車道,如果不是要超車,絕對不要在上面行駛。

7. 停車
會租車的話,一定是因為想去大眾運輸工具不方便到的地方(例如一天只有一班火車之類的地方),通常這些地方都有停車場,一次 300 日元或 500 日元。市區的話停車非常貴,在札幌市中心,有一小時 600 日元的停車場。如果要在市中心晃,把車停在旅館再搭電車或者走路過去會比較方便。旅館一天的停車費大概是 1000 ~ 1500 日元之間,有些需要事前預約,要注意一下。

在北海道開車比在台灣輕鬆多了,如果行程中有安排比較不「大眾」的景點的話,也許可以考慮租一兩天車去玩也不錯 :)

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInEmail this to someone