博士課程での研究やソフトウェア開発の話とかを,思いついた時につらつらと書いています


Programming::C# - OneNoteのファイルをいじれそう


OneNoteのページ数とかを取得するためのサンプルコードです。
http://blogs.msdn.com/descapa/archive/2006/08/13/698311.aspx

OneNoteがないと死んでしまう私としては、
これを参考にしておもろーなプログラムが作成できそうな予感がびんびんしています。
OneNoteのファイルを対象に、いろいろ情報を抽出・検索したりするプログラムとか。
OneNoteに書いた情報のつながりを抽出したり、
あるキーワードをもとにページを手繰り寄せたりとかいう機能が
OneNoteは弱い気がしておりまして。

ページとかの中身もあれこれいじくれるんだったらいいなぁ。
「Microsoft.Office.Interop.OneNote」でぐぐっても
日本語のWebサイトが劇的に少ないから、
がんばって英語を読んで情報収集するしかないですね。


ちなみに私は、OneNote以外にもホワイトボードと計算用紙がないと死んでしまいます。
自宅に900mm X 1200mmのホワイトボードがあるんですけど、
いろいろ試行を巡らせるときはこれがないとやばいですね。
ホワイトボード大好きです。
すべての壁がホワイトボードだったらいいのに(笑
ホワイトボードにメモやらマインドマップやらをかいて、
あとでデジカメで撮影します。
撮影した画像だったり、後々参照しそうなデータは整理してOneNoteにまとめておきます。
計算用紙は、あとで見返すことがないようなことを書いたりします。
頭の中の記憶領域の使用量を減らすために、計算用紙に吐き出しています。

ということで、
OneNoteは整理して後で見直すデータをまとめるアプリケーションとして使っています。
なので、いろいろ情報の抽出機能が強化できると、激しく嬉しいんですけどね。

InterConnectが面白そうな情報抽出機能を持っているかと思ったんですけど、
動作環境の縛りの関係で著しく使いづらいことがわかったので、
現在は使っていません。

最近は、日曜日は一日仕事しなくてもよいようにスケジュールを組んでいるので、
近いうちに上記のサイトを参考にあれこれ遊んでみたいと思っています。

Labels:

0 comments:

Post a comment


Programming::JavaScript - エラーコード800a03e8


IE8でJavaScriptの動作チェックを行っていたら、
突然、エラー 800a03e8のため止まりますみたいなことをIEが出力してきました。
800a03e8でぐぐってもほとんどヒットしないので途方にくれていましたが、
IE TesterでほかのバージョンのIEでも確認してみたところ、
きちんとしたエラーメッセージがもらえました。
(IE8でデバッガを有効にしていたからちゃんと出なかったのかな?)
下記のようなエラーメッセージが出ました。

HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)

そこで落ちたら今まで動いていたコードが動かなくなるじゃん!
document.write()とかの使いどころが激減する予感。

開発しているシステムのほうではdocument.write()でdiv要素とかを出力していまして、
body要素の半ばあたりでそれやっちゃうと上記みたいに怒られる、と。
しかしながらほかのサイトでもご紹介されているとおり、
bodyのとじタグ付近だったらOKなんですよね、いみふ。
bodyのとじタグ付近だろうがなんだろうが、
上記のエラーメッセージ通りの制約を課すならアウトだろうに。
何考えてんの?IEのデベロッパーは。
とか思います。
bodyの子要素からしてみれば、bodyは書き換えてよい親なのでしょうか。

対策として、document.writeやってるところは
すべてwindowがloadし終わったあとにdocument.body.appendChild()使って
要素を追加するよう書き直すしかない、ってことなんでしょうかね。

そういえばdocument.writeやってても大丈夫な箇所も、一応あります。
bodyの子(孫とかではなく)になる要素だったらdocument.writeして
要素を追加してもよいのかも。
んで、一回のdocument.writeの呼び出しで
bodyの子、bodyの孫を一気に出力しちゃえばOKなのかな
(一気に、っていうのは孫要素のとじタグもちゃんと出力してしまうということで)。

もー世の中FirefoxとChromeだけになりませんかね、無理ですよね。ふぅ。

Labels: ,

0 comments:

Post a comment


Laboratory::Programming - Boost.uBLASで特異値分解


Boost.uBLAS で特異値分解(SVD) - yanoの日記
SVDPACKCで特異値分解できる雰囲気になってきましたが,
Boost.uBLASを使った特異値分解もなかなか魅力的ですね.
わりと簡単に実装できるようですし.

C++で書いたら先生嫌がるんだろうなぁ.
後で自分で実装すれば良いだけの話なんですけどね.

Labels: ,

0 comments:

Post a comment



うちの研究室の先生のお手伝いとして,
ベクトル空間モデルを実装しそうな勢いなのです.

いやまぁ以前私も一時手を出しかけて出さなかったんですけどね,実装には.
ベクトル空間モデルやるからには,LSIまで手を出したかったのですが,
特異値分解のところで躓いてあきらめたのでした.

そのときも,SVDPACKCを使えばよいというのはわかっていたのですが,
なにぶんうまくコンパイルできない,落ちる,入出力フォーマット意味不.
とグダグダだったので,あきらめちゃったのですが.

今回ちょっとリトライしてみることにしました.
ただ,先生の用件としては,
私が書こうしているプログラムはANSI Cで書けという.
C++かPerlで書かせてくださいよーと嘆願したんですが,
俺があとあといじるかもしれへんからC!といわれました.
しかもWindowsでコンパイルできないと行けなく,
Cygwinとかも使わない方なので,VC++でコンパイルできるのが望ましいわけで.
しかし私としてはLinuxででもコンパイルしたいので,
そこらへん気を使って書いていかないといけません.

ベクトル空間モデルの実装自体は簡単なのでいいんですが,
LSIですよねー.
やっぱSVDPACKCか?と思って情報を集めていたら.

www.koguchi.be - SVDPACKC

こちらを参考に,SVDPACKCのlas2.cを修正してみました.
結構修正しないといけませんねー.
で,VC++ express 2008でコンパイルしたわけですが,
リンカでこけてしまいます.
プロジェクトに追加したのはlas2.c, las2.h.
_timerが見つからないよーとリンカにおこられます.
_timerってなんやねん!と思ってたんですが,
timersun.cも必要なのですね.ここに定義してあります,timer()が.
プロトタイプ宣言はlas2.cにあるんですよね,気持ち悪.
で,timersun.cなんですが,こいつはVC++ではコンパイルできませんでした.
仕方ないので,timerのプロトタイプ宣言のところを,
0.0を返す関数定義に変えてやりました.
まぁ時間なんて計測する必要は,私には無いので.
特異値分解ができればそれでおっけぃですから.

てなわけで,コンパイル完了,バイナリが出来上がりました.
コンソールアプリの.

実際動かしてみて,特異値分解ができているくさいです.
さてさて,あとはこの出力されたファイルの中身がどうなっているのか,
入力するファイルの形式とかはどうなのか.
はっきり調べて,先生に頼まれるであろう実験用プログラムの開発をしていかないとですね.
ちなみに先生専用というわけでもなく,
ゆくゆくは私も使うことになりそうなので,ちょっと気合入れて書いていたりします.
というか,絶対Perlラッパー書いてやろうとか思ってます.

Labels: ,

0 comments:

Post a comment


Programming::Perl - Parrot0.7.1


Journal of pmichaud (6013)
Parrotのバージョンが0.7.1になったようです。
Parrotがメジャーバージョンになってくれないことには
Perl6の実装Rakudoが実用に達しませんしねー。
めっちゃ書きやすそうなPerl6を、早く大学の実験とかでも使いたいのです。
処理が速くないと、実験おそーな状態ですから、なかなかPerl6使えず。
メジャーリリースが楽しみですね。

Labels: ,

0 comments:

Post a comment


Programming::SoftwareDevelopment - すっきり書くことについて


大学で、完全なるボランティアとしてのソフト開発に参加させられています、現在。
プロジェクトの方向がバシッと見えず、なぁなぁでミーティングが重ねられ、
システム全体像が不明瞭なまま、各担当モジュールを決められ、
来週から開発スタートとかになってしまい、イライラ感はいなめない最近ですが。
ったく誰になってんの?プロジェクトリーダーは。
先生ですか?それも怪しいのですが。

そんなこんなで、ある人の担当モジュール。
使用言語はC#、GUI部もC#で書いている彼女は、
ネットワーク処理を自分のプログラムに組み込まなくてはならなくなりました。
ネットワークモジュールとしては、C++、Ruby、Perlで書かれたものがすでにある状態です。
とはいうものの、ネットワーク処理のプロトコル仕様書はすでにあるので、
C#でネットワーク処理を書いてしまえばいいでしょう。

が、何やら、彼女が書いたプログラムを立ち上げるランチャをC++で書き、
C++で書かれたネットワークモジュールとランチャ部をくっつけ、
ネットワーク部分とGUI部分とのやりとりを
外部ファイルを用いておこなったらいいんじゃない、と言い始めるそこの先生っっ!
明らかにややこしい処理をやってます。気持ち悪いです。
C#で書いたほうがすっきりしますよね?と聞いたんですが、
きれいさは求めてないとかいわれました。

まぁ私の言い方も悪かったのでしょうが、すっきり書くことができると
バグ混入の余地が減りますし、デバッグもしやすい。コーディング量も少ない。
それに彼女はC++を経験していないので、
手間から考えても、慣れてるC#でネットワークの処理書いたほうが良い気がします。

すっきりかける=きれいにかけるしか連想してくれない先生に、
ちょっとがっかりした思いでした。

Labels:

0 comments:

Post a comment


Programming::Perl - Mastering Perl



Amazon.co.jp: Mastering Perl (Mastering): Randal L. Schwartz, Brian D. Foy: 洋書]
洋書でいえば、以前Mastering Algorithms with Perlを購入したことがあり、そうかPerlならそう書けばいいのか!と感嘆した時期がありました。今回はMastering Perl。序章とアウトライン、あと全体的にちらちらとしか見ていませんが、かゆい所に手が届きそうな感じです。たとえば、私としてはPerlの正規表現の拡張表記についてはあまり詳しくなかったので、あぁそういう仕組みなのね、ということが書いてあって大変面白いです。(?:)や(?=)とかのお話ですね。
今までぼんやりとしかわかっていなかったので。

Labels:

0 comments:

Post a comment


Programming::Perl - ちょっと距離を置いてみて


スラッシュドット・ジャパン | 本家インタビュー:Perl開発者ラリー・ウォール

上記のリンクや、2chなどからみて。
いや、2chで結構ひどい言われようなのですね、Perlって。
学部生のころはC++をメインに、マスターのころはPerlをメインに使って
研究を進めていました。
もともとPerl使いな私は、マスターのころはガンガンプログラムを書いて研究を進めていました。
C++よりも全然早くかけるし!とか思って。

まー確かに共同で開発するとなると、Perlってどうなんだろう、と思ったりもします。
OOPでうまい具合に書けば、別にどうってことなさそうな気もしますけど。
全員が全員に対して、読みやすく使いやすいようにコーディングルールを決めないと
うまく事が運ばない気もしますけどね。

2chにもたまーに書いてありましたけど、適材適所ですよね。
ひとりでやる分にはPerlで全然OK。
開発する人数が増えてくると、ルールを決めたり、
きっちりとした書き方しかできない言語を使ってみたり。

私は、研究にはPerlを使って実験しています。
ソフト開発としてはC#を使ったり、PHP+JavaScript使ったりしています。
まぁWebアプリかどうかの違いなんですけど、ソフト開発の面では。
実験にはJavaScript使うのなんて意味不明ですし、
C#でもいいっちゃいいんですけどPerlのほうがすぐコーディングできる。
でもC#で書いておけば、変なことしない限りLinuxやWindowsで走らせることはできる。

実験で速度を求める個所があるならば、Inline::C使ったりしています。
なので、速攻でコーディングできることを求めるならPerl、
実行速度を求めるならC/C++、
GUIアプリを作るならC#、
Webアプリ作るならPHP、
という感じですね、私の中では。
Javaは・・・重すぎるイメージがあるのでなかなかやる気になれないんですよね・・・
使う機会があるなら勉強したいですけど。
昔やってみて、あまりのタイプ量の多さに投げ出してしまいました。

Rubyも昔触りましたけど、begin~endとか好きになれなくて。好みの問題なんですけどね。
Perlの$、%、@とかは、見ただけでスカラーなのかハッシュなのか配列なのかわかる。
この記号が嫌いっていう方もおられるんですが。

でもまぁPerlのプログラムって知ってる人しか読み下せない、というのはあるんでしょうね。
何書いてんの、これ!?というのは昔私自身もありましたし。
use strictしないと変数に何が格納されていっているのか追跡しにくいとかいうのもあります。
サブルーチン化しなくてもべたべた書いていけるので、
平気でmain関数1000行的なプログラムもかけます。
逆に、OOPで書けば、めちゃくちゃ少ない行ですっきりかけたりもします。
ほんと自由な感じがします。

なので、大規模な開発を行う場合には、
その自由な中でいかに規律を決めて書いていくか、
という能力が求められるのでしょうね。
そんな言語だと、人数が増えるとコントロールするのが難しくて破たんしやすくなる。
だったら書き方に厳しい言語を採用したほうが楽じゃないか、という話になるんじゃないかと思います。

うん、Perlはきっとフェラーリのエンジンを載せたおもちゃだ、とかいってみる(笑

Labels:

0 comments:

Post a comment


Programming::Perl - ふつうのPerl6入門


ふつうのPerl6入門 - YAPC::Asia 2007 Tokyo Sessions

ふつうに面白いです(笑
いや、参加したいなぁと思いました。

Labels: ,

0 comments:

Post a comment



Amazon.co.jp: Perl 6 And Parrot Essentials (Essentials): Allison Randal, Dan Sugalski, Leopold Totsch: 洋書

Perl6、いつ出るやらわからないですけど、
やっぱりどういう仕様なのか気になります。

メジャーリリースされていないのに、Perl6の本買うのってどうなんということで、
購入をしばらく見送っていましたが、我慢できずにAmazonで購入してしまいました。

到着するのが楽しみですね。

Labels: ,

0 comments:

Post a comment


Programming::C# - Reflectionでメンバ変数にらくらく代入


http://blog.livedoor.jp/kkawauchi/archives/52925635.html

SQL Serverから取得したレコードをバスバス格納していく際に,
いちいち全てのメンバ変数を列挙して代入文書くのがいやだなぁと思っていたら
ちょうど良いサンプルが.

Perlとかだったら動的に代入コードを生成してevalしちゃえば楽勝です.
PHPでも匿名関数作ってやれなくもないですが,まぁリフレクション使いました.

で,C#でもリフレクションあるんだからきっとできるよなぁと思って調べてみました.
C#のマニュアルとか,みても良かったんでしょうけど.
MSのサイト重いしC#のhelpのサンプルコードは見たいコードがなかなかなかったり,
まず私にはあのhelpはみやすいとは思えず.
C#は便利な機能いっぱいあるのになー.

Labels:

0 comments:

Post a comment


Programming::Perl - Perl5.10


perldelta - Perl5.10.0の新機能


先日ActivePerlをインストールしたら5.10になっててウホッ,ってなったんですが,
結構いろいろ追加,変更されていますね.
say関数とか,Perl6にならないと使えないと思っていたのに,5.10で使えるようになっています.
というか,Perl6での機能がいくつか5.10に取り入れられていますね.
swtich文(given構文)とか,スマートマッチとか.

うれしい機能としては,
SVとかのメモリ利用方法の最適化とか,正規表現最適化とかもありますね.

削除された機能として,仮想ハッシュ(fieldsを使ったハッシュ)がなくなっています.
ま,Hash::Utilが標準モジュールで組み込まれているならいらない気もします.
fields自体は違う実装がなされていて,今までfieldsを使っているスクリプトが動かなくなることはないようです.
バイトコードコンパイラが消されています.
以前は少しでもサーバの負担を減らそうとして,
バイトコードコンパイラに期待したときもありましたが,
いまやPerlスクリプトのパース負荷なんて知れているのかもしれませんね,ハードウェア的に.
削除した理由が,ともかくなかなか上手く事が運ばなかったんでうざいから消したみたいな.
いや,うざいとかは書いていませんが,開発していかなきゃいかん!というほどのものでもなかった,
ということみたいですね.

他にもなにやらいろいろありますが,
なかなか日本語が意味不明で難しいです.
もっとうまい和訳ないもんですかね.
自分の中でもっと噛み砕いて「日本語」をアウトプットしろっつーの.

とかく,Perl5.10が出て超期待なのですが,
レンタルWebサーバはなかなかバージョンアップしてくれないんで,
当面5.10の機能に重きを置くスクリプトは作らないほうがいいですよね.
COOLにRubyインストールして!と正規会員でお願いしたんですがけられました.
まぁやすやすとバージョンアップや,新しくプログラムをインストールしたくないのはわからなくはないですが.
検討しろよったく,と思ったのも事実.
あー,今見てみてもperlしか使えませんね.
ssiやsendmailは使える様子ですが.
現在私がレンタルしているところは同人会みたいですよとおっしゃっておられて,
なんかいろいろできます.
Perl,Ruby,Pythonはもちろんのこと,SSHで入ってgccも使えるんで
ネイティブコードのCGIも実行可能です.
PHP,Java Servletも使えますし,ムービーなどのストリーミング配信,
Postgle, MySQLサーバも使えます.
メーリングリストも作れたっけか.
家族アカウントも作れたりして.

と,話がそれましたが,
Perl使いな私には,Perlのバージョンがあがったことは朗報です.
オブジェクト指向な文法が追加されたらもっとうれしかったんですけどね.

Labels: ,

0 comments:

Post a comment


Programming::Perl - PAR::Packer


大学でデモプログラムを作ろうと思い,PARをCPAN使ってインストールすることにしました。
Perl使いの私は,殆どの実験プログラムやライブラリをPerlで書いています。
なんで,デモプログラム化するにはある程度のポータビリティが必要だと思って
PARを使い,自己実行形式ファイルを構築することにしました。

PAR自体は難なくインストール出来たんですが,
PAR::Packerがどうにもmake中に落ちてインストールに失敗する。
PAR::Packerのバージョンは0.976。
設定が足らないんかな?とか思ったんですが,そういう問題でもなさそう。

古いバージョンならいけるかも,と思って探していたら,0.975を発見。
難なくインストールできました。
インストールできないモジュールを上げるなよなぁと思いました。

Labels:

0 comments:

Post a comment


Programming::Programmer - 本物のプログラマー


本物のプログラマーはパスカルを使わない

テキサスインスツルメンツ社の伝説的なプログラマがある日、長距離電話でユーザーからシステムクラッシュを告げられた。彼は、その電話口でユーザーに16進コードを指示して、メインフレームの制御フロントパネルのトグルスイッチを操作させた。曰く、「本物のプログラマは電話でブート・コードを唱え、大陸の反対側でクラッシュしたシステムを再起動させる」


…いや,変態でしょ(笑)

Labels:

0 comments:

Post a comment



お遊びで作ったものですが。

JavaScript Library MKF

prototype.jsを先にscript要素で呼び出しておく必要があります。
JavaScriptでは継承がすっきりかけなくていやんだったので,
自分なりに作ってみました。
MKFを使うと継承はこんな感じです。

// スーパークラスの定義
var MySuperClass = Class.create(); // MKF.Class.create();でも可
MySuperClass.prototype = { /* ここにMySuperClassの定義を書く */ };

// サブクラスの定義
var MySubClass = MKF.Class.create();
MySubClass.extend(MySuperClass).implement({
initialize : function (arg) {
this._super(arg); // スーパークラスのコンストラクタ呼び出し
},
new_method1 : function () { /* サブクラスで新しくメソッドを定義 */ },
...
});

_superキーワードでスーパークラスのコンストラクタ呼び出しが出来るんで,
少しは気分良く継承が出来るかなぁと思っています。

そしてメソッドのオーバーライド。
普通にやろうとすると,スーパークラスのメソッドをサブクラスで上書きすることになるんですが,
そうするとスーパークラスのこのメソッドが呼び出せなくなります。
スーパークラスのオーバーライド対象となるメソッドを呼び出す前後に,
何かしら処理を加えたいとき,スーパークラスのが呼び出せなくていやんです。
なので,呼び出せるようにしてみました。

var MySuperClass2 = MKF.Class.create();
MySuperClass2.extend(MKF.Class.Overridable).implement({
initialize : function () { /* コンストラクタ */ },
calc : function (x, y) { return x + y; }
});
var MySubClass2 = MKF.Class.create();
MySubClass2.extend(MySuperClass2).implement({
initialize : function () { /* コンストラクタ */ },
// オーバーライドするメソッドをここで定義する
override : {
calc : function (x, y) {
x *= x;
y *= y;
return super_method(x, y); // MySuperClassのcalcを呼び出す
}
}
});

var foo = new MySuperClass2;
alert(foo.calc(2, 2)); // 4が表示される
var hoge = new MySubClass2;
alert(hoge.calc(2, 2)); // 8が表示される

スーパークラスのコンストラクタ呼び出しは"this._super"で"this"がついているのに,
スーパークラスのオーバーライドされた元々のメソッドの呼び出しは"this"がつかなくて
少々気持ち悪いですが。

こんなものを作ってみましたが,
JavaとJavaScriptを連携して動かす方法もあるようなので,
オブジェクト指向でしっかり書きたいところはJavaで書くべきなのかもしれませんね。

Labels: , ,

1 comments:

WebにJavaScript 2.0の時代が近づく

JavaScript2.0が出来るまでMKF使ってごにょごにょしようかとか思っています。

By Blogger mikken, at 12:26 AM  

Post a comment


Programming::Perl - XSで高速化


大学の実験プログラムをPerlで書いているのですが、
さすがに三日以上もかかるプログラムだと高速化したくなってきます。

数式の処理が重いのかなーとプロファイリングも行わずに、
高速化を試み始めました。
Pure Perlレベルだったらやれることはやったような気がしていたので、
XSに手を出すことにしました。
まぁ具体的にはInlineモジュールを使って
数式処理の部分だけCで書いたりしたのですが。

PerlとCの間の架け橋処理が非常に面倒ですね。
なんなの、SVて。
それがPerlの、何でも入る構造体なんでしょうけどね。
で、sv_2mortalっていうのがさっぱり分かっていなかったんですが、
これやっておかないとメモリリークを引き起こすそうですね。
確保済みの領域を、sv_2mortalで揮発性にするんだとか。
…ここ5日ほどマシンを文回しながら、ページングサイズが1.4GBとかになっていまして。
Perlが保有しているメモリが880MB程行ってたんですよね。
もしかして確保したメモリを揮発性にしてなかったから?
という不安がちょっとよぎりました。
でも実験が3/4ほど終了したとこなんで、
今とめたくないんですけどね。

途中から処理を再開できるようにプログラムを変更すれば済む話なんですが。
Perlの中にCを入り込ませるのは、なかなか色々知識が必要ですね。

Labels: , ,

0 comments:

Post a comment


Programming::Javascript - 少し冷静になって作ってみる


こちらで書いたとおり、 _super()でスーパークラスのコンストラクタ呼び出しが可能なのは相変わらずです。ただ、_SUPERキーワードを使ってスーパークラスのメソッドを呼び出そうという試みで、正しくスーパークラスのメソッドが呼び出されるよう_SUPER.method(arg)を字句解析を用いて探し出し、変形させてやろうとしていたのですが…計算コストが高くつくのと、何か微妙にバグがとれずにいたので、実装するのに少し萎え気味になりました。デバッグが著しく面倒ですからね、JavaScript周りは。せっかく軽量で分かりやすいライブラリを目指しているのに、字句解析とか導入して重くなるのは嫌です、やっぱり。

Core JavaScript 1.5 Guide:Class-Based vs. Prototype-Based Languagesで、プロトタイプベース言語とクラスベース言語の比較について述べてあります。まー、JavaScriptプロトタイプベースの言語なんだから、無理にクラスベースの言語の使用に近づけなくても良い、というかむしろそれは良くないんかなぁっていう気がしてきました。これを読んだからだけでなく、クラスベース言語と同じようなことをしようとして、結果的に計算コストが高くつくようになってしまったことも、このような考えに至った原因の一つですが。

計算コストは恐らく、すんごいコーダーの手に掛かればもっと削減できるのでしょうが。スーパークラスのコンストラクタ呼び出しは結構使うと思うんで、これは削除せずに置いておきます。_SUPERキーワードを使ったスーパークラスのメソッド呼び出しは、サブクラスでオーバーライドしたメソッド内で、オーバーライドされる前のメソッドを呼び出したいときなんかは重宝するかなと思ったのですが。もうちょっと他の方法を考えてみて、出来そうだったら実装してみようかなと思っています。

Labels: ,

0 comments:

Post a comment


Programming::JavaScript - 独自のキーワードを定義する


こちらで書いた通り、_superキーワードを使うことで、スーパークラスのコンストラクタを呼び出してやろうという試みをしています。_superキーワードを利用しているメソッドの中身を、toString()によって一度文字列化して、_superをスーパークラスのコンストラクタを格納したメンバ変数名へと置き換えることで、あたかも_superでスーパークラスのコンストラクタを呼び出しているように見せかけています。

一応簡単に、正規表現を使って_superを、コンストラクタを格納しているメンバ変数名へと置換していたのですが(正確にはthis._superを置換)、まぁそりゃ無謀なので。きちんとやることにしました。きちんとやるって何をやるかといいますと、コメントや関数呼び出し等々を判別して、ここは_superキーワードを利用していると解釈した上での置換をやります。それをするためには何をしなければならないか、といいますと、字句解析です。

在ればちょっと嬉しいな、という機能のために字句解析するんかい、とか思いましたが、とりあえず実装してみます。こういう場合、オートマトンで図式化してコーディングしたほうがいいんかな?とか思いましたが、オートマトンがわやくちゃになってきたので、やっぱりゴリゴリif elseでコーディングします。

何も考えずに字句解析を用いて_superキーワード置換を行っていたら、何だか処理が重くなりました。なんと、全ての実行されるコンストラクタを字句解析していました。100回近くになるのかな?各コンストラクタのステップ数はまちまちですが。もちろん、後で不要な字句解析をカットするようにしました。

しっかし、字句解析してやると実行時にコードの改変が行いやすいので、独自キーワードの定義とか色々出来そうな気がしてきました。それをやったから何だという話ですが。ノリ的にはClass with Cみたいな言語系に出来るのかなーとか思ったりします。

Labels: ,

0 comments:

Post a comment


Programming::JavaScript - ドキュメント生成


Doxygenのように、ソースコードにつけられたコメントからドキュメントを自動生成できれば楽なんで、JavaScript向けのドキュメント生成ツールJSDocを使ってみようと思っていました。phpDocumentorやJavaDocなどと似たような記法ができるので、さらっとJSDocのマニュアルを読んで、ソースコードにドキュメントをつけていきました。

で、昨日いざ生成してみようと思ったら。まったくドキュメントが生成されません。まったくというか、少しは生成されたのですが、こちらの意図したとおりに動いてくれてなかったようです。例えば、JSDocが期待するクラスの宣言は、

function MyClass(arg) { ... }

な訳で、方や私が用いた記法は

// prototype.jsを利用しながら
var MyClass = Class.create();
MyClass.prototype = {
initialize : function(arg) {...},
...
};
です。どうもPerlの正規表現を用いてコメントの抽出などを行っているようで、おそらく"クラス名.prototype = "が来ればクラス宣言だ、というのは無いのかもしれません(そんなにじっくり見ていないのでわかりませんが)。

きちんとドキュメント生成してほしいがために、ソースコードをドキュメント生成に適した書き方に書き換えるのは面倒です。ので、JSDocを使うことは諦めました。

Perlコードのドキュメント生成にはpod2htmlとかを使っていたので、仕方なくpodファイルを作っていくことにしました。podファイルで在れば、極端な話(?)ソースコードが無くてもドキュメント生成できますし。doxygenとかは無いとやりづらそう。まぁ、JavaScriptコード中にへたっぴな英語でコメント付けてたので、日本語に直す予定ではありましたから、podファイルをモリモリ作っていこうかと思います。

Labels: ,

0 comments:

Post a comment


Homepage::Update - 久しぶりのリニューアル


そろそろ飽きてきたり、DynamicHTMLを覚えたり、デザインのことを少し勉強したりと、諸事情によりトップページをリニューアルしました。今回は、画像を使わずにどんなデザインで表現できるか?というのをテーマにしてみました。矩形は簡単に表現できますが、斜めのラインや楕円、三角形などは表現できませんね...何か上手いやり方が在るのかも知れませんが。

トップページ上に情報をモリモリ書きたくなかったので、どこがポイントやな?って話になりますが、左サイドの装飾と、左クリックによるポップアップメニュー、そしてそれらにかけられる影のエフェクトでしょうか。プログラム的には、裏でクラスの継承やらをちょっといい感じに自前で実装してたりします。サブクラスのコンストラクタ内で
this._super();

とやれば、スーパークラスのコンストラクタが呼ばれるようにしています。継承するたびに、各スーパークラスのコンストラクタを保存していき、_superで正しいコンストラクタを呼び出せるようにしないといけない箇所がちょっと大変でしたが。

つまり、クラスAのスーパークラスがBで、BのスーパークラスがCだとしておきますと。
// prototype.jsのClass.create()使っているのでinitialize
B.prototype["_super"] = C.prototype.initialize;

として置き、B.prototype.initialize内で
this._super();

を呼ぶとします。Bを継承してAを定義したときに、
A.prototype["_super"] = B.prototype.initialize

として、A.prototype.initialize内で
this._super(); // これはB.prototype.initializeだが...

を呼びます。B.prototype.initialize内でもthis._super()を呼んでいるわけですが、この_superはA.prototype._superの事になってしまっているので、再びB.prototype.initializeを呼んでしまい...無限ループになります。

これを回避するために、FunctionクラスのtoStringメソッドでソースへ落とし込み、_super()を_super0()というように重複しないように書き換えます。もちろん、B.prototype["_super"]にクラスCのコンストラクタを代入するのではなく、
B.prototype["_super"+B.__INHERITANCE_NUMBER] = C.prototype.initialize;
// B.__INHERITANCE_NUMBER = 0

としてやります。この__INHERITANCE_NUMBERは継承回数-1としておき、継承を行うたびにカウントアップしていけば、_superが書き換えられずにきちんと保存されているように見えます。

ソースコードへ落とし込んだ後、Firefoxではeval()してやれば関数オブジェクトを返してくれたのですが、IEでは何も返してくれません。だもんで、無名関数を定義して、そのなかで上記のthis._super0の中身を実行するようなevalを書いてやらなければなりませんでした。この無名関数を、B.prototype["_super0"]に代入してやればOKです。

スーパークラスが何かが分かっているんだから、いちいち_superを自動で定義してやらなくても、手で書けばいいじゃないか、という話になるのですが、こっちの方がエレガントかなぁとか思いまして(笑)変数(名)がクラス(名)のように扱われるので、
var D = C;

とやれば、C言語でいうtypedefが簡単に出来てしまいます。ので、スーパークラスのコンストラクタ呼び出しも、上記のようにスーパークラスに別名をつけるような処理を行っておけば、長いクラス名でも手で打つのは全然面倒ではありません。

まぁ、あくまで自己満足と勉強のためにわざわざ、スーパークラスへのアクセスキーワードを定義したりしているわけです。JScriptだったらsuperキーワードが定義されていたような気も。

ちなみに現在は、スーパークラスのコンストラクタ呼び出し以外にも、スーパークラスのメソッド呼び出しも可能にしたいとか思っておりまして。overrideしたメソッドから、overrideされた元々のメソッドを呼びたい時に、Perlみたく、$obj->SUPER::method()と書きたいわけでして。Firefoxだったら動くのにIEだと動かない!という状況に再び遭遇したので、もう少しこの問題と格闘しそうです。

Labels: , ,

0 comments:

Post a comment


Programming::WebApplication - JavaScript UI Libraryたち


バイト先で重宝しているprototype.js。コレなどを用いるとクロスブラウザなJavaScriptコードが書きやすく、リッチなユーザインターフェースを実現することも割と容易になってきます。

現在サイトのトップページをリニューアルしようと思って、ついでにちょっとだけJavaScriptによるリッチユーザインターフェースライブラリでも作ろうと思い、作り始めました。と、その前に、今ユーザインターフェースライブラリはどれくらい在るんだろうと思って調べてみると。こちらにリンクがまとめてあり、参考になりました(あるSEのつぶやき - Ajaxライブラリまとめ)。まだまだ日本製は少ないわけですが、それにしても豪華な演出をするライブラリがたくさんありますね。ま、正直それはやりすぎでうざいな、っていうのも在るわけですが、そこんとこは好みの問題。あまりネイティブGUIアプリケーションのようなインターフェースに近づきすぎるのもいかがなものかと私は思ったりします。が、ものによっては便利ですよね。今バイト先で作っている事務的なWebアプリなんかだと、こういうリッチインターフェースだと操作性が良くなったりしますし。

別にこれらに対抗しようというわけではありませんが、勉強がてら、私好みの演出が出来る、軽量なユーザインターフェースライブラリを作っていきたいと考えています。ちなみに今できているのは、
  • Windowクラス(MKF.Window)
  • ContextMenuクラス(MKF.Window.ContextMenu)
    • MKF.Windowを継承
  • Timerクラス(MKF.Timer)
    • 有限時間内で一定間隔に任意の関数を実行するオブジェクト指向タイマー
  • 画面効果クラス(MKF.Effect)
    • 任意のDOMオブジェクトの透過度を変化させることにより、フェードイン、アウトさせる
MKF.Window.ContextMenuを要素に関連づけて、その要素上でクリックしたら作製したコンテキストメニューを表示させる。この処理ができて、トップページのレイアウトを少し変更したら、トップページを差し替えようかなとか思います。

Labels: , , ,

0 comments:

Post a comment


Programming::GivingMyHands - お助けプログラミング


サークルで知り合った友人に、在る処理を自動化するプログラムを作って欲しいと頼まれました。Wavelet変換を複数の波形データファイルに適用して、別のファイルへ出力するっていうプログラムです。Wavelet変換を行うCソースはすでにあったので、Perlで任意のディレクトリを参照して、その中にあるファイルを次々と見て変換処理を施してしまえば終いです。

このプログラム、コンソールアプリになるわけですが、ついでだからということでGUIバージョンも作ってあげました。その友人のマシンにはVC++6.0が入っていたのですが、私としてはGUIアプリを作るならVC# Express Editionでやりたかったので、友人のマシンにインストールして作業させてもらいました。そのプログラム自体は、単にグラフィカルなインターフェースでパラメータを取得し、外部プロセス生成して終いなので、これもそんなに時間がかかりませんでした。

これだけの作業で、明日居酒屋でおごってあげると言ってくれ、こっちとしてはなんか悪いなー、っていう感じなわけですが。プログラミングして人の役に立てたっていうのは、何だか気持ちがいいもんだなと感じました。研究の場合、論文書いて、人の役に立った!と実感できるまでっていうのはずいぶん道程がながそうなんですよね…理論家さんよりか、実装屋さんの方が面白いんじゃないかと思う今日この頃です。

Labels:

0 comments:

Post a comment


Programming::JavaScript - 自前ウインドウライブラリ


Bloggerのベータ版に移行してみると、あれこれ変更が在るのに目がいきつつも、過去の投稿データが微妙に移行し切れていないのに歯がゆさを覚えつつあります。

それはそれとして、 ブラウザ上で仮想デスクトップを実現するeyeOSに大変感化された私は、どうにもこうにもブラウザ上でウインドウアプリケーションを実現したくてたまらなくなってきました。

探せばウインドウアプリケーションを作るためのJavaScriptライブラリはあるだろうと思ったのですが、今日探した限りでは特に見つからず。ZKはかなり良さそうだったのですが、Java Servletを使うんかい、と思ってあまりつかう気になれなくなってしまいました。

覚えることが大量に増えず、(サーバ、クライアント両方に対して)軽く、使いやすいものって…と思っているとなかなか見つからず。Drag And Dropに対応だとか、そういうなのはあるんですけどね、たくさん。

Prototype.jsがあれば、割と簡単に自前ウインドウライブラリは作れるんじゃなかろうか、と思い始め、本来の作業目的とはずれつつも、ライブラリ作成に没頭してしまいました。とりあえず、タイトルバーをドラッグすればウインドウもつられて移動し、ウインドウの表示、非表示、サイズと位置変更くらいは出来るようにしておきました。ウインドウの閉じるボタンとかもつけたいな、と、色々やりたいことは湧いてきます、ホント。

Labels: ,

0 comments:

Post a comment

About me

  • I'm mikken
  • From Japan
  • 学生の頃は博士課程で感性情報処理の研究をやっていました。今はベンチャー企業でWeb系システム、看護管理系システムを開発しているSEやってます。
  • My profile

Twitter

Last posts

Archives

Links


ATOM 0.3