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

2012年6月15日 星期五

xdotool 簡單介紹

xdotool

原本希望找個程式幫我重複做幾個無聊的動作,

而一開始想到的東西是 sikuli ,而無奈他執行的時候一直 carsh,

另外花時間解決這個問題感覺不太符合效益,所以就找到了這個東西。

簡介

套件說明:simulate X11 keyboard/mouse input

也就是在 X Windows 下模擬鍵盤和滑鼠的輸入

安裝

ubuntu/debian

sudo apt-get install xdotool

其他可以參考 xdotool 的 project 頁面

範例

鍵盤輸入 a

xdotool key a

按住 a 放開 a

xdotool keydown a
xdotool keyup a

滑鼠移動到 (100, 200) 的位置

xdotool mousemove 100 200

按下滑鼠左鍵(左鍵:1、滾輪:2、右鍵:3、滾輪上/下:4/5)

xdotool click 1

按住滑鼠放開滑鼠

xdotool mousedown
xdotool mouseup

取得目前滑鼠位置

xdotool getmouselocation

各個動作下還可以加上一些參數,下面一個 man page 裡的例子

送出 ctrl + c 到所有 title 是 'gdb' 的視窗中

xdotool search --name gdb key ctrl+c

比較詳細的資料可以參考 man page 中的說明

執行方式

執行方式大概有下面幾種

直接下命令

像上面範例中的作法一樣,直接在 CLI 上輸入

xdotool click

從檔案中讀取指令

xdotool filename

從標準輸入(stdin)讀取

可以搭配 redirection 來從檔案中讀取

xdotool -
xdotool - < filename

寫成 script

#!/usr/bin/xdotool

mousemove 100 200
click

其他

有一 xdotoolgui 的東西,似乎是可以直接用來編輯 xdotool 的命令,

不過我的需求沒有很複雜,而也他也不再套件庫中,所以我就沒有深入研究。

2012年6月10日 星期日

Graphviz

Graphviz

介紹

Graphviz是一套open source的圖形視覺化軟體,
簡單的來說我們可以用文字描述nodes之間的關係,就可以將圖畫出來。

安裝

Graphviz官網的Download頁面就可以下載到各作業系統的版本,
包含Linux, Solaris, Windows, Mac。
如果是Linux的話也可以直接從套件庫安裝,以Ubuntu/Debian為例的話
sudo apt-get install graphviz

語法

Graphviz是是使用一種稱作dot語言的圖形描述語言來描述圖形,
而在Graphviz中又分為無向圖和有向圖,底下各舉一個範例。
  • 無向圖
graph G
{
        A -- B;
}
上面的code可以畫出下面這張圖
https://github.com/float-tw/float-blog/raw/master/img/undirected_graph.jpg
  • 有向圖
digraph G
{
        A -> B;
}
這段則可以畫出下面這張
https://github.com/float-tw/float-blog/raw/master/img/directed_graph.jpg
有向圖和無向圖的差異主要有兩個地方,第一個是宣告圖形的關鍵字,
無向圖是graph,有向圖是digraph,另一個是圖形連接用的符號,
無向圖是用--,有向圖是用->

編譯方式

Graphviz包含了dot, neato, circo, twopi, fdp, dotty, lefty等工具,
其中dot, neato, circo, twopi, fdp都是產生圖形的工具,差異是產的圖形的方式不同,
dotty,lefty則是圖形化的修改工具。
以dot來舉例,假設輸入檔案為input.dot,希望輸出jpg格式的檔案,命名為output.jpg,
可以用下面兩種方式:
dot -T jpg input.dot -o output.jpg
or
dot -T jpg input.dot > output.jpg

形狀和排列

有時候輸出的圖形可能和我們想像的不一樣,像是
digraph G
{
        a -> b;
        a -> c;
}
https://github.com/float-tw/float-blog/raw/master/img/graphviz_ex1.jpg
如果希望a和b可以擺在相同高度,那可以這樣修改
digraph G
{
        a -> b;
        a -> c;
        {rank=same; a; b;}
}
https://github.com/float-tw/float-blog/raw/master/img/graphviz_ex2.jpg
另外,node和arrow等等的形狀、顏色都是可以修改的在document裡面可以找到很多範例
下面隨便舉個例子(從node-shape的範例修改)
digraph G
{
        rankdir=LR
        node [shape=box, color=blue]
        node1 [style=filled]
        node2 [style=filled, fillcolor=red]
        node0 -> node1;
        node1-> node2[arrowhead=vee];
}
https://github.com/float-tw/float-blog/raw/master/img/graphviz_ex3.jpg