<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Carpe Diem</title>
	
	<link>http://www.sssg.org/blogs/naoya</link>
	<description>Who knows hacker is?</description>
	<lastBuildDate>Sun, 29 Aug 2010 13:50:34 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/n0ts" /><feedburner:info uri="n0ts" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>情熱プログラマー</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/y6w550A8HvM/1852</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1852#comments</comments>
		<pubDate>Sun, 29 Aug 2010 13:50:34 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1852</guid>
		<description />
			<content:encoded><![CDATA[<p><a href="rubykaigi.org">Rubykaigi</a> で、すっかり買うのを忘れていた情熱プログラマーを購入した。</p>
<p>この本は、達人プログラマーという本があったが、その本のコンセプトに近い、プログラマーが幸せに生きるためのヒントが合計 53 の項目に書かれてまとめられている本です。</p>
<p>個人的にぐっときた項目を紹介したいと思います。</p>
<p>5. 自分の知性に投資しよう (Invest in Your Intelligence)</p>
<blockquote><p>自分がこれから学ぶべきテクノロジーをどうやって選択するのか、そのヒントが書かれています。これから主流になりそうなテクノロジーを学ぶことが重要だけれど、そうでなくあえて主流でないテクノロジーを学ぶことで自分自身を高めることができるという発想は個人的にはなかった。もちろんその主流でないテクノロジーの達人になるのではなく、他のプログラミン言語との特徴や違いをつかむことが重要とのこと。</p>
<p>個人的には、まったく関数型言語を使ったことがないので、これから挑戦してみようと思います。</p></blockquote>
<p>15 一に練習、二に練習 (Practice, Practice, Practice)</p>
<blockquote><p>本番で練習するという考え方はもう捨てること。自分の技術にちゃんと時間を投資して練習し続けることの大切が書かれています。たくさん練習することで、自分の技術は磨かれる。当たり前と言ってしまうと、確かにそうですが、なかなか実務に忙しいときは練習量が減ってしまうことも多々あるかと思います。なので、練習するという意識はもち続けることが大切なのだと思います。</p></blockquote>
<p>28. 8時間燃焼 (Eight-Hour burn)</p>
<blockquote><p>毎日、職場についたら8時間！やって、やって、やるしかない！という気持ちで業務に取りかかって、終了の時刻を自分に厳しく課して生産性を向上あげようというもの。けっこう僕の場合、最初はだらだらしがちになってしまうことが多いので、この8時間燃焼という考え方は実践してみたいと思います。</p>
<p>午前4時間、お昼休憩1時間、午後4時間、そのサイクルでくたくたになるまで集中して取り組む。もちろん、Twitter やメッセなどは全部切って集中する。終わったら、帰宅してくつろいで好きなことをする。</p></blockquote>
<p>そして、最後の項目。</p>
<p>53 独立する (Go Independent)</p>
<blockquote><p>個人的に今年の４月からフリーランスとしての独立をしてしまったので、感情深いエッセイとして読んでしまった。僕も、この項目に書かれている内容を決意して独立をしました。何事も分かりやすいのが、一番なので。</p></blockquote>
<p>この他にも、53の項目以外にも、コラムがあってその中には GitHub の誕生秘話などもあって、かなり面白いのでプログラマー・エンジニアの方は読んでみるのをおすすめします。</p>
<p><iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=du00-22&#038;o=9&#038;p=8&#038;l=as1&#038;asins=4274067939&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/y6w550A8HvM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1852/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1852</feedburner:origLink></item>
		<item>
		<title>Rails でメンテナンス画面を表示する方法</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/CHU3GeIfrfQ/1845</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1845#comments</comments>
		<pubDate>Tue, 17 Aug 2010 11:23:36 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1845</guid>
		<description />
			<content:encoded><![CDATA[<p>今日は、Rails でメンテナンス画面を表示する方法を紹介したいと思います。今のところ、次のような方法で行っています。</p>
<p>環境は、次のとおりです。</p>
<ul>
<li>OS: CentOS 5.x x86_64</li>
<li>ロードバランサー: LVS + keepalived</li>
<li>ウェブサーバ: Apache + Passenger + Rails</li>
</ul>
<p>サービスをメンテナンス状態にしたいとき、次の方法が考えらます。</p>
<ol>
<li>ロードバランサー側の iptables を使って、ロードバランサー側でメンテナンス表示画面を返す</li>
<li>ウェブサーバ側で、メンテナンス表示画面を返す</li>
</ol>
<p>1 だと、メンテナンスへの切り替えが面倒なので、僕は 2 の方法で行っています。</p>
<p>ウェブサーバ側で、次のようなルールを記述しておきます。</p>
<blockquote><p>RewriteEngine On<br />
RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f<br />
RewriteCond %{SCRIPT_FILENAME} !maintenance.html<br />
RewriteRule ^(.*)$ /$1 [R=503,L]</p></blockquote>
<p>DocumentRoot 以下に maintenance.html というファイルがあるとき、そのファイルを返すというシンプルなルールです。</p>
<p>メンテナンス表示に切り替えるには、maintenance.html を置くだけなので、プログラムのデプロイにも使っている capistrano の ::deploy::web の disable / enable を、次のように定義します。</p>
<blockquote><p>namespace :web do<br />
task :disable do<br />
on_rollback {<br />
run &#8220;rm #{current_path}/public/maintenance.html&#8221;<br />
}</p>
<p>run &#8220;cp #{current_path}/templates/maintenance.html #{current_path}/public/&#8221;<br />
end</p>
<p>task :enable do<br />
run &#8220;rm #{current_path}/public/maintenance.html&#8221;<br />
end<br />
end</p></blockquote>
<p>あとは、このタスクを使って、次のコマンド一発でメンテナンスへの切り替えをすることができます。</p>
<blockquote><p>$ cap deploy:web:disable</p></blockquote>
<p>メンテナンス状態を解除する場合には、次のコマンド一発です。</p>
<blockquote><p>$ cap deploy:web:enable</p></blockquote>
<p>また、メンテナンス表示のとき、画像を返さないといけない場合は、<a href="http://www.sssg.org/blogs/naoya/archives/1466">mod_asis</a> を使って、次ようなルールを定義しています。</p>
<blockquote><p>AddHandler send-as-is asis</p>
<p>RewriteEngine On<br />
RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f<br />
RewriteRule ^(.*)$ /images/transparent.gif.asis [NC,L]</p></blockquote>
<p>transparent.gif.asis は、1&#215;1 の白い、次のヘッダーがついた gif です。</p>
<blockquote><p>Status: 200 OK<br />
Content-Type: image/gif<br />
Expires: Thu, 01 Jan 1970 00:00:00 GMT<br />
Pragma: no-store<br />
Cache-Control: no-store</p></blockquote>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/CHU3GeIfrfQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1845/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1845</feedburner:origLink></item>
		<item>
		<title>(おそらく)サーバをたくさん並べるのは流行らない</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/bwiERULlf7g/1841</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1841#comments</comments>
		<pubDate>Wed, 04 Aug 2010 21:06:03 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1841</guid>
		<description />
			<content:encoded><![CDATA[<p>これからの時代、(おそらく)サーバをたくさん並べるのは流行らないと思っています。</p>
<p>その理由は、次のとおりです。</p>
<ul>
<li>最近のサーバには、かなりの大量のメモリが搭載できる</li>
<li>CPU の処理速度もマルチコア化がかなり進んでいて上がっている</li>
<li>仮想化技術が当たり前のようになっていてサーバのリソースをまんべんなく使えるようになっている</li>
<li>最初のボトルネックになりがちだったディスクも SSD や Fusion I/O を搭載できる</li>
<li>ラックの最大許容電力の問題</li>
</ul>
<p>具体的な例をあげてみましょう。いつもこのブログでは DELL サーバを例にとっているので、今回は HP のサーバを例にとってみます。</p>
<p>例えば、HP の <a href="http://h50146.www5.hp.com/products/servers/proliant/dl_lineup2w.html">ProLiant DL360 G7</a> では、最大次のような仕様になっています。</p>
<ul>
<li>サイズ: 1U</li>
<li>CPU: Xeon 5500/5600番台 x 2</li>
<li>Memory: 192GB (DDR3、18 スロット)</li>
<li>Disk: 2.5 SAS/SATA x 8</li>
<li>NIC: 4ポート</li>
<li>PCI Express: 2 スロット</li>
</ul>
<p>このサーバを、次のスペックで見積もってみると、約67万円くらいでした。</p>
<ul>
<li>CPU: Xeon L5520 x 2</li>
<li>Memory: 48GB</li>
<li>Disk: 120GB 2.5 inch x 2</li>
</ul>
<p>いっけん高いようにみえますが、比較するべきは、次のようなスペックのマシンを２台購入したときとのコストの比較になると思います。</p>
<ul>
<li>CPU: Xeon L5520 x 1</li>
<li>Memory: 24GB</li>
<li>Disk: 120GB 2.5inch x 1</li>
</ul>
<p>もちろん、マシンは機械である以上故障はするので、故障のリスクも考えないといけませんが、できる限りマシンは減らした方がサーバの運営管理コストは下がるので、量と質の問題を考えなければいけません。</p>
<p>さらに、4U の <a href="http://h10010.www1.hp.com/wwpc/jp/ja/sm/WF05a/15351-15351-3328412-3328422-3328422-4142916.html">ProLiant GL580 G7</a> というサーバには、メモリをなんと最大 1TB まで搭載できます。コストは相当なかかると思いますが、コストはイニシャルコストとランニングコストのバランスの問題になってくるはずです。</p>
<p>すこし前までは、メモリが足りない、ディスクが遅い、などの理由で、多数の 1U サーバを並べる傾向が強かったような気がしています。</p>
<p>さらにクラウドでも、同じような傾向があります。クラウド大手の <a href="http://aws.amazon.com/ec2/#pricing">Amazon EC2</a> をみてみると、High Memory Instance として次の 3 種類が提供されています。</p>
<ul>
<li>High-Memory Extra Large Instance 17.1 GB memory, 6.5 ECU (2 virtual cores with 3.25 EC2 Compute Units each), 420 GB of local instance storage, 64-bit platform</li>
<li>High-Memory Double Extra Large Instance 34.2 GB of memory, 13 EC2 Compute Units (4 virtual cores with 3.25 EC2 Compute Units each), 850 GB of local instance storage, 64-bit platform</li>
<li>High-Memory Quadruple Extra Large Instance 68.4 GB of memory, 26 EC2 Compute Units (8 virtual cores with 3.25 EC2 Compute Units each), 1690 GB of local instance storage, 64-bit platform</li>
</ul>
<p>Quadruple Extra Large を選択すると、なんと 68.4GB メモリが搭載されています。</p>
<p>価格は、現時点で次のとおりです。(US &#8211; N.California, Linux の場合)</p>
<ul>
<li>Extra Large: $0.57 per hour</li>
<li>Double Extra Large: $1.34 per hour</li>
<li>Quadruple Extra Large: $2.68 per hour</li>
</ul>
<p>Extra Large と Quadruple Extra Large の価格差は約 4.7 倍程度で、おおよそ実際のスペックと同じ比率になっています（若干すこし高めの設定ですが）。</p>
<p>この価格なら、例えば Extra Large を 5 台並べるか、Quadruple Extra Large を 1 台にするか、どちらがいいのか考える必要があるでしょう。</p>
<p>もちろん、サーバが少ないときのデメリットも、サーバが１台ダウンしたときの影響が大きいが考えられます。</p>
<p>すこし前まではサーバの多く並べる傾向が強かったと思います。</p>
<p>ただ、これからの時代はどちらかというと、サーバをたくさん並べるよりも、処理能力の高いサーバを少なく並べる傾向が強くなってくると思います。</p>
<p>つまり、僕はできる限り多くの同時リクエストを１台のサーバでさばく、そんな時代になってくると思うので、その流れにあった技術を身につけるのが重要になるのではないかと思います。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/bwiERULlf7g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1841/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1841</feedburner:origLink></item>
		<item>
		<title>Linux から IPMI の IP アドレスを変更する方法</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/UxtaQmg3uCI/1836</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1836#comments</comments>
		<pubDate>Sun, 25 Jul 2010 23:18:45 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[ipmi]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1836</guid>
		<description />
			<content:encoded><![CDATA[<p>通常の IA サーバは、IPMI の IP アドレスは BIOS 上から変更できるようになっています。最初に BIOS から IPMI の IP アドレスを変更して、Linux(CentOS) をセットアップして本番投入直前になって諸事情によって IPMI の IP アドレスとサブネットマスクを変更することになりました。</p>
<p>このとき OS を再起動して、BIOS から変更すれば IPMI の IP アドレスを変更することが可能ですが、データセンターの現地にいって一台ずつ再起動するのが面倒です。</p>
<p>Linux 上からだと、IPMI のサービスを起動することによって、IPMI の IP アドレスを変更することができます。仮想化をしている場合には、物理サーバ上から変更することができます。</p>
<p>まず、IPMI のサービス、imptool をインストールします。</p>
<blockquote><p>$ sudo yum install OpenIPMI ipmitool</p></blockquote>
<p>次に IPMI のサービスを起動します。</p>
<blockquote><p>$ sudo service ipmi start</p>
<p>Starting ipmi drivers:                                     [  OK  ]</p></blockquote>
<p>IPMI サービスを起動すると、ipmi のデバイスが見えます。</p>
<blockquote><p>$ dmesg | grep ipmi</p>
<p>ipmi message handler version 39.1<br />
ipmi_si: Trying SMBIOS-specified kcs state machine at i/o address 0xca2, slave address 0&#215;0, irq 0<br />
ipmi: Found new BMC (man_id: 0x00XXXX,  prod_id: 0xXXXX, dev_id: 0xXX)<br />
ipmi device interface</p></blockquote>
<p>この状態で、ipmitool を使って IP アドレスとサブネットマスクを変更します。</p>
<blockquote><p>$ sudo ipmitool lan set 1 ipaddr X.X.X.X</p>
<p>$ sudo ipmitool lan set 1 netmask 255.255.0.0</p></blockquote>
<p>この変更にはすこし時間がかかることもあるので、プロンプトが返ってくるまで待ちます。</p>
<p>変更したら、正しく変更されているか確認します。</p>
<blockquote><p>$   ipmitool -I lanplus -H X.X.X.X -U ＜ユーザ名＞ -P ＜パスワード＞ lan print</p></blockquote>
<p>IPMI の IP アドレスなどの変更ツールは、IA サーバのメーカー製のツールがあってそのツールからも変更できますが、ipmitool を使うことによって同じ方法で変更できるので便利です。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/UxtaQmg3uCI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1836/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1836</feedburner:origLink></item>
		<item>
		<title>Puppet キャンプ in ヨーロッパ</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/puRUJzamzxg/1834</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1834#comments</comments>
		<pubDate>Mon, 05 Jul 2010 16:05:30 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1834</guid>
		<description />
			<content:encoded><![CDATA[<p>すこし前のことになりますが、ベルギーにて 3 月 27 〜 28 日まで Puppet キャンプが開催されました。</p>
<p><a href="http://www.puppetlabs.com/blog/puppet-camp-europe-videos-are-live/">Puppet Labs</a> に、そのときの動画をスライドがすべて公開されています。</p>
<p>動画はあとでチェックすることにして、スライドだけチェックしてみました。講演のタイトルは、次のとおりです。</p>
<ul>
<li>Portable infrastructure with Puppet – Luke Kanies (<a href="http://www.slideshare.net/lkanies/portable-infrastructure-with-puppet">Slides</a>|<a href="http://blip.tv/file/3759475">Video</a>)</li>
<li>Embedded Puppet – Alban Peignier (<a href="http://projects.tryphon.eu/blog/2010/05/28/puppetcamp-embedded-systems/">Slides</a>|<a href="http://blip.tv/file/3759768/">Video</a>)</li>
<li>Deploying datacenters with Puppet – A user’s perspective – Rafael  Brito (<a href="http://www.puppetlabs.com/wp-content/uploads/2010/06/NYX_puppet_camp.ppt">Slides</a>|<a href="http://blip.tv/file/3759812/">Video</a>)</li>
<li>Puppet modules and module standards – Alessandro Franceschi (<a href="http://www.lab42.it/presentations/puppetmodules/puppetmodules.html">Slides</a>|<a href="http://blip.tv/file/3759722/">Video</a>)</li>
<li>Auditing change management policies with Puppet and Splunk – Jeff  McCune (<a href="http://dl.dropbox.com/u/469429/PuppetChangeManagement.pdf">Slides</a>|<a href="http://blip.tv/file/3759813/">Video</a>)</li>
<li>Puppet in complex, real-time environments – Rick van der Zwet (<a href="http://blip.tv/file/3760605/">Video</a>)</li>
</ul>
<p>まずは、Puppet の中心人物である Luke さんの発表。この発表では、おもに Puppet の現在の状況と、これからの展望について発表がありました。以下、メモです。</p>
<ul>
<li>Puppet は、安定している（現在のリリースバージョンは、0.25.5）</li>
<li>Puppet は、さまざまな面で日々高速に進化している</li>
<li>Puppet は、さまざまな分野で使われている（Google、DELL、Disney、J.P.Morgan など）</li>
<li>Puppet キャンプ 2009 では、次のことを約束した</li>
<blockquote>
<li>バージョン 1.0 のリリース &#8230; 1.0 / 2.0 はスキップして、現在 2.6 で<a href="http://projects.puppetlabs.com/versions/show/23">開発中</a>で、いくつか大きな機能を盛り込んでいる、Pure Ruby DSL(*1)、クラスパラメータ(*2)、REST への移行がすべて完了する、puppet のプログラム一つに移行する（例えば、puppetmastered -&gt; puppet master となる）、レポートにさらに詳細な情報が含まれるようになる、新しい関連を示すシンタックスが追加される(*3)、ハッシュ(*4)</li>
</blockquote>
<blockquote>
<li>Web GUI アプリケーション &#8230; <a href="http://www.puppetlabs.com/puppet/related-projects/dashboard/">Puppet Dashboard</a> としてリリースした</li>
<li>モジュール &#8230; モジュールを共有できる場所として <a href="http://forge.puppetlabs.com/">Puppet Forge</a> をリリースした</li>
</blockquote>
</ul>
<p>(*1) Pure Ruby DSL</p>
<p>Puppet 2.6 では、Ruby で DSL として、次のような感じで記述することができる。ついにこの機能が登場しそうです。Ruby で記述できれば、特殊な Puppet DSL を学習することができなくて済みますね（大きな概念は変わらないと思いますが）。おそらく、これはユーザの声をきいた結果だと個人的に思います。</p>
<blockquote><p>hostclass &#8220;foo&#8221; do</p>
<p>package :foo, :ensure =&gt; :present</p>
<p>service :foo, :ensure =&gt; :running</p>
<p>end</p>
<p>node &#8220;hoge.example.com&#8221; do</p>
<p>acquire &#8220;ssh&#8221;</p>
<p>end</p></blockquote>
<p>(*2) クラスにパラメータを与えることができる</p>
<blockquote><p>class foo($hoge = &#8220;bar&#8221;) {</p>
<p>&#8230;</p>
<p>}</p>
<p>class { foo: hoge =&gt; &#8220;bar&#8221; }</p></blockquote>
<p>(*3) 次のようなシンタックスが追加される、個人的にはちょっと複雑な文法なので使いこなせなさそうです</p>
<blockquote><p>notify { b: } -&gt; notify { a: } -&gt; notify { c: }</p>
<p>Notify[b] ~&gt; Notify[a] ~-&gt; Notify[c]</p></blockquote>
<p>(*4) ハッシュ、Ruby のハッシュっぽく記述することができる、これは重宝しそうです</p>
<blockquote><p>class foo {</p>
<p>$data = {}</p>
<p>$data[one] = 1</p>
<p>$data[one] = 2</p>
<p>file { &#8220;/tmp/hoge&#8221;: content =&gt; template(&#8220;foo/tmp/hoge&#8221;), }</p></blockquote>
<p>Puppet Forge については、改めて別の機会に紹介したいと思います。</p>
<p>次の話は、Puppet を組み込む方法について。これは省略します。</p>
<p>その次の話は、Puppet を使って複数のデータセンターを構築する方法の話。OS は、RHEL でしたが、その中で kickstart の pre セクションで、MAC アドレスを登録する次のスクリプトは、なるほどと思いました。</p>
<blockquote><p>%pre<br />
SERVER=`grep &#8216;url address&#8217; /tmp/anaconda.log | awk &#8216;{print $6}&#8217;`<br />
cd /tmp &amp;&amp; wget -q http://${SERVER}/pub/dmidecode<br />
chmod +x /tmp/dmidecode<br />
SN=`dmidecode | grep &#8220;Serial Number&#8221; | head -1 | awk &#8216;{print $3}&#8217;`<br />
MAC=`ifconfig | grep HWaddr | awk &#8216;{print $5}&#8217;`<br />
wget -q http://${SERVER}/cgi-bin/register.pl?mac=$MAC\&amp;sn=$SN<br />
reboot</p></blockquote>
<p>上のスクリプトでは、MAC アドレスと dmidecode をしたマシンのシリアル番号を register.pl へ送っています。</p>
<p>僕は、いままでマシンの BIOS などで MAC アドレスを確認していましたが、この方法を応用すれば自動化できる可能性が出てきました、さっそく挑戦してみたいと思います！</p>
<p>その次の話では、Puppet モジュールの標準的な書き方について、いくつか参考になる話があったのでまとめておきます。</p>
<p>include するときのポイント。次のように使い分けると分かりやすい。</p>
<ul>
<li>include postfix &#8211; Postfix サービスをインストールして実行する</li>
<li>include postfix::disable &#8211; Postfix をインストールするがサービスは実行しない</li>
<li>include samba::server &#8211; Samba サーバをインストールする</li>
<li>include samba::client &#8211; Samba クライアントをインストールする</li>
</ul>
<p>import と include の違いは、Puppet の中で重要なので押さえておきたいところです。次のような違いがあります。</p>
<ul>
<li>import autofs &#8211; $modulepath/autofs/manifests/init.pp を読み込む</li>
<li>include autofs::server &#8211; $modulepath/autofs/manifests/server.pp を読み込む</li>
</ul>
<p>puppetdoc コマンドを使うと、コメントが含まれているマニフェストからドキュメントを生成することができる。例えば、次のようなマニフェストを書く。</p>
<blockquote>
<pre># Class: apache
#
# このモジュールは Apache を管理します
#
# Parameters:
#
# Actions:
#
# Requires:
#
# Sample Usage:
#
# [注意: コメントとクラス定義の間には空行を入れないこと]
class apache {
	...
}
</pre>
</blockquote>
<p>最後の二つの講演は、特に参考になる情報はありませんでしたが、Puppet キャンプ楽しそうです！</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/puRUJzamzxg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1834/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1834</feedburner:origLink></item>
		<item>
		<title>RE: 独自/ミラー yum リポジトリを作ろう</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/VDcfKayNTZk/1831</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1831#comments</comments>
		<pubDate>Tue, 15 Jun 2010 11:59:52 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[cobbler]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1831</guid>
		<description />
			<content:encoded><![CDATA[<p>アシアルさんのブログに「<a href="http://blog.asial.co.jp/681">独自/ミラー yum  リポジトリを作ろう</a>」というエントリが公開されました。</p>
<p>とても分かりやすく「独自/ミラー yum リポジトリ」を作る方法がまとまっている素晴らしいエントリです。</p>
<p>アシアルさんのブログでは、rsync や createrepo などを手動で使っていますが、これを cobbler というツールを使うともっと簡単に「独自/ミラー yum リポジトリ」を作成することができます。</p>
<p>まず、CentOS 5.x のミラーを作成する方法を紹介します。</p>
<p>EPEL を設定してから、cobbler をインストールします。</p>
<blockquote><p>$ sudo yum install cobbler</p></blockquote>
<p><a href="http://www.centos.org/modules/tinycontent/index.php?id=30">CentOS ミラーサイト一覧</a>から、自分がいる国にいる近いサイトの rsync 可能なミラーサイトを選びます。ミラーサイトを選んだら、次のコマンドでミラーします。</p>
<blockquote><p>$ sudo cobbler import &#8211;path=rsync://your_centos_mirror_site/centos &#8211;name=centos &#8211;arch=x86_64</p></blockquote>
<p>rsync し終わったら、httpd を起動してから、/etc/yum.repos.d に次のような yum リポジトリを追加します。</p>
<p>cobbler をインストールすると、自動的に必要な yum リポジトリの公開設定が /etc/httpd/conf.d/cobbler.conf にされています。</p>
<blockquote><p>[centos]<br />
name=centos<br />
baseurl=http://localhost/cobbler/repo_mirror/centos<br />
enabled=1<br />
gpgcheck=0<br />
priority=1</p></blockquote>
<p>ミラーを更新したい場合は、次のような cron を root ユーザの cron で設定します。</p>
<blockquote><p>/usr/bin/cobbler reposync &#8211;tries=3 &#8211;no-fail &gt; /dev/null 2&gt;&amp;1</p></blockquote>
<p>独自の yum リポジトリを作成した場合は、RPM が入っているディレクトリ (例えば /home/naoya/rpms) を用意して、次のコマンドを実行するだけです。</p>
<blockquote><p>$ sudo cobbler repo add &#8211;name=&#8221;local&#8221; &#8211;mirror=&#8221;/home/naoya/rpms&#8221;</p></blockquote>
<p>独自の yum リポジトリを更新する場合も、上の cobbler reposync コマンド一発で同期させることができます。</p>
<p>独自の yum リポジトリの設定は、次のようなになります。</p>
<blockquote><p>[local]<br />
name=local<br />
baseurl=http://localhost/cobbler/repo_mirror/local<br />
enabled=1<br />
gpgcheck=0<br />
priority=1</p></blockquote>
<p>いかがでしょうか？</p>
<p>cobbler を使うと、とても簡単に yum リポジトリを構築することができます。</p>
<p>ぜひ、試してみてください！</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/VDcfKayNTZk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1831/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1831</feedburner:origLink></item>
		<item>
		<title>kumofs の RPM を作ってみた</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/xoURkuy3BKA/1813</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1813#comments</comments>
		<pubDate>Fri, 11 Jun 2010 10:13:51 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[kumofs]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1813</guid>
		<description />
			<content:encoded><![CDATA[<p>そろそろ本格的に <a href="http://github.com/etolabo/kumofs">kumofs</a> を使ってみようかなと思いたって、CentOS 5.5 x86_64 向けの RPM を作ってみました。</p>
<p>まず、<a href="http://github.com/etolabo/kumofs/blob/master/doc/doc.ja.md">kumofs</a> には、次のものが必要です（以下の情報は公式ドキュメントを参照しました）。</p>
<ul>
<li>linux &gt;= 2.6.18</li>
<li>g++ &gt;= 4.1</li>
<li>ruby &gt;= 1.8.6</li>
<li><a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a> &gt;=  1.4.10</li>
<li><a href="http://msgpack.sourceforge.net/cpp:install">MessagePack for  C++</a> &gt;= 0.3.1</li>
<li><a href="http://msgpack.sourceforge.net/ruby:install">MessagePack  for Ruby</a> &gt;= 0.3.1</li>
<li>libcrypto (openssl)</li>
<li>zlib</li>
</ul>
<p>Linux と g++ と libcrypto と zlib は、CentOS 5.5 x86_64 の標準パッケージに含まれているので標準パッケージをインストールすれば問題ありません。</p>
<p>Ruby は、<a href="http://www.sssg.org/blogs/naoya/archives/1804">以前</a>紹介した方法で作成したバージョン 1.8.7 系を RPM でインストールします。</p>
<p>TokyoCabinet は、自分で作成した <a href="http://github.com/n0ts/tokyocabinet-redhat">SPEC</a> ファイルから RPM を作成しました。</p>
<p>MessagePack for C++ も、自分で作成した <a href="http://github.com/n0ts/msgpack-redhat">SPEC</a> ファイルから RPM を作成しました。</p>
<p>MessagePack for Ruby は、RPM を作成してもいいですが gem コマンド一発でインストールすることができるので RPM は作成しませんでした。次のコマンドでインストールします。</p>
<blockquote><p>$ sudo gem install msgpack</p></blockquote>
<p>肝心の kumofs ですが、kumofs は分散環境下で使われていることを前提しているので、kumo-manager、kumo-server、kumo-gateway、は別々のサーバであることが普通の環境だと思います。</p>
<p>そこで、kumofs というコアのプログラムが含まれている RPM、manager、server、gateway、をそれぞれ別々の RPM として作成してみました。あわせて、manager、server、gateway、それぞれの redhat 系の起動スクリプト、設定ファイル、logrotate スクリプト、daemontools 用のサンプルスクリプト、を作成して RPM に同梱しました。これからのスクリプトは、まとめて <a href="http://github.com/n0ts/kumofs-redhat">github</a> に置きました。また、作成した RPM も <a href="http://github.com/n0ts/rpm/downloads">github</a> に置きました（バージョンが少し古いので注意してください）。</p>
<p>sysinit のスクリプトを使うと、kumofs の実行ユーザが root にになります。通常ユーザで実行したい場合は、daemontools などを使うといいと思います。daemontools 用のサンプルスクリプトは、github においてある kumofs-XXX-run.sample と kumofs-XXX-log-run.sample です。daemontools を使う場合は、logrotate のスクリプトを削除するのを忘れないでください。</p>
<p>kumo-gateway のプログラムにも libtokyocabinet がリンクされているのはちょっと気になるところですが、特に弊害はないので気にしないことにします。</p>
<p>ここで作成した RPM で、それぞれのインストール方法を説明します。</p>
<p>まず、manager から、manager にはコアの RPM もインストールします。manager の設定は、/etc/sysconfig/kumo-manager を編集します。daemontools 用のスクリプトも同じ設定ファイルを読み込んでいます。</p>
<blockquote><p>$ sudo yum install kumofs kumofs-manager</p></blockquote>
<p>次に server。設定ファイルは、/etc/sysconfig/kumo-server です。</p>
<blockquote><p>$ sudo yum install kumofs-server</p></blockquote>
<p>そして、gateway。設定ファイルは、/etc/sysconfig/kumo-gateway です。</p>
<blockquote><p>$ sudo yum install kumofs-gateway</p></blockquote>
<p>server と gateway には、kumoctl などの管理系のコマンドはインストールされないので注意してください。server と gateway にはそれぞれに必要な最低限のプログラムをインストールしています。kumofs の管理系のコマンドを使う場合は、manager のサーバ上から使います。</p>
<p>また、kumofs とは関係ありませんが、個人的には <a href="http://rpmrepo.org/RPMforge">rpmforge</a> を本番環境のサーバでは使わない方がいいと思います。過去に、<a href="http://rpmrepo.org/RPMforge">rpmforge</a> を使っていてパッケージまわりでトラブったことがあります。自分で RPM を作成する手間を削減できるので <a href="http://www.sssg.org/blogs/naoya/archives/1602">EPEL</a> の方はちゃんとしているので使うのをおすすめします。</p>
<p>今回作成した kumofs の RPM も、EPEL に入れることができるのか提案してみる予定です。</p>
<p>今回の RPM を作るにあたって、次のページを参考にしました。貴重な情報ありがとうございました！</p>
<ul>
<li><a href="http://blog.eugene-k.net/?p=287">eugene-k.net » Blog Archive » CentOS 5.4用のkumofsのrpmをビルドする(改訂版)</a></li>
<li><a href="http://d.hatena.ne.jp/terurou/20100415/1271316306">ほぼまっさらなCentOS5.4にkumofsをインストール &#8211; DenkiYagi</a></li>
</ul>
<p>（おまけ）</p>
<p>OSX を使っている人向けに MacPorts でも kumofs をインストールすることができます。</p>
<blockquote><p>$ sudo port selfupdate</p>
<p>$ sudo port install kumofs</p>
<p>$ sudo port info kumofs<br />
kumofs @0.4.7 (net)<br />
Variants:             universal</p>
<p>Description:          kumofs is a scalable and highly available distributed<br />
key-value store. You can use a memcached client library to<br />
set, get, CAS or delete values from/into kumofs. Backend<br />
storage is Tokyo Cabinet and it will give you great<br />
performance.<br />
Homepage:            http://kumofs.sourceforge.net/</p>
<p>Library Dependencies: msgpack, rb-msgpack, tokyocabinet, openssl, zlib<br />
Platforms:              darwin<br />
License:                  unknown<br />
Maintainers:          &lt; my email address &gt;</p></blockquote>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/xoURkuy3BKA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1813/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1813</feedburner:origLink></item>
		<item>
		<title>MacBook Pro で、外付けディスプレイのみを使う方法</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/Px6O-Nkscbs/1815</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1815#comments</comments>
		<pubDate>Tue, 08 Jun 2010 14:42:17 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[mbp]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1815</guid>
		<description />
			<content:encoded><![CDATA[<p>昨年、自宅や出先など大きなディスプレイがあるときは MacBook Pro で外付けディスプレイのみを<a href="http://www.sssg.org/blogs/naoya/archives/1608">この方法で</a>使っていました。</p>
<p>しかし、新しい世代の MacBook Pro になってから、OSX のバージョンアップの影響からなのか、昨年紹介した方法が使えなくなってしまいました。</p>
<p>ずっと不便だなと思っていたのですが、今日偶然こんな映像「<a href="http://www.metacafe.com/watch/2400901/set_up_external_monitor_tv_to_macbook_pro/">Set Up External Monitor/TV to Macbook Pro &#8211; Video</a>」を見つけました。この映像によると、次の手順で外付けディスプレイのみを使うことができるようです。</p>
<ol>
<li>MacBook Pro の LCD を閉じる</li>
<li>スリープ状態になるまで待つ</li>
<li>適当な外付けキーボードを接続する</li>
<li>MacBook Pro と外部ディスプレイを接続する</li>
<li>外付けキーボードから、スペースキーを押して復帰させる</li>
</ol>
<p>この方法をとると、MacBook Pro LCD の解像度ではなく、外付けディスプレイの解像度として切り替えることができるようです。</p>
<p>なるほどと思って、僕もさっそく試してみると上の方法で確かにできました！</p>
<p>ただ、毎回外付けキーボードを接続するのは面倒くさいです。無線 LAN 経由で、スリープ状態から起こすことができるか調べてみるとなんとできるではありませんか！（参考：<a href="http://d.hatena.ne.jp/zariganitosh/20090912/1252738255">無線LAN経由で眠っているMacBookを起こす方法 &#8211; ザリガニが見ていた&#8230;。</a>）</p>
<p>ということで、次の方法で MacBook Pro を外付けディスプレイのみで使うことに成功しました。これで、大きいディスプレイがある環境では、マルチディスプレイにするより作業効率が上がります。</p>
<ol>
<li>MacBook Pro を、同一ネットワーク上からインターネットに接続する</li>
<li>別のホストコンピュータから、<a href="http://www.readpixel.com/wakeonlan/index.html">WakeOnLan</a> などのソフトウェアを起動して MacBook Pro を認識させておく</li>
<li>MacBook Pro の LCD を閉じて、スリープ状態にする</li>
<li>外付けディスプレイに接続する</li>
<li>手順 2 の WakeOnLan などのソフトウェアから、対象の MacBook Pro を起こす</li>
<li>対象の MacBook Pro が起きると、外付けディスプレイのみに出力先が切り替わる</li>
</ol>
<p>あとは、teleport や Synergy なりで、ホストコンピュータから MacBook Pro を操作することができます。</p>
<p>これで、個人的には自宅や出先での作業効率がいくぶんか上がるはずです。</p>
<p># 2010/06/10: 追記</p>
<p>@htaira さんから、<a href="http://twitter.com/htaira/status/15712762050">すばらしいアドバイス</a>をいただきました。なんと、次の方法でもできました！</p>
<ol>
<li>MacBook Pro LCD を閉じる</li>
<li>外部ディスプレイを接続する</li>
<li>MacBook Pro がスリープ状態になったら、素早く LCD を開いて、すぐに閉じる</li>
</ol>
<p>これなら、簡単ですね！</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/Px6O-Nkscbs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1815/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1815</feedburner:origLink></item>
		<item>
		<title>RVM を使ってみた</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/TOnIkoG_7iY/1809</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1809#comments</comments>
		<pubDate>Mon, 17 May 2010 04:48:49 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1809</guid>
		<description />
			<content:encoded><![CDATA[<p>Ruby のバージョンには、いくか種類があります。現在、Ruby バージョン 1.8 系、バージョン 1.9 系、をはじめ REE、JRuby、などいくもあります。これからの複数のバージョンを切り替えて使いたい場合には、<a href="http://rvm.beginrescueend.com/rvm/">RVM</a>(Ruby Version Manager)を使うと便利です。</p>
<p>RVM を使うと、簡単に Ruby のバージョンを使い分けることができます。</p>
<p>インストールは、いたってシンプルで gem からインストールします。</p>
<blockquote><p>$ sudo gem install rvm</p></blockquote>
<p>rvm をインストールしたら、rvm-install コマンドでホームディレクトリにインストールします。</p>
<blockquote><p>$ rvm-install</p></blockquote>
<p>すると、$HOME/.rvm というディレクトリが作れらます。</p>
<p>次に、.zshrc などに、次の設定を追加して反映させます。反映されると、rvm というコマンドが使えるようになります。</p>
<blockquote><p>if [[ -s /Users/n0ts/.rvm/scripts/rvm ]] ; then source /Users/n0ts/.rvm/scripts/rvm ; fi</p></blockquote>
<p>あとは、ここに使いたい Ruby をインストールするだけです。RVM で対応している Ruby 一覧を見るには、次のコマンドを実行します。</p>
<blockquote><p>$ rvm list known</p>
<p>&#8230;</p>
<p>(ruby-)1.8.6(-p399)<br />
(ruby-)1.8.6-head<br />
(ruby-)1.8.7(-p249)<br />
(ruby-)1.8.7-head<br />
(ruby-)1.9.1(-p243)<br />
(ruby-)1.9.1(-p376)<br />
(ruby-)1.9.1-head<br />
(ruby-)1.9.2-preview1</p>
<p>&#8230;</p></blockquote>
<p>REE や JRuby や IronRuby などにも対応しています。</p>
<p>さっそく複数の Ruby をインストールしてみましょう。</p>
<p>最初に、Ruby バージョン 1.8.7 をインストールします。</p>
<blockquote><p>$ rvm install 1.8.7</p></blockquote>
<p>Ruby をコンパイルしてインストールするので、対象時間がかかります。</p>
<p>次に、Ruby バージョン 1.9.1 をインストールします。</p>
<blockquote><p>$ rvm install 1.9.1</p></blockquote>
<p>そして、肝心の Ruby を切り替える方法ですが、バージョン 1.8.7 に切り替えたいときは、次のコマンドを実行します。</p>
<blockquote><p>$ rvm use 1.8.7<br />
Using ruby 1.8.7 p249</p>
<p>$ ruby &#8211;version<br />
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10.3.0]</p>
<p>$ which ruby<br />
/Users/naoya/.rvm/rubies/ruby-1.8.7-p249/bin/ruby</p></blockquote>
<p>仕組みは単純で PATH 環境変数を書き換えているだけです。</p>
<p>次にバージョンを 1.9.1 に切り替えてみます。</p>
<blockquote><p>$ rvm use 1.9.1<br />
Using ruby 1.9.1 p378</p>
<p>$ ruby &#8211;version<br />
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.3.0]</p>
<p>$ which ruby<br />
/Users/n0ts/.rvm/rubies/ruby-1.9.1-p378/bin/ruby</p></blockquote>
<p>ちゃんと切り替わっていますね。</p>
<p>また、RVM でインストールした Ruby に対して一括実行することもできます。</p>
<blockquote><p>$ rvm ruby -v<br />
ruby-1.9.1-p378: ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.3.0]<br />
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.3.0]</p>
<p>$ rvm gem install rails</p></blockquote>
<p>まとめて Rails をインストールすることができます。</p>
<p><a href="http://rvm.beginrescueend.com/integration/passenger/">Passenger</a> も同様にインストールできますが、Passenger の Apache / Nginx モジュールを作成するときには、次のようにします。</p>
<blockquote><p>$ rvm install<br />
$ rvm 1.8.7 &#8211;passenger<br />
$ rvm 1.8.7<br />
$ gem install passenger<br />
Building native extensions.  This could take a while&#8230;<br />
&#8230;<br />
$ rvmsudo passenger-install-nginx-module<br />
&#8230;<br />
Phusion Passenger is a trademark of Hongli Lai &#038; Ninh Bui.
</p></blockquote>
<p>あとは、PassengerRoot を、/Users/naoya/.rvm/gems/ruby-1.8.7-p249/gems/passenger-2.2.11/ に設定します。Ruby バージョン 1.9.0 のときも同様の方法でインストールすることができます。</p>
<p>RVM を使うと、手軽に Ruby を切り替えることができるので、便利です。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/TOnIkoG_7iY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1809/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1809</feedburner:origLink></item>
		<item>
		<title>Ruby バージョン 1.8.7 の RPM を作る</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/ctvi3hFj4S8/1804</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1804#comments</comments>
		<pubDate>Sat, 15 May 2010 06:30:32 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1804</guid>
		<description />
			<content:encoded><![CDATA[<p>CentOS 5.4 x86_64 の Ruby は、ご存じのとおりバージョン 1.8.5。枯れすぎています、さすがに最近ではバージョン 1.8.5 だと動かないプログラムが増えてきたので、RPM を作ってみました。ちなみに <a href="ftp://ftp.redhat.com/pub/redhat/rhel/beta/6/i386/os/Packages/">RHEL6 beta の Ruby のバージョンは 1.8.6</a> なので、CentOS 6 になっても役に立ちそうです。</p>
<p>まず、Fedora になる Ruby 1.8.6 の RPM をダウンロードします。</p>
<blockquote><p>$ wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/development/source/SRPMS/ruby-1.8.6.399-1.fc14.src.rpm</p></blockquote>
<p>SRPM をインストールします、なぜか MD5 があわないので無視します。</p>
<blockquote><p>$ rpm -i &#8211;nomd5 ruby-1.8.6.399-1.fc14.src.rpm</p></blockquote>
<p>ruby.spec ファイルを書き換えます、<a href="ftp://ftp.ruby-lang.org/pub/ruby/1.8/">現時点</a>での Ruby バージョン 1.8.7 のパッチレベルは 249 なので、ダウンロードします。</p>
<blockquote><p>$ cd rpmbuild/SOURCES</p>
<p>$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p249.tar.bz2</p></blockquote>
<p>次に ruby.spec ファイルを、修正します。基本的に適応できないパッチをあてないのと、x86_64 の場合は lib ディレクトリのパスが変わるので変更します。lib ディレクトリのパスは、i386 でも問題がないように %{_lib} を利用しました。</p>
<p>ruby.spec ファイルの差分は、次のような感じです。<br />
<script src="http://gist.github.com/402080.js?file=ruby.spec+patch+for+ruby-1.8.7-p249"></script></p>
<p>あとは、rpmbuild するだけですが、依存しているパッケージがけっこう多いので拙作の <a href="http://github.com/n0ts/scripts/blob/master/auto-rpmbuild.sh">auto-rpmbuild.sh</a> を使うと便利です。</p>
<blockquote><p>$ auto-rpmbuild.sh -ba ~/rpmbuild/SPECS/ruby.spec</p></blockquote>
<p>最後に、既存の Ruby を上書きしてアップグレード完了です。</p>
<blockquote><p>$ sudo rpm -Uvh rpmbuild/RPMS/x86_64/ruby-*</p>
<p>$ ruby &#8211;version</p>
<p>ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]</p></blockquote>
<p>上書きしたあと、なぜか ruby-libs の古いバージョンが残っているので念のため削除しておきました。</p>
<blockquote><p>$ sudo rpm -e ruby-libs-1.8.5-5.el5_4.8</p></blockquote>
<p>作成した Ruby の RPM は、<a href="http://github.com/n0ts/rpm/downloads">github</a> へアップロードしておきました（ついでに Rubygems バージョン 1.3.7 の RPM を作ってアップロードしておきました）。</p>
<p>今回の RPM の作り方は、次のページを参考にしました。</p>
<ul>
<li><a href="http://haruiida.blogspot.com/2010/03/centos-ruby-187rpm.html">Haru&#8217;s blog: CentOS でRuby 1.8.7のrpmを作る</a></li>
</ul>
<p># CentOS は、パッケージが枯れすぎていてパッケージを作るのがとてもとても面倒だけれど、安定して動いてくれているので重宝しています。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/ctvi3hFj4S8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1804/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1804</feedburner:origLink></item>
		<item>
		<title>svndump で差分バックアップをとる方法</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/OsjpCMqPSmU/1800</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1800#comments</comments>
		<pubDate>Tue, 04 May 2010 14:36:20 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1800</guid>
		<description />
			<content:encoded><![CDATA[<p>実は、今まで知らなかったのですが、SVN リポジトリのダンプツールである svndump で、差分バックアップをとることができます。</p>
<p>例えば、CentOS の Subversion は 1.4.2 で試してみます。</p>
<p>まずは、通常の全体バックアップを行います。</p>
<blockquote><p>$ svndump /var/svn/repository &gt; svn_repository.dump</p></blockquote>
<p>全体バックアップをとる直前のリビジョンを svn info file:///var/svn/repository で保存しておきます。</p>
<p>あとは、次の日などに前にリビジョンに +1 してリビジョンから、HEAD まで dump することで差分バックアップをすることができます。次の例は、前日がリビジョン 1 までのバックアップだと想定しています。</p>
<blockquote><p>$ svnadmin dump &#8211;incremental -r 2:HEAD</p></blockquote>
<p>前にとある開発サーバで、SVN リポジトリのバックアップを毎朝全体で行っていましたが、バックアップ量が多すぎてハードディスクがパンクしたことが何度がありました。差分バックアップを使えば、バックアップ量も少なくて済むので便利だと思います。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/OsjpCMqPSmU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1800/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1800</feedburner:origLink></item>
		<item>
		<title>SNI を試してみた</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/0YVWv5v5NFs/1796</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1796#comments</comments>
		<pubDate>Fri, 16 Apr 2010 11:11:30 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1796</guid>
		<description />
			<content:encoded><![CDATA[<p>Apache HTTP Server バージョン 2.2.12 からサポートされるようになった SNI(Server Name Indication) を試してみました。これは、一つの IP アドレスで複数の SSL 対応のウェブサイトに対応できる機能です。</p>
<p>SNI は、とても簡単に設定することができます。以下、設定方法をまとめておきます。</p>
<ul>
<li>mod_ssl をインストールしたときにインストールされる SSL の設定ファイルは読み込まない</li>
<li>あとは、通常の SSL の設定と VirtualHost の設定をする</li>
</ul>
<p>まずは、443 ポートを Listen する設定などを行います。</p>
<blockquote><p>Listen 443<br />
SSLStrictSNIVHostCheck off</p></blockquote>
<p>あとは、VirtualHost を定義するだけです。</p>
<blockquote><p>&lt;VirtualHost *&gt;<br />
ServerName hoge.example.com<br />
DocumentRoot /var/www/html/hoge<br />
&lt;/VirtualHost&gt;<br />
&lt;VirtualHost *:443&gt;<br />
ServerName hoge.example.com<br />
DocumentRoot /var/www/html/hoge<br />
SSLEngine On<br />
SSLCertificateFile /etc/httpd/conf/server.crt<br />
SSLCertificateKeyFile /etc/httpd/conf/server.key<br />
&lt;VirtualHost&gt;</p></blockquote>
<p>上のような VirtualHost を定義しておけば、一つの IP アドレスで複数の SSL 対応のウェブサイトを設定することができます、もちろん証明書も切り替えて。</p>
<p>ちなみに、Apache バージョン 2.2.11 以前は、次のような 80 ポートと 443 ポートの組み合わせの VirtualHost ができていますが、2.2.12 以降はできなくなっていますので注意しましょう。</p>
<blockquote><p>&lt;VirtualHost * *:443&gt;<br />
ServerName hoge.example.com<br />
&lt;/VirtualHost&gt;</p></blockquote>
<p>参考資料</p>
<ul>
<li><a href="http://builder.japan.zdnet.com/news/story/0,3800079086,20402262,00.htm">Apacheの設定を変更し、単一IPアドレス上で複数のSSLサイトを運用する &#8211; builder by ZDNet Japan</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/0YVWv5v5NFs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1796/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1796</feedburner:origLink></item>
		<item>
		<title>Microsoft Showcase</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/FuFqUyTdtgI/1794</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1794#comments</comments>
		<pubDate>Sun, 11 Apr 2010 13:57:52 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1794</guid>
		<description />
			<content:encoded><![CDATA[<p>Microsoft のデータべセンターの構想が紹介されていました。かなり効率化されたコンテナ形式のようです。</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="340" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="source" value="http://www.microsoft.com/showcase/silverlight/player/1/player-en.xap" /><param name="enableHtmlAccess" value="true" /><param name="background" value="black" /><param name="minRuntimeVersion" value="3.0.40624.0" /><param name="autoUpgrade" value="true" /><param name="initParams" value="Culture=en-US,Uuid=36db4da6-8777-431e-aefb-316ccbb63e4e,Autoplay=false,MarketingOverlayText=Visit this video's Web site,ShowMarketingOverlay=true,ShowMenu=True,Tabs=Embed;Email;Share;Info" /><param name="src" value="data:application/x-silverlight-2," /><embed type="application/x-shockwave-flash" width="560" height="340" src="data:application/x-silverlight-2," initparams="Culture=en-US,Uuid=36db4da6-8777-431e-aefb-316ccbb63e4e,Autoplay=false,MarketingOverlayText=Visit this video's Web site,ShowMarketingOverlay=true,ShowMenu=True,Tabs=Embed;Email;Share;Info" autoupgrade="true" minruntimeversion="3.0.40624.0" background="black" enablehtmlaccess="true" source="http://www.microsoft.com/showcase/silverlight/player/1/player-en.xap"></embed></object></p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/FuFqUyTdtgI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1794/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1794</feedburner:origLink></item>
		<item>
		<title>SSL ですこしはまった</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/oWs2RXnPDMc/1788</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1788#comments</comments>
		<pubDate>Mon, 05 Apr 2010 15:16:02 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1788</guid>
		<description />
			<content:encoded><![CDATA[<p>４月になって日本ベリサインで取得した SSL 証明書を更新して、切り替えたところ Firefox 3.6 でアクセスしたときに、次のような「sec_error_unknown_issuer」というエラー画面が表示されるようになっていまいました。他のブラウザの IE、Chrome、Opera ではまったく問題ありませんでした。ぐぐってみると、いろいろな情報があったのですが、原因は日本ベリサインの中間 CA 署名所が古いためでした。</p>
<p style="text-align: center;"><img class="aligncenter" title="SSL error" src="http://gyazo.com/900fbb325a84c77db89de451f620c78a.png" alt="" width="379" height="215" /></p>
<p>2009年5月18日の認証局変更により、中間 CA 証明書を更新する必要があるので、2009年5月18日以降で日本ベリサインから SSL 証明書を取得した人は注意しましょう。Firefox 3.x 系だけで発生する問題なので、気がつかない可能性があります。<br />
更新された中間 CA 証明書は、次のページに公開されています。</p>
<ul>
<li><a href="https://www.verisign.co.jp/repository/intermediate/2009_secureg21024.html">2009年5月18日の認証局変更</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/oWs2RXnPDMc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1788/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1788</feedburner:origLink></item>
		<item>
		<title>MacFusion for 10.6.3</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/KqxQklM5Ml4/1784</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1784#comments</comments>
		<pubDate>Sun, 04 Apr 2010 13:57:34 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1784</guid>
		<description />
			<content:encoded><![CDATA[<p>MacOSX を 10.6.3 にアップグレードしたら、<a href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;ved=0CAYQFjAA&amp;url=http%3A%2F%2Fwww.macfusionapp.org%2F&amp;ei=CZm4S5-2Ic2OkQWT05TICQ&amp;usg=AFQjCNHHD6YQm0s2jgy7dxvg_vjKoY8zyA&amp;sig2=GEUtiLXgl589B9tiLC1JqQ">MacFusion</a> が動作しなくなってしまいました。どうやら、MacFusion の Agent が起動できないエラーが発生しています。詳細は、<a href="http://groups.google.com/group/macfusion-devel/browse_thread/thread/7a1a111327b03d06/379eca24c017d8a5?show_docid=379eca24c017d8a5">Google Groups</a> や <a href="http://macfusionapp.org/trac/ticket/197">MacFusion の Trac </a>で議論されています。</p>
<p>ちょっと自分で直してみようかなと考えてみましたが、OSX プログラミングは経験がないので github にあるかもと思って検索してみると、修正されている <a href="http://github.com/nall/MacFusion2">MacFusion2</a> がありました。MacFusion2 の <a href="http://github.com/nall/MacFusion2/downloads">Dowload</a> から「<a href="http://github.com/downloads/nall/MacFusion2/Macfusion-2.0.4-SL.zip">Macfusion-2.0.4-SL.zip</a>」というファイルをダウンロードして上書きインストールするだけで問題なく動作します。github 素晴らしすぎります。感覚的に github は、Google からの検索にヒットしないことがある印象をうけるので、github のサイトから検索した方が便利です。今回の該当のコミット内容は、<a href="http://github.com/nall/MacFusion2/commits/MacOS_10_6_3">ここ</a>から確認することができます。</p>
<p>また、Amazon S3 にも対応した商用版の <a href="https://secure.expandrive.com/mac">ExpandDrive</a> というソフトウェアもあります。価格は、$39.95。ExpandDrive は試用することができますが、最新版の 2.0.6 で 10.6.3 上で正しく動作していました。ExpandDrive の方は、メニューバーからアクセスすることができるので便利な印象をうけました。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/KqxQklM5Ml4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1784/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1784</feedburner:origLink></item>
		<item>
		<title>独立しました</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/qwgHj01nMf4/1780</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1780#comments</comments>
		<pubDate>Thu, 01 Apr 2010 13:51:39 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1780</guid>
		<description />
			<content:encoded><![CDATA[<p>この度、私「中澤 直也」は、昨日 2010/3/31 をもって前職の会社を退職して、今日からいわゆるフリーランスなインフラエンジニアとして生きていくことにしました。</p>
<p>振り返ってみれば、約３年半ちょっととこのウェブ業界ではかなり長いかもしれませんが、初めてウェブ業界に入って特にインフラまわりの仕事を中心に行っていました。その業務の中で、公開できる情報に関しては、このブログで一生懸命アウトプットを行ってきました。</p>
<p>僕がどうしていわゆるインフラエンジニアになったのかについては、<a href="http://www.sssg.org/blogs/naoya/archives/1279">過去のエントリ</a>を参考にしてください。</p>
<p>過去をあまり振り返えると、話が長くなりそうなので、まずは素晴らしい会社に最高のタイミングで入社できたと思っています。そこで、かなり個性的で優秀なエンジニアと出会い、一緒に仕事をできたことは最高に幸せでした。この素晴らしい会社を起業してくれた社長には感謝をしています。そして、一緒に仕事してくれたエンジニアの皆さん、その他の社員の皆さんには、かなりたくさんの失敗をしてご迷惑をおかけしたと思いますが、感謝をしています。ありがとうございました。あわせて、これかも懲りずに交流していただければとても幸せです。</p>
<p>会社を退職した理由はいくつかありますが、一番大きいのはちょっと一人でやってみたいという気持ちが強くなったことです。絶対成功するとか、起業するときか、そういうことは今のところ考えていませんが、組織に属しているときに見えるもの、組織に属せずに見えるもの、とがあるような気がしています。今ままでずっと、大きな休みはなしに組織にずっと属していたので、そろそろ後者の視点から物事を見てみたい、ちょうどよいタイミングだと思ったことが大きいです。</p>
<p>そして、このブログもかなり多くの人に読まれているようで、最近エントリをするプレッシャーも感じつつありますが、プレッシャー感じてしまうとブログを更新する機会も減ってしまいますので、これからもできる限りインフラ系の話題を中心にエントリをしていきたいと思います。情報をアウトプットすると、自分も勉強になることがかなり多いと思います。</p>
<p>インターネットの歴史は、振り返ってみると約十年ちょっとでしょうか？とても早い動きで動いているインターネット。この世界を支えるのは、無数のコンピュータであり、そのコンピュータを支えるのはインフラエンジニアだと思っています。その上で、地球上のたくさんの人たちが自由にインターネットを使って人生を楽しんでいますし、インフラエンジニア以外にもたくさんのエンジニアの皆さんが毎日インターネット上でさまざまなサービスを開発しています。</p>
<p>最近は、あまりインフラエンジニアという肩書きもいけていないかもしれませんが、これからますます増えるであろうインターネット上の膨大なトラフィックを、いかにして低コストでかつ省力で運用していくていくのか、今の僕の興味はそこにあります。そのために、必要な技術を身につけて、さらに自分である問題を解決するためのものを作っていきたいと思います。</p>
<p>最後に、フリーランスで生きていこうと決心したきっかけになった一つの動画を貼り付けておきます。</p>
<p style="text-align: center;">Web 2.0 Expo NY: Gary Vaynerchuk (Wine Library), Building Personal Brand Within the Social Media Landscape</p>
<p style="text-align: center;"><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/EhqZ0RU95d4&#038;hl=en_US&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/EhqZ0RU95d4&#038;hl=en_US&#038;fs=1&#038;color1=0x3a3a3a&#038;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p>これからも、このブログと私をよろしくお願いします。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/qwgHj01nMf4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1780/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1780</feedburner:origLink></item>
		<item>
		<title>pbzip2 を使う</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/h24UpCZx-xM/1747</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1747#comments</comments>
		<pubDate>Mon, 29 Mar 2010 04:38:19 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[bzip2]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1747</guid>
		<description />
			<content:encoded><![CDATA[<p><a href="http://compression.ca/pbzip2/">Parallel BZIP2 (PBZIP2)</a> という並列処理版の bzip2 があります。今まで Apache のアクセスログは、bzip2 で圧縮していましたが、pbzip2 を試してみることにしました。</p>
<p>CentOS の場合、pbzip2 バージョン 1.0.5（最新版は 1.1.0） が EPEL から提供されているので、yum 一発でインストールすることができます。pbzip2 は、<a href="http://compression.ca/pbzip2/pbzip2-1.1.0-1.src.rpm">SRPM</a> があるので、手軽に最新版も試すこともできます。</p>
<blockquote><p>$ sudo yum install -y pbzip2</p></blockquote>
<p>圧縮時間の測定のために 50MB ほどのアクセスログを bzip2 と pbzip2、それぞれで圧縮してみました。</p>
<p>この測定したサーバは、Xeon L5530 で HT 有効のサーバです。</p>
<p>まずは、bzip2 から。</p>
<blockquote><p>$ time bzip2 -kv &#8211;best access_log</p></blockquote>
<blockquote><p>6.144:1,  1.302 bits/byte, 83.72% saved, 56862316 in, 9255173 out.<br />
bzip2 -kv &#8211;best access_log  16.29s user 0.08s system 99% cpu 16.370 total</p></blockquote>
<p>次に、pbzip2。</p>
<blockquote><p>$ pbzip2 -kv -p8 access_log</p>
<p>pbzip2 -kv -p8 access_log  19.31s user 0.15s system 772% cpu 2.521 total</p></blockquote>
<p>処理時間と比較すると、次のような結果でした。ついでに、16 コアでも試してみました。</p>
<ul>
<li>bzip2: 約 16 秒</li>
<li>pbzip2(-p8): 約 2.5 秒</li>
<li>pbzip2(-p16): 約 2.1 秒</li>
</ul>
<p>圧縮後のサイトは、どちらも 8.9MB とほぼ同じでしたが、バイト数は次のような結果でした。</p>
<ul>
<li>bzip2: 9,255,173</li>
<li>pbzip2: 9,262,212</li>
</ul>
<p>pbzip2 の方は仕組み上、多少圧縮サイズが小さいという結果になりましたが、圧縮時間が大幅に減少しました。圧縮サイズはそれほど変わらないので、複数コアのあるサーバでアクセスログを圧縮する場合は pbzip2 を使っていくことにしました。</p>
<p>なお、解凍は bzip2 形式なので、pbzip2 で圧縮したファイルも bzip2 -dc で解凍することができます（当たり前ですが&#8230;）。</p>
<p>ウェブサーバ上の過去のアクセスログは、ディスクを圧迫するためウェブサーバ上で圧縮するのが普通だと思いますが、複数コアの CPU があるサーバなら pbzip2 を使うことで圧縮時間を大幅に短縮できます。短縮できた CPU 時間をウェブサーバ本来の処理にまわすことができるはずなので、ウェブサーバのリソースを有効に扱うことに結びつくと思います。</p>
<p>さらに詳しい pbzip2 のベンチマーク結果は、<a href="http://compression.ca/pbzip2/benchmark.html">本家サイト</a>に情報があるので、興味のある人は参考にするといいと思います。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/h24UpCZx-xM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1747/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1747</feedburner:origLink></item>
		<item>
		<title>家庭用の NAS を導入した</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/5qROD38Ka5w/1751</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1751#comments</comments>
		<pubDate>Sat, 27 Mar 2010 00:55:52 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1751</guid>
		<description />
			<content:encoded><![CDATA[<p>家には、Mac mini と小型サーバの２台があります。それぞれ、次のような感じの用途になっています。</p>
<ul>
<li>Mac mini: 家での作業用 PC、音楽を聞いたり、写真を見たり、映画を見たり、個人プロジェクトの開発用</li>
<li>小型サーバ: VMWare ESXi で、FreeBSD と CentOS と Windows XP が動いている、FreeBSD はメールサーバや wiki など、CentOS と Windows XP は技術的な実験用</li>
</ul>
<p>で、音楽や写真データなどは、今までずっとバックアップをとっていなかったけれども、だんだんとデータ容量も増えてきてバックアップをとることにしました。</p>
<p>家庭用 NAS を導入するとものが増えるので躊躇っていたけれども、データが消えたときのことを考えると不安だったので、思い切って家庭用 NAS を導入することにした。Mac mini だけなら、<a href="http://www.apple.com/jp/timecapsule/">Time Capsule </a>でもよかったけれども FreeBSD にも大切なデータが入っているので、他の家庭用の NAS を検討してみました。具体的には、<a href="http://buffalo.jp/products/catalog/item/h/hd-htgl_r5/">ハードディスク|HD-HTGL/R5シリーズ</a>などを考えたけれど、かなり大きくて僕が求めているのはもっとコンパクトなものがほしいと思っていました。</p>
<p>そこで、偶然立ち読みした <a href="http://www.dosv.jp/">DOS/V POWER REPORT マガジン</a>に<a href="http://www.dosv.jp/uac/1005/index.htm">Thecus Technology</a>というおもに NAS を開発している会社を知りました。<a href="http://www.thecus.com/index.php?set_language=japan">この会社</a>のホームページをみてみると、<a href="http://www.thecus.com/products_over.php?cid=22&amp;pid=197&amp;set_language=japan">N2200</a> という非常にコンパクトな家庭用 NAS を見つけました。N2200 のおもな特徴は、次のとおりです。さらに詳しい特徴は、<a href="http://www.uac.co.jp/top_topix/thecus/n2200.html">UAC 株式会社にも情報</a>があります。</p>
<ul>
<li>ハードディスク x 2、RAID 0/1、JBOD 対応</li>
<li>ハードディスクレスのタイプなので、ハードディスクは自由に選択可能</li>
<li>サポートするハードディスク容量は、2TB x 2 まで対応している</li>
<li>内部が Linux なので、SMB、CIFS、HTTP、HTTPS、FTP、NFS V3、AFP 3 をサポート</li>
<li>ブラウザから、NAS の設定を変更することが可能</li>
</ul>
<p>購入は、Amazon からもできるけれど、<a href="http://store.shopping.yahoo.co.jp/uacdirect/n2200.html">UAC ダイレクト</a>から購入してみました。ハードディスクは、2TB のハードディスクの価格がかなり下がっていたので、<a href="http://kakaku.com/item/K0000077883/">WESTERN DIGITAL</a> のものと、<a href="http://kakaku.com/item/K0000051713/">HGST</a> のものを一台ずつ購入しました。なんとなく、同じハードディスクだと何かあったときにめんどうなので、わざと別々のメーカーのもにしました。実際に購入してみると、予想どおりかなりコンパクトでいい感じです。</p>
<p style="text-align: center;"><a title="DSC_0017.JPG by n0ts, on Flickr" href="http://www.flickr.com/photos/naoya_n/4388932363/"><img class="aligncenter" src="http://farm5.static.flickr.com/4049/4388932363_df5cde0cc6.jpg" alt="DSC_0017.JPG" width="500" height="333" /></a></p>
<p>セットアップ方法は、ハードディスクをトレイに接続して、Windows の専用クライアントから IP アドレスやディスクのフォーマットをするだけと、とてもセットアップは簡単でした。IP アドレスさえ設定してしまえば、あとはブラウザから操作できるので、Mac からも操作することができます。ブラウザの管理画面は、次のような感じです。ファームウェアの更新もブラウザからできるので、とても便利です。</p>
<p><a href="http://www.sssg.org/blogs/naoya/wp-content/uploads/2010/03/nas.jpg" rel="lightbox"><img class="aligncenter size-medium wp-image-1755" title="N2200 Admin Screenshot" src="http://www.sssg.org/blogs/naoya/wp-content/uploads/2010/03/nas-300x101.jpg" alt="" width="300" height="101" /></a></p>
<p>実際に使っていた感想は、次のとおりです。</p>
<ul>
<li>セットアップが非常に簡単</li>
<li>RAID1 で使っているけれど、片側のハードディスクをはずしても動き続けて、ハードディスクを再度取り付けると自動ビルドが始まる（ハードディスクがはずれると、かなり大きいビーという音がする）</li>
<li>とても静か、ハードディスクにコピーしているときだけハードディスクの音が聞こえるけれど、ファンの音はまったく気にならないほど静音設計になっている</li>
<li>内部のファイルシステムは、XFS になっている</li>
</ul>
<p>実際のバックアップ方法は、それぞれ次のような感じで行っています。</p>
<p>Mac mini からは、<a href="http://www.renachan.com/mac/backup/index.html">このあたりの情報</a>から調査した結果、最終的には TimeMachine でバックアップしています。ただし、公式にはサードパーティ静の NAS に対応していないので、<a href="http://crossbreed.jp/archives/200905161230.php">iTimeMachine</a> というアプリケーションで設定しています。もちろん、<a href="http://nyaho.site50.net/wp/2009/02/16/macosx-timemachine-nas/">Terminal から設定</a>できるので、次のコマンドを入力してもいいと思います。</p>
<blockquote><p><code>$ defaults write com.apple.systempreferences  TMShowUnsupportedNetworkVolumes 1</code></p></blockquote>
<p>そして、<a href="http://www.junkgadget.com/2009/03/nas-itimemachine.html">ここ</a>を参考にして NAS 上に TimeMachine のバックアップをとれるように設定しています。</p>
<p>FreeBSD からは amd 経由で NFS でマウントして rsync でバックアップしています。将来的には、ZFS にファイルシステムを変更して、さらに手軽にバックアップする予定です。</p>
<p>気になる価格の方は、N2200 と 2TB のハードディスクを 2 台あわせて約 5 万円弱くらいです。価格的には、Time Capsule 2 TB モデルと同じくらいです。ただし、RAID1 なので Time Capsule よりはコストパフォーマンスがよいといえるかもしれません。そのかわり、セットアップはめんどうですが。</p>
<p>これでようやく、音楽や写真などの大事なデータをバックアップして生活することができるようになりました。</p>
<div class="amazlet-box" style="margin-bottom: 0px;">
<div class="amazlet-image" style="float: left;"><a name="amazletlink" href="http://www.amazon.co.jp/exec/obidos/ASIN/B002S5VDUQ/du00-22/ref=nosim/" target="_self"><img style="border: none;" src="http://ecx.images-amazon.com/images/I/41Idm%2BuiZhL._SL160_.jpg" alt="Thecus 2ベイ NASキット DLNA対応 N2200" /></a></div>
<div class="amazlet-info" style="float: left; margin-left: 15px; line-height: 120%;">
<div class="amazlet-name" style="margin-bottom: 10px; line-height: 120%;">
<p><a name="amazletlink" href="http://www.amazon.co.jp/exec/obidos/ASIN/B002S5VDUQ/du00-22/ref=nosim/" target="_self">Thecus 2ベイ NASキット DLNA対応 N2200</a></p>
<div class="amazlet-powered-date" style="font-size: 7pt; margin-top: 5px; font-family: verdana; line-height: 120%;">posted with <a title="Thecus 2ベイ NASキット DLNA対応 N2200" href="http://www.amazlet.com/browse/ASIN/B002S5VDUQ/du00-22/ref=nosim/" target="_self">amazlet</a> at 10.03.27</div>
</div>
<div class="amazlet-detail">Thecus (2009-10-09)<br />
売り上げランキング: 62581</div>
<div class="amazlet-link" style="margin-top: 5px;"><a name="amazletlink" href="http://www.amazon.co.jp/exec/obidos/ASIN/B002S5VDUQ/du00-22/ref=nosim/" target="_self">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/5qROD38Ka5w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1751/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1751</feedburner:origLink></item>
		<item>
		<title>Apache で特定の URL のみ Basic 認証を外す方法</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/_xKnpWdOgFA/1745</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1745#comments</comments>
		<pubDate>Fri, 26 Mar 2010 07:04:39 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1745</guid>
		<description />
			<content:encoded><![CDATA[<p><a href="http://doruby.kbmj.com/fuj_on_rails/20100326/Apache_">Apacheのベーシック認証の応用</a>をみて、試してみた。</p>
<p>例えば、次のような設定を書いたとする。</p>
<blockquote><p>&lt;VirtualHost * *:443&gt;<br />
ServerName test.localhost<br />
DocumentRoot /var/www/html</p>
<p>&lt;Directory /var/www/html&gt;<br />
Allow from All<br />
&lt;/Directory&gt;</p>
<p>&lt;Location /&gt;<br />
AuthType Basic<br />
AuthName &#8220;test&#8221;<br />
AuthUserFile /var/www/.htpasswd<br />
Require valid-user<br />
&lt;/Location&gt;</p>
<p>&lt;Location /test&gt;<br />
Order allow,deny<br />
Allow from all<br />
Satisfy Any<br />
&lt;/Location&gt;<br />
&lt;/VirtualHost&gt;</p></blockquote>
<p>このような VirtualHost を設定しておくと、http://test.localhost 以下の /test 以外は Basic 認証がかかった状態になる。たまに、こういった設定も必要なときがあるので、これは便利。</p>
<p>参考資料</p>
<ul>
<li><a href="http://doruby.kbmj.com/fuj_on_rails/20100326/Apache_">Apacheのベーシック認証の応用</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/_xKnpWdOgFA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1745/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1745</feedburner:origLink></item>
		<item>
		<title>DNS の逆引きを忘れていた</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/0jHCC1DPUss/1737</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1737#comments</comments>
		<pubDate>Thu, 18 Mar 2010 00:50:24 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[dns bind]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1737</guid>
		<description />
			<content:encoded><![CDATA[<p>昨日のお昼頃、急にサーバ内部ネットワークの SSH / MySQL 接続が異様に遅くなる現象が発生してしまいました。</p>
<p>最初は、スイッチやネットワーク系統の問題だと思っていたのですが、どうやら内部にたてている DNS で逆引き設定を忘れていて、その上位の DNS サーバで急に逆引きができなくなったことが起因していました。</p>
<p>お恥ずかしい限りですが、内部の DNS で逆引き設定を忘れていました。</p>
<p>SSH で逆引きしないように設定するには、<a href="http://www.openssh.org/faq.html">FAQ</a> に書かれているとおり sshd_config に UseDNS no と設定すれば 逆引きしない設定することができます。</p>
<p>同様に MySQL で逆引きしないように設定するには、mysqld の起動オプションに <code><a href="--skip-name-resolve">--skip-name-resolve</a> とつけて起動すれば設定することができます。</code></p>
<p>どちらもこの設定をしてしまうと、接続設定にホスト名を指定することができなくなってしまうため、不便です。</p>
<p>てっとりばやく解決するには、それぞれのサーバに /etc/hosts を記述すれば可能なのですが、すべてのサーバを /etc/hosts を puppet  で管理するのはなかなかめんどうです。puppet には <a href="http://docs.reductivelabs.com/references/stable/type.html#host">host リソース</a>があって、手軽に /etc/hosts を扱えるのですが、前に s[1-255].server.example.jp という設定をマニフェストに記述してみたら、s1 から順番に並んでいないとても汚くなってしまったので微妙です。それに各サーバごとの役割は、現実的にかなり頻繁に変わるので、そのたびにすべてのサーバの /etc/hosts を変更するのは管理コストがかなりかかります。個人的には、かなり非現実的です。</p>
<p>やはり、内部 DNS で逆引き設定をするのが一番いいと思います。今のところ、内部 DNS には bind を使っています。bind には、<a href="http://www.bind9.net/manual/bind/9.3.2/Bv9ARM.ch06.html#id2566761">GENERATE</a> という独自の構文があって、これを使うと次のように簡単に逆引き設定をすることができます。</p>
<blockquote>
<pre>$TTL    86400
@               IN SOA  @       root (
                                       123             ; serial (d. adams)
                                       3H              ; refresh
                                       15M             ; retry
                                       1W              ; expiry
                                       1D )            ; minimum
               IN NS           ns1.example.jp.
$GENERATE   1-256   $.0.0.10.in-addr.arpa.  PTR     s$.example.jp.</pre>
</blockquote>
<p>あとは、/etc/named.conf に、次のように zone 設定を記述すれば逆引き設定をすることが可能です。</p>
<blockquote>
<pre>zone "0.0.10.in-addr.arpa" IN {
               type master;
               file "0.0.10.in-addr.arpa";
               allow-update { none; };
               notify no;
};</pre>
</blockquote>
<p>設定したら、正しく逆引きができるこを、次のような感じで確認します。</p>
<blockquote><p>$ dig @localhost -x 10.0.0.1</p></blockquote>
<p>今回は、どうやら回線プロバイダから提供されている上位の DNS で逆引き設定ができなくなったようですが、なぜこの時間に起きたのか詳しい原因はよく分かっていません。</p>
<p>内部 DNS をたてている場合、逆引きの設定は忘れやすいので注意したいです。</p>
<p>今のところ、内部 DNS には bind を使っていますが、<a href="http://www.unbound.net/">Unbound</a> か <a href="http://www.powerdns.com/">PowerDNS</a> に置き換える予定です。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/0jHCC1DPUss" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1737/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1737</feedburner:origLink></item>
		<item>
		<title>rsyslog 4.6.1 stable</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/iylFcWI4uq8/1734</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1734#comments</comments>
		<pubDate>Tue, 09 Mar 2010 08:42:10 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[rsyslog]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1734</guid>
		<description />
			<content:encoded><![CDATA[<p><a href="http://www.rsyslog.com/Article445.phtml">rsyslog 4.6.1 stable</a> がリリースされました。おもにバグフィックスリリースです。</p>
<p>rsyslog 4.6.1 の前のバージョンであるバージョン 4.5.6 では、僕がパッチを送ったデータを圧縮したときのメモリリークが修正されています。おそらく rsyslog を使っている人で圧縮を有効にしている人は少ないと思いますが、もし使っている人は激しくメモリリークするので、最新版の 4.6.1 にアップグレードしましょう。</p>
<blockquote><p>bugfix: memory leak when sending messages in zip-compressed format<br />
Thanks to <strong>Naoya Nakazawa</strong> for analyzing this issue and providing a patch.</p></blockquote>
<p>こんな感じで rsyslog の CHANGELOG に自分の名前が掲載されているなんて感無量です。</p>
<p>現在、rsyslog バージョン 4.4.2 を本番サーバで使っているのバージョンアップする予定です。</p>
<p>あと、rsyslog を使っていますが、たとえばかなりの容量の Apache のアクセスログを rsyslog へ送っているとき、まれに rsyslog が落ちてしまう問題が一回発生したのですが、再現していません。再現したら、解析して、またパッチを送ってみようと思います。</p>
<p>rsyslog は、現在でもかなり活発に開発が進められているので、今後も進化を続けると思います。</p>
<p># 今後は、rsyslog バージョン 5.x 系の開発に注力するようです。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/iylFcWI4uq8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1734/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1734</feedburner:origLink></item>
		<item>
		<title>MySQL の公式 RPM を使おう</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/lKQN4XnMoQ0/1724</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1724#comments</comments>
		<pubDate>Thu, 04 Mar 2010 13:02:12 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[mysql rpm]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1724</guid>
		<description />
			<content:encoded><![CDATA[<p>今まで、<a href="http://www.sssg.org/blogs/naoya/archives/1331">前に紹介した方法</a>で、自分で MySQL の RPM をビルドしていたのですが、次の点が不満でした。</p>
<ul>
<li>コンパイルにかなりの時間がかかる</li>
<li>コンパイル後の、テストが必ず失敗する(SSL まわりのエラーなので、テストは必ずしないように変更していた)</li>
<li>なぜか、InnoDB plugin が無効になってしまって、InnoDB plugin を普通に試せない</li>
</ul>
<p>ということで、QA もちゃんとされている MySQL の公式 RPM に切替えてみることにしました。</p>
<p>まず、現在の MySQL 5.1 の最新バージョンは 5.1.44 です。MySQL の公式サイトでは RHEL5 用の x86_64 の RPM が用意されています。<br />
RHEL5 x86_64 用の RPM は、次のものをダウンロードすることができます。</p>
<ul>
<li>MySQL-client-community-5.1.44-1.rhel5.x86_64.rpm</li>
<li>MySQL-community-5.1.44-1.rhel5.src.rpm</li>
<li>MySQL-community-debuginfo-5.1.44-1.rhel5.x86_64.rpm</li>
<li>MySQL-devel-community-5.1.44-1.rhel5.x86_64.rpm</li>
<li>MySQL-embedded-community-5.1.44-1.rhel5.x86_64.rpm</li>
<li>MySQL-server-community-5.1.44-1.rhel5.x86_64.rpm</li>
<li>MySQL-shared-community-5.1.44-1.rhel5.x86_64.rpm</li>
<li>MySQL-shared-compat-5.1.44-1.rhel5.x86_64.rpm</li>
<li>MySQL-test-community-5.1.44-1.rhel5.x86_64.rpm</li>
</ul>
<p>次のそれぞれの RPM に、どんなものが含まれているか調査してみました。</p>
<blockquote><p>MySQL-client-community-5.1.44-1.rhel5.x86_64.rpm<br />
/usr/bin/mysql など、MySQL クライアントようのコマンドが含まれています。</p>
<p>MySQL-community-5.1.44-1.rhel5.src.rpm<br />
SRPM です。mysql-5.1.44.rhel5.spec と mysql-5.1.44.tar.gz が含まれています。</p>
<p>MySQL-community-debuginfo-5.1.44-1.rhel5.x86_64.rpm<br />
MySQL のデバッグシンボル情報です。</p>
<p>MySQL-devel-community-5.1.44-1.rhel5.x86_64.rpm<br />
mysql_config コマンドと MySQL のヘッダーファイルが含まれています。</p>
<p>MySQL-embedded-community-5.1.44-1.rhel5.x86_64.rpm<br />
MySQL の組み込む用途に使われる /usr/lib64/mysql/libmysqld.a が含まれています。</p>
<p>MySQL-server-community-5.1.44-1.rhel5.x86_64.rpm<br />
mysql の sysinit スクリプト、my.cnf 設定ファイルなど MySQL サーバに必要なプログラムが含まれています。</p>
<p>MySQL-shared-community-5.1.44-1.rhel5.x86_64.rpm<br />
/usr/lib64/libmysqlclient.so と libmysqlclient_r.so が含まれています。</p>
<p>MySQL-shared-compat-5.1.44-1.rhel5.x86_64.rpm<br />
MySQL-shared-community の複数のバージョンが含まれています。</p>
<p>MySQL-test-community-5.1.44-1.rhel5.x86_64.rpm<br />
mysql_client_test コマンドが含まれています。</p></blockquote>
<p>次に、CentOS で提供されているパッケージ名と MySQL 公式のパッケージ名の対応は、次のとおりになります。さらに詳しい RPM の説明は、<a href="http://dev.mysql.com/doc/refman/5.1/ja/linux-rpm.html">MySQL 公式サイト</a>を参照しましょう。</p>
<blockquote><p>mysql:               MySQL-client-community + MySQL-shared-community<br />
mysql-bench:   該当なし<br />
mysql-devel:    MySQL-devel-community<br />
mysql-server:  MySQL-server-community<br />
mysql-test:      MySQL-test-community</p></blockquote>
<p>MySQL 公式の RPM を使うには、既存の CentOS から提供されているパッケージを上書きするようなダミーパッケージを作成したほうが便利だろうと考えました。なぜなら、既存の MySQL 以外のパッケージで、mysql や mysql-devel のパッケージ依存関係が設定されているときにやっかいだからです。具体的には、<a href="http://www.kazu.tv/blog/archives/000770.html">このような現象</a>が想定されるからです。</p>
<p>一度ダミーパッケージを作って、公式の RPM もローカルの yum リポジトリに入れてインストールとすると、どうも不思議な感じになってしまいました。具体的には、mysql パッケージをインストールすると、なぜか MySQL-server-community パッケージがインストールされてしまいました。</p>
<p>公式の RPM をよく見てみると、なんと <strong>Provides</strong> が設定されているじゃありませんか!<br />
公式の RPM では、次のようにちゃんと Provides が設定されています。</p>
<blockquote><p>MySQL-client: mysql-client MySQL-client<br />
MySQL-server-community: msqlormysql mysql-server mysql MySQL MySQL-server<br />
MySQL-test-community: mysql-test MySQL-test<br />
MySQL-devel-community: mysql-devel MySQL-devel<br />
MySQL-shared-community: mysql-shared MySQL-shared<br />
MySQL-embedded-community:  mysql-embedded MySQL-embedded<br />
MySQL-test-community: mysql-test MySQL-test</p></blockquote>
<p>なので、mysql パッケージ名を指定すると MySQL-server-community パッケージがインストールされるんですね。。。ということで、小文字のパッケージ名でもちゃんとインストールできます。。。ダミーパッケージを作成したのが無駄になってしまいました、お恥ずかしい。。。</p>
<p>一点だけ注意点があって、mysql というパッケージ名は MySQL-server-community で Provides されているので、MySQL サーバが入ってしまうということです。もし、あるパッケージに mysql というパッケージの依存関係があると MySQL-server-community パッケージがインストールされてしまうので注意しましょう。</p>
<p>まとめると、ダミーパッケージは必要なく、MySQL の公式パッケージだけで、次のコマンドで MySQL の最新バージョンを手軽に使うことができます。</p>
<blockquote><p>$ sudo yum install mysql-client mysql-shared mysql-server</p></blockquote>
<p>上のコマンドで MySQL をインストールする場合、MySQL の公式 RPM の方がバージョンが新しいので必ず MySQL 5.1.44 がインストールされるはずです。</p>
<p>ですが、正しくバージョンを指定して、MySQL のバージョンをインストールした場合は、次のようにします。</p>
<blockquote><p>$ sudo yum install mysql-client-5.1.44 mysql-shared-5.1.44 mysql-server-5.1.44</p></blockquote>
<p>ただし、RPM に登録されるパッケージ名は、MySQL-*** となるので注意しましょう。mysql* という小文字のパッケージでは登録されていないので気をつけてください。</p>
<p>また、mysql の設定ファイル(/etc/my.cnf と /etc/mysqlmanager.passwd)は、インストールされていないので自分で設置しましょう。<br />
デフォルトの /etc/my.cnf は、<a href="http://gallery.menalto.com/node/62649">このあたりの情報</a>をもとにして設定を追加するといいと思います。</p>
<p>ちなみに MySQL の公式 RPM は、cobbler でローカルの yum リポジトリにミラーしていますが、こんな感じで設定してあります。</p>
<blockquote><p>$ sudo cobbler repo report &#8211;name=mysql-MySQL-5.1</p>
<p>repo: mysql-MySQL-5.1<br />
arch: x86_64<br />
breed: rsync<br />
comment:<br />
created: Tue Feb  9 22:34:22 2010<br />
createrepo_flags: -c cache -d<br />
environment: {}<br />
keep updated: True<br />
mirror: rsync://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.1/<br />
mirror locally: True<br />
modified : Tue Feb  9 22:34:22 2010<br />
owners: ['admin']<br />
priority: 99<br />
rpm list:<br />
yum options: {}</p></blockquote>
<p>こうしておけば、MySQL 5.1 系の最新バージョンがでたとき、cobbler reposync すればすぐに最新版の RPM をローカルの yum リポジトリにミラーできるので、とても便利です。</p>
<p>さて、これで MySQL をメジャーアップグレードする準備が整いました。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/lKQN4XnMoQ0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1724/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1724</feedburner:origLink></item>
		<item>
		<title>OSC 2010 Tokyo/Spring に行ってきた</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/ZqHj8uHspi0/1722</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1722#comments</comments>
		<pubDate>Sat, 27 Feb 2010 14:23:56 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[oscon]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1722</guid>
		<description />
			<content:encoded><![CDATA[<p><a href="http://www.ospn.jp/osc2010-spring/modules/eguide/event.php?eid=72">OSC 2010 Tokyo/Spring</a> に、次の講演だけを目当てに行ってきました。参加目的は、「そろそろインフラを BSD に切替えてもいいかもと考えていて、そのための情報収集のためと、そろそろ Linux に疲れてきたかもとふと思ってしまったからです」。</p>
<p><a href="http://www.ospn.jp/osc2010-spring/modules/eguide/event.php?eid=72">オープンソースカンファレンス2010 Tokyo/Spring &#8211; イベント案内 | 2010-02-27 (土): LinuxからBSDへ – reallyenglishのインフラとネットワーク</a></p>
<p>以下、講演内容のメモです。</p>
<ul>
<li><a href="http://www.reallyenglish.com/">reallyenglish</a> のサービス紹介、おもに BtoB 向けの英語学習サービスを提供</li>
<li>データセンターは、日本と香港に二つ借りている</li>
<li>サーバ台数 50 台、30 台の L2/L3 スイッチ、10 の IPsec-VPN くらいの規模、L2/L3 レベルですべて冗長化されている</li>
<li>OS は、ルータにはすべて OpenBSD、サーバには FreeBSD 7.x を使っている</li>
<li><a href="http://www.nagios.org/">nagios</a> の監視レベルで、100 個のホスト死活監視、400 のサービス監視</li>
<li>サーバは、PXE 経由でインストールしている、VLAN を設定してあって、管理コンソールは HP の iLO2 を使っている(つまり HP 製のサーバだということ)</li>
<li>香港のデータセンターは、有料で OS のセットアップまで行ってくれるが、自分たちでなるべくやっている</li>
<li><a href="http://oss.oetiker.ch/smokeping/">smokeping</a> を使って、ネットワークのレイテンシーをみている</li>
<li>ローカルネットワークにパッケージのビルドサーバ、パッケージリポジトリをもっていて、port ツリーを一部カスタマイズしたりしている</li>
<li>freebsd-update もローカルのサーバ経由で行っている</li>
<li><a href="http://tinderbox.marcuscom.com/">Marcuscom Tinderbox</a> を使って、パッケージのビルドなどを管理している(かなり便利とのこと)</li>
<li><a href="http://www.freebsd.org/doc/handbook/jails.html">Jail</a> を多用している、雑用系のサーバには 10 くらいの Jail が起動していた、他の仮想化技術と違って仮想化によるオーバーヘッドがほとんどないとのこと、Jail から ZFS も扱えるとのこと</li>
<li>Jail の設定はかなりめんどうだったが、<a href="http://erdgeist.org/arts/software/ezjail/">ezjail &#8211; Jail administration framework</a> というツールでかなり簡単に設定できるようになった</li>
<li>LDAP を使っている</li>
<li><a href="http://wiki.freebsd.org/ZFS">ZFS </a>を本番環境で使っている</li>
<blockquote>
<li>Version 13 が RELENG_8 に入っている</li>
<li>ほぼ本番環境でも使えるクオリティに仕上っている</li>
<li>ZFS の運用では、パーティションやスライスを切らないのが普通とのこと</li>
<li>ルートパーティションは、UFS2 にして USB メモリに入れてブートしている</li>
<li>ハードディスクは、すべて ZFS に割り当てている</li>
<li>SSD 上で <a href="http://blogs.sun.com/brendan/entry/test">ZFS L2ARC : Brendan Gregg</a> にある L2ARC(read), ZIL(write) という仕組みを使うと SSD をキャッシュとして使うことができる</li>
<li>Dedup という実装が進んでいる(詳細は調べてみたが分からず)</li>
</blockquote>
<li><a href="http://wiki.freebsd.org/HAST">HAST &#8211; FreeBSD Wiki</a> という Linux でいうところの DRBD のようなものが開発が進められている</li>
<li>HAST + ZFS + iSCSI という夢の組合せができるかもしれないとのこと</li>
<li>nagios version 3.0.6 を使って監視しているが、Template Engine を使ってテンプレートで生成している(mixi と同じ方式だと理解しました)</li>
<li>reallyenglish では、現在開発エンジニアとインフラエンジニアを<a href="http://www.reallyenglish.com/company/recruiting/index.html">絶賛募集中</a>とのこと</li>
</ul>
<p>その他、貴重な本番の nagios の監視画面や smokeping の画面やネットワーク構成図も見ることができました。</p>
<p>BSD 系のインフラの話は、あまり話を聞く機会がなかったのでかなり参考になりました。</p>
<p>まずは、自分個人の FreeBSD サーバで ZFS や Jail を使ってみたいと思います。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/ZqHj8uHspi0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1722/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1722</feedburner:origLink></item>
		<item>
		<title>hbstudy #8 に行ってきた</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/ObwYY20Y4Yo/1717</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1717#comments</comments>
		<pubDate>Tue, 23 Feb 2010 14:12:20 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[engineer]]></category>
		<category><![CDATA[hbstudy]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1717</guid>
		<description />
			<content:encoded><![CDATA[<p>会社のインフラをおもに担当している同僚を誘って、hbstudy #8 <a href="http://atnd.org/events/3092">http://atnd.org/events/3092</a> に行ってきました。今回は、<a href="http://developer.cybozu.co.jp/kazuho/">kazuho</a> さん、<a href="http://trac.mizzy.org/public/blog">mizzy</a> さん、という豪華な講演だったので参加人数も 120 名くらいと、とても大人数で驚きました。</p>
<p>今回の講演のスライドは、おそらく公開されるのではないかと思いますが、今回の hbstudy #8 ではツール以前にインフラエンジニアとしてどんなところを目指すか、どのような姿勢でインフラを管理するかといった精神論的な考えというか思想が、とても勉強になりました。</p>
<p>まず、インフラにかかわらず、何言にも共通する思想は、</p>
<blockquote><p><strong>楽をすること</strong></p></blockquote>
<p>につきると思います。楽をするための苦労は惜しまずに、楽をするためのツールを自作したり、オープンソースのツールを使ったり、楽をするにはいろいろな方法があります。まず考えることは、楽をするために何をすることなのかなぁと思います。楽をするというと、なんだか怠け者のような印象をもたれることもあると思いますが、楽をするために新しい手法を取り入れていることは大事だと思います。</p>
<p>その次は、インフラエンジニアとしての大切だったと思った思想は、次のとおりです。</p>
<ul>
<li>インフラに導入するツールは、なるべくシンプルなものにする</li>
<li>自作ツールの場合、なるべく同じ技術を使ったツールで統一する</li>
<li>ある程度、基本知識がある人なら、自分が管理しているインフラを管理することができるようにする</li>
</ul>
<p>まず、前提となる知識を習得するのが困難だったり、使い方は複雑なツールは使わないということです。やはり、とても便利なツールでも複雑なツールを導入してしまうと、自分はいいのですが他の人に引き継ぐことになったときなどに説明する手間がかなりかかると思います。また、決してオープンソースのツールだけに選択肢をおかずに機会損失や管理コストなどを総合的に比較して商用ツールも検討するといったこともあるかと必要な場面があると思います。</p>
<p>その次ですが、kazuho さんが基本的にとてもシンプルな自作ツールでインフラを管理しているという話の中で登場してきたツールはほとんど perl で書かれていました。自作ツールでも、シェルスクリプトだったり、C++ だったり、ruby だったり、と実装している技術はバラバラだと、すべての知識が必要になってきます。こうした自作ツールは、perl など１つの実装にまとめることで perl さえ分かれば自作ツールのメンテナンスや改良もできます。最近の Linux の場合、<a href="http://www.linuxfoundation.org/collaborate/workgroups/lsb">Linux Standard Base (LSB) | The Linux Foundation</a> という規格があるこの規格によると perl や python は最初からインストールされています。残念ながら、<a href="http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Languages/LSB-Languages/book1.html">ruby や PHP は入っていない</a>ので、ruby や PHP で作るときにはパッケージのインストールが必要になります。最近のサーバは、とても早いのでわざわざ C++ などで作成するよりも LL で十分なことも多くなってきていると思います。個人的には、ruby を愛用していますが、python にしたほうが標準インストールされているという観点でみるとありかなと思っています。</p>
<p>最後に、自作ツールでもあまりオレオレ仕様的なツールは作らずに、他のツールの思想や考えたにのとった自作ツール、定番といえるオープンソース、だけをできるだけ組み合わせて、かつシンプルに形でインフラを管理しておくということです。シンプルにしておけば、日常業務の中でも毎日やることが単純になったり、業務レベルで他の担当者と共有することも比較的容易なのでないかと思います。</p>
<p>今回の hbstudy では、このような考え方というか思想が大事なのではないかと感じました。僕が管理しているインフラも、この思想に基づいていけるように日々改善を重ねいたいと思いました。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/ObwYY20Y4Yo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1717/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1717</feedburner:origLink></item>
		<item>
		<title>monit 5.1</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/_Mks_4sHyi8/1712</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1712#comments</comments>
		<pubDate>Tue, 23 Feb 2010 01:11:58 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[monit]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1712</guid>
		<description />
			<content:encoded><![CDATA[<p>愛用している <a href="http://mmonit.com/monit/">monit</a> の最新版バージョン 5.1 がリリースされました。</p>
<p>このバージョンでは、CHANGELOG をみて分かるようにバグフィックスの他にいくか機能拡張がされています。</p>
<p>その中で、個人的に大きいのは httpd のサービスチェックのときに HOST ヘッダーを指定できるようになったことです。例えば、次のようなに HOST ヘッダーを指定して httpd サービスの監視をすることができます。</p>
<blockquote><p>if failed host localhost port 80 protocol http and request &#8216;/ testing&#8217; hostheader &#8216;example.com&#8217; with timeout 20 seconds for 2 cycles then restart</p></blockquote>
<p>hostheader という識別子で手軽に指定することができます。</p>
<p>さっそく試そうと RPM を作ってみることにしました。monit には、RPM を作成するための SPEC ファイルが同梱されているので、次のコマンドでさくっと RPM を作成することができます。</p>
<blockquote><p>$ rpmbuild -ta monit-5.1.tar.gz</p></blockquote>
<p>しかし、いくつか不用なファイルの設定が原因で RPM をビルドできないので SPEC ファイルを、次のように修正しました。この修正は、本家に連絡してすでにコミットしてもらってあります。</p>
<blockquote><p>&#8212; monit.spec-org      2010-02-18 10:48:56.000000000 +0900<br />
+++ monit.spec  2010-02-18 10:49:09.000000000 +0900<br />
@@ -51,7 +51,7 @@</p>
<p>%files<br />
%defattr(-,root,root)<br />
-%doc CHANGES.txt CONTRIBUTORS COPYING FAQ.txt LICENSE README README.SSL<br />
+%doc CHANGES.txt COPYING LICENSE README README.SSL<br />
%config /etc/monitrc<br />
%config /etc/init.d/%{name}<br />
%{_bindir}/%{name}</p></blockquote>
<p>RPM を作成して、さっそく monit をアップグレードして、次のような設定で試してみます。</p>
<blockquote><p>check process httpd with pidfile /var/run/httpd/httpd.pid<br />
start program = &#8220;/etc/init.d/httpd start&#8221;<br />
stop program = &#8220;/etc/init.d/httpd stop&#8221;<br />
if failed port 80 protocol http<br />
and request &#8220;/&#8221; hostheader &#8220;example.com&#8221;<br />
with timeout 2 seconds for 2 cycles<br />
then restart</p></blockquote>
<p>動作確認するために、sudo monit -Iv してみると、hostheader の syntax エラーになります。ソースコードをみてみると、不具合っぽいのでさっそく連絡してみると、作者の Martin さんから、次のようなパッチが送られてきました。</p>
<blockquote><p>Index: p.y<br />
===================================================================<br />
&#8212; p.y (revision 128)<br />
+++ p.y (working copy)<br />
@@ -1077,7 +1077,7 @@<br />
;</p>
<p>hostheader      : /* EMPTY */<br />
-                | hostheader STRING {<br />
+                | HOSTHEADER STRING {<br />
portset.request_hostheader = $2;<br />
}<br />
;</p></blockquote>
<p>monit バージョン 5.1 の不具合のようです。さっそく、上のパッチとあわせて本家に掲載されている FTP のパッチをあわせて RPM を作成しました。パッチをあてて作成した RPM は、<a href="http://github.com/downloads/n0ts/rpm/monit-5.1-2.x86_64.rpm">ここ</a>に置いておきます。</p>
<p>パッチをあてた monit でさっそく動作確認してみると、hostheader 識別子をちゃんと認識して問題なく動作しました。</p>
<p>これからの修正は、<a href="http://code.google.com/p/monit/source/browse/trunk/CHANGES.txt">CHANGELOG</a> をみてみると、おそらく近いうちに monit バージョン 5.1.1 でリリースされるのでないかと思います。hostheader のバグレポートを報告したので、CHANGELOG になんと僕の名前が掲載されています。こんな小さな報告でも CHANGELOG に追加されるんですね。</p>
<blockquote><p>﻿﻿﻿﻿﻿﻿﻿﻿Fix the HTTP protocol test&#8217;s hostheader option which was added in 5.1.<br />
Thanks to Naoya Nakazawa for report.</p></blockquote>
<p>httpd のサービスチェックで HOST ヘッダーを指定できると、かなり便利になるので、monit を愛用している人はバージョン 5.1.1 を待つか、パッチをあてたバージョンにアップグレードするといいと思います。</p>
<p>monit は、なんといっても設定ファイルが書きやすい、メーリングリストで質問やバグレポートをすると翌日にはすぐに返信があるのでかなり活発なプロジェクトなので、使っていない人はぜひ使ってみるといいと思います。</p>
<p># 2010.02.25: 追記</p>
<p><a href="http://mmonit.com/monit/download/">monit</a> バージョン 5.1.1 がリリースされました。バグフィックスのみのリリースです。</p>
<blockquote><p>Release checksums<br />
=================<br />
md5:    4bbd3845ae1cbab13ec211824e0486dc<br />
sha256: bf789e0660410e8c63f4b3dc2eeab9889347e6494a6dc1c0e764343cae0dc1ba</p>
<p>Release information:<br />
====================<br />
Bug fixes<br />
* Fixed FTP protocol test. Thanks to Axel Reinhold for report.<br />
* Fixed the hostheader option in the HTTP protocol test, which was<br />
added in Monit 5.1. Thanks to Naoya Nakazawa for report.<br />
* Removed an erroneous warning message about missing system service check.<br />
* Improved manual page formatting. Thanks to Stefan Alfredsson for report.</p></blockquote>
<p>僕の名前があって、ちょっとうれしいです(笑)。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/_Mks_4sHyi8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1712/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1712</feedburner:origLink></item>
		<item>
		<title>iptstate</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/zcME64S3b_c/1709</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1709#comments</comments>
		<pubDate>Mon, 15 Feb 2010 12:11:03 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1709</guid>
		<description />
			<content:encoded><![CDATA[<p><a href="http://www.phildev.net/iptstate/">iptstate</a> というコマンドがあることを始めて知りました。</p>
<p>iptstate は、netfilter の接続をトラックキングしているテーブルの情報を top のように表示してくれるコマンドです。</p>
<p>CentOS の場合は、すでに iptstate バージョン 1.4.1 が提供されていて、普通にインストールすると iptstate パッケージがインストールされています。</p>
<p>さっそく、試してみます。iptstate は、netfilter つまり iptables の接続トラックキングテーブルの情報を表示してくれるので、iptables が動作している必要があります。</p>
<blockquote><p>$ sudo /usr/sbin/iptstate</p></blockquote>
<blockquote><p>IPTables &#8211; State Top<br />
Version: 1.4          Sort: SrcIP           s to change sorting<br />
Source                  Destination             Proto   State        TTL<br />
127.0.0.1:33005         127.0.0.1:8020          tcp     ESTABLISHED  119:59:58<br />
127.0.0.1:52326         127.0.0.1:8021          tcp     ESTABLISHED  119:59:56<br />
192.168.161.1:60730     192.168.161.125:22      tcp     ESTABLISHED  119:59:12<br />
192.168.161.1:54619     192.168.161.125:22      tcp     ESTABLISHED  119:59:55<br />
192.168.161.1:17500     192.168.161.255:17500   udp                    0:00:09</p></blockquote>
<p>な感じで、接続元の IP アドレス、経路情報、プロトコル、状態、TTL、を表示してくれます。</p>
<p>もちろん、top のように並び替えもできます。iptstate では、次の並び替えのキーが定義されています。</p>
<blockquote><p>d   カラムのサイズを動的に変更して、古いデフォルトのサイズを使用する</p>
<p>f   loopback でフィルタリングする</p>
<p>l   IPアドレスの中で DNS を探している順にする</p>
<p>m   ホスト名を切り取った形でフィルタリングする</p>
<p>n   DNS に関連した表示にする</p>
<p>q   終了する</p>
<p>r   逆順に並び替える</p>
<p>space   表示をすぐに更新する</p></blockquote>
<p>昔から存在するコマンドですが、どこから接続があるので、どのポートに接続しているのか、などがすぐに分かるので、とても便利なコマンドです。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/zcME64S3b_c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1709/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1709</feedburner:origLink></item>
		<item>
		<title>Puppet Dashboard を試してみた</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/T_LNGioMb3E/1700</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1700#comments</comments>
		<pubDate>Sun, 14 Feb 2010 15:34:03 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[puppet]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1700</guid>
		<description />
			<content:encoded><![CDATA[<p><a href="http://reductivelabs.com/2009/12/14/a-tour-of-puppet-dashboard-0-1-0/">Puppet Dashboard  がリリースされた</a>ので、さっそく試してみました。</p>
<p>Puppet Dashboard とは、ノード管理とレポートツールを提供してくれる Puppet のウェブアプリケーションです。ノード情報はYAML 形式でエクスポートすることができて、ダッシュボードから外部ノードツールとして使うこともできるようです。</p>
<p>まず、最初にPuppet Dashboard を動作させるために、次のものが必要です。</p>
<ul>
<li>ruby &gt;= 1.8.1</li>
<li>rake &gt;= 0.8.4</li>
<li>mysql</li>
<li>puppet</li>
<li>rubygems &gt;= 1.3.2</li>
<li>rails &gt;= 2.3.4</li>
</ul>
<p>さっそくインストールしてみましょう。</p>
<blockquote><p>$ git clone git://github.com/reductivelabs/puppet-dashboard.git</p>
<p>$ cd puppet-dashboard</p>
<p>$ rake install</p></blockquote>
<p>rake install すると、dashboard_development というデータベースが作成されてテーブルがいくつか作成されるので、localhost に mysql が起動している必要があります。</p>
<p>Rails アプリケーションなので、さっそく起動します。</p>
<blockquote><p>$ ./script/server</p></blockquote>
<p>http://localhost:3000 にアクセスすると、次のような Puppet Dashboard トップ画面が表示されます。</p>
<p><a href="http://www.sssg.org/blogs/naoya/wp-content/uploads/2010/02/pd1.jpg" rel="lightbox"><img class="aligncenter size-medium wp-image-1701" title="Puppet Dashboard 1" src="http://www.sssg.org/blogs/naoya/wp-content/uploads/2010/02/pd1-300x180.jpg" alt="" width="300" height="180" /></a>ノードの例として、「sample node」が定義されています。さっそく、ユーザ登録してみます。ユーザ登録は、ユーザ名とパスワードを入力するだけのシンプルな形です。</p>
<p><a href="http://www.sssg.org/blogs/naoya/wp-content/uploads/2010/02/pd2.jpg" rel="lightbox"><img class="aligncenter size-medium wp-image-1702" title="Puppet Dashbaord Register" src="http://www.sssg.org/blogs/naoya/wp-content/uploads/2010/02/pd2-300x180.jpg" alt="" width="300" height="180" /></a>ユーザ登録できたところで、実際のノードを追加してみます。Nodes タブをクリックして、ノードを追加します。</p>
<p><a href="http://www.sssg.org/blogs/naoya/wp-content/uploads/2010/02/pd3.jpg" rel="lightbox"><img class="aligncenter size-medium wp-image-1703" title="Puppet Dashboard Nodes" src="http://www.sssg.org/blogs/naoya/wp-content/uploads/2010/02/pd3-300x222.jpg" alt="" width="300" height="222" /></a>この他にも、ノードクラス、ノードグループ、レポート、の機能があります。</p>
<p>まず、レポートの機能は、現在の puppet レポートの実行結果が /var/puppet/lib/reports にある場合は、次のコマンドで Puppet Dashbaord へインポートできます。</p>
<blockquote><p>$ rake reports:import</p></blockquote>
<p>また、puppet レポートの実行結果が、他の場所にある場合は、次のコマンドで Puppet Dashboard へインポートすることができます。REPORT_DIR という環境変数に Puppet レポートの実行結果を格納してあるディレクトリを指定するだけです。</p>
<blockquote><p>$ rake reports:import REPORT_DIR /path/to/your/reports</p>
<p>Importing 1 report from /path/to/your/reports<br />
Importing:     100% |##########################################| Time: 00:00:00<br />
1 of 1 report imported</p></blockquote>
<p>試しに1件レポートデータをインポートした画面は、次のようになっています。</p>
<p><a href="http://www.sssg.org/blogs/naoya/wp-content/uploads/2010/02/pd4.jpg" rel="lightbox"><img class="aligncenter size-medium wp-image-1704" title="Puppet Dashboard Report" src="http://www.sssg.org/blogs/naoya/wp-content/uploads/2010/02/pd4-300x284.jpg" alt="" width="300" height="284" /></a></p>
<p>毎回、レポートをインポートするのが面倒なので、Puppet サーバと連携する方法も用意されています。Puppet サーバと連携するには、puppetmasterd に、次のように &#8211;reports オプションを指定するだけです。</p>
<blockquote><p>&#8211;reports &lt;puppet_bashboardのサーバ名&gt;</p></blockquote>
<p>ただし、Puppet Dashboard は、localhost:3000 で動作するようにハードコーディングされています。これを変更するには、lib/puppet/puppet_dashboard.rb を変更する必要があります。</p>
<p>次に Puppet Dashboard には、Puppet 互換の外部ノード情報と連携することができます。Puppet 互換の外部ノード情報は、YAML 形式で出力しますが、Puppet Dashboard に付属している bin/external_node プログラムを使います。このプログラムも、localhost:3000 でハードコーディングされているので、環境に応じて変更するとよいでしょう。</p>
<p>今のところ、僕が Puppet を投入している本番環境ではレポート機能をオフにして、エラーログのみチェックしていますが、比較的少ない台数で運用している場合は、Puppet Dashboard 管理画面からレポートの実行結果をチェックすることができるので、便利なツールと言えそうです。</p>
<p>将来的には、次の機能が実装予定とのことです。</p>
<ul>
<li>LDAP と ActiveDirectory 認証</li>
<li>管理者の権限によるアクセス制御</li>
<li>データをよりよく可視化して、情報にアクセスしやすくする</li>
<li>さらに多くのノード状態情報(オフライン状態、通信エラー、など)</li>
<li>リソースの変更を報告して、トラックキングする</li>
<li>Puppet の実行スケジューリング</li>
<li>その他のコミュニティからのリクエスト機能</li>
</ul>
<p>まだ、Puppet Dashboard は登場したばかりなので、これから期待できるツールにもなりますね。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/T_LNGioMb3E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1700/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1700</feedburner:origLink></item>
		<item>
		<title>接続元の IP アドレスをラウンドロビン的に変更する方法</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/qi85DW5kSKs/1695</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1695#comments</comments>
		<pubDate>Thu, 11 Feb 2010 14:31:05 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[linux iptables]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1695</guid>
		<description />
			<content:encoded><![CDATA[<p>とあるサーバから、あるサーバに接続したとき、あるサーバに残るアクセスログの接続元 IP アドレスをラウンドロビン的に変更することが必要になったので調査してみた。そうすると、<a href="http://hanzubon.jp/node/247">iptables を使うとできる</a>というまさにぴったりの記事を発見した。</p>
<p>さっそく、CentOS で試してみると、iptables の libipt_statistic モジュールがないというエラーになってしまった。次に RedHat のページを調べていると、<a href="https://bugzilla.redhat.com/show_bug.cgi?id=215361">Bug 215361 – iptables is missing /lib/iptables/libipt_statistic.so</a> というまさにぴったりな情報が見つかった。その情報では、iptables バージョン 1.3.6 から追加されたとあったので、さっそく netfilter iptables バージョン 1.3.6 のページの<a href="http://www.netfilter.org/projects/iptables/files/changes-iptables-1.3.6.txt">変更点</a>を調べてみると、たしかに次のような記載があった。</p>
<blockquote>
<pre>- Add support for statistic match (needs kernel &gt;= 2.6.18)
  [ Patrick McHardy ]</pre>
</blockquote>
<p>CentOS 5.3 x86_64 の iptables のバージョンは、iptables-1.3.5-4.el5 なので一つバージョンが古いのが原因のようだ。Linux カーネル 2.6.18 が必須とのことなので、CentOS でもおそらく使えるそうだ。</p>
<p>さっそく、iptables バージョン 1.3.6 を導入するために、RPM を作成にとりかかった。</p>
<p>まず、iptables-1.3.5-4.el5 の SRPM をダウンロードして、このバージョンの iptables.spec ファイルをパッチなどはすべて正しくあてるように、かつ libipt_statistic をビルドして組み込むように RPM を作成した。</p>
<p>libipt_statistic は、iptables バージョン 1.4.0 以降から標準で組み込まれるようになっているが、バージョン 1.3.6 では標準では組み込まれない。ちょうど、<a href="http://lists.netfilter.org/pipermail/netfilter-cvslog/2007-September/005498.html">該当のコミットログ</a>があったので、コミットログを参照しながら RPM を作成した。</p>
<p>作成した RPM は、<a href="http://cloud.github.com/downloads/n0ts/rpm/iptables-1.3.6-1.x86_64.rpm">ここ</a>にアップロードしてある。あわせて、<a href="http://cloud.github.com/downloads/n0ts/rpm/iptables-1.3.6-1.src.rpm">SRPM</a> もアップロードした。他に作った人がいないかも調べてみたが、見つからなかった。</p>
<p>iptables を現時点での最新版であるバージョン 1.4.6 ではなく、バージョン 1.3.6 にしようとした理由は RPM のおそらくメジャーアップグレードになるので RPM の作成が大変であること、安定性の面で経験がまったくないのでなるべる標準にインストールされるバージョンに近いものにしたいと思ったからだ。</p>
<p>作成した RPM で、CentOS にインストールされている既存の iptables をバージョンアップして、さっそく試してみた。</p>
<p>まず、外側のネットワークのデバイスに IP エイリアスを設定する。次の例は、ifconfig eth0 の出力結果だが、不要な情報は省いてある。</p>
<blockquote><p>eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx<br />
inet addr:192.168.161.125  Bcast:192.168.161.255  Mask:255.255.255.0</p>
<p>eth0:0    Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx<br />
inet addr:192.168.161.124  Bcast:192.168.161.255  Mask:255.255.255.0</p>
<p>eth0:1    Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx<br />
inet addr:192.168.161.123  Bcast:192.168.161.255  Mask:255.255.255.0</p>
<p>eth0:2    Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx<br />
inet addr:192.168.161.122  Bcast:192.168.161.255  Mask:255.255.255.0</p></blockquote>
<p>次の iptables の設定で NAT チェインを、次のように設定する。(スマイルアイコン対策のため、PREGROUTING と POSTROUTING の前のセミコロンは省いてある)</p>
<blockquote><p>*nat<br />
PREROUTING ACCEPT [0:0]<br />
:OUTPUT ACCEPT [0:0]<br />
POSTROUTING ACCEPT [0:0]<br />
-A POSTROUTING -o eth0 -p tcp &#8211;dport 80 -m statistic &#8211;mode nth &#8211;every 4 -j SNAT &#8211;to-source 192.168.161.125<br />
-A POSTROUTING -o eth0 -p tcp &#8211;dport 80 -m statistic &#8211;mode nth &#8211;every 4 -j SNAT &#8211;to-source 192.168.161.124<br />
-A POSTROUTING -o eth0 -p tcp &#8211;dport 80 -m statistic &#8211;mode nth &#8211;every 4 -j SNAT &#8211;to-source 192.168.161.123<br />
-A POSTROUTING -o eth0 -p tcp &#8211;dport 80 -m statistic &#8211;mode nth &#8211;every 4 -j SNAT &#8211;to-source 192.168.161.122<br />
COMMIT</p></blockquote>
<p>iptables を再起動して、さっそく接続先のサーバに Apache HTTPD を起動して、アクセスログを確認してみると、次のような結果になった。</p>
<blockquote><p>192.168.161.125 &#8211; - [11/Feb/2010:23:17:07 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.124 &#8211; - [11/Feb/2010:23:17:08 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.123 &#8211; - [11/Feb/2010:23:17:09 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.122 &#8211; - [11/Feb/2010:23:17:09 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.125 &#8211; - [11/Feb/2010:23:17:10 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.125 &#8211; - [11/Feb/2010:23:17:11 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.124 &#8211; - [11/Feb/2010:23:17:12 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.125 &#8211; - [11/Feb/2010:23:17:13 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.125 &#8211; - [11/Feb/2010:23:17:14 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.123 &#8211; - [11/Feb/2010:23:17:14 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44</p></blockquote>
<p>完全にはラウンドロビンにはなっていないが、リクエストごとにアクセス元の IP アドレスが毎回変更されている。</p>
<p>最後に libipt_statistic のモジュールとはどんなモジュールかソースコードを読んでみた。libipt_statistic モジュールとは、ある状態になっているかを調べることができるモジュールのようである。</p>
<p>設定内容は、次のような設定が可能。</p>
<blockquote><p>&#8211;mode mode: マッチモード (random あるいは nth)</p>
<p>&#8211;probability p: 確立</p>
<p>&#8211;everyn: n 番目のパケットに毎回マッチする</p>
<p>&#8211;packet p: 初期値のカウント値(p は、0 以上 p &#8211; 1 以下)、デフォルトは 0</p></blockquote>
<p>どうやらこのモジュールは、ある状態ごとに iptables の設定を変更できるモジュールのようだ。</p>
<p>いろいろと試した結果、完全なラウンドロビンにするには、次のような設定でいけるようだ。(スマイルアイコン対策のため、PREGROUTING と POSTROUTING の前のセミコロンは省いてある)</p>
<blockquote><p>*nat<br />
PREROUTING ACCEPT [0:0]<br />
:OUTPUT ACCEPT [0:0]<br />
POSTROUTING ACCEPT [0:0]<br />
-A POSTROUTING -o eth0 -p tcp &#8211;dport 80 -m statistic &#8211;mode nth &#8211;every 4 -j SNAT &#8211;to-source 192.168.161.125<br />
-A POSTROUTING -o eth0 -p tcp &#8211;dport 80 -m statistic &#8211;mode nth &#8211;every 3 -j SNAT &#8211;to-source 192.168.161.124<br />
-A POSTROUTING -o eth0 -p tcp &#8211;dport 80 -m statistic &#8211;mode nth &#8211;every 2 -j SNAT &#8211;to-source 192.168.161.123<br />
-A POSTROUTING -o eth0 -p tcp &#8211;dport 80 -m statistic &#8211;mode nth &#8211;every 1 -j SNAT &#8211;to-source 192.168.161.122<br />
COMMIT</p></blockquote>
<p>上の設定のときの Apache アクセスログは、次のようになった。</p>
<blockquote><p>192.168.161.122 &#8211; - [11/Feb/2010:23:27:29 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.125 &#8211; - [11/Feb/2010:23:27:30 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.124 &#8211; - [11/Feb/2010:23:27:31 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.123 &#8211; - [11/Feb/2010:23:27:32 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.122 &#8211; - [11/Feb/2010:23:27:32 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.125 &#8211; - [11/Feb/2010:23:27:33 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.124 &#8211; - [11/Feb/2010:23:27:34 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.123 &#8211; - [11/Feb/2010:23:27:34 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.122 &#8211; - [11/Feb/2010:23:27:35 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44<br />
192.168.161.125 &#8211; - [11/Feb/2010:23:27:36 +0900] &#8220;GET / HTTP/1.1&#8243; 200 44</p></blockquote>
<p>どうして、この設定だと、完全にラウンドロビンになるのか、よく分かっていない。。。</p>
<p>iptables には、こんなこともできるのかと感動した。</p>
<p># 2010.04.01: 追記</p>
<p>iptables の設定ファイルの例は、<a href="http://gist.github.com/351619">ここ</a>に置いた。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/qi85DW5kSKs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1695/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1695</feedburner:origLink></item>
		<item>
		<title>HipHop for PHP</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/t3ceHpgcqSY/1689</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1689#comments</comments>
		<pubDate>Tue, 09 Feb 2010 05:02:00 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[facebook php]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1689</guid>
		<description />
			<content:encoded><![CDATA[<p><a href="http://developers.facebook.com/news.php?blog=1&amp;story=358">HipHop for PHP</a> の技術的な講演動画が ustream にあったので、チェックしてみました。動画は、全部で 40 分弱くらいですが、講演自体は 20 分くらい、その他は質問でした。</p>
<p>以下、動画からのメモです。</p>
<ul>
<li>CPU の高い使用率が問題になっていた</li>
<li>10,000 台のウェブサーバ</li>
<li>それぞれのリクエストに 800 ミリ秒かかっている</li>
<li>コードベースが巨大になるにつれて、さらに遅くなる</li>
<li>ハードウェアは、フリーではない</li>
<li>言語ごとのベンチマークした結果の CPU の使用率</li>
<li>CPU の使用率が低い順 No1: C++, No2: Java, No3: C#, No4: Erlang, No5: Python, No6: Perl,  No7: PHP</li>
<li>PHP と Perl は同等、C++ や Java に比べると10 倍くらい遅いという結果</li>
<li>高いメモリ使用率が問題</li>
<li>- 150M<br />
for ($i = 0; $i &lt; 1000000; $i++) {<br />
$a[] = $i;<br />
}</li>
<li>- 750MB<br />
for ($i = 0; $i &lt; 5000000; $i++) {<br />
$a[] = $i<br />
}</li>
<li>HipHop for PHP では、次の問題点を解消するために作った</li>
<li>高い CPU の使用率を解消するため</li>
<li>多くのメモリの使用率を解消するため</li>
<li>他のシステムで既存の PHP のロジックを再利用するため</li>
<li>拡張は、ほとんどの PHP 開発者には書くことが難しい作業</li>
<li>HipHop for PHP は、2年間の成果で、ソースコードの最適化された C++ コード(g++ を使う)の変換機</li>
<li>効果は、ウェブサーバは 50% 以下に下がった、API は 2 倍のトラフィックに対して 30% 以下に下がった(APC を使った PHP コードベースと比べた結果)</li>
<li>7つのステップを通して、コードを変換する</li>
<li>本番環境でのデプロイは、通常の PHP コードでのデプロイとは異なっている</li>
<li>複数のスレッドで一つのプロセスを起動している</li>
<li>再起動している間のダウンタイムがない(port takeover&#8230; ポートを乗っ取り?)</li>
<li>巨大なバイナリを置く</li>
<li>HipHop は、現在とてもシンプルなウェブサーバ上で使っている</li>
<li>これからのロードマップ</li>
<li>現在、PHP 5.2 をサポートしているが、5.3 もサポートしたい</li>
<li>ウェブサーバのオプションとして Apache をサポートしたい</li>
<li>Facebook では、Apache 1.3 Prefrok で使っているとのこと</li>
<li>同時にデータベースのコネクションも減っている</li>
<li>PHP の拡張はスレッドセーフでない問題は解決できていないとのこと</li>
</ul>
<p>まだ、ちゃんと試していないのでよく分かりませんが、PHP なウェブサービスで PHP が CPU ボトルネックになっている場合には、物理サーバを減らすための有効なソリューションの一つになるかもしれないイメージをうけました。ただし、Facebook では、まだとても単純なウェブサーバ上でしか使っていないそうので、実際のサービスに使うにまだまだ時間がかかりそうです。</p>
<p>あと、個人的には Java は C++ と同様のベンチマーク結果だということも注目です。</p>
<p>なお、HipHop for PHP のソースコードは、<a href="http://github.com/facebook/hiphop-php">github</a> でもうすぐ公開予定とのことです。</p>
<p><object id="utv219687" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="386" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="name" value="utv_n_227464" /><param name="flashvars" value="loc=%2F&amp;autoplay=false&amp;vid=4409735" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.ustream.tv/flash/video/4409735" /><embed id="utv219687" type="application/x-shockwave-flash" width="480" height="386" src="http://www.ustream.tv/flash/video/4409735" allowscriptaccess="always" allowfullscreen="true" flashvars="loc=%2F&amp;autoplay=false&amp;vid=4409735" name="utv_n_227464"></embed></object></p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/t3ceHpgcqSY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1689/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1689</feedburner:origLink></item>
		<item>
		<title>sudos</title>
		<link>http://feedproxy.google.com/~r/n0ts/~3/mpMJJHTt1zE/1683</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1683#comments</comments>
		<pubDate>Wed, 03 Feb 2010 14:44:12 +0000</pubDate>
		<dc:creator>naoya</dc:creator>
				<category><![CDATA[day]]></category>
		<category><![CDATA[sudo]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1683</guid>
		<description />
			<content:encoded><![CDATA[<p>本番サーバ上で、sudo コマンド経由でスーパーユーザ権限で実行することはよくあります。</p>
<p>sudo コマンドはなくてはならないコマンドですが、同時に危険なコマンドでもあります。</p>
<p>今まで、ずっとデフォルトの sudo の設定で使っていたのですが、改めて設定を見直してみました。</p>
<p>sudo の<a href="http://www.gratisoft.us/sudo/">公式ページ</a>をみてみると、頻繁にバージョンアップされているのがよく分かります。/etc/sudoers の設定方法も詳しいドキュメントがあっていい感じです。</p>
<p>次の2点ほど設定を見直しました。</p>
<ul>
<li>デフォルトのパスワードのキャッシュ時間を 0 にする</li>
<li>パスワードプロンプトにホスト名を表示する</li>
</ul>
<p>まず、最初の設定はデフォルトだと 5 分間、パスワードがキャッシュされます。そうすると、連続で sudo コマンドを実行するとき、パスワードを聞かれないためオペミスを起こしてしまう可能性が高まります。そこで、キャッシュ時間を 0 にすることにより、必ず毎回パスワードを聞くように設定します。この設定は、visudo コマンドを使って、次の行を追加します。</p>
<blockquote><p>Defaults timestamp_timeout = 0</p></blockquote>
<p>次にパスワードを聞かれるときのプロンプトにホスト名を表示して、念のためどのホストで sudo を実行しようとしているのか表示します。次の行を追加します。</p>
<blockquote><p>Defaults passprompt = &#8220;%u@%h Password: &#8220;</p></blockquote>
<p>この設定をすると、例えば hoge というユーザ名で、s1 というホスト名の場合、次のようなパスワードプロンプトになります。</p>
<blockquote><p>hoge@s1 Password:</p></blockquote>
<p>デフォルトのパスワードプロンプトに比べると、かなり分かりやすい表示になりました。</p>
<p>最新版の sudo バージョン 1.7.1 以降からは、次のような構文で別の設定ファイルも読み込めるようになっています。</p>
<p>これを使えば、ホストごとに異なった設定も管理しやすくなります。ただし、CentOS の場合、バージョン 1.6.8 なので対応していません。すこしはまってしまいました。。。</p>
<blockquote><p><tt>#includedir /etc/sudoers.d/hoge<br />
</tt></p></blockquote>
<p>最新版の sudo に入れ替えようと思いましたが、今のところそれほど困っていないので最新版は使っていません。</p>
<p>普段何気なく使っている sudo。もちろん、なるべく本番サーバ上では使わないのが賢明ですが、メンテナンスのときなど使う機会があるので、なるべくオペミスのリスクを減らしたいものです。</p>
<p>さらに、僕は sudo を<a href="http://www.sssg.org/blogs/naoya/archives/1443">コマンド補完履歴</a>に追加しないようにしています。</p>
<p># 2/5 追記</p>
<p>ちなみに、sudo のパスワードキャッシュをクリアするときは sudo -k あるいは -K オプションで行います。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/mpMJJHTt1zE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1683/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1683</feedburner:origLink></item>
	</channel>
</rss>
