2017/6/26

The Ten Commandments of Egoless Programming


無我編程的十條戒律,最早出現在由Gerald Weinberg於1971年出版的經典著作《程序開發心理學》裡。這十條準則,除了告訴 programmer 要鍛鍊自己的人格修養之外,更多的是提醒大家,要擺脫 geek的形象,走入社會及人群。


  1. Understand and accept that you will make mistakes. The point is to find them early, before they make it into production. Fortunately, except for the few of us developing rocket guidance software at JPL, mistakes are rarely fatal in our industry, so we can, and should, learn, laugh, and move on.


    接受自己會犯錯的事實。關鍵是要在錯誤進入到生產環境之前把它們找出來。所幸的是,除了小部分在噴氣推進實驗室裡開發火箭制導系統的程序員,大部分錯誤都不會造成致命的後果。所以,我們一定能夠而且也應該要學會嫣然一笑,然後繼續。

  2. You are not your code. Remember that the entire point of a review is to find problems, and problems will be found. Don't take it personally when one is uncovered.


    不要使用代碼來針對個人。要記住,代碼評審的目的是為了找出問題,而且總歸會找到問題。如果真的找到了問題,請不要把它作為針對個人的藉口。

  3. No matter how much "karate" you know, someone else will always know more. Such an individual can teach you some new moves if you ask. Seek and accept input from others, especially when you think it's not needed.


    不管你知道多少“秘籍”,總有人比你知道得更多。如果你開口,他們就會教你更多的東西。在你認為沒有必要的時候,學會接受他人的建議。

  4. Don't rewrite code without consultation. There's a fine line between "fixing code" and "rewriting code." Know the difference, and pursue stylistic changes within the framework of a code review, not as a lone enforcer.


    不要不經討論地重寫代碼。“修復代碼”與“重寫代碼”是有明顯的區別的。瞭解這些區別,並在代碼評審的框架之內進行程式化的變更,而不是單獨作戰。

  5. Treat people who know less than you with respect, deference, and patience. Nontechnical people who deal with developers on a regular basis almost universally hold the opinion that we are prima donnas at best and crybabies at worst. Don't reinforce this stereotype with anger and impatience.


    尊重比你懂得少的人,並對他們抱以耐心。與技術人員打交道的非技術人員認為技術人員要麼是妄自尊大的討厭鬼,要麼是愛撂挑子的倔驢。所以,我們不要用我們的憤怒和不耐煩去加深他們對我們的這種印象。

  6. The only constant in the world is change. Be open to it and accept it with a smile. Look at each change to your requirements, platform, or tool as a new challenge, not as some serious inconvenience to be fought.


    這個世界唯一不變的就是變化。敞開胸懷,面帶微笑地去擁抱變化。把每一個需求變更、平台變更或工具變更都看成是一個新的挑戰,而不是令人厭惡的麻煩。

  7. The only true authority stems from knowledge, not from position. Knowledge engenders authority, and authority engenders respect – so if you want respect in an egoless environment, cultivate knowledge.


    真正的權威來自於知識,而不是職位。知識造就了權威,而權威會迎來尊重。如果你想要在一個無我的環境裡得到尊重,那麼充實你的知識吧。

  8. Fight for what you believe, but gracefully accept defeat. Understand that sometimes your ideas will be overruled. Even if you do turn out to be right, don't take revenge or say, "I told you so" more than a few times at most, and don't make your dearly departed idea a martyr or rallying cry.


    堅定你的立場,優雅地接受挑戰。要知道,你的想法有時候會遭到反對。你可以證明自己是對的,但不要試圖報復,不要總是叫嚷著“我早就說過”,不要把被否定的想法看成是一個犧牲品或者某種戰鬥口號。

  9. Don't be "the guy in the room." Don't be the guy coding in the dark office emerging only to buy cola. The guy in the room is out of touch, out of sight, and out of control and has no place in an open, collaborative environment.


    不要成為“小黑屋裡的人”。不要躲在小黑屋裡寫代碼,就算偶爾露個面,也只是為了買一杯可樂。躲在小黑屋裡只會讓你與其他人失去聯繫,淡出他們的視野,失去控制。在一個開放的協作環境裡,你會找不到自己的位置。

  10. Critique code instead of people – be kind to the coder, not to the code. As much as possible, make all of your comments positive and oriented to improving the code. Relate comments to local standards, program specs, increased performance, etc.


    批評代碼,而不是人。對人好一點,而不是代碼。讓你所有的評審為代碼帶來積極的改進,把你的評審與局部標準、程序規範和更好的性能結合在一起。


References


無我編程的十條戒律


The Ten Commandments of Egoless Programming

2017/6/19

Volumio2


Volumio 是支援類似 Raspberry Pi 等多款小電腦主機的音樂播放器,只要有一台 Raspberry Pi,就能夠接上網路上的串流、區域網路內的音樂庫、YouTube,進行音樂的播放。


內建的 Audio Out 就能夠播放音樂,但如果要得到更高語音品質的音樂輸出,則需要再購買 USB Speaker 或是 USB/I2S DAC。


安裝 volumio2 只要到 DOWNLOAD VOLUMIO FOR YOUR PLATFORM 網頁下載 Raspberry Pi 的 image,燒錄到 micro sdcard,直接用 RPi 開機就可以運作。


網路設定


如果直接接上 RPi console,可以用


帳號: volumio
密碼: volumio

登入進入 RPi,root 的密碼也是 volumio。


但基本上是 console mode。


volumio 必須要用 browser 進去設定以及使用,主畫面就像下面這樣。



我們除了設定連接到 NAS 的音樂庫,另外還下載了 YouTube Plugin。


設定「播放選項」


因為我沒買 DAC,在設定播放的輸出裝置時,一直發現一些問題,最後就是參考這個網頁


LIBRARY UPDATE: SEEMS TO CRASH VOLUMIO ON RASPI


把 /boot/cmdline.txt 裡面


由
"smsc95xx.turbo_mode=N"
改為
"smsc95xx.turbo_mode=Y"

另外把音量選項的 Mixer Type 改為 Software,就能運作了。


輸出裝置


RPi 內建的 Audio Out 聲音效果很差,會聽到很多雜音。


後來把一個 USB Speaker 接上 RPi,也沒有裝 Driver,就能在輸出設備中選到該 USB Speaker,聲音的品質改善很多。


APP


Volumio iOS 是個非常好用的工具,在 LAN 裡面把 app 打開,馬上就自動連接到 LAN 的 volumio。



References


Raspberry Pi 的應用 - 連音響發燒友也愛用的音樂播放器:Volumio


Raspberry Pi 的應用 - 數位音樂播放器的再進化:Volumio 2

2017/6/12

如何備份、還原處理 RPi 的 sdcard image


Raspberry Pi 使用的 sdcard 雖然同樣是 16GB,但因為不同廠牌還是有些大小的差異,備份跟還原 sdcard 有些問題,畢竟大檔案的 image 不能還原到稍小的 sdcard 中。


以下紀錄如何備份、還原及縮小 RPi 的 sdcard。


在 MAC 處理 image


  • 使用 [SD Formatter] 可格式化 SD Card

sudo newfs_msdos -F 16 /dev/disk2

  • RASPBIAN 下載 RASPBIAN JESSIE WITH PIXEL,取得 2016-09-23-raspbian-jessie.zip 解壓縮得到2016-09-23-raspbian-jessie.img

  • 重新插入 SD Card,用以下指令的結果,得知 SD Card 在 /dev/disk2 或是 /dev/disk1


diskutil list

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *480.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            479.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk2
   1:             Windows_FAT_32 NO NAME                 15.9 GB    disk2s1

  • umount disk2

sudo diskutil unmountDisk /dev/disk2

  • 將 img 寫入 sdcard

如果 rdisk2 有問題,就改成 disk2


sudo dd bs=1m if=~/Downloads/2016-09-23-raspbian-jessie.img of=/dev/rdisk2

  • 將 sdcard dump 到 image

sudo dd bs=1m if=/dev/rdisk2 of=~/Downloads/messenger_20170405.img

在 RPi 開機狀態直接備份 sdcard


在 RPi 上,將新的 sdcard 放入 USB sdcard Reader 接上 RPi


sudo fdisk -l

如果是 Disk /dev/mmcblk0 的設備,就是 RPi 上原始的 sdcard,以 USB sdcard Reader 接上 RPi 後,會看到增加的 /dev/sda 設備,這是新的 sdcard


下載 rpi-clone


git clone https://github.com/billw2/rpi-clone.git
sudo cp rpi-clone/rpi-clone /usr/local/sbin
rm -rf rpi-clone

用以下指令就可以將 sdcard 複製到 新的 sdcard 上


sudo rpi-clone sda -v -x

在 Windows 處理 sdcard image


使用 Win32 Disk Imager 軟體就可以備份及還原 image


縮小 RPi image


使用 PiShrink 可以在 linux 縮小 RPi image


wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh

chmod +x ./pishrink.sh

sudo ./pishrink.sh ./raspbian_backup.img

以下是執行結果,可看到檔案縮小了 2G


Creating new /etc/rc.local
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0: 301607/960992 files (0.2% non-contiguous), 3200117/3841024 blocks
resize2fs 1.41.12 (17-May-2010)
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/loop0 to 3208948 (4k) blocks.
Begin pass 2 (max = 228392)
Relocating blocks             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 118)
Scanning inode table          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 25082)
Updating inode references     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/loop0 is now 3208948 blocks long.

Shrunk ./raspbian_backup.img from 15G to 13G

References


How to Clone Raspberry Pi SD Card on Windows, Linux and macOS


Backup (or Clone) a Raspberry Pi SD Card


用 Win32 Disk Imager 備份和燒錄 Raspberry Pi 的 SD 卡

2017/6/5

倖存者偏差 survivorship bias


倖存者偏差(Survivorship Bias),就是只有存活下來的人,才會被後人看到,因此我們在分析資訊的時候,非常容易忽略掉那些被淘汰的競爭者,造成對局勢的評估過分樂觀,甚至導出完全相反的結論!


在觀察不熟悉的產業時,往往被這種倖存者偏差所蒙蔽,報章雜誌更是時常針對那些所謂成功的企業案例。實際上,這些結果論的成功故事所歸納出的成功要訣往往只是其中一小塊拼圖,這些1%的倖存者因為大量曝光的資訊,讓我們以為前景一片看好,我們卻沒有看到其他99%的競爭者早就默默地消失了!由於成功者的能見度壓倒性的高過失敗者,因此,人們總是系統性的高估了獲得成功的希望。


類似的名詞有:隱藏失敗者、沉默的數據、死人不會說話


統計的抽樣方法


抽樣 是一種推論統計方法,從目標總體(Population,母體)中抽取一部分個體作為樣本(Sample),通過觀察樣本的某一或某些屬性,依據所獲得的數據對總體的數量特徵得出具有一定可靠性的估計判斷,從而達到對總體的認識。


學問就在於,如何抽樣,抽樣的個體如何能代表整個母體?統計上有另一個名詞:信賴區間,信賴區間是樣本對某個總體參數的區間估計。信賴區間展現的是,這個總體參數的真實值有一定機率落在與該測量結果有關的某對應區間。


信賴區間會聲稱總體參數的真實值在測量值的區間所具有的可信程度,也就是前面所說的「一定機率」。這個機率被稱為信心水準。


舉例來說,如果在一次大選中某人的支持率為55%,而信心水準0.95上的信賴區間是(50%,60%),那麼他的真實支持率落在50%和60%之區間的機率為95%,因此他的真實支持率不足50%的可能性小於2.5%(假設分布是對稱的)。


在倖存者偏差中,由於抽樣的對象都是整個母體中的倖存者,因此對這些抽樣對象的分析結果,並不能代表整個母體,如果誤信這些倖存者的分析結果,忽略了原本母體中沈默的失敗者,就會造成對局勢過分樂觀的評估結果。


第二次世界大戰


1941年,第二次世界大戰中,美國哥倫比亞大學統計學亞伯拉罕.沃爾德(Abraham Wald)應軍方要求,利用其在統計方面的專業知識來提供關於《飛機應該如何加強防護,才能降低被炮火擊落的機率》的相關建議。


教授針對聯軍的轟炸機遭受攻擊後的數據,進行研究後發現:機翼是最容易被擊中的位置,機尾則是最少被擊中的位置。沃德教授的結論是「我們應該強化機尾的防護」,而軍方指揮官認為「應該加強機翼的防護,因為這是最容易被擊中的位置」。


沃德教授的堅持有以下幾點


  1. 統計的樣本,只涵蓋平安返回的轟炸機
  2. 被多次擊中機翼的轟炸機,似乎還是能夠安全返航
  3. 在機尾的位置,很少發現彈孔的原因並非真的不會中彈,而是一旦中彈,其安全返航的機率就微乎其微

軍方採用了教授的建議,並且後來證實該決策是正確的,看不見的彈痕卻最致命!


這個故事有兩個啟示:一是戰死或被俘的飛行員無法發表意見,所以彈痕數據的來源本身就有嚴重的偏誤;二是作戰經驗豐富的飛行員的專業意見也不一定能提升決策的質量,因為這些飛行員大多是機翼中彈機尾未中彈的倖存者。


基金及股票市場


基金行業會對外宣布,過去10年,基金行業的整體收益率超過100%,你是不是覺得買基金肯定賺翻了?


基金市場中,計算基金類股未來多年走勢時,通常會排除下檔基金的虧損,因此會高估了基金的整體報酬率,因為已經消失在市場的基金,沒有必要列在其中。


如果長期觀察新發行證券的股價發展,並排除已經破產的公司時,也會發現類似的效應。這種「排除」模式導致投資人對未來發展過度樂觀,因為破產公司無法拉低整體的統計數據。


股票指數的表現也會遭遇這類失真問題,因為指數表現較差的股票並不會納入計算,股市指數永遠只會統計表現最亮眼的那些股票。


讀書無用論


很多人在說,某某人當初沒好好上學如今照樣掙大錢,而好多用功讀書的人,畢業後反而不如那些沒好好學習的人混得好。並且因為這樣的例子有很多,所以很多人得出「讀書無用」的結論。


因為高學歷成功者的新聞性不會比低學歷成功者來得高,在報導成功案例時,如果有低學歷,或是輟學的過程,會讓整個故事更具有傳奇性,因此我們常常會聽到這樣的案例,相反的,如果是高學歷的成功者,報導中就不會強調這個部分。


生活中的 倖存者偏差


我親戚的病就是中醫看好的,所以中醫很靈驗。


喝葡萄酒的人比較長壽。


每個成功者都很努力,所以只要努力就能成功。


References


倖存者偏差


可怕的邏輯陷阱 -- 存活者偏差


彈孔最多的地方不需要保護──倖存者偏差


無所不在的生存者誤差 (Survivorship bias)


林斯諺/國外的月亮比較圓?《返校》熱潮的「倖存者偏差」


考研,一定要注意倖存者偏差


倖存者偏差是什麼意思?


3 - 6 信賴區間與信心水準的解讀