利用 Canvas 進行前端圖片壓縮

最近工作上剛好遇到一個需要調校效能的站,在過程中我們運用了許多不同的方法將整體的營運效能往上大幅度的提升,在未來幾篇文章我會討論有關如何提升前端效能的方法,雖然都有些老生常談,但是希望可以給初學者一些方向,當網站效能需要最佳化時可以想到這些方法。

許多人在實作 CMS(Content Management System)時,對於儲存文章內部的圖片時,常常很直觀的透過 JavaScript 在前端將其轉成 base64 編碼之後,與文章本文一起變成一巨大字串傳至後端後直接儲存在資料庫內,這樣的會嚴重的造成效能上的問題,首先是無法進行 lazy loading,其次是會使得 api request 封包非常巨大,需要花非常多時間下載,造成使用者等待時間較長,在這樣的狀況下,若是只能調校前端使其效能能夠提升上去,我們可以從壓縮圖片著手,將圖片壓縮之後,api request 容量減少,可以有效的提升下載效率與畫面渲染時間,提升使用者體驗。

Ruby 2.7 新發布,新功能說明

就如往常,Matz 選在聖誕節發布 Ruby 2.7 作為聖誕禮物,那麼這個新版本有什麼特別的呢?又有什麼是未來整個 Ruby 社群的方向呢?

Ruby 2.7 的新功能列表

  1. IRB 多行模式與即時文件查閱
  2. Array#intersection
  3. Enumerable#tally
  4. Enumerable#filter_map
  5. Enumerable#produce
  6. Block 預設參數名稱(實驗性)
  7. Pattern Matching(實驗性)
  8. Compaction GC
  9. Keyword Argument

JavaScript Event Loop -
為什麼你應該了解它(一)

最近在工作上面頻繁的使用 Node.js,雖然以前在開發前端有使用 JavaScript 的經驗,但是對於 JavaScript 的一些特性在這幾年中仍是不求甚解的,對於 JavaScript 的一些奇怪的行為,總是用其他語言的想法來思考最後總是無奈的 workaround,前一段時間,花了一點空閒時間稍微了解了一下 JavaScript 底層到底做了什麼,這篇文章將討論 JavaScript 底層最重要的機制之一 Event Loop 的流程如何影響到 JavaScript 的執行行為。

相信很多人在剛開始接觸 JavaScript 的時候,對於異步行為是非常陌生與困惑的,到底為什麼一個號稱「單執行緒」的程式與語言,能夠以不卡住主執行緒的方式來執行,對於其他程式語言的使用者來說,這是非常不合理的行為,到底 JavaScript 的底層是怎麼處理這樣的行為呢?

首先,讓我們先看一下下面這段 code。

1
2
3
console.log("before time out");
setTimeout(() => { console.log("hello") }, 0);
console.log("after time out");

讓我們來作個小測驗吧,以上的程式碼的執行結果如何呢?

=> before time out
=> hello
=> after timeout
=> before time out
=> after time out
=> hello

恆春食記-夥計鴨肉冬粉

在多風的國境之南,冬粉是這邊的一項特產之一,又因為貧瘠的土地,使得畜牧業蓬勃發展,在屏東南邊的大地上,羊、牛、鹿、雞、鴨、鵝…等,都是常見的養殖選項,這樣的碰撞之下,鴨肉冬粉的出現,著實在意料之中。

湯頭帶著鴨骨自然的鮮味,卻不會有鴨肉的腥騷味,我們知道,不論是什麼樣的動物騷味皆是來自氧化的脂肪組織,因此越新鮮的處理,味道越甜美。米粉在剛上桌前因為還沒吸飽湯汁,略顯平淡,這時可以吃吃看他們的小菜,用煙燻的方式處理的小菜非常令人驚艷,尤其推薦海帶與百葉豆腐,薄薄的煙燻味與濃厚的滷汁調和,使得口感更顯精緻,但另一方面,或許是煙燻的時間不易控制,雞腿幾乎是絲狀的質地呈現,失去了雞腿應有的多汁與細膩,實在非常可惜。

推薦給你,恆春夥計鴨肉冬粉。

使用 Inotify 進行資料夾監控

在撰寫系統時,要監視一個資料夾的變化情形,我們常會寫一個小程式跑一個無限迴圈,隨時監視目標資料夾的狀態,但是這樣的程式不僅浪費系統資源,佔用珍貴的 CPU 時間、對於硬碟 IO 的使用率提昇,也會因為這個程式佔用有限的硬碟頻寬,下面是一個使用無限迴圈實作的簡單資料夾監視程式。

1
2
3
4
5
6
7
8
9
while true
do
  PASS="$(ls -la | wc -l)"
  sleep 5
  CURRENT="$(ls -la | wc -l)"
  if test ${CURRENT} -gt  ${PASS}; then
    echo "file has been added"
  fi
done

將你的程式 Daemon 化

實務上我們常常會希望可以在離開 terminal 的狀況下,程式仍舊持續得執行,有些比較小、比較不需要在意系統資源耗費的程式,我們常可以看到用一些奇怪的手法來達到類似的效果,像是使用 screen 或是 tmux 來將程式跑在背景中,這樣下次登入的時候程式仍舊能夠可以被叫出來,雖然看似方便,但是仍然存在許多問題,例如 tmux 和 screen 所需的記憶體不少,且我們的程式相依於 screen 或 tmux ,當 screen 或 tmux 有任何不可預期的狀況 process 被 kill 掉了的話,我們的程式也會被連帶的受到波及,因此完全獨立的背景執行勢必是需要我們追尋的目標,以下是最近工作上簡單 survey 後的一些有關於如何 Daemon 化程式進行簡單的整理。

本文章主要知識來源於 Daemon Processes in Ruby 的教導,希望能夠用較易理解的文字呈現出來。在寫 Daemon 之前,讓我們回頭看看一個知名的 daemonize web server 程式 rack。我們來看看他將目標 web server daemon 化的程式碼片段,讓我們透過這個程式碼片段來看看是否能夠從中學到如何 daemon 一支程式。

台中食記-麵屋田宗

TL;DR 田宗的用心與水準真心不錯,有機會的話請一定要去吃吃看。

本來想要在吃完的時候就來寫這篇食記了,在台灣吃過這麼多家拉麵店,麵屋田宗是第一家讓我感受到那種對拉麵的熱愛,那種狂熱與堅持,再再都是那麼的觸動我心。經過幾個禮拜的沈澱之後,我決定試著把我對於麵屋田宗的一些感想用我拙劣的文字描繪出來。

因為求學的關係,之前在台北生活了七年的時間,身為一個台中人,在網路上看到任何有關於台中的消息總是會特別的關注,說來慚愧,因為在台北待的太久的關係,對於台中餐廳的認識並不比許多台北人來的高明,與田宗的邂逅也是在網路上看到一名廚師網友的大力推薦才初次耳聞,文中的那種英雄惜英雄讓我特別有帶入感,也讓我對於造訪田宗的旅程更是期待。

或許是我來到店家的時間有點晚了,到達餐廳時已經臨界中午打烊,上一組客人帶著滿足的笑容與我擦身而過。推開木製的大門,醬油與味淋的清香撲面而來,或許是生活習慣的關係,對於醬油與味淋的味道感到特別的令人安心,有別於其他拉麵店總是會播放各種日本音樂,店內飄蕩著輕柔和緩的爵士樂,顯示出了店主心中小小的反動。

身為一個程式設計師,或許我們可以為台灣的數學教育做點什麼

最近在練習 coffeescript 的時候,一直想要寫個小東西來玩玩,昨天晚上在回家的路上一邊騎車一邊想到,未來的世界、未來的教育,或許我們這些程式設計師都有參與的責任,或許編寫一些對於教育有關的程式也會是我往後的一個目標吧。帶著這樣的想法,開始思考著最近在網路上看到的影片

現在已經是資訊化的時代了,過去我們苦心積慮的想要讓孩子們學好算數,可以用紙筆進行高難度的運算,但是這些運算,在電腦普及、智慧型手機人手一支的現代,或許值得我們重新思考,我們學習數學運算的目的是什麼呢?這些能力能夠讓我們在數學成就上面得到什麼發展嗎?是不是這些能力讓我們在過往的學習路途上扼殺了許多可能的數學天才呢?我們是不是又因為一個人有著不錯的數學計算能力,就理所當然的認為他有數學天份呢?這些問題應該是進入了資訊化社會以後的我們,不論是不是老師,我想我們都應該問自己這樣的問題。我們能不能改變什麼,透過這些我們已經身在其中的機器,幫助我們運算,是不是能夠幫助我們學習數學的過程中,能夠學習得更透撤,更有系統呢?

設定 Public Key 進行 SSH 連線

    身為一個宅宅工程師,對於使用 ssh 連線登入遠端主機是家常便飯的事情,但是也常常會因為 ssh port 被一些惡意程式攻擊,導致主機的帳號密碼被猜到,從而被迫換機器或是全機重灌等等的悲劇。 有些系統工程師為了避免這樣的風險,把 ssh port 從預設的 22 port 搬移到其他的 port 上,希望能夠躲過大部分的機器人掃描,並且要求使用者的密碼要足夠複雜,但是相對於這些方法,使用 public key 來登入 ssh 主機似乎是最安全的作法,首先,足夠長度的 key length 能夠有效防止攻擊者的攻擊,並且以目前的科技與已知的演算法,並沒有有效的方法進行 key 破解,畢竟 key 的拆解是一個 NP-hard 的問題,因此能夠使用 public key 來進行連線登入的話是一個較為安全的連線方法。

Ruby Web Framework : 觀察與概念


緣起

前前後後寫 Ruby 也寫了一陣子,用習慣了別人寫的套件、別人寫的 framework 以後,慢慢的也對於各種套件撰寫的原理有了些好奇,開始想要自己編寫一些屬於自己的套件和 framework 來了解一些背後的原理與方法,從過年前到最近,花了一點時間來自己摸索怎麼用 Ruby 來寫一個 web framework ,在過程中學到了許多東西,慢慢的從很多方向來思考 framework 需要什麼。 在這篇裡面我會先將各個模組說明,之後會一個一個來討論。