編譯 B2G (Firefox OS)

其實之前幫 ZTE Open (inari) 編過,這次是重新拉過一次 source code 下來,然後先試著編譯 emulator 確認基本可動。

我是把 source code 放在外接硬碟上 (/run/media/yhh/500G/),因為筆電內的 SSD 已經沒有太多可用空間。

先拉 source code:

cd /run/media/yhh/500G/
sudo git clone git://github.com/mozilla-b2g/B2G.git
sudo chown -R yhh:users B2G

然後先去編一個編譯過程中需要的 make 3.82:

sudo tar xvfj make-3.82.tar.bz2
cd make-3.82
./configure --prefix=/run/media/yhh/500G/
make && sudo make install
export PATH=/run/media/yhh/500G/bin:$PATH

接著切換 JDK 版本至 openjdk-7:

sudo archlinux-java set java-7-openjdk

開始設定與建置:

cd /run/media/yhh/500G/B2G
BRANCH=v2.2 ./config.sh emulator
./build.sh -j1

編譯過程只開一個 job,是因為之前發現若跑多個 jobs 會有前後相依衝突的問題,造成編譯失敗。

snapshot74 snapshot72

編出來的 emulator,實際跑起來發現在捲動畫面時,繪圖會不定時黑掉或破圖,不過沒關係,如一開始講的,我只是要確認這份 source code 編出來的東西基本可動而已。回台北後要再實際編一套 2.2 給 ZTE Open 用。

Modern Web 2015 Day 2

首先是 PHP 老爹先簡單講為什麼會有 PHP,再花很多時間在介紹 PHP 7 的新特點,以及在效能上的顯著改善。就語法上來說,很多的語法糖讓 PHP 與時俱進,變得更好用,這也看得出來 PHP 的務實取向。

我聯想到昨天聽獎金獵人的場次,對於「只會改 Drupal module 的人不能說是會 PHP 的 PHPer」論點,其實一直覺得哪裡怪怪的、說不上來。到現在才想到,其實 Drupal 本身就是一個框架,並圍繞著它的 hook 範式來加掛功能,這就是 Drupal way。如果 Drupal 是用其他語言開發的,很有可能還是會走一樣的 hook 範式。而其他的框架如何去使用 PHP 演化出各自的範式,也是開發者的決定。

極端一點地說,除非不特地使用某種框架,自己從頭用純 PHP 刻,不然我不覺得換用另一個框架,就比較「會 PHP」了。

其實我也好久沒寫 Drupal 了,以上都是我的嘴砲,請大家鞭小力一點。

接下來我聽的場次是 Yahoo! 的,講設計團隊的 U.S.E.R 文化 (User, Space, Experiment, Repeat),主張應該打破傳統大公司的部門編制,採用 task force 方式重新找回「團隊」,並走出辦公室,實際去瞭解、去看用戶、去做 user study。特別讓我覺得該省思的一點是,工程師的思維會以為拍賣網站的最好設計,是讓買家看完賣家的商品描述就秒懂,二話不說直接下標。但是實際上買賣雙方的信任關係是在互動溝通中建立出來的,並不是讓買方一句話都不用說。這就是為什麼他們的拍賣 App 會決定「讓上架變簡單」。

然後我去聽 Pinkoi 的場次,講行動版網站如何從技術面來提昇 UX。對我而言的重點在於 Rendering Performance 的觀念,要減少頓挫、不連續的現象,就要減少某些很昂貴的消耗。

Jeremy Lu 講 React Native 的場次就一整個技術宣道大會風格,只要記住 Single Source of Truth, Thinking in Component, Always Redraw (in VDOM) 三原則,加上技術導入門檻極小的 JS,以及原生軟體的 UI/UX/Performance,讓 React & React Native 可能成為 Web 與 native app 開發的苦逼業界救世主。

松田明的演說對於我這個 Rubyist 來說其實並沒有新東西,而松田さん調查在座有多少 Ruby 用戶時,看來也是不多。我想我自己也是要努力一點,多去用實際的成果證明 Ruby & Rails 是有意思、有搞頭的。

橋本さん的演說也是很有趣。我之前就試用過 Backlog 了,只是不知道在這軟體變這麼可愛、好用之前,其實有一段因為 UX 不佳、群眾對「工作狀況放在別人家網站管理」有心理障礙的撞牆期,後來透過 UX 的改善才逆轉過來,成為成功的產品。

最後一場我去聽陳雅博講 UX 的哲學,很受感動與啟發,UX 真的不是一個特定部門、特定人員(如一般人可能以為是 VD)負責的,而應該是整個企業、整個團隊都該有的 sense。且產品若原本就有本質上的問題,也不該期望 UX 可以拯救產品,所謂金玉其外、敗絮其內,最終仍是騙不過用戶的。

「好的專案流程重要性不低於成果,但若沒有適當的思維及做事心態,流程並不具備任何意義。」

「正確的思維是教不出來的,是要花時間被培育而出的。」

演說尾段這兩張投影片上的句子特別讓我有感觸。

Modern Web 2015 Day 1

報到的時候由於不諳動線規劃,所以跟報告櫃台人員發生一點誤會,主要責任還是在我,是我修養不到家。雖然後來跟對方道歉了,但是在這裡還是想要再次跟當事人表示歉意。

JavaScript 老爸的演講很精彩,回顧與展望了 JS 的發展,只是我印象最深刻的還是 asm.js 的威力展示。(爆)

接下來雖然我選擇聽蔡學鏞的場次,起初是基於追星的心態,畢竟受他超高水準的譯作獲益不少,且很少人的譯者序可以寫到比作者序還引人入勝的。但是真正聽過他講其個人獨創的 3D 架構方法,就有種「聽過這場就值得這報名費了」的滿足感,這是真正知道如何治學的人,將其心得化為有系統的知識,再用易懂的敘述講給別人知曉。我只能說:「佩服!」

再來我原本打算要聽拓元的場次,卻臨時改變心意去聽獎金獵人如何逃離 Drupal 的泥淖。很可惜沒聽到他們如何處理原有資料庫,畢竟這才是重點。

下午第一場聽 KKTIX 的場次,重點就是他們並不是完全拋掉 Ruby on Rails,事實上還持續跟上最新版本。務實地將 Go 與 Rails 各自用在其擅場。

唐鳳的演說很鼓舞人心,其實這陣子我的情緒很低落,聽過唐鳳的演說,以及接下來 Art Pai 的場次後,有平復一些。

Mozilla 的場次很有意思,一般做手機的多螢幕是使用多個 user agent 或直接 mirroring,但是在 Firefox OS 上他們做的是單一 user agent 在不同螢幕顯示不同內容。

最後一場我聽 Paul Li 的場次講 frontend 的 BDD,講者真是太有趣了,滿滿的笑點讓我從頭忍笑到尾,但是演說的內容其實是很紮實的前端測試技術,聽完真的獲益良多。

在 IntelliJ IDEA 與 Eclipse 新增程式語言支援

繼續昨天的研究…。

初步看來就是要在平台內實作「近乎整個編譯器」。之前我知道 Eclipse 推的 Xtend 語言,(另)一個號稱「更好的 Java」,是從 Xtext 衍生出來的計畫,但也只是沾沾醬油,未嘗細究 Xtext 是什麼樣的東西。

雖然我是個非 CS 本科的外行人,但是我對 compiler, assembler 如何產出小時候在 hex editor 與 disassembler 看到的那些機器碼,一直很感興趣,卻始終因為個人的怠惰,也缺乏強烈的動機,沒有認真下去研究。也許這次是個好機會。

學習 Text Editor 開發

我最近已經有點受不了這樣的狀況:

當我在 Vim 底下,打開 NERDTree 的時候,由於游標還在 NERDTree 的 window 內,所以只要我操作 :edit 或 :bnext, :bprev 指令時,檔案就會被 Vim 在 NERDTree 的 window 內打開它所屬的 buffer,而非我預期的「編輯區」window 裡。

於是我必須把 NERDTree 的 window 關掉,而且得用 :q 指令,因為在當下這 window 的 buffer 已非 NERDTree,所以熱鍵對應的 :NERDTreeToggle 指令只會再分割出一個新的 window 來叫出 NERDTree。

成也 Vim 的彈性,敗也 Vim 的彈性,Vim 沒有「側欄」、「編輯區」的概念,而我想要的只是一個單純的檔案管理員而已。

轉頭望去,用 Sublime Text 的快樂同事們沒這個困擾,遑論 App 組的同事用全功能的 IDE (XCode, Eclipse) 搞定「真正基於專案 context 的 auto-complete」與「即時檢查程式問題」。

而我還堪自誇的也只剩下「就算 SSH 到遠端也能看似輕鬆寫意」、「看起來好像很 geek 的虛榮」。

但是,遠端作業通常也只是維護機器設定檔當中關鍵的寥寥幾行,Vim 熟手宣稱的高生產力在這裡佔不了多少優勢。符合「一般需求」的 Pico, Nano, Joe 等「簡易型」編輯器就夠用了。

前幾天試用了 Visual Studio CodeAtom,以及再讀一次王垠的〈怎样尊重一个程序员〉,更讓我覺得,我長期這樣折騰自己究竟是為什麼?而且我還是一個使用傳統上下左右鍵,根本沒習慣 hjkl 過的 Vim 使用者,日常工作用的那幾個按鍵也沒發揮過人的高效率。

簡單說,就是裝逼而已,根本就是個空心大老倌。

我還深深反省了,之前某新進同事問我們 Rails 開發是用什麼 IDE,我為此輕蔑不屑地想:「科科,又是一個沒 IDE 就不會做事的」。但是若仔細想想,如果我們的 Rails 開發,可以用個幫我們提供「真正基於專案 context 的 auto-complete」與「即時檢查程式問題」的 IDE,那之前有多少低級錯誤,其實是可以避免的?

於是,除了尋覓一個更適合我的編輯器或 IDE,我開始翻起 [The Craft of Text Editing] 這本電子書,並對照幾個編輯器專案,去驗證書中所說的開發概念與方法:

(我挑這幾個「使用比較現代的系統程式語言 (Go, Rust)」實作的編輯器,是想要摸蜆仔兼洗褲、看看別人是怎樣運用這些新語言的。)

一開始讀到這本書的 1.1 User Categories 時,介紹 Neophyte 型使用者那段,就讓我深切反省,自己在做產品時,對 UX/UI 的投入還是遠遠不夠的,甚至悖離了「應該是你要去適應與滿足用戶,而不是挑用戶」的原則與初心。

UX/UI

以往我會覺得這東西很重要,只是因為不是我所擅長,所以並沒有這麼關注。但是由於工作上長期下來一些事情的積累,造就我心境上的轉變,認為這東西跟我過去碰的「硬派」技術同樣重要。

好的 UX/UI 絕不僅是擦脂抹粉,套個版型。倘若金玉其外、敗絮其內,還是白搭。

好的 UX/UI 至少要做焦點團體研究。

好的 UX/UI 要符合基本的排版原則,顧及 Accessibility,符合 Human Interface Guidelines & Design Principles。

下次當你我用到一個「直覺、好用、近乎無腦」的 UI 時,也許可以想想,設計者花了多少心思與成本,來 make you happy?反之,那些強調功能多強大、架構多優異,用起來卻讓你我覺得「這尛?」的產品,到底哪裡做錯了?

AWS EC2 掛載多個網路介面的設定

對於這種我以為會 It Just Works 卻並非如此的事情,就會覺得很煩躁。

直覺上,我會以為只要掛上 ENI 就該直接能動,卻發現這網卡有掛就跟沒掛一樣,原因是 routing table 打架,適用於 eth0 的規則先套用,自然 eth1 就不理不理,如果手動置頂讓 eth1 規則排在前面,就反過來變成 eth1 能動,eth0 不理不理。

解法就是要用多個 routing table。參考這篇文章的方法,為 eth0, eth1 分別設定:

ip route add 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.61.20 table 20
ip route add default via 192.168.1.1 dev eth0 table 20
ip rule add from 192.168.1.20 lookup 20
ip route add 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.61.21 table 30
ip route add default via 192.168.1.1 dev eth1 table 30
ip rule add from 192.168.1.21 lookup 30

什麼場合會需要這樣搞?AWS 的粉絲與專家會跟你說沒有必要這樣折騰,一個 ENI 就可以綁多個 IP add. 了,然而如果你需要架設某種就是要綁「網路介面」而不是綁「IP Address」的服務時,你就是需要這樣折騰。

事實上在 Linux 處理 IP 選徑的時候,預設行為就是這樣,所以 EC2 & ENI 也沒多做事,就只是蕭規曹隨。

當然 AWS 粉絲與專家也很有可能會跟你說:「你可以跟 AWS 官方提議,改成不需要這樣折騰。」現在我每次聽到這種話就會心火熊熊燃燒,尤其是在需求有期限、AWS 卻不見得會搭理你的現實下。

為什麼我們會對某些產品感到貼心、好用?就是因為「它雞婆地多做了一點事」。

車站作為公共圖書館的一種據點之幾個提問

北市圖現在有智慧館(無人服務圖書館)以及 FastBook 自動借書站。我剛剛聯想到,如果在公車站、火車站、捷運站以 Kiosk 型態,推送形同有「無限複本」的電子書,會不會有搞頭?

現在的智慧型手機、平板電腦很普及,且不論螢幕大小、顯示品質不一的枝微末節,單以「提供大眾交通工具旅客一份『文庫本』概念的閱讀材料」為宗旨,推廣一次車程就可以讀完至少一半的精選內容,這樣對推廣閱讀有沒有幫助?

對圖書館而言,讓圖書館員來經營內容農場,是否自詡「資訊守門人」的圖書館員能做得比現在這些內容農場業者與小編更好?錯誤內容更少(特別是健康醫療類內容)?

對創作者而言,圖書館舉辦講座、工作坊,教他們使用相關工具產出 EPUB 開放格式的電子書、並鼓勵使用 CC, FDL 等開放授權條款釋出,這樣圖書館是否能夠回到本質初衷、而不是在電子書商的 DRM 機制下傻傻為人作嫁?

這樣兼顧原創內容來源、推廣通路、讀者服務的想法,可行性有多高?

改用 systemd 設定 ThinkPad TrackPoint

我發現之前的方法會造成問題,讓筆電內建的輸入裝置失效(可能是 WAIT_FOR 導致的),除非外接滑鼠,否則我在 SDDM 底下無法「點」到密碼輸入框來操作登入。然而 rc.local 這老而簡單的方法已經被時代莫名其妙摒棄,我只好用這新潮卻阿雜的 systemd 來設定。

首先產生讓我放置自訂的 systemd *.service 目錄:

sudo mkdir -p /usr/local/lib/systemd/system

再來編輯我的 thinkpad-trackpoint.service:

sudo vim /usr/local/lib/systemd/system/thinkpad-trackpoint.service

內容如下:

[Unit] 
Description=Set ThinkPad TrackPoint 
After=multi-user.target 
 
[Service] 
ExecStart=/usr/bin/bash -c 'echo 150 > /sys/devices/platform/i8042/serio1/serio2/sensitivity && echo 180 > /sys/devices/platform/i8042/serio1/serio2/speed' 
 
[Install] 
WantedBy=graphical.target

然後啟用它:

sudo systemctl enable thinkpad-trackpoint.service
sudo systemctl start thinkpad-trackpoint.service

用 udev rules 設定 ThinkPad TrackPoint

找出裝置:

udevadm info --attribute-walk --path /sys/class/input/mouse2

通常會是 ‘/devices/platform/i8042/serio1/serio2’,不然請找出列表中 ATTRS 有一堆包括 speed, sensitivity, press_to_select 的那個。

添加規則 /etc/udev/rules.d/10-trackpoint.rules:

KERNELS=="serio2", SUBSYSTEM=="serio", DRIVERS=="psmouse", WAIT_FOR="/sys/devices/platform/i8042/serio1/serio2/sensitivity", ATTR{sensitivity}="150"

KERNELS=="serio2", SUBSYSTEM=="serio", DRIVERS=="psmouse", WAIT_FOR="/sys/devices/platform/i8042/serio1/serio2/speed", ATTR{speed}="180"

KERNELS=="serio2", SUBSYSTEM=="serio", DRIVERS=="psmouse", WAIT_FOR="/sys/devices/platform/i8042/serio1/serio2/press_to_select", ATTR{press_to_select}="1"

套用設定,檢查是否生效:

sudo udevadm test /sys/devices/platform/i8042/serio1/serio2