2009年4月6日月曜日

起業して1年

1年が早いです。去年の4月に起業してから過去お付き合いのある会社、知人から仕事をいただいて何とかやってこれました。ありがとうございます。

今年は大きな仕事を受注し、社員を増やしたいと思います。

2009年1月20日火曜日

Java のフレームワークどうしましょ

あけましておめでとうございます。

次の受託開発案件で Java を使うことになりそうなのでフレームワークの比較検討しています。

私が今まで使ったことのあるフレームワークは
・Struts 1、2系 → EC など
・Tapestry 3系 → 業務システム
・Click Framework → 自社サービス(openidea.jp)
の 3つです。

一言にフレームワークといっても色々な役割がありますが、私は次の 4つが主要な機能だと考えます。
・URI マッピング
・フォームのバリデーション
・テンプレート
・データベースアクセス

表にするとこんな感じでしょうか。かなり昔の記憶で書いているものあって、正確でなかったり、当時スキル不足や調べ切れなかったものもありますが。。


URI マッピングバリデーションテンプレートデータベースアクセス
Strutsサーブレットフィルタ *.do 標準独自JSP 2.0 標準なし
Tapestryサーブレットを /app などにマッピング独自独自 + ognl 形式なし
Click Frameworkサーブレットフィルタ *.htm 変更不可独自Velocity 標準Cayenne、Spring サポート


この 3つはどれもぴったりハマることなく、気に入らないところは色々いじって使ってました。それぞれの使った感想を簡単にあげます。

Struts:
・設定ファイルが面倒。設定ファイルにして便利だったことはほとんどない。
・*Form, *Action とたくさんのクラスができて管理が面倒。
・学習は比較的容易?情報がたくさんある。

Tapestry:
・業務システムで採用したのが間違いだったかもしれないが、複雑な画面になるとイベントの制御がかなり難解になる。
・カスタムコンポーネントを作り始めると面白い。
・ページ制御側の学習コストは非常に高くつく。HTML テンプレートはスッキリ。

Click Framework:
・拡張子 *.htm が固定で変更できないのが痛い。
・学習は容易。

ほとんどのフレームワークはテンプレート部分や、データベースアクセスは他のプロダクトに変更することが可能です。実はここの選定が肝だったりします。別途テンプレートやデータベースアクセス部分のことは書きたいなと思います。

これらの今まで使ってきたフレームワークの追加調査に加え、Wicket も調査したいです。Spring Framework、S2 など DIコンテナを含むものは今回はパスしようと思います。

ここ 2、3年は Perl、PHP 案件がほとんどだったので忘れていましたが、Java 案件は
→ 新しいフレームワークの選定
→ 開発スタートしてから新しいフレームワークの細かい部分の調査ハマる
で遅延しがちなので要注意ですねー。

2008年12月22日月曜日

仕事でつながるサービス

どもどもー。起業して半年以上たちますが、未だに一人で受託案件こなしてます。
今期は何とか黒字でしたが、そろそろこの一人受託開発スタイルから脱却しないとだめですね。

つまり、社員を雇ったり仕事の一部を外注していきたいのですが。。

そんなときに見つけたサービス「ランサーズ」さん。最近できた様子です。
http://www.lancers.jp/

楽天ビジネスっぽい仕組みは、世の中に無ければ作りたいなーと思ってましたが、これ大変分かりやすくて良いです。どんどん発展していきそうな予感です。

試しに仕事の依頼をしてみようかなー。

2008年11月12日水曜日

mod_ktai バージョンアップ

mod_ktai がバージョンアップしたようです。

前回は mod_ktai おしいなぁという感想だったんですが、今度のバージョンは VirtualHost に対応しています。UTF-8 の PCサイトと Shift_JIS の携帯サイトが共存する環境でも問題なく使えるようになりました。

よかったよかった^ ^

これによって表示は mod_ktai に任せることができるので、あとは入力される 3キャリアの絵文字をノーマライズすればいいですね。

2008年10月24日金曜日

Shift_JIS で encodeURIComponent

Ajax が流行り始めてからほとんど UTF-8 でウェブアプリケーションを作っていたので気にならなかったのですが、Shift_JIS で作るとなるとちょっと面倒くさいです。

例えば script.aculo.us の Ajax.InPlaceEditor のコールバックとかで普通に書くと encodeURIComponent が UTF-8 エンコードを施すので、サーバ側で Shift_JIS として受け取れません。
new Ajax.InPlaceEditor(e, "/example/modify_text", {
callback: function(f, v) {
return "text=" + encodeURIComponent(v);
},
ajaxOption: {method: "post"}
}


そこで思いついたのが encodeURIComponent を 2回行う方法。これでサーバ側で個別にデコードしてやれば良いです。JavaScript を使って日本語パラメータを送信する必要があるところだけです。
new Ajax.InPlaceEditor(e, "/example/modify_text", {
callback: function(f, v) {
return "double_encoded_text=" + encodeURIComponent(encodeURIComponent(v));
},
ajaxOption: {method: "post"}
}


他に方法あるのかなぁ。。

2008年10月17日金曜日

mod_ktai を試しました

避けてきた携帯3キャリアの絵文字対応をすることになりました。

色々さがして mod_ktai を試しましたが、3つの不満点が・・・

1) 入力のフィルタはしてくれない
2) UTF-8 での閉じるダブルコーテーションが外れるバグ
3) ダブルコーテーションバグを回避しようとして、UTF-8 で提供している他のサービスと分けて、VirtualHost 内に AddOutputFilterByType を記述してみたら、docomo 用のレスポンスヘッダ application/xhtml+xml に反応しないんです。
そこで次のようにタイプを追加したら、docomo 端末でアクセスしても何故か PC 用の絵文字画像に変換されてしまう><
LoadModule ktai_emoji_module modules/mod_ktai_emoji.so
KtaiEmojiConvertMode auto
KtaiEmojiConvertNativeEmojiDocomo 0
KtaiEmojiEnableAddGuidOn 0
KtaiEmojiHasIconFile 1
KtaiEmojiIconDir /img/emoji

<VirtualHost *:80>
ServerName example.com
AddOutputFilterByType KTAI_EMOJI_OUTPUT_FILTER text/html application/xhtml+xml
</VirtualHost>


おしい。

2008年9月15日月曜日

簡単クラスパス設定 シェルスクリプト

Java のクラスパス、設定するの正直面倒くさいです。そこで少しだけ便利なスクリプトを使っています。使い方はこんな感じ。
Usage: . classpath.sh (option) [dir]
(option)
-a add CLASSPATH
-r recursive

指定したディレクトリを走査して jar ファイルだけを環境変数 CLASSPATH に追加します。以下ソースです。
#!/bin/sh

if [ -z "$1" ]; then
echo "Usage: . classpath.sh (option) [dir]"
echo "(option)"
echo " -a add CLASSPATH"
echo " -r recursive"
exit 0
fi

_recursive=0
_add=0
dir=

parse_arguments() {
for arg do
case "$arg" in
-r) _recursive=1 ;;
-a) _add=1 ;;
*) dir=$arg ;;
esac
done
}

classpath() {
for i in "$1"/*; do
if [ -d "$i" -a $_recursive -eq 1 ]; then
classpath "$i"
elif [ "${i##*.}" = "jar" ]; then
_classpath=$_classpath:$i
fi
done
}

if [ $_add -eq 1 ]; then
_classpath=$CLASSPATH
if [ -z "$_classpath" ] ; then
_classpath=.
fi
fi

parse_arguments $*
classpath "$dir"
export CLASSPATH=$_classpath
unset _classpath