2010年6月5日 星期六

安裝Ubuntu套件庫沒有的library (以libstdc++.so.5為例)

有時候拿人家的程式來跑,也許是對方只肯給執行檔,或者是不給source的商業軟體,或是其他情況,總之,有時候會遇到自己的系統上缺少該程式所需要的dynamically linked library (也就是系統上的.so檔, shared object),或是自己系統上的函式庫版本太舊或太新,此時的作法有兩種:

1. 使用現有新版函式庫假裝成舊版。
此種方法很簡單,只要把新版函式庫建立一個symbolic link就可以了,例如:
[/usr/lib]$ ln -s libstdc++.so.6 libstdc++.so.5
但是很不幸的這種作法是可能出問題的。
例如我今天就遇到了這個問題....

我的系統上裝有libstdc++.so.6,但我要執行的程式連結到的是libstdc++.so.5。所以我用類似以上的方式做了一個假的,結果在執行的時候,跳出訊息顯示,該程式需要CXXABI 1.2(其實我也不太清楚這是啥,只知道ABI是Application Binary Interface),我猜大概是ABI版本太新....沒辦法我動不到....orz 所以只好認命的去尋找舊版函式庫了...

2.安裝舊版函式庫
我在這篇文章找到做法,而且他寫得很簡單易懂:)

a. 先去Debian Packages抓取我要的套件的deb檔
$ wget http://debian.nctu.edu.tw/debian/pool/main/g/gcc-3.3/libstdc++5_3.3.6-18_amd64.deb

b. 解壓縮抓下來的檔案
$ dpkg-deb -x libstdc++5_3.3.6-18_amd64.deb libstdc++5

c. 把其中的函式庫放到/usr/lib中 (小心不要覆蓋到本來的檔案了)
$ sudo mv libstdc++5/usr/lib/libstdc++.so.5* /usr/lib/

d. 更新linker的cache
$ sudo ldconfig

完成了.....
照著這樣做是沒問題啦....只是我心中還有點疑惑,為什麼不直接安裝該deb套件就好?也許有其他什麼原因?

總而言之,要安裝缺少的library,只要找到相應的.so檔,並放到/usr/lib中(或是/usr/local/lib中),再更新ld的cache即可。
那....如果沒有.so可以抓怎麼辦?那就只好自己找source來編譯了.....那是另外一段故事:D

2010年6月4日 星期五

在apt系統與wget上使用proxy

台灣的學術網路連國外很慢是眾所皆知的事情....但是像ubuntu這種系統,雖然有國內的mirror,但是有些東西,像是ppa之類的source,還是得從國外抓。今天剛裝完機器要更新,發現有些東西實在龜到不行,426B/s耶!雖然最後我抓完了啦.....不過還是要研究一下該怎麼透過proxy抓這些套件。

方法很簡單,只要在/etc/apt/apt.conf 裡面寫入以下這段設定:

ACQUIRE {
http::proxy "http://USER:[email protected]:PORT"
}

2010年6月3日 星期四

在Ubuntu 10.04 (Lucid Lynx)上安裝NX - 許多人推薦的遠端桌面

呃阿阿阿阿阿.....我不知道應該怎麼起頭......其實故事是這樣的,去年有學弟跟我推薦了NX這個遠端桌面,他是NoMachine公司的產品。特色大致上是,支援ssh加密連線,傳輸的資訊有經過壓縮(速度較快,不過影像品質稍微不太好,看得出來是lossy compression),client可以跨平台,windows跟Linux都可以用,這對於有Linux桌面需求的Windows user真是福音阿!!

取得ssh server public key的fingerprint

不說廢話先給答案:
$ ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
對於廢話有興趣的請繼續閱讀............

2010年6月2日 星期三

修改 Google Chrome 的外掛 - RePlurk Chrome 的javascript

用Firefox上噗浪(Plurk)的人,有些都會裝GreaseMonkey這個套件+RePlurk script。只不過我在Google Chrome on Linux上...雖然他預設支援直接安裝userscripts,但是我從來沒有成功跑起來過orz|| (就是可以安裝,但是裝了之後plurk就開不起來了QQ)


後來我發現有個RePlurk Chrome套件,他可以幫你的plurk頁面加上一個"RePlurk"的按鈕....就像我以前在Firefox上用的那樣(dance) 噢...可是有個問題...我喜歡的轉噗形式是:「[轉噗]: xxxxxx」,但是RePlurk Chrome的轉噗形式是:「([ReP]) 作者: xxxxxx」,最困擾的就是他不能自訂(angry)!(GreaseMonkey有提供介面讓你修改scripts)


這篇就是為了解決這種問題的.....:P 首先,我的平台是Linux,更詳細的說,是Ubuntu 10.04 (不過其實在openSUSE上也是一樣).....而這個套件把他的javascript放在哪裡呢?答案如下:


$HOME/.config/google-chrome/Default/Extensions/beaghhigecidoamlpclhiboaeonkceea/0.1.1/RePlurk.js


(補充:在MacOX 10.6.3上是放在「


~/Library/Application Support/Google/Chrome/Default/Extensions/beaghhigecidoamlpclhiboaeonkceea/0.1.1/RePlurk.js」)

那個一長串的是這個擴充套件的ID(在Chrome的擴充套件頁按「開發人員模式」就可以看到),0.1.1是我現在使用的版本...也就是說以後如果這個套件改版可能就會小小換個路徑XD"


那該怎麼辦?


人類哪有這麼強的記憶力....其實我每次都忘記他放在哪裡!我是這麼找到這個檔案的....


$ find ~ |grep -i replurk


其中就會看到RePlurk.js這個檔案了....:P 在windows上一樣可以用搜尋功能來找唷,我想會差不多的吧。


找到檔案之後,就是要修改他的內容了。呃....我不知道該怎麼說明.....他裡面把code都擠在一行了XD 其實可以用搜尋取代啦,但是要有點js的基礎才行,不要改到變數名稱了,改字串就好。此外,對於轉噗的連結(原本是叫做"RePlurk")我也不太滿意....所以我把他改成"轉噗"了。


講東西只講一半,不教怎麼改一定會被看文章的人追殺!所以提供一個替代方案,我把我修改的RePlurk.js分享給大家,以下,請笑納:D


var GM_JQ_src = document.createTextNode("var ReP_Message={};var p=window.Plurks;var o_expand;if(p){o_expand=p.expand;p.expand=function(aa){o_expand(aa);if(typeof ReP_Message.hrefProcessed=='undefined'){ReP_Message.hrefProcessed=true;var ba=document.getElementById('form_holder').lastChild;var ib=document.getElementById('input_big');if(ba&&ib){var ca=document.createElement('a');var da=document.createElement('div');da.setAttribute('class','perma_link');da.id='RePlurkDiv';ca.id='RePlurk';ca.setAttribute('href','javascript:doRePlurk(ReP_Message.owner_id, ReP_Message.raw, ReP_Message.link);');ba.appendChild(da).appendChild(ca).appendChild(document.createTextNode('轉噗'));}}var ea=window.getPD(aa).obj;ReP_Message.link='http://plurk.com/p/'+(ea.plurk_id).toString(36);ReP_Message.raw=ea.content_raw;ReP_Message.owner_id=ea.owner_id;}}function doRePlurk(fa,ga,ha){var ib=document.getElementById('input_big');var ia=window.SiteState.getUserById(fa).nick_name;var ja=ha+' ([轉噗]): '+ga;if(ib){ib.value=ja;p._removeExpand();window.MaxChar.updateBig();}}");

var GM_JQ = document.createElement('script');
GM_JQ.type = 'text/javascript';
GM_JQ.appendChild(GM_JQ_src);
document.getElementsByTagName('body')[0].appendChild(GM_JQ);

將filesystem從ext2 or ext3升級到ext4

剛好有點三八想把ext3轉到ext4去....就找了些資料,寫了這篇文章:P

要轉換成ext4嘛......首先當然有些前提....你的kernel要支援ext4才行:D 另外也建議備份重要資料....

然後step by step的教學就開始了!以下$DEV為device的名字(例:/dev/sda1),$MOUNT為mount point(例:/mnt)

1. 要變更檔案系統,理所當然絕對不能讓他在被mount的時候亂搞,那是會出人命的XD
# umount $DEV

2. 這麼快!? 對....現在就去變更他吧....
# tune2fs -O extents,uninit_bg,dir_index $DEV

2.1 如果是ext2 -> ext4的話則要這樣(因為ext2是沒有日誌(journal)的)
# tune2fs -O extents,uninit_bg,dir_index,has_journal $DEV

3. 變更完之後,一定要做fsck!
# fsck -pf $DEV

(這裡讓我膽顫心驚!因為出現好多error唷....orz||| 而且他還修了很久,差點以為程式爛掉....)

4. 最後就可以把他mount回去囉!
# mount -t ext4 $DEV $MOUNT

4.1 如果是系統預設會mount的filesystem的話,請記得修改/etc/fstab。裡面的參數會紀錄要怎麼mount它...一定要改!

ps. 若是有動到/boot,或是開機遇到grub出現問題的話,參考資料裡面有相關資訊!

參考資料
Ext3升級到Ext4 無損升級 http://blog.chinaunix.net/u1/46672/showart_2069245.html

Linux 文件系統從 ext3 升級到 ext4 http://www.vpsee.com/2010/01/convert-ext3-to-ext4-filesystem/

sshlog-轉換 Ext3 到 Ext4 http://blog.ssh.tw/?p=1447 (有ssh大掛保證,這方法讓我更安心了XD)

使用rsync備份+同步資料

呃...好,我知道rsync很強大,可以做遠端的資料同步,還支援ssh。不過這篇不是完整的rsync教學,只是一篇筆記XD

我的目標很簡單....要把某個目錄A,整個複製成目錄B......不過因為可能要三不五時做這件事,但是其中有改變的檔案又不多....(例如像我的資料備份硬碟就是這樣....我也不支道友沒有更好的作法啦....^^") 那 該怎麼「複製」呢?我使用以下這樣的指令:

2010年4月15日 星期四

用JavaScript判定瀏覽器是否為IE

摘自 http://leeiio.me/ie_detection_in_5_bytes/

<script type='text/javascript'>
var ie = !-[1,];
alert(ie);
</script>


以上程式碼執行結果:IE 下返回true,其他標準瀏覽器返回false。!-[1,],僅僅只有 6 bytes!

<script type='text/javascript'>
// Option from Dean Edwards:
var ie = /*@[email protected]*/false;

// Use the commented line:
var ie//@cc_on=1;

// Variation (shorter variable):
var ie = '\v'=='v';

/ / Option to Gareth Hayes (former record-holder):
var ie = !+"\v1";
</ script>

2010年4月6日 星期二