2008年3月アーカイブ

概要

robots.txtにsitemap.xmlを記述してSEO対策」 で作成したサイトマップ・ファイル sitemap.xml を検索エンジンのクローラーに参照してもらい、効率よくサイト内を巡回してもらえる。

肝心の sitemap.xml は MovableType や MTOS なら自動生成できる。
MovableType で Google Sitemap に対応する」にて sitemap.xml 自動生成に成功した。
その後、sitemap.xml をカスタマイズし、最終的に次の内容になった。

sitemap.xml の作成手順

  • MTOS の管理画面から [デザイン] → [テンプレート] を選択する。
  • 「インデックステンプレートを作成」をクリックする。
  • タイトルに「sitemap.xml」と入力する。
  • 内容に次の内容を入力する。
  • 出力ファイル名に「sitemap.xml」と入力する。
  • [保存] ボタンを押す。

最後に

MovableType(MTOS) で sitemap.xml を自動生成し、robots.txt と組み合わせることで、安価に効果の高いSEO対策を実施できる。

概要

jconsoleで Windows PC から Linux サーバ上で稼動している Tomcat サーバに対して接続し、リソース使用状態を監視する方法についてまとめた。

このjconsole、「接続しようとしても接続できない」という問題に結構出会う。
しかも「何が問題か」を教えてくれない。
以前にもこの現象に出会って時間を取られてしまったにもかかわらず、メモを残していなかったので、また調査するはめに...orz

無駄な時間を今後費やすことがないよう、自分が出会ったトラブルについてまとめた。

jconsoleとは

Sun JDK 6 の中には、コンパイラ javac の他にも、いくつか役に立つツールが含まれている。
jconsole は、Java プログラムに対し、次のような情報を得ることができる。
  • パフォーマンス情報
  • メモリの使用状態
  • 稼働中のスレッドに関する情報
  • JMX
リモートのホスト上のプログラムの監視も行える。

Sun による解説ページはこちら

Javaサーバが稼動するホストにおける準備

まず、hostname -i を実行する。127.0.0.1 が返ってきた場合、まずこれを解決する必要がある。
# hostname -i
127.0.0.1

/etc/hosts を修正する

127.0.0.1 が返ってくる場合、/etc/hosts を見ると、おそらく次のように記述されていると思う。
# cat /etc/hosts
127.0.0.1       localhost foo.bar.jp
これを、次のように修正する。foo.bar.jp に対し、このホストのIPアドレスを記述する。
# cat /etc/hosts
127.0.0.1       localhost
192.168.1.2   foo.bar.jp
再度、hostname -i を実行して確認し、ホストのIPアドレスが返ってきたらOK。
# hostname -i
192.168.1.2

ホストに複数のIPアドレスが設定されている場合は?

例えば1つのホストにローカルIPとグローバルIPのように2つが設定されているようなケースでは、「管理用PCから接続するときの IPアドレス」が hostname -i で返ってこなければならない。

Javaサーバの起動スクリプトの修正

tomcat を起動するときの Java のパラメータに、次のオプションを追加する。
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=7900
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

Fedora 8 の場合

Fedora 8(F8) に対し rpm で tomcat5 をインストールした場合、起動時パラメータの修正は/etc/tomcat5/tomcat5.conf で行う。

例えば、ファイルの最後尾に次の記述を追加する。
改行せず、1行につなげる
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
        -Dcom.sun.management.jmxremote.port=7900
        -Dcom.sun.management.jmxremote.ssl=false
        -Dcom.sun.management.jmxremote.authenticate=false"

設定後、tomcat を起動する。
# service tomcat start

ファイアウォールに穴をあける

例えば、Java サーバに iptables でパケット・フィルタリングを実施している場合、「管理PCから jmx ポートへのアクセスを許可」の設定を行う必要がある。

ここで注意しなければならないのが、この機能では次の2つのポートを空ける必要があること。
  • com.sun.management.jmxremote.port で指定したポート (上記例では 7900)
  • そのポート~65535
したがって、例えば管理PC 192.168.1.100 が tomcat サーバのホスト 192.168.1.2 に jconsole で接続する場合、 192.168.1.2 上の /etc/sysconfig/iptables に次のような記述を加える。
改行せず、1行につなげる
-A RH-Firewall-1-INPUT -m state --state NEW 
               -m tcp -p tcp -s 192.168.1.100 --dport 7900:65535 -j ACCEPT
これで準備完了!

jconsole の使い方

Windows PC 上で jconsole.exe を起動する。jconsole.exe は次の場所にある。
C:\Program Files\Java\jdk1.6.0_05\bin
次の画面が表示されたら、

「リモートプロセス」のところに、192.168.1.2:7900 のようにホスト名とポート番号を入力し、[接続] ボタンを押す。

トラブルシューティングまとめ

jconsole でリモートの Java サーバに接続しようとしても接続できない時、次の点をチェックする。
  1. サーバ側で hostname -i を実行したときに表示される IP アドレスは、 jconsole で接続しにいくときと同じ IP アドレスか。
    • /etc/hosts を修正する。
    • ホスト名を変更する場合は、次の手順で行う。
      # hostname
      foo.bar.jp (現在のホスト名が表示される)
      
      # hostname -i
      200.100.50.25   このホストの eth0 の IPアドレスが表示される
      
      # hostname foo.bar.local    ホスト名を変更する
      
      # hostname
      foo.bar.local
      
      # hostname -i
      192.168.1.2     このホストの eth1 の IPアドレスが表示される
      

      tomcat 起動後に /etc/hosts を修正したときは、tomcat を再起動すること。
  2. ファイアウォールで適切なポート番号を空けているか。

接続時にパスワードを要求するには?

java 起動時オプションから -Dcom.sun.management.jmxremote.authenticate=false を削除する。

次に、サーバ上で次の作業を行う。
# cd  /usr/java/default/jre/lib/management
# less jmxremote.access
ユーザ名 monitorRole に対し、readonly の権限が付与されている。
このユーザに対し、パスワードを設定する。

# cp jmxremote.password.template jmxremote.password
# vi jmxremote.password
最後尾に次のようにパスワードを設定する。

プレインテキストであるため、普段使っているパスワードを使用しないこと!
monitorRole hogehoge

# chmod 600 jmxremote.password
# chown tomcat jmxremote.password
なお、jdk を rpm でアップグレードした際、この辺りの修正は引き継がれないので、その際は忘れずにチェックすること。
または、JAVA 起動時のオプションにて、管理ファイルやパスワードファイルのありかを指定できる。 詳細は Sun の解説ページ を参照のこと。

robots.txtとは?

google, Yahoo! などロボット型検索エンジンに対し、サイトの巡回方法を指示できる。
通常、次のような用途で利用する。
  • 検索エンジンに登録して欲しくないディレクトリ階層を指定する。
    例: /cgi-bin, /member-only/
  • サーバに高負荷をかける CGI を実行しないようにする。
また、SEO 対策として ページの存在を効率よく検索エンジンのロボット(クローラー)に通知するためにも利用できる。

robots.txtの書き方

下記内容のファイルを作成し、 サイトのトップ・ディレクトリに置く(例: http://foo.jp/robots.txt)。

全ての検索エンジンに対し、全ての URL への巡回を許可する

User-agent: *
Disallow:

特定のディレクトリへの巡回を拒否する

User-agent: *
Disallow: /cgi-bin/

robots.txt にサイトマップを記述する

sitemap.xml を作成したら、robots.txt に場所を記述しておく。
sitemap.xml が複数存在する場合は、複数記述する。
User-agent: *
Sitemap: http://trasis.jp/sitemap.xml
Sitemap: http://trasis.jp/blog/lab/sitemap.xml
Disallow:

robots.txt のテスト方法

Google ウェブマスターツール を使って、正しく動作するかどうかをテストできる。
間違えて記述したために、全てのページが巡回されなくなったなどのミスが起きるのは避けたい。

使い方
  • 「運用ツール」の「robots.txtを解析」をクリックする。
  • 「次のファイルのテキスト」のところに、robots.txt の内容をコピー&ペーストする。
  • 「この robots.txt ファイルに対して URL をテスト」のところに、自サイトの URL をいくつか入力してみる。
  • [テスト] ボタンを押す。

参考URL

次のような用途で利用できるバックアップ方法について調査した。
  • データベースの種類を変更したい。例えば PostgreSQL から MySQL へ。
  • MySQL において、文字コードを変更してデータベースを作り直したい。
  • MySQL や MediaWIki のバージョンが変わってデータ形式などに変更があった際にも、正しくリストアできるようにしたい。

汎用的なバックアップ方法。しかし...

MySQL であれば、次のコマンドでバックアップを実施できる。
# mysqldump wikidb > wikidb.2008-03-25.sql
MySQL や MediaWiki の文字コードを気にせずに MediaWiki の初期設定を完了して利用し続けた場合、画面上では特に問題なく使えるが、検索がうまくいかない

また、上記の手順でバックアップした SQL を見てみると、日本語の文章が怪しげな文字化け状態で記録されている。これでは、将来正常にリストアできるか不安である。
例えば、特定の文字のときにリストア失敗しないだろうか?

MediaWiki データを XML 形式でダンプする

MediaWiki には、データを XML 形式でダンプする方法が提供されている。
これにより、データベースの種類やバージョンにかかわらず復元が可能になる。

バックアップ手順

# cd /var/www/mediawiki
# php maintenance/dumpBackup.php --full > 2008-03-25.sql

リストア手順

# cd /var/www/mediawiki
# php maintenance/importDump.php 2008-03-25.sql

参考URL

tomcatでDB接続

| | コメント(0) | トラックバック(0)
Windows 環境において、tomcat で PostgreSQL に JNDI 経由で接続する手順をまとめた。

導入環境
tomcat インストールディレクトリ c:/usr/apache-tomcat-5.5.25
webapp ディレクトリ /home/webapps/test/WebContent
webapp を公開するパス /test

1. postgresql jdbc ドライバのインストール

  • PostgreSQL JDBC ドライバのダウンロードサイト から、使用している PostgreSQL サーバと同じバージョンの JDBC ドライバをダウンロードする。
    自分の場合は postgresql-8.2-508.jdbc4.jar をダウンロードした。
  • postgresql-8.2-508.jdbc4.jar を C:\usr\apache-tomcat-5.5.25\common\lib\ に置く。

2. context.xml 設定

apache-tomcat-5.5.25/conf/Catalina/localhost/test.xml を、次のような内容で作成する。

Eclipse All-In-One での設定方法

Eclipse All-In-One を使っている場合、プロジェクトのプロパティの「Tomcat」を開き、「その他の情報」のところへ次のように入力するとよい。

3. web.xml 設定

/home/webapps/test/WebContent/web.xml に次の記述を追加する。

4. プログラムからの呼び出し

MTOSまとめ

| | コメント(0) | トラックバック(0)
MTOS(MovableType Open Source) をしばらく使ってきて、これまで分かったことをまとめ。

MTOSとは

MovableType のコア部分が、GPL として公開された。
シックス・アパート社は、MTOS と同等のコアをベースに、ビジネスニーズを満たす商用パッケージを開発していく。

詳細はこちらが詳しい。

商用利用可能か?

可能。MTOSの利用やインストール作業で対価を得てよい。

GPLなので、ソースを改変した物を組織外・他人に使ってもらう場合は、ソース公開の義務が発生。
例えば、次のようなパッチを公開する。

日本語対応状況

MTOSのダウンロードページから英語版(MTOS-4.1-en.zip)をダウンロードできるが、初回インストール時の画面が英語である他は、完全に日本語対応している。

日本語版ダウンロード

こちらに日本語版が用意されている。MTOS-XXX-ja.zip をダウンロードする。
インストール画面が英語で分からなかった人にオススメ。

MTOSの特徴

mod_fcgid 対応
管理画面(mt.cgi)や検索機能(mt-search.cgi)の高速化に mod_fcgid を使える。というより、これを使わないと遅くて自分には耐えられない。
php対応(ダイナミック・パブリッシング機能)
ブログ記事作成時に再構築をせずに済む。
ブログ設定で「すべてのテンプレートをダイナミックに構築する」を選択する。
他、自分が気に入った特徴:

記事作成すると、短時間で google に反映される。
ブログ設定で「更新通知」のところの「google」にチェックを入れるだけでよいので、初心者でもこの機能を利用しやすくなっている。
反映にかかる時間は5分くらい?
Yahoo! など他の検索サイトはデフォルトで列挙されていないので、自分で ping リストを追加する。

自分の ping リスト(2008-04-01)
http://ping.ask.jp/xmlrpc.m
http://ping.namaan.net/rpc/
http://ping.blo.gs/
http://rpc.blogrolling.com/pinger/
http://api.my.yahoo.co.jp/RPC2
http://blog.goo.ne.jp/XMLRPC
http://ping.bloggers.jp/rpc/
http://ping.blogoon.net/
http://ping.blog360.jp/rpc
http://ping.namaan.net/rpc/
http://ping.myblog.jp
http://ping.rss.drecom.jp
http://ping.fc2.com
http://ping.ask.jp/xmlrpc.m
http://rpc.reader.livedoor.com/ping
http://r.hatena.ne.jp/rpc
http://blogsearch.google.co.jp/ping/RPC2
http://ping.rss.drecom.jp/

SEO対応

検索エンジン対策という点では、次の機能をサポートしている。
ping 送信機能
記事タイトルを URL に持ってくる
標準では英数字のみ対応。
パッチをあてると、日本語対応できる。

環境構築時のメモ

  • 自分が mysql に熟達していないせいかもしれないけど、mod_fcgid と組み合わせている際、ときどき管理画面が文字化けしてしまう。

    /etc/my.conf に次の記述を追加する。
    default-character-set = utf8
    skip-character-set-client-handshake
    

    postgresql を利用した方が、文字化けトラブルを回避できたかもしれない。

概要

聞くところによると、SEO対策でURLに日本語でキーワードを含めるのがはやっているとか。
そこで、MTOS(MovableType Open Source) でそれができるかどうか試してみた。
ちょっとファイルを修正すると実現できた。

修正箇所

MTOS-4.1-ja を次のように修正した。
diff -r MTOS.orig/lib/MT/Util.pm MTOS/lib/MT/Util.pm
609c609
<     $s = xliterate_utf8($s);      ## convert two-byte UTF-8 chars to 7bit ASCII
---
>     #$s = xliterate_utf8($s);      ## convert two-byte UTF-8 chars to 7bit ASCII
613c613
<     $s =~ s![^\w\s]!!gs;          ## remove non-word/space chars.
---
>     $s =~ s![^\w\s\x80-\xff]!!gs;          ## remove non-word/space chars.
diff -r MTOS.orig/mt-static/mt.js MTOS/mt-static/mt.js
958c958
<     s = s.replace(/[^-a-z0-9_ ]/g, '');
---
>     s = s.replace(/[^-a-z0-9_ \u3041-\u30ff\u4e00-\u9fbb]/g, '');
MTOS 4.1 でブログ記事を書くとき、「本文」タブの横に「続き」タブがある。
ブログ記事一覧には本文が表示され、「続きを読む」リンクをクリックすると、続きを含めた全文を読むことができる。

ところが、ブログ記事作成時のフォーマットを「なし」にしているにもかかわらず、「続き」にhtmlで文章を入力すると、各行に勝手に <br /> タグが挿入されてしまう。
テーブルを表示したいときなどに、これでは困る。

解決方法

  1. 「デザイン」メニューの「テンプレート」にアクセスし、画面右側の「テンプレートモジュール」をクリックする。
  2. 「ブログ記事の詳細」をクリックする
  3. 12行目付近の convert_breaks="0" を取る。
    修正前
    修正後
今年購入したYAMAHA のルータ rt58i の機能一覧を眺めていたら、PPTP なる機能が搭載されていた。

何ができるか?

Windows XP マシンから自宅のルータに接続し、VPN 接続で家庭内LAN に接続できる。
Windows XP SP2 には PPTP クライアント機能が標準で搭載されており、PPTP対応ルータがあれば、追加ソフトウェアを購入せず、無料で利用できる。

任意の場所からアクセスできるようにする設定

  1. rt58i の管理ページにアクセスし、[詳細設定と情報] → [VPN接続の設定] を開く
  2. 「設定可能なVPN設定」から空いている欄の[追加] ボタンを押す。
  3. 「PPTPを使用したパスワード認証のリモートアクセスVPNサーバ(Anonymous)」を選択して[次へ]ボタンを押す。
  4. 次の情報を入力する。
    項目内容
    PPTP暗号鍵生成の認証方式MS-CHAP v2で認証する
    ユーザID好きなID
    パスワード好きなパスワード

Windows XP からの接続方法

  1. [コントロールパネル] → [ネットワーク接続] を開き、[新しい接続ウィザード]を実行する。
  2. 「新しい接続ウィザード」ダイアログが起動するので、[次へ] ボタンを押す。
    /li>
  3. 「職場のネットワークへ接続する」を選択して [次へ] を押す。
  4. 「仮想プライベート ネットワーク接続」を選択して [次へ] を押す。
  5. 「会社名」に適当な名前を入力して [次へ] を押す。
  6. 接続先の IP アドレスを入力して [次へ] を押す。
  7. [完了] ボタンを押す。
  8. ユーザー名とパスワードを入力して [接続] ボタンを押す。

参考情報

背景

MTOS を mod_fcgid 上で動かすと高速化できるが、しばらくすると画面が文字化けしていた。
データベースは mysql 5.2.4 を使用している。

再現方法

# service httpd reload
# service mysql restart

原因

Apache 起動後しばらくするとデータベースとのコネクションが切れる。
その後再接続するときに、MovableType内部で「set names utf8」が実行されないため、発生する。

対策

/etc/my.conf に次の記述を追加した。
default-character-set = utf8
skip-character-set-client-handshake

考察

本当は mt-config.cgi やMTOSの修正で対策できるのが良かったが、うまくいかなかった。

mt-config.cgi に次の記述を追加するのは、効果がなかった。
SQLSetNames 1

また、lib/MT/ObjectDriver/Driver/DBD/mysql.pm の 72行目付近に次の行を追加したところ、DBから取得したデータ以外の画面上の日本語が文字化けした。
$dbd->{mysql_enable_utf8} = 1;
Visio を起動したときに、画面右側に表示されるテンプレートヘルプ。
邪魔だと思いつつ長い間放置していたが、検索してみたらあっさり解決。
次の手順で非表示にできる。

メニューから[ツール]
→[オプション]
→[全般]タブ
→右下の[サービス オプション]
→[Microsoft Office Online のコンテンツとリンクを表示する]チェックボックスをオフにする。

参考URL:
http://oshiete1.goo.ne.jp/qa2751105.html
標準でなぜかBase64のエンコーダ/デコーダを持たない Java では、複数の実装が存在する。

そこで、性能重視の実装で利用する際、どの実装が一番高速に動作するか調査した。

調査対象

Sun の Java 6 では、「使うべきでない」以下のクラスが標準でインストールされている。
これらのクラスを利用した場合、Java のバージョンや Sun 以外の VM には存在しない可能性があるので、通常、使用すべきではない。
  • (1) com.sun.org.apache.xerces.internal.impl.dv.util.Base64
  • (2) com.sun.org.apache.xml.internal.security.utils.Base64
  • (3) com.sun.xml.internal.messaging.saaj.util.Base64
  • (4) com.sun.xml.internal.ws.util.Base64Util (エンコーダのみ)
  • (5) sun.misc.BASE64Encoder
  • (6) com.sun.xml.internal.messaging.saaj.packaging.mime.util.BASE64EncoderStream
javamail 1.4.1 の mailapi.jar には Base64 実装が含まれている。
  • (7) com.sun.mail.util.BASE64EncoderStream
Commons Codec に Base64 実装が含まれている。
  • (8) org.apache.commons.codec.binary.Base64
これら8つの実装のエンコード/デコード性能を測定した。

実装方法に関する注意

エンコード方法とデコード方法に記述しているように、実装には最小限の実装である byte[] to byte[] 変換が可能なものと、「VGhlIH...」のように文字列にエンコード/デコードするものに分けられる。
byte[] to byte[] 変換のものはnew String(byte[]) で文字列に変換すれば、利便性の高い実装と結果は同じになるため、byte[] to byte[] 変換の方が、利用できる用途は広がる。

また、速度がほとんど代わらない場合、利用推奨されていない(1)~(6) ではなく、(7)か(8)を使うべきである。

実装番号 エンコード方法 デコード方法
(1) String Base64.encode(byte[]) byte[] Base64.decode(String)
(2) String Base64.encode(byte[]) byte[] Base64.decode(String)
(3) byte[] Base64.encode(byte[]) byte[] Base64.base64decode(String)
(4) String Base64Util.encode(byte[]) なし
(5) String new BASE64Encoder().encode(byte[]) byte[] new BASE64Decoder().decodeBuffer(String)
(6) byte[] BASE64EncoderStream.encode(byte[]) byte[] BASE64DecoderStream.decode(byte[])
(7) byte[] BASE64EncoderStream.encode(byte[]) byte[] BASE64DecoderStream.decode(byte[])
(8) byte[] Base64.encodeBase64(byte[]) byte[] Base64.decodeBase64(byte[])

測定方法

次のようなプログラムを作成。(1 の エンコードの例)
なお、与える文字列により実行時間が変わることが考えられるが、そこまで測定はしていない。

測定結果

実装番号 エンコード時間 デコード時間
(1) 2562 5047
(2) 2656 10594
(3) 1656 10828
(4) 9500 なし
(5) 79297 29985
(6) 1688 1844
(7) 1531 1781
(8) 2172 4156

(7) javamail の実装が最も高速に動作した。

javamail の base64 を使ったサンプル

Commons Digester は XML を Java bean にマッピングするツール。Apache Commons で提供されている。

具体的な使い方は こちらのサイト が詳しい。これを使って Yahoo! 検索 API を実装した。

Eclipse プロジェクトの作成

次のファイルをダウンロードし、Eclipse 3.3 でインポートする。
sample-yahoo-api.zip

Digester オブジェクトの作成

Yahoo! Web 検索 API は、検索結果を xml で返す。
Commons Digester を使えば、簡単に Java beans に変換できる。

次のように digester オブジェクトを作成する。

利用方法

Digester のえらいところは、URL を与えて直接 Java beans を生成できること。Yahoo! 検索 web API のように xml データを返す REST型 API を、より少ないコードで実装できる。
Web の世界は進歩が早すぎ。ここ数年、コンプライアンス体制構築などにかかりきりで Web やプログラム開発の世界から遠ざかっているうちに、 Web 2.0 やら SEO やら、分からない技術が増えてしまった。

まずは初心に帰って、ホームページやブログを構築。
(まだ中身がうすっぺらだけど)情報を掲載した際には必要としてくださる方々にそれを見てもらいたい
わけで、検索にひっかかるよう、SEO のお勉強。

その一環として、Google や Yahoo! がどのようにして、ユーザがどの検索結果をクリックしたのを検出しているのかを調査。
そして、調査結果を API としてまとめた。

API 作成

こういう感じで利用するものを作成。

Yahoo! も同様

Yahoo! API を使った検索

純粋に検索結果が欲しいなら、Yahoo! Developer Network で公開されている ウェブ検索Webサービス を使ったほうがいい。
他のクラスとインタフェースを合わせ、次のように検索できるようにした。 具体的なサンプルはこちら。
Commons Digester で Yahoo! 検索を行うサンプル

他の検索API

昔、google から検索 API が提供されていたが、2005年に終了してしまった。
http://code.google.com/apis/soapsearch/

代わりに、JavaScript から呼び出せる Google AJAX Search API が提供されている。 http://code.google.com/apis/ajaxsearch/

2010年12月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31