2011年10月24日 星期一

JDK7 on non-RPM based Linux

JDK 7出來已經有一段時日了,官方網頁也貼心的提供了rpm的套件可以直接安裝,只可惜沒有deb可以下載。雖然如此,我們還是可以省略掉一些手法來同時使用系統提供的jdk6以及網路下載的jdk7--利用update-alternatives工具來達成。但是為了方便作說明,還是先安裝系統套件庫所提供的jdk6吧:

aptitude install sun-java6-jdk

下載適合自己的版本 x86或是x86_64之後,查看自己的java版本以及安裝在何處:

ls -l `which java`
發現原來是連結到/etc/alternatives裡:
lrwxrwxrwx 1 root root 22 2011-10-24 21:39 /usr/bin/java -> /etc/alternatives/java
利用update-alternatives來幫助我們作版本控制,使我們不用手動設定變數等複雜設定,也統一了管理介面。
ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 36 2011-10-24 21:39 /etc/alternatives/java -> /usr/lib/jvm/java-6-sun/jre/bin/java
所以結果揭曉:/usr/bin/java是來自於/etc/alternatives的一個軟連結,而這個軟連結源自於真正的java位置。所以我們看看他的狀態:
update-alternatives --display java
輸出結果可能會是:
java - auto mode
  link currently points to /usr/lib/jvm/java-6-sun/jre/bin/java
/usr/lib/jvm/java-6-sun/jre/bin/java - priority 63
  slave java.1.gz: /usr/lib/jvm/java-6-sun/jre/man/man1/java.1.gz
Current 'best' version is '/usr/lib/jvm/java-6-sun/jre/bin/java'.

所以我們也可以如法泡製,把下載來的jdk7放在/usr/lib/jvm底下。 請至oracle網站下載最新版本的jdk,假設是jdk-7u25-linux-x64.tar.gz

sudo tar zxvf jdk-7u25-linux-x64.tar.gz -C /usr/lib/jvm/
但此時update-alternatives的cache裡並不會自己發現有jdk的存在,這是安裝一個deb檔的postinst程序才會執行的部份。我們自己試著新增一個,語法如下:
update-alternatives --install <link> <name> <path> <priority>

通常priority大於1000比較有可能是首選。假設您下載了多個jdk7的版本且想要安裝到最新,可以利用下列script來達成:

所以到此為止雖然我們都沒有透過dpkg或是aptitude來安裝jdk7,但是一樣可以作到版本控制,非常方便。

啟動Java plugins:
你可以點我有Java嗎?來測試Java plugin是否有安裝上去。在我的LinuxMint 11 amd64的版本裡,我即使安裝了sun-java6-plugin,無論是我的firefox 或是chrome都無法顯示成功啟動java plugin。
試試看這樣行不行得通:

cd /usr/lib/mozilla/plugins
ln -s /usr/lib/jvm/jdk1.7.0_25/jre/lib/amd64/libnpjp2.so .
如果是rpm-based linux,可以這麼做:
cd /usr/lib/mozilla/plugins
ln -s /usr/java/default/jre/lib/amd64/libnpjp2.so .

參考文章:
man update-alternatives

Share

2011年5月29日 星期日

change vdi UUID

如果你想改變vbox裡某個vdi的uuid檔,你會發現vbox會出現uuid衝突而無法直接使用,這種情形最常發生在更改了vdi檔名然後想重新安裝os。在google上找更改uuid的方法,其參數似乎已經不適用,4.0.x以上的版本應該改用sethduuid參數而不是舊的setvdiuuid。

我寫了一個shell script方便自己更改vdi的uuid:

  1. #!/bin/bash
  2. #############################################################
  3. # Filename: changeVDIuuid.sh
  4. # Date: 2011/05/29
  5. # Purpose: change uuid of vdi file
  6. # Usage:
  7. #
  8. # Description:
  9. # Author: maxsolar(Jim T. Tang@IES, Academia Sinica)
  10. #############################################################
  11.  
  12. ###########################
  13. ## pre-defined variables
  14. ###########################
  15. [ "$1" == "" ] && {
  16.     ls *vdi
  17.     read -p "please specify a vdi file: " vdi
  18.     [ -e "$vdi" ] && {
  19.         VBoxManage internalcommands sethduuid $vdi
  20.     } || {
  21.         echo "$vdi doesn't exist. program terminated."
  22.     }
  23. } || {
  24.     [ -e "$1" ] && {
  25.         VBoxManage internalcommands sethduuid $1
  26.     } || {
  27.         echo "$1 doesn't exist. program terminated."
  28.     }
  29. }

2011年2月21日 星期一

GNOME動態桌布 (Wallpaper Slideshow)

上上禮拜重灌了我的Macbook Pro,也順便重灌了ubuntu 10.10。來澳洲很久沒有動腦筋寫程式了,我想寫寫簡單的shell script或許能提神醒腦一下;剛好email收到台南二寮的一些美麗照片,gnome從2.28以後(好像??)就可以動態變更桌布啦,只是他會去讀取某一個.xml檔。所以理論上就是準備好圖片,準備好讓gnome讀取的xml就搞定了。

雖然網路上已經有許多同好也寫了一些script或是程式,不過總覺得沒有自己寫來來得爽快。我的這隻程式功能非常簡單,就是只會在當前工作目錄找所有的jpg以及png檔,然後在當前目錄下建立一個xml,這個xml可以放置在任何地方,唯有圖片本身路徑不能任意移動(這好像是廢話@_@)。

  1. #!/bin/bash
  2. #############################################################
  3. # Filename: makeGnomeBackground.sh
  4. # Date: 2011/02/20
  5. # Purpose: changing background dynamically
  6. # Usage:
  7. #
  8. # Description:
  9. # Author: maxsolar(Jim T. Tang@IES, Academia Sinica)
  10. #############################################################
  11.  
  12. ###########################
  13. ## pre-defined variables
  14. ###########################
  15. # check if there are jpg or png files in current working dir.
  16. find `pwd -P` -maxdepth 1 -name "*jpg" -o -name "*JPG" > filelist.txt 2>/dev/null
  17. find `pwd -P` -maxdepth 1 -name "*png" -o -name "*PNG" >> filelist.txt 2>/dev/null
  18. [ $(cat filelist.txt | wc -l) -eq 0 ]  && {
  19.     echo "****************************************"
  20.     echo "No .jpg nor .png files found. Try other dirs. "
  21.     echo "****************************************"
  22.     exit 1;
  23. } || {
  24.     cat filelist.txt
  25.     echo "-------------------------------"
  26.     echo "$(cat filelist.txt | wc -l) Pictures were found."
  27. }
  28. year=$(date +"%Y" )
  29. month=$(date +"%m")
  30. day=$(date +"%d")
  31. output=$(basename "`pwd`" /).xml
  32.  
  33. ##main method
  34. read -p "Duration time between pictures?  (default=5) " duration1
  35. [ -z $duration1 ] && {
  36.     duration1=5
  37. }
  38.  
  39. read -p "Duration time within a picture?  (default=600) " duration2
  40. [ -z $duration2 ] && {
  41.     duration2=600
  42. }
  43.  
  44. ## part 1
  45. cat <<HERE > $output
  46. <background>
  47.   <starttime>
  48.     <year>$year</year>
  49.     <month>$month</month>
  50.     <day>$day</day>
  51.     <hour>00</hour>
  52.     <minute>00</minute>
  53.     <second>00</second>
  54.   </starttime>
  55. <!-- This animation will start at midnight. -->
  56. HERE
  57. ## part 2
  58. declare -a picArray=(`cat filelist.txt`)
  59. declare -i loops=$(cat filelist.txt | wc -l)
  60. for (( i=1; i<="$loops"; i++ )) ; do
  61.     ##The Last Loop
  62.     if [ $i -eq $loops ]; then 
  63.         cat <<HERE >>$output
  64.   <static>
  65.     <duration>$duration2</duration>
  66.     <file>${picArray[$i-1]}</file>
  67.   </static>
  68.   <transition>
  69.     <duration>$duration1</duration>
  70.     <from>${picArray[$i-1]}</from>
  71.     <to>${picArray[0]}</to>
  72.   </transition>
  73. HERE
  74.     else
  75.     ## in formal loops
  76.         cat << HERE >>$output
  77.  <static>
  78.     <duration>$duration2</duration>
  79.     <file>${picArray[$i-1]}</file>
  80.   </static>
  81.   <transition>
  82.     <duration>$duration1</duration>
  83.     <from>${picArray[$i-1]}</from>
  84.     <to>${picArray[$i]}</to>
  85.   </transition>
  86. HERE
  87.     fi
  88. done
  89. echo "</background>" >> $output
  90.  
  91. echo \"$output\" is made.
  92.  
  93. ## remove temparary file
  94. rm filelist.txt

這個script會讀取當前目錄下的所有jpg/png檔(不分大小寫),然後提問:
1.圖片間切換時間,直接按下enter預設5秒;
2.每張圖片的時間,直接按下enter預設600秒。輸出的xml檔名預設就是該目錄的名稱,建立成功會有提示出現。

在桌面空白處按右鍵->Change Desktop Background->Add

切換到想要gnome讀取的那個資料夾之後,選擇All Files,就可以看到該xml檔。

選取剛剛做好的xml檔之後,就可以在桌布預覽的地方看到我們剛剛的作品。

網路上也有幾篇好玩的可以看看:
Create Your Own GNOME Background Slideshow
[分享] Gnome動態桌布
自動換桌布的shell script

2011年1月30日 星期日

StarCraft II on Linux

星海爭霸II:自由之翼 其實本來在我的MacOSX上跑得好好的。但不知道為什麼,在Perth某一天更新之後,明明已經更新完成了,但是更新小視窗就消失了。點了桌面上的啟動圖示也沒用,又開啟了更新小視窗,然後又顯示下載更新,下載還沒結束小視窗又自動關閉;最後重新安裝StarCraft II也是一樣的下場。

後來,我把她安裝到我的WindowsXP上。不知道為什麼,效率其差無比,但是為了玩,只好將就。到了Adelaide之後,我的xp完全不能開機;塞了光碟片修復之後,雖然可以開了,但是windows的音效卡會自動消失偵測不到混音裝置。我再也沒有興趣跟力氣搞windows這種天生殘障的問題,所以我把腦筋動到wine:我可以輕易的在linux上安裝Office 2003以及CorelDraw 12,為何不試試看裝星海II呢?

在網路上找找StarCraft II on Linux這些關鍵字,看來許多人都成功的在linux上面快樂的玩StarCraft II,我怎麼能例外呢?於是塞進光碟片,就開使用wine來安裝啦!

安裝的過程有點音爆,後來就沒聲音了;字體也有些問題。其實我最不喜歡二代的地方是:她實在是太中文化了,一點fu也沒有。
執行遊戲之前一定要更新實在是很討厭的事情。我這裡網路很貴,安裝玩大約又下載了快400mb的更新程式來安裝,我這禮拜不用上網了。不用上網表示也不能玩SCII了...
不知道為什麼,取截圖總是會有空白的部份...這是在啟動compiz的時候截圖的,剛好截到我女友美麗的眼睛,真是過份...
我等這幕等了好久!真的不知道要更新到何年何月...
終於可以連進去玩了!所有音效、字體、設定等都完全正常,當然必須把compiz關掉,然後把遊戲的特效都切到最低,但還是沒辦法擷取完整的圖,很奇怪;我唯一不肯退讓的是解析度,所以進行遊戲時,我的MacBook風扇瘋狂的運轉,但跑起來並不會停頓,比我在xp上效能還好,果然是我鍾愛的Linux,強而有力,從沒讓我失望!

我是完全沒有遇到任何遊戲上的問題,但是聽說有些人遇到音效上的問題,或許可以參考這兩篇文章:

2011年1月8日 星期六

Ultraedit For Linux(UEX)釋出

UltraEdit For Linux/Mac版其實去年八月底就釋出了,截至目前為止(2011.01.08)在MacOS上的最新版本是2.0.0.2,在Linux上則是1.2.0.12,針對Ubuntu/Debian, OpenSuSE, Redhat, Fedora四大類Linux發行版本提供32及64bits版本的安裝程式。對於非上述Linux的版本則提供以編譯好的tarball,解壓縮之後就可以直接使用。

試用版提供30天的試用期,不管這30天你用多少次,30天之後就會強迫要求輸入註冊碼,否則就會自動關閉。

我們來試用看看吧:

  1. Download UltraEdit Linux 1.2.0.12 patch。如果連結失效的話,試試看這裡
  2. 到UltraEdit Linux下載頁面根據你的作業系統下載相對應的版本。
    除了下載deb或rpm檔之外,請再額外下載最下面的tarball檔。
  3. 將uex的tarball解壓縮,假設解在桌面,然後先進到/home/maxsolar/Desktop/uex/bin裡。
  4. 再將剛剛下載的patch解壓縮,複製其中的UltraEdit_1_2_0_12_Patch_by_Pesymista到/home/maxsolar/Desktop/uex/bin裡。在這個目錄裡執行:
    ./UltraEdit_1_2_0_12_Patch_by_Pesymista
    執行如果有成功,應該再輸入./uex &就可以正常試用UEX。
  5. 到此為止只是先取得一個uex可以執行的環境,設個PATH環境變數就可以正常執行了。可是我希望系統開啟文字文件可以自動辨識有uex可以使用,因此我們現在來安裝他:
  6. 以Debian/Ubuntu為例:
    dpkg -i uex_1.2.0.12_i386.deb || apt-get install -f
    以Fedora 13為例:
    yum localinstall --nogpgcheck UltraEdit-1.2-0.12.fc13.i686.rpm
  7. 接下來,只要複製剛剛patch好的二進位檔就可以了:
    cp /home/maxsolar/Desktop/uex/bin/uex /usr/bin
    rm -r ~maxsolar/Desktop/uex

如果你一開始就安裝deb/rpm到系統上,使用patch並不會成功,或是雖然顯示成功但執行時卻警告segmentation fault;這個方法是個迂迴的方式,讓使用者可以方便的試用UEX。最便宜的單人使用是49.95美元(還說省了10元...)至於有沒有那麼棒的經濟效益就看個人使用需求再選購囉!

2011年1月3日 星期一

Shared folders on Virtualbox

Virtualbox終於邁入4.0了!這個版本比先前3.2.x的版本多了比較視覺化的功能,也開始支援guest MacOSX了!對於USB 2.0的支援變成需要下載額外套件來安裝才行。令我印象比較深刻的是 4.0在shared folders多了automatic mounting的功能,可以讓她自動掛載在/mnt(Solaris)或是/media(Linux)上,對於許多linux不熟的下一步工程師而言,這可是個美好的功能。 本文的目的也是為了紀錄做一個guest端automatic mounting的筆記,只不過我希望透過寫在/etc/fstab裡使其開機可以掛載。我堅信唯有透過撰寫設定檔,才能增加對於該功能的了解。

在shared folders的設定裡有兩個選項:Read-only跟Auto-mount。使用automatic mounting需注意使用者必須有加入vboxsf群組才行。
在Linux guests裡,auto-mount會掛載在/media底下,並且以sf_開頭。舉例來說,一個名稱為DATA的共享資料夾,在Linux裡掛載到/media/sf_DATA,在Solaris上掛載到/mnt/sf_DATA, 在windows裡則會自動多一個磁碟機。

手動或許是一個更好的方法,因為我希望他掛載在我指定的位置上。假設在Linux跟Solaris上使用者的uid=gid=1000,且我想分享的資料夾名稱是MacOSX:

  1. For Solaris guests:
  2. pfexec mount -F vboxfs -o uid=1000,gid=1000 MacOSX /export/home/maxsolar/MacOSX
  3. For Linux guests:
  4. mount -t vboxsf -o uid=1000,gid=1000 MacOSX /home/maxsolar/MacOSX
  5. For Windows guests:
  6. net use Z: \\vboxsvr\MacOSX
三種作業系統所定義的filesystem名稱都不一樣阿,特別是Solaris跟Linux特別容易敲錯,需要小心。

如果寫成設定檔使其開機時就可以自動掛載的情形又是如何呢?

  1. For Linux guests:
  2. 修改/etc/fstab,並新增一行:
    MacOSX /home/maxsolar/MacOSX vboxsf uid=1000,gid=1000 0 0
  3. For Solaris guests:
  4. 修改/etc/vfstab,並新增一行:
    MacOSX - /export/home/maxsolar/MacOSX  vboxfs - yes uid=1000,gid=1000
    Solaris的vfstab相當於Linux的fstab,但是格式有所不同,這七個欄位分別是:
    Device to mount, Device to fsck, Mount point, FS type, Fsck pass, Mount at boot, Options
    但是開機的時候卻會失敗。我找到了Jim Laurent的部落格, 發現他找到了問題所在:Solaris先處理vfstab這個檔案之後才掛載/export底下的ZFS檔案系統,因此把掛載點改成其他非/export的目錄即可成功開機,例如上例需改成:
    MacOSX - /MacOSX  vboxfs - yes uid=1000,gid=1000
    就可以成功開機。不過我還是不喜歡這種感覺,我討厭被限制!幸好Unix/Linux為了達到目的可以有多種方法,我可以新增一個session讓他登入的時候執行,也可以寫在開機之後的script裡。 最簡單的方式就是寫在login shell裡吧!新增一行到/etc/profile裡就可以達到相同目的:
    pfexec mount -F vboxfs -o uid=1000,gid=1000 MacOSX /export/home/maxsolar/MacOSX
  5. For Windows guests:
  6. 什麼事也不用做,輸入net use那行指令就可以永遠使用該磁碟機當作掛載目錄。

這個版本允許使用者建立Mac OS X的虛擬機器耶!只是不知道在guest Mac OS X下該如何設定,即使官方網站的End-user document也沒有寫。不過如果是以上三個作業系統,他的詳細設定則可以從shared folders頁面找到更多詳細設定。