2018/10/30

近期撰寫程式碼的量

以前大多用 3rd-party library 來拼拼湊湊出自己要使用的功能,近一年狀況比較特殊,幾乎所有東西都要自幹:
$ cd /project/root/src
$ du -sh
148K    .

一年的 code 就 150 KB,算是自開始寫程式以來的個人記錄了吧。

希望這 150 KB 的程式是好的程式,而不是垃圾。

2018/10/29

clamav 掃描 Linux 上的病毒

clamav 預設會將所有掃描過的資料全部輸出到畫面,不管正常或是中毒,這個有點討厭。自己寫 script 做掉:
function clamscan() {
    clamscan -i -r $*
}

另外再寫個掃描整台電腦的 script
#!/usr/bin/env bash

DATE=`date '+%Y-%m-%d'`
LOG_PATH="/var/log/clamav"

# create log folder
mkdir -p  $LOG_PATH

clamscan -i -r /  2>&1 > "$LOG_PATH/$DATE.log"

2018/10/23

藍芽耳機音量調整突然變大問題

前陣子使用藍芽耳機聽音樂時,發現調整音量大小時,應該是一級、一級慢慢擴大聲音,但不曉得為什麼在某一級音量,再多往上條大聲時,會突然大聲很多,感覺像是突然多跳了一級。

上述問題在 KKBOXPoweramp 上都會發生。比較意外的是用同樣的軟體時,有線耳機卻沒有出現這個問題。

測試後發現 Android 在藍芽音訊有一個類似「音量等化」的功能,避免不同規格耳機放出的音量不一致:

從手機的「設定」=>「系統」=>「開發人員選項」=>「網路連線」相關設定可看到


該設定預設會啟用「絕對音量」功能,啟用此功能也會導致文章一開始所說音量調整不一致的問題。把「絕對音量」停用以後,問題便解決了,但耳機聽到的音量會差很多。


備註:調整此設定以後,藍芽連線必須斷線、再重新連線才會套用設定。可將藍芽裝置關機再開機,或是從手機的藍芽設定頁面重新連接藍芽裝置。

2018/10/17

PHP 5.6 將在 2018 年底中止維護

目前 PHP 5 最後一個承載維護的版本:5.6,將於今年年底中止維護。也就是不會再有新功能,且就算有錯誤、安全漏洞也不會再繼續修補。

所以建議大家盡快升級手邊的 PHP 專案至 PHP 7。



個人的經驗,可以跳過 7.0 直接上 7.1,畢竟 7.1 主要是新增一些 7.0 還不支援的功能,沒有他太大的異動。7.2 主要是對效能調整,和新增一些語法,要直接跳 7.2 也不會花太多時間改程式。

預計在 2020 年廢除 TLS 1.0 以及1.1 的支援

這新聞各大媒體都有報導了:

簡單來說:
  • 多數瀏覽器均支援 TLS 1.2
  • TLS 1.0 已經 20 歲、TLS 1.1 也 12 歲了,並且有已知攻擊「POODLE」和「BEAST
  • 剩下少數瀏覽器仍在使用舊版通訊協定 (Edge ... 你看看你)

若手邊有機器需要調整設定,可參考:

2018/10/15

拆解沈水式幫浦

自從去年颱風下大雨,樂團團練室淹水以後,就一直在想除了水桶以外,可以便利抽水的方法。也因此尋找了一些抽水幫浦的設計和結構。

今天一個因緣際會,收到一個魚缸打氣用的沈水式幫浦,打算拆解來看結構設計。雖然抽水的物理原理大致上已經了解,但仍然不清楚實際的防水方法。



希望這次拆解,可以對馬達、幫浦有更進一步的認識。再來就是動手土砲一個幫浦來玩了。

最後感謝新竹澄品佳餚的老闆,提供故障的水族幫浦零件供研究,讓我省了一筆開銷。


YouTube 上已經有很說神人自幹幫浦了,大家有興趣可以參考看看:



PHP server connector 一些 un-documented behaviour

今天是測試 Memcache::connect() 踩到的問題。

先來看看文件上的說明:
Returns TRUE on success or FALSE on failure.
所以我的程式就這樣寫:
$c = new Memcache();
$stat = $c->connect('localhost');

if (false === $stat) {
    echo 'connection failed';
} else {
    echo 'connected to cache server';
}

測試時把 Memcached shutdown 來看看是否會偵測到連線失敗。執行時卻噴了一堆錯誤訊息:
Warning: Memcache::connect(): Can't connect to localhost:11211, Connection refused (111) in /home/u/he5702/tmp/asd.php on line 4

Call Stack:
    0.0001     355600   1. {main}() /home/u/he5702/tmp/asd.php:0
    0.0001     355640   2. Memcache->connect() /home/u/he5702/tmp/asd.php:4

connection failed

文件上面並沒有提到 library 除了回傳 false 以外,還會噴一堆錯誤訊息。萬一這隻是 JSON API 就一定會導致 client parse error。

所以應變方法用「@」來隱藏錯誤訊息:
$stat = @$c->connect('localhost');



寫程式真的很怕遇到 undefine behavior,如果文件上都寫清楚的話,在 dev / staging 上都可以事先檢查、防範。但連文件都沒有寫,就只能等個被廣大的客戶客訴到死 ....。

2018/10/13

自製 Linux Live USB 救援用可開機隨身碟



用 UbuntuMate 16.04 LTS i386 (32bit) 的官方 ISO,透過 Cubic 調整了內容以後,做出來專門用來做電腦系統檢查、救援的 live USB ISO 開機隨身碟。

下載方法:



說明一下異動的內容。

先把多媒體、文書工具的軟體先清除掉,像是 LibreOffice 這類軟體佔用不少儲存空間,但在系統救援完原用不到的東西,我就先幹掉了。另外還有像是 ThunderBird、VLC 等多媒體軟體。

另外增加以下工具,供系統檢查、資料修復備援使用。


一般常用工具:

  • gzip / ungzip / pigz
  • zip / unzip
  • bzip2 / lbzip2
  • p7zip-full
  • htop
  • glances
  • iftop
  • dstat
  • lsof
  • sysstat
  • util-linux

磁碟相關:
  • smartmontools
  • dd
  • ddrescue
  • gparted
  • partimage
  • nfs-common
  • ntfs-3g
  • testdisk
  • badblocks
  • lvm
  • mdadm
  • rsync

網路相關:
  • traceroute
  • mtr
  • mitmproxy
  • iftop
  • tcpdump
  • nmap
  • netcat

若有常用工具被我遺漏,再麻煩留言告知。我會在下一次更新時整理上來。

Customize ISO image by Cubic

以往要客製化自己的 Live USB 工具隨身碟,都是使用 Universal USB Installer,並預留可以使用的空間,再自己上去安裝工具。最近看到有人推薦 Cubic,覺得方便很多。



Cubic 會先解開 general ISO,再透過幾個步驟設定你自己需要的東西:
  1. 設定 ISO 的 meta data,像是 ISO name、release name 等等
  2. 透過 chroot 進入 general ISO 的環境,自己安裝需要的工具、解安裝不要的東西。
    也可以在此步驟設定一些環境參數。
  3. Cubic 會詢問你預設要使用哪個 Linux kernal 當作預設啟動使用。
  4. 如上圖,自動開始封裝檔案,並建立新的 ISO 檔

以下是別人整理的簡易教學:

2018/10/04

GnuWin64

剛剛在幹壞事,想到以前自己找到的 GNU like Windows tool chain「GnuWin32」。

現在主流的系統大多上 64 bits 了,不知道有沒有人重新編譯這些工具,於是直接搜尋「GnuWin64」,沒想到還真的有咧 XDDD


GnuWin64


GnuWin64 provides Win64-versions (x64) of GNU or similar open source tools. The ports are native ports, that is they rely only on libraries provided with 64-bit Microsoft Windows operating system for the AMD64 and Intel64 (EM64T) architecture.

https://sourceforge.net/projects/gnuwin64/