2012年9月23日 星期日

KM, GTD with Emacs Org Mode, & Mindmap, among others

KM

NB

http://people.csail.mit.edu/sacha/nb/tut-latest/ 這是mit的一個在PDF上注解並討論的網站,看起來很fancy,如果能結合影音討論的話,以後就不用來上課了XD

http://nb.mit.edu/welcome 這是主頁,名字就叫NB,是notebook呢,還是'牛B'呢?   XDDD

docear

http://sciplore.org/software/freemind_scholar/這是一個結合心智圖和文件管理的程式,用來寫論文很方便,跟endnote有異曲同工之妙

http://www.docear.org/software/screenshots/ sciplore的新版docear的使用方式短片,完成度已經很高了,現在就缺線上協作的部分,完成的話就天下無敵了
sciplore/docear 主要的功能在於將PDF內的書籤、註解等匯入,然而其主體 freemind 在我的 ubuntu 上匯入 folder 後竟無法 follow link ,失望之餘被我列為暫時拒往戶。因此我開始在尋找有無文字模式的 mindmap 解決方案,結果發現竟然有下面這個東西…

Emacs Org Mode 

Intro

The Org Manual (一頁HTML)
Org tutorials 一些教學文件和強者的使用經驗談
Emacs強大的Org Mode (持續更新)
[emacs] 为什么说org-mode是个神器
如果能內嵌圖片的話(org-toggle-inline-images),那麼拿來寫共筆也沒問題了,WORD就可以去吃*了XDDDD

Hands-on

普通人(非程式設計師)的.emacs設定檔 "請看stevenchan製作的簡易速查表"快速上手emacs

Emacs的Org Mode 簡單的快速上手介紹;重點:星號、移動、(平行)列表
Emacs org mode学习笔记  同上篇作者,較詳細的介紹,可以達到類似mindjet的效果;"结构化编辑"中提供了許多類比於word大綱模式的快速鍵
Emacs学习笔记(9):org-mode,最好的文档编辑利器,没有之一  更詳細一點的使用步驟
odt2org 將odt檔轉為org;可以先用LibreOffice將word的doc檔轉成odt再使用odt2org

GTD

Emacs学习笔记(11):用Org-mode实现GTD
這算是意外的發現吧,原來org mode是被這樣使用的

2012年9月22日 星期六

以perl處理ms word文件的utf8編碼問題


http://www.lemoda.net/perl/win32-ole-utf8/cp-utf8-ole.html

原文是在處理日文,不過中、韓文也適用,要訣是加上以下兩行:

use Win32::OLE 'CP_UTF8';
$Win32::OLE::CP = CP_UTF8;

順便提一下,一個起手的script可以參考
http://stackoverflow.com/questions/12070198/perl-ole-selection-property-iterating

得到script路徑的方式可參考
http://stackoverflow.com/questions/84932/how-do-i-get-the-full-path-to-a-perl-script-that-is-executing

加下以下兩行的方式比較穩定不會出錯:
use File::Basename;
my $dirname = dirname(__FILE__);

至於拜訪表格的方式,尤其是有合併的儲存格存在時,請參考
http://www.experts-exchange.com/Software/Office_Productivity/Office_Suites/MS_Office/Word/Q_27818826.html

__________________________________________________________________________

以下部分不確定,先持保留態度。為了關掉警告,會產生換行符號的轉換問題,有點不值得

常規表示法match中文時的解決方法
http://www.jeffhung.net/blog/articles/jeffhung/417/

輸出到檔案(及stdout等io設備)要做些處理,以關掉警告訊息
http://blog.wu-boy.com/2009/07/perl-with-utf-8-mode/

結果,換行的地方也會出問題

我是是接把換行字元變成 \x0d 來解決\n被轉換掉的問題

2012年9月14日 星期五

PDF中的索引和書籤(五)

在使用 swig 結合 c++ 的這個方向遇到困難後,回過頭來看看 evince 。結果發現 evince 根本就沒有用到 c++ 的介面,而是使用了純粹的 c 的介面(evince-3.5.90\libdocument\ev-document-links.c(52))。get_links_model 負責將索引組建成為樹狀結構(evince-3.5.90\backend\pdf\ev-poppler.cc(1384)),此結構剛好在 http://search.cpan.org/~tsch/Gtk2-1.203/xs/GtkTreeModel.xs 提供了 perl 介面。document 則由 ev_document_factory_get_document 取得(evince-3.5.90\libdocument\ev-document-factory.h(37)),其參數剛好是 char* ,非常有可能直接使用 swig 即可順利完成perl介面。很諷刺的是,本來一開始是想研究 evince 並繞過它直接呼叫 poppler ,沒想到 evince 本身可能已經完成了很多工作。這或許不是壞事,因為如果能整合 evince 本身的(自訂的)書籤系統的話,那麼我們很可能可以直接處理這個系統來得到想要的功能。

另一方面來說,evince 在 python 的介面似乎一直有人在維護,可以參考以下兩個連結
https://mail.gnome.org/archives/evince-list/2009-December/msg00007.html
http://www.techques.com/question/1-3672847/How-to-embed-Evince

不過這條路看起來也不輕鬆,尤其是有些package並沒有port到新版的ubuntu:
Choosing between Lucid and Squeeze packages? 由下連結可知,evince-python只更新到11.04版
http://packages.ubuntu.com/source/natty/gnome-python-desktop

這時又發現有python-poppler這個package,看來是最省事的作法
sudo apt-get install python-poppler
參考以下連結,寫個簡單的grep,看來還行
 http://lucasvr.gobolinux.org/etc/pdfGrep

2012年9月12日 星期三

swig產生poppler的perl介面步驟(一)

剛看了一下,apt-get install下來的 libpoppler19 和對應的原碼 libpoppler-dev 版本竟然不同,後者為0.18版。不過暫且放下這個問題,等到要編譯時再說。

產生 i 檔如下, 命名為 popplerIntf.i
%module popplerIntf
%{
#include "/usr/include/poppler/PDFDoc.h"
%}
%include "/usr/include/poppler/PDFDoc.h"
然後下swig指令
swig -c++ -perl5 popplerIntf.i

看起來是成功了。不過問題才剛開始,下一步編譯和連結,必需要確定版本的一致性,因此還是從官網直接抓最新的 source 下來編譯比較保險。可參考http://linux.vbird.org/linux_basic/0520source_code_and_tarball.php
  • poppler 似乎同時維護兩種 build systems,分別是 CMake 和 autotools (automaker等) ,參見 http://blogs.gentoo.org/lu_zero/2010/01/24/cmake-vs-autotools-poppler/ 。
    • autotools 的使用可參考 http://riverhippo.blogspot.tw/2010/03/gnu-autotools-share-library.html ,其腳本似乎為根目錄下的autogen.sh
    • CMake 的組態檔取名為 CmakeLists.txt ,參見 http://zh.wikipedia.org/wiki/CMake
  • 根目錄的 INSTALL 檔案說明了一些基本的安裝方式,但沒看到configure檔,顯然我們需要執行 aclocal, autoconf, automake,參見 http://blog.roodo.com/rocksaying/archives/12687975.html
  • 但以上功能已由 autorecon 取代,被寫在 autogen.sh 中,因此整個組建流程簡化為:
  1. 建立並進入子目錄(先確認 <程式庫安裝完整目錄> 已建)
  2. 執行 ../autogen.sh --prefix=<程式庫安裝完整目錄>
  3. make
  4. make install
其實以我們現在的情況是要寫module的話,安裝目錄不指定可能反而比較方便封裝
根據 swig-2.0.8/Doc/Manual/Perl5.html#Perl5_nn9 ,編譯 *_wrap.cxx 檔:
g++ -fPIC -c popplerIntf_wrap.cxx -I/usr/lib/perl/5.14/CORE -I./poppler-0.20.3 -I./poppler-0.20.3/mydist/poppler
g++ -shared popplerIntf_wrap.o -L/home/sig/usr/local/lib -lpoppler-cpp -o popplerIntf.so
最後測試一下
perl -MpopplerIntf -e 'print "hi\n"'
但問題還是出現了
perl -e 'use popplerIntf;$doc=new popplerIntf::PDFDoc("a.pdf");'
訊息如下:
No matching function for overloaded 'new_PDFDoc' at popplerIntf.pm line 62.

根據此文的暗示,可能要自己寫 typemaps...

2012年9月11日 星期二

細說swig產生perl介面步驟

模組 (module)

講到 swig 在 perl 的應用就要先了解 perl 的模組,因為任何引用的行為在 perl 當中都是以模組 (module) 為單位,因此撰寫可重用的程式碼也必需循此一標準。要了解這些概念,我推薦這篇文章: module,package,use , require , BEGIN,END 全部用法攻略 。(這個網站每篇文章都值得細讀,這篇文章應是來自 http://www.tutorialspoint.com/perl/perl_modules.htm ,以駱駝書的5.2節為基礎加以改寫的)。
  1. 要講到 module,就要先講到 package; package 是處理 scope 的問題,而 module 就是單一 scope 的檔案。
  2. 取用module時的指令為 use (和require,但不常用)。要被引用的識別字需加到 @EXPORT 
  3. 最後的程式就是用 h2xs 產生模組目錄,並用 tar 打包上傳。安裝時執行 Makefile.PL 即可
  4. 在實作時,善用 Module::Starter + Module::Install 會節省不少時間。
至此講的是以perl寫模組。那以c寫模組呢?就是在下 h2xs 參數時少個 X ,這樣就出現了個 .xs 檔案可以寫 c 的宣告和定義,然後流程是一樣的。可參考 https://sites.google.com/site/squallpro/%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88/perl/c-perl/h2xs 。應用 Module::Starter 則請參考 http://c9s.blogspot.tw/2009/04/modulestarter.html

好,那麼 swig 的角色呢? 請再複習一次


  1. (從 h 檔中)找出所要包裝的函數(和 h 檔)
  2. 建立 i 檔
  3. (從 h 檔中)複製函數宣告到 i 檔中,或使用 %include指令處理整個 h 或 c 檔
  4. 確認語法合於ANSI
  5. 如果不是直接引入 h 檔,請確認宣告的型態順序正確,以使介面可以順利編譯
  6. 將main()函數改名(但函式庫中應該不會有這個函數)
  7. 執行swig並編譯

(可參 http://stuff.mit.edu/afs/athena/astaff/project/svn/src/swig-1.3.25/Examples/perl5/class/index.html 。呼叫上可參此頁中"Key points"那段。)

歸納起來模組在perl中有三種編譯方式;

第一種是原生的呼叫gcc

第二種編譯方式是利用 h2xs (背後其實用了 ExtUtils::MakeMaker 來產生Makefile.PL),在 http://fans.huhoo.net/perlxs/perlxs.doc  有更深入的介紹

perl Makefile.PL
make
make install

上述兩種編譯的方法中,有人討論過與swig的搭配,請見以下兩串討論串,正解在第二串,但整個thread已吵得雞飛狗跳...( 因h2xs預設產生了 Makefile.PL,大家想當然爾認為swig該當如此)據該thread作者所言,在 http://www.swig.org/tutorial.html 上的編譯方式因此而更新;為維持可攜性,第二種編譯方式(使用MakeMaker)仍然是比較多人擁戴的
http://www.perlmonks.org/?node_id=895499
http://www.perlmonks.org/?node_id=895682
第三種是利用 Model::Starter;官方建議的MakeMaker已經有十多年的歷史了,較新的解決方案是 Module::Starter + Module::Install 。可以參考 http://c9s.blogspot.tw/2009/04/modulestarter.html 中的說明。但是沒人討論過與swig的搭配,或許是因為太前衛了 XD

解決問題的洞察力

最近寫太多硬派的文章了,想記錄一下最近的心情。

時代一直在前進,但是感覺前進的速度不成比例。一樣是大一的學生,比起十年前、二十年前明明多了那麼多工具,但是他們未必能欣賞這些工具的好,甚至因為看起來要"多"學一些東西,一開始就去排斥。(不過說實在的這或許是老師的問題,因為沒有點出方法論的重要性。)

另一方面是工具拿在手上要知道怎麼用,刀槍都有時要知道何時用刀、何時用槍。這是我覺得沒辦法與時俱進的能力,就是了解並解決問題的 insight ,我姑且稱之為洞察力好了。這其實是很高層次的心智活動(遊戲?),涉及空間推理、抽象化、符號處理、模式辨識、歸納邏輯、推理演譯等。如果今天我們只是把教科書電子化,把作業上線,這根本就只有方便了教授和助教,對型塑學生的心智能力毫無幫助。教學生資料搜尋的技巧、網路協作、然後丟一個問題給他,觀察他解決的方式,點出他的盲點,難道不是"教"的功能嗎?不然你也只是個"教師"而已了不是嗎?傳給他一套量身打造的武功,可能比所有人都教同一套少林武功要好得多了…

回過頭來說洞察力。這種能力是可以培養的,我覺得寫系統分析文件是很好的訓練方式。先說明想要解決的問題,然後觀察一些類似的問題和解法,然後把問題到結果之間拉出一條線,鞏固這個陣地,最佳化整個解答,最後反覘陣地確定效果。開始一定要作些類比,觀察類似的問題及解決的角度,最好能利用現成的解法稍加修改即可。

PDF中的索引和書籤(四)

Outline *PDFDoc::getOutline() 是屬於poppler的函式,一呼叫就會傳回一個樹狀的結構,因此需要一個 traverser 或 iterator 來去把它遍歷以存取每個節點。這也是遞迴函式 static void fillToc(...) 在程式中的用途,去遍歷節點進行處理,當然它一個函式包含了遍歷的演算法和處理節點的邏輯,在模組化的方面作的還有點不夠,不過因為他是個demo,所以也就不要太強求了。 從函式庫的使用者觀點,我們現在要做的是
  1. 開啟檔案,得到 PDFDoc* ==> PDFDoc::PDFDoc(GooString *fileNameA,...)
  2. 呼叫 Outline *PDFDoc::getOutline()
  3. 拜訪( visit )  Outline * 資料結構
ps.
看到第6點"將main()函數改名"我突然想到,其實這些函式庫經常帶有一些demo,這些demo本身就會調用函式庫,所以提供了使用上的順序和方法的資訊…(這不就是demo應該要做的事嗎)。目前看到幾個主程式
  1. poppler-0.20.3\glib\demo\main.c
  2. poppler-0.20.3\qt4\demos\main_viewer.cpp 當中的 main() ,由其定義可知,整個程式乃是使用命令列的第一個參數作為所要打開的檔案名稱,並呼叫了 loadDocument 函數
  3. poppler-0.20.3\utils\pdftohtml.cc(178) 當中亦定義了main(),420行呼叫了 dumpDocOutline ,其定義在  HtmlOutputDev.cc ,而取得書籤的函數定義在 poppler-0.20.3\utils\HtmlOutputDev.cc(1684): Outline *outline = doc->getOutline(); 

其實如果懶得跟 pdf 週旋下去的話,直接把它 dump 成 html 來處理也是滿可行的。事實上ubuntu似乎預裝了 pdftohtml ,而測試的結果也證實,這樣一轉以後,所有的格式資訊都消失了…

python-poppler 及 ruby-poppler 都以套件的形式在apt的套件庫中存在。稍微看了一下是很久沒維護的樣子,可能是不需要,還是沒人?不知道…不過我有點可以理解,因為poppler的版本演進還滿快的,如果介面經常改變,那可能會令人失去追逐新版本的熱情。為了維持自身的穩定性,可能最好是抓個固定的版本編譯後給自己用,而不去使用系統預裝的版本。

要查ubuntu中安裝了那些套件,如poppler,可以下此命令
sudo dpkg --get-selections | grep poppler
結果會發現 libpoppler19 已經預裝了。以下命令可以查詢其資訊及位置
dpkg -s libpoppler19
dpkg -L libpoppler19