<?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 &#187; 技術</title>
	<atom:link href="http://blog.bluegold.me/category/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bluegold.me</link>
	<description>OpenSolaris と MacBook で自宅ネットワークを構築するメモ</description>
	<lastBuildDate>Sat, 06 Aug 2011 16:10:12 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>AirMac Extreme で困った事</title>
		<link>http://blog.bluegold.me/2011/08/problem-of-airmac-extreme/</link>
		<comments>http://blog.bluegold.me/2011/08/problem-of-airmac-extreme/#comments</comments>
		<pubDate>Sat, 06 Aug 2011 16:08:37 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[wifi]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=627</guid>
		<description><![CDATA[自宅のルーターを AirMac Extreme に置換える際に困ったこと。
1) ローカル側 NIC のIPアドレスを変更できない。 2) FTP のポートマッピングが 21 に固定されている。]]></description>
			<content:encoded><![CDATA[<h3>AirMac Extreme に買い替えてみた</h3>
<p>自宅でルーターとして使っていた<a href="http://www.amazon.co.jp/dp/B001NEIRWK?tag=bluegoldme-22">安物の無線LAN AP</a> の調子が悪く、頻繁に落ちるようになったので、新しい物に買い替えました。</p>
<p>EAP-TLS の実験もしたかったので、今回は <a href="http://www.amazon.co.jp/dp/B0057D4OQG?tag=bluegoldme-22">AirMac Extreme</a> にしてみました。</p>
<p>AirMac Extreme はアップル製だけあって設定は簡単で、802.1X EAP-TLS で認証をさせても安定しているようです。それはいいのですが。。。</p>
<h3>困った事</h3>
<p>アップルの製品は設定が簡単でいいのですが、設定項目が少なく、アップルの想定している使い方からちょっとでも外れるとどうにも出来なくなる事があります。</p>
<p>今回も2点ほど困った点があったので、メモしておきます。</p>
<ol>
<li>
<h4>ローカル側のIPアドレスが変更できない。</h4>
<p>AirMac Extreme をルーターとして使用する場合、ローカル側の IPアドレスが 192.168.0.1 のように末尾が 1 に固定されていて、変更することができません。<br />
ローカルのIPアドレスを設定できないネットワーク機器なんてあるはずないと思い、方法を探してみましたが、解決策は無いようでした。</p>
<p>うちのネットワークは、これまで 192.168.0.254 のように 254 で終わるアドレスをデフォルトゲートウェイにしていたので、このアドレスが変わると固定アドレスを持っているたくさんのサーバーたちの設定も変更する必要が出てきてめんどくさいんですよね。</p>
<p>しかたないので、常時起動している Linux に 254 のアドレスを割り当てて、ICMP redirect で正しいデフォルトゲートウェイのアドレスを通知するようにしました。（ついでにキャッシュ用のネームサーバーも立てました。）</p>
<p style="font-size: smaller;">最初は OpenSolaris に ICMP redirect を投げさせようとしたんですが、なぜか出来なかった。。。</p>
</li>
<li>
<h4>ftp のポートマッピング(NAT)で標準以外のポートを使えない</h4>
<p>他の人とデータのやり取りをする為に ftp サーバーを立てていますが、標準のポートで起動させておくと勝手にログインしてこようとする人たちがたくさんいます。パスワードとログの管理がめんどくさいので、これまではルーターで標準以外の別のポートから NAT させていました。</p>
<p>AirMac Extreme でも同様の設定をしてみたのですが、接続できません。</p>
<p>アップルのフォーラムでも同様に困っている人はたくさんいるのですが、やはり解決策は無いようでした。</p>
<p>いろいろと試してみた結果をまとめると</p>
<ul>
<li>ftp 以外の NAT は予想した通りに動作する。</li>
<li>プライベートTCPポートを 21 にして、パブリックTCPポートが21以外だと、ルータで止められる。</li>
<li>プライベートポート、パブリックポートの双方を 21にすると接続できるようになる。<br />
ただし、FTP のデータポートを正しく扱えなくなるので、実質的に使えない。
</li>
</li>
</ol>
<h3>余談その1</h3>
<p>実験中に OpenSolaris で動かしている ftpサーバーのポートを変えようとしたが、inetadm ではポートを変更する方法がなかった。。。</p>
<p>しかたがないので、/etc/services を修正して対応。。。</p>
<h3>余談その2</h3>
<p>Mac OS X 10.7 Lion で EAP を使う場合の設定方法がものすごくシンプルになりました。</p>
<p>どこかで見た事あるなぁ、と思ったら iOS と同じになったみたいです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2011/08/problem-of-airmac-extreme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginxでWordPressの記事を静的配信する</title>
		<link>http://blog.bluegold.me/2011/01/wordpress-to-static-html-with-nginx/</link>
		<comments>http://blog.bluegold.me/2011/01/wordpress-to-static-html-with-nginx/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 16:59:09 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=608</guid>
		<description><![CDATA[nginx の try_files を使うことで、WordPress を静的HTML に変換して配信する方法について説明しています。]]></description>
			<content:encoded><![CDATA[<p style="font-size: 80%;">前に途中まで書いていた記事をようやく公開。（twitter の書き込みを見ると 2010年10月ごろか）</p>
<p>WordPress はユーザ数が多いだけに、必要なものはたいていプラグインとして用意されている非常に使いやすいCMSだと思いますが、毎回動的にしかページを作れないという点にはちょっと不満を持っていました。</p>
<p>nginx や Vernish などのプロキシサーバを別に立ててキャッシュさせる方法を試そうと思っていたのですが、はまりポイントが多いらしく躊躇していました。そんな時に <a href="http://wordpress.org/extend/plugins/really-static/">Really Static</a> というプラグインを見つけたときから、今回の話は始まります。</p>
<h3 style="border-left:7px solid #ccc;border-bottom:1px solid #ccc;padding:.6em .8em;">Really Static プラグインの問題点</h3>
<p>Really Static プラグインは、ブログの記事の HTML を PHP の curl 関数でダウンロードして static フォルダの中に置いておき、それ以降は PHP で動的に HTML を作るのではなく、静的な HTML ファイルを返す、といった事をしてくれるプラグインです。ちょうど、Ruby on Rails のページキャッシュみたいなイメージですね。</p>
<p>インストールも設定も難しくなく、HTML のダウンロードも WP-cron で少しずつ行われるため、完全に WordPress 内に閉じた環境で実現できるすぐれたプラグインだと思いますが、（私にとっては）ひとつだけ大きな欠点がありました。</p>
<p><span id="more-608"></span></p>
<p>それは、Really Static プラグインがサイトの構造(URL)を変えてしまうことでした。<br />
例えば、http://blog.bluegold.me/sample という URL の記事に対して、Really Static の導入後にアクセスすると http://blog.bluegold.me/static/sample.html に 301 redirect されてしまいます。<br />
さらには他のページに書かれたリンクも静的ファイルの URL を直接さすように変更されてしまうので、一度導入してしまうと、後で使うのをやめるときに元に戻すのが難しくなってしまうのではないかと思いました。</p>
<p>最初は Really Static プラグインに手を入れて、リンクの URL を変更させないようにしようと思ったんですが、コードを読むと仕組みは意外と単純だったので、Wordpress に統合することを考えなければ、nginx の try_files だけで、似たようなことが出来ることに気がつきました。</p>
<h3 style="border-left:7px solid #ccc;border-bottom:1px solid #ccc;padding:.6em .8em;">nginx の機能を使う</h3>
<p><a href="http://wiki.nginx.org/HttpCoreModule#try_files">nginx の try_files</a> はリクエストを処理する際に実際のファイルを探す順番を記述する nginx に固有の設定項目で、Apache では mod_rewrite の複雑なルールを駆使して実現できるようなことをシンプルなルールで記述できるようにしたものです。</p>
<p>現在のこのブログの nginx.conf には以下のような記述がされています。</p>
<pre class="brush: perl;">
location {
  gzip_static on;
#  try_files /system/maintenance.html /static/$uri/index.html $uri /index.php?q=$uri&amp;$args;
  try_files /system/maintenance.html /static/$uri/index.html$args $uri /index.php?q=$uri&amp;$args;
}
</pre>
<p>具体的な設定は WordPress のパーマリンクの設定で変わります。<br />
$uri にはリクエストされた URL のパスの部分が入っています。リクエストを処理する際は以下を順番に調べていって、最初に見つかったものを返します。</p>
<pre class="bq" style="font-size: 75%; white-space:normal;">
※ 2011/01/30 追記
静的HTML化した投稿を表す /static/$url/index.html には $args も付けておかないと、プレビューが出来ませんでしたので修正しました。
</pre>
<ul>
<li>メンテナンス画面(/system/maintenance.html)</li>
<li>今回追加した静的HTMLのキャッシュ</li>
<li>css や画像などの静的ファイル</li>
<li>それ以外は WordPress に処理を渡す</li>
</ul>
<p>この設定だけで静的なHTMLファイルの配信は出来るようになります。
</p>
<h3 style="border-left:7px solid #ccc;border-bottom:1px solid #ccc;padding:.6em .8em;">静的HTMLの作成</h3>
<p>あとはブログの各記事を HTML としてダウンロードするだけです。</p>
<pre class="bq">
$ wget -r --follow-tags=a http://blog.bluegold.me
</pre>
<p>（あくまでも例なので、自分のサイト意外にはやらないでくださいね。）
</p>
<p>静的HTMLに変換しておくことで、このくらい速くなりました。(それぞれ３回試行)</p>
<table>
<tr>
<th>&nbsp;</th>
<th>平均</th>
<th>最速</th>
<th>最遅</th>
</tr>
<tr>
<th>WordPressのみ</th>
<td>0.544s</td>
<td>0.385s</td>
<td>0.832s</td>
</tr>
<tr>
<th>静的HTML</th>
<td>0.086s</td>
<td>0.084s</td>
<td>0.088s</td>
</tr>
</table>
<p style="font-size: small;">実はこのブログは WPtouch プラグインも使っているので、このままでは iPhone 用の画面が表示されません。<br />
この対処法はまた次回。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2011/01/wordpress-to-static-html-with-nginx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>証明書と RSA 鍵がペアかどうかを調べる方法</title>
		<link>http://blog.bluegold.me/2010/08/how-to-check-certificate-and-private-key-pair/</link>
		<comments>http://blog.bluegold.me/2010/08/how-to-check-certificate-and-private-key-pair/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 14:36:34 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[pki]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=574</guid>
		<description><![CDATA[証明書ファイルと RSAの秘密鍵ファイルがペアになっているかどうかの確認方法をよく忘れるのでメモ]]></description>
			<content:encoded><![CDATA[<h2>証明書ファイルと RSAの秘密鍵ファイルがペアになっているかどうかの確認方法をよく忘れるのでメモ。</h2>
<p>RSA 鍵で作成した証明書の場合、証明書内の公開鍵と秘密鍵は同一のモジュロ(Modulus)を持っているので、これを比較します。</p>
<h3>証明書（公開鍵）</h3>
<pre class="bq">
openssl x509 -noout -modulus -in certificate_file.pem
</pre>
<h3>秘密鍵</h3>
<pre class="bq">
openssl rsa -noout -modulus -in private_key.pem
</pre>
<h3>ついでにCSR</h3>
<pre class="bq">
openssl req -noout -modulus -in cert_request.pem
</pre>
<p style="margin-top: 16px;">これらの実行結果として表示されるモジュロはかなり長くなるので、更に MD5 ダイジェストを計算した法が比較は簡単になります。</p>
<pre class="bq">
openssl x509 -noout -modulus -in certificate_file.pem | openssl md5
openssl rsa -noout -modulus -in private_key.pem | openssl md5
openssl req -noout -modulus -in cert_request.pem | openssl md5
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/08/how-to-check-certificate-and-private-key-pair/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Amazon S3 Plugin で画像を CloudFront から配信</title>
		<link>http://blog.bluegold.me/2010/08/using-wordpress-amazon-s3-plugin-with-cloudfront/</link>
		<comments>http://blog.bluegold.me/2010/08/using-wordpress-amazon-s3-plugin-with-cloudfront/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 17:37:58 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=543</guid>
		<description><![CDATA[Wordpress Amazon S3 Plugin を使ってメディアライブラリの画像を Amazon S3 に置き、CloudFront から配信する方法について説明します。]]></description>
			<content:encoded><![CDATA[<p><a href="/2009/04/wordpress-theme-amazon-cloudfront-cdn">以前の記事</a>にもある通り、このブログではスタイルシートや画像、JavaScript ファイルなどの静的ファイルを Amazon S3 に置いて、Amazon CloudFront から配信しています。</p>
<p>URLの切替には自作のプラグインを使っています。記事にした当時は stylesheet_uri と template_directory_uri の置き換えをするだけのものでしたが、今は WP_PLUGIN_URL も置換えて、プラグインが追加するスタイルや画像も CloudFront から配信しています。</p>
<p>ここまではわりと簡単に実装できていたのですが、メディアライブラリ(uploads ディレクトリ)に置いた画像ファイルは記事の中身を書き換える必要があるため、なかなか手を出せずに1年くらい放置していましたが、最近、<a href="http://imthi.com/wp-s3" rel="nofollow">WordPress Amazon S3 Plugin</a> というものがあるのを知り、さっそく試してみました。</p>
<p><span id="more-543"></span></p>
<p>このプラグインのセットアップは簡単で、plugins ディレクトリに置いて有効化したあとで、Amazon S3 の認証情報と画像を置くバケツ名を指定するだけです。</p>
<p>設定が完了した後はしばらく待っていると、wp-cron の仕組みを使い、誰かがアクセスしてきた時にバックグラウンドで画像ファイルを Amazon S3 にアップロードしていきます。(アップロードする画像はキューに入れられ、順番に処理されていくようです。)</p>
<p>画像ファイル毎に Amazon S3 へのアップロード状況が記録され、正常に保存された画像ファイルの URL は次回に表示される時から Amazon S3 の URL に置換えられます。</p>
<p>非常に簡単に使えて効果の高いプラグインなのですが、このブログの環境ではいくつか問題がありました。</p>
<h3>画像ファイルが完全URLで指定されている事が想定されている。</h3>
<p>このプラグインでは画像ファイルへの URL が http:// から始まる完全 URL で書かれている事を想定しているのですが、当ブログでは、ある記事では完全 URL、別の記事ではルート相対URL、という感じで記事ごとに画像の URL の書き方がバラバラでした。<br />
このため、画像への URL を探す正規表現にマッチしない画像がたくさん出てきてしまいました。</p>
<p>メディアライブラリから画像を「投稿に挿入」していれば、完全URLで書かれるので普通に使っていれば問題は無かったはずなんですが。。。</p>
<p>しかたがないので、これはプラグインのソースに手を入れてルート相対URLでも書き換えられるように修正しました。</p>
<h3>CloudFront の URL に対応していない。</h3>
<p>このプラグインは画像ファイルのURLを <strong>http://&gt;バケツ名&lt;.s3.amazonaws.com </strong> という場所に変更するのですが、私のデータは Amazon S3 の中でも北米東海岸のサーバに置かれているため、ファイルの送信にちょっと時間がかかります。どうせなら国内の CloudFront のサーバから配信したいので、以下のようにソースを修正しました。wp-cdn.bluegold.me はヂストリビューションに付けた CNAME です。</p>
<pre class="brush: php;">
*** 212,218 ****
  if (file_exists ( $mediaInfo [ 'cache' ] ) === TRUE) {
          $fileContents = file_get_contents ( $mediaInfo [ 'cache' ] );
          if ($fileContents == 'done') {
!           $cdnUrl = &quot;http://{$this-&gt;s3BucketName}.s3.amazonaws.com/&quot; . $mediaInfo [ 'path' ];
            $the_content = str_replace ( $mediaInfo [ 'url' ], $cdnUrl, $the_content );
          }
  } else {
--- 214,221 ----
 if (file_exists ( $mediaInfo [ 'cache' ] ) === TRUE) {
         $fileContents = file_get_contents ( $mediaInfo [ 'cache' ] );
         if ($fileContents == 'done') {
! //       $cdnUrl = &quot;http://{$this-&gt;s3BucketName}.s3.amazonaws.com/&quot; . $mediaInfo [ 'path' ];
!           $cdnUrl = &quot;http://wp-cdn.bluegold.me/&quot; . $mediaInfo [ 'path' ];
             $the_content = str_replace ( $mediaInfo [ 'url' ], $cdnUrl, $the_content );
         }
 } else {
</pre>
<p>このプラグインは非常に簡単に使えるので、Amazon S3 のアカウントを持っている人にはお勧めできますね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/08/using-wordpress-amazon-s3-plugin-with-cloudfront/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VeriSign のタイムスタンプ証明書</title>
		<link>http://blog.bluegold.me/2010/07/verisign-timestamp-certificate-short-validity-period/</link>
		<comments>http://blog.bluegold.me/2010/07/verisign-timestamp-certificate-short-validity-period/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 06:08:05 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[pki]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=472</guid>
		<description><![CDATA[VeriSign のタイムスタンプ証明書の有効期限が残り２年をきったので、何とかしてほしいなぁ、という愚痴のエントリ。]]></description>
			<content:encoded><![CDATA[<p>VeriSign のタイムスタンプ証明書の有効期限について気になる今日この頃。</p>
<p>VeriSign の<a href="https://www.verisign.co.jp/codesign/authenticode/index.html">Authenticode用の証明書</a>を使っています。 これは .exe や .cab ファイルなどにコードサイニングを行うためのマイクロソフトの仕様に沿った証明書で、昔は ActiveX 専用なイメージでしたが、最近は IE がファイルをダウンロードする時にも検証されるので、それなりに重要なものだったりします。</p>
<p>基本的に証明書の有効性は証明書自身の有効期間の間しか確認できません。（その為の有効期間なわけですから当然ですが） しかし、例えばインストーラを作成してウェブに公開するような時に、コードサイン用証明書の有効期限が切れて更新するたびに、公開している全てのファイルに対して署名をやり直すのは大変です。</p>
<p>こういった事にならないように、通常は署名時に<a href="http://www.atmarkit.co.jp/aig/04biz/timestamp.html">タイムスタンプ</a>を付けておきます。タイムスタンプは「あるファイルがタイムスタンプをつけた時点で存在し、タイムスタンプをつけてからは変更されていない」事を証明するためのサービスで、デジタル署名にタイムスタンプがついている場合は、署名した証明書の有効期限が過ぎた後も、有効性を確認することができます。</p>
<p>ただ、タイムスタンプ自身も電子署名の一種なので、証明書の有効期限が存在します。この有効期限を過ぎるとタイムスタンプの有効性が確認できなくなるので、有効期間の残りが少なくなってくると意味がなくなってしまいます。</p>
<p><span id="more-472"></span></p>
<p>ようやく本題。<br />
VeriSign でも http://timestamp.verisign.com/scripts/timstamp.dll というURLでタイムスタンプサーバを 公開していているのですが、そこでタイムスタンプの署名に使われる証明書の有効期限は以下のようになっています。</p>
<div id="gallery" style="margin: 4px auto 4px auto; width: 410px;">
<a href="http://wp-cdn.bluegold.me/2010/07/hidemaru_timestamp1.png" style="margin: 4px;"><img src="http://wp-cdn.bluegold.me/2010/07/hidemaru_timestamp1.png" width="128" /></a><a href="http://wp-cdn.bluegold.me/2010/07/hidemaru_timestamp2.png" style="margin: 4px;"><img src="http://wp-cdn.bluegold.me/2010/07/hidemaru_timestamp2.png" width="128" /></a><a href="http://wp-cdn.bluegold.me/2010/07/hidemaru_timestamp3.png" style="margin: 4px;"><img src="http://wp-cdn.bluegold.me/2010/07/hidemaru_timestamp3.png" width="128"  /></a>
</div>
</p>
<p>真ん中の画像の「VeriSign Time Stamping Services Signer &#8211; G2」がタイムスタンプ用の証明書で、有効期限は 2007/06/05 から 2012/06/15 までとなっています。</p>
<p>これを書いているのが、2010/07/31 なので、もう残りが２年ない。。。<br />
有効期限の残りが２年を切る前に流石に更新されるか、少なくともロードマップのアナウンスがあるかと思ってたんですが、何もなかったんですよね。</p>
<p>元から有効期限が５年しかないので、毎年更新するくらいでちょうどいいと思うんですが。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bluegold.me/2010/07/verisign-timestamp-certificate-short-validity-period/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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 に導入されたマルチプロセスにより、デフォルトの設定では VisualStudio から IE をアタッチしてデバッグすることができなくなったことに対する解決策。]]></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>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>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>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>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[Linux の Software RAID (md デバイス) を使う際に、障害の起きたディスクの交換手順のメモ。]]></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[Rails 2.3 にて ActiveRecord のフィールドの参照のしかたによって、タイムゾーンが変わってしまう問題。]]></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 = 'Tokyo'
config.active_record.default_timezone = 'Tokyo'
</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>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の内容から、ブラウザが実際に使用する暗号アルゴリズムに関する興味深い発表を紹介。]]></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[XCacheの管理画面を表示するための設定方法と、XCache を監視するための munin 用プラグインについて]]></description>
			<content:encoded><![CDATA[<p>前に書いた<a href="/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://wp-cdn.bluegold.me/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://wp-cdn.bluegold.me/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[Safari 4 にアップデートしてフラッシュが見れなくなった時の対処法について。]]></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 に参加したさいの感想など。]]></description>
			<content:encoded><![CDATA[<p><img src="http://wp-cdn.bluegold.me/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://wp-cdn.bluegold.me/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='-O3'
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[複数のブログを持つサイトで XCache Object Cache Plugin for WordPress を使用すると、サイト間でログイン情報などのキャッシュが混ざってしまう問題について]]></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[performance]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.bluegold.me/?p=164</guid>
		<description><![CDATA[WordPress のテーマで使用するスタイルシートや JavaScript、画像ファイルを Amazon S3 に置いて、Amazon の CDN サービスである CloudFront から配信するための方法について説明します。]]></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(&#8216;template_directory&#8217;); と bloginfo(&#8216;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'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('stylesheet_uri','filter_cdn_css');
add_filter('template_directory_uri','filter_cdn_template_dirctory');
?&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://wp-cdn.bluegold.me/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>1</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[POPFile から IMAP で Gmail にアクセスしてラベルを設定する方法について]]></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[WordPress の wpads プラグインで日本語が文字化けする問題の対処方法について説明します。]]></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, 'UTF-8');?&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, 'UTF-8');?&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://wp-cdn.bluegold.me/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>7</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[Rails 1.2.6 と rubygems 1.3.0 を一緒に使った時に表示される deprecated メッセージが表示されないようにするには]]></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('/dev/null')
require File.dirname(__FILE__) + '/../config/boot'
require 'commands/console'
</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[last.fm のプレイリストをブログに表示するために書いた Ruby プログラムの説明]]></description>
			<content:encoded><![CDATA[<p><img src="http://wp-cdn.bluegold.me/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('bluegold')
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 15:28:29 +0000</pubDate>
		<dc:creator>bg</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[performance]]></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 で XCache を有効にする方法と、WordPress のデータをキャッシュするプラグインの説明。]]></description>
			<content:encoded><![CDATA[<p><a href="/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://wp-cdn.bluegold.me/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 の設定方法について説明します。]]></description>
			<content:encoded><![CDATA[<p><img src="http://wp-cdn.bluegold.me/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="/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 の設定ファイルについて、ログを Apache の combind フォーマットで出力する方法と、VirtualHost の設定方法を説明しています。]]></description>
			<content:encoded><![CDATA[<p><img src="http://wp-cdn.bluegold.me/2008/10/nginx-small.png" width="150" height="50" alt="" class="title_img" /></p>
<p><a href="/2008/10/configure-nginx/" title="blog構築メモ: nginx を設定する">前回</a>紹介したnginx.conf についてもう少し掘り下げて説明します。</p>
<h2>ログフォーマット</h2>
<pre class="brush: bash;">
    log_format  main  '$remote_addr - $remote_user [$time_local] &quot;$request&quot; '
                      '&quot;$status&quot; $body_bytes_sent &quot;$http_referer&quot; '
                      '&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot; &quot;$gzip_ratio&quot;';

    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[WordPressのバックアップを GMail に保存する方法。添付ファイルつきのメールを送信する Ruby のスクリプト。]]></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 'rubygems'
require 'tmail'
require 'net/smtp'
require 'nkf'
require 'etc'
require 'socket'
require 'optparse'

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('-s', '--subject=subj', 'subject of the message. (default=(none))') do |arg|
      subject = arg
    end
    opt.on('-f', '--from=from', 'from address.') do | arg|
      from = arg
    end
    opt.on('-j', '--ja', 'handle japanese message. (default=off)') do
      ja_locale = true
    end
    opt.on('-a', '--attachment=file', 'attachment') 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 = '1.0'

  # 本文の処理
  if attachments.empty?
    message = mail
  else
    message = TMail::Mail.new
    message.transfer_encoding = '7bit'
  end
  if ja_locale
    message.body = &lt;span class=&quot;caps&quot;&gt;NKF.&lt;/span&gt;nkf('-j', body)
    message.set_content_type 'text', 'plain', 'charset' =&amp;gt; 'iso-2022-jp'
  else
    message.body = body
    message.set_content_type 'text', 'plain'
  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('m').chomp.gsub(/.{76}/, &quot;\\1\n&quot;)
      attachment = TMail::Mail.new
      attachment.body = encoded_body
      attachment.transfer_encoding = 'base64'
      attachment.set_content_type('application', 'octet-stream', 'name' =&amp;gt; filename)
      attachment.set_content_disposition('attachment',
                 'filename' =&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 'cannot get user account; abort.'
    exit 1
  end
  if domain = (Socket.gethostname || &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;['HOSTNAME'] || &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;['HOST'])
    user + '@' + domain
  else
    user
  end
end

def getlogint
  begin
    require 'etc'
    Etc.getlogin
  rescue LoadError
    &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;['LOGNAME'] || &lt;span class=&quot;caps&quot;&gt;ENV&lt;/span&gt;['USER']
  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[WordPressのバックアップファイルを afio で圧縮する際に 256bit のAES で暗合する方法を紹介しています。AES 暗号には openssl コマンドを使用しています。]]></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[WordPressのデータベースのバックアップして 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[軽量ウェブサーバー nginx のビルド方法と設定ファイルについて簡単に説明しています。]]></description>
			<content:encoded><![CDATA[<p><img src="http://wp-cdn.bluegold.me/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  '$remote_addr - $remote_user [$time_local] &quot;$request&quot; '
                      '&quot;$status&quot; $body_bytes_sent &quot;$http_referer&quot; '
                      '&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot; &quot;$gzip_ratio&quot;';

    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>

