2012-12-24

GAE: appengine-web.xml does not contain a element.

タイトルのようなエラーがGAEアプリで出るようになった。どうやら、war/WEB-INF/appengine-web.xmlファイルに
<threadsafe>true</threadsafe> 
というのが必要らしい。



2012-11-30

GWT: GWT Developer Pluginの調子がおかしくなった場合の対処法





GWTの開発ではDevelopment Modeでの開発が必須ですが、時々、このプラグインの調子が悪くなる時があります。一旦プラグインを削除してみても、プラグインが動かないという時には、下記のURLにアクセスしてみてください。
http://gwt.google.com/missing-plugin/MissingPlugin.html
そうすると、上述の画面が出てクリックにより正常にインストールできるようです。






2012-11-15

Android:Activity not started, its current task has been brought to the front

Androidプログラムのコンパイルをしている最中、
Activity not started, its current task has been brought to the front
なる意味不明なエラーが発生。これは、ソースに変更が無い状態で再コンパイル処理をするとこのようなエラーが出ます。エラーというより、注意みたいなもんですね。


2012-11-01

Android: OpenCVのサンプル”image-manipulations”でコンパイルエラー

Android用のOpenCVサンプルプログラムで、インポートしたimage-manipulationsプロジェクトがコンパイルエラーを起こす場合があります。その原因ですが、
ImageManipulationsActivity.javaの拡張子に変なゴミがついている
というしょうもないバグなので、拡張子を.javaに直してください。


Android: SQLiteでPrepared Statementを使う

AndroidのSQLiteで、いわゆるPreparedStatementを利用したSQLを利用する方法についてのメモ書きです。 下記では、DatabaseHelperクラスを利用しています。
SQLiteDatabase db = databaseHelper.getWritableDatabase();
SQLiteStatement stmt = db.compileStatement("INSERT INTO user(name, age) VALUES(?, ?)");
stmt.bindString(1, name);
stmt.bindLong(2, Long.parseLong(age));
stmt.executeInsert();
ちょっと独特の表現なので注意してください。また値を割り当てる時は、StringやLongなど少しのクラスしか対応してませんが、intの値をbindLongに当てはめてもうまくいきました。

OpenCV: BitmapーMat相互変換

OpenCVのMatオブジェクトとBitmapの相互変換についてのメモ書きです。
//Bitmap → Mat
Mat mat =Utils.bitmapToMat(bmp);    

//Mat → Bitmap
Utils.matToBitmap(mat, bmp);


2012-10-30

AWS:org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager: method ()V not found

AWSのSimpleDBプログラムをGWT-RPCのサーバー側で呼びだそうとした時、下記のエラーに遭遇
Caused by: java.lang.NoSuchMethodError: org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager: method ()V not found
という意味不明なエラーが発生。これは、どうやら、
gwt-dev.jarにThreadSafeClientConnManagerが含まれてて、これとバッティングしている感じ。解決策としては、
  •  httpclient.jarが含まれているライブラリ、つまりAWSのライブラリを GWTより前に持ってくる
ということで解決できます。






2012-10-29

12年度卒研ゼミナールスタート

本年度の卒研ゼミ3年次配属生が決まり、今日から3年生ゼミがスタートしました。初日ですのでまずは
  • 自己紹介
  • 諸連絡、紹介
  • メールアドレス登録
  • マシンアカウント確認
など例年通りなわけですが、今年はスマホ率、Gmail利用率が高いです。
そして、もっと驚いたのが、「じゃ、Gmailで私にメールを送ってください」と指示したところ、スマホ持っている学生は全員、スマホからGmailを出そうとしたこと。目の前に、ログインが完了したPCがあるのにもかかわらずです。今の学生にとって、Gmailというのはスマホ用のメールアドレスという認識が高いようですね。スマホ世代到来といった感じです(悪い意味ではなく、いい意味で)。

なお、今年の3年生のゼミは、下記の書籍を使います。生協置いてますのでゼミ生は購入してください。
作って覚えるVisual C #2010 Express入門
昨年度の書籍はちょっと難しすぎた反省もあり、今年は「言語的なもの」ではなく「プログラミング」を経験できるゼミにしたいと思ってます。学内のPC室でもVisual Studio2010が入ってまので、例年に無く、ゼミ課題がしやすい環境になっているのではないかと期待しています。


2012-10-22

GWT:EclipseでUiBinderファイルを作成した時にInvalid web.xml file.

EclipseでUiBinderを作成した時に、最初にUiBinderのxmlを開いて「Design」タブを開くと、上記のような画面が出ることがあります。


このような画面が出た時は、とりあえず、war/WEB-INF/web.xml を一度開いてください。そうすると、上記のエラーは無くなります(Reparseを押してください)。



2012-10-19

Eclipse:jdoconfig.xmlファイルのエラー

最近、Eclipseでウェブアプリを開発しているときに、jdoconfig.xmlファイルに下記のようなエラーが出るようになりました。


これは、どうやらjdoconfigのnamespace定義しているURIが違うって感じのエラーです。実害はないようですが、気持ち悪いですね。このエラーを消す方法ですが、
  • xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig"を思い切って消す(たぶん実害なし?未確認)
  • xsi:schemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig http://java.sun.com/xml/ns/jdo/jdoconfig_3_0.xsd" を追加する
のいずれかが解決策です。後者の場合は下記のようになります。



Android: ListActivityを使う

Androidアプリにおいて、リスト表示のUIには
  • ListView
  • ListActivity
のいずれかを利用する方法があります。どちらも動作速度的には違いはないようですが、単純なリスト表示だけのUIを用意するのであれば、後者のほうがコードがすっきりするため、ListActivityを用いるのをオススメします。

クリックイベントのとり方
onListItemClickメソッドをオーバーライドするだけでいいです。
@Override
protected void onListItemClick(ListView listView, View v, int position,long id) {
  super.onListItemClick(listView, v, position, id);
  System.out.println(position+"番目押した");
}

リストの更新
 更新対象となるリスト内の行の位置から、表示内容を管理しているListのitemを取り出して修正し、最後にadapterのnotifyDataSetChangedメソッドを呼べば更新されます!例えば以下の様な感じ。
 item=list.get(position);
 item.setText("30");
 adapter.notifyDataSetChanged();
参考URL



2012-10-16

Eclipse: GWT+GAE のプロジェクト作成でエラー(/web.xml already exists)

Eclipse でGWT+GAEのプロジェクトを作成しようとした時、
Creation of element failed:
Reason: Resource '/xxx/war/WEB-INF/web.xml' already exists.
というエラーが出て作成できない場合があります。この時は,
  • とりあえず、GAEをOFFにしてプロジェクトを作成し、後から追加
という手順で解決します。

2012-10-12

SimpleDBのJava用マッパークラスを公開しました

Amazonの提供するクラウドデータベースの1つSimpleDBのラッパーライブラリを開発しています。SimpleDBには意外にも用意されていないという現実。研究室では以前からHibernateやObjectifyのようなO/Rマッパーライブラリを積極的に利用していましたから、当然同じことをしたくなるわけです。それじゃあ自作しようかということで、院生のタクボ君にいろいろ頑張って調べていろいろコードを書いてもらいました。

で、とりあえずCRUDの基本的なことはだいたいできたので、とりあえず公開です。

2012-10-11

mgwt:選択されたラジオボタンを識別する

MGWTでのラジオボタン(MRadioButton)の使い方のメモ書きです。
MRadioButton mrb = new MRadioButton("Group1");
mrb.setText("ここにラベル名");
mrb.setFormValue("ここに内部データ");

mrb.addValueChangeHandler(new ValueChangeHandler() {
  @Override
  public void onValueChange(ValueChangeEvent event) {
    System.out.println(((MRadioButton)event.getSource()).getFormValue()+ "を選択 ");
  }
});
ポイントは
  • 各アイテムの内部データをFormValue で管理
  • onValueChangeイベントを利用して選択されたアイテムを監視
  • getSourceでイベントが発生したアイテムのオブジェクトを検知し、FormValueを呼び出す
というところでしょう。

2012-10-02

Java:scheduleメソッドとscheduleAtFixedRateメソッド

Javaでタイマー処理を行う際は、
  • java.util.timer クラス
を利用しますが、タイマーを起動するメソッドには、scheduleメソッドとscheduleAtFixedRateメソッドの2つが存在します。それぞれの違いを下記に書きます。

scheduleメソッド
  • 処理が行われる毎に、一定間隔(指定した時間)待って繰り返し(相対時間で繰り返し)
  • 遅延が発生した場合、処理がどんどん遅くなる。
scheduleAtFixedRateメソッド
  • 起動した時間を基準にして、一定間隔(指定した時間)で繰り返し処理を行う(絶対時間で繰り返し)
  • 遅延が発生した場合、繰り返しの間隔が狭くなる


2012-09-28

Java: クラスが持っているフィールドやメソッド名を検索し,動的に実行する

ちょっとマニアックなネタです。ラボでO/Rマッパーみたいなものを作ろうとしているのですが、その際に使えそうなノウハウを紹介します。

クラスのフィールド名とメソッド名を検索する
あるクラスがどういうフィールドやメソッドをもっているか?を調べるには下記のようにします
Class c = Class.forName("クラス名");
Field[] fields = c.getFields(); //フィールド名
Method[] methods = c.getMethods(); //メソッド名
String methodName = method[0].getName();
これらのメソッドはフィールドインスタンスやメソッドインスタンスを入手するものなので、特定のメソッド名(またはフィールド名)を取ってくることも可能です。その場合は、下記のように記述します。
Method method = c.getMethod(メソッド名, 引数の型<可変長>);
なお、getMethodsやgetFieldsではパグリックなフィールドやメソッドしか入手できませんが、getDeclaredMethodsやgetDeclaredFieldsを利用するとプライベートなフィールドやメソッドを入手することが可能です。

メソッドを実行する 
上記のmethodsはメソッドインスタンスの配列です。これを利用して下記のように検索したメソッドを実行します。下記では,実行対象となるインスタンスを生成してメソッドをinvokeする際に渡してます。staticなメソッドの場合は不要です(第一引数はnullです)。
Constructor constructor = c.getConstructor(new Class[] {});
Object o = constructor.newInstance(new Object[] {});
methods[i].invoke(o, null);

フィールドにアクセスする
 上記で入手したフィールドにアクセスする方法は下記の通りです。
fields[0].set(obj, "abc");
String n = (String)fields[0].get(obj);
O/Rマッパーを自作するときは,プライベートなフィールド名を利用するとよいかもしれません。

2012-09-18

教育システム開発のアプローチ ー教育工学会全国大会の議論からー



教育工学会全国大会でシンポジウムに参加してきましたが、SRAの中小路先生の話が非常にツボにはまったので、以下、中小路先生の話のピックアップと感想など。。。

教育システムの研究開発をしている時に考えてなければならないのは、学習・教育活動をどう支援していくかなのだが、そのアプローチについて中小路先生は非常に面白い比喩で説明されていた。そのアプローチには以下の3種類があるという。

  • ダンベルを作る研究
  • シューズを作る研究
  • スキー用具を作る研究
ダンベルというのは筋力を鍛えるための道具。教育支援システムでいえば、学力やスキルを向上させるということだろう。
シューズというのは、走るという動作をサポートする道具。教育支援システムでいえば、理解や正解をし易くするということだろう。
スキー用具というのは、スキーというスポーツをするための道具。教育支援システムでいえば、学習の場を提供するということだろうか。

なるほど上手いこと言うなぁ、、と思ったが、後から振り返ってみると、教育工学という分野が扱う「学び」という要素が入ってくるとちょっと違和感が見えてくる。例えば「走る」ということを考えてみると、その目標は速く走ること。では、速く走れればそれでいいのか?100mを11秒で走れる者が、あるシューズを使うと9秒で走れたとする。その学習者は9秒で走れる能力を身につけたといえるのか?おそらく違うだろう。
もちろん、シューズ的なアプローチが教育工学に合わないという意味ではなく、例えばその道具を使うことで見えなかったモノが見えるようになり、結果的に理解を促進するという効果を持った道具というのはシューズ的な研究としてOKだとは思う。
ただ、個人的に日々の教育において
  • 学習者にわかりやすく教えること
についての学習効果について疑問に思っているのでちょっと引っかかった感じ。というか、なんでもかんでも「わかりやすく、見せてしまう」ことの教育的な妥当性について気になるんですよね。

最後のスキー用具を作るアプローチというのは、新しい学習環境やエクスペリエンスを提供する研究なわけで、これは自分の今までの研究アプローチかなぁ、、と思ったが、ただよく考えてみるとそうでもないような気もしてきた。というより、自分がどの視点なのかを明確にできてないところに問題がある気がしている。
中小路先生が力説されていたのは、自分の研究がこの3つのアプローチのどれにあてはまるのか理解し、それに見合った評価をしましょうということ。今、自分のシステムの評価方法についていろいろ四苦八苦していたので、今回の話に何かヒントがあるのではないかという感触を得た。

ちなみにこの3つの分類については、これらは独立したものではなく、これらの要素が組み合わさったもののように思えるがどうなんだろうか?あるいはどれか1つに絞り込めないようであれば、研究が対象とする支援のポイントが不明瞭になっているということなのだろうか?


2012-09-12

GWT:マウスによるペースト処理を検知する

コピーアンドペーストはよく利用される操作ですが、
  • キー操作
  • 右クリックのコンテクストメニューによる操作
の2つの方法があります。後者でやられた場合、キーイベントで検知できないのが問題です。対応策は下記のとおりです。
//コンストラクターに下記を記述
sinkEvents(Event.ONPASTE);

//onBrowserEventメソッドをオーバーライド
@Override
          public void onBrowserEvent(Event event) {
            super.onBrowserEvent(event);
            switch (event.getTypeInt()) {
            case Event.ONPASTE:
              //event.stopPropagation(); //ここは状況に応じて
                System.out.println("paste");
              break;
            }
          }

stopPropagationメソッドについては、イベントの伝播を止めたい場合に呼び出します。

2012-09-11

GWT:TextAreaでエンターキーのイベントを検知し処理する

「TextAreaで文字入力を受け付けて、改行と同時にその内容を取り込んでクリアする」というツイッターみたいなプログラムを作成する場合にちょっとハマったので、メモ書きしておきます。

キーイベントの発生順番
TextAreaでのキーイベントの発生順序は下記の通りになりますが、TextAreaにその文字が入力されるタイミングに注意する必要があります。
  1. Down ・・・ 入力前発生
  2. Press ・・・ 入力前発生
  3. Up ・・・ 入力後発生
例えば、改行時にTextAreaの内容をクリアしたい場合、1,2のタイミングでは改行コードはクリア後にTextAreaに入ってしまいます。必ず3のタイミングで処理する必要があります。

キーコードの検知
現在入力されたキーのコードを検知するには、
  • KeyPressEvent
でしか検知できません。

KeyPressとKeyUpを組み合わせる
KeyPressEventでキーの内容を検知し、KeyUpEventでTextAreaの中身を取ってくる(消す)という手順が必要です。例えば以下の様な記述になります。
       @UiHandler("textArea")
        void onEnterKey(KeyPressEvent e) {
                System.out.println("Press");
                if (e.getCharCode() == KeyCodes.KEY_ENTER) {
                        isEnter= true;
                }
       }

        @UiHandler("textArea")
        void onUpKey(KeyUpEvent e) {
                System.out.println("Up");
                if (isEnter) {
                        /*ここでなんらかの処理をする*/
                        isEnter=false;
                }

        }
なお、上記のコードはUiBinder利用時の記述です。

2012-09-09

参加報告:文章表現・ライティングの授業設計ワークショップ


現在、学科で初年次教育系の科目(いわゆる基礎ゼミ)の取りまとめ役になっているのと、個人的にライティング支援システムの研究をやっている(やろうとしている)ので、情報収集のため河合塾FDセミナーに参加してきました。以下、メモ書きです。

対象とする学生のレディネスはどうか?
どの学年でどのようなスキルを持った学生を対象としているのか?そのレディネスを探るのは重要でしょう。プレテストのようなものでチェックするのもひとつの手だと思いますが、それを容易に把握できるシステムが重要になってくるかもですね。

何を学ばせるのか?
教える側としては「教えたいこと」は山ほどあり、そして多様。しかし時間が限られる。この制約でどうやって学習目標を設定して、カリキュラムの中で取り入れていくか、、、教員間で共有すべき問題でしょう。事前にチェックするというのは1つのアプローチですね。本セミナーでは
  • 語彙文法志向
  • 学びの基礎志向
  • 実用志向
  • 読解志向
  • 学術志向
  • グループワーク志向
という6つの分類で、ニーズ分析を図る方法が紹介されていました。この中で優先順位を決めるのはありかと思います。

ライティングにおける3つの教育スタイル
セミナーでは講義のアプローチとして以下の3つを紹介していました。教育工学の世界ではよく知られたことですが、「ライティング」という科目にどう当てはめていくのか?をグループワークでまとめました。

(1)教えるタイプ(行動主義×伝統的)
従来型のスタイルですが、ライティングの視点から考えた時
  • レポートと感想文との違いを明示する
  • サンプルを見せる
というのは、有効な方法のようです。

(2)気づかせるタイプ(認知主義×協同的)
グループ学習を意識したアプローチですが、その中で
  • 誤りを学生に修正させる
というアプローチが有効のようです。学生自身が書いた文章をお互いに修正させあったり、誤りのあるレポートに対してグループ内で修正させるというやり方が考えられます。

(3)気づき合うタイプ(構成主義×協調的)
これはどちらかというと高度な手法で、学生にもスキルが求められます。基本的には学生グループに主体的に学習させるもので、例えば
  • テーマ決め
  • KJ法やマップなどによる意見・データの集約と分析
  • 相互によるチェック
などレポートライティングのプロセスを学生自身にすべて行わせます。初年次の学生には難しそうですが、実はこれに類似したことを実践されている先生もおり、やり方次第で十分可能のようです。

これらを組合わせて講義にどう活かしていくか
ライティング講義においては、上記の3つはどれか1つに限定するものではなく、いろいろ組合わせていくことになります。ただ実際(2)や(3)というのをやろうと思ったら難しい、、、ここのところをどうするか?が個人的には一番知りたいところなのですが、残念ながら本セミナーではこの点について言及する機会がなく、個人的には残念なところでした。


2012-08-30

Excel:VBA開発を有効にする

ExcelでVBAを利用する際、デフォルトでは有効になっていないので以下の手順で有効にします。

1.オプションを開く


2.リボンのユーザー設定

リボンのユーザ設定を選ぶと、右側のペインに「開発」というのがリストにあると思います。それにチェックを入れます。


3.開発リボンを確認

開発のリボンが新しくできていると思います。






Excel:分析ツールを有効にする

Windows版のExcelには統計処理のためのツール“分析ツール”が用意されていますが、標準では有効になっていません。以下はその手順です。

1.Excelのオプションを開く



2.アドインを開く

ここで、右側のペインを見ると分析ツールがアクティブになってないのが確認できます。



3.アドインを有効にする

上の画面の一番下にある「設定」ボタンを押すと、アドイン設定画面が出てきます。分析ツールにチェックをいれましょう。

 


4.「データ」リボンを確認する

データのところにデータ分析というのが出ているとおもいます。(もしかするとExcelの再起動が必要かもしれません)



P.S
Macには分析ツールが標準で入ってないんですよね。これはちょっと不便ですね。



2012-08-17

std::queue::cではなく、std::queue::_Get_containerを使う

Visual Studio2005で動かしているC++のプログラムを2010に移植した時に問題発生。std::queueクラスでコンテナーを返す処理をする時、2005のプログラムでは
std::queue::c[0]
みたいな呼び方でよかったのだが、2010ではprotectedなメンバーにはアクセスできないとかいうエラーが発生。言語仕様の変更か?そんなことってありうる?と疑問に思いつつも、今は2012年。もう7年も前の仕様だし、、ということで、代替方法を探す。結局、代替のメソッドがあったのでそれを利用。
std::queue::_Get_container()[0]
という記述でとりあえず動いている模様。このやり方がベターなのかは不明。

OpenCV: cv100.dllが見つかりません、、、みたいなエラーが出た場合

OpenCVを利用しているアプリを他の環境に移動した時に出たエラー。OpenCVのbinディレクトリにパスがうまく通っていないことが原因なので
  • 環境変数Pathに <OpenCVインストールディレクトリ>\binディレクトリを追記
  • Visual Studioを再起動
ということを行えばよい。初歩的なことですがメモってなかったのでとりあえず。


2012-08-07

サーバ管理: Windowsサーバを自動シャットダウンする

停電というのは、マシン管理者にとっては泣かせるイベントです。昔は、休日にも関わらず人知れずサーバのシャットダウンや再起動をしに、家を出ていたものです。おちラボでは、アカウント管理でWindowsサーバを動かしているわけで、当然これも停電時にはシャットダウンする必要があります。が、Windowsだとタスクツールを使えば、簡単にシャットダウンの予約ができますので、そのメモ書きです。 事前準備 シャットダウンのタスクを実行するユーザーアカウントに[バッチ ジョブとしてログオン]の権利が必要なようです。
[ローカル セキュリティ ポリシー]→[セキュリティの設定]→[ローカル ポリシー]→[ユーザー権利の割り当て]
で確認してください。 タスクスケジューラーウィザードによる設定 [コントロールパネル]→[管理ツール]→[タスク スケジューラ]を起動します。 あとは下記のとおりです。

1.基本タスクの作成を選択
以下の画面が出てきますので、適当な名前をつけておきましょう。



2.1回限りを選択
定期的なものか1回限りのものか選べます。今回は1回限りです。



3.日時を設定します
シャットダウンする時間を選んでください。



4.プログラムの開始を選択
シャットダウンコマンドを利用しますので、プログラムの開始を選択します



5.シャットダウンスクリプトを入力
スクリプトというか、シャットダウンの実行ファイルを指定します。引数のオプションの-sは必須です


6.確認します


7.スケジューラライブラリで確認
スケジューラライブラリを見ると、設定したタスクが表示されるはずです。実行済みのも表示されます。



8.ログオン時に関わらず実行するよう設定する
ここは重要なところです。上記画面で今回登録したタスクをダブルクリックします。すると下記のような画面がでてきます。この真ん中にある「ユーザがログインしているかどうかに関わらず実行する」をオンにしましょう。オンにしてOKを押すとパスワードを入力を求められます。入力したら完了です。



以上、Windowsでの自動シャットダウンの設定についてのメモ書きでした。

2012-08-01

EDICT:フリーの日本語・英語辞書データ

EDICTはモナッシュ大学が公開しているフリーの日本語・英語辞書データです。元々は、日本語-英語の辞書でしたが、現在は様々な外国語への対応が進んでます。日本語ー英語については、

  • EDICT - 日本語・英語基本データ
  • ENAMDICT - 日本の固有名前関係のファイル
  • COMPDIC - コンピュータ関係のデータ
  • KANJIDIC - 漢字データ

のようにいろいろなバリエーションがあります(上記は一部です)。ちなみにEDICTの中身は下記のようになっています。
関して [かんして] /(exp) in relation to/
関する [かんする] /(vs-s) to concern/to be related/(P)/
関の山 [せきのやま] /(exp,n) the most one can do/as much as one can/as hard as possible/
関らず [かかわらず] /(exp) in spite of/regardless of/
関る [かかわる] /(v5r,vi) (1) to be affected/to be influenced/(2) to be concerned with/to have 
ライセンスは「 Creative Commons Attribution-ShareAlike Licence (V3.0).」です。つまり、
  • 本作品を複製、頒布、展示、実演することができます。 
  • 二次的著作物を作成することができます。 
  • あなたは原著作者のクレジットを表示しなければなりません。 
  • もしあなたがこの作品を変形や改変したり、この作品に基づいた作品を作る場合、あなたは全く同じか、同一もしくは互換性のある許諾条件でその作品を頒布しなければなりません。 
という意味になります。

興味が有る方は、本家のサイトへどうぞ

2012-07-23

Bloggerにてソースコードを載せる方法

本サイトではソースコードを整形して載せていますが、このスタイルは既存のものを流用しています。
と呼ばれるもので、以前はBloggerでSyntaxHighlighterを使うためのウィジェットを使ってましたが、古いバージョンにしか対応しておらず、また現在は簡単にできるようなので、今回から新しく導入すると共に、その方法を紹介します。
まず、下記のJavaScriptコードを、BloggerのレイアウトからJavaScriptガジェットとして埋め込んでください。
 
 
 
 
 
 
 

 

上記で重要になってくるのは、
  • テーマ設定ファイル(shThemeXXXX.css)
  • ブラシ設定ファイル(shBrushYYYY.js)
の指定です。XXXXやYYYYのところはいろいろなバリエーションがありますので、自分にあったテーマや言語を読むこむようにしてください。(多くするとロードが遅くなります)

これを埋め込んだ後、ブログの本文のソースコードのところを下記のようにpreタグで囲みます。

※ここにソースコードを書く
brush:の右側のところは記載する言語を書きます。このあたりの書き方は本家サイトにあるので探してみましょう。他にもいろいろなオプションがあるので試してみましょう。

GWT: UiBinderを利用したファイルアップロード

GWTでファイルアップロードフォームを記述する方法は、以前の記事で紹介しましたが、UiBinderを使うとよりシンプルになります。
ここでは、SubmitButtonクラスを利用しています。このボタンを使うと、送信処理の記述が不要になります。もちろん、ふつうのButtonを利用してsubmit()メソッドを呼び出す方法もアリです。 サーバー部分の記述は従来通りです。

2012-07-20

Eclipse:国内のサイトを利用してアップデートを高速化する

Eclipseの各種プラグインソフトは、新規ソフトウェアのインストールの画面を利用して行いますが、ソフトウェアのダウンロード元のサイトはデフォルトでは、
  • http://download.eclipse.org/
となっています。実はこのサイトのミラーが国内には存在します。
  • http://ftp.jaist.ac.jp/pub/eclipse/
そこで、デフォルトのサイトを国内にすべて変更することでアップデートの高速化が図れます。ただし、Eclipseはデフォルトで複数の箇所でこのURLを指定しているので、いちいちすべて書き換えるのが面倒です。そこで、簡単な手順を下記に上げます。
  1. 新規ソフトウェア→使用可能なソフトウェア・サイトをクリック
  2. すべてのロケーションを選んでエクスポート
  3. エクスポートしたファイルをコピーし、別名で保存しておく(万一のバックアップ)
  4. すべてのロケーションを選んで除去(remove)
  5. エクスポートしたファイルをエディタで開き、上記のデフォルトのURLの箇所を国内のURLのところへ置換して保存( http://download.eclipse.org/ →  http://ftp.jaist.ac.jp/pub/eclipse/ )
  6. そのファイルをインポート
つまり、1つずつ変更するよりも設定ファイルをエクスポートして一括変換してすべて書き直すほうが手ばやいってことですね。


2012-07-07

MSWord: 文末のセクション区切りを削除する

Wordで原稿を書いていて、原稿の文末にセクション区切りが入ってしまい、余分に空白のページが入ってしまうことがあります。「セクションを消したらいいのでは?」と思いがちですが、これを単純に消すとそれ以前のレイアウトまで変わってしまいます。
で、この解決方法は以下のとおり。
セクション区切りの先頭にカーソルを置き、数行改行する
Ctrl+Shift+ENDキーを押したあと、「DEL」キーを押す(最後はDELキーだけ押す)
これにより、以降のセクション情報が消えます。

P.S
今後、こういったWord系の話も論文作成に関連するネタとして書いていこうかなと思ってます。


2012-06-29

GWT:RPCでエラー、its Class object could not be loaded.

GWTのRPCで下記のエラーに遭遇。
Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'XXXXXXXXX' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = XXXXXXXX@d3f8214
ちゃんとSerializeしてるし、変なクラスも呼んでないのにのになんでだろう?と思ったら

  • 引数がゼロのデフォルトコンストラクタを用意しなければならない
という制約があったようですね。今更気づきました。。。(^^ゞ



2012-06-28

GAE/JからSimpleDBを利用する方法

GAEはDatastoreの有料化に伴いとても使いにくくなりました。かといって、他のクラウドサービスはJavaを動かすだけでちょっとお高く、、、という感じで、帯に短しタスキに長しという感じで、個人的にはGAEのプラットフォームはとても好きだけど使えない。。。と悶々としておりました。
 一方、データベースについてはDynamoDBとかSimpleDBなどAWSが魅力的なサービスを提供してますので、GAEとAWSをうまく組み合わせることができたら最高じゃないか?っていうのは誰もが気づくことです。しかし、GAEの制約により、AWSのSDKは使えないということになっています。困ったもんです。。。
ですが、SimpleDBやDynamoDBなどのサービスはRESTインタフェースを持っているわけで、SDKなんか使わなくても単純なRESTアクセスをすれば、GAEからアクセス可能なはずです。だれかそういうことをやっている猛者はいないのかといろいろ探していたのですが、ようやくいいソリューションを発見しました。

Alanwilliamson's Library
RESTを利用してSimpleDBにアクセスする試みってのは探せばあるもんでして、
に、そのライブラリがありました。これを使います。マニュアル等はありませんが、これをつかうことでAWSのSDKなしで純粋なHTTPクラスのみでアクセスできます。ただし、これのみではGAEでは使えません。試したらみたらわかりますが、FileOutputStreamなどを使っているのでこれらがGAEで使えないというエラーが出ます。困りましたね。

Koherent-App-Engine-Library-for-Java
探せばあるもんで、
このライブラリは、
FileOutputStream、FileInputStreamをDatastoreOutputStream、DatastoreInputStreamに置き換える
ということができます。上記のAlanのコードを書き換えましょう。

Content-typeを修正する
上記2つを組み合わせることで、無事動く、、、と言いたいのですが、putAttributeを実行するとなぜか認証エラーがでます。DomainListsの入手では問題ないのに。。。。これは、SimpleDBのRESTの仕様のバグか何か?で
//urlc.setRequestProperty("Content-type", "application/x-www-form-urlencoded" );
urlc.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=utf-8" );
のようにヘッダの記述部分を書き換えることで解決します。

おそらく、AWS+GAEの組み合わせを希望しつつ、断念していた人も多いのではないかと思います。しかし、この方法なら大丈夫なはずです。細かいコマンドの動作はまだ試してませんが、後日、ノウハウをまとめたいと思います。


Eclipseの調子が悪くなったら。。。。

Eclipseの調子が悪くなったら、特にプラグイン関係でうまく動かない場合は、
eclipse.exe -clean
で実行すると治ることがあります。

私の場合、最初にGAEの設定ページを開こうとしたら
選択されたプロパティー・ページを作成できませんでした。
(class: com/google/appengine/eclipse/core/properties/ui/GaeProjectPropertyPage, method: createSdkComponent signature: (Lorg/eclipse/swt/widgets/Composite;)V) Bad type in putfield/putstatic
などというエラーが出てプラグインをバージョンアップしても治らず、しかもEclipse自体が起動しなくなるというトラブルに見舞われましたが、神頼みでこのコマンドを実行して無事正常に戻りました。

2012-06-25

Eclipse:WindowBuilderインストールのススメ

WindowBuilder ってGWTのGUIデザインのためのものかと思ってましたがそうじゃないようですね。WindowBuilderというのはあくまでもエンジンで、実際のデザイン環境は
  • GWT Designer
  • SWT Designer
  • Swing Designer
と用意されているようです。

GWTDesigerだけを使う場合
http://dl.google.com/eclipse/inst/d2gwt/latest/3.7
からプラグインをダウンロード。


全部まとめて使いたい場合
http://dl.google.com/eclipse/inst/d2wbpro/latest/3.7
からプラグインをダウンロード。
となります。両者のURLは似ているようで微妙に違いますので注意してください。



DynamoDB:IAMでのUserPolicyによるアクセス制限 ~その2~

DynamoDBのアクセスをIAMで制御する話の続編です。時々トラブルのでメモ書き程度ですが、、、
{ "Statement": [{ "Sid": "Stmt1330073911360", "Action": [ "dynamodb:ListTables" ], "Effect": "Allow", "Resource": [ "*" ] }, { "Sid": "Stmt1330073911361", "Action": ["dynamodb:DeleteItem","dynamodb:GetItem",
"dynamodb:PutItem","dynamodb:BatchGetItem","dynamodb:BatchWriteItem","dynamodb:Query","dynamodb:DescribeTable","dynamodb:ListTables","dynamodb:Scan","dynamodb:UpdateItem" ], "Effect": "Allow", "Resource": [ "arn:aws:dynamodb:us-east-1:XXXXXXXXXXXXXX:table/ochi_*" ] } ] }
上記のようにすれば、
  • ochi_ではじまるテーブルについてのみ操作が可能
となります。ちなみに、操作の記述ですが、Policy Generatorのウィザードを使うと足りないのがあったりします(気のせいだったようです。今見たら全てありました。)Policy Generator使いましょう。


2012-06-14

GWT: No source code is available for type java.util.Calendar; did you forget to inherit a required module?

GWTにおいて表題のようなメッセージが出る原因ですが、GWTでは
  • java.util.Calendar 
  • java.text.SimpleDateFormat
は使えません。(後者については別記事で書きましたが)Calendarクラスの代わりにDateクラスを使いましょう。


AWS:RDSではなくSimple DBを選んだ理由

先日の記事のように、おちラボでは、
  • DynamoDB
  • SimpleDB
の2つをラボのクラウドデータベースの柱として活用することにしたわけですが、今回、RDSではなくSimple DBを選んだその理由についてちょっと書いてみます。

ネットワークセキュリティ
一番の理由はこれですね。ファイヤーウォールの関係で、RDSのように従来のRDBシステムをバックにしたシステムにアクセスするポートは塞がっています。よって、ラボ内からRDSにアクセスできない。。。この問題は、SQL Azureを利用するときにもぶちあたっていて、RDSも同様のシステムなんだから無理なわけで、、、もちろん、申請すればポートなどは開けてもらえますが、この手のクラウドのサービスでは、EndpointのIPも変わるような気がして(未確認)、とにかくセキュリティポリシー上無理だということに。一方、SimpleDBはDynamoDBと同様にRESTインタフェースをベースにしてますから、ふつうにアクセスできます。

シンプルにDBを扱いたい
教育的な視点を考えると、RDBのような一般的なDBを扱わせたいと思う反面、すばやくシステムを作ることを考えると、SimpleDBのような単機能のほうが良いかなと判断しました。

値段的に安い
私の勘違いでなければ
  • RDS ・・・ DBのインスタンス生存時間
  • SimpleDB  ・・・ 実際のCPU処理時間
で、つまり、RDSは使ってなくてもインスタンスが動いていれば課金。SimpleDBは実際のリクエスト処理時間に応じて課金。ということ。ラボの利用みたいに、少人数でアクセス時間も限られている場合であれば、SimpleDBは格安ですむと思われます。

クラウドデータベース選定の一助になれば幸いです。


AWS:SimpleDBをセットアップする

AWSのSimpleDBを使ってみようかと思って、いきなりセットアップでハマったので、、、

SimpleDBってAWSの中では結構ウリのサービスでありながら、AWS Management Consoleにその名がないなどいまいちスタンスがよくわからないサービスです。そして、DynamoDBの登場によりなおさらその存在が微妙になりつつある感じがしますが、おそらくDynamoと並行して残っていくサービスだと思います(根拠なし)。

おちラボではとりあえず、DynamoDBとSimpleDBを併用して運用しようかと考えており、ではさっそくセットアップして使ってみようと思ったものの情報があまりない?。ネットでググッてみてもSDKのなかのコマンドラインツールを使って、、、というのもめんどくさいこと書いてるし、、、と試行錯誤してシンプルなセットアップを見つけましたので、以下に手順を書いていきます。

1.SimpleDBを有効にする
公式サイトにアクセスして、まずは有効にしましょう。

2.IAMでSimpleDBを使えるようにする
ここが一番ハマりました。User PolisiesでSimpleDBを使えるようにPolicyを追加しようとしましたが、Policy TempleteにSimpleDBの項目がない!?でもここで諦めてはいけません。Policy generatorではちゃんとSimple DBはリストにありますので。ここで SimpleDBを使えるようにしましょう。なお、Resouseのところは
arn:aws:sdb:us-east-1:XXXXXXXXX:domain/*
と書けばいいと思いますが、XXXXXXXのところは適切な値にしてください。

3.Eclipse Pluginからアクセスする
ここもポイントです。コマンドラインツールなんか使わなくても、Eclipseの AWS PluginにありAWS xploreを利用すればGUIで操作できます。Domainの作成はボタンクリックでできます。


というわけで、これからSimpleDBも利用していこうと思ってます。ノウハウが見つかればまた書いていきますね。


2012-06-09

GWT:UiBinderでRadioButtonのイベント処理

初歩的ですがUIBinder系のネタがネットにあまりあがってないようだったので、、、
UiBinderでRadioButtonを使う際、ふと疑問に思うところはどうやってその情報を取ってくるのだろうかということ。radioButtonの場合は、
  • ClickEvent
  • ValueChangeEvent
のいずれかを用いて各ボタンの状態が変わった段階を検知するとよいでしょう。その際、
  • 各ボタンへのイベントの割り当ては、{}を利用することで一括して行う
  • どのボタンが選択されたのかはgetSourceメソッドを利用して入手
という点がノウハウとなります。下記は、ClickEventを利用した際の例です。ここでは、ボタンが押された際にそのボタン(ソース)を記録しておいて、後からテキスト情報等を利用して区別するということになるでしょう。
@UiHandler({"radioButtonA","radioButtonB","radioButtonC"})
 void onClickRadio(ClickEvent e) {
         selectedRadioBtn = (RadioButton)e.getSource();
        //Window.alert("Hello!");
 }


2012-06-05

DynamoDB: DynamoDBMapperでBatch処理をする

DynamoDBでBatch処理ができるようになりました。高レベルAPI、つまりDynamoDBMapperを利用した場合のBatch処理についてメモ書きです。というかこれは非常に簡単で、
  • batchSave ・・・ 保存
  • batchDelete ・・・ 削除
  • batchWrite ・・・ 保存と削除
というメソッドが用意されています。対象とするオブジェクトをリストで渡せばOK。
batchWriteというのがちょっと曲者?というかbatchSaveと何が違うのかというと、batchWriteは引数が2つあり、保存するオブジェクトのリストと削除するオブジェクトのリストを同時に渡せるということのようです。> Batch処理をしたほうが、データベースのパフォーマンスも最大限に挙がりますから、積極的に使いたいですね。



mgwt:mgwtにおける画面遷移

mgwtの面白いところは、画面遷移の手法です。GWTアプリってのはAJaxなアプリなわけですから、一般的なウェブアプリのようなページ遷移はありません。すべて画面の描画書き換えとなります。mgwtでも当然そうなりますが、モバイルアプリらしい仕組みが用意されています。
mgwtでは “AnimationHelper”というクラスが用意されており、このクラスに描画したい画面(パネル)と遷移効果を指定することで、あたかも画面が切り替わったかのような処理をしてくれます。
下記は公式サイトにあるサンプルの例ですけど、最後の処理がポイント。第2引数でいろいろ効果を変えることができます。

2012-06-04

Java:Stringクラスのsplitメソッドの挙動に注意

初歩的なところですが、、、、JavaのStringクラスにはsplitメソッドがあります。これを使うことでcsv形式のファイル解析が便利になります。しかし挙動に注意。
String test = ",a,,,,";
String[] result = test.split(",");
とするとresultには何が入っているでしょう?
result[0]="";
result[1]="a"; 
となります。2つ目以降のカンマを区切ってくれません。予想外の結果です。これはちょっとこまりますよね。カンマ区切り数が決まっているのであれば、下記のようにします。
String test = ",a,,,,";
String[] result = test.split(",",5);


2012-06-02

mgwtはじめました

スマートフォン対応のWebアプリケーション開発のフレームワークとして、mgwtを使いはじめました。耳慣れないですが、名前から察しのとおり、GWTのモバイル版です。
ただでさえ、国内ではGWTはマイナーなのに、そのサードパーティ版ということで、ググってもほとんど情報がないということでゼミ生から既に悲鳴があがってます。

ますますマイナーな路線に走っているおちラボですが、これから、ノウハウをアップしていきますので、乞うご期待!?


2012-05-30

EclipseでのGWT(DevMode)+Tomcatアプリケーション開発

EclipseでGWTのDevModeを使いつつ、サーバをTomcatにする方法がわかりました。特にマニアックな設定というわけではない感じですが、意外とネットで見つからず手間がかかりました。手順をおって説明します。


(1)Google Webアプリケーションとしてプロジェクトを作成する
これは普通に作成してください。ただし、GAEは無効にしてください。サンプルコード自動生成もONにしておくといいでしょう。後の動作確認がラクですから。

(2)動的ウェブアプリケーション(Dynamic Web Application)を追加にする
プロジェクトのプロパティで、Facetsの設定を開き、Dynamic Web Applicationを追加してください。この設定をすることでTomcatが有効になります(Tomcatのプラグインが入ってない場合は入れておきましょう。)。この時、動的ウェブアプリケーションのバージョンは2.4にしておきましょう。
また、 コンテンツディレクトリ設定 をwarにしておいてください(デフォルトはWebContent)。この点については、GWTのウェブルートと統一しておくことが大切ですので、どちらを変えても結構です。

(3)サーバでデバッグ
デバッグをします。デバッグからサーバでデバッグを選びます。そこでTomcatを指定しましょう。また下にある「常にこのサーバーを使用」にチェックを入れておきます。実行するとTomcatが起動するはずです。

(4)ウェブアプリケーション(外部サーバで実行)でデバッグ
もう一度デバッグをします。今度は、デバッグからウェブアプリケーション(外部サーバで実行)を選びます。すると、ダイアログが出てきますので、server rootとして
http://localhost:8080/<プロジェクト名>
とします。ウィンドウの真ん中でHTMLファイルを選びます。下部に最終的なURLが出ますので確認してOKを押します。すると、いつものようにDevelopment Modeのペインが開きますので、そこのURLをクリックします。するといつもの様にサンプルプログラムが動きます。え?これってTomcatがサーバなの?と心配な方は、サンプルのボタンを押してみてください。下記のようにメッセージがでてきますが、、、、よく見ましょう。「I' m running Apache Tomcat」となってますね。つまり、このプロジェクトは、サーバはTomcatだけれど、クライアントのGWTはDevModeで動いているということになります。


まとめと注意事項 
結局、これってどうなってるのか?ちょっとわかりにくいので簡単にまとめますね。
  • プロジェクトの基本はGoogleのWebアプリケーションです。DevModeを利用するためには、このプロジェクトとして作成する必要があります。 
  • GoogleのWebアプリケーション でTomcatを利用するためには、Facetsの設定でDynamic Web Applicationを追加する必要があります。この設定により、このプロジェクトではJettyとTomcatの両方を使えるようになったということになります。 
  • デバッグ時に外部サーバーを利用することで、Jettyを使わず、Tomcatを利用することになります。 
  • ただし、Tomcatサーバの起動は Webアプリケーションデバッグと連動してないので、別に起動する必要があります。さらに、サーバープログラムについては、Tomcatを再起動しないと反映されないようです(オートデプロイされない?)。
以上、参考になれば幸いです。


EclipseによるGAEを利用しないGWT開発

初歩的な事だけど、ラボでよく勘違いする話なのでメモ書きです。

EclipseでGoogleのWebアプリケーションプロジェクトをつくると、GWTとGAEが有効になります。一般的にGoogleのWebアプリケーションを利用する=GAEを利用するという認識になってるようですが、GoogleのWebアプリケーションプロジェクトではGWTとGAEを利用するかどうか、それぞれ有効/無効の設定ができます。つまり、 GAEを利用しないのであればGAEだけを無効にすればOK。

GoogleのWebアプリケーションでGAEを利用しないってどういうシチュエーションなのか?疑問に思うかもしれませんが、一般的なWebサーバーで動くGWTアプリケーションを開発したい場合です。GWTというのは別にGAE限定ではありませんからね。

GAEを無効にするとどうなるのかというと、今までどおりJettyサーバーが稼働します。GAEを有効にしている時もJettyが立ち上がりますが、Jettyというのは汎用のWebアプリケーションサーバーです。別にGAE用というわけではありません。つまり無効にする事でGAEの制約を受けずにJettyを利用できるということです。

そもそもなぜこの事を記事にしたとかというと、
  • Eclipse上でTomcatを動かしてGWTアプリを作る
というのを本当はやりたかったのです。いちおうこの方法はわかっているのですが、GWTのDevModeとの連携ができずに断念しています。GWTはさすがにDevModeが使えないと使う気になれませんし。

おそらくコンパイルオプションを変えればできそうな気がしてますが、まだ未解決です。現在検討中ですので、方法がわかれば紹介します。

2012-05-29

Java:for-each文を使ってコレクションクラスの探索をラクにする

JavaにおいてListのようなコレクションクラスを探索するときには、下記のようにIteratorを利用するのが一般的でした。
List list= new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()){
 String result = (String)it.next();
 System.out.println(result);
}
しかし、この方法だとnextで得られる戻り値をキャストしたりするなど面倒です。そこで、Java5.0からは(2008年版からは)foreach構文が定義されました。次のようになります。
List list= new ArrayList();
for(String result:list){
 System.out.println(result);
}
どうでしょうか?このネタはJavaの前々バージョンから採用されたもので今更感があるほど古いです。ただ、C言語に慣れ親しんだ世代では、従来のfor文の構文が親しみやすいということで、本ラボでは特にforeachについては言及してませんでした。が、そろそろforeachも完全に一般化したので、今回改めて取り上げました。

2012-05-18

DynamoDBとは

今年に入って、AmazonがDynamoDBを発表しました。NoSQLでSSD使ってて、スループットを自在に変更できて、、等なにか凄いようなよくわからないようなサービスなわけですが、いろいろ使ってみたりネットを参照してみたりしてようやくその姿が見えてきました。

データの型
扱えるデータの型はString, int, Set(String, int)の4種類です。SetについてはJavaではHashSetしか使えないようです。LinkedHashSetを利用したら、書き込みはできましたが読み込みでエラーが出ました。 何か勘違いしてるかもしれませんが、、、

検索キー
テーブルの検索キーは最大2つ設定できます。具体的には
  • HashKey・・・検索の Hash値として完全一致で特定するKey。
  • RangeKey ・・・ 大小関係や前方一致などで範囲を指定して検索できるKey
の2種類が存在します。そして、その組み合わせは2種類のみです。
【HashKeyのみ】
1つのAttributeをKeyにします。その値は必ず1意にならなければなりません。
【HashKey+RangeKey】
2つのKeyを組み合わせることで一意になるようにキーを設定されます。この方法の場合
HashKey単体では1意にならなくて良いが、2つのKeyの組み合わせは必ず一意にならなければならない。

検索の方法と注意点
次の2種類です。
  • Query ・・・  Keyを対象にした検索
  • Scan ・・・  Key以外に対する検索
 DynamoDBは幾らでもデータを増やすことができ、しかも検索スループットが保証されるという特徴としてあります。しかしこれは、キーを検索キーとした場合です。Scanを利用すると、このメリットは受けられません。Dynamodbの特徴を活かすのであれば、Scanの利用はオススメできないようです。
 なお、一度の検索で最大1MBしか呼び出せないとマニュアルには書いてあります。ということは、1つのアイテムを1KBとした場合、最大でも1000件しか呼べないということになりますよね?じゃあ、1000件を超えることが予想されるデータの場合、どうすればよいのか?それはRangeKeyを利用して範囲検索を繰り返すことができるような設計が必要になるでしょう。

S3との連携は不可欠か?
アイテムの最大サイズは64KBらしく、数値と文字列しか入らないのでこの値が大きいのか小さいのか、、、まあ、画像とかバイナリーデータとか、ファイルなどの管理はここではやらず、S3を使えってことでしょう。これはまあ、SimpleDBのころからそういう流れですからAWSのユーザーであればなんてことはないですね。あと、多くの項目を格納しておきたいのであれば、S3にXMLで保存しておくのもアリだと思いますね。

課金対象と注意事項
課金が実は一番気になるところですが、一言でいうと、
  • 「データベースのサイズ」と「設定した検索のスループット」が課金対象
となります。後者がわかりにくいですが、データベースを使おうが使うまいが、テーブルを作成すると設定したスループットに基づいて時間単位で課金されていきます。そして注意すべき点は、課金対象はテーブル毎に設定されたスループットの総和です。無料枠がReadで10, Writeで5となってますが、テーブルごとではなくその総和に対してです。しかもテーブルに設定するスループットの最低値が5となっているということ。テーブルを増やすほどスループット値は増えていきます。RDBの感覚でホイホイテーブル作ってると即課金対象になります。コストを抑えたいならテーブルをむやみに増やさないデータベース設計がポイントでしょう。ちなみに、read/writeをそれぞれ最低の5にしたテーブルを4~5つほど作っておくと、1ヶ月で10ドル超えます。
また、DynamoDBはスループットを柔軟に上げ下げできるという利点がありますが、ちょっと盲点があります。スループットを高くする場合は短時間で反映されますが、スループットを下げる時は1日ほど時間がかかるということ。つまり、細かく上げ下げしてコストを抑えるという方法が難しいということです。

というわけで、意外ととっつきにくい雰囲気のあるDynamoDBですが、おちラボでは今後、DynamoDBを研究用の基盤DBとして運用することに決めました。RDB的な使い方から脱却すればこんなに魅力のあるDBは他にないなというのが、現在の印象です。今後、DynamoDB周りでプログラミングノウハウが見つかれば、このBLOGでも紹介したいと思います。


2012-05-16

Java:UUID を入手する方法

一意なIDを設定するときには、UUIDを利用するのがお手頃です。UUIDとは汎用一意識別子と呼ばれるもので、仕様として

  • 時間利用 (ヴァージョン1)
  • ユニーク名利用
  • 乱数利用 (ヴァージョン4)
などのバージョンがあります。JavaのutilのUUIDは乱数利用です。この乱数を呼び出す処理が1つの特定のマシンからなら乱数でもかまいませんが、複数の異なる場所で呼び出される場合、同一のIDができてしまうおそれがあります。

そこで、ヴァージョン1のUUIDをどうやって生成するかですが、

というライブラリが、使えそうです。Macアドレスと時間を利用しているようで、良い感じに吐き出してくれます。



2012-04-17

GWT:java.lang.NoSuchFieldError: warningThreshold

EclipseのDynamic Web application のプロジェクトにてGWTのライブラリを追加してコンパイルをした際に、
java.lang.NoSuchFieldError: warningThreshold
というエラーが出る場合があります。これは、ライブラリの Order and Export においてGWTを上位にすることで解決できときがあります。
【Build Path】→【Configure Build Path】→【Order and Export】



試してみてください。

2012-04-06

Java:URLConnectionクラスでPOSTする際の注意点

基礎的なところだけどちょっとハマったので、、、、

JavaでURLConnectionクラスを利用したHTTPアクセスってのはそんなに難しいことではなくネットでも探せばサンプルはいろいろ出てきます。が、POSTについてはちょっとした注意点がありますので、紹介します。
  1. 接続する前にURLConnectionクラスでsetDoOutput(true)を設定する
  2. 必ず受信する
この2点です。とくに後者がキモですね。受信なんてしなくてもいい場合でも必ず受信してください。また、受信する際には
BufferedReader br = new BufferedReader(new InputStreamReader(urlcon.getInputStream()));
のようにURLConnectionクラスを利用してInputStreamReader、BufferedReaderを作成し、readLineしてください。

参考URL


2012-03-30

GWT:java.lang.NoClassDefFoundError: javax/validation/Path

GWTでRPCプログラムを実行した時に、
[ERROR] javax.servlet.ServletContext log: Exception while dispatching
incoming RPC call
java.lang.NoClassDefFoundError: javax/validation/Path
というエラーがでることがあります。これは、見ての通り
  • javax.validation.Pathクラスがない
っていうことなんですが、これはどのパッケージに含まれているんだろうと、、、実はこういったGWT-RPCに依存しているクラスについては、
  • gwt-servlet-deps.jar
をサーブレットコンテナのクラスパス(/WEB-INF/lib )にいれておけばOKです。


2012-03-23

KVM:Error polling connection 'qemu:///system': internal error Cannot find suitable emulator for x86_64

LinuxでKVMの設定をして起動しようとした時、
Error polling connection 'qemu:///system': internal error Cannot find suitable emulator for x86_64 
というエラーに遭遇したときは、マシンのバイオスの設定で、仮想化がDisableになっているはずです。Enableにしましょう。

2012-03-21

2011年度卒業生を送り出して

卒業おめでとうございます。本ラボからは5名の4年生が巣立ちました。今年は諸般の事情で例年より人数が少なめでしたが、おかげで研究指導しやすく、ゼミの運営でいろいろ新しい試みをすることができました。そのうち2名は大学院に進学です。どの進路に関わらずここからが人生のスタートということを忘れないでください。

1名が同窓会賞を受賞
今年は本ラボから1名学科同窓会賞の受賞者がでました。


先日のBLOGでも紹介したように、教育システム情報学会学生研究会で優秀ポスター発表賞を受賞した井手くんが、その功績により本学科同窓会賞に選ばれました。おめでとうございます。

卒業生へ送る言葉
今年も学科長のお話を踏まえて私からの贈る言葉を以下に書いてみます。
学科長のされていた話について、実は私も全く同じ考えをしていました。つまり、
  • 人生の岐路にたって判断に迷った時どうするか?
という選択のロジックの話ですが、私なりに言えば
  • 後悔した時のことを考えてどちらの後悔がマシか?
と考えるようにしています。というのも、人生どのように進んでも「後悔」というものは存在すると思います。隣の芝は青いってやつです。「あー、あの時ああしてれば。。。」という後悔。どちらの進路でも同じことを一度は思うはずです。その時、どちらの後悔がマシか?ということです。私の個人的な話を言えば、M2の時に「博士課程にいくか、就職するか?」というのを迷いましたね。この時、どっちの後悔がマシかな~?って考えてました。つまり、「あ~、あの時就職しておけばよかった」という後悔と「あ~、あの時博士課程に行っておけばよかった」という後悔。私は前者がマシだと思いました。だから、進学しました。皆さんも、どうしても迷ったときはこのロジックで考えてみてください。

ちなみに、後悔を前提とした生き方ってなんかネガティブに思われるかもしれませんが、そんなことないです。そもそも「後悔のない人生」なんてありませんよ。私の人生、後悔しっぱなしです。そして後悔は成長の母です。「あー、あの時ああしてれば、こうしてれば。。。」こういった後悔を原動力して、「よし次は。。。」と前を向いて進んでいくんです。だから人生楽しいんです。後悔したことにドップリ浸かって、ネガティブに後悔の海を航海しないでくださいね。


2012-03-10

平成23年度教育システム情報学会学生研究会


教育システム情報学会学生研究会に参加。4年生2名がポスター発表、院生1名が口頭発表です。
院生の発表はTwitterを利用したレスポンスシステムでした。クライアントシステムは全国大会と同様、実際に動かしてプレゼンすることができましたが、肝心のサーバー部分がちょっとうまく行かず。。。今後対策を練る必要ありです。
4年生2名は昨日に引き続きということでしたが、ポスターなので1時間たっぷり話ができました。タブレットのシステムはデモを交えたポスターだったので、その有用性が評価されたのか、優秀ポスター発表賞を受賞しました。発表した井手くんおめでとうございます。Kinectのシステムについては、いろいろツッコミを受けていたようですが、それは研究のポテンシャルを感じとっていたからだと思います。つまらないシステムには質問はこないですから。。。いろいろ質問の中で、今後の研究ネタも見えてきましたし。

今回は賞を受賞することができ、得るものがたくさんありました。この勢いに乗って新年度を迎えたいものです。

2012-03-09

平成23年度電子情報通信学会関西支部学生研究会


立命館大学にて、電子情報通信学会関西支部学生研究会に4年生2名が発表しました。4年生が発表するのは3年ぶりかな。。。はじめての学会発表でしたが、卒論発表も経験しているので過度の心配は不要で、発表も無事終わりました。
タブレットの研究は思ったよりもウケが良かった感じ。Kinectの研究はベースシステムということもあり、研究としてのアピールがしにくかったようだ。まあこれからの研究なので気にすることはないでしょう。
明日も別の学会の研究会発表です。連チャンですがいい経験になるでしょう。



2012-03-07

GWT: Unable to find ~gwt.xml on your classpath

EclipseでのGWTの開発において、複数のGWTモジュールを1つのプロジェクトに併用している場合に標題にあるように,
GWT: Unable to find ~gwt.xml on your classpath
というエラーが発生。エラーとしては、
  • 実行しようとしているGWTのモジュールファイルがない
ということなのだが、そもそもそのモジュールは呼ぶつもりもなく、Run ConfigurationのGWTの設定タブからも削除している。にもかかわらず、Eclipseがそのモジュールを読みにいこうとしているというバグっぽい現象。
で、解決策ですが、Run ConfigurationのArgumentsの欄をよーく見ていると、そこにモジュールの情報が書かれていて、無効にしているはずのモジュールが残っているという、、、しょうもないバグですがこれで半日潰しましたよ。

2012-03-06

GAE:Unable to restore the previous TimeZone

EclipseでGAEプロジェクトを起動しようとしたら、
Initializing App Engine server [ERROR] Unable to start App Engine server java.lang.RuntimeException: Unable to restore the previous TimeZone
というエラーが発生。どうやら実行時のタイムゾーンの設定が必要らしい。手順は以下のとおり。
  1. Run Configurationを開く
  2. Argmentsを開く
  3. VMのオプションとして、-Dappengine.user.timezone=JST  または  -Dappengine.user.timezone.impl=JST のどちらかを追記。(追加はスペースを開けること)


2012-03-05

GWT4NB:複数モジュールが未対応になっている件

以前の記事([GWT]GWTの起動プロセスを理解し、複数のGWTモジュールを設定する)でNetbeans with GWT4NBにて1つのプロジェクトにて複数のGWTモジュールを扱う方法を書きましたが、現状のGWT4NBではできなくなっている模様。。。GWTの複数のモジュールに対してコンパイルはできているようだが、最後のところでエラーを吐いてストップしてします。
悲しいかな、マイナーなツールを使う故でしょうか。。。もうこれを機会にNetbeansを使うのを辞めるというのもありかなーと思いつつ、やっぱり諦めきれないんですよね。実際、Netbeansを使うほうが便利なことが多いですしね。しかし困ったもんです。

2012-03-03

VMWare FusionでJavaを利用する際の問題

VMware Fusion上のWindows7にNetbeansをインストールしようとしてトラブったのでメモ。
まず、Vmware Fusion上のWindowsにおいて、
Javaのuser.homeプロパティが¥¥vmware-host¥Shared Foldersになる
というバグが発生する。これがどう問題になるかというと、Netbeansはインストール時にユーザホームディレクトリにファイルを一時的に作成しようとする。このディレクトリ(¥¥vmware-host...)にはファイルのアクセス権限がないので、その一時ファイルが作成できずインストール失敗ということになる。解決策として
  • Java起動オプションを設定できるにであれば、別のディレクトリを設定する
  • VMWareFusonの共有設定をやめる
のいずれかがある。この問題はNetbeansのインストール以外でも起きる可能性があるらしいのでとりあえず後者を選択したが、状況においじて臨機応変に変えていけばいいだろう。


CSEでSQL Azureにアクセスする方法

SQL Azureを使う際の厄介な問題として、
  • クライアント環境が用意されていない
というのがあります。ウェブ経由で見れないというのはどうしたものかと思いますが、いちおうMicrosoft® SQL Server® 2008 Management Studio Expressというを使えばいいわけですが、これはちょっと大げさすぎ。で、ベストなソフトを見つけました。
です。実はおちラボでは過去にMySQLとかPostgreSQLのクライアントとしてCSEを使っていたのですが、CSEは安定して使いやすいソフトとして定評でした。CSEにはODBC経由でデータベースに接続するという方法があり、これを利用することでSQL Azureに接続できます。以下、設定方法を簡単に紹介します。

ODBC設定
  1. コントロールパネル→管理ツール→データソース(ODBC)を開く
  2. ユーザDSN→追加→SQL Server Native Client
  3. データソース名はわかりやい名前で
  4. サーバ名はSQLAzureのサーバ名(****.database.windows.net)
  5. ログイン名は@付きの名前で
  6. パスワードは忘れずに
  7. 規定のデータベース(接続するデータベース)を設定。デフォルトはmasterになっているので変更は必要です。
  8. (任意)システムメッセージを日本語に
以上によりODBC設定が完了します。

CSEでの接続
  1. データベース→接続
  2. DBMSをODBC汎用にする
  3. データソースは先ほど設定したのを選択
  4. ユーザ名パスワードを入力
以上で接続できるようになります。

ちなみにこの方法(ODBC)をもちいれば他のデータベースソフトを利用することも可能でしょう。これでラボでも本格的にSQLAzureを利用できそうです。


2012-03-02

SQLAzureがいいかも!

ここ最近、クラウドのデータベースを何にしようかずっと試行錯誤してきましたが、コストならびに技術的な面でSQLAzureが妥当であると結論づけました。以下、その簡単な理由です。

圧倒的に安い
  • 100MBまで約437円/月(1Gまで約873円)
  • 受信データ転送無料(データセンターへのアップロード)
  • 送信データ16円/1GB(データセンターからのダウンロード)
という感じではっきりいって安いと思います。

Javaからもアクセス可能
マイクロソフト系言語は当然つかえますが、Javaからもアクセスできます。必要なのはJDBC(sqljdbc.jar)だけ。特別なSDKは必要ありません。

O/Rマッパー(Hibernate)が使える
RDBを使うなら当然、O/Rマッパーを使いたいところですが問題なくつかえました。JDBCのフレームワークの範囲内ですので、基本的にはなんら変わりがないということです。
欠点として他のクラウドデータベースサービスと異なり、おそらくスケーラビリティは若干低いかと思います。ただ、個人的にはそんなことはどうでもよくて、とにかくメンテナンスを気にする事無く、大学だけでなく自宅からもSQLサーバーが使えるってのはほんと嬉しいですよ。
まあ、KVSなデータベースをかっこ良く使いこなしたい気持ちもあるんですが、RDBに慣れ親しんでますしね。。。

P.S
先日、利用しようと思った矢先に、WindowsAzureのサービスが閏年バグで一斉停止しましたのはちょっと先行きが心配ですが、それでも1日後には治ってますしそのへんは安心かな。



2012-02-28

低コストなのはやはりGAEなのか 〜Elastic Beanstalkを触ってみて〜

先日からAmazonのJavaのPaasであるElastic Beanstalkを使っているのだが、思ったより金銭的コスト高い気がしてきた。Beanstalkはそれ自体の料金は無料で、バックで動いているEC2などの利用料金が取られる仕組みになっている。このバックで動いているサービスが厄介な感じだ。 

インスタンス課金の問題 
例えば、EC2はインスタンス単位の従量制課金になっている。GAEもインスタンス課金に変わったが、ちょっとこれとは意味が違う。まず、バックで動くEC2インスタンスは、ウェブアプリにアクセスに関わらず常時動いているということになる。先日でお試しでEnvironmentを作ってちょっとアプリを置いて、数回試しただけなのだが、Account Activityを確認してみたら、
Amazon EC2 running Linux/UNIX 186 Hrs 
となっている。186Hrsってどういうこと?アカウント作成したのはほんと数日前で、ほとんどアクセスしてないのに。。。なぜ186時間なのかといえば、
  • アクセスがなくてもインスタンスは起動し続けている
  • 1Environmentごとに1インスタンスが起動
という仕組みで、お試して2つぐらいEnvironmentを作ったままにしていたからそうなった感じ。まあこれは世間的にはあたり前のことかもしれないけど、今までGAEしか使ってなかったものからするとちょっと意外なんですよね。

もれなくサービスがついてくることの問題
Elastic Beanstalkってとても高機能なJavaサーブレットコンテナですが、それはつまり単体のサービスではなく、いろいろなサービスを組み合わせたものであると。。。しかも有料のね。おさらいするとElastic Beanstalkとは、
  • Amazon EC2
  • Amazon EC2 EBS
  • Elastic Load Balancing
  • Amazon CloudWatch
  • Amazon Simple Notification Service
がバックで動いていることで、スケーラビリティの高いPaaSを実現しているわけですが、これらは使うと当然課金されます。で、やっかいなことにBeanstalkではこれらのサービスがもれなくついてきます。ロードバランサーなんかいらないんだけど、、、といっても外せません。だから、ロードバランサーについても今現在で、
Elastic Load Balancing 199 Hrs
という課金になっています。これは1Environmentを構築するたびに、Load Balancingも立ち上がっているということが原因です。

文句があるならEC2で環境構築しろや
まあ、そういうことでしょうね。EC2単体でLinuxを用意してそこで環境整備すればそれで解決するのだとは思います。ですけどね、、、環境整備が面倒だからこういったPaaSに感心があるわけでー。逆に言うと、そういう手間暇かからないんだから金は取られて当然ってことになるんですかね。

やっぱりGAEって安いのかな
そう考えると、GAEってやっぱり安い気がします。インスタンスは、アクセスが有るときのみ動いているようですし無料枠もあります。GAEが正式版になって、「1日28インスタンスだけ?!高すぎ」とか思ったりしましたが、使わなければ課金されないという手軽さがあるんですよね。

AWSにも無料枠はありますので、実際今のところ課金は発生していません。ただ無料枠適用は最初の1年だけのようですし、今後、永続的に利用する環境となるとちょっと心配です。まあ、毎月数千円でインフラが整うっているのは、一般的にみると安いんでしょうね。大学はいちおう回線ありますし、マシンもありますから別にEC2とか使わなくてもいいのでは?と思われるかもしれませんが、やはりメンテナンスが。。。研究室レベルのちょっとしたインフラとしてはちょっとBeanstalkやEC2は割りに合わないのかなぁ。




2012-02-26

Netbeans7.0.1でGAEプラグインを動かす

Netbeans7.0.1でGAEのプラグインを動かそうとしたのだが、相変わらず7以上のバージョンに対応したプラグインは存在せず。仕方なく6.9用のプラグインをダウンロードするもインストール時に
Javaヒント(バージョン4以上)が必要です
というエラーが発生してインストールできないという事象が発生。ネットでもあんまり話題になっておらず(NetbeansでGAEってマニアックな感じだし)、どうしたものかと困っていましたが解決策がわかりました。
6.7.1用のプラグインをkenaiからダウンロードする( http://kenai.com/downloads/nbappengine/1.0_NetBeans671/updates.xml)
ことで解決しました!プラグインの設定画面から上記URLを登録してください。これは解決したことになったのか?バージョン古くてちゃんと動くのか完全には未確認ですが、とりあえずJettyが起動してサーブレットを動かくすことはできました。

P.S
最後にサーバを追加した時に、なぜかエラーというかサーバが追加できない事象が発生しましたが、これは8080ポートが他のサーバとかぶっていたからのようで、別のポートにすることで解決しました。



2012-02-25

考察:クラウドなプラットフォームの選定あれこれ

大学というのはネットやコンピュータをある程度自由に使える環境をもっているわけだが、基本、メンテナンスは自分でやる必要がある。永続的にメンテナンスをしてくれる人材を確保できるであればかまわないが、残念ながらなかなかそうになならない。だから自分でやるしかないといっても時間は絶対的に少ない。そんな余裕はない。。。だから、インフラについてはクラウドなサービスにまかせようというわけで、手をつけたのがGAEだったわけだが、、、

GAEの使い勝手が悪くなってきたか、、
GAEの正式リリースに伴いちょっと雲行きが怪しくなってきた。最大のネックはDataStoreの課金問題。課金の仕組みに問題があり、あっという間に無料枠を飛び越え、しかもかなりの額になるという話題を耳にしており、おそらく現在もそのままだろう。同じ研究者仲間もGAEの利用はやめるとか言ってたし。。。
金額の問題をカバーするためにはシステム設計で工夫が必要になる気配で、開発効率を下げるような手間暇をかけるのはできるだけ避けたい。どうせ金を払うんだったら自由度の高いインフラがいい。。。ということで、現在、AWS、アマゾンウェブサービスも視野に入れていろいろやっている。

データベースはニュートラルなプラットフォームがベターか
データベースというのはシステムにおいて重要な位置づけであるが、GAEよりもAWSをプラットフォームにしたほうが良いことに気づいてきた。AWSには幾つかのDBサービスがあるが、これはいろいろなインタフェースでアクセスが可能なようになっている。一方、GoogleのDatastoreはどちらかというとGAEと密な関係にある。GoogleのDatastore使うならGAE一択になってしまい、ロックインされてしまうおそれが高い。AWSのデータベースは、ウェブアプリだけでなく、通常のアプリからもアクセス可能。C#にも対応してるので、いろいろな研究プロジェクトでのちょっとしたDBとして使えそう。そういうことを考えるとAWSのほうがよい気がする。

GAE+AWSのソリューション
AWSは正直関心がなかったのだが、いつのまにかJavaが動くPaasが始まっている。GAEよりも自由度が高く、金銭的な問題を気にしなければAWSのほうがいいかもしれない。
また、適材適所でGAEとAWSを使い分ければ、金額的にも安く収まるんじゃないかなというきがしている。DBが不要なライトなサービスはGAEで十分だし、無料枠はそれなりに魅力。
一番の理想は、GAEでAWSのデータベースを呼び出すこと。実は、GAEの制約によりAWSのSDKは利用できないことになっている(GAE対応に対応したSDKの亜種も出ているが、ちょっとバージョンが古く最新版はまだ対応していない)。とりあえずデータベース周りの処理は、AWS上にProxyみたいなのを用意して対応する予定(技術的な目処は経った)。この点については、後日BLOGで取り上げたい。

とまあ、ちょっと独り言的なネタでしたが、たまにはこういうのもいいでしょう。

2012-02-24

DynamoDB:IAMでのUserPolicyによるアクセス制限

諸事情で、ちょっといまAWSのDynamoDBについて調査中のメモ書き。
DynamoDBをラボで利用しようかと検討しているのだが、問題となるのはゼミ内で共有する時に問題となるのがテーブルへのアクセス制御。EclipseのPluginを使うとテーブルが全て見えてしまうのでこれは正直都合が悪い。そこで、要求仕様として
  • ユーザごとにテーブルへのアクセス制限をする。具体的にはテーブルを見えないようにする。
というのを設定したわけだが、ここでちょっとハマった。。。
DynamoDBではIAMを用いてポリシーを記述することができるらしく、DynamoDBのテーブル参照のActionはおそらく、
  • dynamodb:ListTables
なんだろうと推測。これをユーザとテーブルに対応したARNでDenyさせとけばいいと思ったわけだが、どうやらListTablesのアクションはARNでは制御できないとか。。。。
具体的にいうと
"Resource": "arn:aws:dynamodb:*:xxxxxxxxxxxxx:table/table1"
という記述で、table1に対してDenyするということはできない。ここは、
"Resource": "*" とするしかないわけだ。つまり、
  • テーブルリストは全て見せるか全て見せないかの2択。
  • アイテムの参照のレベルでテーブル毎にアクセス制限をつける
という戦略をとるしかないようだ。具体的には、
  • 全てのリソース(テーブル)に対する"dynamodb:ListTables"をAllowとするステートメントを用意
  • 特定のテーブルに対してアイテムのScanやCRUD操作ができるActionをAllowとするステートメントを用意
とすれば良いようだ。

なお、テーブル毎にステートメントを書いていくのは面倒な気がするがちょっとしたコツがある。AWSのARNの書き方では、*を利用した前方一致の指定ができる。そこで、プロジェクト毎にテーブル名の名前の付け方を決めておけば、*で一発で検索できる。例えばtest用のテーブルにtestという接頭語をつけるようにしておけば、test*の指定でOKとなる。


EclipseのGWTプラグインのHTML生成ウィザードにバグ?

EclipseのGWTプラグインHTML生成ウィザードにちょっとバグがあるようなので2つほど取り上げときます。

旧バージョンにバグ
1つ目は既に解決済みのバグですが、古いバージョンだとHTMLファイルが生成されない模様(ネットでも同様の指摘があり)。Finishを押してもウィザードが閉じずに何も作られない現象が起きることがあります。これは古いバージョンで起きていたようで、もしこの現象が生じたらプラグインを最新版にアップデートしておきましょう。

現バージョンでもバグ?
もう1つはおそらく現在も治っていないバグですが、ウィザードで生成されるHTMLファイルが正しく生成されません。このHTMLはアプリの実体、つまりnocache.jsファイルへの参照が記述されてるのですが、その参照の記述が正しくされないというバグが起きています。具体的にいうとnocache.jsだけ書いてあって、ディレクトリとかパッケージ名が正しい名前が書かれていません。実際にこのファイルがどこに配備されるのかは、GWTコンパイラが生成するファイルみればわかりますので、その通りにしましょう。まあだいたい、
モジュール名/モジュール名.nocache.js
という記述になっているはずです。

なお2つめのバグは、Dynamic WebApplicationプロジェクトでGWTを利用した際に発生しました。動作環境はEclipse3.7 with GWT2.4 on Macです。GWTを利用するときは普通はGoogleのWebapplicationプロジェクトを利用するので、ほとんどの人はHTMLファイルウィザードなんて利用してないから気づいてないのかもしれません(あるいは私の固有のバグ?)。


2012-02-22

[GWT:エラー] reportUnusedDeclaredThrownExceptionIncludeDocCommentReference

EclipseでTomcatの環境でGWTをコンパイルしようとした時に、標題にあるようなエラーが出ました。詳しく書くと、
java.lang.NoSuchFieldError:reportUnusedDeclaredThrownExceptionIncludeDocCommentReference
という感じです。これの解決策ですが、ライブラリの参照順番によってこのようなエラーがおきるようです。具体的に言うと、
  • Tomcatライブラリの参照の前にGWTのライブラリ参照をする
という方法で解決できます。Eclipseでは[Configure Build Path]→[Order and Expert]のところでクラスパスの順番を変えることでOKなようです。

このように、GWTSDKを上の方に持ってくることでコンパイルが成功しました。

P.S
ちょっと現在、GAEからの脱却を図りつつGWTを利用していく方針を検討しているのですが、Netbeansだったらすんなりサーバ切り替えでで対応できるんですが、EclipseはGAEとGWTが結構密接に関係しているようで、GAEに依存しないGWTアプリを作るにはちょっとした手間がかかりそうです。


EclipseのGAEローカルサーバーにlocalhost以外からアクセスする方法

ちょっとハマったのでメモ書き。

EclipseのGAEローカルサーバ(つまりJetty)に、LAN内の他のマシンからアクセスすることができないという事象が発生。もちろん、LANの環境は問題なく設定されています。で、原因なのですが、EclipseのGAEローカルサーバはデフォルトでは外部からアクセスができないようになっているらしい。具体的にいうとサーバが自分のIPを認識できてない模様?で、localhostでは反応するがIP直接指定だと同じマシンでもダメ。。。ということになっている。それを解決する設定は下記の通り。

  • Run→RunConfiguration→Arguments→Program argumentsを開く
  • 左ペインから 設定したい Web Application名を選択←間違えないように。
  • --address=xxx.xxx.xx.xx を追記(xxxのところは自分のマシンのIPアドレス)

そうすることで、IPアドレス指定のアクセスに反応してくれます。

以前は、こんなことをしなくても動いてくれたたはずなので、、、、いつのバージョンから変わったんだろうか。

2012-02-07

Global Android Dev Camp Kyotoが開催されます

2/17 ~2/19 に世界各地でGlobal Android Dev Campなるイベントが開催されます。 関西では、京都リサーチパーク京都にて、主催:京都GTUG、協催:神戸GTUG、日本Androidの会 (関西支部、神戸支部、京都支部)によりGlobal Android Dev Camp Kyotoを開催します。
私は残念ながら参加できませんが、おちラボから学生が1名参加予定です。世界的なイベントに乗る絶好の機会ですので、興味が有る方はぜひ!
詳細は、京都GTUGのサイトを御覧ください



2012-02-01

C#: OpenCVSharpでビデオファイルを作成する

OpenCVSharpを利用したビデオファイルの作成する方法です。
上記プログラムでは省略してますが、bmpVideoという変数はBitmapクラスで、フレームに相当する画像データだと思ってください。画像をIPLImageに変換し保存する。。。という処理を繰り返すことで、動画が出来上がります。ただし、最後に必ずVideoWriterはDisposeしてください。この処理をしないと再生できないAVIファイルができあがります。

2012-01-27

第17回電子情報通信学会関西支部学生会研究会にエントリーしました

電子情報通信学会関西支部学生会が主催する研究会におちラボより4年生が2名エントリーしました。3月に開催されます。この研究会へのエントリーは2度目で、前回は2008年度の卒業生(4年生)が3名発表しましたので3年ぶりとなります。
3月というのは既に卒論発表も終わってほっと一息。。という時期ですが、自分の研究成果を対外的に発表するというのはなかなか経験できないことです。できれば毎年発表してくれるとうれしいんですが。。。

2名の4年生には別の学会の研究会にも発表して貰う予定で、落ち着く間もなく、卒論執筆と並行して新たに研究会の原稿執筆をしています。大変ですが、後々につながるよい経験になるでしょう。

2012-01-17

Java:オブジェクトをバイト配列へ変換する

クラスオブジェクトの情報をバイト配列へ変換する処理のメモ書きです。
ByteArrayOutputStream baos= new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(/* ここの引数に変換したいクラス変数を渡す*/);
       
oout.close();
bout.close();
        
//こんな感じでbyte配列になります。
byte[] bytes = bao.toByteArray();
デシリアライズする際の方法は以下のとおり。
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
 
//キャストして元に戻してください。
object = (/*キャスト*/)oin.readObject();


2012-01-12

JavaMailプログラム ~簡略版~

先日の記事はちょっとわかりにくかったので、もっとシンプルな記述を掲載します。なお、下記のプログラムではメール本文を由緒ただしく、7bitエンコーディングしてます。
 Properties props = new Properties();
 Session session = Session.getDefaultInstance(props, null);

 InternetAddress toAddress = new InternetAddress(message.getToAddress(), message.getToName(), "ISO-2022-JP"); // 
 InternetAddress fromAddress = new InternetAddress(message.getFromAddress(), message.getFromName(), "ISO-2022-JP"); // 

 MimeMessage mmessage = new MimeMessage(session);
 mmessage.setFrom(fromAddress); 
 mmessage.addRecipient(Message.RecipientType.TO, toAddress);  
 mmessage.setSubject(message.getMailSubject(), "ISO-2022-JP");  
 mmessage.setText(message.getMailText(), "ISO-2022-JP");  
 mmessage.setHeader("Content-Transfer-Encoding", "7bit"); //最後にエンコーディングしたほうがいいはず

 Transport.send(mmessage);  //送信
プログラム中のmessageという変数は、メールの各種情報(To,From,Subject,Body)がはいっているクラスを思ってください(getterで呼び出している部分は、実際のデータが入った文字列として読みかえてください)。

2012-01-10

Java: メール送信プログラム

JavaMailを利用したメール送信プログラムです。いちおう添付ファイルを2つ添付できますが、ここの処理はあまり参考にしないほうがいいです。
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class MailSender{
    //日本語の文字コード
    public static final String JAPANESE_CODE = "ISO-2022-JP";
    
    //通信情報
    private String to, from, host;
    private boolean debug;
    
    //題名、本文、添付ファイル
    private String subject, text;
    private File file1, file2;

    //Toと添付ファイル以外を初期化
    public MailSender()
    {
    }
    
    public void setTo(String to)
    {
        this.to = to;
    }
    
    public String getTo()
    {
        return to;
    }
    
    public void setFrom(String from)
    {
        this.from = from;
    }
    
    public String getFrom()
    {
        return from;
    }
    
    public void setHost(String host)
    {
        this.host = host;
    }
    
    public String getHost()
    {
        return host;
    }
    
    public void setDebug(boolean b)
    {
        this.debug = b;
    }
    
    public boolean getDebug()
    {
        return debug;
    }
    
    public void setSubject(String subject)
    {
        this.subject = subject;
    }
    
    public String getSubject()
    {
        return subject;
    }
    
    public void setText(String text)
    {
        this.text = text;
    }
    
    public String getText()
    {
        return text;
    }
    
    public void setFile1(File file1)
    {
        this.file1 = file1;
    }
    
    public File getFile1()
    {
        return file1;
    }

    public void setFile2(File file2)
    {
        this.file2 = file2;
    }

    public File getFile2()
    {
        return file2;
    }
    
    //メールを送信する
    //戻り値:正常に送信された場合は true、そうでない場合は false 
    public boolean send()
    {
        try
        {
            MimeMessage message = getMimeMessage();
            message.setContent( getMultipart() );
            Transport.send( message );
            return true;
        }
        catch(Exception e)
        {
            return false;
        }
    }
    
    public Properties getProperties()
    {
        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.host", host);
        props.put("mail.from", from);
        
        if(debug) props.put("mail.debug", debug);
        
        return props;
    }
    
    public Session getSession()
    {
        Properties props = getProperties();
        Session session = Session.getInstance(props);
        session.setDebug(debug);
        return session;
    }
    
    public MimeMessage getMimeMessage() throws Exception
    {
        MimeMessage message = new MimeMessage( getSession() );
        
        message.setFrom(new InternetAddress(from));
        InternetAddress[] address = InternetAddress.parse(to);
        message.setRecipients(Message.RecipientType.TO, address);
        message.setSubject(subject, JAPANESE_CODE);
        message.setSentDate(new Date());
        
        return message;
    }

    public Multipart getMultipart() throws Exception
    {
        Multipart mp = new MimeMultipart();
        mp.addBodyPart(getTextPart());
        mp.addBodyPart(getFilePart1());
        mp.addBodyPart(getFilePart2());
        return mp;
    }

    public MimeBodyPart getTextPart() throws Exception
    {
        MimeBodyPart part = new MimeBodyPart();
        part.setText(text, JAPANESE_CODE);
        return part;
    }

    public MimeBodyPart getFilePart1() throws Exception
    {
        MimeBodyPart part = new MimeBodyPart();

        FileDataSource fds = new FileDataSource( file1.getPath() );
        part.setDataHandler(new DataHandler( fds ));
        part.setFileName(MimeUtility.encodeWord( fds.getName() ));

        return part;
    }

    public MimeBodyPart getFilePart2() throws Exception
    {
        MimeBodyPart part = new MimeBodyPart();

        FileDataSource fds = new FileDataSource( file2.getPath() );
        part.setDataHandler(new DataHandler( fds ));
        part.setFileName(MimeUtility.encodeWord( fds.getName() ));

        return part;
    }
}
    
上記クラスの利用例です。
    public  void test(){
        MailSender ms = new MailSender();
       //下記に適切なデータを記述
        ms.setFrom("");
        ms.setTo("");
        ms.setDebug(false);
        ms.setHost("");
        ms.setSubject("");
        ms.setText("");
        //添付ファイルがある場合(任意)
        ms.setFile1( new File("") );
        ms.setFile2( new File("") );
        //メール送信
        ms.send();
    }


2012-01-05

全角文字列を検索する方法

国際論文や国際会議プロシーディングスを執筆する時には当然言語は英語になりますが、電子投稿をする場合に注意しなければならないのは、日本語文字コードを含めてはいけないということ。
英文の原稿を書くときは、日本語で書いた原稿をベースに英訳することも少なくないと思いますが、そこでついうっかり全角の文字が含まれることがあります。そのチェックは分量が多くなるほど面倒ですが、以下の正規表現で一発で見つかります。
[^\x01-\x7E]
試してみてください。




2012年:謹賀新年

2012年がはじまりました。今年もおちラボをよろしくお願いします。さっそく新年の抱負ですが、

  • 科研の成果を出せるよう今年が勝負
  • とにかくパブリッシュする
の2点をあげたいと思います。前者については、昨年度でいろいろ基盤のものができつつあるので、今年一年で成果を出せるように仕上げていくということ。後者については、その言葉通りとにかくパブリッシュする。。。当然論文が一番ですが、そうは簡単にはいかないもの。とにかく研究上の成果、ノウハウを学会発表やウェブを通して公開していくということですね。このブログもその1つです。たいしたことでなくても、とにかく公開していきたいと考えてます。
昨年は100件のBLOG更新をしたようですので、今年もそれ以上を目指していきたいですね。