S2Daoでテーブルロックする

@S2Dao( bean = Sample.class )
public interface SampleDao
{
    @Sql( "LOCK TABLES sample WRITE" )
    public void lockTable();
}

MySQLのテーブルをロックしようとして、最初こんな感じで書いたけど、ResultSet is from UPDATE. No Data.というエラーになった。

Seasarのメーリングリストによると、updateLockTable()と書く必要があるみたい。

@S2Dao( bean = Sample.class )
public interface SampleDao
{
    @Sql( "LOCK TABLES sample WRITE" )
    public void updateLockTable();
}

それに従って書くと、うまく動いた。

S2Strutsでwebパッケージにpackage-info.javaを置くとエラーになる

S2Strutsで、Actionクラスを配置しているwebパッケージにpackage-info.javaを置くと、こんなエラーが出て、アプリケーションが起動しない。

致命的: action: null
org.seasar.framework.exception.EmptyRuntimeException: [ESSR0007]suffixはnullあるいは空であってはいけません
	at org.seasar.framework.convention.impl.NamingConventionImpl.fromSuffixToPackageName(NamingConventionImpl.java:441)
	at org.seasar.framework.convention.impl.NamingConventionImpl.fromClassNameToComponentName(NamingConventionImpl.java:464)
	at org.seasar.struts.lessconfig.config.rule.impl.SubApplicationActionFormNamingRule.toActionFormName(SubApplicationActionFormNamingRule.java:39)
        (略)

package-info.javaは、Java5から導入された仕組みなので対応してなさそう。

NamingConventionImplを拡張して、package-infoっていう名前のクラスは除外するようにしたらうまく動いた。

public class NamingConventionImpl extends
        org.seasar.framework.convention.impl.NamingConventionImpl
{
    @Override
    public String fromClassNameToComponentName( String className )
    {
        if( className.endsWith( "package-info" ) )
        {
            // package-info.javaは無視
            return null;
        }
        return super.fromClassNameToComponentName( className );
    }
}

このクラスのパッケージは、「~.impl」の下に置かないとダメ。
たぶん、クラス名がImplで終わっているので、Seasarは、そのインターフェースを探そうとするが、implパッケージの下に無くて困っている様子。

最後に、convention.diconのクラス指定を、拡張したクラスに変更すればOK。

コンポーネントからより狭いスコープのコンポーネントを使う

Seasar2では、コンテナに登録されているコンポーネントに対して、それより狭いスコープのコンポーネントをインジェクションすることはできません。

広いスコープのコンポーネントに対して、それより狭いスコープのコンポーネントをインジェクションすると、強参照により、狭いスコープのコンポーネントが消せなくなってしまうことが理由でしょう。

例えば、singletonスコープのコンポーネントAにsessionスコープのコンポーネントBをインジェクトできてしまうと、コンポーネントAからコンポーネントBに強参照が張られて、HttpSessionが解放されるタイミングになっても、コンポーネントBがガーベージコレクトされないことになってしまいます。

しかし、それらをインジェクションしなくても良いから、使いたいということはあります。

その場合は、singletonスコープで以下のようなインタフェースと実装を作ります。

public interface SessionScopeRepository {

    Object getComponent(Object componentKey);
}

public class SessionScopeRepositoryImpl implements SessionScopeRepository {

   public Object getComponent(Object componentKey) {
      // コンポーネント定義を見て、sessionスコープで
      // 登録されていることをバリデーションするといいかも
      return this.container.getComponent(componentKey);
   }

   private S2Container container;

   public void setContainer(S2Container container_) {
      this.container = container_;
   }

   public S2Container getContainer() {
      return this.container;
   }
}

このコンポーネントを経由して、よりスコープの狭いコンポーネントにアクセスできます。
こんな感じです。

public class SingletonComponent {

   public void doSomething() {
      // sessionスコープのコンポーネントを取得
      // メソッド内の変数に持つので、強参照はすぐ消える
      SessionComponent sessionComponent = 
          getSessionScopeRepository().getComponent(SessionComponent.class);

      // アクセス
      sessionComponent.doSomething();
   }

   // セッターインジェクションされるようにしておく
   private SessionScopeRepository sessionScopeRepository;

   public void setSessionScopeRepository(SessionScopeRepository repository) {
      this.sessionScopeRepository = repository;
   }

   public SessionScopeRepository getSessionScopeRepository() {
      return this.sessionScopeRepository;
   }
}

SessionScopeRepositoryのように一段噛まさず、そのままS2Containerから取る手もありますが、

  • コンポーネントがS2Containerと密結合になること
  • バリデーションを掛けられないこと

を考えると、上記のようにラップする方がいい気がします。

trac(日本語版)のインストールと設定

依存ライブラリをインストールするため、tracをインストールしてからアンインストールします。英語版を使う場合はアンインストールは不要です。

1.tracインストール

yum install trac

python-clearsilverなどもインストールされるはずです。

ここで、tracのバージョンを確認しておきます。後で同じバージョンの日本語版をダウンロードする必要があるためです。

2.tracアンインストール

yum remove trac

3.trac日本語版のインストール

インタアクト株式会社が提供されているtrac日本語版をダウンロードします。
バージョンは、手順1で確認したものと同じものを使います。

ダウンロードしたパッケージを展開し、そのディレクトリに移動してセットアップを実行します。

python ./setup.py install

4.tracプロジェクト用ディレクトリの作成

/srv/tracをプロジェクト用ディレクトリにする場合、

mkdir /srv/trac
chown -R apache.apache /srv/trac

5.Apacheの設定

/etc/httpd/conf.d/trac.confを編集します。(無ければ作る)
アカウントはSubversionと同じものを使います。


   SetHandler mod_python
   PythonDebug On
   PythonHandler trac.web.modpython_frontend
   PythonOption TracEnvParentDir /srv/trac
   PythonOption TracUriRoot /trac



   AuthType Basic
   AuthName "trac"
   AuthUserFile "/srv/.htpasswd"
   Require valid-user

6.tracプロジェクト作成

testという名前のtracプロジェクトを作成する場合、

trac-admin /srv/trac/test initenv

日本語版tracのバージョンが0.10.3.1-ja-1の場合、「そのようなファイルやディレクトリはありません」のエラーになります。
/usr/bin/trac-adminの改行コードがCR+LFになっていることが原因で、これをLFに修正すれば正しく実行できます。

Apacheからアクセスできるように所有者をapacheに設定します。

chown -R apache.apache /srv/trac/test

Apacheを再起動し、ブラウザで「http://(ホスト名)/trac/test」にアクセスし、tracの初期ページが表示されれば成功です。

7.プラグイン追加準備

プラグインインストールに必要なツールをインストールします。

yum install python-setuptools

Python Eggの展開用ディレクトリを作成します。

mkdir /srv/.python-eggs
chown -R apache.apache /srv/.python-eggs

Apacheの設定/etc/httpd/conf.d/trac.confに1行追記します。


   SetHandler mod_python
   PythonDebug On
   PythonHandler trac.web.modpython_frontend
   PythonOption TracEnvParentDir /srv/trac
   PythonOption TracUriRoot /trac
   SetEnv PYTHON_EGG_CACHE /srv/.python-eggs ←この1行



   AuthType Basic
   AuthName "trac"
   AuthUserFile "/srv/.htpasswd"
   Require valid-user

8.WebAdminプラグインを追加

動作確認をかねてWebAdminプラグインを追加します。

wget http://trac.edgewall.org/attachment/wiki/WebAdmin/TracWebAdmin-0.1.2dev_r4240-py2.4.egg.zip?format=raw

ダウンロードしたファイルの拡張子をmvコマンドでeggにします。

eggファイルをプラグインディレクトリにコピーします。

cp TracWebAdmin-0.1.2dev_r4240-py2.4.egg /usr/share/trac/plugins/

/srv/trac/test/conf/trac.iniの最後に以下を追記します。

[components]
webadmin.* = enabled

Apacheを再起動し、tracのメニューバーの一番右に「Admin」が追加されていれば成功です。
ただし、このメニューは、TRAC_ADMIN権限を持つユーザーでログインしないと表示されません。

Subversionのインストールと設定

1.本体をインストール

yum install subversion

2.ApacheでアクセスできるようにSubversionWebDAVモジュールをインストール

yum install mod_dav_svn

3.Subversionリポジトリの作成

/srv/svntestという名前のリポジトリを作る場合、

mkdir /srv/svn
svnadmin create /srv/svn/test
chown -R apache.apache /srv/svn

SELinuxが有効の場合は、次のコマンドも実行します。

chcon -R system_u:object_r:httpd_sys_content_t /srv/svn

4.Apacheでの公開設定

アカウントを設定します。

htpasswd -c /srv/.htpasswd [アカウント名]

パスワードの入力を求められるので設定します。
二人目以降は、オプションの「-c」は不要です。

/etc/httpd/conf.d/subversion.confを編集します。(無ければ作る)


   DAV svn
   SVNParentPath /srv/svn

   # Limit write permission to list of valid users.
   
      # Require SSL connection for password protection.
      # SSLRequireSSL

      AuthType Basic
      AuthName "Authorization Realm"
      AuthUserFile "/srv/.htpasswd"
      Require valid-user
   

Apacheを再起動し、ブラウザで「http://(ホスト名)/svn/test」にアクセスし、「Revision 0:/」と表示されれば成功です。

ディスプレイが表示されない

Fedora Core 6のインストール後の再起動でディスプレイが表示されなくなりました。

ディスプレイのメッセージによると、出力できるリフレッシュレートを超えているとのことなので、/etc/X11/xorg.confを修正したいところ。

しかし、Ctrl+Alt+F1でコマンドラインモードにしてもログイン画面まで進まない。

仕方ないので、一度電源を落とし、インストールCDからrescueモードで立ち上げる。
インストールオプション画面で

linux rescue

これで、コマンド入力ができるので、/etc/X11/xorg.confを修正。レスキューモードなので、そのときのパスは、/mnt/sysimage/etc/X11/xorg.confでした。

Section "Screen"
        Identifier "Screen0"
        Device     "Videocard0"
        DefaultDepth     24
        SubSection "Display"
                Viewport   0 0
                Depth     24
                Modes "1024x768" "800x600"
        EndSubSection
EndSection

Section "Monitor"
        Identifier "Monitor0"
        VendorName "IO-DATA"
        ModelName "LCD-A15T"
        DisplaySize 410 310
        HorizSync 31.3 - 68.7
        VertRefresh 59.9 - 85.1
        Option "dpms"
EndSection

HorizSyncVertRefreshの値をディスプレイの水平周波数と垂直周波数に合わせます。

再起動すると、ログイン画面が表示されました。