2012年6月24日 星期日

用力的~翻滾吧!管他在正反之間~


翻滾吧!用熱血飛上青天...這周末花了點時間重整周邊的開發環境,複習了 GAEHeroku 後,無意間找到這篇 Google Groups > CloudTW › GAE → Heroku → Linode,並回憶自己的經驗後,深深地回想起學生時代看過的動漫:鋼之鍊金術師!那一道道「等價交換」的理化原理扎扎實實地用在生活、人性甚至科技上。


今年是很特別的一年,從年初就這般告訴自己,隨時時間越來越接近年中,一件件不在預料中的事蹦了出來,突然也能感受到馬雲說的話:「只要是錢能解決的問題都不是問題」(其實,這句話我比較有印象是某政治家的口頭禪),隨著時間的增減,感觸極深,那就是時間好少啊。小時不懂事時,時間在電視、電動中度過,等到年少輕狂時,卻又在球場、升學壓力中,等到好像快自由時,卻陷入經濟、兵役中,等到可以喘口氣時,又碰上人生問題,其實壓力不曾減少,只會隨著時間與空間轉換,唯一不變的那就是一天只有 24 小時,在這樣的定理下,漸漸地不會去羨慕什麼,也不用去模仿什麼,因為你就是你,他就是他。


這一年多來不小心學到的壞習慣,那就是思考、計較勝於行動。由於單位目標,常常必須花很多時間去找尋資料,也訂閱了一堆有的沒有的 RSS,透過這些資訊的吸收,的確有一定程度的成長,但是轉個彎來思考,更代表自己一定程度的佇足。當別人跟你說 ooo 很炫,你可以很快地舉出例子說 xxx 已經做過了;當別人說這個好像可以做,又不禁意地潑了別人冷水。


後來,我發現這件事似乎是 25~35 年紀的說話語氣,例如提出一些創業的觀點時,會有一票人用近似反對的觀點對談 XD 只是很神奇地,碰到 35 ~ 50 歲的長輩時,他們反而會希望年輕人大膽去做,年輕就是本錢,彷彿希望年輕一代把自己過去未做的事補齊!其實,創業終究只是個代名詞,國父說的好,把一件事從頭做到完就是成功,我覺得這真的對極了,實在不必要把創業的標準訂太高,能夠達成做自己喜歡的事(這動力會促使你把其他不喜歡做的事也搞定),也就不錯啦,不見得要去探索藍海,在紅海中悠游自在不也不錯嘛。


今晚重灌電腦時,同事塞了一本書叫我看一看,還滿建議有興趣的可以翻一下:



不到 300 頁,剛好裝完系統+更新完系統的時間,我就看完了 XD 我覺得裏頭的東西不見得是新穎的,但可以回顧別人是如何過生活。很巧地也讓我回顧我工作近三年的兩個單位文化,文中所提的十分有感觸,例如管理者道歉文化,有一派認為會給人沒執行能力、魄力,另一派會覺得是拉近關係等。整本書的優點大於缺點,若是硬要說不好的,那就得問問廣大的鄉民吧 cc 別忘了媒體、行銷:



感謝周邊優秀的同事,不一樣的成長背景,醞釀著不一樣的能量,以前總覺得自己的觀點還算新穎,現在覺得周邊一堆人都很厲害呢,然而,生命的長度有限,每個人選擇的路線不見得一樣,記得要多多給予別人正面的能量,相信這世界會因此變得更好!接下來的生活嘛,大概可以參考學弟當兵日記,把一堆 RSS 退掉,專心地提升行動力。



編譯 Hinedo 及使用廣播播放 @ Mac OS X Lion

身為一個懶人,連音樂都不選也是合情合理的 XD 所以安裝廣播軟體是非常基本的,腦中閃過的第一個念頭是就編一下國內自製的 hinedo 廣播程式吧!這可是大名鼎鼎的 PCMan 的小作品呢。


由於程式碼採用 gtk 開發環境,所以就用 port 安裝一下程式所需的東西吧!



  1. 安裝 MacPorts

  2. 安裝 gtk2


    • $ sudo port search gtk2 | grep gtk2

    • $ sudo port install gtk2-extra


  3. 安裝 mplayer


    • $ sudo port install MPlayer



測試 hinedo-0.4.tar.bz2 (2007.11.18):


$ wget http://www.openfoundry.org/of/download_path/hinedo/2007.11.18/hinedo-0.4.tar.bz2
$ tar -xvf  hinedo-0.4.tar.bz2
$ cd  hinedo-0.4
$ make


可惜測試時 (./hinedo) 只有出現一個 X11 介面 Orz 所以,只好用工程師法(若看到 python 噴訊息,是因為 Lion 內建採用 Python 2.7,有些函數參數格式有變,如 execl,僅需在該函數後面多加一個 "" 參數及可):


$ ./update
已更新到最新版本的 script
正在更新選單...
$ ls ~/.config/hinedo/
menu play update_menu version
$ cat ~/.config/hinedo/menu
音樂
BravoFM 台北都會音樂台 1001
Classical 台中古典音樂台 1120
E-Classical 台北愛樂 228
KISS RADIO 網路音樂台 308
正聲音樂派 1270
KISS RADIO 大眾廣播電台 156
中廣音樂網i radio 206
中廣流行網 i like 205
HitFM聯播網 北部 222
HitFM聯播網 中部 88
HitFM聯播網 南部 90
POP Radio 台北流行音樂電台 370
奇美古典音樂網 294
BestRadio 台北好事 212
BestRadio 高雄港都 213
BestRadio 台中好事 211
BestRadio 花蓮好事 303
AppleLine 蘋果線上 248
ASIAFM 衛星音樂台 321
Flyradio 飛揚調頻 357
RTI央廣 音樂 313
佳音現代聖樂網 340
全國廣播音樂網 338
太陽電台 289


生活
needs RADIO 1060
古都電台 1143
飛碟電台 232
ASIAFM 亞州電台 210
ASIAFM 亞太電台 295
IC之音 148
uni radio 環宇電台 282
全國廣播 202
佳音電台 201
佳音經典音樂網 250
大愛網路電台 325
城市廣播網-台北健康電台 229
城市廣播網-台中城市廣播 226
臺北廣播電臺 喔海洋頻道 238
臺北廣播電臺 都會資訊頻道 208
大千電台 109
EZ Radio 宜蘭中山電台 301
真心之音廣播電台 217


新聞
中廣新聞網 207
NEWS98新聞網 187


綜合
台灣之聲 1080
最愛生活頻道 1020
正聲 台北調頻台 198
正聲北港台 1223
正聲台中一台 1220
正聲台中二台 1221
正聲台東台 1228
正聲嘉義台 1224
正聲大發台 1227
正聲太保台 1225
正聲宜蘭台 1229
正聲雲林台 1222
正聲高雄台 1226
正聲 台北調幅台 317
復興廣播電台 第一網 286
復興廣播電台 第二網 287
復興廣播電台 短波網 288
漢聲廣播電台 全國調頻網 216
漢聲廣播電台 215
漢聲光華網 短波 309
漢聲光華網 中波 281
RTI央廣 國語 315


外語
ICRT 177
RTI央廣 歐美及方言 314
RTI央廣 FM 312
RTI央廣 亞洲頻道 311


多元文化
BestRadio 南方之音 1170
Nice923 宜蘭生活廣播 1180
WowRadio文藻網路音樂台 1205
寶島新聲廣播電台 259
寶島聯播網 高雄主人電台 1250
崑山科大 EKHO Radio迴音線上 1203
快樂聯播網-台北 1140
快樂聯播網-嘉義 1141
快樂聯播網-高雄 1142
非凡音電台 1040
igo 531 160
大漢之音 300
寶島客家廣播電台 241
新客家廣播電台 254
高屏溪客家廣播電台 298
青春線上 356
中廣寶島網 162


交通
警廣 全國交通網 1100
警廣 台中台 1103
警廣 台北台 1101
警廣 台南台 1104
警廣 台東台 1108
警廣 宜蘭台 1106
警廣 新竹台 1102
警廣 花蓮台 1107
警廣 長青網 1109
警廣 高雄台 1105

$ which mplayer
/opt/local/bin/mplaye
$ vim ~/.config/hinedo/play
更換 mplayer 位置 '/opt/local/bin/mplaye' (原本是 '/usr/bin/mplayer' )  


手動執行 ICRT 177:


$ ~/.config/hinedo/play 177
MPlayer 1.0rc4-4.2.1 (C) 2000-2010 MPlayer Team
158 audio & 340 video codecs


Playing http://bcr.media.hinet.net/RA000038.
Resolving bcr.media.hinet.net for AF_INET...
Connecting to server bcr.media.hinet.net[202.39.42.33]: 80...
STREAM_ASF, URL: http://bcr.media.hinet.net/RA000038
Resolving bcr.media.hinet.net for AF_INET...
Connecting to server bcr.media.hinet.net[202.39.42.33]: 80...
Resolving bcr.media.hinet.net for AF_INET...
Connecting to server bcr.media.hinet.net[202.39.42.33]: 80...
Cache size set to 32 KBytes
Cache fill: 0.00% (0 bytes)
ASF file format detected.
[asfheader] Audio stream found, -aid 1
[asfheader] Audio stream found, -aid 2
==========================================================================
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
AUDIO: 48000 Hz, 2 ch, s16le, 128.0 kbit/8.33% (ratio: 16002->192000)
Selected audio codec: [ffwmav2] afm: ffmpeg (DivX audio v2 (FFmpeg))
==========================================================================
AO: [coreaudio] 48000Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
Cache not filling!
Cache not filling!49.9) of 1844674428928.0 (512409556:18:33.6) 53.3% 0%
Cache not filling!50.7) of 1844674428928.0 (512409556:18:33.6) 116.9% 6%
Cache not filling!51.7) of 1844674428928.0 (512409556:18:33.6) 82.8% 12%
Cache not filling!52.7) of 1844674428928.0 (512409556:18:33.6) 84.8% 12%
Cache not filling!53.7) of 1844674428928.0 (512409556:18:33.6) 86.6% 12%
Cache not filling!54.8) of 1844674428928.0 (512409556:18:33.6) 86.7% 12%
Cache not filling!55.8) of 1844674428928.0 (512409556:18:33.6) 87.1% 12%
A:262924.2 (73:02:04.2) of 1844674428928.0 (512409556:18:33.6) 47.8% 18%


這種聽廣播的方式,對工程師來說還算很自然 XD 但對一般人真的不方便啊,所以,可以改用另一款 Freeware 廣播程式:FStream 啦 XD 我只是稍微想支持一下國貨嘛,此外,在看 hinedo 的程式碼時,發現他會去撈 http://hichannel.hinet.net/old/xml/radioList.jsp 位置,上頭則是一些廣播的來源及分類,也算不錯的收穫,而播放前從 "http://hichannel.hinet.net/player/radio/silverlight.jsp?radio_id=電台代號" 分析網頁找尋 mms:// 來源,在用 mplayer 播放軟體播放即可,而使用精美的 FStream 時,則是 mms:// 當做來源。這些流程,我猜也是市面上多款 PC、Mobile app 的實作吧,從偉大的 hinet 那邊找 mms 來源來播放 :P


安裝 MacPorts @ Mac OS X Lion


很久沒有在 Mac OS X Lion 上安裝 MacPorts 啦,結果又碰到了一點小問題 :P 主要的原因是新版 Xcode 並沒有內建 gcc ,所以從 Mac App Store 安裝完 Xcode 後,打開 Xcode ,從左上角點選 Xcode > Open Developer Tool > More Developer Toos 後,就會被導向 Apple Developer 相關網站,下載 Commands Lion Tools for Xcode 後,終於可以正式使用 MacPorts 安裝軟體。



  1. 安裝 Xcode & Commands Lion for Xcode


    • Xcode 4.3.3

    • command_line_tools_for_xcode_june_2012.dmg


  2. 安裝 MacPorts


    • https://distfiles.macports.org/MacPorts/MacPorts-2.1.1-10.7-Lion.pkg


  3. 更新 MacPorts (由於採用 rsync 架,若碰到公司防火牆設定時,可改用 svn 更新方式)


    • sudo port -v seflupdate



範例,安裝 wget:


$ sudo port install wget


2012年6月23日 星期六

解決 VirtualBox 僅限主機介面卡 - 偵測到無效的設定 @ Mac OS X Lion 10.7.4

virtualbox-host-only-nic-error


最近正在布局筆電 XD 把一些常用的開發環境設置一下,方便往後行動工作。首要之處就是把 VirtualBox 搞定,這是研究上非常非常便利的工具,我還滿常把開發環境打包一個 VM,方便確認開發所需,也能快速的移植。我習慣在 Unix 環境裝兩張網卡,一張 NAT 讓它可以連外,另一張就是 host-only 的網路卡(VMWare則不需要這種設定),供 host 用 terminal 連進去 guest 系統。


結果就碰到"偵測到無效的設定值"的問題,過去 host 為 Ubuntu desktop 也碰過幾次,那時就更換 VirtualBox 版本就得到解決,但是在 Mac OS X 試了 3~4 版還是沒用 XD 最後才認真去找解法。


virtualbox-add-host-only-nic


解法就是去偏好設定新增一下網路卡就好 XD 原來這麼簡單就解決了,回到設定畫面就可以選 vboxnet0 ,也不會出現其他錯誤訊息了。


virtualbox-host-only-ok


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