:::

作研究到底是為了誰?

布丁布丁吃布丁

作研究到底是為了誰?

每次回家的時候,都會有一個固定的出門行程:去看婆婆。

我婆婆現在待在老人院,她在台北的兒子、三位在台中的女兒會輪流來看她。其中一個是我媽媽,似乎也是看得最勤的一位,每次我回來的時候,她總是會挑一天去探望婆婆。

婆婆她年事已高,應該有八十了吧?我對這種事情都記不太起來。我們去探望她的時候,她在吃點心,吃得滿嘴都是、落到地上。問她剛剛在吃些什麼,她答了幾句「聽唔」的台語,也說「哇嘸災」。「她應該是忘記她剛剛吃了什麼了。」我媽說著,一邊去廁所準備毛巾,指示我幫婆婆擦擦嘴、洗洗臉。我笨手笨腳的,最後還是媽媽來示範怎麼作。「要像照顧小孩一樣,用手指按住去擦,這樣才擦的乾淨。」媽媽說這是訣竅。

之後我們推著婆婆去外面散步,媽媽提到有篇母親寫的文章,大意像是:「兒子啊,有一天我也會老去,我會沒辦法自己吃飯、自己洗澡,甚至是自己上廁所。請你記得像我小時候照顧你一樣地照顧我,可以嗎?」

這讓我聯想到有個人說過:「小孩越養越大,充滿希望;老人越照顧越邁向死亡,充滿無奈。」每次來探望婆婆的時候,逐漸喪失身體機能的她,的確總是讓人覺得哀傷。


有一次楊老師帶我們去桃園大園跟一位公益組織管理的老師座談,那位老師請我們舉幾個所知道的非營利組織。同學們舉了「勵馨基金會」、「慈濟功德會」等等,可是尷尬的是,我腦袋只想得到「W3C」——全球資訊網協會

仔細想想,好像不只如此,我的努力似乎都是在幫助那些「有希望的人」,而沒顧慮到那些「沒有希望的人」。

我網誌中寫的一些技術文件,是給懂得這方面的人;我作一些網頁小工具,是給會操作網頁的人;我研究標註工具,做出來的也是只有給那些會使用電腦的人——那不會使用電腦的人,他們怎麼辦?

我可以設計一個介面優良、檢索快速簡便的全文資料庫,我也可以設計符合使用者需求的數位圖書館服務,這些都可以幫助進行學術研究的老師、學生們完成更上一層的研究——那又如何?

我可以靠看書懂得怎麼撰寫JAVA程式語言,但是卻不知道該怎麼拿毛巾幫婆婆擦嘴洗臉,這種深刻的違和感在心中一直揮之不去。

有時候會發現我自己口口聲聲說要幫助別人,可是就連最需要幫助的人,我都幫不上忙。我選擇的這條道路,真的是正確的嗎?

嗯……越想只是越鑽牛角尖而已。

只好把希望寄託他人,希望那些受到我幫忙過的人,他們有更多的力量去幫助那些真正需要幫忙的人吧。

 

不想擺圖,這篇就都是文字吧。

(more...)

DSpace新增編輯語系檔功能

布丁布丁吃布丁

DSpace新增編輯語系檔功能

image

實驗版本:DSpace 1.5

DSpace要修改語系檔的時候步驟繁雜,還要考慮編碼的轉換,十分的麻煩。以前我有寫過一個DSpace中文化專用utf-8轉碼程式,但其實那個轉換的功能很陽春、也有些缺陷,不建議再使用。我修改了一下轉碼程式,設計了更完整的編輯介面,並能夠直接在DSpace系統中使用。

我的作法是把原本DSpace那邊僅允許伺服器管理者必須手動修改設定檔的動作,改成用Java檔案管理的方式去建立、修改,跟原本DSpace設計理念有所差別,但是對於初學者來說卻是比較方便的。只是還是要手動重新啟動Tomcat,這個我之後再來寫一個網頁端程式好了。

以下是安裝步驟與使用方法介紹:


安裝檔案

請下載下列檔案,並擺到指定的位置:

  • messages-edit-jspui.zip
    [dspace-source]/dspace/modules/jspui/src/main/webapp/dspace-admin/messages-edit.jsp
    [dspace-source]/dspace/modules/jspui/src/main/webapp/dspace-admin/messages-main.jsp
  • MessagesEditServlet.java
    [dspace-source]/dspace-jspui/dspace-jspui-api/src/main/java/org/dspace/app/webui/servlet/admin/MessagesEditServlet.java
  • util.zip
    [dspace-source]/dspace-api/src/main/java/org/dspace/app/util/FileUtil.java
    [dspace-source]/dspace-api/src/main/java/org/dspace/app/util/EscapeUnescape.java
  • jquery.js (必需要用1.2.6以上版本)
    [dspace-source]/dspace/modules/jspui/src/main/webapp/extension/jquery.js

修改web.xml,增加「messages-edit」路徑

web.xml原本的位置在[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/WEB-INF/web.xml,但是如果您修改過這個檔案了,那麼應該要另外儲存一份修改過得檔案在[dspace-source]/dspace/modules/jspui/src/main/webapp/WEB-INF/web.xml

請在最後一行結尾標籤</web-app>之前加入以下設定:

  <!-- Plugin Messages Editor  -->
  <servlet>
    <servlet-name>edit-messages</servlet-name>
    <servlet-class>org.dspace.app.webui.servlet.admin.MessagesEditServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>edit-messages</servlet-name>
    <url-pattern>/dspace-admin/messages-edit</url-pattern>
  </servlet-mapping>

然後請把web.xml儲存在[dspace-source]/dspace/modules/jspui/src/main/webapp/WEB-INF/web.xml之中。

修改navbar-admin.jsp,增加編輯語系檔的連結

navbar-admin.jsp預設位置在[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/layout/navbar-admin.jsp,修改之後應該另存一份檔案在[dspace-source]/dspace/modules/jspui/src/main/webapp/layout/navbar-admin.jsp。

請找到以下程式碼:

我們增加一段程式碼在它

  <tr class="navigationBarItem">
    <td>
      <img alt="" src="<%= request.getContextPath() %>/image/<%= (currentPage.endsWith("/statistics") ? "arrow-highlight" : "arrow") %>.gif" width="16" height="16"/>
    </td>
    <td nowrap="nowrap" class="navigationBarItem">
      <a href="<%= request.getContextPath() %>/statistics"><fmt:message key="jsp.layout.navbar-admin.statistics"/></a>
    </td>
  </tr>

之後(不要動到原本的程式碼喔),如下:

  <tr class="navigationBarItem">
    <td>
      <img alt="" src="<%= request.getContextPath() %>/image/<%= (currentPage.endsWith("/dspace-admin/messages-edit") ? "arrow-highlight" : "arrow") %>.gif" width="16" height="16"/>
    </td>
    <td nowrap="nowrap" class="navigationBarItem">
      <a href="<%= request.getContextPath() %>/dspace-admin/messages-edit"><fmt:message key="jsp.layout.navbar-admin.editmessages"/></a>
    </td>
  </tr>

修改語系檔

修改您現有的語系檔之前,要先確認您所使用的語系檔為何。您可以在dspace.cfg裡面找到default.language設定。如果設定為default.lanuage = en_US,那麼您所使用的語系檔名為預設的「Messages.properties」,如果不是en_US而是「zh_TW」,那麼檔名應該是「Messages_zh_TW.properties」。由於我是用中文撰寫的,所以現在要加入的語系設定也是中文,故我們以「Messages_zh_TW.properties」作為範例。

語系檔會在[dspace-source]/dspace/modules/jspui/src/main/resources/Messages_zh_TW.properties,請在最後加入以下設定:

jsp.layout.navbar-admin.editmessages = \u7de8\u8f2f\u8a9e\u7cfb\u6a94

jsp.dspace-admin.messages-main.title = \u7de8\u8f2f\u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-main.heading = \u7de8\u8f2f\u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-main.submit_saved = \u5df2\u7d93\u5132\u5b58\uff01\u8acb\u91cd\u65b0\u555f\u52d5Tomcat\u7db2\u9801\u4f3a\u670d\u5668\u4ee5\u770b\u5230\u4fee\u6539\u7684\u6210\u679c\u3002
jsp.dspace-admin.messages-main.submit_cancel = \u53d6\u6d88\u7de8\u8f2f
jsp.dspace-admin.messages-main.default.language = \u76ee\u524d\u9810\u8a2d\u7684\u8a9e\u7cfb\u662f\uff1a
jsp.dspace-admin.messages-main.change-default-language = \u5982\u9700\u8981\u8b8a\u66f4\u7cfb\u7d71\u9810\u8a2d\u8a9e\u7cfb\uff0c\u8acb\u4fee\u6539dspace.cfg\u4e2d\u7684default.language\u8a2d\u5b9a\u3002
jsp.dspace-admin.messages-main.edit = \u7de8\u8f2f\u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-main.create = \u5efa\u7acb\u65b0\u7684\u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-main.create.source = \u5f9e\u4f86\u6e90\u6a94\u6848\u8907\u88fd
jsp.dspace-admin.messages-main.create.to-file-name = \u5230\u65b0\u7684\u8a9e\u7cfb\u6a94\u540d\u7a31
jsp.dspace-admin.messages-main.lang-collision = \u4e0d\u80fd\u8ddf\u73fe\u6709\u7684\u8a9e\u7cfb\u6a94\u540d\u7a31\u91cd\u8907\uff01
jsp.dspace-admin.messages-main.lang-empty = \u8a9e\u7cfb\u6a94\u540d\u7a31\u4e0d\u80fd\u662f\u7a7a\u503c\uff01
jsp.dspace-admin.messages-main.lang-active = \u73fe\u5728\u4f7f\u7528

jsp.dspace-admin.messages-edit.title = \u7de8\u8f2f\u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-edit.editing-position = \u60a8\u6b63\u5728\u7de8\u8f2f {0} \u8a9e\u7cfb\u6a94
jsp.dspace-admin.messages-edit.filter.key = \u7d22\u5f15\u540d\u7a31\u5305\u542b
jsp.dspace-admin.messages-edit.filter.or = \u6216
jsp.dspace-admin.messages-edit.filter.and = \u4e26
jsp.dspace-admin.messages-edit.filter.key = \u986f\u793a\u5167\u6587\u5305\u542b
jsp.dspace-admin.messages-edit.filter.do = \u641c\u5c0b
jsp.dspace-admin.messages-edit.filter.reset = \u986f\u793a\u5168\u90e8
jsp.dspace-admin.messages-edit.function.create = \u65b0\u589e\u9805\u76ee
jsp.dspace-admin.messages-edit.function.scroll-to-button = \u79fb\u81f3\u9801\u5c3e
jsp.dspace-admin.messages-edit.function.scroll-to-top = \u56de\u5230\u9801\u9996
jsp.dspace-admin.messages-edit.table.key = \u7d22\u5f15\u540d\u7a31
jsp.dspace-admin.messages-edit.table.value = \u986f\u793a\u5167\u6587
jsp.dspace-admin.messages-edit.js.nowLoading = \u8b80\u53d6\u4e2d\u2026\u2026\u8acb\u7a0d\u5019\u2026\u2026
jsp.dspace-admin.messages-edit.js.deleteButton = \u522a\u9664
jsp.dspace-admin.messages-edit.js.deleteConfirm = \u78ba\u5b9a\u662f\u5426\u8981\u522a\u9664\uff1f
jsp.dspace-admin.messages-edit.js.insertButton = \u63d2\u5165
jsp.dspace-admin.messages-edit.js.moveUpButton = \u2191
jsp.dspace-admin.messages-edit.js.moveDownButton = \u2193
jsp.dspace-admin.messages-edit.js.error.heading = \u767c\u751f\u932f\u8aa4
jsp.dspace-admin.messages-edit.js.error.name = \u932f\u8aa4\u540d\u7a31
jsp.dspace-admin.messages-edit.js.error.message = \u932f\u8aa4\u8a0a\u606f
jsp.dspace-admin.messages-edit.js.error.ValueEmpty = \u4e0d\u80fd\u662f\u7a7a\u767d\uff01
jsp.dspace-admin.messages-edit.js.error.WithSlash = \u4e0d\u80fd\u5305\u542b\uff1a
jsp.dspace-admin.messages-edit.js.error.WithNewLine = \u4e0d\u80fd\u63db\u884c\uff01
jsp.dspace-admin.messages-edit.js.error.CharsetError = \u4e0d\u80fd\u5305\u542b\u975e\u82f1\u6578\u5b57\u7684\u6587\u5b57
jsp.dspace-admin.messages-edit.js.save.KeyEmptyError = \u986f\u793a\u5167\u6587\u300c[0]\u300d\u7f3a\u5c11\u7d22\u5f15\u540d\u7a31\uff01
jsp.dspace-admin.messages-edit.js.save.ValueEncodeError = \u89e3\u78bc\u5230\u300c[0]\u300d\u6642\u767c\u751f\u932f\u8aa4\uff01
jsp.dspace-admin.messages-edit.js.filter.processing = \u641c\u5c0b\u4e2d\uff0c\u8acb\u7a0d\u5019\u3002
jsp.dspace-admin.messages-edit.js.sortConfirm = \u6392\u5e8f\u9700\u8981\u4e00\u6bb5\u6642\u9593\u904b\u7b97\uff0c\u800c\u4e14\u6392\u5e8f\u4e4b\u5f8c\u7684\u7d50\u679c\u7121\u6cd5\u5fa9\u539f\uff0c\u8acb\u554f\u662f\u5426\u8981\u7e7c\u7e8c\uff1f
jsp.dspace-admin.messages-edit.js.filter.not-found = \u641c\u5c0b\u6c92\u6709\u7d50\u679c\u3002
jsp.dspace-admin.messages-edit.encode-demo.heading = \u6e2c\u8a66\u8f49\u78bc\u5668
jsp.dspace-admin.messages-edit.encode-demo.text-to-dspace = \u2190
jsp.dspace-admin.messages-edit.encode-demo.dspace-to-text = \u2192

修改dspace.cfg檔案

dspace.cfg位於[dspace]/config/dspace.cfg

請加入以下設定:

#---------------------------------------------------------------#
#---------------Other Plugin Configuration----------------------#

tomcat.dir = /opt/apache-tomcat-6.0.16/webapps/jspui
dspace.source.dir = /opt/dspace-1.5.0-src-release

上面的tomcat.dir跟dspace.source.dir請更換成您實際上Tomcat伺服器當中擺放DSpace的位置,以及DSpace原始碼的位置。如果您之前照我寫的DSpace安裝法的話,那目錄位置就是這樣沒錯。

重新編譯DSpace

步驟如下:

  1. 移至DSpace原始檔目錄中的dspace目錄。注意底下的[dspace-source]要替換成您DSpace原始碼的目錄。
    [dspace@dspace ~]# cd [dspace-source]/dspace/
  2. 執行mvn package指令
    [dspace@dspace dspace]# mvn package

    如果最後出現BUILD SUCCESSFUL,表示編譯成功。
  3. 移至底下的target/dspace-{您DSpace的版本號}-build.dir/目錄。注意,底下的1.5.0要替換成您DSpace的版本號,或是查查看target砥下的目錄即可。
    [dspace@dspace dspace]# cd target/dspace-1.5.0-build.dir/
  4. 執行ant指令:
    [dspace@dspace dspace-1.5.0-build.dir]# ant -Dconfig=[dspace:]/config/dspace.cfg update
  5. 複製DSpace安裝目錄底下的資料夾到Tomcat的webapps目錄之中。注意,底下的[dspace]要替換成您DSpace的安裝目錄,[tomcat]則是要替換成您Tomcat的安裝目錄。
    [dspace@dspace dspace-1.5.0-build.dir]# cd [dspace]
    [dspace@dspace dspace]# \cp -rf [dspace]/webapps/* [tomcat-6.0.16]/webapps/
  6. 重新啟動Tomcat。
    [dspace@dspace dspace]# cd [tomcat]/bin
    [dspace@dspace bin]# shutdown.sh
    [dspace@dspace bin]# startup.sh

功能說明:首頁

要使用編輯語系檔的功能,使用者必須要是管理者權限(Administrator)登入才行,一般的使用者是沒辦法使用的。

image

  1. 從左邊的導覽列可以進入「編輯語系檔」
  2. 偵測目前使用的語系:系統會取得dspace.cfg裡面的default.language設定,這就是您目前DSpace所使用的語系。
  3. 編輯語系檔:下拉式選單可以選擇您要編輯的語系檔。針對目前使用的語系檔,系統會特別在語系檔名稱後標明「現在使用」。
  4. 建立新的語系檔:您可以選擇一個來源檔案,然後將他複製到新的語系檔當中,再進行編輯動作。

功能說明:編輯頁

image

語系檔通常會高達一千多筆資料,進入編輯頁面的時候需要花一段時間讀取,請耐心等候。

  1. 顯示您現在編輯的語系檔名稱。
  2. 搜尋語系檔功能,當您要修改特定語系設定的時候非常好用。讀取完成之後,就可以按下後面的按鈕。
  3. 測試轉碼器:類似原來DSpace中文化專用utf-8轉碼程式的功能,這邊測試的資料並不會寫入語系檔。
  4. 功能列,包括更新、新增項目(在最後面新增一筆語系設定)、移至頁尾、取消(然後返回首頁)。讀取完成之後,就可以按下更新、新增項目的按鈕。
  5. 讀取中的訊息。有時候因為資料量過大,會導致網頁像是當機一樣,請稍後。
  6. 語系編輯器:
    1. 第一欄是索引名稱,請依照DSpace的設計方式,只輸入英文字(盡量小寫)、用「.」分隔索引名稱的層次,用「-」連接多字元片語。
      如果語系檔開頭使用#,則表示是註解,供系統人員閱讀用。編輯器會自動偵測並改變表現形式,如下圖:
      image
    2. 第二欄是顯示內文,也就是真正顯示在網頁上的資料。雖然可以使用一些簡單的HTML,但是不建議用太過複雜的內容,不然很容易導致語系檔錯誤,無法讀取。
    3. 刪除:刪除此設定,無法復原。
    4. 插入:在此設定之後加入一行設定。
    5. 上移與下移。

終於寫完了。

這樣要編輯DSpace語系檔就簡單多了吧。

接下來來作一個Tomcat重新啟動的功能,省得還要到伺服器端重新啟動DSpace吧。<-- Post Catalog -->

(more...)

DSpace擴增MediaFilter(BitstreamDisplay使用篇)

布丁布丁吃布丁

DSpace擴增MediaFilter(BitstreamDisplay使用篇)

DSpace擴增MediaFilter的目錄:

image

BitstreamDisplay.java是我另外撰寫的Java Class物件檔,讓程式設計者可以透過他的method去建立顯示Bitstream的介面。他可以自動判斷是否有利用MediaFilter製作的索引縮圖(thumbnail)或是內部的Bitstream(像是flv、mp3或是用ZoomifyImage轉出來的圖檔),並選擇相對應的顯示介面來顯示。

接下來說明他的使用方法:

引用BitstreamDisplay

如果要使用BitstreamDisplay的話,就必須先引用。在Java裡面,引用語法如下:

import org.dspace.app.webui.util.BitstreamDisplay;

在JSP裡面,引用語法如下:

<%@ page import="org.dspace.app.webui.util.BitstreamDisplay" %>

建立BitstreamDisplay物件

建立BitstreamDisplay物件必需要輸入兩個參數:

  • Item:DSpace的Item物件
  • Bitstream的網址:可以是retrieve的「/jspui/retrieve/468」,也可以是bitstream的「/jspui/bitstream/123456789/83/72/Animal%20Park.m4a」,程式會自動從網址判斷該Bitstream的ID、類型以及相關的內部檔案。

建立物件的範例如下:

//取得DSpace該頁面的Item資訊
Item item = (Item) request.getAttribute("item");
//設定bitstream的網址
String bdLink = request.getContextPath() + "/bitstream/123456789/83/72/Animal%20Park.m4a";
//建立物件
BitstreamDisplay db = new BitstreamDisplay(item, bdLink);

建立Dialog連結

建立完BitstreamDisplay物件之後,接下來就可以用doDialog呼叫他。

method doDialog是這樣使用的:

public String db.doDialog(String innerTEXT, boolean allowDownload)

他會回傳連結語法與顯示Dialog相關的HTML程式碼。

參數說明如下:

  • String innerTEXT:要顯示在連結裡面的HTML程式碼。
  • boolean allowDownload:是否要顯示Download按鈕,請輸入true或false。預設是true。

其他的就交給BitstreamDIsplay去設定吧。必須要注意的是,這些程式碼要搭配jQuery相關的檔案才能順利運行,如果執行的時候發生JavaScript錯誤,那麼不妨回去安裝篇看一下是不是JSPUI中extension漏裝了什麼。


雖然我還寫了其他的method,不過最重要的應該就這個而已,有興趣的話可以開啟BitstreamDisplay.java看看其他method怎麼使用。

寫完之後才發現剛剛寫的安裝篇漏寫了很多東西,再回去補……orz

(more...)

DSpace擴增MediaFilter格式(安裝篇)

布丁布丁吃布丁

DSpace擴增MediaFilter格式(安裝篇)

DSpace擴增MediaFilter的目錄:

本篇介紹DSpace擴增MediaFilter格式的安裝篇,安裝完之後,還要做一次[dspace]/bin/filter-media才能有展示篇的功能。

需求環境

  • DSpace 1.5.0 release (1.4.2或之後的版本似乎也可以)
  • 作業系統:CentOS 5 Final
  • 必須要具備yum的功能
  • 必須安裝OpenOffice 2.0以上

用yum安裝轉檔軟體

如果你不是root的話,先切換到root權限

[dspace@dspace ~]# su root

修改/etc/yum.repos.d/CentOS-Base.repo

[root@dspace ~]# vim /etc/yum.repos.d/CentOS-Base.repo

你可以上鳥哥來看一下vim文字編輯器要怎麼使用。

在該檔案最後加入以下設定:

[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
enabled=1

把金鑰加入RPM的資料庫

[root@dspace ~]# rpm --import http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt


如果你沒辦法下載RPM-GPG-KEY.dag.txt的話,可以下載我的備份檔案。(雖然沒什麼意義,他的伺服器掛點的話,之後yum也沒辦法安裝所需要的檔案啊。)

執行yum的安裝指令

[root@dspace ~]# yum -y install ffmpeg mencoder imagemagick python python-imaging

如果安裝都順利進行的話,那麼這個步驟就完成囉。

配置ZoomifyImage

ZoomifyImage的計畫網站中去下載最新版本,目前是1.4版,也可以下載我另外備份的檔案(24.06MB,有點大喔)。解壓縮之後,擺到/opt/當中 。

在Linux指令列之下,你可以用wget下載檔案,然後利用tar解壓縮,將之移至/opt/當中。指令如下:

[root@dspace ~]# wget http://nchc.dl.sourceforge.net/sourceforge/zoomifyimage/ZoomifyImage1_4.tar.gz
[root@dspace ~]# tar -zxvf ZoomifyImage1_4.tar.gz
[root@dspace ~]# mv ZoomifyImage /opt/

ZoomifyImage必須搭配Python才能執行,所以要記得一定要在之前yum安裝步驟中安裝Python喔。

配置JODconverter跟OpenOffice

請下載JODconverter的檔案,取出lib資料夾之中的所有jar檔(除了commons-cli-1.2.jar跟commons-io-1.4.jar之外),放到[dspace]/lib跟Java安裝目錄的擴增目錄(如果你跟我一樣安裝的是JDK 1.6.0.06,那麼路徑就是/usr/java/jdk1.6.0_06/jre/lib/ext/)之中。或是下載我另外備份的檔案:jodconverter-2.2.2-lib.zip

然後伺服器端必需要開啟OpenOffice的服務,用SSH開啟的話不知為何會失敗,請到本機端執行以下指令:

[root@dspace ~]# /usr/lib/openoffice.org2.0/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

出現以下訊息的時候,表示正常開啟:

image

同樣的,也把這段指令加入開機執行的指令當中吧。

修改/etc/rc.local

[root@dspace ~]# vim /etc/rc.local

請把這段指令「/usr/lib/openoffice.org2.0/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard」加到最後去,這樣就大功告成了。

DSpace註冊Bitstream Format

image

開啟DSpace的管理介面,到「Bitstream Format Regisry(附加檔案(二進位檔案)格式登記)」當中,新增以下幾種檔案格式。支援等級皆選擇「已知」、取消「內部」的打勾。

MIME形式 名稱 完整描述 延伸檔名
video/x-msvideo AVI Audio Video Interleave avi
video/x-flv FLV Flash Video flv
video/x-ms-wmv WMV Windows Media Video wmv
application/vnd.rn-realmedia RM Real Media rm
application/vnd.rn-realmedia-vbr RMVB RealVideo Variable Bit Rate File rmvb
audio/3gpp audio/3gpp 3GPP Multimedia File 3gp
video/3gpp video/3gpp 3GPP Multimedia File 3gp
video/mp4v-es MP4 MPEG-4 Video File mp4
application/zip ZIP ZIP zip
audio/mpeg MP3 MPEG-1 Audio Layer 3 mp3
audio/mid MID Musical Instrument Digital Interface mid
audio/x-aac AAC Advanced Audio Coding aac
audio/flac FLAC Free Lossless Audio Codec flac
audio/ogg OGG Ogg ogg
audio/x-ms-wma WMA Windows Media Audio wma
audio/mp4a-latm M4A MPEG-4 Part 14 m4a
text/tab-separated-values TSV Tab-separated values tsv
text/csv CSV Comma-separated values csv

大部分的檔案格式在DSpace 1.5.0當中已經登錄了,特別是文件檔的類型,包括Microsoft Office跟OpenOffice系列,所以在此不特別敘述。目前我測試機上使用的Bitstream Format Registry資料表可以參考這個檔案,裡面有詳盡的設定,如果之後你發現有些格式沒有辦法正確辨識的話,再來比較這個檔案看看缺了哪些格式。

DSpace增加MediaFilter相關檔案

請將以下檔案下載,新增到指定的位置:

  • mediafilter-dspace-api.zip
    [dspace-source]/dspace-api/src/main/java/org/dspace/app/mediafilter/
  • BitstreamDisplay.zip
    [dspace-source]/dspace-jspui/dspace-jspui-api/src/main?java/org/dspace/app/webui/util/
  • RetrieveZIPServlet.zip
    [dspace-source]/dspace-jspui/dspace-jspui-api/src/main?java/org/dspace/app/webui/util/
  • extension-jspui.zip
    [dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/extension/
    ※預設是沒有extension這個資料夾的,請自行建立。

如果你的DSpace是預設的狀態,並且安裝過我之前介紹的XMLMetadata,那麼可以採用我的檔案:

如果你這些檔案已經做過更動,那麼取代的話會造成你設計的功能消失。因此接下來我介紹怎麼調整這些檔案。

DSpace調整display-item.jsp

位置在[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/display-item.jsp

請在「<dspace:item-preview item="<%= item %>" />」程式碼之前,加入以下JavaScript跟CSS的引用語法,以便帶出jQuery UI等效果:

<script type="text/javascript" src="<%= request.getContextPath() %>/extension/jquery.js"></script> 
<script type="text/javascript" src="<%= request.getContextPath() %>/extension/bitstream-display/thickbox.js"></script> <script type="text/javascript" src="<%= request.getContextPath() %>/extension/bitstream-display/jquery-ui/js/jquery-ui-1.7.1.custom.min.js"></script> <script type="text/javascript" src="<%= request.getContextPath() %>/extension/bitstream-display/doDialog.js"></script> <link rel="stylesheet" href="<%= request.getContextPath() %>/extension/bitstream-display/thickbox.css" type="text/css" /> <link rel="stylesheet" href="<%= request.getContextPath() %>/extension/bitstream-display/jquery-ui/css/smoothness/jquery-ui-1.7.1.custom.css" type="text/css" />

 

DSpace調整web.xml

位置在[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/WEB-INF/web.xml

加入以下設定,讓DSpace擁有直接讀取zip檔案的功能:

  <servlet>
    <servlet-name>retrieve-zip</servlet-name>
    <servlet-class>org.dspace.app.webui.servlet.RetrieveZIPServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>retrieve-zip</servlet-name>
    <url-pattern>/retrieve-zip/*</url-pattern>
  </servlet-mapping>

 

DSpace調整ItemTag.java

位置在[dspace-source]/dspace-jspui/dspace-jspui-api/src/main/java/org/dspace/app/webui/util/ItemTag.java

主要是使用BitstreamDisplay.java來分析、製作要顯示的連結。BitstreamDisplay.java詳細的用法我會另開一篇教,現在先簡介一下加入BitstreamDisplay功能的作法。

先在開頭引用BitstreamDisplay

import org.dspace.app.webui.util.BitstreamDisplay;

然後找到私有方法listBitstreams(),修改顯示連結的部份。請找到以下部份的程式碼:

                                // Work out what the bitstream link should be
                                // (persistent
                                // ID if item has Handle)
                                String bsLink = "<a target=\"_blank\" href=\""
                                        + request.getContextPath();

                                if ((handle != null)
                                        && (bitstreams[k].getSequenceID() > 0))
                                {
                                    bsLink = bsLink + "/bitstream/"
                                            + item.getHandle() + "/"
                                            + bitstreams[k].getSequenceID() + "/";
                                }
                                else
                                {
                                    bsLink = bsLink + "/retrieve/"
                                            + bitstreams[k].getID() + "/";
                                }

                                bsLink = bsLink
                                        + UIUtil.encodeBitstreamName(bitstreams[k]
                                            .getName(),
                                            Constants.DEFAULT_ENCODING) + "\">";

            					out
                                    .print("<tr><td headers=\"t1\" class=\"standard\">");
                                out.print(bsLink);
            					out.print(bitstreams[k].getName());
                                out.print("</a>");
                                

            					if (multiFile)
            					{
            						out
                                        .print("</td><td headers=\"t2\" class=\"standard\">");

            						String desc = bitstreams[k].getDescription();
            						out.print((desc != null) ? desc : "");
            					}

            					out
                                    .print("</td><td headers=\"t3\" class=\"standard\">");
                                out.print(UIUtil.formatFileSize(bitstreams[k].getSize()));
            					out
                                .print("</td><td headers=\"t4\" class=\"standard\">");
            					out.print(bitstreams[k].getFormatDescription());
            					out
                                    .print("</td><td class=\"standard\" align=\"center\">");

            					// is there a thumbnail bundle?
            					if ((thumbs.length > 0) && showThumbs)
            					{
            						String tName = bitstreams[k].getName() + ".jpg";
                                    String tAltText = LocaleSupport.getLocalizedMessage(pageContext, "org.dspace.app.webui.jsptag.ItemTag.thumbnail");
            						Bitstream tb = thumbs[0]
                                        .	getBitstreamByName(tName);

            						if (tb != null)
            						{
            							String myPath = request.getContextPath()
                                            	+ "/retrieve/"
                                            	+ tb.getID()
                                            	+ "/"
                                            	+ UIUtil.encodeBitstreamName(tb
                                            			.getName(),
                                            			Constants.DEFAULT_ENCODING);

            							out.print(bsLink);
            							out.print("<img src=\"" + myPath + "\" ");
            							out.print("alt=\"" + tAltText
            									+ "\" /></a><br />");
            						}
            					}

            					out
                                    .print(bsLink
                                            + LocaleSupport
                                                    .getLocalizedMessage(
                                                            pageContext,
                                                            "org.dspace.app.webui.jsptag.ItemTag.view")
                                            + "</a></td></tr>");

然後修改成以下程式碼,注意標註For Bitstream Display的部份:

                                // Work out what the bitstream link should be
                                // (persistent
                                // ID if item has Handle)
                                String bsLink = "<a target=\"_blank\" href=\""
                                        + request.getContextPath();
                                //For Bitstream Display
								String bdLink = request.getContextPath();
								
                                if ((handle != null)
                                        && (bitstreams[k].getSequenceID() > 0))
                                {
                                    bsLink = bsLink + "/bitstream/"
                                            + item.getHandle() + "/"
                                            + bitstreams[k].getSequenceID() + "/";
                                    //For Bitstream Display
                                    bdLink = bdLink + "/bitstream/"
                                            + item.getHandle() + "/"
                                            + bitstreams[k].getSequenceID() + "/";
                                }
                                else
                                {
                                    bsLink = bsLink + "/retrieve/"
                                            + bitstreams[k].getID() + "/";
                                    //For Bitstream Display
                                    bdLink = bdLink + "/retrieve/"
                                            + bitstreams[k].getID() + "/";
                                }

                                bsLink = bsLink
                                        + UIUtil.encodeBitstreamName(bitstreams[k]
                                            .getName(),
                                            Constants.DEFAULT_ENCODING) + "\">";
                                //For Bitstream Display
								bdLink = bdLink + UIUtil.encodeBitstreamName(bitstreams[k]
                                            .getName(),
                                            Constants.DEFAULT_ENCODING);
            					out.print("<tr><td headers=\"t1\" class=\"standard\">");
                                //out.print(bsLink);
            					//out.print(bitstreams[k].getName());
                                //out.print("</a>");
                                
                                //For Bitstream Display
                                BitstreamDisplay db = new BitstreamDisplay(item, bdLink);
                                out.print(db.doDialog(bitstreams[k].getName()));

            					if (multiFile)
            					{
            						out
                                        .print("</td><td headers=\"t2\" class=\"standard\">");

            						String desc = bitstreams[k].getDescription();
            						out.print((desc != null) ? desc : "");
            					}

            					out
                                    .print("</td><td headers=\"t3\" class=\"standard\">");
                                out.print(UIUtil.formatFileSize(bitstreams[k].getSize()));
            					out
                                .print("</td><td headers=\"t4\" class=\"standard\">");
            					out.print(bitstreams[k].getFormatDescription());
            					out.print("</td><td class=\"standard\" align=\"center\">");

            					// is there a thumbnail bundle?
            					if ((thumbs.length > 0) && showThumbs)
            					{
            						String tName = bitstreams[k].getName() + ".jpg";
                                    String tAltText = LocaleSupport.getLocalizedMessage(pageContext, "org.dspace.app.webui.jsptag.ItemTag.thumbnail");
            						Bitstream tb = thumbs[0]
                                        .	getBitstreamByName(tName);

            						if (tb != null)
            						{
            							String myPath = request.getContextPath()
                                            	+ "/retrieve/"
                                            	+ tb.getID()
                                            	+ "/"
                                            	+ UIUtil.encodeBitstreamName(tb
                                            			.getName(),
                                            			Constants.DEFAULT_ENCODING);

            							//out.print(bsLink);
            							//out.print("<img src=\"" + myPath + "\" ");
            							//out.print("alt=\"" + tAltText
            							//		+ "\" /></a>");
            							
            							//For Bitstream Display
            							String thumbnailImg = "<img src=\"" + myPath + "\" alt=\"" + tAltText
            									+ "\" />";
            							out.print(db.doDialog(thumbnailImg));
            							out.print("<br />");
            						}
            					}

            					//out.print(bsLink
            					//	+ LocaleSupport.getLocalizedMessage(pageContext,"org.dspace.app.webui.jsptag.ItemTag.view")
            					//	+ "</a>");
                                
                                //For Bitstream Display
                                out.print(db.doDialog(LocaleSupport.getLocalizedMessage( pageContext, "org.dspace.app.webui.jsptag.ItemTag.view")));
                                out.print("</td></tr>");

 

DSpace調整style.css.jsp

位置在[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/style.css.jsp

請新增一段程式碼,以讓Bitstream的列表置中:

table.miscTable, table.attentionTable {
	margin: auto;
}

效果圖片如下:

image

DSpace修改dspace.cfg設定

位置在[dspace]/config/dspace.cfg

最後,要加入設定,Media Filter才能生效。預設的Media Filter部份設定如下:

#### Media Filter / Format Filter plugins (through PluginManager) ####
# Media/Format Filters help to full-text index content or
# perform automated format conversions

#Names of the enabled MediaFilter or FormatFilter plugins
filter.plugins = PDF Text Extractor, HTML Text Extractor, \
				 Word Text Extractor, JPEG Thumbnail
# [To enable Branded Preview]: remove last line above, and uncomment 2 lines below
#   			 Word Text Extractor, JPEG Thumbnail, \
#   			 Branded Preview JPEG

#Assign 'human-understandable' names to each filter
plugin.named.org.dspace.app.mediafilter.FormatFilter = \
  org.dspace.app.mediafilter.PDFFilter = PDF Text Extractor, \
  org.dspace.app.mediafilter.HTMLFilter = HTML Text Extractor, \
  org.dspace.app.mediafilter.WordFilter = Word Text Extractor, \
  org.dspace.app.mediafilter.JPEGFilter = JPEG Thumbnail, \
  org.dspace.app.mediafilter.BrandedPreviewJPEGFilter = Branded Preview JPEG

#Configure each filter's input format(s)
filter.org.dspace.app.mediafilter.PDFFilter.inputFormats = Adobe PDF
filter.org.dspace.app.mediafilter.HTMLFilter.inputFormats = HTML, Text
filter.org.dspace.app.mediafilter.WordFilter.inputFormats = Microsoft Word
filter.org.dspace.app.mediafilter.JPEGFilter.inputFormats = BMP, GIF, JPEG, image/png
filter.org.dspace.app.mediafilter.BrandedPreviewJPEGFilter.inputFormats = BMP, GIF, JPEG, image/png

請修改成以下設定:

#### Media Filter / Format Filter plugins (through PluginManager) ####
# Media/Format Filters help to full-text index content or
# perform automated format conversions

#Names of the enabled MediaFilter or FormatFilter plugins
filter.plugins = PDF Text Extractor, HTML Text Extractor, \
				 Word Text Extractor, JPEG Thumbnail, \
FFmpeg Image Capturer, MEncoder Image Capturer, \
FFmpeg Video Converter, MEncoder Video Converter, \
Zoomify Image Converter, FFmpeg Audio Converter, \
ImageMagick Converter, OOg Text Converter, OOg PPT Converter, OOg PDF Converter

# [To enable Branded Preview]: remove last line above, and uncomment 2 lines below
#   			 Word Text Extractor, JPEG Thumbnail, \
#   			 Branded Preview JPEG

#Assign 'human-understandable' names to each filter
plugin.named.org.dspace.app.mediafilter.FormatFilter = \
  org.dspace.app.mediafilter.FFmpegVideoFilter = FFmpeg Video Converter, \
  org.dspace.app.mediafilter.FFmpegImgFilter = FFmpeg Image Capturer, \
  org.dspace.app.mediafilter.MEncoderFilter = MEncoder Video Converter, \
  org.dspace.app.mediafilter.MEncImgFilter = MEncoder Image Capturer, \
  org.dspace.app.mediafilter.ZoomifyFilter = Zoomify Image Converter, \
  org.dspace.app.mediafilter.FFmpegAudioFilter = FFmpeg Audio Converter, \
  org.dspace.app.mediafilter.PDFFilter = PDF Text Extractor, \
  org.dspace.app.mediafilter.HTMLFilter = HTML Text Extractor, \
  org.dspace.app.mediafilter.WordFilter = Word Text Extractor, \
  org.dspace.app.mediafilter.JPEGFilter = JPEG Thumbnail, \
  org.dspace.app.mediafilter.BrandedPreviewJPEGFilter = Branded Preview JPEG, \
  org.dspace.app.mediafilter.ImageMagickFilter = ImageMagick Converter, \
  org.dspace.app.mediafilter.OOgPDFFilter = OOg PDF Converter, \
  org.dspace.app.mediafilter.OOgTextFilter = OOg Text Converter, \
  org.dspace.app.mediafilter.OOgPPTFilter = OOg PPT Converter

#Configure each filter's input format(s)
filter.org.dspace.app.mediafilter.PDFFilter.inputFormats = Adobe PDF
filter.org.dspace.app.mediafilter.HTMLFilter.inputFormats = HTML, Text
filter.org.dspace.app.mediafilter.WordFilter.inputFormats = Microsoft Word
filter.org.dspace.app.mediafilter.JPEGFilter.inputFormats = BMP, GIF, JPEG, image/png
filter.org.dspace.app.mediafilter.BrandedPreviewJPEGFilter.inputFormats = BMP, GIF, JPEG, image/png
filter.org.dspace.app.mediafilter.FFmpegVideoFilter.inputFormats = MP4, MPEG, AVI, FLV, WMV
filter.org.dspace.app.mediafilter.FFmpegImgFilter.inputFormats = MP4, MPEG, AVI, FLV, WMV
filter.org.dspace.app.mediafilter.MEncoderFilter.inputFormats = RM, RMVB, video/3gpp, Video Quicktime
filter.org.dspace.app.mediafilter.MEncImgFilter.inputFormats = RM, RMVB, video/3gpp, Video Quicktime
filter.org.dspace.app.mediafilter.ZoomifyFilter.inputFormats = BMP, GIF, JPEG, image/png, TIFF
filter.org.dspace.app.mediafilter.FFmpegAudioFilter.inputFormats = MP3, AAC, FLAC, OGG, WMA, WAV, M4A
filter.org.dspace.app.mediafilter.ImageMagickFilter.inputFormats = TIFF
filter.org.dspace.app.mediafilter.OOgPDFFilter.inputFormats = Microsoft Powerpoint, OpenDocument Presentation, RTF, OpenDocument Spreadsheet, Calc 6.0 spreadsheets, CSV, TSV, Impress 6.0 presentations, Microsoft Word, OpenDocument Text, Writer 6.0 documents
filter.org.dspace.app.mediafilter.OOgTextFilter.inputFormats = Microsoft Powerpoint, OpenDocument Presentation, RTF, OpenDocument Spreadsheet, Calc 6.0 spreadsheets, CSV, TSV, Impress 6.0 presentations, OpenDocument Text, Writer 6.0 documents
filter.org.dspace.app.mediafilter.OOgPPTFilter.inputFormats = Microsoft Powerpoint, Impress 6.0 presentations, OpenDocument Presentation

# Where is Temp Directory?
filter.tempfile.config = /tmp/

# How to excute FFmpeg?
filter.exec.ffmpeg = ffmpeg
# FFmpeg Config
filter.FFmpegVideoFilter.config = -ar 22050 -ab 56 -f flv -y -s 320x240
filter.FFmpegImgFilter.config = -y -f image2 -ss 8 -t 0.001 -s 80x60
filter.FFmpegAudioFilter.config = -ar 22050 -y

# How to excute MEncoder?
filter.exec.mencoder = mencoder
# MEncoder Config
filter.MEncoderFilter.config = -vf scale=320:240 -ffourcc FLV1 -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -ovc lavc -lavcopts vcodec=flv:vbitrate=200 -srate 22050 -oac lavc -lavcopts acodec=mp3:abitrate=56

# How to excute Python?
filter.exec.python = python
# Where is ZoomifyFileProcessor.py ?
filter.exec.zoomifyImage = /opt/ZoomifyImage/ZoomifyFileProcessor.py
# How to excute ImageMagick?
filter.exec.imagemagick = convert

簡單說明一下各設定檔的用處:

  • filter.plugins:要採用哪些filter,輸入他們的名稱。
  • plugin.named.org.dspace.app.mediafilter.FormatFilter:設定各個filter的名稱。
  • filter.org.dspace.app.mediafilter.*******.inputFormats:設定該filter處理的檔案類型,名稱是Bitstream Format當中的「名稱」,所以上面才要先設定Bitstream Format。
  • 以下都是各個filter的設定參數,可以做進一步的微調。如果你要在Windows環境底下執行的話,這些參數可能需要重新調整。

DSpace重新編譯

步驟如下,注意[tomcat]、[dspace-source]跟[dspace]要替換成你Tomcat的位置、原始碼跟安裝目的地的位置:

  1. cd [dspace-source]/dspace/
  2. mvn package
  3. cd [dspace-source]/dspace/target/dspace-1.5.0-build.dir/
  4. ant -Dconfig=[dspace]/config/dspace.cfg update
  5. \cp -rf [dspace]/webapps/* [tomcat]/webapps/
  6. [tomcat]/bin/shutdown.sh
  7. [tomcat]/bin/startup.sh

DSpace執行filter-media

請執行以下指令:

[root@dspace ~]# [dspace]/bin/filter-media -v

加入-v指令,程式就會顯示他處理的詳細過程,也可以看到剛剛新增的MediaFilter有沒有正確地被採用,如下圖:

image

如果有完成的話,就可以找一個有Bitstream的Item頁面看看這些功能有沒有出來囉。

image


因為MediaFilter結合了許多工具,儘管我已經盡量把安裝動作簡化了,但還是很繁雜,如果哪裡有出錯,請務必通知我。下一篇則是給進階者的BitstreamDisplay使用篇,讓你更進一步地去調整display-item或其他的版面。<-- Post Catalog -->

(more...)

DSpace擴增MediaFilter格式(展示篇)

布丁布丁吃布丁

DSpace擴增MediaFilter格式(展示篇)

DSpace擴增MediaFilter的目錄:

image

DSpace具備MediaFilter(多媒體過濾器,不過以下我還是會用MediaFilter來稱呼)的功能,負責處理DSpace中上傳到Item裡面的Bitstream,每一種Filter的功用各不相同,可以在[dspace]/config/dspace.cfg裡面調整。預設的DSpace提供了以下幾種功能的Filter:

  • JPEG、GIF、PNG跟BMP圖片製作索引縮圖(thumbnail)跟商標縮圖(brand)

    索引縮圖(thumbnail):預設為寬80px、80px以下大小。

    商標縮圖(brand):預設是寬600px、高600px以下大小。
  • HTML、PDF跟Word檔案內的文字抽取出來,以便搜尋引擎製作索引。
    image
    抽取出來的文字會存成txt檔案,但是有時候會抽出亂碼。

預設的功能僅有如此,但這對各種數位物件的應用來說已經不敷使用,因此我又撰寫了幾個MediaFilter來用,並寫了展示的功能,可以搭配display-item時使用。不過大部分功能都只針對Linux(特別是CentOS發行版)環境下使用,而且都是使用開放原始碼自由軟體。

這一篇主要是介紹我到底做出了什麼MediaFilter、怎麼展示,之後再介紹怎麼安裝。


內嵌視窗介面

image 

當安裝完所有功能之後,下面的Bitstream列表基本上跟原始的一樣,但是點下去開啟之後,就會打開jQuery UI的Dialog視窗,取代到原本就讓使用者直接下載的不方便。視窗畫面如下:

image

jQuery UI的Dialog提供了相當具有彈性的操作介面,搭配上面圖片的數字來看有四大功能:(1) 自定義的標題、滑鼠按著標題列則可拖曳視窗;(2) 關閉按鈕,可以隱藏視窗;(3) 下載按鈕,可以下載原始的Bitstream,當然,也可以設定為不開放下載按鈕;(4) 視窗大小調整。此外,使用者可以開啟很多個Dialog,然後隨心所欲地拖曳到使用者想要的地方,或是在不需要的時候關掉指定的Dialog。

必須要注意的是,如果沒有是先做過[dspace]/bin/filter-media的動作的話,以下支援的功能有些就會失效,而仍會連結到原始的Bitstream。

圖片支援

image

支援格式:JPEG、GIF、PNG、BMP、TIFF

播放器:Zoomify Express

搭配新版本的Zoomify播放器,提供大圖瀏覽的功能、無差段縮放(是以前在百年圖書館做Zoomify的進化版喔!)。此外,TIFF也支援索引縮圖的功能了!無損壓縮的TIFF檔案是許多數位典藏採用的共通格式,相信這個MediaFilter能夠接納TIFF,一定可以造福許多數位典藏網站。

影片支援

image 

支援格式:MPEG、AVI、FLV、WMV、MP4、RM、RMVB、3GP、MOV

播放器:FLV Player

就跟大部分影音分享網站(如YouTube)一樣,MediaFilter會把影片檔轉換成可以直接線上播放的FLV檔案。

此外,MediaFilter也會擷取影片第8秒的畫面作為縮圖。

聲音支援

image

支援格式:MP3、WMA、WAV、AAC、FLAC、OGG、M4V

播放器:XSPF Web Music Player

以上格式都會轉換成MP3檔案,再搭配播放器就能夠在網頁中直接播放,而不需要讓使用者再去開啟其他軟體才能聽到音樂。

文件支援

image

支援格式:Offcie系列的doc、ppt、xls;OpenOffice系列的odt、odp、ods、sxi、sxw、sxc;通用格式的rtf、csv、tsv;原本DSpace就支援的txt、html、pdf

播放器:使用使用者電腦內部的Adobe PDF Reader之類的軟體,我推薦採用XChange Viewer

以上格式都能夠轉換成PDF以供線上播放,並抽取出文字檔作為全文檢索的對象。此外,Power Pointer投影片系列,包括ppt、odp、sxi還可以擷取第一張投影片作為縮圖。

我有想過是否要轉換成圖片檔案來作為線上播放,但是考量到瀏覽介面需要另外設計、也不方便操作,故還是選擇採用最通用的PDF Reader。缺點是目前沒有加密PDF的功能,PDFBox不知為何不能生效。

多檔案網頁支援

image

你可以把檔案壓縮成zip檔案,只要包含index.html、index.htm、default.html、default.htm,系統就會自動把他當成網頁開啟。注意到上面圖片中的範例,這是一個包含多個檔案的jQuery UI範例檔,裡面包含了網頁、圖片、JavaScript、CSS檔案,現在只要壓縮成zip之後上傳到DSpace,就能夠直接在DSpace上直接開啟了!


好,以上是給使用者看得部份。接下來後面幾篇,就是給系統建置者看得安裝跟使用的部份囉!

(more...)

延畢確定

布丁布丁吃布丁

延畢確定

 

剛入學的時候,迎新茶會上老師們聲稱我們最快可以兩年畢業,這是政大圖檔所的特色。

在跟陳志銘老師meeting的時候,也常常聽到老師勉勵著學生兩年畢業。

不只是陳老師,我也不時聽到其他老師極力地推著學生完成論文、無不希望學生早點畢業的消息。

學生們也都用兩年畢業來勉勵自己。在碩一下決定題目,花半年完成計劃書,然後再用碩二下半年來把論文完成,順利畢業,找到工作。

高等教育評鑑裡面,本所的就業率非常地高,而且大部分畢業的學長姊找到的工作都是與圖書館、檔案館相關 (並不是去賣雞排,雖然這比較賺)。


現在是碩二下,我進來圖檔所已經兩年。

我的同學當中,不乏有已經被圖書館挑上,預備一畢業就進去辦公室坐的預備館員;也有翻著圖書館徵人公告,問我這邊到底好不好的人。

儘管同學們一邊抱怨著論文難寫、指導教授囉唆、問卷收不回來,但還是確實地朝著完成畢業論文的方向前進。

「我們一定要兩年畢業喔。」這句打氣的話,不知道在同學之間已經說過多少次。

一開始,我也相信這是可能的,因為我們都是同學,我們都在百年樓上課,我們都是在優秀的老師指導,我們都一樣努力,所以理所當然的,我們會一起畢業。

逐漸地,我終於發現,原來看似一樣的我們,走的是截然不同的道路。

你們為了「畢業」而努力。

我則是背對與「畢業」南轅北轍,日夜不息地狂奔中。

同學們會順利畢業,而我註定延畢。(除了跑去美國留學的跟晚了半年進來的那幾位,我們就一起留下來吧XD)


當我發現的時候,那些諷刺研究生生活的種種笑話,我已經視之習以為常。

要找新穎議題的資料,首先會想到要找電子資料庫當中的英文paper,而且習以為常地閱讀英文paper。對了,我也是計畫書口試的時候才被口委老師點出,原來我的中文參考文獻居然這麼少。

幫老師做事理所當然,因為老師很辛苦、事務繁雜,想像一下如果你自己是老師的話,就能夠稍微體會到老師到底有多累了。所以在自己的能力範圍內,盡可能地幫老師的忙吧。

寫論文、做工作就要專心地做。能夠心無旁鶩地整天待在實驗室進行研究,然後抱著期待的心情等待成果「蹦」出來的那一瞬間,不是很令人興奮嗎?電影、電動?有比我花了好幾天努力建置的成果還要有趣嗎?

對我來說,研究所中最重要的工作不是畢業,是論文。論文是自己第一本著作、意義非凡,而且可以不用理會商業價值、可以做出基於前人研究的更進一步發展,這是證明自己所學所得的具體呈現,「用自己的雙手去發掘這世界裡面你尚未發現的真相」的開始,怎能不叫人興奮、不想要好好地完成論文呢?

也因此,自己才深深地感覺到知識的無止盡。短短的研究所兩年的時間,用半年的時間就要把論文做完,我怎樣都覺得好像哪裡不夠。所以想要攻讀博士班,繼續這種頹廢生活,倒也是不錯的人生選項之一。

雖然同學一窩風在找工作、找打工,但我仍抱持著「趁老爸老媽還可以養我的時候趕快享受學生生活」的頹廢想法,利用所上跟老師提供的資源,日以繼夜地學習、學習、再學習。


很奇怪嗎?很像違心之論嗎?我倒是覺得還蠻正常的,也不過就是日常生活的大小事而已。

只是有時候會覺得有點悶。

悶在當同學興高采烈地嚷嚷著「畢業才是真的」、其他人一起附和的時候,我這個覺得那其實還好、重要的是其他的事情。

悶在老是聽到「你好辛苦」、「你好厲害」、「我都做不來」但卻沒有手來幫我一個忙之後,聽到他們有說有聊地討論晚餐吃完要去看哪部電影,而自己像事傻瓜一樣留著繼續做別人不願意做的工作。

悶在老師堅持自己上課要弄出來的系統、研討會要佈置的完善、計畫要做得出成果,卻不會想到學生為了老師其實沒什麼時間寫論文,然後還要承受「什麼?看你不是每天都在所上晃來晃去很閒嗎?怎麼沒時間寫論文?還會延畢?」的罪名。

悶在人情債進化成人情討債公司的時候,來討債的人只會給我無奈的表情,告訴我他也沒辦法。

悶在急著想要寫論文,可是卻有一堆雜事纏身。(教授,我好想寫論文啊!)


後來我終於發現了,其實這麼悶,也只是我自己的問題。

是的,我何必去煩惱自己怎麼過得跟其他同學不太一樣,因為我們本來就走在不同的道路上,擁有不同的價值觀、做著不同的事情。這社會有著多元的價值觀,除了尊重對方的想法,也不必強求自己一定要這樣做。

我要把論文寫好,完整地建構系統、費心地安排實驗、仔細地收集數據、謹慎地寫下結論!

在這之前,我要把教育部計畫做好,讓研究已久的DSpace系統作到一種能讓自己抬頭挺胸說:「這是我的心血成果」的程度!

在這之前,我要把我不會的東西都學好,善用大學豐沛的藏書、實驗室購書的經費、還有優秀的老師們,好好地把不懂地方的搞懂!

在這之前,我會延畢。

因為我喜歡這種生活,所以我得要抬頭挺胸地說出這種頹廢生活的好處,這樣就行了!

2009-05-16-701

p.s. 對了,在問我為什麼圖資人要看「物件導向程式設計」、「UML」或是「極致軟體製程」之前,可以先問你一下,你覺得學生的工作是來學東西的呢?還是來跟別人說「這個我不會」的呢?

(more...)