トップ 最新 追記

AOISAKURA 日記

2003|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|04|05|06|07|08|09|12|
2013|02|03|05|06|08|09|10|11|
2015|11|
2016|12|
2017|03|08|
2018|01|03|06|
2019|05|07|09|10|
2020|01|02|03|
2021|03|07|
2022|06|
2023|11|
2024|07|

pixiv / twitter / github

bluesky / misskey / pawoo

※発信する情報は、個人の見解・意見であり、所属する会社の見解・意見ではありません。


2006-03-01 頑張ろう! [長年日記]

_ [work] テストフェイズでのモチベーションの下がりっぷり

自分の作った箇所のテストケース作成、実施はまだ良いんだけど、他の人の作った機能のテスト、しかも機能追加後のほとんどのテストをもう一回流すテストでえんえんと大量のエビデンス(テスト成功の証拠となるスクリーンショットやDBダンプ)をとりつづけるテストはほんと苦痛でしかない。おかげでモチベーション上がらず無駄に時間を過ごしてしまい非効率この上ないことになってしまった。

テストはもちろん重要なんだけども、再テストの単調作業のダルさはどうにかならんのか。

まぁこうやって再テストをただの単調作業としか認識していない時点でどれくらい重要だと思っているか甚だ疑問ではあるわけで、どうせだからテストについてちょっと勉強してみよう、と思った。

また直近で勉強すること増やすのかよって感じだけど、少しずつでもテストのやり方とかについて勉強しないとヤバい。新人研修の演習で一番テストに工数かけなかったの自分だしね。

_ [life][work] 目的に目を背け、手段に溺れる

テストでモチベーション上がらないのも問題だけど、ここんとことの仕事中の問題は(前からもそうだけど)、目的をはき違えて、または目的に目を背けて、手段に拘っていること。「他の人が忙しいから自分でなんとかしないと」と思い込んで人に聞くことを回避しようとしたり、「こんな仕様わかんねーよ」って仕様をほじくり返して愚痴る材料を見つけようとしたり。そんなことに時間を使ってしまう。

目的からやるべき事を考えればもうちょっとまともな手段をしなおせるはずなのに、それさえしないのは、「それに気づいておきながら目を背けている」んだと思う。

自分のやるべき事を正しく認識するんだ。絵でもいっしょやね。


2006-03-02 なんとか電気を消して寝れた [長年日記]

_ [gtk] GTK環境でのEmacsキーバインド

gnome2.8以降、キーボードショートカットから直接Emacsスタイルのキーバインドを指定しなくなって、次の二通りの方法でEmacs風にできる。まぁwebにゴロゴロ転がってるネタ。

一つ目は、~/.gtkrc-2.0に「gtk-key-theme-name = "Emacs"」を書くこと。二つ目は、gconf-editorで「desktop → gnome → interface」で、該当変数の設定ができる。

どうもこの設定はうまく行っているっぽい、gimageviewやgnome-terminal、firefoxではemacsのキーバインドとなっている。しかし、geditやanjuta、nautilusでは相変わらずUNIXキーバインドだ。

今まで、geditやanjutaで設定したはずのキーバインドにならないのは設定がまずいからだと思っていたけど、そうじゃなくて、geditやanjuta側でキーバインドの設定を勝手にしてるんじゃなかろうかと思えてきた。と思っていたら、Sylpheedでメニューの雛形のせいでGTKの設定が無効になっていたという話があったので、調べてみる価値はありそうな予感がしてきた。


2006-03-03 さて新展開 [長年日記]

_ [comic][book] この前買った本 - アニメがお仕事 4巻

今週は帰りが常に遅くて全然本屋に行けてない。しかも行けてもなぜか目当ての本が売ってないというイヤンな展開。週末におっきぃ本屋行くからいいけども、っていうか引越しあるんだから控えないと。

そんなこんなでアニメがお仕事4巻、今まで二太が堕ちまくってたけどこの巻で完全復活、一度逃げ出したからもう一度戻ってこれたときわかることがある。そんな二太の生き生きとした話だった。

_ [work] 現プロジェクトから離脱

11月の終わりに1週間だったか10日だったかの期間限定で入ったプロジェクト、気がつけば3月に入っちゃったよ。最後の最後、直した障害のテスト確認を待たずに挨拶しようとしてツッコまれる(ぇ。まぁ問題なく終われた。御世話になりましたー。

というわけで、来週の月曜から門前仲町へ2週間ほどいってきます。今度は期間きっちりで帰ってこれたらいいなぁ。

なんで現プロジェクトから離れるとき皆、「最低半年だね」とか「1ヶ月が2年になった人聞いたことあるよ」とか言うんですかー(泣


2006-03-04 引越し準備...のはずだよねぇ [長年日記]

_ [comic][book] 買った漫画と本

E'sはいつになったら話が進むのかと思っていたけど、やっと展開の進みがはっきりわかるようになってきた。後書きで今まで丸ペン一本で漫画を描いてきたという話があって、この巻からGペンも使うようにしたとのこと。

デジコミの本は2002年に出版された本。すこし古いおかげでフォトレタッチソフトであるPhotoShopを使った漫画の効果処理の仕方が細かく描かれている。ソフトの使いかたというよりも、その効果の意味や、デジタルでやる利点の解説に重点をおいて書かれている。最近出版されている本ってたいがい漫画作成用ソフトのマニュアルか、どういうフィルタを使えばいいのかだけしか書かれていないとかばっかりで他のソフトでの流用のしようがなかったので、こういう本が欲しかった。

あ、あと、30日でできる! OS自作入門も買ってくるつもりだったけど、予想したよりでかくて邪魔になりそうだったので、引っ越してから買うことに。

_ [anime][game] 買ったCD - sakura, YURIA, ホームメイドサントラ

sakuraはエウレカセブンの新OP、前期のがいろんな意味でしょんぼりだったけど、今回のOPの曲はかなり好き、アニメーションはちょっと動きがわざとらしくてしっくりこないけど。

YURIAはYURIAさんのアルバム、SHUFFLE!のOPが気に入って、買おうと思いつつ買い忘れ、気がついたらアルバムに入ってるよってことでこっちを購入。

ホームメイドのサントラは橋本みゆきさんのCheer Up!が欲しかったから購入。

_ [computer][network] 買ったルーター - Corega CG-BARFX2

引越先で使うように購入。今までLINKSYSのを使っていたのでそれ以外であれば特にこだわりは無かった。とはいえ、amazonの評判悪いなぁ。まぁ使ってみないとなんともいえんけど。

LINKSYSの以外としたのは、別にLINKSYSのルータが悪いんじゃなくて、っていうか何の問題も無く動いているんだけど、できれば色々触ってみたかったので、違う会社のを選択したかっただけ。


2006-03-05 引越し準備〜 [長年日記]

_ [server][life] 3/9〜3/21(予)までサーバが止まります

3/10に引越しをするので、3/9の午後からサーバが止まります。そのため、この日記も見えなくなります。復帰予定は3/21です。

ネット自体には3/11から繋がるんですが、契約したSo-netは、接続開始から10日経たないと固定IPサービスの申請ができないということだったので、早くても3/21からとなります、ぐんにょり。まぁ、こういうイレギュラーもしょうがない、プロバイダを変えてみたかったのは自分だし。

その間に最低でもOSを更新したいなぁ。

サーバ停止中はmixiの方でこっちと似たような更新をしていきます。

_ [book][computer] 欲しい本 - 30日でできる! OS自作入門

書泉で見つけたけど放置したOS自作入門、編集の人がCPUの創りかたやフリーウェア作家になろう!とかをやってた人だったのか。そういや全部MYCOMが出版してる本だなあ...。どれも読みやすい本なので、そういうところに編集さんの力が出てるのかしら.

_ [life] メディアの梱包終わり

日曜丸一日かけて本、DVD、ゲーム、紙資料等の梱包が終わった。面倒なんで全部まとめてメディアと呼称します。メディアが一番大きい荷物なので、これでとりあえず折り返しは過ぎた感じ。でも引越し屋にもらった小さい段ボール20個全部使ってさらにもう一個同じサイズの段ボールを使ったので合計21個。

後は食器とPC周りのケーブルが片付けばほぼ終わるね、PC以外を8日忠にまとめたい。


2006-03-06 今日から別の仕事先 [長年日記]

_ [work] ヘルプで別のとこへ

2週間の予定で某所へヘルプにいっています。んが、外部へのネット接続が禁止というすさまじくありえない環境。まじきっついー(泣

スケジュールもタイトなんで、引っ越しに響かないか若干心配。

ともあれ、今日は短い期間しかいないのに歓迎会をして頂いた。平日なのに普段より飲み過ぎたので気持ち悪い、頭痛い。

そしてお休みなさい。今日ネット巡回全くできてねぇー


2006-03-13 ふっかーつ [長年日記]

_ [server][life] しれっと固定IP取得&復活

開通後10日しないと申請できないはずのSo-netの固定IPがなぜかすぐに申請できてしまったので、復活。ほんとはメールをさっさと処理しないとなーっていう気持ちが一番大きかったわけですが。

引越しの話はまたおいおい書きます。今は、もぅ寝ます。とりあえず報告。


2006-03-14 22時前帰宅 [長年日記]

_ [python] unicodeとUTF-8、turbogearsのユーザ認証

_ [book] 最近買った本

30日〜は本がでかいので、何時どうやって読んだモノやら...っていうレベルです、まだ。

ウェブ進化論は、googleを褒めすぎてるのが鼻にかかるのか、どうもおもしろく読めない。去年読んだPaul Grahamのハッカーと画家でのベンチャーの話を言っていることはあまり変わらない気がするのに、なんでこんなに賛同できないんだろう。うーん、立ち位置が違うとかそういう話なのかなぁ、それとも自分も古い方の人間だってことかしら。

実になる話はいくつもあるけど、これからこういう時代だーとか到底思えない。いや違う、思いたくないのかもしれない。


2006-03-15 掃除片付け荷ほどき通販 [長年日記]

_ [life] 昼間はネットに繋げないわけで

二週間の我慢ということで、昼間ネットができない環境で頑張って仕事しています。仕事は先方で色々用意していただいているので問題はないんですが、昼間ネット巡回ができないんで日々のニュースや記事が全く読めていません。まぁ引越しの作業がまだ続いているせいもありますが。

今まで、昼間注目した記事を消化できないんで悩んでいたのに、今度はそもそも見つけにいけなくて悩んでいます。このまま当分ここで仕事というのならAirH゛も契約するんですが、そういうわけでも無いんでそのまんま。

よそ事ばっかりしてて仕事に集中できないのは問題ですが、全く他のことができないのは辛い。要はバランスか、復帰したらメリハリつけて仕事していきたいなぁ。


2006-03-16 頑張ろう [長年日記]

_ [work] 研修で学んだことを生かせていない

もうすぐ会社に新入社員が入ってくる季節なわけですが、まだ新人臭いミスやらがあってしょんぼりしてしまう。今日も報連相を怠ってかなり感じのわるいことをしてしまった。おまえは研修で何をやっていたのかと小(ry。

まぁ今行ってるヘルプも明日で終わりなので、明日は今日みたいな自己嫌悪にならないようにまずなんとかしよう。頑張ろう。

_ [interface] OSNews - The Direction for Desktop and Access the Linux Kernel


2006-03-18 チャリをこきこき [長年日記]

_ [comic] 柏で買ったマンガ

自転車で柏まで行ってみた、途中道間違ったので1時間ぐらいかかった。本屋も小さくてしょんぼり。

V・B・ローズは相変わらず美しい世界タレ流し。紫サンとあげはのらぶらぶーも垂れ流されるのかと思いきや気持ちの接点がフラフラ、決定的な部分以外がどんどん埋められていっているにもかかわらず、すごいバランスだ。

ミニマム☆マニア、タイトルだけで買ったわけではないけども。小学館の少女漫画って総じてオタ臭い絵柄ばっかりな気がするんですがどうよ。話は良いとは言わないが、悪い訳でもなくちゃんと読めるレベルなのに、細かい描写が適当で展開の雑さが目立って、悪い意味で低学年向けだからこれくらいいいだろーっていうとこがちゃおとなかよし系の漫画には多くて残念でならない。それでも買うのは結局、絵柄とシチュエーションが好みだからなわけだけど。

_ [life] 研究室の同窓会

大学院時代に御世話になった研究室の同窓会。M1が全滅なのは就活だしまぁしょうがないけど、会いたい人が来られなかったのは残念でならない。

同期とは就職してからの話や研究室での思いで話に花がさく。nozomさんとは研究室に居たときとなんら変わらない会話に、とはいえやっぱりblogで既に書いたネタをなぞってる話をしてしまってちょっとしょんぼり。でもとっても楽しかった。

で、帰りは皆つくばエクスプレスで帰るわけですが、その中でずっと先輩の研究室OBの人となぜかオタネタや同人誌の話で話が盛り上がる(ぇ。オタをカミングアウトすることをデフォルトにしててよかった。頑張る。


2006-03-19 ダルダル [長年日記]

_ [life] まだ引越し後の片付けは続く

昨日同窓会で飲んだんで昨日はさっさと寝、8時に起きるも二度寝、しかも変な夢を見て寝た気がしない。昼すぎに部屋の管理会社の人がくる予定だったので片付けの続き。

二階の洋間がサーバと本棚を置く場所にしたけども、全然片付いていない。とりあえず棚を組み上げて(そっからかよ)。PCを置いて、スペース確保。明後日か来週ぐらいにサーバをこっちに置く予定。

2時過ぎに管理会社の人がくる。これは先週、部屋の不具合について連絡したのでその確認だった。補修できるところはしてもらったけど、台所周りはどうにもならんかったので、また来週大工を呼ぶとのこと。

っていうか水周りが結構適当だったことに驚いた。これじゃ下水の臭気もれるぜ。まぁなんとかするか。引っ越してから、ホームセンターとドラッグストアを行ったり来たりしながら掃除したり、モノ入れ換えたり、殺虫(鼠)剤やら置いたりと行ったことばっかりやってます。来週末には机が来るんでそれでもぅ引越し作業は完結するはず。

あぁカーテンかって無いとこどうしようかなぁ、角部屋なんで窓が6箇所あるんで全部にカーテン付けるのは金かかっていやん、困りはしないからとりあえず半分は雨戸しめたまま。

_ [network] 無線LAN導入

先週の話だけども、Gigabitのスイッチを買うついでに無線LANの環境を作るためにアクセスポイントと無線LANカードを購入。これで1階のルータから2階の和室にケーブルを這わせる必要がなくなって気持ち良い。最初、WEPとかWPAがよくわからなくて繋がったり繋がらなかったりを繰り返していたが、なんとか繋がるようになった。PSPもネットワークに参加できるようになったので、色々遊んでみたいところ。

買ったのは俺コンハウス、最初愛三電機でアライドテレシスのGigabitハブと一緒に買おうと思っていたけど、愛三が日曜やってなかったので、俺コンへ。しかし店員のにーちゃんのアドバイスが微妙で、最後適当に話を流してレジへ。とはいえこっちの説明も悪かった。いかんいかん。


2006-03-20 片付け片付け [長年日記]

_ [life] 荷ほどきは終わったんですがっ!

収納が無くて散らかりまくりなんですよっ!

昨日はとりあえず本棚を設置して、突っ込める限り本を入れ、突っ込みきれなかった分を本棚の前に積んでいき、なんとか小さい段ボールの処理は終了。しかし本棚何買おうかなぁ...。

とはいえ、本やごちゃごちゃしたものを全部二階の洋間に押し込んだんで、それ以外の部屋はすっきり。気持ち良いのぅ。


2006-03-21 整理整理 [長年日記]

_ [python][unix] OSNews - Reports from PyCON 2006, Build UNIX software with Eclipse and 10 Things I Hate About U(NIX) Revisited

_ [anime][life] やっとテレビを繋げた

繋げた理由は、千葉テレビでやってるおジャ魔女どれみナイショを録るためーっ!!(マジ

この辺り、レンタルビデオが無いんでかなりぐんにょりしていたんですが、やっぱり千葉テレビはクオリティ高いぜ。

それはそれとして、とりあえずテレビを繋げたからWBCを初めて見る(ぇ。

_ [anime] 劇場版 機動戦士ZガンダムIII

言われてた通り、結末は変えられていてよかったよかった。話の展開は相変わらず早かったけども、なんとか観てて追い付けた。映像的にもジオの隠し腕のアニメーションがえらい格好良かったり、最後のZの変形がものごっつ細かかったりでお腹一杯。このIIIを観てDVDで欲しいかもと思った。


2006-03-22 元の仕事先へ [長年日記]

_ [interface][windows] 運に左右されるUIと An Inside Look at Windows Vista

_ [life] 新しい仕事

元の仕事先に戻って新しい仕事へ。予定どおり、やな予感どおり、かなりシステム環境が危険だぜ。

まぁこれもお勉強ですよ。さぁ頑張るぜー。


2006-03-25 色々届く日 [長年日記]

_ [life] 未だ自炊ができず

台所のコンロ台の台を補強している角材がはがれ落ちてて、それを今日大工さんに見てもらったら、取り替えないといけなさそうだから、大家さんと話しをするとのこと。

ステンレスをはってあるから台が抜けることは無いだろうとは言われたけど、不安なんで未だにコンロが使えません。自炊できねーし。


2006-03-27 やっとゆっくり [長年日記]

_ [gimp][translation] how to write a GIMP plug-in 勝手和訳 3P目

前回の2P目の和訳からえらい間が空きましたが、How to write a GIMP plug-in 3Pの和訳です。訳出の意図、注意は1P目同様です。

コードについてはプロトタイプ宣言だけは載せていますので、コード全体は原文を適宜参照してください。

この和訳文書はcreative commons : 帰属 - 非営利 - 同一条件許諾 2.5でライセンスされてます。

_ GIMPプラグインの書き方 How to write a GIMP plug-in 3P目

原著者: Dave Neary(bolsh@NOSPAM.gimp.org)

第二章で、私はピクセル単位か行単位での画像データ(image data)の操作を説明した。今回は、さらに進めて、今までに作ったプラグインの性能を改善させられるタイル単位でのデータ処理を行う。また、より大きな半径を配慮したアルゴリズムへの改良を行い、パラメータを変更させることができるようなグラフィカルインターフェイスの構築も行う。

_ はじめに

前に作った単純なアルゴリズムを確認してみよう。このアルゴリズムは、ピクセル単位で、各レイヤーに(2r+1)x(2r+1) - x,yの形式、rは半径 - の近傍を設定し、その近傍の平均でレイヤーの各ピクセルを置き換えるモノであった。

例の画像で画像の境界で注意を払わなければいけないのはいささか複雑ではある。しかしこのアルゴリズムによるブラー処理は一般的にそれほど悪くはない。

とはいえ、今まで書いてきたアルゴリズムは3x3近傍ピクセルを対象とした処理であった。この章では、対象とする範囲を一般化し、パラメータとして近傍の範囲を取得するようにする。

まずはタイルについて。

_ タイルの管理

タイルとはサイズ64x64ピクセルの画像データブロックです。通常タイルはプラグインに対して一つ一つ要求に応じて、共有メモリから送られます。もちろん、この処理は大量の資源を必要とし避けるべきである。

普通、特定のキャッシュを必要とすることはない、どのタイルも必要とされたとき送られ、他のタイルが呼ばれれば、開放される。それでもなお、以下の関数を使うことによって、一定間隔で回ってくるround tripを避けてプラグインにタイルキャッシュを保持させることができる。

gimp_tile_cache_ntiles (gulong ntiles);

part2の例では、gimp_pixel_rgn_get_row()とgimp_pixel_rgn_set_row()を呼び出したが、キャッシュを使うことはしなかった。

タイル列一列のタイルの数は、タイルの幅でレイヤーの幅を割った数に1足した数となるだろう。そのため、レイヤーの幅が65の場合、我々は二つのタイルをキャッシュすることになる。通常シャドウタイルも処理するので、プラグインの扱うキャッシュのサイズは倍にしている。

gimp_tile_cache_ntiles (2 * (drawable->width / 
                        gimp_tile_width () + 1));

キャッシュによって遅かったプラグインは早くなった。300x300の画像上では、最新のブラー処理は3秒かかった。しかし、2000x1500の画像上では遅くなり、142秒かかった。

上記のコードを追加することで、処理速度は向上し、11秒で終了した。我々はまだタイルの変わり目での変化に要する時間を失っている。2行分のタイルキャッシュを取得する変わりに4行分取得するようにしたら、10秒まで減らすことができた。ある点を堺に処理時間の増加を減らすことができたが、より多くのキャッシュを必要とするようになり、またさらなるハードディスクへのアクセスを発生させることになった。

_ アルゴリズムの一般化

半径パラメータを考慮するために、アルゴリズムを修正しよう。半径が3の場合、ピクセル近傍は7x7とし、半径1の場合は3x3とする。これを実現するために、以前のアルゴリズムを次のように修正する。

  • 2r+1(rは半径)個のタイルの列に必要な領域を割り当てる
  • 境界に注意しながら、タイルの配列を初期化する。
  • 一つ一つの行にたいして以下の処理を行う
    • 行の各ピクセルにたいして以下の処理を行う
      • 境界に注意しながら、近傍の平均を計算する。
    • 新しい行を取得し、行の配列を回す。

このアルゴリズムは一つ前のよりも複雑である、なぜなら平均の計算時間がO(r^2)のアルゴリズムだからである。

このように動作するよう修正されたソースコードを以下に示す。ほとんどの処理は、process_row()関数内で行われる。init_mem()関数とshuffle()関数はブラー処理のソースコードをきれいで小さく保つ。

static void blur        (GimpDrawable *drawable);
...
static void blur (GimpDrawable *drawable) { ... }
static void init_mem (guchar ***row, guchar  **outrow, gint num_bytes) { ... }
static void process_row (guchar **row, guchar  *outrow, gint x1, gint y1, 
                         gint width, gint height, gint channels, gint i) { ... }
static void shuffle (GimpPixelRgn *rgn_in, guchar **row, gint x1, gint y1,
                     gint width, gint height, gint ypos) { ... }

_ グラフィカルなインターフェイスの追加とパラメータの保存

ユーザが半径を修正しようとするために、もしくは対話的で無いスクリプトにパラメータとして値を渡す場合、run()関数へ戻る必要があり、それは単純なスクリプトでできる。

まず我々は、オプションを保存し返すことができる構造体を作成する。たいてい、これは一つだけパラメータをもつプラグインの為に使われる。

typedef struct {
        gint radius;
      } MyBlurVals;
//
/* Set up default values for options */
static MyBlurVals bvals = {
        3  /* radius */
      };

次に、execution modes(実行モード)を考慮するためにrun()関数を修正する。interactive mode(対話モード)や、一つ前のフィルタを繰り返すモードにおいて、われわれはgimp_get_data()関数で利用された値を取得しようとした。この関数は一番最初に入力パラメータとして一意なデータ識別子を提供してくれる。たいてい、プロシージャ名を使う。

最終的には、対話モードで、オプションを修正するためのグラフィカルインターフェイスを構築するための数行を追加した。

static void run (const gchar *name, gint nparams, const GimpParam  *param,
                      gint *nreturn_vals, GimpParam **return_vals) { ... }

_ グラフィカルなインターフェイス

私は、GTK+プログラミングの詳細は詳しくない、GTK+プログラミングについては他の素晴らしいサイトを参照してくれ。まず最初に試したのは非常に単純なものだ。GIMPのウィジェットユーティリティを使い、ヘッダーを持つウィンドウをGimpDialogで作成し、数値を制御する(GtkAdjustmentと関連付けられた)GtkSpinButtonも作り、そしてGtkFrameでラベルを作成した。

以下のパートでは、このような作業がどれだけ簡単にできるかを示すために、パラメターの効果をリアルタイムに示すプレビューダイアログを追加する。

最終的に、Gladeのツリー表示パネルで以下のように表示される程度になった。

Glade tree

GIMP2.2で、GNOMEヒューマンインターフェイスガイドラインに沿って、首尾一貫した振る舞いを行うように考慮された、パラメータを伴うウィジェットが存在する。GimpPreviewは2.2から現れた、とりあえずそれを使わない版を作ってみる。

Blur Dialog
static gboolean blur_dialog (GimpDrawable *drawable) { ... }

_ GimpPreviewの追加

GimpPreviewを追加するのは本当に簡単だ。最初に、gimp_drawable_preview_new()関数を使ったGtkWidgetを作成する。その時、無効化シグナル(訳者注)をこの関数に設定し、プレビューが更新される度にblur()関数を呼ぶようにする。また、MyBlurValsにプレビューが有効かどうかを覚えておくための第二引数を追加する。

簡易的なプレビューの更新方法とは、プレビューパラメータをblur()関数内に追加することです。そして、プレビュー引数がNULLでないなら、限定的にGimpPreviewを行う。そして、run()関数からblur()関数を呼ぶ場合、プレビューパラメータはNULLに設定する。

限定的なGimpPreviewを行う為に、gimp_preview_get_position()とgimp_preview_get_size()を利用する。これで表示されている箇所だけにぼかし処理をかけることができる。

最適な方法に到達するには、コードのいくらかを調整しないといけない。例えば、プレビュー生成時はプログレスバーの更新は必要ないし、GimpPixelRgn初期化時、タイルキャッシュがコアに送り返さないようにさせる。

最終的に、gimp_drawable_preview_draw_region()によって更新されたプレビューを表示させる。プラグインの効果をリアルタイムに表示するダイアログボックスを得られる。さらには、GIMPコアのおかげで既にこのプラグインは選択領域も考慮できているからだ。

改良されたダイアログ 選択領域のぼかし
static void blur (GimpDrawable *drawable, GimpPreview  *preview) { ... }
static gboolean blur_dialog (GimpDrawable *drawable) { ... }

タイルキャッシュ処理UIプレビュー処理についてはそれぞれのコードを見てくれ。

_ まとめ

この記事では、我々はいくつかのGIMPプラグインの側面を基本的な概念を見てきた。単純なアルゴリズムによる画像データの処理を行ってきた、そしてパフォーマンス問題をどのようにして避けるべきなのかという道を示した。最終的に我々はアルゴリズムを一般化し、パラメータを追加し、GIMPウィジェットを良いユーザインターフェイスにするために使った。

_ 謝辞

この記事を書いている間中、私を助けてくれた妻AnneとDavid Odinへ感謝する。

_ [gimp] ぐっちゃぐちゃ

体裁がぐっちゃぐちゃなんで、どうにかしたい。っていうかやっぱり、翻訳支援ツールとか使ってみるべきだった。後、語尾もですます調にするべきだったなぁ。

さて、次はどうするべか。ってせっかく訳したんやし何かPlug-inを作ってみんとなぁ、調べたことが無駄になる...。

_ [gimp] 「invalidated signal」について

gimp_drawable_preview_new()では、invalidated signalというシグナルが定義されていて、最初何の意味かさっぱりわからなかった。

「無効化されたシグナル」とか直訳して、”シグナルを無効化する関数があるんかなぁ”とか思ったけども、どうやら違うらしい。っていうかそれじゃあ意味が通らないし。

invalidateはGUIプログラミングでupdateやrepaintと同じ再描画に関する信号としてよく使われる名前のようで、「描画した効果がなくなった」ことを示すシグナルだということでした。windowsでのゲームプログラミングの記事でその名前が確認できました。

というわけで、上記の文章でinvalidated signalが表れた箇所は、再描画の必要がある際、invalidated signalが発行されるとblur()関数を呼ぶようにしている。

_ [life] アームレストの高さ調節は必要だったかどうか

アーロンチェアBタイプスタンダード

土曜日に机、棚よりも一足早くやってきました、アーロンチェア。一番安い、スタンダードですが、大方問題無し。アームレストの高さ調節がスタンダードではできないので、腕の行き場所に悩みました。しかし、思いっきりリクライニングさせてキーボードに手を伸ばすとそもそもアームレスとが机の下に隠れる上、腕が机に完全に乗っかってしまったので問題解決。

前傾姿勢ではないので座っている間、足に全然力がかかりません。おかげで、立ち上がるとき体を重く感じます(何

_ [opensource][translation] OSC2006の翻訳BOFより OSSにおける翻訳

現状まぁそんなもんなんだろうなぁって感じはするけど、「一般的にOSS翻訳は軽視されており」ってのはどうなんだろ。debianやFedoraでは翻訳に関するMLがあったりするし、GNOME、KDE等にしても翻訳が軽く見られているなんて思えないんだけどなぁ。まぁ思えないってだけで中がほんとはどうなのか見たことないからなんともいえんが。

この発表をされてる樋口さんってSunで翻訳スタイルガイドを策定された人かな。ここんとこオープンソースな翻訳支援ツールもいくつかあるんで、これから試してみたい。

いつまでも質の低い和訳を垂れ流す訳にもいかんしのぅ。


2006-03-28 放置プレイ中 [長年日記]

_ [developerworks][java][linux] Shaleとデュアルブート環境でのOS切り替え

_ [C/C++][network] OSNews - The Pthreads Connection and High-Availability NFS

_ [java] メールサーバJamesとJavaネットワークプログラミング事始

_ [python] lambda式と再帰

なんだか、nozomさんcarbuncle君が盛り上がってたから自分も書いてみました、pythonで。

#! env python
def fib_cps(n, k):
    if n == 1 or n == 2:
        return k(1)
    else:
        return fib_cps(n - 1, (lambda v1: 
                               fib_cps(n - 2, (lambda v2:
                                               k(v1 + v2)))))
if __name__ == '__main__':
    for val in range(1, 10):
        print 'Fibonacci(', val, ') = ', fib_cps(val, lambda x : x)

書きかたはnozomさんとこのJavascriptの例をそのまんまpython上で書いただけです。なんかもっといやらしい書きかたできんかなぁ(ぇ。主張できるものが無い。

上げ方ミスってindex.rdfが汚れたかも、RSSリーダで読んでる人ゴメン。コードに空行が無いのはpythonだからじゃないっす。

_ [comic][book] 昨日今日買った漫画、本

あと、Sofutware Design 4月号と電撃萌王。Software Designはひなた先生の為だけってのが大きいかも。Web関連の記事が軒並一瞥して終わり以上の価値が無いってのは悲しいなぁ。電撃萌王は七尾奈留の表紙に捕まった、と最初思ったけど意外によさげな内容だった。

かりん8巻の通常版が4/1発売と聞いて憤りを感じずにはいられない。どうせ買われない限定版をなんでそんなに先行させる必要があったんだ、とつい考えてしまう。

機長が語るヒューマンエラーの真実は、関係する仕事をしているからというわけでは無いけど、興味深い。ただ、普通に読むにはもうちょっと一般論を深く論じて欲しいんじゃないかなぁと思った。

いぬかみっは絵柄が好みだった、漫画も絵柄は良かった。

ARIAは電車の中でニヤニヤする展開でどうしようかと(ぇ。二期がほんと楽しみだ。


2006-03-29 3月一杯は放置かしら [長年日記]

_ [python] turbogears 0.9 alpha2リリース

やっと時間が取れたのでTurbogearsでblogを作るのを再開。とはいってもCSSとHTMLをこねくりまわしている時間が大半なわけですが。

最初、preview versionは使う気が無くて、release versionのモジュールのupdateをかけようと思ってez_setup.pyを動かしたらダウンロードサイト内のURLが間違っててインストールができなかった。

というわけで、ついでなのでpreview versionを使ってみることにした。諸々の変更点に気をつけつつ、作業作業。

_ [book][comic] 買った漫画と本

あと、Web Designing 4月号を購入、特集が気になったので。

かりん通常版がやっと売られていたので購入。巻末にも描かれているけどすごい勢いでラブコメしている。とかりんへのハマリ具合で、自分の嗜好が見えたかも(やっとかよ。

マンガでわかるフーリエ解析は出るのは知っていたけど、予定日になっても全然なかったのでどうなったのやらと思ってた。うーん、確率統計ほどありがたくないかもしれん。

_ [C/C++] malloc,realloc

mallocとかメモリ割り当て関数を自分で使う用途が全然わかんなかった。で、最近やっとmallocとかを何に使うのかを理解した。...なんで今までわかってなかったんだろ。C言語のメモリ管理を自分の手で行わないといけないという感覚が未だに慣れない。GCの弊害だ!(ぇー


2006-03-31 またりしすぎ? [長年日記]

_ [javascript] GreasemonkeyでGoogle AdSenseを削る

Google AdSenseがウザいんですよ。っていうかクリックしたこと一度もないし、サイトと全然関係ない広告ばっかりで役にたたないし、等々で前々から目障りだなぁと思ってました。

どうにかできんもんかなぁと思って、この前nozomさんの書いたJavascriptで継続渡しを読んでそのままpythonへ写したとき、以前あったJavaScriptアレルギーがめっきり少なくなってたので(今でもありますが)、Greasemonkeyに挑戦してみることにした。

どのサイトでも効くかどうかは調べてないけど、とりあえずこんな感じ。

// ==UserScript==
// @name Google Adsense Remover
// @description removing remove google Adsense.
// ==/UserScript==
(function () {
    var ad_name = "google_ads_frame";
    var iframes = document.getElementsByTagName("iframe");
    var googleAd;
    for (var i = 0; i < iframes.length; i++) {
        googleAd = iframes[i];
        if (googleAd.getAttribute("name") == ad_name) {
            googleAd.parentNode.removeChild(googleAd);
        }
    }
})();

これ書く上で、始めてfirefoxのDOMインスペクタ使ったんですが、便利ですね!(今更

さ、次はamazonへのリンクURLからアマゾンアソシエイツのIDを削るのを書くぞー。

_ [javascript] GreasemonkeyでamazonアソシエイツのIDを削る

やってることは単なるURLの成形。あと、ASIN以降にredirect〜とか書かれている場合の対応をしないといけないけど、面倒になってきたんでそれはそのうち。

ちなみにURLのamazonアソシエイツID以降を削りたいのは、リンクが商品詳細へのリンクになっておらず、アソシエイツユーザのレコメンド一覧のページへのリンクになっているのが嫌だから。

// ==UserScript==
// @name Amazon Associate ID Remover
// @description removing Amazon Associate ID.
// ==/UserScript==
(function () {
    var delim = "/";
    var attrName = "href";
    var amazon = "www.amazon.co.jp";
    var ASIN = "ASIN";
    var links = document.getElementsByTagName("a");
    var url;
    var fixedUrl;
    for (var i = 0; i < links.length; i++) {
        element = links[i];
        if (element.hasAttribute(attrName)) {
            url = element.getAttribute(attrName);
            if (url.indexOf(amazon) != -1) {
                tokens = url.split(delim);
                fixedUrl = "http://" + amazon;
                for (var j = 3; j < tokens.length; j++) {
                    if (tokens[j] == ASIN) {
                        fixedUrl = fixedUrl + delim + ASIN + delim + tokens[j+1];
                        break;
                    } else {
                        fixedUrl = fixedUrl + delim + tokens[j];
                    }
                }
                element.setAttribute(attrName, fixedUrl);
            }
        }
    }
})();

_ [mozilla] Greasemonkey

DOMインスペクタとWeb Developerが無いと開発がままならないです、ままならないっていうか不可能。あと、javascript-mode.el必須。

まぁJavascriptといっても必要な知識はほとんどはDOMかなぁ。