2007/6/25 月曜日

ibatisでクラスをシリアライズ化してDBに格納

このエントリをはてなブックマークに追加ibatisс鴻激≪ゃ阪DB主のはてなブックマーク被リンク数
Filed under: mysql, ibatis — akky @ 17:00:04

javaのクラスをシリアライズ化してMySQLのDBへ読み書きする方法

やり方

 ・DBにBLOB列を追加
 ・DTOにByte[]なシリアライズ化したオブジェクトを入れるフィールドを追加
 ・DTOにシリアライズ、デシリアライズのメソッドを追加

環境

 MySQL 5.0.41
java 1.5.03
ibatis ibatis-2.3.0677.jar,ibatis-dao-2.jar

テーブルの定義

mysql> desc WORD;
+-------------------+------------------+------+-----+---------+----------------+
| Field             | Type             | Null | Key | Default | Extra          |
+-------------------+------------------+------+-----+---------+----------------+
| WORD_ID           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| WORD              | varchar(128)     | NO   |     |         |                |
| SERIALIZED_OBJECT | blob             | YES  |     | NULL    |                |
+-------------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql>

DTO

ByteArray(Output|Input)Streamを使ってシリアライズ化(する|した)オブジェクトを読み書きする関係する部分だけを抜粋

    private byte[] serializedObject;
    /**
     * 指定されたインスタンスをシリアライズ化してINSERTorUPDATEを行なう準備をする
     * @param o シリアライズ化するクラスのインスタンス
     * @throws IOException 基本となる OutputStream が例外をスローした場合
     */
    public void setToSerialize(hogeClass o ) throws IOException{
      ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
      ObjectOutputStream objectOut = new ObjectOutputStream(byteStream);
      objectOut.writeObject(o);
      objectOut.close();
      this.serializedObject = byteStream.toByteArray();
    }
    /**
     * シリアライズ化されたオブジェクトをインスタンスに戻す。
     * @return デシリアライズしたオブジェクト
     * @throws IOException 基本となる OutputStream が例外をスローした場合
     * @throws ClassNotFoundException 基本となる OutputStream が例外をスローした場合
     */
    public hogeClass getDeSerialize() throws IOException, ClassNotFoundException{
      ObjectInputStream objectIn = new ObjectInputStream(new ByteArrayInputStream(this.serializedObject));
      hogeClass result = (hogeClass)objectIn.readObject();
      objectIn.close();
      return result;
    }

アプリ側

import java.io.IOException;
import java.io.Reader;
import java.io.Serializable;
import java.util.Iterator;
import com.ibatis.common.resources.Resources;
import com.ibatis.dao.client.DaoManager;
import com.ibatis.dao.client.DaoManagerBuilder;
public class SerialyzeTest  {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO 自動生成されたメソッド・スタブ
        Reader reader;
    try {
      classHoge t = new classHoge;
      t.addStartPosition(15);
      reader = Resources.getResourceAsReader("dao.xml");
          DaoManager daoManager =  DaoManagerBuilder.buildDaoManager(reader);
          Word out = new Word();
          WordDAO dao = (WordDAO) daoManager.getDao(WordDAO.class);
          dao.deleteByPrimaryKey(1);
          out.setWordId(1);
          out.setWord(t.getWord());
          out.setToSerialize(t);
          // 挿入実行
          dao.insert(out);
          // 挿入したレコードを検索してみる
          Word in = dao.selectByPrimaryKey(1);
          classHoge t2 = in.getDeSerialize();
          t2.methodFuga();
    } catch (Exception e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    }
  }
}

2007/6/11 月曜日

mantisからtracへのデータ移行

このエントリをはてなブックマークに追加mantistrac吾若睡Щ茵のはてなブックマーク被リンク数
Filed under: trac — akky @ 11:30:52

検索エンジンから来られた方と未来の自分へmantisからtracへのデータ移行を行った記録を記す。移行に使うmantis2trac.pyを編集していますが、pythonは今回が初めてなので適切ではない変更を行っている可能性があります。また、ここの内容を実行する際には自己責任でお願いします。データの破壊等が発生しても当方では補償しかねます。

環境

OS
CentOS 4.4
uname -a

Linux locahost.localdomain 2.6.9-42.ELsmp

mysql
5.0.37をソースからコンパイル
sqlite
sqlite-3.3.3-1.2、python-sqlite-1.1.7-1.2をprmからインストール

mantis2trac.3.pyを入手

# wget http://trac.edgewall.org/attachment/wiki/TracImport/mantis2trac.3.py?format=raw
# mv mantis2trac.3.py?format=raw mantis2trac.3.py

mantis2trac.3.pyでデフォルトエンコードの指定

266行目付近の

sys.setdefaultencoding('latin1')

sys.setdefaultencoding('utf8')

に変更。mantisが使うMySQLのDB、OS、tracが使うsqliteのDBの全てをUTF-8に統一していても移行後のtracで文字化けが発生する。tracにINSERTする各所で文字列に対しては「value.encode(’utf-8′)」
をしているのが原因。当初は文字化けに対してtracへ実行しているSQL文をデバックライトで画面に表示させそれをスクリプトファイルに編集していたが、作業が破綻してしまったし、繰り返しの作業が面倒になってきた。

LAST_INSERT_IDの取得を無効

392行目近辺の

        c.execute('''SELECT LAST_INSERT_ID()''')
        eturn c.fetchall()[0][0]
        eturn self.db().db.sqlite_last_insert_rowid()

をコメントアウト。LAST_INSERT_IDが無いと言われるが。
changelogに

Changes since version 1.1:
  - Made it work against Trac running on MySQL (specifically, changes to the
    LAST_INSERT_ID() call on line 382 (in the addTicket function))

という記述があり大事そうだけどないものは無い。

カスタム項目の移行

カスタム項目に相当する列はticketテーブルにないので実行時に

 * ERROR: unable to add ticket(#114) change "発生要因": "" -> "詳細設計不備" (2007-05-31 19:58:04)
          The bug id, field name, and time must be unique

とエラーになる。ticket_customテーブルに値を設定すればよい。
trac.iniで

[ticket-custom]
factor = select
factor.label = 発生要因
factor.options = 仕様変更|仕様不明確|仕様誤認|機能設計不備|詳細設計不備|コーディング不備|データ誤り|既存機能理解不足

と設定していれば、上のエラーメッセージからSQL文をエディタで編集して

INSERT INTO ticket_custom values (114,'factor','詳細設計不備');

とする。これをsqliteのコマンドラインインターフェイスから実行

添付ファイル

mantis2trac.3.pyが移行してくれる。

mantisのデータ整理

mantisに登録した件名がDBの列長を超えていると、有無を言わさず超えている部分をカットされてしまう。マルチバイトの途中でもお構いなし(ちょほほ)。mantisで見ると件名の末尾が文字化けしているデータは移行したtracでUTF-8への変換に失敗すると仰られ表示できなかった。mantisでフィルタを外して1件ずつ手直し。

mantis2trac.3.pyを実行

MySQLでのmantisのDBユーザ
bugtracker
MySQLでのmantisのDBユーザのパスワード
btspass
tracのプロジェクトの位置
/usr/local/trac/prj1/

とした場合に

./mantis2trac.3.py --db bugtracker -u btsuser -p btspass --tracenv /usr/local/trac/prj1/

と実行する

2007/6/8 金曜日

VB.NETにチャレンジ

このエントリをはてなブックマークに追加VB.NETc潟犬里呂討淵屮奪マーク被リンク数
Filed under: VB.NET — akky @ 17:58:41

仕事でVB.NETを使う事になり、VBの仕事にチャレンジ。やっ。ExcelのVBAとAccess97の経験はあるがWindowsアプリとしてのVBは初めてのチャレンジ。VBAの知識とJava,C++,Delphiの知識を織り交ぜてのコーディング。

1日さわってみて「VBとしてのベースを保ちつつも他の言語の美味しい機能をつまみ食い(?)した」というのが感想。おお。これはと思ったのがフォームのデザインをするときに前後左右にあるほかのオブジェクトと同じ高さor横位置になるときにガイドとなる線が表示されるのは便利。これのお陰で縦/横の位置が合わせやすくなった。もう一つが隣接する一定の間隔で均一にコントロールを配置したい時に、特定の間隔の場合にだけコントロール間に線が引かれるので、この機能も揃えるのを助けてくれる。

言語使用よりもフォームのデザインのしやすさにIDEの進歩を感じた

2007/6/5 火曜日

tracをさわった感想

このエントリをはてなブックマークに追加tracc海里呂討淵屮奪マーク被リンク数
Filed under: trac — akky @ 8:21:33

先日インストールしたtracだけど、データ移行をして使い方を考えた結果mantisに戻ることにしました。

mantisと比較して

trac よいと思ったこと
 roadmapがある
 Subversionのリポジトリビューアが変更管理を前提に考えられている
 wikiが一体化している
 Subversionとのアカウントを統合できる
 RSSで障害の状態を見れる

trac よくないと思ったこと
 サブプロジェクトを作れない
 新しいwiki文法か・・・
 pythonは使ったことないです
 ワークフローとして使えない(未検証)

当初はmantisからtracへの移行を考えていたのだけど、実務での基準になる一セットのプログラムを案件毎にカスタマイズすることを考えるとサブプロジェクトが無いため運用が破綻すると思い移行を断念。代替方法を考えてみたのだけども一つのリポジトリに対してBTSが複数になってしまうとどこかで辻褄が合わなくなりそう。特にリポジトリのフックスクリプトを使いBTSと連携する機能を作りこんでいってもどこかで無理がでそう。
また、mantisの開発版(1.1.0a3)ではtracにはあったロードマップとwiki及びRSSが実装されているのでtracに移行する必要もないのかなと思わせる。問題はこれらの機能が安定版にマージされる日を知らないということ。それまではロードマップはカスタムフィールドで代替。

2007/6/3 日曜日

tracをインストール

このエントリをはてなブックマークに追加tracゃ潟鴻若のはてなブックマーク被リンク数
Filed under: trac — akky @ 22:31:54

バグ管理にmantisを使っていたのだけど、いろんなメモも残すべくwikiを探している過程でtracに乗り換える事を決める。tracの存在は知っていたのだけど、pythonという未知の言語だったために敬遠。

今回tracにすることにした大きな要因はバグ管理、ソース管理、ナレッジを一つで実現できること。別々のアプリを立ち上げても良いのだが、管理メンドくさっ。となるのを避けたいのとそれぞれのコンテンツをリンクしておきたいということもある。例えば、ソース管理をSubversionで行いバグ管理をmantisで行っている中でバグ対応の差分を見たいときに、mantisに残しているリビジョンを控えておきsubversionを覗きにいっているのをワンアクションで実現できるということ。

また、マイルストーンがあるのも惹かれた。mantisでもたせられるバージョン番号はSubversionのタグ名と同じ値にしているために、修正が終ったがタグを貼っていない障害へのバージョン番号を振りにくいというものがあった。そこは、マイルストーンで上手くやって行けるのかなという淡い期待がある。また、マイルストーンで進捗を見れるものプラスポイント。

今回はお試し環境だったので、改めて環境を作り直し。そのときには手順を残したい。

参考にした主なサイト
 http://tech.feedforce.jp/trac_1.html
 http://discypus.jp/wiki/?%A5%BD%A5%D5%A5%C8%2FBug%20Tracking

はてなから引越し

このエントリをはてなブックマークに追加綣莇のはてなブックマーク被リンク数
Filed under: 未分類 — akky @ 19:38:31

これまでははてなを使っていたブログをレンタルサーバーに引越し。そうした理由はこのakky.orgのドメインが取得できたから。先日調べてみたら空いているのが判ったので即座に申請。orgドメインの手続きは1日で済むものの、管理料の支払いを銀行振り込みにしたものだから確認に3営業日もかかり取得完了のメールが届くのを一日千秋で待ったものだ。

ドメインが取得できたらレンタルサーバーにMovableTypeをセットアップ。MovableTypeにしたのは特段な理由はなく興味本位。

とりあえず、日々の事を書いていくよ。

次のページ »