發表文章

為什麼12.04之前的iso 直接dd 到usb 隨身碟無法開機?

答案請參考 https://askubuntu.com/questions/150069/why-dd-is-not-a-reliable-command-to-write-bootable-iso-files-to-usb-thumb-drive (El Torito可啟動光碟規格) 簡單說,光碟的開機引導區跟硬碟不同,雖然把iso dd 到隨身碟,但開機時BIOS仍然把隨身碟當作硬碟開機.一般光碟不含硬碟開機引導區,所以dd 到隨身碟不能開機,12.04之後的iso 前端包含了硬碟開機引導區.所以dd 到隨身碟就可以開了.

ubuntu 16.04開機遇到 flip_done timed out 的問題

若是在ubuntu 16.04 開機時遇到 [drm:drm_atomic_helper_commit_cleanup_done [drm_kms_helper]] *ERROR*[CRTC:26:pipe A] flip_done timed out 的錯誤訊息,通常google得到的結果都是在/etc/default/grub 設定檔裡面幫kerenl parameter加入 video 參數. 在這邊紀錄一下,video參數要視你現行的螢幕怎麼接在電腦上的,例如是HDMI,VGA接頭,還是DVI.只是下" video=SVIDEO-1:d "不一定有效(通常在筆電是有效的). 要知道目前系統上螢幕的配置,可以在x window 的終端機輸入xrandr 來查看.xrandr 會顯示目前系統上有多少個顯示界面可接,以及目前哪個界面所接上的螢幕能支援那幾種解析度 以下是我電腦的配置 #xrandr Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192 VGA-1 disconnected (normal left inverted right x axis y axis) HDMI-1 disconnected (normal left inverted right x axis y axis) DP-1 disconnected (normal left inverted right x axis y axis) HDMI-2 disconnected (normal left inverted right x axis y axis) HDMI-3 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 480mm x 270mm 1920x1080 60.00*+ 50.00 59.94 1920x1080i 60.00 50.00 59.94 1680x1050 59.88 1400x1050 59.95 1600x900 60.00 1280x10...

用putty登入Linux 終端機,表格特殊字元顯示會不正常的問題

如果你用putty 登入linux 主機,當你在執行一些TUI的程式時,表格特殊字元顯示會不正常的問題 例如,去linux kernel source tree , 執行make menuconfig. 經過研究,目前(2018年秋天以前)如果使用ncurses library 來展示TUI 操作的程式都會中標. 這是因為,在putty的世界,如果你指定遠端char encoding 是unicode,那麼putty就會忽略ISO 2022 指定的encoding 轉換跳脫序列,偏偏在terminal 的世界,表格類特殊字元的表示就是用ISO 2022 指定的序列 所以目前解決的方式,是在putty的設定中,遠端char encoding 不要設定成utf-8,這樣就可以正確畫出表格 另外,不是每一個TUI 的程式都會有這樣的問題,因為有些程式他使用的TUI library 是用newt , 經我的實驗來看newt不會有這問題

[C語言]宣告陣列的大小是0 ???

在C語言裡面,可不可以宣告一個大小是0的陣列? 例如: char array[0]; 在gcc的話是可以的,並且,如果你sizeof(array),得到的答案,會是0 幹嘛用的? 最常用的作用是,如果你想利用結構表達一組資料的header,而這個header後面的資料是預先不知道長度的陣列,那麼你可以在結構裡面定義一個陣列大小是0的成員,以後你就可以利用這個陣列成員變數去直接存取header之後的資料. 例如: struct data {     char magic_num;     int len;     char databody[0]; }; 好了,假設你從任何一個地方收到一筆資料封包,這個封包會因為狀況不同而有不同的大小,但是資料的最前面兩個位元組都是固定一個magic number跟一個len代表資料本體的長度的話,你可以把這個封包轉型成struct data的型別,然後直接利用databody這個陣列變數來存取資料,不需要那麼辛苦操作指標來存取 例如 char *recive_buffer; struct data *data_r; recive_buffer = recive_from_other(); data_r = (struct data *)recive_buffer; printf("data total %d\n",data_r->len); printf("last data is %c\n",data_r->databody[len-1]); 如果你想要創造一個類似的資料封包,大小是30bytes,但是最前面兩個位元組依樣是魔術數字跟長度的話,你也可以利用這個方式來配置這個資料封包的記憶體 例如 char *send_buffer; send_buffer =(struct data *) malloc(sizeof(struct data) + (30 - 2)); send_buffer.len = (30 -2); send_buffer.databody[0] = 0; send_buffer.databody[1] = 1; ... ... ...

想要執行時期再決定log 是否輸出的功能該怎麼辦?

一般來說,工程師會在開發階段儘量把工作流程用log 的方式顯示到console,最常用的就是printf(),以利 debug. 等到build release 後,再把log 關掉. 最早最笨的方法,就是build release 的時候,工程師一行一行的把程式碼砍掉,然後編譯.恩,這的確非常的原始. 後來經過演化,工程師學會了使用Macro的方式來開啟跟關閉log.然後再編譯的時候定義不同的Macro define 來build出有log的版本或沒有log的版本.所以我們常常就會看到很多 #ifdef DEBUG ... ... #else ... ... #endif 恩,這的確可以在地球上存活. 不過我需要一個特別的功能,在程式執行的時候才決定log 是否要輸出.最常遇到的需求就是使用者可以用不同的命令列參數開啟或關閉log.最直覺的方法就是stdout重新導向,這也是一個好方法,不過還有一個方法可以提供給大家. int (*run_log)( const char* format, ...); int my_log( const char* format, ...); int my_log( const char* format, ...) {     return 0; } int main(int argc,char** argv) {     if(argc > 1 && strcmp(argv[1],"debug") == 0)         run_log = printf;     else         run_log = my_log;     run_log("log start\n"); } 這樣,使用者可以執行時帶入debug 命令列參數來開啟log

i2c-tools lm-sensors.org , 和我

i2c-framework 公開信 事情是這樣的: 我目前的工作,需要寫一個程式詢問i2c 裝置的一些輸出. 本來呢,我想自己寫個該裝置的driver ,掛入 標準的 kernel i2c framework.但後來我發現有個i2c-dev 界面可以用,這樣我就不用自己寫driver那麼麻煩.更棒的是,i2c-dev 界面已經有人寫好Linux 指令給大家用,那就是i2c-tools i2c-tools 是 lm-sensors.org 開發出來的i2c工具.他依賴於kernel 提供的 i2c-dev driver.i2c-dev driver會在/dev/ 生出i2c-x 這樣的裝置節點,user-space 即可利用 read() ,write,ioctl(),控制i2c master chip. 好了,當我開始研究i2c-tools 的時候,發現了些事情,首先lm-sensors.org 已經沒有網頁了,單純只剩下放置程式碼包的功能.我找了好久才發現 lm-sensors.org 在某個站註冊了mail list ,這免強算是跟lm-sensors.org 官方人員溝通的一個管道. 另外,我得把i2c-tools porting 到 Android. 好,這事很多人應該都做的到,可是lm-sensors.org 沒有收錄,網路上也找不到放出來的程式碼,我得自己作. 最重要的是,lm-sensors.org 沒有替i2c-tools 開放版本控制,只有不定期的snapshot 程式碼包.... 既然這樣,我就把i2c-tools 最近穩定版3.1.0 的程式碼放到google code 他就叫 i2c-framework (https://code.google.com/p/i2c-framework/) 與原先lm-sensors.org 的版權一樣,都是GPL2,而且我在google code 首頁清楚寫明程式碼來自lm-sensors.org 我預計如果在工作上有增強i2c-tools 的地方,就會commit 上去,當然也希望更多人可以參與, 對我來說,我只是希望,在我使用Linux 廣大免費資源的這麼多年後,我也回饋一些到社群. 以上

TortoiseHG 的中文

目前 TortoiseHG 已經有中文翻譯了,雖然翻得不是很好,也還沒有完全翻譯完畢,不過,常用的功能都已經有中文了 若各位有更好的中譯,可以建議給我,謝謝