Diary-nagataka-シリコンバレーで働きたい!という夢への日々

外資ITで働くエンジニアが趣味や日々の事など書いてます(技術の話は別ブログ http://wanna-be-geek.seesaa.net/ )

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告
  3. このエントリーを含むはてなブックマーク

共同作業での「保証」の大事さ

プログラミングの話。

ちょっと社員さんとのやり取りでSingletonというのを教えてもらったので、研究室にあったデザインパターンの本でシングルトンの部分だけ読んでみた。

シングルトンというのは、そのクラスのインスタンスが一つしか作られないようにしてある実装の事だそうな。

サンプルコードをそのまま記載すると以下

public class Singleton {
  private static Singleton singleton = new Singleton();
  private Singleton(){
    System.out.println("インスタンスを生成しました");
  }
  public static Singleton getInstance(){
    return singleton;
  }
}

privateなコンストラクタとprivateかつstaticなインスタンス、そしてpublicなゲッタが用意されていますね。

これだと、外部からコンストラクタを呼ばれて新たなインスタンスを作られる事を不可能にできるんですね。

社員さんから教えてもらった時は「ほぇ~なるほど」と思いました。


で、後で本で確認をした時に、その本の説明文が印象に残りました。

インスタンスは一つしか作らないし、作りたくない(システム中に一つしか存在しないものを表現したい時)

「プログラマが注意しているからインスタンスが一個しか生成されない」のではなく
指定したインスタンスが絶対に一個しか存在しない事を保証したい
インスタンスが一個しか存在しない事をプログラム上で表現したい


場合に用いるパターンだと。

プログラマが注意してnewしないようにすれば、コンストラクタをprivateにする必要は無いのだけど、そうではなくて、どうしたってインスタンスは一つしか生成されないという事を保証する。

この大事さ。

スキルも経験もバラバラな大人数で協力して開発を進めて行く上で、こういう「保証」って凄く大事なんだろうなと思った。

弾さんが
「頑張らなきゃいけないシステムなんてクソ。頑張らないでも回るのが本当に良いシステム」
と言っていたのを思い出した。

ここで言うと、「絶対に二回以上newしないようにプログラマが『頑張って』注意する」というのは明らかにクソな運営だと。

こういう工夫一つで、そういう無駄な頑張りを不要にできる。

そんな知恵を見ました。

デザインパターンって面白いカモ!もっと読んでみようかな。

スポンサーサイト
  1. 2009/10/24(土) 01:15:54|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. このエントリーを含むはてなブックマーク

SOOTインストール記

夕方から研究室へやってきて研究の実行環境を整えています。

やっと動いてくれたので経過をメモ、以下は誰か関係ある人が見て役に立ててくれたらいいなと。


TODO:
SOOTのインストール

研究で使う予定のSOOTというフレームワークをインストールします。

SOOTの本家ページはコチラ
このSOOTといのはJavaの解析ツールらしい。

論文を読んでいると、自分が新たにやろうとしている畑ではやたらと名前が出てくるので前々から気になっていました。

自分も論文を読んで行く中で少しずつ方向が見えて来た(?)ので、論文読みだけじゃなくて作業にも取りかかろうかなと考え、コイツをインストールすることに。


まずは本家ページからSOOTをダウンロードしてきます。

今回自分はsootall-2.3.0.jarを取って来ました。

"To install it you must unjar(untar) it, and add the classes directory soot-2.3.0/soot/classes to your CLASSPATH. The Jasmin and Polyglot classes jar files, or classes directories, must also be added to your CLASSPATH"
とあるので、一先ずunjarします

$ jar xf sootall-2.3.0.jar

で、クラスパスを追加しなければいけないので追加

$ CLASSPATH=.:/Users/nagataka/soot-2.3.0/lib/sootclasses-2.3.0.jar:/Users/nagataka/polyglot-1.3.5/lib/polyglot.jar:/Users/nagataka/jasmin-2.3.0/lib/jasminclasses-2.3.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Classes/classes.jar; export CLASSPATH
(環境はMacOS10.5でbashです)

ここで完全にハマりましたorz

一番最初のカレント( . )の指定を忘れるとハマります

理由はコチラのサイトで判明


最初は
$ CLASSPATH=/Users/nagataka/soot-2.3.0/lib/sootclasses-2.3.0.jar:/Users/nagataka/polyglot-1.3.5/lib/polyglot.jar:/Users/nagataka/jasmin-2.3.0/lib/jasminclasses-2.3.0.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Classes/classes.jar; export CLASSPATH
としていたのだけど、これだとカレントが見えなくなってしまうみたい。
だからNoClassDefFoundErrorって怒られたのね。。

一先ず上記正解パスを通し、
$ java soot.Main --help
と入力したらヘルプが表示された!やった!!


さて、次はいよいよ実際にjavaクラスを喰わせてみよう♪

お決まりのHelloWorldを作成し
$ java soot.Main -f jimple HelloWorld
と入力すると...

Soot started on Sat Jul 11 21:29:40 JST 2009
Transforming HelloWorld...
Writing to sootOutput/HelloWorld.jimple
Soot finished on Sat Jul 11 21:29:41 JST 2009
Soot has run for 0 min. 1 sec.


キタ!!

さっそくsootOutputへ移動してみるとHelloWorld.jimpleというjimple(ジンプル)ファイルがいました!

jimpleっていうのは、「Javaと相互変換可能な3番地コードからなる中間言語」で、Javaに比ベプログラム解析や最適化が適用しやすいんだそうな。
だからこの分野ではよく出てくるのね。

さっそくjimpleファイルを見てみるとこんな感じ

1 public class HelloWorld extends java.lang.Object
2 {
3
4 public void ()
5 {
6 HelloWorld r0;
7
8 r0 := @this: HelloWorld;
9 specialinvoke r0.()>();
10 return;
11 }
12
13 public static void main(java.lang.String[])
14 {
15 java.lang.String[] r0;
16 java.io.PrintStream $r1;
17
18 r0 := @parameter0: java.lang.String[];
19 $r1 = ;
20 virtualinvoke $r1.("HelloWorld");
21 return;
22 }


おぉう、なんか色々とやっておる...

一先ずここまで出来たので、後はまた月曜以降にやる事にして今日は帰宅します~

これからは論文読みばかりじゃやなくて実際に手を動かすフェーズに少しずつ突入だな=3

このエントリーには適宜追記してログを残していこうっと。
  1. 2009/07/11(土) 21:52:24|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. このエントリーを含むはてなブックマーク

ミスから

Javaでリストを作ってチェイン法のプログラム書いてたんだけど、リストの中身を表示しようとして、本来なら
System.out.print(tmp.key+"→");
とかくところを、間違って
System.out.print(tmp+"→");
とかいてしまった。

そうしたら、実行結果として
node@b02e7a→
node@bb6ab6→node@5afd29→
node@a2961b→node@2d03f9→
node@5ffb18→node@5dfd77→
という表示がされた。

なるほど、内部では参照先はnode@b02e7aという風に表現されてるんだ。

ミスのおかげで、なんだかちょっとした発見をしたような気分^^
  1. 2007/07/28(土) 17:27:33|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. このエントリーを含むはてなブックマーク

Java覚え書きpt.2

今日は図書館で勉強をしてきました(といっても午後行ってちょっとだけですが)。
やっぱり図書館に行くと、逃げられないおかげで勉強できますねw
家にいるとついネットとか音楽聞いたりに逃げてしまうので、、
受験シーズンも終わったし、平日ということもありかなり空いていてよかったです。
これからバイトが無い平日は図書館でやろうかなぁ、家だとけっこうダラダラしてるしorz


今日触れた新しいモノをメモ
主にJavaWorldで調べさせてもらいましたm(__)m

1、Comparator
Comparatorオブジェクトは、インタフェースjava.util.Comparatorをimplemetsしたクラスのインスタンス。
大小関係を定義できるっぽい。
順序付けをする際に、順序付けの規則の役割をする。

並べ替えの規則をComparator型のオブジェクトに実装し、それをソート用のメソッドに渡すことで、全体順序づけが実現される。


内部にIntegerオブジェクトを保持するListを昇順または降順に並べ替えたい場合


private IntegerComparator(int order) {
this.order = order;
}


う~ん、数値を昇順・降順に並べ替えたり、文字列を辞書式に並び替えたりできるんだね。
便利かも。
他にも使いどころはあるのかな?
まだ俺なんかは十分有り難みをわかれるレベルじゃないっすね。


2、ジェネリックス
Genericsの基本的なアイデアは、型の部分を変数にして抽象化するというもの。

// 要素がInteger型のリスト

interface ListOfInteger {
boolean add(Integer o);
Integer get(int index);
…略…
}

// 要素がString型のリスト
interface ListOfString {
boolean add(String o);
String get(int index);
…略…
}




interface List <E>{
boolean add(E o);
E get(int index);
…略…
}


インタフェースの名前の部分に現れている<E>、これを「型引数」と呼ぶ。

//要素がInteger型のList
List<Integer>

要素がString型のList
List<String>


実際のプログラムは
List<Integer> list
= new ArrayList<Integer>();
list.add(new Integer(1));
Integer x = list.get(0);
のようになる。

うん、これはなんだかすごい気がする!
と説明を読んでるときには思ったんだが…やっぱり実際に使うシーンが想像できないやw
まぁ知っておくにこした事はないですね。
いずれ有用性がわかれるようになりたいです^^;
いつかこの日記を読み返したときに、「ああ、あの頃は全然知らなかったなぁ、新しい事を覚えても、実際には全く使いどころが想像できてなかったなぁ、アフォだったなぁ」と言えるようになってたいですな~

( '<'と'>'が全部全角になっているのは気にしないでください--; )
  1. 2007/03/17(土) 01:49:51|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. このエントリーを含むはてなブックマーク

Java覚え書き

配列・インスタンスは参照渡し(今更知ったのかよ!というツッコミは無し…)

最近知った、J2SE5.0で加わった新機能
Scanner:数値とかを扱う際にはBufferedReaderを使うより便利だ!

printf:CでおなじみのprintfがJavaに装備されてた。書式指定・変換処理が非常に便利!

(あ、それと、気づいたかと思いますが、紹介した本等にAmazonのリンクを貼ってあります、ページの右側にもリンクが貼ってあるんで、買い物等是非利用してみてくださいな~)
  1. 2007/03/05(月) 01:20:10|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. このエントリーを含むはてなブックマーク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。