發表文章

目前顯示的是 2010的文章

shell 指令備忘

shell 指令 1. locate      locate tmp | more      尋找檔名有 tmp 的檔案.      如果跑出來一大堆的結果, 那可以使用 more 來將輸出的東西分頁暫停. 2. find      find . -name "*.tmp"      尋找目前目錄及其子目錄, 副檔名為 tmp 的檔案.      find . -name "*.tmp" -exec rm {} \;      同上, 但找到後執行刪除動作.      英文句點代表現行目錄, 當然也可以改成其他的目錄. 3. grep      尋找的是檔案內容是否含有某些字串.      grep Linux *      找目前目錄(不含子目錄)所有含有 Linux 字串的檔案      grep -r Linux *      同上, 但會連子目錄也去找           grep & locate 組合使用           locate tmp | grep Linux 只找含有 Linux 字串的 tmp 檔案.           locate tmp | grep doc 同理, 要找 tmp 的相關說明檔時, 就可以這樣使用.           locate tmp | grep doc | more 這樣也行! 4. > 及 >>      locate tmp > tmp.lst 本來是在螢幕顯示的內容, 現在被導向進 tmp.lst 這個檔案內了.      locate tmp >> tmp.lst 兩個 >> 不會去除原來檔案的內容, 而是附加上去.       > tmp.lst 把一個檔案的內容清掉. 5. ln (link)      ln -s orig.txt link.txt 將原存在的 orig.txt 建一個連結檔 link.txt。      有如 Windows 系統中的捷徑 (shortcut) 一樣.      不加 -s 的話, 則是硬連結(hard link), 除非找出他的 inode (ls -i), 不然,      無法分

gettimeofday sample code

#include < sys/time.h > #include < stdio.h > int main() {   struct timeval tv, tv2;   unsigned long long start_utime, end_utime;   gettimeofday(&tv,NULL);   start_utime = tv.tv_sec * 1000000 + tv.tv_usec;     usleep(1000);   gettimeofday(&tv2,NULL);   end_utime = tv2.tv_sec * 1000000 + tv2.tv_usec;     printf(" runtime = %llu\n", end_utime - start_utime ); }

Thumbs.db

圖片
Thumbs.db 是隱藏檔及系統檔屬性的。 Thumbs.db 其實是檔案總管所自動建立的縮圖快取檔案,只要你使用檔案總管的縮圖檢視模式並瀏覽至有多媒體檔案(列如圖像、影片…之類的檔案)存在的資料夾 Windows 便會自行建立該檔,以加速你下次再瀏覽此資料夾時縮圖顯示的速度,而如果你電腦中多媒體檔案不少的話這個 Thumbs.db 檔案佔用的空間相對的也就相當驚人。 要讓 Winodws 別建立 Thumbs.db 最有效的方法就是停止建立縮圖快取,可以透過「 控制台\資料夾選項\檢視 」設定中勾選「 不要快取縮圖 」來讓 Windows 停止建立縮圖快取。 利用 bat 檔,一次刪掉所有的  Thumbs.db,如下 for %%d in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do del /s /q /f %%d:\Thumbs.db

Linux 終端機下的彩色顯示: 有那些顏色可以選擇呢?

圖片
#!/bin/bash # 顯示 ANSI 的彩色 # esc="\033[" echo -n " _ _ _ _ _40 _ _ _ 41_ _ _ _42 _ _ _ 43" echo "_ _ _ 44_ _ _ _45 _ _ _ 46_ _ _ _47 _" for fore in 30 31 32 33 34 35 36 37; do     line1="$fore "     line2=" "     for back in 40 41 42 43 44 45 46 47; do         line1="${line1}${esc}${back};${fore}m Normal ${esc}0m"         line2="${line2}${esc}${back};${fore};1m Bold ${esc}0m"     done     echo -e "$line1\n$line2" done 前景的顏色號碼是在左邊那一排,背景的則是在上方。 如果你要粗體的字元和高亮度就在參數裏加一個 " 1 " ,所以前景是白色而背景是藍色就成了 "37;44; 1 "。 整個的 ANSI 顏色選擇序列就是 esc[ 3 7 ; 4 4 ; 1 m 註: 背景不可以是高亮度,所以黃色(高亮度的棕色)只能用來作前景。這是硬體上的限制。 顏色代碼: 0 - 黑色 4 - 藍色   3# 是背景顏色 1 - 紅色 5 - 粉紅色 4# 是前景顏色 2 - 綠色 6 - 青色 3 - 黃色 7 - 白色   ;1 是粗體和高亮度

Linux C 函數參考

Linux C 函數參考 http://www.cs.nctu.edu.tw/~yslin/library/linuxc/main.htm

Linux 發佈歷史

圖片

帕金森定律

帕金森定律 。 1958年,英國歷史學家、政治學家西里爾.諾斯古德.帕金森(Cyril Northcote Parkinson),出版了《帕金森定律》(Parkinson's Law)一書。 根據他研究發現, 一個人可以用的時間越多,他做事情的速度會越慢。 一個人同樣做一件事,所用的時間差別很大。 例如每天早上看報紙,可以十分鐘看完,也可以看半天。一個很忙的人二十分鐘內可以寄出一疊明信片,但是一個時間很多的老太婆,他可以花一天才寄出一張明信片:找明信片一個鐘頭,尋眼鏡一個鐘頭,查地址半個鐘頭,寫問候的話一個鐘頭零一刻鐘... 帕金森認為在工作中,工作會自動地膨脹,占滿一個人所有可用的時間,如果時間充裕,他就會放慢工作節奏或是增添其他項目以便用掉所有的時間。 組織內每個人都會覺得自己很忙,忙到做不完。做不完就要再找人做,組織就會膨脹,組織人員不斷膨脹,人員越來越忙,可是組織效率越來越低。 人員能力不好,也會造成組織膨脹。 人員要做一件事,做不好,他有三條路可以選擇: 第一、自己辭職,讓有能力的人來做,不要占著茅坑不拉屎。 第二、找一個能幹的人來協助自己。 第三、找二個比自己差的人來當助手。 一般人會戀棧,不會選第一。也不會選第二,因為他怕有能力者替代他。可是選了第三,一件事本來自己應該要做好,做不好,竟最後是三個人才能做。而平庸的下屬可能又會找更爛的二個助手來做...,以此類推,組織越來越龐大,效率越來越低。 當然,帕金森定律之所以能引起共鳴,就是因為他觀察到組織的通病。要克服這些通病並不容易。我認為, 要從管理者自省開始 。 首先, 管理者要善加利用與規劃自己的時間 。 時間其實是最寶貴資源,每一件事開始做之前就要先想需要多久時間,規畫時間內一定要完成,無論遇到再大的困境也要在時間內完成。不是依自己總時間資源,是依每件事情的計畫時間,要求準時完成。 時間內完成,即使不夠完美,也比雖然完美卻錯失完成時機來的好。更何況,根據帕金森定律,再多的時間也嫌不夠啊,所以,準時的效率比完美的效果重要。 其次, 超越自己能力能做的事,要善加利用比自己強的人來做 。 時代改變,當今領導已經不適合型塑強人來領導,而是組成TEAM,發揮組織綜效戰力。所以領導者不用萬能,當然也不怕執行任務時被有能力的助手幹掉。通常,組織的成敗榮辱都是主管來享受或承擔,因此,

What is different of __init and __exit?

在寫 Driver 時候,您會發現 static int  __init  XXX_init(void) 跟 static void  __exit  XXX_exit(void),跟平常寫 C 語言宣告函式不一樣吧,這兩個巨集分別有不同意義喔,當然也可以將 __init 跟  __exit  拿掉,這不會影響 Driver 的編譯,但是會影響記憶體的優化,Driver 啟動時會呼叫 XXX_init 函式,如果有加上  __init ,當此 init function 執行完,會將記憶體 Release 給系統,這是針對 built-in 的方式才適用,如果是編譯成模組方式,則不會有此功能,然而  __exit  是 Driver 結束後會呼叫的 function,但是跟 __init 剛好功能相反,在 built-in 的 Kernel 映像檔並不會執行到 __exit,編譯成模組才會有釋放記憶體效果,這兩巨集可以參考  linux/init.h  檔案。

程式碼排版的好工具 ─ Artistic Style

圖片
在 SourceInsight 裡,加入「程式碼自動格式化」。 安裝教學步驟如下: 1. 去SourceForge 下載 Artistic Style     下載網址: http://sourceforge.net/projects/astyle/files/ 2. 將AStyle解壓縮,本例放在根目錄下 (C:\astyle) 3. 開啟SourceInsight,上方選單列選擇"Options-->Custom Commands-->Add",      輸入"Artistic   Style"後按OK 4. Run那列輸入"C:\astyle\bin\AStyle.exe --style=allman %f",Dir列保持空白 (註) 5. 下面將Iconic Window打勾,其餘通通取消打勾 6. 點選右側按鈕"Menu-->(右上方)Menu-->(下拉選)View-->"、     "Menu Contents的第一個Toolbars點一下-->按右側Insert-->按OK" 7. 接下來還可以自訂喜歡的熱鍵,在"Options-->Custom Commands"     點選右側按鈕"Keys-->Assign New Keys",按你喜歡的熱鍵,設"Ctrl+Alt+F" 8. 如此就大功告成了!你可以按"Options-->View"看到剛剛設好的Command和熱鍵! 9. 接下來只要按熱鍵"Ctrl+Alt+F",就會背景呼叫AStyle幫你目前的檔案做自動格式化(排版)啦! 註:"--style=allman %f"其中 --style是排版風格的參數、%f則是檔案路徑 Artistic Style非常彈性,有多種格式化(縮排)的風格可以選擇,詳細文件可以參閱: http://astyle.sourceforge.net/astyle.html 網路推薦參數: 1. astyle -rn --style=

Linux Kernel時序的機制

寫Driver時,常常遇到需要「等待一段時間」再處理的動作。 這時候,Timer 就是使用的好時機。 add_timer的使用方法 首先你要申請一個timer struct: static struct timer_list timer; 或是用pointer申請 static struct timer_list *timer; 在第一次使用時一定要初始化: init_timer(&timer); 設定要傳的data timer.data = (unsigned long )foo_data; 設定間隔時間 timer.expires = jiffies + DELAY_TIME; 設定timer到時要跑的function timer.function = foo_function; 接著把這個timer加進timer list結構 add_timer(&timer); 時間到了就會去執行程式foo_function, 但是從此timer就停了。必須重新add_timer才會在下一次繼續啟動 在離開時,記得要 deltimer(&timer); int mod_timer(struct timer_list *timer, unsigned long expires); //修改定時器的expire int timer_pending(const struct timer_list * timer); //返回真或假來指示是否定時器已被運行 底下是我用來點亮 LED,然後過一段時間,自己滅掉 LED 的程式例子。 typedef struct blk_led_s {      int cBlinking;      struct timer_list blinkled_timer; }blk_led_t; static blk_led_t gEthLed; static void hdd_led_on(void) {     gEthLed.cBlinking = 1;     gEthLed.blinkled_timer.expires = jiffies + HZ/5;     add_timer(&gEthLed.blinkled

Linux Kernel: 簡介HZ, tick and jiffies

Linux 核心幾個重要跟時間有關的名詞或變數,底下將介紹 HZ、tick 與 jiffies。 HZ Linux核心每隔固定週期會發出timer interrupt (IRQ 0),HZ是用來定義每一秒有幾次timer interrupts。舉例來說,HZ為1000,代表每秒有1000次timer interrupts。HZ可在編譯核心時設定,如下所示 (以核心版本2.6.20-15為例): adrian@adrian-desktop:~$ cd /usr/src/linux adrian@adrian-desktop:/usr/src/linux$ make menuconfig Processor type and features ---> Timer frequency (250 HZ) ---> 其中HZ可設定100、250、300或1000。以小弟的核心版本預設值為250。 小實驗 觀察/proc/interrupt的timer中斷次數,並於一秒後再次觀察其值。理論上,兩者應該相差250左右。 adrian@adrian-desktop:~$ cat /proc/interrupts | grep timer && sleep 1 && cat /proc/interrupts | grep timer 0: 9309306 IO-APIC-edge timer 0: 9309562 IO-APIC-edge timer上面四個欄位分別為中斷號碼、CPU中斷次數、PIC與裝置名稱。 問題來了,timer interrupt會做哪些事情? 答案如下所列: 更新時間、日期與系統從開機至目前經過多少時間 。 更新系統資源使用率統計 檢查正在執行的程序是否已經超過其所分配的執行時間額度。如果是的話,則侵佔(preempt)該程序以利執行其它等待執行的程序。 檢查軟體時間器(Software timer,如alarm系統呼叫)跟時間延遲函式(Delay function)的延遲時間是否已經超過。Tick Tick是HZ的倒數,意即timer interrupt每發生一次中斷的時間。如HZ為250時,tick為4毫秒 (millisecond)。 Jiffies

Git command list

Git 基本知識 由 project/.git/config 可知: (若有更多, 亦可由此得知) origin(remote) 是 Repository 的版本 master(branch) 是 local 端, 正在修改的版本 平常沒事不要去動到 origin, 如果動到, 可用 git reset --hard 回覆到沒修改的狀態. 我會用的 git command 1. git tag      git tag                                → 列出既有 tag      git tag -l "XX.*"                 → 搜尋XX.*     How to: Delete a remote Git tag         tag named '12345'         git tag -d 12345         git push origin :refs/tags/12345 2. git reset      git reset xxxx --hard         →  強制恢復到某一版本      git reset --soft HEAD^     →  執行 git commit,發現訊息寫錯想要修改,可以使用。                                                       會刪掉 commit,在執行一次 commit 就可。 3.  git branch & git checkout      local 端產生新的 branch git branch → 列出目前有多少 branch git branch -r                           → 列出所有 Repository branch git branch -a → 列出所有 branch git branch new-branch

20101015 WGA 移除。

將下列文字,存成批次檔。執行就可以了! c: cd \windows\system32 ren WgaLogon.exe WgaLogon.old ren WgaLogon.dll WgaLogon.bak ren WgaTray.exe WgaTray.old regsvr32 /u /s LegitCheckControl.dll del wgalogon*.* del wgatray*.* del LegitCheckControl.dll pause

Bose wave music system .....

圖片
我終於買了!!!!想買很久了,因為很貴。所以一直買不下手。 在微風逛街的時候,不小心又看到了,讓我的心又蠢蠢欲動。 而且剛好是週年慶。可以便宜兩千。愛買東西的人,總會有理由說服自己。 就買了!!NT$22500。還是好貴啊!!! 不過我想是值得的。嘿嘿。。。

ttysnoop

ttysnoop-0.12d.k26 1. cross compile 後,會有 ttysnoop 和 ttysnoops ( client 和 server )。 PS:LIBS = -lcrypt。 build 不過,請加上這行。 2. 在 target 建立資料夾 /var/spool/ttysnoop 。 3. 將 "snooptab.dist" 改名為 snooptab 並 copy 到 /etc/ 下。修改內容如下: # # /etc/snooptab # # tty snoopdev type execpgm # #ttyS1 /dev/tty7 login /bin/login #ttyS2 /dev/tty8 login /bin/login # # remember to inform your gettys on the above lines # that /etc/ttysnoops is the login program now # # the 'socket' snoop-device is for use with the # ttysnoop client # (any tty not listed above will match the wildcard) # * socket login /bin/login # # remember to inform your telnetd that /etc/ttysnoops # is the login program now 4. 將 tysnoops 和 ttysnoop 上傳到 target board。 5. 先執行ttysnoops,會出現:login[575]: root login on 'ttyp0' 可知 console 的訊息會被導到 ttyp0 6. 遠端 telnet 到本機。可用 who 觀看 ~ # who USER       TTY      IDLE      TIME            HOST root       pts/0    

static 用在 function上會有什麼效果?

在 C 中, function  加上   static   modifier 的意義在於限制該 function  只有在其所在的程式檔案中才能被認得。 其最主要的目的在於,當你的程式愈寫愈大,或是由多個人 協同寫一個專案時,為了避免在不同的程式檔案中,不小心 取了相同名稱的  function ,會造成 link fail 甚至是引用到非 自己預期的   function  而不自知。

Linux RS-232 程式設計

Linux RS-232 程式設計 6-1 終端機介面 終端機介面又稱為TTY介面,用來讓Linux系統透過RS-232串列埠連接數據機,通過電話線路與遠端的電腦系統相連接。終端機介面有二種模式:正規(canonical)模式和非正規(non-canonical)模式。 模式 說明 正規模式 又稱為cooked模式。在這種模式中,終端設備會處理特殊字元,且會以一次一列的方式將輸入傳給應用程式。例如Linux的shell指令。 非正規模式 又稱為raw模式。在這種模式中,終端設備不會處理特殊字元,且會以一次一個字元的方式將輸入傳給應用程式。例如在Linux使用vim編輯程式。 串列埠檔案 在Linux中針對所有的周邊裝置都提供了[裝置檔案]供使用者存取。若要存取TTY串列埠只要開啟相關的[裝置檔案]即可。 在Linux中,每一個TTY串列埠都會對應到一個或多個[裝置檔案],[裝置檔案]放在[/dev]目錄中。相關的裝置檔案如下: 裝置檔案 說明 /dev/ttyS0 串列埠的COM1 /dev/typS1 串列埠的COM2 開啟通訊埠 在Linux中將串列埠視為一個檔案,可以使用open()函數來開啟串列埠。底下的程式用來開啟PC的COM1串列通訊埠。   #include #include #include #include #include #include int open_port(void) { int fd; fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY); if(fd == -1){ perror("open error"); } retuen(fd); } 其中 O_NOCTTY:告訴Linux這個程式不想控制TTY介面,如果不設定這個旗標,有些輸入(例如鍵盤的abort)信號可能影響程式。 O_NDELAY:告訴Linux這個程式不介意RS-232的DCD信號的狀態。如果不設定這個旗標,程式會處於speep狀態,直到RS-232有DCD信號進來。 6-2 Termios結構 在Linux中設定串列埠的參數,例如鮑率、字元長度等,可以透過POSIX標準終端介面,