2013年12月9日 星期一

[windows .bat] sleep and for-loop

@echo "Please check your device..."
@pause

@echo "Start Test... Wait 10s"
@ping 127.0.0.1 -n 30 -w 10000 >nul

@echo "Wait 20s"
@ping 127.0.0.1 -n 30 -w 20000 >nul


@set count = 0
@set max = 10000
:loop
@set /a count = count + 1
@echo Run %count% times
@if %count% == %max % goto end
@goto loop
:end


[shell script] Pause to wait for user key press and for-loop

#!/bin/bash

# Waits for user key press.
Pause()
{
 OLDCONFIG='stty -g'
 stty -icanon -echo min 1 time 0
 dd count=1 2>/dev/null
 stty $OLDCONFIG
}

echo "press a key to continue..."
Pause 

echo "wait 10s"
sleep 10

# for loop 1~10000, i++
for i in 'seq 1 10000'; do echo "Run $i times" done

[Android build code] /bin/sh gcc: Command not found

請先確定有沒有裝 gcc

如果裝過了,移除後重裝一次

On Ubuntu / Debian -

sudo aptitude remove gcc
(也可以用 apt-get)
(可能也會移掉build-essential 等相關套件,等一下要記得裝回來)

sudo aptitude install gcc

重裝不行再去試其他更麻煩的辦法……



ADB @ Win7 64bit 和 adb CreateProcess failure, error 2 的解決方式

今天遇到的是這個問題
* daemon not running. starting it now *
CreateProcess failure, error 2
* failed to start daemon *
error: cannot connect to daemon

原來是我借到了一台裝到 win7 64bit 的 NB

所以把 原來應該複製到 C:\Windows\System32\ 底下的
adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll 放到
C:\Windows\SysWOW64 底下即可
(我現在是兩邊都有放的狀態,如果只放64底下不行的話,請兩邊都放)

再來就是確認windows有裝了你這隻手機的 USB driver
基本上先打開手機的USB debugging後,再接到windows7,電腦會自動安裝driver
有的手機也會提示你要不要裝driver

如果以上不能解決,那只好另請高明了……



2013年12月5日 星期四

AOSP repo init with 403 error (proxy problem)

以下解決方法適合在公司(有proxy)的情況

Reference:

操作過程整理如下,先想好你要把repo放在哪裡,我是放在AOSP資料夾底下
以便和公司用的區分開來,如果你沒有這個問題
直接把抓下來的repo 放到 /bin 底下
這樣到處都可以直接使用 repo 指令,
不需要每個專案都複制製一個repo檔案 也就不用在 repo 前面加 ./ 了

1.      $ mkdir AOSP
2.      $ cd AOSP
4.      $ chmod a+x repo

在公司(亦即有proxy) 請加入 step56,沒有請跳過
5.      $ export http_proxy=<proxy_ip>:<port>
6.      $ export https_proxy=<proxy_ip>:<port>

Ex:      
$ export http_proxy=10.11.123.234:2345
$ export https_proxy=10.11.123.234:2345

8.      $ ./repo sync

如果 repo sync 過程中經常出現  request fail / fetch errors

Solution (1)先查一下 googlesource.com 跟 android.googlesource.com 的 ip

$ nslookup googlesource.com
$ nslookup android.googlesource.com

(如果兩個ip一樣,或很像,建議多查幾次確定一下,我查到第四次發覺會變 =_=)

假設查到的分別是 74.125.31.82 and 173.194.74.82

$ sudo vim /etc/hosts

加入下面這兩行

74.125.31.82 googlesource.com
173.194.74.82 android.googlesource.com

ps.
1. 如果兩個ip一樣,或是很像,建議多查幾次確定一下,因為小蒨有遇到查到第四次會改變
2. 不同台電腦,或是換了位置上網(ex: 從家裡到公司),
   亦或是隔了一天要重新執行時發覺老毛病又犯了,也可以再check一下

Solution (2) Setting TCP/IP stack

$ sudo sysctl -w net.ipv4.tcp_window_scaling=0


上面這兩個方法有幫助小蒨改善 repo sync 一直中斷的現象,給各位參考。

2013年11月4日 星期一

解決CC File Fatal Error @ Android Build code [Ubuntu12.04~13.10 or Debian 7~8]

裝好套件是Build Android Codebase 的第一步
但xxx的就是冒出個我假冒android software engineer兩年來從沒遇過的build error

target arm C++: libwebrtc_system_wrappers <= external/webrtc/src/system_wrappers/source/map.cc
In file included from external/webrtc/src/system_wrappers/source/map.cc:11:0:external/webrtc/src/system_wrappers/source/../interface/map_wrapper.h:14:15: fatal error: map: No such file or directory compilation terminated.
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebrtc_system_wrappers_intermediates/map.o] Error 1
make: *** Waiting for unfinished jobs....

原來是因為我設定了NDK_ROOT…
所以把原先定義在 ~/.profile 裡的NDK_ROOT幹掉就行了
(也有可能你是定義在 ~/.bashrc ?)

原先設定
#Android NDK
NDK_ROOT=~/android-ndk-r8
PATH=$NDK_ROOT:$PATH
NDK_Sample=$NDK_ROOT/samples
NDK_Workspace=~/workspace

export NDK_ROOT NDK_Sample NDK_Workspace PATH

改成這樣 (註解掉)
#Android NDK
#NDK_ROOT=~/android-ndk-r8
#PATH=$NDK_ROOT:$PATH
#NDK_Sample=$NDK_ROOT/samples
#NDK_Workspace=~/workspace
#export NDK_ROOT NDK_Sample NDK_Workspace PATH

記得要讓更改生效~(例如:登入登出)
為什麼這樣就可以了呢?
因為某個Bug…當NDK_ROOT被定義了之後,
webrtc makefiles 便不會去including STL ......Orz
記得Build完code要把NDK_ROOT定義回來哦~

2013年10月22日 星期二

在 Debian 7~8 安裝Sun Java SDK

從 Debian Wheezy (7.0) 開始,
Sun Java SDK and JRE 等套件已經不會在 non-free repository裡了。
不過幸好我們還有一個算簡單的方式可以安裝,
我的環境是Testing, 所以我想之後的Debian 8 應該可以比照辦理…
首先,我們需要 從Oracle下載適合自己平臺的JDK檔案 =>點擊後會在新視窗開啟
(檔案別亂存,要記得位置)
像小蒨我是64位元的Debian,就要選擇 for Linux x64 的 jdk-7u45-linux-x64.tar.gz

並安裝 java-package 這個套件,我們得自己來Build .deb
$ sudo aptitude install java-package 
當然你也可以使用 apt-get 指令
$ sudo apt-get install java-package
裝好了套件,也下載完 JDK file 後,一樣輸入下列指令
$ make-jpkg <the_jdk_file_name>
例如: 
剛剛下載的檔案,檔名是 jdk-7u45-linux-x64.tar.gz 放在/home/francine 底下 
要先確定現在是在/home/francine 底下, 
不然就要先 $ cd /home/francine  再下指令 make-jpkg 後接檔名
$ make-jpkg jdk-7u45-linux-x64.tar.gz
中間會需要再做一些確認動作,所以不要下完指令就跑掉哦~
首先是輸入 'Y' 確定,再來就乖乖按下enter鍵就對了……


然後開始build package......最後會出現

沒啥好說的,就是聽它的,下指令就對了
因為JAVA版本一直在變,所以要看你出現的是什麼,不是抄我的哦~
$ sudo dpkg -i oracle-java7-jdk_7u45_amd64.deb 
 dpkg -i 指令會安裝.deb檔,再來是設定我們的JAVA
因為很有可能原先有在使用其它版本的JAVA
$ update-alternatives --config javac
$ update-alternatives --config java
再依照你的選單,選擇剛安裝好的 sun Java SDK,就可以了~

2013年6月20日 星期四

AGPS要收費? 讓我告訴你!

想當初......2011年冬季,
十人的會議室裡有10多個手機軟體工程師在討論AGPS倒底是什麼?

沒想到2013夏季,我再次和同事討論AGPS該怎麼向業務解釋。

在和同事討論前,為了先確保小蒨的記憶和理解無誤,當然得先Google
沒想到……正確的資訊卻不夠多,講得也不夠簡單。

首先直接給你結論跟幾個重要觀念:
1. 定位不一定要 GPS,網路是很可怕滴
2. AGPS不是GPS,而是Server
3. 收錢的不是AGPS,而是你的移動網路


解釋:
1.
打開你電腦看Google地圖,靠,它怎麼知道我人在公司;而且還知道我公司在哪。
回家開家裡的電腦來看google地圖,靠,它怎麼知道我回家了。
因為你有上網。
簡單的說:
有GPS,在室外可以定位,在室內因訊號很微弱,所以就沒作用。 例: 車用導航裝置。

那如果我的裝置沒GPS,卻說有AGPS的功能??
其實就是一種網路定位。

網路定位:不管你是3G、WiFi、ADSL什麼方式上網,就是可以定位。
(你想想網路線路最後都歸誰管?? 不然你資料怎麼傳?)
例如:
個人PC + 網路線 ;
筆記型電腦+3G網卡;
智慧型手機/平板 + 3G行動上網 (或 借別人家的 WiFi 上網 也是一樣的)


2.
網路上都將AGPS解釋成用基地台來定位
這樣的解釋不夠完善,而且會誤導人家
「我的平板沒有3G功能,所以不能用AGPS」

錯了。

AGPS 其實是使用網路中的特定伺服器協助定位,
所以只要你的裝置有連線功能可以和該伺服器做資料交換,
就可以使用這項功能。

3.
假設 基地臺 會讓你想到 3G網路/手機/電話
那我要再告訴你一點,無線網路的AP,你也可以想成是一個小基地臺
這些小基地臺會被網路或真正的基地臺所定位 (網路嘛…不就張網子)

所以為什麼會有費用,主要是因為資料傳輸的關係
如果你所處的環境沒有免費的WiFi可以借用,
自己又沒有申辦3G網路吃到飽方案時,
此時你連上網際網路,自然就會有「上網費用」產生。

好啦,我覺得大家的問題應該主要就這些。
小蒨只負責把一些「可以用來騙人的技術東西」搞得通俗點,
細節技術部份,還請各位親自研讀探索。



2013年5月30日 星期四

在windows底下使用 vim + ctags + taglist 來 trace code

由於換了工作,工作環境也就從 Linux 換成 Windows 了…
但畢竟仍是靠這行混口飯吃,因此還是需要 trace code
此時也就懷念起 Linux 的 vim 和 ctags 了...
 繼上次 簡單安裝 vim 來 trace 大型 code base ( in Linux OS) 一文後
現在就來個 windows 版 的 簡單安裝 vim 來 trace code 吧~

 step 1 - Download vim

 windows 版本需注意,因安裝步驟不同
所以必須區分是 32 還是 64位元的作業系統,再細分是否為vista、win7等

請點我 到 windows vim 下載頁面
32位元OS,有.exe 檔可以用,安裝應該比較簡單
但小蒨我的是 x64...  (細看一下網頁…也許小蒨繞了路也說不定)

反正呢,既然客倌都想安裝vim了,閱讀一些英文我想是ok的…

gvim 其實就是 GUI界面的vim,把一些"冒號"指令等做成選單…

所以小蒨看到了這段話 (好啦,也許我是瞎貓碰上死耗子)



Win64
Native 64-bit binaries for MS-Windows can be found at http://code.google.com/p/vim-win3264/. The Win32 binaries should run too, but the 64 bit version has a few minor advantages (see the web page at the link).

最後小蒨來到了這個頁面,下載了 vim72.zip

請解壓縮…建議放在沒有空格的路徑(像 C:\Program Files,不然就是下指令小心點…)
經驗法則告訴我們…這種要手動的安裝的東西,還是先放在越簡單的路徑越好,像 C:\
但不曉得為什麼網頁也有提到請以vim為資料夾名,所以小蒨就解開放在 C:\vim\ 底下

於是他應該會產生 C:\vim\vim72\ 這種路徑…

 step 2 - Install vim

現在要來區分你的windows是xp 還是vista之後了;因為後者需要給予權限才可以成功安裝

簡單來說,就是開啟命令提示字元 -> cd 到對的路徑 -> install.exe
如圖所示

勇敢的按下enter,畫面變這樣

Just do it!!  輸入 d ,一樣勇敢的按下enter
噹噹!! 裝好了~

如果沒有給予權限…(小蒨剛剛在講你都沒在聽)
就會變成這樣……


此時已經可以使用vim了,用命令提示字元,像在linux 底下一樣的下vim指令即可……
但是我們要trace code,所以需要ctags…

 step 3 - Download ctags

至此下載 ctags,解壓縮後,將 ctags.exe 一樣放在簡單沒有空格的路徑
小蒨則是整包整開就放在 C:\ 底下了,沒去移動 .exe 檔

 step 4 - 修改環境變數

我們必須將 ctags.exe 的路徑加入path,才能在命令提示字元視窗中使用ctags 指令
「我的電腦」按滑鼠右鍵,選擇「內容」
會開啟控制台->所有控制台項目->系統的視窗
如下面所示,

1. 選擇左邊欄位的進階系統設定,會開啟系統內容視窗
2.選擇進階頁面
3.按下環境變數,會冒出環境變數視窗
4.在環境變數視窗的下面系統變數中,找到path,按一下它當做選擇,此時會反白顯示
5.按一下編輯按鈕
6.加入ctags.exe 放置的路徑,記得用分號來區隔舊的路徑

接著一路按確定退出

 step 5 - Download Taglist plugin

必須下載 vim 用的 Taglist plugin,解壓縮後,你會發現只有一個 taglist.vim 檔案

把這個檔案拖到剛剛的C:\vim\vim72\plugin\ 資料夾底下放著就好了~

 step 6 - modify _vimrc

最後一步啦~請打開C:\vim\vim72\ 底下的 _vimrc
如圖所示,找個地方加入 ctags 路徑,及設定taglist快捷鍵,儲存就好啦~

let Tlist_Ctags_Cmd = 'C:\ctags58\ctags.exe'
nnoremap <F12> :TlistToggle<CR>


使用方式都和 linux一樣,打開命令提示字元
cd 到 project 的根目錄, 下 ctags -R
依照Codebase大小不同,所需時間也不同,一樣完成後會產生tags檔案

此時在 vim 時,按下我們剛剛所設定的快捷鍵 F12,Taglist就會出現在旁邊囉~

若想要改變命令提示字元視窗的大小,
視窗上方邊框按右鍵,選擇預設值
版面配置頁面就可以改變視窗大小了~