:::
顯示具有 碩士畢業論文 標籤的文章。 顯示所有文章

合作式閱讀標註之標註行為特徵與閱讀理解關聯 / A Study on Developing Knowledge Extraction Mechanisms from Cooperative Reading Annotation

合作式閱讀標註之標註行為特徵與閱讀理解關聯 / A Study on Developing Knowledge Extraction Mechanisms from Cooperative Reading Annotation

image

這篇「合作式閱讀標註之標註行為特徵與閱讀理解關聯」是我在第二屆數位合作學習與個人化學習研討會跟大家分享的文章跟投影片,也是我碩士論文的簡要版本。

(more...)

國立臺中圖書館獎助博碩士班學生研撰圖書資訊學位論文申請書 / Apply for National Taichung Library in 2009

國立臺中圖書館獎助博碩士班學生研撰圖書資訊學位論文申請書 / Apply for National Taichung Library in 2009

200904 國中圖書香遠傳 獎助博碩士論文報導 -1 20090610-pudding2-0038

國立臺中圖書館,現已改稱為國立公共資訊圖書館(以下簡稱國資圖)的獎助博碩士論文學生研撰圖書資訊學位論文,是提供各位圖資界學弟妹在完成計劃書口試之後可以嘗試挑戰的獎助學金。我當時在2008年計劃書口試完成之後也有前去申請,有幸在2009年順利被接受。後來幾位學弟妹也想要嘗試申請看看,而過來索取申請時的表格。為了鼓勵學弟妹多多挑戰,在此我簡單地分享一下當時的申請文件。

The application forms for applying the National Taichung Libraty Thesis Grants as well as my experience as a previous winner are provided in the article.


申請書下載 / Documents Download

個人資訊都已經隱蔽,文件裡面只有申請表格跟論文內文喔。

從論文計劃書縮減內文 / From Thesis Proposal to Application

國資圖的獎助申請條件中限制計劃書本身為15頁,不含前面的申請表格與後面的參考文獻。

我原本的計劃書(原本檔案連結損壞,我重新上傳了,連結放在留言中)不含封面、目錄與參考文獻共32頁。縮減成國資圖的申請書之後,內容只剩下14頁。

基本上論文的架構都不變,但是現在看來,我覺得可以再減少一些文獻探討的部份。大部分學生計劃書中都會蒐羅大量的文獻探討,在取捨這些文獻時往往會相當苦惱。我建議是如果你的論文沒用到前人研究的方法,那可以索性不提。重點在於研究方法、研究流程以及預期成果,用盡腦汁來找出你研究的價值吧。我想評審老師想要看的應該是有發展價值的題目,而不是讀了一堆文獻的心得彙整吧。

裝訂 / Binding

2009-02-05-480

製作這份申請書的時候,除了基本的推薦函、必要身分證件、電子檔光碟等資料之外,還需要把它印出之後裝訂成冊,一式六份。裝訂時我採用與計劃書相同的綠底膠裝。大概就跟上圖的計劃書類似的樣子,只有文字不同。因為頁數很薄,印象中是不需要書背的。

如果想要摸一下實體的話,我有一份申請書放在所上的圖書室書架喔。

詳細的規定請務必詳讀國立公共圖書館獎助博碩士班學生研撰圖書資訊學位作業要點喔。


結語 / Conclusion

我印象中當時計劃書口試結束之後,大概用了一個禮拜左右改去申請國中圖(當時還是叫做國中圖)的獎學金。雖然是抱著一種「反正論文計劃書都寫了,那就順便申請看看吧」的心態,沒想到還真的上了。而且當時政大圖檔所還同時通過三位,可謂風光至極。

很多學弟妹會擔心自己文筆不好、文獻探討不足,而不敢去申請。可是如果你看我的計劃書,也會發現我寫得其實也很不成熟。不成熟又如何呢?畢竟我們都還是學生啊,學生就是擁有不成熟的權力。

即使是不成熟的文筆,評審老師依然可以找出你的論文價值。但是如果不去申請的話,那就連這個機會都沒有囉。總之加油吧,祝各位學弟妹都能順利上榜。

(more...)

2011中華民國圖書館學會學位論文獎助活動

布丁布丁吃布丁

2011中華民國圖書館學會學位論文獎助活動

image

2011年12月2日在國家圖書館舉辦了中華民國圖書館學會第五十二屆年會,並徵選優秀學位論文發表。感謝評審老師們的獨特眼光,我的論文「合作式閱讀標註之知識萃取機制研究」居然得獎了。於是當天活動最後的發表會,我就上去介紹我做的論文內容以及KALS知識標註學習系統。

演講的投影片如下:(SkyDrive下載)

演講時間只有10分鐘,所以我就輕鬆地介紹系統。沒想到其他人都像是要準備論文口試一樣地大陣仗,相較之下我就像是來亂的一樣。還好下台之後學會沒有要沒收我的得獎資格,真是萬幸。

另外很遺憾的是,這次仍然沒有錄音檔,就當做給現場聽的朋友們特別的禮物吧。不過事實上,我做投影片也的確不是給人讀的,而是搭配我講話與介紹的內容。這份投影片使用了許多動畫講解圖示的內容,光看印出來的投影片結果,比較難理解那些圖示的順序流程。所以還是建議下載投影片來看看吧,也許會比較清楚也說不定喔?

最後,能夠跟大家分享自己做的東西,實在是很開心。希望大家也秉持著分享的心態,一起多多交流交流吧。

(more...)

合作式閱讀標註之知識萃取機制研究 A Study on Developing Knowledge Extraction Mechanisms from Cooperative Reading Annotation

合作式閱讀標註之知識萃取機制研究 A Study on Developing Knowledge Extraction Mechanisms from Cooperative Reading Annotation

封面

這是我在國立政治大學圖書資訊與檔案學研究所撰寫的碩士畢業論文,指導教授為陳志銘博士。撰寫完成時間為99學年度下學期,實際上是民國2011年(民國100年)3月。

作為一份記錄,這一篇將會簡單地回顧一下整個論文的撰寫過程、論文的摘要,以及附上論文的相關檔案。


論文撰寫過程回顧

計劃書

圖資系所在碩士生撰寫畢業論文之前,通常都需要先撰寫論文的計劃書,陳述為何要做這個題目、要怎麼做這個題目、需要什麼步驟,並請口試委員幫學生審核是否可行,然後才開始進行碩士的畢業論文。

跟其他在政大圖檔所的學生差不多,我也是在碩二上的時候進行計劃書口試,日期是2008年12月,之前有寫一篇計劃書口試通過的記事,裡面包含了計劃書口試時使用的簡報。通過之後再依照口試委員的建議進行修改,這一篇則是在講修改後的計劃書檔案

我的論文計劃書拿去參加國立臺中圖書館(簡稱國中圖)博碩士論文獎助並有幸獲獎,約定要於畢業時呈繳論文,才算是完成獎助契約。

論文聚焦與系統開發

之後有非常長的一段時間,我都在處理DSpace跟其他的外務,是個不務正業、玩物(?)喪志的學生。大概到2010年4月又回到論文的工作上,不定其地在此blog撰寫meeting時的論文進度報告,督促自己要積極撰寫論文、儘快畢業。論文相關的文章請看碩士畢業論文的分類標籤。經過一些文獻探討之後,毅然決然調整了論文進行的方向

在聚焦研究問題的同時,我也開始學習以專案管理與UML的方式規劃論文系統的專案,並且閱讀極致軟體製程(eXtreme Programming explanined)、測試導向開發、PHP專業程式設計、物件導向設計模式等程式設計的書籍,努力提昇自己的程設能力。系統規劃大概是從2010年5月左右開始進行,實際上大約是2010年6月才開始撰寫系統。不過就算是到現在,我也不覺得系統算得上是完成品。關於系統的內容與功能請看KALS!標註工具說明一篇。

實驗進行與數據分析

2010年下學期學期中,由於論文系統撰寫時程大幅度地延長,導致論文的實驗並沒有按照預期希望的進行。老師建議我改以老師正在上課的同學來進行實驗,而我因此以目前系統的完成狀況、更改觀察的變項,大幅度地修改了整個實驗的設計。由於當時並不想告訴同學這是一個實驗,因此並沒有在此blog提到這些事情。變更的過程與細節請看論文進度報告(2011/1/19):變更的研究架構一篇。實驗的設計與內容都鉅細靡遺地寫在論文之中,稍後請參考論文的內容。

實驗完成之後接著是數據的分析。這段期間學習了內外控量表序列分析循序樣式探勘等研究工具,不過論文最後並沒有派上用場,單純成為了學好玩的知識。當時在分析時到處找了相當多的方法,甚至自創演算法來加權數值。後來是在聆聽學弟妹的計劃書口試中找到靈感,並以統計的方式完成了現在的論文。

最後分析主要還是用統計的獨立樣本t檢定、單因子變異數分析、相關分析以及無母數分析等方法進行。在此推薦一下吳明隆的「SPSS操作與應用:變異數分析實務」(ISBN:9789571145754)一書,不僅可以讓人依樣畫葫蘆操作SPSS,理論說明也相當清楚。即使原本沒有學過單因子變異數與無母數分析的我,照這本書所講的內容,也只要一天就能夠輕易上手、完成論文分析。

分析完成的時間點大概是2011年1月過年之前,並與老師報告分析結果,讓老師確認沒有問題之後,才是撰寫論文內容。

論文撰寫與口試

有了分析結果之後,就能夠開始推論結論、撰寫論文。撰寫過程請看我的論文寫作工具:XMind心智圖一篇。之間與老師多次來回討論、修正,經過各章節二次以上的校對之後,終於完成了論文的初稿,可以準備舉辦碩士畢業論文的口試。

口試的邀約相當地匆促,大概是二月底的時候開始邀請老師。有的老師沒問題,有的老師時間橋不攏,有的老師工作事務繁忙而推辭,前前後後共問了六位老師。最後碩士論文口試邀請的口委為卜小蝶老師、林巧敏老師、侯惠澤老師,以及我的指導教授陳志銘老師,以上共四位口試委員。口試時間排定在2011年3月4日。

老師們給了我很多建議,因為現有的論文分析方式不太像是社會科學的角度,而是相當工程的分析,因此老師建議應該更往社會科學的方式來分析會比較好。此外,老師們讚賞系統開發,認為其本身就已經是一種研究貢獻。然而除了論文寫作細節挑些毛病之外,論文內複雜的實作與分析過程居然沒有人提出質疑,讓我個人挺訝異。口試時的簡報將於本文後面附上。

畢業論文送繳

口試之後即動手撰寫論文的修改版,再來進行論文的印製,之前我也有寫了篇印製過程的心得

2011-06-24_131518

畢業前將論文呈繳到政大圖書館,圖書館會在轉送到國家圖書館,因此我的畢業論文現在也在臺灣博碩士論文知識加值系統中出現了

在畢業事務處理期間,我也完成了與國中圖的契約、呈繳了十本畢業論文。之後回去國中圖找論文的時候,發現我的論文也已經編目上架了。

以上就是整個論文的大致撰寫過程。


論文摘要

  • 題目:合作式閱讀標註之知識萃取機制研究
  • 關鍵詞:合作式閱讀標註;知識標註學習系統;知識萃取機制;模糊綜合評判;閱讀學習。

本研究在合作式數位閱讀環境中發展了一套「知識標註學習系統」,可以支援多人同時針對一篇數位文本進行閱讀標註與互動討論,以提升讀者閱讀的深度與廣度。此外,本研究更進一步地以專家評估法設計「知識萃取機制」,用於判斷讀者閱讀標註的重要度。

「知識萃取機制」是基於讀者閱讀標註中所蘊含的閱讀理解策略與閱讀技巧,以及合作式閱讀社群中產生的標註共識,考量了「標註範圍長度」、「標註範圍詞性」、「標註範圍位置」、「標註策略類型」、「標註範圍共識」與「標註喜愛共識」等六項因素,以專家評估法制定的標註重要度模糊隸屬函數來評定各因素的重要度並量化為「標註因素分數」指標,最後將六項因素以模糊綜合評判進行推論,再將推論結果解模糊化而成為代表標註重要度的量化指標「標註分數」。基於「知識萃取機制」所計算代表標註重要度的「標註分數」,可作為讀者進行閱讀標註是否不佳的判斷,並據此提供標註技巧建議與優質標註內容推薦的「標註建議」,以幫助讀者提昇閱讀理解能力。

為了驗證「知識萃取機制」計算「標註分數」的有效性,以及探討未來改善「知識萃取機制」和可加入的考量因素與適性化設計的可能方向,本研究以單組後測設計規劃實驗,並以國立政治大學圖書資訊數位碩士在職專班19位學生作為實驗對象,進行一份數位學習論文的合作式閱讀標註學習,並於實驗後評估實驗對象閱讀文章之後的閱讀理解能力,作為評鑑「知識萃取機制」計算方式是否有效的指標。最後再以問卷蒐集實驗對象對於「知識萃取機制」的意見,歸納成為未來研究改善的參考依據。

研究結果發現,本研究所提出「知識萃取機制」中計算標註重要度的「標註分數」與實驗對象的閱讀理解能力呈現低度正相關,一定程度地證實了「知識萃取機制」計算方式的有效性。而「知識萃取機制」六項考量因素中,「標註範圍長度」與「標註喜愛共識」為分辨實驗對象閱讀理解能力的關鍵因素;「標註策略類型」與「標註範圍詞性」的標註重要度模糊隸屬函數有待修正;「標註範圍共識」與「標註範圍位置」為無效因素,但這可能是受到計算方式錯誤與閱讀文章類型的影響,未來仍有待進一步評估。在未來發展方面,系統操作標註行為頻率越高,實驗對象的閱讀理解能力也有較高的跡象,未來可以將其納入「知識萃取機制」作為考量因素之一;而閱讀理解能力較差的實驗對象,呈現出比較不願意回應「標註建議」與較常使用社群互動的現象。本研究歸納可能原因為實驗對象自身的閱讀素養不成熟,以至於無法判斷「標註建議」的正確性,而需要參考他人閱讀標註。

未來研究可針對本研究的實驗對象與閱讀標註資料進行更深入的分析,並且將改良後的「知識萃取機制」擴大至探討其他類型的數位文本閱讀標註與實驗對象。也可以搭配認知策略教學法建構閱讀教學鷹架,或是將「知識標註學習系統」用於支援數位典藏與數位圖書館閱讀學習,以激發更多不同領域的應用研究。


論文檔案

正文內容

裡面有很多工程技術與計算過程,因此相當地枯燥乏味。有需要的人再打開來看吧。

畢業口試投影片


結語:論文未完成

image

論文即使寫完了,卻仍有許多資料並沒有善加利用。例如上圖的標註範圍次數分配表中,可以看到標註範圍為4個字的次數佔了最多。不過這數據究竟能怎麼解釋,我還沒有什麼頭緒。總之,這份論文的資料還有很多利用價值,也許可以再分析出些什麼關連,也許也可以從不同角度進行不同的分析。

這個論文,總覺得只能說是「做到告了一段落」,還不能說是「完成了論文」的感覺。很多未探究的地方都還沒好好釐清,我就這樣子被趕著畢業了。

kals_interface_original

至於論文中的KALS系統,儘管我希望他以開放原始碼的形式公開(請看KALS的Wiki),不過至今仍尚未動手進行。日後我可能會先將原始碼公開,並在實驗室架設一個公開使用的系統,屆時會再告知大家。

最後我應該會放棄KALS開發。因為我想要用其他技術來撰寫,嘗試更效率更好、更容易開發、更具有可維護性的方式來開發系統。

這份論文並不是寫的很好,有任何看不懂、發現有問題、覺得不太可行的地方,歡迎大家提出來討論。也祝往後接手的學弟妹能夠順利畢業,大家加油。

(more...)

JSONP跨網域傳送檔案:以POST方法實作

JSONP跨網域傳送檔案:以POST方法實作

image

網頁應用設計中的JSONP技巧可以做到跨網域資料傳送的功能,但它卻只能傳送純文字資料,而我希望能在跨網域的環境下開發AJAX上傳檔案的功能,那麼就需要一些小技巧才能進行。

雖然我想應該也有人提出這個作法了,不過實際上在之前我並沒有找到過。因此我把這個在論文中實作的技巧在此記錄、分享。

這篇用到大量的網頁設計專有名詞,主要是以AJAX設計網頁應用的人為主要對象撰寫的。


範例

image

這個範例網頁中,你可以上傳一個檔案,並填寫下面的敘述Description,再按下UPLOAD按鈕上傳。伺服器會回傳給你檔案的上傳結果、檔案名稱、檔案大小。檔案上傳最大是1MB,超過1MB的檔案,伺服器會回傳錯誤結果。

原本我是將HTML網頁放在Dropbox空間(http://dl.dropbox.com/),而伺服器則是放在You Hosting的空間(http://pulipuli.co.cc/),想用兩個不同網域來呈現透過POST方式實作JSONP跨網域檔案上傳的範例。但是因為You Hosting放著一陣子就被強制關閉了,所以很遺憾的,在此無法看到線上即時的成果。(2011/9/19更新)

此範例中用了三個檔案,請直接下載研究、並自行配置使用吧:

應用背景

使用AJAX開發網頁應用的程式設計師,大多時候都是在同個網域之下處理client(使用者端電腦)與server(伺服器)之間的訊息傳遞。更進一步的,利用jQuery框架,以JSON物件、GET方式傳遞資料的jQuery.getJSON()函數,讓處理AJAX資料傳遞更為簡單。

但是我的論文中需要使用的AJAX跟上述常見情況有個很大的差別。第一個是跨網域,client端呼叫server端資料,這兩者是位於不同的網域,因此普通的GET或POST方式都無法讓client端取得server端的資料,必須仰賴JSONP(JavaScript Object Notation with Padding)技巧;其二,這次要傳送的資料並非純文字或可以用JSON來組織的資料,而是需要上傳二進位的檔案,或是超過GET資料傳送上限的資料量。在這種情況下是不能單純使用JSONP,必須使用POST方式與form表單傳送資料才行。

因此,我將POST的傳送優勢與JSONP的跨網域AJAX特色融合,寫成以POST方式實作的JSONP跨網域檔案傳送。

角色

在此應用中是以前端的瀏覽器與遠端的伺服器進行溝通合作,因此我先簡單敘述這兩種角色。

「C」 client

在這篇文章中,我以「C」表示「client」(客戶端)瀏覽器中執行的程式語言,主要是HTML跟JavaScript,這也是AJAX的基礎。多虧了jQuery框架克服了相容性問題,因此在Chorme、Firefox或IE都可以使用。

在此範例中,「C」是擺在Dropbox的空間,他並不具備伺服器端的功能,不能判斷檔案大小。此外,我將「C」的HTML外觀寫在client.html當中,而JavaScript的邏輯運作寫在client.js當中。稍候會再敘述他們的功用。

「S」 server

另外「S」代表「server」(伺服器),在此範例中我以PHP寫成,擺在You Hosting空間。伺服器端的程式語言具備了處理檔案的能力,可以判斷檔案大小。在此利用AJAX架構,讓「C」能夠與「S」進行溝通。

為了利用POST傳送檔案,並能以JSONP進行跨網域溝通,「S」必須判斷請求方式(request method)是POST還是GET。並以session來暫存狀態。

稍微有點概念之後,接下來就是實際看看這方法要怎麼運作了。


Step1. C1:資料準備

 image

為了讓大家好理解,此範例中的檔案上傳做得跟傳統網頁一樣。這是一個<form>表單,裡面有個可以選擇檔案上傳的input,並限制只能上傳1MB大小的檔案,還有一個可以撰寫「Description」(敘述)的input,最後則是一個submit(遞交)的「UPLOAD」按鈕。

在這個表單前面,引用了大家的好朋友jQuery以及我另外寫的client.js;表單後面則有個<div>容器,負責顯示待會跟伺服器溝通的結果。

原始碼很簡單,寫在client.html中,摘錄如下:

<script src='http://www.google.com/jsapi' type='text/javascript'></script>
<script type='text/javascript'>google.load("jquery","1.2.6");</script>
<script src="client.js" type="text/javascript"></script>
<form id="form" method="post" action="http://pulipuli.co.cc/20110517-jsonp-post/server.php" enctype="multipart/form-data">
    <input type="hidden" name="max_file_size" value="1048576">
    <label>File: <input type="file" name="file" /> * Max File Size: 1MB</label>
    <br />
    <label>Description: <input type="text" name="description" value="The description of this file."></label>
    <br />    
    <button type="submit">UPLOAD</button>
</form>
<div id="output"></div>

另外,為了讓這個form表單能具備AJAX跨網域上傳的功能,我利用JavaScript幫他做了些初始化的調整,讓form的遞交會以AJAX方式進行,並設定回傳資料時所要執行的回呼函數(callback)。

這部份寫在client.js開頭,程式碼如下:

/**
 * Initialize Form
 */
$(function () {
    
    $("#form").submit(function () {
        
        if ($(this).attr("jsonp_by_post") == null)
        {
            $.jsonp_by_post(this, function (_result) {
                //...Step7時再講解... 
}); return false; } }); });

Step2. C2:AJAX式的POST遞交

當form的UPLOAD按鈕被按下時,就會開始一連串的AJAX式的POST遞交作業。

在此步驟中,JavaScript會做以下事情:

  1. 以timestamp作為辨識每次檔案上傳作業的代號。
  2. 讀取form的資料,並將timestamp設定到action的網址中,提供伺服器辨識每次檔案上傳作業的代號。
  3. 建立一個接收資料的iframe,隱藏之,並設定name。
  4. 調整form的action跟name,讓form的遞交會傳送到iframe去,而不是把整個網頁都替換掉。
  5. 給form做個記號(此範例用jsonp_by_post屬性),以免跟Step1初始化form的submit事件相衝突。
  6. 設定iframe遞交完成之後的後續動作。
  7. form執行遞交作業。

程式碼寫在client.js,摘錄如下,其中6.設定iframe遞交完成之後的動作,我會在下面的Step4詳細敘述,這邊先以略過。

$.jsonp_by_post = function (_form_ele, _callback) {
    
    var _timestamp = (new Date()).getTime();
    
    var _form_obj = $(_form_ele);
    
    var _action = _form_obj.attr("action");
    var _action_post = _action + "?timestamp=" + _timestamp;
    
    //建立接收資料的iframe
    var _iframe_name = _action + _timestamp;
    
    var _iframe_obj = $('<iframe></iframe>')
        .attr('name', _iframe_name)
        .appendTo($('body'));
        
    //隱藏iframe
    _iframe_obj.css('width', '0').css('height', '0')
        .css('position', 'absolute').css('left', '-1000px').css('top', '-1000px');
    
    //調整傳送資料的form
    _form_obj.attr('action', _action_post)
        .attr('target', _iframe_name)
        .attr('method', 'post')
        .attr('enctype', 'multipart/form-data');
    
    //防止重複觸發初始化的事件
    _form_obj.attr('jsonp_by_post', 'true');
        
    //設定iframe讀取完畢之後的動作
    
    _iframe_obj.load(function () {
        
        //...Step4時再講解...
        
    });
    
    //執行遞交
    _form_obj.submit();
};

Step3. S1:伺服器接收POST資料

伺服器端的程式會依照請求方式的不同,決定此程式是要接收檔案上傳,還是要回報檔案上傳的結果。

在Step3中,form以POST方式呼叫了位於另一個伺服器的server.php,並執行以下動作:

  1. 接收$timestamp,作為判斷這次作業的辨識代號,並與一個特定的$header組成session使用的$index。
  2. 透過透過PHP的$_SERVER['REQUEST_METHOD']來判斷請求方式。
  3. 如果是POST,則將檔案的檔名、大小、以及從POST過來的description資料儲存在session當中。
  4. 判斷檔案上傳的狀態,失敗就是「error」,成功則是「sussesful」。
  5. 顯示一些資料,作為簡單偵錯。但其實可以省略。

以下程式碼寫在server.php中,摘錄如下。請求方式是GET的情況,我會在下面的Step6再來講解。

<?php
$header = "data";
$timestamp = $_GET["timestamp"];
$index = $header . $timestamp;

session_start();

if ($_SERVER['REQUEST_METHOD'] == "POST")
{
    $description = $_POST["description"];
    
    $_SESSION[$index]['name'] = $_FILES['file']['name'];
    $_SESSION[$index]['size'] = $_FILES['file']['size'];
    $_SESSION[$index]['description'] = $description;
    
    if ($_FILES['file']['size'] == 0)
    {
        $_SESSION[$index]['state'] = 'error';
        echo "false";
    }
    else
    {
        $_SESSION[$index]['state'] = "sussesful";
        echo "true";
    }
}
else
{
    // ...Step5時再講解...
}

Step4. C3:以JSONP取得檔案上傳結果

當iframe讀取完畢之後,「C」就可以知道檔案上傳動作已經結束。但是因為POST在跨網域的狀況下是無法取得iframe裡面的資料,所以必須要改用JSONP的方式來跟「S」取得結果。

這些動作寫在Step2中省略的iframe onload事件中,大概動作如下:

  1. 設定JSONP的網址,加入jQuery.getJSON()特有的callback=?參數。
  2. 執行jQuery.getJSON(),並設定執行完後的回呼函數。

這些程式碼寫在client.js中,摘錄如下。執行完getJSON()的回呼函數會在Step6講解。

    //設定iframe讀取完畢之後的動作
    
    _iframe_obj.load(function () {
        
        //設定get方法JSONP的網址,要注意加入了JSONP特有的callback參數
        var _action_get = _action + "?timestamp=" + _timestamp 
            + "&callback=?";
          
        $.getJSON(_action_get, function (_result) {
            // ...Step6時再講解...
        });
        
    });

Step5. S2:伺服器回傳檔案上傳的結果

以JSONP方式呼叫伺服器時,「S」是以GET方式運作,他會做以下動作:

  1. 接收$timestamp,並與$header組成$index。這跟Step3做的事情一樣。
  2. 判斷請求方法為GET。
  3. 取得回呼函數的代號$callback,這是搭配jQuery.getJSON的作法。
  4. 從$index取得session資料,將檔案上傳結果存進$output字串。
  5. 刪除session資料,避免後來有心人再利用同樣的timestamp取得資料。
  6. 以JSONP方式輸出。

以下程式碼寫在server.php中,摘錄如下:

<?php
$header = "data";
$timestamp = $_GET["timestamp"];
$index = $header . $timestamp;

session_start();

if ($_SERVER['REQUEST_METHOD'] == "POST")
{
    // ...Step3講解...
}
else
{
    $callback = $_GET['callback'];

    $output = '';
    if (isset($_SESSION[$index]))
    {
        $output = $_SESSION[$index]['state'].'; ' 
            .$_SESSION[$index]['name'].'; '
            .$_SESSION[$index]['size'].'; '
            .$_SESSION[$index]['description'];
            
        unset($_SESSION[$index]);
    }

    if (is_null($callback))
        echo $output;
    else
        echo $callback."('".$output."');";    
    
}


Step6. C4:接收資料,復原form,呼叫回呼函數

以jQuery的getJSON取得資料之後,接下來就是復原form、刪除臨時建立的iframe,然後呼叫回呼函數。

這段程式碼也很簡單,寫在client.js中,摘錄如下:

        $.getJSON(_action_get, function (_result) {
            
            //復原form
            _form_obj.attr('action', _action)
                .removeAttr('target')
                .removeAttr('jsonp_by_post');
            
            //移除iframe
            _iframe_obj.remove();
            
            _callback(_result);
        });

Step7. C5:結果輸出

在Step1初始化時設定好的回乎函數會在最後接收資料,然後將結果輸出到div容器中。程式碼寫在client.js的上方,摘錄如下:

            $.jsonp_by_post(this, function (_result) {
                $("#output").html("Message: " + _result);
            });

如果檔案正常上傳,你會看到以下畫面:

image

如果你上傳超過1MB的檔案,則伺服器會記錄錯誤狀態,於是會看到以下畫面:

image

這樣就大功告成啦!


變化與應用

範例中的講解很簡單,身為能夠舉一反三的程式設計師,腦袋裡面應該已經呈現出很多不同的應用方式吧。這邊我大略提一下幾個變化的重點,還有最後應該注意的安全性問題。

資料的輸入

在此範例中,我所有資料都是來自於撰寫好的form表單。實作時,我們的原始資料不一定是真的來自form表單,通常會以JSON、陣列、變數形式存在記憶體中,以方便JavaScript進行處理。

如果是以JSON等非form的資料型態,想要進行跨網域的AJAX傳輸,那麼你還是得要自己將這些資料寫成form,這樣才能以POST進行遞交。雖然多了點步驟,但相信對於熟悉jQuery的你來說應該不是什麼問題。

安全性問題

網頁之間有很多跨網域的限制,而本篇旨在於打破這個跨網域限制來做到更多功能,但相對的就會負擔起更多安全性問題。

提供JSONP的服務,很容易就會受到跨網域指令碼(Cross-site Script)的攻擊,而被找漏洞、挖出使用者的資料。我並不是資安專家,對這方面研究還不夠深入,只能提供幾個簡單的安全性加強方向。大致上,我建議搭配身分認證的session、來源IP或網址,來判斷這個C是否有跟S溝通的資格,S再決定是否接受C的POST或GET請求。這樣應該會安全許多吧。

範例程式中為了講解方便,所以並沒有加上這些措施。如果你要將這個方法放到自己的應用程式中,請務必做好安全性的防範措施。


結語

這是我論文系統中實作的一個技巧,但因為論文無法寫出這些細節,所以我以寫blog的方式,記錄這個技巧的細節,供有需要的人參考。實際上這篇從想寫、擬完心智圖、寫了一半覺得不滿意、又改了好多次,到現在才完成。

這只是一個很基礎的AJAX技巧,可以應用到很多地方,可以進一步寫成更漂亮的framework或library。也許已經有人發表過這種方法了也說不定,不過,我另一個目的也只是給未來的自己留下一個參考而已,就作為一篇記錄吧。

(more...)

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

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

image

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

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


作法概述

這邊我以自己寫論文時使用中英文不同的APA格式的作法為例子,介紹整個的作法。安裝Firefox與Zotero以及額外需要使用的中文APA等資訊,請參考我之前寫的中文APA。這一篇是從這些環境已經配置好、也蒐集好必備的書目資料為前提,主要描述從撰寫正文及指定引用文獻開始,到最後整理參考文獻的作法。必須要強調的是,關於中文書目的輸入書目作法,還請參考中文APA的說明及APA規範來仔細檢查、整理,畢竟有乾淨的書目資料才能有漂亮的參考文獻格式。

步驟大致上分成三個階段,

  1. 撰寫正文前的準備
  2. 正文中的引用
  3. 參考文獻的整理與輸出

作法有點繁瑣,以下一一敘述。


步驟1. 撰寫正文前的準備

image

安裝好Zotero並建立了許多可以用的書目格式之後,現在我們要利用Microsoft Word 2007來撰寫一篇文章。在開始撰寫正文之前,我們先配置一下Zotero的相關設定。

1. 開啟增益集中的Zotero選項

image

Zotero並沒有獨立的工具列,而是包含在「增益集」裡面。

2. 選擇引用文獻樣式

image

請點選倒數第二個選項「Zotero Set Doc Prefs」。

image

這是Zotero很大的一個缺點:一份文件只能用一種樣式。而這也是這一篇文章想要解決的一個問題。

此處我們先選擇「American Psychological Association 6 th Edition」(APA),因此之後正文中的引用會以英文APA的方式顯示,而中文的書目就必須手動修改。

接下來,我們就可以開始寫正文了。


步驟2. 正文中的引用

正文中有參考到文獻的地方,都必須在正文中標示引用。這不僅是給予作者尊重,也是在最後整理參考文獻列表的重要步驟。我都是在寫作的同時,一條一條地加入引用,在撰寫正文的同時一併處理。

利用Zotero在正文中引用的情況很多變化,在這邊我舉出六種不同的引用狀況,以及各自需要修改、調整的地方來說明。

1. 英文,顯示作者

image

我寫了一段話「標註共識的構想是來自於社群指引支援(Social Navigation Support)的概念」,而我想要再這句話後面標註這是來自Dieberger等人的文章。

image

此時先將游標放在要插入引用的位置,然後點下Zotero工具列的「Zotero Insert Citation」。

image

找到你要引用的這篇文章,然後按下右下角的「確定」。

image

現在引用已經順利插入了。這是Zotero最基本的用法,不需要任何其他的修改動作。

2. 英文,不顯示作者

image

現在我寫了一段話:「閱讀理解策略中最有名的莫過於Robinson提出的SQ3R」,而我想要在「Robinson」後面標示這是引用自1970的文章。

作法一樣是將游標放在「Robinson」後面,也就是要插入引用的地方,然後開啟「Zotero Insert Citation」。

image

在「新增/編輯引用文獻」的對話視窗中,這次要勾選右下角的「不顯示作者」,然後按下「確定」。

image

這樣子插入的引用就只會顯示年份。

3. 中文,顯示作者

image

現在我寫了一段教育研究者提出的三種模式,引用自王瓊珠與陳淑麗的書本。

通常這個引用我會放在「句號」前面,所以此時將游標放在句號前,再開啟「Zotero Insert Citation」。

image

找到要引用的文獻之後,按左下角的「顯示編輯器」按鈕。

image

這邊會顯示Zotero預設要插入的格式:「(王瓊珠 & 陳淑麗, 2010)」。因為我們一開始選擇用的是英文APA,所以括弧、逗號等標點符號都是半型表示。這邊就只能手動進行修改。

image

將符號改成全型,再將「&」改成「、」,就成了叫為合適的:「(王瓊珠、陳淑麗,2010)」。這樣子再按下「確定」輸出即可。

image

輸出之後的樣子如上圖。

4. 中文,不顯示作者

image

現在我又引用了王瓊珠與陳淑麗的書本內容,這次我把他們的名字寫出來了,所以接著引用中我只需要表示年份即可。

確定游標的位置在作者名字後面,然後開啟「Zotero Insert Citation」。

image

這次一樣勾選「不顯示作者」,然後打開編輯器,將半型的括弧「(2010)」修改成全型的括弧「(2010)」,然後按下「確定」輸出。

image

這樣就完成了。

5. 中文,多重來源,顯示作者

image

這邊我寫了一段話:「許多學者不斷改進他們的方法,而提出了各種不同的閱讀理解策略」,此處的「許多學者」是引用來自多篇不同的文獻,而引用的方式也比較複雜。

一樣先將游標放在要標示引用的地方,然後開啟「Zotero Insert Citation」。

image

基本上,Zotero預設只能選擇一個來源,但他也提供了「多重來源」的模式,方便一次引用多個文獻來源。請按下左下角的「多重來源」來切換到多重來源模式。

image

接著右方會出現多重來源的列表。這時候你就可以來找你要引用的文獻,並按右方箭頭「→」圖示來將它加入列表中。

image

接著打開編輯器來調整。Zotero會聰明地依照作者名字排序,但是標點符號依然要從半型轉換成全型:「(王化龍, 1991; 林乾義、關爾嘉,2002;柯華葳,2009;馬沙諾,2003;廖仁武,1998;劉明兆、余德慧,1982)」。修改完之後再按下「確定」輸出。

image

完成。

6. 中英多重來源,顯示作者

最後必須要提醒的是中英多重來源的情況,我的論文中並沒有出現這種資料,所以在此我根據「學術論文寫作:APA規範」一書來說明。

如果同時引述中文與英文文獻時,需注意以下事項:

  • 最外為的括弧仍是以「全型」為主
  • 先引證中文文獻之作者與年代,再引述英文文獻之姓氏與年代
  • 兩者之間應以全型之分號「;」分隔
  • 年代宜統一以西元年代呈現
  • 中文文獻之標點符號一律以「全型」輸入,英文文獻之標點符號則以「半型」輸入

舉例:

  • (張保隆,2005;Chang, 2003)
  • 相關研究(張保隆、謝寶煖,1996;謝寶煖,1997;Chang & Hsieh, 1993, 1996; Good, 1990)

詳細的細節,還是請參考「學術論文寫作:APA規範」喔。

因為需要注意的事項頗多,Zotero無法聰明地幫你區分中文跟英文,所以這部份一樣得用編輯器慢慢修改才行。


步驟3. 參考文獻的整理與輸出

image

寫完正文之後,參考文獻的引用應該也差不多了。接下來,我將說明到底如何將這些參考文獻分成中文與英文兩種。

1. 輸出參考文獻列表

image

在正文最後,也就是預定插入參考文獻的地方,使用Zotero的「Zotero Insert Bibliography」功能。

image

Zotero會幫你在正文中引用的文獻彙整出一個列表,按照作者排序。這個列表就是你文章寫到最後全部引用的所有文獻了。

2. 為所引用的文獻加上標籤

接下來我們為這篇正文所引用的文獻加上「標籤」。因為這次我要寫的是碩士論文,所以我的標籤定為「2011碩士論文」。

image

對照參考文獻列表,回頭去找尋Zotero中的文獻。上圖中,我找到了引用的「讀寫新法」,並在「標籤」欄位中幫該文獻加上了「2011碩士論文」的標籤。

這個手動的步驟儘管很麻煩,但標籤只要1. 複製 2. 貼上 3. enter就能加入,其實挺快就能處理完畢。

3. 儲存英文文獻的搜尋結果

幫這篇正文被引用的文獻都加上標籤之後,我們就能用進階搜尋快速地製作參考文獻列表。

image

在Zotero面板的工具列中,打開放大鏡圖示的「進階搜尋」。

image

搜尋條件設定兩個:

  1. 標籤、是、2011碩士論文
  2. 語言、不含有、zh_

條件1能夠找出標籤是「2011碩士論文」的文獻,而條件2則是過濾掉英文文獻的作法,稍後再敘述這個用意。

image

搜尋出來的結果,請按「儲存搜尋」。

image

為存留搜尋命一個名稱:「2011碩士論文 英文文獻」。

image

這樣Zotero就會幫你把搜尋結果儲存起來。

image

接著再檢查一下這個清單裡面是否有參入中文文獻。如果有的話,則幫此文獻的語言加入正體中文「zh_TW」或簡體中文「zh_CN」的資料。

4. 儲存中文文獻的搜尋結果

image

接著來建立中文的參考文獻。作法一樣是使用進階檢索,搜尋「標籤 是 2011碩士論文;語言 含有 zh_」的結果,並儲存搜尋成為「2011碩士論文 中文文獻」。

image

這樣子就建立好中文與英文兩個參考文獻的列表了。

5. 由搜尋結果建立參考文獻

有了中文與英文兩個列表之後,接下來就以不同引用文獻樣式輸出參考文獻列表。

image

先做中文文獻的列表。在中文文獻的存留搜尋上按右鍵,選擇「由存留搜尋來建出參考書目」。

image

接著選擇引用文獻樣式。由於是中文的參考文獻,所以就選擇我自己做的American Psychological Association in Pulipuli中文APA樣式吧,同時選擇「複製到剪貼簿」,最後按下「確定」。

image

再來到Word中「貼上」,就完成中文參考文獻的輸出。

image

接著再用同樣的步驟來輸出英文文獻,只是這次的引用文獻樣式要選用英文的「American Psychological Association 6th Edition」。

image

然後貼到Word中,完成輸出。一開始由Zotero建立的中英混雜參考文獻列表則已經可以移除了。

最後還要檢查一下Zotero輸出的格式是否正確。中文APA輸出時需要注意多作者的「、等」之類的問題,詳細請看這篇的說明


結語:如果還要修改參考文獻的話

步驟3強烈建議等到論文都定稿了再來處理。然而在這個工程做完之後,如果未來因為修改內文而刪增參考文獻的話,則只要把文獻的標籤做增減即可。這種作法不能全自動地偵測、判斷,的確是Zotero力有未逮之處。希望未來他還能夠繼續改良。

在寫這篇文章的時候,我發現到有人設計了多語系Zotero (Multilingual Zotero),我想改天再來試試看這究竟能不能改善Zotero這方面的問題,希望他可以。

如果有更好的方案,也請大家多多建議喔。

(more...)