2012年8月1日 星期三

[shell script] 列出所有檔案

[shell script] 列出所有檔案

今天要把一堆檔案轉檔,所以用了 avconv + shell script

首先要列出要轉檔的檔案,根據以前的印象我就這樣寫了

for i in $(ls)
do
    echo $i
done

在一些情況下他應該可以正常運作,

可是...這些檔案有空白阿...所以變數 i 就會拿到不完整被空白分開的檔名。

網路上查到了一些用 find, print... 的解法,看起來都超複雜的...

最後找到了這個

for i in *
do
    echo
done

這個寫法可以用在 bash sh

另外 csh tcsh 可以這樣寫

foreach i (*)
    echo $i
end

原來可以這樣寫...太棒了!

2012年7月29日 星期日

[Linux] 關閉螢幕

[Linux] 關閉螢幕

通常筆電上都有個 Fn + F? 可以把螢幕關掉省省電之類的,

可是現在在用的 x220 沒有阿,在 windows 好像可以用 thinkpad 的軟體把

Fn + F3 設定程關閉螢幕,只是在 Ubuntu 下他就只能跳出電源統計 Orz。

目前找到了兩個方法:

一個是 xset 另一個是 vbetool

xset dpms force off

螢幕會關閉,而且鍵盤、滑鼠移動的時候就會喚醒螢幕。

所以剛好拿來給快速鍵用,我把他綁到 ThinkVantage 上。

sudo vbetool dpms on
sudo vbetool dpms off

這個需要權限而且不會自動喚醒,不過還是提一下。

2012年7月13日 星期五

github push 時仍然需要帳號密碼

github push 時仍然需要帳號密碼

有一天在把改好的東西 push 到 github 上時發現還是需要輸入帳號密碼。

可是我已經將 public key 放到 github 上了,主機上也有對應的 private key,

而我在其他電腦上也作過相同的事,卻不需要帳號密碼。

找不到原因的情況下只好求助 CrBoy 大大,

經過大大的提點以後發現我的 remote url 所用的是 https 的而不是 ssh 的,

這應該是跟在 clone repo 時所使用的 url 有關。

其中一個修改方法是在 repo 中的 .git/config 裡修改,

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
# ssh
url = git@github.com:float-tw/float-blog
# https
url = https://github.com/float-tw/float-blog.git

將 url 的部份由 https 改為 ssh 就可以了,而 url 寫法可以在 github 的 repo 頁面找到。

2012年7月4日 星期三

Run B2G on Desktop

Run B2G on Desktop
如果想玩玩看 B2G 卻沒有手機怎麼辦?
沒關係,在電腦上玩,除了使用模擬器以外還有例外的選擇,
其中一個是編譯一份電腦上可以跑的 B2G 。

環境

我所使用的環境是 Ubuntu 12.04 LTS x86_64

download source

要在電腦上跑起 B2G 需要兩個部份,
一個是 B2G 的主程式,另一個是 gaia 也就是 B2G 的使用者界面。
$ hg clone http://hg.mozilla.org/mozilla-central
$ git clone https://github.com/mozilla-b2g/gaia.git

build

B2G

B2G 的部份我們需要先建立一個設定檔 .mozconfig
下面是我所使用的設定
mk_add_options MOZ_MAKE_FLAGS="-j6"
mk_add_options MOZ_OBJDIR=../build

ac_add_options --enable-application=b2g
ac_add_options --enable-debug
ac_add_options --enable-profiling
ac_add_options --with-ccache=/usr/bin/ccache
MOZ_OBJDIR 的部份是設定編譯後檔案存放的位置,不指定的話會放在 mozilla-central 下的 obj-xxxxx
MOZ_MAKE_FLAGS 設定編譯的參數, -j 接的數字是同時執行的 jobs 數量,適當調整可以加快編譯的速度
--enable-application=b2g 這邊設定所要編譯的程式( mozilla-central 包含了 Firefox, Thunderbird, B2G 等)
--with-ccache=/usr/bin/ccache 是使用 ccahe 來加快編譯,詳細內容可以參考 這篇
寫完設定檔後就可以開始編譯了,Makefile 是 client.mk
$ make -f client.mk
整個編譯的過程需要大約半小時左右吧,另外如果有缺少編譯需要的套件,
就安裝一下吧,我是沒遇到,大概裝了太多東西了....

gaia

編譯 gaia 前呢先設定兩個環境變數,一個是 gaia repo 的位置,
另一個就跟他的名稱一樣是 gaia 的 domain
$ GAIA=PATH_TO_GAIA_REPOSITORY
$ GAIA_DOMAIN=gaiamobile.org
接下來就可以編譯了
$ DEBUG=1 make
DEBUG=1 可加可不加,主要就是影響一些 debug 訊息

執行

完成 B2G 和 gaia 的編譯以後就可以執行了!
不過在執行前先設定一下 /etc/hosts 在裡面加上
127.0.0.1     gaiamobile.org
127.0.0.1     homescreen.gaiamobile.org
127.0.0.1     dialer.gaiamobile.org
127.0.0.1     sms.gaiamobile.org
127.0.0.1     browser.gaiamobile.org
127.0.0.1     maps.gaiamobile.org
127.0.0.1     camera.gaiamobile.org
127.0.0.1     gallery.gaiamobile.org
127.0.0.1     video.gaiamobile.org
127.0.0.1     market.gaiamobile.org
127.0.0.1     music.gaiamobile.org
127.0.0.1     settings.gaiamobile.org
127.0.0.1     clock.gaiamobile.org
127.0.0.1     crystalskull.gaiamobile.org
127.0.0.1     penguinpop.gaiamobile.org
127.0.0.1     towerjelly.gaiamobile.org
127.0.0.1     wikipedia.gaiamobile.org
127.0.0.1     cnn.gaiamobile.org
127.0.0.1     bbc.gaiamobile.org
127.0.0.1     nytimes.gaiamobile.org
127.0.0.1     calculator.gaiamobile.org
127.0.0.1     system.gaiamobile.org
後面的 gaiamobile.org 則依前面設定的 GAIA_DOMAIN 而定
之後移動到 B2G 的執行檔位置,他會在所設定的 MOZ_OBJDIR 底下的 dist/bin/
$ cd MOZ_OBJDIR/dist/bin
不要移動過去也是可以,我們要執行的就是底下的 b2g 這隻程式
執行時幫他加上 gaia profile 資料夾的位置(profile 會在 gaia make 的時候產生)
$ ./b2g -profile GAIA/profile
上面兩個步驟的 MOZ_OBJDIRGAIA 請自行更換成對應的路徑,
如果沒有意外的話就會看到 B2G 的 screen lock 了
https://github.com/float-tw/float-blog/raw/master/img/b2g_desktop_screenshot.jpeg -profile 的部份我的了解是他會利用後面的 profile 在本機上執行 service,
所以在 netstat 可以看到幾個由 b2g listen 的 port
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:2828          0.0.0.0:*               LISTEN      13371/b2g
tcp        0      0 127.0.0.1:5037          0.0.0.0:*               LISTEN      4702/adb
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      13371/b2g
tcp        0      0 127.0.0.1:4242          0.0.0.0:*               LISTEN      13371/b2g
這時除了在 b2g 本身的界面運行外,也可以試著用其他瀏覽器去連看看,
網址會是 appname.gaiamobile.org:8080 不過基本上要用 Firefox 15 以上才會有比較正常的效果。
如果想要自己丟一個 app 進去試試看的話,現在的 gaia/apps 底下有一個 template 的資料夾,
就是一個空的 app 可以參考他,以及其他其他底下的 app 來寫 manifest.webapp 這個檔案,
app 部份就主要是 HTML 和 javascript ,寫好後放在 gaia/apps 底下後重新 make 即可。
至於 app 的詳細寫法因為不是本篇重點便不詳述。
在參考資料的 gaia hacking 中也有其他多種除了在手機上執行 b2g 以外的方式,
另外如果執行上碰到什麼問題可能是我寫錯的地方也請留言指教,謝謝。

補充

操作的部份
滑鼠
上一頁: esc
Home: home
音量: page up/down
沒找到 power 如果有人找到可以通知我補充一下嗎?謝謝

2012年6月30日 星期六

Git GnuTLS handshake error

在 Ubuntu 11.10, 12.04 底下用 git clone https 的 project 時看到了這個錯誤

error: gnutls_handshake() failed: A TLS packet with unexpected length was received

最簡單的解決方法是改用 http 就可以避開這個問題,

另外的解決方法是把 git 重新編譯,好像是因為 ubuntu 預設的 SSL 是使用 GnuTLS

而 GnuTLS 在處理某些網站的時候會有錯誤 [1]

重新編譯改用 OpenSSL 就可以解決這個問題,下面簡單的編譯流程,和我遇到的問題

首先先不要急著把你的 git 移除,先拿他來下載最新的 git source cdoe

git 官網提供的也是 https 的,自己把他改成 http

$ git clone http://github.com/git/git.git

把 libcurl4-gnutls-dev 換成 libcurl4-openssl dev

$ sudo apt-get install libcurl4-openssl-dev

這時候應該會順便把 libcurl4-gnutls-dev 移除,

同時也可以安裝一下編譯需要的程式、函式庫可以參考 git 資料夾下的 INSTALL 後半段,

或是編譯的時候在依照錯誤訊息去安裝。

編譯流程

$ make configure
$ ./configure
$ make all doc
# make install install-doc install-html

這邊我遇到的問題是,如果照著 INSTALL 裡的 $ ./configure --prefix=/usr

編譯出來的程式還是有相同的問題,不要加或是用 --prefix=/usr/local 才行

要編譯 doc 的話要安裝 ASCIIDOC 而 doc 編譯的時間看起來比 git 本身還久 Orz

在 install 前可以先拿編譯完在 git 資料夾下的 git 測試看看,如果沒有相同的 error 後,

再把原本的 git 移除,移除後在以 root 安裝

2012年6月21日 星期四

Build and Install B2G

Build and Install B2G

環境

括號為官方建議

  • Ubuntu 12.04 LTS x86_64 ( 11.10 x86_64 )
  • 2GB RAM ( 4GB )
  • 10GB swap space ( at least 4GB )
  • at least 80GB hard disk space
  • Samsung Nexus S GT-I9023 with ICS-kernel ( Samsung Nexus S[I9020,I9023], S2[I9100] )

需要的 tools

$ sudo apt-get install ia32-libs gcc-multilib g++-multilib bison \
flex gperf lib32z1-dev lib32ncurses5-dev lib32ncursesw5-dev \
libidl-dev lib32gomp1 autoconf2.13 ccache libx11-dev \
lib32readline-gplv2-dev lib32tinfo-dev

先安裝 java jdk 方便後面的步驟

$ sudo apt-get install openjdk-6-jdk

安裝 Android SDK

先到 Android SDK starter package 下載

解壓縮後執行 $ ./android-sdk-linux/tools/android

然後僅勾選頁面中的 Android SDK tools, Android SDK platform-tools 後,點選右下角的 Install 2 packges...(數字是由勾選的數目決定)

完成安裝後在 ~/.bashrc 中更新 PATH 方便使用

# in ~/.bashrc
# 依照 Android SDK 放置的路徑調整
PATH=$PATH:/path_to_android-sdk-linux/platform-tools
export PATH

將手機的 USB debugging 打開,應該在 應用程式->開發->USB 偵錯

接著設定 /etc/udev/rules.d/51-android.rules

#in /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="04e8", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", MODE="0666"

編譯

這部份和之後的刷機官方的說明有修改過,用幾個 script 通包了,還像蠻懶人包的,

原本是用 Makefile 那我還是依照當初用 Makefile 的作法介紹(這部份也沒有很複雜),

script 的部份可以參考官方文件

Preparing_for_your_first_B2G_build

Building_Boot_to_Gecko

首先從 github 下載 B2G 專案

git clone https://github.com/andreasgal/B2G.git

在這邊 git 我有遇到一個問題,當從 https clone 的時候會有錯誤

error: gnutls_handshake() failed: A TLS packet with unexpected length was received

改成 http 可以暫時解決這個問題,不過後續還很多 https 的部份,

我查到的解決辦法是把 git 抓回來自己重新編譯。

接下來 Makefile 的部份也可以參考 B2G 專案下的 INSTALL

首先把完整的專案下載

$ cd B2G
$ make sync

接著 config ,不同手機要用不同的,這邊以 Nexus S 做範例

$ make config-nexuss-ics

由於 gonk-ics 並沒有包含在前面 sync 完專案中所以這個步驟還會去作 make gonk-ics-sync

上面兩個部份都非常花時間,一兩個小時以上跑不掉,在加上 sync 錯誤的話要重作幾次,

建議在網路狀況好一點的時後做,或是睡前(不過就怕起來看到錯誤...)

完成以後就可以開始編譯 gonk

$ make gonk

這步驟也是有點久的,完成後編譯其他部份

$ make

刷機

首先把手機解鎖, Makefile 裡面連這個也有,夠懶吧

$ make unlock-bootloader
或是想要自己來
$ fastboot oem unlock

這邊要提一下,幾乎全部寫在 Makefile 中的動作都是當作手機是開機的狀態,

所以如果需要進 bootloader 他會先 adb reboot bootloader

如果手機已經在 bootloader 下的話會錯誤,就先把手機正常開機吧。

然後就可以開始刷機了,嗯這個也都寫好好了

$ make flash-only

這邊完成後手機就會重新開機到 B2G 底下了,不過看到的應該是 Server not found 的畫面,

因為 gaia 還沒安裝,所以接著安裝 gaia

$ make install-gaia

這個步驟會去把 gaia 裡的 home, apps 做快取然後手機上,所以如果不想在上面看到一堆程式,

可以在 B2G/gaia/apps 底下刪掉,想放進自己寫也可以丟進去。

這樣就完成了。

因為有些部份是照印象寫的,如果有漏掉或錯誤的部份煩請告訴我一下,謝謝。

2012年6月19日 星期二

Build Android-ICS Kernel for Nexus S

Build Android-ICS Kernel for Nexus S

環境

  • Ubuntu 12.04 LTS x86_64
  • GNU make 3.8.1
  • Git 1.7.11.rc2
編譯環境需求可以參考 http://source.android.com/source/initializing.html
ps. 有部份完整編譯 android 所需要的。

下載source

首先要先找到想要編譯 kernel 的 git log 這邊必須下載 drvice project
而 project 命名方式是 device/<vendor>/<name>
而 Nexus S 是 samsung 出的然後名字叫 crespo
$ git clone https://android.googlesource.com/device/samsung/crespo
$ cd crespo
$ git log kernel
之後可以在 git log 裡面找所需要的 commit
接下來下載 kernel source
$ git clone https://android.googlesource.com/kernel/samsung.git
下載、設定 toolchain
$ git clone https://android.googlesource.com/platform/prebuilt
$ export PATH=$(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH

編譯

$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ cd samsung
$ git checkout <commit_from_first_step>
$ make herring_defconfig
$ make menuconfig
$ make -j$(($(grep -c processor /proc/cpuinfo) * 3 / 2))
make herring_defconfig使用預設的設定
make menuconfig再去做所需要的調整(像我是想開啟 Oprofile 的支援)
<commit_from_first_step>的部份就是在前面 git log 裡找到的 commit
make 加上 -j 加速一下編譯,
完成後就可以在 samsung/arch/arm/boot 底下找到 zImage 了
至於解開 boot.img 更換 zImage 在重新打包的步驟可以在參考資料的後兩篇找到。
燒錄所需要的 adb, fastboot 可以下載 android sdk