2012年6月20日 星期三

把玩 Linode 筆記


在強者型男同事的勸敗下,我也花了錢試用一下。由於逢 Linode 週年慶,新註冊的會員可以得到 $100 的折扣,以最便宜的 Linode 512 機器來說,折扣大約可以多用五個月,所以,花了約台幣 860 元買了近 40 天的使用期( month to month, 從06/20算到07/31價錢),加上折扣後大概可以用快半年吧?!


接著,挑選了 Japan 位置、Ubuntu 12.04 LTS 64bit 環境。雖然 Linode 512 只有 512MB、20GB的使用空間,但為了開發系統的一致性,還是選用了 64Bit 的環境,而 20GB 的空間是包含整個 OS 運作的系統空間,例如網頁上還須指定 swap 的大小,我選擇最大的 512MB ,或許往後計算量大時,可能有所幫助吧?


初次使用,更新系統:


$ sudo vim /etc/apt/sources.list
:%s/\/\/us\./\/\/jp\./g
$ sudo apt-get update && sudo apt-get upgrade
$ df -h


Filesystem Size Used Avail Use% Mounted on
/dev/xvda 20G 590M 18G 4% /
devtmpfs 243M 4.0K 243M 1% /dev
none 49M 176K 49M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 244M 0 244M 0% /run/shm


更新後,還有 18GB 的空間,並在 Linode 網站上查詢,可以知道用了多少網路流量下載軟體(約50MB)。


接著設定安全性的部份:


$ sudo apt-get install denyhosts mutt
$ vim /etc/hosts.allow
ALL : 127.0.0.1 :allow
sshd : IP1, IP2 :allow
$ adducer user
$ vim /etc/group
sudo:x:27:user
$ vim ~/.forward
\user
$ vim /etc/ssh/sshd_config
PermitRootLogin no
$ /etc/init.d/ssh restart


由於預設系統允許 root 登入,因此關掉這個通用帳號可以降低很多帳密測試的風險,並使用 denyhosts 阻擋 try password 事件,且為了留後路給自己,先寫幾個 IP 擺在 hosts.allow 囉,接著建立 user 帳號,並設定好 sudo 權限,最後則是設定 root 信箱 forward 給 user 帳號,如此一來就可以用 user 來觀看有哪些系統等級的通知信件囉。雖然擋掉 root 或許有些不便,但 Linode 本身有提供 Web 版 Remote Access 服務,透過 Ajax Console 可以登入進去,也算是留了個後路,就不怕不小心防火牆設錯擋到自己。


防火牆:


$ mkdir ~/conf/
$ vim ~/conf/firewall.sh
$ sudo ln -s ~/conf/firewall.sh /etc/init.d/firewall.sh
$ sudo chmod 755 /etc/init.d/firewall.sh
$ sudo update-rc.d -f firewall.sh defaults 


至於使用心得?暫時還沒有,看了一下 ping 的回應,大約 40~50 ms 不等,應該還可以接受吧!(ping 學網的機器約 5~15ms)


2012年6月16日 星期六

網路電視直播新聞 台灣新聞、免費觀看

壹電視-網路電視-新聞直播
來源:壹電視 Next TV @ iPad http://www.nexttv.com.tw/


在網路上找尋良久,終於想到有一家網路新聞了!那就是「壹電視」!並且支援 iPad/iPhone/iPod touch 這種沒有 flash player 的裝置,真是太讚啦!當然,若要用 PC 或 Android 觀看也都 ok la。


真是奇怪,台灣媒體那麼多,真正能合法觀看的為啥那麼少?!約莫七八年前,印象中交大還有跟民視合作,出過網路電視呢。希望新聞台可以快點支援各種平台的網路播放,最好來個 HTML5 的吧!請支援瀏覽器播放、No flash player,謝謝 XD 


2012年6月14日 星期四

PandaBoard 教學筆記 - 調整 Android ICS Partition 大小

aosp-partition-resize


最近編完 AOSP 後,想要塞一堆資料進去,但明明一張記憶卡 8GB,但 Android ICS 裡頭任一個 Partition 最多才 500 多MB 耶,總空間很小,真是奇怪。但用 Ubuntu 的磁碟工具還是可以正常顯示出 7.2 GB 的 userdata,只是在 Ubuntu 系統上,透過讀卡機將資料搬進去,依舊看到檔案系統的大小限制。


磁碟公用程式-sdcard


實在找不出怎樣調整,於是就去追 AOSP 的 makefile 了,在 device/ti/panda/BoardConfig.mk 可以看到 /system、/userdata 的大小規畫:


aosp-partition-resize-mk


於是,把它調大後,接著砍掉 out/target/product/panda/system.img 和 out/target/product/panda/userdata.img 後,直接用 make 或分別用 make systemimage 和 make userdataimage,就能夠再生出新的 image 來,再透過 fastboot 燒進 SDCard 後,就能夠看到比較大的空間囉。


2012年6月11日 星期一

[LLVM] Building LLVM for Android ICS / Pandaboard @ Ubuntu 10.04

 + 


研究了一下怎樣編譯 LLVM for Pandaboard,過程中發現並不是那麼順利的,網路上僅有少數的資訊,並且頂多是 bug report 的等級,沒有講任何的解法,而我只是暫時找到應對的惡搞方式。


首先,先練習一下 Ubuntu 12.04 on Pandaboard,流程就像在 x86 編一樣:


Device: Pandaboard ES
OS: ubuntu-12.04-preinstalled-server-armhf+omap4
SD: Transcend SDHC Class10 8GB



  1. Install Ubuntu 12.04 server on Pandaboard (ubuntu-12.04-preinstalled-server-armhf+omap4.img.gz)

  2. Initial building enviroments 


    • $ sudp apt-get update && sudo apt-get upgrade 

    • $ sudo apt-get install subversion gcc g++ make cmake 


  3. Get LLVM/Clang source code


    • $ svn co http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_31/final/ ~/llvm-src/

    • $ svn co http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_31/final/ ~/llvm-src/tools/clang

    • $ svn co http://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_31/final/ ~/llvm-src/projects/compiler-rt


  4. Built it


    • $ mkdir ~/bulid && cd ~/build && cmake -DCMAKE_INSTALL_PREFIX:PATH=$HOME/out ../llvm-src

    • $ make -j2 (約120分鐘,且 Pandaboard 是雙核心,故 -j2)

    • $ make install


  5. Testing


    • $ ~/out/bin/llvm-config --version
      3.1svn

    • $ ~/out/bin/clang --version
      clang version 3.1 (tags/RELEASE_31/final 158045)
      Target: armv7l-unknown-linux-gnueabihf
      Thread model: posix



很不錯,編出來了,指令操作也很正常,然而,我以為這樣編出來就可以移到 Android ICS 上跑,真是個錯誤的觀念 XD


$ ~/android-sdks/platform-tools/adb shell mkdir /data/ullvm
$ ~/android-sdks/platform-tools/adb push arm-ubuntu-out/bin/clang /data/ullvm/
$ ~/android-sdks/platform-tools/adb shell /data/ullvm/clang
/system/bin/sh: /data/ullvm/clang: No such file or directory


爾後,我才想起 cross compiler 的事情,找了一下 AOSP 裡頭的東西,也就是那些 prebuilt/prebuilts 目錄,翻啊翻,我才發現 NDK 那一包裡頭已經有了,而使用的方式並不是把 CC/CXX 直接指到目錄,先透過 android-ndk-r8/build/tools/make-standalone-toolchain.sh 建立 standalone toolchain 囉,在指定 CC/CXX 位置(此處用 cmake 設定檔)。


工作環境:


OS: Ubuntu 10.04 server x84_64


建立 standalone-toolchain:


$ sh android-ndk-r8/build/tools/make-standalone-toolchain.sh
$ sh android-ndk-r8/build/tools/make-standalone-toolchain.sh --install-dir=$HOME/android-14-toolchain --platform=android-14


透過 CMAKE 編譯前,先寫隻 ~/Android.cmake 初始工作環境:


$ vim ~/Android.cmake
SET(CMAKE_SYSTEM_NAME Linux) # Tell CMake we're cross-compiling
include(CMakeForceCompiler)
# Prefix detection only works with compiler id "GNU"
# CMake will look for prefixed g++, cpp, ld, etc. automatically
CMAKE_FORCE_C_COMPILER(/home/user/android-14-toolchain/bin/arm-linux-androideabi-gcc GNU)
CMAKE_FORCE_CXX_COMPILER(/home/user/android-14-toolchain/bin/arm-linux-androideabi-g++ GNU)
SET(ANDROID TRUE)


正式編譯:


$ mkdir build && cd ~/build && cmake -DCMAKE_TOOLCHAIN_FILE=$HOME/Android.cmake -DCMAKE_INSTALL_PREFIX:PATH=$HOME/out ../llvm-src/
$ make
...
Scanning dependencies of target gtest
[100%] Building CXX object utils/unittest/CMakeFiles/gtest.dir/googletest/gtest.cc.o
/home/user/llvm-src/utils/unittest/googletest/gtest.cc: In static member function 'static bool
esting::internal::String::CaseInsensitiveWideCStringEquals(const wchar_t*, const wchar_t*)':
/home/user/llvm-src/utils/unittest/googletest/gtest.cc:1625: error: 'wcscasecmp' was not declared in this scope
make[2]: *** [utils/unittest/CMakeFiles/gtest.dir/googletest/gtest.cc.o] Error 1
make[1]: *** [utils/unittest/CMakeFiles/gtest.dir/all] Error 2
make: *** [all] Error 2


此處不能用 make -j# 的方式進行,似乎無法平行進行?暫時沒空研究。此外並不是這樣就搞定了,只搞定編譯出 bin/lib/include/share 的產出物,且原先編譯完還會跑 testing,只是碰到 test case 無法編譯出來,暫時就不先管了,有興趣的可以在研究囉。


取出 ~/build/bin 丟進 PandaBoard 中(請留意空間,bin約3xxMB):


$ ~/android-sdks/platform-tools/adb shell df
Filesystem Size Used Free Blksize
/dev 363M 32K 363M 4096
/mnt/asec 363M 0K 363M 4096
/mnt/obb 363M 0K 363M 4096
/system 251M 141M 110M 4096
/data 503M 51M 452M 4096
/cache 251M 4M 247M 4096
/mnt/sdcard 503M 51M 452M 4096
$ ~/android-sdks/platform-tools/adb shell mkdir /data/llvm
$ ~/android-sdks/platform-tools/adb push ~/build/bin /data/ullvm/bin
push: ...
42 files pushed. 0 files skipped.
3065 KB/s (343386572 bytes in 109.394s)
$ ~/android-sdks/platform-tools/adb shell /data/llvm/bin/clang --version
clang version 3.1 (tags/RELEASE_31/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
$ ~/android-sdks/platform-tools/adb shell /data/llvm/bin/llvm-config --version
3.1svn


 測試:


$ vim hello.c
#include <stdio.h>
int main() {
        printf( "Hello World\n" );
        return 0;
}
$ clang -emit-llvm -o hello.bc -c hello.c
$ ~/android-sdks/platform-tools/adb push hello.bc /data/llvm/


出現以下訊息,代表你用的 clang/LLVM 版本跟 LLVM on Android 版本不一致(LLVM沒有向下相容且更新變化快):


$ ~/android-sdks/platform-tools/adb shell /data/llvm/bin/lli /data/llvm/hello.bc
/data/llvm/bin/lli: /data/llvm/hello.mc: error: Invalid MODULE_CODE_GLOBALVAR record


若版本一致的結果:


$ ~/android-sdks/platform-tools/adb shell /data/llvm/bin/lli /data/llvm/hello.bc
LLVM ERROR: Program used external function 'printf' which could not be resolved!


最後分享一下改了啥東西:



參考資料:


Beuc's Blog/ posts/ Cross-compiling with CMake


[LLVM] Using Bitcode on Hadoop Streaming @ Ubuntu 10.04

 + 


前幾天突發奇想,在 LLVM/Bitcode 的架構可以用在哪邊,結果看了一下 LLVM 官網介紹,其實 bitcode 也可以像 script 一樣被執行:


lli - directly execute programs from LLVM bitcode
Getting Started with the LLVM System#Optional Configuration Items


故 bitcode 也能像 script 一樣被系統認出、執行,只是這樣的情況就是每一台 node 都必須必備 LLVM 環境才能執行 bitcode ,跟每台 node 都要安裝 JVM 才能跑 Hadoop 一樣。


此外,在 2009 年有篇文章提出 Hadoop should target C++/LLVM, not Java (because of watts) 設計觀點也可以參考一下,但這一切就是取捨,想要好效能就得付出些什麼,一切都是等價交換啦!


簡易 LLVM/clang 操作範例:



  • 從 source code 產生 native code 


    • $ clang -o source.exe source.c


  • 從 source code 產生 bitcode


    • $ clang -emit-llvm -c -o source.bc source.c


  • 從 bitcode 產生 native code


    • $ llvm-ld source.bc -native -o source.exe


  • 從 bitcode 執行


    • $ lli source.bc



因此,在 Hadoop 的架構下,可以用 Hadoop Streaming 與 lli bitcode.bc 來結合:


$ hadoop jar /path/Streaming.jar -file /path/my_mapper.bc -mapper "lli my_mapper.bc" -file /path/my_reducer.bc -reducer "lli my_reducer.bc" -input in -output out


測試方面,如同 Hadoop Streaming 之 Word Count 範例 技巧:


$ echo "A B AB BA B A" | lli /path/wordcount_mapper.bc | sort -k1,1 | lli /path/wordcount_reducer.bc