<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>トラシスラボ 技術ブログ</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/" />
    <link rel="self" type="application/atom+xml" href="http://trasis.jp/blog/lab/atom.xml" />
    <id>tag:trasis.jp,2008-02-27:/blog/lab//2</id>
    <updated>2011-02-24T06:29:18Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 5.04</generator>

<entry>
    <title>MySQLで現在実行中のSQLの確認と、プロセスのkill</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2011/02/mysql-kill-sql.html" />
    <id>tag:trasis.jp,2011:/blog/lab//2.296</id>

    <published>2011-02-24T06:26:50Z</published>
    <updated>2011-02-24T06:29:18Z</updated>

    <summary>概要 MySQLで実行中のSQLを停止する方法について。 手順 プロセスIDの確...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>概要</h3>

MySQLで実行中のSQLを停止する方法について。

<h3>手順</h3>

<h4>プロセスIDの確認</h4>

コマンドラインで、次のコマンドを実行する。

<pre class="code2">
mysqladmin processlist
</pre>

Id がプロセスIDを意味する。

<h4>プロセスの停止</h4>

プロセスIDが分かったら、次のコマンドでプロセスを停止できる。<br />

<pre class="code2">
mysqladmin kill 13415
</pre>
]]>
        
    </content>
</entry>

<entry>
    <title>Firefox で勝手に www.localhost.com と置換されるのを止める</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2011/01/firefox-www.localhost.com.html" />
    <id>tag:trasis.jp,2011:/blog/lab//2.268</id>

    <published>2011-01-25T02:20:49Z</published>
    <updated>2011-01-27T05:22:05Z</updated>

    <summary>概要 Web アプリケーション開発時、Firefox で http://loca...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>概要</h3>

Web アプリケーション開発時、Firefox で http://localhost/ にアクセスして表示を確認しようとする際に起こるトラブル。<br />
<br />
Apache なり Tomcat が停止していると、Firefox は勝手に www. と .com を付加し、 <strong>www.localhost.com</strong> という FQDN でアクセスを試み、全く関係ないサイトを表示してしまう。<br />
<br />
以下の方法でこの動作を停止できる。

<h3>設定方法</h3>

<ol>
<li>ロケーションバーに <strong>about:config</strong> と入力。</li>
<li>フィルタに <strong>browser.fixup.alternate.enabled</strong> と入力。</li>
<li>browser.fixup.alternate.enabled をダブルクリックし、値を true から <strong>false</strong> に変更する。</li>
</ol>

<h3>参考文献</h3>

<a href="http://rolfje.wordpress.com/2008/05/06/no-more-wwwlocalhostcom/">No more www.localhost.com</a>]]>
        
    </content>
</entry>

<entry>
    <title>Linux への Maven2 のインストール手順</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2010/12/install-maven2-to-linux.html" />
    <id>tag:trasis.jp,2010:/blog/lab//2.249</id>

    <published>2010-12-28T11:28:45Z</published>
    <updated>2010-12-28T11:31:14Z</updated>

    <summary>概要 前回 は Jpackage の rpm を使ってインストールする手順を解説...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>概要</h3>

<a href="http://trasis.jp/blog/lab/2010/12/linux%E3%81%ABmaven2%E3%82%92rpm%E3%81%A7%E3%82%A4%E3%83%B3.html">前回</a> は Jpackage の rpm を使ってインストールする手順を解説しました。<br />
今回は rpm を使わず最新版の Maven をインストールする手順について説明します。<br />
<br />
rpm でインストールする場合と比べ、以下の利点があります。

<ul>
<li> インストールが簡単</li>
<li> 最新版の maven を導入できる</li>
<li> Java のバージョンに依存しない</li>
</ul>

<h3>導入手順</h3>

<h4>maven のインストール</h4>

<a href="http://maven.apache.org/download.html">Maven ダウンロードページ</a> から tar.gz ファイルをダウンロードします。<br />
以下では Maven 2.2.1 を例に挙げて手順を説明します。<br />

<br />
apache-maven-2.2.1-bin.tar.gz をダウンロードし、/opt/apache-maven-2.2.1 に展開します。

<div class="code2">
lftpget http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.1-bin.tar.gz<br />
tar zxf apache-maven-2.2.1-bin.tar.gz<br />
mv apache-maven-2.2.1 /opt/<br />
</div>

<h4>システム共通設定1 - プロファイル</h4>

/etc/profile.d/maven.sh を作成します。
<pre class="code2">
PATH=$PATH:/opt/apache-maven-2.2.1/bin
export M2_HOME=/opt/apache-maven-2.2.1
</pre>

/etc/profile.d/maven.csh を作成します。
<pre class="code2">
set path=( $path /opt/apache-maven-2.2.1/bin )
setenv M2_HOME /opt/apache-maven-2.2.1
</pre>

実行権限を設定します。
<pre class="code2">
cd /etc/profile.d/
chmod 755 maven.*
</pre>

<h4>システム共通設定1 - 共通リポジトリ</h4>

デフォルトでは、各ユーザの ~/.m2/repository にリポジトリが作成されます。<br />
利用ユーザで共通の場所を利用するには /opt/apache-maven-2.2.1/conf/settings.xml を設定します。

<pre class="code2">
mv settings.xml settings.xml.default
vi settings.xml
</pre>

settings.xml を以下のように設定します。

<pre class="code2">
<settings>
  <localRepository>/var/maven2/repository</localRepository>
</settings>
</pre>

ディレクトリを作成します。
<pre class="code2">
mkdir -p /var/maven2/repository
chmod 2777 /var/maven2/repository
</pre>
]]>
        
    </content>
</entry>

<entry>
    <title>Hibernate で一時的に二次キャッシュを利用せずにエンティティを追加する</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2010/12/disable-hibernate-second-cache-temporarily.html" />
    <id>tag:trasis.jp,2010:/blog/lab//2.248</id>

    <published>2010-12-28T10:56:55Z</published>
    <updated>2010-12-28T11:04:19Z</updated>

    <summary>概要 JPA(EntityManager) + Hibernate + Ehca...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>概要</h3>

JPA(EntityManager) + Hibernate + Ehcache(二次キャッシュ) + Seasar2 の組み合わせで利用しているとき、<strong>二次キャッシュを利用せずにエンティティを生成 (insert) する方法</strong>について解説します。<br />

<h4>想定するケース</h4>

<ul>
<li> Ehcache を使い、マルチキャストにより LAN 内で二次キャッシュを共有している。</li>
<li> あるエンティティは @Cache アノテーションにより、二次キャッシュを利用している。</li>
<li> <b>大量にそのエンティティを追加するときは二次キャッシュを利用したくない。</b></li>
</ul>

この場合、最も簡単かつ推奨する方法は
<ul>
<li>二次キャッシュを利用しない設定で構築した Web サーバまたはコマンドライン・プログラムを用意し、そこで処理を実行する。</li>
</ul>

ですが、なんらかの理由で二次キャッシュを利用した web サーバ上で処理を実行しなければならない場合、以下の手順で実現できます。<br />

<h3>設定手順</h3>

<h4>META-INF/persistence.xml に記述を追加</h4>

META-INF/persistence.xml で既存の persistenceUnit タグをコピーし、二次キャッシュを利用しない設定を行います。

<textarea name="code" class="xml">
	<persistence-unit name="db1nocache_persistenceUnit" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>jdbc/dataSource</jta-data-source>

		<class>sample.entity.Shop</class>

		<exclude-unlisted-classes>true</exclude-unlisted-classes>

		<properties>
			<property name="hibernate.jndi.class" value="org.seasar.extension.j2ee.JndiContextFactory"/>
			<property name="hibernate.transaction.manager_lookup_class"
				value="org.seasar.hibernate.jpa.transaction.SingletonTransactionManagerProxyLookup"/>

			<property name="hibernate.cache.use_query_cache"	value="false" />
			<property name="hibernate.cache.use_second_level_cache"	value="false" />
		</properties>
	</persistence-unit>
</textarea>

具体的には、以下の修正を行います。
<ul>
<li> persistence-unit タグの name 属性を db1nocache_persistenceUnit のような名前に変更してください。</li>
<li> 利用するエンティティを明示的に class タグで宣言してください。中で別のエンティティを参照している場合、それらもすべて宣言する必要があります。</li>
<li> hibernate.cache.use_query_cache を false に設定。</li>
<li> hibernate.cache.use_second_level_cache を false に設定。</li>
</ul>

<h4>jpa_nocache.dicon を作成</h4>

<textarea name="code" class="xml">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="s2hibernate-jpa.dicon"/>

	<component name="db1nocache_persistenceUnitProvider" class="org.seasar.framework.jpa.impl.ContainerPersistenceUnitProvider">
		<property name="unitName">"db1nocache_persistenceUnit"</property>
		<property name="properties">
			#{
				"hibernate.dialect" : "org.hibernate.dialect.PostgreSQLDialect",
				"hibernate.show_sql" : "false",
				"hibernate.hbm2ddl.auto" : "none"
			}
		</property>
	</component>

	<component name="db1nocache_entityManagerFactory" class="javax.persistence.EntityManagerFactory">
		db1nocache_persistenceUnitProvider.entityManagerFactory
	</component>
	<component name="db1nocache_entityManager" class="org.seasar.framework.jpa.impl.TxScopedEntityManagerProxy"/>
</components>
</textarea>

<h4>jpa.dicon から jpa_nocache.dicon を呼び出す</h4>

jpa.dicon の components タグの後ろに、次の記述を追加します。

<pre class="code">
	<include path="jpa_nocache.dicon"/>
</pre>

<h3>利用手順</h3>

Service クラスの中で次のように利用します。

<textarea name="code" class="java">
public class TestService {
	@Binding(value = "db1nocache_entityManager")
	private EntityManager nocacheEntityManager;

	@RequiredTx
	public void exec() throws IOException {
		Shop shop = new Shop();
		
		// shop エンティティの設定
		...

		nocacheEntityManager.persist(genre);
	}
}
</textarea>
]]>
        
    </content>
</entry>

<entry>
    <title>Linuxにmaven2をrpmでインストールする</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2010/12/linuxにmaven2をrpmでイン.html" />
    <id>tag:trasis.jp,2010:/blog/lab//2.247</id>

    <published>2010-12-28T03:42:00Z</published>
    <updated>2010-12-28T11:36:11Z</updated>

    <summary>概要 CentOS 5 (x64) に maven2 を JPackage の ...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>概要</h3>

CentOS 5 (x64) に maven2 を JPackage の rpm でインストールする手順について説明します。<br />
ただし、こちらの <a href="http://trasis.jp/blog/lab/2010/12/install-maven2-to-linux.html">Linux への Maven2 のインストール手順</a> による導入を推奨します。<br />
<br />
JPackage 環境が必要な方は、以下の手順をご参考ください。

<h3>インストール前の注意事項</h3>

<ul>
<li> JDK は <b>1.6.0 Update 3 (x86)</b> をインストールします。x64 版や最新の Update には対応しません。</li>
</ul>

<h3>インストール手順</h3>

<h4>/etc/yum.repos.d/CentOS-Base.repo 修正</h4>

[base] の項目に以下の行を追加します。

<div class="code2">
exclude=java-1.4.2-gcj-compat jakarta-commons-collections mx4j eclipse-ecj xml-commons-resolver
</div>

<h4>/etc/yum.repos.d/jpackage.repo 作成</h4>

まず /etc/yum.repos.d/jpackage.repo を作成。

<pre class="code2">
[jpackage-5.0-free]
name=JPackage 5.0 free
baseurl=ftp://ftp.riken.jp/Linux/jpackage/5.0/generic/free
enabled=1

[jpackage-5.0-nonfree]
name=JPackage 5.0 nonfree
baseurl=ftp://ftp.riken.jp/Linux/jpackage/5.0/generic/non-free
enabled=1
</pre>

<h4>jdk インストール</h4>

<a href="http://java.sun.com/products/archive/j2se/6u3/index.html">Oracle の Java ダウンロードページ</a> から JDK 6u3 をダウンロードします。<br />
Platform　は <b>Linux</b> を選択すること。 Linux x64 を選択しないように注意。<br />
<br />
jdk-6u3-linux-i586-rpm.bin をダウンロードし、インストールします。<br />
<br />
<b>実行例</b><br />

<pre class="code2">
lftpget 'http://cds.sun.com/is-bin/.../jdk-6u3-linux-i586-rpm.bin'
sh dk-6u3-linux-i586-rpm.bin
</pre>

<h4>maven2 インストール</h4>

<pre class="code2">
yum install maven2
</pre>

<h4>maven2 のグローバル設定</h4>

サーバ共通の設定ファイルは /usr/share/maven2/conf/settings.xml にあります。<br />
<br />
例えば、サーバ共通でリポジトリを持たせる場合は、次のように設定を行います。

<pre class="code2">
<settings>
  <localRepository>/var/maven2/repo</localRepository>
</settings>
</pre>


さらに、次のようにディレクトリを作成。
<pre class="code2">
mkdir -p /var/maven2/repo
chmod 2777 /var/maven2/repo
</pre>


これで mvn コマンドが利用できるようになります。<br />

<h3>epel リポジトリ利用時の注意</h3>

Fedora の EPEL リポジトリを使用している場合は、次のように exclude 行を追加してください。

<pre class="code2">
exclude=bea-stax bea-stax-api
</pre>
]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQLでテーブルのファイルサイズを確認する</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2010/08/postgresql-check-table-filesize.html" />
    <id>tag:trasis.jp,2010:/blog/lab//2.180</id>

    <published>2010-08-12T07:04:49Z</published>
    <updated>2010-08-12T07:07:50Z</updated>

    <summary> SELECT   relname,   relkind,   to_char(...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<pre class="code2">
SELECT
  relname,
  relkind,
  to_char(reltuples, '999,999,999') as rows,
  to_char(pg_relation_size(relname), '999,999,999,999') as bytes
FROM pg_class
WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public')
order by bytes desc;
</pre>

<h2>参考</h2>

<a href="http://d.hatena.ne.jp/y-kawaz/20090226/1235623336">PostgreSQLでテーブルサイズを確認する</a> by y-kawaz<br />]]>
        
    </content>
</entry>

<entry>
    <title>StringBuilder に1文字追加する時の性能差</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2010/07/stringbuilder-append-performance.html" />
    <id>tag:trasis.jp,2010:/blog/lab//2.179</id>

    <published>2010-07-13T07:39:26Z</published>
    <updated>2010-07-13T07:47:32Z</updated>

    <summary> 概要 StringBuider で append() を使い１文字を追加すると...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[
<h2>概要</h2>

StringBuider で append() を使い１文字を追加するとき、<br />
<pre class="code2">
sb.append('\t');
</pre>
のように char 型を追加するときと<br />
<pre class="code2">
sb.append("\t");
</pre>

のように文字列型で追加するときに性能差を調査した。<br />
<p />

<h2>結果</h2>

<table class="mytable">
<tr>
	<th>追加データ</th><th>実行時間 [s]</th>
</tr>
<tr>
	<td>'\t'</td>
	<td>2.165</td>
</tr>
<tr>
	<td>"\t"</td>
	<td>7.788</td>
</tr>
</table>

<p />
１つの文字を追加する場合は、 char 型で追加したほうが文字列で追加するより 3.6 倍高速だった。<br />]]>
        
    </content>
</entry>

<entry>
    <title>PostreSQLでJavaのミリ秒をtimestamp型で取り出す</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2010/07/java-timeinmillis-to-timestamp.html" />
    <id>tag:trasis.jp,2010:/blog/lab//2.178</id>

    <published>2010-07-05T09:01:00Z</published>
    <updated>2010-07-05T09:15:01Z</updated>

    <summary>概要 PostgreSQL 上に作成したテーブルに対し、Java で時刻を ti...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql" label="postgresql" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tomcat" label="tomcat" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h2>概要</h2>

PostgreSQL 上に作成したテーブルに対し、Java で時刻を timestamp 型ではなくミリ秒(long 値)のまま格納した場合、それを select で timestamp 型として取り出すには以下のように SQL を記述する。

<pre class="code2">
SELECT
    (lastaccess / 1000) :: text :: interval + '1970-01-01' :: timestamp
FROM
    table1;
</pre>

lastaccess は bigint 型のカラム。これを1000分の1して秒単位にし、 epoch 秒（グリニッジ標準時間1970年1月1日00:00:00からの経過秒数）　に足している。

<h3>例: DB に格納された tomcat のセッションでサイズの大きいものを見つける</h3>

次のような SQL を実行する。

<pre class="code2">
SELECT
	length(data) as len,
	session_id,
	(lastaccess / 1000) :: text :: interval + '1970-01-01' :: timestamp
FROM
	tomcat_sessions
ORDER BY len desc
LIMIT 20;
</pre>]]>
        
    </content>
</entry>

<entry>
    <title>Windows7でEclipse利用時、ツリービューが自動スクロールするのを止める方法(64bit版でもOK!)</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2010/01/windows7-eclipse-disable-automatic-scrolling.html" />
    <id>tag:trasis.jp,2010:/blog/lab//2.173</id>

    <published>2010-01-19T08:45:05Z</published>
    <updated>2010-01-19T09:39:26Z</updated>

    <summary>概要 Windows7で Eclipse 3.3 を動作したときに「パッケージ・...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
    <category term="eclipse" label="eclipse" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="windows7" label="Windows7" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>概要</h3>

Windows7で Eclipse 3.3 を動作したときに「パッケージ・エクスプローラ」ビューが自動的に横スクロールするのを停止する方法について説明。<br />
32bit,  64 bit 環境の違いなく簡単に解決できるので便利。<br />
多分 Vista でも同じ方法で解決する。<br />
<br />

<h3>背景</h3>
Windows7(と Vista)でEclipseを利用時、イライラする現象がある。<br />
<br />
画面左側の「パッケージ・エクスプローラ」ツリービューにおいて、深いパッケージ階層にアクセスしている時に、<b>勝手に横スクロールする</b>。<br />
<br />
<img src="http://trasis.jp/blog/lab/2010/01/19/windows7-eclipse-1.png" /><br />
<br />
十分な横幅の画面で作業していれば、このビューを横に広げてこの問題を回避できるが...。<br />
<br />
この<b>新たな機能</b>は Windows Vista からツリービューに搭載されたものらしい。。。<br />
せめて挙動を選択できるようにして欲しかった。<br />
<br />

<h3>32bit ユーザなら Explorer Construction で!</h3>

<a href="http://chihiro718.jpn.org/JPN/software/help/ExpConst/option.htm">Explorer Construction</a>というツールを使うことで、この横スクロールを無効化できるらしい。<br />
<br />
ソフト起動後、「水平方向の自動スクロールを無効にする(A) 」にチェックを入れるだけ。<br />
残念ながら 64bit 環境では動作しない。本当に残念...。<br />
<br />

<h3>Windows 互換モードで実行することで 64bit でも解決!</h3>

しばらく探しまわって、やっと解決法を見つけた。 ⇒<a href="http://www.vistax64.com/vista-general/133849-disable-dynamic-horizontal-scrolling-vista.html">disable dynamic horizontal scrolling in Vista</a><br />
<br />
内容は簡単。「<b>Eclipse を Windows XP 互換モードで動かすだけ</b>」でした。<br />
<br />
Eclipse のショートカットを作成し、プロパティを表示。
「互換性」タブで「互換モードでこのプログラムを実行する」にチェックを入れ、
「Windows XP (Service Pack 3)」を選択するだけでよい。<br />
<br />
<img src="http://trasis.jp/blog/lab/2010/01/19/a.png" /><br />
<br />
この方法は Eclipse だけでなく他のアプリケーションでも適用できる。
]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQLで現在ロック中のプロセスの確認とkill</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2009/10/postgresql-kill-lock-process.html" />
    <id>tag:trasis.jp,2009:/blog/lab//2.122</id>

    <published>2009-10-16T01:27:33Z</published>
    <updated>2009-10-16T01:48:05Z</updated>

    <summary>概要 PostgreSQLの各プロセスがどのテーブルでどの種類のロックを行ってい...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>概要</h3>

PostgreSQLの各プロセスがどのテーブルでどの種類のロックを行っているか調べる方法について説明。<br />
<br />
さらに、そのプロセスを下記手順で終了することで、ロックしていた処理を強制的に中断できる。

<h3>手順</h3>

<h4>プロセスIDの確認</h4>

コマンドラインなどで、次のSQLを実行する。

<pre class="code2">
SELECT l.pid, db.datname, c.relname, l.locktype, l.mode
FROM pg_locks l
        LEFT JOIN pg_class c ON l.relation=c.relfilenode
        LEFT JOIN pg_database db ON l.database = db.oid
ORDER BY l.pid;
</pre>

pid がプロセスIDを意味する。

<h4>プロセスの停止</h4>

プロセスIDが分かったら、次のSQLでプロセスを停止できる。<br />

<pre class="code2">
SELECT pg_cancel_backend(<font color="red">プロセスID</font>);
</pre>
]]>
        
    </content>
</entry>

<entry>
    <title>snmpでtomcat メモリを監視 (Linux編)</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2009/08/snmpでtomcat-メモリを監視-linux編.html" />
    <id>tag:trasis.jp,2009:/blog/lab//2.106</id>

    <published>2009-08-05T04:02:06Z</published>
    <updated>2009-08-24T05:50:16Z</updated>

    <summary>概要 前回 は、Windows 上で起動した Java　プロセスを snmp で...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
        <category term="tomcat" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="snmp" label="snmp" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>概要</h3>

<a href="http://trasis.jp/blog/lab/2009/08/snmp%E3%81%A7java%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E7%9B%A3.html">前回</a> は、Windows 上で起動した Java　プロセスを snmp で監視する方法を説明した。<br />
<br />
今回は Linux 上で起動した Tomcat プロセスのメモリを監視する方法について説明する。<br />

<h4>動作環境</h4>

<table class="mytable"><tbody>
<tr>
	<th>項目</th><th>値</th>
</tr>
<tr>
	<td>OS</td>
	<td>CentOS 5</td>
</tr>
<tr>
	<td>Java</td>
	<td><a href="http://java.sun.com/javase/ja/6/download.html">JDK 6 update 10</a></td>
</tr>
<tr>
	<td>Tomcat</td>
	<td>6.0.20</td>
</tr>
</tbody></table>

<h3>tomcat 起動時の設定</h3>

Tomcat を起動する時の CATALINA_OPTS 変数に次の記述を追加する。<br />
例えば、/etc/tomcat6/tomcat6.conf で次のように記述する。<br />

<div class="code2">
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.snmp.port=1161 -Dcom.sun.management.snmp.acl.file=/etc/tomcat6/snmp.acl"
</div>

<h3>/etc/tomcat6/snmp.acl 作成</h3>

ファイルを作成する。

<pre class="code2">
acl = {
 {
   communities = public
   access = read-only
   managers = localhost
 }
}
</pre>

さらに、snmp.acl のパーミッションを 600 に変更する。<br />

<pre class="code2">
# chown roo:root snmp.acl
# chmod 600 snmp.acl
</pre>

ここまで設定が終わったら、Tomcat を起動する。

<div class="code2">
# service tomcat6 start
</div>

<h3>MIB ファイルを置く</h3>

/usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.mib を作成する。<br />

<div class="code2">
# cd /usr/share/snmp/mibs/<br />
# lftpget http://java.sun.com/j2se/1.5.0/docs/guide/management/JVM-MANAGEMENT-MIB.mib
</div>

<h3>/etc/snmp/snmp.conf 設定</h3>

次に snmpd の設定。このファイルの最後へ記述を追加する。

<div class="code2">
proxy -m /usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.txt -v 2c -c public localhost:1161 .1.3.6.1.4.1.42.2.145
</div>

記述を追加したら、snmpd を再起動する。
<div class="code2">
# service snmpd restart
</div>

<h3>動作確認</h3>

<div class="code2">
$ snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.42.2.145
</div>

<h4>出力結果をカスタマイズ</h4>

数字で構成される OID 値を文字列に変更できる。<br />
上記の手順で mib ファイルを snmpwalk を実行するホストに置いた後、次のように環境変数を設定する。<br />
.bashrc などに書いておくとよい。

<div class="code2">
$ export MIBS=ALL<br />
$ snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.42.2.145
</div>

<h3>参考</h3>

<ul>
<li><a href="http://www.gentoo-wiki.info/JVM_Monitoring_with_SNMP">
http://www.gentoo-wiki.info/JVM_Monitoring_with_SNMP</a></li>
<li><a href="http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/management/snmp.html">http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/management/snmp.html</a>
</ul>
]]>
        
    </content>
</entry>

<entry>
    <title>snmpでtomcatメモリを監視(Windows編)</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2009/08/snmpでjavaプロセスを監.html" />
    <id>tag:trasis.jp,2009:/blog/lab//2.105</id>

    <published>2009-08-04T03:13:20Z</published>
    <updated>2009-08-11T03:35:35Z</updated>

    <summary>概要 Javaでwebサイトを運用し、ある程度規模が大きくなってくるとメモリ管理...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="java" label="java" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="snmp" label="snmp" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>概要</h3>

Javaでwebサイトを運用し、ある程度規模が大きくなってくるとメモリ管理で悩まされる。<br />
安定、高速なwebサイトを目指すためにはメモリ関連のモニタリングとチューニングが必要になってくる。<br />
<br />
ガベージ・コレクション関連のログ出力設定を行う方法は簡単だが、nagios などで監視を行い、閾値に達したらアラート・メールで通知してくれると便利である。<br />
<br />
今回は Java の snmp 監視を有効にする設定手順について説明する。

<h4>開発環境</h4>

<table class="mytable">
<tbody><tr>
	<th>項目</th><th>値</th>
</tr>
<tr>
	<td>OS</td>
	<td>Windows XP Pro SP3</td>

</tr>
<tr>
	<td>IDE 環境</td>
	<td><a href="http://mergedoc.sourceforge.jp/index.html">Eclipse 3.4.1(Preiades All in One)</a></td>
</tr>
<tr>
	<td>Java</td>
	<td><a href="http://java.sun.com/javase/ja/6/download.html">JDK 6 update 10</a></td>
</tr>

</tbody></table>


<h3>Windows 環境での設定手順</h3>

<h4>概要</h4>

Windows 上で起動中の Eclipse から Java プログラムを起動し、そのプロセスを snmp で監視できるよう、設定を行う。

<h4>プログラム例</h4>

次のようなプログラムを作成した。

<pre class="code2">
public class Test {
	public static void main(String[] args) throws InterruptedException {
		int count = 0;
		
		for (;;) {
			Thread.sleep(1000);
		
			count++;
			System.out.println(count);
		}
	}
}
</pre>

とりあえず１回実行してみる。<br />
[実行] メニュー ⇒ 実行 ⇒ Java アプリケーション<br />
<img src="http://trasis.jp/blog/lab/2009/08/04/snmp-windows/1.PNG" />

<h4>起動オプション設定</h4>

1回実行した後、今度は実行構成を開く。<br />
[実行] メニュー ⇒ 実行構成<br />
<img src="http://trasis.jp/blog/lab/2009/08/04/snmp-windows/2.PNG" /><br />

<br />
[引数] タブを選択し、「VM引数」のところに次の文字列を入力する。
<div class="code2">
-Dcom.sun.management.snmp.port=161 -Dcom.sun.management.snmp.acl.file=c:/snmp.acl -Dcom.sun.management.config.file=c:/management.properties
</div>
<img src="http://trasis.jp/blog/lab/2009/08/04/snmp-windows/3.PNG" />

<h4>設定ファイルのコピー</h4>

次に、<code>C:\Program Files\Java\jre6\lib\management</code> の下にある、次の２つのファイルを C:\ にコピーする。
<ul>
 <li> management.properties</li>
 <li> snmp.acl.template</li>
</ul>

<code>snmp.acl.template</code> は snmp.acl に名前を変える。

<h4>設定ファイルの修正</h4>

<h5>c:\snmp.acl</h5>

ホスト 172.16.1.2 からコミュニティ名「public」で snmp 読み込みを受け付ける場合は、次のように記述する。

<pre class="code2">
   acl = {
     {
       communities = public
       access = read-only
       managers = 172.16.1.2
     }
    }
 </pre>

<h5>c:\management.properties</h5>

Java 起動時、デフォルト設定では localhost で 161 ポートを listen する。別のホストから snmp を受け付けるには、次のように Java プログラムを起動するホストの IP アドレスを設定する。

<pre class="code2">
com.sun.management.snmp.interface=172.16.1.3
</pre>

<h4>アクセス権の修正</h4>

エクスプローラで c:\snmp.acl 上で右クリック、[プロパティ] を選択する。<br />
<img src="http://trasis.jp/blog/lab/2009/08/04/snmp-windows/4.PNG" /><br />
<br />
[セキュリティ] タブを開き、[詳細設定] ボタンを押す。<br />
<br />
「子オブジェクトに適用するアクセス許可エントリを親から継承し、それらをここで明示的に定義されているものに含める」についているチェックを外す。<br />
<br />
「アクセス許可エントリ」から、自分の名前以外を全て削除する。<br />
Administrator や他のユーザからのアクセス権が残っていると、Java プログラム起動時に次のようなエラーメッセージが出てしまう。
<div class="code2" style="color: red; font-weight: bold">
エラー: パスワードファイルの読み取りアクセスは制限する必要があります。: c:/snmp.acl
</div>

<br />
これで準備完了。<br />
サンプルプログラムを起動したあと、snmp アクセスを許可したホスト(上記の例だと 172.16.1.2) から次のようにアクセスしてみる。

<pre class="code2">
$ snmpwalk -v 2c -c public 172.16.1.3 .1 -On | less
</pre>

次のような内容が出力される。

<pre class="code2">
.1.3.6.1.4.1.42.2.145.3.163.1.1.1.1.0 = Gauge32: 729
.1.3.6.1.4.1.42.2.145.3.163.1.1.1.4.0 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.1.0 = Gauge32: 0
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.2.0 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.3.0 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.2.1 = STRING: "CodeCacheManager"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.2.2 = STRING: "Copy"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.2.3 = STRING: "MarkSweepCompact"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.3.1 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.3.2 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.100.1.3.3 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.1 = STRING: "Code Cache"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.2 = STRING: "Eden Space"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.3 = STRING: "Survivor Space"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.4 = STRING: "Tenured Gen"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.5 = STRING: "Perm Gen"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.6 = STRING: "Perm Gen [shared-ro]"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.2.7 = STRING: "Perm Gen [shared-rw]"
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.1 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.2 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.3 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.4 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.5 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.6 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.3.7 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.1 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.2 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.3 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.4 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.5 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.6 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.4.7 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.1 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.2 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.3 = INTEGER: 1
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.4 = INTEGER: 2
.1.3.6.1.4.1.42.2.145.3.163.1.1.2.110.1.112.5 = INTEGER: 2
...
</pre>


なお、-v で指定する SNMP バージョンは 2c を指定する必要がある。<br />
1 だと、heap 値を取得できない。<br />

<h3>参考情報</h3>

Sun から提供されている以下のドキュメントを参考。
<ul>
<li> <a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/SNMP.html">SNMP Monitoring and Management</a></li>
<li> <a href="http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/management/security-windows.html">Windows 用のセキュリティ情報の詳細</li>
</ul>
]]>
        
    </content>
</entry>

<entry>
    <title>DSR(Direct Server Return)メモ</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2009/06/direct-server-return.html" />
    <id>tag:trasis.jp,2009:/blog/lab//2.101</id>

    <published>2009-06-02T17:03:12Z</published>
    <updated>2009-06-02T17:22:17Z</updated>

    <summary>概要 BIG-IP + Linux 2台(CentOS 5) で DSR(Dir...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
        <category term="ネットワーキング" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dsr" label="DSR" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h2>概要</h2>

BIG-IP + Linux 2台(CentOS 5) で DSR(Direct Server Retrun) 構成を行ったときの設定メモ。<br />

<h2>DSRとは</h2>

<a href="http://nosa.cocolog-nifty.com/sanonosa/2004/11/l4dsr.html">こちらの記事</a>が分かりやすい。<br />
この記事にあるように、このままだと　mac アドレスがあちこちにキャッシュされてしまい、いろいろ問題が出て少々やっかいだった。<br />
<br />
次のように iptables と組み合わることで、簡単にこの問題を解決できる。

<h2>バックエンド設定</h2>

Linux サーバの /etc/sysconfig/iptables に対し、次の設定を行う。

<pre class="code2">
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

COMMIT

# =================================================================
*nat

-A PREROUTING -p tcp -d 172.16.100.1 -j REDIRECT

COMMIT
</pre>

172.16.100.1 はロードバランサで設定した VIP アドレス。<br />

]]>
        
    </content>
</entry>

<entry>
    <title>seasar2+hibernate+JPA(1.0)環境における悲観的ロック</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2009/05/jpa10における悲観的ロック.html" />
    <id>tag:trasis.jp,2009:/blog/lab//2.97</id>

    <published>2009-05-18T16:37:08Z</published>
    <updated>2009-05-18T17:50:08Z</updated>

    <summary>背景 - ロック手法について データベース更新時のロックの方法として、次の２種類...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="hibernate" label="hibernate" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jpa" label="jpa" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="seasar2" label="seasar2" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>背景 - ロック手法について</h3>

データベース更新時のロックの方法として、次の２種類が存在する。

<ul>
<li> 悲観的ロック (Pessimistic lock)</li>
<li> 楽観的ロック (Optimistic lock)</li>
</ul>

<b>悲観的ロック</b>は、更新対象を更新完了までロックし、他の人が更新を行ったり、場合によっては参照も禁止する方法。<br />
データをより安全に更新・参照できるメリットがあるが、ロック待ちによるアプリケーションの性能低下要因となりやすい。<br />
<br />
<b>楽観的ロック</b>は「自分が操作している情報は他人が同時に更新する可能性が低い」更新を行うのに向いたロック方法。<br />
更新対象を本当に更新する段階までぎりぎりまでロックしない。<br />
<br />
例えば、「一旦データを取得したあと、内容を変更して実際に変更しようとしたら、データ取得後に誰かが同じレコードを更新していた」というケースの場合、悲観的ロックであれば「データ取得時に行ロックを行い、誰も更新できない状況」を作ってから更新を行う。その間、他の更新処理は自分の処理が完了するまで待ち状態となる。<br />
一方、楽観的ロックであれば、自分がデータ取得後に他人がデータを更新できてしまう。自分がその後に更新しようとすると JPA 利用時、 OptimisticLockException が発生する。<br />

<h3>概要</h3>

JPA(Java Persistence API) 1.0では楽観的ロックのみサポートしている。2.0 からは悲観的ロックもサポートするらしい。<br />
<br />
Seasar2 + Hibernate + JPA 1.0 の構成において悲観的ロックでデータを更新したいと思い試行錯誤したが、意外とつまづいた。<br />
EntityManager に lock() というメソッドがあって、write lock もできそうだが、うまくいかない。seasar がサポートしていないのか、設定がうまくいっていないのか...<br />
<br />
結局、以下の方法で実現できた。

<h3>悲観的ロックによる更新方法</h3>

次のようなコードになる。

<pre name="code" class="java">
package jp.trasis.sample.service;

import javax.persistence.EntityManager;

import jp.trasis.sample.entity.User;

import org.seasar.extension.tx.annotation.RequiresNewTx;
import org.seasar.framework.container.annotation.tiger.Binding;

public class TestService {
	@Binding
	private EntityManager entityManager;
	
	@RequiresNewTx
	public void test(Long userId, String name) {
		User user = (User) entityManager.createNativeQuery(
				"select * from User_ where id=:userId for update", User.class)
			.setParameter("userId", userId)
			.getSingleResult();
		
		user.setName(name);

		entityManager.persist(user);
	}
}
</pre>

<h4>解説</h4>

@RequiresNewTx アノテーションにより、新たなトランザクションの中で更新処理を行う。<br />
<br />
まず、更新対象のエンティティを <b>select ... for update</b> により、行ロックを行いながら取得する。<br />
この SQL は createNativeQuery() メソッドで実行する必要がある。crateQuery() で使用する HQL では、 for update 文は利用できない。<br />
<br />
そしてエンティティに対して修正を行い、 persist() でコミットを行う。メソッドを抜けるときに実際に DB へのコミット処理が行われ、トランザクションが終了し、ロックも開放される。]]>
        
    </content>
</entry>

<entry>
    <title>Eclipseで.jsファイルに日本語文字を使うと文字化けする問題の回避方法</title>
    <link rel="alternate" type="text/html" href="http://trasis.jp/blog/lab/2009/04/eclipseでjsファイルに日.html" />
    <id>tag:trasis.jp,2009:/blog/lab//2.96</id>

    <published>2009-04-07T11:56:01Z</published>
    <updated>2009-04-08T01:10:56Z</updated>

    <summary>概要 Eclispe 上で JavaScript(.js) ファイルに日本語を使...</summary>
    <author>
        <name>馬原賢吉</name>
        
    </author>
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="eclipse" label="eclipse" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://trasis.jp/blog/lab/">
        <![CDATA[<h3>概要</h3>

Eclispe 上で JavaScript(.js) ファイルに日本語を使うと、保存できなかったり、再度開くと文字化けしたりする。<br />
<a href="http://tockri.blog78.fc2.com/blog-entry-76.html" ref="nofollow">こちらのブログ記事</a> に、その対策方法が記載されている。<br />
<br />
このブログによると、Eclipse に次の設定を行うことで解決できる。

<h3>動作確認環境</h3>

<table class="mytable">
<tr><th>項目</th><th>内容</th></tr>
<tr><td>Eclipse バージョン</td><td>3.3.2<br />3.4.1</td></tr>
</table>

<h3>設定手順</h3>

エクスプローラで、次のファイルを編集する。
<pre class="code2">
workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.core.runtime.prefs
</pre>

<br />
次の内容を記述して Eclipse を再起動。
<pre class="code2">
content-types/org.eclipse.wst.javascript.core.javascriptsource/charset=
</pre>

<h3>プロジェクトごとに設定できるか？</h3>

複数人で開発しているときは、全員にこの設定をしてもらわないといけないし、Eclipse を新たなPCにインストールしたときも、この設定を行わないといけないので面倒...<br />
<br />
ということで、プロジェクトにこの設定を行うことができるかどうかを試した。<br />
結論は、残念ながら<b>できない</b>。<br />
<br />
プロジェクト直下にある .setting フォルダに org.eclipse.core.runtime.prefs ファイルを作成し、上記の記述を行ってみたが、反映されなかった。<br />
<br />
<a href="http://mergedoc.sourceforge.jp/">Eclipse Pleiades All-in-one</a> で対応してくれたらいいな...<br />
]]>
        
    </content>
</entry>

</feed>

