2012年2月10日金曜日

Seleiumを動かすときの注意!

こんなエラーが出ることがある。
org.openqa.selenium.WebDriverException: Unexpected error launching Internet Explorer. 
Protected Mode must be set to the same value (enabled or disabled) for all zones. (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 160 milliseconds
これって、保護モードの状態を一緒にして欲しい!って言っているので。
インターネットオプションのセキュリティタブの保護モードを均一にすると動いた。
制限付は見ていないみたいなので、全部【中高】にして、保護モードをOFFると動いている。
何でや?って言う所は未調査。偉い人教えて下さい。

Selenium2.Xを動かしてみる

Seleniumと遊んでみたので、その際の備忘用のポスト

1: SeleniumRCをダウンロード
2: インストールは特に必要ない。Javaで実行なので、jarコマンドでさくっと実行。
  java -jar selenium-server.jar
これだけでSeleniumServerが起動する。
3: 今回はMavenを使わずにやっているので、依存関係は結構面倒。
Seleniumの公式から、Selenium Client DriversのJavaリンクを押下してダウンロードする。
 selenium-java-2.19.0.jar
 とlibs以下を全部放り込む。
4: 時間がかかるだろうに、コーヒーでも飲んでしばし待つ。
5: 後は、普通に書いていけばガツンガツンテストが出来る。
まあ、とりあえずは、ここまで。

2011年7月25日月曜日

Eclipseのplugin開発時にファイルを読み込むには

テンプレートからの置換とかしたいのであれば、pluginプロジェクト内に
格納している設定ファイルなんかの情報を読み込みたかったりするはず。
そのときには下記の様にかけば開発できる。Eclipse3.6上での話。
最近出た3.7とかでは未検証だし、その他のバージョンでも試して無いので
そこら辺はあしからず。

ソースコード

Bundle bundle= Platform.getBundle("pluginID");
 URL url1 = bundle.getEntry("template/sample.txt"); //ここでEclipse上で解決できるPATH
 URL url2 = FileLocator.toFileURL(url1); //ここで、絶対的なファイルパスになる。
 FileReader reader = new FileReader(url2.getPath());
 BufferedReader br = new BufferedReader(reader);
 String line = br.readLine();
 while(line != null){
   //何か処理。
 }

ファイルの構成

/  --> プロジェクトRoot: 作ったプロジェクト名。
     |__bin
     |__icons
     |__template
          |__ sample.txt //今回はこのファイルにアクセスしたかった。
     |__src
     |__plugin.xml
     |__build.properties 

export時には

必ず、template/もいれないとjarの中に入らない(これは当たり前か。。。)
いやぁ、嵌った。嵌った。。。
同じ事で嵌らなくても良いように備忘の為に書いときます。

2011年7月19日火曜日

どんな形でも返却したい。総称型の使い方の備忘

  protected  T getTransitBean(Class clz) {
    SomeType someType= (SomeType) someObj;
    return someType.getBean();
  }
基底Bean
 public class SomeType {
   private T bean;
   public void setBean(T bean) {
     this.bean= bean;
   }
   public T getBean() {
     return this.bean;
   }
 }

2011年6月16日木曜日

Prototype.jsでmixIn的なことに今更チャレンジしてみる

今回はちょぅとMongoDBを離れて、JavaScirptの話。
もっとJavaScriptをゴリゴリ書けるようにならないとなぁと思っている今日この頃。
何か微妙だよなぁと思っている所を積極的に解決してみる事にした。
共通的な機能をJavaScriptの中で持たせたい時。勿論、別のJavaScriptをゴリゴリ読むでもよいんだけど、
あまりにもそれでは保守性も可読性も悪かろうにということで、下記の様な感じ。
今回はデバック的な機能(JavaでいうtoString()的なもの)を横断的に持たせたいなぁという話。

ソースはPrototype.jsベースです。
//大元のクラス。
var Component = Class.create({
 //constructor
 initialize : function(name){
  this.name = name;
 },
 
 hello: function(){
  alert("hello," + this.name);
 },
});

//こんな感じのclosureをmixInの対象にしてみる。
var JsLog = function(){
 var log = []
 function record(message){
  log.push(message);
 }
 
 function dump(){
  alert(Object.inspect(log));
 }
 
 function clear() {
  log = [];
 }

 return {
  record : record,
  dump: dump,
  clear : clear
 }
}();

//こういう感じでmixInも出来る。
//var ComponentPlus = Class.create(Component,JsLog);
//Prototype的にはこっちを推奨。もちろん、中身は自分で連想配列的に書いてもオK。
Component.addMethods(JsLog);
なるほどなぁ、JavaScript奥深し。というかPrototype.js奥深しかもしれないけど。
もっと良い方法あれば教えて下さい。

2011年6月10日金曜日

MongoDBと戯れる その2

今回は覚書、読むだけじゃ覚えないので、書きながらサマリーしてみる。

そもそも概念がちょっと違う。

普通にデータベースを持つ

Collection

CollectionというのがRDBMSでいうところのテーブルに値する。
  db.students --> studentsというcollectionが存在する。
内部表現はJSON形式であらわすことができる。実はBSONという形式ぱっと見た感じ、JSONだけどちょっと違う。
よりオブジェクト指向的な形になっている。
 db.students
  name: 'yas',
     addressHd: {
      address: XXXXX,
      city: Edogawa,
      prefecture: Tokyo
     }

参照

例えば、別のcollectionに対して参照を持つ場合はfor_【collection名】と書けばよい。
 db.students
    name: 'yas',
    for_course:  #参照をあらわしている。

 db.course
  name: 'Biology'
参照するよりも、埋め込んだほうが早いらしい。これは非正規化して速度稼ぐのと同じ理屈。
 1:Mongo的な非正規化
  db.students
    name: 'yas'
    address: 'XXXX'
    score: 
     { name: 'biology',
     grade: 4.0},
 
 2:Mongo的な正規化
  db.students
    name: 'yas'
    score: 
      { for_cource
          grade: 4.0}
    
    db.cource
      name: 'biology'
呼び出し側を考えれば簡単
1の場合: print(student.cource)
2の場合: print(student.score[0].for_course.name)
--> 内部的には、student.scores[0].for_course = db.courses.findOne({_id:_course_id_to_find_});
こういうノリのよう。
なので、場合によって使い分けたほうが良いはず。
非正規化する際、Gridとかのデータとかは出来上がったものを持てば良いだけなので問題ない。
それ以外の属性に依存する形の場合にはちょっと考えたほうが良い。2でガツガツ呼ばれる(1000)とか来ると
といくらキャッシュとはいえ1秒以上かかってしまうので。そこら辺は良く考えて!!だそうだ。

一般的なルール

  • ノード的にトップレベルのものは独自のコレクションを持つほうが良い
  • LineItemは(要するに詳細情報とかは)埋め込んどけ。
  • Object contains A の形になる場合は埋め込んどけ。
  • Many to Many なる場合はどうしようもないので、参照で持つしかない。
  • 集計とか統計とかするのであれば埋め込んどかないと時間かかって仕方ない。
→要するに基本的には埋め込んどけ。MtoMをどうしても表現しないといけなくなったときだけ参照使え。

indexはRDBMSと同じノリで張れば大丈夫。

  • _idは勝手にindexが張られている。これはputした瞬間にMongoが突っ込んでくれる。サロゲートキー
  • sortされるところはindexはっといたほうが良い→これは要検証。

tree表現とかも使える。


結構用意されていて、treeとしても使える。
tree情報のキャッシュには良いかもしれない。

デフォルトポート

27017

シェル

Mongoがそれにあたる。JavaScriptなシェル。これ面白い

制約

32bit環境においてstorageの限界は2Gbyteまで。

ちょっと試してみた結果

環境WindowsXP 32bit CPM core2 DUO Memory:4G
使用言語MongoDBのJavaドライバー経由でJava
対象件数3万件
ローカルストレージの変遷72,920byte
実行時間5891ミリ秒
使用メモリ量70Mぐらい

実験に使ったコード

ちなみにthis.excは適当に書いてみた。ラッパー
 long t1 = System.currentTimeMillis();
    System.out.println("計測開始!!" + t1);
    for (int i = 0; i < 30000; i++) {
      DBObject doc = new BasicDBObject();
      String str = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
      doc.put("name", str);
      doc.put("name_1", str);
      doc.put("name_2", str);
      doc.put("name_3", str);
      doc.put("name_4", str);
      doc.put("name_5", str);
      doc.put("name_6", str);
      doc.put("name_7", str);
      doc.put("name_8", str);
      doc.put("name_9", str);
      doc.put("name_10", str);
      doc.put("name_12", str);
      doc.put("name_13", str);
      doc.put("name_14", str);
      doc.put("name_15", str);
      this.exc.insert(doc);
    }
    long t2 = System.currentTimeMillis();
    System.out.println("結果:" + (t2 - t1) + "milSec");
    System.out.println("レコード数" + this.exc.getCount());
まだまだわからないことだらけだ。もっと検証を進めていこう。

2011年6月9日木曜日

MongoDB覚え書き

これは良いかもしれない!jarもあるし、windows版もある。
しかも、sortも出来るし、searchもOK。尚かつ、出力形式もJSONな感じだし。
これは、僕の為に作ってくれたのか!!!ぐらい有り難いです。
というわけで、色々メモしておこう。

ノリ的にはSqlite

   //Mongoサーバに接続する。この場合はlocalhost
   Mongo mongo = new Mongo("localhost");
  //使用するdatabaseを選択する。無ければ作ってくれる。
   DB db = mongo.getDB("myDb");
  //ここで対象のカラム群を選ぶ。無くてもOK.ノリ的には、tableという感じ。
   DBCollection coll = db.getCollection("testCol");
後は、このcollに対して操作をしてくのが基本。

データをinsertする。

  //こいつがその名の通り、基本のオブジェクト。
  BasicDBObject doc = new BasicDBObject();
  //insertするのは、他のkvsとかと同じ様にputでOK。
  doc.put("name", "yas");
  doc.put("age", 30);
   //上記のままではまだ保存されていないので、保存はこんな感じ。
   DBCollection coll = db.getCollection("testCol");
   //ここでコレクションに対してinsertが走ります。
   coll.insert(doc);

データをselectする。

■一件欲しい時
           DBObject myDoc = coll.findOne();
    System.out.println(myDoc);
■全部欲しいとき
    DBCollection coll = db.getCollection("testCol");
    DBCursor cursor = coll.find();
    while(cursor.hasNext()){
          System.out.println(cursor.next());
     }
■もっと絞りたいとき
               DBCollection coll = db.getCollection("testCol");
                //ここで検索条件を作っています。
  BasicDBObject query = new BasicDBObject();
         query.put("i", new BasicDBObject("$ne",3));
    //findする引数に問い合わせ条件を伴います。
  DBCursor cursor = coll.find(query);
         while(cursor.hasNext()) {
             System.out.println(cursor.next());
         }
■ソートもしたい
         DBCollection coll = db.getCollection("testCol");
  BasicDBObject query = new BasicDBObject();
         query.put("i", new BasicDBObject("$ne",3));
  BasicDBObject orderBy = new BasicDBObject();
                //-1だとDESCになります。
  orderBy.put("i", -1);
  DBCursor cursor = coll.find(query).sort(orderBy);
         while(cursor.hasNext()) {
             System.out.println(cursor.next());
         }
と言う感じらしい。リミットもひけるのでとても良い感じだと思う。
MongoDB最強伝説が始まっちゃったかな?
明日は、もっとデータをぶち込んで実際にJSON --> HTMLにmappingするところまでやってみよう。
これならいけるぞ!これなら!!