:::

DSpace使用XMLMetadata的方法

布丁布丁吃布丁

DSpace使用XMLMetadata的方法

之前我為DSpace 1.5.1寫過一種新型態的input-type: XMLMetadata,那裡只有處理到遞交(submit)處理,這一篇則是教大家如何利用儲存在資料庫的XMLMetadata API。

我假設你已經懂得如何從DSpace裡面取出你指定的Metadata Value,如果不懂,請參考DSpace系統文件裡面的內容管理API的章節,或是參考我之前寫過如何從DSpace的API裡面取得Item的Metadata Value教學


安裝XMLMetadata API

請把該檔案上傳到[dspace-source]/dspace-api/src/main/java/org/dspace/app/util/當中。

然後進行DSpace的重新編譯,方法如下:

  1. 進入指令模式
  2. 移動到你的[dspace-source]/dspace/目錄
    > cd [dspace-source]/dspace/
  3. 執行ant編譯
    > mvn package
  4. 移動到你的[dspace-source]/dspace/target/dspace-[version].dir目錄
    > [dspace-source]/dspace/target/dspace-[version].dir
  5. 執行ant打包
    > ant -Dconfig=[dspace]/config/dspace.cfg update
  6. 停止你的Tomcat伺服器
    > cd [tomcat]/bin/
    > ./shutdown.sh
  7. 複製新的.war檔案到Tomcat的webpapps目錄:
    > \cp -rf [dspace]/webapps/* [tomcat]/webapps/
  8. 重新啟動Tomcat伺服器
    > cd [tomcat]/bin/
    > ./startup.sh

測試是否安裝成功

請把該檔案放到你的DSpace在Tomcat的執行位置,然後用網址開啟該檔案看看。

例如[tomcat]/webapps/jspui/裡面。你用http://localhost:8080/jspui/XMLMetadataExample.jsp開啟,如果出現錯誤訊息表示安裝失敗。


使用XMLMetadata API

示範檔案:XMLMetadataExample.jsp

  1. 先引用org.dspace.app.util.XMLMetadata。
    <%@ page import="org.dspace.app.util.XMLMetadata" %>
  2. 從資料庫或是利用DSpace的API取得XMLMetadata的值,存入字串型態的變數當中,假如是設為xmlText。(其中rs.getString()是從資料庫查詢結果取出資料的語法,實際使用的時候,請自行設計)。
    ※以下是JSP端的程式,請寫在<% %>之間。
    String xmlText = rs.getString();
    假設取得的XMLMetadata值如下:
    <div class=\"xml-root\"><DIV class=node>
    <DIV class=node-type>node</DIV>
    <DIV class=node-title>教師</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-node</DIV>
    <DIV class=node-content-temp>
    <DIV class=node>
    <DIV class=node-type>node</DIV>
    <DIV class=node-title>人名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-node</DIV>
    <DIV class=node-content-temp>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>姓</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>aaaaa2 </DIV>
    <DIV class=input-required>true</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>aaaaa2 </DIV></DIV>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>1 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>1 </DIV></DIV></DIV>
    <DIV class=node-contents>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>姓</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>aaaaasdsdsdf </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>aaaaasdsdsdf </DIV></DIV>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>2 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>2 </DIV></DIV></DIV>
    <DIV class=node-contents>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>姓</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>aaaaa2 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>aaaaa2 </DIV></DIV>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>1 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>1 </DIV></DIV></DIV></DIV></DIV>
    <DIV class=node-contents>
    <DIV class=node>
    <DIV class=node-type>node</DIV>
    <DIV class=node-title>人名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-node</DIV>
    <DIV class=node-content-temp>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>姓</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>aaaaa2 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>aaaaa2 </DIV></DIV>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>1 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>1 </DIV></DIV></DIV>
    <DIV class=node-contents>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>姓ewrwere</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>aaaaa </DIV>
    <DIV class=input-required>true</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>aaaaa </DIV></DIV>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>2 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>2 </DIV></DIV></DIV>
    <DIV class=node-contents>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>姓</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>aaaaa2 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>aaaaa2 </DIV></DIV>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>1 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>1 </DIV></DIV></DIV></DIV></DIV>
    <DIV class=node-contents>
    <DIV class=node>
    <DIV class=node-type>node</DIV>
    <DIV class=node-title>人名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-node</DIV>
    <DIV class=node-content-temp>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>姓</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>aaaaa2 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>aaaaa2 </DIV></DIV>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>1 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>1 </DIV></DIV></DIV>
    <DIV class=node-contents>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>姓</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>aaaaasdsdsdf </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>黃</DIV></DIV>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>2 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>2 </DIV>
    <DIV class=input-values>2 </DIV>
    <DIV class=input-values>2 </DIV>
    <DIV class=input-values>2 </DIV></DIV></DIV>
    <DIV class=node-contents>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>姓</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>aaaaa2 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>aaaaa2 </DIV></DIV>
    <DIV class=node>
    <DIV class=node-type>input</DIV>
    <DIV class=node-title>名</DIV>
    <DIV class=node-repeatable>true</DIV>
    <DIV class=node-class>table-input</DIV>
    <DIV class=input-default-value>1 </DIV>
    <DIV class=input-required>false</DIV>
    <DIV class=input-type>onebox</DIV>
    <DIV class=input-values>1 </DIV>
    <DIV class=input-values>1 </DIV>
    <DIV class=input-values>1 </DIV></DIV></DIV></DIV></DIV></DIV>
    </div>
    ※你可能注意到了上面的XMLMetadata並不是正規的XML:他缺少了開頭的宣告,而屬性class的值也沒有正確的雙引號。這是使用IE瀏覽器在控制input-type的XMLMetadata時最後必然的結果。所以本XMLMetadata API在設計時已經考慮到這點,這些不正規的Metadata資料會被重新整理成正規的XML格式,最後再進行分析。
  3. 建立XMLMetadata物件,並且給予XMLMetadata的值。
    XMLMetadata xmlObj = new XMLMetadata();
    xmlObj.setXMLdoc(xmlText);
  4. 設定你要在XMLMetadata當中找尋的路徑。請以每個節點的node-title為路徑名稱,中間用「/」來隔開。例如你要找的是在「教師」、「人名」、「姓」當中的資料,那麼請如下設定你的路徑變數:
    String path = "教師/人名/姓";
    注意你的根節點他也需要一個node-title!可是偶爾還是會有忘記設定node-title的時候,當該層沒有node-title之時,可以考慮直接空下來,繼續寫下一層。例如你根節點的node-title原本應該寫「教師」但是卻忘記寫了,那麼你的路徑就要這樣設:
    String path = "/人名/姓";
  5. 接著你就可以用API的方法來取得你的資料了。以下一一介紹各種方法:
    1. 你可以取得查詢的資料,以陣列的字串或是陣列的整數來回傳:
      String[] valueAry = xmlObj.locate(path);
      int[] valueIntAry = xmlObj.locateInt(path);
    2. 你可以取得資料的數量,假如有很多位教師,可以查詢到底有幾筆教師的:
      int count = xmlObj.locateCountNode("教師");
    3. 如果你明確知道要哪一筆,那麼也可以設定偏移值,第一筆則設定0,第二筆則設定1。如果偏移直超過查詢結果的數量,則會回傳「null」:
      int offset = 1;	
      String valueSingle = xmlObj.locateSingle(path, offset);
      int valueIntSingle = xmlObj.locateIntSingle(path, offset);
    4. 你也可以用XPath上來找尋資料:
      String[] valueAry = xmlObj.locateXPath(XPath);

      善用XPath來作更進一步的查詢

      聰明的你也許發現到前面locate所用的路徑查詢語法並不是正確的XPath查詢語法,而是我為簡化查詢XMLMetadata而設計的方法。

      舉例來說,剛剛查詢「教師/人名/姓」的語法,利用XPath查詢XMLMetadata則會非常地複雜。你可以利用public String titlePathToXPath(String titlePath)來看一下XMLMetadata的路徑是怎麼轉換成完整的XPath:

      String path = "教師/人名/姓";
      String XPath = "/div[@class='xml-root']/DIV[@class='node'][DIV[@class='node-title']/text() ='教師']/DIV[@class='node-contents']/DIV[@class='node'][DIV[@class='node- title']/text()='人名']/DIV[@class='node-contents']/DIV[@class='node'][DIV [@class='node-title']/text()='名']/DIV[@class='input-values']/text()";
      out.print(xmlObj.titlePathToXPath(path));  //Show full XPath

      因為時間不多,XMLMetadata的查詢語法並不是很完整。如果你需要更完整的查詢功能,那麼你得需要自行撰寫XPath才行。

      詳細的XPath教學,可以參考w3schools.com的XPath教學


      光是為了寫這份文件就花了我一整天,好累……

      (more...)

      PostgreSQL連線設定與DSpace資料庫備份設定

      布丁布丁吃布丁

      PostgreSQL連線設定與DSpace資料庫備份設定

      安裝DSpace的時候要先把PostgreSQL的連線類型改成不需要密碼的「trust」,但是安裝完之後要改回「md5」(以md5加密的密碼)或「password」(必須詢問密碼),以提高PostgreSQL的安全性。

      但是本機端需要詢問密碼的情況下,會讓crontab自動排程無法自動備份(dump)PostgreSQL的資料庫。因此必須設定該帳號家目錄底下的.pgpass,讓該帳號不需要再次詢問密碼就能夠直接通過PostgreSQL的認證連線,以順利匯出資料庫。

      詳細步驟說明如下:

      安裝DSpace之前需要修改的PostgreSQL設定

      安裝DSpace的過程中,我建議先把PostgreSQL的連線設定(/var/lib/pgsql/data/pg_hba.conf,註1)裡每一個連線類型改成trust,範例如下:

      # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
      
      # "local" is for Unix domain socket connections only
      local   all         all                               trust #ident sameuser
      # IPv4 local connections:
      host    all         all         127.0.0.1/32          trust #ident sameuser
      # IPv6 local connections:
      host    all         all         ::1/128               trust #ident sameuser
      # for DSpace
      host    dspace      dspace      127.0.0.1             trust #255.255.255.
      • 註1^PostgreSQL在CentOS中預設安裝位置在/var/lib/pgsql/當中,故連線的設定檔將位於/var/lib/pgsql/data/pg_hba.conf,如果是手動安裝則可能會在其他地方。

      安裝完DSpace之後的PostgreSQL連線設定

      安裝完成DSpace之後,為了提高PostgreSQL的安全性,設定為本機端連線的時候也需要詢問密碼。

      一樣是修改連線設定檔/var/lib/pgsql/data/pg_hba.conf,將method改成md5(以MD5編碼加密)或password(需要詢問密碼),修改範例如下:

      # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
      
      # "local" is for Unix domain socket connections only
      local   all         all                               md5 #ident sameuser
      # IPv4 local connections:
      host    all         all         127.0.0.1/32          md5 #ident sameuser
      # IPv6 local connections:
      host    all         all         ::1/128               md5 #ident sameuser
      host    dspace      dspace      127.0.0.1             password #255.255.255.255

      這樣修改主要是方便使用phpPgAdmin——一個用網頁介面管理PostgreSQL的工具(註2 )。

      下圖是phpPgAdmin的介面:

      image 

      如果連線設定依舊是trust的情況下,任何使用者只要連到該系統的phpPgAdmin工具、知道該帳號名稱,則使用任何密碼都可以登入PostgreSQL資料庫中。

      使用phpPgAdmin時,除了需要修改PostgreSQL的連線為「md5」或「password」之外,最好如phpMyAdmin一樣地還加上Apache利用.htaccess來實作的認證機制(註3)。

      PostgreSQL自動備份策略

      如果PostgreSQL的連線設定需要使用密碼,那麼在利用crontab排程自動執行備份指令時,也會遇到需要輸入密碼而無法自動執行的情況。

      PostgreSQL在8版之後(好像是,至少目前我們使用的都是8版)可以使用「.pgpass」來為使用者設定自動認證

      以下介紹詳細步驟

      1. 假如我們要連線的資料庫位置為「localhost」(表示本機端)、連接埠為「5432」(PostgreSQL預設連接埠)、資料庫名稱為「database」、資料庫帳號為「username」、密碼為「password」。注意,username不一定要跟你執行crontab的帳號相同。
      2. 切換到執行crontab的LINUX實體帳號,假如是「dspace」,則利用su指令切換:
      3. [root@dspace /]# su dspace 
      4. 在該帳號的家目錄新增檔案「.pgpass」
      5. [dspace@dspace /]# vim ~/.pgpass
      6. 利用vim編輯器輸入以下資料:
      7. localhost:5432:database:username:password 
        完成之後儲存離開。
      8. 修改.pgpass的權限為600
      9. [dspace@dspace /]# chmod 600 ~/.pgpass
      10. 測試看看,利用pg_dump匯出資料庫到「/var/lib/pgsql/backups/bkup.sql」
      11. [dspace@dspace /]# pg_dump -U username database > /var/lib/pgsql/backups/bkup.sql 
      12. 如果「/var/lib/pgsql/backups/bkup.sql」有檔案,並且內文為正確的sql檔,則表示認證成功。反之,如果系統要求你輸入密碼,那可能是哪個步驟做錯了,請回頭一一確認。

      當確認可以自動通過認證,以指令執行PostgreSQL匯出的之後,就可以把這些指令加入crontab排程中囉。

      資料庫一定要天天備份,祝大家伺服器都能運作順利


      延伸閱讀

      DLLL實驗室徵工讀生啟事

      布丁布丁吃布丁

      DLLL實驗室徵工讀生啟事

      工作內容:

      1. 建立掃描書籍內容,包括掃描書籍,列印複本,辨識內容文字、建立內容文字檔。→一位
      2. 製作、切割、轉檔聲音檔案→二位

      工作地點:

      政大文學院圖檔所,採簽到制,只要來的時數到達即可。

      薪水:120元/小時

      有意參與的人,請聯絡談小姐 (tan@mail.ntust.edu.tw)或陳小姐(flora17@seed.net.tw)


      薪水優渥、工作輕鬆,歡迎大家來報名,還可以順便來找我聊聊天喔。

      (more...)

      夜晚的百年樓,走廊不能開燈

      布丁布丁吃布丁

      夜晚的百年樓,走廊不能開燈

      2009-02-16-485

      自從政大百年樓可以申請門禁卡之後,上學期留下來的人變多了,多少比較熱鬧一點,不會一直都除了自己一個人之外,只看得到陳芳明所長

      學期中,助教跟所長很慎重地把我們這群晚上會留下來的人叫去,原來是文學院院長看到我們晚上走廊燈、廁所燈都不關,因此要求我們節制、不要浪費電。

      2009-02-16-486

      為此,我們制定了夜晚走廊不開燈的規定。

      只有在使用時開燈,不使用的時候,則連離開廁所都要把燈關掉的規定。


      寒假期間,我今晚依然留在百年樓,這裡沒有那群會一起夜留奮鬥的學生們,只有漆黑的走廊、慘綠的逃生指示燈、辦公室內沒掛掉而「嘟嘟嘟」響個不停的電話、飄雨帶來的寒冷。

      「你不覺得恐怖嗎?」今晚難得留到八點才走的助教這樣問我,我只好回答:「習慣了。」然後過不久她就離開了。

      書本、器材都在百年樓,我也只能在百年樓工作。

      與其說是習慣,不如說是不得不習慣,應該比較正確。

      (more...)

      使用Pismo把ZIP壓縮當作唯讀資料夾

      布丁布丁吃布丁

      使用Pismo把ZIP壓縮當作唯讀資料夾

      image

      以前要使用壓縮檔裡面的檔案的時候,你還要先等待全部解壓縮之後才能開啟、使用。現在有了Pismo,你可以把ZIP檔案直接當作唯讀資料夾,直接執行、開啟,而且不需要等待解壓縮,更不需要準備解壓縮所佔的空間!

      特別適用於整理大型安裝程式、遊戲!由於這類型資料的檔案特別多,其中又有許多可以再用ZIP壓縮以節省空間,或是利用壓縮打包成一個檔案方便傳輸。而要使用這些資料的時候,再利用Pismo直接掛載使用即可!

      下載與安裝

      image

      他的安裝已經寫成安裝檔,開啟檔案之後,只需要直接按下「Install」即可完成安裝。無法修改安裝路徑,預設安裝在C:\Program Files\Pismo File Mount Audit Package中。

      image

      完成,只有兩個畫面。

      掛載ZIP壓縮檔、ISO光碟映像檔等檔案

      image

      Pismo直接跟檔案總管整合,只要在檔案上按右鍵即可看到「Quick mount」跟「Mount...」兩個功能。

      Pismo只有能夠對應的檔案才能掛載,包括ZIP壓縮檔ISO光碟映像檔、Compact ISO(CISO)、Compact File Set(CFS)跟PFO等特殊格式。其中ZIP壓縮檔可由大部分壓縮軟體產生,我推薦使用7-zip開放原始碼自由軟體(wikipedia說明);ISO光碟檔可由光碟燒錄軟體產生,Pismo本身也具備「Convert CD or DVD image」的功能,安裝之後可以在程式集裡面找到;此外,Pismo也有「Create CFS (Compact File Set)」可以產生CFS檔。

      Quick Mount 快速掛載

      clip_image002

      「Quick Mount」是直接把壓縮檔當成一個資料夾使用,快速掛載之後,資料夾會有Pismo的符號以作為區隔,如上圖。當然,資料夾裡面的檔案就可以直接使用,即使要安裝程式、遊戲,都不成問題!但要注意這是唯獨的資料夾,無法修改裡面的資料喔。

      如果在已經掛載的資料夾上按右鍵,選擇

      Mount... 掛載到…

      image

      「Mount...」則是把壓縮檔當成一個卸除式磁碟來掛載(可指定對應的磁碟機代號),掛載之後便會類似插入USB隨身碟一樣,我的電腦則會多出一個磁碟機,就像是插入虛擬光碟一樣。

      Unmount 取消掛載

      image

      在掛載的資料夾或磁碟機上按右鍵,選擇「Unmount」,即可取消掛載。資料夾或是磁碟機將會還原成為原本的壓縮檔。

      Mount Control 掛載管理介面

      image

      執行Pismo之後,右下角系統列的部份會出現Pismo的圖示。雙擊之後可以開啟Mount Control。

      image

      此處會列出現在正在掛載的檔案,你可以選擇取消掛載(Unmount)、開啟掛載的資料夾(Open)、或是查看掛載資料夾的屬性(Properties)。

      其他轉換與壓縮工具

      Pismo還提供了幾種工具,方便我們進行轉換與壓縮:

      • Convert CD or DVD image
        image
        轉換CD或DVD光碟的映像檔。
      • Create CFS (Compact File Set)
        image
        建立CFS檔案。
      • Create SMX (Self Mounting Executable or Installer)
        image
        建立自我掛載執行檔,或是用來作為程式安裝檔。

      結語

      Pismo大大地改變了我管理檔案的習慣。由於之前負責幫圖檔所維護電腦設備,時常需要安裝Microsoft Office、Adobe Acrobat Pro等大型軟體,這些軟體檔案數量多、體積龐大,當需要移動、複製的時候,就會花上相當多的時間。現在我可以把它們壓縮成ZIP檔案,並且在需要安裝的時候,使用Pismo掛載成資料夾即可使用,實在是方便很多。

      基於Pismo的好處,呼籲大家多多使用自由又免費ZIP格式來壓縮檔案吧!

      (more...)

      LISA to WOS Output Record

      布丁布丁吃布丁

      LISA to WOS Output Record

      本程式離線檔案下載,請使用網頁瀏覽器開啟mht檔案。


      Speed Setting: count one line pre second.

      Memory Cache: records.

      /
      0%



      布丁布丁吃?: Web of Science中Output Records分析工具

      程式版本:2008/12/24 溫馨聖誕夜 | 程式寫作:布丁布丁吃布丁 | 網站:布丁布丁吃?

      (more...)

      ERIC Output Record Parser

      布丁布丁吃布丁

      ERIC Output Record Parser

      本程式離線檔案下載,請使用網頁瀏覽器開啟mht檔案。

      Output Record Parser

      STEP 1

      STEP 2

      Operation Option

      count one line pre second.
      records.
      Filtered Field

      / : 0 / 0
      0%

      (none) (none) (none)
      STEP 3



      程式版本:2009/1/26 大年初一 | 程式寫作:布丁布丁吃布丁 | 網站:布丁布丁吃?

      (more...)