2011-06-29

[Java]XMLプログラミング ~XMLの読み込み方法の整理~

今日も初歩的な話。XMLを解析する際に、どうやってXMLを読み込ませるかという方法です。具体的には、どうやってXMLデータをDocumentクラスに格納するのか?ということになります。状況として、下記の3つが考えられます。
  1. XMLが記述されたファイルを読み込む場合
  2. XMLデータをStreamから読み込む場合
  3. すでにStringクラスにXMLデータが入っている場合
しかし、いずれの場合も同じく、parseメソッドを用います。
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder db= domFactory.newDocumentBuilder();
    //ファイルから読み込む場合
    Document doc = db.parse("C:\\temp\\TestSample.xml");
    //Streamから読み込む場合
    Document doc = db.parse(is); //isはInputStreamの変数
    //String変数から読み込む場合
    Document doc = db.parse(new InputSource(new StringReader(xml)));  //xmlはString変数         


2011-06-28

[Java]XMLプログラミング ~xpathによる解析~

xpathを利用したXMLの解析プログラム。GAEでの稼働を想定していますので、本ページの内容は、下記のサイトを抜粋してます。
参考サイト: [技術]GAE/JでXML解析(xpath)を行う方法
xalanのパッケージに入っている下記の4つのライブラリが必要です。
serializer.jar,xalan.jar,xercesImpl.jar,xml-apis.jar,xsltc.jar
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    DocumentBuilder builder;
    String xpathQuery="xpathを記述する";
    String xml="解析するXMLが入っているとする";

  try {
   builder = domFactory.newDocumentBuilder();
  
    Document doc = builder.parse(new InputSource(new StringReader(xml)));
    XPath xpath = new org.apache.xpath.jaxp.XPathFactoryImpl().newXPath();
    NodeList nodes = (NodeList)xpath.evaluate(xpathQuery, doc, XPathConstants.NODESET);
    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println(nodes.item(i).getNodeValue());
    }
  
  } catch (ParserConfigurationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SAXException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (XPathExpressionException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }


2011-06-27

EclipseでのGWTモジュールの追加

GWTの開発環境をEclipseに移行しているのだが、まだちょっと要領がわかってないのでメモ書き。。。
GWTのモジュールを追加する場合、ただ追加しただけでは、デバッグ時に実行されないという事象が発生。よく見てみると、
GWTで生成されるはずのjavaScriptのファウル群が追加したモジュールについて一切作られていない(warディレクトリ内で)
ということが判明。Netbeansでは、gwt.propertiesという設定ファイルでコンパイルの制御をしていたのだが、Eclipseでは良くわからない。。。で、試行錯誤してわかったのは、
正式なコンパイルを1度でもしておくということ。runでもDebugでもなく。
そうすることで複数のGWTモジュールに対してコンパイルがかけられ、warの対応するディレクトリにjsファイル等が配置されます。
以後、この状態で通常のrunやdebug等を実行すれば、変更点が反映されます。どうも挙動が怪しいですが、たぶんこれで大丈夫でしょう。

2011-06-25

Objectify-appengineでGAEデータストアを操作する

GWTプログラミングにおいては、GWT-RPCを利用することはしばしばあります。この場合、サーバークライアント間でのデータのやりとりは、
シリアライズ可能なPureなデータクラスを用意する
のが前提になります。ここで、データベースを絡めてくると厄介な問題がおきます。例えば、GAEのDatastoreを利用する場合、DatastoreとのやりとりはJPAやJDOのフレームワークを使いますが、この場合のEntityクラスには、それら特有の記述(アノテーション)が必要となります。このEntityクラスは、GWTで利用可能なシリアライズ化されず、GWT-RPCでは受けつけられません。よって、PureデータクラスをDTOとして中身の入れ替え作業が必要になります。その手間は面倒です。

objectify-appengineというライブラリ
この問題を解決する方法として、objectify-appengineと呼ばれるGAEのデータストアに対応したライブラリがあります。これを利用することで、GWTーRPCで利用したデータクラスをそのままデータストアに渡すことができます。本ラボでは現在まだ試行中ですが、JDOと同じような感覚で利用できるのがポイントです。

ライブラリの準備
まず、公式サイトからライブラリを入手して下さい。最近、3.0のバージョンが出たようです。3.0でどう変わったのかはちょっと不明です。ライブラリにパスを通したあと、GWTの設定ファイルに以下の記述を追記して下さい。
<inherits name="com.googlecode.objectify.Objectify" />
javax.persistanceのアノテーションを利用しますので、
ejb3-persistance.jar 
をクラスパスに記述してください。

Entityクラスの記述方法
下記に示すとおり、記述はシンプルになります。

  • idには@Idを追記
  • getter/setterはなくても良い(書いておいたほうがいいでしょう)
  • @Transient String doNotPersistがいるらしい(調査中、不要かも)

import javax.persistence.Id; 
import javax.persistence.Transient;

public class Car
{
     @Id Long id;
    String vin;
    int color;
    @Transient String doNotPersist;

    public Car() {}
    
    public Car(String vin, int color)
    {
        this.vin = vin;
        this.color = color;
    }
}


以下にとりあえず基本的な記述の仕方を載せます。

クラスの登録
ここはJDOなどとちょっと違うところです。ObjectifyはどのクラスがEntityクラスに相当するのか、コードで明示的に記述する必要があります。
ObjectifyService.register(Car.class);//該当するクラスを登録
Objectify ofy = ObjectifyService.begin(); //サービスのインスタンスを生成
データの追加・修正
ofy.put(car);
削除
ofy.delete(car);

検索
//IDによる検索
Car fetched1 = ofy.get(new Key(Car.class, porsche.id));
Car fetched2 = ofy.get(Car.class, porsche.id); 


//クエリによる検索(結果が1つの場合)
Car car = ofy.query(Car.class).filter("vin", "123456789").get();

//クエリによる検索(結果が複数ある場合)
Query q = ofy.query(Car.class).filter("vin >", "123456789");
for (Car car: q) {
    System.out.println(car.toString());
}
リファレンスをみてみるといろいろ強力な処理ができるようで、GAEのデータストアを利用する際のフレームワークの候補として挙げてみて良いと思います。

2011-06-24

Facebookの可能性を探る

Facebookを最近本格的に使いだしたのだが、いろいろな面からFacebookの可能性を探っている。

研究室用SNSとして
掲示板とかあるから、クローズドなグループを作ってそこに学生を参加させたらいいかもしれない。Google Groupの代替にはなる可能性がある。現在はGoogleを利用しているが、これはこれで便利なことが多い。Facebookはどちらかというと、Facebookというコミュニティにログインするという印象が強い。GoogleやTwitterはそのログイン感が少ない気がする。

システム開発のプラットフォームとして
SNS系のシステムを作るなら、おもいきってFacebookアプリとして作ればいいんじゃない?とか思ってる。プロトタイプから本格稼働への移行もすぐできるし、、、

学生にとってイイSNSかも
学生のSNS利用については、トラブルと表裏一体であり心配なことが多い。mixiなどでは時々炎上する話を聞く。ただ、Facebookのように「実名」感が強いのであれば、逆にそれがブレーキになって変なことは書かなくなるかも、、、と思うのは、楽観的だろうか?

以上、独り言です。

2011-06-11

サーベィ:twitterを活用した授業デザインと実践

村上正行:twitterを活用した授業デザインと実践,教育システム情報学会第35回全国大会、p127-128,2010
従来のクリッカーなどと比較し、大学授業にTwitterを利用する利点として、以下のように記述が書いてありましたので、、、
・学生のコミュニティ形成についてである。.......  授業に関するツイートを一覧することができるし、必要に応じてリストを用いれば他の受講者のツイートも閲覧することができる。
・SNSと近いといえるが、SNSはリアルタイム性がないことから、授業中に自分の意見を書かせるといった活用には向いてない
・コミュニティとして授業に関する情報を共有した上で、自分の意見や感想を書くことによって動機付けや理解が深まることも期待できる。
たしかに一般的なクリッカーは、どちらかというと「先生のため」という位置づけが強いというきがしますね。もちろん、クリッカーで得た回答を学生にも見せて、そこから講義の議論にはいるという方法はあると思いますけど。。。。

個人的には、Twitterの敷居の低さというのもちょっとあるとおもうんですけど。そこが今いち説明しきれないんですよね。なぜ皆、Twitterにハマるのか???個人的にはこの流れに乗っちゃいたいと思うですけどね。

サーベイ:学会・研究会の情報保障におけるソーシャルネットワークの役割

西本卓也: 学会・研究会の情報保障におけるソーシャルネットワークの役割,第24回人工知能学会全国大会,pp1-2,2010
ちょっとサーベイBLOGでも書いてみようかと思い、手始めに書いてみます。もしかすると続かないかもしれません。なお、今回紹介する発表については、現在僕が書いている原稿で引用させて頂いたものです。「情報保障」というタームははじめて耳にしました。これを信学会のSIG-WITが活動しているというのはすごいですね。まあそういう分野だからというのもあるでしょうけど。
 研究会のソーシャルメディア化
ここで挙げられている例のようにTwitterやUStreamの利用が学会でされるようになると、参加形態が変わるだけでなく、門戸が広がるということに繋がりますね。
Twitter中継が意味するもの
「研究会終了後に公開することで多くの人に役立つメモを,たまたま聞き手のメモ書きとしてではなく聴講しながらTwitter で発言することで,聴覚に障害をもつ人がリアルタイムで,あるレベルで役立つようにする」
「研究会に関わる人に幅広く役立つ,少ない負担でできる作業を,なるべく情報保障に貢献する形で実践する」
聴講しながら書く、、、という行為に特別な意味がある。その有無で何が変わってくるのか、考えてみたいものです。また、負担を減らすという視点は大切だと思います。研究的には「新しいサービス」を考えたくなってしまうんですがね。。。その点でTwitterの利用というのはアリなんでしょう。僕自身Twitterを利用したシステムを開発してますけど、「なんでTwitter利用するの?」という問は、時々してます(自分自身に対してもですが)。
ユニバーサルな字幕ツールの検討
音声認識と組み合わせて、、ってのは面白そうです。また音声認識の性能不足をTwitterで補うというアプローチも気になるところです。

2011-06-08

[C#]XMLプログラミング ~XMLファイルの編集~

XMLファイルの編集についてです。DOMのアプローチになりますが、XMLファイルを読み込んで編集したいノードをXPATHで探索してそのノードに対して操作を行うという手順になります。下記のサンプルでは、XPATHで探索した結果が1つの場合と複数の場合の両方を書いてますので、適時参考にしてください。最後にファイルを保存することを忘れずに。
      XmlDocument doc = new XmlDocument(); //インスタンスの生成
            doc.Load("C:\\temp\\test5.xml"); //XML文書の読み込み
                    
            //複数の場合
            //XmlNodeList nodes = doc.SelectNodes("//presen/slide[@id='2']");
            //1つの場合
            XmlNode nodes = doc.SelectSingleNode("//presen/slide[@id='1']");
            nodes.SelectSingleNode("contents").InnerText = "あかさたな";
            //複数の場合
            /*
            foreach (XmlNode st in nodes)
            {
                XmlNode tweetname = st.SelectSingleNode("contents");
                tweetname.InnerText = "aslkjfakshfa";
            }
            */
            doc.Save("C:\\temp\\test5.xml"); //XMLファイルの保存


2011-06-03

ゼミ勉強会 ~Kinect, Android~



今日は、ゼミで勉強会を開催しました。Kinect と Andoridのプログラミングについての調査報告会ということで4年生3名に発表してもらいました。
こういうゼミは、実は今までやっていませんでした。それはいろいろ理由があったのですが、今年から最低月に1回はやっていこうかなと、、、(これもいろいろ理由ありで)

昨今の就職難に伴い、我がゼミ生も就活は苦戦中。ただ、最近思うのは、就活優先で時間をつぶすというのは非常に勿体無いということ。就活優先は否定しませんが、かと言ってゼミはどうでもいいわけではなく、卒研をする中で学べること、、、いろいろあると思います。こういった会は、就活中の者にとっては負担が大きいかもしれませんが、やれる範囲の中でいいので、取り組んで欲しいなと感じてます。

さて今回の勉強会、はじめてにしてはまずますというところでしょうか。プログラミング経験が多くはないですから、プレゼンでするべきことがちょっとズレてる点も見えましたが、まあそれは気にしない。何よりも、ゼミ生でそれぞれが調べている内容を共有して意見交換できたのがよかった気がします。各自のテーマはばらばらですが、技術的な内容というのは共通することもありますし、将来的に参考になる可能性もあるので、今後もいろいろ調べさせようかと思います。

2011-06-02

GAE/J on Eclipseでのライブラリの設定について

EclipseでGAE/Jアプリを開発するとき、各種ライブラリ(jarファイル)は、

  • war/WEB-INF-/lib
においておく必要がある。

実はこれ、Javaのウェブアプリケーション開発の「常識」なわけだけど、今日はこれに躓いてしまった。なぜならNetbeansではこれを意識することなく、コンパイル時のライブラリパスが実行時のコンテナでのライブラリパスと同じになるようになっていたから。こんな昔のネタに今更であるとわ。こんなことをやらないとダメなの?というEclipseにちょっと幻滅だが、使わざるを得ないのでもう慣れるしかない。というわけで、とりあえずメモ書き。


EclipseでのGAE/Jアプリ開発はじめの一歩 ~Jettyでの実行~

Web Applicationプロジェクトでは、サーバはJettyと呼ばれるものが用意されており、GPEについてきます。特にインストールをする必要はありません。

実行方法
プロジェクトのRun as においてGoogleのアイコンの付いたWeb Applicationを選択してください。WTPでは「Run On Server」だと思いますが、GPEではJettyです。


再実行・再デプロイ時の注意事項
実はここで躓きました。プログラムを修正してもう1度実行させても修正が反映されない。どういうことなのかと、、、、どうやらGPEでは実行ボタンを押すたびにJettyのインスタンスを新たに起動しようとします。再起動をさせることで新しく生成されたクラスがデプロイされるらしいので、どこにそんなボタンがあるのかと、、、



答えは上記の写真のように画面下部の「Development Mode」のタブにJetttyを制御するボタンがあります。
  • 赤    ・・・一時停止?
  • 灰色× ・・・完全停止
  • 黄色   ・・・ 再起動

とりあえず、黄色を押すことで再起動し、デプロイされます。

2011-06-01

EclipseでのGAE/Jアプリ開発はじめの一歩 ~WTPと併用する~

EclipseでのGAE/Jアプリの開発のための各種設定メモ書きです(ちょっとNetbeansユーザ的な視点が入ってます)。

どのパッケージを入れるべきか
NetbeansユーザがEclipseを使い始めるときに最初に悩むのは、Eclipseは様々ななパッケージスタイルが提供されているということ。Eclipseはプラグインでどんどんカスタマイズしていくのが利点なので、それはまあ文化の違いとして、実際GAE/J開発をしたいときは、
  • Eclipse IDE for Java EE Developers
  • Eclipse IDE for Java Developers
のどちらかを選ぶ。前者のほうがウェブ関係のプラグインが入っているのでやりやすいかもしれません。後者でもあとでプラグインの追加をすればOKです。

GPEのインストール
当然のこととして、Google Plugin for Eclipseはインストールする必要があります。それは、Eclipseのプラグインインストールのやり方に従い、【HELP】→【Install NewSoftware】を選んで、下記の公式サイト
に書いてある「Update sites」のURLを追加することでGPEの項目が出てくる。なおGWTに関係するプラグインも一緒になってるので同時にインストールしておこう。

Web Application Projectでプロジェクト作成
GAE/Jのアプリを作成するプロジェクトは、「Web Application Project」と呼ばれるもので、上記のGPEをインストールすることで作成できるようになります。Googleのアイコンがあるのでお間違いなく。これで、Jettyがサーバとして使えるようになります。また、デフォルトでGWTのプログラムが実装されます(ウィザードで取り消すことは可能)。

上記のEclipseでGAE/Jのアプリを作り始めたときに最初に違和感を感じるのが、サーブレットの作成方法について。サーブレットプログラムを動かすには、
  • HttpServletを継承したクラス
  • web.xmlによるサーブレットの登録
が必要なわけですが、デフォルトの状態だとこれを自動的にやってくれない。Netbeansなら自動作成してくれるのに、、、全部手書きでするとかちょっと面倒です。

WTPのインストール
Eclipseには、ウェブアプリの作成を支援するWTPというプラグインが用意されています。これを利用することで、ちょっとだけマシになります。まず、現在使っているEclipseのバージョンによって対処の方法が少し異なります。
【Eclipse IDE for Java EE Developersの場合】
すでにインストールされていますので、あとは有効化するだけです。
【Eclipse IDE for Java Developers】の場合
プラグインを追加して下さい。【HELP】→【Install NewSoftware】を選んで、Eclipseのサイトを選択すると
  • Web,XML and JavaEE Development
というカテゴリの中をすべて選んでインストールして下さい。

WTPの有効化
以上により、WTPが使える状態になりました。が、インストールするだけではだめ。GAE/Jアプリのためのプロジェクト「Web Application Project」をにおいて、WTPが有効になるようにしなければなりません。
有効化の方法は、【Project】→【Properties】→【Project Facets】を選びます。










そうすると最初は設定されてないという画面がでますので、それを押します。
すると以下の画面がでます。ここで、有効にしたいFacetを選ぶわけで、サーブレット作成に最低限必要なのは
  • Dynamic Web Module
なので、これを選びます。


Dynamic Web Moduleの設定上の注意点(20110602追記)
ここは重要です!!プロジェクトを作成する最初にやっておかないとダメですので、必ずこの設定をして下さい(あとから変更できません)。
(1)DynamicWebModuleのバージョン
WTPのバージョンはデフォルトではVersionが3.0になってます。GAE/Jでは、ServletAPIの2.4ないし2.5相当に準拠しているので、バージョンを下げないといけません。ここで実際下げてみると、2.5ではエラーがでますので、2.4にしましょう。
(2)コンテンツディレクトリ設定
WTPでは、コンテンツのルートディレクトリをWebContentというフォルダにしようとします。しかし、GPEでのコンテンツディレクトリは warフォルダです。よって、上記の「Dynamic Web Module」を選択した際に、下部に「Futher configuration」というリンクがあるので、これをクリックします。そこで、Content Directoryを「war」 に変更してください。



以上の設定により、サーブレットを作成するというウィザードが有効になります。これで、Servlet関連のファイルを自動生成できます。。この設定をしておかないと、web.xmlでのマッピング記述を自動化してくれませんので注意です。


以上、Nebeansユーザからすると、めんどうだなぁと思いつつ、これさえクリアすれば、スムーズに開発できる気がしてます。


NetbeansからEclipseへの移行を検討

Javaを利用し始めて10年以上になりますが、IDEをNetbeansからEclipseに切り替えようかと考えています。IDEの使い勝手としては昔から使っていて慣れていること、またインストールすれば各種環境がデフォルトで入っているということでNetbeansを使い続けたいのですが、Google関係のプラグインの更新がNetbeansでは最近止まっているのが気がかり。。。。というのが最大の理由です。スピーディな開発が求められる現在、個人的なこだわりは捨ててとにかくRapidな開発環境を整えるのが先決かなと、、、
しばらく、試行錯誤していこうとは思いますが、臨機応変に両刀使いで行こうかとも思ってます。
Eclipseについての情報は初歩的なものも含めて随時、このBLOGならびに研究室サイトに情報をアップしていこうかと思います。