n年沒文章了 (被打)....
不過好像也沒什麼人看嘛...(煙)
---- 以上亂哈啦 ----
找了許久在Linux中使用的pdf註解軟體,
用了一陣子的okular,可惜太胖了一點,我的小萬跑起來很累。
而xournal是可以用,但瀏覽pdf就沒一般pdf viewer來得順手,
變成有一好沒二好的情況,也這樣二者交替使用了一陣子。
一陣過後,意外看到pdf xchange viewer這軟體,
加上有這篇的介紹,心想反正都有wine,就試上一試。
使用時果然令人驚豔,兼具了我想要的瀏覽及註解(編輯)功能,
使用起來相當順手,而且雖然是跑在wine上,卻有意料之外的速度,
在使用順手及速度的兼顧下,叫我不使用也難,
為了讓使用上得以更方便,就包了個簡單的deb (debian/sid)。
按照慣例,需要的人請自取。
使用方式如下:
sudo dpkg -i pdfxv_2.0422-1_i386.deb
理想上,會去抓取官方網站的portable的版本下來。
若不幸地,沒有去抓取,或有什麼問題,可於之後,下如下的命令:
sudo update-pdfxv --install
做下載安裝的動作。(當然,理論上若有更新,也應該會去抓取新版的)
遇到想開啟的pdf,可使用pdfxv的指令:
pdfxv filename.pdf
即可享用pdf xchange viewer帶來的便利。
以下為測試圖:
PDF Annotator
8.11.2009 於 凌晨12:40 張貼者: 一如往昔的孤寂
標籤: Linux, pdf, PDF Annotator, wine 0 意見
Cluttermm progrmming
1.01.2009 於 晚上11:44 張貼者: 一如往昔的孤寂
Clutter這是一個相當不錯的open source project。
在第一次看到是在jserv的blog,之後就相當喜愛。
只可惜一直沒機會把玩一番。
一次的偶然之中,朋友希望能用C++ binding for clutter設計一些東西,
雖然計劃最後告吹(被打),但為了不讓那一陣子的努力化為烏有,
覺得還是可以分享一些東西,也做一個小記錄。
C++ binding clutter就稱為cluttermm。可以在這裡下載得到。
自己懶得包deb了,所以不會tarball安裝的...請參考鳥哥的Linux私房菜吧(煙)
stage算是clutter的最主要的部份之一。
每一個clutter的程式,最少都包含了一個stage。
stage範例如下:
- #include <cluttermm.h>
- int main(int argc, char *argv[])
- {
- Clutter::init(&argc, &argv);
- Clutter::Color color(0x61, 0x64, 0x8c, 0xff);
- Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
- stage->set_size(200, 200);
- stage->set_color(color);
- stage->show();
- Clutter::main();
- return 0;
- }
第9行宣告並建立一個stage的Clutter:Stage的物件後,
就利用set_size, set_color及show等成員函式,設定屬性。
最後由Clutter::main()執行。
有了stage,總得對Clutter的signal做一個介紹
- #include <cluttermm.h>
- #include <iostream>
- bool on_button_press(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Stage>& stage)
- {
- Glib::RefPtr<Clutter::Actor> e = stage->get_actor_at_pos(event->x, event->y);
- std::cout << "*** (x, y) = ( " << event->x << ", " << event->y << ")" << std::endl;
- return true;
- }
- bool on_key_release(Clutter::KeyEvent *event)
- {
- std::cout << "*** key press event (key:" << Clutter::key_event_symbol(event) << ") ***\n";
- if(Clutter::key_event_symbol(event) == CLUTTER_q)
- Clutter::main_quit();
- return false;
- }
- int main(int argc, char *argv[])
- {
- Clutter::init(&argc, &argv);
- Clutter::Color color(0x61, 0x64, 0x8c, 0xff);
- Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
- stage->set_size(200, 200);
- stage->set_color(color);
- stage->signal_button_press_event().connect(sigc::bind(sigc::ptr_fun(on_button_press), stage));
- stage->signal_key_release_event().connect(sigc::ptr_fun(on_key_release));
- stage->show();
- Clutter::main();
- return 0;
- }
主要就是註冊了二個event:button_press及key_release。
- button_press就是在stage中按下滑鼠的左鍵後,會被呼叫的動作
- key_release則是在鍵盤上按下任一按鍵,會被呼叫的動作

在介紹了stage及signal後,當然不能少了actor。
Clutter中,actor有著相當多的分類:
- - ClutterRectangle — An actor that displays a simple rectangle.
- - ClutterTexture — An actor for displaying and manipulating images.
- - ClutterCloneTexture — Actor for cloning existing textures in an efficient way.
- - ClutterLabel — Actor for displaying text
- - ClutterEntry — A single line text entry actor
- - ClutterGroup — Actor class containing multiple children. actors.
- - ClutterStage — Top level visual element to which actors are placed.
- #include <cluttermm.h>
- #include <iostream>
- bool on_button_press(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Label>& label)
- {
- int x;
- int y;
- label->get_position(x, y);
- label->set_position(x+2, y+2);
- return true;
- }
- bool on_button_release(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Label>& label)
- {
- int x;
- int y;
- label->get_position(x, y);
- label->set_position(x-2, y-2);
- return true;
- }
- bool on_key_release(Clutter::KeyEvent *event)
- {
- std::cout << "*** key press event (key:" << Clutter::key_event_symbol(event) << ") ***\n";
- if(Clutter::key_event_symbol(event) == CLUTTER_q)
- Clutter::main_quit();
- return false;
- }
- int main(int argc, char *argv[])
- {
- Clutter::init(&argc, &argv);
- Clutter::Color color(0x61, 0x64, 0x8c, 0xff);
- Clutter::Color actor(0xFF, 0xBB, 0xAA, 0xff);
- Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
- Glib::RefPtr<Clutter::Label> label = Clutter::Label::create("Sans 12", "test", actor);
- stage->set_size(200, 200);
- stage->set_color(color);
- stage->signal_button_press_event().connect(sigc::bind(sigc::ptr_fun(on_button_press), label));
- stage->signal_button_release_event().connect(sigc::bind(sigc::ptr_fun(on_button_release), label));
- stage->signal_key_release_event().connect(sigc::ptr_fun(on_key_release));
- stage->show();
- label->set_size(40, 40);
- label->set_position(20, 20);
- label->show();
- stage->add_actor(label);
- Clutter::main();
- return 0;
- }
等到滑鼠左鍵被放開,就恢復原狀。
當actor產生後,總是要有stage才能有其用處,所以
Clutter利用add_actor()將actor的物件,加入stage之中。
標籤: clutter, Linux, programming 0 意見
GNOME Document Organiser -- referencer
8.10.2008 於 晚上10:35 張貼者: 一如往昔的孤寂
一直以來,對於自己文件的管理感到相當的頭痛。
尤其是paper一多,網路上看到的文件不錯,
抓到同一個資料夾中,分類的問題,就麻煩了。
像paper可能涉及幾個topic,單列入某一個topic都不對,
但用資料夾的管理也似乎只能單放某一個topic (將topic當成目錄名稱)。
一陣子就在想,要能不管文章的存放的目錄,就直接針對檔案進行管理,
加入一個檔案,就順便設定其分類名,這樣同時可以在不同的分類中找尋得到同一份相關文件,
說穿了就是管理文件的關鍵字,用關鍵字做分類。
referencer做到了我想要的...
當然也有找到類似的軟體,
只是就順手來說,還是referencer最好用。
其他也有幾套不錯的,但就是沒有打包,
就算tarball裝好,使用起來穩定度不夠。
所以refernecer算首選吧。
Linux下的capture
於 晚上10:08 張貼者: 一如往昔的孤寂
做投影片或跟別人討論某些軟體使用時,
千言萬語,總是抵不過一張圖,
這時螢幕的擷圖程式就相當重要啦。
在windows下,Print Screen鍵配上小畫家,真的是絕配,
而在Linux下,發現這樣的軟體,似乎不太多。
最一開始都是使用gimp,但將gimp用在這,似乎有點大材小用。
後來找到ksnapshot這套軟體,相當精簡也夠好用。
不過這套是使用qt寫的,個人比較偏好使用Gtk+系列的東西,
心想,以往的經驗,有K開頭了,那應該也有G開頭的相同功能的軟體吧...
open source有趣就在這,這假設還真的成立...= =+
gsnapshot: http://www.softcraft.org/gsnapshot/
這個GOULD的project,看似不錯,不過似乎開發的有點慢,
覺得LXDE還比它好很多,不過就gsnapshot相當不錯,速度也比ksnapshot快多了。
在debian中,並沒有套件,於是自己包了一個:
http://tinyurl.com/6fgpv9
在./configure的過程,有一些xml的header找不到的問題,
檢查一下,發現官方抓下來的套件,Makefile.am沒有寫好,
造成有些header找不到,簡單修改幾個地方,就可以動了,以下為patch:
http://tinyurl.com/5kqmo5
有需要的就不要客氣囉。
tomboy - desktop note taking program using Wiki style links
4.27.2008 於 下午3:03 張貼者: 一如往昔的孤寂

tomboy 一個相當不錯用的簡易筆記軟體,還提供類似wiki的"link"的功能。
只要使用上,指定某些字為"連結"就可以視為連結,開新的頁面了。
最近,發現tomboy提供一個不錯使用的功能:同步。
可同時同步幾台電腦中的tomboy資料,讓資料不會東一台,西一台,到處散落各電腦。對我這種有NB,有桌機,同時使用的人而言,真的是相當方便。為了同步,參考了一些文章,透過ssh的服務,來達到同步:
- http://davyd.livejournal.com/230629.html
- http://www.ubuntu.org.tw/modules/planet/view.article.php?598/b
會無法完整同步。
而在terminal下顥示的訊息如下:
[DEBUG]: Exception while creating SyncServer: 連線至指定的伺服器時發生錯誤:網路上似乎也說這問題在ubuntu上好像解決了。但debian上呢?胡亂試了一下,
fuse: mountpoint is not empty
fuse: if you are sure this is safe, use the 'nonempty' mount option
結果似乎只要如此就可以了:
#fusermount -u .tomboy/sync-sshfs/將已透過fuse mount起來的遠端資料夾umount後,就可以重新同步。
Xephyr - nested X server
4.19.2008 於 晚上9:50 張貼者: 一如往昔的孤寂
最近為了把玩一個程式hildon,發現一個相當有趣的程式。過去為了測試wm (window manager)之類的程式,都一定要利用一些技巧,如 start --:1 或者使用xnest來測試及開啟第二個wm/x-server。
在參考了一下Xephyr的介紹,真覺得相當的不錯。它支援許多較新的X extensions 像是 Composite, Damage, randr...等,而且就算你現在執行的X不支援這些功能,它也似乎能運作無誤。在介紹中是說使用了 SHM Images 及shadow framebuffer的更新機制,達到最好的效率。主要的使用上是提及以下幾點:
Xephyr在使用上相當簡單,若使用Debian則可以直接安裝:
Xnest replacement - Window manager, Composite 'gadget', etc development tool.
Toolkit debugging - rendundant toolkit paints can be observered easily via the debugging mode.
X Server internals development - develop without the need for an extra machine / display.
Multiterminal with Xephyr - configuration is a single computer which supports multiple users at the same time
# apt-get install xserver-xephyr接下來,就是輸入一些參數開啟xephyr:
# Xephyr :1 -host-cursor -screen 800x480x16 -dpi 96 -ac最後只要將DISPLAY導向它,就可以開啟程式了。
# export DISPLAY=:1
# startxfce4
如此,就可以開啟第二個xserver,並執行xfce4了。