:::

心智圖介紹 / Mind Map Introduction

布丁布丁吃布丁

心智圖介紹 / Mind Map Introduction

image

2014年11月的時候,我到老師的課堂上介紹心智圖及線上心智圖工具mind42用法。希望幫助同學有效率地組織工作與報告。


投影片 / Slide

大綱 / Outline

這次演講是先介紹心智圖的基本理論,然後介紹繪製心智圖的數位工具,以及線上心智圖Mind42的使用。接著再介紹應用使用心智圖的案例,包括準備期末報告、理解閱讀的文章、準備考試複習範圍,最後則是安排實作活動。以下是本演講的大綱:

  • Part 1. 活用大腦的無限可能性
  • Part 2. 強大的心智圖數位工具
  • Practice 1. Mind42試用
  • Part 3 應用心智圖解決問題
  • Practice 2. 團體合作閱讀

心智圖與概念圖的不同 / The difference between Mind Map and Concept Map

image

值得注意的是,教育學術界使用較多的是概念圖 (Concept Map),他跟心智圖 (Mind Map) 長得很像,可是應用的重點卻差很多。

雖然兩者都是被用來呈現學習者腦袋內概念的描述工具,可是概念圖比較著重概念之間階層順序,心智圖則是強調用圖型化來刺激想象力。而概念圖始於教學研究,有一套為概念圖評分的方法,詳細請見我另一篇文章「有意義的學習:概念圖介紹」,但心智圖則還沒有一定的評估方法。


結語:心智圖之後的下一個生產力工具 / Conclusion: What is next productive tool after Mind Map

10. 核心架構圖

我使用心智圖已經好幾年了,從一開始準備考試使用的大綱、撰寫論文時使用的心智圖 (例如很受讀者歡迎的「我的論文寫作工具:XMind心智圖」)、寫blog時也是用心智圖來規劃。

329717

原本我會同時在桌機與手機上編輯心智圖,但是後來因為Thnking Space被MindJet買走、變成收費工具且不支援XMind之後,我改轉用免費的編輯工具FreePlane。然而FreePlane與FreeMind系列工具所編輯的心智圖實在沒辦法像XMind這麼漂亮,此時我才深深地體會到心智圖強調的「圖像化」的重要性。

除此之外,我覺得心智圖最讓我感到困擾的是他在合作編輯上的限制。雖然我在這篇演講中介紹了Mind42,但其實我平常仍然比較依賴本機端的心智圖工具,以方便跟本機端的其他檔案結合。但是相對的,心智圖的缺點就是難跟其他人討論、甚至共同編輯。

home-devices

現在我改使用看版式的管理工具Trello,其特色是容易跨平臺、跟雲端空間密切整合、方便共同編輯,特別適合用在Todo待辦事項工具上。但是跟心智圖相較之下,並不支援漂亮的視覺圖像化,而且對離線工作的支援也很差,大多功能都必須透過網路連線。雖然Trello很適合整理大量的資訊,但是卻很不適合用來激發創意。我想再評估一陣子,有機會再跟大家介紹吧。

(more...)

空大授課記事 / Teaching in National Open University

空大授課記事 / Teaching in National Open University

10547748_790748507645208_168964268593952746_o

我從2013年開始在國立空中大學新北中心的管理與資訊學系擔任講師以來,不知不覺已經教完了三個學期。雖然說這份工作是教人,但是我也在這份工作中學到很多。在此懷著感激的心情,記錄一下至今為止的心得。


機緣 / Chance

在一年半之前,我本來只是忙碌於博士班的課業之間,但是在指導教授陳老師的引薦之下,我多了一份到國立空中大學(以下簡稱空大)新北中心教課的講師工作。雖然我在課堂中待了好幾年,但只是台下聽課的學生,一輪到自己要上台授課,這可是完全不同的世界。好在有新北中心郭老師與方老師給了我許多課堂準備的建議與心理建設,還有助教們耐心教我授課時的諸多規定,我才能逐步上軌道。真的很謝謝大家。

第一門課: 影像處理與Photoshop / First course: Image Processing & Photoshop

image

空中大學的上課方式與傳統大學有許多的不同,也因此我得想辦法把以前的學習經驗做大幅度的轉換。我第一門教授的課程是「影像處理與Photoshop」,而這堂課是以空大特別的授課方式來進行:上機實作課程。在實作課程中,授課內容與課堂實作作業緊密結合,還要安排實作考試來了解學生的學習進度。教課時常常為了電腦教室的問題手忙腳亂之外,有時候也會遇到教不完想要教的進度、或是程度高低同學進度難以配合的情況。這些都是上課教學容易遇到的困難。

不過授課中也常常遇到意外的驚喜。因為這是比較自由的上機實作課程,常常也會有功力高強的同學發現更快、或是更棒的技巧,也讓我在教課中學到很多,每每都充滿驚奇。我特別喜歡看課堂作業指定製作的卡片,總是能夠看到同學們利用課堂上學到的各種技巧,再結合自己的創意,做出一張一張豐富又有趣的作品。雖然第一次上課很難說上得很好,但是感謝各位同學們的包容與配合,最後仍是以歡樂的氣氛完成了這次的教學。

第二門課:物件導向系統分析與設計 / Second course: Object-Oriented System Analysis & Design

物件導向分析與設計

第二次上課時,我選擇了比較能夠呈現個人專業的科目——「物件導向系統分析與設計」來教,我想一直以來系統開發的經驗與跟業界朋友的交流可以帶給同學許多收穫。必須注意的是,這堂課並非是「物件導向」,而是「系統分析」,只是是用UML物件導向的概念進行的系統分析。這讓很多同學誤以為是物件導向課程而來修,後來發現是個誤會。

系統分析的課程以往在大學開課時,通常都是分組進行專案作業,期末則是呈現專案結果。本來我也想在這堂課中使用合作學習的教學法,但其實空大上課方式仍是以網路授課為主、面授課程為輔,要湊齊學生來討論其實還蠻困難的。所以到後面我就調整了上課方式,改以講課為主。

我除了以課本作為講課基礎之外,還再加入一些實作與業界的經驗分享,希望讓同學能夠兼顧課堂考試與未來實用性。最後期末的意見回饋中看到了同學的稱讚,真的很令我感動。

第三門課:Java資料結構與應用 / Third course: Data structures and Applications in Java

Java資料結構與應用

在教系統分析時遇到了一個問題,空大並沒有擋修制度,想修什麼就修什麼。許多同學以為我這門課是教Java程式設計,所以沒有基礎也跑來上課,課程聽起來十分吃力。第三次課程我就改上比較基礎的「Java資料結構與應用」。然而這堂課也不是給完全不會Java的同學修的入門課程,並不會介紹迴圈、例外處理等資料結構中常使用的方法,同學上課仍然是叫苦連天。

因此在這堂課中,我試著在既有課程進度中加入基礎的內容,希望讓沒碰觸過Java的同學也能稍微看得懂程式碼。同時我也用動畫來呈現演算法對資料結構的影響,以視覺呈現來解釋資料結構複雜又抽象的概念。這種上課方式似乎頗獲得同學的好評。

其中一次讓我印象特別深刻,我去台北中心幫其他老師代一上其中一門課,我們借用了教室的投影機展示資料結構的動畫投影片,同學們大為驚訝,下課後紛紛跑來跟我索取其他課堂的投影片,並稱讚我教得很不錯。這種付出的苦心能有所回報的成就感,真的感覺很棒。

下一次的課程:Word專業文件排版 / Next course: Professional Document Design in Word

接著很快地就來到了第四個學期。這次應方老師的邀請,我要開的課程是「Word專業文件排版」。這次上課方式又跟第一次上課的「影像處理與Photoshop」一樣,是大班級的上機課程。希望這次能夠吸取前幾回的經驗,帶給同學更好的教學內容囉。


結語:教學相長 / Conclusion: Teaching benefits teacher and student alike.

10547748_790748507645208_168964268593952746_o

這一張空大招生海報(長形海報稱為「易拉寶」)是我教完Photoshop影像處理與應用最後一堂課的時候,應助教請求留下來幫忙完成的招生海報。雖然我自己的美感真的很難拿出來說嘴,但是這張海報倒是應用了很多我課堂教學講過的技巧,就像是我在做期末報告的感覺。那時候就坐在辦公室一口氣完成這張海報,本來還擔心會不會做的太醜不受青睞,最後能幫得上大家的忙,真的是太好了。

每次看到這張海報時,就會覺得自己也是對這個世界有些貢獻。不過現在我還有很多要學習的,不論是作為博士生還是一位講師,要好好加油囉!

(more...)

NetBeans用SSH複製git儲存庫:以GitLab為例 / Clone git Repository via SSH in NetBeans: a GitLab Example

NetBeans用SSH複製git儲存庫:以GitLab為例 / Clone git Repository via SSH in NetBeans: a GitLab Example

image

之前我寫過在NetBeans裡面用HTTP來複製(clone) git保存庫的作法,這篇則是要介紹使用SSH來複製保存庫的另一種作法。雖然SSH連線需要比較多設定,但較適合正式開發時使用。而這次要連接的對象也不是公開的GitHub,而是私人使用的git保存庫GitLab,但介面跟作法都跟GitHub大同小異就是了。


關於Git的基本知識 / About Git technology

我在之前幾篇文章中都有介紹過git,首先這三篇是使用TortoiseGit作為git工具的入門介紹:

TortoiseGit是很強大的git工具,比NetBeans內建的git還要好用,像是要取代分支(branch)檔案時特別方便:

但是如果要開發的話,還是使用NetBeans這種IDE會比較適合。所以我就寫了以NetBeans使用git的教學:

然而這篇是用HTTP存取git儲存庫,這種作法雖然簡單,但是使用HTTP的缺點是不能上傳大檔案。git使用HTTP傳輸檔案時,http.postBuffer預設值只能夠上傳1MB,而伺服器端通常也不允許過大的檔案,GitHub最多一次上傳100MB,而GitLab使用的Nigix則是預設只能上傳20MB。上傳過大檔案時會發生411錯誤,必須要同時修改git客戶端跟伺服器端的設定才能解決。雖然修改過後可以用TortoiseGit來連線,但在NetBeans上卻仍然不能上傳大檔案。

最後我只好回頭改用SSH的方式連接,一併把SSH連接時使用不同連接埠的方法也找了出來。請照著以下步驟一起來操作吧。


環境說明 / Environment

首先必須說明git的客戶端與伺服器端的基本資訊。

Git客戶端:NetBeans / Git client: NetBeans

我目前使用的是NetBeans 8.0版本。但是Git功能並沒有多大改變,前幾版使用時應該差不多。

我現在大部分以專案進行的開發都是使用NetBeans,不論是寫網頁、JavaScript、PHP、Java都能夠支援。例如最近一篇編譯WISE就是用NetBeans來進行。相對的,我反而比較不推薦使用大學很常教的Eclipse,它在開發網頁應用的支援較差。

Git伺服器端:GitLab / Git server: GitLab

如果要架設GitLab的話,有兩種方式可以選擇:

如果不想架設的話,也可以直接使用GitLab的雲端空間:

  • GitLab.com:雲端私人儲存庫,剛好跟GitHub強調開放原始碼的運作方式打對臺

本篇我採用OpenVZ架設Turnkey Linux GitLab,設定IP為192.168.11.102,SSH連接埠為22,Domain Name為 git2.pudding.dlll.nccu.edu.tw。這些都是區域網路的設定,僅供本篇測試用,其他人是連不到這個網站的喔。


步驟說明 / Steps description

如果要用SSH來連接Git,我們必須要先用SSH金鑰製作工具產生公鑰私鑰,然後將公鑰上傳到Git伺服器端(也就是本篇的GitLab),而Git客戶端(也就是本篇的NetBeans)要存取伺服器端時,則需要搭配私鑰來連接。

Step 1. 產生SSH的公鑰與私鑰 / Create SSH public key and private key

image

我在「GitHub入門 Part.2 工具安裝與環境配置 」這一篇中有介紹如何用PuTTYgen (PuTTY Key Generator)產生公私鑰。

不過這裡我們簡單一點,我隨便產生一個公鑰與私鑰直接給大家下載:

這個公鑰與私鑰僅供測試使用,正式開發環境請不要用它,不然其他人也可以用這個私鑰去連接你的私人git儲存庫喔。

Step 2. 加入SSH公鑰到GitLab / Add SSH public key to GitLab

image

接著登入GitLab,進入帳號中的SSH Keys。一般來說SSH Keys的網址是:

請按下右上角的「Add new」新增公鑰。

image

新增公鑰並非是上傳檔案,而是要用複製貼上的方式來將公鑰貼到Key的欄位。至於Title欄位可以填寫一個容易記得的名字即可,例如「puli-public-key」。

image

請用文字編輯器(像是Notepad++)來開啟公鑰檔案,複製裡面全部的內容,貼到網頁中Key的欄位內。

或是複製以下文字框裡面的內容,裡面的文字跟我上面分享的公鑰是一樣的:

 

2015-08-07_011436

完成之後應該會像是這樣子,然後按下「Save」儲存。

image

新增完成。

image

讓我們回到要複製的git儲存庫首頁。在這裡可以找到連接git儲存庫的連接網址,以SSH來說,通常會是「git@git2.pudding.dlll.nccu.edu.tw:pudding/test.git」。請記下這個連接網址,下一步設定git客戶端的時候,我們就會用這個網址來連接git儲存庫。

Step 3. 使用NetBeans連接Git儲存庫 / Connect Git Repository in NetBeans

image

接著我們來設定Git客戶端:NetBeans。開啟NetBeans之後,從Team > Git > Clone… 找到複製的功能。

image

接下來是很重要的關鍵設定。

首先,Repository URL本來應該設定剛剛看到的連接網址「git@git2.pudding.dlll.nccu.edu.tw:pudding/test.git」,但如果伺服器必須指定SSH連接埠的話,那就要改用不同的形式:

  • 原本的連接網址格式:[user@]host.xz:path/to/repo.git/
    例如:git@git2.pudding.dlll.nccu.edu.tw:pudding/test.git
  • SSH的連接網址格式: ssh://host.xz[:port]/path/to/repo.git/
    例如:ssh://git2.pudding.dlll.nccu.edu.tw:22/pudding/test.git

接著Username請務必輸入git,請不要用GitLab的帳號。

然後Pirvate Key File則選擇剛剛產生的SSH私鑰 puli-private-key.ppk。

下面還可以在Clone into: 設定檔案的位置。

設定完成之後就按下「Next >」進入下一步。

image

這時候應該會跳出一個Warning,要加入GitLab伺服器的連線授權。請按下「Yes」即可。

image

看到這個畫面表示正常連接,按「Next >」進入下一步。

image

這樣就完成了,按下「Finish」確定。

image

複製完成之後,接下來再建立專案,請按下「Create Project」。

後續的步驟就跟「Git合作開發從NetBeans開始!NetBeans複製git專案教學」的「Part 2. 新增NetBeans專案」一樣了,請參考之前的文章繼續操作吧。

只要第一次設定後,Git連接方式就會保存在NetBeans裡面,以後每次存取Git儲存庫就不用重複輸入帳號密碼了。


結論:需要學習使用IDE跟版本控制 / Conclusion: Learn to use IDE and version control

最近實驗室又加入了新進成員,而許多人也需要開發系統作為畢業論文。由於我們系所並不是強調軟體工程的科系,所以進來的學弟妹雖然能夠看得懂程式碼,但是在開發上仍顯得生澀。

選擇好用的IDE與版本控制工具能夠降低開發過程中繁雜的操作,程式設計師主要是在邏輯思維上下工夫,而不是像打字員一樣複製大量的程式碼,還難以維護。而IDE與版本控制也是未來踏入業界開發團隊中,與他人合作開發系統時必須要具備的技能。作為未來進入職場的投資,請務必多多熟悉IDE與版本控制的操作吧。

(more...)

網頁式科學探究學習環境WISE的編譯與安裝 / WISE Development: Compilation and Installation

布丁布丁吃布丁

網頁式科學探究學習環境WISE的編譯與安裝 / WISE Development: Compilation and Installation

image

我們實驗室接手網頁式科學探究學習環境WISE並開發成合作網頁式科學探究學習環境CWISE已經有幾年的經驗,而這一篇則是要回顧原本的WISE是如何編譯與安裝,以便後續進行更深入的功能開發。


WISE與CWISE的差異 / The difference of WISE and CWISE

WISE原本是美國柏克萊大學Marica Linn教授的計劃成果,主要是提供國小到高中的學生透過網路瀏覽器進行科學探究的學習。WISE建置了大量的資料蒐集與分析工具,以支援教學研究的進行。

CWISE則是由我國的國立臺灣師範大學科學教育研究所、國立高雄師範大學科學教育暨環境教育研究所與我所在的實驗室——國立政治大學圖書資訊與檔案學研究所三個研究團隊,在科技部計畫的贊助之下,將 WISE網頁中文化,架設了CWISE網頁,並依各團隊的專長——生物、理化及地球科學三個科目,每個科目各發展完成兩個課程,共計六個課程模組,並已經在CWISE首頁上開放預覽。(介紹來自CWISE使用說明)

WISE與CWISE的架構都是採用JSP Servlet,背後是以Java Spring Framework這個Java全站開發知名的框架架設而成。因此在編譯與部署時,都是採用Java的方式來進行即可。


環境 / Environment

開發與運行所需要的環境並不一樣,兩者也可以在不同的平臺上進行。只是本篇我們先以WISE為例子來介紹如何在Windows作業系統上編譯與安裝。

開發環境 / Development Environment

開發環境所需要的功能是取得原始碼與編譯。WISE的原始碼已經在GitHub發佈,可以直接下載最新版本,或是在releases中找尋對應的版本。例如CWISE使用的4.6版本各別保存在WISE-VLE—Deprecated--WISE-Portal—Deprecated--裡面。在編譯上,像是採用了Java Spring的大型系統通常會搭配Apache Maven這套自動化編譯工具,WISE也是要用Maven來編譯。

但是我們也不需要個別下載或用指令來操作,實際上有更簡單的方法:使用整合開發環境IDE。而這邊我推薦使用的是NetBeans。

image

NetBeans已經內建了Git跟Maven的功能,我們可以直接用NetBeans從GitHub下載原始碼、建立專案、並且編譯,一氣呵成。操作的細節將會在下面介紹。

運作環境 / Runtime Environment

WISE是JSP Servlet應用系統,一般常搭配Apache Tomcat 網頁伺服器來運作(以下簡稱Tomcat),此外還需要MySQL資料庫搭配使用。在Windows環境中,我們可以直接安裝XAMPP即可。它集合了Tomcat與MySQL,並且提供了容易操作的個性化操作介面GUI,是適合開發與入門的伺服器安裝包。

blog image172

2015-08-05_192009

安裝XAMPP之後,要先從控制面板開啟Tomcat跟MySQL服務,另外為了管理MySQL,我們還需要開啟Apache。開啟按鈕如上圖紅框所示。

2015-08-05_192851

比較需要說明的是XAMPP的Windows安裝版本的路徑,這跟一般的Tomcat運作環境不一樣。如果XAMPP安裝在D:\底下的話,那Tomcat的網頁則是放在「D:\xampp-5.6.8\tomcat\webapps」之中。以下我們將該路徑簡稱為 [webapps]。

image

MySQL的控制則可以使用phpMyAdmin。預先安裝的話,phpMyAdmin的網址如下,僅能用localhost登入,但不用輸入密碼。


如何編譯WISE / How to compile WISE

2015-08-05_194246

WISE的原始碼發佈在GitHub上,我們雖然也可以用Download ZIP的連結下載所有程式碼,但我比較推薦使用Git的Clone功能下載WISE的原始碼。這樣做法不僅可以取得較完整的程式碼,更可以直接在NetBeans中建立專案(Project),以便後續的編譯。

下載原始碼 / Download Source Code

image

NetBeans的Git功能在Team功能表裡面,找到Remote裡面的Clone。這個功能要等NetBeans全部開啟之後才會顯示。

2015-08-05_200346

在Clone對話框裡面,將Git Clone的網址輸入Remote Repository的「Repository URL: 」之中,檔案保存位置不要選在XAMPP資料夾中,建議放在根目錄,例如「D:\」。然後按下「Next >」。

image

接著NetBeans會問我們要下載哪一個分支(Branch)。這個儲存庫並非CWISE採用的4.6版本,在此我們先以現在的WISE最新的主要版本 (master) 作為例子即可。

image

然後按下「Finish」確認,接下來就要開始Clone囉。

image

接著Git會從儲存庫Clone下程式碼,如上圖紅框標示。這個步驟會花蠻多時間的。這是因為GitHub並不適合傳送大量檔案,而且我們這邊的學術網路跟GitHub關係一直不是很好的樣子,每次大量檔案傳送都很慢。

image

好不容易Clone完成之後,NetBeans會問你是否要建立成Project。這時候按yes即可。

image

這樣子WISE的所有程式碼就已經下載到你的電腦上,建立了名為「Web-based Inquiry Science Environment」的專案,並且可以編輯了。

image

這時候就能用NetBeans的全文搜尋功能找尋要修改的功能,進行更深入的開發。

但是這些原始碼需要經過編譯才能夠放到運作環境。因此接下來我們要來看一下怎麼編譯WISE原始碼。

使用maven編譯原始碼 / Use maven to compile Source Code

image

NetBeans也內建了編譯Java專案的Apache Maven工具,不過必須要先將原始碼建置成專案。如果你是照上述的步驟操作,你應該已經有一個WISE的專案。我們可以從專案上按右鍵,開啟「Build」功能。

image

第一次編譯時,Maven會因為相依性設定,下載很多WISE需要的函式庫。因此第一次編譯比較花時間,之後編譯就不用重新下載,編譯時間會短很多。

image

編譯完成之後會看到以下訊息:

------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
這樣就表示編譯完成。相反的,如果看到ERROR的話就是編譯錯誤,請看maven的提示來修正程式的錯誤吧。

image

最後編譯完成的結果會放在專案路徑中的「target」資料夾中,「wise.war」就是最後編譯的結果。


安裝WISE / Install WISE

有了「wise.war」編譯檔案,我們就可以把他部署到運作環境中。然後接下來還要配置資料庫、修改WISE的設定檔,這樣就可以正常運作了。

配置wise.war跟jnlp.war / Deploy wise.war and jnlp.war

image

首先,我們先把「wise.war」跟「jnlp.war」放到XAMPP底下在「webapps」資料夾。jnlp.war是Java Web Start,下載網址如下:

 

image

然後關閉Tomcat服務,再重新開啟Tomcat。這個時候Tomcat會將wise.war跟jnlp.war解壓縮並配置到合適的位置。

配置資料庫 / Setup Database

接著我們要進入phpMyAdmin來設定資料庫。網址是:

要進行的動作包括:

  • 建立一個資料庫名為 wise_database 
  • 匯入資料庫的初始SQL:wise_db_init.sql。這個檔案位置在
    [webapps]/wise/WEB-INF/classes/wise_db_init.sql

image

因為phpMyAdmin的操作比較廣為人知,因此這邊我就不描述細節了。

建立資料夾 / Create Directories

image

接下來要在[webapps]底下建立「curriculum」跟「studentuploads」兩個空資料夾。

建立設定檔 / Create configuration

最後我們要建立設定檔案,裡面將會有資料庫的連線設定。

image

我們先到以下路徑:

[webapps]/wise/WEB-INF/classes

image

請複製這個資料夾裡面的「wise_sample.properties」到同一資料夾中,並改名為「wise.properties」。

image

然後修改裡面的設定值,首先先修改檔案路徑,主要是修改紅字的部分:

wiseBaseDir=[webapps]\wise

curriculum_base_dir=[webapps]\curriculum

studentuploads_base_dir=[webapps]\studentuploads

image

接著修改下面的資料庫設定,採用XAMPP預設的帳號root跟空白密碼即可:

hibernate.connection.username=root
hibernate.connection.password=

修改設定檔之後需要重新啟動Tomcat,請使用XAMPP的控制面板來關閉、啟動Tomcat吧。

啟動測試 / Startup Test

image

經過上述步驟之後,WISE應該就能夠正常運作了。請打開以下網址,看看會不會出現上圖的畫面吧:

這樣就完成囉。


結語:下一步是修改CWISE / Conclusion: We will compile CWISE at next time

這一篇介紹的是WISE現在版本的編譯與部署,但是這跟CWISE使用的WISE 4.6版並不一樣。最大的差異就是CWISE需要同時修改兩個專案,個別是WISE-VLE—Deprecated--WISE-Portal—Deprecated--,然後我們又改了許多JSP檔案。當然,編譯跟部署的作法其實還是大同小異。希望接下來要修改的功能能夠順利進行了。

附帶一提,這篇是在手機、平板、筆電等多個裝置中不斷切換撰寫草稿,最後再回到桌機上修飾、加圖後完成。雖然才兩千五百多字,但其實寫了好幾天了啊。沒辦法,現在真的很難有專心待在電腦前面的時間啊……

(more...)