Category: Programming
-
輸入一正數用星號印出正三角形
印象中是在 PTT 上看到這題目…想說自己寫 code 多年,好像沒寫過這題。覺得有趣就用 PHP 試著實作看看。 先看結果… 程式如下: 因為公司的螢幕沒特別大,最多只能顯示 43 行…. 這種小測試寫起來蠻有趣的
-
在 Python 中偵測執行環境版本
一直很想好好學 Python。不過這事已經放在心上兩年了吧 最近這陣子工作比較空閒, 才開始摸索 Python 3 的旅程。 在 setup 開始環境的時候有點好奇自己在 vscode 裡面跑 task 時是用 Mac 內建的 2.7 還是我用 Homebrew 安裝的 3.6,才有了這個題目。 一樣是來自 Stack Overflow 的解答,稍做筆記。 第一種方法如下 import platform print(platform.python_version()) 輸出的結果 3.6.3 第二種方法如下 import sys print(sys.version_info) print(sys.version_info[0]) # 輸出大版號 print(sys.version_info[1]) # 輸出次版號 print(sys.version_info[2]) # 輸出微版號 輸出的結果 sys.version_info(major=3, minor=6, micro=4, releaselevel=’final’, serial=0)
-
Laravel 4.x WhoopsDisplayer::display() must be an instance of Exception
有個用 Laravel 4.2 開發的舊專案,近來經常遇到下面這個錯誤 PHP Fatal error: Uncaught TypeError: Argument 1 passed to Illuminate\Exception\WhoopsDisplayer::display() must be an instance of Exception, instance of ParseError given 找了許多討論都提到是 Laravel 4.x 與 PHP 7 不相容的關係。但我的開發環境有 PHP 5.6 和 PHP 7,似乎前者也有機會發生,十分不解。 每當發生這個 Error 就不會看到真正的 Exception 訊息,debug 十分困擾。 Stackoverflow 上找到一個應急用的解法,可以用在開發環境上…. 在 app/config/local/app.php 的檔案開頭加兩行 set_error_handler(null); set_exception_handler(null); 暫時搞定了…
-
CentOS 7 安裝、升級 PHP 5.6
轉眼間當年幫客戶架設的 server 也好幾年了。隨著程式碼的迭代,server 也到了不得不更新的時候了。不過目標沒有很遠,只要把 PHP 5.4 升到 5.6 就可以了。 把升級的過程筆記一下 首先是更新 EPEL 庫 yum install epel-release 或 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 接著更新 Remi 庫 rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 檢查系統安裝了哪些和 PHP 相關的套件 rpm -qa | grep php 要升級的話要先移除舊套件。因為 PHP 版更,相關的 extension 都要換成相對應的版本才行。注意以下指令可能也會把 phpmyadmin 一起移除 yum remove php-* 啟用 Remi 庫,用編輯器打開以下檔案 /etc/yum.repos.d/remi.repo 找到這一段… 把 enabled 設為 1 [remi-php56] name=Les…
-
Best practice to generate random token in PHP
在 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?
最近碰到的小需求:如何將多維陣列攤平成一維陣列?…. 本來以為 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)。
-
將 Sequel Pro 的表導出成 Laravel migration 文件
在 Laravel 學院看到一篇有趣的文,筆記下。 将 Sequel Pro 中已存在的数据表导出为 Laravel 迁移文件 對於用 Mac 的開發者來說頗為實用。Sequel Pro 這款 MySQL GUI 也是我用過最好用、最順手的 DB 管理工具,沒有之一,輕巧高效,可惜支援的 DB 種類不多。
-
強制 fputcsv 所有欄位都加上雙引號
公司跟一家新廠商展開合作,其中交換電文是用 CSV 格式。但對方要求所有的欄位都要用 ” 雙引號包起來。看起來就像下圖這樣。 但是很不巧的,PHP 內建產生 CSV 的指令 fputcsv 沒有提供強制的選項。做出來的檔案如下圖。 山不轉只好路轉… 在丟進 fputcsv 前就先用雙引號包一包。 比較特別是 fputcsv 原本的 enclosure 字元預設就是雙引號,無法替換成空白,只好用 chr(0) 來跳脫,不然每一筆資料會變成 “””aaa”””,三個引號… 這樣就可以交差了。
-
Connection could not be established with host
最近重灌了工作用的筆電,把開發環境的 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 套件為例,它的…
-
How to get length of integers in PHP?
在寫 code 的時候想到這個無關緊要的問題… 如何得知一個數字有幾位數? 比較直覺的想法是這樣…. function digits($num) { return (int) strlen((string) abs($num)); } 在 stackoverflow 看到一個也不賴的寫法…. function digits($num) { return (int) log(abs($num), 10) + 1; } 筆記一下,都快忘了 log 怎麼算 XD
-
Laravel 5.0: 紀錄 SQL 指令
在同事轉貼的一些文章裡翻到這篇记录运行时SQL语句,稍微修改一下,在我的 Laravel 5.0 測試站上實作。 文章中的第一步我就傻眼了,因為我的 php artisan list 裡面沒有 make:listener….
-
Javascript: 檢查生日是否成年
接到一個開發需求,讓使用者填寫生日,然後用 Javascript 判斷是否滿二十歲。但是需要檢查到月和日… 總覺得有點懶。 Coding 發懶的時候,問 Stack Overflow 就對了…. function getAge(DOB) { var today = new Date(); var birthDate = new Date(DOB); var age = today.getFullYear() – birthDate.getFullYear(); var m = today.getMonth() – birthDate.getMonth(); if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) { age–; } return age; } 總之先修改一下,寫了一個草稿試試。結果如下:
-
Smooth Touch Scrolling in iOS with -webkit-overflow-scrolling
在開發一個兼容 iPad 的網站專案時,發現 <div style=”overflow: scroll;”> 在 iOS 下捲動很不順暢,手感很糟糕。好奇地搜尋了一下,找到一個 webkit 特有的語法:-webkit-overflow-scrolling: touch。加上這個屬性後,在 iOS Safari 上連回彈的效果都出來,手感與原生程式無異。 可惜 Android 上的 Chrome 似乎沒有作用,有點希望這屬性能成為正式語法。 範例先丟在 Codepen,不過看來要註冊才能 embed,先醬。 http://codepen.io/anon/pen/oXvjvJ
-
電子發票愛心捐贈碼轉成 HTML Select elements
不是很完美的解法,但是比手工複製貼上快多了。 下載最新的電子發票愛心碼,格式為 .pdf。 用 Google Chrome 開啟檔案,全選複製,貼到 Sublime Text。 人工處理折行的地方,整理成這樣的格式: 台灣兒童伊比力斯協會 168168 伊比力斯 搜尋 ^([^\u4e00-\u9fa5]+)\s(\d+)\s?([^\u4e00-\u9fa5]*)$ 替代 <option value=”$2″ title=”$3″>$1</option> 剩下的再手工處理一下。
-
Laravel 4 Async Queue Driver
在 Github 上找到一個有趣又實用的 Laravel 4 套件:Laravel 4 Async Queue Driver。 Laravel 4 有支援 Queue,但是對小型或是開發中的專案來說,特地去弄一套 Queue Worker 並不是很便利,但是用 Sync Mode 又很浪費時間,因為 Sync Mode 真的要等系統把排程跑完才會繼續執行之後的程式碼…. 這時候 Async Driver 就派上用場了。這組 driver 會用子執行緒的方式在背景跑 Queue,雖然是立即執行式 (fire instantly),跟 “Queue” 的理念不太一樣,但已足以應付許多需求。 ps. 圖片與本文無關
-
Bookmark: PNotify, JavaScript notifications
對 programmer 來說,Bootstrap 真的是一套非常便利前端框架,使用簡便、功能完整。但是一直覺得 Bootstrap 缺少了關於 notification 的解決方案。雖然有內建 alert 的效果,但這個 alert 是會佔據畫面空間的,我之前是透過擴充 CSS 的方式來實現 alert 浮空的效果。 最近用 Laravel + Bootstrap 的組合來修改個人網站,就順便找找有沒有現成的 notification 套件,結果不費吹灰之力就找到這個看起來功能超完整的 solution…. PNotify。 語法與設定都相當簡單,支援的效果和情境也夠豐富,就決定用它了。
-
Laravel Eloquent – Encrypt/Decrypt Data on call
在開發商業網站的時候,對資料加密是必要的手段,尤其是資料庫中關於會員隱私,或是商業機密的部份都要特別處理。 在實務上通常不會用資料庫內建的加密功能,而是用後端語言來實現 encrypt 與 decrypt,資料庫只儲存加密後的訊息。 在 Laravel 裡加解密可以透過繼承 Eloquent,用 magic function 來達成自動化。 class BaseModel extends Eloquent { protected $encrypt = []; public function setAttribute($key, $value) { if (in_array($key, $this->encrypt)) { $value = Crypt::encrypt($value); } return parent::setAttribute($key, $value); } public function getAttribute($key) { if (in_array($key, $this->encrypt)) { return Crypt::decrypt($this->attributes[$key]); } return parent::getAttribute($key); } public function attributesToArray()…
-
Output Laravel 4 View as String
覺得 Laravel 這套框架真的有很多眉眉角角的。 這回遇到的是要將 View::make() 的結果當成文字回傳,但 View::make() 回傳的內容似乎是包含 http header 的,無法直接存成純文字。 網路上找到兩種解法,都是官方文件裡沒提到的用法….. #$%^&* $html = (string) View::make(‘foo’, [‘bar’ => ‘baz’]); $html = View::make(‘foo’, [‘bar’ => ‘baz’])->render(); 兩者的差異是前者會遮蔽 Exception,而後者不會。