Aug 27, 2005

[Library] JCAPTCHA にチャレンジ

JCAPTCHA とは

CAPTCHA を Java で実現するためのライブラリ。 CAPTCHA というのは、completely automated public Turing test to tell computers and humans apart の略で通信相手が人間かコンピュータかを判断するための機構のこと。 Hotmail やら GMail やらを登録する際に表示されるクネクネした画像とかでお馴染みのアレ。 この辺りに解説がある。

Captcha - Wikipedia, the free encyclopediaの翻訳(2005年2月27日版)
http://www.memb.jp/~deq/voice/captcha/wikipedia-captcha.html
はてなダイアリー - CAPTCHA とは
http://d.hatena.ne.jp/keyword/CAPTCHA

JCAPTCHA は簡単に CAPTCHA を実現できるらしいのでチャレンジ。 内部で EHCACHE という別のライブラリに依存しているらしいので、それも必要。

JCAPTCHA
http://jcaptcha.sourceforge.net/
EHCACHE
http://ehcache.sourceforge.net/

JCAPTCHA の実行環境構築

  1. JCAPTCHA (jcaptcha-all-1.0-RC2.0.1.jar) をクラスパスに追加
  2. EHCACHE (ehcache-1.2beta2.jar) をクラスパスに追加
  3. その他必要なライブラリ (commons-collections-2.1.1.jar, commons-logging-1.0.4.jar) をクラスパスに追加

実行例

↓のサンプルコードを動かしてみたところ。 [↓のサンプルコードの実行例(1)] [↓のサンプルコードの実行例(2)]

サンプルコード

package jp.in_vitro.codelets.jcaptcha;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.util.Locale;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;

import net.sf.ehcache.CacheException;
import net.sf.ehcache.CacheManager;

import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;

public class Codelet {

    public Codelet() throws CacheException {
        super();
    }

    public static void main(final String[] args) throws Exception {
        CaptchaImageCreator creator = new CaptchaImageCreator("my id", Locale
                .getDefault());

        ImageViewer viewer = new ImageViewer(creator);
        viewer.setVisible(true);
    }

    public static class CaptchaImageCreator {
        private String captchaId;
        private Locale locale;

        public CaptchaImageCreator(final String captchaId, final Locale locale)
                throws CacheException {
            super();

            this.captchaId = captchaId;
            this.locale = locale;

            this.initializeEhcache();
        }

        protected void initializeEhcache() throws CacheException {
            // ehcache-1.2beta2.jar 内にある XML ファイルで EHCACHE を初期化する。
            InputStream is = this.getClass().getResourceAsStream(
                    "/ehcache-failsafe.xml");
            CacheManager.create(is);
        }

        public BufferedImage createImage() {
            // イメージを生成する。
            ImageCaptchaService service = new DefaultManageableImageCaptchaService();
            BufferedImage image = service.getImageChallengeForID(
                    this.captchaId, this.locale);
            return image;
        }
    }

    public static class ImageViewer extends JFrame {
        private BufferedImage image;
        private CaptchaImageCreator creator;
        private Canvas canvas;
        private JButton nextButton;

        public ImageViewer(final CaptchaImageCreator creator) {
            super();

            this.creator = creator;
            this.initComponents();
        }

        protected void initComponents() {
            // ウィンドウ終了方法の指定。
            super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            // 初回イメージの生成。
            this.image = creator.createImage();

            // ContentPane の設定。
            Container contentPane = super.getContentPane();
            contentPane.setLayout(new BorderLayout());

            // イメージ表示用キャンバスの準備。
            this.canvas = new Canvas() {
                @Override
                public void paint(Graphics g) {
                    g.drawImage(ImageViewer.this.image, 0, 0, this);
                }

                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(ImageViewer.this.image.getWidth(),
                            ImageViewer.this.image.getHeight());
                }
            };
            contentPane.add(this.canvas, BorderLayout.CENTER);

            // "次のイメージに進む"ボタンの準備。
            this.nextButton = new JButton(new AbstractAction("next image") {
                public void actionPerformed(final ActionEvent evt) {
                    ImageViewer.this.image = ImageViewer.this.creator
                            .createImage();
                    ImageViewer.this.canvas.repaint();
                }
            });
            contentPane.add(this.nextButton, BorderLayout.SOUTH);

            // ウィンドウサイズの自動調整。
            super.pack();
        }
    }
}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 25, 2005

[Book] Ship It!

書籍情報


Ship It!

レビュー

CMM だの RUP だのアジャイルだのといった書籍が持てはやされているが、「実はこれで十分なのでは??」と感じさせる一冊。 開発チームの体制から心構え、SCM や Build Process の必要性といった現場発の現実的な開発の在り方を紹介している。 どの内容も目新しさは感じないが、全体を通して読むと「なるほど」となる。 技術的な深さを抑えてある分読みやすい。 いわゆる開発プロセスなんていうものは、このレベルが当たり前になって「さて、次をどうするか」という状況で考えるものではないだろうか。 分厚い RUP の書籍を手に取る前にまずこちらを試してみて欲しい。

Posted in Book | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 19, 2005

[DocBook] DocBook メモ

DocBook とは

ドキュメント記述用に規定された XML の標準フォーマット。 DocBook でドキュメントを記述しておくと、ツールを使用して HTML や PDF、RTF など様々なフォーマットに変換できるためにドキュメントのポータビリティが向上する。

既に現在のプロジェクトでは DocBook を導入済みで実績もあるのだが、より広範囲に使用したいので再調査。 出来れば DocBook → HTML、PDF、MS Word の変換を出来る環境を整えたい。 環境の構築(Word への変換は自作??)からメンバーの教育まで、難所が多そうだ。

DocBook 参考資料

Docbook 公式サイト
http://docbook.org/
Docbook Specifications ・・・ 様々なバージョンの仕様書
http://docbook.org/specs/index.html
DocBook 5.0: The Definitive Guide
http://docbook.org/tdg5/en/html/docbook.html
DocBook XSL Stylesheets
http://docbook.sourceforge.net/projects/xsl/
DocBook で文書を書こう!
http://members.at.infoseek.co.jp/zzyyb/docbook/

Posted in DocBook | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 18, 2005

[JSR] JSR 94 Java Rule Engine API ダイジェスト

Java Rule Engine API をざっと眺めたときのメモ。

JSR 94 Java Rule Engine API

オリジナルの入手はこちら → JSR 94

6. Definitions

Rule Engine
高機能な if/then statement インタプリタの様なもの。ビジネスロジックをシステムの外部に出すことで宣言的プログラミング(declarative programming)を促進する。
Rule
Rule は condition と action とから成る。この JSR では Rule の構造は規定されない。
Rule Execution Set
Rule の集合。この JSR では Rule Execution Set の構造は規定されない。
Rule Session
Rule Engine とクライアント間の実行時コネクション。Rule Session は単一の Rule Execution Set と関連付けられる。
Stateful Rule Session
Stateful な Rule Session。
Stateless Rule Session
Stateless な Rule Session。Stateful Rule Session よりシンプルでパフォーマンスが良い。

10. Architecture

  • javax.rules, javax.rules.admin とい 2 つのパッケージで構成される。
  • javax.rules は、Rule Engine のランタイムクライアントを表す。既に用意された Rule Execution Set 用の Rule Session の生成や Rule Session を用いた各種処理を提供する。
  • javax.rules.admin は、管理用 API を表す。外部リソース (URI, InputStream, XML, Binary tree, Reader) から Rule Execution Set を読み込む機能を提供する。

10.1. Runtime API

RuleServieProviderManager
RuleServiceProvider を提供する。ベンダー毎の RuleServiceProvider を返す。
RuleServiceProvider
RuleRuntime, RuleAdministrator を提供する。
RuleRuntime
RuleSession, 登録済みの RuleExecutionSet の URI リストを提供する。
RuleExecutionSetMetadata
RuleExecutionSet に関するメタデータを提供する。
RuleSession
StatefulRuleSession, StatelessRuleSession の共通インターフェース。
StatelessRuleSession
クライアントは StatelessRuleSession に Objet のリストを渡して RuleExecutionSet の実行を指示する。その後、処理の結果生成された Object を受け取ることができる。処理結果の Object は ObjectFilter を利用することで必要なもののみ受け取るようにフィルタリングすることができる。
StatefulRuleSession
RuleExecutionSet に渡される Object の受け渡しなどを行うインターフェース(addObject, getObject, removeObject, updateObject, containsObject)を提供する。
ObjectFilter Interface
RuleSession 実行結果 Object リストから必要なもの/不必要なものを選別するフィルタ。
Handle Interface
StatefulRuleSession 内で独自の方法で Object を識別する。異なる ClassLoader でロードされた Object 同士でも正確に一致/不一致を判断するために利用される。

10.2. Administrator API

RuleAdministrator
RuleExecutionSetProvider を提供する。
RuleExecutionSetProvider
RuleExecutionSet を生成する。
LocalRuleExecutionSetProvider
RuleExecutionSet を生成する。LocalRuleExecutionSetProvider はシリアライズされていないデータ (InputStream, Reader) から RuleExecutionSet を生成する。
Rule
Rule の名称や説明情報などを提供するインターフェースを持つ。
RuleExecutionSet
RuleExecutionSet の名称や説明情報などを提供するインターフェースを持つ。

クラス図

[JSR 94 クラス図]

Posted in JSR | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 16, 2005

[Library] PDFBox を試してみる

PDFBox とは

PDF の読み書きから暗号化、復号化までしてくれるスグレモノの Java 用ライブラリ。 基本機能で少し遊んでみた。

PDFBox
http://www.pdfbox.org/

PDFBox の実行環境構築

  1. PDFBox(pdfbox-0.7.2.jar) をクラスパスに追加。

サンプルコード

既存 PDF の読み込み
1 byte 文字のみで構成されている PDF を読み込んで JPEG に書き出してみた。 何とも簡単に出来た。
日本語 PDF の書き出し
1 byte 文字のみの PDF 書き出しはサンプルにあったので、2 byte 文字の書き出しにチャレンジ。 TTC 形式のフォント(TTF ファイルの集合) は読み込めないので、予め BREAKTTC というツールで TTF を作成しておいた。 結局、上手く行かないまま時間切れ。(↓のコードは文字化けした PDF を出力する)。
package jp.in_vitro.codelets.pdfbox;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.pdfbox.exceptions.COSVisitorException;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDPage;
import org.pdfbox.pdmodel.edit.PDPageContentStream;
import org.pdfbox.pdmodel.font.PDFont;
import org.pdfbox.pdmodel.font.PDTrueTypeFont;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class Codelet {

    public Codelet() {
        super();
    }

    public static void main(final String[] args) throws COSVisitorException,
            IOException {

        Codelet me = new Codelet();
        me.createJapanesePDF(new File("c:\\workspace\\japanese.pdf"), new File(
                "c:\\workspace\\MSGOTHIC_FONT00.ttf"));
        me.convertPDFtoJPEG(new File("c:\\workspace\\english.pdf"));
    }

    public void convertPDFtoJPEG(final File target) throws IOException {

        PDDocument document = null;
        try {
            document = PDDocument.load(target);
            List pages = document.getDocumentCatalog().getAllPages();

            int count = 0;
            for (PDPage page : pages) {
                BufferedImage image = page.convertToImage();
                FileOutputStream fos = new FileOutputStream(target
                        .getAbsolutePath()
                        + "." + count++ + ".jpg");
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);
                encoder.encode(image);
                fos.close();
            }
        } finally {
            if (document != null) {
                document.close();
            }
        }
    }

    public void createJapanesePDF(final File target, final File fontFile)
            throws IOException, COSVisitorException {

        String message = "日本語だよ。";

        PDDocument document = null;
        try {
            PDPage page = new PDPage();
            document = new PDDocument();
            document.addPage(page);

            PDFont font = PDTrueTypeFont.loadTTF(document, fontFile);

            PDPageContentStream contentStream = new PDPageContentStream(
                    document, page);
            contentStream.beginText();
            contentStream.setFont(font, 10);
            contentStream.moveTextPositionByAmount(50, 50);
            contentStream.drawString(message);
            contentStream.endText();
            contentStream.close();
            document.save(target.getAbsolutePath());

        } finally {
            if (document != null) {
                document.close();
            }
        }

    }
}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 15, 2005

Aug 14, 2005

[JSR] JSR 73 Data Mining API ダイジェスト

Data Mining API の仕様をざっと眺めたときのメモ。

JSR 73 Data Mining API

オリジナルの入手はこちら → JSR 73

1. Overview

  • JDM は Pure Java のデータマイニング用 API。 データマイニングツールベンダが提供する実装に対する共通の API を定義する。
  • 類似の JSR に JSR-69 JOLAP があるが、JSR-73 は JSR-69 と調整をしながら策定されている。
  • JDM は、API(application programming interface)、DME(data mining engine)、MOR(mining object repository) の 3 つのコンポーネントで構成される。

2. Use cases

3. Concepts

Data mining Functions
データマイニングの主だったサブドメイン。以下の 5 つから構成される。
  • Classification・・・予め決められた分類に従ってデータを分類する。ex) customer segmentation, business modeling, credit analysis
  • Regression・・・時間を考慮したClassification。ex) financial forecasting, biomedical and drug response modeling
  • Attribute Importance・・・モデルの構築の際にどの属性が最も重要であるかを決定する。
  • Clustering・・・データ内のクラスタを見つける。
  • Association・・・データ内に頻発する値の関連を見つける。ex) market basket analysis
Data mining Tasks
  • Building a model
  • Testing a model
  • Applying a model
  • Object import and export
  • Computing statistics on data
  • Verifying task correctness
Principal Objects
  • Connection
  • Task
  • Execution handle and status
  • Physical data set
  • Physical data record
  • Build settings
  • Algorithm
  • Algorithm settings
  • Model
  • Model signature
  • Model detail
  • Logical attribute
  • Logical data
  • Attribute statistics set
  • Apply settings
  • Confusion matrix
  • Lift
  • Cost matrix
  • Prior probabilities
  • Category sets
  • Taxonomy
  • Rules
  • Verification report
Physical data representations
  • Individual record
  • Single record case table
  • Multi-record case table
  • Data preparation
Attribute mapping
  • Direct mapping
  • Pivot mapping
Creating physical data objects
Persistence
Object references
Reflection/introspection

4. Packages

5. Code examples

6. Conformance statement

Posted in JSR | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 12, 2005

[Subversion] Subversion メモ

Subversion を導入して結構経つが、きちんとドキュメントを読んだことが無い。 一度読んでおかないと、ということでメモ。

Subversion 公式サイト
http://subversion.tigris.org/
Subversion によるバージョン管理
http://subversion.bluegate.org/doc/book.html
Subversionの基礎練習
http://www.hyuki.com/techinfo/svninit.html
TortoiseSVN
http://tortoisesvn.tigris.org/
Subclipse
http://subclipse.tigris.org/

Posted in Subversion | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 10, 2005

[Book] How Tomcat Works

書籍情報


How Tomcat Works

レビュー

まさにタイトルの通りの内容。 Tomcat はどのように動いているのかをコードレベルで解説している。 単純な Web Server の仕組みの解説から入り、Container、Connector、Lifecycle と言うように段々深化していく。 Tomcat は Java ServletJavaServer Pages の Reference Implementation だけあって、Code Reading の題材としては面白い。 ただ、そこそこ規模が大きいので取っ掛かりが大変。 この書籍は、その取っ掛かりとしてかなり重宝した。 コーディング技術の向上に壁を感じたら読んでみると良い一冊。

Posted in Book | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 09, 2005

[Blosxom] Bloxsom Autoattach plugin

autoimg を参考に添付ファイル用の plugin を作成してみた。

ダウンロード

autoattach.zip

インストール方法

bloxsom の plugin ディレクトリ内に解凍

使用方法

entry 内に "[" + 添付ファイル名 + "]" を記述する。添付ファイルは zip, lzh, gz を指定可能。

添付ファイルは以下の通り設置する。

bloxsom_home
   └entries ・・・ bloxsom の entry 設置用ディレクトリ
     ├myentry.txt ・・・ ファイルを添付される entry
     └myentry ・・・ entry と同一の名前でディレクトリを作成
       └attach.zip ・・・ 添付ファイルはここに設置

Posted in Blosxom | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 07, 2005

[Misc] 開発作業を整理してみる

さて、先日は開発環境を整理してみたので、次は開発作業を整理してみたい。 ここでの開発作業とは、アプリケーションの実装に必要なあらゆる作業のこと。 コーディング、テスト、ディプロイなど定常的な作業もあるし、ステージング環境の構築のような作業も含める。 定義が結構曖昧だけれど、要は「モノを作る人たち」の責務となる実装に焦点を当てた作業。 その辺りの作業をどこまで自動化できるか、どこまで手順化できるか整理しておきたい。

[開発作業]

★Project Task
プロジェクトスコープのタスク。Shared Environment 構築、Workspace Environment 構築、など。ここは自動化というより手順化。自動化してもコストに見合わないため。
Shared Environment 構築
一番最初に行うべきタスク。手順化しておいて手順書通りの作業を行うようにしておくのがベストか。
アプリケーション雛形作成
ディレクトリ構成や自動化されたタスクのスクリプト、各種ツール類の標準設定などを含んだアプリケーションの雛形を作成するタスク。自動化する範囲にもよるが結構な量の設定が必要となるのでテンプレートもしくはウィザードが欲しい。
Workspace Environment 構築
最低でも手順化は必要だが、開発者の人数が多い場合は必要なソフトウェアを自動インストールしてくれると便利か。
★Phase Task
イテレーション単位のタスク。リリース、結合テスト、コードレビューなど。ここは可能な限り自動化したいが、人手に頼る部分も大きい。
リリース
実行可能なモジュールとドキュメント、ソースコードなど納品物一式を整える。ビルドマネジメントツールで自動化する。Maven は標準でサポートしているのでカスタマイズだけで済む。
結合テスト
コードレビュー
基本的には人手で行う必要があるが、ツールでかなり広範なサポートが可能。Jalopy、CheckStyle、FindBugs、JLint、JMetric などで単純作業を減らす。
★Build Task
実装作業レベルのタスク。コンパイル、単体テスト、パッケージング、ディプロイなど。ここが一番自動化しやすい。このタスクは基本的にビルドマネジメントツールで自動化しておく。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 04, 2005

[Misc] 開発用ツールの選択肢

開発環境を構築するのに利用できそうなツールを各項目毎にリストアップしてみた。 (他にもあると思うが)この中から良さそうな組み合わせを考えてみたい。 まずは一通り実際の使用感を確かめないと・・・。

Shared Environment

SCM(Source Code Management) CVS, Subversion, VSS, StarTeam
Executable Code Management
Build Management Maven2, Maven, Ant, Antmod, Invicta, LuntBuild
Source Health Management CI(Continuous Integration) CruiseControl, DamageControl, Continuum, Hudson
Integration Tester Selenium, e-Test
Information Sharing Issue Tracker Bugzilla影舞, Scrab, TrackIt, jTrac
Feature Tracker Scrab
Document Management System
BBS/Wiki 【Wiki】Hiki, PukiWiki, YukiWiki, 【BBS】ClipBoard, MegaBBS

Workspace Environment

IDE(Integrated Development Environment) Eclipse, NetBeans, JBuilder, JDeveloper, Sun Java Studio Creator

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 02, 2005

[Misc] 開発環境を整理してみる

[開発環境]

開発環境は意外とプロジェクト毎にマチマチになってしまっている感じがするので、一度 TO-BE 像を整理をしてみた。 適当に整理しただけなので、造語が混ざっていたりするがご愛嬌ということで。 これを基に一度環境の見直しをして、その結果をフィードバックしていきたい。 大手だと標準化されているのだろうな。

★Shared Environment
プロジェクトで共有される環境。

☆SCM(Source Code Management)
ソースコード管理システム。 プロジェクト成果物のバージョン管理を行う。 CVS, Subversion, VSSなど。
☆Executable Code Management
実行可能コード管理システム。 開発対象システムが依存する外部ライブラリの管理を行う。 Maven のリモートリポジトリなど。
☆Build Management
ビルド管理ツール。 Maven2, Maven, Ant, make, shell scriptなど。
☆Source Health Management
定期的にプロジェクト成果物のヘルスチェックを行う。
CI(Continuous Integration)
継続的インテグレーションシステム。 定期的に開発対象システムのインテグレーションを実行する。 CruiseControl, DamageControl, Continuumなど。
Integration Tester
結合テストツール。 実行可能な状態にされた開発対象システムに対して自動的に結合テストを行う。 e-Testなど。
☆Information Sharing
プロジェクトメンバー同士の情報共有機能を提供する。
Issue Tracker
バグやその他重要な事項を管理する。 Bugzilla影舞など。
Feature Tracker
システム要件を管理する。
Document Management System
ドキュメント管理システム。 各種CMS、Wikiなど。
★Workspace Environment
開発者毎に用意される環境。

☆IDE(Integrated Development Environment)
統合開発環境。 Eclipse, NetBeans, JBuilder, JDeveloper など。
☆Build Management
ビルド管理ツール。 Maven2, Maven, Ant, make, shell scriptなど。
★Staging Environment
ステージング環境。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |