2009年4月30日木曜日

BacklogのAPIを使ってみる

BacklogAPIを使ってみました。
BacklogのアクセスはXML-RPCになっています。Tracと一緒ですね。
ということで、JavaならばApache XML-RPCを使うと、あっさりプロジェクトの一覧が取得できました。
private static final String URL = "https://{使っているスペースID}.backlog.jp/XML-RPC";
private static final String USER = "{ユーザ名}";
private static final String PASSWORD = "{パスワード}";

public static void main(String[] args) {
try {
XmlRpcClientConfigImpl conf = new XmlRpcClientConfigImpl();
conf.setBasicUserName(USER);
conf.setBasicPassword(PASSWORD);
conf.setServerURL(new URL(URL));

XmlRpcClient client = new XmlRpcClient();
client.setConfig(conf);
Object ret = client.execute("backlog.getProjects", new ArrayList());

// 結果の出力
if (ret instanceof Object[]) {
for (Object o : (Object[]) ret) {
System.out.println(o);
}
}

} catch (Exception e) {
e.printStackTrace();
}
}

ポイントとしては、以下。
  1. Basic認証をする。
  2. POSTで送信する。
  3. Outputに送信するXMLを記述する。

ということで、ApacheのXML-RPCを使わないパターンで、送信時に必要な情報を再確認。
以下のコードでもアクセスできるのを確認。


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.ProtocolException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class HttpClientHttpURLConnectionAuth {
private static final String URL = "https://{使っているスペースID}.backlog.jp/XML-RPC";
private static final String USER = "{ユーザ名}";
private static final String PASSWORD = "{パスワード}";

public static void main(String[] args) throws MalformedURLException,
ProtocolException, IOException {

URL url = new URL(URL);
HttpAuthenticator httpAuthenticator = new HttpAuthenticator(USER,
PASSWORD);
Authenticator.setDefault(httpAuthenticator);

HttpURLConnection urlconn = (HttpURLConnection) url.openConnection();
urlconn.setRequestMethod("POST");
urlconn.setInstanceFollowRedirects(false);
urlconn.setRequestProperty("Content-Type", "text/xml");

urlconn.setDoOutput(true);
OutputStream os = urlconn.getOutputStream();

String postStr = "backlog.getProjects";
PrintStream ps = new PrintStream(os);
ps.print(postStr);
ps.close();

Map<String, List<String>> headers = urlconn.getHeaderFields();
Iterator<String> it = headers.keySet().iterator();
System.out.println("レスポンスヘッダ:");
while (it.hasNext()) {
String key = it.next();
System.out.println(" " + key + ": " + headers.get(key));
}

System.out.println("レスポンスコード[" + urlconn.getResponseCode() + "] "
+ "レスポンスメッセージ[" + urlconn.getResponseMessage() + "]");
System.out.println("プロンプト(realm)["
+ httpAuthenticator.myGetRequestingPrompt() + "]");
System.out.println("\n---- ボディ ----");

BufferedReader reader = new BufferedReader(new InputStreamReader(
urlconn.getInputStream()));

while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
System.out.println(line);
}
reader.close();
urlconn.disconnect();
}
}

class HttpAuthenticator extends Authenticator {
private String username;
private String password;

public HttpAuthenticator(String username, String password) {
this.username = username;
this.password = password;
}

protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}

public String myGetRequestingPrompt() {
return super.getRequestingPrompt();
}
}


でー、この結果をふまえ、次はAdobeAIRで挑戦。
URLConnectionで始めは試していたんだけど、何か上手く行かなくて結局URLLoader使いましたww

import flash.events.*;
import mx.utils.Base64Encoder;
import mx.rpc.events.ResultEvent;
import mx.collections.ArrayCollection;

public function getProjects():void {
request("backlog.getProjects", null,
function (xml:XML):void {
trace(xml);
});
}

public function request(methodName:String, params:XML, callback:Function):void {
var loader:URLLoader = new URLLoader();
var request:URLRequest = createRequest();

var xml:XML = <methodCall></methodCall>;
xml.methodName = methodName;
if (params != null){
xml.params = params;
} else {
xml.params = '';
}

trace(xml);
request.data = xml;

loader.addEventListener(Event.COMPLETE,
function response(event:Event):void {
try {
var xml:XML = new XML(event.target.data);
callback(xml);
} catch (error:Error) {
trace(error);
trace(event.target.data);
}
loader.removeEventListener(ResultEvent.RESULT, response);
});

loader.load(request);
}

private function createRequest():URLRequest {
var request:URLRequest = new URLRequest("https://" + txtSpaceId.text + ".backlog.jp/XML-RPC");
request.cacheResponse = false;
request.manageCookies = false;
request.method = "POST";
request.contentType = 'text/xml';

//Basic認証用の設定
var encoder : Base64Encoder = new mx.utils.Base64Encoder();
encoder.encode(txtUser.text + ":" + txtPassword.text);
request.requestHeaders.push(new URLRequestHeader("Authorization", "Basic " + encoder.toString()));

return request;
}


プロジェクト一覧だけですが、AdobeAIR画面で表示できましたデス。
でも、XML-RPCのレスポンス形式って面倒ですねぇ。XMLなのにAIRのテーブル上にそのまま持って来れないのがなんとも残念。

んー、XML-RPC用にそぅいぅXML変換のライブラリを作っちまうかなぁ....
• • •

2009年4月22日水曜日

Agile Japan 2009に行って来た

Agile Japan 2009に行ってきました。

なんと、リーン開発のメアリー ポッペンディーク氏がやってくるイベントです!
対象者が管理をする立場のイベントでは女性比率が高くなる気がしますが、思ったより少なかったかなぁ。でも一割くらいいたかな?

キーノート


「ソフトウェア開発現場に求められる新しいリーダーシップ 〜アジャイルに見る大野耐ー、デミングの影響〜」
メアリー ポッペンディーク氏

「教育」についての流れを1900年の時代からどう変わって行ったのかというのを時系列に説明が始まりました。
1920年では戦艦などを作るために教育プログラムがあったが、その中には既に
”生徒が学んでいないのは教えていないから”という文句があった。
1940年では戦時中の企業内訓練という時代に、”人の教え方、扱い方””教育のスキル”などのキーワードが。
1950年にはトヨタ生産方式としてのJustInFlow,ポカヨケ,カイゼン
1980年にはデミングが。

随分昔から、”教育をする人のスキル”について考えられていて、トヨタやデミングなどで何が重要なのかのヒントが与えられた感じですね。

リーダシップに必要なのは、
”ビジョンを維持すること= 目的は譲らないこと。”
”ファシリテーター”

今回に限らず、アジャイルの話の場合 「リスペクト」 という単語がよく出てきますが、これをチームみんなが感じるためにはリーダーシップの導きというのが必要になると思います。
リスペクトというのを和訳すると尊敬とか敬意になりますが....そういうと、対象物が”人”って感じを受けますが、リスペクトって人に限らず、モノだったり、仕事自体だったり...ですよね。なので、私は 尊敬 というより、リスペクトという単語が好きです。

そうそう、話はメアリーが話してくれたのですが、言葉の中に、「カイゼン」とか「ゲンバ」とか出てくるのはなんか良かった。
そういう言葉が海外では単語として通じるという事は知っていたけども、生の英語で聞くとおおー!って感じ。
しかもメアリーの発音は凄く良くわかりやすくて、人を引きつける雰囲気を感じました。

Toyota Production System
Thinking People System

トヨタ生産方式ってカンバンとか..有名なモノはあるけど、本質は "人が考える" という事。
大野耐一の「標準」の話も、その後に話された黒岩氏も同じ事を言ってました。
標準を変えずに守り続けているのは、それこそ無駄働き。
標準を作るのは、それを守るため ではなくて、比較物がないとどれだけカイゼンされたのかが分からないから。

Q&Aの所では、トムも登場!いたんですね、トム。
メアリーもトムも結構お年を召していると思うのですが、夫婦揃ってこぅやって一線で活躍しているのは、本当に凄いなぁー。見習わなければ。

あわよくばサインを貰おう!と思って「リーン開発の本質」の本を持って行ったのですが、サイン機会がなく残念でした。。


「ソフトウェア開発に生かす、トヨタ生産方式モノづくりヒトづくり」
黒岩 恵氏

トヨタ生産方式を知り尽くした黒岩氏による説明でした。
色々脱線が多かったですが...その原因って...「製造の話でしょ?ソフトウェアは違うんだよ」って反応が日本では多かったからかなぁ...海外の方が受け入れてもらいやすいらしいです。
強調されていたのは、「多能工を作る」「自律的運営」「Know howよりKnow why」
製造業のイメージとしては、できるだけ細かく分業して...あなたはこのネジを入れる人、あなたはネジを止める人 みたいな...やった方が効率がいい?って思ってたんですが、そうではなく 色々な作業ができる多能工を作り、自分たちで考る という方が結果効率が良いと。

ここで気をつける必要があるのは、アメリカと日本の違い。アメリカの場合、色んな人種の人がいてマニュアルが有った方が効率がいい時が多いけど、日本は違う。
それなのに、トヨタ生産方式が日本よりも海外の方が受け入れてもらいやすいって状況は、日本人としてちょっと恥ずかしいです。。

あと、へー!って思ったのは、「コンピュータを使わなかったからこそ、色々考え工夫した」ということ。
情報の先出しが良くない...という事で先出し情報パネルの前に隠すパネルがあったり、エアーシューターで管理していたり...という写真が見れました。
アナログで残しておく所って重要ですね。


お昼 + LT

面白かったのは、「大阪のおばちゃんはアジャイラーだ」というもの。
話し好き、おせっかい焼きってのは、アジャイラーで必要なコミュニケーション能力なんすね!


スピードがすべてを駆逐する 良品計画事例

このセッション、面白かったです。
良品計画ではシステムの一部を内製化したのですがそのお話でした。
内製化したのは、要望/要件が固まりにくい管理系の所。レジやEDIの所は要件が或る程度固まっている所なので、そこは外部委託にし、情報は 一切データを加工しないローデータ のまま内製化したシステムに配信する仕組。
内製化システムは、最初から100%を求めず、70%ぐらい決まった時点で開始。1〜2週間位のサイクルで、早くに試して早くに修正して...で開発期間が短く。

内製化したシステムは「ユニケージ開発」というのが行なわれたとの事。
ユニケージ開発というのは、ミドルウェア/DBは一切なし。
シェルスクリプトのコマンド+ファイルですべて開発を行なうというもの。
コマンドはパイプで繋げて作って行く。
これで、ステップ数は1/50(だったっけ?) パフォーマンスは 20倍。
直ぐにプログラムが書けるから、プログラムは使い捨てでOK.

凄い〜!! なんか感動です。
70%ぐらいでスタートを切った事、ローデータのまま受け取る事などの方針は素晴らしいって思うし、コマンドだけでプログラムを作る事...そういう発想が私には無かった。
んー、Javaで皆開発してるから...そこに why? ってのが無かったなぁー。


コミュニケーションタイム

6つ位に分かれて、好きなセッションを聞くってものでした。
ですが...1つの会場内だったので、マイクなしの声は大変聞きづらかった。半分ぐらいは聞こえなかった。あれは次回カイゼンして頂きたいww
私は プロジェクトファシリテーション相談室 というのに行ってきました。
びっくりしたのは、カンバンとかやっている人が結構多い!その場では半数以上は手を挙げてましたよね??
Myホワイトボードを持って来ている人がいて、それも使いやすいように自作されている!
私もMyホワイトボード欲しくなった。今度100円Shopのぞいてみます。


ソフトウェア開発を成功させるチームビルディング
岡島 幸男氏

人と人との間(例えば上司と部下)にある、見えない壁 これは何なのか?
という題目でチームビルディングについての話でした。
チームビルディングについてはとても興味があります。というのも、チームでの開発 という経験があまりないんです。
チーム皆で考えてつつ目標に向かって団結して頑張ろうー!というのに憧れが。。
人の付き合いって難しいですが、いいチームというのが一番開発効率も上がるし、達成感も得られるような気がして。

見えない壁を何度も経験してしまうとチャレンジさえもしなくなってしまうのですが、そんな壁を取り除く方法があるようで。
→ 壁の存在をまったく知らない人を投入する!
そんな人をみたら、チャレンジをしなくなった人も、動き出す。



全般的に楽しかったです。
でも...企業Topを含む、管理職以上の人にもっと来てもらうため、私は辞退した方が良かったのかも。。

今日のイベントを受けて明日から何を動こうか...
職場に遊び心を!ってことで、前から気になっていた、XFDを作ってみよーかなぁーww

川口さんのページにDIYOrb - my own "extreme feedback" device for Hudsonなんてのを発見したけど...知識がなくても作れるもんなんかが不安。
組み立ててUSBに指したらOK!的なキットってないんでしょうか。。。
• • •

2009年4月15日水曜日

SVNのタグをつけるのに失敗

Subversive(EclipsePlugin)でタグをつけようとしたのですが失敗してしまう。

Tag operation for some of selected resources failed.
svn: Commit failed (details follow):
svn: No write-lock in
'作業しているローカルカレントディレクトリ'svn: :
(apr_err=155005)

とか
A path under version control is needed for this operation

とか。

Eclipseのコンソールをみると、svn copy でローカルのファイルをUploadしようとしているみたいですね。
後者のエラーは、メッセージ通りの状況でしたし。
前者のエラーもローカルにてなんかしよーとした途中のエラーなんでしょうし。
そっか、ローカル作業のものがタグの対象なんですね。ブランチの場合は、ローカル作業のものを対象にしてほしいけど、タグの場合はサーバーのものを使ってほしいんですがねー。

つーことで、サーバにあるtrunkの内容をタグのフォルダにコピーしたいだけなので、コマンドで実行するようにしました。
ローカルファイルよりは、trunkのものでタグ付けしてほしいから、これからはコマンドラインで叩こう。

タグをつけ...といえども、内容はタグのフォルダを作成して、コピーする手順です。

svn mkdir "svnサーバのパス/tags/タグの名称" -m "コメント" --username "ユーザ名"
svn copy "コピー元パス" "コピー先パス" -m "コメント" --username "ユーザ名"



ちなみに、Macの場合はMacPortでいれたSubversion。Windowsの場合にはSlik SVNを使ってみてます。

追記
SVNリポジトリエクスプローラーの New → Tag のメニューがあるのをコメントで教えてもらいました。これでtrunkのノードを選択した状態でタグをつければ、サーバのtrunkのものをタグ(のフォルダへ)コピーしてくれるんですね。お、解決です。
Newの下にあるのか!全然気づかなかったですよー そっかー Newか....
• • •

2009年4月12日日曜日

GoogleAppEngine for Javaを少し。

GoogleAppEngine for Javaを少し触ってみよう!ということで、Google App Engine / Getting Started: Javaのチュートリアルを動かしてみました。

Eclipseのプラグインを使うとすんなりDeployの成功し、アプリが動くのを確認できました。

チュートリアルはGuestBookというやつで、JDO + JSPで動くもの。
com.google.appengine.api.users.UserServiceというクラスで、Googleのログイン機能が使えるみたい。

JDOでのDBアクセスは、、JDO/JPAアクセスを提供してくれるDataNucleusというApacheライセンスv2.0のオープンソースが使われていました。
含まれていたJARは以下で、DataNucleus関連は4つ。
  • appengine-api-1.0-sdk-1.2.0.jar
  • datanucleus-appengine-1.0.0.final.jar
  • datanucleus-core-1.1.0.jar
  • datanucleus-jpa-1.1.0.jar
  • geronimo-jpa_3.0_spec-1.1.1.jar
  • geronimo-jta_1.1_spec-1.1.1.jar
  • jdo2-api-2.3-SNAPSHOT.jar

DataNucleusというのはあまり良く知らなかったんですが、JPOXの後継とのことで、JDO1、 JDO2、JDO2.1、JPA1の準拠に加え、LDAPやExcel、XMLなどへの永続化がJDO/JPAから出来るらしい。
JDOとJPAはJDO v JPAとかを見つつ、用途に合わせて選択していけばよいんですね。
ちなみにJPAを使う方法は、Using JPA with App Engineにありました。

先がBigTableってーことで、RDBではないですし、いままでの様に複数テーブルをJoinした複雑なSQLってのはやっぱりできなかったりするんだろうなーって想像もあるので、癖を知っておくのは必要そうですね。
...とおもっていたら、書いてあった。
Unsupported Features of JDO
Unsupported Features of JPA
many-to-manyはダメなんすね。
"Join" queriesってのはどんなものを指しているんだろ? SQLを書く時にJoinは使ってはダメって事かなぁ。。

....含まれているJARがdatanucleus-appengine-1.0.0.final.jarってことで、GAE専用のもの(BigTable専用のもの)だったりするんですかね?
でも、もしかしてGoogleドキュメントのExcelを永続化先に選べちゃったりするんかしら??

ぼーっとアプリ管理画面をみていたら、Cronの文字が。
Cronも使えるんですねー。Scheduled Tasks With Cron for Java

あとは、メールを送信できるMail APIと、メモリーキャッシュのMemcache APIもあるし...画像を切り抜き、回転できるようなImage Manipulation APIもある。

さて、どんなアプリつくるかなぁー
• • •

2009年4月11日土曜日

MacAirの熱暴走で初夏を感じる

今日はMacAirが熱暴走を繰り返し、大変でした。

熱暴走をするとkernel_taskというプロセスがCPU100%を超えします。
そうなったら本体が冷めるまでまって、マシンの再起動。

本体が冷めてもkernel_taskの暴走がとまらなかった時もあるし、本体が冷める前に再起動をしてもダメだった。

んー、夏にMacAirで一日中開発するのは無理だな。
家では アイスノン で本体を冷やして回避してたんですが、会社ではアイスノンがもちろん無いですし...今日中に仕上げる必要がある業務があったのでオラオラ〜って使っていたのがダメだったらしい。

まぁ、気温が温かくなってきたからなんでしょうねーコレも。
• • •

2009年4月10日金曜日

AIR GEAR v1.0.2リリース準備中

AIR GEAR v1.0.2リリース準備中ですぅ

今回のリリースでは、デバッグ実行 と Flex用ビルドとSWFViewer が追加されます!
デバッグ実行は、Eclipse/Java程便利なものじゃーないんですが、StepIn,StepOver と 評価式(Expression)の表示ができるようになりますよー
StepInでAIR/Flex3のソースも辿って見えるので、そこそこ便利なんじゃないかなぁー?

デバッグ実行についてはAIR GEAR使用方法にも書いているので興味があれば...事前にどうぞww

デバッグ実行では、FlexSDKについているFDBを使っています。
FDBのコマンドとEclipseのデバッグ時の操作をつないだ感じ。
なのでFDBで出来る事は今後も追加されるかも?逆にFDBで出来ない事は、出来ないんですが ね。

SWFViewerは単純にswtのBrowserになっています。
SWFが更新されたら(ソースが変更されて保存、ビルドが完了したら)、更新されるようになってますー。
Flex自体の開発をした事がないんですが、それだけでも便利だったりするもんですかね??

あー、あと、アイコンをちょっと変えてみました。
アイコン作るのに結構時間かかったので、ショボっ!って言わないでね(笑)
• • •

2009年4月5日日曜日

花見

先日に行った代々木公園の夜桜花見に引き続き、北の丸公園の花見に行ってきました。
あんなに長時間日のあたる所に出たのはホント、何年ぶりだろぅww
桜は丁度満開って感じでめっちゃ綺麗でしたー。



• • •

2009年4月3日金曜日

EclipseWTP

最近、EcipseWTPを使ってお仕事をしてみました。
WTPのプロジェクトを作成して、同梱されているTomcatServerをたてて実行する形で。
それまでは使ってもSysdeoかJetty。しかもWEBアプリケーションっつーのを全然業務でやってなかったので、真面目に使ってみたのは始めて。

使い始めの頃は、Server起動時にエラーが出て来て、起動できなかったりして???になったけど、一通りの解決方法を知ったらまぁ大体大丈夫な感じ。

基本の解決方法は、以下。
1. プロジェクトをF5などで更新してみる
2. ServerのメニューでClean + publishしてみる
3. ServerをRestartしてみる
4. Eclipse自体を再起動してみる
5. プロジェクトをCleanしてみる
6. S2Container使っている時はCoolDeployにして試してみる

クラスはあるのにClassNotFoundExceptionがでてきてたら、Eclipse自体の再起動をしてみると結構解決する。(ServerのRestartではダメな時)

Tomcatの起動時、該当のプロジェクトが認識できていないようだったら、まずはプロジェクトを更新。WTPのプロジェクトになっているかも確認。(なぜか分からないけど、WTPのプロジェクトで無くなっている時があったので)

もし、org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DeploymentDescriptorLoadException:
WEB-INF/web.xml
ってエラーがでていたら、web.xmlのキャッシュが変に残っているらしいので、ServerのメニューでCleanしてみると直る。

永続化情報が..云々言っているときは前回綺麗に終了できてなかった場合があるので、ServerのRestart.

まぁーいずれの時にも最初にプロジェクトのF5での更新を忘れずした後に、落ち着いて上記の手順を色々試すと解決できました。今の所は。

JavaScriptもDLTKで書きやすくなってるしー。SQLエディタもなにげに便利だったりするしー。
WEBアプリを作成する時に使いそうなもののエディタが既に入っていて、いざ使おうとした時にサクっと使えるのは、有り難いもんです。

動かなくなった時も、ハイハイ!って解決しつつ、いい付き合いをしてあげると結構出来るヤツだなーという印象デス。
• • •