2011年12月27日火曜日

GWT: Objectifyで得た検索結果をGWT-RPCへ直接送る方法

御存知の通り、GWT-RPCでは送受信するクラスに制約があります。Objectifyで検索をした場合、結果に複数の結果を受け取るときは、QueryクラスやIterableインタフェースで受け取ることになります。この結果をGWT-RPCを利用して直接クライアント側に返す時には、Iterableインタフェース等は送信できないのでようなので、下記のようにリストに変換してから返すことになります。
Query ql = cdao.ofy.query(XXXX.class).filter("key", Key);
List list = ql.list();
return list;


2011年12月21日水曜日

インドア・ストリートビュー・ハンズオンに参加してきました




京都GTUGで開催されたインドア・ストリートビュー・ハンズオンに参加してきました。GoogleMap Expertの勝又さんによる講習です。

インドア・ストリートビューとは
簡単にいうと、GoogleMapに実装されているストリートビューというのがありますが、それの屋内版です。EverySpaceというのが同様のサービスをやってますね。

作成のポイント
今回は、最後までストリートビュー上で見れる段階まで実装する時間がありませんでしたが、ポイントはわかりました。ずばり、如何によい写真を用意しておくかです。実装の部分は定型的なものですので、インドア・ストリートビューのコンテンツづくりが肝です。

写真撮影方法
カメラならなんでもOKですが、魚眼レンズのような視野角の広いと良いです。本ハンズオンでは
円形魚眼レンズ ( KSW-4 )
を利用しました。これを用いで、1枚ずつ体を回転させながら360度の写真をとって行きます。最低でも1周で6枚ほどは欲しいところです(魚眼レンズを利用しないと枚数は増えます)。上方と下方が必要ですので、最低でも18枚は必要ということです。実際やってみると難しいです。慣れも必要ですね。

写真の加工
本ハンズオンでは
PTgui
を利用しました。このソフトである必要はないと思いますが、これがオススメのようです。実はこの加工処理が一番大切で一番時間がかかるところでしょう。冒頭の写真はそのソフトを利用して作成したものです。18枚の写真を組み合わせて作成されています。ちょっとできはイマイチですが、なんとなくそれっぽいでしょ?

ストリートビューへの実装
実はここは時間切れでデキませんでした。。。ストリートビュー用にさらに写真を加工してサーバーに写真をアップし、それから、、、ということのようです。プログラム自体はJavaScriptでできるようです。

インドア・ストリートビュー、、、これはなかなか面白そうな可能性を秘めてますね。研究テーマに何かできないかなぁ。


P.S
360度の写真撮影ですが、
Microsoft PhotoSynth
というフリーのソフトがなんかよさそうです。


少し試してみましたが、ガイド付きで撮影できるので撮影漏れを防げそうで良さそうです。




2011年12月16日金曜日

ObjectifyでRelationShipを利用する

GAEのDataStoreはKVSのデータベースですので、RDBのようなリレーションがないと言われていますが、実際にはRelationshipという所有関係を定義することができます。Objectifyでは比較的容易に設定することができます。

サンプルの設定状況
サンプルプログラムの設定状況は下記の通りになります
  • ユーザを表現するPersonクラス
  • 車を表現するCarクラス
  • Carクラスはユーザ(Person)の情報を持つ
このことを頭にいれて以下を読んでください。

Entityクラスの記述方法
@Parentのアノテーションをつけるのがポイントです。
public class Car
{
    @Id Long id;
    @Parent public Key owner;
    String color;
}

public class Person
{
    @Id Long id;
    String name;
    int grade;
}
リレーションの登録
Keyを割り当てるのがポイントです。
//Personデータを登録し、そのKey情報を得る
Person p = new Person();
p.name="bob"; 
Key pKey = ofy.put(p);

//入手したKey情報を割り当てる
Car car = new Car();
car.id=(long)1002;
car.owner=pKey;
car.color="blue";
リレーションを利用した検索
色が青色の車のユーザを検索する方法は下記のようになります。
Car car = ofy.query(Car.class).filter("color", "blue").get();
Person p = ofy.get(car.owner);
ID情報をベタに管理するよりも簡単に検索することができますね。

2011年12月9日金曜日

インドア・ストリートビュー・ハンズオン

京都GTUGにて、「インドア・ストリートビュー・ハンズオン」が開催されます。
インドア・ストリートビュー・ハンズオン
自分でストリートビューを作るってのは面白そうだと思いませんか?また、教育システムにもなにかいろいろ応用できそうな気がします。僕はスタッフとして参加しますが、これを機にGoogleMap APIについても勉強もしようかと思ってます。

2011年12月7日水曜日

マルチスレッドでコンポーネントを操作する

C#のGUIアプリでいろんな処理を行う場合、マルチスレッドを利用してメインのスレッドとは別に処理を並行実行させるといったことは定石ですが、
  • 原則として別スレッドからコントロール対して操作をすることができない
という制約があります。もちろん原則としてということですから抜け道はあります。以下はその方法です。
参考サイト(ソースコード):

Windowsアプリケーションにおけるマルチスレッドの注意点(C#と諸々)


2011年12月1日木曜日

JSiSE関西支部学生研究発表会について


関西支部 学生研究発表会が
 日時:平成24年3月10日(土) 13時から
 場所:関西学院大学大阪梅田キャンパス 10階
にて開催されます。

  • 申し込み締切:平成24年1月25日(水) 17時
  • 原稿提出締切:平成24年2月10日(水) 17時

詳細につきましては、関西支部HPをご覧ください。

---
本ラボからもエントリーする予定です。


2011年11月25日金曜日

OpenCVSharpというのがいいらしい

今までOpenCVは、C/C++で書いてきましたが、ラボの開発言語をC#に移行したためどうすればいいか試行錯誤していましたが、結局 OpenCVSharpというライブラリを使うのが無難ということが判明しました。
opencvsharp(OpenCV wrapper for .NET Framework)
当初は、C++の記述をC#で使えるようにラッパーする方法をとっていたのですが、既存のライブラリを使ったほうがてっとりばやいことに今更ながら気づいたので路線変更です。ただ、スピードを必要とするところはC/C++に分がありますので、そこは臨機応変に対応したいと思います。なお、ラップする方法は
C#とOpenCVの融合プログラミング―ライブラリのラッパーDLLを利用する 北山 洋幸
の書籍が参考になるでしょう。

Android:--no-crunchのエラーが出た場合

Androidアプリをコンパイルしている時に、以下のようなメッセージが発生。
ERROR: Unknown option '--no-crunch' 
crunchオプションとかなんだろ?、、、とか悩んでましたが、てっとり早い解決策は、ADTのアップデート。ADTのアップデートは必ず、Android SDK Managerから行うこと。しょうもない問題だったけど、このことになかなか気づかなくて苦労しました。

OpenCV:System.AccessViolationExceptionがでる問題

OpenCVのVideoWriterを使ったプログラムを書いていたら、下記のエラーが出てうまく動かない!
System.AccessViolationException
解決策は、OpenCVのバージョンを2.2から2.1へ下げることでOK。。。どうやら2.2は動画像処理系がよくないらしいですね。つまらないことで苦しめられました。

2011年11月22日火曜日

C#:グラフ表示コンポーネントNPlotが良い感じ

C#でデータをグラフ化するプログラムを作成しようとおもっていたのだが、NPlogというオープンソースのコンポーネントがあります
NPlot 公式サイト
最近、更新されてないようですが .Net framework4.0でも稼働確認しました。ちょっとグラフ表示したい時はてっとり早く使えそうです。なお実際は高機能らしいので、使いこなしてみるといろいろ応用ができるかもしれません。修正BSDライセンスです。

2011年11月20日日曜日

案内:教育システム情報学会関西支部第2回研究会 〜教育現場における動画・映像の利用〜

 教育システム情報学会関西支部では、11月27日(日)にCIEC(コンピュータ利用
教育学会)と共催で、第2回研究会を開催します。

 ━┳━━━━━━━━━━━━━━━━━━━┳━
 教育システム情報学会関西支部第2回研究会のご案内
 共催:CIEC(コンピュータ利用教育学会)
 ━┻━━━━━━━━━━━━━━━━━━━┻━

■テーマ:教育現場における動画・映像の利用

■日 時:2011年11月27日(日) 13:30~17:00
■会 場:大阪電気通信大学 駅前学舎1F 多目的ホール(1-101)
         (〒572-0837 大阪府寝屋川市早子町12-16)
        京阪電車「寝屋川市駅」徒歩3分
        (http://www.osakac.ac.jp/institution/access.html
       ・駐車場はありません
       ・ブーツやピンヒールでの入場はお断りします。

◆開催趣旨
 様々なe-Learningの活用が進められており、講義資料や理解度テストなどだけ
でなく、ソーシャルネットワーキング機能などの協調学習を支援する利用も増え
ている。今回の研究会では、映像の利用に着目して討議を行う。単なる講義映像
は各大学のOCW (Open Course Ware)でも提供されているが、それに留まらない映
像の利用方法や協調学習を行うためのしくみについて考えたい。

◆プログラム
○13:30 [開会挨拶]

○13:30- [講演1]
    『映画で英語を磨く自習学習プロジェクトにおけるmoodle活用のためのポ
イント』
         大倉 孝昭 氏(大阪大谷大学)

【要旨】DVD 映画を教材とするWeb-CALL”を開発した。独立したツールとしての
試験運用結果報告(国内学会)やWeb Based Education 2009(in Phuket)での
学習システム開発の発表を通じ、多くのCALL 実践者・研究者から「自分達も利
用したい」という要望を受けた。そこで、moodle 上のコースウェアとしてWeb-
CALL を提供し、自主学習で効果的に運用することを目指し、5週間の実践実験を
行った。“映画で英語を磨く自主学習プロジェクト”に高い関心を寄せる学習者を
集め、2つのグループ(2大学)で行ったところ、グループ間でプロジェクトの修
了率に大きな差が出た。提供機器、moodle の利用経験、Web-CALL のインタ
フェース、タスクの量、学習目標の設定、ファシリテーション(教師の支援)な
ど、さまざまな視点から検討を加え、デモンストレーションと、実践結果の報告
を行う。

○14:30 - [講演2]
  『自学自修ソーシャルラーニングシステム「学びあい」の構築』
     吉田 賢史 氏(早稲田大学高等学院)

【要旨】ソーシャルメディアを活用したソーシャルラーニングが注目されて
る。ソーシャルラーニングには、主に次の2つのアプローチがある。第1のアプ
ローチは、twitterのようなマイクロブログによる「つぶやき」から、教員が学
習者のコメントを引き出し、消極的な学生の授業(講義)への積極的な参加を促
そうというアプローチである。このアプローチは、一方向的になりがちな講義に
双方向性を持たせるという効果がある。これまでは、掲示板やチャットシステム
を教員自らサーバーに設置する必要があった。しかし、Twitterのようなマイク
ロブログの登場により、講義・授業への活用が容易になり、心理的敷居も低く
なったと言える。第2のアプローチは、facebookやmixiなどのソーシャルネット
ワークサービス(SNS)サイトを活用した「学びの場」の提供である。「学びの
場」として、SNS上にクローズドなグループを作成し、その中で教員が講義資料
やtwitterによるコメントを共有しようという試みである。これは、
LearningManagement System(LMS)/Cource Management System(CMS)的な利用方
法である。
  本研究会では、第3のアプローチとして学習者自身がコンテンツを作成する
学習形態(Learning by CreatingContents)を紹介する。学習者がコンテンツを作
成する手法として、web上でT2VPlayerによるコンテンツ制作システムについて
は、CIEC第1回研究会で述べている。しかし、当時のシステムは、制作されたコ
ンテンツを学習者同士が共有し、コメントしあう機能は提供されていない。そこ
で、コメントしあう機能を有しT2VPlayerと連動した学習コミュニティサイト
「学びあい」を構築した。このような、学習システムの紹介だけでなく、システ
ムの開発の背景となった学習者の思考スタイルや行動スタイルについて述べ、実
際の学習者の反応について報告する。

○15:30 - [総合討論]

○16:30 - [閉会挨拶]

■参加費:無料

■参加申込:不要(どなたでも参加できます)
        (ただし、会場定員50名)

■本件に関するホームページ:http://jsise-west.jp/
「Ustream中継を検討していますので、詳細は関西支部のホームページをごらん
下さい」

※懇親会は、自由参加で当日に募集します。



2011年11月19日土曜日

GWT-RPCでjava.lang.VerifyError

GWT-RPCで下記のようなエラーが出ていた件。
java.lang.VerifyError: Expecting a stackmap frame at branch target 206 in method xxxxxxx(Ljava/lang/String;)Ljava/lang/String; at offset 15
どうやらこれもJDK7が絡んでいる模様。GWT-RPCについてもJDK7は未対応の部分があるようだ。 というわけで、現状では、GWTやGAE系のアプリ開発環境へのJDK7のインストールは控えたほうが良い感じです。

2011年11月17日木曜日

Amazon API:仕様変更でアソシエイトIDが必須に

AmazonのAPI(Amazon Product Advertising API)を使っている某システムに久しぶりにアクセスしたらエラーが。。。。どうやらAmazonからのデータ入手に失敗しているらしく、
リクエストには、必要なパラメータが含まれていません。必要なパラメータには、AssociateTagなどがあります。
という意味不明なエラーが。。。どうやら仕様変更があったようで、そこに書いているように、 AssociateTagというパラメーターを追加する必要があるらしい。
このAssociateTagというのは、アフェリエイトを利用する際のIDのことで、これを見つけるのにちょっと迷いました。Amazon Product Advertising APIの管理コンソールを見ても書いておらず、どこにあるんだ~と思っていたら、Amazon アソシエイトに登録する必要があるらしい。このアソシエイトとAPIのアカウントは違うというところは注意事項です。

なお、今回の仕様変更は全く気が付きませんでした。メールなどを読み逃していたのかもしれません。クラウドなサービスを利用するのは注意が必要ですね。

Netbeans:GAEにデプロイしたプログラムが動かない件

NetbeansでGAEへアプリのデプロイする時にちょっとハマったので、ニッチなネタです。

諸事情で、GAEにアップしているアプリの微修正を行なって再度アップするとエラーが発生して動かない。。。エラーを見てみると、
java.lang.UnsupportedClassVersionError: org/apache/jsp/index_jsp : Unsupported major.minor version 51.0
というエラーが。これは、JVMが未対応のバージョンの時に発生するらしく、公式サイトに確認してみると
App Engine では、Java 6 仮想マシン(JVM)を使用して Java アプリケーションを実行します。
と書いてある。あ、今、このマシンにはJava 7が入っているんだった。。。というわけで、慌ててJDK6も入れて設定してみるがそれでも動かず、、、、

結論として、App EngineのSDKが古かった(1.3.3)ので、1.6にすることでとりあえず動きました。JDKは関係なかったのかもしれません(SDKが6用にコンパイルしてくれているのかも)。

2011年11月16日水曜日

Netbeans7対応のGWT4NBが出てますね

<この記事は古いので、、、>


いつのまにか、GWT4NBの最新版(2.10.4)が出てます!!2ヶ月ほど前からあったようで、ここ最近、Eclipseに浮気していたので全く気づきませんでした。
- compatible with NetBeans 7.0.1 (may will not run in old versions); - works with GWT 2.3;
Tags: gwt4nb gwt 2.3 netbeans 7.0.1
と書いてありますので、バージョンには注意してください。もうNetbeansは終わりかなぁとか思ってましたが、ウェブアプリ開発の導入環境としては個人的にはNetbeansのほうが簡単と思っているので、、、今後の身の振り方に悩みそうです。

2011年11月14日月曜日

MashUp Award7 にエントリーしました


おちラボの学生が中心になって、MashUp Award 7 というWeb APIのコンテストにアプリをエントリーしてきました。エントリーしたシステムは以下のとおり
PunchingTwit
Kinectを利用したゲームアプリで、Twitterとかはてなフォトライフなどのウェブ系のAPIも利用しています。キャラクターデザインや、BGMも全てオリジナルです。

今回は、Mashup Battlle in Kyotoにも参加してきました。他の学会と被っていたので、開発リーダーの吉澤くん(4年生)がひとりで3分プレゼンをしてきました。惜しくも1位通過とはなりませんでしたが、ほとんどが社会人を中心としたプログラミングの猛者たちの中で、自分達が作ったアプリをアピールできたのは貴重は経験になったと思います。

今回のコンテスト参加は、元々はKinect SDKの勉強がてらに目標としてチャレンジしたものですが、今後もこういったコンテストを積極的に活用して、単なる勉強だけに終わらないようにしたいと思っています。また、今回、デモビデオをYouTubeにエントリーしましたが、研究成果をこういった形で出すのも面白いかと感じました。

ラボとしては、研究成果を論文や学会発表だけでなく、コンテストやアプリ公開も視野にいれていく予定です。こういうことは随分前から思っていたことですが、ようやくそれを実行できる下地ができたというところですね。

2011年10月28日金曜日

[C#]スレッドプログラミング

C#でマルチスレッドプログラミングをする方法です。記述自体は特になにも難しいことはありません。 なお記述は簡単ですが、マルチスレッドのプログラミング自体は難しいです。安易に考えていると予期しない動作をすることがあるので注意してください。 また、スレッドにデータを渡す方法ですが別スレッドで呼び出すメソッドに引数などを定義することはできません。一番簡単な方法は同一のクラス内でマルチスレッドのメソッドを定義しているのであれば、クラス変数を利用してデータの授受をすることは可能です。 本格的にプロセス間通信をする場合はちょっとひと工夫必要ですので、それは後日取り上げたいと思います。

2011年10月27日木曜日

ActiveDirectoryでユーザアカウントの設定

毎年この時期になると研究室のゼミ生新配属が行われ、ゼミの準備としてユーザアカウントの作成と登録を行います。おちラボでは昨年度よりWindows2008サーバを利用したアクティブディレクトリのドメインを構築していますが、そこにユーザを登録するための処理をメモ書きしておきます。いちおう、要求仕様は以下のとおりです。
  • サーバはWindows2008サーバ。クライアントはWindows
  • アクティブディレクトリによりユーザアカウントを管理
  • サーバ側にあるフォルダをユーザのホームディレクトリに設定
まず最初に、ユーザのホームディレクトリを作っておきます。
mkdir user1
続いて、ユーザを作成します。以下では、ユーザ名、パスワード、ユーザのホームディレクトリをサーバのある場所に指定しています。実はこの記事での一番のポイントはここで、サーバ側にある共有フォルダをホームディレクトリを設定する際、アクティブディレクトリのGUI管理画面ではできなかったというのが元々の問題としてありました。下記のようにコマンド内で設定するとうまくいくというのがミソです。
net user user1 password /homedir:\\server\user1
最後に、ユーザのホームディレクトリを共有します。
net share user1=d:\home\user1 /grant:user1,FULL

以上はコマンドとして書いていますが、実際にはbatファイルで一括します。もうちょっと細かい設定もコマンドでできますが、とりあえずはこの変で十分というところです。


2011年10月26日水曜日

[C#]BadImageFormatExceptionのエラーに対応する

C#のプログラムで各種ライブラリを利用する際、
BadImageFormatException
というエラーが出てくる時がある。これは、64bit環境に起因する問題で、プロジェクトのターゲットCPUを32bitつまりx86に設定することで解決する。64bitネイティブにしたい気持ちはあるかもしれないが、.NET系のライブラリは64bitに完全対応しているわけではなさそうなのでその変は諦めよう。なお、デフォルトのターゲットCPUはanyになっているはずです。

2011年10月25日火曜日

[C#] JSONを利用する

C#には標準でJSONデータを読み書きするクラスが用意されています。このクラスを利用することでJSONデータをC#のクラスにマッピングすることができます。.NET4.0以降での対応のような気がしますので、プロジェクトの対象プラットフォームを確認しておきましょう(そうしないとライブラリを見つけることができませんので)。あとは以下のとおりです。

前準備
  • プロジェクトのプロパティにて対象プラットフォームが「.NET4.0Framework」となっているのを確認 
  • 参照設定(.NET)にて、System.Runtime.Serialization を追加
データクラスの作成
まず、jsonのデータを格納するためのデータクラスが必要です。今回は先日記事にしたgoo.glの短縮URLサービスが返すJSONを受け取るようにします。下記のようにデータコンストラクトを記述する所がポイントです。漏れのないように書いてください。
[DataContract]
    public class UrlInfo
    {
        [DataMember(Name = "kind")]
        public string Kind { get; set; }
        [DataMember(Name = "id")]
        public string ShortUrl { get; set; }
        [DataMember(Name = "longUrl")]
        public string LongUrl { get; set; }
    }
C#コード
関連するライブラリをインポート(using)するのは忘れないようにしてください。var宣言のところは実際のクラス宣言に置き換えてもいいかもしれません(未確認)。
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

var serializer = new DataContractJsonSerializer(typeof(UrlInfo));
var jsonBytes = Encoding.Unicode.GetBytes(surl);
var ms = new MemoryStream(jsonBytes);
var gURL = (UrlInfo)serializer.ReadObject(ms);
以上で、gURLにはjsonのデータが対応する各プロパティに入っていますので、gURL.ShortUrl等で呼び出すことができます。

[C#] Googleの短縮URLサービス(goo.gl)のAPIを利用する

TwitterにURLを投稿する時には、文字数の制限から短縮URLサービスを利用するのが常識となっています。Twitterクライアントを開発する時には当然そのAPIとの連携を実装しておく必要がありますが、今回はGoogleの短縮URLサービスである「goo.gl」を利用します。

やり方はいたって簡単です。特に登録処理をする必要もなく、以下のコードで呼び出すことができます。 なお下記のコードでは、変数url(stringクラス)に短縮したいURLが格納されているとします。
public string getShorURL(string url){ 
 string serviceURL = "https://www.googleapis.com/urlshortener/v1/url";
 string jsonRequest = "{\"longUrl\": \"" + url + "\"}";
 WebClient client = new WebClient { Encoding = Encoding.UTF8 };
 client.Headers["Content-Type"] = "application/json";
 return client.UploadString(serviceURL, jsonRequest);
}
結果は、JSON形式で以下のように返ってきます。

{"kind": "urlshortener#url","id": "http://goo.gl/stTXr","longUrl": "http://www.ochi-lab.org/"}

2011年10月22日土曜日

マイニングツールの統合と活用&情報編纂研究会に参加してきました

先日、東京大学で開催された情報編纂研究会に参加してきました。個人的にこの研究会に参加するのは2回目です。別に「情報編纂」をテーマにしているわけではありませんが、関連技術として関心がありまた研究アプローチも含めて勉強したいというのもあって参加しています。

TETDMプロジェクト
今回、特に気になったのは、TETDMというプロジェクト。人工知能学会の近未来チェレンジで選ばれたプロジェクトのようですが、簡単にいえばテキストマイニングのツールやプラットフォームを提供するというものです。まず、実際、このプラットフォームを利用すれば開発がラクになると発表が何件かあり、このプラットフォームに強い関心を持ちました。
また、このプロジェクト自体のアプローチもとても魅力に感じました。現在情報工学関係の研究では扱うデータ(扱うことができるデータ)が大幅に増えており、またそれを扱うシステム開発も容易になりました。しかし、逆にそれは似たようなシステムの乱立につながってきますし、似たようなシステムが各地で繰り返し作られていくという、学術的には無駄なことが起きていると思います。このような問題を学会がイニシアティブをとって解消しようとするのはとても面白い試みだと思います。

データマイニング系のJavaライブラリも充実してきた?
マイニングの研究を一旦止めていたのでちょっと浦島状態なんですが、rjavaとかwekaとかマイニング系ツールのライブラリがかなり使えるようですね。rjavaは数年前に使ったときはいまいちだった気がしますが、バージョンも上がってだいぶ使えるようになってきたようです。再調査が必要ですね。


オレオレフレームワークを排除しよう
今回の発表の中で、TETDMに対応したシステム開発の問題点として、このTETDMを使う敷居の高さについて話題が上がってました。マニュアル環境が不十分というのもあるようですが、この点について学生のモチベーションが上がらない、、特にデキる学生からは「自分でゼロから作ったほうが早い」という意見が出てくる、、、という興味深い話がありました。
このような問題は、TETDMだけの問題ではなく、各種フレームワークを導入する際に出てくる問題ですが、このことについては私見を持っています。私のラボでは、既存のフレームワークを積極的に導入していますが、それは
「フレームワークの理解のコスト<フレームワーク導入による利点」
だからです。最初の学習には時間がかかりますが、理解できたらそれ以降の開発効率は飛躍的に向上します。そして、もっと大切なことは、ある統一したフレームワークに載せることで、技術・リソースの継承が容易になります。「自分で作ったほうが早い」って作られたのはいわゆるオレオレフレームワーク。その場限りのものです。そのフレームワークは本人しかわからないわけで、その本人がずっと研究室にい続けるのであればいいですがそうでないことが多い。卒業後、技術継承されず理解不能なシステムが残っているというケースが多々あるはずです。
研究とはその場限りで終わるようなものではなく、その後も形を変えながら継続されていきます。ソースコードもそうです。学生の卒論・修論は学生のためだけのものではなく、研究室のものでもあるということ。卒業後も自分の研究が生き続けていく、、、それをアシストするのがフレームワークなわけで、TETDMもその1つになると思います。
だから、「自分で作ったほうが早い」なんていう学生がいたら、一喝しますけどね(笑)。もちろん、学生のモチベーションというのは大切な要因ですから無視するわけにはいきませんが、上述の利点を理解してもらえれば十分だと思いますけどね。

「お前はその場限りで捨てられるコードを書きたいのか?研究室に後世に伝えられるコードを残したいと思わないのか?」

P.S
こんなこと書いたら、おちラボではさぞかし技術継承がスムーズにいっているんでしょうな?と思われるかもしれませんが、残念ながらそんなことはないです。ただ、その効果が徐々に出つつある気配がしています。



2011年10月19日水曜日

[C#]System.Web アセンブリ参照が見つからない場合の対処法

ネットワーク関係のライブラリを利用する場合、時々、
System.Webアセンブリ参照がない
みたいなエラーが発生する時がある。これは、System.Webを参照に追加すればいいわけなのだが、時々、[参照の追加]ダイアログの一覧に「System.Web」が出てこないという事象が発生する。これはVisual Studio2010以降によくおきる問題のようで、
プロジェクトのプロパティで設定するプロジェクト既定の「対象のフレームワーク」が「.NET Framework 4 Client Profile」になっている
ということが原因のようだ。 「.NET Framework 4 Client Profile」というのはデスクトップクライアントの最低限のフレームワークの単位らしく、これを「.NET Framework 4」に変更することで参照することができるようになるようだ。

2011年10月18日火曜日

イベント紹介:2011年 第22回教育システム若手の会(shinshin2011)

以下、イベント紹介です。


###


このたび信州松本におきまして,第22回「教育システム若手の会」を開催致します.

今回は学生・教員の意見の相違を共有し,若手ならではの発想や悩みについて議論したいと企画しております.
また,会場には美ヶ原温泉の旅館を貸し切っており,24時間天然温泉を満喫していただくことができます.
この機会に天然温泉で心身を癒しつつ,他の若手研究者の皆様と交流を深めてみるのはいかがでしょうか.

ご参加のお申し込みは第22回「教育システム若手の会」専用ウェブサイトにて受け付けております.

  申込受付期限:2011年11月4日(金)まで

施設の収容人数に限りがございますので,参加される皆様はお早めにお申し込みください.なお,詳細は下記の
フライヤーをご覧ください.

お忙しいことと存じますが,ぜひ多くの学生・若手教員の皆様のご参加をお待ちしております.また,広く周知
にご協力いただきますようよろしくお願い申し上げます.


=========================
2011年 第22回教育システム若手の会(shinshin2011)
=========================

テーマ:『教育システム研究を研究する!』


内容:
 今年で22回目の開催となる「教育システム若手の会」では,教育実践や教育システム研究を進める過程で生じ
る若手研究者や学生が直面している問題を明らかにし,自身で解決すべき点とその解決方法,教育システム研究
という学問分野の発展に向けて本当に必要とする支援のあり方を考察することを予定しております.
 メインセッションでは,若手の会に参加する年齢層を考慮し,学生を中心とした「ヤング」と,教員を中心と
した「シニア」の意見の相違を共有できるように議論することを考えております.また,初日の午後には若手研
究者による研究発表・討論する場を設け,若手ならではの発想や悩みについてじっくり議論できる研究討論セッ
ションも企画する予定です.

日時:2011年11月25日(金)~27日(日)

教育システム若手の会ウェブページ:
 http://www.seclab.shinshu-u.ac.jp/shinshin2011/

場所:信州松本美ヶ原温泉 富田屋別館
   (長野県松本市里山辺489-3)
   http://tomitayabekkan-hp.web.infoseek.co.jp/

対象者:教育システム関連の若手研究者(自称も含む)
    及び学生

スケジュール概要(予定):

11月25日(金)
 15:00 - 17:30  研究討論セッション
         (研究発表&議論)
 19:30 -     夕食
 21:00 -     オープニングセッション
         (開式のあいさつ&自己紹介)

11月26日(土)
  9:00 - 10:30 ライトニングトークセッション
         (参加者の研究紹介)
 10:45 - 12:30 メインセッション(1)
   『ヤング・シニアグループに分割して議論』
    ・ヤング:自身の研究の動機や進め方,その過
        程で生じる問題点や解決手段などを議
        論・整理
    ・シニア:教育システム研究の進め方や学生指
        導の仕方における問題点を議論・整理
 12:30 - 13:30 昼食
 13:30 - 16:15 メインセッション(2)
   『ヤング・シニアグループを合同して議論』
    ・教育システム研究を進める上でヤング/シニ
     アが抱える問題点の共有
    ・教育システム研究の発展に向けた研究支援シ
     ステム・環境を議論
 16:30 - 18:00 メインセッション(3)
   『各グループの成果発表&議論』
 19:30 -    夕食
 21:00 -    ナイトセッション・
        エンドレスセッション

11月27日(日)
 9:30 - 10:00 クロージングセッション


後援:人工知能学会先進的学習科学と工学研究会(予定)
   電子情報通信学会 教育工学研究会(予定)
   日本教育工学会


幹事:名古屋工業大学 立岩 佑一郎
   名古屋大学   林 佑樹
   信州大学    國宗 永佳
   信州大学    森下 孟

問い合わせ先:
  shinshin2011@seclab.shinshu-u.ac.jp

2011年10月13日木曜日

書籍紹介:ひと目でわかるVisualC#2010アプリケーション開発

今年度、3年生のゼミで利用する書籍を紹介します。
ひと目でわかるMicrosoft Visual C# 2010アプリケーション開発入門 (MSDNプログラミングシリーズ) [単行本]
例年、「ひと目でわかるシリーズ」を利用していて、昨年からC#を言語としています。この本の特徴は
  • 初歩的なC言語程度のプログラムを組んだことがある人を対象
  • C#というプログラム言語の説明はほとんどない 
  • システム開発・設計の流れや考え方がわかる
  • オブジェクト指向にも言及
というように「システム開発」を意識させるにはよいいい本だと思ってます。昨年度は2008版でちょっとわかりにくい感じでしたが、2010版はそのあたりが修正されているような気がします。WPF周りもおさえていてGoodです。ゼミ配属された3年生には全員これを買ってもらいます。


GWT-RPCでsessionを利用する

GWTはAjaxアプリなので、基本的に画面遷移は存在せず一般的なウェブアプリケーションで求められるサーバ側でのsession管理というものを意識しなくてよい。 しかし、別のアプリケーション(モジュール)への移動といった処理が必要となった場合、サーバ側でのsessionを利用したくなるケースが出てくる。以下はGWT-RPCにおけるsession利用について。

GWT-RPCにおけるサーバ側の処理クラス(~implクラス)の実体はdoGet,doPostといった記述がないだけで、実はServletそのもの。Servletで利用されるHttpServletRequestとかHTTPServletResponseなどは表面上見えないだけで以下のようにして呼び出すことができる。あとは通常のServletと同様の使い方ができると考えてよい。
HttpServletRequest request = this.getThreadLocalRequest();
HTTPSession session = request.getSession();


2011年10月7日金曜日

Javaにてパスワード情報をMD5で暗号化する

パスワードによりユーザ管理をするシステムを開発する場合、ユーザ名とパスワードはデータベースで管理しますが、パスワードをそのままデータベースに格納するのは愚の骨頂です。通常は
  • 不可逆な暗号でパスワードを暗号化し、データベースに保存
  • 認証をする際は入力されたパスワードを同じ方式で暗号化し、その結果を元にデータベース参照する
という方法をとります。そこで、Javaでパスワードを暗号化する方法を紹介します。今回はできるだけJavaの標準のライブラリを利用する方法を採用し、MD5で暗号化する方法を紹介します。

下記のプログラムは2つのメソッドがありますが、上記が今回の本題です。MessageDigiestクラスを利用して、MD5形式で暗号化しています。ここで問題なのは、digestメソッドで生成されるのがbyte型配列であるということ。2つの目のメソッドはbyte型を16進表記のStringに変えるメソッドです。これを利用することで扱いやすくなります。
なお、掲載しているサンプルコードは下記のサイトのコードを引用させてもらいました。
参考サイト: [Java]MD5、DESで暗号化する(Creative Gear とあるWebエンジニアの活動記録)


[C#] Twitterizerでユーザプロファイルデータを取ってくる

Twitterrizerでユーザのプロファイル情報を取ってくる方法です。特に何か難しいことはなく、TwitterUserクラスを利用して、任意のユーザの名前を指定して情報を得ることができます。
 TwitterResponse showUserResponse = TwitterUser.Show("oyouji");
 TwitterUser user = showUserResponse.ResponseObject;
 userPicBox.ImageLocation = user.ProfileImageLocation;
 lbUserName.Text = user.ScreenName;
これを実行すると下記のようになります。

あっけないですね。

2011年10月4日火曜日

Twitter4Jを利用する(2)

Twitter4Jで、OAuth認証を行なってrequestTokenを取ってきた後にどうすればいいかという話です。
おさらいですが、Twitterでは一度OAuth認証を行えばあとは、「AccessToken 」と「TokenSecret」を利用することでTwitterにアクセスできます。その保存と再利用についてです。

保存方法
下記は、OAuth認証が終わりコールバックされたところでの処理です。
 AccessToken accToken = twitter.getOAuthAccessToken(requestToken, oauth_verifier);
 String aToken = accToken.getToken(); 
 String tokenSecret = accToken.getTokenSecret();
この方法で、AccessTokenとTokenSecretがStringの形で個別に扱えますのでこれをどこかに保存すればよいでしょう。AccessTokenクラスをシリアライズして保存というのもありかもしれません。

再利用
再利用する際は、下記のようになります。AccessTokenクラスを作成してそれを元にTwitterクラスのインスタンスを作成することになります。
 String aToken="AccessTokenを格納";
 String tokenSecret="TokenSecretを格納"; 
 AccessToken newToken = new AccessToken(aToken,tokenSecret);
  TwitterFactory factory = new TwitterFactory();
  Twitter twitter = factory.getInstance(newToken);
  twitter.updateStatus("またまたTOkenテスト");


2011年10月3日月曜日

久しぶりにTexのインストール(Windows編)

久しぶりにTexのインストール。。。 最近すっかりWordのお世話になってるし、大抵のフォーマットにWordがあったりしているのだが、世の中にはTexしか用意してませんというところがあったりする。そんなわけで、Windowsへのインストールの覚書です。 

Texのダウンロード 昔はいろんなところから関連ファイルをダウンロードしていたりしたが、最近はインストーラーというのが存在する(もちろん有志の方が作ってくださっているのだが)。で、今のところ一番お手軽なのは、
というやつのようです。これを何も考えずに実行していけば、関連するすべてのファイルをダウンロードしてくれます。

なお、最初にウィザードを進めていったときに、エラーがでてログを見たときに
W32TeXの情報取得開始
情報ファイルの発見に失敗.
というメッセージが出ているのであれば、それはまさにそのとおりで、Win32Texのダウンロードサイトがデフォルトのままではないということなので、その部分を別のURLに選択しないそう。あ、あとはDVIOUTとかGSのチェックも忘れずに。



2011年9月23日金曜日

オープンキャンパスで研究室公開



今年も昨年度と同様にオープンキャンパスで研究室公開をしました。画像処理技術を利用したカメラ制御システムの話と、新ネタとしてKinectを利用したシステムを紹介しました。上の写真は昨年度と同様に指示棒認識のシステムなんですが、今回のデモではなぜか認識精度がよくなく苦労しました。環境に左右されやすい欠点があるので改良が必要ですね。


この写真は新ネタのKinectを利用したシステムです。まだ研究的なシステムは出来上がってないので今回は紹介程度にゲーム的なシステムを用意しました。4年生が作ったもので、ランダムに出現するボールを手でタッチするというシンプルなゲームですが、完成度が高いこともありウケがよかったですね。このシステムのデモのために、院生には何度もチャレンジしてもらいました。いい運動になったでしょう。

昨年も書きましたが、こういうイベントをきっかけにシステム開発を進めるというのは我ながらいい戦略だと思います。来年もやる可能性は大です。

2011年9月22日木曜日

Objectify+GWT RequestFactory?


本ラボでは、GAEのデータストア用に、Objectify-appengine のライブラリを利用していますが、Google I/O2011にて、Objectifyの話題が出てたようです。
Highly Productive GWT: Rapid Development with App Engine, Objectify, RequestFactory, and gwt-platform
この内容と同じサンプルコードが
Using GWT RequestFactory with Objectify(TurboManage)
にも載ってます。

今さら感がありますが、GWT RequestFactory というのは初耳。どうやらGWT2.1くらいから出てきてるのかな?GWT-RPCの代替になるものらしく、完全に乗り遅れ感が、、、、

ラボでの開発効率をどんどん上げていきたい今日この頃なので、Rapidなフレームワークであるならばどんどん使っていきたいもの。今後調査します。

2011年9月21日水曜日

教育工学の研究者のスタイル

先日、高知大へ集中講義に行った際、「教育工学の定義」について某先生方と話をする機会があったのだけど、それに関連するツィートが流れてきたので、ちょっと紹介。
教育工学研究が社会に果たす役割(教育工学会全国大会会長講演スライド 2011.9)
教育工学会の全国大会は行きたかったのだけれども、大学の仕事等も重なって行けなかったわけですが、こういうスライドが公開されるのはいいですね。。。

さて内容についてですが、研究者のスタイルについて書いてあるスライドがあります。抜粋しますと、
  1. 工学的成果の整理枠を求めて、問題解決過程の因子や手続きなどを明らかにしようとしている研究者。
  2. 教育現場のさまざまな問題を解決することを求めて、システムを開発したり、道具を作ったりしている研究者
  3. 教育現場のさまざまな問題を解決することを求めて、実際に問題解決を実践している研究者。
そしてその中であらためて自分を位置づけてみると、2が主ですが3も無視できないですね。1については研究のスタンスとしてはあまり考えませんが、システムを作る際のモデル化では無視できない要素かと思います。

こういうスライドをみてあらためて感じるのは、教育工学という研究の幅の広さですね。巾が広いからこそ、逆に自分のスタンスがわかりにくくなって曖昧な研究になってしまうわけで、、、、難しいところです。

後のスライドに書いてあるように、「作る人」「やってみる人」「支える人」とうまい具合に3つが切り分けして評価されればいいのですが、そう簡単にはいかないんですよね。研究者間でこの点の意識共有がしっかりできないといけないかなと思う今日この頃です。

2011年9月15日木曜日

高知大学へ集中講義


毎年恒例なのですが、今週は高知大学で集中講義に出かけていました。科目名は「アルゴリズムとデータ構造演習」で、シラバスに
オブジェクト指向によるプログラミング(アルゴリズム,データ構造)設計とUMLによるモデル表記について学び,UMLを用いた簡単な設計演習を行う.そして,プログラム言語JavaをC言語と対比しながら学び,Javaによるプログラミングの演習を行う
と書いているように、内容的にはJavaやUMLを利用したオブジェクト指向設計に関する演習講義です。2002年頃から継続してやっています。プログラミングの演習系の講義を集中講義でやるというのはもしかすると珍しいと感じるかもしれませんが、一気にがーーっと勉強する方が頭に入って理解しやすいのです。

10年近く続けてみてわかるのは、Javaとかオブジェクト指向というのが珍しい時代からそれが当たり前になっているということ。内容もどんどん変えていかないといけない必要性をひしひしと感じます。オブジェクト指向についても他の講義で少しやっているという意見もありましたので、このあたりはもっとさらりとしてもよかったかもしれません。といってもカリキュラム上、Javaの講義がないようなので学生にとってはJavaをやるだけでもウケはいいですね。 そのせいか、昨年度受けた学生も僕のことを覚えてくれているようで、とても嬉しいことです。

今年は、講義中の演習を多めにしてみました。理屈だけでなく、実際にやってみる(作ってみる)ことで理解が深まることは間違いないので。。。学生の反応もよかったですね。残念だったのは受講生が少ないということ。情報系の学生が元々少ないというのが原因ですが、ITはあらゆる分野に入り込んでいますからもっと皆さんに興味を持ってもらいたいですね。

トップの写真を見てもらえらればわかるように、高知は晴天でとても暑かったです。暑さに負けず、僕も学生も乗り切りました。

P.S
高知大、高知工科大の先生と研究談義もしました。「教育工学」という分野の定義についていろいろ話ができ、充実した集中講義期間でした。




2011年9月7日水曜日

9月月例ゼミ&飲み会



9月にもなったので夏休みモードから脱却してもらおうと2日ほど前に月例ゼミをやるぞ~とメールをし、急遽開催することになったゼミだが、皆、何かプレゼン資料を用意してきた。内容的には、文献サーべ、プログラムの開発状況、私生活の話、、、etc。ただ、話の流れで、研究室でMA7にエントリーすることを急遽決定した。

MA7とは?
MA7とは、Mashup Award 7のことで、ウェブアプリ開発のコンテストだ(http://ma7.mashupaward.jp/)。去年、個人的にイベントに参加してみて面白いとおもっていたのだが、今年も開催されるということで、研究室でこれにエントリーしようという話に。今やっている卒研に技術的ならびに内容的に関連するネタがいろいろ思い浮かんできた。で、とりあえず、研究室で3件ぐらいは出せそうな気配(ネタ的に)。まあ、実際何件エントリーできるかはわからないけど、何か目標に向かってシステム開発をするというのは悪い話じゃない。最低でも1件はおちラボの研究室ブランドでエントリーしたいものである。

飲み会
夜は、どういう趣旨かわからないが飲み会が開催。まあ飲み会をすること自体は悪いことではない。いろんな意味でいいことだと思う。今夜はけっこうコストパフォーマンスのよい店だった。これで英気を養い、研究活動に勤しんでもらえれば幸いである。


2011年9月1日木曜日

[C#]ContextSwitchDeadlockのエラーがでる

C#でいわゆる外部のCOMを参照したプログラムをVisual Studioでコンパイル、デバッグ実行させたときに、
ContextSwitchDeadlockが発生しました
みたいなエラーが出て、動作が一時中断するケースが発生。なにやら 意味不明なメッセージも書かれているわけだが「続行」ボタンを押すと、動作は通常継続される。これは一体なんなのかというと、何かCOMを参照するようなプログラムにおいて、
  • COMに対する操作がしばらく(1分くらい?)ない場合にデッドロックの可能性をデバッガが指摘してくれている
らしい(MSDN参照)。というわけで、必ずしもプログラムに問題があるわけではないので気にしなくてもいと思われる(ここは要注意)。試してはいないが、DebugではなくてReleaseモードで実行すれば問題ないであろう。

もし、Debugモードでこのエラーをとりあえず回避したいという場合は、
  • [デバッグ] → [例外]→[Managed Debuggin Assistants] → [ContextSwitchDeadlock]のチェックを外す
ことで検知しなくなる。ただ、本当にデッドロックが発生していないのかは注意が必要。


2011年8月23日火曜日

C#:フォームを利用した自作ダイアログの戻り値を設定する

C#は標準で各種のダイアログボックスを持っているが、開発するシステムによっては自作のダイアログで対応したいという状況もある。その際、ダイアログとしての戻り値をどう受け渡すかが問題になるが、フォームを利用した自作のダイアログでも簡単にその応答を設定することができる。

自作ダイアログを閉じる前に、DialogResultプロパティに値を設定する。ここで設定できる値は、DialogResultクラスが持っている変数を利用しよう。
this.DialogResult = DialogResult.OK;
this.Close();
このようにしておけば、下記のように自作のフォームをShowDialog()メソッドで開き、閉じたあとにDialogResultプロパティを参照することで、ダイアログ的な処理を行うことができる。
pf.ShowDialog();
if (pf.DialogResult==DialogResult.OK) {
 ・・・・
}


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

Eclipseでウェブアプリ(サーブレット)を作成しているとweb.xmlファイルの内容が自動記述されていきますが、ふと気がつくと、赤い×のエラーアイコンがついてしまうことがあります。具体的には、
the content of element type web-app must match"(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resource-env-ref*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)"
という警告が出ます。とくにコンパイルは問題なくできるわけで、問題はないのですがやはり気持ち悪いものです。

これは、
  • DTDに規定されているXML要素の出現順序に問題がある
というエラーです。上記にweb-xml要素に含まれる子要素が上がっていますが、この順序に従わなければいけないということです。例えばservlet要素とservlet-mapping要素の順序が違う等、、、確認してみてください。



2011年8月8日月曜日

IEICE関西支部ICT基礎講座参加 ~画像処理講座、OpenCV~


先日(8/5~8/6)に、「IEICE関西支部ICT基礎講座参加 ~画像処理講座~」に参加してきました。画像処理講座といっても実際はOpenCVについての話が中心です。OpenCVについては、本ラボでも3年ほど前から利用しておりちょっと記事も書いていますが、我流でかじっているところもあるので、あらためてこういう機会を設けて勉強と知識の再整理をしようと思ったわけです。以下、あらためて気になったポイントをメモっときます。

C++対応していた
2.0からC++対応になっていたようで、これは気づいてませんでした。手元にある書籍やネットの資料がほとんどCベースの記述になっているので、2.0になっても基本Cベースで書いていたわけですが、C++風に書くほうがちょっとすっきりするかな?ただ、元がCだったせいか、もうちょっとすっきりした書き方をしないのかと思ったり、、、、

カメラキャリブレーションの話
あまり精度の高い画像のマッチングはしてなかったので、カメラキャリブレーションはさほど気にしていませんでしたが、OpenCVで標準でそういう関数があるということで今後利用する可能性が大です。

SURFによる物体認識
これは個人的にはじめてやる認識方法でしたが、これもうまく研究に使えないかなぁ。。。とか。

今回の講座の内容は、
OpenCV プログラミングブック 第2版 OpenCV 1.1対応
に準拠したものでしたが、本は持っててもなかなか勉強できないですからねぇ。今回はプログラミングも行いつつの演習もあり、いい機会となりました。個人的には、こういうったOpenCVのライブラリの使いどころというか、ポイント、コツ、なども話も知りたかったですね。関係者の方よろしくお願いします。

2011年8月3日水曜日

ゼミ月例報告会

月例の報告会。今日は、

  • Kinect SDKについて調査
  • 講義用ペイントソフトの開発状況
  • 掲示板システムの設計
について。Kinctについてはずっと調査が続いているが、これと平行してWindowsプログラミングについての勉強もしてもらっている。
講義用ペイントソフトについては、Androidで作成しており、現在は勉強しながらつくっているところで単純なペイントソフトだが、いちおう「使える」システムにはなっている。できれば、Androidマーケットにでも出したいところ。
掲示板システムについては昨年度の卒研を継続する形で、とりあえずこれからというところだ。。。



2011年7月30日土曜日

DAOBaseクラスでObjectify-appengineを使いやすくする

Objectify-appengineでは、
ObjectifyService.registerメソッドを記述して、Entityを登録する
という手順が必要となります。これはちょっと面倒なんですが、もっと厄介なのは
同じクラスを登録するとエラーが発生する
という仕様になっている点です。クラスの情報はスタティックな領域に記録されているので、registerメソッドで同じものを登録しないように気を付けなければなりません。その解は、公式サイトのBestPracticeに書いてあります。DAOBaseクラスを使えと、、、
public class DAO extends DAOBase
{
    static {
        ObjectifyService.register(ここに利用するEntityを記述);
     }

  //DAOとしてデータベース周りのラッパーメソッドを以下に書いていけば良い
}
基本的に上述のようなDAOクラスを継承したクラスを作っておけば、あとは下記のように呼び出せばOK。
DAO dao = new DAO();
dao.ofy().find(........);
dao.ofy().put(......);

ただこのようにfindやputを呼び出すよりも、実際は、DAOクラスに関連するラッパーメソッドを実装して呼び出すようにするのがいいですね。

2011年7月26日火曜日

Eclipse:GWTDesignerのUIBinder対応について


先日の記事でGWT Designerのことを少し書きましたが、いつの間にかUIBinderにも対応してますね。ui.xmlファイルを選択するとDesignパネルがあることに今更気づきました。いつから対応していたのか、、、

まあ、RADな環境としては正直デキは悪いです。ただ、XMLだけだと自分がつくっているUIを想像しなければいけませんので、ちょっとマシかなという印象。そうですね。AndroidアプリでもGUI部分はデザイナーで雛形を作りますが、それと同じ感覚で使えばいいのかもしれません。

2011年7月25日月曜日

GWTで他のページ(モジュール)に移動する 

GWTというのはJavaScriptが実体ですから、ページの移動というのは原則行わずJavaScriptによる描画切り替えが実質的な画面遷移になります。この場合、全ての画面情報がJavaScriptによって記述されているわけですから、画面が増えてくるとJavaScriptが肥大化してきます。また、分担開発もやりにくくなるでしょう。
そこでGWTモジュールを複数用意して転送するというのがやり方になると思いますが、さてGWTでページの移動(モジュール間の移動)はどうやるのか?それは、
Window.Location.replaceメソッド
を利用すればOKです。もし、セッション(ユーザー)情報を維持したい場合は、memchacheにその情報を保持し、redirect時に参照キーをパラメーターとして渡すようにするとOKでしょう。

2011年7月24日日曜日

Eclipse: GWT Designerを入れておくと便利

EclipseでGWT開発をする際は、GPEを入れればよいがさらに
  • GWT Designerプラグイン
を入れておくことをおすすめします。GWTDesignerとはGWTのRADツールでUIをペタペタ貼り付けることができます。ただ、UIBinderには対応してないようなので(今のところ)個人的には使ってません。では、なぜこのプラグインをすすめるかというと、GWT-RPCの作成が容易になるからです。先日の記事でEclipseでのGWT-RPCのことを書きましたが、これはGWTDesignerを入れておかないとダメです。
GWTDesignerを利用するには、
http://dl.google.com/eclipse/inst/d2gwt/latest/3.7

をプラグインサイトとして登録すればインストールできます。
GWTDesignerが有効になっていると下記の図のようなメニューが追加されます。GWT remote serviceの他、他のウィザードもデフォルトのより便利かもしれせん。



Eclipse:GWT+WTP併用時のライブラリの重複について

EclipseでGWTと戯れていたら
org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.store.appengine" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/C:/Users/ochi/......../eclipse-workspace/test/war/WEB-INF/lib/datanucleus-appengine-1.0.9.final.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/....."
というエラーがでてきた。このメッセージを見るかぎりは、
  • datanucleus-appengine-1.0.9.final.jar
が重複してライブラリ登録されてるぞということ。身に覚えがない。いや、以前の記事で「EclipseでのGAE/Jアプリ開発はじめの一歩 ~WTPと併用する~」というのを紹介したが、これが悪さをしている感じ。で、プロジェクトが参照しているライブラリを確認すると、
  • AppEngineSDK
  • Web App Libraries
の2つのライブラリが重複している。当然前者は消せないわけで、後者はWTPを追加したことで出てきた雰囲気。。。
よって、後者のライブラリをエイヤッと消しました。(^^; これで今のところ問題ありません。


2011年7月22日金曜日

GWTで初期パラメーターを受け取る

GWTというのは実体はJavaScriptであり、その実行プロセスは
コンテナとなるHTMLファイルの呼び出し→JavaScriptファイルのロード→表示
という手順を踏む。ここで、呼び出し時の初期パラメーターの設定はできないのだろうか?HTMLファイルを呼び出すわけだから、そんなことは無理なのでは?実際、 EntryPointクラスのonModuleLoadでも初期パラメータを受け取るような引数はないし、、、、と諦めていましたが、どうやら出来るようです。その方法は、
  • Locationクラス
を利用することで解決します。Locationクラスには、幾つかのメソッドが存在しており
  • リクエストパラメータ
  • ホスト名
などコンテナの呼び出し情報を入手することができます。これを利用することで例えば、
http://~.com/xxxx.html?id=3
という呼び出し方をした場合にonLoadModule()内で
String id = Location.getParameter("id");
といった記述によりidを取ってくることができます。

これができて嬉しいのは、モジュール間の連携が容易になるということ。GWTはシステムが複雑になると肥大してきますので、適度にモジュールを区別するのが望ましい。しかし、モジュールを別にするとデータの連携にひと工夫必要になりどうしたものか、、、と悩んでいたわけです。これからこの方法を重宝しそうです。

GAEでTwitter4Jを利用する 

JavaでTwitterクライアントを作るにはTwitter4Jを使えば簡単らしいが、GAE上で実装する場合はちょっとした工夫がいるようだ。

appengine-web.xmlの設定
設定のポイントは2つ。
  • sessionを使えるようにする
  • consumerKeyとconsumerSecretは、System-propertyとして記述
以上を実現するには以下のように記述するとよい。

サーブレットでの記述方法
下記に2つ載せますが、1つ目が最初に呼ばれるサーブレットで、2つ目はコールバックされるサーブレットです。1つ目では、
  • twitterクラスのインスタンス
  • requestToken情報
をセッションで保存しておくというのがポイントです。これは、memcacheに入れてもいいのかな?とにかく、状態を残しておかないといけません。
コールバックされるサーブレットでは、リクエストパラメータから「oauth_verifier」を受け取っておいてください(自動的に付与されます)。それを用いてAccessTokenを入手することになります。
参考URL
本サイトの内容は、下記のサイトを参考にさせていただきました。ありがとうございます。


2011年7月20日水曜日

EclipseでのGWT-RPCサービスの作り方

GWT-RPCを利用する際には、
  • 「~Service」インタフェース(クライアント側)
  • 「~ServiceAsync」インタフェース(クライアント側)
  • 「~ServiceImpl」クラス(サーバ側)
の3種類が必要ですが、これらを手書きで書くのは面倒です。Eclipseでもそれなりに関連ファイルを自動作成してくれますが、手順が重要です。

各種ファイル生成の手順
  1. プロジェクト名の上で右クリックし、コンテキストメニューを表示します。そこで、【Google Web Tool kit】→【GWT remote service】を選択。
  2. リモートサービス名を入力。「~Service」という名前にするのが流儀っぽい?パッケージ名は、自分がつくっているプロジェクトでのclientパッケージを選択すればよい。
  3. この処理で生成されるのは、クライアント側の「~Service」というインタフェースと、サーバ側の「~ServiceImpl」というクラスだけ。クライアント側で「~Async」インタフェースはできてない。
  4. 「~Service」というインタフェースで「~Async」がないというエラーが出てるので、クリックで生成。必ずインタフェースにしてください。
メソッドの記述
  1. 最初に「~Service」インタフェース(クライアント側)のファイルにメソッドを追記します。
  2. するとエラーがでるので、クリックして「~Async」インタフェースにメソッドを追記するようにします。
  3. 「~ServiceImpl」というクラスのほうでもエラーが出ているので、クリックしてメソッドを実装します。

以上の手順で、記述すべきファイルならびに内容が半自動で用意されます。