Zotero語系切換套件:Zotero Bibliography Locale Switcher
Zotero語系切換套件:Zotero Bibliography Locale Switcher
Zotero預設安裝時是使用Firefox的語系,如果你是用中文,則他會用中文語系。如果你使用的引用文獻樣式並不是為中文設計的,那麼輸出的格式會非常奇怪。因此我們要Zotero的時候,要根據文獻的格式來調整語系。
(more...)5月 03, 2011 0 Comments 研究方法 電腦軟體 Software/Zotero Zotero
Zotero預設安裝時是使用Firefox的語系,如果你是用中文,則他會用中文語系。如果你使用的引用文獻樣式並不是為中文設計的,那麼輸出的格式會非常奇怪。因此我們要Zotero的時候,要根據文獻的格式來調整語系。
(more...)5月 02, 2011 11 Comments 程式寫作 電腦軟體 網路管理 DSpace
Linux的命令列畫面讓很多人惟恐避之不及,這對有許多指令需要依賴SSH連線、並在命令列輸入才能執行的DSpace來說,無疑是一大門檻。在此我提出一種可以做到「一鍵指令」的方案:利用AutoIt自動執行機器人,透過PieTTY的命令列模式,用ini設定檔來設定連線參數,來執行捷徑所指定的指令的作法。
這種作法對資安來說非常不理想,僅是一個簡便利用的應急方案而已。
我現在要做的事情是:
而這個方案的目的是將使用者的操作簡化到極限,我希望使用者能夠以滑鼠執行一個檔案,就自動做完上述的所有動作。
簡單來說,這個方案的作法是:
要做到這些事情,需要Linux伺服器端與Windows使用者端的環境一起配置才行。這邊先敘述Linux的部份,大致上是要做以下三件事情:
Linux伺服器建立帳號、密碼、開啟ssh連線等基本操作請參考鳥哥的Linux思房菜。在此最重要的是要配置接收來自客戶端指令的執行腳本「ssh-cmd.sh」。
在本篇的例子中,我以普通使用者「dspace」跟管理者「root」作為帳號、「password」作為該帳號的密碼來說明。
因為帳號是使用「dspace」,所以我在「/home/dspace/ssh-cmd.sh」(SkyDrive備份)這個位置建立起腳本。腳本的內容如下:
#!/bin/bash
# Program:
# Excute command and pause at finish.
## History:
## 2009/11/12 Pudding First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export JAVA_HOME=/usr/java/jdk1.6.0_06
export PATH
export LC_ALL=en_US
export JAVA_OPTS="-Xmx128M -Xms64M -Dfile.encoding=UTF-8"
ANT_HOME=/opt/apache-ant-1.7.0
JAVA_HOME=/usr/java/jdk1.6.0_06
CATALINA_HOME=/opt/apache-tomcat-6.0.16
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANT_HOME/bin:$PATH:/opt/apache-maven-2.0.9/bin
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC JAVA_HOME ANT_HOME CATALINA_HOME
if [ "$1" == "/home/dspace/tomcat_restart.sh" ]; then
at now + 0 minutes < $1
echo "Tomcat will restart now."
else
$1
fi
echo ""
echo "====================================="
echo ""
read -p "Please press ENTER to exit. " doExit
這個腳本中設置了相當多參數,請依照你伺服器的實際情況來決定要設置的參數內容。
此外,由於Tomcat的重新啟動無法直接透過這樣的指令來執行,所以我改成以「at」執行一次的方式來執行。必須說明的是,這並不是很理想的作法,有待以後改善。
如果你沒有需要重新啟動Tomcat的話,這個步驟是可以省略的。「/home/dspace/tomcat_restart.sh」(SkyDrive備份)是用來重新啟動Tomcat伺服器的腳本,內容如下:
export JAVA_HOME=/usr/java/jdk1.6.0_06 export JAVA_OPTS="-Xmx128M -Xms64M -Dfile.encoding=UTF-8" /opt/apache-tomcat-6.0.16/bin/shutdown.sh sleep 1 /opt/apache-tomcat-6.0.16/bin/startup.sh
要記得將這些腳本的執行權限開啟,他們才能正常地執行。
你現在需要在Windows中建立一個資料夾,例如「c:\ssh-cmd\」,然後把以下的檔案放進去:
雖然很多人都知道PieTTY是用來作SSH連線的,但是知道PieTTY可以透過命令列與指令檔案來進行連線並執行指令的人就不多了,其實這是基於PieTTY改編自PuTTY原始就有的功能喔。
具體來說,利用命令列來透過PieTTY連線的作法如下:
pietty0327.exe -l [ID] -P [PORT] -pw [PASSWORD] -m [COMMAND] -t [HOST]
裡面的參數中:
連線的配置資訊,我將它存放在「config.ini」中。「config.ini」的內容如下:
[ssh-dspace] login=dspace pw=password [ssh-root] login=root pw=password [ssh] port=22 host=127.0.0.1
在此安排了兩種不同的身分,一種是以普通使用者「dspace」來執行,另一種是以管理者「root」來執行。除了重新啟動伺服器等重大指令之外,一般指令最好是以普通使用者「dspace」的身分來執行會比較安全。
由於要執行指令必須要以存放在檔案中的形式來執行,所以建立這個檔案、並指引PieTTY來連線的工作,是交給AutoIt的自動腳本ssh-cmd.exe來執行。
ssh-cmd.exe是由ssh-cmd.au3編譯而來的,這是AutoIt的程式語言。內容如下:
Dim $user = "ssh-dspace"
Dim $script = ""
If $CmdLine[0] == 2 Then
$user = "ssh-" & $CmdLine[1]
$script = $CmdLine[2]
ElseIf $CmdLine[0] == 1 Then
$script = $CmdLine[1]
EndIf
Dim $login = IniRead("config.ini",$user, "login", "root")
Dim $pw = IniRead("config.ini",$user, "pw", "password")
Dim $port = IniRead("config.ini","ssh", "port", "22")
Dim $host = IniRead("config.ini","ssh", "host", "127.0.0.1")
If $script == "" Then
MsgBox(0, "錯誤", "請指定要執行的指令")
Exit
EndIf
Dim $doExcute = MsgBox(1, "提示","您確定要在伺服器中執行以下命令嗎: " & $script)
If $doExcute == 2 Then
Exit
EndIf
Dim $sh = "cmd.sh"
Dim $scriptHeader = "~/ssh-cmd.sh "
$file = FileOpen($sh, 2)
; Check if file opened for writing OK
If $file = -1 Then
MsgBox(0, "錯誤", "無法開啟檔案")
Exit
EndIf
FileWrite($file, $scriptHeader & $script)
FileClose($file)
Dim $cmd = "pietty0327.exe -l " & $login & " -P " & $port & " -pw " & $pw & " -m " & $sh & " -t " & $host
Run($cmd)
Sleep(1000)
If WinActivate("PieTTY Security Alert") Then
WinActive("PieTTY Security Alert")
Send("{ALTDOWN}Y{ALTUP}")
EndIf
這個腳本做了幾件事情:
接著要建立到「ssh-cmd.exe」的捷徑,並且在捷徑之後加上「參數」。建立好ssh-cmd.exe並改好名字之後,你可以打開捷徑的「內容」,在「目標」的欄位中設定參數。
舉例來說,我現在要在伺服器上以「dspace」身分執行「/home/dspace/tomcat_restart.sh」的指令,那麼目標裡面的設定如下:
"C:\ssh-cmd\ssh-cmd.exe" dspace /home/dspace/tomcat_restart.sh
目標的值除了指定要執行的程式位置之外,還指定了要執行的身分「dspace」跟要執行的指令「/home/dspace/tomcat_restart.sh」。如此配置之後,就能夠讓使用者直接點選此捷徑,讓他自動執行這些動作了。
你可以利用這個例子舉一反三,建立執行不同身分、不同指令的捷徑,並組成一個操作列表,讓使用者易於選擇。也可以將此捷徑放到「開始」程式集裡面,讓使用者更容易執行各種操作。這些動作我是用InnoSetup在安裝時自動配置而成,不過那又是另一番長篇大論了。
儘管一鍵指令的方案我研究了很久,但是仍有很多不完美之處,希望高手能多多指教。
其實這個是DSpace-DLLL寫書的一部分技術內容。之前寫完書之後就匆忙地投入其他事情中,到最近在使用AutoIt時,又把之前寫的檔案挖出來看。
這時候就會覺得這個Blog對我來說也是很重要的,如果沒有這些記錄,我恐怕很快就會忘記自己之前做過的事情了吧。
(more...)如果要架設以Java、JSP、Sevlet系列伺服器端程式語言為主的網頁伺服器,Apache Tomcat(簡稱Tomcat)是相當有名的一套解決方案。我研究DSpace時也是使用Tomcat來架設在CentOS作業系統上。
因為Tomcat並不是CentOS內建服務而是我額外安裝的,所以我設定了crontab讓他在開機時自動執行。由於之前的參數沒有配置完善,導致開機自動執行Tomcat時,讓Java讀取檔案的編碼發生錯誤。
研究了老半天終於找到算是可行的解決方案,在這邊記錄一下。
安裝好Tomcat之後,一般是以命令列執行[tomcat]/bin/startup.sh ([tomcat]表示Tomcat的安裝目錄),但是如果要以自動啟動的方式來啟動Tomcat,卻會因為沒有先執行/etc/profile中設置Java的參數,而會造成啟動失敗。
先回顧一下DSpace安裝步驟裡,在/etc/profile設置Java參數的內容:
JAVA_OPTS="-Xmx2048M -Xms2048M -Dfile.encoding=UTF-8"
ANT_HOME=/opt/apache-ant-1.7.1
JAVA_HOME=/usr/java/jdk1.6.0_12
CATALINA_HOME=/opt/apache-tomcat-6.0.13
CLASSPATH=$CATALINA_HOME/common/lib/servlet-api.jar
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANT_HOME/bin:$PATH:/opt/apache-maven-2.0.9/bin
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC ANT_HOME JAVA_HOME CATALINA_HOME CLASSPATH
其中很重要的是「JAVA_HOME」跟「JAVA_OPTS」這兩項參數。前者是要告訴Tomcat要執行的Java環境必要的套件位置,後者則是執行Java時的參數設定。
如果要自動啟動Tomcat的話,則必須在腳本中加入Java參數設定才行。我建立了一個「/home/dspace/tomcat_startup.sh」的腳本,內容如下:
export JAVA_HOME=/usr/java/jdk1.6.0_12
export JAVA_OPTS="-Xmx2048M -Xms2048M -Dfile.encoding=UTF-8"
/opt/apache-tomcat-6.0.16/bin/startup.sh
這個腳本執行了三件事情:
如果你也要依樣話葫蘆的話,記得要調整一下這些參數的設定喔。
上面在設定JAVA_OPTS的時候,有一個「Dfile.encoding=UTF-8」的編碼參數,這個設定可以讓Java知道要以UTF-8的編碼來開啟檔案,以免他用預設的en_US編碼來處理而造成UTF-8看起來像是亂碼一樣。
但是網路上大部分論壇都主張要將此參數設置在[tomcat]/bin/catalina.sh中,或是一樣在catalina.sh中設定「CATALINA_OPTS=-Dfile.encoding=UTF-8」。前者因為Tomcat版本相差過遠,我找不到要修改的地方;後者還沒試過。
總之,「Dfile.encoding」的參數應該還是有很多其他的地方可以配置,如果大家有更好的方法,也請提出來多多討論吧。
開機自動執行的方法有很多種,其中crontab也可以在開機時指定要執行的程式。crontab是Linux中執行例行性工作排程的好用工具,詳細的原理可以參考鳥哥的介紹。以下我僅敘述如何將「/home/dspace/tomcat_startup.sh」加入crontab開機時自動啟動的腳本中。
輸入「crontab -e」就可以進入編輯畫面了。
[dspace@dspace-dlll ~]$ crontab -e
crontab編輯畫面會以一般的vi文字編輯器形式出現,如果你對vi編輯器不熟的話,還是得先請你看一下鳥哥的操作說明。請在crontab檔案最後加入以下設定:
# Startup tomcat @reboot /home/dspace/tomcat_startup.sh
第一行只是註解。
第二行的「@reboot」參數表示在重新開機時都會執行後面的指令:「/home/dspace/tomcat_startup.sh」。
儲存並離開之後就完成crontab的設定。
設置好crontab之後,別忘了reboot重新啟動來測試一下Tomcat是否有自動地啟動喔。
這個編碼問題讓我煩惱了好久。一開始我還以為是Sevlet或JSP在傳送request的時候編碼設定錯誤,沒想到最後居然是根本上的Java編碼就出了問題。希望這次設定完之後,以後不要再出現編碼的問題了啊。
(more...)5月 02, 2011 1 Comments 程式寫作 電腦軟體
AutoIt是一個執行於Windows環境的腳本機器人,我以前就用AutoIt製作過VirtualBox的自動安裝程式,之後我偶爾也會用AutoIt來幫我排程處理例行事務,省下我自己動手的功夫。
有時候我會需要AutoIt去執行外部程式,這可以藉由它內建的Run()函數來執行。但是AutoIt的Run()函數預設只能執行exe、bat、com、pif,如果參數中的程式不是這些類型,那麼Run()下去就不會有任何反應。
這時候可以以「命令列」(console)的方式來處理,請使用以下的指令:
Run(@ComSpec & " /c " & 'commandName', "", @SW_HIDE)
commandName可以替換成你要執行的程式路徑。要注意到" /c "前後是有空格的喔。
舉例來說,我希望AutoIt自動幫我開啟一個網頁程式「c:\index.html」的話,指令要這樣寫:
Run(@ComSpec & " /c " & 'c:\index.html', "", @SW_HIDE)
如果我要開啟與腳本相同位置的檔案,則可以利用「@ScriptDir」。舉例來說,「index.html」擺在跟AutoIt腳本(或是編譯過的執行檔)相同的目錄之中,則可以利用以下指令來執行「index.html」:
Run(@ComSpec & " /c " & 'index.html', @ScriptDir, @SW_HIDE)
其實這個作法已經寫在Run()函數的網頁說明中,但傻傻的我還是google了好一段時間才發現,在此留下一個記錄。
另外也有人主張用ShellExecute()函數來開啟。以後有機會我再研究看看好了。
(more...)5月 01, 2011 0 Comments 程式寫作 JavaScript Programming/JavaScript
這是修改自GReader Favicon Alerts的userscript,可以在Google閱讀器(Google Reader, GReader)的網頁圖示(favicon)上顯示「目前所在資料夾」的未讀訊息。
原始的GReader Favicon Alerts是顯示所有訂閱的未讀訊息。但我並不會時常盯著所有訂閱訊息,而只會想要關注特定幾個訂閱,並將他們歸類在同一個資料夾中。
GReader Folder Favicon Alerts可以讓你只顯示目前閱讀資料夾的未讀訊息。你可以開啟很多個Google閱讀器、閱讀不同資料夾,這支程式就會幫你把各個資料夾的未讀訊息顯示在網頁圖示上,方便你追蹤最新的訊息。
至於userscript的安裝方式,請參考虫二的[教學]如何讓不同的瀏覽器正確安裝並執行使用者腳本 (Userscript)。
(more...)5月 01, 2011 0 Comments 程式寫作 電腦軟體 JavaScript Plurk Programming/JavaScript
這支userscript是我參考GReader Favicon Alerts修改而成,可以在Plurk圖示上顯示未讀訊息的數量。
Google Chrome的「固定分頁」是一個節省分頁導覽列空間的好功能。他將分頁的寬度縮小到只剩下圖示,並固定在分頁導覽列的左方,讓我們保持一些常常需要查閱的網頁。
我常常會將Plurk固定在Chrome中,但是又常常會想切換到Plurk看一看有沒有「未讀訊息」,久而久之就覺得這個切換的動作很麻煩。所以就想要參考GReader Favicon Alerts的方式,在Plurk圖示上加上未讀訊息的記數。
這個程式只能用在Google Chrome、Firefox等有支援userscript的瀏覽器上,IE是沒有支援的。
至於userscript的安裝方式,虫二的[教學]如何讓不同的瀏覽器正確安裝並執行使用者腳本 (Userscript)已經有很詳細的教學,在此不再介紹。
(more...)5月 01, 2011 1 Comments 程式寫作 網站服務 JavaScript Programming/JavaScript
如果要編寫一個圖文並茂的網頁,往往會覺得要找一個可以擺放「圖片」的空間是一件很麻煩的事情。特別是最近我在學習寫userscript的時候,想把套件跟圖片顯示結合在一起,又得要考慮怎麼連結圖片,感到非常頭大。
後來參考了GReader Favicon Alerts的寫法,我才知道原來還有將圖片轉換成Base64編碼,然後直接跟純文字的HTML或JavaScript結合在一起的作法!(備註:IE6不行喔)
根據維基百科的記載:
多用途網際網路郵件擴展(MIME,Multipurpose Internet Mail Extensions)是一個網際網路標準,它擴展了電子郵件標準,使其能夠支持非ASCII字元、二進制格式附件等多種格式的郵件消息。
MIME是由[type]/[subtype]組成。常見的[type]有「text」、「image」、「application」。我們在寫作網頁時,常常看到「image/png」、「text/html」、「text/javscript」之類的格式,這就是MIME喔!
網路上常見的圖片MIME則是「image/jpeg」、「image/gif」跟「image/png」。
根據維基百科的記載:
Base64是一種使用64基的位置計數法。它使用2的最大次方來代表僅可列印的ASCII 字元。這使它可用來作為電子郵件的傳輸編碼。在Base64中的變數使用字元A-Z、a-z和0-9 ,這樣共有62個字元,用來作為開始的64個數字,最後兩個用來作為數字的符號在不同的系統中而不同。
圖片是屬於二進制的檔案,因此不能像HTML或JavaScript這種純文字(plain text)的程式一樣地處理。
舉例來說,上圖中,我以處理純文字的筆記本開啟「1422855-medium2.gif」這個檔案,看到的結果是一堆亂碼。也就是說,一般的純文字處理器是無法處理圖片這種二進制的檔案。
而透過電腦將圖片轉換成Base64編碼之後,資料會成為由英文跟數字組成的純文字資料,如下所示:
這一張圖片的大小為2.01KB,轉換成Base64編碼之後共有2753字元。儘管檔案大小變大了,但這種Base64編碼卻能更方便地使用。
很多程式語言都可以做到將圖片轉換成Base64編碼的工作,而網路上也有許多提供這種服務的網站,例如Binary File to Base64 Encoder / Translator。
操作步驟也很簡單,只要指定圖片的網址,然後就可以取得Base 64編碼了。
輸入後按右邊的「提交」(submit)。
這個網站會自動地加入MIME格式。你可以注意到除了Base 64編碼之外,開頭還有「data:image/gif;base64,……」的檔頭訊息。
不知道有沒有人發現到,開頭這張圖片,其實就是用MIME與Base 64編碼來顯示的喔。
作法一樣是用<img>標籤,但裡面的src屬性卻是指定MIME與Base 64的資料內容。我將程式碼的部份擷取如下:
<img src="data:image/gif;base64,R0lGO……ZTVsGBAA7">
一般的src屬性通常是指定「http://」開頭的網址,但在此卻是使用「data:image/gif;base64,」開頭的MIME與Base 64編碼,而瀏覽器卻也能正常地開啟。
好吧,舊時代的產物IE6並不支援MIME與Base 64編碼顯示圖片的作法就是了。使用的時候請自己注意一下喔。
將圖片轉換成這種純文字的方式儲存有幾個好處:
學到這種作法之後,我的網頁設計跟AJAX應用又開拓了一條廣闊的道路。在此也將這種喜悅分享給大家,一起努力學習吧!
(more...)
Comments