2015年11月9日 星期一

使用構樹皮製作布料

入門的話,
選 3 歲以下的構樹(纖維較嫩,比較好剝皮,熟悉之後可以挑更粗更大的構樹)。

沿樹幹長軸用刀具劃開樹皮後,把樹皮撥下來。
接著將樹皮最外層的角質(咖啡色的那些東西)刮除,

刮除方式自由發揮,
反正不要傷到樹皮白色纖維的部份(會被當作布料使用的部份)就好。


刮乾淨後,使用木槌不斷敲擊樹皮,直到面積變為原來的 1.5~2倍,
想要布料越柔軟就要敲越久,變為原來兩倍左右就會頗軟了。
不可使用鐵鎚,因為攻擊力太高了,一敲樹皮就破了 XD

敲好之後,把樹皮放在冷水裡(蓋滿) , 煮到滾。

之後轉小火繼續熬煮約20分鐘,然後拿出來放到冷水泡3天之後陰乾。
陰乾完後就是可以幫做布料的構樹皮了,
可以拿針線來縫。

製作不難,幾乎不會失敗 XD
只是真的很費工 XD


括除表面角質中






剛剝下並除去樹皮角質後的構樹皮。深綠色與褐色部份為沒有把角質去乾淨的部份。

煮構樹皮

煮完、陰乾後的構樹皮。


2015年10月29日 星期四

開發 ubiquity - 環境架設


首先先確定系統中有裝 ubiquity (程式核心) 和 ubiquity-slideshow-ubuntu-gnome (gnome 桌面環境下播放的 ubiquity slides),如果沒裝,要先裝
sudo apt-get install ubiquity ubiquity-slideshow-ubuntu-gnome ubiquity-frontend-gtk
因為 Ubuntu 桌面環境預設使用由 gnome 開發,所以這邊選擇安裝 -ubuntu-gnome。如果你想開發的桌面環境是其他種類,例如 kubuntu 或是 lubuntu,請分別選擇不同的 suffix,例如 ubiquity-slideshow-kubuntu 。

frontend 的部份也是一樣的意思,如果使用 kde ,請裝 ubiquity-frontedn-kde 。

因為我想開發 oem 安裝模式下的 ubiquity 行為,所以我的系統還要先有安裝 oem-config
sudo apt-get install oem-config
接著創建一個用來放開發用程式碼的資料夾
mkdir -p src/ubiquity
進到這個資料夾中[1],
然後取得架設環境用的 script (你可能要事先安裝 bzr),
sudo apt-get install bzr 
bzr branch lp:~taihsiangho/+junk/ubiquity-scripts scripts
或是從這裡也可以取得(我是從這 copy 的,免得原作者有天把來源拿掉)
bzr branch lp:~agateau/+junk/ubiquity-scripts scripts
取得 ubiquity 中播放的 slides
bzr branch lp:ubiquity-slideshow-ubuntu slideshow
取得 ubiquity 原始碼(到時要開發這一份)
bzr branch lp:ubiquity code
整個環境架設的核心概念是把下載下來的部份原始碼,使用 symbolic link 去代替在系統中的程式碼(這種作法可以生效是因為 ubiquity 核心本身是 python 這個直譯式語言寫成的關係),所以開發時直接改 code 就會好像直接改系統中的 ubiquity 程式一樣。

上面的步驟可以整合為
sudo apt-get install ubiquity ubiquity-slideshow-ubuntu-gnome ubiquity-frontend-gtk oem-config && mkdir -p src/ubiquity && cd src/ubiquity && sudo apt-get install bzr && bzr branch lp:~taihsiangho/+junk/ubiquity-scripts scripts && bzr branch lp:ubiquity-slideshow-ubuntu slideshow && bzr branch lp:ubiquity code
使用這個指令去準備開發環境[2]
./scripts/setup setup
done!! 至此為止所有東西都準備好了。所以我們切換到開發狀態
./scripts/setup dev
修改好程式後,接著啟動 ubiquity 。我在這裡想開發的是 oem 模式下的行為,所以啟動方式是
sudo oem-config
而不是標準的 ubiquity
sudo ubiquity



本篇主要參考
http://agateau.com/2013/hacking-on-ubiquity-the-setup/
我已經將虛擬機器的部份拿掉,著重在最核心的概念:使用原始碼替換系統中的程式碼。讀者可依照自己的需求,將此環境設置方式自行搭配必要的虛擬環境,免得把自己的主系統弄髒。

[1] 注意不要漏掉這一步,不然後面的 ./scripts/setup 不會正確工作。
[2] 如果系統沒有安裝 qt 相關的 ubiquity 的話;setup 這個 script 中 qt 相關的動作要被移除,來保證 script 執行沒有中斷。免得行為不符合預期。


Trouble Shooting

sudo oem-config 啟動後沒反應

遠端啟動時,是否有指定環境變數 DISPLAY

/usr/sbin/oem-config 會先檢查是否有 DISPLAY 環境變數,如果有才 import Gtk module。所以不指定的話就會有如下錯誤:

Jan  3 18:41:12 201606-22347 ubiquity[23735]: Ubiquity 2.21.63.3 (oem-config)
Jan  3 18:41:13 201606-22347 ubiquity[23735]: Exception in GTK frontend (invoking crash handler):
Jan  3 18:41:13 201606-22347 ubiquity[23735]: Traceback (most recent call last):
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/sbin/oem-config", line 649, in <module>
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     main(oem_config)
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/sbin/oem-config", line 635, in main
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     install(query=options.query)
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/sbin/oem-config", line 264, in install
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     wizard = ui.Wizard(distro)
Jan  3 18:41:13 201606-22347 ubiquity[23735]:   File "/usr/lib/ubiquity/ubiquity/frontend/gtk_ui.py", line 228, in __init__
Jan  3 18:41:13 201606-22347 ubiquity[23735]:     self.builder = Gtk.Builder()
Jan  3 18:41:13 201606-22347 ubiquity[23735]: NameError: name 'Gtk' is not defined

例如可以這樣指定

export DISPLAY=:0 ; sudo oem-config

檢查 /var/log/syslog

合併 tail -f /var/log/syslog 的監控技巧,執行 oem-config。目前發現在 Xenial proposed stack 上有點問題;這應該是因為最新的 ubiquity source 和 Xenial 的環境有不相容之處。可以切回 ./scripts/setup distro 使用系統原本的試試是否可以起來。

Jan  3 18:41:30 201606-22347 ubiquity[23742]: Ubiquity 2.21.63.3 (oem-config)
Jan  3 18:41:30 201606-22347 ubiquity[23742]: Exception in GTK frontend (invoking crash handler):
Jan  3 18:41:30 201606-22347 ubiquity[23742]: Traceback (most recent call last):
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/sbin/oem-config", line 649, in <module>
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     main(oem_config)
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/sbin/oem-config", line 635, in main
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     install(query=options.query)
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/sbin/oem-config", line 264, in install
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     wizard = ui.Wizard(distro)
Jan  3 18:41:30 201606-22347 ubiquity[23742]:   File "/usr/lib/ubiquity/ubiquity/frontend/gtk_ui.py", line 278, in __init__
Jan  3 18:41:30 201606-22347 ubiquity[23742]:     ''')
Jan  3 18:41:30 201606-22347 ubiquity[23742]: GLib.GError: gtk-css-provider-error-quark: <data>:8:24'min-height' is not a valid property name (3)

2015年10月20日 星期二

除錯技巧心得 - 以 GConf 參數為例



安裝

sudo apt-get install gconf-editor

啟動

gconf-editor

如果已經知道 schema 的話,按照 schema 去找;若是不知道 gconf-editor 有 Find 功能可用。


把設定界面打開,一邊調整一邊觀察。所以就會知道該怎麼調整 gnome 設定。



gnome 的說明 https://projects.gnome.org/gconf/

gconf-editor
GNOME has a prototype-quality unfinished program called gconf-editor which is sort of the GUI equivalent of gconftool. Try it out.


dconf 是比較新的工具,先用 dconf,找沒有想要的屬性的話再用 gconf 查找。原本的回答很不錯,直接引用:
dconf is a new way for applications to store settings, and it is intended to replace gconf. dconf-editor and gconf-editor are for their respective configuration systems, and they don't talk to each other. At the moment that transition is still a work in progress, so many applications continue to use gconf. In addition, some applications still have settings left over in gconf even though they are using dconf now.
Almost all of the software that is installed by default - everything that comes from GNOME - uses dconf (if anything). Almost everything else that is available uses gconf, though this is of course changing as older software is brought up to date.
So, yes, changing a setting in gconf is likely to do something! If you did a fresh install of Ubuntu 11.10 and didn't migrate your gconf settings, it's likely that everything you see with gconf-editor is being looked at and understood by some current application. If your settings predate 11.10, there may be stuff there that isn't being used.
As a rule of thumb, check dconf first and if what you're looking for isn't there, try gconf.

https://askubuntu.com/questions/91403/when-to-use-gconf-vs-dconf



2015年8月1日 星期六

cython workshop 150801 上課內容整理(一) - 環境架設

這天在摩茲工寮有一個一天的 cython workshop,最近因為開發 SOLVCON 所以開始需要寫一些 cython ,加上講師陣容看起來很堅強,所以毫不猶豫就報名了。

環境架設


這次 workshop 使用 vagrant 來準備測試用的環境。這算是我第一次用 vagrant。對於 vagrant 架設測試環境的快速與簡易,感到有一點小小驚喜。大致來說,vagrant 提供一個方便操作的前端,用 virtual box 來做實際的虛擬環境;網路上已經有很多介紹 vagrant 的文章,我在這裡就不多加描述。

我自己的筆電是 Ubuntu 14.04,接下來所有的操作與描述都是基於這個環境。

在 host machine 裝 virtual box 和 vagrant


安裝 virtual box


使用 Ubuntu 的軟體中心搜尋 virtual box 或是使用指令

sudo apt-get install virtualbox

如果在 virtualbox 的執行不太正常,請確定系統中在安裝完 virtualbox 之後,有 virtualbox-dkms 這個套件。確保 virtualbox 和你當下的 kernel 版本能夠很好地合作。

安裝 vagrant

sudo apt-get install vagrant

(這麼好裝,是時候喊一下「我愛 debian-based 的套件管理!」)

取得上課用的 source code


git clone https://github.com/yungyuc/cythonup.git

如果上面的 branch 失效,可以改用我對這個 git branch 的 fork

git clone https://github.com/tai271828/cythonup.git

取得上課用的測試環境 image


課堂上已經有提供包好的 image ,使用 debian jesse 64 bit。
把這個 image 和相關設定檔 copy 到同一個目錄,
然後匯入 vagrant 就好。
匯入 vagrant 的指令:
vagrant box add debian/jessie64 ./package.box
package.box 是講師事先準備好的 image 名字。debian/jessie64 是稍早從上面 github 取得的 vagrant 設定檔 Vagrantfile 裡面寫死的名稱。

因為我沒有附上上課的 image,這裡提供一個另外的方法取得 image。我沒試過這些方法,大概會遇到一些問題。只是打算提供讀者一些可能可以用的資源。這個連結裡面有一些別人事先準備好的 image (請注意我沒有驗證過這個網站和 image 的安全可靠性),使用下面這個指令去取得 image,注意請盡量也是選擇和課堂一樣的 jesse 作為 image,盡量讓差異少一些。使用下面的語法把 image 匯入 vagrant:
vagrant box add {你想要的Box名稱} {下載網址,請見上面連結}
我大概可以預期至少會遇到某些套件缺少或是相依的問題,應該少什麼裝什麼大概就可以解決掉大部分的問題。vagant 似乎也有提供官方下載的站台,我試了一下覺得要從台灣下載實在太慢了,沒耐心等他跑完。

啟動 vagrant


到有 Vagrantfile 的同一個目錄下,執行
vagrant up

啟動 ipython notebook server

因為講師打算使用 ipython notebook 作為講義,所以我們來開啟一個這樣的 server 來閱讀講師提供的講義。

透過 ssh 進去 vagrant 準備好的虛擬環境

vagrant ssh

在此虛擬環境中啟動 ipython notebook server

vagrant@debian-jessie:~$ ipython notebook --ip "*" --no-browser

這個指令的意思就是啟動 ipython notebook server,並且不要主動打開瀏覽器(因為我們不要在虛擬環境中打開瀏覽器)。啟動後,在 hostmachine 裡面打開你的瀏覽器,開始瀏覽

http://localhost:8888/

2015年7月16日 星期四

Debug C program on Ubuntu

很多 GNU 工具都是用 C 寫的,用這些工具用久了偶爾難免會踩到 bug ,在 Ubuntu 上有很完整的生態系可以協助開發者很快架設好除錯環境。

今天好像踩到一個 isoinfo 的 bug ,加上很久沒有這樣玩了(都在寫 python ,哈!),所以又重新走了一遍整個準備除錯環境的步驟,趁著記憶猶新趕快整理下來。isoinfo 這個指令來自 genisoimage 這個 debian package,下面我就直接用這個當範例。

取得 source code

apt-get source genisoimage

一步就完成了,真是貼心的服務。[1]


取得 debug symbol

Ubuntu 使用的 debian package 中,名稱帶有 -dbg 或是 -dbgsym 後綴者,都是對應 package 的 debug symbol。-dbg 通常在預設的 repository 就可以找到,-dbgsym 則是要從另外的 repository 取得,方法如下[2]:

加上新的 repository、取得公鑰[4]、更新 apt list、安裝:

echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ddebs.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01
sudo apt-get update
sudo apt-get install genisoimage-dbgsym[3]

準備 gdb

至此為止其實已經準備好除錯環境了,不過為了更輕鬆一點,我們可以把待會自己想要用的 gdb 指令寫成 script。

set substitute-path /build/buildd/cdrkit-1.1.11 /tmp/asdf/cdrkit-1.1.11
b 681
run

/tmp/asdf 是稍早我使用 apt-get source 時取得的 source code 路徑,set substitue-path 是告訴 gdb 不要使用 dbgsym 中提示的舊路徑(/build/buildd)而去用新的(/tmp/asdf);所謂的舊路徑是在某人的電腦上編譯 dbgsym 的時候對應到的放 source code 的路徑,他的環境當然跟自己的會不一樣,所以要稍微調整。

最後開始享受除錯的樂趣吧!

gdb --args isoinfo -R -i ./my-customized-image.iso -x /casper/filesystem.squashfs


[1] 嚴格來說應該要注意自己想要除錯的 binary 版本和 source code。這可以用 dpkg -l package 來查詢版號。
[2] https://wiki.ubuntu.com/DebuggingProgramCrash
[3] 當然也是有版號問題,不過範例中我知道我這樣拿下來會是我系統中對應的版號,所以我就省略了。
[4] 只是為了確定下載下來的 package 不是來路不明的東西。

2015年6月11日 星期四

解決 git 顯示中文檔名的問題

我的 daily system 使用 git 的時候,會有中文檔名顯示的問題,看起來像是:

$ git diff

diff --git "a/\346\210\221" "b/\346\210\221"
index f13588b..75050e9 100644
--- "a/\346\210\221"
+++ "b/\346\210\221"
@@ -1 +1,4 @@
 asdfasdf
+22222222

可以用下面的指令解決這個問題[2]:

git config core.quotepath false

原本上面的亂碼看起來就會是:

$ git diff
diff --git a/我 b/我
index f13588b..75050e9 100644
--- a/我
+++ b/我
@@ -1 +1,4 @@
 asdfasdf
+22222222
也就是說中文檔名「我」現在被正確顯示了。










[1] 不太確定有沒有關聯,但先記下我當時的系統語言環境變數是

$echo $LANG
en_US.UTF-8

[2] 查詢 git-config 使用手冊

man 1 git-config

core.quotePath
The commands that output paths (e.g. ls-files, diff), when not given the -z option, will quote "unusual" characters in the pathname by enclosing the pathname in a double-quote pair and with backslashes the same way strings in C source code are quoted. If this variable is set to false, the bytes higher than 0x80 are not quoted but output as verbatim. Note that double quote, backslash and control characters are always quoted without -z regardless of the setting of this variable.

Blogger 方便快速套用貼程式碼的方法:覆寫 Blogger 的 Quote 樣式

之前在使用 Blogger 貼程式碼的時候,都會手動切換到 HTML 編輯模式,然後插入下面語法:

<pre class="codeblock">
</pre>

這段標記會搭配我事先在 Blogger 準備好的 CSS 樣式:

.post .codeblock {
background-color: #eeeeee;
border: 1px dashed #999999;
color: black;
font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace;
font-size: 12px;
line-height: 14px;
overflow: auto;
padding: 5px;
width: 100%;
}

就成了之前大家看到的樣子。

但這種「手動切換到HTML 編輯模式,再手動找到程式碼,然後插入對應語法」的方式實在嚴重違反程式設計師的三大美德[1]之一的懶惰原則。本來想說看有沒有辦法在 Blogger 編輯模式下新增自己的小工具,後來乾脆心一橫直接覆寫原本 Quote 按鍵的樣式(反正我很少用到 Blogger 提供給我的樣式)。作法其實很簡單,也是事先準備好 CSS 範本就好,只要注意有使用到關鍵字 blockquote 即可[2]:

blockquote {
background-color: #eeeeee;
border: 1px dashed #999999;
color: black;
font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace;
font-size: 12px;
line-height: 14px;
overflow: auto;
padding: 5px;
width: 100%;
}
之後每次貼上程式碼後,只要用滑鼠選好區域,按下 Blogger 提供的 Quote 按鍵,就會套用我原本慣用貼程式碼的樣式了。

方便多了;寫文章就是要行雲流水才爽啊!Bravo!

[1] 設計師美德:懶惰、不耐煩、驕傲 - Programming Perl, Larry Wall
[2] 可參考:https://www.nosegraze.com/how-to-style-blockquotes/

chrome 異常:外觀變成大分頁(低解析度)workaround


昨天自己的 XPS 上的 Ubuntu trusty 系統更新後,一早開機發現 chrome 外觀整個大亂,即使是清掉系統快取、重新安裝之後也還是一樣,心想說天啊該不會跟什麼圖形渲染的函式庫衝突或是有臭蟲吧!!?? 幸好在網路上有找到一個適用於我的 workaround:

用終端機執行 chrome ,並且搭配下面的參數

google-chrome --force-device-scale-factor



使用 Chrome 一陣子之後變慢而且常顯示沒有正確關閉的 workaround


Ubuntu 14.04 上面使用 Chrome 一陣子之後,
會變很慢,或是有一些不太穩定的感覺。
而且在剛開機完後,
瀏覽器會顯示沒有「上次沒有正常關閉」。

解決變慢、變不穩定的 workaround

其實就是放大絕重裝。但是 chrome 提供的 debian rule 似乎沒有足夠完整,所以即使使用 apt-get purge 還是沒辦法清乾淨[1]。下面是我自己試出來、認為有效的方式,提供給大家參考。

首先使用下面指令把程式清除:

apt-get purge google-chrome

接著清除下面這些設定檔和快取[2]

$HOME/.cache/google-chrome
$HOME/.config/google-chrome
$HOME/.local/share/applications/chrome-*

之後再重新安裝 chrome 就會取得清爽多了的 chrome 了!!(雖然還是很吃記憶體)

常常顯示上一次沒有正確關閉

這是因為 chrome 預設會在背景持續跑, 可以透過 Unity 桌面右上角 chrome applet 選擇, 把背景跑 chrome 的功能關閉。 或是進到 chrome 的設定選項, 取消裡面類似的 checkbox 。 如果你的 Unity 桌面右上角沒有看到 chrome applet , 就可能表示你的 chrome 已經被你搞到很髒了[3], 可以考慮使用上面的方法清掉一堆系統上的快取、重新安裝 chrome 。 [1] 只用 apt-get purge 清除之後,立刻去 google 下載 chrome debian package 重新安裝的話,我們可以注意到很多設定、外掛等等其實都還在。 [2] 如果擔心造成系統不穩,記得先把這些檔案移到 [3] 自己曾經按照這個方法把快取位置改來改去,最後好像就把自己的系統搞髒了 XD

2015年5月31日 星期日

初探 Ubuntu Snappy


最近 Canonical 公司在 IoT 的浪潮下,也開始力推自己的系統,稱為 Snappy ;例如這個 Canonical 的創辦人在 youtube 的介紹影片。喜歡湊熱鬧的我,也跳進來攪和了一下,瞧瞧 Snappy 究竟是什麼。

這次湊熱鬧所選用的硬體為 Raspberry Pi 2 (RP2)。下面的 demo 主要是參考 Snappy 官方文件,加上一些個人心得。



事前準備

Snappy 在 RP2 上面目前(2015五月)還沒有官方釋出,不過已經有開發者準備好了移植到 RP2 的映像檔案,可以從這裡下載,取得映像檔 pi2.img.gz 。解壓縮後取得檔案 pi2.img ,將 pi2.img 透過指令 dd 寫入 micro SD 裝置 /dev/sdX (根據你的系統狀況,請自行用適當字串代換 sdX ) [1][2]

sudo dd if=pi2.img of=/dev/sdX

映像檔接近 4G ,讀寫要花上一點時間。如果想知道 dd 的進度,可以用這個技巧偷看一下寫入進度。讀寫完畢後,將 micro SD 插到 RP2 上面、開啟電源。預設帳號、密碼都是 ubuntu ,登入後就可以開始玩了。

因為設計上是給物連網 client 端產品使用,基於效能考量,當然不會有圖形介面。操作上可以選擇使用 RP2 的 HDMI 輸出,或是像我所採取的作法:第一次使用 HDMI 登入,登入後使用 ifconfig 取得 RP2 Snappy 的 IP ,之後都透過自己慣用的作業系統,透過 ssh 登入 RP2 Snappy 。RP2 Snappy image 已經將 ssh server 服務事先準備好,因此直接從慣用的作業連過去就好。[3] 例如使用這個指令(IP 位置視您的環境而定):

ssh ubuntu@<您的 RP2 Snappy IP>
ex.
ssh ubuntu@192.168.1.23



Let's party!!

接下來就是今天的重頭戲了。下達指令 snappy info

(RaspberryPi2)ubuntu@localhost:~$ snappy info
release: ubuntu-core/devel
architecture: armhf
frameworks: 
apps: 

release 和 architecture 分別就是 image release 版本和適用的平台類型,RP2 使用 ARM ,所以是 armhf 版本。frameworks 和 apps 分別是什麼意思呢? 望文生義, apps 很明顯就是 applications ,那 frameworks 呢?

簡而言之,根據官方文件,framework 在這邊指的是一個獨立的、因目的導向而事先配置好所需軟硬體資源存取管道的「環境」。

「獨立的」,意指各個 framework (與該 framework 下的 apps) 彼此之間不互相影響,所以可以顧及安全問題(檔案權限不會被亂改、存放密碼的檔案別人讀不到等)。

一般 IoT client side device,通常為了滿足某種目的,都會依照該目的,去設計、製造、配置所需的對應資源。例如,假設有個瓦斯洩漏偵測器,可以在偵測到一氧化碳時,將警告與一氧化碳濃度值送到我們的手機裡面。所以這個裝置,起碼必須要有一氧化碳偵測器、網路連線(此處假設我們選用乙太網路)。而一個這樣的瓦斯洩漏偵測器 framework ,就會保證所有在這個偵測器下的 applications ,可以取用到一氧化碳偵測器的讀數、和取用系統乙太網路資料。

說得落落長又很抽象,直接舉例,docker 就可以是一個提供 framework 服務的工具。

接著我們看一下這個 snappy 系統中,裝了什麼 snappy 套件

(RaspberryPi2)ubuntu@localhost:~$ snappy list
Name        Date       Version Developer 
ubuntu-core 2015-04-10 4                 
pi2         2015-04-15 0.11    lool

系統還很乾淨,就只有 ubuntu-core (官方文件稱這是一種 system-layer)和 pi2 (官方文件稱這個叫做 OEM snappy package or device) 而已。[4]

好吧!我們來裝 framework 和 app 吧!

framework 我們選擇使用 docker ;可以看出來裝了 docker 之後, snappy list 就多了這個 snappy package 。

(RaspberryPi2)ubuntu@localhost:~$ sudo snappy install docker
Installing docker
Starting download of docker.canonical
8.36 MB / 8.36 MB [====================================] 100.00 % 41.93 KB/s 
Done
Name        Date       Version   Developer 
ubuntu-core 2015-04-10 4                   
docker      2015-05-31 1.6.1.002           
pi2         2015-04-15 0.11      lool  
    
(RaspberryPi2)ubuntu@localhost:~$ snappy list
Name        Date       Version   Developer 
ubuntu-core 2015-04-10 4                   
docker      2015-05-31 1.6.1.002           
pi2         2015-04-15 0.11      lool      

請注意這時候已經有 framework docker 了[5]

(RaspberryPi2)ubuntu@localhost:~$ snappy info
release: ubuntu-core/devel
architecture: armhf
frameworks: docker
apps: 

app 我們選用 go-example-webserver

(RaspberryPi2)ubuntu@localhost:~$ sudo snappy install go-example-webserver
Installing go-example-webserver
Starting download of go-example-webserver.canonical
3.06 MB / 3.06 MB [================================] 100.00 % 44.75 KB/s
Done
Name                 Date       Version   Developer 
ubuntu-core          2015-04-10 4                   
docker               2015-05-31 1.6.1.002           
go-example-webserver 2015-05-31 1.0.7               
pi2                  2015-04-15 0.11      lool  
(RaspberryPi2)ubuntu@localhost:~$ snappy list
Name                 Date       Version   Developer 
ubuntu-core          2015-04-10 4                   
docker               2015-05-31 1.6.1.002           
go-example-webserver 2015-05-31 1.0.7               
pi2                  2015-04-15 0.11      lool    

這時候 apps 果然也補上了 go-example-webserver

(RaspberryPi2)ubuntu@localhost:~$ snappy info
release: ubuntu-core/devel
architecture: armhf
frameworks: docker
apps: go-example-webserver

go-example-webserver 是一個用 go 寫成、用來做 snappy 打包教學的 snappy 套件,原始碼可以在 Launchpad 上面找到。

當初以為裝了 go-example-webserver 以後,web server 的服務會自己啟動,搞了半天發現根本沒有自己啟動,不曉得這是 by-design 還是一個 bug 。最後我直接參考原始碼(裡面有 README),手動尋找執行 web 服務的指令、並且啟用服務:

尋找可能可以用的指令

root@localhost:/# find ./ -name go-example-webserver
./var/lib/apps/go-example-webserver
./writable/system-data/var/lib/apps/go-example-webserver
./writable/system-data/apps/go-example-webserver
./writable/system-data/apps/go-example-webserver/1.0.7/magic-bin/go-example-webserver
./writable/system-data/apps/go-example-webserver/1.0.7/magic-bin/arm-linux-gnueabihf/go-example-webserver
./writable/system-data/apps/go-example-webserver/1.0.7/magic-bin/x86_64-linux-gnu/go-example-webserver
./apps/go-example-webserver
./apps/go-example-webserver/1.0.7/magic-bin/go-example-webserver
./apps/go-example-webserver/1.0.7/magic-bin/arm-linux-gnueabihf/go-example-webserver
./apps/go-example-webserver/1.0.7/magic-bin/x86_64-linux-gnu/go-example-webserver

這裡有兩點滿有意思,第一是 /var/lib/apps/go-example-webserver 是空的,不曉得在其他 Snappy package 中,實際上會放入什麼樣類型的檔案。第二是整個 app 程式似乎就是集中在 /apps 這個資料夾裡。

找到疑似可以用的可執行檔後,直接給他執行下去啦!

(RaspberryPi2)ubuntu@localhost:/apps/go-example-webserver/1.0.7$ ./magic-bin/go-example-webserver 
snapp_name: go-example-webserver
snapp_bin: go-example-webserver
snapp_dir: /apps/go-example-webserver/1.0.7
snapp_org_bin: go-example-webserver
plat_abi: arm-linux-gnueabihf
2015/05/31 10:06:53 Starting webserver on :8081

最後開啟本地端(不是 RP2 ,而是,例如說,你慣用的作業系統)的瀏覽器,瀏覽器 url 填入 RP2 的 IP ,port 8081 (這是上面執行時,程式告訴我的)。一切順利的話,應該就可以看到下面的畫面。另外,在 RP2 中可以使用 ctrl+c 以中斷程式伺服器服務的運行。





[1] 注意!!這個指令在使用之前務必確定知道自己在做什麼。這個指令操作錯誤的話有可能抹除您系統裡面的資料。

[2] 如果使用上有問題,例如 Snappy 操作起來怪怪的,像我遇到的問題就是明明已經把 docker 裝上去了,但是 snappy list 卻看不到這個訊息。遇到這種情況的話,可以試試 dd 前先把 micro SD 上面的 partition 全部清掉之後,再用 dd 寫入。寫入完畢後,下達兩三次 sync 指令,確認所有必要的訊息都寫進 micro SD ,再將 micro SD 退出、插到 RP2 上面。

[3] 在這之前,當然要先確定慣用的作業系統和 RP2 在同一個、彼此可以看見彼此、允許 ssh 通訊 port 的網域。

[4] 根據官方文件,在未來 system-layer 和 device package 會整合成一個 snappy package 。

[5] Snappy for RP2 似乎不太穩定;有時候我明明已經裝了 docker ,但是把系統放在那邊一陣子,大約二十分鐘, snappy info 卻看不到 docker 了。reboot 之後再安裝一次 docker 還會報錯。不太確定是不是自己有哪裡不清楚,或是真的是一個 bug ;需要更多測試與資訊。

2015年5月29日 星期五

找不到,等於沒有擁有 - 談日常生活中的知識管理 (一)(針對日期使用 find 指令)

檢索能力,其實本質上是提高自己行事效率的手段之一:自己不必重新蒐集、思考自己曾經從資訊中提煉出來、成為知識的東西。在資訊爆炸時代的現在,四周有著更多 buzz words 、各種產業、技術不斷地翻新,前進速度不夠快、一直耗在重新提煉舊知識的人,最終就是跟不上時代。因此,在當代,檢索能力更顯得重要。

出處我已經想不起來了,記得很久以前,曾經聽來一句話,大意是說

「當你需要使用的時候,卻沒辦法找出來的資訊、物品,等價於你沒有擁有他」

這句話滿深刻地改變了我的一些生活哲學,包括自我知識庫(包括照片等回憶)的管理。現在我在評估檢索資訊效率時,所採納的標準為:「自己需要的資訊,能不能夠從自己的知識庫中,在九十秒內取出。如果不能,該次知識的建立就是失敗的。」

小學還是國中時做的剪報(天啊好老派),過去重新取用裡面資訊的次數大概一隻手數得完,而且,裡面的資料我幾乎只能從第一頁翻到最後一頁才能決定哪些是我要的資訊。這顯然是個非常失敗的建立自我資料庫行為。類似這樣不斷囤積資料的習慣在我的一生中持續地進行著至今。幸好,今日資訊系統的軟、硬體效能與普及率,已經不像是當年,那個可能只能選擇剪報的時代,而因此讓我可以不斷改進自己的檢索方式。

從這篇起,我打算陸續整理一些自己日常生活中,所使用的知識管理方式。這些方式不一定是最好的方式,所以也歡迎大家批評、賜教。




案例:

  • 我想要找一張某次我收看網路直播的活動時,自己的螢幕截圖。


手上有的索引資訊:
  • 不記得自己的螢幕截圖是否有好好重新把檔案命名,以便索引。
  • 記得活動名稱、當時的主持人名字。
  • 不記得活動日期。

檢索過程:

  • 手動大概翻一些可能的資料夾未果。不願意投入更多時間成本做土砲搜尋。
  • 大概用關鍵字對自己的電腦做搜尋,但因為知道不記得自己的螢幕截圖是否有好好重新把檔案命名
  • 使用活動名稱、當時的主持人名字,因此取得活動時大概的日期。
  • 使用日期,在可能的資料夾下,針對檔案更動、讀寫日期做搜尋。請見下面指令。
  • 只有不到十筆資料,經檢視後順利取得自己想要的圖片。
find ./Documents/ ./Pictures/ -type f -newermt 2011-09-22 ! -newermt 2011-09-23




指令參考:
http://stackoverflow.com/questions/158044/how-to-use-find-to-search-for-files-created-on-a-specific-date

2015年5月25日 星期一

64-bit Ubuntu booting failure - workaround

A known UEFI BIOS issue like Bug No. 1444834 of Launchpad[1] will make systems failed to boot. A workaround[2][3][4] is:

1. cp /EFI/ubuntu/*.efi /EFI/boot/
2. mv /EFI/boot/shimx64.efi /EFI/boot/bootx64.efi
3. reboot. then you should boot into the system.


[1] install 64-bit Ubuntu on a 64-bit machine with UEFI mode.
[2] https://www.facebook.com/groups/ubuntu.zh.hant/permalink/897991146922875/
[3] Thanks for the trick! $4!
[4] Facebook is so hard to search. This is creating a knowledge black hole.






在 UEFI 模式下安裝 Ubuntu 如果遇到像是 Bug No. 1444834 of Launchpad[1] 這種本質上是 BIOS 的臭蟲導致不能順利開機時,可以試試這個 workaround[2][3][4]:

1. cp /EFI/ubuntu/*.efi /EFI/boot/
2. mv /EFI/boot/shimx64.efi /EFI/boot/bootx64.efi
3. 重開機。這樣就可以順利進入系統了。

[1] 在 64 位元的機器上、使用 UEFI mode 安裝 64 位元版本的 Ubuntu
[2] https://www.facebook.com/groups/ubuntu.zh.hant/permalink/897991146922875/
[3] 謝謝 $4 提供 workaround
[4] 使用臉書做搜尋效果很差,這正在導致知識黑洞的產生。

2015年5月1日 星期五

正規表示式:描述「空白或是數字」




今天遇到一個 bug:一個用來抽取 iso 檔案並加以分析的 python script,錯誤回報說在該 iso 找不到必要的檔案 intrd.lz ,但我手動使用指令去抽取該 iso 檔,確認了裡面明明就有這個檔案。

後來發現 bug 在於以往成功提取資訊的時候,該 script 利用下面正規表示,分析下面的字串:

file_re = re.compile(

    "(?P[ldrwx-]{10})\s+\d+\s+\d+\s+\d+\s+\d+\s[A-Za-z]{3}"+ 

    "\s+\d+\s\d+\s+\[\s+\d+\s\d\d\](\s\s(?P.*))?")

其實就是這串

(?P[ldrwx-]{10})\s+\d+\s+\d+\s+\d+\s+\d+\s[A-Za-z]{3}\s+\d+\s\d+\s+\[\s+\d+\s\d\d\](\s\s(?P.*))?

去分析

-r--r--r--   1    0    0        16242610 Aug  9 2013 [ 601511 00]  initrd.lz

目的是希望可以分別找出匹配字串「-r--r--r--」與「initrd.lz」。


而出問題的是,當 script 嘗試去分析這個字串的時候,沒有得到預期的答案。

-r--r--r--   1    0    0        16437443 Nov 12 2013 [1062241 00]  initrd.lz

請注意會引起問題的字串中,有個被標示成紅色的「1」,相對於不會引起問題的字串,那個地方是個空白。所以要解決這個 bug ,只要把原本硬性描述「該空白處必須是一個或是多個空白」而使用「\s+」,換成「該地方可以是空白或是數字」。

以下兩個方法在這個問題中等價,都可以匹配出第一個 pattern 是 「-r--r--r--」而第二個是「initrd.lz」。

原本的字串:標紅色表示要被修改的部份

(?P[ldrwx-]{10})\s+\d+\s+\d+\s+\d+\s+\d+\s[A-Za-z]{3}\s+\d+\s\d+\s+\[\s+\d+\s\d\d\](\s\s(?P.*))?



解法一:改成「一個空白」加上一個星號

(?P[ldrwx-]{10})\s+\d+\s+\d+\s+\d+\s+\d+\s[A-Za-z]{3}\s+\d+\s\d+\s+\[ *\d+\s\d\d\](\s\s(?P.*))?



解法二:注意「0-9」的前面也有一個空白,使用數字 5、8 是給實際數字位數一點容忍量,在這個案例中,一個 7 就夠用了。

(?P[ldrwx-]{10})\s+\d+\s+\d+\s+\d+\s+\d+\s[A-Za-z]{3}\s+\d+\s\d+\s+\[[ 0-9]{5,8}\s\d\d\](\s\s(?P.*))?



附錄資料:

  • 好用的線上正規表示式解讀器;若完全只用人腦翻譯真的實在太辛苦了。
  • https://atedev.wordpress.com/2007/11/23/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F-regular-expression/
  • http://notepad.yehyeh.net/Content/Program/RegularExpression/8.php
  • http://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
  • http://stackoverflow.com/questions/18701992/regex-space-or-no-space
  • python 2 的 re module 說明文件
  • 簡易語法參考:
    • \s 一個空白,\s+ 多個空白
    • \d 一個數字,\d+ 多個數字
    • \[ 跳脫字元和一個「[」,表示我想要匹配「[」
    • * 星號表示星號前面的元素有沒有出現、而且可以出現多次。一個空白加一個星號就是「有沒有空白無所謂,也可以有多個空白」
    • [ 0-9]{5,8}  允許一個空白(注意 0 前面有個空白)、數字零到九,並且只匹配出現那樣的元素 5 到 8 個。


2015年2月26日 星期四

推薦樂理學習網站

很棒的樂理學習網站
http://www.musictheory.net/


優點有:

  1. 對於一個概念的解釋循序漸進、拆解成一個個足夠小到可以輕易理解的步驟來說明。
  2. 每一個解釋、分析與說明都會等你說「下一個動作」才開始。
  3. 一個音、一個和弦、一段和弦級進,都有對應的音效可以播放。

例如:
基本和弦分析
http://www.musictheory.net/lessons/52
基本和弦級進分析
http://www.musictheory.net/lessons/62
http://www.musictheory.net/lessons/122

除了上述教材外,
另外也有提供作業和評分以供練習和驗收。



這網站簡直就是教學神器啊~XD
似乎非常適合拿來教學生用。