2018/12/09

mooInk+ 開箱後的一些心得

因為有長時間閱讀需求,所以投資了 mooInk Plus 7.8 吋電子墨水閱讀器,用一陣子還蠻順手的。

詳細的 mooInk Plus 的詳細介紹、規格說明,可以參考 milyspice 大大的文章:https://www.ptt.cc/bbs/book/M.1501401097.A.C16.html,以下就列一些個人的想法。



電子紙優點:
  • 靠環境光來呈現圖、文,電子紙本身不發光
  • 主要是灰階、黑白呈現
  • 長時間閱讀時,較一般 LED 平板不容易疲勞

電子紙缺點:
  • 由於電子墨水的特性,畫面更新的速度較慢
  • 換頁 (更新畫面) 需要使用到較多的電力 (閱讀時感覺比較耗電)

圖一:閱讀器本身無背光,均由環境光來決定到底畫面有多亮




mooInk Plus 與一般平板 (我自己是用 ASUS ZenPad 8.0)的比較:
  • 沒有 LED 背光、刺眼的困擾
  • 在沒有使用 wifi 的情況下,比想像中的省電,待機一週不充電看起來不是問題
  • 不確定是 mooInk Plus 的問題,還是電子紙本身的技術限制,畫面更新後會有一點點殘影,可以略為看到前一個畫面中邊緣的線條

喜歡 mooInk 的一些特色:
  • mooInk 支援外部的 epub 電子書檔案,可以上傳自己的 epub 檔按,並在 mooInk 閱讀
  • mooInk 的預設字體,剛好是我自己喜歡的無襯線字體,無論遠近看起來都很清晰
  • 常見的出版刊物,ReadMoo 都有 epub 格式的檔案,可供電子閱讀器使用

圖二:我把之前買的 O'Reilly Head First 的 epub 版本上傳到 mooInk 上



個人認為一些可以改善的地方:
  • milyspice 提到有換頁按鍵,但換頁按鍵剛好在單手持閱讀器的位置,也就是單手拿著閱讀器時,很容易觸碰到換頁按鍵
  • 中文輸入法很卡,搜尋不易。我還是會在一般平板搜尋、買書,再到 mooInk 上下載、閱讀
  • 閱讀器的處理速度感覺較慢,希望使用觸控螢幕時,有收到指令 (點擊、滑動等) 先更新畫面,再來處理複雜的動作,不然很難知道是畫面還沒更新、或沒有成功下達指令
  • 希望電子紙的畫面更新可以更順暢

2018/11/07

Flickr 的使用者付費方案調整

Flickr 調整了使用者付費方案,其中免費使用者將有照片數量上的限制:
免費帳戶將設有 1,000 項相片或影片的內容數量限制。Flickr 決不能沒有免費會員的貢獻和參與,我們承諾繼續提供精彩的免費體驗。

對部份的人來說,可能是少了一個圖床吧。但收費,並提供更好使用者體驗,是很重要的一個環節 (希望是正向循環)。

目前轉付費帳號還享有 7 折優惠,使用量大的朋友可以考慮。

2018/11/06

Flickr 2019 年限制免費帳號使用量

gslin 提到 Flickr 將在 2019/01 開始縮減免費服務的用量,未來免費帳戶將只有 1000 張公開照片。

不曉得超過 1000 張照片以後,頁面會長什麼樣子。

在 Flickr 還沒被 Y 家買下之前,照片雖然可以無限量上傳,但公開頁面上僅顯示最新的 200 張照片。雖然沒有被公開,但若在照片被隱藏起來之前,將照片的 URL 保留下來,即使照片沒有顯示在公開頁面,也有辦法讓別人看,於是便有了「Flickr-Linker」專案。

觀望一陣子,如果行為在預期當中,不排除將 Flickr-Linker 專案重新啟動。

「耐心的溝通絕對比鬥爭更好」

雨蒼的 Medium 看到的文章「我們該如何反思並使黑客文化更好?從Linus變得有禮貌開始說起」:
推廣理念,耐心的溝通絕對比鬥爭更好,也更能爭取到支持與理解。

有衝突 (conflict) 表示有不同的意見、不同的解決方案,有多個不同的解決方案是好事,但並不是每個方案都適合鎖情況。魚與熊掌不可兼得,只能找到當下較為適合的方案來使用,所以需要溝通、討論,了解每種方案的優缺點。

2018/10/30

近期撰寫程式碼的量

以前大多用 3rd-party library 來拼拼湊湊出自己要使用的功能,近一年狀況比較特殊,幾乎所有東西都要自幹:
$ cd /project/root/src
$ du -sh
148K    .

一年的 code 就 150 KB,算是自開始寫程式以來的個人記錄了吧。

希望這 150 KB 的程式是好的程式,而不是垃圾。

2018/10/29

clamav 掃描 Linux 上的病毒

clamav 預設會將所有掃描過的資料全部輸出到畫面,不管正常或是中毒,這個有點討厭。自己寫 script 做掉:
function clamscan() {
    clamscan -i -r $*
}

另外再寫個掃描整台電腦的 script
#!/usr/bin/env bash

DATE=`date '+%Y-%m-%d'`
LOG_PATH="/var/log/clamav"

# create log folder
mkdir -p  $LOG_PATH

clamscan -i -r /  2>&1 > "$LOG_PATH/$DATE.log"

2018/10/23

藍芽耳機音量調整突然變大問題

前陣子使用藍芽耳機聽音樂時,發現調整音量大小時,應該是一級、一級慢慢擴大聲音,但不曉得為什麼在某一級音量,再多往上條大聲時,會突然大聲很多,感覺像是突然多跳了一級。

上述問題在 KKBOXPoweramp 上都會發生。比較意外的是用同樣的軟體時,有線耳機卻沒有出現這個問題。

測試後發現 Android 在藍芽音訊有一個類似「音量等化」的功能,避免不同規格耳機放出的音量不一致:

從手機的「設定」=>「系統」=>「開發人員選項」=>「網路連線」相關設定可看到


該設定預設會啟用「絕對音量」功能,啟用此功能也會導致文章一開始所說音量調整不一致的問題。把「絕對音量」停用以後,問題便解決了,但耳機聽到的音量會差很多。


備註:調整此設定以後,藍芽連線必須斷線、再重新連線才會套用設定。可將藍芽裝置關機再開機,或是從手機的藍芽設定頁面重新連接藍芽裝置。

2018/10/17

PHP 5.6 將在 2018 年底中止維護

目前 PHP 5 最後一個承載維護的版本:5.6,將於今年年底中止維護。也就是不會再有新功能,且就算有錯誤、安全漏洞也不會再繼續修補。

所以建議大家盡快升級手邊的 PHP 專案至 PHP 7。



個人的經驗,可以跳過 7.0 直接上 7.1,畢竟 7.1 主要是新增一些 7.0 還不支援的功能,沒有他太大的異動。7.2 主要是對效能調整,和新增一些語法,要直接跳 7.2 也不會花太多時間改程式。

預計在 2020 年廢除 TLS 1.0 以及1.1 的支援

這新聞各大媒體都有報導了:

簡單來說:
  • 多數瀏覽器均支援 TLS 1.2
  • TLS 1.0 已經 20 歲、TLS 1.1 也 12 歲了,並且有已知攻擊「POODLE」和「BEAST
  • 剩下少數瀏覽器仍在使用舊版通訊協定 (Edge ... 你看看你)

若手邊有機器需要調整設定,可參考:

2018/10/15

拆解沈水式幫浦

自從去年颱風下大雨,樂團團練室淹水以後,就一直在想除了水桶以外,可以便利抽水的方法。也因此尋找了一些抽水幫浦的設計和結構。

今天一個因緣際會,收到一個魚缸打氣用的沈水式幫浦,打算拆解來看結構設計。雖然抽水的物理原理大致上已經了解,但仍然不清楚實際的防水方法。



希望這次拆解,可以對馬達、幫浦有更進一步的認識。再來就是動手土砲一個幫浦來玩了。

最後感謝新竹澄品佳餚的老闆,提供故障的水族幫浦零件供研究,讓我省了一筆開銷。


YouTube 上已經有很說神人自幹幫浦了,大家有興趣可以參考看看:



PHP server connector 一些 un-documented behaviour

今天是測試 Memcache::connect() 踩到的問題。

先來看看文件上的說明:
Returns TRUE on success or FALSE on failure.
所以我的程式就這樣寫:
$c = new Memcache();
$stat = $c->connect('localhost');

if (false === $stat) {
    echo 'connection failed';
} else {
    echo 'connected to cache server';
}

測試時把 Memcached shutdown 來看看是否會偵測到連線失敗。執行時卻噴了一堆錯誤訊息:
Warning: Memcache::connect(): Can't connect to localhost:11211, Connection refused (111) in /home/u/he5702/tmp/asd.php on line 4

Call Stack:
    0.0001     355600   1. {main}() /home/u/he5702/tmp/asd.php:0
    0.0001     355640   2. Memcache->connect() /home/u/he5702/tmp/asd.php:4

connection failed

文件上面並沒有提到 library 除了回傳 false 以外,還會噴一堆錯誤訊息。萬一這隻是 JSON API 就一定會導致 client parse error。

所以應變方法用「@」來隱藏錯誤訊息:
$stat = @$c->connect('localhost');



寫程式真的很怕遇到 undefine behavior,如果文件上都寫清楚的話,在 dev / staging 上都可以事先檢查、防範。但連文件都沒有寫,就只能等個被廣大的客戶客訴到死 ....。

2018/10/13

自製 Linux Live USB 救援用可開機隨身碟



用 UbuntuMate 16.04 LTS i386 (32bit) 的官方 ISO,透過 Cubic 調整了內容以後,做出來專門用來做電腦系統檢查、救援的 live USB ISO 開機隨身碟。

下載方法:



說明一下異動的內容。

先把多媒體、文書工具的軟體先清除掉,像是 LibreOffice 這類軟體佔用不少儲存空間,但在系統救援完原用不到的東西,我就先幹掉了。另外還有像是 ThunderBird、VLC 等多媒體軟體。

另外增加以下工具,供系統檢查、資料修復備援使用。


一般常用工具:

  • gzip / ungzip / pigz
  • zip / unzip
  • bzip2 / lbzip2
  • p7zip-full
  • htop
  • glances
  • iftop
  • dstat
  • lsof
  • sysstat
  • util-linux

磁碟相關:
  • smartmontools
  • dd
  • ddrescue
  • gparted
  • partimage
  • nfs-common
  • ntfs-3g
  • testdisk
  • badblocks
  • lvm
  • mdadm
  • rsync

網路相關:
  • traceroute
  • mtr
  • mitmproxy
  • iftop
  • tcpdump
  • nmap
  • netcat

若有常用工具被我遺漏,再麻煩留言告知。我會在下一次更新時整理上來。

Customize ISO image by Cubic

以往要客製化自己的 Live USB 工具隨身碟,都是使用 Universal USB Installer,並預留可以使用的空間,再自己上去安裝工具。最近看到有人推薦 Cubic,覺得方便很多。



Cubic 會先解開 general ISO,再透過幾個步驟設定你自己需要的東西:
  1. 設定 ISO 的 meta data,像是 ISO name、release name 等等
  2. 透過 chroot 進入 general ISO 的環境,自己安裝需要的工具、解安裝不要的東西。
    也可以在此步驟設定一些環境參數。
  3. Cubic 會詢問你預設要使用哪個 Linux kernal 當作預設啟動使用。
  4. 如上圖,自動開始封裝檔案,並建立新的 ISO 檔

以下是別人整理的簡易教學:

2018/10/04

GnuWin64

剛剛在幹壞事,想到以前自己找到的 GNU like Windows tool chain「GnuWin32」。

現在主流的系統大多上 64 bits 了,不知道有沒有人重新編譯這些工具,於是直接搜尋「GnuWin64」,沒想到還真的有咧 XDDD


GnuWin64


GnuWin64 provides Win64-versions (x64) of GNU or similar open source tools. The ports are native ports, that is they rely only on libraries provided with 64-bit Microsoft Windows operating system for the AMD64 and Intel64 (EM64T) architecture.

https://sourceforge.net/projects/gnuwin64/

2018/09/28

Increase Bash History Size

It is really convenient to use Ctrl+R to find often used commands.

If Bash history is not enough to save those commands, try to add ENV vairables below into .bashrc:
# amount of commands you want to store in .bash_history
export HISTSIZE=1000

# amount of commands you want to store in current bash session
export HISTFILESIZE=200000

Reference:

2018/09/26

丼好食 - 日式料理

與筷子相比,鮭魚刺身非常厚實


透過新竹竹北的朋友介紹才知道的日式料理店,說要吃生魚片這邊應該很符合我的胃口 XD

丼好食,店裡的單點價格約在 150 ~ 250 之間,但是份量不小,即使是刺身也不是薄薄一片。建議點餐前先留意隔壁客人碗盤的大小、份量,再決定要點多少樣菜。

2018/09/23

「綠色奇蹟」舊電腦回收

舊的實驗器材已經無法在使用了,另外還有一些線材、零件不知道怎麼處理。然而一般的垃圾車、資源回收車是不是真的有回收再利用又是個問號,一時之間難以下決定。


查了一下 3C 產品的回收機制,無意間看到一個回收團隊「綠色奇蹟」。



該團隊不是將回收的 3C 廢棄物依照材質分類回收,而是由志工檢測可再利用、無法使用的零件,另外拼裝成電腦主機、控制器等裝置,再將這些拼奏起來的裝置轉讓給有需要的機構,像是偏鄉地區的學校、其他志工團隊,或是其他需要的單位。

若您手上有不再使用的 3C 產品,如記憶體、CPU、主機板、滑鼠、鍵盤、線材等,可以至綠色奇蹟網站上填寫舊電腦回收表單綠色奇蹟收到您的申請後,會電話與您聯繫,並派車至指定地點接收欲廢棄的 3C 器材。

這幾個步驟,您只要與綠色奇蹟、快遞士電話聯絡,沒有需要額外的金費支出。一個簡單的流程,讓您可以空出生活空間,並讓資源缺乏的單為一個支援的機會,一舉兩得。

2018/09/19

透過 AWS 的服務防止圖片盜連

前陣子決定要找部落格的圖床,再加上 Blogger 開始支援 HTTPS,最後決定花點小錢,直接使用 AWS s3 + cloudFront 來當作圖床。

沒錯,流量小的時候的確是只要花一點小錢,但是哪天誤會被 DDoS、圖片被有名網站盜連,這就不是錢錢可以解決的事情了。

「盜連」這個動作在英文是「Hotlinking」,搜尋了一下發現 AWS 可以透過 CloudFront + WAF 的輔助,完成防止盜連的功能:How to Prevent Hotlinking by Using AWS WAF, Amazon CloudFront, and Referer Checking

主要是使用 HTTP header 中的 referer 來做來源檢查,設定可參考下圖。

圖一:先去 CloudFront 察看正常會使用到圖片的平台



圖二:在 WAF 建立規則


這樣大致上就可以解決圖片盜連的問題了。

但,AWS WAF 的定價可不便宜,一個 web ACL 定價是每個月 5 USD,也就是說如果圖片每個月被存取的次數沒有超過 400 次以上,其實用了 WAF 反而費用較高。就請大家自行衡量了。

2018/09/18

C 語言 scanf() 在迴圈沒有停止的問題

程式大概是這樣:
scanf("%c", &input)
while (input == 'y') {
    // ....
    scanf("%c", input);
}

結果 while 裡面的 scanf() 沒有停。原因是輸入「y」並按下 enter 後,scanf 拿到的是「2\n」,所以 input 會是 2,但 \n 還在 input buffer 裡面,第二次 scanf 會以為使用者已經有輸入值 (空字串) 就繼續往下執行了。

要讓 scanf() 避開這個問題,只要在「%c」前面加上一個空白即可:
scanf(" %c", &input)

Ref:

2018/09/17

HiNet 宣佈年底關閉 Proxy 服務

看到 Hinet 宣佈 2018 年底中止 Proxy 服務,另外看到 gslin 的文章說「網站都走 HTTPS 的情況下,Proxy 服務能帶來的好處愈來愈少了」,當下想不出來為什麼。

查了一下資料恍然大悟。HTTPS 主要目的就是希望所有的網路資料傳輸不會被中間人 (MITM) 竊聽,當然這個和 proxy 的目的剛好互斥,proxy 的行為就是做中間人並協助將常用檔案儲存起來讓你下次使用時可以快速取得。所以走 HTTPS 的話資料是不會進 proxy 做快取的。

ref:

2018/09/12

三思,而後行

今天在「快樂、喜洋洋:高雄精神科診所」看到一篇文章「成人要如何診斷亞斯伯格症?」,裡面有提到幾句話,我覺得很重要:
....
請不要直接衝到精神科門診,跟醫師說我要診斷亞斯伯格症。就算簡單的看診後,醫師說你是或不是,這樣的診斷意義不大
....
廣泛閱讀,誠心誠意地跟你的伴侶、好友討論自己的亞斯特質(當然他們也得有些概念、也得多看點書),拋開成見地省思你的一生,找出自己的優點,但也要面對自己與其他人之間曾經發生的誤解。如此,你才能確定,亞斯特質是不是對你的人生帶來巨大的影響


年初得了流行性感冒,因為病症不明確所以需要卻診來對症下藥。當時透過關係得知高雄醫學大學附設醫院 (簡稱「高醫」) 有提供流感快速篩檢服務,因此至急診室掛號。記得當時的對話大致上是這樣子的:

「目前有針對流感的用藥,目前政府有提供『克流感』藥錠,要不要直接拿回去吃?」
「是否等快篩結果確定以後在決定是否要服藥?」
「我們有提供快篩服務,但正確率大約 60%。如果檢查結果為陰性,你確定就不吃藥繼續下去?」
「....」
「不如你之接拿克流感回去吃吧」

以上可以看出我:
  • 不了解流感服藥的差別
  • 不曉得流感快篩的用途
  • 還沒決定確診後要進行治療

以上是一個錯誤的示範,造成了醫療資源的浪費 (醫生的診療時間)。

避免浪費時間、資源 (不管是醫療資源,或是其他資源),同樣的方法也可以用在不同的情境底下。

「聽說你要換工作喔?」
「對啊,住台北的生活費太高了,有機會不如住家裡」
「你之前有提加薪嗎?」
「沒耶」
「那如果薪水多一倍,你會留下來嗎?」
「不會」
「為什麼?」
「就 .....」
「其實你在意的根本不是薪水嘛 ....」



總之,以後遇到問題時,要想想:
  • 目前遇到的問題,對我到底造成了什麼影響?是否一定需要解決?
  • 如何解決這個問題?
  • 解決問題消耗的資源是否比目前面對問題消耗掉的資源還要多?
  • 解決當下的問題後,是否會產生其他問題?
  • 在思考以上問題的時候,自己的意識是清醒的 XD

2018/09/11

Git 2.19 released

Git 2.19 釋出

新功能大致如下:

  • git range-diff
  • git grep 功能加強
  • branch 排序方式
  • 目錄重新命名偵測
  • .... 其他
詳細內容請參考:Highlights from Git 2.19

2018/09/10

該死的 Windows (抱怨文)

週五晚間收到網站離線的 alert,以為只是網路滿載暫時性的離線,沒注意到機器一直沒有回來。

剛剛要使用時才發現機器到現在還是異常,無法遠端,所有原本自己留的後門 (由外到內的管理通道) 全部陣亡,算是超大條的問題。

回到家直接操作實體機器,花了一段時間檢查以後,才發現 Wiindows 網路卡設定 (device) 被幹掉重新建立,所有設定都跑掉了。我完全沒印象假日二天有 Windows 警告硬體驅動程式錯誤、重新掃描的訊息,只有看到「Windows」需要重新啟動的視窗。

總之 .... 很不爽 ....

2018/09/04

植栽土壤介質筆記

由於前陣子石蓮往生了,目前正在進行敗部復活戰,開始查資料並做筆記。

當作介質的土壤會影響不同植栽的根部發展:

  • 砂石類型:排水性佳,不容易讓根部因無法換氣而腐爛,較適合多肉植物、耐旱植物。但也有朋友說砂石類型的介質,很難讓植物根部抓穩固定,遇到極端的天氣可能會有問題。
  • 泥碳土:保水性較佳,顆粒細小也使透氣較差。
  • 椰殼纖維:排水性、和保水性與前二者較平均。
通常可以依照植栽的特性來按比例調配適合的土壤來種植。

Reference:
備註:蘆薈應該是我遇過生存能力最強的植物了,沒有土壤直接放在塑膠袋丟在角落,過了一年都還好好的。
如果這次連蘆薈都種失敗,我就乖乖回去寫程式 ....

防止搜尋引擎顯示敏感資訊

Google 搜尋引擎提供了強大的功能,讓使用者可以快速的找到需要的資料。所有事物都有雙面刃的特性,也因此有人使用他來做惡意行為,像是搜尋個人隱私資訊、帳號密碼、網站架構、特定檔案等。

圖一:透過關鍵字和「filetype」搜尋到的聯絡人資訊




圖二:Google 也可找到一些可下載的檔案


早在 10 年前,我就使用這些搜尋技巧在網路上搜尋可用的電子書以及其他資料,只是已意外的到現在還有這麼多網站有安全問題。



透過 robots.txt 告知搜尋引擎不要建立索引


搜尋引擎除了造訪各個網頁,並儲存網頁內容以外,會先參考網站根目錄的「robots.txt」檔案,此檔案主要目的是告訴搜尋引擎哪一些路徑不應該被建立索引、不該被搜尋:

通常會設定為:
User-agent: *
Allow: /
Disallow: /upload/
Disallow: /download/
Disallow: /file/

但要注意:並不是所有搜尋引擎都會按照你預期的方式處理。

同樣的,由於雙面刃的特性,當惡意使用者發現 robots.txt 中有「Disallow」的項目,就可以猜得到這些目錄有敏感資料,進而特別去分析這些目錄的用途。


目錄加上 HTTP basic auth


這個作法很簡單,搜尋引擎造訪網頁時沒有帳號、密碼,無法讀取資料,也就沒辦法對網頁內容建立索引供使用者搜尋。



透過防火牆阻擋擋搜尋引擎


若有注意的話,你可以在 HTTP server log 中看到 user agent 的資訊,例如:
 .... Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

順著 user agent 的提示,你應該會發現多數的搜尋引擎 bot 都會有關鍵字,且有些搜尋引擎服務甚至會告知 bot 所使用的 IP。透過這些設定,設定防火牆或其存取規則,來阻擋搜尋引擎讀取特定網頁。

ps. 十多年前,百度的 bot 會在一秒內同時送出數十個 HTTP request 來檢索網頁,導致機器被DoS。後來不爽把所有中國網段全部用防火牆給擋了 ... Orz

2018/08/31

電腦字型的授權範圍

近日有 YouTuber 被告知不可隨意使用特定字型,否則會發法律上的問題。

看到法操 FOLLAW 整理了與電腦字型有關的法律規範出來,做個筆記。

以下節錄自「用新細明體和標楷體做影片字幕一定會構成侵害嗎?」:
我國著作權法在民國81年修正前,當時規範著作物類型的第3條並未將字型納入著作權的保障範圍。但隨著字型的議題受到重視,在民國81年修正著作權法時,將著作物類型移列第5條,並由行政機關針對各個類型的範圍另以命令規定。

因此,行政機關依據上述條文的授權,訂立並公告了《著作權法第五條第一項各款著作內容例示》,來明確說明第5條各著作物的詳細內容。而在該例示中,行政機關順應當時的需求,將「字型繪畫」納入了「美術著作」的範圍。


個人認為,目前法律好像還沒跟上資訊發展的速度,因此有一些模糊地帶、也可能造成一些糾紛。

已有其他網友整理出目前常用字型的使用法律授權:YouTuber 合法使用中文字型的管道有哪些?。有需要時可供參考。


Reference

2018/08/29

PHP SplPriorityQueue .... WTF!

我還以為 PHP SPL 的類別應該實作上應該有比較嚴謹,但 ... 我錯了 QQ

先來看一下 SplPriorityQueue 的官方文件定義:
public void insert ( mixed $value , mixed $priority )
priority 和我預期的不一樣,原本以為只能放數字 (numbers) 但這邊的 priority type hint 卻標示為「mixed」,表示 priority 可以是任何資料型態 ...?


先從最一般的 case 來測試吧:
$q = new SplPriorityQueue();

$q->insert(1, 'A');
$q->insert(2, 'B');
$q->insert(3, 'C');
$q->insert(4, 'D');
$q->insert(5, 'E');

while ($q->count() > 0) {
    echo $q->extract() . PHP_EOL;
}

output:
5
4
3
2
1

看起來會用 ASCII 數值來比較,數值大的優先 dequeue。看起來沒問題。



再來看一下遇到相同 priority 中有多個數值時,到底會發生什麼事:
$q = new SplPriorityQueue();

$q->insert(1, 1);
$q->insert(2, 1);
$q->insert(3, 1);
$q->insert(4, 1);
$q->insert(5, 1);

while ($q->count() > 0) {
    echo $q->extract() . PHP_EOL;
}

output:
1
5
4
3
2

「5, 4, 3, 2」還算正常,但是為什麼「1」會突然跑到最前面!?



最後,priority 真的可以放其他資料型態嗎?為了更清楚的看到執行結果,我這邊改使用 psysh 來操作:
Psy Shell v0.8.18 (PHP 7.1.18 — cli) by Justin Hileman
Unable to check for updates
>>> $q = new SplPriorityQueue();
=> SplPriorityQueue {#201
     heap: [],
   }
>>> $q->insert(1, [1, 2, 3]);
=> true
>>> $q->insert(2, []);
=> true
>>> $q->insert(3, new Exception())
=> true
靠北啊,Exception 也可以當作 priority 使用 ....

>>> while ($q->count() > 0) {
... echo $q->extract() . PHP_EOL;
... }
3
1
2
.... 我不想講了。

總之,若你要使用 SplPriorityQueue,請注意 undefined behavior。


Reference:

2018/08/27

type (in Bash) 來判別 shell 實際執行的命令

Linux 的 shell 提供了很多彈性,讓使用者可以客製化自己的工作環境。但也因此有時候把環境搞亂了自己也沒發現。

例如說:
johnroyer@box:~$ phpunit --version
PHPUnit 7.3.2 by Sebastian Bergmann and contributors.

johnroyer@box:~$ cd devel/laravel/
johnroyer@box:~/devel/laravel$ phpunit --version
PHPUnit 6.5.12 by Sebastian Bergmann and contributors.

這個時候雖然可以使用 which 來找出實際上執行的指令是哪一個 binary,但有時不一定與執行的是同一個。例如,上面的環境中,執行 which 都會有相同的結果:
$ which phpunit
/home/johnroyer/.config/composer/vendor/bin/phpunit

如果使用 type (Bash built-in) 來檢查的話,則會更清楚的告訴你,指令會如何執行,例如:
$ type phpunit
phpunit is a function
phpunit () 
{ 
    REPO_PHPUNIT=`pwd`"/vendor/bin/phpunit";
    if [ -e $REPO_PHPUNIT ]; then
        $REPO_PHPUNIT $*;
    else
        /home/johnroyer/.config/composer/vendor/bin/phpunit $*;
    fi
}

which 是由 $PATH 環境變數中的路徑來找出對應的執行擋路徑;type 則是由 Bash 當下的環境去檢查當下到底會如何執行。

2018/08/09

氣喘藥可能會使心跳加速

昨天氣喘發作,緊急下使用了備勞喘 (Berotec) 吸劑,沒想到引發了一連串的不適。

氣喘藥的其中一個藥理作用,是讓支氣管附近的肌肉收緊,讓支氣管擴張來緩解不適。而這類的藥物會使交感神經緊繃,也連帶著讓身體出現緊張常見的生理現象,如手抖、心跳加速等。

如果因為氣喘經常發作,會需要使用 泛得林 (Ventolin)、備勞喘 (Berotec) 等藥物,且會引發身體不適時,建議先去醫院問診。緊急用藥的副作用可能較治療型藥物的副作用大,若有妥善的療程,除了可以降低氣喘發作的機率,也可以減少用藥造成的身體不適。


參考資料:

2018/08/07

讓 dehydrated 遇到錯誤仍繼續執行

發現手上一個 domain 的 HTTP cert 過期沒被更新到,但 dehydrated 理應會自動檢查到過期的憑證才對:
/etc/nginx/cert/dehydrated -c > /dev/null 2>&1; service nginx reload

手動執行 dehydrated 以後,發現有個 domain 已經被我刪除,而 dehydrated 遇到這個錯誤以後就會中斷執行,也因此後面幾個 domain 都沒有被檢查。

翻了文件,加上「--keep-going」參數,即可讓 dehydrated 遇到錯誤繼續往下走。

2018/08/06

千萬不要得罪廚師

餐廳老闆問我吃不吃蝦,覺得懶就說:我不吃超過四隻腳的東西。

隔天,老闆買了 ....... 田雞!



田雞其實還不算太恐怖,個人吃過心理壓力最大的是烤小鳥,還是連頭都在的烤小鳥。要吃鳥頭的時候心裡真的很毛。

2018/07/31

為 Blogger 自訂網域加上 HTTPS

拖了很久沒整理資料,由於 Chrome 68 版之後,都會將使用 HTTP 協定的網站標示為不安全,所以大家還是記得更新一下手上 web server 的設定吧。

Blogger 之前使用「自訂網址」功能時,並不支援 HTTPS,現在工程團隊已找到解決方法,按照下面步驟就可以將 Blogger 上的網站加上 HTTPS 憑證。


先進入 Blogger 後台管理頁面,點選左方選項:「設定」=>「基本」。



接下來找到關鍵字「HTTPS」:



將「HTTPS 可用性」改為「是」。儲存後 Blogger 便會幫你的網誌建立 HTTPS 憑證,之後網站連結就可以使用「https://」開頭了。

如果你有注意到的話,其實 Blogger 是使用 Let's Encrypt 幫你的網站加上 HTTPS 憑證的:



注意事項:

  • 建立 HTTPS 憑證大概會需要 15 分鐘左右,這段期間網站透過 HTTPS 可能無法正常開啟
  • 將「HTTPS 重新導向」改為「是」以後,所有使用 HTTP 連線的使用者,會自動被轉去使用 HTTPS
  • 改用 HTTPS 以後,網頁內容中使用到的圖片連結,也盡可能使用 HTTPS 的 URL (請見備註)

備註:改用 HTTPS 以後,網頁中使用到的圖片 URL 若還是為 HTTP 開頭,Blogger 會自動跳出警告訊息,如下。


自己目前的解法,是把所有圖片丟到 AWS s3 上,再透過 CloadFront 來使用 HTTPS 傳輸 s3 上面的圖片。這段手續有點麻煩,另外找時間整理一篇 SOP。

2018/07/30

PHP array_keys() 會自動轉換資料型態

給定一個 array:
$list = [
    '200' => 'OK',
    '404' => 'not found',
    '500' => 'internal server error',
];

使用 array_keys() 取得 keys 以後,key 的資料型態若可以被轉為 int 則會被自動轉換:
$keys = array_keys($list);

// array(3) {
//   [0]=>
//   int(200)
//   [1]=>
//   int(404)
//   [2]=>
//   int(500)
// }

文件中可以看到,透過第三個參數「$strict」可以要求保留原始資料型態,但無法避開第二個參數「$search_value」。所以第三個參數基本上是放好看的 (WTF)

如果要處理的資料是比較敏感的,建議在 key 前面加個 prefix,或是取得 keys 以後再手動轉換資料型態。

2018/06/19

WD 紅標 硬碟壞軌

手上一個 24H online 的 WD 紅標 NAS 專用硬碟壞軌,好家在當初有組 RAID 1,下班後馬上抽了一個 offline 的硬碟回替換。

讓我笑不得的是壞掉的硬碟,保固在二天前過期,有陰謀的感覺 XD

查了一下之前的記錄,當初購買同一批的硬碟,另一個硬碟在去年就掛了 (保固期內)。現在感覺比較能穩定運作的廠牌好像只剩下 HGST,但聽說這個牌子準備要收掉納入 WD 牌下,以後真的不知道要挑哪個廠牌的硬碟了。

備註,硬碟型號:

  • WD40EFRX
  • NASware 3.0

2018/06/14

PHP 的 Memcache 與 Memcached 函式庫無法共用資料

剛接觸的應該會被命名搞的一頭誤水,畢竟名字相同、不然就是幾乎相同 XD

負責提供記憶體讀寫快取的服務叫做 Memcached,這個服務和 PHP 八竿子打不著關係,就算你不是寫 PHP 也這樣可以使用他。

再來要說的是 PHP 底下的二個函式庫:MemcacheMemcached。這二個函式庫,主要是提供一個方法讓 PHP 連接前面提到的 Memcached 讀寫資料。另外要注意的是 Memcache 和 Memcached 函式庫雖然名字很接近,但卻是二個完全不同的函式庫,無法同時使用,只能二選一。

以下透過 psysh 實際操作,來看一下同時使用會發什麼事情。

使用 Memcache 寫入一筆資料:
>>> $m = new Memcache
=> Memcache {#201}
>>> $m->connect('localhost')
=> true
>>> $m->set('test', ['Hello', 'World'])
=> true
>>> $m->get('test')
=> [
     "Hello",
     "World",
   ]

再來使用 Memcahed 函式庫,連到 localhost 的 Memcached server 看看會發生什麼事:
>>> $d = new Memcached
=> Memcached {#198}
>>> $d->addServer('localhost', 11211)
=> true
>>> $d->getAllKeys()
=> [
     "test",
   ]
>>> $d->get('test')
=> 0

可以看出這二個函式庫提供的 methods 看起來很接近,但是底層處理資料的方式不一樣,只能挑其中一個來使用。

2018/06/05

想逃離 Github 嗎?歡迎搬家到 Bitbucket

微軟買下 Github 之際,大家紛紛逃竄到 Gitlab 上,但是大家好像都忘記還有個不錯的服務叫做 Bitbucket



我個人會繼續留在 Github 的原因:

  • 多數開放程式碼、開發平台、CI/CD 服務,短期內不可能轉移到其他程式碼代管平台上
  • 微軟進幾年的作風已經大改,像是 VS code 都開放原始碼、支援 3rd-party plugin,並且支援跨平台。
  • .NET 也支援 Linux 了,雖然我想這有微軟的商業考量,對 Linux 使用者沒有壞處,因為若有更多工程師建立 Linux 專案,表示 Linux 使用者有更多可以選擇的解決方案 (即已要付費)。
  • 微軟知道自己以前的聲譽不好,現在不會笨到對 Github 毛手毛腳。就算有,Github 社群的壓力也會逼微軟放棄。
  • Gitlab 是一個不錯的服務,但是我不認為他有支撐大量負載的能力。當大家都把 open source project 搬過去時,可能會因為負載過高而發生問題。另外還有朋友提醒,Gitlab 之前把自己的 DB 砍掉,還有 live rescue
  • 個人蠻期待後續微軟會推出的整合服務

2018/06/04

61 號快速道路 (西濱公路) 路況

最後更新日期:2018/06/04

數天前從新竹到台中一趟,走 61 號快速道路 (西濱公路) 發現不少路段都接通了,但看起來還沒有施工完成,簡單做個筆記。

我只有機車,以下提及的路段均為機車車道,汽車專用的高架道路。

新竹到苗栗通宵這段的路,基本上可以順順騎,也不需要繞道。

但南下到了苗栗通霄這邊要繞道,改走台 1 線,或是先轉到通霄鎮市區道路,過了南勢溪以後在接回 61 號快速道路。

過了通霄鎮以後路也差不多都接起來了,但路線標示牌尚未全部裝好。有部分交流道沒有警告標示,沒注意的話可能機車就會直接騎上汽車專用道。已知機車在 61 號快速道路只有遇到要過河時,才會有高架道路可以走,其他的應該都是接到汽車專用道的交流道。

總之,遇到不明的路段,還是減速慢行比較安全。


2018/05/31

由網頁觸發、執行 PHPUnit

通常都是在 console 底下執行 PHPUnit 跑測試:
$ phpunit Test.php 
... Run by vendor/bin/phpunit ...
PHPUnit 7.1.5 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 30 ms, Memory: 4.00MB

OK (1 test, 1 assertion)

但若開發環境無法使用 console 的話,只能靠寫 PHP script 來 require PHPUnit library 來執行。在這邊發現其實 PHPUnit 有保留 interface 讓使用者可以不透過 console 來操作 PHPUnit,可以在 PHP script 裡面 require library 來使用。

先使用 composer 把 library 拉下來:
composer require 'phpunit/phpunit'

在 PHPUnut/TextUI 底下,有實作幾個 controller 來模擬 console 的操作。以下使用 Command 來執行 PHPUnit:
<?php

require __DIR__ . '/vendor/autoload.php';

use PHPUnit\TextUI\Command;

$cmd = new Command();

$cmd->run([
    'phpunit',  // 1st arg
    'Test.php', // 2nd arg
]);

如果執行上面這段 PHP script,會得到與在 console 執行 PHPUnit 一樣的結果。
不過要注意的是測試結果會直接輸出到 std out,若另外處理的話,記得用 output buffer 把資料拉回來,直接在瀏覽器看的話會破版。

備註:PHPUnit 不同版本的路徑不同,類別名稱也會不同。

2018/05/26

ZenPad 3 8.0 (8 吋) 使用心得

個人的手機一向偏好體積小、待機時間長的款式,主要是接電話、連或事情、收訊息 (instant messaging),好處是攜帶方便、外出不用帶行動電源。但這樣的硬體限制會造成看影片、看小說漫畫不方便,特別是目前大多的電子雜誌,並沒有特別設計給行動裝置使用,僅將頁面掃描成圖片直接出版給行動裝置,字體是不會隨著行動裝置大小不同而自行調整。因此決定買個平板用於一般休閒娛樂。

目前主流平板的大小好像在 10 吋,但這其實和小筆電沒什麼差別,特別是要拿著眨邊框平板時手指只能拿邊角,力矩產生的重量感不輸於小筆電,所以我最後挑了 ASUS ZenPad 3 8.0 的 8 吋平板。

我想開箱文在網路上已經不少了,我就不放照片,直接針對硬體、軟體列出優缺點供大家參考。

2018/05/24

PHP 7.1 的 Symmetric Array Destructuring

PHP 7.1 對 list() 語法做了一些調整,讓 list() 操作使用起來更簡便。

原本的 list() 語法:
list($a, $b) = [1, 2];
// $a = 1, $b = 2

在 7.1 以後可以使用陣列來表示:
[$a, $b] = [1, 2];

這個語法稱為 Symmetric Array Destructuring

有了這個 feature 以後,不用另外宣告暫存變數也可以對調變數 (swap):
[$b, $a] = [$a, $b];

2018/05/14

機車換輪胎

換機油時發現後輪有一部份已經磨平了,順便把輪胎換掉。這個輪胎總共騎了 7000 km (0 - 7000)。

和技師聊了一下,做個筆記:
  • 因為機車整體重量偏後,所以後輪磨的比前輪快
  • Yamaha 大概是日本設計師龜毛,所有規格抓的很剛好,所以零件 OOXX 難拆 XD
  • 有些人會把避震改高,但很容易因為位置移動,造成線材損壞 (反而比較危險)
  • 後鼓煞不是看煞車皮是否磨平,而是和用來調鬆緊的旋扭是否已經轉到底 (煞車線拉到最緊還煞不住就是開換了)

今天比較可惜的是沒有看到把輪胎裝到輪框的機器是怎麼運作,其他想問的問題都問好問滿。

技師這次推薦的是 Kenda 的晴雨胎,一是橡膠基部比較厚實,即使爆胎後還是一個人慢慢的騎到維修站;二是胎紋較深、雨天比較不怕打滑。



聽說另一個比較特別的是該款輪胎在轉彎時會比較「有感覺」,過幾天應該就知道是什麼感覺了 XD


2018/05/08

7zip 被發現安全漏洞,請進速更新至 18.05

CIS 原文:
Successful exploitation of this vulnerability could allow for arbitrary code execution. Depending on the privileges associated with the user, an attacker could then install programs; view, change, or delete data; or create new accounts with full user rights. Users whose accounts are configured to have fewer user rights on the system could be less impacted than those who operate with administrative user rights.
7zip 的漏洞可讓惡意使用者控制電腦,所有 18.05 以下的版本均受到影響。

請進訴將電腦中的 7zip 更新至最新版本

2018/05/07

PHP array 新增 element 的方法和效率

新增 element 到 PHP array 的寫法有二種,一種是用 array_push(),一種是使用 $list[] 直接新增。

跑個迴圈塞一千萬筆資料進 array,看看哪一種寫法的速度比較快。

這個是 array_push() 的:
$list = [];

$start = microtime(true);

for ($a = 0; $a < 10000000; $a++ ) {
    array_push($list, 1);
}

$end = microtime(true);

var_dump($end - $start);  // double(7.2292509078979)


同上,若將語法換掉的話:
$list = [];

$start = microtime(true);

for ($a = 0; $a < 10000000; $a++ ) {
    $list[] = 1;
}

$end = microtime(true);

var_dump($end - $start);  // double(2.0703480243683)


小量資料的話,其實二種作法在速度上不會差很多,但資料量變大時,速度差異就會變得很明顯。

2018/05/01

Gandi 的 .tw 網域資訊被隱藏

忘記從哪邊看到的,Gandi 欲呼因為歐盟的隱私法規範,目前 .tw 網域的 whois 資訊全部被拿掉了:
$ whois zeroplex.tw
Domain Name: zeroplex.tw
   Domain Status: clientTransferProhibited
   Registrant:
      
        
      
      
        
      , 
      

   Administrative Contact:
        
      
      

   Technical Contact:
        
      
      

   Record expires on 2019-11-03 (YYYY-MM-DD)
   Record created on 2013-11-03 (YYYY-MM-DD)

   Domain servers in listed order:
      ns1.cloudns.net      
      ns2.cloudns.net      
      ns3.cloudns.net      
      ns4.cloudns.net      

Registration Service Provider: GANDI SAS

想要買 .tw 網域的人趕快衝啊,連擁有者的聯絡方式都被拔掉了 XDDD

2018/04/29

Blogger (終於) 支援自訂網址使用 HTTPS

或許這個消息有點 lag,但 Blogger 終於讓自訂網址的使用者可以使用 HTTPS 了。

到管理頁面中點選「設定」=>「基本」,就可以看到 HTTPS 啟用選項:



啟用以後,網站大概會中斷約 10 ~ 20 分鐘,恢復正常以後就會發現可以使用 HTTPS 連線了。


可能有人好奇 HTTPS 憑證到底怎麼生出來的?可以透過瀏覽器的開發人員工具看一下憑證內容:


其實是 Blogger 自己跑去向 Let's Encrypt 跑認證流程申請的  XD


在 Blogger 開始使用 HTTPS 以後,若編輯器發現網頁中的連結、圖片仍有使用 HTTP (無加密) 協定時會發出警告,我這邊是把 AWS s3 的圖床中間再多加一層 Cloudfront 走 HTTPS,目前看起來費用沒有增加多少 (敝站也沒多少流量就是了)。

再找時間把 Cloudfront 的設定方式整理出來,比想像中的簡單。

2018/03/14

Let's Encrypt 開始支援 wildcard certification

在 Let's Encrypt 的 Tiwtter 看到「ACME v2 and Wildcard Certificate Support is Live」,已經開放大家申請 wildcard 的憑證:
We’re pleased to announce that ACMEv2 and wildcard certificate support is live! With today’s new features we’re continuing to break down barriers for HTTPS adoption across the Web by making it even easier for every website to get and manage certificates.

另外自己在更新 certification 的 dehydrated 已經開始支援,先來看一下怎麼玩,如果要用的話就來裝 gslin 打包的 PPA

2018/03/09

PHP 中 「...」(three dots) 也可以用在 argument provider

看了 PHPUnit 的 source code,發現有個很有趣的寫法
function assertSame($expected, $actual, string $message = ''): void
{
    Assert::assertSame(...\func_get_args());
}

最初以為「...」只能用在定義 variable-length function argument/param,重新看了文件才發現之前文件沒有看完,也可以拿來把陣列分別當作 argument/param 傳入:
function add($a, $b) {
    return $a + $b;
}

add(...[1, 2]);  // $a = 1, $b = 2

// or ...

$args = [1, 2];
add(...$args);

2018/03/08

PHPUnit 中「backupGlobals」的作用

複習 PHPUnit 順手寫了小程式做實驗。

PHPUnit 為了讓各個不同的 test case 不會因為 super globals 變數而互相影響,設計了 「backupGlobals」這個功能。先來看範例程式:
class MyTest extends TestCase
{
    public function testOne()
    {
        $GLOBALS['test'] = 123;

        $this->assertArrayHasKey('test', $GLOBALS);
    }

    public function testTwo()
    {
        $this->assertArrayHasKey('test', $GLOBALS);
    }
}

範例中 testOne() 修改了 $GLOBALS 變數的內容,如果在不使用「backupGlobals」的情況下,在 testTwo() 中的 $GLOBALS 也會保留 testOne() 修改過的內容,使 testTow() 抓得到「test」這個 key:
$ phpunit MyTest.php 
PHPUnit 7.0.2 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 40 ms, Memory: 4.00MB

OK (2 tests, 2 assertions)

也就表示 testOne() 影響到了 testTwo() 的測試結果,這在測試時是不樂見的,各個測試應該有獨立的測試環境,不應該互相影響。

使用「backupGlobals」功能,PHPUnit 會在 test case 執行之前,使用 serialize() 對 super globals 做備份,並在測試結束以後 unserialize() 復原,所以 testOne() 中做的修改就不會影響到 testTwo() 了:
$ phpunit --globals-backup MyTest.php 
PHPUnit 7.0.2 by Sebastian Bergmann and contributors.

.F                                                                  2 / 2 (100%)

Time: 52 ms, Memory: 4.00MB

There was 1 failure:

1) MyTest::testTwo
Failed asserting that an array has the key 'test'.

/home/johnroyer/tmp/MyTest.php:16

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

重點來了,因為是使用 serialize() 和 unserialize(),所以只能針對 primitive type 進行備份和還原,如果使用了 object 或是 singleton 時,「backupGlobals」就派不上用場了。這個時候要使用殺手鐧「runTestsInSeparateProcesses」:
/**
 * @runTestsInSeparateProcesses
 */
class MyTest extends TestCase
{
    ....
}

使用這個 annotation 會讓 PHPUnit 為每個 test case 分別 fork 出新的 proccess 進行測試,因此不同 test case 就可以在完全獨立的環境下執行不受影響:
$ phpunit MyTest.php 
PHPUnit 7.0.2 by Sebastian Bergmann and contributors.

.F                                                                  2 / 2 (100%)

Time: 303 ms, Memory: 4.00MB

There was 1 failure:

1) MyTest::testTwo
Failed asserting that an array has the key 'test'.

/home/johnroyer/tmp/MyTest.php:19

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

但使用這個殺手鐧也是要付出一點代價:時間。最前二次執行 PHPUnit 時,跑完二個 test case 只花費了 50ms 左右,而開 proccess 來進行測試則花了 300ms。

2018/03/02

PHP 7.x 與 HHVM 的效能比較

前幾天看到國外有人使用 PHP 7.x 和 HHVM 做了效能測試「The Definitive PHP 5.6, 7.0, 7.1, 7.2 & HHVM Benchmarks (2018)」,可以從比較上看到 PHP 7 以後速度有大幅的躍進,到了 7.1 與 7.2 已經和 HHVM 不相上下了。

新版的 Druple 還不支援 PHP 7.2,但 7.1 的效能也很接近 HHVM 了


目前用過跑起來最慢的 project 應該是 GalleryDruple (古早的版本),由上圖可以看到 PHP 7.x 幾乎快了 5.x 一倍,另外在 7.1 的效能也逼近 HHVM 了。

相較於 HHVM 在佈署之前還要經過編譯步驟,我想應該很多人會回來使用 PHP 7.x 吧。

2018/02/22

docker aufs 把 inode 吃光的問題

前幾天在做 aptitude upgrade 時,系統噴儲存空間不夠的錯誤訊息,用 df 追了一下,發現是 inode 被吃光,網路上找了一下統計 inode 使用量的 script 來掃整個分割區:
find / -type d -print0 | xargs -0 -n1 count_files | sort -n

...
1794 ./var/lib/docker/aufs/diff/04d42c6fb6b72464ab397cc0cd67d8600f7bc0964ff7c9bb54392ec3eb53a13e/home/git/gitlab/app/assets/images/emoji
1794 ./var/lib/docker/aufs/diff/04d42c6fb6b72464ab397cc0cd67d8600f7bc0964ff7c9bb54392ec3eb53a13e/home/git/gitlab/public/assets/emoji
1794 ./var/lib/docker/aufs/diff/04d42c6fb6b72464ab397cc0cd67d8600f7bc0964ff7c9bb54392ec3eb53a13e/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/gemojione-3.0.1/assets/png
1794 ./var/lib/docker/aufs/diff/04d42c6fb6b72464ab397cc0cd67d8600f7bc0964ff7c9bb54392ec3eb53a13e/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/gemojione-3.0.1/assets/svg
1794 ./var/lib/docker/aufs/diff/bb44ab5db5ec7f5e3fe0bde806002e887cf11cf9aa598ce0453083f80fc10ff9/home/git/gitlab/app/assets/images/emoji
1794 ./var/lib/docker/aufs/diff/bb44ab5db5ec7f5e3fe0bde806002e887cf11cf9aa598ce0453083f80fc10ff9/home/git/gitlab/public/assets/emoji
1794 ./var/lib/docker/aufs/diff/bb44ab5db5ec7f5e3fe0bde806002e887cf11cf9aa598ce0453083f80fc10ff9/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/gemojione-3.0.1/assets/png
1794 ./var/lib/docker/aufs/diff/bb44ab5db5ec7f5e3fe0bde806002e887cf11cf9aa598ce0453083f80fc10ff9/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/gemojione-3.0.1/assets/svg
1794 ./var/lib/docker/aufs/diff/fcfbf2f22b171407b0a9d657131c0c4b55aadd50c49a26abfc40cd404ab02298/home/git/gitlab/app/assets/images/emoji
1794 ./var/lib/docker/aufs/diff/fcfbf2f22b171407b0a9d657131c0c4b55aadd50c49a26abfc40cd404ab02298/home/git/gitlab/public/assets/emoji
1794 ./var/lib/docker/aufs/diff/fcfbf2f22b171407b0a9d657131c0c4b55aadd50c49a26abfc40cd404ab02298/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/gemojione-3.0.1/assets/png
1794 ./var/lib/docker/aufs/diff/fcfbf2f22b171407b0a9d657131c0c4b55aadd50c49a26abfc40cd404ab02298/home/git/gitlab/vendor/bundle/ruby/2.3.0/gems/gemojione-3.0.1/assets/svg
1966 ./var/lib/docker/aufs/diff/04d42c6fb6b72464ab397cc0cd67d8600f7bc0964ff7c9bb54392ec3eb53a13e/home/git/gitlab/public/assets
1966 ./var/lib/docker/aufs/diff/bb44ab5db5ec7f5e3fe0bde806002e887cf11cf9aa598ce0453083f80fc10ff9/home/git/gitlab/public/assets
1971 ./var/lib/docker/aufs/diff/fcfbf2f22b171407b0a9d657131c0c4b55aadd50c49a26abfc40cd404ab02298/home/git/gitlab/public/assets
2271 ./var/lib/docker/image/aufs/distribution/diffid-by-digest/sha256
2271 ./var/lib/docker/image/aufs/distribution/v2metadata-by-diffid/sha256
3291 ./var/lib/dpkg/info
4025 ./var/lib/docker/aufs/diff/fcfbf2f22b171407b0a9d657131c0c4b55aadd50c49a26abfc40cd404ab02298/home/git/gitlab/tmp/cache/assets/sprockets/v3.0
4029 ./var/lib/docker/aufs/diff/04d42c6fb6b72464ab397cc0cd67d8600f7bc0964ff7c9bb54392ec3eb53a13e/home/git/gitlab/tmp/cache/assets/sprockets/v3.0
4029 ./var/lib/docker/aufs/diff/bb44ab5db5ec7f5e3fe0bde806002e887cf11cf9aa598ce0453083f80fc10ff9/home/git/gitlab/tmp/cache/assets/sprockets/v3.0

看起來兇手是 docker,而且吃掉的量還不小。

查了一下資料,其實是自己在刪除 images 和 volumes 時有漏參數,導致有檔案沒有被清乾淨,inode 被吃光沒有回收回來。參考這篇「Docker、AUFS、inode耗尽和一个小工具」整理,可以透過以下 script 把無用的檔案清空:
docker images -qf dangling=true | xargs docker rmi

docker volume ls -qf dangling=true |xargs docker volume rm

這二個 script 跑完以後,我的 inode usage 從 99% 瞬間降到 17%,看來以後真的要小心。


其他參考資料:

2018/01/31

類流感中獎心得

好像每次放假回家都會遇到頭大的事情,以前是回家就下大雨,這次回家就中流感。

這次沒有做流感快篩,醫師說快篩的正確率大約只有 60%,由症狀來看或許會比較準確。我這次的病症有:
  • 喉嚨痛
  • 疑似全身酸痛 (因為感冒前有做運動,所以沒辦法確定是哪邊引起的酸痛)
  • 發燒
  • 有痰、咳嗽
  • 流鼻涕
由以上病症猜測是 B 型流感。

流感的傳染能力很強,所以在家做了一些措施:
  • 醒著就帶口罩,因為主要是靠飛沫傳染
  • 餐具分開、獨自用餐 (因為吃飯不能帶口罩)
  • 室內開窗通風,空間中的病毒密度會較低
  • 多喝溫水,在加上一些運動飲料
  • 吃維他命 B 和 C 補充體力
流感沒有治療方法,所以多久能康復就看個人免疫系統狀況了,希望這次不要向以前一樣拖到幾個月,會很想死 ... Orz

2018/01/26

2018 年開發人員的技能整理

Hacker News 看到一篇文章「2018 Developer Skills Report」,裡面列出一些程式設計師的特質,還蠻有趣的,這裡大概列出幾個有趣的點:

  • 有超過四分之一的人在 16 歲左右就開始接觸程式設計,但有 36% 的人在 26 歲才開始學習程式設計,而且現在是資深工程師。所以學寫程式不嫌晚、也不嫌早。
  • 幾乎左有的開發者都求知若渴,大多都學了 3 種或以上的程式語言
  • 自修的人比在學校上課的比例還稍微多了一些
  • 年輕人傾向從網路媒體取技術知識 (像是 StackOverflow、YouTube)
  • 幾乎所有人都把問題解決能力擺在最前面
  • 在工作與生活間取得平衡的方法:彈性的工時、遠端作業、注重產出而非工時 (這些台灣公司好像很少有聽過)

2018/01/18

Nginx 最大接收檔案大小

因為最近網路攻擊蠻多的,索性用 reverse proxy 把 NAS 藏在 Nginx 後面,順便讓 Nginx 處理掉 SSL 那段工作:
   location / {
      proxy_pass http://192.168.0.xxx:80;
      proxy_set_header Host $host;       
      proxy_set_header X-Real-IP $remote_addr;
      proxy_buffers 32 32k;
      proxy_buffer_size 32k;
      error_page 404  404.html;
      error_page 500 502 503 504  500.html;
   }

不過後來友人說上傳檔案一直失敗,在某個大小以上的檔案通通出錯。

觀察一下網路流量才發現 Nginx 並不是直接把流量即時 proxy 到 NAS 端,而是整個 HTTP request 完成以後才一次送到 NAS 那邊去,所以上傳檔案時自然會遇到 upload size 問題。

解決方法就是把 Nginx 的 client_max_body_size 調大:
server {
    ....

    client_max_body_size 1g;

    ....
}


Ref:

7XX Range of HTTP Status codes

7xx 系列看起來是惡搞的 HTTP status code,包含開發常見的問題和笑話:RFC for the 7XX Range of HTTP Status codes - Developer Errors

這邊看到幾個比較機車的 status code:
704 - Goto Fail
707 - Can't quit vi
724 - This line should be unreachable
725 - It works on my machine
726 - It's a feature, not a bug
730 - Fucking Bower
767 - Drunk
775 - Out of cash
789 - Not my department
799 - End of the world

2018/01/15

Silex EOL in June 2018

Symfony 團隊認為新版的 Symfony 4 的修改,已經能讓使用者有和 Silex 相同的使用者體驗,於是決定不再繼續維護 Silex

http://symfony.com/blog/the-end-of-silex

目前 Silex 將在 6 月結束維護 (EOL, End Of Life):
So, we've decided to not support Symfony 4 in Silex, or at least not add the new features added in 3.4. The current stable version of Silex is still maintained for bugs and security issues. But its end of life is set to June 2018.

2018/01/14

紫羅蘭永恆花園不負責觀後感

這次會被掉坑,除了一堆人推薦以外,也是聽說它是京都動畫大獎近期唯一的大賞獎得主,且還得到了 Netflix 的贊助,所以想看一下所謂「預算無上限」京阿尼的功力可以做到哪裡。

在 Netflix 上了第一集,注意到以下幾點:

  • 畫面很細緻,很注重光影細節
  • 畫面禎數高,不是只有主角動動嘴而已
  • 背影音樂,後面說明

前二項我不專業,交給其他人說明。但音樂製作我到是有沾到邊。

這部作品很不一樣的是背景音樂很意外的使用交響樂團做配樂,不是以前一般的小團,而是連平常較少出現的雙簧管都有的配樂,這應該花了蠻大的一筆經費在作曲和演奏上。

劇情對我來說有點沈重,但以目前的品質我想我應該會看下去。

PHP 7.2 下使用 xdebug

我目前使用的 PHP APT 是「http://ppa.launchpad.net/ondrej/php/ubuntu」,不過看起來在 PHP 7.2 還沒有 xdebug 可以使用。

如果硬要使用 aptitude 安裝,只能裝到 PHP 7.1 的版本。

所以後來用 phpbrew 在硬幹,發現不能安裝是有原因的:目前 xdebug stable 版本只支援到 PHP 7.1,若要在 PHP 7.2 使用 xdebug,只能先安裝 dev 版本

所以開發機可能考慮先降版本回到 7.1 吧。

2018/01/12

寒流來襲,讓電腦為你取暖

國外有人用 bitcoin 礦機當暖爐取暖,但其實就算你沒在挖礦也可以開電腦取暖,甚至做更有意義的事情。


BOINC 是個用來做學術研究的開放平台,只要個人願意擔任志工,便能透過個人電腦閒置的時候,借用處理器或顯示卡進行運算,協助研究。研究項目從生物、醫學、數學、自然科學、地球科學,甚至還有尋找外星人的專案,選擇一個自己有興趣的專案參與,並讓你的電腦協助專案研究。

我主要是跑醫學、藥學研究,使用到 7 core CPU 與 1 GPU,從下圖就可以看到協助研究時會用到大量的運算資源,讓整台電腦熱起來。



與開暖氣相同,參與研究專案讓電腦進行運算,需要付出額外的電費,但可以保證的是這些電費不單只讓房間變溫暖,研究成果也會讓世界變得更溫暖。

2018/01/07

2017 年部落格的 review

下雨天哪裡都不能去,只好發個廢文。

開始工作,下班後其實沒剩下多少體力和精神可以整理文章和經驗,部落格文章也相對少了很多,因此今天才有辦法幫去年整年的紀錄做個簡單的回顧。

去年 page view (PV) 最多的是「部落格的圖床」。看來大家都很想找到一個操作簡單又可以免費使用的圖床,之前試過幾個方案:
比較可惜的是 Flickr 主機在國外,且網路頻寬看起來不大,回應速度實在有夠慢的,賣給 Yahoo 以後越改越不好用。Imgur 若沒有註冊成會員,則圖片好像在沒有人檢閱一段時間後便會自動刪除。

最後我找到比較折衷的方法是 AWS s3。剛好本站的流量極小 (廢文沒人看 XD),再加上主要以程式碼居多,所以圖片數量也少,使用 s3 當作圖床,一年平均下來一個月大約只要台幣 3 元左右就可以跑得很順 (我使用 Tokyo 的 bucket),目前只缺一個好用的圖片上傳工具。



而 PV 第二名的是「尾寮山路況」。很明顯的大家希望能在數小時的挑戰前,確認自己的身體狀況以及路況,以免有什麼萬一。

去年年初將尾寮山攻頂的狀況,拿來當作自己身體復健的進度參考。在一次颱風後留下路況紀錄,沒想到能幫上其他人的忙,小驚訝了一下。



第三名則是「為 Gitlab 加上 CI runner」,猜測應該是操作難度較高,所以讓大家把所有可以找到的資料都抓來看了一遍,也因此該筆記點閱率較高。

個人覺得 Gitlab 真的是一個功能蠻齊全的程式碼管理、協作平台,但是因為功能齊全也導致架設的成本偏高,不是花錢解決問題就真的只能花時間了。目前仍在 9.x to 10.x migration 奮鬥,希望前輩有什麼奇淫巧計也能和大家分享。



今年有什麼計畫嗎?沒,就船到橋頭自然直。

這個站從以前的作用就是一個個人的筆記,防止自己魚腦把花了數天搞定的解決方法忘記而開始撰寫的,如果能幫助到其他人,這些筆記當然會更有價值,但當初並沒有這個構想。

若你覺得這個站對你有幫助,歡迎使用 CC-by-name 方式轉貼,也歡迎留言互相交流。謝謝。

2018/01/05

PHP 近幾年生態圈一些可惜的地方


進幾年 Laravel framework 竄紅,大家也趨之若騖,相對其他的 framework 就被冷落了,實在有點可惜。

Laravel 有其特色,但個人用了幾個版號,覺得 Laravel 比較適合中大型專案、以及快速開發,在往後維護和升級難度都不低 (5.1 migrate 到 5.4 根本是地獄)。





而如雨後春筍般冒出來的 Laravel library 很多又只能供 Laravel 使用,很難在其他 framework 上使用。Laravel 開發出來的元件耦合度也不低,很難拉出來供其他人使用 (Symfony 的各個元件都是 library,可以透過 composer require 供需要者使用)。結果讓想要使用其他 framework 的人找不到資源可以使用,少了很多選擇。

個人比較想看到的是,各種 framework 都能有社群協助一起發展,PSR 把一些好的設計制定成開發規範,大家遵守便能讓一個 library 在多個平台使用,而不是讓 Laravel 獨大,讓 PHP 的生態系變得單調、沒有選擇。

最近因公司需要而翻了近十個 framework、以及 CRM,並從中截長補短撰寫適合公司使用的 framework,希望以後有時間可以整理成公版讓其他有類似需求的人也來用看看。(本來想再愚人節發布的,似乎來不及了 TAT)

2018/01/04

PHPStan 靜態分析工具

前陣子從 gslin 那邊看到 PHPStan 這個工具,剛好手上有需要測試的程式,就拿來掃一掃。常見的問題大多都可以抓到,甚至連 doc comment 有錯誤也會抓出來。

下面弄個個 demo code 讓大家稍微看一下實際狀況。

Hello.php:
<?php
namespace Zero;

class Hello
{
    /**
     * @param array $name
     */
    public function greeting(): void
    {
        $test = '123';
        echo "Hello $name\n";
    }
}

bootstrap.php:
<?php
require __DIR__ . '/../vendor/autoload.php';

$hello = new \Zero\Hello();
$hello->greeting(123);

然後執行 PHPStan 做 level 5 的分析:
 ------ ------------------------------------------------------ 
  Line   src/Hello.php                                         
 ------ ------------------------------------------------------ 
  10     PHPDoc tag @param references unknown parameter $name  
  14     Undefined variable: $name                             
 ------ ------------------------------------------------------ 

 ------ --------------------------------------------------------------------- 
  Line   src/bootstrap.php                                                    
 ------ --------------------------------------------------------------------- 
  7      Method Zero\Hello::greeting() invoked with 1 parameter, 0 required.  
 ------ ---------------------------------------------------------------------

PHPStan 給的錯誤訊息,就可以在執行 PHP 之前預防錯誤發生。

不過有一些比較可惜的地方:

  • PHPStan 一定要吃 autoload 規則,看起來是為了要解 PHP Refelction 問題,所以比較就的程式就 GG 了
  • Hello.php 裡面有個沒使用到的變數 $test 沒有被抓到,不然應該可以再把程式清的更乾淨