2021年7月3日 星期六

Camera 3A Tuning / Camera IQ Tuning 是什麼

這篇是解釋 Camera Tuning、Camera 3A Tuning、Camera IQ Tuning 的工作內容

註:如果你看到 Camera Tuning 工作內容是偏硬體工程師內容就不適合本篇文章


繼 2012 六月 我寫了篇 什麼是 Android BSP Engineer?

我在 2013年末轉到 Android framework 領域

因為是對方直接與我聯絡的,我事後看104職稱是 Android Software Developer

也寫了一篇什麼是 Android Software Developer

2016 隨著部門合併改為 Android APP,這個就比較多人懂工作內容

後來有了機會,我又跳入 Camera IQ Tuning,隨後也發現這個工作內容是比較少人接觸的

趁著現在有空來介紹一下

===========================

先來名詞解釋一下

IQ:Image Quality

3A:AF、AE(也稱AEC)、AWB

A  = Auto

F  = Focus         對焦

E  = Exposure      曝光

WB = White Balance 白平衡

===========================

● 需要什麼技能?

因為 Camera Tuning 是一個在學校無法學到的東西,基本不會限制科系

不過有些東西,其實就和其他RD部門一樣

例如:

(1)我們都需要看文件,新的案子如果是新平臺新技術還是要學習沒有接觸過的東西

(2)工作總是會遇到問題,要有基本的實驗精神,排除錯誤能力


所以獨立思考能力還是很重要的。

部份公司可能會要求看得懂3A algorithm 的 code 來暸解背後如何運作,這部份可能會要求看code能力甚至是Coding能力


很重要的能力之二是自己的雙眼

要有辨色能力,如果已知自己是色弱,可能就不太適合

我們因為有時拍照要在特定光源,可能環境昏暗/全黑,只有部份光源

有時整天都處在這種狀況,我個人是覺得對眼睛也是個負擔

如果眼睛先天上已經需要好好照顧,可能要謹慎思考


很重要的能力之三是穩定拍照能力

不是說要很會拍照,而是指如果出去外拍雙手很抖,照片都是糊的這樣不行

像我以前拿中低階手機拍N張才有一張可以看,也以為是自己問題

後來發現真的是手機太爛......

現在因為自己對拍照有要求了,所以改拿旗艦機,拿起來就拍也很清楚

如果本身有特殊原因會手狂抖每次都要腳架什麼的會很辛苦


● 工作主軸

修改參數 -> 拍照 -> 對照修改結果 -> 滿意結束,不滿意回到開始


● 修改參數是++--嗎?

就像我們利用手機修圖軟體一樣,大部份是這個道理沒錯

只是平常修圖是針對單一照片,參數調整卻要考慮不同狀況可能是by不同光源 不同亮度 ...etc.

調整的背後也需要相關的基礎知識,不用擔心學不會,但也不是直接丟給新人自學就可以的

這個領域還是很需要有師父領進門,接著才是修行在個人


● 需要懂攝影嗎? 懂攝影進入有比較容易上手嗎?

不需要,本人我也是完全不懂攝影的,只是進來就開始學著看怎樣才是一張好照片

拍多看多後,慢慢也會知道怎樣才好看。

懂攝影的人可能本身對色彩、構圖、基本名詞有一定的暸解,面對這種新人我們不會特地教怎樣的照片是好看的,直接專注在專業知識上


如果您是社會新鮮人,對於Android phone 我所經歷過的職務想了解,歡迎寫信詢問

2019年9月10日 星期二

Android Actionbar text size and color customization

這篇很明顯是個人筆記 XD

在 styles.xml 裡

<style name="SettingsTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:actionBarStyle">@style/Settings.ActionBar</item>
        <item name="android:windowActionBar">true</item>
        <item name="android:windowNoTitle">false</item>
</style>

<style name="Settings.ActionBar" parent="@style/Widget.AppCompat.ActionBar.Solid">
        <item name="android:background">@color/background</item>
        <item name="android:displayOptions">showTitle|homeAsUp</item>
        <item name="android:homeAsUpIndicator">@drawable/actionbar_back</item>
        <item name="android:titleTextStyle">@style/ToolBarTitle</item>
</style>

    <style name="ToolBarTitle" parent="@android:style/TextAppearance.Material.Widget.ActionBar.Title">
        <item name="android:textColor">@android:color/white</item>
        <item name="android:textSize">34sp</item>
        <item name="android:fontFamily">sans-serif-medium</item>
    </style>


其實改這類東西也不是第一次了
看來就是要這麼多層

<item name="android:homeAsUpIndicator">@drawable/actionbar_back</item>
這行則是可以在 Action bar title 左方將homeAsUpIndicator客製化成想要的圖案

<item name="android:windowActionBar">true</item>
這行是為了解決 getActionBar null pointer exception 的問題

<item name="android:windowNoTitle">false</item>
這行拿掉的話,action bar title 跟 indicator 都會不顯示 XDDDD

2016年11月7日 星期一

修改 searchView 中的 android:textColorHighlight及限定查詢字串長度

身為一個初接觸 android app 開發的菜鳥,很多簡單的事都要花時間去找方法

@怎麼增加一個searchView
1.  新增一個 .xml 在 res/menu下
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/action_search"
        android:actionViewClass="android.widget.SearchView"
        android:icon="@drawable/search"
        android:showAsAction="always"
        android:title="@string/title_txt"/>
</menu>
2. java code裡怎麼用

getMenuInflater().inflate(R.menu.XXXX, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchView = (SearchView) searchItem.getActionView();
searchView.setQueryHint(getText(R.string.XXXXX));


3. 怎麼修改searchView中字反白的背景顏色(HighLight color)
    在java code中set textColorHighlight
    假設我要設定成 #0FC698 (雖然會超出版面,不過換行後也不好閱讀,就不換行了)

int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
View searchPlate = searchView.findViewById(searchPlateId);
if (searchPlate!=null) {
    int searchTextId = searchPlate.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
    TextView searchText = (TextView) searchPlate.findViewById(searchTextId);
    if (searchText!=null) {
 searchText.setHighlightColor(Color.parseColor("#00C698"));
    }
}

4. 查詢字數太長,會造成 JavaBinder: !!! FAILED BINDER TRANSACTION !!!
  所以需要限定查詢字數,這部份在onQueryTextChange處理

public boolean onQueryTextChange(String newText) {
    //Set Query text length limit - by Francine
    if(newText.length()>50){
 Log.i(TAG, "Text character is more than 50");
 searchView.setQuery(newText.substring(0,50), false);
    }
}


ref:
techrepublic- pro-tip-customize-the-android-search-view-widget
stackoverflow- android-actionbar-customize-search-view

2016年11月3日 星期四

Android 7.0 判斷是否在 multi-window 狀態

不曉得為什麼 Android Developer 裡提到的 Activity.inMultiWindow() 根本不能用
( https://developer.android.com/guide/topics/ui/multi-window.html )
下面提供真正可以用的方式

因為是 Android 7.0 才支援的功能,API/SDK 記得至少要 24

用 isInMultiWindowMode() 來得知是否處在多視窗狀態
由於 isInMultiWindowMode() 屬於 Activity.java,
所以如果是在 Activity 裡 可以用 this.isInMultiWindowMode()
如果是像我要使用在
public class OOXXFragment extends Fragment{}裡
那就用 getActivity().isInMultiWindowMode()

但Android studio會冒出warning,加上目前7.0以上的手機還不普及,
所以外圍加上判斷SDK的條件來解決此問題

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    if (getActivity().isInMultiWindowMode()){
        //做 multi-window要做的事
    }
}

如果是要做來吃不同layout,記得把判斷式放在 onCreate() 或 onCreateView()
至於強制portrait或landscape好像真的如官方所說不能用,即使是在java code裡使用
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
一樣不行

但會偵測分割後的螢幕長寬來決定吃portrait或landscape的layout
(如果你兩個都有的話)
所以目前我只能很蠢的複製 portrait的layout,用另一個檔名命名,只要是 multi-window 就吃這個layout;
不過也有好處,微調一些參數也就不必怕影響原先正常的layout。

若有更好的方法,還請分享給我,謝謝。

adb remount fail 一直顯示 read-only file system

adb disable-verity 接著 adb reboot 使其生效

重開機完再重新 adb root  ->  adb remount 應該就可以成功

2016年10月19日 星期三

git commit 自動加上 change ID

git commit message 後方若沒有 change ID,直接 git push 會被 gerrit 擋住
此時檢查 .git/hooks 資料夾內,應該會發現沒有 commit-msg 這支檔案

可以使用指令 curl -Lo <在地路徑檔名> http://www.example.com/r/tools/hooks/commit-msg 來下載
記得加上執行權限

但有點麻煩的是,我現在使用的是Windows Git
在不知道如何修改權限的狀況下,我向同事copy了commit-msg這支檔案放在我的 .git/hooks下面,發現權限是不變的,所以也就可以使用了。

記得同時放在 C:\Program Files\Git\mingw64\share\git-core\templates\hooks
在新資料夾抓code時,就不用再重覆加入了。

2015年2月27日 星期五

git clean 用來清除多餘的檔案

常用的有
$ git clean -f   (f: 檔案)
$ git clean -fd  (d: 資料夾)

用來清掉 untracked  file
如果要上的 code 確定不含任何新增檔案,
git add ./  前使用便可避免加進一些不想加的檔案
像是 xxx.patchxxx.origxxx.rej  等等

或是先把確定要新增的檔案先 git add 後再使用git clean也行。


另外還有查到,但還未用到過
$ git clean -fX  (X: ignored files)
$ git clean -fx  (x: ignored files as well as non-ignored files)


2015年2月13日 星期五

如何成為DD (原作者:hychen) 備份區

由於原網域失效,先暫時備份於此。 by Francine Lin

延伸閱讀:你真的想成為DD嗎?

如何成為Debian Developer



2010 年 COSCUP 結束幾周後的某晚與BobChao閒聊, 聊得Debian New Maintainer Process 議程因為時間關係, 沒來得及講完. BobChao就說不如我們請 Paul 再講一場 “如何成為Debian Developer”, 然後把他錄下來.
於是, 在經過幾次Email上的溝通, 便在敝公司會議室把這個演講錄了起來.
註: 本錄影為自發性社群活動

目標聽眾

  • 想鍛鍊技術能力的熱血青年
  • 想成為 Debian Developer 的熱血青年
  • 覺得當 Debian Developer 很帥的熱血青年

參與人員

  • 主講人: 劉穎駿 aka. Paul Liu, Debian Developer (截至2015年初為止台灣只有三位)
  • 策劃/錄影: 趙柏強 aka. BobChao
  • 策劃/協調: 陳信屹 aka. hychen

10分鐘快速簡介

影片: 成為DD你也行
  • 什麼是 Debian Developer
  • 成為 Debian Developer 的好處
  • 成為 Debian Developer 需要很強的技術能力嗎
  • 成為 Debian Developer 有什麼義務
  • Canonical 目前有幾位 Debian Developer

上半部

影片: Road2DD-1
  • 什麼是Debian Developer
  • 成為Debian Developer的好處
  • 申請前需有的資格
  • 申請流程
  • PP1: 價值觀
    • 解釋 Debian 社群契約
    • 是否是自由軟體的三個測試
    • 沙漠荒島: 是否宣稱修改過的source一定要送回upstream
    • 秘密反抗軍: 是否宣稱修改過的source一定要公開, 即使別人沒拿到 Binary
    • 邪惡的觸角:使否有撤銷條款
    • 什麼是Source

下半部

影片: Road2DD-2
  • Debian 與 Ubuntu 的關係
    • 套件同步流程
    • patch 什麼時候送 Upstream, 什麼時候送 Debian, 甚時候送 Ubuntu
    • 什麼樣的套件 Ubuntu 沒辦法送回 Debian
  • PP2 Procedure
    • Debian 的 Bug Tracker
    • NMU - 非維護者上傳
    • Debian 的 投票機制
    • GPG 簽名機制
    • 新套件上傳方式
    • 翻譯的方式
  • TS1 - Tasks - 完成 3個任務
    • 修RC Bug
    • QA
    • 翻譯
  • TS2 - Skills - 檢驗技術能力
    • 申請之後
      • DM 與 DD的差別
  • 相關資源


2015年1月15日 星期四

[Ubuntu] 自動掛載硬碟或磁區

有時我們會把 codebase 放在別顆硬碟或是別的磁區

此時一定要注意 硬碟格式 
NTFS 可以讓 windows 系統的電腦存取,但卻不能讓Ubuntu在上面 build code
所以記得要使用 ext3 / ext4 格式

另外就是開機啟動如果系統能auto mount 就會更方便,
所以我們需要修改一下 /etc/fstab

首先要使用 blkid 知道磁區的 UUID

$ sudo blkid










LABEL="temp" 是因為我在格式化時,把該磁區命名為 temp

















現在我們來看怎麼修改 /etc/fstab
假設我要把temp 磁區 mount在 /media/temp 這個掛載點

$ sudo vim /etc/fstab
















在vim中,按 i 可進行修改,按 o 則新增下一行修改
看一下第13.14行 (重點是第14行)
加上 UUID、mount point、type、等等後
按下 Esc  離開編輯模式
再按下 :   進入命令列模式
接著輸入wq 表示寫入檔案並離開 

這樣下次開機時,就會自動掛載該磁區了。


2015年1月14日 星期三

[Android] sp 跟 dp 的差別只有一句話

用 sp 為單位的東西會受到 顯示 -> 字型大小 的設定而改變
用 dp 為單位的東西則不會

所以 Android官方才會建議用 sp 做為字型大小的單位
目的就是讓使用者在更改字型大小的設定時,能控制到所有的字。

至於在不同大小螢幕部份,
用 sp 和用 dp 都可以使 layout 符合不同尺吋的螢幕,不必擔心。

2015年1月13日 星期二

repo init error - gpg: Can't check signature: public key not found

repo init 時發現下列錯誤,表示 repo 版本太舊

























解決方式是用curl 指令重抓最新版本的 repo  (下面是先暫存在家目錄)

$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/repo

抓下來後,記得增加執行權限

$ chmod a+x repo

2014年12月2日 星期二

[Android] 手機不想安裝FB Messenger 的解決方式(現已失效)

解決方式:安裝一個假的 FB Messenger來騙過檢查機制

1. 下載假的Messenger.apk 檔案在此,下載後記得解壓縮

2. 請在手機上進入 設定 ->安全性 -> 不明的來源 打勾

3. 如果你已經裝了 FB Messenger,請先解除安裝,避免不必要的意外

4. 如果你可以用或會用 adb 指令的就不解釋了
    不會用的,可以透過電腦把 Messenger.apk 丟進手機
    再透過手機上的任何一種檔案管理程式找到檔案,
    點點它,手機會自動幫你執行安裝

2014年7月24日 星期四

AOSP repo init error part2: The requested URL returned error: 406

當 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年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:

  • MMU = off
  • D-cache = off
  • I-cache = don't care.
  • r0 = 0
  • r1 = machine nr, 
  • r2 = atags or dtb pointer
3. Position independent.
    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

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

為什麼錯誤的版本一直在流傳?

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 不在此文解決範圍

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%)

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


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