2010年4月22日木曜日

Google Chrome拡張機能のHelloWorldをやってみる

初めて、ブラウザ拡張機能のGoogle Chrome Extensionsを触ってみた。

まずは、おきまりのHello Worldを下記のページを見ながらやってみる。

ちなみに、このサンプルは、RESTを利用してその画像情報を表示するみたいな
感じのサンプルになっています。

http://code.google.com/chrome/extensions/getstarted.html

ここによれば、とりあえず、簡単な流れとしては、

1.任意のフォルダを作る。
2.そこに、下記の3つのファイルを作成する。
manifest.json
icon.png
popup.html
http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/tutorials/getstarted/popup.html?content-type=text/plain

3.manifest.jsonの中に「"popup": "popup.html"」という文字を追記する。

manifest.jsonの完成系は、下記のような感じ


{
  "name": "My First Extension",
  "version": "1.0",
  "description": "The first extension that I made.",
  "browser_action": {
    "default_icon": "icon.png",
    "popup": "popup.html"
  },
  "permissions": [
    "http://api.flickr.com/"
  ]
}

4.あとは、google chromeを起動して上部の設定ボタンより「拡張設定」を選択し
「デベロッパーモード」をクリックして「パッケージ化していない拡張機能を読み込みます」
をクリックして、さっきの3ファイルが置いてあるディレクトリを選択することにより
無事ブラウザの上のほうにボタンが表示され、それをクリックするとポップアップ画面が
表示されそこに画像が表示される

という感じに動作した。

popup.htmlの中はjavaScriptになっているようで、あるサーバからRESTの
メッセージを受け取ってその画像を表示するというような感じになっている
ようです。

次は、下記のページなどを見ながら、Google Chrome Extensionsでできることを
みていきたいと思います。
http://code.google.com/chrome/extensions/overview.html

2010年4月2日金曜日

Google App Engineでメール受信の機能をためす

久々に、GoogleAppEngineで遊んでみる。

従来から、メールを受信して、その内容に応じて何らかの
メールを返すみたいなアプリケーションを作ってみたかったのだので、
ためしに、メールの受信・送信をGAE[Java]上で試してみた。

まず、参考にしたページは、下記です。
ほとんど、この通りにやってけば、問題なく動くところまでいけます。
●受信
http://code.google.com/intl/en/appengine/docs/java/mail/receiving.html

●送信
http://code.google.com/intl/en/appengine/docs/java/mail/usingjavamail.html

ほとんど、上に書いていることだけど、一応、一通りポイントを書いておく。

appengine-web.xmlをいじくってメールの受信を行えるように追記をする。
(Rootの要素として)

==========================
<inbound-services>
  <service>mail</service> 
</inbound-services>

==========================


次にweb.xmlをいじってサーブレットのマッピングを行う。


=========================
<servlet>
  <servlet-name>mailhandler</servlet-name> 
  <servlet-class>MailHandlerServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
  <servlet-name>mailhandler</servlet-name> 
  <url-pattern>/_ah/mail/*</url-pattern> 
</servlet-mapping> 
<security-constraint> 
  <web-resource-collection> 
    <url-pattern>/_ah/mail/*</url-pattern> 
  </web-resource-collection> 
  <auth-constraint> 
    <role-name>admin</role-name> 
  </auth-constraint> 
</security-constraint>
==========================


ちなみにメールのあて先は、下記のように@以前の文字は任意の
文字列が利用できるので、この文字列により、サーブレットの
振り分けも行うことができる。
<url-pattern>/_ah/mail/*</url-pattern>


その場合には、下記のような感じでかけば振り分けられる
<url-pattern>/_ah/mail/support*</url-pattern>


これで、上記のサーブレットクラス「MailHandlerServlet」を
実装してあげれば、メールを受信できる用になる。

==========================
//受信して、そのまま返信するだけのサンプルコード

import java.io.IOException;

import java.io.IOException;  
import java.util.Properties;  
import java.util.logging.Logger;

import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Session;  
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;  
import javax.servlet.http.*; 
import javax.mail.Message; 

public class MailHandlerServlet extends HttpServlet {
 /**
  * 
  */
 private static final long serialVersionUID = 1L;

 public void doPost(HttpServletRequest req,  
            HttpServletResponse resp)  
 throws IOException {  
  Properties props = new Properties();
  Logger log = Logger.getLogger("MailHandlerServlet");
  log.info("Send  Mail");
   Address[] sendAdress=null ;
  Session session = Session.getDefaultInstance(props, null);  
  try {
   MimeMessage message = new MimeMessage(session, req.getInputStream());
   sendAdress = message.getFrom();
   log.info(sendAdress[0].toString());
  } catch (MessagingException e) {
   
   e.printStackTrace();
  }
  // 送信
      session = Session.getDefaultInstance(props, null); 
        
         String msgBody = "単に返信するだけです。"; 
  
         try { 
             Message msg = new MimeMessage(session); 
             msg.setFrom(new InternetAddress("takes90@gmail.com", "serviceAdmin")); 
             msg.addRecipient(Message.RecipientType.TO, sendAdress[0]); 
             msg.setSubject("It's Test"); 
             msg.setText(msgBody); 
             Transport.send(msg); 
             log.info("Send  Mail");
  
         } catch (AddressException e) { 
          e.printStackTrace();
         } catch (MessagingException e) { 
          e.printStackTrace();
         }
 }
}
==========================
これで、受信できるようになったので、まずは開発環境でテストしてみる。

これもきちんとツールが用意されている。

ローカル環境の

http://localhost:8888/_ah/admin/

にアクセスすると「Inbound Mail」というツールがあるので、それをクリックする。


ここから、送信すると先ほどのサーブレット「MailHandlerServlet 」が呼び出される
という感じです。
この段階では、メールは実際には送信されません。

で、うまく動きそうであれば、Deploy App Engine Projectを行えば、
実際に、メールを送信すると、すぐに帰ってくるのが確かめられます。

あとは、この中身のアプリを実装してあげれば思ったものができそうです。

2010年3月25日木曜日

DBUnitのつまづきポイント

DBUnitを使ってみた。最初は、日本語のページを参照したのだけど、
最新のバージョンでは、なんか古くなりつつある感じだったので、
下記のページを元にやってみた。

http://www.dbunit.org/howto.html

最初のつまずきは、ClassNotFoundが発生した。

それは、とりあえず、下記のページの通り、

http://d.hatena.ne.jp/jyukutyo/20080801/1217579580

必要なライブラリを入れることにより解決。
SLF4J(DbUnitが依存。slf4j-api.jarとslf4j-nop.jarが必要。)


http://www.slf4j.org/

次は、


AmbiguousTableNameException

が出てしまい、エラーになって動かない。

いろいろ試してみたら、どうやら、サンプルではコメントアウトされている
スキーマの指定をきちんとしてみたらこの例外は出なくなった。
================================
System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA, "XXXX" );
================================


どうやら、別のスキーマに同名のテーブルがあるとうまくいかないらしい。

次にぶち当たった問題は、

data type not recognize

というメッセージが出る。メッセージどおりFAQを見ると、データベースが
Oracleの場合には、それなりの記述が必要なようだ。

http://www.dbunit.org/faq.html#typenotrecognized

の記述があるので、下記の通り直してみる。

http://www.dbunit.org/faq.html#typefactory

ちょうどそれをオーバーロードする関数があったので、
ここに記述するとようやく無事に動くようになった。


==========================================================
 protected void setUpDatabaseConfig(DatabaseConfig config) {
        config.setProperty(DatabaseConfig.PROPERTY_BATCH_SIZE, new Integer(97));
        config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new OracleDataTypeFactory());
 }
==========================================================

で、動かしてみた感想は、素晴らしいフレームワークだなということです。

2010年3月24日水曜日

eclipseでソースの検索がうまくいかない

gdataをインストールしてgdataのソースをたどろうと、eclipseからJumpしようとすると、
見つかりません的なエラーが出て、なんかうまく飛んでくれない。

ソースがあるフォルダをきちんと指定してもうまくいかないなと思っていたのだけど、
もうひとつファイルを指定する方法があり、zipが指定できたので、ソースフォルダと
zipで固めて、そのファイルを指定したら、検索できるようになった。

そんなもんなのかなぁと思った。

googleのサービスにアクセスするAPI

Google Data Java Client Libraryを使って、Google Calenderに
アクセスしてみました。

まずは、最初にインストール。
http://code.google.com/intl/ja/apis/gdata/articles/java_client_lib.html#gdata

ここに書かれている必要なファイルをダウンロードします。

次に、

gdata/java/build-src/build.properties



gdata/java/build-samples/build.properties

のファイルに、ダウンロードしたライブラリのパスの情報を記述する。

と出来上がり。

GUI版のサンプルは、下記で実行できる。

ant -f build-samples.xml sample.spreadsheet.guidemo.run

また、Hello Worldはドキュメントどおり下記のまんま打てば、(もちろん、ユーザID とパスワードは変更する)無事APIにアクセスできました。

==========================================
public class CalendarTest {

    public static void main(String[] args) {
        CalendarService myService = new CalendarService("exampleCo-exampleApp-1.0");
        myService.setUserCredentials("root@gmail.com", "pa$$word");
            
        URL feedUrl = new URL("http://www.google.com/calendar/feeds/default/allcalendars/full");
        CalendarFeed resultFeed = myService.getFeed(feedUrl, CalendarFeed.class);
            
        System.out.println("Your calendars:");
        System.out.println();
        
        for (int i = 0; i < resultFeed.getEntries().size(); i++) {
          CalendarEntry entry = resultFeed.getEntries().get(i);
          System.out.println("\t" + entry.getTitle().getPlainText());
        }
    
    }
}
==========================================

gdataはGoogleの各種いろいろなサービスにアクセスするためのAPIらしく、
他にもいろいろできそうなんで、今後も探索してみようかなと思った。

axis2でSOAPのセッション管理

SOAPという言葉は、10年位前から知っていたけど、
本格的に触ってみたのは、つい最近。

触ってみて感じるのは、すげーなという感じ。

異なるプラットフォームのプログラムがつながるというのは、
すごく面白い。

そんな中、SOAPでセッション管理を行う場合にどこら辺がかかわってくるのか
というメモ。

WSDL2JAVAでスタブを作って、その後は、スタブに対し、下記から
設定するみたいです。

stub._getServiceClient().getOptions().setManageSession(true);

2010年3月6日土曜日

antで外部実行ファイルを実行

antからsubversionのリビジョンの取得をしたいときってどうすればいいのか
というのをいろいろ試行錯誤してみた。

まず、外部の実行ファイルを実行する場合には、下記の記述をする。

    
         
         
         
       

上記で言うと
executable="svn"は実行ファイル名。

output="svn.properties"は出力ファイル名

は第一引数
は第二引数
は第三引数


その後にsvn.propertiesから内容を読み出す部分が下記の部分

       
     Sandbox Revision: Build${svn.Revision}

antも使いこなせればなかなか便利そうだなと思った。

eclipseでもantのbuildファイルを自動生成する機能があるので、
これを利用して、antを利用することが多くなりました。