<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>bluegold</title>
	<atom:link href="http://blog.bluegold.me/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bluegold.me</link>
	<description>OpenSolaris と MacBook で自宅ネットワークを構築するメモ</description>
	<lastBuildDate>Thu, 10 Jun 2010 08:52:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>VisualStudio で IE8 をデバッグするには</title>
		<link>http://blog.bluegold.me/2010/06/howto-debug-activex-on-ie8/</link>
		<comments>http://blog.bluegold.me/2010/06/howto-debug-activex-on-ie8/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 08:51:45 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=464</guid>
		<description><![CDATA[IE8 上での開発でちょっとハマッタのでメモ
ActiveX や ToolBar(Browser Object) のデバッグを行うさいは、IE をデバッギー(debugee)としてVisual Studio からアタッチ [...]]]></description>
			<content:encoded><![CDATA[<h3>IE8 上での開発でちょっとハマッタのでメモ</h3>
<p>ActiveX や ToolBar(Browser Object) のデバッグを行うさいは、IE をデバッギー(debugee)としてVisual Studio からアタッチするのですが、今日久しぶりにやってみたら設定したブレークポイントで止まってくれません。</p>
<p>Visual Studio の設定ミスかと、しばらく試行錯誤しているうちに iexplore.exe のプロセスが複数いることに気がつきました。そこで、ようやく IE8 からタブごとに別プロセスで実行されることを思い出しました。</p>
<p>「じゃあ、自分がデバッグしたいプロセスを探してアタッチすれば。。。」と思ったのですが、毎回そんなことをやるのはさすがにめんどくさいので、<a href="http://www.google.co.jp/search?q=IE8+ActiveX+debugger+attach">Google先生に聞いてみました。</a>
<p>で、<a href="http://techblog.ranjanbanerji.com/post/2009/06/03/Debugging-Browser-Objects-(Toolbars)-in-Internet-Explorer-8-(IE8).aspx">このサイト</a>で解決策を発見。</p>
<p>IE8 がタブごとに独立したプロセスを生成しないようにレジストリの値を変更します。</p>
<ul>
<li>キー： HKCU\Software\Microsoft\Internet Explorer\Main</li>
<li>名前： TabProcGrowth (DWORD)</li>
<li>値： 0</li>
</ul>
<p>Windowsネタを書くのははじめてなのか。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/06/howto-debug-activex-on-ie8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snow Leopard で IP alias を設定する</title>
		<link>http://blog.bluegold.me/2010/06/configure-ip-alias-on-snow-leopard/</link>
		<comments>http://blog.bluegold.me/2010/06/configure-ip-alias-on-snow-leopard/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 01:57:32 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=450</guid>
		<description><![CDATA[
Snow Leopard でNICにIP aliasを設定する方法のメモ。
IP alias の追加

sudo ifconfig en0 alias 192.168.0.1 255.255.255.0

IP ali [...]]]></description>
			<content:encoded><![CDATA[<div>
<h2 style="font-weight: normal;">Snow Leopard でNICにIP aliasを設定する方法のメモ。</h2>
<h3>IP alias の追加</h3>
<pre class="bq">
sudo ifconfig en0 alias 192.168.0.1 255.255.255.0
</pre>
<h3>IP alias の削除</h3>
<pre class="bq">
sudo ifconfig en0 -alias 192.168.0.1
</pre>
<p style="margin-top: 16px;">ついでに Linux と OpenSolari での設定方法もメモ。</p>
<p><span id="more-450"></span></p>
<h2 style="font-weight: normal;">Linux の場合</h2>
<h3>IP alias の追加</h3>
<pre class="bq">
# /sbin/ifconfig eth0:1 192.168.0.1/24
</pre>
<h3>IP alias の削除</h3>
<pre class="bq">
# /sbin/ifconfig eth0:1 down
</pre>
<h2 style="font-weight: normal;">OpenSolaris の場合</h2>
<h3>IP alias の追加</h3>
<pre class="bq">
pfexec ifconfig gbe0:1 plumb
pfexec ifconfig gbe0:1 192.168.0.5 netmask 255.255.255.0 up
</pre>
<h3>IP alias の削除</h3>
<pre class="bq">
pfexec ifconfig gbe0:1 down
pfexec ifconfig gbe0:1 unplumb
</pre>
<p>Snow Leopard のやり方のほうが、何個目のエイリアスなのかを考えなくてもいいので楽なのかなぁ。<br />
エイリアス単位でインターフェースの UP/DOWN はできなそうだけど。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/06/configure-ip-alias-on-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redmine を監視して再起動する</title>
		<link>http://blog.bluegold.me/2010/04/monitor-and-restart-redmine-when-error-500/</link>
		<comments>http://blog.bluegold.me/2010/04/monitor-and-restart-redmine-when-error-500/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 16:35:50 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[opensolaris]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=444</guid>
		<description><![CDATA[Redmine の頻繁に 500 Internal Error を返すようになったので、監視して再起動させるスクリプトを作りました。]]></description>
			<content:encoded><![CDATA[<div>
<p>正確には Redmine が原因なのかどうかは判明していませんが、OpenSolaris 上に構築した Redmine が起動後何時間かすると<b>500 Internal Error</b>を返すようになってしまいました。</p>
<p>Redmine は以下のような環境で動かしています。</p>
<ul>
<li>Redmine 0.9.3</li>
<li>OpenSolaris 2009.06</li>
<li>Ruby 1.8.7-p249</li>
<li>Rails 2.3.5</li>
<li>Unicorn 0.97.0</li>
<li>nginx 0.7.65</li>
</ul>
<p>Ruby は /opt/sunstudio12.1/bin/cc(Sun Studio Express 12)でビルドしています。</p>
</div>
<div>
<p>OpenSolaris に付属の /usr/bin/ruby を使っていた時には問題なく動作していたんですが、Redmine 0.9.3 にバージョナップした所、致命的な問題が発生したため、Ruby を自分でビルドするように変更していました。</p>
<p>落ちているの気がついたら手動で再起動をしていたのですが、さすがにメンドウになってきたのでスクリプトを書きました。</p>
<p><span id="more-444"></span></p>
<pre class="brush: bash">
#!/bin/sh

while `/bin/true`
do
    http_code=`curl --insecure -w &quot;%{http_code}&quot; -s -o /dev/null https://redmine/login`
    ts=`date +&quot;%Y/%m/%d %H:%M:%S&quot;`

    if [ $http_code -eq 200 ]; then
        echo $ts OK
        sleep 300
        continue
    fi

    cd /var/www/redmine
    pid=`cat tmp/pids/unicorn.pid`

    kill -USR2 $pid
    sleep 5
    kill $pid

    echo $ts unicorn $pid reloaded.
done

exit 0
</pre>
<p>手順としては、5分おきに curl で HTTP のステータスコードのみを受け取り、<b>200 OK</b>が帰ってこない場合は再起動、という流れです。</p>
<p>Unicorn は SIGUSR2 を送ると自分自身を fork() してから終了するはずなのですが、終了せずに残るので子プロセスの起動を待ってから SIGTERM を送っています。</p>
</div>
<div>
<p>とりあえずは、これで気にはならなくなりましたが。。。</p>
<p>そのうち、God あたりに切り替えよう。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/04/monitor-and-restart-redmine-when-error-500/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xenのディスクイメージをマウントする</title>
		<link>http://blog.bluegold.me/2010/03/how-to-mount-xen-disk-image-on-linux/</link>
		<comments>http://blog.bluegold.me/2010/03/how-to-mount-xen-disk-image-on-linux/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 13:21:47 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[xen]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=410</guid>
		<description><![CDATA[XenのイメージファイルをLinuxから直接マウントする方法について説明します。]]></description>
			<content:encoded><![CDATA[<h2>XenのイメージファイルをLinuxからマウントする方法のメモ</h2>
<p>Xenのディスクイメージファイルは以下のように固定ディスクをそのままファイルに移したような構造になっています。</p>
<pre class="bq">
# file test.img
test.img: x86 boot sector; partition 1: ID=0x83, active, starthead 1, startsector 63, 208782 sectors; partition 2: ID=0x82, starthead 0, startsector 208845, 2104515 sectors; partition 3: ID=0x83, starthead 0, startsector 2313360, 18651465 sectors, code offset 0x48
</pre>
<p>なので、基本的にはループバック・デバイスとしてマウントする事が可能です。<br />
ただし、ディスクイメージはパーティションに区切ってあると思いますので、その分にひと手間ひつようです。
</p>
<p>
基本的な作業の流れは以下のとおり。</p>
<ol>
<li>losetup コマンドでディスクイメージファイルをループバック・デバイスに割り当てる。</li>
<li>kpartx コマンドでディスクイメージ内の各パーティションにデバイスファイルを割り当てる。</li>
<li>必要なパーティションのデバイスファイルを mount コマンドでマウントする。</li>
</ol>
<p><span id="more-410"></span></p>
<h3>losetup コマンドでディスクイメージファイルをループバック・デバイスに割り当てる。</h3>
<p>
<strong>losetup -f</strong>コマンドで空いているループバック・デバイスを探して、そのデバイスにイメージファイルを割り当てます。</p>
<pre class="brush: bash">
# losetup -f
/dev/loop0
# losetup /dev/loop0 /var/lib/xen/images/test.img
# losetup -a
/dev/loop0: [0900]:153944114 (/var/lib/xen/images/test.img)
</pre>
</p>
<h3>kpartx コマンドでディスクイメージ内の各パーティションにデバイスファイルを割り当てる。</h3>
<p>ループバック・デバイスに割り当てた仮想ディスクにパーティションの状況を<strong>fdiskコマンド</strong>で調べます。</p>
<pre class="brush: bash">
# fdisk /dev/loop0

このディスクのシリンダ数は 1305 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): p

Disk /dev/loop0: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *           1          13      104391   83  Linux
/dev/loop0p2              14         144     1052257+  82  Linux swap / Solaris
/dev/loop0p3             145        1305     9325732+  83  Linux

コマンド (m でヘルプ): q
</pre>
<p>3つのパーティションが存在することが確認できます。<br />
<strong>kpartx -a</strong>でそれぞれのパーティションをデバイスファイルに割り当てます。<br />
<strong>/dev/mapper</strong>ディレクトリの下に新たなデバイスファイルが作成されます。</p>
<pre class="brush: bash">
# kpartx -a /dev/loop0
# ls -l /dev/mapper/
合計 0
crw------- 1 root root  10, 62  2月 24 00:07 control
brw-r----- 1 root disk 253,  0  3月  5 22:07 loop0p1
brw-r----- 1 root disk 253,  1  3月  5 22:07 loop0p2
brw-r----- 1 root disk 253,  2  3月  5 22:07 loop0p3
</pre>
<p>仮想ディスクでLVMを使っているとここから先がめんどくさいので、私はXenの仮想ディスクではLVMは使いません。
</p>
<h3>必要なパーティションのデバイスファイルを mount コマンドでマウントする。</h3>
<p>あとは通常のディスクと同じようにマウントするだけです。</p>
<pre class="brush: bash">
# mount -t ext3 /dev/mapper/loop0p1 /mnt/tmp
# ls -l /mnt/tmp
-rw-r--r-- 1 root root  952782 11月  4 08:46 System.map-2.6.18-164.6.1.el5xen
drwxr-xr-x 2 root root    1024 11月  9 15:51 grub
-rw------- 1 root root 2383144 11月  9 15:51 initrd-2.6.18-164.6.1.el5xen.img
drwx------ 2 root root   12288  6月 17  2009 lost+found
-rw-r--r-- 1 root root   80032  3月 13  2009 message
-rw-r--r-- 1 root root  107413 11月  4 08:47 symvers-2.6.18-164.6.1.el5xen.gz
-rwxr-xr-x 1 root root  817164 11月  4 09:53 xen-syms-2.6.18-164.6.1.el5
-rw-r--r-- 1 root root  375762 11月  4 06:11 xen.gz-2.6.18-164.6.1.el5
</pre>
</p>
<h3>使い終わった後の手順</h3>
<p>必要なくなった仮想ディスクを開放するには、逆の手順で行います。</p>
<pre class="brush: bash">
# umount /mnt/tmp
# kpartx -d /dev/loop0
# ls -l /dev/mapper/
合計 0
crw------- 1 root root 10, 62  2月 24 00:07 control
# losetup -d /dev/loop0
# losetup -a
# losetup -f
/dev/loop0
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/03/how-to-mount-xen-disk-image-on-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSolarisのftpdでファイル一覧の表示に問題</title>
		<link>http://blog.bluegold.me/2010/02/ffftp-cannot-list-files-with-opensolaris-ftpd/</link>
		<comments>http://blog.bluegold.me/2010/02/ffftp-cannot-list-files-with-opensolaris-ftpd/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 17:31:57 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=400</guid>
		<description><![CDATA[OpenSolarisのFTPサーバにWindowsのFTPソフト（FFFTP）から接続した際に、ファイル一覧が表示されない問題の解決方法。]]></description>
			<content:encoded><![CDATA[<p>外部のデザイナーさん（<a href="http://higash.net" target="_blank">HiGash.Net</a> の中の人だけど）と仕事をしたときの話です。</p>
<p>私の構築したステージング用のサーバにデザイナーさんの作ったコンテンツを置いてもらう必要があったので、「sftp でいいですか？」と聞いたら「ftpの方がいい」と言われたので、急遽 ftp サーバの用意をすることになりました。</p>
<p>軽く「いいよ」と答えたものの、自分で最後に ftpd をたてたのはもう１０年近く前のことで何も覚えてません。<br />
Solaris なのでSMFで管理されているftpdがあるだろうと思い、試してみると</p>
<pre class="bq">
$ pfexec svcadm enable ftp
$ svcs -l ftp
fmri         svc:/network/ftp:default
name         FTP server
有効         true
状態         online
next_state   none
state_time   Tue Feb 23 02:02:15 2010
リスタータ   svc:/network/inetd:default
contract_id
</pre>
<p>無事に起動できました。簡単簡単。
</p>
<p>念のため、ファイアウォール越しに ftp コマンドで接続テストを行い、passive mode が on でも off でも問題がなかったので、使ってもらいました。</p>
<p>しかし、しばらくすると<strong>「FTPサーバに接続は出来たけど、ファイルが何も表示されない」</strong>との報告が。。。</p>
<p><span id="more-400"></span></p>
<p>使っている ftp のクライアントソフトは<strong>FFFTP</strong>だという事なので、同じトラブルにあっている人がいるだろうと思いGoogleに聞いてみたところ、<a href="http://oshiete1.goo.ne.jp/qa2017913.html"  target="_blank">このページ</a>で原因と思われる記述を発見しました。</p>
<p><strong>「タイムスタンプに含まれる日本語文字列の処理の問題」</strong></p>
<p>ftpコマンドで接続して確認すると、ファイルの更新日付が確かに日本語で返ってきています。これなら in.ftpd のロケールを変えてあげれば問題は解決しそうです。</p>
<p>また、Googleに聞いてみると<a href="http://www.kichise.com/modules/pico/content0064.html"  target="_blank">このページ</a>に回答がそのまま書いてありました。</p>
<p>SMF なので svccfg を使うのかと思ったら、in.ftpd は inetd に管理されているので、inetadmというコマンドを使うんですね。初めて知った。</p>
<p>以下のコマンドで、FFFTPでも正常にファイル一覧が表示されるようになりました。</p>
<pre class="bq">
$ pfexec inetadm -m ftp inherit_env=FALSE
$ pfexec svcadm restart ftp
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/02/ffftp-cannot-list-files-with-opensolaris-ftpd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx: SNI拡張を使ってVirtualHostでTLSを設定</title>
		<link>http://blog.bluegold.me/2010/02/nginx-server-name-indication-extension/</link>
		<comments>http://blog.bluegold.me/2010/02/nginx-server-name-indication-extension/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 14:36:17 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[pki]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=376</guid>
		<description><![CDATA[OpenSSLのSNI拡張を利用して、TLS で VirtualHost の設定を行います。]]></description>
			<content:encoded><![CDATA[<p><a href="/2010/02/howto-build-64bit-nginx-with-ssl-support-on-opensolaris/">前回の記事</a>でSNI(Server Name Indication)拡張を有効にしたnginxのバイナリを作成したので遊んでみました。SNI拡張は、個々の仮想ホスト(VirtualHost)で独自のサーバ証明書を利用するために作られた TLSv1 の拡張仕様です。</p>
<p>TLSやSSLを使ったウェブサーバーでは一般的には仮想ホストは使えない、という事になっています（何事にも例外はありますが。）仮想ホストは HTTP のリクエストヘッダの Host フィールドの値を元に振り分けられますが，HTTPのリクエストを出すよりも手前の TLS/SSL のハンドシェイク時にサーバ証明書の検証が行われるので，クライアントが接続しようとしているホスト名とサーバ証明書のホスト名が異なってしまい，不正な証明書と表示されてしまいます。</p>
<p>SNIは接続しようとしているホスト名を、クライアントからサーバに伝えるための仕様です。（ホスト名はハンドシェイク前に伝えないと行けないので、平文で送られる事になりますが。。。）これ自体は素晴らしいのですが，Windows XP の IE がサポートしていないので今ひとつ広まっていません。</p>
<p><span id="more-376"></span></p>
<p>まずは SNI を使わないで仮想ホストを設定する場合の例です。</p>
<pre class="bq">
ssl_certificate server_cert.pem;
ssl_certificate_key server_cer.key;
server {
    port 443;
    ssl on;
    server_name host1.example.com;
}
server {
    port 443;
    ssl on;
    server_name host2.example.co.jp;
}
</pre>
<p>サーバ証明書は1枚しか指定できないので，server_cert.pem には host1.example.com と host2.exacmple.co.jp の双方が記述されている必要があります。ホストが同一のドメインに存在する場合はワイルドカード証明書を使う方法もありますが，例のようにドメインが異なる場合は双方のホスト名をCNもしくはsubjectAltNameに記述します。この方法では仮想ホストが増える場合は証明書を発行し直す必要があります。
</p>
<p>次に SNI を使う場合の例です。</p>
<pre class="bq">
server {
    port 443;
    ssl on;
    ssl_certificate host1.example.com.pem;
    ssl_certificate_key host1.example.com.key;
    server_name host1.example.com;
}
server {
    port 443;
    ssl on;
    server_name host2.example.co.jp;
    ssl_certificate host2.example.co.jp.pem;
    ssl_certificate_key host2.example.co.jp.key;
}
</pre>
<p>仮想ホスト毎に証明書が指定する事ができるようになります。
</p>
<p>実際に SNI をサポートしている Firefox などのブラウザでアクセスすると、それぞれ異なる証明書を持つ事が確認できます。</p>
<p>ただ、現在の nginx に固有の問題かもしれませんが，仮想ホスト毎にクライアント証明書による認証の有無を切り替えるのは出来ないみたいです。<em>ssl_verify_client off;</em>な設定の仮想ホストが１つでもあると，クライアント認証を行う仮想ホストに対してもクライアント証明書が送られません。</p>
<p>クライアント認証が必要ない仮想ホストに対しても<em>ssl_verify_client optional;</em>を指定すると大丈夫なようですが。（<a href="http://wiki.nginx.org/NginxHttpSslModule">Nginx の Wiki</a>の説明では<em>optional</em> ではなく、<em>ask</em>になっているので注意が必要です。）</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/02/nginx-server-name-indication-extension/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mercurial: nginx で hgwebdir.fcgi のセットアップ</title>
		<link>http://blog.bluegold.me/2010/02/setup-mercurial-hgwebdir-fcgi-on-nginx/</link>
		<comments>http://blog.bluegold.me/2010/02/setup-mercurial-hgwebdir-fcgi-on-nginx/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 15:04:09 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[opensolaris]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=379</guid>
		<description><![CDATA[Mercurial の hgwebdir.fcgi を nginx で使う際の設定例]]></description>
			<content:encoded><![CDATA[<h2>Mercurial 付属の hgwebdir.fcgi を nginx で動かすメモ</h2>
<p>CVS（やSubversion）をバージョン管理システムに使っていた頃はリポジトリの情報を見るのに<a href="http://www.viewvc.org/">ViewVC</a>を使っていましたが、ViewVCはMercurialをサポートしていません。Mercurial にはウェブ用の管理画面(hgweb/hgwebdir)が付属しているので、別のツールを使うニーズが少ないんでしょうね。</p>
<p>Mercurial のリポジトリ毎に対応する Redmine のプロジェクトが存在するので、そちらを見ればおおよその事は分かるのですが、Redmineのリポジトリブラウザはブランチを意識して作られていないので不便といえば不便です。
</p>
<p>hgwebの事は Mercurial への移行を検討していたときにも調べていたんですが、Django, flup, setuptools, ez_setup.py, easy_install, .. とPythonに不慣れな人間にはなじみのない単語が続々と出てきたので、ちょっと敬遠していましたが、ちょっと時間が取れたのでチャレンジしてみました。</p>
<p><span id="more-379"></span></p>
<p>hgwebdir のセットアップをする前に必要なソフトウェアのインストールを行います。環境は OpenSolaris 2009.06 で、可能な限り pkg を使ってインストールしていきます。インストールしたのは以下のパッケージです。</p>
<pre class="bq">
SUNWPython26
SUNWPython26-extra
SUNWpython26-setuptools
</pre>
</p>
<p>OpenSolaris 2009.06 のパッケージ管理システムにも Mercurial はありますが、バージョンが 1.1.2 と古く、クライアントの環境と合わないので、最新バージョンを easy_install からインストールします。</p>
<pre class="brush: bash">
$ pfexec easy_install Mercurial
$ hg --version
Mercurial Distributed SCM (version 1.4.2)

Copyright (C) 2005-2009 Matt Mackall &lt;mpm@selenic.com&gt; and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
</pre>
</p>
<p>次に flup が必要だそうなのでインストールします。</p>
<pre class="brush: bash">
$ pfexec easy_install flup
</pre>
</p>
<p>hgwebdir を FastCGI で動作させるのにはいろいろな方法があるらしいのですが、Python特有のやり方はよく分からないので、lighttpd の <a href="http://redmine.lighttpd.net/projects/spawn-fcgi">spawn-fcgi</a>を使いました。インストールは以下の通り簡単です。</p>
<pre class="brush: bash">
$ wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz
$ gzip -dc spawn-fcgi-1.6.3.tar.gz | tar xvf -
$ cd pawn-fcgi-1.6.3
$ ./configure
$ make
$ pfexec make install
</pre>
</p>
<p>ここまででようやく下準備がおわりました。<br />
hgwebdir.fcgi は /usr/demo/mercurial/hgwebdir.fcgi をコピーして使っています。<br />
UTF-8 で表示するために、HGENCODING の設定を行う部分のコメントをはずしています。</p>
<pre class="bq">
os.environ["HGENCODING"] = "UTF-8"
</pre>
</p>
<p>hgweb.config は単純です。</p>
<pre class="bq">
[paths]
/ = /path/to/repos/*
</pre>
<p>これを以下のようなスクリプトで起動しています。</p>
<pre class="bq">
#!/bin/sh

LANG=ja_JP.UTF-8
export LANG

FCGI=/opt/local/bin/spawn-fcgi
exec $FCGI -s /tmp/.fcgi_hgwebdir -G webserved -M 0660 ./hgwebdir.fcgi
</pre>
</p>
<p>nginx の設定ファイルは以下のようになりました。<br />
初めて try_files を使ってみましたが、設定がとてもシンプルになりますね。<br />
hgwebdir は PATH_INFO を利用してブラウズするリポジトリを探すようなので、その部分の置き換えにちょっと手を入れています。</p>
<pre class="bq">
server {
    listen       80;
    server_name  hg.example.com;
    root   /path/to/public;
    index  index.html;

    access_log  /var/log/nginx/hg-access.log  main;

    location / {
        try_files $uri @hgweb;
    }

    location @hgweb {
        fastcgi_pass   unix:/tmp/.fcgi_hgwebdir;
        fastcgi_read_timeout    5m;
        set $path_info "";
        if ($fastcgi_script_name ~ "^/(.*)$") {
            set $path_info $1;
        }
        fastcgi_param PATH_INFO $path_info;
    }
}
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/02/setup-mercurial-hgwebdir-fcgi-on-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSolarisで64bitのnginxをビルドする</title>
		<link>http://blog.bluegold.me/2010/02/howto-build-64bit-nginx-with-ssl-support-on-opensolaris/</link>
		<comments>http://blog.bluegold.me/2010/02/howto-build-64bit-nginx-with-ssl-support-on-opensolaris/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 09:05:29 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[opensolaris]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=362</guid>
		<description><![CDATA[OpenSolaris 2009.06 で 64bit 版の nginx をビルドする手順]]></description>
			<content:encoded><![CDATA[<div class="content">
<p><a href="http://nginx.net/">nginx</a>の新しいバージョン(0.7.65)がリリースされていたので，バージョンアップしてみました。</p>
<p>しばらく前に見つかっていた<a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3555">SSLの脆弱製</a>の実験をやろうと、久しぶりに SSL を有効にしたバイナリを作ろうとしたのですが，オプションの設定の仕方を忘れていて苦労しました。また、忘れても大丈夫なようにメモ。</p>
<p>OpenSolaris 2009.06 に含まれるOpenSSLは 0.9.8a と古いので、現時点での最新バージョンである<a href="http://www.openssl.org/source/openssl-0.9.8l.tar.gz">openssl-0.9.8l</a>をダウンロードしてきて使いました。今回は<a href="http://en.wikipedia.org/wiki/Server_Name_Indication">SNI(Server Name Indication)</a>を有効にしたいので<strong>enable-tlsext</strong>オプションを渡しています。
</p>
<pre class="brush: bash">
./config --prefix=/usr/local no-shared enable-tlsext
make
pfexec make install
</pre>
<p>これだけでもビルドは出来るのですが，OpenSolaris 2009.06 のデフォルトの GCC 3.2.3 ではなく新しい /usr/bin/gcc-4.3.2 を使いたいので，少し手を入れています。</p>
<pre class="brush: bash">
export CC=/usr/bin/gcc-4.3.2
export CFLAGS=&#039;-DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -march=native -O3 -Wall -DL_ENDIAN -DMD32_REG_T=int -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM&#039;
./Configure --prefix=/usr/local no-shared enable-tlsext solaris64-x86_64-gcc
make
pfexec make install
</pre>
<p><span id="more-362"></span></p>
<p><strong>export CC=/usr/bin/gcc-4.3.2</strong>した後に<em>config</em>スクリプトを実行すると，solaris64-x86_64-gcc-4.3.2 みたいな os:compiler になってエラーになってしまうんですよね。回避方法を探すのに手間取ってしまいました。
</p>
<p>次に nginx のビルドですが，普通に configure を実行すると 32bit のバイナリが出来てしまいますので、gcc に渡すオプションも configure に渡します。</p>
<pre class="brush: bash">
./configure --prefix=/usr/local --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-cc=/usr/bin/gcc-4.3.2 --with-cc-opt=&#039;-m64 -march=native -O3 -I/usr/local/include &#039; --with-cpu-opt=amd64 --with-ld-opt=&#039;-m64 -L/usr/local/lib -L/usr/lib/amd64&#039;
make
pfexec make install
</pre>
<p>ビルドした内容を確認</p>
<pre class="brush: bash">
$ file /usr/local/sbin/nginx
/usr/local/sbin/nginx:  ELF 64-bit LSB executable AMD64 Version 1, dynamically linked, stripped

$ /usr/local/sbin/nginx -V
nginx version: nginx/0.7.65
built by gcc 4.3.2 (GCC)
TLS SNI support enabled
configure arguments: --prefix=/opt/local --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-cc=/usr/bin/gcc-4.3.2 --with-cc-opt=&#039;-m64 -march=native -O3 -I/usr/local/include&#039; --with-cpu-opt=amd64 --with-ld-opt=&#039;-m64 -L/usr/local/lib -L/usr/lib/amd64&#039;
</pre>
<p>SNIも有効になっています</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/02/howto-build-64bit-nginx-with-ssl-support-on-opensolaris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mercurial で削除してしまったファイルを元に戻す</title>
		<link>http://blog.bluegold.me/2010/02/revert-missing-file-with-mercurial/</link>
		<comments>http://blog.bluegold.me/2010/02/revert-missing-file-with-mercurial/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 17:43:10 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=348</guid>
		<description><![CDATA[Mercurial で誤って削除してしまったファイルを元に戻す方法を説明します。]]></description>
			<content:encoded><![CDATA[<div>
<p>3ヶ月ほど前に、10年以上使い続けたCVSからMercurialにソース管理を移行しました。（Subversion は手になじまなかった。）</p>
<p>移行して不便に感じるのは<a href="http://www.viewvc.org/">ViewVC</a>が使えなくなった事くらいで、普段はあまり違いは感じていませんが、１つだけ直感的にやり方が分からなくて困る事があります。</p>
<p>ワーキングディレクトリで作業中に誤って必要なファイルを削除してしまった場合、例えば</p>
<pre class="bq">
$ ls -l
total 8
-rw-r--r--  1 user  staff  1345 Jan 16 22:33 Makefile
drwxr-xr-x  5 user  staff   170 Jan 16 22:45 help/
drwxr-xr-x  5 user  staff   170 Jan 16 22:33 tutorial/
$ rm Makefile
</pre>
<p>としてしまった場合、必要なファイルが存在しない事は hg status コマンドで調べる事ができます。</p>
<pre class="bq">
$ hg status
! Makefile
</pre>
</p>
<p>CVS(やSubversion)では、誤って削除したファイルは<strong>cvs update(svn up)</strong>で元に戻すことができますが、Mercurial ではそうはいきません。</p>
<p><span id="more-348"></span></p>
<p><pre class="bq">
$ hg update
ファイル状態: 更新数 0、マージ数 0、削除数 0、衝突未解決数 0
$ ls -l
total 0
drwxr-xr-x  5 user  staff  170 Jan 16 22:45 help/
drwxr-xr-x  5 user  staff  170 Jan 16 22:33 tutorial/
</pre>
<p>このように削除されたファイルはそのままです。
</p>
<p>Mercurial では update コマンドはワーキングディレクトリのリビジョンを変更するコマンドなので、この動きで正しいらしいのですが、CVS等から乗り換えてくるとちょっとビックリします。</p>
<p>このような場合は<strong>hg revert</strong>を使うのが正しいらしいです。</p>
<pre class="bq">
$ hg revert Makefile
$ ls -l
total 8
-rw-r--r--  1 user  staff  1345 Feb  2 02:41 Makefile
drwxr-xr-x  5 user  staff   170 Jan 16 22:45 help/
drwxr-xr-x  5 user  staff   170 Jan 16 22:33 tutorial/
</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/02/revert-missing-file-with-mercurial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>tcpdump でキャプチャしたファイルを WireShark で解析</title>
		<link>http://blog.bluegold.me/2010/01/tcpdump-options-working-wih-wireshark/</link>
		<comments>http://blog.bluegold.me/2010/01/tcpdump-options-working-wih-wireshark/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 16:31:09 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=337</guid>
		<description><![CDATA[WireSharkを使ってダンプを解析するためのキャプチャファイルをtcpdumpで保存するためのオプションを毎回忘れてしまうのでメモ。]]></description>
			<content:encoded><![CDATA[<div>
<p>WireSharkを使ってダンプを解析するためのキャプチャファイルをtcpdumpで保存するためのオプションを毎回忘れてしまうのでメモ。</p>
<pre class="bq">
tcpdump -n -i en0 -s 0 -w dumpfile.cap [filter]
</pre>
<p><strong>tcpdump -w filename</strong>だけでも、キャプチャファイルは作れるが、デフォルトではキャプチャ用のバッファ(snaplen)が 68バイトと小さく（TCP のヘッダー分のサイズらしい）、あふれたデータを取りこぼしてしまいます。tcpdump で見ている分には必要の無いデータですが、WireShark で「Follow TCP Stream」を見ようとした時に壊れていたりします。</p>
<p>そこでオプション &#8216;-s&#8217; を指定して snaplen のサイズを大きく設定しています。（0は無制限、と言っても65535バイトくらいしか見た事ない）</p>
<p>(Open)Solarisの場合は悩む事無く、以下のように普通にファイルに保存するだけで大丈夫です。</p>
<pre class="bq">
snoop -r -d bge0 -o dumpfile.cap [filter]
</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/01/tcpdump-options-working-wih-wireshark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snow Leopard: crontab が編集できない</title>
		<link>http://blog.bluegold.me/2010/01/crontab_temp_file_must_be_edited_in_place/</link>
		<comments>http://blog.bluegold.me/2010/01/crontab_temp_file_must_be_edited_in_place/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 03:30:39 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[snow leopard]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=319</guid>
		<description><![CDATA[vim のバージョンにより crontab -e で編集ができなくなる場合がある。その対策方法。]]></description>
			<content:encoded><![CDATA[<p>昨年の後半は、勤めていた会社の経営が傾いたのをきっかけに、退職して新しい会社の立ち上げに参加したり、自分自身も引越しをしたりと、なかなかブログを更新する時間が取れませんでした。新年になり、ようやく全てが落ち着いてきました。</p>
<p>仕事のほうも、しばらくは自宅で開発作業を行うので、今までよりはブログに時間をかけられるんじゃないかなぁ。</p>
<p>自宅に仕事の環境を整えるために、年末年始は４台のＰＣ（ＰＣサーバ２台を含む）のセットアップを行っていました。４台といっても中身は Xen, Solaris Zone, VirtualBox で仮想化してるので時間はかかりました。</p>
<p>OpenSolaris でファイルサーバを作ったので、MacBook の開発環境のバックアップも定期的にそちらに残そうと<b>crontab -e</b>で編集して保存したところ、意外なエラーが帰ってきました。</p>
<pre class="bq">
crontab: temp file must be edited in place
</pre>
<p>これまでも Mac で crontab の編集は行っていましたが、エラーになったのは初めてです。
</p>
<p><span id="more-319"></span></p>
<p>メッセージからすると、vi で編集後のファイルの i-node が変わっているのが原因っぽいですが、.vimrc はもう３年くらいずっと使っているもので大きく変えたりはしていません。Google に聞いてみると<a href="http://log-rotation.jp/Off/Draft/Vim#vim-crontab">以下の設定</a>を追加すれば大丈夫だとの記述を発見しました。</p>
<pre class="bq">
set nowritebackup
</pre>
<p>が、私の環境ではこの方法ではダメでした。
</p>
<p>次に見つけた<a href="http://tim.theenchanter.com/2008/07/crontab-temp-file-must-be-edited-in.html">このサイト</a>を参考にしたところ、crontab の編集ができるようになりました。</p>
<pre class="bq">
set backupskip=/tmp/*,/private/tmp/*
</pre>
<p>/private/tmp があるので、この人も Mac を使っているんでしょうね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/01/crontab_temp_file_must_be_edited_in_place/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>zfsとタイムスライダーでハマった事</title>
		<link>http://blog.bluegold.me/2009/09/zfs-cannot-delete-file-on-no-space-left-on-device/</link>
		<comments>http://blog.bluegold.me/2009/09/zfs-cannot-delete-file-on-no-space-left-on-device/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 10:09:41 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[OpenSolaris]]></category>
		<category><![CDATA[opensolaris]]></category>
		<category><![CDATA[snapshot]]></category>
		<category><![CDATA[tip]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[zfs]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=305</guid>
		<description><![CDATA[
今回の秋の連休は有休も使って9連休にしていました。
休み明けのボケた頭では仕事にならないので、午前中は開発用サーバたちのパッケージのアップデートをしていたところ、その中の１つにログインできませんでした。
そのホストは  [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>今回の秋の連休は有休も使って9連休にしていました。<br />
休み明けのボケた頭では仕事にならないので、午前中は開発用サーバたちのパッケージのアップデートをしていたところ、その中の１つにログインできませんでした。</p>
<p>そのホストは OpenSolaris 2009.06 の中に立てた Linux Branded Zone（BrandZ と書いた方がいいのかな）にインストールした CentOS3 でした。Solaris の Zone なので、ホストOS の方からは自由に Linux のファイルシステムに入っていけます。中のファイルを調べたところ、ログファイルの１つが46GB以上に肥大化してしまってディスクの残り容量が無くなってしまっているのが原因のようでした。</p>
<p>これなら、巨大化したログファイルを削除すれば問題解決だな、と軽い気持ちで<strong>rm ログファイル </strong>を実行したところ、意外な結果が戻ってきました。
</p>
<pre class="bq">
cannot delete file: no space left on device.
</pre>
<p>ディスクに空き領域が無いからファイルを消したいのに、空き領域が無いからファイルを消せないと言われても。。。</p>
<p><span id="more-305"></span></p>
<p>ファイルシステムが壊れているのかと zpool scrub を実行してもエラーは無し。</p>
<p><a href="http://www.google.com/search?q=cannot+delete+%22no+space+left+on+device%22+zfs">Google 先生に質問</a>してみたところ、zfs の既知のバグのようでした。曰く、ディスクの残り容量が無くなるとスナップショットが存在するファイルは削除できない。スナップショットの無いファイルを消して空き領域を作るか、スナップショットを削除すればよいようです。
</p>
<p>が、zfs は使っているもののスナップショットなんて取ったことはありません。<br />
不思議に思い <strong>zfs list -t snapshot</strong>を実行したところ、以下のように大量のスナップショットが存在していました。</p>
<pre class="bq">
rpool/ROOT/OpenSolaris-200906-090928@2009-07-10-00:41:02                      17.4M      -  2.85G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-10-17:54     39.5K      -  6.93G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:weekly-2009-07-10-17:54      40K      -  6.93G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:monthly-2009-07-10-17:54   1.11M      -  6.93G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-11-00:00     3.67M      -  6.94G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-12-00:00     2.86M      -  7.14G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-13-00:00     5.29M      -  7.14G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-14-00:00     21.1M      -  7.26G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:weekly-2009-07-15-00:00    1.29M      -  7.26G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-16-00:00      528K      -  7.26G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-17-00:00     3.73M      -  7.26G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-18-00:00     1.67M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-19-00:00     1.05M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-20-00:00     1.08M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-21-00:00     1.22M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:weekly-2009-07-22-00:00    1.35M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-23-00:00     1.35M      -  7.35G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-24-00:00     5.91M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-25-00:00     5.93M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-26-00:00     5.87M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-27-00:00     6.60M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:daily-2009-07-28-00:00     6.42M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-11:00    1.73M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-12:00    1.71M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-13:00    1.93M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-14:00    1.88M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-15:00    1.79M      -  7.40G  -
rpool/ROOT/OpenSolaris-200906-090928@zfs-auto-snap:hourly-2009-07-28-16:00    1.26M      -  7.40G  -
...
</pre>
<p>犯人（？）は zfs の自動スナップショット機能でした。たしかにインストール直後に試しにタイムスライダーを有効にしたことがありましたが、こんな事になるとは。
</p>
<p>大量のスナップショットを削除するようにシェルスクリプトを作成して問題は解決しました。ただ、ググっている時に「rpool の容量がなくなるとリブートもできなくなる」のような話もあったので、タイムスライダー（自動スナップショット）はちょっと恐くて使えないなぁ。
</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/09/zfs-cannot-delete-file-on-no-space-left-on-device/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux Software RAID のディスク交換</title>
		<link>http://blog.bluegold.me/2009/09/linux-software-raid-replace-hdd/</link>
		<comments>http://blog.bluegold.me/2009/09/linux-software-raid-replace-hdd/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 06:59:34 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[raid]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=287</guid>
		<description><![CDATA[
今月の頭にお客さんに収めたサーバ機のハードディスクが1週間で壊れたので、急遽ディスクのリプレースに行ってきました。今回のシステムは Linux の Software RAID で 2 本のディスクを使用して RAID1 [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>今月の頭にお客さんに収めたサーバ機のハードディスクが1週間で壊れたので、急遽ディスクのリプレースに行ってきました。今回のシステムは Linux の Software RAID で 2 本のディスクを使用して RAID1 を組んでいたのでデータ自体は無事だったのですが、手を離れたと思った瞬間のトラブルは心臓に悪いですね。</p>
<p>めったに行わない作業なので、自分用にメモ。</p>
<p><span id="more-287"></span></p>
<ul>
<li>RHEL5 のレスキューCD でブート<br />
プロンプトで linux rescue と入力<br />
レスキューモードで起動する</li>
<li>途中で、既にインストールされている Linux を検出するかを聞かれるので適当に答える<br />
（今回はオフラインで作業するのでマウントはさせませんでした）</li>
<li>存在するディスクから RAIDデバイスを探す
<pre class="bq">
mdadm -Es > /etc/mdadm.conf
</pre>
</li>
<li>見つけた物理デバイスから md デバイスを作成
<pre class="bq">
mdadm --assemble --scan
</pre>
</li>
<li>ディスクを不良ディスクに指定して取り除く
<pre class="bq">
mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md0 --remove /dev/sdb1

mdadm --manage /dev/md1 --fail /dev/sdb2
mdadm --manage /dev/md1 --remove /dev/sdb2
</pre>
</li>
<li>ここでシャットダウンしてディスク交換</li>
<li>交換したら、先程と同様にレスキューモードで起動させる</li>
<li>新しいディスクのパーティションを元からあるものと完全にあわせる</li>
<li>新しいディスクをアレイに追加
<pre class="bq">
mdadm --manage /dev/md0 --add /dev/sdb1
mdadm --manage /dev/md1 --add /dev/sdb2
</pre>
</li>
<li>ディスクをアレイに追加すると自動的にリビルドが始まるので、終わるまで待つ<br />
進行状況は下のようにして確認</p>
<pre class="bq">
cat /proc/mdstat
</pre>
</ul>
<p>リビルドが終わるまでの6時間を客先で待ち続けるのは辛かった。。。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/09/linux-software-raid-replace-hdd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails 2.3 のタイムゾーン</title>
		<link>http://blog.bluegold.me/2009/09/rails-2-3-active_record-timezone/</link>
		<comments>http://blog.bluegold.me/2009/09/rails-2-3-active_record-timezone/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 11:08:34 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=278</guid>
		<description><![CDATA[2006年頃に Rails 1.2 で作成したアプリケーションを Rails 2.3 にアップグレードしています。
プログラムの移行自体は1週間ほどで完了したのですが、テストをしていてタイムゾーン関連の問題に遭遇しました [...]]]></description>
			<content:encoded><![CDATA[<p>2006年頃に Rails 1.2 で作成したアプリケーションを Rails 2.3 にアップグレードしています。</p>
<p>プログラムの移行自体は1週間ほどで完了したのですが、テストをしていてタイムゾーン関連の問題に遭遇しました。</p>
<p>データベースに有効期限を表すフィールドがあるのですが、1時間前から1時間後まで有効なレコードを作成して、現在が有効期間内かどうかを調べるテストが失敗したので問題に気がつきました。
</p>
<p>Rails 2.x ではタイムゾーンが導入されたのは知っていたので、下のように設定を行っていました。</p>
<pre class="brush: ruby">
config.time_zone = &#039;Tokyo&#039;
config.active_record.default_timezone = &#039;Tokyo&#039;
</pre>
<p>しかし、ログを見ていると JST と UTC とタイムゾーンが混ざっているようだったので、単純なアプリを作成して調べてみました。すると、以下のような結果に</p>
<pre class="brush: ruby">
c = Sample.find(:first)
&gt;&gt; c[:created_at]
=&gt; Mon, 24 Aug 2009 17:09:49 +0000
&gt;&gt; c.created_at
=&gt; Tue, 25 Aug 2009 02:09:49 JST +09:00
&gt;&gt; c[:created_at].class
=&gt; DateTime
&gt;&gt; c.created_at.class
=&gt; ActiveSupport::TimeWithZone
</pre>
<p>同じフィールドでも [] メソッドでデータを取得するのと、フィールド名を指定して取得するので、クラスもタイムゾーンも異なるんですね。ちょっとビックリしました。
</p>
<p>どこかにタイムゾーンを意識しないコードがあって、この２つを混同してしまってるんだろうな。<br />
調べるのはメンドクサイな。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/09/rails-2-3-active_record-timezone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snow Leopard で FreeMind</title>
		<link>http://blog.bluegold.me/2009/09/snow-leopard-freemind-java-fix/</link>
		<comments>http://blog.bluegold.me/2009/09/snow-leopard-freemind-java-fix/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 03:00:00 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=264</guid>
		<description><![CDATA[
前回の記事で問題となっていた、DVDの不良は週明けに渋谷のアップルストアに行って交換してもらいました。店員さんもなれた感じの対応でしたので、同じような返品交換がけっこうあったんでしょうね。「交換用の DVD もアップル [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="/2009/08/snow-leopard-install-dvd-error/">前回</a>の記事で問題となっていた、DVDの不良は週明けに渋谷のアップルストアに行って交換してもらいました。店員さんもなれた感じの対応でしたので、同じような返品交換がけっこうあったんでしょうね。「交換用の DVD もアップルストアで中身を開封して確認したわけではないので、これにも不具合が絶対に無いとは言いきれない」のような事を言っていたのでは、ある意味正直な店員さんだったんだろうな。
</p>
<p>新しい DVD で再インストールしたところ、それまで起動できていなかった Mail, iPhoto, QuickSilver などは正常に使えるようになりました。普段使っているアプリに関しては（いくつか対応待ちのものがあるものの）移行は問題ないかと思っていましたが、昨日<a href="http://freemind.sourceforge.net/">FreeMind</a>が動かないのに気がつきました。仕事の議事録等は FreeMind で書くのが習慣となっていたので、このアプリが動かないとけっこう困ります。
</p>
<p><span id="more-264"></span></p>
<p>動かないというのは正確ではなくて、実際には以下のようなダイアログが出てきました。<br />
<img src="http://blog.bluegold.me/content/uploads/2009/09/snow_leopard_rosetta_install_offlince.png" alt="snow_leopard_rosetta_install_offlince" title="snow_leopard_rosetta_install_offlince" width="500" height="295" class="alignnone size-full wp-image-268" /><br />
インターネットに接続している状態では、下のように Rosetta のインストールを促すようです。<br />
<img src="http://blog.bluegold.me/content/uploads/2009/09/snow_leopard_rosetta_install.png" alt="snow_leopard_rosetta_install" title="snow_leopard_rosetta_install" width="512" height="306" class="alignnone size-full wp-image-267" />
</p>
<p>なので、Rosetta をインストールしてしまえば解決なのですが、せっかく Snow Leopard に移行したんだから  PowerPC のバイナリの無い環境にしたいので、解決方法を調べてみました。</p>
<p><!--more--></p>
<p>エラーダイアログにある通り、問題は JavaApplicationStub が Universal Binary になっていない点にあります。JavaApplicationStub は文字通り Java で書かれたアプリケーションを Mac OS X のネイティブアプリのように見せるためのスタブとなる実行ファイルです。FreeMind.app の中から JavaApplicationStub を探して調べると、以下のようになっていました。
</p>
<pre class="brush: bash">
$ file FreeMind.app/Contents/MacOS/JavaApplicationStub
FreeMind.app/Contents/MacOS/JavaApplicationStub: Mach-O executable ppc
</pre>
<p>やはり、ppc のバイナリしか入っていません。<br />
Universal Binary な JavaApplicationStub も存在するはずなので、HDD の中を調べたところ以下の場所にありました。
</p>
<pre class="brush: bash">
$ file /System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/MacOS/JavaApplicationStub
/System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/MacOS/JavaApplicationStub: Mach-O universal binary with 3 architectures
/System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/MacOS/JavaApplicationStub (for architecture x86_64):	Mach-O 64-bit executable x86_64
/System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/MacOS/JavaApplicationStub (for architecture i386):	Mach-O executable i386
/System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/MacOS/JavaApplicationStub (for architecture ppc7400):	Mach-O executable ppc
</pre>
<p>このファイルで FreeMind.app/Contents/MacOS/JavaApplicationStub を上書きしたところ、Rosetta 無しで起動するようになりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/09/snow-leopard-freemind-java-fix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Snow Leopardのインストールエラー</title>
		<link>http://blog.bluegold.me/2009/08/snow-leopard-install-dvd-error/</link>
		<comments>http://blog.bluegold.me/2009/08/snow-leopard-install-dvd-error/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 08:21:13 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=253</guid>
		<description><![CDATA[Snow Leopard のインストールDVDの不良でインストールが出来ない問題の調査。]]></description>
			<content:encoded><![CDATA[<p>昨日は Snow Leopard の発売日だったので、会社帰りに渋谷のアップルストアに行って購入してきました。アップルストアはちょうど何かのイベントが始まるところだったらしく、人がいっぱいでレジがどこかも分からない状態でした。無事に購入して家に帰ったのですが、ちょっと予想外の事態になりました。</p>
<p>今までは新しいバージョンがでる度に Mac を買い替えていたので、OS のアップグレードは初めてですが、インストールは何回か行った事があるので、それほど心配はしていませんでした。</p>
<p>OSのアップグレードなので、何があっても大丈夫なように Time Machine でバックアップを取ります。それから SIMBL や MenuMeters などの怪しそうなソフトを止めてから、Snow Leopard の DVD を挿入してインストールを開始しました。</p>
<p>インストールが始まって「残り45分」と表示されたので、本でも呼んで時間をつぶしてようと思ったのですが、2分ほどでエラーが表示されて止まりました。</p>
<p><span id="more-253"></span></p>
<p>メッセージは以下の通りです。</p>
<p><pre class="bq">
install DVDが読み込めませんでした。
注意してディスクを清掃してから、もう一度インストールしてみてください。
</pre>
</p>
<p>DVDを取り出して見ても（新品なんだから当然だが）汚れなんかは付いていない。再度インストールを試してみても、やはりエラーで終了。DVDドライブの調子が悪いのかと別のDVDを入れてみてみても問題なし。
</p>
<p><!--more--></p>
<p>DVDから起動してみたら何か変わるかと思い、インストールログを表示させながら試したところ、何個かの pkg ファイルのコピーに失敗しているのが分かりました。何回か同じ手順でやってみたところ、エラーになるファイルは毎回異なっているようでした。</p>
<p>なら、プリンタドライバや言語等のパッケージを選択せずに、可能な限り少ないパッケージ数でインストールすれば大丈夫かも、と考えやってみたところ、無事にインストールが完了しました。</p>
<p>この時点で夜中の2時を回っていたので、そのまま寝てしまいました。</p>
<p>Google先生で調べてみると、同じような問題は「ファミリーパック問題」として、たくさん報告されているようです。うちはファミリーパックではなくて、ふつうのパッケージでしたが。私と同じようにパッケージ数を絞ってインストールに成功している人も多いようです。</p>
<p>「インストールに苦労しても、使えればいいや」と思っていたのですが、問題がたくさん見つかりました。やはり正常にはインストールできていなかったようです。今のところ気がついている問題点は</p>
<ul>
<li>Mail が起動しない</li>
<li>iPhotoが起動しない</li>
<li>iCal がどこにも存在しない</li>
<li>QuickSilver（10.6用にバージョンアップ済み）が動かない</li>
<li>カレンダーの Bashboard ウィジェットの表示が変</li>
</ul>
<p>くらいかな。
</p>
<p>いくつかのアプリが起動しない原因は同じで、DAVKit.framework の読み込みに失敗して起動できない。<br />
実際のエラーメッセージは以下の通り。</p>
<pre class="brush: bash">
Dyld Error Message:
  Library not loaded: /System/Library/PrivateFrameworks/DAVKit.framework/Versions/A/DAVKit
  Referenced from: /System/Library/Frameworks/CalendarStore.framework/Versions/A/CalendarStore
  Reason: image not found
</pre>
<p>たしかに、この場所にはファイルが存在していないです。<br />
CalendarStore とも書いてあるので、iCal の CalDAV 関連にフレームワークなのかな、と想像しています。iCal が丸ごと消えているので、このパッケージのインストールに失敗したんでしょう。
</p>
<p>DVD から iCal.pkg を取り出して展開して個別にファイルを置いてあげれば大丈夫かと考えてみましたが、iCal.pkg の読み取りはエラーになってしまいました。</p>
<p>月曜日にまたアップルストアに行って交換してくるしか無いかなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/08/snow-leopard-install-dvd-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PKI day 2009</title>
		<link>http://blog.bluegold.me/2009/06/pki-day-2009-ssl-algorithm-negotiation/</link>
		<comments>http://blog.bluegold.me/2009/06/pki-day-2009-ssl-algorithm-negotiation/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 16:00:20 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[pki]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=242</guid>
		<description><![CDATA[JNSAの主催するPKI day 2009に参加してきました。
「政府機関及び金融機関のSSLサーバ暗号設定に関する調査結果について」という講演で興味深い調査結果が発表されていました。
https でサービスを提供してい [...]]]></description>
			<content:encoded><![CDATA[<p>JNSAの主催する<a href="http://www.jnsa.org/seminar/2009/0624/">PKI day 2009</a>に参加してきました。</p>
<p>「政府機関及び金融機関のSSLサーバ暗号設定に関する調査結果について」という講演で興味深い調査結果が発表されていました。</p>
<p>https でサービスを提供している政府系や金融系のWebサーバーに関して、「サポートしている暗号アルゴリズム」と「実際に使用される暗号アルゴリズム」を調査したとの事ですが、ちょっと驚く結果になっていました。</p>
<p>曰く、調査したWebサーバのうち7割以上が新しいアルゴリズムである AES256-SHA をサポートしていますが、XP 上の IE7 では9割弱のサーバに対して比較的古くて問題の見つかっている RC4-MD5 で接続してしまうそうです。Firefox では AES256-SHA が最も多く、Vista の IE7 では AES128-SHA が最も多い結果となっていました。（Vistaでの結果も謎で AES256 が有効でも AES128 を優先して使う。）</p>
<p><span id="more-242"></span></p>
<p>SSL(TLS)では、サーバとクライアントがそれぞれ自分がサポートしている暗号アルゴリズムのリストを相手に示して、お互いにサポートしているアルゴリズムの中から実際に使用するものを決定します。このネゴシエーションでは「互いにサポートするアルゴリズムのうち最も暗号強度の高いアルゴリズム」が選択されるものだとばかり思っていたので、実際にはアルゴリズムの優先順位は暗号の強度とは無関係に決まっているみたいです。（IE の場合。Firefox では暗号強度の高い順になっている。）</p>
<p>Windows XP 用の CNG を用意しなかったマイクロソフトの判断は、今となっては間違っていたって事なんでしょうね。（2010年問題はネットブックには影響しないからいいのかな。）</p>
<p>もう一つ驚いたのが、SSL2.0 をサポートするサーバの数で、金融系では3割程度ですが（それでも予想よりはずっと多い）、政府系では6割程度がまだサポートしている、と。</p>
<p>昨年仕事で関わったサーバがユーザーの強い希望で SSL 2.0 を有効にしたのをちょっと思い出してしまいましたが、半年前の調査との比較で「AESを有効にしたらSSL 2.0も有効になった」サーバがかなりあるそうなので、誰も深く考えていないだけなのかもしれません。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/06/pki-day-2009-ssl-algorithm-negotiation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XCacheの管理について</title>
		<link>http://blog.bluegold.me/2009/06/xcache-administration-and-monitor/</link>
		<comments>http://blog.bluegold.me/2009/06/xcache-administration-and-monitor/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 17:23:02 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[munin]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xcache]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=222</guid>
		<description><![CDATA[前に書いたWordPressでXCacheを有効にするについて、「記事の通りにやったのに動かない！」と HiGash.Netの中の人に怒られたので、書きもれていた管理ページの表示方法について簡単にまとめます。

「動かな [...]]]></description>
			<content:encoded><![CDATA[<p>前に書いた<a href="http://blog.bluegold.me/2008/11/php-xcache-wordpress/">WordPressでXCacheを有効にする</a>について、「記事の通りにやったのに動かない！」と <a href="http://higash.net">HiGash.Net</a>の中の人に怒られたので、書きもれていた管理ページの表示方法について簡単にまとめます。
</p>
<p style="margin-top:2em;">「動かない」と言われた時は「後で書いておくよ」と軽い気持ちで答えてしまっていましたが、よく考えると XCache の管理ページなんてインストールした時に表示させただけで、その後はすぐに <a href="http://munin.projects.linpro.no/">munin</a> での監視を始めてしまったので、あまり記憶に残っていません。nginx 側で BASIC 認証を設定していたのが原因だったかで、うまく動かなくて苦労した記憶はあるのですが。（munin の設定については後述）
</p>
<p>前に書いた記事で php.ini の設定を載せましたが、管理者の設定が抜けていました。</p>
<pre class="brush: bash">
[xcache.admin]
xcache.admin.auth = On
xcache.admin.user = &quot;admin&quot;
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = &quot;d41d8cd98f00b204e9800998ecf8427e&quot;
</pre>
<p>パスワードは MD5 でハッシュを計算しておく必要があります。<br />
コードとしては下のような簡単なものですが、<a href="http://blog.bluegold.me/pass.php?password=hoge">このURL</a>でハッシュを計算するものを作ってみました。</p>
<pre class="brush: php">
&lt;!--
http://blog.bluegold.me/pass.php?password=XXXX
XXX の部分にパスワードを入力します
--&gt;
xcache.admin.pass = &quot;&lt;?php echo md5($REQUEST[&quot;password&quot;]); ?&gt;&quot;
</pre>
<p><span id="more-222"></span></p>
<p>
php.ini に管理者の設定を行った後で XCaxhe に付属の管理ページ(xcache.php)を開くと、パスワード認証をした後で管理ページが表示されると思います。<br />
<img src="http://blog.bluegold.me/content/uploads/2008/11/xcache-300x214.png" alt="xcache" title="xcache" width="300" height="214" class="size-medium wp-image-85" />
</p>
<p>XCacheに付属の管理ページではキャッシュされているスクリプトや、使用メモリ、キャッシュヒットやキャッシュミスの回数などの基本的な情報を調べることはできますが、得られる情報はあくまでも「その時点」での情報でしかないので、キャッシュミスが増えているか等は分かりません。
</p>
<p>このサイトでは munin を利用して XCache のキャッシュ状況をモニターしています。munin はサーバなどをモニタリングして統計画像を作るためのソフトで、この種のソフトとしては非常に簡単に設定を行うことができます。監視用のプラグインは比較的用意に作ることができ、既に多くのソフトウェアに対応しています。
</p>
<p>XCache用のプラグインは標準ではインストールされていないので、<a href="http://www.ohardt.net/dev/munin/">ここ</a>から munin_xcache-0.2.tar.bz2 をダウンロードします。インストールは他のプラグインと同様に出来ますが、このプラグインは少し変わっていて「監視される側の php ファイル(munin_xcache.php)」 も一緒に入っています。こちらはウェブサーバーから見える場所においておく必要があります。
</p>
<p>
<img src="http://blog.bluegold.me/content/uploads/2009/06/localhost-xcache_hits-week.png" alt="munin のグラフ" title="localhost-xcache_hits-week" width="489" height="295" class="alignright size-full wp-image-230" /><br />
しばらくすると、このようなグラフが出来てきます。
</p>
<p>
6/16 の番に WordPress 2.8 にアップグレードしたので、そこからキャッシュミスが多くなってきています。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/06/xcache-administration-and-monitor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Safari4 でフラッシュが使えない</title>
		<link>http://blog.bluegold.me/2009/06/safari4-and-safaristand-breaks-flash/</link>
		<comments>http://blog.bluegold.me/2009/06/safari4-and-safaristand-breaks-flash/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 02:35:41 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=212</guid>
		<description><![CDATA[Safari4がリリースされたので、すぐにバージョンアップして問題なく使っていたんですが、WordPressの記事を投稿しようとして不具合を一つ見つけました。
画像をアップロードしようとしたところ「Flashアップローダ [...]]]></description>
			<content:encoded><![CDATA[<p>Safari4がリリースされたので、すぐにバージョンアップして問題なく使っていたんですが、WordPressの記事を投稿しようとして不具合を一つ見つけました。</p>
<p>画像をアップロードしようとしたところ「Flashアップローダー」のボタンが表示されていないので、おかしいなと思い他のページも見ていくと Akismet や Wordpress.com Stats の統計も見れなくなっていました。</p>
<p>Safari4 ではプラグインが別プロセスになったので、その関係で Flash に影響が出てるのかな、と思い Google で調べてみましたが、同じような症状の人がいないみたいでした。</p>
<p>自分の環境特有の問題のようなので、設定とかプラグインを見ていくと SafariStand を外したところで、Flash が見れるようになりました。
</p>
<p>原因が分かったので、<a href="http://hetima.com/safari/stand.html">開発元のサイト</a>から Safari4 用のプラグインをダウンロードしてきて、無事解決しました。
<p>他にも同じ現象になる人がいるかもしれないのでメモしておきます。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/06/safari4-and-safaristand-breaks-flash/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Developer Days 2009</title>
		<link>http://blog.bluegold.me/2009/06/google-developer-days-2009/</link>
		<comments>http://blog.bluegold.me/2009/06/google-developer-days-2009/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 16:17:21 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=195</guid>
		<description><![CDATA[
Google Developer Days 2009に参加してきました。
最近、仕事でクラウド関連の調査や開発が多くなってきているので、Google App Engineについての話を聞きにいったんですが、さすがにGo [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.bluegold.me/content/uploads/2009/06/img_1391.jpg" width="240" height="180" alt="Google Developer Days 2009" class="title_img" /></p>
<p><a href="http://code.google.com/intl/ja/events/developerday/2009/home.html">Google Developer Days 2009</a>に参加してきました。</p>
<p>最近、仕事でクラウド関連の調査や開発が多くなってきているので、<a href="http://code.google.com/intl/ja/appengine/">Google App Engine</a>についての話を聞きにいったんですが、さすがにGoogleだけあって面白そうなセッションがたくさんあって、結局はいろいろと聞いてきてしまいました。</a></p>
<p>開発用 Android 携帯プレゼントは、予想してなかったんでちょっとうれしい。ただ、新しい iPhone を買うつもりだったので、あまり使わないだろうなぁ。（やっぱりというか、もうYahoo オークションで売ってる人もいるみたい。）
</p>
<p><span id="more-195"></span></p>
<p>以下のセッションを聞いてきました。</p>
<ul>
<li>HTML5により拓かれる次世代Web</li>
<li>Javaで動かすGoogle App Engine</li>
<li>Google Chromeの内部構造</li>
<li>Google &#038; Open Source</li>
<li>Google テクノロジーライトニングトーク</li>
<li>Google Wave API</li>
</ul>
<p>どのセッションも興味深い内容でしたが、既に公開されている情報も多かったですかね。Chromeの開発体制とかの話はたいへん面白かったですが。今回、なにより印象に残ったのがAndroidのセッションに並んでいる人の多さでした。Chrome のセッションが終わってセッションルームから出ると、次の Android のセッションのために廊下をずっと人が並んでいました。去年のこの時期はWWDCに行っていたので、iPhoneに関しては熱気を肌で感じていたんですが、Androidもこんなに多くの人が参加しようとしていたとは。
</p>
<p>今まであまり興味の無かったAndroidやOpenSocialについての概要について聞けたのは良かったかな、と思っています。特に OpenSocial はなんとなく OpenSolaris と読み間違えて、OpenSolaris の話だと思いながら記事を読んでガッカリした事が多く、意図的に無視してきた感があるので。
</p>
<p>Google Wave のベータプログラムのアカウントをもらえたのが、今回一番うれしかったかも。</p>
<p style="margin-top: 4em;">「昼食は有名なGoogleの社食のごはんがでるかも」とひそかに期待して行ったので、何もなくてがっかりしたのはココだけの話。</p>
<div style="clear:both;"></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/06/google-developer-days-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>nginx のバージョンアップ</title>
		<link>http://blog.bluegold.me/2009/06/nginx-update-0759/</link>
		<comments>http://blog.bluegold.me/2009/06/nginx-update-0759/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 16:57:50 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=184</guid>
		<description><![CDATA[nginx を 0.6系から0.7系にバージョンアップする手順について。]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.bluegold.me/content/uploads/2008/10/nginx-small.png" width="150" height="50" alt="" class="title_img" /></p>
<p><a href="http://nginx.net/">nginx</a> のバージョン 0.7 系が stable になっていたので、サーバソフトウェアのアップデートを行いました。（久しぶりのブログの更新は OpenSolaris 2009.06 について書こうと思ってたんですが、これはまた後で。。。）
</p>
<p>インストールしたのは nginx 0.7.59 です。<a href="http://forum.nginx.org/read.php?2,2335">リリースのアナウンス</a>が 25 May 2009 なので、2週間くらい前に出たばかりだったようです。 0.6系と0.7系の間の変更点についてまとまっている資料を探したのですが、見つかりませんでした。</p>
<p>Change Log を見るとかなりの修正箇所があるようですが、大きくまとめると以下の機能が増えているようです。</p>
<pre class="brush: bash">
*) caching of proxied and FastCGI servers;
*) &quot;try_files&quot; directive;
*) the &quot;location&quot; and &quot;server_name&quot; directives support captures in regular expressions;
*) XLST and image filters;
*) a preliminary IPv6 support;
*) nginx/Windows.
</pre>
<p>WindowsサポートとIPv6、あまり関係なさそう。。。
</p>
<p><span id="more-184"></span></p>
<p>
try_filesはファイルを探す順番を指定するディレクティブで、例えば「あるファイルが存在する場合はメンテナンス画面を表示する」ような場合、今までは if 文をいくつか書いて条件分岐させていたのをすっきりと記述することが出来るようです。設定例を見るといろいろな応用が出来るようです。
</p>
<p>
インストールはいつもの通り</p>
<pre class="brush: bash">
./configure --with-http_stub_status_module
                   --with-http_gzip_static_module
                   --with-cc-opt=&#039;-O3&#039;
make
make install
</pre>
<p>だけで大丈夫でした。</p>
<p>ただ、私の環境ではなぜか configure が途中で失敗していて、しばらくはまりました。結局は .bash_profile で環境変数 CC と CFLAGS を指定していたのが原因でした。nginx の configure スクリプトは autoconf で作られたものでは無いので、予想もつかないところが問題になるなぁ。
</p>
<p>nginx 0.6 系で使用していた nginx.conf で起動させたところ、2点ほど問題がありました。</p>
<ol>
<li>gzip_types に text/html を設定していると警告が出る。
<pre class="brush: bash">
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
</pre>
<p>0.6系では上のような設定で問題ありませんでしたが、0.7 では以下の警告が出ます。</p>
<blockquote><p>
duplicate MIME type &#8220;text/html&#8221; in /etc/nginx/nginx.conf
</p></blockquote>
<p>text/html は暗黙的に設定されているようなので、以下のように修正。</p>
<pre class="brush: bash">
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
</pre>
</li>
<li>特定のPHPファイルだけ BASIC認証させていたが、PHPとして実行されなくなった。
<p>WordPress のログインページを BASIC 認証をさせるために、以下のような設定をしていました。</p>
<pre class="brush: bash">
    location /wordpress/wp-login.php {
        auth_basic &quot;secret&quot;;
        auth_basic_user_file htpasswd;
    }
</pre>
<p>nginx 0.6 系では BASIC 認証後に wp-login.php が実行されていましたが、0.7系では BASIC認証はされるものの、PHPファイルが実行されずにソースファイルがそのまま転送されてきました。</p>
<p>どのように修正すべきか分からなかったので、以下のように fastcgi の設定を入れて ad hoc に修正しました。</p>
<pre class="brush: bash">
    location /wordpress/wp-login.php {
        auth_basic &quot;secret&quot;;
        auth_basic_user_file htpasswd;

        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $fastcgi_script_name;
        include        fastcgi_params;
    }
</pre>
<p>こういうケースでは今後は try_files ディレクティブを使えって事なんでしょうね。
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/06/nginx-update-0759/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XCache を複数の WordPress で使う場合の問題</title>
		<link>http://blog.bluegold.me/2009/05/wordpress-xcache-object-cache-collision/</link>
		<comments>http://blog.bluegold.me/2009/05/wordpress-xcache-object-cache-collision/#comments</comments>
		<pubDate>Sun, 03 May 2009 16:24:58 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[xcache]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=174</guid>
		<description><![CDATA[以前のエントリで WordPress のオブジェクトキャッシュを XCache の保存する方法について書きましたが、その後問題が発生したのでメモ。

複数の WordPress を１つのホストで稼働させる際に XCach [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/2008/11/php-xcache-wordpress/">以前のエントリ</a>で WordPress のオブジェクトキャッシュを XCache の保存する方法について書きましたが、その後問題が発生したのでメモ。
</p>
<p>複数の WordPress を１つのホストで稼働させる際に <a href="http://dougal.gunters.org/blog/2008/08/29/xcache-object-cache-plugin-for-wordpress-25">XCache Object Cache Plugin for WordPress 2.5+</a> を使用すると、オブジェクトキャッシュが混ざってしまうようです。</p>
<p><span id="more-174"></span></p>
<p>このサイトでは<a href="http://blog.bluegold.me">http://blog.bluegold.me</a>用と<a href="http://mama.bluegold.me">http://mama.bluegold.me</a>用に２つの WordPress を稼働させています。それぞれ専用のデータベースを持つ独立したブログになっていますが、双方でオブジェクトキャッシュを有効にしたところ、しばらくして blog.bluegold.me 側の WordPress の管理コンソール(wp-admin)にログインできなくなりました。
</p>
<p>XCache をインストールしてからは時間が経っていたので関係しているとは全く思わずに、MySQL 側でパスワードを何度も更新してログインを試みたり、WordPress <del datetime="2009-05-04T13:31:10+00:00">2.7.2</del> 2.7.1 にバージョンを上げたばかりだったので、仕様が変わったのかと調べてみたりしたものの原因は分かりませんでした。
</p>
<p>管理コンソールいろいろなIDとパスワードを入力しているうちに、blog.bluegold.me のユーザ名(bg)を入力すると「ユーザ名が違います」を表示されるのに、mama.bluegold.me 側のユーザ名(papa)を入力すると「パスワードが違います」と表示される事に気がつきました。ありえない事が起きているのが分かってきたので、試しに<strong>papa の正しいパスワード</strong>を入力してみたところログインに成功し、<strong>bgのダッシュボード</strong>が表示されました。
</p>
<p>ここでキャッシュが悪さをしている事がわかったので、オブジェクトキャッシュの使用を止めて、キャッシュをクリアするために PHP の FastCGI のプロセスを再起動しました。
</p>
<p>調べてみると、やはり同じような問題を抱えている人はいるようで、以下のサイトに詳しく書かれていました。ユーザ情報が混在するのは仕様なんですかね．．．<br />
<a href="http://jamescoletti.com/multiple-wordpress-installs-and-object-cache-collision">http://jamescoletti.com/multiple-wordpress-installs-and-object-cache-collision</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/05/wordpress-xcache-object-cache-collision/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPressの画像をAmazon CloudFrontに置く</title>
		<link>http://blog.bluegold.me/2009/04/wordpress-theme-amazon-cloudfront-cdn/</link>
		<comments>http://blog.bluegold.me/2009/04/wordpress-theme-amazon-cloudfront-cdn/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 06:12:44 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=164</guid>
		<description><![CDATA[

このブログは今のところ自宅に置いてあるサーバで運用しています。
手直にあるので管理は簡単なのですが、自宅の回線はアップストリームの帯域幅が大きくないので、ページを表示するさいの画像読み込みの遅延が以前から気になってい [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://media.amazonwebservices.com/logo_aws.gif" width="164" height="60" alt="last.fm" class="title_img" /></p>
<p>
このブログは今のところ自宅に置いてあるサーバで運用しています。<br />
手直にあるので管理は簡単なのですが、自宅の回線はアップストリームの帯域幅が大きくないので、ページを表示するさいの画像読み込みの遅延が以前から気になっていました。
</p>
<p>
このサイトでは以下のように nginx を設定することで、可能な限り静的なコンテンツの使用する帯域幅を小さくしようとしていますが、それでもファイル転送量のほとんどは画像ファイルになっています。</p>
<pre class="brush: bash">
location / {
    if (-f $request_filename) {
        expires 30d;
        break;
    }
}
location ~* ^.+\.(html|css|txt|tar|bmp|rtf|js)$ {
    gzip_static on;
    expires 30d;
}
</pre>
<p>以前から画像を外部のサイトに置いて転送負荷を減らそうと考え、一部の画像を<a href="http://www.flickr.com/photos/bluegoldme/">flickr</a>に置いたりしていますが、これはという解決策がありませんでした。</p>
<p>
最近、仕事関係で Amazon のウェブサービスについて調べていて<a href="http://aws.amazon.com/cloudfront/">Amazon CloudFront</a>というサービスがあるのを知り、WordPress のテーマの画像を置いてみたらどうなるのかを調べてみました。
</p>
<p><span id="more-164"></span>
<p>
Amazon CloudFront は Amazon の提供するウェブサービスの１つで、いわゆる<a href="http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%83%87%E3%83%AA%E3%83%90%E3%83%AA%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF">CDN</a>です。Amazon S3に保存したファイルをインターネット上に分散配置されたキャッシュサーバに置く事で、静的なコンテンツを高速に配信する事ができるようになっています。
</p>
<p>
有料のサービスなので利用には Amazon Web Service のアカウントが必要になりますが、以下のように安価な価格設定になっているので費用対効果は高いと思います。</p>
<dl style="background-color: #F4F7FF; font-size: 90%; color:#114488; margin-left:1em; margin-right:0;　 margin-top:12px;　 margin-bottom:8px; border: 1px #6F6F6F dashed; padding: 12px;line-height: 160%; -moz-border-radius: 5px; -webkit-border-radius: 5px;">
<dt>United States</dt>
<dd>$0.170 per GB &#8211; first 10 TB / month data transfer out</dd>
<dd>$0.010 per 10,000 GET Requests</dd>
<dt>Japan</dt>
<dd>$0.221 per GB &#8211; first 10 TB / month data transfer out</dd>
<dd>$0.013 per 10,000 GET Requests</dd>
</dl>
<p>
Amazon S3 の使い方はいろんな場所で説明されているので省きます。使用しているテーマのディレクトリから画像や css, js ファイルを CloudFront に配備してください。<br />
S3 に置いたファイル（オブジェクト）に対して Everyone の Read 権限を与える必要がある点だけ注意してください。<br />
Firefox のプラグイン <a href="https://addons.mozilla.org/ja/firefox/addon/3247">S3Organizer</a>はCloudFront にも対応しているのでお勧めです。
</p>
<p>
CloudFrontに置いたファイルをWordPressから参照する方法はテーマファイル次第ですが、私のサイトで作ってもらったテーマでは bloginfo(&#8217;template_directory&#8217;); と bloginfo(&#8217;stylesheet_url&#8217;); の２つの値を変更するだけで大丈夫そうでした。<br />
私はWordPressもPHPも詳しくなく、この二つの値を変更する「正しい方法」が分からなかったため適当にプラグインを書いてみました。<br />
（こうやって野良プラグインが増えていくんだろうな）
</p>
<p>
プラグインのソースは以下の通りです。</p>
<pre class="brush: php">
&lt;?php
/*
 * Plugin Name: CloudFront
 * Plugin URI: http://blog.bluegold.me/cloudfront
 * CloudFront plugin is a plugin designed to help you drastically speed up your blog&#039;s load time by loading content onto Amazon CloudFront.
 * Version: 0.1
 * Author: Blog Bluegold.me
 * Author URI: http://blog.bluegold.me
 * */

$cdn_base = &quot;__EDIT_HERE__&quot;;

function    filter_cdn_css($url) {
    global $cdn_base;
    return $cdn_base . &quot;/style.css&quot;;
}

function    filter_cdn_template_dirctory($url) {
    global $cdn_base;
    return $cdn_base;
}

add_filter(&#039;stylesheet_uri&#039;,&#039;filter_cdn_css&#039;);
add_filter(&#039;template_directory_uri&#039;,&#039;filter_cdn_template_dirctory&#039;);
?&gt;
</pre>
<p>これを WordPress の wp-content/plugins/cloudfront/cloudfront.php という名前で保存するだけです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/04/wordpress-theme-amazon-cloudfront-cdn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GnuPGでメーリングリスト宛のメールを暗号化する</title>
		<link>http://blog.bluegold.me/2009/01/gpgmail-gnupg-group/</link>
		<comments>http://blog.bluegold.me/2009/01/gpgmail-gnupg-group/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 15:38:31 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[pgp]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=159</guid>
		<description><![CDATA[GnuPGを利用してメーリングリストに参加している各アドレスに対する鍵で暗号化する方法について説明しています。]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.bluegold.me/content/uploads/2009/01/logo-gnupg-white-bg.png" width="150" height="50" alt="gnupg" class="title_img" /></p>
<p>
年末に<a href="http://www.sente.ch/software/GPGMail/English.lproj/GPGMail.html" title="http://www.sente.ch/software/GPGMail/English.lproj/GPGMail.html">GPGMail</a>のRelease 1.2.0(v56)が出ていたので、さっそくアップデートしました。ベータの取れた正式版としては初めてLeopardをサポートするバージョンだと思います。
</p>
<p>
GPGMailは暗号化メールの送受信をおこなうといった意味では必要な機能を備えています。しかし、鍵管理などは<a href="http://www.gnupg.org/">GnuPG</a>の機能をそのまま使っているため、GnuPG自体の知識が必要となります。各ユーザの鍵に関しては<a href="http://macgpg.sourceforge.net/">MacGPGプロジェクト</a>のGPG Keychain Accessを利用すればGUIから管理することができるようになりますが、メーリングリストのアドレスに複数の鍵を対応させるような設定はGUIからはできません。
</p>
<p>日本語での情報がほとんど無いようなのでメモしておきます。</p>
<p><span id="more-159"></span>
<p>GnuPGでメーリングリスト宛てのメールを暗号化する場合の考えたかにはいくつかあるとは思いますが、基本的には「メーリングリストのアドレス専用の鍵で暗号化する」か「メーリングリストに参加している個々のアドレスの鍵で暗号化する」かのどちらかです。前者は送る側も受け取る側も通常のメールアドレス用の鍵と同じように扱えるため非常に簡単ですが、メーリングリストのメールを受け取る全てのユーザが同一の鍵を共有する事になるのでセキュリティ上の問題があります。通常は後者を選択する事になると思います。</p>
<p>この方法ではメールの送信者（つまりメールを暗号化する側）が、メーリングリストに参加している各ユーザの実際のメールアドレスをあらかじめ gpg.conf に設定しておく必要があります。
</p>
<p>たとえば、ml@example.com というアドレスがメーリングリストで、実際には user1@example.com, user2@example.com の２つのメールアドレスに配信される場合、~/.gnupg/gpg.conf に以下のような記述を行います。</p>
<pre class="brush: bash">
group   ml@example.com = user1@example.com user2@example.com
</pre>
<p>アドレスはスペース区切りです。アドレスの数が多くて1行に書ききれないような場合は、以下のように複数の行にわけて記述する事ができます。</p>
<pre class="brush: bash">
group   ml@example.com = user1@example.com user2@example.com ...
group   ml@example.com = user20@example.com user21@example.com
</pre>
</p>
<p>この設定はMacGPGの GPGPreferences でも設定可能と言えば可能ですが、gpg.conf を直接編集するのと難易度はあまり変わらないように思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2009/01/gpgmail-gnupg-group/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>POPFileを使用してGmailのラベルを設定する</title>
		<link>http://blog.bluegold.me/2008/12/gmail-imap-popfile-leopard/</link>
		<comments>http://blog.bluegold.me/2008/12/gmail-imap-popfile-leopard/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 15:20:25 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=153</guid>
		<description><![CDATA[今週から会社のメールがGoogle Apps for Your Domainに移行しました。今までのメールサーバはPOP3しか使えなかったのですが、Gmailに移行したのを機にIMAP4を使ってみることにしました。
私は [...]]]></description>
			<content:encoded><![CDATA[<p>今週から会社のメールが<a href="http://www.google.com/a/help/intl/ja/index.html">Google Apps for Your Domain</a>に移行しました。今までのメールサーバはPOP3しか使えなかったのですが、Gmailに移行したのを機にIMAP4を使ってみることにしました。<br />
私は主にLeopardのMail.appを利用してメールを読んでいるので、<a href="http://mail.google.com/support/bin/answer.py?answer=81379">Googleの公式のヘルプ</a>にある通りの手順で簡単に設定することができます。
</p>
<p>
ただ、このままだとGmailが「迷惑メール」と判断したメールがMail.appでは未読メールとして表示されたり、Mail.appでメールを削除した際にGmailのゴミ箱に移動されずに「Deleted Messages」ラベルが付けられる、などの問題が発生します。そこで、Gmail側の「迷惑メール」フォルダなどにMail.appで「メールボックスの用途」を設定しました。これでメール管理をMail.app側に統合化する事ができ、便利に使えるようになりました。
</p>
<p>
POP3でメールを読んでいた頃は<a href="http://getpopfile.org/docs/jp">POPFile</a>を利用して、迷惑メールのフィルタやメールの振り分けを行っていました。Gmailには迷惑メールのフィルタ機能が元から備わっていますが、メールの振り分けをPOPFileほどは柔軟に設定できません。たとえば、会社のメールアドレスには誰かが全員用のエイリアス用に購読したNikkei BPやキーマンズネットのニュースがたくさん送られてくるのですが、単純なルールでこれらをまとめて「ニュース」フォルダに振り分けるのは（ほぼ）不可能です。
</p>
<p>そこで、POPFileをIMAP4の環境で使用する方法について調べてみました。</p>
<p><span id="more-153"></span>
<p>POPFileのIMAPモジュールはPOPモジュールと異なりプロキシではありません。そのため、POPFileを利用するのにメールクライアントの設定を変更する必要はありません。これは良いことですが欠点もあります。プロキシとして動作しない為に、サブジェクトを変更したりX-Text-Classificationヘッダを付加する事ができません。</p>
<p>IMAPモジュールはメールクライアントの動作とは無関係に定期的にIMAPサーバに接続し、メールの本文の内容を判断して適切なフォルダ（Gmailの場合はラベル）に振り分けます。IMAPモジュールはいったん設定を行うと後は自動的に処理を続けるロボットのようなプログラムなので、クライアントPCで動作させるよりは常時稼働しているサーバの上で動かした方が良いのかもしれません。
</p>
<p>
IMAPモジュールの使い方は<a href="http://getpopfile.org/docs/jp:experimentalmodules">公式サイトの説明</a>にある通りですが、Leopard(Mac OS X)で使用するには注意する点がいくつかあります。（POPFile v1.1.0 を使用しています。）
</p>
<h3>imap.gmail.com</h3>
<p>POPFile コントロールセンターの「設定」ページの「IMAPサーバー ホスト名」にGmailのIMAPサーバ名、imap.gmail.com を入力しても接続できずに、以下のエラーがログに残ります。</p>
<pre class="brush: bash">
2008/12/25 23:48:08 10142: IMAP-Client: 136: IO::Socket::SSL error: IO::Socket::SSL: bind: Address family not supported by protocol family
2008/12/25 23:48:08 10142: imap: 1624: Could not CONNECT to server.
2008/12/25 23:48:08 10142: imap: 1493: Could not connect to server.
</pre>
<p>エラーメッセージをGoogleで検索すると、IPv6が関係しているエラーのようです。Leopard に固有の問題のようですが、「imap.google.com の AAAA レコードが見つかる為に IO::Socket::SSL がサポートしていない IPv6 で接続しようとしている」ためにエラーになっているらしい。将来のバージョンで修正されると思いますが、それまでのワークアラウンドを考えます。</p>
<p>要は、imap.gmail.com　の AAAA レコードが見つかることが原因なので、たとえば、imap.gmail.com の(IPv4の)IPアドレスを調べて、それをIMAPサーバーのホスト名に設定したり、そのIPアドレスを逆引きして得られる実サーバのホスト名を設定すれば、とりあえず使用できるようになります。（今、私の環境から調べるとrv-in-f111.google.comです。）ただ、imap.gmail.comを構成する多数のサーバの中の１台にしか接続できなくなるため、そのうち接続出来なくなるかもしれません。
</p>
<h3>日本語のIMAPフォルダ名</h3>
<p>
IMAPモジュールではPOPFileのバケツ毎に振り分けるIMAPのフォルダを設定する必要があります。この設定はPOPFile コントロールセンターの「設定」ページから行いますが、このページは日本語の IMAPフォルダ名に対応していません。たとえば、「迷惑メール」フォルダは「&#038;j,dg0TDhMPww6w-」と表示されます。これは modified UTF-7 というエンコーディングだそうですが、このままでは振り分けるべきフォルダがどれなのかが分かりません。
</p>
<p>これも将来のバージョンで修正されると思いますが、当面は以下のような方法で調べるしかないようです。</p>
<pre class="brush: ruby">
$ irb -rnet/imap
irb(main):001:0&gt; %w(迷惑メール 下書き 送信済みメール ゴミ箱).each {|key| puts &quot;#{key} -&gt; [Gmail]/#{Net::IMAP.encode_utf7(key)}&quot;}
迷惑メール -&gt; [Gmail]/&amp;j,dg0TDhMPww6w-
下書き 　　-&gt; [Gmail]/&amp;Tgtm+DBN-
送信済みメール -&gt; [Gmail]/&amp;kAFP4W4IMH8w4TD8MOs-
ゴミ箱 　　-&gt; [Gmail]/&amp;MLQw33ux-
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/12/gmail-imap-popfile-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressのwpadsプラグインで日本語を使用するには</title>
		<link>http://blog.bluegold.me/2008/12/wordpress-wpads-japanese-utf8/</link>
		<comments>http://blog.bluegold.me/2008/12/wordpress-wpads-japanese-utf8/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 02:42:33 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=147</guid>
		<description><![CDATA[このブログでは広告を表示するのにWPAdsプラグインを利用しています。このプラグインは重み付けによって複数の広告を切り替えて表示する機能など非常に便利なものですが、広告の「Description」や「HTML Code」 [...]]]></description>
			<content:encoded><![CDATA[<p>このブログでは広告を表示するのに<a href="http://thesandbox.wordpress.com/wpads/">WPAds</a>プラグインを利用しています。このプラグインは重み付けによって複数の広告を切り替えて表示する機能など非常に便利なものですが、広告の「Description」や「HTML Code」に日本語を入れると文字化けしてしまう問題があります。</p>
<p>今日はちょっと時間があったので文字化けの原因について調べてみました。</p>
<p><span id="more-147"></span>
<p>日本語の文字を含んだ広告を作成してWPAdsのデータベースを直接見てみたところ正常に保存されているようなので、原因は管理ページの表示部分にあると予想して wpads-options.php を見たところ、以下のようなコードになっていました。</p>
<pre class="brush: php">
&lt;tr&gt;
    &lt;td valign=&quot;top&quot;&gt;Description&lt;/td&gt;
    &lt;td&gt;
        &lt;input name=&quot;banner_description&quot; type=&quot;text&quot; size=&quot;50&quot; value=&quot;&lt;?php echo htmlentities($banner-&gt;banner_description);?&gt;&quot; /&gt;&lt;br /&gt;
        Any text that helps you identify this banner
    &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td valign=&quot;top&quot;&gt;HTML Code&lt;/td&gt;
    &lt;td&gt;
        &lt;textarea name=&quot;banner_html&quot; rows=&quot;6&quot; cols=&quot;80&quot;&gt;&lt;?php echo htmlentities($banner-&gt;banner_html);?&gt;&lt;/textarea&gt;&lt;br /&gt;
        Copy and paste the HTML code to show the ad (for example, the Google AdSense code)
    &lt;/td&gt;
&lt;/tr&gt;
</pre>
<p>どうも<a href="http://us3.php.net/htmlentities">htmlentities()</a>によるエスケープ処理で日本語が化けてしまっているようです。htmlentities() は文字コードを省略されると ISO-8859-1 として処理されるようなので、正しく処理するように &#8216;UTF-8&#8242; を渡します。（ついでに XSS の問題がありそうなので ENT_QUOTES オプションを追加。）
</p>
<p>修正後のソースは以下のようになります</p>
<pre class="brush: php">
&lt;tr&gt;
    &lt;td valign=&quot;top&quot;&gt;Description&lt;/td&gt;
    &lt;td&gt;
        &lt;input name=&quot;banner_description&quot; type=&quot;text&quot; size=&quot;50&quot; value=&quot;&lt;?php echo htmlentities($banner-&gt;banner_description, ENT_QUOTES, &#039;UTF-8&#039;);?&gt;&quot; /&gt;&lt;br /&gt;
        Any text that helps you identify this banner
    &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td valign=&quot;top&quot;&gt;HTML Code&lt;/td&gt;
    &lt;td&gt;
        &lt;textarea name=&quot;banner_html&quot; rows=&quot;6&quot; cols=&quot;80&quot;&gt;&lt;?php echo htmlentities($banner-&gt;banner_html, ENT_QUOTES, &#039;UTF-8&#039;);?&gt;&lt;/textarea&gt;&lt;br /&gt;
        Copy and paste the HTML code to show the ad (for example, the Google AdSense code)
    &lt;/td&gt;
&lt;/tr&gt;
</pre>
<p>patch: <a href="http://blog.bluegold.me/content/uploads/wpads-utf8.patch">wpads-utf8.patch</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/12/wordpress-wpads-japanese-utf8/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Useful WordPress SQL Hacks</title>
		<link>http://blog.bluegold.me/2008/12/mysql-cache/</link>
		<comments>http://blog.bluegold.me/2008/12/mysql-cache/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 11:39:18 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=140</guid>
		<description><![CDATA[「8 Useful WordPress SQL Hacks」という記事を参考にして WordPress のSQL実行回数を計測します。]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://www.smashingmagazine.com/2008/12/18/8-useful-wordpress-sql-hacks/">8 Useful WordPress SQL Hacks</a>という記事の7番を参考にして、このブログでもWordPressのSQL実行回数を計測してみました。
</p>
<p>
計測方法は以下のコードを footer.php に追加するだけです。
</p>
<pre class="brush: php">
&lt;?php if (is_user_logged_in()) { ?&gt;
    &lt;?php echo get_num_queries(); ?&gt; queries in &lt;?php timer_stop(1); ?&gt; seconds.
&lt;?php } ?&gt;
</pre>
<p><span id="more-140"></span>
<p>
結果は以下のようになりました。<br />
トップページを3回表示させた時の時間です。</p>
<pre>
24 queries in 0.540 seconds.
24 queries in 0.545 seconds.
24 queries in 0.550 seconds.
</pre>
<p>WordPressで24 queriesは多いのか少ないのかは分かりませんが、1ページ作るのに 0.5 秒は非力なこのマシンでもちょっと遅いか。
</p>
<p>
そこで、MySQLのクエリキャッシュを有効にする事にしました。<br />
このブログのサーバ機はメモリが256MBしかないので、いままでは無効にしていました。
</p>
<p>
my.cnfの具体的な設定値は以下の通り。</p>
<pre class="brush: bash">
query_cache_limit=1M
query_cache_min_res_unit=4k
query_cache_size=16M
query_cache_type=1
</pre>
</p>
<p>
同じようにトップページを3回表示させたところ、若干の速度向上がありました。<br />
微妙と言えば微妙ですが。。。</p>
<pre>
24 queries in 0.512 seconds.
24 queries in 0.510 seconds.
24 queries in 0.510 seconds.
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/12/mysql-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails 1.2.6 と gem 1.3.0 を一緒に使う</title>
		<link>http://blog.bluegold.me/2008/12/rails-126-and-gem-130/</link>
		<comments>http://blog.bluegold.me/2008/12/rails-126-and-gem-130/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 16:18:53 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=132</guid>
		<description><![CDATA[
Merbが最近はやっているようなので、インストールして使ってみようと思いました。Merb には Rubygems 1.3.0 以上が必要なのでアップデートしたところ、仕事で開発している Rails 1.2.6 で作られ [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://merbivore.com/" title="Merb">Merb</a>が最近はやっているようなので、インストールして使ってみようと思いました。Merb には Rubygems 1.3.0 以上が必要なのでアップデートしたところ、仕事で開発している Rails 1.2.6 で作られたアプリケーションに gem の deprecated メッセージが出てくるようになってしまいました。
</p>
<p>たとえば script/console を実行すると以下のようなメッセージが出てきます。</p>
<pre class="brush: ruby">
$ script/console
Gem::SourceIndex#search support for String patterns is deprecated
./script/../config/boot.rb:20 is outdated
Loading development environment.
Gem::SourceIndex#search support for String patterns is deprecated
./script/../config/../config/boot.rb:20 is outdated
&gt;&gt;
</pre>
<p><span id="more-132"></span>
<p>このアプリは Rails を使っているのでとうぜんWeb用のアプリなのですが、管理用に独自のコマンドラインシェルを用意しています。こちらのコマンドの実行時にも同様のメッセージが出てきてしまっています。「Rails 2.2 系に上げるいい時期かな」とも思わないでもないのですが、製品として提供している物なので、今期末にいくつか控えている納品を終えるまではバージョンを上げるわけにもいきません。
</p>
<p>仕方がないのでクイックハック<br />
script/console の最初で stderr を /dev/null に捨てるようにしました。</p>
<pre class="brush: ruby">
#!/usr/bin/env ruby
$stderr.reopen(&#039;/dev/null&#039;)
require File.dirname(__FILE__) + &#039;/../config/boot&#039;
require &#039;commands/console&#039;
</pre>
<p>deprecated なメッセージを簡単に抑制する設定とかもあるんだろうか。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/12/rails-126-and-gem-130/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OS X 10.5.6 と GPGMail</title>
		<link>http://blog.bluegold.me/2008/12/leopard-1056-gpgmail/</link>
		<comments>http://blog.bluegold.me/2008/12/leopard-1056-gpgmail/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 15:48:47 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[leopard]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[pgp]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=127</guid>
		<description><![CDATA[Mac OS X 10.5.6 で GPGMail の異常終了を修正する方法について。]]></description>
			<content:encoded><![CDATA[<p>
Mac OS X 10.5.6 が出ていたので、さっそく適用してみました。<br />
アップデート後もしばらくは何の問題も無く使えていたのですが、Mail.app を起動したところクラッシュ。<br />
再度実行したら、またクラッシュ。
</p>
<p>クラッシュした時のメッセージを良く読んでみたら、原因が書いてありました。</p>
<blockquote><p>
アプリケーション Mail は予期せず終了しました。この問題は GPGMail プラグインが原因である可能性があります。
</p></blockquote>
<p>
<a href="http://www.sente.ch/software/GPGMail/English.lproj/GPGMail.html">GPGMail</a>は Mail.app用の GnuPG のフロントエンドで、会社でやり取りするメールの暗号化に使っています。アップデートを探しに開発元の<a href="http://www.sente.ch/software/GPGMail/English.lproj/GPGMail.html">Sen:TE</a>のサイトを見てみた所、</p>
<blockquote><p>
IMPORTANT: You need at least GPGMail d55 since MacOS X 10.5.6; previous versions of GPGMail will crash Mail.
</p></blockquote>
<p>と、とっくに対応されていました。
</p>
<p>最新の GPGMail に入れ替えたところ、Mail.app が正常に起動するようになりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/12/leopard-1056-gpgmail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>last.fm のプレイリストをブログに表示するには</title>
		<link>http://blog.bluegold.me/2008/12/lastfm-playlist/</link>
		<comments>http://blog.bluegold.me/2008/12/lastfm-playlist/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 15:53:57 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[last.fm]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=117</guid>
		<description><![CDATA[

HiGash.Netの中の人にWordPressのキレイなテーマを作ってもらったので、last.fmの「最近聴いたトラック」を表示するプログラムを作りました。


last.fm の公式のウィジェットを使用すれば簡単 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.bluegold.me/content/uploads/2008/12/last-fm-audioscrobbler-logo.jpg" width="150" height="128" alt="last.fm" class="title_img" /></p>
<p>
<a href="http://higash.net" title="HiGash.Net">HiGash.Net</a>の中の人にWordPressのキレイなテーマを作ってもらったので、<a href="http://last.fm" title="last.fm">last.fm</a>の「最近聴いたトラック」を表示するプログラムを作りました。
</p>
<p>
last.fm の<a href="http://www.lastfm.jp/widgets/chart" title="last.fm">公式のウィジェット</a>を使用すれば簡単にブログに貼付ける事ができますが、公式の物はFlashを使っていて自分でデザインを変更できないので、自分で作ってみました。last.fmは<a href="http://www.audioscrobbler.net/">audioscrobbler</a>というAPIを用意しているので、このAPI経由で情報を取得します。今回は Ruby の <a href="http://scrobbler.rubyforge.org/">scrobbler gem</a>を利用しています。
</p>
<p><span id="more-117"></span>
<p>
scrobbler gem のインストールは以下のように簡単です。</p>
<pre class="brush: ruby">
$ sudo gem install scrobbler
</pre>
</p>
<p>
<a href="http://scrobbler.rubyforge.org/docs/">scrobblerのドキュメント</a>を見ながら、プログラムを書いていきます。<br />
手順はだいたい次のようになります。</p>
<ol>
<li>last.fmのユーザの「最近聴いたトラック」の一覧を取得する</li>
<li>トラックのアルバムアートワークを取得する</li>
</ol>
<h2>last.fmのユーザの「最近聴いたトラック」の一覧を取得する</h2>
<p>
scrobblerライブラリを使うと簡単で、last.fmのユーザ名を指定して<a href="http://scrobbler.rubyforge.org/docs/classes/Scrobbler/User.html">Scrobbler::User</a>のオブジェクトを作成するだけです。</p>
<pre class="brush: ruby">
user = Scrobbler::User.new(&#039;bluegold&#039;)
recent_tracks = user.recent_tracks
</pre>
<p>Scrobbler::User#recent_tracks の戻り値は<a href="http://scrobbler.rubyforge.org/docs/classes/Scrobbler/Track.html">Scrobbler::Track</a>のArrayになっています。Scrobbler::Track は再生した曲の情報を表すオブジェクトで、曲のアルバム名やアーチスト名、last.fmのURLなどの情報を保持しています。last.fmの URLは、たとえば Sheryl Crow の Real Goneの場合は<a href="http://www.lastfm.jp/music/Sheryl+Crow/_/Real+Gone">このページ</a>の事です。
</p>
<p>最近再生したトラックを表示するだけなら、ここまでで終わりです。</p>
<h2>トラックのアルバムアートワークを取得する</h2>
<p>
Scrobbler::Track のオブジェクトにもimageやthumbnailなどのattributeは存在するのですが、これらは&#8217;only seems to be used on top tracks for tag&#8217;とのことでScrobbler::User#recent_tracksでは値が設定されていません。そこでトラックのアーチスト名とアルバム名から<a href="http://scrobbler.rubyforge.org/docs/classes/Scrobbler/Album.html">Scrobbler::Album</a>のオブジェクトを作成して、そこからアルバムアートワークを取得します。Scrobbler#Trackのオブジェクトから得られるアルバム名は（アーチスト名も？）エスケープされていて、そのままでは正しくデータを取得出来ない場合があったので、CGI#unescapeHTML を利用して元に戻しています。</p>
<pre class="brush: ruby">
track = recent_tracks.first
album = Scrobbler::Album.new(
  track.artist,
  CGI.unescapeHTML(track.albumname)
)
image_url = album.image(:small)
</pre>
<p>上のコードで1曲分のアートワーク画像へのURLが得られるので、表示したい曲数分繰り返します。
</p>
<p>あとは好きなようにHTMLを書いてスタイルを設定するだけです。完成した結果はこのブログのフッターに表示されている通りです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/12/lastfm-playlist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressでXCacheを有効にする</title>
		<link>http://blog.bluegold.me/2008/11/php-xcache-wordpress/</link>
		<comments>http://blog.bluegold.me/2008/11/php-xcache-wordpress/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 06:20:38 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[xcache]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=83</guid>
		<description><![CDATA[前回の記事でPHPの設定は完了していますが、ついでにPHPアクセラレータも導入してみます。PHPアクセラレータはPHPの実行時に中間的に生成されるバイトコードをキャッシュや最適化を行う事により、実行時のロスを減らす仕組み [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.bluegold.me/2008/11/nginx-php-fastcgi/" title="nginxでphpを利用する">前回</a>の記事でPHPの設定は完了していますが、ついでにPHPアクセラレータも導入してみます。PHPアクセラレータはPHPの実行時に中間的に生成されるバイトコードをキャッシュや最適化を行う事により、実行時のロスを減らす仕組みです。</p>
<p>
PHPアクセラレータには<a href="http://eaccelerator.net/" title="eAccelerator">eAccelerator</a>や<a href="http://pecl.php.net/package/APC" title="APC">APC</a>などいろいろとあるようですが、今回は使った事のない<a href="http://xcache.lighttpd.net/" title="XCache">XCache</a>を使ってみます。XCacheはバイトコードのキャッシュの他にPHPの変数をキャッシュする機能があるので、この機能をWordPressで使うように設定も行います。
</p>
<p>
XCacheのビルドは以下の通り簡単に行うことができます。</p>
<pre class="brush: bash">
wget http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz
gzip -dc xcache-1.2.2.tar.gz | tar xvf -
cd xcache-1.2.2
./configure --enable-xcache
make
make install
</pre>
</p>
<p><span id="more-83"></span>
<p>
php.ini ファイルにXCacheの設定を記述します。<br />
ソースに付属しているサンプルの xcache.ini からあまり変えていません。</p>
<pre class="brush: php">
[xcache-common]
zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20060613/xcache.so

[xcache]
xcache.shm_scheme =        &quot;mmap&quot;
xcache.size  =               22M
xcache.count =                 1
xcache.slots =                8K
xcache.ttl   =             86400
xcache.gc_interval =         600

xcache.var_size  =            2M
xcache.var_count =             1
xcache.var_slots =            8K
xcache.var_ttl   =             0
xcache.var_maxttl   =          0
xcache.var_gc_interval =     300

xcache.test =                Off
xcache.readonly_protection = Off
xcache.mmap_path =    &quot;/dev/zero&quot;
xcache.coredump_directory =   &quot;&quot;
xcache.cacher =               On
xcache.stat   =               On
xcache.optimizer =            On
</pre>
<p>xcache.size は使用するアプリケーションの種類によって調整した方がよいと思います。XCacheはeAcceleratorなどと違い、キャッシュは全てメモリ上に持つようなので大きめに設定しておいた方が良いかもしれません。
</p>
<p>バイトコードのキャッシュは以上の設定でphpのFastCGIを再起動するだけで使用出来ますが、変数のキャッシュを利用するにはアプリケーション側で対応する必要があります。WordPressには<a href="http://neosmart.net/dl.php?id=12" title="XCache for WordPress">XCache for WordPress</a>というプラグインがあるようですが、最近のバージョンのWordPressでは動作しないようなので、<a href="http://dougal.gunters.org/blog/2008/08/29/xcache-object-cache-plugin-for-wordpress-25" title="XCache Object Cache Plugin for WordPress">XCache Object Cache Plugin for WordPress 2.5+</a>を使用する事にしました。
</p>
<p>
<img src="http://blog.bluegold.me/content/uploads/2008/11/xcache-300x214.png" alt="xcache" title="xcache" width="300" height="214" class="size-medium wp-image-85" style="float:right;" /><br />
インストールは簡単ですが、XCache Object Cache Plugin for WordPressは通常のWordPressのプラグインとはインストールするパスが異なるので注意が必要です。プラグインのファイルは object-cache.php １つだけで、これをWordPressのコンテントディレクトリ（通常は xp-content ディレクトリ）に置きます。私も最初は説明を読まずに他のプラグインと同じように xp-content/plugins ディレクトリに置いて、しばらく悩みました。</p>
<p>このようにバイトコードと変数の双方がキャッシュされている事を確認出来ます。これだけで体感出来る程度には速度が向上するので、導入する価値はあると思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/11/php-xcache-wordpress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>nginxでphpを利用する</title>
		<link>http://blog.bluegold.me/2008/11/nginx-php-fastcgi/</link>
		<comments>http://blog.bluegold.me/2008/11/nginx-php-fastcgi/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 15:09:58 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=72</guid>
		<description><![CDATA[

nginxからphpを利用するには、FastCGIを有効にしてphpをビルドしておく必要があります。
php-5.2.6 を以下のようにビルドしました。


./configure
    --with-curl=/ [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.bluegold.me/content/uploads/2008/10/nginx-small.png" width="150" height="50" alt="" class="title_img" /></p>
<p>
<a href="http://nginx.net/" title="http://nginx.net/">nginx</a>からphpを利用するには、FastCGIを有効にしてphpをビルドしておく必要があります。<br />
php-5.2.6 を以下のようにビルドしました。
</p>
<p><pre class="brush: bash">
./configure
    --with-curl=/usr --enable-fastcgi
    --enable-mbstring --enable-zend-multibyte
    --enable-mbregex --with-mysql
    --with-mcrypt --with-mhash
    --with-openssl --with-gd
    --enable-gd-native-ttf --enable-gd-jis-conv
    --with-jpeg-dir=/usr --with-xpm-dir=/usr
    --with-freetype-dir=/usr
make
make install
</pre>
</p>
<p>メールで記事を投稿する為に openssl と gd の関係のオプションを追加してます。<br />
openssl は gmail に対して POP で接続する為に、gd は<a href="http://wppluginsj.sourceforge.jp/ktai_entry/" title="Ktai Entry">Ktai Entry</a>で画像を添付したメールを処理するのに必要でした。</p>
<p>FastCGIのプロセスを以下のように起動します。</p>
<pre class="brush: bash">
/usr/local/bin/php-cgi -q -b 127.0.0.1:9000
</pre>
</p>
<p>127.0.0.1:9000 は FastCGI の接続を待ち受ける IPアドレスとポート番号です。<br />
この値は環境に合わせて別の物に変更する事が可能です。
</p>
<p><span id="more-72"></span></p>
<p>続いて nginx 側の設定ファイルを作成します。</p>
<p><a href="http://blog.bluegold.me/2008/10/configure-nginx/" title="blog構築メモ: nginx を設定する">前回</a>の記事で基本的な設定は nginx.conf に書いてあるので、ここでは VirtualHost の設定だけを記述します。</p>
<p>phpをFastCGIで実行するのに最低限必要な設定はこれだけです。</p>
<p><pre class="brush: bash">
server {
    listen       80;
    server_name  bluegold.me blog.bluegold.me;
    root   /var/www/blog;
    index  index.php index.html index.htm;
&amp;lt;p&amp;gt;    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/blog/$fastcgi_script_name;
        include        fastcgi_params;
    }
}
</pre>
</p>
<p>127.0.0.1:9000 の部分は FastCGI のプロセスのオプションと同じ値を設定します。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/11/nginx-php-fastcgi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx.conf についてもう少し</title>
		<link>http://blog.bluegold.me/2008/10/nginx_conf/</link>
		<comments>http://blog.bluegold.me/2008/10/nginx_conf/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 15:48:32 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=65</guid>
		<description><![CDATA[
前回紹介したnginx.conf についてもう少し掘り下げて説明します。
ログフォーマット

    log_format  main  &#039;$remote_addr - $remote_user [$time [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.bluegold.me/content/uploads/2008/10/nginx-small.png" width="150" height="50" alt="" class="title_img" /></p>
<p><a href="http://blog.bluegold.me/2008/10/configure-nginx/" title="blog構築メモ: nginx を設定する">前回</a>紹介したnginx.conf についてもう少し掘り下げて説明します。</p>
<h2>ログフォーマット</h2>
<pre class="brush: bash">
    log_format  main  &#039;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#039;
                      &#039;&quot;$status&quot; $body_bytes_sent &quot;$http_referer&quot; &#039;
                      &#039;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot; &quot;$gzip_ratio&quot;&#039;;

    access_log  /var/log/nginx/access.log  main;
</pre>
<p>nginx は良い所のたくさんあるソフトウェアですが、新しいだけに nginx のデフォルトのログフォーマットのままではAWStatsなどのログ解析ソフトに読み込ませる事ができません。そこで Apache の combind フォーマットと同じになるように設定しています。</p>
<p>この設定はGoogleで検索して見つけたのですが、nginx のバージョンが違うのかそのままでは <span class="caps">AWS</span>tats や Webalizer でエラーになった為、多少変更しています。$request と $status をダブルクォーテーションで囲む必要がありました。</p>
<p><span id="more-65"></span></p>
<h2>VirtualHost設定</h2>
<p>nginxの設定はとても簡単で、単純な VirtualHost の設定は以下のような少ない記述だけで十分です。</p>
<pre class="brush: bash">
    # error catch
    server {
        listen       80;
        server_name _;
        root   /var/www/temp;

        index  index.html;

        access_log  /var/log/nginx/temp-access.log  main;
    }
</pre>
</p>
<p>root を DocumentRoot, index を DirectoryIndex と読み替えれば、Apacheの設定ができる人にはほぼ説明がいらないくらいだと思います。&#8221;server_name _;&#8221;は全てのリクエストを受け付けるVirtualHostで Host: ヘッダの指定されていないリクエストなどの他の VirtualHost が処理しないリクエストがこの VirtualHost に回ってきます。当然、サービスを提供する VirtualHost には適切な server_name を設定しておきます。</p>
<p>脆弱製のあるサーバを探しているスキャナの多くは IP アドレスを手がかりにサーバに接続してくるので、このような設定にしておく事で、スキャナのリクエストを「何も無い VirtualHost」に閉じ込めてしまう事ができます。実際にこのホストにも phpMyAdmin や xampp の管理画面を探すリクエストが来ています。</p>
<p>この設定は、codered が流行した頃に大量のアタックのログを本来のサービスのログから分離する為に始めたんですが、あまり一般的じゃないのかな。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/10/nginx_conf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPressのバックアップを Gmail に保存する その3</title>
		<link>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-3/</link>
		<comments>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-3/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 16:28:18 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=45</guid>
		<description><![CDATA[前回、暗号化を行った事によりバックアップの保存の目的はほぼ果たしているのですが、気持ちが悪いので添付ファイルについても考えてみました。
gmail と uuencode をキーワードに Google で検索した所、mut [...]]]></description>
			<content:encoded><![CDATA[<p>前回、暗号化を行った事によりバックアップの保存の目的はほぼ果たしているのですが、気持ちが悪いので添付ファイルについても考えてみました。</p>
<p>gmail と uuencode をキーワードに Google で検索した所、mutt を使うのが一般的らしい。<br />
↓のように &#8216;-a&#8217; キーワードで添付するファイルを指定するだけで添付ファイルとして扱ってくれます。</p>
<pre class="brush: bash">
mutt -a name.afz -a mysql_name.afz -s &quot;name backup `date`&quot; to_address
</pre>
<p>
複数の添付ファイルにも対応しているので、この方法で問題ないかとも思ったのですが、１つだけ問題がありました。mutt では Envelope From を引数で変更することが出来ず、muttrc/.muttrc に別途設定する必要があります。</p>
<p>なんかめんどくさそうな感じがしたので、結局は Ruby でフィルタプログラムを書くことにしました。</p>
<p><span id="more-45"></span>
<p>以下のような物になりました。</p>
<pre class="brush: ruby">
#!/usr/bin/env ruby
#
# sendmail.rb&lt;/p&gt;

require &#039;rubygems&#039;
require &#039;tmail&#039;
require &#039;net/smtp&#039;
require &#039;nkf&#039;
require &#039;etc&#039;
require &#039;socket&#039;
require &#039;optparse&#039;

def usage( status, msg = nil )
  output = (status == 0 ? $stdout : $stderr)
  output.puts msg if msg
  output.print(&amp;lt;&amp;lt;EOS)
Usage: cat msg | #{File.basename $0} [-j|--ja] [-s &lt;subject&gt;] [-f &lt;from&gt;] &lt;to&gt;

  -s,--subject=sbj   subject of the message. (default=(none))
  -f,--from=from     from address.
  -a,--attachment=file attachment
  -j,--ja            handle japanese message. (default=off)

EOS
  exit status
end

def main(args)
  subject = nil
  from = guess_from_address()
  to = []
  attachments = []
  ja_locale = false

  OptionParser.new do |opt|
    opt.banner = &quot;Usage: #{$0} [options]&quot;

    opt.on(&#039;-s&#039;, &#039;--subject=subj&#039;, &#039;subject of the message. (default=(none))&#039;) do |arg|
      subject = arg
    end
    opt.on(&#039;-f&#039;, &#039;--from=from&#039;, &#039;from address.&#039;) do | arg|
      from = arg
    end
    opt.on(&#039;-j&#039;, &#039;--ja&#039;, &#039;handle japanese message. (default=off)&#039;) do
      ja_locale = true
    end
    opt.on(&#039;-a&#039;, &#039;--attachment=file&#039;, &#039;attachment&#039;) do |arg|
      attachments &amp;lt;&amp;lt; arg
    end

    to = opt.parse!(args)
  end

  usage(1) if to.empty?

  setup_mail(from, to, subject, $stdin.read, ja_locale, attachments)
end

def setup_mail( from, to, subject, body, ja_locale, attachments )
  mail = TMail::Mail.new
  mail.date = Time.now
  mail.from = from
  mail.to = to
  mail.subject = subject if subject
  mail.mime_version = &#039;1.0&#039;

  # 本文の処理
  if attachments.empty?
    message = mail
  else
    message = TMail::Mail.new
    message.transfer_encoding = &#039;7bit&#039;
  end
  if ja_locale
    message.body = &lt;span class=&quot;caps&quot;&gt;NKF.&lt;/span&gt;nkf(&#039;-j&#039;, body)
    message.set_content_type &#039;text&#039;, &#039;plain&#039;, &#039;charset&#039; =&amp;gt; &#039;iso-2022-jp&#039;
  else
    message.body = body
    message.set_content_type &#039;text&#039;, &#039;plain&#039;
  end

  # 添付ファイルの処理
  unless attachments.empty?
    mail.parts.push(message)

    attachments.each do |filepath|
      body = nil
      File.open(filepath) { |f| body = f.read } rescue nil
      next if body.nil?

      attachment = TMail::Mail.new
      filename = File.basename(filepath)

      encoded_body = [body].pack(&#039;m&#039;).chomp.gsub(/.{76}/, &quot;\\1\n&quot;)
      attachment = TMail::Mail.new
      attachment.body = encoded_body
      attachment.transfer_encoding = &#039;base64&#039;
      attachment.set_content_type(&#039;application&#039;, &#039;octet-stream&#039;, &#039;name&#039; =&amp;gt; filename)
      attachment.set_content_disposition(&#039;attachment&#039;,
                 &#039;filename&#039; =&amp;gt; filename)

      mail.parts.push(attachment)
    end

    mail.write_back
  end

  puts mail.encoded

  mail
end

def guess_from_address
  user = getlogin()
  unless user
    $stderr.puts &#039;cannot get user account; abort.&#039;
    exit 1
  end
  if domain = (Socket.gethostname || &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;[&#039;HOSTNAME&#039;] || &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;[&#039;HOST&#039;])
    user + &#039;@&#039; + domain
  else
    user
  end
end

def getlogint
  begin
    require &#039;etc&#039;
    Etc.getlogin
  rescue LoadError
    &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;[&#039;LOGNAME&#039;] || &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;[&#039;USER&#039;]
  end
end

main(ARGV)
</pre>
</p>
<p>TMail のサンプルの sendmail.rb をほぼそのまま使っています。<br />
引数　&#8217;-a&#8217; で添付ファイルを指定出来るように変更しました。（getopts が deprecated になっていたので optparse で書き直しています。）</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressのバックアップを Gmail に保存する その2</title>
		<link>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-2/</link>
		<comments>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-2/#comments</comments>
		<pubDate>Sun, 19 Oct 2008 16:21:39 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[afio]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=40</guid>
		<description><![CDATA[バックアップファイルを 256bit AES で暗号化する方法について考えます。
バックアップの作成に使用した afio には、バックアップ対象のファイルを個別に圧縮する機能があります。圧縮に使用する外部プログラムは引数 [...]]]></description>
			<content:encoded><![CDATA[<p>バックアップファイルを 256bit <span class="caps">AES </span>で暗号化する方法について考えます。</p>
<p>バックアップの作成に使用した afio には、バックアップ対象のファイルを個別に圧縮する機能があります。圧縮に使用する外部プログラムは引数で変更出来るので、これを利用して暗号化を行います。</p>
<p><span id="more-40"></span>
<p>まずは、下のような暗号化用のフィルタを作成します。</p>
<p><pre class="brush: bash">
#!/bin/sh
# encrypt_filter.sh

opt=&quot;-pass env:FILTER_PASSWORD&quot;

if [ -r /etc/wp_backup_password ]; then
    opt=&quot;-pass file:/etc/wp_backup_password&quot;
fi
gzip -c | openssl enc -e -aes-256-cbc $opt
</pre>
</p>
<p>次に afio に　-P オプションでフィルタプログラムを使用させます。</p>
<p>
<pre class="brush: bash">
afio -ovz -Z -U -P encrypt_filter.sh backup.afz
</pre>
</p>
<p>これでバックアップファイルが作成される際に個別のファイル毎に暗号化されるようになります。</p>
<p>/etc/wp_backup_password ファイルが暗号鍵になります。このファイルはバックアップを元に戻す時に必要になるので安全な場所に保管しておかないといけません。パスワードファイルの中身はなんでも構わないので、うちのサイトでは以下のようにしてランダムに作成しています。</p>
<pre class="brush: bash">
dd if=/dev/urandom of=/etc/wp_backup_password bs=256 count=1
</pre>
</p>
<p>このファイルはバックアップを行うアカウント以外からは読み込めないようにパーミッションを設定しておく必要があります。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressのバックアップを Gmail に保存する</title>
		<link>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail/</link>
		<comments>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 06:34:56 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=28</guid>
		<description><![CDATA[毎日のブログのバックアップの保管場所をどこにしようかと悩んでいたんですが、Gmailに送ってしまえば良い事に気がつきました。
容量的には問題はないですし、毎日のバックアップの置き場としては問題無さそうです。
暗号化とかは [...]]]></description>
			<content:encoded><![CDATA[<p>毎日のブログのバックアップの保管場所をどこにしようかと悩んでいたんですが、Gmailに送ってしまえば良い事に気がつきました。<br />
容量的には問題はないですし、毎日のバックアップの置き場としては問題無さそうです。</p>
<p>暗号化とかは後で考えるとして、とりあえず下のようなスクリプトを書いてみました。</p>
<p><span id="more-28"></span></p>
<pre class="brush: bash">
#!/bin/sh

AFIO=/usr/local/bin/afio
MYSQLHOTCOPY=/usr/bin/mysqlhotcopy
SENDMAIL=/usr/sbin/sendmail

WORKDIR=/var/tmp
WWWDIR=/var/www
LOGDIR=/var/log

if [ -f /etc/wp_backup ]; then
    . /etc/wp_backup
fi

if [ ${MYSQL_USER:-nothing} = &quot;nothing&quot; ]; then
    exit 1
fi
if [ ${MAIL_FROM:-nothing} = &quot;nothing&quot; ]; then
    exit 1
fi

function cleanup() {
    rm -rf $WORKDIR/mysql
    rm -f $WORKDIR/$name.afz
    rm -f $WORKDIR/mysql_$name.afz
}
trap &quot;cleanup&quot; EXIT

name=${1:-blog}

if [ ! -d $WORKDIR/mysql ]; then
    mkdir $WORKDIR/mysql
fi

(
echo &quot;BACKUP START: `date`&quot;

# backup mysql
$MYSQLHOTCOPY -u $MYSQL_USER -p $MYSQL_PASSWORD $name $WORKDIR/mysql

cd $WORKDIR/mysql
find $name | $AFIO -ovz -Z -U $WORKDIR/mysql_$name.afz

# backup wordpress
cd $WWWDIR
find $name | $AFIO -ovz -Z -U $WORKDIR/$name.afz

echo &quot;BACKUP FINISHED: `date`&quot;
) &gt;&gt; $LOGDIR/wp_backup.log 2&gt;&amp;1

# send the backup files
(
cat &lt;&lt;__END__
From: $MAIL_FROM
To: $MAIL_TO
Subject: $name backup `date`

blog name: $name
date: `date`

`uuencode $name.afz &lt; $WORKDIR/$name.afz`

`uuencode mysql_$name.afz &lt; $WORKDIR/mysql_$name.afz`

__END__
) | $SENDMAIL -f $MAIL_FROM -t $MAIL_TO

exit 0
</pre>
<p>バックアップを Gmail に送信する事はできたので問題は解決したかと思ったんですが、Gmail は uuencode の添付ファイルを認識しないんですねぇ。手元の Apple Mail でも認識していないので単に時代遅れなだけか。</p>
<p>もう少し考えねば</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/10/backup-wordpress-to-gmail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>blog構築メモ: nginx を設定する</title>
		<link>http://blog.bluegold.me/2008/10/configure-nginx/</link>
		<comments>http://blog.bluegold.me/2008/10/configure-nginx/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 07:56:01 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=4</guid>
		<description><![CDATA[
せっかく自宅にサーバを構築するので、会社では触らないソフトを使用してみる企画。
第一回はWebサーバとしてnginx を取り上げます。
nginx（えんじん えっくす）はロシアの人が作っているWebサーバで、軽量高速が [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.bluegold.me/content/uploads/2008/10/nginx-small.png" width="150" height="50" alt="" class="title_img" /></p>
<p>せっかく自宅にサーバを構築するので、会社では触らないソフトを使用してみる企画。</p>
<p>第一回はWebサーバとして<a href="http://nginx.net/">nginx</a> を取り上げます。</p>
<p>nginx（えんじん えっくす）はロシアの人が作っているWebサーバで、軽量高速が特徴らしい。 <a href="http://www.wordpress.com">WordPressの本家</a> でも使っているようなので、相性も良いだろうと言う事で。</p>
<p><span id="more-4"></span></p>
<h2>nginx をビルドする</h2>
<p>tarball を取ってきて普通に configure, make, make install だけです。</p>
<pre class="brush: bash">
tar zxvf  nginx-0.6.32.tar.gz
cd  nginx-0.6.32
./configure --with-openssl=/usr --with-http_stub_status_module
make
sudo paco -D make install
</pre>
</p>
<h2>nginx の設定</h2>
<p>nginx.conf というファイルを編集します。nginx には Apache の .htaccess に相当する設定ファイルは無いようなので、基本的には全ての設定はこのファイルに書く事になります。シンプルと言えばシンプルですが、複数の Virtual Host の設定を１つのファイルに記述すると見通しが悪くなるので、設定ファイルを複数のファイルに分けて　nginx.conf から include する事もできるようになっています。</p>
<p>試行錯誤した結果、このサイトの現在の nginx.conf は下のようになっています。</p>
<pre class="brush: bash">
user  nobody;
worker_processes  3;

error_log  /var/log/nginx/error.log  info;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    use epoll;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  &#039;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#039;
                      &#039;&quot;$status&quot; $body_bytes_sent &quot;$http_referer&quot; &#039;
                      &#039;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot; &quot;$gzip_ratio&quot;&#039;;

    access_log  /var/log/nginx/access.log  main;
    rewrite_log on;

    gzip on;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_min_length 1100;
    gzip_buffers 4 8K;
    gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    sendfile       on;
    tcp_nopush     on;
    tcp_nodelay    off;

    keepalive_timeout  65;

    client_max_body_size 10M;

    # error catch
    server {
        listen       80;
        server_name _;
        root   /var/www/temp;

        index  index.html;

        auth_basic &amp;quot;secret&amp;quot;;
        auth_basic_user_file /var/www/htpasswd;

        access_log  /var/log/nginx/temp-access.log  main;
    }

    # load the virtual server settings
    include /usr/local/nginx/conf.d/*.conf;
}
</pre>
</p>
<p>細かい設定の話は次回</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2008/10/configure-nginx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
