顯示具有 Linux 標籤的文章。 顯示所有文章
顯示具有 Linux 標籤的文章。 顯示所有文章

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之中。


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

有需要的就不要客氣囉。



tomboy - desktop note taking program using Wiki style links


tomboy 一個相當不錯用的簡易筆記軟體,還提供類似wiki的"link"的功能。
只要使用上,指定某些字為"連結"就可以視為連結,開新的頁面了。

最近,發現tomboy提供一個不錯使用的功能:同步。
可同時同步幾台電腦中的tomboy資料,讓資料不會東一台,西一台,到處散落各電腦。對我這種有NB,有桌機,同時使用的人而言,真的是相當方便。為了同步,參考了一些文章,透過ssh的服務,來達到同步:

在debian上的安裝,跟ubuntu上都大同小異,唯獨同步上似乎有些奇怪的問題,
會無法完整同步。

而在terminal下顥示的訊息如下:
[DEBUG]: Exception while creating SyncServer: 連線至指定的伺服器時發生錯誤:

fuse: mountpoint is not empty
fuse: if you are sure this is safe, use the 'nonempty' mount option
網路上似乎也說這問題在ubuntu上好像解決了。但debian上呢?胡亂試了一下,
結果似乎只要如此就可以了:
#fusermount -u .tomboy/sync-sshfs/
將已透過fuse mount起來的遠端資料夾umount後,就可以重新同步。

Xephyr - nested X server

最近為了把玩一個程式hildon,發現一個相當有趣的程式。過去為了測試wm (window manager)之類的程式,都一定要利用一些技巧,如 start --:1 或者使用xnest來測試及開啟第二個wm/x-server。

在參考了一下Xephyr的介紹,真覺得相當的不錯。它支援許多較新的X extensions 像是 Composite, Damage, randr...等,而且就算你現在執行的X不支援這些功能,它也似乎能運作無誤。在介紹中是說使用了 SHM Images 及shadow framebuffer的更新機制,達到最好的效率。主要的使用上是提及以下幾點:

  • 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

Xephyr在使用上相當簡單,若使用Debian則可以直接安裝:
# apt-get install xserver-xephyr
接下來,就是輸入一些參數開啟xephyr:
# Xephyr :1 -host-cursor -screen 800x480x16 -dpi 96 -ac
最後只要將DISPLAY導向它,就可以開啟程式了。
# export DISPLAY=:1
# startxfce4
如此,就可以開啟第二個xserver,並執行xfce4了。