發表文章

目前顯示的是有「電腦」標籤的文章

Delete useless (X) useful (O) code

圖片
最近遇到一個 Bug,讓我想到一個笑話:「我都不敢請假,因為怕發現老闆發現有沒有我都一樣。」 Patch 的標題是:" [NFC] delete useless code " 內容是移除下面紅色的那幾行     public void updateForShouldDefaultToObserveMode(int userId) {         long token = Binder.clearCallingIdentity();         try {             if (!android.nfc.Flags.nfcObserveMode()) {                 Log.d(TAG, "observe mode isn't enabled");                 return;             }             NfcAdapter adapter = NfcAdapter.getDefaultAdapter(mContext);             if (adapter == null) {                 Log.e(TAG, "adapter is null, returning");                 return;             }             ComponentN...

磨刀不誤砍柴工--筆耕不輟,其解自得

圖片
很久以前就看過一篇文章提到頂尖工程師的效率約是普通工程師的 100 倍。裡面有兩個數據,寫程式的效率約差 10 倍,接著調試解 Bug 又差了 10 倍,所以相乘為 100 倍,意思是說,你花了十倍的時間完成一件事,但因為寫得不夠好,裡面有錯,你又要多花十倍的時間去找出這些錯誤。 我實際的經驗,應該不會到 10 倍,但可以觀察到的是就是兩個倍率相乘沒錯,寫程式的效率可以分成兩部分,第一個部分是天份,這就比較難增進,因為有的人就是很聰明,某些很抽象的東西,他可以瞬間理解,但我沒辦法,我需要紙筆來畫出來。但慶幸的是,我曾經問過一個朋友,你在Google工作會不會有很難的程式問題?他的說法是,很少有,即使有,也是過了那個難點就沒了,不是每一個問題都是超級難。第二個部分就是工具,你用的工具可以決定你的效率,這個也是剛好我們是在電腦可以自動化處理的行業,如果是銀行行員,他處理一位顧客的時間就是要花那麼多時間,也很難改善效率。 至於調試解 Bug,這也是吃天份,經驗。但當你兩個都沒有的時候,你是不是應該去好好磨刀,很多人就是用 printf 來 debug,而沒有用系統化工具來找問題。或者是先靜下心來畫個流程圖看看實際的錯誤點會是在哪一塊,而不是一頭埋入程式碼去偵錯。 什麼時候需要去找工具來節省重複的時間?當你可以省下更多時間的時候! https://www.gimbalcanada.com/save-time-by-spending-time/ 後來想想,這不是只有在科技業才有這種差異,我們從小到大的學習也是有相差 100 倍的可能。 最近開始看了不少電子書,是在教導思考,讀書方法的。很可惜沒有早點看到這些書。心裡想著,如果我國中就看到這些書,不知道可以省下多少時間。但看著兒子連課業中的課本/講義/考卷都看不完了,他自己還願意先拉出時間來看這些工具書嗎? 我自己的答案當然是"要",人生學習是一輩子的,越早學到正確的,系統性的學習方法,就可以節省你人生後面的時間,就像大富翁,一旦拿到車子之後,你一次就可以擲最多骰子。在沒有學到有效率的方法之前,讀書就已經效率差,再加上讀得不清不楚,每次考試都說,這我讀過了,但考出來卻還是不會,又要花更多的時間去檢討 / Debug。 推薦一下幾本書 學習高手:哈佛、耶魯雙學霸的最強學習法 李柘遠LEO 這位真的很厲害跟努力,...

2008 工作環境

圖片
 翻到一張舊照片,2008的工作環境

dB, dBW, dBm 資料整理

圖片
一直想把這幾個詞搞懂,再看了下面的網頁之後,讓我想到之前在某個地方看到的一段話,原文忘記了,可能是某個教授講的:「我的想法跟XX教授比較接近,覺得 學生 or 小孩 只要搞懂單位就好,至於數值的部分,長大再算就好。」當初是不太懂這句話,覺得單位不是很基本嗎?相加相減,單位不會不見,相乘相除單位會不見,很簡單啊,最多就是一個光年可能會搞混多數人而已。 直到看到了 dBm,它到底算不算 一個單位呢? dBm: dBm是一個表示功率絕對值的值(也可以認為是以 1 mW 功率為基準的一個比值),計算公式為:10 log(功率值 / 1 mw)。 dBm 轉換為 W 的規律是要先記住 "1個基準" 和 "2個原則": 1個基準: 30 dBm=1 W 2個原則 +3 dBm,功率乘 2 倍,-3 dBm,功率乘 1/2 倍 +10 dBm,功率乘 10 倍,-10 dBm,功率乘 1/10 倍 舉例: 33 dBm=30 dBm + 3 dBm=1 W × 2 = 2 W 27 dBm=30 dBm - 3 dBm=1 W × 1/2 = 0.5 W 舉例: 40 dBm=30 dBm + 10 dBm=1 W × 10 = 10 W 20 dBm=30 dBm - 10 dBm=1 W × 0.1 = 0.1 W 以上可以簡單的記作:30 是基準,等於 1 W 整,互換不算難,口算可完成。加 3 乘以 2,加 10 乘以 10;減 3 除以 2,減 10 除以 10。 幾乎所有整數的dBm都可用以上的“1個基準”和“2個原則”轉換為W。 例1:44 dBm = ? W 44 dBm = 30 dBm + 10 dBm + 10 dBm - 3 dBm - 3 dBm = 1 W × 10 × 10 × 1/2 × 1/2 =25W 例2:32 dBm = ? W 32 dBm = 30 dBm + 3 dBm + 3 dBm + 3 dBm + 3 dBm - 10 dBm = 1 W × 2 × 2 × 2 × 2 × 0.1 = 1.6 W 計算技巧: 1 dBm 和 2 dBm 的計算技巧 1 dBm = 10 dBm - 3 dBm - 3 dBm - 3 dBm = X × 10 × 1/2 × 1/2 × 1/2 = X ...

面試問題--最難解的Bug

這篇文章可以算是 寫程式是我的興趣,也是我的工作,但似乎是痛苦的?  的接續 面試的時候最討厭被問到的問題是 你遇過最難解的Bug是甚麼?每次都讓我想很久,我想原因就是我在上一篇文章提的吧,痛苦的記憶為甚麼要記得呢XD 第二個原因是常常講完之後發現,難解的Bug真正的原因都是在很小的地方,也就是因為這樣所以才難解,但會變成你前面講了一大堆測試方法,沒想到最後只是一個小地方,會有那種後繼無力的感覺,而且講測試方法的時候很難重現出當初Debug的那種氛圍(絞盡腦汁、百思不解)。難過的時光我覺得過去就讓他過去了,反而是為了將來的面試你可能需要把他紀錄下來。 解過的Bug會變成我們的深層回憶,直接叫你講一個可能講不出來,但在某些類似的環境的時候,你會有靈光乍現說這個問題以前好像也有遇過。 我還是比較喜歡講結果的東西,當你真正作出了甚麼的時候,這是榮耀跟喜悅的,可以分享出你自己對你作的東西有甚麼看法,就不會有之前那種越講越弱的感覺。 記得生平第一次在聯發科的面試,面試官問了我你最大的挫折是甚麼?Orz,我完全愣住了,當然我也是個幸運的人,沒有發生過甚麼意外,但這部分現在想想也覺得跟人生觀有關系。挫折的定義是甚麼?人生無法重來,我們完全沒辦法比較 走了你認為成功的路跟你認為挫折的路將來會是怎樣,所以沒辦法定義挫折。我後來的回答是高中聯考考爛了,國中最後一次模擬考,全校第9,校長說根據歷年經驗可以上建中,結果讀了中正高中,第7志願吧。或許長輩都覺得很爛,但其實我覺得中正高中超好的,剛好第一年他們開辦資訊實驗班,有錄取上,於是開始接觸電腦,老師教C,我寫了幾個棋類的遊戲,打敗了自己,於是奠定要往資訊業發展的志向。小時候想做個科學家,但發現電腦可以快速實現我的想法,比物理實驗快多了。 在中正高中,也認識許多好朋友,米寶教我打電動,借我許多遊戲片,炎龍騎士團超讚,每天就跟他請教攻略,廖王、小蔡、老大大家下課一起在電腦教室打世紀帝國。 在中正高中,我不必花全副心力照顧每一個科目,但至少最後還可以獲得推徵交大的資格(高一寫的五子棋、黑白棋也幫了上忙),每天晚上也可以研究我喜歡的物理,後來高三的時候也通過台北市競賽,最後去師範大學參加國內競賽^^,當然中正高中的資源沒那麼好,去師範大學的時候發現建中同學用的參考書都是新的,但中正老師給的可能是n年前...

甚麼Flag?

之前有一次參加同事的會議,跟大陸ODM開會,討論某個issue 對方RD說了一句:「我們測試命令後來加了一個flag之後就沒事了。」 於是我同事就問:「甚麼flag?」 對方回:「f -- l --  a -- g。flag」 以後有機會寫 command line 程式,也要加個flag name 為 flag 的flag。 這樣問別人說:「你有沒有加flag?」 他回:「甚麼flag?」 你就可以回:「就flag啊,f -- l -- a --g」

英文Windows putty ptt 中文輸入亂碼,顯示沒問題

原本用預設的可以看,但無法輸入。 最後的設定: 使用telnet:443 連線到ptt.cc 設定putty裡面的HTTP Proxy 設定putty裡面的Translation的 Remote Character set 為 UTF-8 登入的時候會是亂碼,在帳號後面加一個 ,  輸入密碼之後就OK了。

default kernel cmdline/bootargs

最近再想一個問題,如果編譯Kernel的時候預設有加上cmdline了,那Bootloader再傳bootargs的時候,會怎麼樣? 找到的網頁可能是參考arm的,說預設的會直接被覆蓋掉,但這無法解釋x86平台的行為。 所以去找了一下kernel的code,發現會直接把bootloader傳過來的 append 到 預設的cmdline去,所以如果有相同的argument的話,應該default的會先拿來用吧。 arch/x86/kernel/setup.c static char __initdata command_line[COMMAND_LINE_SIZE]; #ifdef CONFIG_CMDLINE_BOOL static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; #endif #ifdef CONFIG_CMDLINE_BOOL #ifdef CONFIG_CMDLINE_OVERRIDE strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); #else if (builtin_cmdline[0]) { /* append boot loader cmdline to builtin */ strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE); strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE); strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); } #endif #endif strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); *cmdline_p = command_line;

minicom -p pseudo terminal -d device 狀態列顯示bug

最近工作上用到一條指令 minicom -o -p /dev/pty/3 同事執行之後,又進到Configuration畫面設定 Port為 /dev/ttyS0,讓我覺得很怪,因為Host這裡沒有實體的Serial Port,使用的是虛擬tty /dev/pty/3,可是minicom右下角的狀態列顯示的卻是 /dev/ttyS0。 覺得好像是bug,於是分析一下minicom的code想搞懂 pseudo terminal 跟 real serial device有什麼不一樣,因為在argument會有使用 -d [device] 跟 -p [pseudo device]。 用 apt-get source minicom抓到source minicom 使用 open 的參數是 dial_tty,如果有設定 -p 參數的話,會檢查一下路徑的規則,例如有沒有 pty 之類的字眼,然後就直接複製到 dial_tty,如果dial_tty是空的話,再執行open之前,會先找到正確的P_PORT,再複製到dial_tty,所以minicom最後使用的是 dial_tty,但狀態列那邊顯示的卻是 P_PORT,應該是bug了,找了一下minicom upstream,應該是 alioth。 https://alioth.debian.org/tracker/?func=detail&atid=100031&aid=314803&group_id=30018 這裡的bug似乎不太活躍,可能太穩定了,上幾個issue都是好幾年前了@@。 為了怕沒有人維護,所以我又去Ubuntu那邊報了一個。 結論:Upstream那邊隔天就立刻回覆 committed 了。

圈子很小

今天突然發現,地球很大,圈子很小。 是因為自己懂得太少...

羅技無線滑鼠 拆解 修理滾輪

剛正要開始寫程式的時候,沒想到左手用的羅技無線滑鼠竟然突然滾輪無法滾動了,整個就像是卡住一樣,感覺沒修好就無法專心寫程式。於是就開始動手了,花了一小時半,如果這些時間拿去賺錢早就可以買好幾隻滑鼠了@@,但經驗無價,看到設計的工藝更是讚嘆! 把底部的貼紙打開之後,拆開四個螺絲,早就過保了,所以沒差。打開來,滾輪沒甚麼異常,但右看到一個小小的斷掉的碎片,不知道是哪一個部位的,研究一陣子,蓋上滑鼠之後,滾輪還是會卡住,所以決定把外面的橡皮拔掉,拔掉的時候讓我驚訝他的橡皮不是簡單的一圈而已,有點像腳踏車的內胎跟外胎一樣,只是它是連在一起的。拔掉之後測試手感還不錯,功能也正常,所以就決定這樣了。而且滾輪還有分內輪跟外輪,超強的。 蓋上蓋子之後,還是有問題,再次檢查,這次知道了滾輪的原理,用百葉窗的方式擋住IR吧,所以接收器收到閃爍的頻率越高,代表轉動越快,沒拆之前還以為是機械原理呢!因為斷掉的碎片,所以往後轉的時候,滾輪座無法顧定住,導至百葉窗偏離了IR發射器,所以一旦往後滾之後,就會整個無效了,既然知道了原因,且可以重現,接下來就是怎麼workaround而已。 結果,靠小小一片雙面膠幫我擋住滾輪座。希望可以像XP一樣再戰十年!

爛痞客邦的設計 iPhone Safari

每次瀏覽到 Pixnet的網頁的時候,下面的導覽列就會被Pixnet的遮住,超幹,我看網頁是要能夠回上一頁,你沒事跳出一堆 Line FB Google+給我是要幹嘛。 變得我每次都要多按一下網址列,才能回上一頁。

OSX 的 kernel_task high cpu usage low memory

大概一個半月前,我的MBA 8GB突然變得很慢,原本chrome可以開個2x個tab,突然就變得超慢的,根據之前的經驗猜測可能是flash的問題,所以就只好一個一個篩選Tab關掉。 但好景不常,重開機之後ok,但用了一會兒,立刻又變超慢,也幾乎沒什麼用,就開個Safari一個Tab看電影而已。我一直認為兇手是 flash。某天我弟注意到可用記憶體剩下 1x MB,我沒開VM。我弟說他4GB都用很順了,不可能8GB不夠用。 剛剛系統又變超慢,Activity Monitor顯示都被 kernel_task吃掉了,上網找一下 high cpu usage,有一個是clear smc的方法,平常都是接外接螢幕,上面放一堆文件。於是正當我想要按下電源按鍵時,打開我的MBA,噹噹~ 風扇哇哇叫,瞬間 kernel_task 就不吃CPU了,傑克,這真是太神奇啦,剛還看到 kernel_task佔了 5xxx%的 cpu,我沒打錯,原來 Intel 的cpu過熱會讓系統整個變超慢啊。 夏天到了...

爛MTK、爛ZTE、爛台哥大 A6

老木的手機是台哥大A6,經由我幫他設定安裝APP之後,每次拿她的手機起來都會看到系統空間不足的訊息,於是我天天幫他刪除軟體,還以為是我灌太多東西,最後都刪到不能刪了,簡直比 HTC Magic空間還小了。 最後發現是系統log的問題。 安裝Framaroot到手機上, 點擊Boromir進行安裝 ,重開機。 adb shell進去 su rm -rf /data/log_other_mode/* chmod 444 /data/log_other_mode chown root.root /data/log_other_mode 怪的是,網路上一堆文章要把空間調為2.5GB,這樣到時候也是會被吃光光啊~

adb 無法連線

最近在使用某公司的Device,突然發現Windows上沒法使用 adb。在裝置管理員裡面只有看到兩個Portable Device的Device Driver,沒機會讓我替換adb的Driver,於是先用OSX來測試一下。 結果得到以下錯誤 * daemon not running. starting it now on port 5037 * ADB server didn't ACK * failed to start daemon * error: cannot connect to daemon 可是在Ubuntu下面卻可以用的好好的,真怪。 解法: OSX是因為 ~/.android/adb_usb.ini裡面最後多了一行空白Orz,真爛。 Windows則是使用 usboblivion 刪除所有 usb history key之後,重新連接Device,就會有一個Device可以讓我另外選擇Adb Driver了

好用的godir

在android裡面的 envsetup.sh 提供的函式,可以直接打 godir XXX,就可以直接列出檔名中含有XXX的路徑讓你選擇切換。 但他只能用在android project的目錄下,因為我有多個project的路徑,所以只好改為自己來用,主要是找到頂層目錄的,下面的"bootable/bootloader"代表你的頂層目錄下會含有這個子目錄~ function gettopj { local TOPFILE=$1     while [ $PWD != "/" ]     do if [ -n "$PWD" -a -e "$PWD/$TOPFILE" ] ; then echo $PWD return fi cd .. done } function godirj () {     if [[ -z "$1" ]]; then         echo "Usage: godir "         return     fi     TOPFILE="bootable/bootloader"     T=$(gettopj $TOPFILE) if [ -z $T ]; then echo "Cannot find the root directory which contains '$TOPFILE'" return fi     if [[ ! -f $T/filelist ]]; then         echo -n "Creating index..."         (cd $T; find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > filelist)         echo " Done"...

電腦無法自動待命、休眠sleep

大概兩個禮拜前發生吧,今天終於覺得不解決不行了,省電就是省錢XD。 電腦可以透過按下開始按鈕來待命,只是在電源選項那邊選擇的閒置時間一直都沒有效。 一開始先試試把工作列的程式關閉試試,之前曾經發生PPS讓電腦不能自動待命的情況,但關了幾個之後,情況依舊。工欲善其事、必先利其器,還是決定使用專業工具了。 powercfg -requests DISPLAY: None. SYSTEM: [DRIVER] High Definition Audio Device (HDAUDIO\FUNC_01&VEN_1106&DEV_4441&SUBSYS_ 104383D0&REV_1001\4&90aede&0&0001) An audio stream is currently in use. [DRIVER] \FileSystem\srvnet An active remote client has recently sent requests to this machine AWAYMODE: None. 上面可以看到,我們有兩個東西讓系統無法自動待 [DRIVER] High Definition Audio Device [DRIVER] \FileSystem\srvnet 一開始的時候,我並沒有看到第一個,因為我把Chrome也都關掉了,後來確定 Audio是Chrome啟動的。 接下來就是設定這兩個東西不能阻擋待命。 powercfg -REQUESTSOVERRIDE DRIVER "High Definition Audio Device" SYSTEM powercfg -REQUESTSOVERRIDE PROCESS chrome.exe SYSTEM powercfg -REQUESTSOVERRIDE DRIVER "\FileSystem\srvnet" SYSTEM powercfg –REQUESTSOVERRIDE SERVICE "\FileSystem\srvnet" SYSTEM 因為是chrome引起的,所以我順便把chrome也加進去了。然後\FileSyste...

undelete undo partition windows 復原 刪除 磁區

已經養成所有資料都要作RAID了,直接用Windows內建的作Partition Mirror。但缺點是如果不正常關機之後就會resync很久。所以我每次都要先把一個硬碟拔掉,再設定remove mirror,裝回硬碟,重新設定mirror。 昨天一次藍白之後,我就懶得拔硬碟,想要直接remove mirror,結果按成delete volume,然後一瞬間,我的Mirror Partition就不見了Orz 找了一套快速回復的軟體,不支援 Dynamic Disk。後來用EASEUS Data Recovery Wizard Pro,掃瞄我的Primary Disk竟然要五天,於是重新再來,掃描第二顆Dyanmic Disk,呼,大概八個小時就可以掃瞄到了,剛看了一下回復的檔案都還滿正常的,現在還要繼續七個小時才能全部回復回來。 呼,真是太刺激了~

寫程式是我的興趣,也是我的工作,但似乎是痛苦的?

不知不覺已經邁向而立之年,身體跟心靈也都有了變化,現在似乎身體越來越遜了,每次去吃到飽,大概十五分鐘就可以吃飽了-.-,唉,又少了一項嗜好。打羽球兩個小時,隔天就會累一整天。 老了也越來越會回憶,最近在發呆的時候,會想到以前當兵的情景,還會繼續想軍歌要怎麼唱,原來四年一下就過去了。當初在受訓的時候感覺好久好久,現在仍記得離開關西的那一天,士官長送我們的畫面。其實我還滿喜歡這樣回憶的~ 突然有一個疑問,為什麼我都沒有回憶過寫程式的時候,明明喜歡寫程式,難道有甚麼原因嗎? 下面是我覺得有可能的兩個原因: 第一個就是寫程式是痛苦的,這我倒不排斥,多少個debug的夜晚,絞盡腦汁,重覆測試,也讓我想到看過的一篇文章,Netscape的程式員寫的 (他的網站  http://www.jwz.org/  ) Pain builds character. (Sometimes it builds products, too.) 痛苦造就性格。(也許還造就產品。) http://www.ruanyifeng.com/blog/2011/12/pain_builds_character.html 因為太痛苦了,所以完全不會回憶。但寫程式應該也有大功完成、大喜的時候吧,為甚麼完全沒有印象呢? 第二個就是寫程式的時候,大腦完全奉獻了,沒有空間留給記憶,所以無法回憶,只有在當兵這種不用動腦的時候才會有一堆回憶!? 看看再過個四年之後會不會有答案吧 20150917: 大推 http://blog.jobbole.com/91103/

WindowsAPICodePack -- edit video file wmv metadata property title comments

其實很早之前就看過WindowsAPICodePack了,那時候覺得是個好東西,但裡面太大了,就沒有一個一個去玩,而且他的最近更新日期也很久以前了。 今天有一個需求,要修改檔案的Metadata,就是你在檔案總管對著檔案按右鍵,可以切到細節的那個頁籤,就可以看到Title,Rating之後的。 我們的問題是因為透過某支tool編輯wmv檔案之後,他會加上Comments這個屬性,我們要把他移掉。於是開始搜尋解法,沒想到一找就找了兩個小時啊。其間用過 edit property shell C# comments video file 之類的關鍵字,但找了一堆都是只能讀的,沒法寫入,也有找到是專門for Office檔案的Metadata的,或是 for Music Files的。甚至強大的 MediaInfo  ,可是他是著重在讀取codec之類的,而不是Windows標準的Metadata。 還試過用PE Explorer來看那支工具程式看他用了哪些API,但太多了,懶的找。 我們是使用 Expression Encoder SDK來作事的,當然Encoder SDK作的到編輯Metadata,但他的作法一定要另存新檔,我覺得這樣很瞎,改一個小小的東西,可能要複製快2GB的影片檔。 最後快要放棄的時候,改用Windows API Shell C# metadata來找,打算自己用Windows API來解了。結果在搜尋那邊看到 WindowsAPICodePack,耶,來看看說不定會有喔。結果真的在 Windows API Code Pack 1.1\source\Samples\Shell\PropertyEditDemo 下找到了,而且很簡單使用的啊! -set System.Comment "No Comments" "C:\1.wmv" 之後再花一小時把DLL整到主程式就OK了,唉,看來平常有在花時間多看點東西,問題才能解比較快啊。