Author:


HoRNDIS ~ 讓 Android 在 MAC OS 上也能共用 USB 網路

Posted by – August 2, 2017

最近偶然把 iPhone 插上 Macbook 才注意到原來用 USB 連線就可以讓筆電上網... 我之前都是開 WIFI hotspot 功能上網,這方法相對耗電許多.... 😓

More

如何在 Kobo 上安装 KOReader

Posted by – April 30, 2017

入手 Kobo 電子書好幾個月了,入手前就有聽聞 KOReader 這套第三方的韌體

不過因為也不覺得原廠韌體哪裡不好用,所以一直沒進行刷機的動作。直到今天心血來潮想試一下,步驟記錄如下:

以下步驟適用於第一次安裝 KOReader 的閱讀器

第一個部分是安裝 Kobo Start Menu (KSM),最新版本為 08

說明文件與下載地址

  1. 將 Kobo 連接至 PC
  2. 複製 kbmenupngs 資料夾至 Kobo 根目錄
  3. 安全地退出 Kobo
  4. Kobo 自動進行系統更新。更新完畢後確認剛剛放進去的六張圖片都能正常顯示縮圖

之後開機應該會看到一個陽春的選單,這個便是 KSM。

如果你的 Kobo 型號是 Aura One、Aura Edition 2,或是其他韌體版辭高於 4.2.8432 的機種,要安裝這個 patch

  1. 下載附件,解壓縮得到 KoboRoot.tgz
  2. 將 KoboRoot.tgz 複製到 Kobo 的 .kobo 資料夾,注意這是一個隱藏的資料夾
  3. 安全地退出 Kobo
  4. 在 KSM 首頁選擇 "handle update" > "install update" (不要選 "install partial update")
  5. 待 Kobo 更新完成

再來是第二部分,安裝 KOReader

  1. 下載 KOReader。nightly 是開發版,stable 是穩定版,看你想裝哪個,再依裝置選擇檔案
    我目前裝的是 koreader-kobo-arm-linux-gnueabihf-v2015.11-894-gd168db9.zip
  2. 解壓縮檔案,裡面有一個資料夾和三個檔案
  3. 將 koreader 資料夾複製到 Kobo 下的 .add 資料夾,注意這是一個隱藏的資料夾
  4. 安全地退出 Kobo

這樣就完成了。

開機時在 KSM 選擇 KOReader 或是在 Kobo 原介面點選剛丟進去的圖片 switchtokoreader 也可以啟動

 

我先摸索下 KOReader 有什麼功能再繼續報告心得。

Best practice to generate random token in PHP

Posted by – January 10, 2017

在 Stackoverflow 看到一篇超級實用的文:在 PHP 中產生隨機字串的最佳實踐。

產生隨機字串這個看似不起眼的議題實作起來還挺麻煩的,曾經為了如何產生字串跟同事討論了許久。

$length = 16;
$token = bin2hex(openssl_random_pseudo_bytes($length));
# => e9bf18672b051619a3479ecbe1cb7d08

唯一的參數 $length 可以替換成任意整數,產生的字串長度就是 $length *2。

同場加映,Google Chrome 的亂數演算法也有改過

How to Flatten a Multidimensional Array in PHP?

Posted by – January 9, 2017

最近碰到的小需求:如何將多維陣列攤平成一維陣列?....

本來以為 PHP 那巨大的 Lib 會有一個神奇的 function 完成這任務,結果翻了一遍 php.net 的文件,沒有找到這神奇的功能。不過還是有另一個神妙的 function 可以拿來用,那就是 array_walk_recursive,這個 function 會有遞迴的方式走完整個 array,然後看使用者後續想幹嘛...

以攤平一維陣列為例,以下是只保留 value 的作法...

function flatten(array $array) {
  $return = array();
  array_walk_recursive($array, function($a) use (&$return) {
    $return[] = $a; 
  });
  return $return;
}

如此一來就可以將多維陣列轉為一維。若是要保留 key 與 value,要注意 key 名稱是否有重複 (isset)。

Firefox 50 Electrolysis multi-process 感想

Posted by – December 31, 2016

Firefox 在 version 48 將「Electrolysis」專案 (e10s) 多程序架構 (multi-process) 納入穩定版。我在 version 50 時才注意到有這個功能。因為我有裝較舊的 add-on,像是《新同文堂》這類久未更新,沒有支援新架構的 add-on,Firefox 會自動停用 e10s。

為了測試這功能,把所有的套件都停用了,因為原本裝的套件就只有個位數,因此沒有什麼不便。重啟一個乾淨的 Firefox 後,在網址列輸入 about:support,就可以進入 Troubleshooting Information 的頁面。

firefox troubleshooting information

在表格裡看到 Multiprocess Windows 的值大於 0 就算是有啟用了。在 Activity Monitor 裡也可以看到 Firefox 的行程變成兩個。

啟用 e10s 後差異有很大嗎?

我在 8G RAM 的 Macbook Air 上覺得差很多,原本 tab 開太多,狂吃記憶體後,覺得 Firefox 就會變得緩慢。啟用 e10s 後,開很多 tab 也不會有什麼卡頓的感覺。

決定把所有的電腦的套件都整理下,通通啟用 e10s。其他電腦的 RAM 都是 16GB,比較無感。

將 Sequel Pro 的表導出成 Laravel migration 文件

Posted by – December 23, 2016

Laravel 學院看到一篇有趣的文,筆記下。


将 Sequel Pro 中已存在的数据表导出为 Laravel 迁移文件

對於用 Mac 的開發者來說頗為實用。Sequel Pro 這款 MySQL GUI 也是我用過最好用、最順手的 DB 管理工具,沒有之一,輕巧高效,可惜支援的 DB 種類不多。

Using sftp on a non-standard port

Posted by – November 12, 2016

平常還蠻常用到 linux / mac 的 ftp, ssh 指令。今天有個 case 是要用 sftp 指令連去廠商的主機,雖然有用過這個指令,卻不知道怎麼指令 port…

一查才發現這用法跟其他指令差異還真大。

sftp -o "Port 3432" user@example.com

要用 -o 設定參數,筆記一下。

強制 fputcsv 所有欄位都加上雙引號

Posted by – August 2, 2016

公司跟一家新廠商展開合作,其中交換電文是用 CSV 格式。但對方要求所有的欄位都要用 " 雙引號包起來。看起來就像下圖這樣。

Screen Shot 2016-08-02 at 2.58.00 PM

但是很不巧的,PHP 內建產生 CSV 的指令 fputcsv 沒有提供強制的選項。做出來的檔案如下圖。

Screen Shot 2016-08-02 at 3.03.33 PM山不轉只好路轉...

在丟進 fputcsv 前就先用雙引號包一包。

<?php

function forceQuote($value) {
    return "\"$value\"";
}

$file = @fopen($file_path, "w");

foreach ($data['content'] as $line) {
    fputcsv(
        $file,                          // 輸出檔名
        array_map('forceQuote', $line), // 先包雙引號
        ',',                            // 資料用逗號分隔
        chr(0)                          // 跳脫預設的 enclosure 字元
    );
}

fclose($file);

比較特別是 fputcsv 原本的 enclosure 字元預設就是雙引號,無法替換成空白,只好用 chr(0) 來跳脫,不然每一筆資料會變成 """aaa""",三個引號…

這樣就可以交差了。

Connection could not be established with host

Posted by – July 19, 2016

最近重灌了工作用的筆電,把開發環境的 PHP 升級到 5.6.10,然後就各種狀況.....

其中一個問題是從本機連不上公司 mail server,所以寄信功能就掛掉了。Laravel log 的訊息如下

local.ERROR: 500 - Connection could not be established with host xxx.com.tw [ #0] @ /
exception 'Swift_TransportException' with message 'Connection could not be established with host xxx.com.tw [ #0]' in laravel/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php:270

原來是因為從 PHP 5.6 開始,變更了 SSL 認證的預設值,verify_peer 與 verify_peer_name 這兩項安全檢查都被改為預設,然後很多 SSL verification 就過不了。雖然提高安全性是好事,但開發環境卻造成一些困擾。

以上述的 swiftmailer 套件為例,它的 SSL 連線是用 stream_socket_client 實現的,其參數設置是透過 stream_context_create 傳入,所以設定方式如下:

$contextOptions = [
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false
    ]
];
$context = stream_context_create($contextOptions);
stream_socket_client(
    $host.':'.$port, 
    $errno, 
    $errstr, 
    $timeout, 
    STREAM_CLIENT_CONNECT, 
    $context
);

如此一來就可以關閉檢查,終於可以連上 mail server 了。收工。

How to get length of integers in PHP?

Posted by – May 25, 2016

在寫 code 的時候想到這個無關緊要的問題... 如何得知一個數字有幾位數?

比較直覺的想法是這樣....

function digits($num) {
    return (int) strlen((string) abs($num));
}

在 stackoverflow 看到一個也不賴的寫法....

function digits($num) {
    return (int) log(abs($num), 10) + 1;
}

筆記一下,都快忘了 log 怎麼算 XD