Diary/2007-2
Diary/2007-2-28
Mailer on Eclipse 0.1.3
mailer-0.1.3.zipSummary Viewに,サマリを表示するテーブルと
メッセージを表示するStyledTextを同居させていたのだが,
ビューの再表示で,
テーブルの領域が圧迫されてしまうことがあった.
というわけで,SummaryViewにはテーブルだけ表示するように
とりあえず修正.
あと,ついでに
- サマリの表示を,日付の降順で表示するようにした
- クライアントの設定をfinedViewで取得することで,いちいちConfigViewがアクティブにならないよう変更
Mailer on Eclipse 0.1.3での問題点
findViewを使ってConfigViewを呼び出して,サーバや,ユーザ名を取得しているのだが,
その時点でビューがないと取得できないみたい.
メーラーのデフォルトのパースペクティブを使っているときには,
問題ないけどJavaパースペクティブで,
SummaryViewを表示するときには,
現バージョンでは,ConfigViewも開いておく必要がある.
やっぱり,ちゃんと設定は保存するようにしないとだめか?
Diary/2007-2-26
Mailer on Eclipse
昨日に引き続いていじってみた.というわけで0.1.2.mailer-0.1.2.zip
機能の追加としては,
フォルダの一覧を取得できるようになったくらいで
Eclipseプラグインのいろいろを調べるのに時間を費やしてしまった.
ちなみに,いろいろいじってみた結果,
エディタエリアでやるよりは,
ビューにした方がよさそうだったので,一通り変更.
ファイルに関連づけたエディタを開くのではなく,
メールクライアント用のパースペクティブを定義したので
だいぶ便利になった.
ちなみにビューなので,他のパースペクティブのときに
はじっこにおいておくこともできます.
いちおうソースも一緒に同梱していますが,
アクションと表示系はまだまだ綺麗に書ける気がするので,
次の変更に伴って,いろいろ変える予定
ちなみに,次の実装の予定は,
添付ファイル関係をやってから,メールの自動取得とか実装して
メールの作成をTextEditor使ってEmacsバインドでできるようにすること.
まあ,今週末かな.
ほかのビューを取得する
ViewPartを継承して作ったクラスから,他のViewPart(というかIViewPart)のインスタンスにアクセスしたいとき
protected IViewPart getViewPart(String id) { IWorkbenchPage workBenchPage = getSite().getWorkbenchWindow().getActivePage(); try { return workBenchPage.showView(id); } catch (PartInitException e) { MessageDialog.openError(site.getSite(), "Mail Folder", "cannot find configration view: " + e.getMessage()); } return null; }与える文字列は,plugin.xmlで設定したID
パースペクティブの設定
新しいフォルダを,既存のフォルダに付け加えるとき,もともとのフォルダにはいっていたビューは,
勝手に小さくなってくれるので,自分で引いたりしなくていい.
Eclipseのキーバインド
TextEditorは,AbstractDecoratedTextEditorのinitializeKeyBindingScopes() で設定できるようだけど
Diary/2007-2-25
Mailer on Eclipse
Eclipse上のプラグインとして動作するメーラーを作ってみた.mailer-0.1.1.zip
(↑0.1.0から更新.MIMEメールもとりあえず表示するようにした.)
といってもメール関係の処理は,JavaMailを使っているので
JavaMailのEclipseラッパーといったかんじかな.
ちなみに,IMAPしかサポートしていません.
というかさくらでしか試せていない.
本当は,もちょっと違うコンセプトのものが作りたかったのだけど,
こうしたらどうなるのかな,という試行錯誤を繰り返していたら
こうなってしまった...
もっとも気に入らないところは,
メール作成領域をTextで作ったら,Emacsバインドではないこと.
なにかの設定かなぁ?これじゃ意味ないじゃないか.
というわけで,添付ファイルまわりとか,ローカルでのキャッシュとか,
フォルダ操作とか,そのほかIMAP関係の操作とか,
そういうのをもう少し作りこむ実験をしてみたら
もともとの方針に戻ろうと思っています.
ちなみに,使い方は,次のとおりです.
- ダウロードしたファイルを解凍
- pluginフォルダの中にあるjarファイルをEclipseのプラグインフォルダにおく
- Eclipseを起動(あるいは再起動)
- 適当なプロジェクトを作成.General-Projectとか
- メーラーを起動するための拡張子が.mailというファイルを追加
- このプラグインは,単にエディタなので.
- 作成したファイルをダブルクリックすると,「config」「Summary」「Message」「Draft」というタグがしたについたマルチパートエディタが開くはず.
- 「config」で適当に設定をする
- 「Summary」でUpdateボタンを押してIMAPサーバ上のINBOXをリストアップする
- 読みたいメールの行を選択するとメールをロードします.「Summary」の下部のTextエリアか,「Message」でメールを読めます.
- メールを書くときは,「Draft」を使います.
- 保存機能とかもまだありません.メールを送信しおえると,二度送信しないようにToフィールドが空になります.
Diary/2007-2-23
MICS 0.4.6
最近MICS更新日記と化しているなあ.まあ,ほぼ毎日いじってるからしかたないか.
とにかく,MICSを0.4.6に更新.
一番目立つ変更は,SimpleProcessor32で
浮動小数演算(変数はfloat型のみ)ができるようになったこと.
いいサンプルプログラムはまだないけど.
これに伴い演算命令の部分なんかのコードをいろいろ書き直してすっきり.
アセンブラ側の仕様のせいもあって,
浮動小数点は,4バイトのバイト列で,
アクセスするとIEEE754でデコードして
2バイト幅でアクセスすると,単にintをfloatにおきかえて保持するように.
いろいろ例外処理をやらなきゃいけないところを無視しているので
これは,次の課題.
というか次のバージョンではJavaの例外を
プロセッサへの割り込みとして処理できるようにするつもりなので
そこで一緒に実装する予定
ちなみに,ソースコードが欲しい人はメールください.
Diary/2007-2-22
MICS 0.4.5
MICSを0.4.5に更新.MICSのサンプルの一つsample/simpleprocessor32-bmpの
bmploader.cで,ビットマップ画像を
うまく解析して表示できなかった問題が解決.
ちなみに同じプログラムをSHのGDBを利用して動作させると,
10分以上かかるのに対し,SimpleProcessor32だと数秒.
1.5MIPSくらいで動作してくれて(CoreDuo 1.66GHz上で)結構うれしい.
ずーっとコンパイラ側(アセンブラ側)の問題だと思っていたけど
実際にはプロセッサ側の単純なバグでした.
ついでに,Wallet/COINSにno-alignの指定をする
チェックボックスを追加したり,
SimpleProcessor32でMicsViwebleを実装して
レジスタの内容をテーブルで表示できるようにしたり.
追い出しコンパ
無線研の追い出しコンパ.だいぶ知った人がいなくなってしまう.
おもしろい後輩と,いろいろ話せて楽しかった.
gdb
gdb --interpreter=でインタプリタを指定できる
gdb --interpreter=miなるほど.
annotationとどっちが便利かな.
Diary/2007-2-21
COINSで構造体をアライメントしない
結局COINSでてっとり早く構造体をアライメントしないようにするために、
オプションでアライメントの計算を防ぐことにした.
もっとうまくやるためには,
gccのattributeのようにソースコード中に書いたものを
HIRの段階までひっぱらないといけないのだと思うのだけど...
ちょっといろいろ面倒そう.
とりあえず,no-alignオプションをつけるパッチ.
フラグみて,該当する箇所をアライメント計算をするかしないか
振り分けているだけだけど.
coins-1.4.1.1-ja-no-align.patch
ちなみに,大元のオプションのところに登録していない
野良オプションなので警告がでます.
ワークショップ採録
無事採録通知が.しかし,通知予定日が21日頃となっていたものの
なかなかメールがこなくて随分やきもきしてしまった.
Diary/2007-2-20
今日の稽古
中心をとるために,意識して左の方に踏み込むように練習.それなりに中心をとることができたかな.
ただ意識しすぎて体が硬くなっているのか,
相手のすばやい動きに追従するのが若干困難.
あとは,左足の遊び癖もなおさないと.
COINSでの構造体
- coins/hir2lir/ConvToNewLir 1854
case HIR.OP_ARROW: return convertLoadMember (convertNode(((PointedExp)pHir).getPointerExp(), cc), ((PointedExp)pHir).getPointedElem(), type, cc);
- coins/hir2lir/ConvToNewLir 2909
/** Convert expression loading x.member / x->member. **/ private ImList convertLoadMember(ImList base, Elem elem, Type type, ConvContext cc) { String ltype = htype2ltype(type); String inttype = hkind2ltype(Type.KIND_INT); String ptrtype = hkind2ltype(Type.KIND_POINTER); long offset = elem.evaluateDisp();
- coins/sym/ElemImpl 89
public long evaluateDisp() { if (fDispIsSet) return fDisplacement; if (fDispExp != null) { fDisplacement = fDispExp.evaluateAsInt(); fDispIsSet = true; return fDisplacement; }else { symRoot.ioRoot.msgRecovered.put(1014, "Displacement is not evaluable " + getName()); return 0; } } // evaluateDisp
- coins/sym/ElemImpl 109
public void setDisplacement( long pDisplacement ) { fDisplacement = pDisplacement; fDispIsSet = true; }こういう構造体を与えた時
struct bitMapFileHeader{ unsigned short bfType __attribute__((packed)); unsigned int bfSize __attribute__((packed)); // 2 unsigned short bfReserved1 __attribute__((packed)); // 6 unsigned short bfReserved2 __attribute__((packed)); // 8 unsigned int offBits __attribute__((packed)); // 10 };setDisplacementの後のElemImplのダンプ結果
bfType 0 disp 0 bfSize 0 disp 4 bfReserved1 0 disp 8 bfReserved2 0 disp 10 offBits 0 disp 12このsetDisplacementの呼出元は
- coins/sym/StructImple 223
}else { // Not a bit field. if (lBitFieldBegin) { // Previous fields are bit field. lSize = lContainingObjectDisplacement + (lBitFieldSumWithinWord+7) / 8; lBitFieldSumWithinWord = 0; } lBitFieldBegin = false; lDisplacement = lSize + lElemType.getAlignmentGap(lSize); lContainingObjectDisplacement = lDisplacement; lElem.setDisplacement(lDisplacement); //## lElem.setDispExp( ... ); // REFINE lSize = lDisplacement + lElemSize; lElemAlignment = lElemType.getAlignment(); if (lElemType.getFlag(Sym.FLAG_INCOMPLETE_TYPE)) { lIncomplete = true; lUniformSize = false; } if (! lElemType.getFlag(Sym.FLAG_UNIFORM_SIZE)) lUniformSize = false; if (! lElemType.isSizeEvaluable()) lSizeIsSet = false; }この中のlElemTypeはTypeImplを継承したクラスで
- coins/sym/TypeImpl 468
public int // to be refined getAlignmentGap( long pPrecedingSize ) { int lAlignment, lAlignmentGap; long lResidue; lAlignment = getAlignment(); lResidue = pPrecedingSize % lAlignment; if (lResidue == 0) lAlignmentGap = 0; else lAlignmentGap = (int)(lAlignment - lResidue); return lAlignmentGap; } // getAlignmentGap
- coins/sym/TypeImpl 468
public int getAlignment() { int lAlignment; //##67 if (fTypeKind == Type.KIND_SUBP) { //##67 lAlignment = ((SubpType)this).getReturnType().getAlignment(); //##67 }else { lAlignment = Type.KIND_ALIGNMENT[fTypeKind]; // STRUCT, UNION, VECTOR have their own method. //##67 } return lAlignment; }
- coins/sym/TypeImple 550
setStaticTable(MachineParam pMachineParam) { for (int i = 0; i < KIND_ALIGNMENT.length; i++) { //##52 KIND_ALIGNMENT[i] = pMachineParam.getAlignment(i); //##52 } //##52 /* //##52
- coins/sym/SymRoot 304
ioRoot.symRoot = this; //##12 ((SymImpl)sym).setParameters(machineParam, sourceLanguage); //##51 (new TypeImpl(this)).setStaticTable(machineParam); //##51 } // SymRootmachineParamは、coins/MachinParamXXXにある。デフォルトの場合はcoins/Machinparam
Diary/2007-2-19
子供の面倒をみつつ
今日は積極的に子供の面倒をみつつプログラムを書いたり.どうも,うちの子は,電卓とか携帯電話とかが好きみたい.
あと,マグカップと,箱.将来が心配だ.
MICS 0.4.4
MICS0.4.4に更新.- 32bitレジスタを扱うSimpleProcessor32を追加
- SH-GDBのバグの修正
- アセンブラなどのツールの外部への切り出し
SHと同じソースコードをコンパイルして動かしてみようと思ったものの
構造体まわりやらなにやらで正しく動かない様子.
きっと,これは,MICSではなくて
コンパイラ側(COINS向けのマシン定義ファイルとか)の問題だろう...
Diary/2007-2-17
COINSで構造体
どうやったらalignの制御できるんだろう?もしかして...できない?
Diary/2007-2-13
MICSでSHプログラミング
MICS上のSHで動作させるサンプルプログラムとして,とりあえずビットマップ画像のローダーでも書いてみようかと思った.
これに伴い,まずビットマップが表示できるデバイスをMICSに追加.
で,普通にCでプログラムを書いて走らせてみると,
アクセスしないはずのメモリエリアにがんがんアクセスする...
で,原因
- リトルエンディアンとビッグエンディアンの違いによる値の間違い
- bmpフォーマットの解析に使っていた構造体でalignされて予期しないアドレスの値を使用
2番目の方にはなかなか気づかなかった.
そして,MICSでプログラムを走らせる場合のデバッグの難しさを痛感.
これどうにか解決しないとなぁ.
ちなみに,解決方法は,gccの場合,構造体にattributeつけて
struct bitMapFileHeader{ unsigned short bfType __attribute__((packed)); unsigned int bfSize __attribute__((packed)); unsigned short bfReserved1 __attribute__((packed)); unsigned short bfReserved2 __attribute__((packed)); unsigned int offBits __attribute__((packed)); };やれやれ.
Diary/2007-2-11
MICS 0.4.1
MICSをアップデート.主な変更点は,
アーキテクチャ構成をリストではなく絵で可視化するようにしたことと
DirectMemoryAccessController,つまりDMAをちゃんと追加したこと.
構成したアーキテクチャの可視化は,こんな感じに
定義したノードと接続関係を図示していて,
今までよりわかりよくなった..はず.
各ノードをクリックすることで,
データのロードや「View」などノードへの操作を実行することができます.
COINS for MICS
といっても自動並列化ではなくて単にSimpleProcessor向けのアセンブラを生成するもの.
0.3.1から0.4.0の変更でつかえなくなっていたので,更新.
COINSを使ってC言語でSimpleProcessorプログラムを書く
MICS0.4.2
と思ったら内部のデータ処理ルーチンでバグを発見.SHのGDBを使う人に関係があるバグです.
Diary/2007-2-10
剣道OB会
でした.結構へとへとになってしまった.ちょっと間があいたせいか,今ひとつ手足がうまく動かなくて残念.
練習の後,同級生から,打ち込みのときに,
体を内側にしぼるような意識をしているという話を聞いた.
なるほど,それなら体が右に流れずにまっすぐ踏み込めるかも,と.
次から意識してみよう.
Diary/2007-2-9
MICS 0.4.0
http://www.sgn.ip.titech.ac.jp/miyo/mics/MICS 0.3.1で一通りの動作を確認したので,
従来から引きずっていた変な仕様を改善.
この変更に伴い,たとえば,
従来メモリのアドレスを16bitの配列のインデックス値で指定していたのを
バイト単位で指定できるようになりました.
逆にSimpleProcessorでは,アドレス計算が面倒になったかもしれない...
# 2倍するだけだけど.
結構いろいろなところで変な仕様に依存していたり
回避するために変なことをしていたりしたので,一苦労でした.
とりあえず完成.
まだSimpleProcessor用のCOINSバックエンドはできてません.
SHのGDB使えるようになったので,
いまいちSimpleProcessorのプログラムをCで書く気になれないし,
このまま対応しないかも.
Diary/2007-2-8
MICS 0.3.1
マルチシミュレータのMICSのバージョン0.3.1をリリース.SHのGDBをフックしたメモリ操作の代行を一通り実装しおえたので,
複数のSHプロセッサで変数を共有するような計算や
SHプロセッサとリコンフィギュラブルプロセッサの組み合わせでの
シミュレーションもできるようになりました.
また,gdbがローカルにない場合,
リモートのコンピュータで起動したgdbサーバとXML-RPCで
通信してデバッグできるようになりました.
Diary/2007-2-7
XML-RPCでがんがん通信
するプログラムを作っていたら,クライアント側で,java.net.BindExceptionAddressが発生して固まる.
サーバ側では,それに対応して,
org.apache.xmlrpcParseFailedが発生.
でも,何度かアクセスを繰り返すと,うまくいく.
どこのバグだ?
Diary/2007-2-5
XML-RPCでgdbを使う
いろいろなアーキテクチャをテストするためのというか研究のターゲットシミュレータ環境としてMICSというのを作り中.
...なのだけど,gdbと連携してCPUの動作をシミュレーションするための
モジュールの作成のデバッグが結構面倒だった.
というのも,MICSは,WindowsのEclipseで書いていて,
対象としている各種アーキテクチャ向けのgdbは,
同じコンピュータのcoLinux環境で動作しているので,
いったりきたりの手間が,なかなか馬鹿にならない.
というわけで,gdbをXML-RPCでラップしてみたところ,これがなかなか便利.
XML-RPCのコードでは,
http://ws.apache.org/xmlrpc/xmlrpc2/
を利用しているので,やりとりできる型は,
http://ws.apache.org/xmlrpc/xmlrpc2/types.html
に限定されるけど,適当にラップすればいい話.
byte[]配列は,エンコード/デコードして送受信してくれるので
gdbでデバッグする対象コードをサーバに転送することもできる.
XML-RPCみたいな疎な結合で切ってみると,
関係ないはずのクラス同士が,
意外に密な結合を必要をしているのがあきらかになって
自分の設計の悪さがよくわかる.
...と,作ってみたものの,
サーバ側ではgdbを実行するために
与えられたパスの子プロセスを生成しているので,
悪意のあるアクセスをされるとかなり危険かも.
一応,コマンド末尾がgdbでない場合とパス内に空白がある場合には,
子プロセスを生成しないようにはしているけど...
と書きながら,かなり危ないことを思いついてしまった.
Diary/2007-2-3
のんびり
YacovでLIRのデータ依存を解析の結果を表示できるようにしたり,近所の大型雑貨店でぬいぐるみ買ったり.
Diary/2007-2-2
SWT/MacOSX
Java1.5にアップデートしたコンピュータで,SWT使っているアプリケーションがException in thread "main" org.eclipse.swt.SWTError: Not implemented [need SWT compatibility pack from Apple] (java.lang.ClassNotFoundException: apple.awt.CHIViewEmbeddedFrame)というエラーで動かなかったので,
compatibility packをダウンロードしてインストール
Diary/2007-2-1
可視化ツール
コンパイル中のデバッグのために簡単なデータ依存やフロー依存の可視化をしたくなったので
GRINTEdit使って,そのテスト.
http://www.sgn.ip.titech.ac.jp/miyo/yacov/
とりあえず,COINSで生成したスナップショットの中の
CFGのラベルをXML-RPC使ってGRINEditに描画させてみただけ
Copyright (c) 2001-2008 Takefumi MIYOSHI, All rights reserved