2009年2月26日木曜日

java:jswiffの日本語対応など

Jswiff。動的にxmlの構造にswfを展開して再構築出力ができるライブラリです。
目的は携帯サイトで動的にいろいろ書き換えられるswfを
作りたいなあというものなんですが。調べると一通り機能を備えている。

この手だとcで書かれたswfmillとか有名ですが。クラスオブジェクトとして生成して動作させられるので速度面でかなり有利そうです。ライセンスがきついとか言っても。GPL or 商用ライセンスの二択。つまりMySQLと同じライセンス形式。問題なし。

で、調べて使ってみたんですが。Flash4ベースのコードで文字化けが発生することを確認しました。で見ると'utf-8'で決めうちしてるところがいくつかあったので訂正。Glyphのインデックスに一文字うちこまれる'char'のエンディアンが逆になるようなので直し。これだけで問題なくxmlタグでの出力が日本語で動作するようになりました。

動的テキストの置き換えは簡単。つかこんなもん使わんでバイナリ検索かければいい。

SWFDocument document = docReader.getDocument();
List tags = document.getTags();
for(ListIterator i = tags.listIterator(); i.hasNext(); ){
Tag tag = (Tag)i.next();
Class clazz = tag.getClass();
if(clazz == DefineEditText.class){
DefineEditText det = (DefineEditText)tag;
det.setInitialText("ほげ");
i.set(det);
}
}

画像の置き換えとか、音楽の置き換えとか。
調べたからにはまあいろいろ試してみよう。

java:正規表現でbasic認証のurlを解析

先日'ユーザー名:パスワード@'のついたURLを解析してBasic認証を通過するというのをjavaで書いたので覚書。この形式でBasic認証通過するのはどうやらブラウザ側の機能みたいですね。微妙にマッチが適当です。'/'で閉じてないホスト名だけのurlにもマッチしません。マッチして正当性を確かめると同時に部品にも分割してるのでちょっと便利。
String cbUrl = "https://abcde:beg@hoge.com/aaa.php";
final Pattern analyzeBasicAuth =
Pattern.compile("^(http.*?://)(.+?:)(.+?@)(.+?/)(.*)");
Matcher match = analyzeBasicAuth.matcher(cbUrl);
if(match.find()){
String username_ = match.group(2);
String password_ = match.group(3);
final String username = username_.substring(0, username_.length()-1);
final String password = password_.substring(0, password_.length()-1);
System.out.println("'"+username + "''"+ password+"'");
System.out.println(match.group(1)+match.group(4)+match.group(5));
}

2009年2月25日水曜日

敗北宣言をする人たち

■Domino/Notes
僕個人としては Lotus Domino/Notesというグループウェアはその筋ではほぼ最強のアプリなんですが。レガシーで古臭いから劣るということになっている。2002年の記事。

http://www.atmarkit.co.jp/news/200212/03/gw.html

あとwikipediaにもなんかそんなことが一時期載っていた。
Domino/Notesってオブジェクト指向なデータベースを元にしてるんですよね。。データベースにNoteオブジェクトを蓄積していく感じ。メインではいるのはドキュメントなので完全な意味でのオブジェクト指向DBなのかはあれだけど。市場で勝利した中では一番オブジェクト指向なDBを抱えるシステムのひとつだと思う。

それがRDBにがっつり依存した環境を構築する人たちに「Notes/Dominoはなんかよくわからんが旧式だー! これからはWEBアプリー」とか言われてしなくていいものまでWEBアプリに移行してとどめられなかった不幸が2000年以降には存在すると思う。ちょうどその時期Notes/Dominoから離れてしまったのでよくわからんのだ。

ノーツドミノのえらいところは使ってる会社に行けば、データベースにドキュメントが格納されていてそれをビューで閲覧する、ということが形として理解されている点。そしてそのようなシステムが誰でも作れる点。WEBアプリの開発者の一部にはそもそも、ビューとかドキュメントとかいう概念がなかったりします。そういうものを誰にでもわかる形でシステムとして現前せしめてるところはすごいよね。

■C++
LinusがCが一番よくてC++は駄目だと言っていたよ! だからC++は駄目なんだ。
という話。ちなみにWindows OSは昔からC++ベースで構築されてます。C++嫌いならWindows使ってくれるな。ちなみにLinusの発言はこんな感じ。

http://lwn.net/Articles/249460/
http://tabesugi.net/memo/2009/1a.html

実にマトモな発言ですな。Linusさんが下手糞の書いたC++なんざわからんからCで書けというのは正しい。糞ほど大量のコード見てきたんだろうから。でもLinusが言ってたから全否定するというのはない。C++の資源(dll,COM)が大量にある環境でクリティカルな開発するときに、C++使わないぜと断言するのは自殺行為に近い。またコンパクトに速いプログラムを書かなきゃいけないときはC++使うのが自殺行為だったりするわけですが。
世の中潤沢な時間をとって余裕のある開発ができる環境ばかりではないしなー。C++で書くと大きなものが楽に書きやすいんですよ。頭悪くても。

■svnよりgit
linus発言の流れで。cvsは確かにひどかった。まったく使い物にならなかった。
svnは気に入っている。けどシステムの説明を見る限り。
ok。svn < gitだろう。でも、それに対する移行コストは誰が払うんだよ。

個人的にソースコード管理システムにおいて、マージが使いやすいとか高速にできるというのはぜんぜん副次要件、安定して使いやすい最低限の機能を備えるというのが必要条件。
で「仕様変更がなく長期運用できる」というのが絶対要件。
その意味ではsvnもリポジトリの互換性問題とか時々あってひどい。でもgitに移行するよりははるかにマシだ。

2009年2月20日金曜日

JETTY環境でのリクエストロガーの編集

ひさしぶりのLOGは単なる技術メモ。

携帯電話用にログをとる話。
携帯電話には端末固有IDというのがあってなんか主にヘッダに入っています。すべてのアクセスがキャリアのサーバを介す都合上IPアドレスはユニークユーザー識別としては役に立ちません。ユーザーがこれの送信を許可してることを期待してこいつでユニークユーザーをとるとなんかPCで行われているようなトラッキングみたいなことができるんではという話。取得自体は正規表現をいくつか用意してhogeればいいので簡単です。問題はこれをどうログするか。

これが入ってる場所はキャリアごとでマチマチでApacheで設定すれば簡単にとれてくるようなものではありません。

人に聞くとアプリケーション上でデータベースにログするのが主流のようです。毎アクセスごとに。(アクセスログを取るためだけにDBサーバーと通信するんですか) で自作テーブルのカラムにつっこむ。(アクセス解析ツールとか使えませんよねー。自作するんすか)


ところでmvn:jetty runが便利すぎるのでいまだにコンテナにjetty使ってます。このjettyですが。httpサーバーとしても単体動作しログ機能も備えています。

デフォルトのNCSAログの実装がLocaleの設定がまずく、まともに動かないというのは以前ここに書きましたが。この実装は自作のものに置き換えが可能です。素のjettyにおいてログ用クラスのいれかえをどうするかということについては公式に情報があったんですが。

mvn:jetty runでどのように設定すれば置き換えが聞くのか、掲示板にしか情報がなかったのでここに書いておきます。pom.xmlに設定する内容は以下みたいな感じ。

==================================================
<plugin>
 <groupId>org.mortbay.jetty</groupId>
 <artifactId>maven-jetty-plugin</artifactId>
 <version>6.1.14</version>
 <configuration>
     (省略)
  <requestLog implementation="jp.co.xxxxxx.jetty.MyCombinedLog">
   <filename>target/yyyy_mm_dd.request.log</filename>
   <retainDays>90</retainDays>
   <append>true</append>
   <logTimeZone>GMT+9</logTimeZone>
   <logServer>true</logServer>
   <preferProxiedForAddress>true</preferProxiedForAddress>
  </requestLog >
 </configuration>
 <dependencies>
  <dependency>
   <groupId>jp.co.xxxxxx</groupId>
   <artifactId>mylib</artifactId>
   <version>1.0.0</version>
  </dependency>
 </dependencies>
</plugin>
==================================================

jp.co.xxxxxx.jetty.MyCombinedLogというのがNCSARequestLogを身ながら自作したログ用のクラス。でこれをライブラリmylibにつっこんでmvnのローカルリポジトリに投下。pluginタグののdependenciesにつっこんであげると動作する。(もしくはjetty.xmlを作ってそこから参照させてもいいらしい) 普通そんなところにdependenciesがいれられるとはおもわんので難儀しました。
とにかくこれでログアナライザがまともに読むことのできるCombinedログもとれるし、普段使わないcombinedログのuser欄にサブスクライバIDをつっこむこともできるわけです。めでたしめでたし。