:::

學習的責任

布丁布丁吃布丁

學習的責任

趁著睡覺之前,來聊聊最近的事情吧。

讀書

蔡明月老師在上課的時候總是會感慨地對我們說:「讀書是一件幸福的事情」,而我也深深地表示贊同。

畢業之後,總算能夠放開心胸地讀起自己想要看的書。這段期間陸陸續續地讀了超越Java操作介面設計模式Ruby on Rails建置與執行等程式語言的書籍。讓我回想起以前數度跑去書店就是會拿起一本程式的書、找個地方坐下來就這樣看白書欣賞的往事。

另外因為要準備博士班的考試,所以一邊也在閱讀圖書資訊學方面的教科書與期刊,像是圖書資訊學概論資訊時代的圖書館:新敎育思潮與圖書資訊情報科學原理大學圖書館圖書資訊學刊、以及傳說中的圖書資訊學年鑑ARIST

由於從寫論文開始,我就幾乎沒有在繼續碰圖書資訊學相關的事情,本來我以為我看圖資的書應該會覺得很無聊。不過出乎意料的是,讀書的過程卻是讓我樂在其中。

舉例來說,圖書資訊學概論其實是我大學一年級圖書資訊學導論的指定教科書,理論上我應該看過,但是這次拿起來看的時候卻倍感陌生。而翻閱的過程中,呼應著章節的內容,大學與研究所的授課過程彷彿走馬燈般地歷歷在目。更勝者,以前在讀書時匆忙撇過的名詞、定義、作法,現在可以照自己興趣地深入鑽研。

幾乎每本書都會探討圖書資訊學領域的定位。傳統圖書館學是依附在機構底下,但現在則是更鑽研人們是如何獲得、吸收資訊的學問,這也是我喜歡圖資的主要理由。回頭反省待在陳志銘老師底下做數位學習的定位,我赫然發現「學習」正是資訊傳播的最末端,也就是探究使用者是如何吸收資訊、成為知識一部分的過程。

另一方面,圖資領域是結合多種研究領域的綜合體,儘管情報科學原理一書早在民國80年代就已經出版,但書中探究了資工的資訊檢索、數學的機率統計、社會學的最小努力原則、馬太效應等等,至今仍是非常受用的知識主題。

越是深讀,越是覺得圖資這塊領域既廣闊又實用,讓人覺得身在此領域是一件正確的事情。不過也許某方面來說,只是我那不管做什麼事情都很容易樂在其中的個性使然,才會讓我有這種錯覺吧。

令人欽佩的實務經驗

在閱讀期刊論文的時候,可以看到許多知名的老師(因為圖資界不大,所以總是看到那幾位老師的名字)發表各種不同主題的論文。除了專門為了某個主題進行研究的論文之外,也有許多將圖書館、圖資系所實務工作使用的方法與結果撰寫而成的論文。

特別是後者,我感到非常地敬佩。由於老師擔任館長、或是內部組員等員工,才得以進行一些一般研究生無法取得權限、資料的研究,因此他們的研究結果是很難得的實務經驗。但另一方面,身為工作者,「我很忙,沒空」的理由是家常便飯,而他們卻仍然能在進行日常業務之餘,還能夠完成這些論文。以吳政叡館長敘述輔大圖書館引進RapidILL一文來說,如果只是一般技術人員,大概只會懂得敘述如何引進的細節。然而吳館長不僅僅只是敘述過程,最後還以期刊價位成長率與RapidILL會費兩種不同方案所需要的經費做比較分析,將RapidILL的優勢具體地表現成數據資料。這對其它圖書館來說,將會是非常值得參考的實務成果。

學習的責任

看看其它老師的論文研究,有人做質性分析,有人做技術探討,都各有各的深度、一樣都有各自的精采。然而,在欽佩之餘,我開始想到一件事情:

 

我未來也是要這樣做嗎?

 

唸書唸到現在,老實說我還是不太能夠想像未來跟實務經驗結合在一起的樣子,也不覺得自己能夠做到像老師們筆下的這些研究結果。

儘管論文已經寫完了,實驗也做過了,但是別說是老師,就算最近看到學弟妹積極地進行實驗的樣子,我還是會有一種「我絕對做不到那樣的」的無力感。

很多人問我說,為什麼我還想要繼續唸書,是想要以後去當教授嗎?老實說,我並沒有想這麼多。我真的只是覺得學得還不夠,還有一些想嘗試的事情還沒去做,所以才繼續唸書、繼續學習。

最近才意識到,在學習之後是會伴隨著「責任」的到來。

我家風很自由,爸媽並沒有給我什麼具體的期望,只要我健健康康地活著即可。所以我照自己的興趣讀書,研究喜歡的程式,寫一些無關痛癢的blog文章自娛娛人。但對別人來說,這可就不一樣了。指導教授陳老師一直希望我唸完之後能夠當個教授,而有些公司也會希望學生讀完之後能夠將所學應用到工作上。

以我之前做的教育部通識課程計畫為例,我實作了多媒體轉檔功能,其實只是一種自我挑戰性質的行為,沒做好就算了,不要太認真;但對其它計畫的夥伴來說,卻把它視為該平台的主打功能,而對此功能抱有相當大的期待。對此期待,呼應的不是我,而是專任助理們。我就像是拿「寫論文」當做藉口一般,逃避了後續繁雜的debug工作。

我知道當時我的確是該寫論文,但我也覺得自己不敢對自己所作所為負起責任的態度感到心寒。我沒有想到,自己隨便做一做、只是想跟別人炫耀一下的小玩意兒,到最後居然影響會這麼大。

因為我學習,所以別人加上了期待;因為我實作,所以別人要求了責任。在碩士畢業之後,我越來越能具體地感受到「學習的責任」的存在。

我的學習到底是為了什麼?不能負起責任、保證成果的實作,對別人來說還有意義嗎?我不是為了「能更快、更好地做到更多的事情」而學習了程式語言,但為何不敢像其它接外包案的人一樣地實作呢?我喜歡在blog分享所得所學,那為什麼覺得在期刊上發表,是一件搖不可期的事情呢?

我沒有自信,是因為沒有做過。

我沒有做過,是因為沒有機會去做。

我沒有機會,是因為沒有去把握。

我沒有把握,是因為沒有理由。

我沒有理由,所以繼續學習,繼續思考,究竟未來該怎麼做才好。

(more...)

雲端同步待辦事項工具:RTM + Astrid

布丁布丁吃布丁

雲端同步待辦事項工具:RTM + Astrid

image

你有在用待辦事項(todo)嗎?以往大家常常會拿個3M浮貼紙,貼在顯眼的書桌旁;或是拿個隨身記事本,把待辦事項記著、劃掉。現在時代來到了電腦、網路、智慧型手機,以及雲端服務的技術盛行,我也打算使用電腦與手機來處理待辦事項。經過一番研究,最後我找到的方案是以知名的RTM (Remember The Milk)Android上的軟體Astrid來搭配的雲端同步待辦事項工具。


記得喝牛奶:Remember The Milk (RTM)

image

Remember The Milk,簡稱RTM,這是一個非常知名的「待辦事項」網頁服務。基本使用是免費的,只要透過網路連上RTM的網頁,就能夠像是Gmail一樣地簡單使用。只有需要透過手機同步需求的人才要付費購買額外的服務。

豐富的功能

image

RTM的功能之豐富,根本就不只是拿來應付「記得喝牛奶」這種小事情。舉例來說,RTM除了清單、地點、3等級的優先順序、筆記(多行的任意純文字記事)、日期提醒(跟Google行事曆整合)等基本功能之外,還有可離線使用、多重筆記、標籤分類、延期、清單封存等很棒的功能可以使用。特別是多重筆記功能,允許一項待辦事項記錄多篇筆記,這對我來說實在是太重要了。另一項隨著Gmail而廣為人知的Google Task只有RTM的基本功能水準,無法滿足我的需求。

附帶一提,RTM並沒有夾帶附檔的功能。儘管RTM能夠附上純文字的筆記,但是他並沒有提供像是ProducteeV的附檔功能。這部份似乎已經超過了一個待辦事項服務基本的能力,就算是ProducteeV也只有提供100MB的空間,其實也不是很堪用。我通常會利用Google DocSkyDriveDropbox的Public Link來保存待辦事項的檔案,然後將檔案的網址記錄在RTM中方便查閱。

同步付費限制

儘管RTM功能豐富,但是它僅能靠電腦網路連線使用,對手機同步有付費的這個限制讓我望之卻步。就如我之前利用XMind與Thinking Space寫論文中提到過的,在電腦前面的時候是專心作事,而離開電腦時卻比較容易想「要做什麼事」。而想到什麼就隨手記下,這是我對待辦事項的一個很重要的需求。也因此,有段期間我改用Google Task來記錄待辦事項,但卻常常苦於它功能的不足。

還好,Astrid的出現,又讓我回到了RTM的懷抱。

Android的待辦事項工具:Astrid小章魚

image

Astrid,由於他的圖示就像是上圖一樣,所以也不少人將之暱稱小章魚。

同樣豐富的功能

20110505202033

這是Android智慧型手機系統上面的一個工具,提供了幾乎能與RTM並駕齊驅的豐富功能:清單與標籤分類、分級、筆記,也能夠以2x2的Widget呈現在手機的Home畫面中。

遺憾的是它的操作並不是很流暢,而且並不支援RTM的多重筆記編輯(雖然能看到每一篇筆記內容,但僅有第一篇可以編輯而已。)

RTM同步

20110505201827

縱使Android上的待辦事項多到不勝枚舉,但是Astrid能與RTMGoogle TaskProducteeV等有名的待辦事項服務同步的功能,仍讓我對他愛不釋手(就像他的網址一樣,We Love Astrid)。 

你可能會發現到有點怪怪的,可以跟RTM同步?是的,這是讓我最驚艷的地方,Astrid可以跟RTM同步,而且沒有RTM的付費限制。似乎是RTM有開放部分的API,而Astrid應用了他的API來實作同步功能,因此我們可以在手機離線時使用Astrid增加待辦事項,連上網路時再進行同步整合資料。

不過由於RTM的使用限制,Astrid的RTM同步版本跟主要版本是分頭進行。實際上,一開始Astrid雖然把RTM同步當做主打功能之一,但是同步的結果卻有很多bug,直到現在才比較穩定。如果你是以RTM同步需求為主,請下載Astrid – RTM (No Add-ons) Version,或是我備份到SkyDrive的檔案來安裝。


RTM+Astrid新增待辦事項作法

接下來,我就以實際的說明,介紹我是怎麼利用RTM+Astrid的待辦事項來完成我日常生活中的工作。

1. 建立清單

image

RTM跟Astrid都支援了「清單」的功能,他就是一個待辦事項的列表。通常我會將一項計畫獨立一個清單,然後在該計畫完成之後,利用RTM的「清單封存」功能來封存該清單。

image

接著在Android手機中加入Astrid的widget(HTC翻譯為「小工具」)。Astrid的一大特色就是可以為widget設定「篩選條件」。除了指定單一清單之外,也可以指定多個清單混合,或是指定標籤、未列入標籤的待辦事項,並且允許使用者設定顯示待辦事項的排列順序,功能十分強大。

我以「2011碩士論文」清單為篩選條件,在HOME畫面中建立了一個2x2的Astrid widget,直接點選的話就會開啟該清單。

這樣子準備工作就完成了。

2. 新增待辦事項

image

平常生活中,待辦事項的需求總是隨時隨地會出現。如果在電腦前,我會直接使用RTM網站中的功能來新增;如果不在電腦前,那就是用Astrid來新增囉。

20110505205430

進入Astrid清單後,可以直接從最下面的快速新增列輸入文字來新增待辦事項。

20110505205243

由於手機並不適合打字,所以我通常都會用簡短、不要求正確的方法來輸入,只要自己看得懂即可。

20110505205556

Astrid的編輯功能非常豐富,但我通常只會用到「主旨」、「重要性」跟「備註」(對應到RTM的「待辦事項」、「優先順序」跟「筆記」)而已。

3. 手機同步與電腦上編輯

20110505205750

設定好Astrid與RTM的同步功能之後,以後如果在網路可以連接的地方,Astrid的menu就會出現「Sync Now!」的立即同步功能。同步速度很快,馬上就可以同步完成。但如果網路有問題導致Astrid同步失敗的話,卻也不會出現提示畫面,這讓我有點困擾。

image

同步之後,RTM很快地就會顯示剛剛新增的待辦事項。同樣的,在RTM這邊修改、新增的待辦事項,也會同步到Astrid去喔。

image

我通常會利用「筆記」的功能,幫待辦事項寫上更詳細的內容。而之後如果該事項還有需要補充的東西,則可以繼續寫在「筆記」當中。

4. 待辦導向工作法

image

每天一早起來,我還是昏昏沉沉,不知道該先做什麼的時候,一天的第一件工作就是打開待辦事項啦。

這是我在寫論文程式KALS系統時使用待辦事項的列表內容。我在撰寫程式的過程中常常使用待辦事項來管理要做的事情:

image

目前進度:我會將此待辦事項設為最高優先度,這樣每次檢視待辦事項清單時,我就可以知道我的進度到哪裡。每次做到一個段落,我就會更新這個待辦事項,並把進度的細節寫在筆記當中。

image

利用標籤分類:寫程式時也有不同的待辦事項分類,「todo」是預備要做的功能、「bug」是程式中需要修復的問題、「coding_style」則是撰寫程式時需要注意的規則。

image

每當完成一個項目時,就可以將該待辦事項設定為「完成」。每次完成一個待辦事項,並把它勾選完成的這個瞬間總是讓我感到非常有成就感。

5. 回顧已完成的待辦事項

image

RTM中你可以回顧該清單已經完成的待辦事項,也可以將已完成的事項再切換回「未完成」的狀況。

對我來說,回顧已完成功能就像是日記一樣,可以讓我回顧我到底做了些什麼、當初到底怎麼做的。這也讓RTM待辦事項添增了許多額外的價值。


結語

其實我很久之前就想寫RTM+Astrid的介紹,只是一開始我在等待Astrid對RTM同步功能的穩定,然後後來又投入寫程式、寫論文的工作中,這一篇就一直被耽擱到現在。

其實RTM的應用方式非常地多樣化,常常可以看到別人在宣揚他使用RTM的心得。不過對我來說,能隨時隨地地新增、查閱待辦事項,這才是我使用RTM+Astrid的主要目的。

在meeting的時候,常常會聽到老師唸同學「你們常常都不知道自己要做些什麼,上禮拜說過的事情這週就忘了,這樣子很糟糕」,然後就會拿出他記滿待辦事項的Word給同學參考。老師的苦口婆心甚是中肯,不過我覺得用RTM+Astrid會是一個更好的待辦事項方案。

希望大家也能做好個人管理。不知道要做什麼、或是閒閒沒事的時候,就順手打開RTM,看一看未來該前進的方向吧。

image

p.s. BLOG POST的待辦事項又可以減少一項,爽!

(more...)

用Zotero輸出中文、英文不同的APA參考文獻:我的碩士論文參考文獻製作過程

用Zotero輸出中文、英文不同的APA參考文獻:我的碩士論文參考文獻製作過程

image

雖然我使用Zotero來管理參考文獻的書目資料,但是在撰寫論文的時候一定會碰到一個問題:要怎麼區別中文跟英文的書目?大部分系所對於參考文獻的要求都會希望將「中文文獻」與「英文文獻」分開列表、各自有不同的輸出樣式,但是對Zotero來說並沒有中英之分,只能使用同一種樣式來處理。這對於剛接觸Zotero的人來說是非常地困擾,甚至有人提出了中文用Zotero、英文用EndNote的這種作法,但我個人並不喜歡將文獻分散於多個軟體,造成難以管理的困擾,所以我仍堅持用Zotero來實作中英文不同的參考文獻。

要用Zotero做到這點,其實手續非常多,不見得是一個很理想的作法。但不論如何,還是比不使用書目管理軟體、呆呆地手動輸入還來得快得多就是。

(more...)

Zotero引用文獻樣式之中文APA

Zotero引用文獻樣式之中文APA

image

Zotero是一個依賴Firefox的文獻書目管理套件,用來協助管理文獻、快速輸出學術文獻使用的引用樣式。我在之前做過介紹Zotero功能的投影片,而網路上也可以找到很多Zotero的相關介紹,而我個人也是用Zotero來寫作論文、管理參考文獻。

比較遺憾的是,Zotero基本上是以英語語系國家為主,因此引用文獻樣式中大多也都是英文為主的樣式。儘管Zotero有提供Zotero Style Repository並有非常多種的引用文獻樣式,但卻仍沒有看到專屬於中文,特別是我自己在使用的中文APA樣式。

值得慶幸的是,Zotero允許使用者自行設計csL(Citation Style Language)的樣式檔,因此我參考了張保隆與謝寶煖的「學術論文寫作:APA規範」與hiroshi yui建立的CSL,修改出一份「American Psychological Association in Pulipuli」來使用。經過數篇文章的測試與修改之後,目前此版本已經算是勉強堪用,但Zotero對於資料處理仍有極限,因此仍有需要手動修改的地方。

這一篇我將要介紹在Zotero中安裝「American Psychological Association in Pulipuli」(以下簡稱中文APA)的方法,然後補充仍須手動修改的細節,供使用Zotero的中文使用者利用。

(more...)

Zotero語系切換套件:Zotero Bibliography Locale Switcher

Zotero語系切換套件:Zotero Bibliography Locale Switcher

image

Zotero預設安裝時是使用Firefox的語系,如果你是用中文,則他會用中文語系。如果你使用的引用文獻樣式並不是為中文設計的,那麼輸出的格式會非常奇怪。因此我們要Zotero的時候,要根據文獻的格式來調整語系。

(more...)

Windows一鍵執行SSH指令:AutoIT、Pietty搭配使用

Windows一鍵執行SSH指令:AutoIT、Pietty搭配使用

image

Linux的命令列畫面讓很多人惟恐避之不及,這對有許多指令需要依賴SSH連線、並在命令列輸入才能執行的DSpace來說,無疑是一大門檻。在此我提出一種可以做到「一鍵指令」的方案:利用AutoIt自動執行機器人,透過PieTTY的命令列模式,用ini設定檔來設定連線參數,來執行捷徑所指定的指令的作法。

這種作法對資安來說非常不理想,僅是一個簡便利用的應急方案而已。


一鍵指令的背景與目的

我現在要做的事情是:

  1. 在Windows的環境下
  2. 透過SSH連線到Linux伺服器
  3. 進行登入動作(以及金鑰確認)
  4. 然後執行一個指令。

而這個方案的目的是將使用者的操作簡化到極限,我希望使用者能夠以滑鼠執行一個檔案,就自動做完上述的所有動作。

一鍵指令方案概述

簡單來說,這個方案的作法是:

  1. 利用PieTTY的命令列模式來輸入登入資訊與要執行的指令
  2. 以ini檔案儲存登入資訊
  3. 在Linux伺服器端配置參數與接收命令的sh腳本
  4. 利用AutoIt來處理連線的細節
  5. 利用Windows的捷徑與捷徑後輸入的參數,將參數輸入給AutoIt

Linux環境配置

要做到這些事情,需要Linux伺服器端與Windows使用者端的環境一起配置才行。這邊先敘述Linux的部份,大致上是要做以下三件事情:

  • 建立帳號、密碼
  • 開啟ssh連線
  • 建立ssh-cmd.sh腳本

Linux伺服器建立帳號、密碼、開啟ssh連線等基本操作請參考鳥哥的Linux思房菜。在此最重要的是要配置接收來自客戶端指令的執行腳本「ssh-cmd.sh」。

在本篇的例子中,我以普通使用者「dspace」跟管理者「root」作為帳號、「password」作為該帳號的密碼來說明。

ssh-cmd.sh:執行指令腳本

因為帳號是使用「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_restart.sh:重新啟動Tomcat伺服器腳本

如果你沒有需要重新啟動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使用者端配置

你現在需要在Windows中建立一個資料夾,例如「c:\ssh-cmd\」,然後把以下的檔案放進去:

PieTTY的命令列執行方式

雖然很多人都知道PieTTY是用來作SSH連線的,但是知道PieTTY可以透過命令列與指令檔案來進行連線並執行指令的人就不多了,其實這是基於PieTTY改編自PuTTY原始就有的功能喔。

具體來說,利用命令列來透過PieTTY連線的作法如下:

pietty0327.exe -l [ID] -P [PORT] -pw [PASSWORD] -m [COMMAND] -t [HOST]

裡面的參數中:

  • [ID]是要登入的帳號
  • [PORT]是連接埠
  • [PASSWORD]是密碼
  • [COMMAND]是「存放指令的檔案位置」,注意,不是指令,只是檔案位置喔
  • [HOST]要連線的主機IP
config.ini:連線配置

連線的配置資訊,我將它存放在「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」的身分來執行會比較安全。

ssh-cmd.exe:執行連線腳本

由於要執行指令必須要以存放在檔案中的形式來執行,所以建立這個檔案、並指引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

這個腳本做了幾件事情:

  1. 接收來自外部的「身分」與「指令」參數(稍後建立Windows捷徑的時候,我會再說明怎麼輸入這邊的參數)
  2. 讀取來自config.ini中的連線資訊,包括「帳號」、「密碼」、「伺服器位置」、「連接埠」
  3. 過濾指令、顯示提示
  4. 將指令寫入「cmd.sh」檔案中
  5. 以命令列執行PieTTY連線
建立Windows捷徑

image

接著要建立到「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...)

CentOS中自動啟動Tomcat的亂碼問題

CentOS中自動啟動Tomcat的亂碼問題

image

如果要架設以Java、JSP、Sevlet系列伺服器端程式語言為主的網頁伺服器,Apache Tomcat(簡稱Tomcat)是相當有名的一套解決方案。我研究DSpace時也是使用Tomcat來架設在CentOS作業系統上。

因為Tomcat並不是CentOS內建服務而是我額外安裝的,所以我設定了crontab讓他在開機時自動執行。由於之前的參數沒有配置完善,導致開機自動執行Tomcat時,讓Java讀取檔案的編碼發生錯誤。

研究了老半天終於找到算是可行的解決方案,在這邊記錄一下。

Tomcat啟動腳本規劃考量

安裝好Tomcat之後,一般是以命令列執行[tomcat]/bin/startup.sh ([tomcat]表示Tomcat的安裝目錄),但是如果要以自動啟動的方式來啟動Tomcat,卻會因為沒有先執行/etc/profile中設置Java的參數,而會造成啟動失敗。

/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啟動腳本

如果要自動啟動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

這個腳本執行了三件事情:

  1. 設置JAVA_HOME變數為「/usr/java/jdk1.6.0_12 」
  2. 設置JAVA_OPTS變數為「-Xmx2048M -Xms2048M -Dfile.encoding=UTF-8」
  3. 執行「/opt/apache-tomcat-6.0.16/bin/startup.sh 」以啟動Tomcat

如果你也要依樣話葫蘆的話,記得要調整一下這些參數的設定喔。

Tomcat解決亂碼的爭議點

上面在設定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中開機自動執行Tomcat啟動腳本

開機自動執行的方法有很多種,其中crontab也可以在開機時指定要執行的程式。crontab是Linux中執行例行性工作排程的好用工具,詳細的原理可以參考鳥哥的介紹。以下我僅敘述如何將「/home/dspace/tomcat_startup.sh」加入crontab開機時自動啟動的腳本中。

1. 進入crontab編輯畫面

輸入「crontab -e」就可以進入編輯畫面了。

[dspace@dspace-dlll ~]$ crontab -e
2. 加入開機執行指令

crontab編輯畫面會以一般的vi文字編輯器形式出現,如果你對vi編輯器不熟的話,還是得先請你看一下鳥哥的操作說明。請在crontab檔案最後加入以下設定:

# Startup tomcat
@reboot /home/dspace/tomcat_startup.sh

第一行只是註解。

第二行的「@reboot」參數表示在重新開機時都會執行後面的指令:「/home/dspace/tomcat_startup.sh」。

儲存並離開之後就完成crontab的設定。

3. 重新啟動測試

設置好crontab之後,別忘了reboot重新啟動來測試一下Tomcat是否有自動地啟動喔。


結語

這個編碼問題讓我煩惱了好久。一開始我還以為是Sevlet或JSP在傳送request的時候編碼設定錯誤,沒想到最後居然是根本上的Java編碼就出了問題。希望這次設定完之後,以後不要再出現編碼的問題了啊。

(more...)