HorliX/Horos/OsiriX written in Objective-C

ROI あたりから、Horos や OsiriX のコードを真面目に読み始めたのだけれど、意外に読みやすい。

読み始める前は、「ハイソな Mac のことだから、Horos/OsiriX のソースコードも、モダンで、レアなデザインパターン使いまくった難解なコーディングしてるんじゃないの?」と思っていたが、そうでもない。どちらかといえば、素朴な組み方していると思う。これはよく考えれば当たり前で、元々の作者のロゼッタさんは放射線科の医師。C/C++ 系のガチ職業プログラマのような「誰がこのロジック追えるんだ?」というような書き方はしなかった(できなかった)からだと思われる。

あと、読んでいて気がついたのは、Horos プロジェクトがつけたコメントがけっこう間違っているように思う。信用してどハマりしたことがあったので、気がついた。もちろん、全部、間違えているわけではないし、有益なコメントも多く有り難いのだが、「ここ間違えちゃいかんだろう」というところで、いい加減なコメントつけて逃げちゃっている感じ。感覚的な言い方をすると。
(この手の「手抜き」が不具合に繋がったと思われる例が『Horos の不具合』という記事で紹介されています。興味ある方は一読を。VTK の不適切な設定をこの後で書きます)

作業していて嫌なのは、やはり、Objective-C のクセ。

例えば、クラスからインスタンスを生成する際には

Person *person = [[Pserson alloc] init];

などという書き方をする。(追記 この記事が猛烈にわかりやすいので、おすすめです)

全然、慣れない(笑)。


Objective-C 特有の仕様で読みにくくなっているところなどを具体的に挙げていこう。

カテゴリ

#import "BrowserController.h"

@class DataNodeIdentifier, DicomDatabase;

@interface BrowserController (Sources)

-(void)awakeSources;
-(void)deallocSources;

-(void)redrawSources;

-(DataNodeIdentifier*)sourceIdentifierAtRow:(int)row;
-(int)rowForDatabase:(DicomDatabase*)database;
-(DataNodeIdentifier*)sourceIdentifierForDatabase:(DicomDatabase*)database;
-(void)selectCurrentDatabaseSource;

-(int)findDBPath:(NSString*)path dbFolder:(NSString*)DBFolderLocation __deprecated;
-(void)removePathFromSources:(NSString*) path;
@end
BrowserController+Sources.h

ファイル名が BrowserController+Sources.h になっている時点でほとんどの人が読むのをイヤになるんではなかろうか。
これはカテゴリというもので、BrowserController というクラスが別にあってこのファイルでそのクラスの拡張を図ってます。


Horos の 3D Viewer 、特にボリュームレンダリングに関しては、元のソースコード自体がかなり問題のある構成になっていて(実際、ここでよく不具合が出る)、少々手直した程度では、解決しないと思い、ほぼ同機能のアプリを PHORLIX Lite としてリリースしています。

たぶん、ソースコードにあたった人でないとわからないと思いますが、以下のような指摘があります。

実際のソースコードは以下の通り。

NSAttributedString *label = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:NSLocalizedString(@"value : %.0f\nalpha : %1.3f", @"don't translate the 'backslash n' before 'alpha', it is a new line symbol!"), pt.x, pt.y*pt.y] attributes:attrsDictionary];//original

CLUT の各ポイントの y 座標は、pt.y で表示されますが、Label での表記は pt.y * pt.y となっています。
アルファブレンディングの性質からいって、すごく間違っているということはないんですが、使っていてあまり気持ちのいいものではありません。

PHORLIX Lite では色加算はシンプルに

outColor = {color.x * color.x, color.y * color.y, color.z * color.z}  +
 {(1-color.x) * outColor.x,(1-color.y) * outColor.y, (1-color.z) * outColor.z};

で処理しています。
これでも、以下のような画像が得られています。

思うに、OsiriX チームが初めてボリュームレンダリングに挑戦したとき、これを実用レベルで実装していたのが VTK しかなかったので、少々無理があっても VTK を利用したというのが真相ではないでしょうか。

上で

もちろん、全部、間違えているわけではないし、有益なコメントも多く有り難いのだが、「ここ間違えちゃいかんだろう」というところで、いい加減なコメントつけて逃げちゃっている感じ。

 といっていたのは、具体的にはこういうことです。

さらに困るのは、「HorliX は Horos の分家みたいなものなのだから、Horos を非難するのはおかしい」という困った主張をする人が実際にいたことです。

図は『「開いたいるか」の都市伝説は本当だったか?』より。

レビューという意味での批判はしたことはありますが、単なる悪口のような「批難」をしたことはないつもりです。
ROI-color-rotation-UI などは HorliX 起源ですし、raw ファイルインポート機能も HorliX で復活させた機能です。
どちらも「本家」が実装していなかったし、その気配もなかったので、必要に迫られて独自に実装したというのが本当のところです。
なんでそれが「HorliX = Horos の日本語版」という解釈になるのかよくわかりませんし、不十分な機能を付加することがなんで「批難」にあたるのか意味がわかりません。(ちなみに最近言われているのは、こういった人たちは公式な技術文書を書いた経験がないので、評価すること=悪口を言っていると解釈しているのではないかという説です。確かに上の投稿をした人はアカデミックな業績は一つもありませんし、協力関係にあった業者も業績はほぼゼロです)

PHORLIX Lite に至っては、ほとんど完全にフルスクラッチです。
ある程度、実用的なアプリが作れるレベルの人ならば、元ネタがオープンソースであるかどうかは大して重要ではないと思います。
誰だって楽はしたいから、オープンソースプロジェクトで流用できるコードは探しますが、今回のように必要に迫られれば自作することになると思います。

一方、「オープンソースは本家が全て」というような宗教的な無茶な主張をした人たちは、Horos の日本語版をメンテするようなことをいってましたが、本家の開発がストップして以降、メンテもできていないようです。
オープンソースがなんでも叶えてくれる魔法の道具とでも思っていたのでしょうか?

おそらく業者かと思いますが、まるっきり信用できないような態度をとっていますね。

 

クリックclose

“HorliX/Horos/OsiriX written in Objective-C” への1件の返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です