Author:


強制 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

如何觸發 Chrome 瀏覽器的 autofill 功能

Posted by – March 7, 2016

好奇在開發網頁前端時,如何觸發 Chrome 自動填表單 (Autofill, Autocomplete) 的功能,找到一些說明,先記錄在本文下方的 Reference。

改天再來實測。

更新 Let’s Encrypt 憑證

Posted by – February 19, 2016

先隨手筆記一下,幾個月前在自己的主機上安裝了 Let's Encrypt 的 SSL 憑證。他們家的憑證每隔一陣子就要 update 一次。

Let’s-Encrypt

紀錄一下更新的步驟:

$ service httpd stop # 停用原本的 http server

$ cd /xxx # 切換到 lets encrypt 所在的路徑

$ ./letsencrypt-auto certonly -t -d your.domain.com -m user@email.com --renew-by-default --agree-tos --agree-dev-preview

紅字部分請自行取代。如果有出現以下訊息,可以輸入 2

How would you like to authenticate with the Let's Encrypt CA?
-------------------------------------------------------------------------------
1: Apache Web Server - Alpha (apache)
2: Automatically use a temporary webserver (standalone)
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

跑完後記得重啟 http server,收工。

Mac OS El Capitan 10.11 開啟第三方 SSD Trim 功能

Posted by – February 19, 2016

因為幫 Mac mini 換裝了 SSD 硬碟,就會需要幫它啟動 TRIM 的設定。至於 TRIM 是什麼,可以參考這篇 OCZ SSD姿勢佳 – 什麼是TRIM指令?

disk-drive-mac-300x289

OS X 從 Yosemite 10.10.4 開始就允許使用者直接啟動 TRIM 的功能而不需要借助第三方軟體來實現,所以不必安裝軟體,在 terminal 輸入以下指令即可。

sudo trimforce enable

接著輸入管理員密碼,按兩次 y 就會開始進行系統設定。

Screen Shot 2016-02-19 at 11.56.33 PM

要注意的是系統設定完成後會自動重開機,在進行此作業前請先將其他應用都先關閉,以免悲劇。

製作 Mac OS El Capitan 10.11 開機安裝碟

Posted by – February 18, 2016

打算幫家裡那台 mac mini 升級 SSD 而需要做些前置工作,像是先做一顆 USB 安裝碟... 搜尋了一下方案,原來非常簡單啊!!

os_x_el_capitan_roundup More

Truncate all tables in Oracle database

Posted by – November 17, 2015

今天開發團隊終於決定要把開發與測試用的 Oracle 資料庫清空重建了。在長達一年多的開發時間裡,這台測試 DB 是非常重要的開發工具。但長久以來承受了各式各樣亂七八糟的資料,也難以保證測試結果是否符合預期,所以大夥決定將它清空。

不過 Oracle 自己的 GUI 管理工具 SQL Developer 真是頗為難用。
Oracle SQL Developer

想一次清空 (truncate) 是沒有全選 -> 右鍵 -> 清空 這麼方便的事。但是近百個 table 又不想一個一個清... 就下指令吧。

begin
  for t in (select table_name from user_tables)
    loop
      execute immediate ' truncate table  '||t.table_name;
    end loop;
end;

這樣完成清除資料表的任務。

How to disable phone number linking in Mobile Safari?

Posted by – November 4, 2015

同事問了這個問題,如何將 iOS webview 裡出現的電話連結移除,因為畫面中出現了不是電話的數字,卻被系統自動加上了電話連結。

有一個非常簡單的方法,在 HTML 檔案的 <head> 區段加一行宣告即可。

<meta name = "format-detection" content = "telephone=no">

這行宣告會停用所有的電話連結。若是反過想要在停用的情況下,加上例外,則可以自行宣告電話連結,語法如下:

<a href="tel:0932123456">0932123456</a>

主要就是用 tel: 關鍵字來達成。

Skype error on Windows 10 shutdown

Posted by – October 30, 2015

把主要的桌機升級到 Win10 後,自然也把一些常用的軟體裝上。其中 Skype 就是一款很不愛,但很常需要用的軟體。不過在安裝 Skype 後,每次 Win10 關機都會出現一個令人不悅的錯誤,訊息是 「The memory could not be read」。

2015-10-28 08.07.13

More