竹形誠司 ブログ
談話室    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
サンプルアプリケーション
by KILROY[KILROY]
 『ご質問』板の『ココをいじるともっと快感』に書いたように、
『サーバアプリケーション開発入門』のオンラインショップ
『作る掲示板とブログ』の掲示板・ブログ・携帯ブログ
『Web アプリケーション構築入門』の「登録ユーザだけが書き込める掲示板」
の計5つのアプリケーションのリファクタリングを行なっています。
 現在、そこそこ動き始めているのですが、リファクタリングの内容としては『ココをいじるともっと快感』にあるように、
エンコーディングの設定を Tomcat のフィルタで行い、 UTF-8 をデフォルトにした。
各ページを XHTML 化し、タグ名や属性名も小文字に変更。
Java のコードに埋め込まれている SQL も小文字に変更。
Tomcat 5.5 に実装された JSP 2.0 に合わせ、 JSTL や式言語を使用してページの記述の中からスクリプトレットをなるべく排除。
JPS 部分のディレクトリ名とファイル名はすべて小文字に統一。
といった改造を加え、さらにこの『サロン』の『 Struts 無用論』に書いた手法を使って login や登録・編集・削除のページ構成を整理して、ページの記述から一部の JavaScript のコードを排除。これ以外にも、
認証用 DB 、ユーザの個人情報用 DB、 アプリケーション用 DB を分離。認証用 DB は Tomcat の FORM 認証に使われる DB と統合。
『Web アプリケーション構築入門』の「登録ユーザだけが書き込める掲示板」で使われている privilage 属性を認証用 DB の user_realm に吸収。
といったことを行ないました。
 なお、現在の開発環境は eclipse の 3.2 です。 IDE (統合開発環境)の使用に関しては「学習用という点ではどうだろうか」という点で是非はありますが、「業務に使えるレベル」を狙う場合、楽っちゃあ楽です。少なくとも短期間で大規模なリファクタリングを行なうとかいった場合、さすがに強力です。
 で、次の目標としては『作る掲示板とブログ』の掲示板&ブログと『Web アプリケーション構築入門』の「登録ユーザだけが書き込める掲示板」の DB 上のテーブルを同じ形式にしてしまうことを考えています。特定のカラムを使う/使わないの違いと、アクセス制御の違いだけで、テーブルの形式自体は共通にしてしまおうと。じつは以前に開発した「2ちゃんねる」風スレッド型掲示板があるので、それも統合してしまう予定です。

 ……で、ここまでが前振り(長いな(^_^!))。

 かれこれ十数年開発中の形態素解析エンジン( JAI-Parser 改め Jay )があるのですが、 C から Java に移植した際に一部デグレートしちゃった部分があり(文字列を保持するデータ構造が変更されている)、同時に移植を開始した時点はまだ Java に慣れていなかったりジェネリックや列挙型などの機能がなかったためコードが読みにくかったり、抽象化がうまくいっていなくて実際に使用する際のインタフェースがあんまり使いやすくなかったりといった問題があって、こちらもリファクタリング/機能拡張の途中だったりするわけです。
 とはいえ現“Jay”は開発ツールでもあるので、「サブセット版」に相当するものは動いています。で、それを使った Web アプリケーションとして「用語集」というものが存在していたりするわけです。
  JaMyTo シリーズも『作る掲示板とブログ』と『Web アプリケーション構築入門』で計八百ページを越え、同時に自然言語処理に取組もうと思うと無闇にいろんな言葉が出てくるため、なんかしら検索システムめいたもの(用語集なり WikiWikiWeb 風の知識ベース構築ツールなり全文検索システムなり)が必要となってきました。そんな訳で、“Jay”の構築と発表を兼ねて、「用語集」「 WikiWikiWeb 風知識ベース構築ツール」「全文検索システム」を順次発表してゆきたいと思います。
 以上、ご報告まで。m(_ _)m
投稿:KILROY[KILROY]/2007年 04月 24日 10時 56分 /更新:2007年 04月 24日 15時 40分
RE:サンプルアプリケーション
by 竹形 誠司[takegata]
おーっ、それは楽しみですね!
ここはひとつ、上級者向けの本にまとめていただいて、私の本の足りない所を補って頂けると嬉しいですねー(私は、より初心者向けの本を書いていたりします)。原稿だけ書いて頂ければ、編集は私がしますよ〜\(^O^)/。
投稿:竹形 誠司[takegata]/2007年 04月 24日 15時 33分 /更新:2007年 04月 24日 15時 33分
サンプルアプリケーション(つづき)
by KILROY[KILROY]
>  で、次の目標としては『作る掲示板とブログ』の掲示板&ブログと『Web アプリケーション構築入門』の「登録ユーザだけが書き込める掲示板」の DB 上のテーブルを同じ形式にしてしまうことを考えています。特定のカラムを使う/使わないの違いと、アクセス制御の違いだけで、テーブルの形式自体は共通にしてしまおうと。じつは以前に開発した「2ちゃんねる」風スレッド型掲示板があるので、それも統合してしまう予定です。
 現状、こんな感じです。
drop table if exists `articles`;
create table `articles` (
  `id` int(11) NOT NULL auto_increment,
  `root_id` int(11) default NULL,
  `parent_id` int(11) default NULL,
  `height` int(11) default '0',
  `handle` varchar(255) default NULL,
  `author_id` int(11) default NULL,
  `subject` varchar(255) default NULL,
  `subject_source` varchar(255) default NULL,
  `content` text,
  `content_source` text,
  `hidden` boolean default '0',
  `date_time` bigint(20) default NULL,
  `update_date_time` bigint(20) default '0',
  `available` boolean default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 「 height 」っつーのは何かといえば、 root からの距離です。「“ depth ”じゃねーのか?」という意見もあろうかと思いますが、一応「木構造」なんで「高さ」ではないかと(だけど木構造データって、普通は下に向かって描くよな)。
 ニックネームは英語圏の習慣に合わせて“handle”にしました。元は CB 無線のほうの言葉らしいです。映画『コンボイ』あたりを参照のこと。
 「 date_time と update_date_time は DATETIME ではないのか」という意見も運用側からはあるっちゃああるんですが(「ダンプをエディタで開いたときに、日付・時刻が見やすい」わけです)、とりあえず JyMyTo シリーズとの整合性を考えてそのまんま。「 hidden 」の boolean は、 mysqldump でダンプを取ってみると「tinyint(1)」になります。「 available 」はいわゆる「論理削除フラグ」で、変更したときに古いデータを保存しておくためのカラム。

 四月二十五日(水)午後十時の時点で掲示板がそろそろ動作中。がんばんべー。
投稿:KILROY[KILROY]/2007年 04月 25日 09時 48分 /更新:2007年 04月 25日 22時 07分
サンプルアプリケーション ― その後
by KILROY[KILROY]
 現在悪戦苦闘中。

articles テーブルに、「同一の root に所属する記事( article )の時系列上の番号を格納するための seq_no カラム」を追加。
その記事が root であった場合に、配下の記事が更新された DATETIME を追加する予定。これをやらないと、「新規投稿があったスレッドが浮かぶ」という処理が重くなります。

 なお、ここへきて「“ height ”っていうネーミングはまずかったかな」と反省中。自分でもしょっちゅう間違える。やっぱ“ depth ”だよなぁ(-_-!)。

 余談ながら、本日ついに光回線開通。どうなることやら。
投稿:KILROY[KILROY]/2007年 04月 27日 00時 14分 /更新:2007年 04月 27日 00時 18分
サンプルアプリケーション ― その後(2)
by KILROY[KILROY]
 えー、お待たせしました。サンプルアプリケーション・ライブラリはリリース目前です(「目前」っつっても一週間や二週間は平気で経っちゃうんだが)。

 日付時刻を表わすエレメントは long から Date に変更いたしました。現在は bigint(20) ではなく datetime です。主な理由は
ダンプしたときに、日付が yyyy-MM-dd hh:mm:ss 形式で見えるので、運用担当者が扱いやすい。
JSTL の fmt タグライブラリ( i18n タグライブラリ)が使えるので、デザイナーさんがスクリプトレットの中身まで踏みこまなくて済む( HTML 用の構造エディタで編集しやすい)。
の二点です。正直プログラマ的には“キモチワルイ”部分はあるのですが、業務のことを考えると、こうなりそうな気がします。

 とはいえ現状のソースは相当に生煮えなシロモノなものですから、
「業務で使っちゃったのに後で大幅に改訂が入ってエラいことになった」みたいなケースでも恨みっこなし、の「ソースを読んで参考にするバージョン」。
継続してライブラリ的に使いまわすことで工数を稼げる「ソースそのものをアプリに取り込めるバージョン」
を分けて、段階リリースとするのが現実的なんじゃなかろうか、と思っております。
 で、前者は zip ファイルかなんかで公開しておいて、後者に関しては CVS なり SubVersion なりを通して開発環境レベルで共有しちゃうのが正解でないかと思っとります。

 ……では。
投稿:KILROY[KILROY]/2007年 05月 01日 23時 49分 /更新:2007年 05月 01日 23時 59分
サンプルアプリケーション ― その後(3)
by KILROY[KILROY]
> えー、お待たせしました。サンプルアプリケーション・ライブラリはリリース目前です(「目前」っつっても一週間や二週間は平気で経っちゃうんだが)。

 ……と書いてはや一週間。まことに申し訳ない。m(_ _)m

 『― 掲示板とブログ』の掲示板と、『― Web アプリケーション構築』の掲示板では、構成が異なっている。前者は記事一覧から投稿・編集・削除のそれぞれのページに飛ぶようになっているし、後者は編集ページからパラメータで投稿・編集・削除のコマンドを発行する形になっている。

 この二つ、それぞれ一長一短があって、前者は確認ページを設けるなどきめ細かな対応ができる反面ページの数が増えてメンテナンスが面倒であるし、後者はページ構成が簡単になってメンテナンスが簡単な反面作りこみが厄介である。

 てなワケでページ構成も変え、ほとんど全面書き直しとなった。カラクリとしては以下のようになっている。

記事一覧ページから、まず初期化用ページ(initialize.jsp)に飛ばす。ここで、「新規投稿またはコメント」「編集」「削除」という action の違いをパラメータで渡す。
ArticleBean に action を保持できるエレメントを追加し、initialize.jsp の中で action を ArticleBean に押し込む(この段階でパラメータはすべて ArticleBean に格納されるため、ユーザからは隠蔽される)。その後、記事編集ページ(「新規投稿またはコメント」および「編集」用のページ)または確認用ページ(削除)のページに redirect する。この redirect っつーのがミソで、 forward してはいけない。なんでかっていうと飛び先 URL が initialize.jsp になっちゃう上にパラメータが丸見えになってしまうからだ。(^_^!)
記事編集ページで編集を行なった後、削除の飛び先である確認用ページに飛ばす。これで四つの処理(新規投稿・コメント・編集・削除)が合流する。
確認用ページから、新規投稿・コメント・編集・削除のアクションを実行するページに飛ばす。ここで ArticleBean の action をクリアして、必要に応じて「実行しました」のメッセージを出すか、直接元の記事一覧に飛ばす。
なお、念を入れるなら、 initialize.jsp および確認用ページに ArticleBean の action 要素をチェックして、空だったら一覧ページに飛ばす仕掛けを設けておき、ページのバッファリングもブロックしておく。これで、「戻る」ボタンで戻られても大丈夫。

 「そう説明されてもさっぱり分らん」という意見は当然あるわけで、「いましばらくリリースをお待ちください」ということでご容赦願いたい。m(_ _)m

 時間がかかった分、少なくともそこいらの商用アプリケーションの平均的水準よりはかなり上のはずなので、使いまわしは利くと思う。乞う、ご期待。
投稿:KILROY[KILROY]/2007年 05月 08日 22時 26分 /更新:2007年 05月 08日 22時 26分
サンプルアプリケーション ― その後(4)
by KILROY[KILROY]
 『― 掲示板とブログ』の掲示板と『― Web アプリケーション構築』の掲示板はめでたく統合されて(もっとも表示のスタイルは全然違うわけなのだが)、現在はブログと掲示板の統合作業を実行中。とりあえず CSS を整理し、JSTL のフォーマット・ライブラリを使って JSP を簡素化するところまで終了。

 ブログでは「記事」と「コメント」を別テーブルとして持っている。逆にいえばコメント構造を(ツリー型の掲示板の)記事を表現するテーブルに吸収した場合にタイトル( subject )のカラムが使われないということでもある。また、このように記事とコメントを同一のテーブルに格納する形式にすると、ブログの一覧(スレッド型掲示板でいうとスレッド一覧)を見るときに一度テーブルを舐めて親記事がない記事をブログの記事(スレッドタイトルの記事)と判定するようなロジックが必要となる。

 これではあまり美しい構成とは思えないので、「ブログの記事」の内容だけをコメント(一般の「記事」)のテーブルに移行し、スレッド情報に相当するものだけを「ブログの記事」テーブルに残すことにした。中身としてはこんな感じ。
create table `article_sets` (
  `id` int(11) NOT NULL auto_increment,
  `root_id` int(11) NOT NULL default '0',
  `size` int(11) default '0',
  `handle` varchar(255) default NULL,
  `author_id` int(11) default NULL,
  `subject` varchar(255) default NULL,
  `subject_source` varchar(255) default NULL,
  `date_time` bigint(20) default NULL,
  `update_date_time` bigint(20) default '0',
  `available` boolean default true,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 「このあいだ日付・時刻情報は DATETIME を使うって書いてませんでしたっけ?」みたいなツッコミが入りそうだが、「新規投稿があったスレはリストの先頭に移動する」という機能を実装するのに long にしておいたほうがよろしかろうと思ったので(また、複数の実装方法を残しておくというのも、サンプルとしては有効な気もするので)この形式とした。

 てなワケで現在作りこみ作業と文書化を進めております。ではまた。

投稿:KILROY[KILROY]/2007年 05月 10日 11時 25分 /更新:2007年 05月 10日 11時 26分