2007年8月31日金曜日

EXIFって何だ?

スズキです。

現在、"Teeda+FileUpload+Mistral"で
画像をアップロードして、その画像を何種類かの大きさにリサイズして、
それぞれを、適当なディレクトリに保存っていうのを作ってます。

ここで一つ問題が発生。
jpegファイルで、Mistralが処理できるものと出来ないものが存在しました。
処理できないときは、
EXIFReaderがないExceptionのようなものが発生していました。
(意識がもうろうとしながら作ってたので、詳細は思い出せませんが...)

で、解決方法ですが、
無いと言われたEXIFを処理するクラスが入っている
下記サイトが提供するライブラリ(jar)を
ライブラリパスに含める、
といったよくあるものとなります。
http://www.drewnoakes.com/code/exif/

ただ、やっぱり、"EXIFって何だ?"ってことになるんですが、

> Exif画像の構造は基本的には通常のJPEG画像形式そのものであり、
> その中にサムネィル画像や撮影情報等のデーターをJPEGの規約に
> 準拠した形で埋め込んだものです。よってJPEG形式をサポートしている
> インターネットブラウザー、画像ビュアー、フォトレタッチソフト等を使えば、
> Exif画像ファイルは通常のJPEG画像として見ることができます。
※ 下記より引用
http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif.html

とのことです。
デジカメに関するメタデータがjpegに埋め込まれているってイメージですね。
なので、そのメタデータを処理するために、
上記のライブラリが必要ってことでした。

画像処理はまだまだこれからだなー。

--
blog: http://suz-lab.blogspot.com/

AptanaがPHPをサポート

スズキです。

そういえば、最近、
いつも使っているEclipseのAptanaプラグインが
勝手に自動アップデートしてるなー、
って思っていたら、ちょうどそのことが記事になってた。
http://journal.mycom.co.jp/news/2007/08/30/040/

新機能として、PHPをサポートしてるということです。
http://aptana.com/docs/index.php/Aptana_Release_Notes

早速試してみたら、しっかりと、PHPのコードの補完を、
Javascriptのようにやってくれます。
(PHP4/5も判別できるようになっています)

これは便利だ。

今回の対応で、PHPを用いたAjaxアプリケーションの開発環境は
Apatanaが一番いいような気がする。

--
blog: http://suz-lab.blogspot.com/

PHP 5.2.4 リリース

スズキです。

PHPが5.2.4にバージョンアップしています。
http://www.php.net/index.php#2007-08-30-1

ローカル開発環境、早速アップデートしてみます。
(そろそろ、あのPHP案件にも手をつけなければ...)

--
blog: http://suz-lab.blogspot.com/

PHPで"1970年1月1日 00:00:00"からの経過秒数を取得

スズキです。

画像のキャッシュ問題で、"xxx.jpg?表記の値"と、
リクエストパラメータをつけることにより回避しようとしたら、
PHPで"1970年1月1日 00:00:00"からの経過秒数を
取得方法を知らなかった。

しょうがないので、ググったら、
time()で取れるようなので、

"xxx.jpg?" . time()

としたら問題解決。
まだまだ、PHP開発はストレス感じます。

Javaならすぐに出てくるのに。

--
blog: http://suz-lab.blogspot.com/

2007年8月28日火曜日

TeedaでForEachで使うフィールドは"public field"に対応していない

スズキです。

Teedaが"public field"に対応し、
ソースが短くなって喜んでいたのですが、
ForEachで利用する、xxxItems系のフィールドに関しては、
この"public field"がきかず、従来どおり、
privateで宣言して、getter/setterを作っていました。

ですが、これも、Teedaの次期バージョンから対応するようです。
https://www.seasar.org/issues/browse/TEEDA-356
(SNAPSHOTもデプロイ済みのようです)

ForEach系のフィールドもpublicで宣言できると、
ソース、かなりすっきりします。

次のTeeda案件で、早速使ってみよう。
(今日、ブランクプロジェクト作るんだけど...)

--
blog: http://suz-lab.blogspot.com/

Postfixをlocalhost以外からも利用できるように

スズキです。

今までlocalhostからしか利用していなかったpostfixを
急遽、同一セグメントの他のサーバから利用しなければならなくなり、
そのTipsです。

まずは現状の確認です。

postfixが稼動しているマシンから、
telnet localhost 25
で確認すると、
--------
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 www.iret.co.jp ESMTP Postfix
--------
と出力され、接続できることを確認。

他のマシンから、
telnet xxx.xxx.xxx.xxx 25
で確認すると、接続がはじかれる。
なので、また、postfixが稼動しているマシンから、今度は
telnet xxx.xxx.xxx.xxx 25
で確認すると、やはりはじかれる。

おそらく、インターフェースがlocalhostしかバインドされてないと予想。

で、main.cfを確認すると、案の定、
バインドするインターフェースの設定が、localhostのみとなっている。
--------main.cf
#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
inet_interfaces = localhost
--------

これを下記のように、全インターフェースをバインドするように変更。
--------main.cf
inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
--------

これで、同一セグメントのマシンから下記コマンドでの接続を確認。
telnet xxx.xxx.xxx.xxx 25
※リレーの設定は、既にされていた。

最後に、他のマシンから、このpostfix(smtp)を使って
メールが送れるか確認。
(下記参照)
http://ash.jp/net/telnet_smtp.htm

無事、送信できることを確認。

緊急だったので、とりあえず対応になってしまった。
main.cf、あまり理解できていません。

--
blog: http://suz-lab.blogspot.com/

2007年8月24日金曜日

S2Mai 0.9.3 リリース & Smart Deploy

スズキです。

先日、SVNのTRUNKですが、S2Maiの"Smart Deploy"への対応(修正)
された旨のエントリーを書きました。
http://suz-lab.blogspot.com/2007/08/s2maismart-deploy.html

そして、早速、この部分を組み込んだバージョン(0.9.3)がリリースされました。
http://www.seasar.org/wiki/index.php?SeasarWhatsNew%2F2007-08-23#tc3a050c

実際に"Smart Deploy"に対応させるためには、
さらに、下記の調整が必要なります。

1. "app.dicon"に"s2mai.dicon"のインクルードを追加。
...
<components>
  ...
  <include path="s2mai.dicon"/>
</components>

2."creator.dicon"に"MaiCreator"を追加。
<components>
  ...
  <component class="org.seasar.mai.creator.MaiCreator"/>
</components>

3."extra-customizer.dicon"(新規)に"s2MaiCustomizer"を作成。
<components>
  <component name="s2MaiCustomizer"
      class="org.seasar.framework.container.customizer.AspectCustomizer">
    <property name="interceptorName">"s2mai.s2MaiInterceptor"</property>
  </component>
</components>
※実際は、"s2mai.s2MaiInterceptor"を"AspectCustomizer"としているものです。

4."customizer.dicon"で"extra-customizer.dicon"をインクルードして、
"maiCustomizer"に"s2MaiCustomizer"を追加
<components>
  ...
  <include path="extra-customizer.dicon"/>
  ...
  <component name="maiCustomizer"
      class="org.seasar.framework.container.customizer.CustomizerChain">
    <initMethod name="addCustomizer">
      <arg>s2MaiCustomizer</arg>
    </initMethod>
  </component>

</components>

5.ルートパッケージの下にmaiパッケージを作成し、
その中にMaiインターフェース配置すれば、"Smart Deploy"に対応します。

次はバリデーターの"Smart Deploy"をやらなくては。

--
blog: http://suz-lab.blogspot.com/

Google & Firefox

スズキです。

今、自分が使っていて、便利だと思っている、
FirefoxのGoogle系アドオンを下記にまとめてみました。

▼Better Gmail
https://addons.mozilla.org/ja/firefox/addon/4866

▼Gmail Notifier
http://toolbar.google.com/gmail-helper/notifier_windows.html

▼Google Reader Notifier
https://addons.mozilla.org/ja/firefox/addon/3977

▼Google Toolbar / Google Notebook
http://www.google.com/tools/firefox/

右下(ステータスバー)から
Gmail, Google Notebook, Google Reader
に、すぐにアクセスできるのが便利です。

Portable Firefox & 各種Googleアドオン、最強。

--
blog: http://suz-lab.blogspot.com/

2007年8月22日水曜日

S2Maiが"SMART deploy"出来るようになりました

スズキです。

対応していただいたようです。
http://d.hatena.ne.jp/rokugen/20070822
(まだ、svnのtrunkですが)

これで、diconの記述量がぐっと減ります。
よかった、よかった。

コミッタの皆様、ありがとうございます。

早速、今の案件のものを差し替えよう。

--
blog: http://suz-lab.blogspot.com/

2007年8月21日火曜日

SQLiteのパーミッション問題

スズキです。

PHP-PDO-SQLiteアプリケーションを
Windowsで開発して、Linuxに移した時の
パーミッション問題です。

普通に移しただけでは、SELECT系は機能しますが、
更新系(INSERT/UPDATE/DELETE)が機能しません。
調べると、「書き込みできない問題」だったので、
SQLiteのデータファイルに書き込み権限を付与しました。

それでも、今度は、「データベースがオープンできない」エラーが出て
問題は解決しません。

で、どうすればいいかというと、
データファイルが置いてあるフォルダにも書き込み権限を付与すると、
更新系も機能するようになります。

ちなみに、下記は、DBエラーをキャッチするためのコードです。

--------
if (PDO_ERR_NONE != $dbh->errorCode()){
  $error = $dbh->errorInfo();
  error_log($error[0]);
  error_log($error[1]);
  error_log($error[2]);
}
--------
http://search.net-newbie.com/php/function.pdo-errorinfo.html

上記でエラーを確認しながら、解決しました。

PHP、またちょっと賢くなったぞ。

--
blog: http://suz-lab.blogspot.com/

YLunchバージョンアップ(2.10)してた

スズキです。

ポータブル環境のランチャーYLunchが
2.10にバージョンアップしてました。
http://www.geocities.jp/yuusui_housuu/YLunch/history.html

終了時の自動実行ができるようになっています。

やっぱり、ポータブル環境のランチャーは
YLunchがいいなー。

--
blog: http://suz-lab.blogspot.com/

BunBackupでポータブル環境のバックアップ

スズキです。

ポータブル全盛の私の環境ですが、
一つ、びくびくしていることがあります。
バックアップです。

現状、バックアップをとっていないので、
外付けHDが死んだら、一緒に、私も死んでしまいます。

性格上、手動バックアップに期待はできないので、
BunBackupというソフトウェアを用い、
自動バックアップを導入することにしました。
http://homepage3.nifty.com/nagatsuki/bunbackup/bunbackup.htm

といっても、特別なことはしておらず、
外付けHD(Z:)の"\client"を内臓HD(C:)の"\client"に
5分毎にミラーするように設定しただけです。
("\client"にポータブル環境が入っている)

これなら、フォルダ構造も一緒なので、
外付けHD(Z:)が死んでも、内臓HD(C:)の方を使えば、
今までと同じ環境がすぐに使える話となります。

最後に、面倒なのが、BunBackupの起動ですが、
愛用しているYLunchに、
http://www.geocities.jp/yuusui_housuu/YLunch/index.html
起動時に実行するプログラムを登録できるので、
そこに登録さえしておけば、終了です。
(さすがにYLunchの起動はまだ仕方ないですが)

次は、大容量ネットワークディスクに世代バックアップだね。

--
blog: http://suz-lab.blogspot.com/

TeraPadの設定をユーザーごとにしない方法

スズキです。

ポータブル環境のエディタでTeraPad使ってます。
http://www5f.biglobe.ne.jp/~t-susumu/library/tpad.html

デフォルトだと、"TeraPad.exe"のあるフォルダ直下に"usr"フォルダができて、
その下に、さらにユーザー名ごとのフォルダができて、
設定がユーザーごとに保持できます。

しかし、ポータブル環境の場合は、どんなユーザーでも
同じ環境で使いたいことが多いはずなので、
別々になるのは、少し面倒です。

で、すべてのユーザーに対して、共通の設定にする方法ですが、
"TeraPad.exe"のあるフォルダ直下に"usr.txt"があるので、
下記のような状態で、"usr.ini"とリネームすると、共通設定モードになります。

--------usr.ini
[INI]
UserIni=0
--------
※デフォルトの状態です。

これで、どのユーザーでログインしても、共通の設定でTeraPad使えます。

いろいろ試したけど、Portableで一番いいのはTeraPadだと思う。

--
blog: http://suz-lab.blogspot.com/

2007年8月17日金曜日

Mistralで画像処理

スズキです。

Java画像処理ネタです。

昔、ImageJとか使ってました。
http://rsb.info.nih.gov/ij/index.html
機能的には良かったのですが、どちらかというと、
UIを含むアプリケーションとして提供されているので、
ライブラリとして使うには、ちょっとなー、といった感じでした。

で今回はMistralというライブラリを試してみました。
http://mistral.tidalwave.it/
使ってみた感想ですが、よくできていると思います。

とりあえず、下記がチュートリアルとなります。
http://mistral.tidalwave.it/infoglueDeliverLive/ViewPage.action?siteNodeId=394&languageId=1&contentId=-1

画像のリサイズをこれでやると、下記のようなコードになります。
※EditableImage.jarのみでいけます。
--------
// イメージの読み込み
EditableImage image = EditableImage.create(
  new ReadOp(this.uploadedFile.getInputStream())
);
// 50%にリサイズ
image.execute(new ScaleOp(0.5));
// イメージの書き出し
image.execute(
  new WriteOp("jpg", application.getRealPath(IMAGE_PATH))
);
--------
※Teedaのファイルアップロードで使ったものを簡略化しています。
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/java/jp/co/iret/suz/example/teeda/web/upload/UploadEntryPage.java

image.execute(new XxxOp(...));
で画像に関していろいろ処理できるようになっています。
(用意されているXxxOpは下記参照)
https://mistral.dev.java.net/nonav/javadoc/EditableImage/it/tidalwave/image/op/package-summary.html
https://mistral.dev.java.net/nonav/javadoc/Operations/it/tidalwave/image/op/package-summary.html

suz-example-teedaプロジェクトの
画像アップロードサンプルにも導入しています。
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/

当面は、フィード系はRome、画像処理系はMistralでいこう。

--
blog: http://suz-lab.blogspot.com/

2007年8月16日木曜日

"MySQL Users Conference Japan 2007"参加予定(9/11-12)

スズキです。

表記、参加予定です。
http://www.mysql-ucj2007.jp/

気づくのが遅くて、選択できるセッションが少なかったのが
痛かったなー。

でも、クラスター関係は選択できたので、
それはそれで、よしとしよう。

そろそろ、英語、復活させないとなー。

--
blog: http://suz-lab.blogspot.com/

Tomcat Connectors 1.2.25 & JkUnMount

スズキです。

mod_jkで"/"をJkMountしたはいいが、
その中のMovableType(/mt)が使えなくなってしまってどうしたものか?
と考えていたら、JkUnMountなるものがあるのに気づき、
試してみたら、httpd.confのSyntaxエラーで怒られ、
しょうがないから、最新のmod_jkで試してみようとしたら、
ちょうど、1.2.25がリリースしてた、
ってお話です。

まずはリリース情報
http://tomcat.apache.org/connectors-doc/news/20070301.html#20070807.1

下記よりダウンロード
http://tomcat.apache.org/download-connectors.cgi

ここで、作業対象の環境にapxsが入ってないことに気づく。
とりあえず、下記でhttpdまわりを最新に
# yum update httpd
# yum install httpd-devel
※rootで作業しています。
※apxsはhttpd-develにあります。

で、下記にてmod_jkをビルド&インストール
# cd native/
# ./configure --with-apxs=/usr/sbin/apxs
# make
# make install
※ダウンロードファイルを展開したフォルダ中での作業です。

最後に、JkUnmountの設定
JkUnMount /mt/* ajp13
JkMount /* ajp13

今度は、Syntaxエラーにならないし、"/mt"も使える。
めでたし、めでたし。

mod_jk、久しぶりー!

--
blog: http://suz-lab.blogspot.com/

TeedaのviewRootPathを変更

スズキです。

TeedaのデフォルトのviewRootPathは"/view"になっています。
ただ、/index.htmlにTeedaを適用したいことは多々あると思います。

こういうときは、下記のように、convention.diconで
NamingConventionImplクラスの
viewRootPathプロパティを
"/"に設定します。

--------convention.dicon
<components>
  <component class="org.seasar.framework.convention.impl.NamingConventionImpl">
    <property name="viewRootPath">"/"</property>
    ...
  </component>
</components>
--------

これ、結構、問題になってたんだよね。
よかった、よかった。

--
blog: http://suz-lab.blogspot.com/

MySQLのテーブルの列の追加と削除

スズキです。

大した事ない情報ですが、メモとして。

▼列の追加
alter table hoge_table add (
new_coloum1 int,
new_coloum2 int
);

▼列の削除
alter table hoge_table drop new_coloum1;

変更はdrop&addなのかなー?

--
blog: http://suz-lab.blogspot.com/

Teedaでhtmlタグをエスケープしないで表示

スズキです。

DBのテキストカラムにHTMLを入れて、
その内容をTeedaで普通に表示しようとすると、
エスケープされて、タグが見える状態で表示されてしまいます。

HTMLとして整形した形で表示させたい場合は、
te:escape="false"
という属性を使います。
Ex. <span id="hoge" te:escape="false">hoge</span>

当然、下記のようにネームスペースの設定は
忘れないようにしないといけません。
<html xml:lang="ja" lang="ja"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:te="http://www.seasar.org/teeda/extension"
  xmlns:x="http://myfaces.apache.org/tomahawk">

(参考) https://www.seasar.org/issues/browse/TEEDA-179

現在Teeda三昧。

--
blog: http://suz-lab.blogspot.com/

2007年8月14日火曜日

Teeda 1.0.10 リリース

スズキです。

表記のとおり、Teedaが1.0.10になってます。
http://www.seasar.org/wiki/index.php?SeasarWhatsNew%2F2007-08-14#w1df43e7

1.0.9はすぐに1.0.10にしないといけないくらいの変更らしいので、
早速、アップデートです。

対象は4プロジェクトくらいかな?

--
blog: http://suz-lab.blogspot.com/

MirandaからPidginに移行

スズキです。

メッセンジャーをMirandaからPidginに変更しました。
http://portableapps.com/apps/internet/pidgin_portable

こちらのほうが高性能で、使い勝手もいいです。
PORTABLEAPPSなので、例のごとくインストールするだけです。

当然、日本語化もされていて、インストール時に
Translationsという項目をチェックすると、
言語リソースがインストールされ、さらに、
<インストールフォルダ>\Data\settings\PidginPortableSettings.ini
のPIDGINLANGを下記のようにjaに変更すると、
メッセージが日本語にさしかわります。

--------PidginPortableSettings.ini
[Language]
PIDGINLANG=ja
[PidginPortableSettings]
LastDriveLetter=Z:
--------

プラグインなる仕組みもあるので、
この辺もいろいろ試していきたいところです。

--
blog: http://suz-lab.blogspot.com/

Seasar2.4.17とpublicフィールド

スズキです。

ついにpublicフィールドを実装した、Seasar2.4.17が出ました!
http://www.seasar.org/wiki/index.php?SeasarWhatsNew%2F2007-08-13#a1acdee6

Teedaは1.0.9からすでに対応しているようです。
http://d.hatena.ne.jp/higayasuo/20070813
(2番目の記事)

今までは、teedaなどで、画面で利用したり、
画面間で引き継ぐ値は(private)フィールドで宣言して、
それに対応するgetter/setterを書いてきました。

それが、publicなフィールドだけ定義しておけば、
そのgetter/setterを作成しなくても、同様に動作します。
かなりコードがすっきりします。

suz-example-teedaでも実験済です。
▼Pageクラス
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/java/jp/co/iret/suz/example/teeda/web/
▼ライブラリ(jar)
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/WEB-INF/lib/

早速、始まったばっかりのTeeda案件のプロジェクトアップデートしよう。

--
blog: http://suz-lab.blogspot.com/

2007年8月13日月曜日

RDT使ってみた

スズキです。

久しぶりのRubyネタです。
前回は実行環境の導入でした。
http://suz-lab.blogspot.com/2007/08/windowsruby.html

今回は開発環境です。
基本、コードはEclipseで書いているので、
Rubyも例外なくEclipseで書けるように、
プラグインRDTを使うことにしました。
http://rubyeclipse.sourceforge.net/

"Update Manager"を使って、
リモートサイトを
http://updatesite.rubypeople.org/release
にすれば、簡単に導入できます。
(詳細) http://rubyeclipse.sourceforge.net/download.rdt.html

これで、Eclipseで作成から実行、出力の確認までできます。

でも、まだ、"Hello Word"しかやってない...

--
blog: http://suz-lab.blogspot.com/

TeedaのEmailValidatorとUrlValidator

スズキです。

TeedaのSVNに表記バリデーターがコミットされています。

▼EmailValidator(下はTigerアノテーション)
http://svn.seasar.org/browse/trunk/teeda/teeda-extension/src/main/java/org/seasar/teeda/extension/validator/EmailValidator.java?root=teeda&view=markup
http://svn.seasar.org/browse/trunk/teeda-tiger/src/main/java/org/seasar/teeda/extension/annotation/validator/Email.java?root=teeda&view=markup
▼UrlValidator(下はTigerアノテーション)
http://svn.seasar.org/browse/trunk/teeda/teeda-extension/src/main/java/org/seasar/teeda/extension/validator/UrlValidator.java?root=teeda&view=markup
http://svn.seasar.org/browse/trunk/teeda-tiger/src/main/java/org/seasar/teeda/extension/annotation/validator/Url.java?root=teeda&view=markup

僕のコードを参考にしていただいたらしいです。光栄です。
http://suz-lab.blogspot.com/2007/08/teedaurl.html
http://www.haloscan.com/comments/iretsuzuki/3332373001763425408/?src=hsr#2958
(といっても、重要なのは正規表現で、それは自分で作ってないからなちょっと微妙...)

ただ、上記のコミットされているコードから、
RegularExpressionバリデーターを拡張した、
バリデーターの作り方がわかりました。

今度、郵便番号バリデーターとかで練習しよう。

--
blog: http://suz-lab.blogspot.com/

WTPでDoltengを使う

スズキです。

基本、WTP(動的WEBプロジェクト)派なので、
churaプロジェクトは使ってないのですが、
Doltengの機能は使ってみたかったので、試してみました。
http://www.seasar.org/wiki/index.php?SeasarWhatsNew%2F2007-07-23#l5adf3f4

とりあえず、プロジェクトのプロパティから、
DoltengをEnableにできるので、
それを試しましたが、HTMLからPageクラスを自動生成しようとすると、
「このファイルはviewrootに含まれません」エラー
となります。

多分設定ファイルの不備だと思い、charaプロジェクトと比較すると、
./settings/org.seasar.dolteng.eclipse.prefs
が、なんかおかしい状態でした。

なので、ちゃんと機能しているchuraプロジェクトを参考に、
下記のように修正。(suz-example-teeda用)

--------org.seasar.dolteng.eclipse.prefs
#Mon Aug 13 07:22:43 JST 2007
DefaultResourcePath=/suz-example-teeda/src/main/resources
DefaultRootPackage=jp.co.iret.suz.example.teeda
DefaultSrcPath=/suz-example-teeda/src/main/java
ServletPath=/suz-example-teeda
WebContentsRoot=src/main/webapp/
eclipse.preferences.version=1
--------

無事、HTMLからPageクラスの生成ができました。
ただ、Pageクラスが、pageパッケージではなく、
webパッケージに作成されるので、suz-example-teedaも
pageではなくwebに変更しています。

新Eclipse環境もそろそろ実践に投入(会社標準に)できそうだな。

(ソース/リソース)
▼org.seasar.dolteng.eclipse.prefs
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/.settings/org.seasar.dolteng.eclipse.prefs
▼webパッケージ
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/java/jp/co/iret/suz/example/teeda/web/

--
blog: http://suz-lab.blogspot.com/

suz-example-teedaのDerbyを10.3.1.4に更新

スズキです。

Derbyのリリースに伴い、
http://suz-lab.blogspot.com/2007/08/apache-derby-10314.html
suz-example-teedaプロジェクトも表記のとおり更新しました。
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/WEB-INF/lib/

でも、案の定、ブロックコメント(/*...*/)は使えません。
残念。

ということで、組み込みDBはDerbyにこだわらす、
h2やsqliteとかも試していこうと思います。
(下記のようにdbsフォルダ作って、そこにいろいろな組み込みDB置きます)
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/dbs/

でも実際、案件では、MySQL、PostgreSQL、Oracleなんだよね。

--
blog: http://suz-lab.blogspot.com/

Apache Derby 10.3.1.4 リリース

スズキです。

8月1日にリリースされてました。
http://db.apache.org/derby/releases/release-10.3.1.4.html

ざっと、変更点とか読んでみましたが、
特に気になることはありませんでした。

とりあえず、コメント(/*...*/)が使えるようになってないかなー。
(Kuina-Dao、S2Daoが使いにくい...)

早速、suz-example-teedaのderbyはアップデートしておこう。

--
blog: http://suz-lab.blogspot.com/

S2Flex2-1.1.0 をリリース

スズキです。

表記のとおりです。
http://www.noridon.net/weblogs/archives/2007/08/s2flex2110.html

近頃、ちょっとFlex乗り遅れています。

そろそろ、FlexBuilder3入れなくては。
http://labs.adobe.com/technologies/flex/flexbuilder3/

--
blog: http://suz-lab.blogspot.com/

2007年8月11日土曜日

Rome使ってみました

スズキです。

Javaのフィード(RSS, Atom, ...)を扱うライブラリ、
ROMEを試してみました。

今回は、適当なフィード
http://suz-lab.blogspot.com/rss.xml
を読み込んで、Web画面に表示するサンプルです。
(Webの部分はTeedaです)

まず、準備として、下記jarをクラスパスに置きます。
▼jdom-1.0.jar
http://www.jdom.org/dist/binary/jdom-1.0.zip
▼rome-0.9.jar
https://rome.dev.java.net/source/browse/*checkout*/rome/www/dist//rome-0.9.zip
▼rome-fetcher-0.9.jar
https://rome.dev.java.net/dist/rome-fetcher-0.9.zip

後は次のコードを実行すると、
http://suz-lab.blogspot.com/rss.xml
の内容がSyndFeedオブジェクトに登録されます。

--------RomePage
FeedFetcherCache feedInfoCache
    = HashMapFeedInfoCache.getInstance();
FeedFetcher feedFetcher
    = new HttpURLFeedFetcher(feedInfoCache);
SyndFeed feed = feedFetcher.retrieveFeed(
  new URL("http://suz-lab.blogspot.com/rss.xml")
);
--------

あとはfeed(SyndFeed)の中身をどう扱うかですね。

上記はsuz-example-teedaにもコミットしておきました。
▼Pageクラス
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/java/jp/co/iret/suz/example/teeda/page/rome/RomePage.java
▼HTML
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/view/rome/rome.html

S2ともっと連携した仕組みにならないかなー?
ノーアイデアだけど。

--
blog: http://suz-lab.blogspot.com/

Teeda 1.0.9 リリース

スズキです。

Teedaの1.0.9がリリースしました。
http://www.seasar.org/wiki/index.php?SeasarWhatsNew%2F2007-08-10#dcad803b

早速、サンプルプロジェクト(suz-example-teeda)もアップデートしときました。
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/WEB-INF/lib/

コミッタの皆様、お疲れ様でした。

ROMEやらなきゃ。

--
blog: http://suz-lab.blogspot.com/

2007年8月10日金曜日

TeedaでURLのバリデーション

スズキです。

そろそろ、TeedaもRequired以外のバリデーションをためさなきゃ、
ってことで、URLをチェックするものをやってみました。
(まあ、案件でニーズがあったからですが)

で、どうやったかというと、今回は、
正規表現バリデーター(RegularExpression)を使いました。
(自分でValidatorクラス作るのは次回ということで)

当然、URLをチェックする正規表現が必要となりますが、
こちらから拝借。
http://www.pahoo.org/e-soul/webtech/php05/php05-02-01.shtm

最後に、バリデーションに引っかかった時のメッセージを変更ですが、
これはアノテーションの属性"messageId"で制御できます。
値はappMessages.propertiesのプロパティ名で、
そのプロパティの値がメッセージとなります。

上記をふまえると、Pageクラスの該当部分はこうなります。
--------XxxPage
...
@RegularExpression(
  messageId="jp.co.iret.suz.example.teeda.validator.url",
  pattern = "https?:\\/\\/[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+"
)
private String url;
...
--------

自分でValidator作れるようにならなきゃ。

(ソース/リソース)
▼HTML
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/view/validator/validatorEntry.html
▼Pageクラス
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/java/jp/co/iret/suz/example/teeda/page/validator/ValidatorEntryPage.java
▼appMessages_ja.properties
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/resources/appMessages_ja.properties

--
blog: http://suz-lab.blogspot.com/

ROMEでフィード処理(RSS/ATOM)

スズキです。

まあ、良くあることですが、
改めて表記の処理で使うライブラリを調べてみました。

といっても下記に良くまとめられています。
http://www.nilab.info/wiki/RSS.html

まあ、以前から目星はつけていたのですが、
やはりInformaとROMEとの一騎打ちです。
http://informa.sourceforge.net/
https://rome.dev.java.net/

で結論は、ROMEにしようと思ってます。
扱えるフィードの形式はお互いあまり変わりません。
Informaは永続化(Hibernate)するための仕組みを持っていて、
かなり心が傾いていましたが、
ROMEには下記サブプロジェクトもあり、こちらに未来を感じました。

▼ROME Fetcher: HTTPによるフィードの取得
http://wiki.java.net/bin/view/Javawsxml/RomeFetcher
▼ROME Propono:Publishing用(ATOM, MetaWeblog API)
http://wiki.java.net/bin/view/Javawsxml/RomePropono
▼ROME Modules: その他の形式に対応(iTunes Podcasting, ...)
http://wiki.java.net/bin/view/Javawsxml/RomeModules

とりあえず、日本語情報

http://journal.mycom.co.jp/articles/2007/04/28/rome/index.html
http://blogs.sun.com/akihito/entry/rss_atom_feed_with_rome
http://kazuhiro.ty.land.to/blog/2007/04/javarssatom_rome.html

ROMEを使ったTeedaのサンプル作るか。

--
blog: http://suz-lab.blogspot.com/

Teedaでカレンダー入力

スズキです。

日付をポップアップカレンダーで入力するためのTipsです。

といっても、JKL.Calendarで日付選択して、その結果を
テキストフィールドに入れて、それをサブミットして、
PageクラスでDateで受けるだけです。

◆JKL.Calendar
日本製のシンプルなカレンダー入力用Javascriptです。
(本家)
http://www.kawa.net/works/js/jkl/calender.html
(機能アップバージョン)
http://blogs.yahoo.co.jp/ti_tap_tgm/44254858.html
今回は機能アップバージョンの方の最新版を利用しています。

使い方はこんな感じです。

...
<script type="text/javascript" src="../../js/lib/calendar.js"></script>
<script>
  var cal = new JKL.Calendar("calid","dateEntryForm","date");
</script>
...
<form id="dateEntryForm">
  <input id="date" type="text" maxlength="10"
    onchange="cal.getFormValue();cal.hide();"/>
  <img src="../../img/lib/calendar/calendar.gif" onclick="cal.write();"/>
  <div id="calid"/>
  <span id="dateMessage"/>
  <input type="submit" id="doUpload" value="登録"/>
</form>
....

ポイントはJKL.Calendarの引数です。渡す値は
第一引数: カレンダーを表示させるdivのid
第二引数: formのid
第三引数: 選択した日付を入れるテキストフィールドのid
となります。

ここで、一筋縄でいかなかったところがあり、何かというと、
JKL.Calendarの第三引数です。
オリジナルではテキストフィールドのname属性の値を入れるのですが、
teedaはそのnameが"_id3:dateEntryForm:date"といった具合に
自動に設定され、さらに"_id3"の数字の部分が再起動すると
変わる可能性があります。

なので、第三引数にnameではなくidの値で機能するように
Javascriptを調整しました。
(idはHTMLに記述したもののまま変わりません)

下記は上記で説明した実際のソース(リソース)です。
▼Javascript(調整後)
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/js/lib/calendar.js
▼HTML
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/view/date/dateEntry.html
▼画像(クリックするとカレンダーが表示)
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/img/lib/calendar/calendar.gif
▼Pageクラス
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/java/jp/co/iret/suz/example/teeda/page/date/DateEntryPage.java

そろそろ、TeedaにJavascriptが絡んできたぞ。

--
blog: http://suz-lab.blogspot.com/

2007年8月9日木曜日

Seasar2は@Resourceより@Binding

スズキです。

昔、下記のようなエントリ書きました。
http://suz-lab.blogspot.com/2007/06/resourceseasar2.html

@Resourceアノテーションつけとけば、
getter/setter書かなくても、DIしてくれるってやつです。

でも下記情報によると、@Bindingでも同じことができて、
こっちを使ったほうがいいらしい。
http://d.hatena.ne.jp/dewa/20070608
(下のコメントの部分)

@ResourceってEJB3用のアノテーションだったんだ、
知らずに使ってた...

実はEJB、まったく知りません。

--
blog: http://suz-lab.blogspot.com/

TeedaのファイルアップロードでRequiredが効いた

スズキです。

以前のエントリで、
> それにしても、inputFileUploadに対して、
> @RequiredなどのValidatorが効かない。
> Tomahawkコンポーネントだからかなー。
と書いていたのですが、それは間違いでした。
http://suz-lab.blogspot.com/2007/08/teeda_07.html

通りがかりのshotさん(Teedaコミッタ)が、
コメントにて教えてくれました。
http://www.haloscan.com/comments/iretsuzuki/1461010664982356779/

TeedaのSVNにサンプルも置いてもらい至れり尽くせりです。
http://svn.seasar.org/browse/trunk/teeda-html-example/src/main/?root=teeda
ありがとうございました。

自分のサンプルプロジェクトでもうまくいき、
Tigerアノテーションでも成功しています。
とりあえず、このプロジェクトも"Google Code"で管理するようにしました。
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda

まあ、ポイントとなるファイルは下記でしょうか?
▼web.xml
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/WEB-INF/web.xml
▼html
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/webapp/view/upload/uploadEntry.html
▼Pageクラス
http://suz-lab.googlecode.com/svn/trunk/suz-example-teeda/src/main/java/jp/co/iret/suz/example/teeda/page/upload/UploadEntryPage.java

でも、問題が発生した、プロジェクトはまだ直していません。
間違い探し、面倒だなー。

--
blog: http://suz-lab.blogspot.com/

2007年8月8日水曜日

iddyでプロフィール公開

スズキです。

iddy(イディー)というプロフィール公開サービスを使ってみました。
http://iddy.jp/
本ブログの右上にそのブログパーツを設置しています。
http://iddy.jp/profile/iretsuzuki/

プロフィール公開サービスといっても、
単に自分のことを書いた文章を公開するだけでなく、
ブログやソーシャルブックマーク、mixiやyoutubeなどの
自分のコンテンツを取り込み表示することもできます。

ということで、これを機に下記のように自分のプロフィールを
まとめなおしてみました。

▼suz-labの主任研究員です。
http://suz-lab.blogspot.com
▼iretのCTOもやってます。
http://www.iret.co.jp
▼bfsの社員でもあります。
http://www.bfp.co.jp

実はこんな人でした。

そろそろ、プロフィール画像を用意しなければ。
(Twitterとかmixiも含めて)

--
blog: http://suz-lab.blogspot.com/

第4回エンジニア交流勉強会「gungi」に参加予定(8/29)

スズキです。

第4回エンジニア交流勉強会「gungi」に参加予定です。
http://open.gungi.jp/modules/eguide/event.php?eid=4

テーマは「イントラHacks」ということで、
社内(イントラ)向けサービス(SNS, Blog, ...)の
開発と利用についてのお話のようです。

弊社はあまりこういうツールを使っていないので、
改めて、聞いてみたい内容で、楽しみです。

そろそろ、僕も、ソーシャルブックマークちゃんとつかわないと。
http://del.icio.us/iretsuzuki

--
blog: http://suz-lab.blogspot.com/

2007年8月7日火曜日

Oracleのシーケンスで結構な飛び番が発生

スズキです。

Oracleで使ってるシーケンスで
結構な飛び番が発生してしまう問題があったので、
その対策として。

原因は"CREATE SEQUENCE"時のCACHEのデフォルト値は20になっており、
その辺で、20付近の飛び番が起こるらしい。
(参考) http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=30577&forum=7

なのでパフォーマンスは悪くなりますが、下記のようにシーケンスを再作成して対応。

--------
CREATE SEQUENCE XXX_ID_SEQ
START WITH 1000 NOCACHE ORDER;
--------

確認は下記SQLより。

--------
SELECT XXX_ID_SEQ.NEXTVAL FROM DUAL
--------

テスト環境では発生しなかったんだけどなー。
Seasar2のコネクションの取得の仕方とかに関係があるのかなー。

--
blog: http://suz-lab.blogspot.com/

Teedaでファイルアップロード(補足)

スズキです。

以前書いたTeedaでファイルアップロードを実現するためのエントリの補足です。
http://suz-lab.blogspot.com/2007/08/teeda.html

inputFileUploadタグのvalueの値に対して、
対象フィールドが
page(web)/aaa/bbb/UploadPage
クラスのuploadedFileである場合、
--------
<x:inputFileUpload
  id="uploadedFile"
  value="#{aaa_bbb_uploadPage.uploadedFile}"/>
--------
とする必要があります。

それにしても、inputFileUploadに対して、@RequiredなどのValidatorが効かない。
Tomahawkコンポーネントだからかなー。

--
blog: http://suz-lab.blogspot.com/

Connector/J(MySQL-JDBC)のzeroDateTimeBehavior

スズキです。

MySQLでDATE(TIME)のカラムに"0000-00-00 00:00:00"があると、
JDBC(Connector/J)でデータを取得しようとすると例外が発生します。
http://dev.mysql.com/downloads/connector/j/5.0.html

これを回避するために、接続URLのパラメータとして、
zeroDateTimeBehavior
というものが用意されています。

とり得る値として
exception : SQLExceptionをスロー(デフォルト)
convertToNull : nullを返す
round : "0001-01-01 00:00:00"を返す
というものがあります。
(参考) http://www.mysql.gr.jp/mysqlml/mysql/msg/12216

▼接続URLの例
jdbc:mysql://localhost/test?zeroDateTimeBehavior=convertToNull

近頃こねたが多いなー。

--
blog: http://suz-lab.blogspot.com/

2007年8月6日月曜日

OracleのDATEで時間の切捨て

スズキです。

OracleのDATEの列に日付だけ入れて、時間は"00:00:00"にしてください
という、よくわからないリクエストがあり、とりあえず仕事なので、
やってみた結果です。

まあ、TRUNC関数を使うと一発だよってことですね。

--------そのまま表示
SELCT TO_CHAR(
  SYSDATE,
  'YYYY/MM/DD HH24:MI:SS'
)
FROM DUAL
--------

--------時間を"00:00:00"に
SELCT TO_CHAR(
  TRUNC(SYSDATE),
  'YYYY/MM/DD HH24:MI:SS'
)
FROM DUAL
--------

日時(時間)まで入れて、SQLで抽出するときに
(TRUNC使って)調整すればいいのに。

--
blog: http://suz-lab.blogspot.com/

APRが1.2.9になってました

スズキです。

久しぶりにsuz-env-server環境でサーバアプリケーション群設定したら、
APRのダウンロードでこけた。
http://suz-lab.googlecode.com/svn/trunk/suz-env-server/

理由は、apr-1.2.8がリポジトリに存在しないってことでした。
調べてみると、バージョンが1.2.9にあがっており、
1.2.8が削除されていたようです。
http://www.apache.org/dist/apr/Announcement1.2.html

なので、ビルドスクリプトを
VERSION=1.2.9
に変更しておきました。
http://suz-lab.googlecode.com/svn/trunk/suz-env-server/build/apr.sh

Tomcatのレプリケーションがうまくいかない、なぜだろう?

--
blog: http://suz-lab.blogspot.com/

"PHPカンファレンス2007"参加予定(9/1)

スズキです。

表記、参加予定です。
http://phpspot.org/blog/archives/2007/08/php2007.html

近頃、Ajax-PHPに本腰入れ始めたので、楽しみです。

詳しくならなきゃいけない言語が増えだした。

--
blog: http://suz-lab.blogspot.com/

Flex2勉強会第21回@東京"参加報告

スズキです。

Flex2勉強会第21回@東京の参加報告です。
http://suz-lab.blogspot.com/2007/08/flex22184.html

以下、感想(一言)です。

▼Louvre-DNP Museum Lab 概要
RFIDとの連動は非常に興味深かった。
ハードと連動したシステムもたまにはやりたいね。

▼AIR: Getting Started
AIR、まだまじめになってないんだよね。
Windowsデスクトップと連携したDrug&Dropは
自分でもやってみたいなー。

▼デザイナのためのFlexスキニング入門

非常に聞きたかった内容。
FlashがCS3になり "Flex Component Kit"で
Flexのコンポーネントが作成できるようになった。
http://labs.adobe.com/wiki/index.php/Flex_Component_Kit_for_Flash_CS3

素材(コンポーネント)はFlashCS3で作って、
それらをFlexでインテグレートするのがBESTなのかなー。
Fireworksもあるし...

この辺は、いろいろ考えなきゃ。

▼デベロッパがデザイナと一緒に仕事をするとき
デザイナの守備範囲は、会社、人によってまちまちなんだよなー。
とにかくidが重要。(Flex, HTML共に)
idを軸とした、協業イメージをちょっと考えてみるか。

▼デザインとロジックの分業
YUIフレームワーク、期待してます。
次の案件で早速使わせていただきます。(当然、最初は実験からですが)
http://akabana.sandbox.seasar.org/ja/
http://d.hatena.ne.jp/arkw/searchdiary?word=%2a%5byui%5d

そろそろ、僕も、Flexモードです。
その前にRed5か...

--
blog: http://suz-lab.blogspot.com/

2007年8月5日日曜日

Jacvascriptで表示しているHTMLファイル名の取得

スズキです。

今やってる案件で使いそうなので、
出先だけど暇な時間に作成。

--------
location.href.substring(
  location.href.lastIndexOf('/') + 1
);
--------
※"+1"しないと"/"が入ってしまいます。

Javascriptはブラウザあれば動くから、
どこでも開発できるね。

--
blog: http://suz-lab.blogspot.com/

2007年8月4日土曜日

WinSCP 4.0.3 にアップデート

スズキです。

WinSCPが4.0.3にアップデートしています。
http://winscp.net/eng/docs/history#4.0.3

バージョン4から、FTPも使えるようになっています。
さらに、設定をiniファイルで管理できるので、ポータブル環境でも使えます。

ポータブル環境で使うには、"Standalone application"版があるので、
それを使うのが良いでしょう。

日本語化もでき、
http://winscp.net/eng/translations.php
からjp.zipをダウンロードして、その中のファイルを、
"WinSCPの実行ファイル名.jp"の形で
WinSCPの実行ファイルと同じフォルダに置いておくと、
起動後に言語として日本語が選択できるようになります。

残りのポータブル環境のファイル転送系はWebDavくらいかな。

--
blog: http://suz-lab.blogspot.com/

2007年8月3日金曜日

WindowsでRuby

スズキです。

豆ナイトに触発されて、
Portable環境にRubyを導入してみました。
http://suz-lab.blogspot.com/2007/08/blog-post.html

下記より、該当するRubyバイナリのアーカイブをダウンロードして、
展開すればOKです。(インストールはいりません)
ftp://core.ring.gr.jp/pub/lang/ruby/binaries/mswin32
※今回はmswin32のバイナリを使っています。

で、早速、irbを起動すると、"readline.dllがありません"エラーが出ました。
なので、下記より、readline.dllを取得して、
irb.batがあるフォルダ(bin)に置きます。(mswin32用です)
http://jarp.does.notwork.org/win32/

これで、無事、エラー無しでirbが立ち上がり、Rubyで遊べるようになりました。

次は、Portable環境のMySQL、PostgreSQLの整備と、
それにアクセスするためのRubyのDBまわりの調整です。

--
blog: http://suz-lab.blogspot.com/

"豆ナイト"参加報告

スズキです。

昨夜、豆ナイトに参加してきました。
http://suz-lab.blogspot.com/2007/07/82.html

テーマはRubyです。
以下、徒然なるままに。

-Agileな人は、Rubyらしい。
-もうビジネスとして成り立ちそう。(Rubyの仕事あり)
-やはり、Javaよりは開発効率が良いっぽい。
-win32oleは感動もの?
-"JavaからRubyへ"は読んでおきたいなー。
http://www.oreilly.co.jp/books/9784873113203/
-とにかく"irb"

とりあえず、ruby環境(irb)作ろう。

--
blog: http://suz-lab.blogspot.com/

Oracleで最新10件のみを残して他を削除するSQL

スズキです。

対象テーブルは下記とします。

--------MEMBER(会員テーブル)
MEMBER_ID: 会員ID(重複)
REGIST_DATE: データ登録日時
--------

で、実現するSQLは下記となります。
(ポイントはROWNUMですね)
※特定のMEMBER_IDに対して実施します。

--------
DELETE FROM MEMBER
WHERE MEMBER_ID = /*memberId*/38
AND REGIST_DATE < (
  SELECT
    REGIST_DATE
  FROM (
    SELECT
      ROWNUM AS TMP,
      REGIST_DATE
    FROM (
      SELECT
        REGIST_DATE
      FROM MEMBER
      WHERE MEMBER_ID = /*memberId*/38
      ORDER BY REGIST_DATE DESC
    )
  )
  WHERE TMP = 10
)
--------

OracleもLIMIT/OFFSETがあればなー。

--
blog: http://suz-lab.blogspot.com/

OpenSSLによる証明書の作成

スズキです。

OpenSSLを用いたオレオレ証明書の作成手順です。
http://d.hatena.ne.jp/keyword/%A5%AA%A5%EC%A5%AA%A5%EC%BE%DA%CC%C0%BD%F1

1.秘密鍵を生成
# openssl genrsa -des 2048 > key.pem

2.鍵からパスフレーズを削除
# openssl rsa -in key.pem -out key.pem

3.CSRの作成
# openssl req -new -days 365 -key key.pem -out csr.pem
--------
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Setagaya-ku
Organization Name (eg, company) [My Company Ltd]:suz-lab
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:suz-lab.blogspot.com
Email Address []:xxx@yyy.zzz
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
--------

4. 証明書の作成(認証局を使わず、自分で署名する場合)
# openssl x509 -in csr.pem -out cert.pem -req -signkey key.pem -days 365
※Verisignのお試し証明書は下記より作成したCSRを用いて作成可能
http://www.verisign.co.jp/server/trialserver/index.html

5.証明書に鍵の埋め込み(Poundで利用する場合など)
# cat key.pem >> cert.pem
(参考) http://bitarts.jp/tech/linux/openssl.html
(参考) http://suz-lab.blogspot.com/2007/05/poundssl.html

近頃、自分の以前書いたブログのエントリが役立つようになってきた。
--
blog: http://suz-lab.blogspot.com/

2007年8月2日木曜日

Firefox Portable 2.0.0.6 リリース

スズキです。

"Firefox Portable"の2.0.0.6がリリースしています。
http://portableapps.com/news/2007-07-31_-_firefox_portable_2.0.0.6

早速、自分のポータブル環境も更新です。
(設定の引継ぎ方法)
http://suz-lab.blogspot.com/2007/07/firefox-portable-2005.html

それにしても、Firefox、近頃更新多いね。

--
blog: http://suz-lab.blogspot.com/

"Flex2勉強会第21回@東京"に参加予定(8/4)

スズキです。

表記勉強会に参加予定です。
http://www.fxug.net/modules/bwiki/index.php

今回は
「デベロッパーとデザイナーの協業を考える。」
とのことです。
CS3も出ましたし、まあ、当然、みんなの強い関心ごとの一つになりますよね。

YUIフレームワークは予習しておきたいなー。

--
blog: http://suz-lab.blogspot.com/

code*でノウハウ共有

スズキです。

code*っていうサービスがありました。
http://code.nanigac.com/

コードを軸とした、質問/回答やノウハウの共有をするためのサービスです。
(今はPHPが多いのかな?)

RSSフィードが用意されているので、早速、"Google Reader"に登録です。

"Google Reader"への登録フィードもかなりの数になってきたなー。

--
blog: http://suz-lab.blogspot.com/

2007年8月1日水曜日

Teedaでファイルアップロード

スズキです。

Teedaでファイルアップロード機能を実現するための方法です。

ファイルアップロード機能を実現するには、現状、
MyFacesのTomahawkコンポーネントを利用する必要があります。
http://myfaces.apache.org/tomahawk/index.html

詳しくはこちらでまとめられています。
http://d.hatena.ne.jp/shot6/20061122

ここで注意するところが、Tomahawkのバージョンです。
現在、最新版は1.1.6ですが、これだと、ページ表示時に、
下記Exceptionが発生します。

org.seasar.framework.exception.IORuntimeException:
[ESSR0040]IO例外が発生しました。
理由はjava.io.NotSerializableException:
org.apache.myfaces.shared_tomahawk.config.MyfacesConfig
....

でバージョン下げながら試していくと、1.1.1で動作することが確認できました。
なので、最新バージョンではなく、1.1.1を使う必要があります。

ちなみに、依存するライブラリである、
commons-fileuploadとcommos-ioは最新版で動作確認できています。

ライブラリの準備ができたら、設定ファイルですが、これは、
web.xmlを下記のように追記します。

--------web.xml
<filter>
  <filter-name>tomahawkFilter</filter-name>
  <filter-class>
    org.apache.myfaces.component.html.util.ExtensionsFilter
  </filter-class>
  <init-param>
    <param-name>uploadMaxFileSize</param-name>
    <param-value>100m</param-value>
  </init-param>
  <init-param>
    <param-name>uploadThresholdSize</param-name>
    <param-value>100m</param-value>
  </init-param>
  <init-param>
    <param-name>uploadRepositoryPath</param-name>
    <param-value>/work</param-value>
  </init-param>
</filter>
--------

HTMLはこんな感じです。
Teedaのidのルール+Tomahawkの拡張タグって感じです。

--------uploader.html
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:x="http://myfaces.apache.org/tomahawk"
  xml:lang="ja" lang="ja">
  <body>
    <form id="hogeEntryForm" enctype="multipart/form-data">
      <x:inputFileUpload id="uploadedFile" value="#{uploadedFile}"/>
      <input id="doPersist" type="submit" value="登録・設定"/>
    </form>
  </body>
</html>
--------

Pageクラスはこんな感じです。
アップロードしたファイルはUploadedFileクラスのフィールドにDIされ、
操作できます。

--------UploaderPage.java
import org.apache.myfaces.custom.fileupload.UploadedFile;
public class UploaderPage {
  private UploadedFile uploadedFile;
  public String doPersist() {
    this.uploadedFile.getName();
    return null;
  }
  public UploadedFile getUploadedFile() {
    return uploadedFile;
  }
  public void setUploadedFile(UploadedFile uploadedFile) {
    this.uploadedFile = uploadedFile;
  }
}
--------

これで、ファイルアップロードだけでなく、Tomahawkも使えるようになったぞ。

--
blog: http://suz-lab.blogspot.com/