2008年06月30日

libspesにioctl追加

 libspes(※)にioctl()を追加。

 あと他に何がいるかなあ。
 思いつくのはselect()とネットワーク関連かなあ。

 ただ出来るだけ SPE 側でプログラムしたいんだけれど、ここら辺は PPE 側で持つべきだよねえ。

※現在リンク切れです。とりあえずはhttp://yoffy.dyndns.org/svn/libspes/trunk/からどうぞ。

常駐ウィンドウの居場所

 パソコンには現在のステータスを表示するソフトや、ちょっとしたツールを提供する常駐ソフトが沢山ある。

 でも普段主体にならないソフトが主張してしまうと邪魔になるため、居場所をどうするかで様々な方法が模索されている。例えばこんなの:

  • 常に最前面に張り付くフローティングウィンドウ。Dock、タスクバー、ランチャーなんかが相当する。はっきり言って邪魔。
  • マウスポインタを近づけると最前面に現れるタイプ。やはり Dock、タスクバーが身近な例。間違えてポインタを近づけてしまい、誤動作する事が多い。
  • ショートカットで最前面に現れるタイプ。身近な例ではSpotlight、Dashboardあたり。これが一番邪魔にならない。不満な点はそれぞれショートカットを覚えないといけない点と、常に状態を把握出来ない点。特にDashboardの電卓やDictionaryは文章を書きながら参照出来ないのが不満。
  • フローティングウィンドウの逆で、デスクトップに張り付くタイプ。カレンダーソフトのようなものが多い。これは全く邪魔にならないが、ウィンドウやデスクトップのアイコンが多いと延々と情報に辿り着かない。
  • ウィンドウにくっついてくるタイプ。ドローワーや、フローティングウィンドウで、常駐ソフトというよりも使っているソフトの機能でしかない。よく出来たソフトだと、ウィンドウを動かした時に自動的に避けてくれるものがある。ただ、左端から右端に一気に移動したりするので動きが大きくて目障り。あとやはりメインウィンドウとの重なり具合があるので画面が狭くなる。

 ここで一つ提案してみたいのが、浮き方の弱いフローティングウィンドウ。デスクトップに張り付くのではなく、勝手に最前面に現れる事も無く、メインウィンドウを移動した時に勝手についてくる事も無い。常にZがメインウィンドウの1つ下に存在するだけというシンプルなもの。フローティングウィンドウと同じで、上下左右もZも完全に固定されているので動きが全くない。つまり目障りにならない。名付けてハンギング(Hanging)ウィンドウ。

 フローティングウィンドウがメインウィンドウに重なると、最悪メインウィンドウのタイトルバーがつまめなくなったり、サイズを変えられなくなったり、ボタンを押せなくなったりと障害が大きいが、これも解消される。

 情報が裏に隠れてしまうのは自己責任で、ウィンドウの配置を試行錯誤して欲しい。ただ少なくとも、触る事が少ないツールよりメインウィンドウの障害を取り除く方が優先事項だと思うし、Dashboardを出したりデスクトップまで潜ったりするような大きな動作も要らない。

 これで電卓の値や辞書、メッセンジャーの状態が常に見えるようになると非常に便利だと思うのだが…

2008年06月19日

理解出来ない

test.cpp:


#include <altivec.h>

vector unsigned int test(vector unsigned int a, vector unsigned int b)
{
    vector unsigned int c;
    c = vec_cmpeq(a, b);
    return c;
}


コンパイル:


$ g++ -maltivec test.cpp
test.cpp: In function 'unsigned int __vector__ test(unsigned int __vector__, unsigned int __vector__)':
test.cpp:6: error: cannot convert 'unsigned int __vector__' to 'unsigned int __vector__' in assignment

 日本語でおk

2008年05月09日

Leopard でグループにユーザを追加

 リポジトリの所有権を _svn に設定してあるのにユーザを _svn グループに所属させる方法が分からなくてここ数ヶ月ずっとコミットしてなかった。
 昨日ようやく本腰を入れて調査したら、説明しているサイトを発見:
MAC OSXにはUSERADD GROUPADDはない

 そのまま自分の環境に当てはめると、これでいけた。

$sudo dscl . -append /Groups/_svn GroupMembership yoffy

2008年05月05日

イヤホン


 イヤホンで音楽を聴く時には、耳に直接入れるタイプのものを使っている。
 カナルタイプと言うらしい。

 以前は SONY 製のを使っていたけれども、サイズが合わないし、交換しても交換してもすぐ壊れた。
 道具として使えないなら音質が良くても意味が無い。

 で、探しまわっていたら ELECOM 製で小さいものを発見。右の画像のやつで、型番で言うと EHP-PIE30PN4 というもの。
 一ヶ月使っていて今のところ壊れる様子は無いし、なにより耳にフィットするので音が漏れずにボリュームを大きく出来る。素晴らしい。

 耳が小さい人にはお勧め。

2008年05月04日

Non Local Means

 4月はずっと、最近流行の AviUtl プラグインのNL-Means filter に触発されてノイズ除去のアルゴリズムである Non Local Means をいじくってた。
 NL-Means は広域で平均を取って絵をべた塗りに近づけるため、AviUtl 界ではアニメによく効くと言われている様子。

 これは畳み込みの一種であり、例えばよく使われている移動平均なんかは次のような感じで畳み込み

元画像 移動平均
1.01.01.0
1.01.01.0
1.01.01.0
元画像と移動平均

ガウスぼかしは次のようなので畳み込む。

移動平均
0.370.60.37
0.61.00.6
0.370.60.37
ガウスぼかし

 Non Local Means は畳み込む画素の周囲でマッチングを行って、その一致率でウエイトを作る。似通った領域では広く平均が取られ、似通っていない領域では平均されない。
 一致率の出し方が工夫のしどころではあるけど、NL-Means filter では差の二乗和を d、係数を h とすると

exp(-d*h)

というように指数に入れている。差が無ければウエイトが 1 になり、差が少しでも大きくなるとすぐ 0 に落ち込む。
 また、h が 0 であれば移動平均になり、h が大きくなるにつれ似通った領域のみ使われるようになる。最終的に h が無限大になれば元の画像に一致する。


h が小さい場合

h が大きい場合

 なんにせよ、パターンの一致率でウエイトを決めるため
0.10.20.5
0.81.00.1
0.20.60.4
とかいう感じで、全く対称性の無いウエイトが出来上がる。

 この手法の特徴は、パターンが一致している部分のみを使うので、エッジが完全に保存される。メディアンフィルタでは落ちてしまうような一本の線でさえも保存される。
 しかし、逆に一点のノイズであっても保存されてしまうので、結局強いノイズは予め他の手法で取り除いておかないといけない。


メディアンフィルタ
移動平均に比べてエッジが保存されている

 Non Local Means のみで強いノイズを除去するには h の値を小さくしないといけないが、それだと移動平均に近づくのでボケる。
 h を小さくしつつボケにくくする為には、畳み込みのサイズを小さくするしか無い。それでは広く平均を取れるこの手法の利点が薄くなる。

 そこで折衷案として、h を 0 にした時にガウスぼかしになるようにしてみた。
 こうすると領域は円形になるし、サイズを小数単位で微調整出来る。何より遠くにいく程弱くなるので、広過ぎる範囲で平均されない。


ガウスぼかしに近づく方法で h を小さくした場合

 うーん。SAMSUNG の文字は多少読みやすくなってるけど、あまり差が無いかな。

PS3 Linux のキャプチャ

 3 月は PS3 Linux プログラミングの動画の続きを作りたくて、キャプチャソフトを作っていた。

 キャプチャしてそのまま保存しているとディスクアクセスがとんでもない事になるので、gzip を噛ましてみたらこれが遅い。10 fps くらいしか出ない。
 そこで Range Coder を採用しようと思い、ずっと Range Coder の研究に没頭していた。

 先月末からまた研究を再開して、結局一般的に使われているように、テーブルを 2 バイト、演算精度を 4 バイトにするのが最も CPU 負荷と圧縮率のバランスが取れているという答えにたどり着く。

 結論は出たのでさくっと実装してまた動画を作る予定。