2010年12月21日火曜日

JavaでDOSコマンドを実行しその結果を表示する

WindowsのDOSコマンドをJavaプログラム内で実行し、その結果を
Javaの内部で取得する方法。

下記のサンプルプログラムでは、netstatコマンドを実行してそれを
表示するサンプル。

import java.io.IOException;
import java.io.InputStream;


public class CommandExecAndSysOutSample {

 public static void main(String[] args) throws IOException, InterruptedException {
  String[] s = {"cmd.exe", "/c", "netstat"};
  Process process = Runtime.getRuntime().exec(s);
  InputStream is = process.getInputStream();
  int size=0;
  byte[] b = new byte[1024];
  while ((size=is.read(b))>0){
   String ss = new String(b,0,size,"MS932");
//   System.out.println(size);
   System.out.print(ss);
   Thread.sleep(100);
  }
  System.out.println("-----------END");
 }

}

2010年12月7日火曜日

Javaで圧縮と解凍のサンプル

Javaでデータ圧縮するのとそれを解凍するサンプルを書いて見た。
最初は、単純にDeflaterのみを利用するパターン

import java.io.ByteArrayOutputStream;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;


public class ZLIBTest {

 /**
  * @param args
  * @throws DataFormatException 
  */
 public static void main(String[] args) throws DataFormatException {
  // TODO Auto-generated method stub
  Deflater compresser = new Deflater();
  compresser.setLevel(Deflater.BEST_COMPRESSION);
  StringBuffer val= new StringBuffer();
  for (int i=0;i<10000;i++){
   val.append("1000");
   val.append(',');
  }
  byte[] value = val.toString().getBytes();
  
  compresser.setInput(value);
  compresser.finish();

  ByteArrayOutputStream compos = new ByteArrayOutputStream(value.length);

  byte[] buf = new byte[1024];
  int count;
  while (!compresser.finished()) {
   count = compresser.deflate(buf);
   compos.write(buf, 0, count);
  }  
  System.out.println("Size:"+value.length+"->"+compos.toByteArray().length);
  // ここから解凍
  Inflater decompresser = new Inflater();
  decompresser.setInput(compos.toByteArray());
  ByteArrayOutputStream decompos = new ByteArrayOutputStream();
  while (!decompresser.finished()) {
   count = decompresser.inflate(buf);
   decompos.write(buf, 0, count);
  }
  System.out.println("Size:"+decompos.toByteArray().length);
  System.out.println(decompos.toString());
 }

}
 
 
次に上記のプログラムをDeflaterOutputStream を利用するように変更してみる。

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.Inflater;


public class ZLIBStreamTest {

 /**
  * @param args
  * @throws DataFormatException 
  * @throws IOException 
  */
 public static void main(String[] args) throws DataFormatException, IOException {
  Deflater compresser = new Deflater();
  compresser.setLevel(Deflater.BEST_COMPRESSION);
  ByteArrayOutputStream compos = new ByteArrayOutputStream();
  DeflaterOutputStream dos = new DeflaterOutputStream(compos,compresser);
  for (int i=0;i<10000;i++){
   dos.write("1000".getBytes());
   dos.write(',');
  }
  dos.finish();

  System.out.println("Size:"+compos.toByteArray().length);
  // ここから解凍
  Inflater decompresser = new Inflater();
  decompresser.setInput(compos.toByteArray());
  ByteArrayOutputStream decompos = new ByteArrayOutputStream();
  while (!decompresser.finished()) {
   byte[] buf = new byte[1024];
   int count = decompresser.inflate(buf);
   decompos.write(buf, 0, count);
  }
  System.out.println("Size:"+decompos.toByteArray().length);
  System.out.println(decompos.toString());
 }

}

2010年10月13日水曜日

JavaでCSVファイルを読むサンプル

JavaでCSVファイルを読みたい場合に、シンプルなのは、
String.split()を使えばできるが、

a,b,c,d,"dd,dd"

なんていうような形式のCSVファイルは、標準のメソッドのみで
がんばろうとすると、ちょっと工夫がいる。

なんか便利なライブラリは無いかなと探していたけど、
apacheに使えそうなライブラリがあった。
http://commons.apache.org/lang/

以下がj自分で書いて見たサンプルプログラムで意図通りに動作してくれました。

import org.apache.commons.lang.text.StrTokenizer; 

public class CsvReadTest {
/**
* @param args
*/
 public static void main(String[] args) {
  String input="a,b,c,d,\"a,f\"";
  System.out.println(input);
  StrTokenizer tk = StrTokenizer.getCSVInstance(input);
  while(tk.hasNext()){
   String stwString=(String) tk.next();
   System.out.println(stwString);
  }
 }
}

2010年10月5日火曜日

GWT Designer

久しぶりにGoogleWebToolkitのページに行ってみたら、
GWT Designer なるものが、公開されていた。

どうやら、Web画面をGUI形式でデザインできるツールのようだ。
http://code.google.com/intl/en/webtoolkit/tools/gwtdesigner/userinterface/design_view.html
早速ダウンロードしてみる。
素晴らしいではないか。

これで、Webアプリケーションを作るのに大分直感的にできるようになった。

QuickStartの通りにインストールすると、無事インストール完了。
http://code.google.com/intl/en/webtoolkit/tools/gwtdesigner/quick_start.html

ちなみにeclipse3.4だとうまくいかなかったので、3.6にしてやってみた。

手順を簡単に。
1.下記からGWTをeclipseに追加
http://code.google.com/intl/en/eclipse/docs/download.html

2.GWT Designerをeclipseに追加
http://code.google.com/intl/en/webtoolkit/tools/download-gwtdesigner.html

3.通常通りGWTのプロジェクトを追加。

4.下記ページ参考に従来Webページを表現したJavaソースをOpenWithで「WindowBuilder Editor」を使って開く
http://code.google.com/intl/en/webtoolkit/tools/gwtdesigner/features/editing_existing_window.html

これで、あとは、画面からコンポーネントを張ったりしてやれば、かけます。

久々にGWTアプリを作ってみようかな。

2010年7月17日土曜日

Google Chartで数式

Google Chartでは、数式もかけるようです。
数式なんて実際には書かないだろうけども。

LaTexの文法が使えるようなんですごいですね。

といってもLaTexの文法なんて学生時代に使ったきりつかってないので、
すっかり忘れてしまっているが。


ためしに書いてみると



http://chart.apis.google.com/chart?chs=100x30&cht=tx&x=tx&chl=\frac{a^2%2Bb^2}{3}=c^2


こんな感じ。

chco=FF0000で色を指定できるみたいで、こんなのもかけます。




昔、やさしく数学をという数学のメルマガを書いていたときにこんな機能があれば
便利だったなと思う。
リンク:
Mathematical (TeX) Formulas - Google Chart Tools / Image Charts (aka Chart API) - Google Code

Google Chartで円グラフ

GoogleChartってどんなことができるのか遊んでみる。

まずは、HelloWorldとして3Dの円グラフを表示する。

表示方法は、簡単で下記のURLを呼び出せばできる。

http://chart.apis.google.com/chart?chs=600x200&cht=p3&chd=t:70,40,30&chl=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF

%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A
takes90
 
数字は適当ですが、こんな感じのことがURLの文字列をいじるだけでできてしまいます。
 
例)
みんなの党に期待していますか。というアンケートの結果。

2010年7月14日水曜日

Delphiでメールアドレスをチェックする

Delphiでメールアドレスをチェックするコード無いかなと探してみたら、
日本語のページでは見つからず。

やっぱり、英語で検索しないと欲しい情報にはたどり着けないですね。

Validate email address

このソースでは、


xxx@xx.com

みないな感じかどうかをチェックしている感じです。

2010年6月29日火曜日

JavaでメモリDBを簡単に構築する

メモリDBをDerbyというオープンソースを利用すれば簡単に利用できる。
あまりの簡単さにびっくりしてしまった。

まずは、ソフトをダウンロード。
http://db.apache.org/derby/

binフォルダにPATHを張り

ijと打つとコマンドラインDBが作成できる。

 java -jar derbyrun.jar ij

ij version 10.5
ij> connect 'jdbc:derby:memory:MyDB;create=true';
ij> create table my_table(x int);
0 rows inserted/updated/deleted
ij> insert into my_table values 1, 2, 3;
3 rows inserted/updated/deleted
ij> exit;

ちなみに
'jdbc:derby:MyDB;create=true';

と書くと普通にファイルのDBができる。

これをJavaプログラムで書くと
下記に書いてあるやつをちょっと変更して
http://db.apache.org/derby/docs/10.6/getstart/getstartderby.pdf

こんな感じ。
String driver = "org.apache.derby.jdbc.EmbeddedDriver";
String dbName="jdbcDemoDB";
String connectionURL = "jdbc:derby:memory:" + dbName + ";create=true";
...
String createString = "CREATE TABLE WISH_LIST "
+ "(WISH_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY "
...
+ " WISH_ITEM VARCHAR(32) NOT NULL) " ;

必要なファイルは、derby.jarのみ。これでJavaプログラム内にのメモリデータベースが
できる感じです。

これは、非常に便利だなと思った。

axis2でWSDLからWebサービスを作る

axis2を使うと簡単にSOAPを利用したWebサービスが構築できる。
よくできてるなと思う。

下記のページを参考にして。
http://ws.apache.org/axis2/1_5_1/userguide-buildingservices.html#deployrun

いろいろ方法はあるが、ここではWSDLファイルからサービスを作成する方法。

axis2のbinフォルダに行き

WSDL2Java -uri file:///C:/apps/axis2/samples/zSample/Axis2UserGuide.wsdl -p org.apache.axis2.axis2userguide -d adb -s -wv 1.1 -ss -sd -ssi

を実行するとソースができる。

これのSkeltonクラスに実装を記述した後、こちらで生成されたたbuild.xmlに対して
antを実行すると、aarファイルが作成されるので、これをaxis2のservceフォルダに
置いてあげてbinフォルダのスタート用バッチをキックしてあげて

http://localhost:8080/axis2/

にアクセスすればサービスが作れている。

なんて簡単にできてしまうんだと思った。

eclipseのショートカットメモ

eclipseでは、いろいろな機能がありすぎて十分使いこなせてないんだけど、
よく忘れてしまうショートカットをメモしておきます。

インデントの修正 Ctrl+I
JavaDocの表示 Shift+F2
インポートの整理 Ctrl+Shift+o
クラスの検索 Ctrl+Shift+r

随時この記事を更新していくことにする。

2010年6月12日土曜日

Content Scriptsにてオプションで保存した設定を使う

オプションの設定サンプルは前回に書いたものの中にある
http://ttimez.blogspot.com/2010/06/google-chrome-extensions.html

基本的には、オプションを保存する耐えのhtmlを書きそこでlocalStrageへ保存することになる。

しかし、このlocalStrageはサーバ毎に保存されるので、Content ScriptsでlocalStrageから
読みび出そうとしても読み出せないということで、ちょっとした工夫が必要になる。

オプションのlocalStorageを読み出すためのサンプルがこちらにあったので、
こちらを参考にして作ってみると確かに作れました。

http://d.hatena.ne.jp/umezo/20091115/1258291572

基本的には、background.html background.jsは汎用的に作ってあるみたいなので
そのまま利用できます。あとは呼び出し元を下記のようにhogehogeと自分の
保存したKeyで呼び出してあげればできました。

chrome.extension.sendRequest( { 
        action : "getValues" , 
        args   : [{ 
            "hogehoge" : ""
        }]
    } , function( response ){
        option = response.values ;

        init();
    }
);

これで、またやれることの幅が少し広がりました。

2010年6月3日木曜日

Google Chrome Extensions通知系のサンプルページ

Google Chrome Extensionsでは、通知系のプラグインもできそうです。

説明ページはこちら、
http://code.google.com/chrome/extensions/notifications.html

サンプルソースはこちら、
http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/notifications/

こちらは、オプションページの作り方のサンプルにもなっている。

現在時刻を通知するというサンプルになっていて、下記のような感じで書いてある。

    var notification = webkitNotifications.createNotification(
      '48.png',                      // 画像
      hour + time[2] + ' ' + period, // タイトル文字列
      'Time to make the toast.'      // メッセージ文字列
    );
    notification.show();

ネット上のカレンダーなんかと連携して時間が着たら通知する
なんてやつもできそうですね。

2010年6月2日水曜日

AntでJUnitを動かす

参考にしたサイト。

How do I run JUnit using Ant?
http://junit.sourceforge.net/doc/faq/faq.htm#running_5

プロパティなどの情報
http://www.jajakarta.org/ant/ant-1.5/docs/ant-1.5/j/docs/manual/OptionalTasks/junit.html

複数のテストを実行する際のサンプル
http://www.ki.rim.or.jp/~kuro/Java/JUnit/JUnit-07.html

いろいろantのxmlを自分で書いてみると理解がだいぶ深まってきた。

でテストの結果をxmlで出力して、その後は、JUnitReportでhtmlへと変換する。

JUnitReport
http://www.jajakarta.org/ant/ant-1.5/docs/ant-1.5/j/docs/manual/OptionalTasks/junitreport.html

に書いてあるサンプルどおり下記のように書いてあげれば、
キレイなhtmlが出力できました。

<junitreport todir="./reports">
  <fileset dir="./reports">
    <include name="TEST-*.xml"/>
  </fileset>
  <report format="frames" todir="./report/html"/>
</junitreport>

2010年6月1日火曜日

Javaリフレクションで配列を扱う。

ふとしたことから、リフレクションを利用した場合に配列オブジェクトはどう操作したらいいのか
わかんなかったので試してみた。

import java.lang.reflect.Array
というクラスを利用すHTMLれば操作できるんですね。

下記は、配列のオブジェクトにアクセスするサンプルプログラムです。

import java.lang.reflect.Array;

public class ArrayRefrectionTest {
 public static void main(String[] args)  {
  Object array = new String[]{"aiu","eo","かきく"};
  for (int i=0;i<Array.getLength(array);i++){
   Object obj = Array.get(array, i);
   System.out.println(obj);
  }
 }
} 

2010年5月31日月曜日

chrome拡張にて入力欄のコピペ機能を作ってみる。

chrome拡張で、最初に作ってみたかった、入力欄のコピー&ペースト機能を
作ってみた。Webアプリケーションなんかで入力欄がいっぱいあったりすると
コピーしたくなるときがあるのだけど、今までは、手で一つ一つコピーして
しのいでいた。

この苦労から解放されるのはうれしい。

これは、もっと、無図化しかと思ったけども、非常に簡単に作れた。
ほとんど今までの組み合わせでできた。

今回新たに登場したのは、localStrageだけ。
コピーした内容を保存する部分にlocalStrageを利用した。

使い方は簡単で、グローバル変数である、localStrageを利用して、

localStorage.setItem(KEY, VALUE);


localStorage.getItem(KEY);


とするだけ。
 
削除は、localStorage.clear();
でいける。


流れはこんな感じです。

http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/browserAction/set_page_color/popup.html?revision=33581&view=markup

このサンプルを参考にして、「コピー」、「貼り付け」というポップアップメニューを作成する。

また、上記サンプルを参考に、コピーするJavaScriptと張り付けするJavaScriptを作る。

エディットの中身の取り出しは、以前書いた。

http://ttimez.blogspot.com/2010/05/google-chrome-extensions_13.html

を利用する。

これで、コピペアプリケーションの出来上がりです。

多分、どこかに似たようなツールは公開されていると思いますが、万が一
欲しい人が多いようなら公開したいと思います。

Javaでデフォルトのタイムゾーンを切り替える

デフォルトのタイムゾーン設定を切り替える方法のメモ。

VMの引数に下記を与える。

java -Duser.timezone=JST XXXXX

2010年5月13日木曜日

Google Chrome Extensions エディットに文字を入れる

前回書いた物を参考にして、入力欄に文字を入れ込むという
サンプルプログラムを作ってみる。
http://ttimez.blogspot.com/2010/05/content-scripts.html

とりあえず、Googleの検索文字列入力欄に「aiueo」という文字を入れてみる。
サンプルを書いて見た。

JavaScript自体あまり書いたことが無いので、
W3C CSS Selectors APIの仕様については、下記を参考にした。
http://www.javascriptkit.com/dhtmltutors/css_selectors_api.shtml

とりあえず、content_script.jsを下記のように書いてみたら、思ったとおり動作した。

====================================
// ==UserScript==
// @name          InputTextTest
// @namespace      http://ttimez.blogspot.com/
// @include        http://www.google.com/*
// @include        http://www.google.co.jp/*
// ==/UserScript==
(function (){
    var links = document.querySelectorAll('input[name=q]');
    for (var i = 0, len = links.length;i < len; i++) {
      var link = links[i];
      link.value=link.value+'aiueo';
    }
})();
====================================

また、’aiueo’の部分を日本語にするとうまくいかなかったが、content_script.jsを
UTF-8で保存したら、うまく動くようになった。

Content Scriptsのサンプル

ContentsScriptに関しては、下記の記事が非常にわかりやすく解説されていた。

第2回 User ScriptsとContent Scripts

CntentsScriptとはどういうものかというとhtmlを動的に書き換えてしまう
というような感じのイメージのものです。

例えは、URL文字列がリンク形式になっていないものをリンク形式に
変換するなんて事ができるための機能らしい。

この記事で、紹介されていたContent ScriptsのサンプルはGoogleの検索
結果の左側に、順位とアイコン(Favicon)を表示するというhtmlを埋め込むみたいな
サンプルになっている。

このContentsScriptをプラグインボタンを押した時に実行するように変更するには、
どうすればいいかをちょっと試してみた。

結論を言うと下記のようにスクリプトを実行するAPIを使えば
ボタンを押したときに実行するということが出来た
 chrome.tabs.executeScript(null, {file: "content_script.js"});

http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/browserAction/make_page_red/background.html?revision=42295&view=markup

具体的にいうと下記のサンプルにおいてOnClickedに実行するスクリプト
(上記サンプルでは背景を赤に変えるというスクリプトが実行される。)
を差し替えてあげれば意図した動作をしてくれました。

2010年5月10日月曜日

pageActionのサンプルプログラム

アドレスバーの内部にアイコンを表示し、そこでクリックイベントなどを発生させる
というのがpageActionという概念らしい。

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


これのサンプルも3つあった。

一つ目は、ページの内部の文字列に反応してアイコンを表示させるサンプル。
http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/pageAction/pageaction_by_content/

こちらは、sandwitchという文字列が本文にあった場合にアイコンが出現するサンプル。

2つ目は、URLの文字列をみてアイコンを表示させるサンプル。

http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/pageAction/pageaction_by_url/

URLにgという文字が入っていたらアイコンが表示される。

3つめは、クリックイベントなどを割り当てるサンプルと動的にアイコンを生成してセットするサンプル。
http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/pageAction/set_icon/

やはり、サンプルプログラムを実際に動かすとどんなことができるかが理解できるので
理解が早くなります。

新しいタブを開いた初期ページの変更

Google Chrome プラグイン開発では、下記のページを
カスタマイズできるようです。
・新しいタブのページ
・履歴のページ
http://code.google.com/chrome/extensions/override.html

このサンプルは2つあって、一つは、空白のページを作成する。
http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/override/blank_ntp/

もう一つは、任意のURLに飛ぶサンプル

http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/override/override_igoogle/

上のサンプルではigoogleに飛びます。

2010年5月9日日曜日

URLを開くだけのGoogle Chrome Extensionsサンプル

現在開いているページを印刷するボタンをつけるサンプルプログラムが下記にある。

http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/browserAction/print/

ここのサンプルプログラムを例えば下記のように書き換えてあげると
Google Chrome 上にこのブログを開くボタンを作成できる。

================================
<html>
<head>
<script>
  // Called when the user clicks on the browser action.
  chrome.browserAction.onClicked.addListener(function(tab) {
//    var action_url = "javascript:window.print();";
    var action_url = "http://ttimez.blogspot.com/";
    chrome.tabs.update(tab.id, {url: action_url});
  });
</script>
</head>
</html>
================================

Google Chrome Extensions関連の記事リンク

Google Chrome Extensions関連の日本語記事リンクをここにまとめておく。

続・先取り! Google Chrome Extensions

Google Chromeのアイコンサイズ

下記のページによれば、アイコンのサイズは、19ピクセル×19ピクセルの
BMP, GIF, ICO, JPEG, PNGが利用可能らしい。

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

2010年5月7日金曜日

Google Chromeの背景色の変更とアイコンの文字情報変更サンプル

本日は、下記のページでも読みながら

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

下記のサンプルを動作させてみた。

http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/browserAction/make_page_red/

どうやらこのサンプルでは、下記のような感じで、
・拡張機能の部分のアイコンに文字列情報を出せる
(ここには、4文字までしか出力できないようだ)
・ページの背景色を変えられるというサンプルのようです。


ソースは、background.html内の下記の部分でクリックイベントを書いていて
クリックすると背景を赤にすると書いてある。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.tabs.executeScript(null, {code:"document.body.bgColor='red'"});
  });
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

アイコンの文字列情報表示部分は「Badge」と呼ばれるらしく

chrome.browserAction.setBadgeBackgroundColor({color: [255, 0, 0, 255]});

で文字情報部分の背景色を表示していて(上記の場合には、赤が背景色)

chrome.browserAction.setBadgeText({text:String(3)});

という部分で文字情報を入れているようです。

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を利用することが多くなりました。

2010年1月9日土曜日

DelphiのFORMAT関数で%(パーセント)が入る場合

DelphiのFORMAT関数で%(パーセント)が入るとエラーが発生してしまい、
その場合どうしたらいいのかよくわからなかったのでいろいろ試してみた結果
%%となっていると、それは%とみなされるようです。

下記のようなコードを書くと
showMessage(Format('%%d%d',[10]));

「%d10」

と表示されます。

Javaでランダムな文字列を生成する関数

Javaでランダムな文字列を作る関数が欲しいなと思い、
ちょろっと作ってみました。

引数には文字数を入れます。
ランダム対象となる文字列は、String charsに入っています。

=============================================
 public static String getRandomString(int cnt) {
  final String chars ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  Random rnd=new Random();
  StringBuffer buf = new StringBuffer();
  for(int i=0;i<cnt;i++){
   int val=rnd.nextInt(chars.length());
   buf.append(chars.charAt(val));
  }
  return buf.toString();
 }
==================================