發表文章

建立 git repository 時,要如何找出空目錄,以避免 build code 失敗?

在過去的經驗裡,使用 git 管理 project source code 最討厭遇到空目錄 (empty directory),偏偏我們在 build firmware image 時,常常會需要這樣的目錄,例如 root filesystem 的 /etc, /var, /dev 等等這些目錄。 假如 Makefile 沒有寫好的話,會假設這些目錄是存在的,但是因為 git 並不會儲存空的目錄,這會導致當我們將 project 從 git server clone 下來後,空目錄消失,然後 compile 就 fail 了。 多半這時候的解法就是透過 directory comparison 的工具,例如 Araxis Merge, Beyond Compare,或是 meld 等等,找出空目錄,touch 一個檔案,把檔案加入 git 管理,這樣就可以避免這樣的問題了。 過去我是這樣解決的: 在 project 目錄下,我會執行以下的指令: find 這個指令大家多少都用過,就不多做解釋 -type d 就是找出目錄,man page 說明如下: -empty 就是空檔案或是空目錄的,man page說明如下: -exec find 指令產生的 output,可以有幾種針對 output 做後續處理的方法,其中一種比較直覺的就是透過 exec,將 output 作為新指令的輸入,有點類似 pipeline ( | ) 的概念;exec 的參數必須以 " ; " 結尾,又因為在 shell 下,這個符號有其他用途,所以必須用反斜線標記 (\),然後 " { } " 是代表前面 find 指令的 output string。man page 說明如下: 最後, .gitignore 是 open source community 中,滿常被用來解決這問題的空檔案,而且同時又是 git 本身會 check 的特殊檔案,所以我都是拿這個檔案作為保留空目錄使用。 附註:在搜尋的過程中,也有人建議:如果在空目錄內新增一個 README 之類的檔案,藉以說明這個目錄是用來做什麼的,也是一個不錯的好選擇。

[Kernel] error: ‘PATH_MAX’ undeclared (first use in this function)

如標題所說,今天在嘗試 Build Kernel 時發現了這個問題: scripts/mod/sumversion.c: In function ‘get_src_version’: scripts/mod/sumversion.c:384: error: ‘PATH_MAX’ undeclared ( first use in this function ) scripts/mod/sumversion.c:384: error: ( Each undeclared identifier is reported only once scripts/mod/sumversion.c:384: error: for each function it appears in. ) scripts/mod/sumversion.c:384: warning: unused variable ‘filelist’ make [ 4 ] : *** [ scripts/mod/sumversion.o ] Error 1 make [ 3 ] : *** [ scripts/mod ] Error 2 make [ 2 ] : *** [ scripts ] Error 2 make [ 2 ] : Leaving directory ` /home/steven_wu/dsr1000n/linux/kernel_2.6/linux ' make[1]: *** [linux] Error 2 make[1]: Leaving directory `/home/steven_wu/dsr1000n/linux/kernel_2.6' make: *** [ kernel ] Error 2 這時只需要: vim scripts/mod/sumversion.c 查看最上面的宣告中是否有 include  limits.h ,若沒有,則加入一行: #include <limits.h> -- 做個筆記

解決 Error opening terminal: xterm 的問題

最近在玩某個 SDK 的 menuconfig,突然發現到他會跳出一堆錯誤訊息: root @xxxxx : / home / steven_wu / xxxx / xxxxx # make menuconfig (中略) Error opening terminal: xterm . make: *** [menuconfig] Error 1 上網 google 了一下解法,發現到說: 由於我使用 putty 來登入 ssh,其內建預設的 Terminal-type 為  xterm, 因此他在 link 到  /usr/share/terminfo 的 ~/x/ folder 時,會發現找不到 xterm 來供他使用。 於是有以下兩種解決辦法: 1. 參考(大陸網頁)  http://www.linuxidc.com/Linux/2011-04/34704.htm 宣告環境變數,使用 vt100 來取代之 export TERM = vt100 export TERMINFO =/ usr / share / terminfo 或者是 2. 到  / usr / share / terminfo/x/ 內,建立一個 link ,讓 xterm 指到漂亮的彩色文字編輯器: cd / usr / share / terminfo / x / ln - s xterm - color xterm 這樣就可以在 putty 底下看到漂亮的 menuconfig 了。 PS. 用 SecureCRT 來連線,由於其內預設使用 VT100,因此不會有這個問題。

PPS手動去廣告方法 (Win 7 可用)

我用的是官網最新下載的版本 (V2.7.0.1512) 然後根據這篇的方法來操作的 (Under Windows 7),懶得看的人可以直接看這篇: 對岸網站: http://blog.163.com/zhulangtianya@126/blog/static/12675033020103634350549/ 在這邊簡單說一下我的操作方法: 1. 關閉 PPS 加速器: 工具 -> 選項 -> 點播服務,然後把「允許 PPS 運行加速器...」(什麼的)給關掉, 這樣就不會使用快取來佔用你的硬碟空間(PPS會預先讀取影片資料 & 把快取檔存 放到你的硬碟上) 2. 去廣告(記得先關閉 PPS): XP用戶在:C:\Documents and Settings\Administrator\Application Data\PPStream\ Win7用戶在:C:\Users\用户名\AppData\Roaming\PPStream\ 然後把 adsys 底下的資料全清空,然後限制資料夾的存取權限。以 Win 7 為例,對著 資料夾按右鍵 -> 內容 -> 安全性 -> 然後點選到 Everone -> 在拒絕那邊全打勾 最後不免碎碎念一下,MAC 版的竟然本身就沒有廣告...真是坑爹阿

透過 crontab 來定期備份 VirtualBox (ShapShot)

根據上一篇: 透過 VBoxManage 來控制 VirtualBox 既然了解了如何下 command 來控制 virtualbox, 那麼我們便可以更進一步新增排程來定期備份了: 1. 在拍照 (Shapshot) 之前,我們需先讓機器暫時停止下來,並保留原先的狀態: VBoxManage controlvm "<VMName>" savestate 2. 然後拍張照 (SnapShot): BoxManage snapshot "<VMName>" take "<SnapshotName>" 3. 接著再將 vm 從暫停的狀態中啟動: VBoxManage startvm "<VMName>" 由於第二步驟要拍照時,需要為每次拍照的結果取個名字, 因此我寫了一個很簡單的 script ,來自動產生拍照的日期,並做完一系列流程: #!/bin/bash NAME = ` date | head -c 7 | tail -c 3 ` echo "savestate..." VBoxManage controlvm Zeus savestate sleep 10 echo "take snapshot..." vboxmanage snapshot Zeus take Zeus_ $NAME sleep 10 echo "startvm..." #VBoxManage startvm Zeus nohup VBoxHeadless --startvm Zeus & #echo Zeus_$NAME 這個 script 的缺點在於,產生的日期只有月份,對於要精準紀錄 log 時間的人來說有點不足... (以後還有改進空間就是了) 4. 然後透過 crontab ,排入系統排程內: crontab -e 00 03 * * * sh "<location>" /backup_Zenus.sh & 自動設定在每...

解決 VirtualBox 無法開啟 NS_ERROR_FAILURE (0x80004005)

在亂搞之後,我的 VirtualBox 也一度沒辦法開啟過,以下簡單紀錄下我的解決方法: 問題紀錄(當然 VM 名稱不是這個) [ root@localhost ~ ] # vboxmanage startvm <vmname> Waiting for VM "<vmname>" to power on... VBoxManage: error: The virtual machine '<vmname>' has terminated unexpectedly during startup with exit code 0 VBoxManage: error: Details: code NS_ERROR_FAILURE ( 0x80004005 ) , component Machine, interface IMachine, callee 參考了網路上的解法之後,大概是這樣: 1. 需要重新去掛載 VirtualBox 的 module: /etc/init.d/vboxdrv setup 2. 在 console 下重新執行一次 VM ,看看能不能動 vboxmanage startvm <vmname> 3. 再利用 console 把 vm 關掉,並重新開機 VBoxManage controlvm <vmname> poweroff 4. 然後再開就不會發生問題了。 網路上的偏方與解法還不少,有的人建議要把 ~/.VirtualBox 底下的 .xml 檔刪除掉,可是這樣一來會造成 之前建立好的 VM 會消失不見(除非你剛灌好,不然就...) 參考看看吧~ PS. 絕對不可以手殘亂去刪除 SnapShot 資料夾底下的資料,不然... 參考資料: http://blog.csdn.net/t0nsha/article/details/7482986 http://forum.ubuntu.org.cn/viewtopic.php?f=65&t=204736 http://passover.blog.51cto.com/2431658/73...

在 Ubuntu 下使用 VNC 來連線

同樣紀錄一下我在 ubuntu 下使用 vnc 的心得: 安裝過程不多說,請參考這篇文章(大陸): http://os.51cto.com/art/201001/176802.htm 然後我利用 ssh 先連入主機後,再執行 vncserver 來啟動 vnc 環境 (不隨著開機啟動) 值得注意的是: 1.你用什麼身份登入(例如 root),所連線過去看到的登入環境就會是那個身份(也是 root) 2. 在 "~/.vnc/xstartup" 底下,需要特別去把 x-window-manager 給 mark 掉, 並加入 gnome-session & ,像是: #!/bin/sh unset SESSION_MANAGER xrdb $HOME /.Xresources xsetroot -solid grey x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & #!x-window-manager & gnome-session & 這樣透過 Client 端登入(例如 RealVNC)後看到的才會是 Ubuntu 原本的桌面環境,而不是 最陽春的 x-window