PDF Annotator - PDF-XChange Viewer 2.054

自從上篇 PDF Annotator後,網址又一直是荒廢的情況~~XD

然後,PDF XChange Viewer 又出了新版了,
之前在更新時,都沒發現自己之前寫的script有點錯,
會將更新的軟體抓下來,但解壓錯地方,
所以一直還是用到舊版的。
再來,不論每次我怎麼調軟體中工具列的按鈕,
總永遠是預設值,趁今天一併處理好。

一樣,deb在此:http://tinyurl.com/25od79t

請有在使用的人,自行服用。

使用方式同上篇。

* 後記: 有幸使用64位元電腦,原來的package限定平台為i386,將其改成all,符合所有平台。
deb在此:http://tinyurl.com/2bb5uzw

PDF Annotator

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帶來的便利。

以下為測試圖:

Cluttermm progrmming

Clutter這是一個相當不錯的open source project。
在第一次看到是在jserv的blog,之後就相當喜愛。
只可惜一直沒機會把玩一番。

一次的偶然之中,朋友希望能用C++ binding for clutter設計一些東西,
雖然計劃最後告吹(被打),但為了不讓那一陣子的努力化為烏有,
覺得還是可以分享一些東西,也做一個小記錄。

C++ binding clutter就稱為cluttermm。可以在這裡下載得到。
自己懶得包deb了,所以不會tarball安裝的...請參考鳥哥的Linux私房菜吧(煙)

stage算是clutter的最主要的部份之一。
每一個clutter的程式,最少都包含了一個stage。

stage範例如下:

  1. #include <cluttermm.h>

  2. int main(int argc, char *argv[])
  3. {
  4. Clutter::init(&argc, &argv);

  5. Clutter::Color color(0x61, 0x64, 0x8c, 0xff);

  6. Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
  7. stage->set_size(200, 200);
  8. stage->set_color(color);
  9. stage->show();

  10. Clutter::main();

  11. return 0;
  12. }
這範例算得上是hello world級的程式囉。
第9行宣告並建立一個stage的Clutter:Stage的物件後,
就利用set_size, set_color及show等成員函式,設定屬性。
最後由Clutter::main()執行。

有了stage,總得對Clutter的signal做一個介紹

  1. #include <cluttermm.h>
  2. #include <iostream>

  3. bool on_button_press(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Stage>& stage)
  4. {
  5. Glib::RefPtr<Clutter::Actor> e = stage->get_actor_at_pos(event->x, event->y);

  6. std::cout << "*** (x, y) = ( " << event->x << ", " << event->y << ")" << std::endl;

  7. return true;

  8. }

  9. bool on_key_release(Clutter::KeyEvent *event)
  10. {
  11. std::cout << "*** key press event (key:" << Clutter::key_event_symbol(event) << ") ***\n";

  12. if(Clutter::key_event_symbol(event) == CLUTTER_q)
  13. Clutter::main_quit();

  14. return false;

  15. }

  16. int main(int argc, char *argv[])
  17. {
  18. Clutter::init(&argc, &argv);

  19. Clutter::Color color(0x61, 0x64, 0x8c, 0xff);

  20. Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
  21. stage->set_size(200, 200);
  22. stage->set_color(color);
  23. stage->signal_button_press_event().connect(sigc::bind(sigc::ptr_fun(on_button_press), stage));
  24. stage->signal_key_release_event().connect(sigc::ptr_fun(on_key_release));
  25. stage->show();

  26. Clutter::main();

  27. return 0;
  28. }

signal這範例,是由stage範例延伸而來的。(紅色為新增之部份)
主要就是註冊了二個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.
僅以label做為範例介紹(被拖走):

  1. #include <cluttermm.h>
  2. #include <iostream>

  3. bool on_button_press(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Label>& label)
  4. {
  5. int x;
  6. int y;
  7. label->get_position(x, y);
  8. label->set_position(x+2, y+2);

  9. return true;
  10. }

  11. bool on_button_release(Clutter::ButtonEvent *event, const Glib::RefPtr<Clutter::Label>& label)
  12. {
  13. int x;
  14. int y;
  15. label->get_position(x, y);
  16. label->set_position(x-2, y-2);

  17. return true;
  18. }

  19. bool on_key_release(Clutter::KeyEvent *event)
  20. {
  21. std::cout << "*** key press event (key:" << Clutter::key_event_symbol(event) << ") ***\n";

  22. if(Clutter::key_event_symbol(event) == CLUTTER_q)
  23. Clutter::main_quit();

  24. return false;

  25. }

  26. int main(int argc, char *argv[])
  27. {
  28. Clutter::init(&argc, &argv);

  29. Clutter::Color color(0x61, 0x64, 0x8c, 0xff);
  30. Clutter::Color actor(0xFF, 0xBB, 0xAA, 0xff);

  31. Glib::RefPtr<Clutter::Stage> stage = Clutter::Stage::get_default();
  32. Glib::RefPtr<Clutter::Label> label = Clutter::Label::create("Sans 12", "test", actor);
  33. stage->set_size(200, 200);
  34. stage->set_color(color);
  35. stage->signal_button_press_event().connect(sigc::bind(sigc::ptr_fun(on_button_press), label));
  36. stage->signal_button_release_event().connect(sigc::bind(sigc::ptr_fun(on_button_release), label));
  37. stage->signal_key_release_event().connect(sigc::ptr_fun(on_key_release));
  38. stage->show();

  39. label->set_size(40, 40);
  40. label->set_position(20, 20);
  41. label->show();

  42. stage->add_actor(label);

  43. Clutter::main();

  44. return 0;
  45. }
這個範例效果相當地簡單,在stage中按下了滑鼠左鍵後,會將字型做一平移,
等到滑鼠左鍵被放開,就恢復原狀。

當actor產生後,總是要有stage才能有其用處,所以
Clutter利用add_actor()將actor的物件,加入stage之中。


來杯卡布!?

多久沒有悠閒的喝一杯了?

唔...認識我的人,一定直覺這一杯,充滿了酒精。

只是,今天無關酒精。 來一杯卡布吧!?

每次咖啡聚會後,總會有一段時間是非常的熱血的,

烘豆、沖煮、品味,都會覺得自己似乎有著什麼的不同。

但時間一長,這股熱血就像到達了充滿冰原的北極地區,急速冷卻。

而咖啡聚會就像是充滿二氣化碳的溫室,充滿著足以融化冰原的能量,

每次參加聚會的我,就會被這股能量包圍,進而加溫了自己的熱情,

不時也在回想,為什麼聚會有著這樣的能量?

仔細思考,這種感覺,

我想就跟某些人時間一到了,就要出個遠門去充電是相同的道理吧。

也許悠閒,是其中之一的關鍵!?不是嗎?

今天趁著颱風假,好好享受一下悠閒的當宅男的感覺 囧rz...

也開個機,心想要好好的為那天在房間的失敗之作,討回一個公道。

俗話說:沒有加而有力的手臂,不要強出頭。

而這句話在現在看來,祖先是對的 T.T

嘿!回神過來,暫時拋開"失敗"這二個字,

在悠閒的加持之下,這杯咖啡,不也頗令人動心?來一杯吧!


望著杯底的奶泡,君子報仇三年不晚,

雖說咖啡的失敗與否不是多了不起的一回事,

只是好歹也要為這場咖啡與牛奶競賽中,

所犧牲的國產牛奶,得到相同等值的代價。

陳奕迅 -- 愛情轉移

愛情轉移 曲: Christopher Chak | 詞: 林夕

徘徊過多少櫥窗 住過多少旅館 才會覺得分離也并不冤枉
感情是用來瀏覽 還是用來珍藏 好讓日子天天都過得難忘

熬過了多久患難 濕了多長眼眶 才能知道傷感是愛的遺産
流浪幾張雙人床 換過幾次信仰 才讓戒指義無反顧的交換

*把一個人的溫暖 轉移到另一個的胸膛 讓上次犯的錯反省出夢想
 每個人都是這樣 享受過提心吊膽 才拒絕做愛情待罪的羔羊
 回憶是抓不到的月光握緊就變黑暗 等虛假的背影消失於晴朗
 陽光在身上流轉 等所有業障被原諒 愛情不停站 
想開往地老天荒 需要多勇敢

燭光照亮了晚餐 照不出個答案 戀愛不是溫馨的請客吃飯
床單上鋪滿花瓣 擁抱讓它成長 太擁擠就開到了別的土壤

感情需要人接班 接近換來期望 期望帶來失望的惡性循環
短暫的總是浪漫 漫長總會不滿 燒完美好青春換一個老伴

你不要失望 蕩氣迴腸是爲了 最美的平凡


GNOME Document Organiser -- referencer

一直以來,對於自己文件的管理感到相當的頭痛。

尤其是paper一多,網路上看到的文件不錯,

抓到同一個資料夾中,分類的問題,就麻煩了。

像paper可能涉及幾個topic,單列入某一個topic都不對,

但用資料夾的管理也似乎只能單放某一個topic (將topic當成目錄名稱)。

一陣子就在想,要能不管文章的存放的目錄,就直接針對檔案進行管理,

加入一個檔案,就順便設定其分類名,這樣同時可以在不同的分類中找尋得到同一份相關文件,

說穿了就是管理文件的關鍵字,用關鍵字做分類。



referencer做到了我想要的...

當然也有找到類似的軟體,

只是就順手來說,還是referencer最好用。

其他也有幾套不錯的,但就是沒有打包,

就算tarball裝好,使用起來穩定度不夠。

所以refernecer算首選吧。

Linux下的capture

做投影片或跟別人討論某些軟體使用時,

千言萬語,總是抵不過一張圖,

這時螢幕的擷圖程式就相當重要啦。

在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

有需要的就不要客氣囉。