2004-02-20 (Fri)
_ Konqueror Embedded
起動中のKonqueror Embeddedに指定したURLを開かせる必要があったのだ が、どうもローカルのファイルを開かせることしかできないようだ。
たとえば、
$ qcop QPE/Application/konqueror 'setDocument(QString)' \ '/home/zaurus/foo.html'
などとすると、そのファイルが存在すれば、ファイル名に'file:'を付加し たURLを開くようになっている。 (ファイルが存在しないと、'file:'というURLを開こうとしてエラーになる。)
しかも毎回新しいビューを作成するので、上記のコマンドを実行するた びにどんどんビューが増えて行ってしまう。
結局、ソースに手を入れることにしたのだが、クロスコンパイル自体が はじめてなので、ただビルドするだけに丸二日もかかってしまった。
ハマったのは以下の三点。
なぜかconfigure時にlibqtのリンクのテストに失敗する。
リンク時に-lqpeが指定されないせいのようだ。 configureの
LIBS="$LIBS $LIBQT $KDE_MT_LIBS"
という部分を、
LIBS="$LIBS $LIBQT $LIB_QPE $KDE_MT_LIBS"
のように変更したらパスした。
make時にlibjpeg.soのリンクに失敗する。 どうも、libtoolが/usr/lib/libjpeg.so(こいつは当然x86用のバイ ナリ)をリンクしようとしてしまうようだ。
面倒なので、
# ln -s /opt/Qtopia/sharp/lib/libjpeg.so.62 /usr/lib/libjpeg.so
としてしまった。
実行ファイルを生成する時点で、なぜかundefined symbolの嵐。 どうも一部のオブジェクトファイルがうまくリンクされないらしい。
automake-1.4を使っていたのだが、automake-1.7にしたら解決した。 たまたまかもしれない。
これでビルドはできたのだが、どうも動作がおかしい(スタイラス操作 に反応しなくなったりする)。 zaurus-jaのバイナリはうまく動作するので、同じ日付のものをcvsから 取って来た(-D '2002-12-15'付きでupdate)らうまく動作した。
で、結局起動中のKonquerorに指定したURLを開かせるには、
diff -u -r1.22 mainwindow_qpe.cc --- konq-embed/src/mainwindow_qpe.cc 24 Jul 2001 16:46:41 -0000 1.22 +++ konq-embed/src/mainwindow_qpe.cc 20 Feb 2004 15:46:15 -0000 @@ -110,8 +110,7 @@ void MainWindowQPE::setDocument( const QString &document ) { - DocLnk lnk( document ); - createNewView( lnk.file().prepend( "file:" ) ); + urlEntered( document ); } #include "mainwindow_qpe.moc"
のような変更でよいようだ。
$ qcop QPE/Application/konqueror 'setDocument(QString)' \ 'http://shugo.net/'
で、それまでさんざん苦労したわりに、あっさり動いた。
2012-02-20 (Mon)
_ Unity 2Dの設定
Ubuntu 11.10ではUnityがデフォルトになっているが、なかなか上手く動かないのでUnity 2Dを使っている(別にGNOMEでもよかったんだけど何となく)。
デフォルトではランチャーが常に表示されるが、VirtualBoxをシームレスモードで使うとうっとうしい。 UnityではCompizConfig設定マネージャで設定できるが、Unity 2Dだとdconfで設定しないといけないようだ。
$ sudo apt-get install dconf-tools $ dconf write /com/canonical/unity-2d/launcher/use-strut false $ dconf write /com/canonical/unity-2d/launcher/hide-mode 1
hide-modeは0だとランチャーが常に表示され(use-strutはtrueにする)、2だとランチャーにウィンドウがかかった時だけ隠れるようになる。
参考: <URL:http://askubuntu.com/questions/32667/how-do-i-configure-unity-2d>
2014-02-20 (Thu)
_ A memory of Jim Weirich
Today, I heard that Jim Weirich had passed away, but I can't believe it yet.
I met him at the first time at RubyConf 2005. It was also the first time I have attended RubyConf. He did a workshop titled "Continuations Demystified" with Chad Fowler there. In the workshop he explained continuations by comparing them to The Legend of Zelda, which is a Nintendo 64 video game. I had such a fun time.
You can download presentation materials from the following site:
<URL:http://www.zenspider.com/Languages/Ruby/RubyConf2005.html>
It's too late, but I've solved an exercise from the workshop, which exercise I didn't solve at that time.
The exercise is to implement throw/catch using continuations.
EXAMPLE:
result = cc_catch(:tag) { do_something() cc_throw(:tag, 1) fail "You never get here" } assert_equal 1, result
My answer is:
require "continuation" def cc_tag_stack Thread.current[:cc_tag_stack] ||= [] end def cc_catch(tag) callcc { |c| cc_tag_stack.push([tag, c]) begin yield ensure cc_tag_stack.pop end } end def cc_throw(tag, obj = nil) stack = cc_tag_stack.dup while x = stack.pop t, c = x if t == tag # The ensure clause in cc_catch is not called when c.call(obj) is # called, so cc_tag_stack should be rewound here. Thread.current[:cc_tag_stack] = stack c.call(obj) end end raise NameError, "uncaught throw #{tag}" end
I don't like this code very much because cc_throw is ugly. Jim's code is simpler:
$continuations = {} def cc_catch(sym) callcc { |cc| $continuations[sym] ||= [] $continuations[sym] << cc yield } ensure $continuations[sym].pop end def cc_throw(sym, value=nil) cc = $continuations[sym] fail NameError, "uncaught throw `#{sym}'" if cc.nil? || cc.empty? cc.last.call(value) end
I thank Jim for all his efforts for Ruby and the community. May his spirit rest in peace.