2017/12/11

刻印章二三事

身體狀況差,決定找點事情,讓自己待在電腦前面的時間少一點,於是想到來自己刻印章,順便磨練耐性。



先買了白牛角六分印石回來,並找到了刻印用的雕刻刀 (到美術用品社可以找到,非雕刻用筆刀),接下來用 6B 鉛筆的石磨拓印到印石上,有了輪廓就可以動刀了。

但不管我怎麼出力,印石就是不給下刀,花了八個小時連 1mm 的深度都不到,更別說一個完整的字了。後來不爽把電鑽拿出來鑽,發現連鑽頭要固定都很困難,更別提說要精確的鑽雕。

今天終於找到一間仍有在手工刻印的師傅請教,當聽到我難電鑽和白牛角印石拼命時,被揶揄了一番。原因是牛角不只是硬,還帶有韌性,所以不僅需要專用的刻印用具,還需要非常銳利。如果在遇到更硬的印石,可能會改成機械噴沙等半人工作業方式雕刻。


回歸正題,一般練習用的印石,多半為石頭,硬度較低也比較容易碎裂,但至少不需要拿電鑽拼命。這類的印石像是「巴林石」等,以前較多,但現在比較難在鎖印店找到了,可以在網路拍賣上搜尋。

2017/11/21

IBM DNS 9.9.9.9 測試

看到新聞:「IBM宣布推出免費DNS轉址服務 Quad9,只要將DNS伺服器設為9.9.9.9 即可阻擋惡意網站」,聽起來頗有趣的,所以玩了一下。



我這邊比較偏重 DNS 回應速度,自家機器在中華電信的線路上,先用 168.95.1.1 來看回應速度:
johnroyer@box:~$ ping -c 5 168.95.1.1
PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data.
64 bytes from 168.95.1.1: icmp_seq=1 ttl=247 time=11.5 ms
64 bytes from 168.95.1.1: icmp_seq=2 ttl=247 time=11.8 ms
64 bytes from 168.95.1.1: icmp_seq=3 ttl=247 time=11.9 ms
64 bytes from 168.95.1.1: icmp_seq=4 ttl=247 time=10.5 ms
64 bytes from 168.95.1.1: icmp_seq=5 ttl=247 time=10.3 ms
--- 168.95.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4008ms
rtt min/avg/max/mdev = 10.377/11.248/11.921/0.664 ms

2017/11/17

PostgreSQL 入門教材

PostgresSQL 官方文件實在缺東缺西,只好找第三方教學文件來看了:


這次會跑來看 PostgreSQL 主要是 Gitlab 對 MySQL 的支援實在有點爛,做 migration 會莫名其妙卡住,索性把 Gitlab 的資料丟到 PostgreSQL,但其他專案仍維持在 MySQL 運行。

2017/11/15

PHP 變數初始化 (?)

看到有 Java 工程師在學 PHP 遇到變數初始化的問題,覺得有趣,做個筆記順便複習 PHP 的特性。

Java 是強型別 (strong type) 的程式語言,所有的變數在使用之前都必須給資料型態以及初始值;PHP 則是弱型別,就算不給值、不給資料型態也沒差,interpreter 會在 runtime 的時候自動做型別轉換在繼續執行程式。我想 PHP 這一特性就會讓很多 Java 工程師決得很莫名其妙吧,沒定義的變數到底要怎麼用?執行的時候真的不會出事嗎? (其實就是會 XD)

先來看正常的寫法:
$x = 'hello';
var_dump($x);  // "hello"

如果變數沒有給值會發生什麼事?
var_dump($x);  // NULL

PHP 把沒有初始化的變數帶入 NULL 來使用,連錯誤訊息都沒噴耶?其實有,只是要調整一下 error reporting 的 level:
error_reporting(E_ALL);

var_dump($x);

// Notice: Undefined variable: x
// NULL

2017/11/10

函式中參數順序的設計

最近在 refactor legacy code,遇到很尷尬的函式定義,笑也不是哭也不是。

函式會要求使用者傳入多個參數,有時並不是所有的參數都必須給值,函式的設計者會以大家較常使用的方式來當作參數的預設值,例如 PHP 裡面的「json_decode()」:
json_decode($json);  // consider as json_decode($json, false)

json_decode($json, true);  // 不使用預設值才手動傳數第二個參數


但這次遇到比較尷尬的是,legacy code 把第一個參數設計為 optional,也就是有預設值。但問題來了,在 PHP 的語法當中,呼叫函式無法在前幾個參數不給值:
getData( , 'some', 'option');  // syntax error

所以不管怎麼樣,都至少要給第一個參數:
getData(null, 'some', 'option');

所以把有預設值的參數放在前面其實根本沒有省下什麼時間呀 ... XD