Diary/2007-2

1
可視化ツール
2
SWT/MacOSX
3
のんびり
45
XML-RPCでgdbを使う
67
XML-RPCでがんがん通信
8
MICS 0.3.1
9
MICS 0.4.0
10
剣道OB会
11
MICS 0.4.1
1213
MICSでSHプログラミング
14151617
COINSで構造体
1819
子供の面倒をみつつ
20
今日の稽古
21
COINSで構造体をアライメントしない
22
MICS 0.4.5
23
MICS 0.4.6
24
25
Mailer on Eclipse
26
Mailer on Eclipse
2728
Mailer on Eclipse 0.1.3

Diary/2007-2-28

Mailer on Eclipse 0.1.3

mailer-0.1.3.zip
Summary Viewに,サマリを表示するテーブルと
メッセージを表示するStyledTextを同居させていたのだが,
ビューの再表示で,
テーブルの領域が圧迫されてしまうことがあった.
というわけで,SummaryViewにはテーブルだけ表示するように
とりあえず修正.
あと,ついでに

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関係の操作とか,
そういうのをもう少し作りこむ実験をしてみたら
もともとの方針に戻ろうと思っています.
ちなみに,使い方は,次のとおりです.
  1. ダウロードしたファイルを解凍
  2. pluginフォルダの中にあるjarファイルをEclipseのプラグインフォルダにおく
  3. Eclipseを起動(あるいは再起動)
  4. 適当なプロジェクトを作成.General-Projectとか
  5. メーラーを起動するための拡張子が.mailというファイルを追加
    1. このプラグインは,単にエディタなので.
  6. 作成したファイルをダブルクリックすると,「config」「Summary」「Message」「Draft」というタグがしたについたマルチパートエディタが開くはず.
  7. 「config」で適当に設定をする
  8. 「Summary」でUpdateボタンを押してIMAPサーバ上のINBOXをリストアップする
  9. 読みたいメールの行を選択するとメールをロードします.「Summary」の下部のTextエリアか,「Message」でメールを読めます.
  10. メールを書くときは,「Draft」を使います.
    1. 保存機能とかもまだありません.メールを送信しおえると,二度送信しないように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
public void
 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 
 } // SymRoot
machineParamは、coins/MachinParamXXXにある。デフォルトの場合はcoins/Machinparam

Diary/2007-2-19

子供の面倒をみつつ

今日は積極的に子供の面倒をみつつプログラムを書いたり.
どうも,うちの子は,電卓とか携帯電話とかが好きみたい.
あと,マグカップと,箱.将来が心配だ.

MICS 0.4.4

MICS0.4.4に更新.
SimpleProcessor32向けに,
SHと同じソースコードをコンパイルして動かしてみようと思ったものの
構造体まわりやらなにやらで正しく動かない様子.
きっと,これは,MICSではなくて
コンパイラ側(COINS向けのマシン定義ファイルとか)の問題だろう...

Diary/2007-2-17

COINSで構造体

どうやったらalignの制御できるんだろう?
もしかして...できない?

Diary/2007-2-13

MICSでSHプログラミング

MICS上のSHで動作させるサンプルプログラムとして,
とりあえずビットマップ画像のローダーでも書いてみようかと思った.
これに伴い,まずビットマップが表示できるデバイスをMICSに追加.
で,普通にCでプログラムを書いて走らせてみると,
アクセスしないはずのメモリエリアにがんがんアクセスする...
で,原因
  1. リトルエンディアンとビッグエンディアンの違いによる値の間違い
  2. bmpフォーマットの解析に使っていた構造体でalignされて予期しないアドレスの値を使用
1番目の方は,やれやれと思いながら,ntohみたいな関数を用意.解決.
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