當 repo init -u repo init -u https://android.googlesource.com/plform/manifest
或 某天在 repo sync 時發現 似乎是可以work
但中間就是會夾雜一些 request fatal error
甚至是看到 The requested URL returned error: 406 這一串明顯就是有鬼的錯誤訊息
請試試下面方式
1. 連至 https://www.googlesource.com/new-password
並使用你的google account登入,如果本來就有登入,那就可以省去登入的步驟
2. 會得到一組 Login for Git 的 username 和 password
3. 新增或在原本就有的 ~/.netrc 裡加入網頁提供給你的類似下面兩行文字
machine android.googlesource.com login <YOUR_USERNAME> password <YOUR_PASSWORD>
machine android-review.googlesource.com login <YOUR_USERNAME> password <YOUR_PASSWORD>
4. 更改 repo init 的 url
repo init -u https://android.googlesource.com/a/platform/manifest
5. repo sync
結束~
2014年7月24日 星期四
2014年5月26日 星期一
Android kernel startup entry point
source code path:
/kernel/arch/arm/kernel/head.S
1. Just called from the decompressor code.
2. Precondition:
If we link kernel @ 0xC0008000, we call this at __pa(0xc008000)
/kernel/arch/arm/kernel/head.S
1. Just called from the decompressor code.
2. Precondition:
- MMU = off
- D-cache = off
- I-cache = don't care.
- r0 = 0
- r1 = machine nr,
- r2 = atags or dtb pointer
If we link kernel @ 0xC0008000, we call this at __pa(0xc008000)
2014年4月28日 星期一
到底什麼是 Android軟體研發工程師
繼上次 什麼是 Android BSP Engineer? 一文後
我最近又經常要解釋我的工作內容……
而我經常解釋了老半天,對方還是不懂……
其實我當初面試時,我只問了幾個問題,來猜測我現在的工作
1、要寫AP嗎?
2、只會用到Java? 還是也會用到C++?
3、JNI是不是歸我們這邊負責?
4、是不是BSP那邊以外的都歸我們管?
我當初面試的職缺,在104上頭寫的是:Android軟體研發工程師
工作內容
1. Android Framework維護與客製化開發研究:
i. Multimedia、DRM、HLS、Streaming、Wifi Display、DLNA、Graphics/OpenGL
ii. Core/System Service、System UI、Debugging Mechanism、Auto Run Mechanism
iii. Network/Connectivity、NFC、Operator Requirement、SS/DSDS、STK
2. Qualcomm, MTK Android Linux平台效能與穩定度調校。
3. Google Android Phone(GMS/CTS/GTS)、DLNA、通訊方面的認證整合。
4. Android AP與Widget程式設計開發。
5. Android前瞻新技術研究開發。
6. 3rd party軟體整合。
這職稱當然是比 Android BSP Engineer 直覺許多,
因為一看就知道 搞 Android 的 軟體工程師
但沒有看到工作內容的人通常都是同樣的問題:「所以你會寫APP囉?」
我搖頭表示不會。
「蛤? 不會? 那你的工作到底在做什麼?」
「我們這裡大致區分為BSP和ASD,以前我是BSP,現在我是ASD。
AP使用途中出了問題,當然就由我們來負責,但那些AP不見得是我們寫的。
當然我們內部還會區分幾個Function team,我待的team負責Stability
所以有時候會對大部份的Issue進行初步分析,
只要你手機用到一半,它裝死當掉、自動重開機等任何非你預期之行為。
亦或是它頓頓的、突然關掉你正在看的FB,告訴你:對不起,Facebook已停止。
或是想開啟某支程式,點一下後,等了又等,最後冒出,對不起,XX程式無反應。
這一類你可能會想問候它母親的"疑難雜症",全部都會跑來我們team……」
「哦……然後要解掉?」
「通常進行完分析,有些可能是底層問題,要轉到BSP Team 去;
有些像是多媒體相關,則們部裡有負責的function team,他們會更熟這一塊,
再去做進一步分析。剩下在我們自己身上的,能解掉的不多…,
我們可能會上AOSP找solution,找到的機會不多就是了…」
同是軟體工程師的朋友,還問我一天要寫多少code?
我回答:幾乎沒在寫code……
「那你們到底在幹嘛?」
「在……吹口琴、玩玉簫、泡泡妞、看小書、占卜星相、觀人眉宇…」(被毆)
本來 ASD 在公司內部中文翻做應用軟體設計=> Application Software Design
但我覺得實際上比較像是 Analysis Supply/Submit Debug …XD
Analysis:看log來猜測案發當時的行兇過程…
Supply/Submit: 整合第三方程式之類的,或是從AOSP找patch,放進codebase裡,然後上code
Debug:就是找出問題發生的根本原因/程式碼所在…
套一句我Leader說的話:我們 Team需要的人其實寫code能力不用很強,我們比較需要debug能力。
我們真的大部份的時間都在"看code" 而不是"寫code" XD
我最近又經常要解釋我的工作內容……
而我經常解釋了老半天,對方還是不懂……
其實我當初面試時,我只問了幾個問題,來猜測我現在的工作
1、要寫AP嗎?
2、只會用到Java? 還是也會用到C++?
3、JNI是不是歸我們這邊負責?
4、是不是BSP那邊以外的都歸我們管?
我當初面試的職缺,在104上頭寫的是:Android軟體研發工程師
工作內容
1. Android Framework維護與客製化開發研究:
i. Multimedia、DRM、HLS、Streaming、Wifi Display、DLNA、Graphics/OpenGL
ii. Core/System Service、System UI、Debugging Mechanism、Auto Run Mechanism
iii. Network/Connectivity、NFC、Operator Requirement、SS/DSDS、STK
2. Qualcomm, MTK Android Linux平台效能與穩定度調校。
3. Google Android Phone(GMS/CTS/GTS)、DLNA、通訊方面的認證整合。
4. Android AP與Widget程式設計開發。
5. Android前瞻新技術研究開發。
6. 3rd party軟體整合。
這職稱當然是比 Android BSP Engineer 直覺許多,
因為一看就知道 搞 Android 的 軟體工程師
但沒有看到工作內容的人通常都是同樣的問題:「所以你會寫APP囉?」
我搖頭表示不會。
「蛤? 不會? 那你的工作到底在做什麼?」
「我們這裡大致區分為BSP和ASD,以前我是BSP,現在我是ASD。
AP使用途中出了問題,當然就由我們來負責,但那些AP不見得是我們寫的。
當然我們內部還會區分幾個Function team,我待的team負責Stability
所以有時候會對大部份的Issue進行初步分析,
只要你手機用到一半,它裝死當掉、自動重開機等任何非你預期之行為。
亦或是它頓頓的、突然關掉你正在看的FB,告訴你:對不起,Facebook已停止。
或是想開啟某支程式,點一下後,等了又等,最後冒出,對不起,XX程式無反應。
這一類你可能會想問候它母親的"疑難雜症",全部都會跑來我們team……」
「哦……然後要解掉?」
「通常進行完分析,有些可能是底層問題,要轉到BSP Team 去;
有些像是多媒體相關,則們部裡有負責的function team,他們會更熟這一塊,
再去做進一步分析。剩下在我們自己身上的,能解掉的不多…,
我們可能會上AOSP找solution,找到的機會不多就是了…」
同是軟體工程師的朋友,還問我一天要寫多少code?
我回答:幾乎沒在寫code……
「那你們到底在幹嘛?」
「在……吹口琴、玩玉簫、泡泡妞、看小書、占卜星相、觀人眉宇…」(被毆)
本來 ASD 在公司內部中文翻做應用軟體設計=> Application Software Design
但我覺得實際上比較像是 Analysis Supply/Submit Debug …XD
Analysis:看log來猜測案發當時的行兇過程…
Supply/Submit: 整合第三方程式之類的,或是從AOSP找patch,放進codebase裡,然後上code
Debug:就是找出問題發生的根本原因/程式碼所在…
套一句我Leader說的話:我們 Team需要的人其實寫code能力不用很強,我們比較需要debug能力。
我們真的大部份的時間都在"看code" 而不是"寫code" XD
2014年4月17日 星期四
正確的的郵局局號 / 帳號檢查方式
網路上有些流傳的郵局局號/帳號檢查方式是錯的......
網路上流傳的是:
不論局號/帳號
N1 N2 N3 N4 N5 N6 :流水號。 N7:檢碼。
運算規則: (N1×2 + N2×3 + N3×4 + N4×5 + N5×6 + N6×7) ÷ 11餘A.
若A為10, 則N7=0; 若否, N7=A.
但我拿我及幾個手上有的郵局局號帳號做驗證發現根本就不對……
假設我的郵局局號 及 帳號 共 14 碼 為
ABCDEFG HIJKLMN
則
前 7 碼為郵局局號,其中 G 為檢查碼;
後 7 碼為郵局帳號,其中 N 為檢查碼。
檢查公式應該是
( 2*A + 3*B + 4*C + 5*D + 6*E + 7*F + G ) mod 11 = 0
( 2*H + 3*I + 4*J + 5*K + 6*L + 7*M + N ) mod 10 = 0
拿個局號驗證
竹北郵局(新竹三十三支)(舊局號)006133-9(新局號)087000-3
( 2*0 + 3*0 + 4*6 + 5*1 + 6*3 + 7*3 + G ) mod 11 = 0
( 68 + G ) 要可以被 11 整除 => G = 9
( 2*0 + 3*8 + 4*7 + 5*0 + 6*0 + 7*0 + G ) mod 11 = 0
( 52 + G ) 要可以被 11 整除 => G = 3
帳號部份也拿幾個驗證
我的: 013384-4
( 2*0 + 3*1 + 4*3 + 5*3 + 6*8 + 7*4 + N ) mod 10 = 0
( 106 + N ) 要可以被 11 整除 => N = 4
家人剛好跟我是一起辦的: 013383-1
( 2*0 + 3*1 + 4*3 + 5*3 + 6*8 + 7*3 + N ) mod 10 = 0
( 99 + N ) 要可以被 11 整除 => N = 1
為什麼錯誤的版本一直在流傳?
網路上流傳的是:
不論局號/帳號
N1 N2 N3 N4 N5 N6 :流水號。 N7:檢碼。
運算規則: (N1×2 + N2×3 + N3×4 + N4×5 + N5×6 + N6×7) ÷ 11餘A.
若A為10, 則N7=0; 若否, N7=A.
但我拿我及幾個手上有的郵局局號帳號做驗證發現根本就不對……
假設我的郵局局號 及 帳號 共 14 碼 為
ABCDEFG HIJKLMN
則
前 7 碼為郵局局號,其中 G 為檢查碼;
後 7 碼為郵局帳號,其中 N 為檢查碼。
檢查公式應該是
( 2*A + 3*B + 4*C + 5*D + 6*E + 7*F + G ) mod 11 = 0
( 2*H + 3*I + 4*J + 5*K + 6*L + 7*M + N ) mod 10 = 0
拿個局號驗證
竹北郵局(新竹三十三支)(舊局號)006133-9(新局號)087000-3
( 2*0 + 3*0 + 4*6 + 5*1 + 6*3 + 7*3 + G ) mod 11 = 0
( 68 + G ) 要可以被 11 整除 => G = 9
( 2*0 + 3*8 + 4*7 + 5*0 + 6*0 + 7*0 + G ) mod 11 = 0
( 52 + G ) 要可以被 11 整除 => G = 3
帳號部份也拿幾個驗證
我的: 013384-4
( 2*0 + 3*1 + 4*3 + 5*3 + 6*8 + 7*4 + N ) mod 10 = 0
( 106 + N ) 要可以被 11 整除 => N = 4
家人剛好跟我是一起辦的: 013383-1
( 2*0 + 3*1 + 4*3 + 5*3 + 6*8 + 7*3 + N ) mod 10 = 0
( 99 + N ) 要可以被 11 整除 => N = 1
為什麼錯誤的版本一直在流傳?
2014年3月19日 星期三
Shell script Auto factory reset and adb logcat
這個Script 用來重覆紀錄 factory reset 的 log
Script 存成 .sh 檔 之後,記得 chmod +x 給予執行權限
例如我把檔名叫做 factory_reset.sh
$ chmod +x factory_reset.sh
要用的時候的也很簡單~
$ ./factory_reset.sh | tee log.txt
會把所有輸出在螢幕上的文字同時存成log.txt
#!/bin/bash
# for loop 1~10000, i++
for (( i=0; i<100000; i=i+1 ))
do
echo "Run $i times"
adb root
# sleep 一下 (單位是秒)
sleep 5
# 清除 /data 下所有資料
adb shell wipe data
# 沒有東西的話,清除時間不會太久,反正也是要睡一下
sleep 10
# 清完後reboot, 就是factory reset了
adb reboot
# sleep 一下隨意
sleep 20
adb wait-for-device
# 後面加個 & ,等等才可以中止adb logcat
adb logcat &
# 這邊sleep比較久是因為factory reset後的第一次開機時間都比較長
# 當然也是每家手機時間長短不一,請自行調整
sleep 300
# Kill 剛才的 adb logcat (就是模擬按 Ctrl+C )
kill $!
done
--
P.S. 這個供開發使用,一般使用者手機若不能 adb root 不在此文解決範圍
Script 存成 .sh 檔 之後,記得 chmod +x 給予執行權限
例如我把檔名叫做 factory_reset.sh
$ chmod +x factory_reset.sh
要用的時候的也很簡單~
$ ./factory_reset.sh | tee log.txt
會把所有輸出在螢幕上的文字同時存成log.txt
#!/bin/bash
# for loop 1~10000, i++
for (( i=0; i<100000; i=i+1 ))
do
echo "Run $i times"
adb root
# sleep 一下 (單位是秒)
sleep 5
# 清除 /data 下所有資料
adb shell wipe data
# 沒有東西的話,清除時間不會太久,反正也是要睡一下
sleep 10
# 清完後reboot, 就是factory reset了
adb reboot
# sleep 一下隨意
sleep 20
adb wait-for-device
# 後面加個 & ,等等才可以中止adb logcat
adb logcat &
# 這邊sleep比較久是因為factory reset後的第一次開機時間都比較長
# 當然也是每家手機時間長短不一,請自行調整
sleep 300
# Kill 剛才的 adb logcat (就是模擬按 Ctrl+C )
kill $!
done
--
P.S. 這個供開發使用,一般使用者手機若不能 adb root 不在此文解決範圍
2014年3月12日 星期三
dvm_lock_sample @ Android event log
關於 Android event log 裡各個 log 格式定義在
android_codebase/system/core/logcat/event.logtags
那現在要來講的是 dvm_lock_sample
dvm_lock_sample 用來表示某process的某thread為了等另一個人釋放lock,而耗了多少ms
For example:
dvm_lock_sample: [system_server,1,ActivityManager,18285,ActivityStack.java,288,ActivityManagerService.java,13056,100]
dvm_lock_sample: [system_server,1,main,16710,ActivityManagerService.java,5760,-,13056,100]
dvm_lock_sample: [system_server,1,Binder_7,15333,ActivityManagerService.java,12911,-,13056,100]
dvm_lock_sample: [system_server,0,android.bg,108,ActivityManagerService.java,1731,-,13056,21]
在 system/core/logcat/event.logtags 裡可以看到
dvm_lock_sample (process|3),(main|1|5),(thread|3),(time|1|3),(file|3),(line|1|5),(ownerfile|3),(ownerline|1|5),(sample_percent|1|6)
這後面一長串是啥鬼? 請見該檔案上方…
# Tag numbers are decimal integers, from 0 to 2^31. (Let's leave the
# negative values alone for now.)
#
# Tag names are one or more ASCII letters and numbers or underscores, i.e.
# "[A-Z][a-z][0-9]_". Do not include spaces or punctuation (the former
# impacts log readability, the latter makes regex searches more annoying).
#
# Optionally, after the tag names can be put a description for the value(s)
# of the tag. Description are in the format
# (<name>|data type[|data unit])
# Multiple values are separated by commas.
#
# The data type is a number from the following values:
# 1: int
# 2: long
# 3: string
# 4: list
#
# The data unit is a number taken from the following list:
# 1: Number of objects
# 2: Number of bytes
# 3: Number of milliseconds
# 4: Number of allocations
# 5: Id
# 6: Percent
# Default value for data of type int/long is 2 (bytes).
對照一下 dvm_lock_sample…
(process|string),(main|int|id),(thread|string),(time|int|ms),(file|string),(line|int|id),(ownerfile|string),(ownerline|int|id),(sample_percent|int|%)
好吧,我知道還是有些亂…對照一下例子好了…
dvm_lock_sample: [system_server,1,ActivityManager,108,ActivityStack.java,288,-,13056,100]
(process|string) system_server (process name)
(main|int|id) 1 (yes)
(thread|string) ActivityManager (thread name)
(time|int|ms) 108 (lock time 單位:ms)
(file|string) ActivityStack.java (file name)
(line|int|id) 288 (對應 file 的行數)
(ownerfile|string) - (owner file name,- 表示和 file name 一樣)
(ownerline|int|id) 13056 (對應 owner file 的行數)
(sample_percent|int|%) 21 (lock time/500的百分比,佔用500ms以上皆為100%)
android_codebase/system/core/logcat/event.logtags
那現在要來講的是 dvm_lock_sample
dvm_lock_sample 用來表示某process的某thread為了等另一個人釋放lock,而耗了多少ms
For example:
dvm_lock_sample: [system_server,1,ActivityManager,18285,ActivityStack.java,288,ActivityManagerService.java,13056,100]
dvm_lock_sample: [system_server,1,main,16710,ActivityManagerService.java,5760,-,13056,100]
dvm_lock_sample: [system_server,1,Binder_7,15333,ActivityManagerService.java,12911,-,13056,100]
dvm_lock_sample: [system_server,0,android.bg,108,ActivityManagerService.java,1731,-,13056,21]
在 system/core/logcat/event.logtags 裡可以看到
dvm_lock_sample (process|3),(main|1|5),(thread|3),(time|1|3),(file|3),(line|1|5),(ownerfile|3),(ownerline|1|5),(sample_percent|1|6)
這後面一長串是啥鬼? 請見該檔案上方…
# Tag numbers are decimal integers, from 0 to 2^31. (Let's leave the
# negative values alone for now.)
#
# Tag names are one or more ASCII letters and numbers or underscores, i.e.
# "[A-Z][a-z][0-9]_". Do not include spaces or punctuation (the former
# impacts log readability, the latter makes regex searches more annoying).
#
# Optionally, after the tag names can be put a description for the value(s)
# of the tag. Description are in the format
# (<name>|data type[|data unit])
# Multiple values are separated by commas.
#
# The data type is a number from the following values:
# 1: int
# 2: long
# 3: string
# 4: list
#
# The data unit is a number taken from the following list:
# 1: Number of objects
# 2: Number of bytes
# 3: Number of milliseconds
# 4: Number of allocations
# 5: Id
# 6: Percent
# Default value for data of type int/long is 2 (bytes).
對照一下 dvm_lock_sample…
(process|string),(main|int|id),(thread|string),(time|int|ms),(file|string),(line|int|id),(ownerfile|string),(ownerline|int|id),(sample_percent|int|%)
好吧,我知道還是有些亂…對照一下例子好了…
dvm_lock_sample: [system_server,1,ActivityManager,108,ActivityStack.java,288,-,13056,100]
(process|string) system_server (process name)
(main|int|id) 1 (yes)
(thread|string) ActivityManager (thread name)
(time|int|ms) 108 (lock time 單位:ms)
(file|string) ActivityStack.java (file name)
(line|int|id) 288 (對應 file 的行數)
(ownerfile|string) - (owner file name,- 表示和 file name 一樣)
(ownerline|int|id) 13056 (對應 owner file 的行數)
(sample_percent|int|%) 21 (lock time/500的百分比,佔用500ms以上皆為100%)
2014年3月3日 星期一
快速設定fcitx內建的嘸蝦米輸入法,適用於 Ubuntu12.04 / Debian 7 以上版本
前陣子在套件庫裡發現了有個套件名稱叫 fcitx-table-boshiamy
裝來試試後,有些問題讓我用得不太方便,所以一直沒有分享給大家。
原以為是字碼表的問題,檢查了一下它內建的字碼表是正確的,
才懷疑是我自己在設定上的問題,總之好不容易解決了,
依照慣例,寫個簡單上手又容易成功的文章。
最近工作忙,就不勤勞的擷取操作畫面放上來,
若有問題可直接留言,我會收到E-mail通知的。
如果你很急,我又剛好都不去收信(有時我會這樣…Orz)
Google一下應該是找得到我個人FB,用FB傳訊息給我也是個方法。
但FB非朋友的訊息會被歸在另一個收件匣,也是有可能造成我沒即時看到…XD
(而且我曾發生因工作太累,連FB都可以一整週不去看...XD)
OK, 正文開始 。
Step 1. 請先安裝該套件 。
$sudo aptitude install fcitx-table-boshiamy (也可以使用apt-get)
相依性關係下,系統會告訴你它還會安裝fcitx fcitx-bin ......
反正就是給它裝下去
Step 2. 執行 im-config (一個選擇/設定輸入法的套件 ,剛剛應該有順帶幫你裝進去了)
$im-config
會跳出視窗,請把預設輸入法改成fcitx
Step 3. 嘸蝦米設定及輸入法全域設定
你可以使用圖形化介面,從Dash主目錄搜尋fcitx 或是在終端機下指令叫它出來
$ fcitx-configtool
但我好懶得貼圖~加上圖形化介面可以會一直改來改去,
之前也有發生過在GUI上更改的結果並沒有被寫入Configure file裡
所以,我們要修改下面2個檔案
$ vim ~/.config/fcitx/table/boshiamy.conf
$ vim ~/.config/fcitx/config
若不喜歡 vim,也可以使用gedit
$gedit ~/.config/fcitx/table/boshiamy.conf
$ gedit ~/.config/fcitx/table/boshimay.conf
一定要更改的有:拼音鍵,可能有預設是Z,一定要取消,
否則你會發覺Z怎麼跟失效沒啥兩樣
其他改了更方便的有輸入順序、碼表順序 (輸入法順序 )、快速鍵等
首先來取消拼音鍵,但不能取消使用拼音 (我就是這樣搞丟中文鍵盤配置的)
在 boshiamy.conf底下,你可能會需要關心以下參數
# 輸入順序 (幫你調整同字碼的排列順序,我不想要它幫忙變更)
# Available Value:
# AdjustNo
# AdjustFast
# AdjustFreq
AdjustOrder=AdjustFreq
# 碼表順序 (設為1即為預設第一個,設為0等於不使用)
Priority=1
# 使用拼音 (一定要使用拼音哦 )
# Available Value:
# True False
UsePY=True
# 拼音鍵 (但不要拼音鍵)
#PYKey=(開頭有#就等於沒有設定)
在 config file 底下,你可能會想要關心以下參數
[Hotkey]
# 切換啟用或非啟用輸入法
#TriggerKey=CTRL_SPACE(開頭有#就等於沒有設定)
# 只在用額外切換鍵取消啟動後才使用它進行切換
# Available Value:
# True False
#UseExtraTriggerKeyOnlyWhenUseItToInactivate=True(開頭有#就等於沒有設定)
# 額外的啟用輸入法快捷鍵
# Available Value:
# R_CTRL
# R_SHIFT
# L_SHIFT
# L_CTRL
# ALT_L_SHIFT
# ALT_R_SHIFT
# CTRL Both
# SHIFT Both
# L_ALT
# R_ALT
# ALT Both
# Left Super
# Right Super
# Super Both
# Ctrl+Left Super
# Ctrl+Right Super
# Super+Left Ctrl
# Super+Right Ctrl
# Disabled
# Custom
SwitchKey=R_CTRL
[Program]
# 在視窗間共享狀態 (我設成相同程式間共享)
# Available Value:
# No
# All
# PerProgram
ShareStateAmongWindow=PerProgram
# 預設輸入法狀態 (我設成預設啟動)
# Available Value:
# Inactive
# Active
DefaultInputMethodState=Active
[Appearance]
# 切換輸入法時顯示輸入法提示
# Available Value:
# True False
#ShowInputWindowAfterTriggering=True(開頭有#就等於沒有設定)
# 獲得輸入焦點並且輸入法變化時顯示輸入法提示
# Available Value:
# True False
ShowInputWindowWhenFocusIn=True
# 輸入法提示只在啟用狀態顯示
# Available Value:
# True False
#ShowInputWindowOnlyWhenActive=True(開頭有#就等於沒有設定)
Step 4. 執行/啟動輸入法 (如果你剛剛是啟動的,要重新啟動輸入法)
$fcitx
裝來試試後,有些問題讓我用得不太方便,所以一直沒有分享給大家。
原以為是字碼表的問題,檢查了一下它內建的字碼表是正確的,
才懷疑是我自己在設定上的問題,總之好不容易解決了,
依照慣例,寫個簡單上手又容易成功的文章。
最近工作忙,就不勤勞的擷取操作畫面放上來,
若有問題可直接留言,我會收到E-mail通知的。
如果你很急,我又剛好都不去收信(有時我會這樣…Orz)
Google一下應該是找得到我個人FB,用FB傳訊息給我也是個方法。
但FB非朋友的訊息會被歸在另一個收件匣,也是有可能造成我沒即時看到…XD
(而且我曾發生因工作太累,連FB都可以一整週不去看...XD)
OK, 正文開始 。
Step 1. 請先安裝該套件 。
$sudo aptitude install fcitx-table-boshiamy (也可以使用apt-get)
相依性關係下,系統會告訴你它還會安裝fcitx fcitx-bin ......
反正就是給它裝下去
Step 2. 執行 im-config (一個選擇/設定輸入法的套件 ,剛剛應該有順帶幫你裝進去了)
$im-config
會跳出視窗,請把預設輸入法改成fcitx
Step 3. 嘸蝦米設定及輸入法全域設定
你可以使用圖形化介面,從Dash主目錄搜尋fcitx 或是在終端機下指令叫它出來
$ fcitx-configtool
但我好懶得貼圖~加上圖形化介面可以會一直改來改去,
之前也有發生過在GUI上更改的結果並沒有被寫入Configure file裡
所以,我們要修改下面2個檔案
$ vim ~/.config/fcitx/table/boshiamy.conf
$ vim ~/.config/fcitx/config
若不喜歡 vim,也可以使用gedit
$gedit ~/.config/fcitx/table/boshiamy.conf
$ gedit ~/.config/fcitx/table/boshimay.conf
一定要更改的有:拼音鍵,可能有預設是Z,一定要取消,
否則你會發覺Z怎麼跟失效沒啥兩樣
其他改了更方便的有輸入順序、碼表順序 (輸入法順序 )、快速鍵等
首先來取消拼音鍵,但不能取消使用拼音 (我就是這樣搞丟中文鍵盤配置的)
在 boshiamy.conf底下,你可能會需要關心以下參數
# 輸入順序 (幫你調整同字碼的排列順序,我不想要它幫忙變更)
# Available Value:
# AdjustNo
# AdjustFast
# AdjustFreq
AdjustOrder=AdjustFreq
# 碼表順序 (設為1即為預設第一個,設為0等於不使用)
Priority=1
# 使用拼音 (一定要使用拼音哦 )
# Available Value:
# True False
UsePY=True
# 拼音鍵 (但不要拼音鍵)
#PYKey=(開頭有#就等於沒有設定)
在 config file 底下,你可能會想要關心以下參數
[Hotkey]
# 切換啟用或非啟用輸入法
#TriggerKey=CTRL_SPACE(開頭有#就等於沒有設定)
# 只在用額外切換鍵取消啟動後才使用它進行切換
# Available Value:
# True False
#UseExtraTriggerKeyOnlyWhenUseItToInactivate=True(開頭有#就等於沒有設定)
# 額外的啟用輸入法快捷鍵
# Available Value:
# R_CTRL
# R_SHIFT
# L_SHIFT
# L_CTRL
# ALT_L_SHIFT
# ALT_R_SHIFT
# CTRL Both
# SHIFT Both
# L_ALT
# R_ALT
# ALT Both
# Left Super
# Right Super
# Super Both
# Ctrl+Left Super
# Ctrl+Right Super
# Super+Left Ctrl
# Super+Right Ctrl
# Disabled
# Custom
SwitchKey=R_CTRL
[Program]
# 在視窗間共享狀態 (我設成相同程式間共享)
# Available Value:
# No
# All
# PerProgram
ShareStateAmongWindow=PerProgram
# 預設輸入法狀態 (我設成預設啟動)
# Available Value:
# Inactive
# Active
DefaultInputMethodState=Active
[Appearance]
# 切換輸入法時顯示輸入法提示
# Available Value:
# True False
#ShowInputWindowAfterTriggering=True(開頭有#就等於沒有設定)
# 獲得輸入焦點並且輸入法變化時顯示輸入法提示
# Available Value:
# True False
ShowInputWindowWhenFocusIn=True
# 輸入法提示只在啟用狀態顯示
# Available Value:
# True False
#ShowInputWindowOnlyWhenActive=True(開頭有#就等於沒有設定)
Step 4. 執行/啟動輸入法 (如果你剛剛是啟動的,要重新啟動輸入法)
$fcitx
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
@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
重裝不行再去試其他更麻煩的辦法……
如果裝過了,移除後重裝一次
On Ubuntu / Debian -
sudo aptitude remove gcc
(也可以用 apt-get)
(可能也會移掉build-essential 等相關套件,等一下要記得裝回來)
sudo aptitude install gcc
重裝不行再去試其他更麻煩的辦法……
ADB @ Win7 64bit 和 adb CreateProcess failure, error 2 的解決方式
今天遇到的是這個問題
原來是我借到了一台裝到 win7 64bit 的 NB
所以把 原來應該複製到 C:\Windows\System32\ 底下的
adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll 放到
C:\Windows\SysWOW64 底下即可
(我現在是兩邊都有放的狀態,如果只放64底下不行的話,請兩邊都放)
再來就是確認windows有裝了你這隻手機的 USB driver
基本上先打開手機的USB debugging後,再接到windows7,電腦會自動安裝driver
有的手機也會提示你要不要裝driver
如果以上不能解決,那只好另請高明了……
* 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
3. $ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo
> repo
4. $ chmod a+x repo
在公司(亦即有proxy) 請加入 step5、6,沒有請跳過
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
7. $ ./repo init -u https://android.googlesource.com/platform/manifest
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 一直中斷的現象,給各位參考。
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 ?)
(也有可能你是定義在 ~/.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
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
#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
剛剛下載的檔案,檔名是 jdk-7u45-linux-x64.tar.gz 放在/home/francine 底下
要先確定現在是在/home/francine 底下,
不然就要先 $ cd /home/francine 再下指令 make-jpkg 後接檔名
首先是輸入 'Y' 確定,再來就乖乖按下enter鍵就對了……
然後開始build package......最後會出現
沒啥好說的,就是聽它的,下指令就對了
因為JAVA版本一直在變,所以要看你出現的是什麼,不是抄我的哦~
因為很有可能原先有在使用其它版本的JAVA
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.debdpkg -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網路吃到飽方案時,
此時你連上網際網路,自然就會有「上網費用」產生。
好啦,我覺得大家的問題應該主要就這些。
小蒨只負責把一些「可以用來騙人的技術東西」搞得通俗點,
細節技術部份,還請各位親自研讀探索。
十人的會議室裡有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 吧~
所以必須區分是 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\ 這種路徑…
簡單來說,就是開啟命令提示字元 -> cd 到對的路徑 -> install.exe
如圖所示
1. 選擇左邊欄位的進階系統設定,會開啟系統內容視窗
但畢竟仍是靠這行混口飯吃,因此還是需要 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,把一些"冒號"指令等做成選單…
所以小蒨看到了這段話 (好啦,也許我是瞎貓碰上死耗子)
請解壓縮…建議放在沒有空格的路徑(像 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 指令
在「我的電腦」按滑鼠右鍵,選擇「內容」
會開啟控制台->所有控制台項目->系統的視窗
如下面所示,
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就會出現在旁邊囉~
若想要改變命令提示字元視窗的大小,
在視窗上方邊框按右鍵,選擇預設值
在版面配置頁面就可以改變視窗大小了~
2012年7月19日 星期四
再新的ibus或菜鳥也能簡單成功安裝嘸蝦米
還記得我之前寫了這篇超好用的安裝 ibus 嘸蝦米的方法嗎?
http://francinelin.blogspot.tw/2011/10/ibusubuntu1110.html
不過這次我升級到 Debian 7.0 (Wheezy) 就踢到鐵板了 Orz
所以啦,東翻翻西找找的情況下,
看來看去每個人的方法都差不多,但不是有夠給他X的複雜
就是都不解釋一下ibus-table-createdb這個指令是怎麼來的
小蒨本著懶人好人精神,當然又要來分享簡單又可以長遠的東西啦~
( 應該可以和 ibus 一起同進退吧……XD )
請先下載壓縮檔,解壓縮後,再照著底下的步驟做就可以了。
請點我連至Google文件下載壓縮檔
( 2014.05.30 感謝 daineseh 提供改良過的字根表,壓縮檔及readme file也一併更新)
如果你想要客製化(添加)自己的字根表,可以到下面網址參考加字根的作法,
安裝方法則是和本篇一樣的簡單又容易上手。
https://github.com/daineseh/liu_ibus_table
使用方法: (適用於任何版本 Ubuntu/Debian )
1. 先使用aptitude(或 apt-get )指令安裝 ibus-table 套件
sudo aptitude install ibus-table
2. 確定已 cd 到檔案所在的資料夾底下,在terminal輸入以下指令
sudo ibus-table-createdb -s liu_ibus_table.txt -n liu.db
(這行要跑好幾秒,請等一下, 會秀一些error訊息,不用理它)
各位可在 liu_ibus_table.txt 檔案裡,
至於 100、99、98 則是順序性(也可以視做百分比),
像是RRJ 有 茸、華、茸、鷨,分別是 100、99、98、97
你可以依個人喜好將華改成 100,茸改成99,這樣RRJ對應到的第一個字就是華
3. 把剛剛產生出來的 .db檔以及資料夾裡原有的icon複製到ibus-table資料夾底下
sudo cp liu.db /usr/share/ibus-table/tables/
sudo cp liu.png /usr/share/ibus-table/icons/
4. 重新啟動 ibus 使剛才的修改生效, 可以用下列這行指令
ibus restart
或 請登出系統再重新登入,也可達到一樣的效果
5. 登入後修改ibus偏好設定。
輸入法 -> 選取輸入法 -> 漢語 -> 嘸蝦米
-> 按下旁邊加入按鈕 -> 再關閉視窗即可
--
打完~收工~
http://francinelin.blogspot.tw/2011/10/ibusubuntu1110.html
不過這次我升級到 Debian 7.0 (Wheezy) 就踢到鐵板了 Orz
所以啦,東翻翻西找找的情況下,
看來看去每個人的方法都差不多,但不是有夠給他X的複雜
就是都不解釋一下ibus-table-createdb這個指令是怎麼來的
小蒨本著
( 應該可以和 ibus 一起同進退吧……XD )
請先下載壓縮檔,解壓縮後,再照著底下的步驟做就可以了。
請點我連至Google文件下載壓縮檔
( 2014.05.30 感謝 daineseh 提供改良過的字根表,壓縮檔及readme file也一併更新)
如果你想要客製化(添加)自己的字根表,可以到下面網址參考加字根的作法,
安裝方法則是和本篇一樣的簡單又容易上手。
https://github.com/daineseh/liu_ibus_table
使用方法: (適用於任何版本 Ubuntu/Debian )
1. 先使用aptitude(或 apt-get )指令安裝 ibus-table 套件
sudo aptitude install ibus-table
2. 確定已 cd 到檔案所在的資料夾底下,在terminal輸入以下指令
sudo ibus-table-createdb -s liu_ibus_table.txt -n liu.db
(這行要跑好幾秒,請等一下, 會秀一些error訊息,不用理它)
各位可在 liu_ibus_table.txt 檔案裡,
至於 100、99、98 則是順序性(也可以視做百分比),
像是RRJ 有 茸、華、茸、鷨,分別是 100、99、98、97
你可以依個人喜好將華改成 100,茸改成99,這樣RRJ對應到的第一個字就是華
3. 把剛剛產生出來的 .db檔以及資料夾裡原有的icon複製到ibus-table資料夾底下
sudo cp liu.db /usr/share/ibus-table/tables/
sudo cp liu.png /usr/share/ibus-table/icons/
4. 重新啟動 ibus 使剛才的修改生效, 可以用下列這行指令
ibus restart
或 請登出系統再重新登入,也可達到一樣的效果
5. 登入後修改ibus偏好設定。
輸入法 -> 選取輸入法 -> 漢語 -> 嘸蝦米
-> 按下旁邊加入按鈕 -> 再關閉視窗即可
--
打完~收工~
2012年6月14日 星期四
什麼是 Android BSP Engineer?
對於非本行的朋友或是初次見面的外行人,他們對我的工作內容通常是
「完全不能從字面上了解。」
即使你告訴他,BSP 是 Board Support Package,依舊是
「完全無法理解。」
在我要來面試前,甚至是真正上工前,我也是不太理解我的工作內容。
後來想想,之所以在網路上找不到相關資訊的原因可能是因為:
「做這種工作的各位同行,根本沒時間寫文章」
(我有空的時候,基本上連開電腦上FB都懶)
於是為了讓「非本行的朋友或是初次見面的外行人」能迅速知道我在混什麼的(誤)
我的開場白通常是:
「我們公司負責把整隻手機從無到有 (可以順便附帶動作 XD)
硬體就是你看得到的外型,裡面的元件等等,
我是軟體工程師,軟體又要細分很多塊,不過我們管最大的那一塊,
APP知道吧? 就遊戲那些你下載來用的;(通常對方會點頭,並誤以為我就是寫APP的)
但我不負責這個......(打槍對方)
扣掉上層APP之外的,都可以算是歸我們管 (對方就會開始覺得你很厲害的感覺~XD) 」
但對於真正想要了解這職稱工作內容的人,我想通常是找工作的人
這時候,你就得把對方當本行的入門初學者,來詳細訴說。
那麼Android BSP Engineer要負責什麼呢? 我們必須先來看一下簡單的Android架構……
Application (APP, 應用程式)
API ------------------------------------------------
Java framework (框架) (以上皆為Java)
JNI -------------------------------------------------(三種語言都有)
Native framework (有c/c++ language)
-------------------------------------------------------------------
(有c/c++ language)
Libraries
Android Runtime = Dalvik VM + Core Libraries
HAL -----------------------------------------------硬體抽象層
(只有 C language )
Linux Kernel
各元件驅動程式(driver)
Modem (基本上有專門負責的team)
---------------------------------------------------以上皆為軟體工程師負責
硬體、元件、天線……(由硬體/天線工程師負責)
整隻手機的外型則由機構工程師負責 (所以跟軟體工程師可說是無交集)
Android BSP Engineer負責的就是
「以上皆為軟體工程師負責」的一大塊 -「Application」的那一層
由於每個公司分工的情形不一樣,大致可以分成水平分工跟垂直分工兩種
水平分工的話,我們就是中間和C/C++有關的那一大塊
確定問題不在這一大塊裡就可以把問題pass出去
不過有些單位(公司)採用垂直分工,我的工作內容就是如此
此時會以元件(function)來分工,
元件(function)很多,例如:
Display、keypad、Codec、3D Accelerator、Audio、Camara、GPS、
Sensor、Vibrator、back light、WIFI、Bluetooth、Battery...etc.
例如我負責Bluetooth(藍芽)
發現Bluetooth有問題,我就要負責追出問題源頭
此時你就得從底層Kernel一路打通到上層API
有時可能發現是 XXX 解 bug 後造成我的 Bluetooth 有問題
此時就可以把問題 pass 給 XXX,告訴他解問題的過程中造成原本ready的function有問題了
或是追查後發現是 app 本身的問題同樣也可pass 給 app team 去解
其他狀況就得自己解決。
若是水平分工,像是有專門的team 在管 framework 的話,
當你確定問題在framework層之上,你就可以pass出去。
這就是兩種分工的差別。
BSP有時要看電路圖,所以偏工程,電機工程/資訊工程的人都有可能在這行
就像這種
因為每隻手機用的元件不同,Layout也不同,pin腳接到哪兒去了,就是我們用到電路圖的時候了
也因此會有機會和硬體/天線工程師合作,就是因為需要他們幫忙我們來排除硬體問題。
當硬體READY後,我們的主要工作當然就是讓它"動起來",
porting driver是主要工作之一,當各元件都可以動的時候,
原先還無法動作的系統team、APP team、Ril team等,才能開始動作。
所以當一個新案子要開發,前面是硬體先OK,再來就是我們BSP,
BSP過了後,我們可以稍事喘息,不過不會太久……XD
因為此時正是所有軟體工程師可以一起動員的時候,Bug將如雨後春筍般的不斷冒出,
於是我們又開始忙著debug……Orz
我們的工作環境必需是在Linux系統底下,現在大部份是使用Ubuntu,Debian也可以
然後大部份是在黑黑的terminal視窗下指令,這些不會不用擔心,進來再學就好了,
所以對於不敢丟履歷的新鮮人,我真心的建議你,不丟履歷,就沒機會,那你又何必煩惱?
「那如果丟了履歷後,通知面試呢?」
我:就去面試啊,上了再說。
「那如果好死不死上了呢?」
我:主管都覺得你的能力ok了,你還在懷疑個屁啊!
有些事情不難,只是看起來麻煩了點,處理掉就好了!! (友人之名言)
大概就是這樣啦~
訂閱:
文章 (Atom)










