<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><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: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>
	<pubDate>Wed, 31 Dec 2008 16:10:43 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
	<language>ja</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/n0ts" type="application/rss+xml" /><item>
		<title>2009年 あけましておめでとうございます</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/499555827/1028</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1028#comments</comments>
		<pubDate>Wed, 31 Dec 2008 16:05:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1028</guid>
		<description><![CDATA[2009年、あけましておめでとうございます！
2009年、いよいよ始まりました。
今年の豊富は、次のとおりです。

人への思いやりを持てるようにする
行動力を発揮する
モテる

今年もよろしくお願いします！
]]></description>
			<content:encoded><![CDATA[<p>2009年、あけましておめでとうございます！</p>
<p>2009年、いよいよ始まりました。</p>
<p>今年の豊富は、次のとおりです。</p>
<ul>
<li>人への思いやりを持てるようにする</li>
<li>行動力を発揮する</li>
<li>モテる</li>
</ul>
<p>今年もよろしくお願いします！</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/499555827" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1028/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1028</feedburner:origLink></item>
		<item>
		<title>VMware Fusion のゲスト OS Linux Tips</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/499492076/1025</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1025#comments</comments>
		<pubDate>Wed, 31 Dec 2008 14:30:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[vmware linux]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1025</guid>
		<description><![CDATA[VMware Fusion でゲスト OS として Linux の CentOS をインストールしたけれど、DHCP のためホスト OS から ssh するとき IP アドレスが分からないので困る。
そこで、ゲスト OS [...]]]></description>
			<content:encoded><![CDATA[<p>VMware Fusion でゲスト OS として Linux の CentOS をインストールしたけれど、DHCP のためホスト OS から ssh するとき IP アドレスが分からないので困る。</p>
<p>そこで、ゲスト OS を固定 IP にしてみた。</p>
<p>まず、ホスト OS で DHCP のレンジを見るには、 &#8221;/Library/Application Support/VMware Fusion/vmnet8/dhcpd.conf&#8221; をみると分かる。僕の環境では、&#8221;range 172.16.123.128 172.16.123.254&#8243; になっていた。ということで、ゲスト OS の IP アドレスを 172.16.123.127 にしてみることにした。</p>
<p>以下は、ゲスト OS での設定方法</p>
<ul>
<li>/etc/resolv.conf の nameserver を 172.16.123.2 に変更する</li>
<li>eth0 のネットワーク設定 (/etc/sysconfig/network-scripts/ifcfg-eth0) を、BOOTPROTO を static に、IPADDRESS を 172.16.123.127 に変更する</li>
<li>/etc/sysconfig/network の GATEWAY を 172.16.123.2 に変更する</li>
<li>/etc/init.d/network restart して、設定を反映させる</li>
</ul>
<div>あとは、ホスト OS の /etc/hosts に IP アドレスとホスト名を設定すれば、かなり便利になる。</div>
<div>これで、しばらく開発用途で使ってみると思う。</div>
<div></div>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/499492076" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1025/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1025</feedburner:origLink></item>
		<item>
		<title>postgresql 8.3 on OSX</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/499403809/1023</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1023#comments</comments>
		<pubDate>Wed, 31 Dec 2008 11:48:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1023</guid>
		<description><![CDATA[どうしても忘れてしまうので、MacPorts からインストールした portgresql で、EUC-JP なデータベースを作る方法。

sudo chown postgres /opt/local/var/db/postgresql83

	
sudo su postgres -c &#8216;/opt/local/lib/postgresql83/bin/initdb &#8211;no-locale -D /opt/local/var/d
b/postgresql83/defaultdb&#8217;
/opt/local/lib/postgresql83/bin/createuser -P -U postgres で、任意のユーザを作る
/opt/local/lib/postgresql83/bin/createdb -h localhost -U postgres -E EUC_JP &#60;データベース名&#62;

ポイントは、&#8211;no-locale を指定するところ。
]]></description>
			<content:encoded><![CDATA[<p>どうしても忘れてしまうので、MacPorts からインストールした portgresql で、EUC-JP なデータベースを作る方法。</p>
<ol>
<li>sudo chown postgres /opt/local/var/db/postgresql83</li>
<li>
	</li>
<li>sudo su postgres -c &#8216;/opt/local/lib/postgresql83/bin/initdb &#8211;no-locale -D /opt/local/var/d</li>
<li>b/postgresql83/defaultdb&#8217;</li>
<li>/opt/local/lib/postgresql83/bin/createuser -P -U postgres で、任意のユーザを作る</li>
<li>/opt/local/lib/postgresql83/bin/createdb -h localhost -U postgres -E EUC_JP &lt;データベース名&gt;</li>
</ol>
<p>ポイントは、&#8211;no-locale を指定するところ。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/499403809" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1023/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1023</feedburner:origLink></item>
		<item>
		<title>CentOS Tips - インストーラー編-</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/498363522/1021</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1021#comments</comments>
		<pubDate>Tue, 30 Dec 2008 06:04:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[centos]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1021</guid>
		<description><![CDATA[CentOS 5.2 x86_64 をセットアップしようとして、いくつかはまった。今後のためにメモをしておく。

グラフィカルインストーラーでないと、Software RAID 1 + LVM の環境をセットアップできな [...]]]></description>
			<content:encoded><![CDATA[<p>CentOS 5.2 x86_64 をセットアップしようとして、いくつかはまった。今後のためにメモをしておく。</p>
<ul>
<li>グラフィカルインストーラーでないと、Software RAID 1 + LVM の環境をセットアップできない</li>
<li><a href="https://fedorahosted.org/cobbler/" onclick="javascript:pageTracker._trackPageview('/outbound/article/fedorahosted.org');">cobbler</a> でグラフィカルインストーラーにする方法は、<a href="https://fedorahosted.org/cobbler/wiki/GraphicalInstalls" onclick="javascript:pageTracker._trackPageview('/outbound/article/fedorahosted.org');">Grapical Installs</a> に書かれているがこの方法だとうまくいかなった、最新安定版の 1.4.0 だと /etc/cobbler/settings になるはずだけれど</li>
<li>そこで、VMware Fusion にインストールしようとしたところ、メモリが 256MB にすると anaconda がメモリ不足で落ちる（最低でも 512MB 以上設定すること）</li>
<li>CentOS をデフォルトでインストールすると、4GB はすぐに使いきってしまうので注意（10GB くらいはあったほうがいいかもしれない）</li>
</ul>
<p>といろいろはまったけれど、ようやく CentOS をインストールして、Cobbler 1.4 で Software RAID 1 + LVM な kickstart インストールをできるようにする予定です。Cobbler の開発が激しく、機能も充実してきているのであとでエントリしたいと思う。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/498363522" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1021/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1021</feedburner:origLink></item>
		<item>
		<title>OSX にインストールするソフトウェアたち</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/496347891/1014</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1014#comments</comments>
		<pubDate>Sat, 27 Dec 2008 14:50:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1014</guid>
		<description><![CDATA[年の瀬ということもあって、仕事マシンとして大活躍してくれた MacBook 白をいい機会なので再インストールした。再インストールしたら、今までのはなんだったというくらいに起動が速くなった。
OSX を再インストールしたあ [...]]]></description>
			<content:encoded><![CDATA[<p>年の瀬ということもあって、仕事マシンとして大活躍してくれた MacBook 白をいい機会なので再インストールした。再インストールしたら、今までのはなんだったというくらいに起動が速くなった。</p>
<p>OSX を再インストールしたあとは、仕事に必要なソフトウェアをいくつかインストールするついで、今日はそのソフトウェアたちを紹介します。</p>
<p>次に紹介するのは、実際にインストールした順番です。</p>
<ul>
<li><a href="http://abyssoft.com/software/teleport/" onclick="javascript:pageTracker._trackPageview('/outbound/article/abyssoft.com');">teleport</a>: 一言でいうと <a href="http://synergy2.sourceforge.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/synergy2.sourceforge.net');">Synergy</a> for OSX です、Synergy も OSX で動作すると思いますが teleport は OSX 専用でシステム設定から簡単に設定できるのが特徴</li>
<li><a href="http://semaja2.net/insomniaxinfo" onclick="javascript:pageTracker._trackPageview('/outbound/article/semaja2.net');">InsomniaX</a>: OSX では MacBook を閉じると必ず Sleep 状態に入ってしまうが、InsomniaX を有効にすることでそれを解除することができる、22インチの外付けディスプレイを接続してミラーディスプレイ設定をして InsomniaX を有効にしてから MacBook を閉じてディスプレイの検出をすると MacBook 側の液晶はオフになって外付けディスプレイのサイズにあわせてくれるのでかなり便利、さらに teleport と組み合わせることで HHK や Logicool マウスを使えるのがかなり便利</li>
<li><a href="http://www.google.com/url?sa=U&amp;start=1&amp;q=http://iterm.sourceforge.net/&amp;ei=FtFVSfePHJio6wOyw9yMBg&amp;usg=AFQjCNF1Q7L4SHB26stu7EjIA-X5zHsuUw" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');">iTerm</a>: Terminal.app は 256 色対応していないので、重宝しているターミナルプログラム、アップデートがまだまだ激しいのでまだまだ開発が進んでいる、iTerm は開くデスクトップを固定して使っている、設定を外部に保存できないのが不便</li>
<li><a href="http://www.porkrind.org/emacs/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.porkrind.org');">Emacs</a>: エディタ、OSX 向けには Carbon Emacs などいろいろな Emacs があるけれど、僕はほぼ公式の Emacs をビルドしたものを使っている理由は my .emacs が Carbon Emacs で動作せずに対応するのがめんどうだったから、定期的にアップデートされているのでチェックしたほうがいいかも</li>
<li><a href="http://www.pqrs.org/tekezo/macosx/keyremap4macbook/index.html.ja" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.pqrs.org');">KeyRemap4MacBook</a>: キーリピートは速くないと効率が悪いので重宝している、Initial Wait を 200ms、Wait を 20ms に設定している、最近のバージョンからタスクバーに表示されるようになった</li>
<li><a href="http://www.google.com/url?sa=U&amp;start=1&amp;q=http://macuim.yatsu.info/&amp;ei=PNhVSbfiEpz-6QOj082MBg&amp;usg=AFQjCNEfJpPJ8cBK9RZrB7lwXCGjunCN0Q" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');">MacUIM</a>: ATOK を買う前に試してみましょう、Leopard でも動作します、Prime を使っていたけれどたまに重くなる傾向があったので今では Authy を使っています、トグルキーは Shift-Space を愛用しているので Spotlight のショートカットキーとかぶってしまうので無効にしている</li>
<li><a href="http://www.blacktree.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.blacktree.com');">Quicksilver</a>: アプリケーションの起動やローカルにあるヘルプファイルの参照に使っている</li>
<li><a href="http://www.google.com/url?sa=U&amp;start=1&amp;q=http://www.culater.net/software/SIMBL/SIMBL.php&amp;ei=F9dVSeSOO5j07AO_4dSMBg&amp;usg=AFQjCNFSRmU2AEaoQykMOG3vVl2aO8hh5A" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');">SIMBL</a>: これがないと始まらないです</li>
<li><a href="http://code.google.com/p/blacktree-visor/" onclick="javascript:pageTracker._trackPageview('/outbound/article/code.google.com');">visor</a>: 基本的には iTerm だけれど、日本語の文字コードを設定を切り替えるのがめんどうなので Terminal.app だけ EUC-JP にしている、visor を使うとコマンド一発で起動できるので便利</li>
<li><a href="http://blog.s21g.com/articles/1075" onclick="javascript:pageTracker._trackPageview('/outbound/article/blog.s21g.com');">TerminalCopyOnSelect</a>: iTerm だとデフォルトで実現しているけれど、かんり便利なのでインストールしている</li>
<li><a href="http://niw.at/articles/2007/11/02/TerminalColoreopard/ja" onclick="javascript:pageTracker._trackPageview('/outbound/article/niw.at');">TerminalColoreopard</a>: 個人的に ANSI カラーが見にくいのでインストールしている</li>
<li><a href="http://www.google.com/url?sa=U&amp;start=1&amp;q=http://developer.apple.com/iphone/&amp;ei=L7pWSe6jD9XFkAX4u6jaDw&amp;usg=AFQjCNFsg-4KSG1oY1VeUZwvR2C9n5W5-w" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');">iPhone SDK</a>: Xcode 単体でもよいけれど、開発には必須</li>
<li><a href="http://www.google.com/url?sa=U&amp;start=1&amp;q=http://www.macports.org/&amp;ei=cDtWSaK_O5z-7APzrLmMBg&amp;usg=AFQjCNHR7tsmhHFjH0VKN1xZPnR64BIEdg" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');">MacPorts</a>: 仕事に必要な MySQL や PHP などをインストールするのに必須、ない場合は手軽に自分で作れるのも便利 &#8230; インストールする ports: zsh-devel, screen, SSHKeychain, mysql5-devel, postgresql83, apache2, php5, svk などなど</li>
<li><a href="http://www.google.com/url?sa=U&amp;start=1&amp;q=http://www.rubyenterpriseedition.com/&amp;ei=2LpWSYW5IpXGkAWWhv3ADw&amp;usg=AFQjCNHRV2PPhqgz1AMdas9YG4fQ4fkYQA" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');">Ruby Enterprise Edition</a>: rails アプリを開発しているので、passenger も自動的にインストールされて便利</li>
<li><a href="http://www.google.com/url?sa=U&amp;start=1&amp;q=http://code.google.com/p/macfuse/&amp;ei=mD1WSebFC5Tq6QOw7cyMBg&amp;usg=AFQjCNHhI_281sJhTVZorRrFg61EmWQZlw" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');">macfuse</a>, <a href="http://osxbook.com/download/sshfs/sshfs-static-leopard.gz" onclick="javascript:pageTracker._trackPageview('/outbound/article/osxbook.com');">sshfs-static-leopard</a>: SSHFS は超絶便利、まとめて sshfs でマウントできるように簡単な autometer アプリケーションを書いている</li>
<li><a href="http://www5e.biglobe.ne.jp/~arcana/StartupSound/BETA/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www5e.biglobe.ne.jp');">StartupSound</a>: OSX の起動音を制御できるソフト、あの起動音はびびることが多いのでオフにしている</li>
<li><a href="http://islayer.com/apps/istatmenus/" onclick="javascript:pageTracker._trackPageview('/outbound/article/islayer.com');">iStat menus</a>: CPU、メモリなどの使用状況をリアルタイムにチェックできるプログラム</li>
</ul>
<p>あとは、Firefox、Opera、Adium、Skype、OpenOffice の定番ソフトをインストールした。</p>
<p>MacPorts にある zsh にシェルを切り替えるには、/etc/shells に /opt/local/bin/zsh を追加して chsh -s /opt/local/bin/zsh で OK。</p>
<p>引き続き、Safari、Firefox のウェブ開発環境を整えるとする。</p>
<p>Windows の IE も必要だが、Corssover を試してみる。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/496347891" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1014/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1014</feedburner:origLink></item>
		<item>
		<title>sar の履歴保有期間を増やす方法</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/495481329/1012</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1012#comments</comments>
		<pubDate>Fri, 26 Dec 2008 10:06:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[sysstat]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1012</guid>
		<description><![CDATA[Linux で、過去の負荷などをチェックできる sysstat パッケージに含まれている sar コマンドで参照できる履歴保有期間を増やすには、sysstat の設定ファイルを書き換えるだけで対応できる。
CentOS  [...]]]></description>
			<content:encoded><![CDATA[<p>Linux で、過去の負荷などをチェックできる sysstat パッケージに含まれている sar コマンドで参照できる履歴保有期間を増やすには、sysstat の設定ファイルを書き換えるだけで対応できる。</p>
<p>CentOS 5.2 x86_64 の場合、 /etc/sysconfig/sysstat の HISTORY を次のように書き換えればいい。</p>
<blockquote><p># How long to keep log files (days), maximum is a month</p>
<p>HISTORY=28</p></blockquote>
<p>デフォルトだと、最大1週間分しか保有されないので一ヶ月分にしておくと何かあったときに便利になる。なぜ、28 なのかは /usr/lib64/sa/sa2 のシェルスクリプトを見ると分かります。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/495481329" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1012/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1012</feedburner:origLink></item>
		<item>
		<title>CS193H</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/491206706/1010</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1010#comments</comments>
		<pubDate>Sun, 21 Dec 2008 07:33:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[stanford]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1010</guid>
		<description><![CDATA[スタンフォード大学で、CS193H - High Performance Web Sites というタイトルの講義が行われた。そのときのプレゼンテーション資料が、公開されていた。講義は、9/22 から 12/5 まで行わ [...]]]></description>
			<content:encoded><![CDATA[<p>スタンフォード大学で、CS193H - High Performance Web Sites というタイトルの講義が行われた。そのときのプレゼンテーション資料が、<a href="http://cs193h.stevesouders.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/cs193h.stevesouders.com');">公開</a>されていた。講義は、9/22 から 12/5 まで行われて、おもに次のような内容だったようだ。講義タイトルを翻訳してみた。</p>
<ol>
<li>9/22: 導入 - Introduction</li>
<li>9/24: フロントエンド側のパフォーマンスの重要性について - The Importance of Frontend Performance</li>
<li>9/26: HTTP ウェブサイトの 100 のパフォーマンスプロファイル - HTTP Web 100 Performance Profile</li>
<li>9/26: 開かれたウェブのパフォーマンス挑戦 - Performance Challenges for the Open Web</li>
<li>10/1: フロントエンドカンフー - Front End Kung Fu</li>
<li>10/3: 高いパフォーマンスのウェブページ - Netflix のケースで考える実例 - High Performance Web Pages - Real World Examples: Netflix Case Study</li>
<li>10/6: Alexa ランキングトップ 100 のウェブサイト - Class Project: Improving a Top 100 Web Site</li>
<li>10/8: HTTP リクエストを少なくする - Make Fewer HTTP Requests</li>
<li>10/10: CDN を使う - Use a Content Delivery Network</li>
<li>10/13: Expires ヘッダーを追加する - Add an Expires Header</li>
<li>10/15: Gzip コンポーネント - Gzip Components</li>
<li>10/17: 先頭にスタイルシートを配置する - Put Stylesheets at the Top</li>
<li>10/20: 末尾にスクリプトを配置する - Put Scripts at the Bottom</li>
<li>10/22: DNS 検索を減らす - Avoid CSS Expressions Reduce DNS Lookups</li>
<li>10/24: 外部に JavaScript と CSS を作る - Make JavaScript and CSS External</li>
<li>10/27: JavaScript を最小化する - Minify JavaScript</li>
<li>10/29: リダイレクトを無効にする - Avoid Redirects</li>
<li>10/31: 中間試験 - MIDTERM EXAM</li>
<li>11/3: Ajax のパフォーマンス - Ajax Performance</li>
<li>11/5: 重複している Script を削除する - Remove Duplicate Scripts</li>
<li>11/7: ETags の設定 - Configure ETags</li>
<li>11/10: Ajax をキャッシュされる＆初期ロードを分割させる - Make Ajax Cacheable &amp; Split the initial Payload</li>
<li>11/12: ブロックせずにスクリプトをロードする - Load Scripts Without Blocking</li>
<li>11/14: インラインスクリプトをばら撒かない - Don&#8217;t Scatter Inline Scripts</li>
<li>11/17: 大規模環境での高速なデータのスケール - Facebook から学ぶ - Fast Data at Massive Scale - lessons learned at Facebook</li>
<li>11/19: 主要なドメインを共有する - Shared Dominant Domains</li>
<li>11/21: イメージの最適化、Iframe を控えめに使う、ドキュメントを早めにフラッシュする - Optimize Images, Use Iframes Sparingly, Flush the Document Early</li>
<li>12/1: クッキーを自由にして固定リソースを出す、クッキーの重みを減らす - Serve Static Resouces Cookie-Free, Reduce Cookie Weight, To WWW or not to WWW</li>
<li>12/3: CSS 子孫セレクタで、圧縮を強制する - CSS Descendant Selectors, Forces Compression</li>
<li>12/5: パフォーマンスの状態 - State of Performance</li>
<li>12/9: 最終試験 - FINAL EXAM</li>
<li>12/12: 最終試験 - FINAL EXAM</li>
</ol>
<p>ということで、Yahoo! から公開されている有名なウェブサイトの<a href="http://developer.yahoo.net/blog/archives/2008/03/yahoos_latest_p.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/developer.yahoo.net');">パフォーマンス Tips</a> を含めた各テクニックを1つの講義で行ったり、実例から学んだりと、とても面白そうな講義になっている。それぞれの講義には、必ず宿題があったり、試験も公開されていて、かなり興味深い。</p>
<p>資料はほとんど公開されているけれど、数が多いので自分の興味のあるものをみてみるといいと思う。</p>
<p>僕は、とりあえずすべての資料に目を通してみたので、講義ごとにメモしておこう。</p>
<p><a href="http://docs.google.com/Present?docid=dfb9f5wn_139hg3m2p32" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Intoroduction</a> では、Yahoo! から Google に移籍した「ハイパフォーマンスWebサイト」の著者でもある Steve Sounders 氏の講義。ハイパフォーマンスの 14 のルール、Y! Slow などを紹介している。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_168fc36vgdr" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">The Importance of Frontend Performance</a> では、iGoogle を例にあげて 8 割から 9 割のエンドユーザへの応答時間は、フロントエンド側で費やされていることをあげて、<a href="http://www.httpwatch.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.httpwatch.com');">HTTPWatch</a> という Windows 専用のパケットスニッファ、<a href="http://getfirebug.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/getfirebug.com');">Firebugs</a>、<a href="http://developer.yahoo.com/yslow/" onclick="javascript:pageTracker._trackPageview('/outbound/article/developer.yahoo.com');">Y Slow</a> を紹介している。</p>
<p><a href="http://docs.google.com/Present?docid=dfb9f5wn_236gqhm8j55" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">HTTP Web 100 Performance Profile</a> では、HTTP の基礎的な解説のみで、宿題が5つのウェブサイトについて Y Slow などでパフォーマンスを計測するというもの。そのときのシートも<a href="http://spreadsheets.google.com/ccc?key=pFI0gp5Gg0kEwvwLjUfzJNA&amp;hl=en" onclick="javascript:pageTracker._trackPageview('/outbound/article/spreadsheets.google.com');">公開</a>されている。</p>
<p><a href="http://josephsmarr.com/papers/Smarr-CS193H.ppt" onclick="javascript:pageTracker._trackPageview('/outbound/article/josephsmarr.com');">Performance Challnges for the Open Web</a> では、<a href="http://www.plaxo.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.plaxo.com');">Plaxo</a> でやっている OpenID や Google Social Graph API や OpenSociel などについての解説。これはゲスト講義だったようだ。</p>
<p><a href="http://billwscott.com/share/presentations/2008/stanford/HPWP-RealWorld.pdf" onclick="javascript:pageTracker._trackPageview('/outbound/article/billwscott.com');">High Performacne Web Pages - Real World Examples: Netflix Case Study</a> では、<a href="http://netflix.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/netflix.com');">Netflix</a> という実際のウェブサイトでのパフォーマンスを向上させたときの事例が解説されている。Firebugs にクライアント側のパフォーマンスデータを計測する<a href="http://looksgoodworkswell.blogspot.com/2008/06/announcing-jiffy-firebug-extension-for.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/looksgoodworkswell.blogspot.com');">プラグイン</a>があることは初めて知った。</p>
<p><a title="roundtrip-firebug.png (by billwscott)" href="http://www.flickr.com/photos/thescottclan/2597183452/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.flickr.com');"><img title="roundtrip-firebug.png (by billwscott)" src="http://farm4.static.flickr.com/3256/2597183452_35d8100e8c.jpg" alt="roundtrip-firebug.png (by billwscott)" width="350" /></a></p>
<p>さらに <a href="http://billwscott.com/jiffyext/" onclick="javascript:pageTracker._trackPageview('/outbound/article/billwscott.com');">Jiffy Firebug の拡張</a>を使うと、onLoad の時間などより詳しい計測ができるようになるらしい。</p>
<p>43 ページ目の Gzip 圧縮、Expire ヘッダーの追加、Etags を設定したことによってネットワークトラフィックが約半分になったという結果はとても興味深い。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_259f3br3cgs" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Class Project: Improving a Top 100 Web Site</a> では、これまでの講義を振り返りつつ、Alexa ランキングトップ 100 のパフォーマンスを改良するクラスプロジェクトを行ったらしい。</p>
<p><a href="http://docs.google.com/Present?docid=dfb9f5wn_261dgcfh4ds" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Make Fewer HTTP Requests</a> では、HTTP リクエストを減らすために CSS sprites、base64 でエンコードしたインラインイメージデータ、のテクニックが解説されている。</p>
<p><a href="http://docs.google.com/Present?docid=dfb9f5wn_266dnhjbkdz" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Use a Content Delivery Network</a> では、リバースプロキシとして CDN を使うことについて解説されている。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_286gkk9wvdh" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Add an Expires Header </a>では、Expires ヘッダーを追加することについて解説されている。Expires ヘッダーを使うと、ブラウザ側にキャッシュを持たせることができるので、HTTP リクエストを減らすことにつながるのは既知のとおり。</p>
<p>個人的な体験では、Expires ヘッダーをはじめて追加したとき、それほど大規模サイトではないのでいきなり長い期間を設定してしまって大きな失敗をしたことがある。特に Expires ヘッダーを後から追加するときは、短い期間（たとえば1時間など）からゆっくりと設定しながら伸ばしていくのがいいと思う。</p>
<p><a href="http://docs.google.com/Present?docid=dfb9f5wn_295cdhbtfc2" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Gzip Components</a> では、Gzip 圧縮について解説されている。Gzip と Deflate の比較表は、とても参考になった。若干 Gzip の方は圧縮率が高い。1K 未満のリソースは圧縮しないほうがいいらしい。トップサイトでは、ほぼ Gzip 圧縮されている。Gzip 圧縮はいいことだけど、古い一部のブラウザ IE 5.5 &amp; 6.0、Netscape 3.x &amp; 4.x では問題があるので注意して、BrowerMatch は設定した方がいいとのこと。これは忘れがちなので要注意。Apache 2.0 では、次のように設定する。</p>
<blockquote><p># BrowserMatch ^MSIE [6-9] gzip<br />
# BrowserMatch ^Mozilla/[5-9] gzip</p></blockquote>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_332dg4bvzcz" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Put Stylesheets at the Top</a> では、CSS を先頭におくことで体験速度が上がる。実際に、IE や Firefox で計測した例が紹介されている。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_339ckd5h6xc" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Put Scripts at the Bottom</a> では、スクリプトブロックについて解説されている。ブラウザごとの挙動や、IE8 &amp; Safari 4 &amp; Firefox 3.1 &amp; Chrome では並列にスクリプトをロードすることができるようになるらしい。それでも、IE6 &amp; 7 はしばらくの間使われ続けるはずなので、「put scripts at the bottom」を心に刻めということ。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_344d6zvkpcv" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Avoid CSS Expressions Reduce DNS Lookups</a> では、Steve 氏の講義で CSS の表記によってはページをダウンロードするのが遅くなること、DNS による検索を減らすルールについて解説されている。トップサイトの TTL は、ほとんど 1 分など短く指定している。ブラウザの DNS キャッシュは IE7 では 30 分、Firefox 2 では 1 分であるらしい。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_351hprh4sd4" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Make JavaScript and CSS External</a> では、JavaScript と CSS は inline としてページ内で定義するのがいいのか、それとも external として外部で定義するのがいいかについて解説されている。</p>
<ul>
<li>inline: 高速だが、HTML ドキュメントが大きくなる</li>
<li>external: HTTP のリクエスト数が増えるが、キャッシュされる</li>
</ul>
<p>ということで external がほとんどの場合よさそうということ。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_364f95kh9gr" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Minify JavaScript</a> では、JavaScript のコードからスペースなど余計な文字を除去して転送するデータ量を少なくする方法が解説されている。<a href="http://crockford.com/javascript/jsmin" onclick="javascript:pageTracker._trackPageview('/outbound/article/crockford.com');">JSMin</a> や <a href="http://developer.yahoo.com/yui/compressor/" onclick="javascript:pageTracker._trackPageview('/outbound/article/developer.yahoo.com');">YUI Compressor</a> や <a href="http://dojotoolkit.org/docs/shrinksafe/" onclick="javascript:pageTracker._trackPageview('/outbound/article/dojotoolkit.org');">DoJo Compressor</a> を使うことで簡単に圧縮できるとのこと。トップサイトを調べた結果、約2割くらい転送するデータ量を削減できているとのこと。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_37543h7hhfg" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Avoid Redirects</a> では、リダイレクトについて解説されている。ヘッダーではなく、HTML ドキュメントの中にリダイレクトを挿入することはスクリプトでリダイレクトすることはよくないとのこと。HTTP ステータスコード 301 だとキャッシュされないが、一部のブラウザでは Expires を設定することがキャッシュされる。</p>
<p><a href="http://cs193h.stevesouders.com/slides/crockford-ajax-performance.ppt" onclick="javascript:pageTracker._trackPageview('/outbound/article/cs193h.stevesouders.com');">Ajax Performance</a> では、Ajax にまとをしぼったパフォーマンス向上 Tips について解説されている。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_4152p44qvdp" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Remove Duplicate Scripts</a> では、重複したスクリプトの除去として、aol.com では adsonar.jp が 6 回ロードされていることが紹介されて、Steve 氏のサイトでは同じスクリプトを 10 回ロードされるページが<a href="http://stevesouders.com/hpws/dupe-scripts-cached10.php" onclick="javascript:pageTracker._trackPageview('/outbound/article/stevesouders.com');">公開</a>されている。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_417fr4z7z75" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Configure ETags</a> では、ETags の設定方法について解説されている。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_458g4mwgq5c" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Make Ajax Cacheable &amp; Split the Initial Payload</a> では、Ajax のリクエストにも Expires ヘッダーをつけることでキャッシュさせる方法について解説されている。Ajax のリクエストは動的なものが多いのでキャッシュさせることはあまりないことだが、URL に timpestampをつけると有効であるとのこと。Google Calendar はそうなっているとのこと。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_480d93grfg4" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Load Scripts Without Blocking</a> では、スクリプトブロックについて解説されている。&lt;script src=&#8221;A.js&#8221;&gt; という記述では、並列ダウンロードや描画をブロックするとのこと。MSN では、script タグを動的に作ることでブロックを回避している。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_508dxkc35c2" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Don&#8217;t Scatter Inline Scripts</a> では、広告や非同期スクリプトを外部から読み込みときの Tips が解説されている。いわゆる、外部スクリプトの遅延ロードについての解説。IE だと、script タグに defer と追加すると Google Analytics のスクリプトを非同期に読み込めるとのこと。Firefox だと、createElement で動的に script タグを作る。</p>
<p><a href="http://cs193h.stevesouders.com/slides/bobby_johnson_Stanford_11-08.ppt" onclick="javascript:pageTracker._trackPageview('/outbound/article/cs193h.stevesouders.com');">Fast Data at Massive Scale - lessons learned at Facebook</a> は、ゲスト講義で Facebook の <a href="http://www.google.com/url?sa=U&amp;start=1&amp;q=http://www.facebook.com/people/Robert-Johnson/3501774&amp;ei=1ulNSaDjDZO6sgK41YHdDQ&amp;sig2=kDpop_euPuff8VWaG-hU3A&amp;usg=AFQjCNEs06D9dRs803xIPbp_qXCnbzwP8g" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');">Robert Johnson</a> 氏の講義。Facebook のインフラのアーキテクチャーが公開されているかなり貴重な資料。Facebook のパフォーマンスを計測した結果として、1/2 が PHP の実行時間、1/4 が memcached、1/8 がデータベースとのこと。ただし、1ねん前はほとんど memcached であったとのこと。そのころはスイッチ経由で PHP クライアントと memcached のやりとりをしたのをクラスタリングにした。もうすこし具体的な情報がほしかったな。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_515dg79xtpk" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Shard Dominant Domains</a> では、ドメインをわけることで並列ダウンロードしてページの表示時間を短くする方法について解説されている。Steve 氏のサイトでは、実際のデモとして<a href="http://stevesouders.com/hpws2/domains1.php?t=1229843477" onclick="javascript:pageTracker._trackPageview('/outbound/article/stevesouders.com');">同じドメイン版</a>、<a href="http://stevesouders.com/hpws2/domains2.php?t=1229843483" onclick="javascript:pageTracker._trackPageview('/outbound/article/stevesouders.com');">別のドメイン版</a>、と用意されている。ブラウザによって、実装が異なっているが、HTTP 1.1 だと 1 サーバあたり 2 接続でダウンロードできるらしい。DNS のルックアップ回数を減らすルールと矛盾しそうなルールだが、イメージなどの固定なコンテンツには有効とのこと。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_526chbbfmhh" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Optimize Images, Use Iframes Sparingly, Flush the Document Early </a>では、イメージの最適化、iframe を控えめに使う、ドキュメントは早めにフラッシュすることについて解説されている。イメージの最適化では、さまざなツールが紹介されておりが <a href="http://csssprites.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/csssprites.com');">CSS Sprites Generator</a> というツールがあるとは知らなかった。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_537fz35xjvt" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">Serve Static Resources Cookie-Free, Reduce Cookie Weight, To WWW or not to WWW</a> では、クッキーのサイズによってレスポンスタイムが変わることについて解説されている。</p>
<p><a href="http://docs.google.com/Presentation?id=dfb9f5wn_55655xvctg7" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">CSS Descendant Selectors, Forced Compression</a> では、CSS のパフォーマンス向上に的を絞った解説がされている。ユニバーサルセレクタを使わない、DIV #navbar ではなく #navbar と指定する、LI .tight ではなく .li-tight と指定する、#navbar A ではなく .a-navbar と指定する。CSS 子孫セレクタによってはパフォーマンスに影響してくるというテスト結果も公開されていた。</p>
<p><a href="http://docs.google.com/Present?docid=dfb9f5wn_565c5fjj5dz" onclick="javascript:pageTracker._trackPageview('/outbound/article/docs.google.com');">State of Performance</a> では、今までの講義のまとめて的なものであった。</p>
<p>ということで、ウェブサイトのパフォーマンスを向上させるテクニックがこれほど詳細にスタンフォード大学で講義があった。</p>
<p>このテクニックは、ブラウザ依存だったり、比較的大規模にならないと効果が目に見えないテクニックだけれど、とても勉強になった。</p>
<p>スタンフォード大学は、やっぱりすばらしい。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/491206706" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1010/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1010</feedburner:origLink></item>
		<item>
		<title>symfony の init-admin タスクをさらに改良してみた</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/484552569/1006</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/1006#comments</comments>
		<pubDate>Sun, 14 Dec 2008 13:09:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=1006</guid>
		<description><![CDATA[先日、紹介した symfony の init-admin タスクを、さらに改良してみたので、今日はその内容について紹介します。
今回は、しばらく init-admin-plus を使っていて、いくつか不便なことに遭遇した [...]]]></description>
			<content:encoded><![CDATA[<p>先日、紹介した symfony の <a href="http://www.sssg.org/blogs/naoya/archives/869" >init-admin タスク</a>を、さらに改良してみたので、今日はその内容について紹介します。</p>
<p>今回は、しばらく init-admin-plus を使っていて、いくつか不便なことに遭遇したため改良してみた。具体的には、次のとおり。</p>
<ul>
<li>入力値をチェックする validator(ファイルでいうと validator/edit.yml) で、最大文字数のチェックを自分で毎回指定するのがめんどう</li>
<li>同じく validator で、必須のパラメータを指定するのがめんどう</li>
<li>同じく validator で、特定のカラム型に対応する validator を指定するのがめんどう</li>
<li>config/generator.yml で、フィード名をデータベースの構造を見ながら指定するのがめんどう</li>
<li>同じく generator.yml で、各画面ごとに表示する項目を指定する display をデータベースの構造をみながら指定するのがめんどう</li>
</ul>
<p>これらは指定しわすれて不具合につながっていた状況を改善するべく、自動生成して楽をしたいというのが改良のきっけかです。</p>
<p>というわけで、指定されたモデルに対応するテーブル構造を取得するいい方法はないかなと symfony の propel まわりのソースコードを読んでみたところ、config/schema.yml を読むことでいけるということが分かったので、myPakePropelAdminGeneratorPlus に追加してみた。</p>
<p> </p>
<p>やっていることはとても単純なので、<a href="http://coderepos.org/share/browser/lang/php/symfony_tasks/myPakePropelAdminGeneratorPlus.php" onclick="javascript:pageTracker._trackPageview('/outbound/article/coderepos.org');">coderepos にアップしたソースコード</a>をみてもらうことにして、config/generator.yml と validator/edit.yml の雛型を準備する必要がある。</p>
<p>これらの雛型は、sfConfig::get(&#8217;sf_root_dir&#8217;) の  data/generator/sfPropelAdmin/テーマ名/skeleton に格納されているので、これを変更する。</p>
<p>config/generator.yml の雛型は、次のようにします。次のファイルは、list のみですが create, edit も同様に指定します。</p>
<blockquote><p>generator:<br />
class:              sfPropelAdvancedAdminGeneratorPlus<br />
param:<br />
model_class:      ##MODEL_CLASS##<br />
theme:            admin<br />
css:              admin</p>
<p>#<br />
# 共通フィールド名の設定<br />
#<br />
fields:<br />
##GEN_FIELDS##</p>
<p>#<br />
# TITLE一覧<br />
#<br />
list:<br />
  title: &#8220;TITLE一覧&#8221;<br />
  display: ##GEN_DISPLAY##<br />
  fields:<br />
  actions:<br />
    _create: -<br />
  filters:<br />
  max_per_page: 20<br />
  sort: id</p></blockquote>
<p> </p>
<p>具体的には、##GEN_DISPLAY## のところが [カラム名1, カラム名2,...] に置換される。</p>
<p> </p>
<p>次に、validator/edit.yml の雛型は、次のようにします。</p>
<blockquote><p>methods: [post]</p>
<p>fillin:<br />
enabled: on</p>
<p>#<br />
# バリデータ設定<br />
#<br />
fields:<br />
##VALIDATOR##</p></blockquote>
<p> </p>
<p>具体的には、##VALIDATOR## のところがいっきに展開されます。これはカラムによって展開される内容が変わってくるけれど、例えば次のようになる。</p>
<blockquote><p>methods: [post]</p>
<p>fillin:<br />
  enabled: on</p></blockquote>
<blockquote><p>#<br />
# バリデータ設定<br />
#<br />
fields:<br />
  hoge{name}:<br />
    required:<br />
      msg: &#8220;name is required.&#8221;<br />
  sfStringValidator:<br />
    max: 255<br />
    max_error: &#8220;This field is too long.&#8221;<br />
     myDateValidator:<br />
hoge{created_at}:<br />
  myDateValidator:<br />
hoge{updated_at}:<br />
  myDateValidator:</p></blockquote>
<p>この例だと、hoge というテーブルがあって name というカラムは必須で長さが 255 まで、created_at と updated_at は timestamp 型であるのでそのチェックを行うという設定で自動的に生成される。</p>
<p> </p>
<p>これで、かなり symfony で管理画面系を生成するのが楽になって、validation を入れ忘れるというミスもなくなるはず。管理画面系は、けっこう作るのがめんどうなので、できるかぎり自動化を進めていきたいところです。</p>
<p> </p>
<p>なお、symfony 1.0.18 で動作確認済で、sfPropelAdvancedAdminGeneratorPlus というプラグインは、知人から拝借した sfPropelAdvancedAdminGenerator という独自のプラグインを自分好みで変更したプラグインなので、もしかするともしかするとそのうち公開されるかもしれませんので毎日ググりながら楽しみに待つことにしましょう!</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/484552569" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/1006/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/1006</feedburner:origLink></item>
		<item>
		<title>Ganglia のインストール方法</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/483503496/800</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/800#comments</comments>
		<pubDate>Sat, 13 Dec 2008 09:32:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[ganglia]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=800</guid>
		<description><![CDATA[サーバの台数が多くなってくると、Cacti でいちいち監視対象のサーバを追加するのがめんどくさくなってきた。そこで、Ganglia をインストールしてみた。現時点での最新版は、バージョン 3.0.7。
CentOS での [...]]]></description>
			<content:encoded><![CDATA[<p>サーバの台数が多くなってくると、Cacti でいちいち監視対象のサーバを追加するのがめんどくさくなってきた。そこで、<a href="http://www.ganglia.info/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.ganglia.info');">Ganglia</a> をインストールしてみた。現時点での最新版は、バージョン 3.0.7。</p>
<p>CentOS でのインストールは、rpm が Ganglia から配布されているのでダウンロードしてインストールする。Ganglia は、PHP で書かれていて GD を使っている。データベースは使っていない。<br />
Ganglia の構成をざくっとまとめておくと、Ganglia は次の 3 種類のプログラムで構成されている。</p>
<ul>
<li>
<h3 id="tocganglia_readme0">Ganglia Monitoring Daemon (gmond)</h3>
<ul>
<li>クライアント側にインストールするプログラム</li>
<li>監視するクライアントにインストールするホスト、Ganlia は SNMP ではなくマルチキャストで通信する</li>
<li>gmond が /proc 以下から CPU、メモリの状況を XML 形式で出力してくれる</li>
<li>ポートは 8649 を使っているが、設定ファイルで変更することができる</li>
</ul>
</li>
<li>
<h3 id="tocganglia_readme1">Ganglia Meta Daemon (gmetad)</h3>
<ul>
<li>サーバ側にインストールするプログラム</li>
<li>クライアントのデータを収集するデーモン</li>
<li>gmetad が起動していないと、Ganglia の Web UI を表示することができないので注意</li>
</ul>
</li>
<li>
<h3 id="tocganglia_readme2">Ganglia PHP Web Frontend</h3>
<ul>
<li>サーバ側にインストールするプログラム</li>
<li>監視するメイン画面、rrdtool などで可視化して表示する</li>
<li>イメージは、<a href="http://monitor.millennium.berkeley.edu/" onclick="javascript:pageTracker._trackPageview('/outbound/article/monitor.millennium.berkeley.edu');">ライブデモ</a>を見ると分かる</li>
</ul>
</li>
</ul>
<p>何はともあれ、まずはインストールしてみる。</p>
<ul>
<li>SourceForge から、次の 3 種類の rpm をダウンロードする
<ul>
<li>ganglia-gmetad-3.0.7-1.i386.rpm</li>
<li>ganglia-gmond-3.0.7-1.i386.rpm</li>
<li>ganglia-web-3.0.7-1.noarch.rpm</li>
</ul>
</li>
<li>ダウンロードした rpm を、それぞれインストールする、その都度必要なパッケージがあったらインストールする</li>
<li>Ganglia の Web UI が、/var/www/html/ganglia へインストールされるので、Apache などでアクセスできるようにする</li>
</ul>
<p>今回は、Ganglia のサーバとクライアントは同じコンピュータにインストールしている。</p>
<p>次に gmond の設定をしてみる。gmond の設定ファイルは、/etc/gmond.conf を編集する。変更する箇所は、次のとおり。</p>
<blockquote><p>cluster {<br />
name = &#8220;My cluster&#8221;<br />
owner = &#8220;unspecified&#8221;<br />
latlong = &#8220;unspecified&#8221;<br />
url = &#8220;unspecified&#8221;<br />
}</p>
<p>udp_send_channel {<br />
mcast_join = 224.0.0.1<br />
mcast_if = eth0<br />
port = 8649<br />
ttl = 1<br />
}</p></blockquote>
<blockquote><p>udp_recv_channel {<br />
mcast_join = 224.0.0.1<br />
mcast_if = eth0<br />
port = 8649<br />
bind = 224.0.0.1<br />
}</p></blockquote>
<p>マルチキャストの設定をする。CentOS 5.1 では、次の内容で /etc/sysconfig/static-routes を作成して、sudo /etc/init.d/network reload する。</p>
<blockquote><p>any net 224.0.0.0/4 dev eth0</p></blockquote>
<p>マルチキャストの設定が正しいかどうかは、netstat -rn を実行して確認することができる。</p>
<blockquote><p>$ netstat -rn<br />
&#8230;<br />
224.0.0.0       0.0.0.0         240.0.0.0       U         0 0          0 eth0<br />
&#8230;</p></blockquote>
<p>gmond を起動してみる。</p>
<blockquote><p>$ sudo /etc/init.d/gmond start</p></blockquote>
<p>とここで、次のようなエラーがでた。</p>
<blockquote><p>slurpfile() open() error on file /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq: No such file or directory</p></blockquote>
<p>なんか、<a href="http://www.mail-archive.com/ganglia-general@lists.sourceforge.net/msg03472.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.mail-archive.com');">このあたり</a>の問題のようだ。trunk ではすでに修正されているらしいが、上のエラー以外にも変更が加わっているので、次のようなパッチにしてみた。</p>
<blockquote><p>&#8212; ./libmetrics/linux/metrics.c-org    2008-07-17 17:33:40.000000000 +0900<br />
+++ ./libmetrics/linux/metrics.c        2008-07-17 17:49:56.000000000 +0900<br />
@@ -39,6 +39,8 @@<br />
#endif<br />
char proc_cpuinfo[BUFFSIZE];<br />
char proc_sys_kernel_osrelease[BUFFSIZE];<br />
+<br />
+#define SCALING_MAX_FREQ &#8220;/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq<br />
&#8221;<br />
char sys_devices_system_cpu[32];<br />
int cpufreq;</p>
<p>@@ -169,13 +171,20 @@<br />
{<br />
g_val_t rval;<br />
char * dummy;<br />
+   struct stat struct_stat;</p>
<p>num_cpustates = num_cpustates_func();</p>
<p>-   cpufreq = 1;<br />
-   rval.int32 = slurpfile(&#8221;/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_fre<br />
q&#8221;, sys_devices_system_cpu, BUFFSIZE);<br />
-   if ( rval.int32 == SYNAPSE_FAILURE )<br />
-      cpufreq = 0;<br />
+   /* scaling_max_freq will contain the max CPU speed if available */<br />
+   cpufreq = 0;<br />
+   if ( stat(SCALING_MAX_FREQ, &amp;struct_stat) == 0 )<br />
+      {<br />
+         rval.int32 = slurpfile(SCALING_MAX_FREQ, sys_devices_system_cpu, BUFFS<br />
IZE);<br />
+         if ( rval.int32 == SYNAPSE_FAILURE )<br />
+             cpufreq = 0;<br />
+         else<br />
+             cpufreq = 1;<br />
+      }</p></blockquote>
<p>パッチをあてたバージョンをインストールしたいので、SRPM をインストールして SPEC ファイルを書き換えてパッチをあてた RPM を初めて作ってみた。パッチを作るときには、diff コマンドを使うけれど、ソースコードのファイル名の先頭に ./ と書いた方がいい。書かないと、rpmbuild したときにパッチを当てるファイル名を入力が必要になってしまう。</p>
<blockquote><p>$ diff -uNr ./libmetrics/linux/metrics.c.org ./libmetrics/linux/metrics.c &gt; ~/rpm/SOURCES/ganglia_metrics.c.patch</p></blockquote>
<p>これで、gmod はちゃんと起動した。確認するには、telnet localhost 8649 して XML データが返ってくれば問題なし。</p>
<p>次に gmetd の設定をする。gmetd の設定は、/etc/gmetd.conf を編集すればいい。次の行を変更する。</p>
<blockquote><p>data_source &#8220;My hoge&#8221; localhost</p></blockquote>
<p>ローカルホストだけ監視対象に追加する。</p>
<p>gmod を設定したら、gmod を起動する。</p>
<blockquote><p>$ sudo /etc/init.d/gmod start</p></blockquote>
<p>無事起動した。</p>
<p>現在、収集する情報の種類は、次のコマンドで確認することができる。</p>
<blockquote><p>$ /usr/sbin/gmod -m</p></blockquote>
<p>Ganglia の Web UI を見てみると、Ganglai のウェブ管理画面で PHP のエラーが出るので、次の二つのパッチを書いて対策した。</p>
<blockquote><p>&#8212; ./web/get_context.php-org   2008-04-08 15:45:09.000000000 +0900<br />
+++ ./web/get_context.php       2008-04-08 15:46:26.000000000 +0900<br />
@@ -42,9 +42,10 @@<br />
$clustergraphsize = isset($_GET["z"]) &amp;&amp; in_array( $_GET[ 'z' ], $graph_sizes_keys ) ?<br />
escapeshellcmd($_GET["z"]) : NULL;<br />
# A stack of grid parents. Prefer a GET variable, default to cookie.<br />
+$gridstack = &#8220;:&#8221;;<br />
if (isset($_GET["gs"]) and $_GET["gs"])<br />
$gridstack = explode(&#8221;:&#8221;, clean_string( rawurldecode($_GET["gs"] ) ) );<br />
-else<br />
+else if (isset($_COOKIE["gs"]))<br />
$gridstack = explode(&#8221;:&#8221;, clean_string( $_COOKIE["gs"] ) );</p>
<p># Assume we are the first grid visited in the tree if there are no CGI variables,</p></blockquote>
<blockquote><p>&#8212; ./web/header.php-org        2008-04-08 15:46:32.000000000 +0900<br />
+++ ./web/header.php    2008-04-08 15:48:16.000000000 +0900<br />
@@ -53,8 +53,7 @@<br />
{<br />
# Use cookie so we dont have to pass gridstack around within this site.<br />
# Cookie values are automatically urlencoded. Expires in a day.<br />
-      $gscookie = $_COOKIE["gs"];<br />
-      if (! isset($gscookie))<br />
+      if (! isset($_COOKIE["gs"]))<br />
setcookie(&#8221;gs&#8221;, $gridstack_str, time() + 86400);<br />
}</p></blockquote>
<p>さらにロードアベレージのグラフをみると、なぜか縦軸のメモリに m がついていて気になるので、これも修正した。rrdtool のパラメータを調整すればいいので、次のようなパッチを書いた。</p>
<blockquote><p>&#8212; ./web/graph.php-org 2008-07-22 14:21:25.000000000 +0900<br />
+++ ./web/graph.php     2008-07-22 15:06:04.000000000 +0900<br />
@@ -14,6 +14,13 @@<br />
# ATD - TODO, should encapsulate these custom graphs in some type of container,<br />
then this code could check list of defined containers for valid graph labels.<br />
$graph = isset($_GET["g"]) &amp;&amp; in_array( $_GET['g'], array( &#8216;cpu_report&#8217;, &#8216;mem_r<br />
eport&#8217;, &#8216;load_report&#8217;, &#8216;network_report&#8217;, &#8216;packet_report&#8217; ) ) ?<br />
$_GET["g"] : NULL;<br />
+if (isset($_GET["m"])) {<br />
+       $m_value = $_GET["m"];<br />
+       if (substr($m_value, 0, 5) === &#8220;load_&#8221;) {<br />
+               $graph = &#8220;load_report&#8221;;<br />
+       }<br />
+}<br />
+<br />
$grid = isset($_GET["G"]) ?<br />
escapeshellcmd( clean_string( rawurldecode( $_GET["G"] ) ) ) : NULL;<br />
$self = isset($_GET["me"]) ?</p></blockquote>
<p>ようやく、Ganglia にアクセスできる環境が整った。そろそろ、修正版をリリースしてほしい&#8230;。&gt;&lt;</p>
<p>Ganglia を自分でビルドするときは、Web UI の RPM(noarch) も必要なので、64 ビット環境ときは次のコマンドでビルドする。32 ビット環境の場合は、x86_64 を i386 に変更する。</p>
<blockquote><p>$ rpmbuild -ba &#8211;target noarch,x86_64 ~/rpm/SPECS/ganglia.spec</p></blockquote>
<p>Ganglia の SPEC ファイル、パッチ 3 種類、ビルドした 64 ビット用の RPM をおいておくので、よかった使ってください。</p>
<p>あとは、各クライアントへ gmod デーモンを動かすだけで自動的に Ganglia のウェブ管理画面に反映されるようになる。</p>
<p>また、ganglia のウェブ管理画面はテンプレートして切替えられるようになっている。設定は、/var/www/html/ganglia/conf.php の $template_name を変更するだけ。デフォルトのテンプレートの他には Rock というテンプレートが入っている。</p>
<p>テンプレートも、tpl という拡張子の PHP ファイルなので変更も簡単なところはいいところか。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/483503496" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/800/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/800</feedburner:origLink></item>
		<item>
		<title>sshの多段接続がものすごい便利な件</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/479558003/998</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/998#comments</comments>
		<pubDate>Tue, 09 Dec 2008 14:10:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=998</guid>
		<description><![CDATA[普段、開発するときにあるサーバを経由して SSH しながら開発作業をしていたが、どうも効率がかなり悪いと感じていた。
そのときの、ネットワーク構成は次のようになっている。
[macbook]
 &#124;
(インターネット)
&#124; [...]]]></description>
			<content:encoded><![CDATA[<p>普段、開発するときにあるサーバを経由して SSH しながら開発作業をしていたが、どうも効率がかなり悪いと感じていた。</p>
<p>そのときの、ネットワーク構成は次のようになっている。</p>
<blockquote><p>[macbook]</p>
<p> |</p>
<p>(インターネット)</p>
<p>|</p>
<p>(ルータ)</p>
<p>|</p>
<p>[proxy]</p>
<p>|</p>
<p>[s1]</p></blockquote>
<p>s1 は、物理的にインターネット回線にはつながっていない。</p>
<p> </p>
<p>作業マシンの macbook から、s1 にログインして開発をするには、次の手順を踏む必要がある。</p>
<ol>
<li>[macbook] $ ssh proxy</li>
<li>[proxy] $ ssh s1</li>
<li>[s1] $ vi &#8230;</li>
</ol>
<div></div>
<div>s1 はサーバなので使い慣れている emacs が入っていないのと、s1 で出力したログなどのデータをローカルにコピーするときとかプロキシサーバを経由しているため、かなり非効率になっていた。</div>
<div></div>
<div>そこで、何かいい方法がないかなと調べてみたところ、次の情報を見つけた。</div>
<div>
<ul>
<li><a name="1225040498" href="http://d.hatena.ne.jp/tkng/20081026/1225040498" onclick="javascript:pageTracker._trackPageview('/outbound/article/d.hatena.ne.jp');">多段sshfsを簡単に実現する方法</a></li>
<li><a name="1202457379" href="http://d.hatena.ne.jp/dayflower/20080204/1202457379" onclick="javascript:pageTracker._trackPageview('/outbound/article/d.hatena.ne.jp');">多段 ssh / rsync するために ProxyCommand を使ってみる</a></li>
</ul>
<div></div>
<div>.ssh/config に ProxyCommand として書くと、[macbook] から直接 [s1]にSSH経由でログインすることができる方法が紹介されていた。</div>
<div>もちろん、SSH はすべて公開鍵認証なので、[macbook] の $HOME/.ssh/config に次のように追加した。</div>
<div></div>
<blockquote>
<div>
<div>Host s1</div>
<div>  HostName s1.example.com</div>
<div>  User n0ts</div>
<div>  ProxyCommand nohup ssh -l naoya proxy nc %h %p</div>
</div>
</blockquote>
<div>HostName は、proxy から s1 へ接続するときの名前を設定する。この名前は、[macbook] から名前解決ができなくても問題ない。User を指定しているのは、proxy と s1 でログインするユーザが違うため。User の方に指定したユーザ名は s1.example.com にログインするときのユーザ名になる。最後に ProxyCommand には proxy へ接続するときのユーザを指定する。</div>
</div>
<div></div>
<div></div>
<div>あとは、次のように SSH するだけで、直接 s1 へログインすることができる。</div>
<blockquote>
<div>[macbook] $ ssh s1</div>
</blockquote>
<div></div>
<div></div>
<div>もちろん、sshfs でも使うことができる。</div>
<div></div>
<div>これで、毎回 proxy にログインしなくてもよくなって、かなり快適になった。</div>
<div></div>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/479558003" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/998/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/998</feedburner:origLink></item>
		<item>
		<title>The Art of Capacity Plaining</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/477214558/996</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/996#comments</comments>
		<pubDate>Sun, 07 Dec 2008 04:53:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[flickr server]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=996</guid>
		<description><![CDATA[昨日、パソナテック10周年記念　PTカンファレンスVol.6 インフラエンジニア討論会2008 ～インフラエンジニア進化論～に行ってきた。自称インフラエンジニアとしては、なかなか刺激のあるイベントであったが、その中で m [...]]]></description>
			<content:encoded><![CDATA[<p>昨日、<a href="http://www.pasonatech.co.jp/event/index.jsp?no=1137" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.pasonatech.co.jp');" target="_blank">パソナテック10周年記念　PTカンファレンスVol.6 インフラエンジニア討論会2008 ～インフラエンジニア進化論～</a>に行ってきた。自称インフラエンジニアとしては、なかなか刺激のあるイベントであったが、その中で <a href="http://mizzy.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/mizzy.org');">mizzy</a> さんが「<a href="http://press.oreilly.com/pub/pr/2104" onclick="javascript:pageTracker._trackPageview('/outbound/article/press.oreilly.com');">The Art of Capacity Plaining</a>」という本を最近読んでいると聞いたので、調べてみた。</p>
<p>この本は、Book review などの情報源がたくさんあって、Flickr のオペレーションエンジニアの John Allspaw 氏が書いたいわゆるサーバの増強計画をどのように行うかについて書かれた本であるとのこと。</p>
<p>最近、仕事でも急にサーバを増やすように言われて四苦八苦している僕にとっては、かなりタイムリーな本だ。O&#8217;Reilly で紹介されている記事から含まれているトピックスを訳すと、次のような内容が含まれている。</p>
<ul>
<li>計測、デプロイツールを評価する方法</li>
<li>ストレージ、データベース、アプリケーションサーバへのキャパシティ解析とその予測</li>
<li>簡単に（サーバを）追加できるアーキテクチャーのデザイン方法、キャパシティの計測方法</li>
<li>突発的なアクセスへの対処方法</li>
<li>急上昇と爆発的な成長の予測</li>
<li>EC2 のようなクラウドサービスは、どのような内部的なキャパシティストレージに合うか（ちょっと意味不明）</li>
</ul>
<p>どのような紹介が <a href="http://highscalability.com/how-succeed-capacity-planning-without-really-trying-interview-flickrs-john-allspaw-his-new-book" onclick="javascript:pageTracker._trackPageview('/outbound/article/highscalability.com');">highscalability.com</a> にも紹介されていた。highscalability.com は、ずっと購読していたが RSS の URL が変わったようでまったく更新をチェックしていなかった。。。インフラまわりをやっている人は、highscalability.com をチェックすることは必須であると思う。このサイトは、大規模なサイトがどのような技術を使っているかの情報源をまとめた貴重なサイトです。</p>
<p>John Allspan 氏は、1999 年からニュースマガジンや SNS のサイトを担当してきた経歴の持ち主らしいので、かなり勉強になりそう。John Allspan 氏のブログは、<a href="http://www.kitchensoap.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.kitchensoap.com');">Kichen Soap </a>として公開されている。同氏は、昨年の MySQL コンファレンス 2007 や Web 2.0 Expo や Velocity でも講演していた。これらのスライドは、すでに公開されていて、チェックするのを忘れていたので、メモしておく。</p>
<p>まずは、MySQL Conf 2007 の「<a href="http://www.techpresentations.org/Capacity_planning_for_LAMP" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.techpresentations.org');">Capacity planning for LAMP</a>」から。スライドは、<a href="http://conferences.oreillynet.com/presentations/mysql07/allspaw_mysql.ppt" onclick="javascript:pageTracker._trackPageview('/outbound/article/conferences.oreillynet.com');">PPT</a> あるいは <a href="http://www.kitchensoap.com/talks/MySQLConf2007-Capacity.pdf" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.kitchensoap.com');">PDF</a> で公開されている。PDF の方は、スライドの他にもメモが書いてあるので、PDF の方をチェックするといいと思います。</p>
<ul>
<li>自分のサービスには、どのくらいのデータベースサーバ、ウェブサーバサーバ、共通ストレージ、スイッチなどが必要かついて問い正している</li>
<li>Flickr の数字が公開されていて、squid キャッシュに合計 35M（この M はミニオンという意味かな&#8230;）とすると 3,500 万枚くらいの写真があって、squid のメモリに 2M くらいの写真があって、470M くらいの写真がそれぞれ 4 〜 5 くらいのサイズあって、38k req/sec くらいの memcached にアクセスがあって 12M くらいのオブジェクトをもっている、2PB(!) の物理的なストレージがある</li>
<li>このプレゼンでは、MySQL、squid、memcached について焦点をあてて話すとのこと</li>
<li>サーバのキャパシティを考えるにあたって、計画（何を？なぜ？いつ？）、デプロイ（インストール、設定、管理）、計測（グラフ化）の3つの主パートについて考えてみる</li>
<li>MySQL は disk I/O、squid は disk I/O あるいは CPU、memcached は CPU あるいはネットワークの上限をを把握することが重要</li>
<li>Flickr では、<a href="http://ganglia.info/" onclick="javascript:pageTracker._trackPageview('/outbound/article/ganglia.info');">Ganglia</a> を使っている、貴重なスクリーンショットが公開されている</li>
<li>Ganglia で、iostat で計測した結果をグラフにするためのシェルスクリプトが公開されている</li>
<li>memcached の Gets/sec もグラフにしている、スライドで紹介されていた addon のページ http://<em>wtf</em>.<em>ath</em>.<em>cx</em>/ はデッドリンクだったが、別のものが<a href="http://www.hitflip.de/opensource.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.hitflip.de');">あった</a></li>
<li><a href="http://www.arizona-software.ch/graphclick/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.arizona-software.ch');">GraphClick</a> という 8 ドルの MRTG グラフを解析するためも OSX 用のシェアウェアが便利</li>
<li>Flickr の MySQL サーバで使っている、<a href="http://www1.jp.dell.com/content/products/productdetails.aspx/pedge_2950_3?c=jp&amp;cs=jppad1&amp;l=ja&amp;s=pad" onclick="javascript:pageTracker._trackPageview('/outbound/article/www1.jp.dell.com');">DELL Power Edge 2950</a>に 6 個のディスク 15K RPM の SCSI、RAID10、16GB RAM、クアッドコアCPU、というスペックの MySQL のクエリーグラフが公開されている、グラフをみると秒間 1.3K くらいの SELECT クエリーを捌けているが、CPU は 2% までいかないとのこと</li>
<li>次に MySQL Disk IO のグラフが公開されている、グラフをみると iowait が 10% くらいになっているが日々変わるのでよく監視している</li>
<li>Squid へのリクエストとヒット数やヒット率、LPU の reference age、レスポンスタイムを ganglia のグラフにしている、80% くらい squid キャッシュにヒットしていて、レスポンスタイムは 50ms 以内くらい</li>
<li>OSS のデプロイツールとして、<a href="http://wiki.systemimager.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/wiki.systemimager.org');">SystemImager/SystemConfigurator</a>、<a href=" http://www.cvsup.org" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.cvsup.org');">CVSup</a>、<a href="http://code.google.com/p/subcon/" onclick="javascript:pageTracker._trackPageview('/outbound/article/code.google.com');">Subcon</a>が紹介されている</li>
</ul>
<p>かなり勉強になった、昨日でも mixi や楽天はなんでもグラフ化していると言っていたが、Flickr でも ganglia でさまざまなものをグラフ化している、僕も ganglia を使っているけれど MySQL とか memcached などのカスタムグラフは追加していないでやらないとけないと思った。レスポンスタイムもかなり重要なので、僕が管理しているサービスのレスポンスタイムもグラフに出してみたいと思った。Subcon は便利そうだと思ったがまだ開発中っぽい。</p>
<p>次に web 2.0 expo での「<a href="http://en.oreilly.com/webexsf2008/public/schedule/detail/1024" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.oreilly.com');">Capacity Planning for Web Operations</a>」の資料に目を通してみた。<a href="http://www.slideshare.net/jallspaw" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.slideshare.net');">Slideshare</a> でも同じ内容が公開されていた。</p>
<ul>
<li>あるクリスマスの Yahoo! トップページの爆発的なトラフィックのグラフが紹介されていた</li>
<li>同氏の来年何台のサーバが必要かについてファイナンス部と相談した</li>
<li>どのくらいサーバ必要か判断するには、計測することが重要</li>
<li>前と同様に ganglia での Flickr でメール経由で1分あたりどのくらいの写真がアップロードされているかを示すグラフが公開されていた、グラフをみると1分あたりメールで40から50くらい写真がアップロードされていた！</li>
<li>写真がアップロードされてからの写真の処理枚数や処理時間（おそらくリサイズの処理だと思われる）のグラフが公開されていた</li>
<li>ベンチマークをとって、上限を見つけることが重要、そのときにはできるだけ本番のデータを使うこと</li>
<li>サーバごとにどの部分が重要か示されている、ロードバランサーは前後のネットワーク、ウェブサーバは CPU とメモリとディスク使用量と disk I/O</li>
<li>ベンチマークツールとして、<a href="http://www.joedog.org/JoeDog/Siege " onclick="javascript:pageTracker._trackPageview('/outbound/article/www.joedog.org');">Siege</a>、<a href=" http://www.hpl.hp.com/research/linux/httperf/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.hpl.hp.com');">httperf</a>/<a href="http://www.xenoclast.org/autobench" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.xenoclast.org');">autobench</a>、<a href=" http://sysbench.sf.net" onclick="javascript:pageTracker._trackPageview('/outbound/article/sysbench.sf.net');">sysbench</a>が紹介されている</li>
<li>67台の CPU のコア数 2 のウェブサーバを 18台の 8 コアに交換したときのロードアベレージのグラフが公開されている、グラフをみるとロードアベレージが半分くらいまで下がっている！さらにさまざまな数字の比較も公開されていて、消費電力が 70% 削減されて、49U のラックスペースが開いたのこと！でかつ負荷も半分になったと！！！</li>
<li>最後に Flickr の数字が紹介されちえる、ピーク時で 1 秒あたり 32,000 枚の写真が保存されている！、1日あたり 6-8TB のディスクを使用する！、Yahoo! Photos から統合に 1 日あたり 34TB くらいのディスクを使っている、1日あたり 3M のアップロードがあって、ピーク時に 1 秒あたり 60 枚の写真のアップロードがある！</li>
</ul>
<p>ここで紹介されたベンチマークが使ったことがないので試してみる。httperf や sysbench が便利そう。コア数の多い CPU にリプレイスする意味は充分になることが分かった。僕の管理しているサーバの CPU は、全部 4 コアなので、すでに稼働している 2 コアのサーバは半分の台数で 8 コアのサーバとして充分に置き換え可能なことが分かった。</p>
<p>最後に Velocity での「<a href="http://en.oreilly.com/velocity2008/public/schedule/detail/3208" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.oreilly.com');">Capacity Management</a>」の資料に目を通してみた。正確なタイトルは、Capacity Management for Web Operations。</p>
<ul>
<li>キャパシティとパフォーマンスは、別の意味</li>
<li>ベンチマークをとて限界を見つけることの重要性を強調している</li>
<li>MySQL のレプリケーション遅延のグラフ(mysql_slave_secs)を公開して、あるとき 50 秒くらいのレプリケーション遅延が行ったことで、データベースの上限を見つける例として紹介している、さらにそのときの disk iowait(diskio_iowait)のグラフを示して disk I/O wait が 40% くらいになるとレプリケーション遅延が発生しているとのこと</li>
<li>ウェブサーバの CPU グラフを紹介て、85% くらいまでを安全な上限としてみるのがいいとのこと</li>
<li>キャパシティ状態の数字が公開されいて、12,628 の nagios による死活監視、1314 台のホスト、6 つのデータセンター、4 つの farms（おそらく、flickr の写真の URL にある farmX.flickr.com の数）、farm は東西に二つのデータセンターがある</li>
<li>Squid のリクエストで下限あるいは上限でアラートを設定している</li>
<li>写真の変換処理を行っていた <a href="http://www.google.co.jp/url?sa=t&amp;source=web&amp;ct=res&amp;cd=2&amp;url=http%3A%2F%2Fwww1.jp.dell.com%2Fcontent%2Fproducts%2Fproductdetails.aspx%2Fpedge_860%3Fc%3Djp%26l%3Dja%26s%3Dpremier&amp;ei=m1Q7Sbm6H4bZkAXM47yxBQ&amp;usg=AFQjCNH8y_qglUhOD6PzlHSMXGbRMJiVIg&amp;sig2=0Kbq4lgOUSjAukWHeZa-4g" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.co.jp');">DELL PowerEdge 860s</a> を <a href="http://h10010.www1.hp.com/wwpc/jp/ja/sm/WF05a/15351-15351-3328412-3328421-3328421-1842838.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/h10010.www1.hp.com');">HP DL140 G3s </a>に置き換えた（CPU のコア数は 4 から 8 にした）が、CPU の使用率は変わらなかったが1分あたり処理できる写真の数の上限が 45 から 140 にくらいなったというピーク時のグラフが紹介されている！</li>
<li>そのときの数字として、サーバの台数が 23 台から 8 台、消費電力が三分の一、75% くらい高速化した、23U から 8U のラックでよくなった</li>
<li><a href="http://freshmeat.net/projects/dsh" onclick="javascript:pageTracker._trackPageview('/outbound/article/freshmeat.net');">dsh</a>という複数台のサーバに同時にコマンドを実行するツールが紹介されている</li>
</ul>
<p>これもかなりためになった。写真の加工などいわゆる CPU を使うサーバはコア数を倍にすると、なんと三分の一で済んでしまうことが分かった。CPU の使用率はそのまだけれど、パフォーマンスが向上することも分かった。</p>
<p>あと、さまざまなグラフを一つのツールで統合して、そのグラフからシステムのパフォーマンスの上限を見極める重要さを実感できた。</p>
<p>ということで、かなりためになるので、思い切って本を購入してみた。初めての技術洋書になるけれども、ゆっくりでもいいから頑張って読んでみようと思う。</p>
<p><a title="Click and drag this image to the post editor" href="http://www.amazon.co.jp/Art-Capacity-Planning-John-Allspaw/dp/0596518579%3FSubscriptionId%3D1N9AHEAQ2F6SVD97BE02%26tag%3Ddu00-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0596518579" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.amazon.co.jp');"><img src="http://ecx.images-amazon.com/images/I/51-P10kt7ZL._SL500_.jpg" alt="" width="381" /></a></p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/477214558" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/996/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/996</feedburner:origLink></item>
		<item>
		<title>Passenger on OSX</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/471207011/994</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/994#comments</comments>
		<pubDate>Mon, 01 Dec 2008 11:04:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[ruby gem passenger]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=994</guid>
		<description><![CDATA[OSX上で、Mac Ports でインストールした Apache で Passenger を使いたいと思ったので、その方法を解説します。
Mac Ports で Apache をインストールすると、/opt/local/ [...]]]></description>
			<content:encoded><![CDATA[<p>OSX上で、Mac Ports でインストールした Apache で <a href="http://www.modrails.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.modrails.com');">Passenger</a> を使いたいと思ったので、その方法を解説します。</p>
<p>Mac Ports で Apache をインストールすると、/opt/local/apache2 以下にすべてインストールされます。Passenger の Apache Module をビルドするコマンドである passenger-install-apache2-module は、環境変数 APXS2 と PATH をみるようなので、事前に export するだけで問題なし。</p>
<blockquote><p>$ export APXS2=/opt/local/apache2/bin/apxs</p>
<p>$ export PATH=/opt/local/apache2/bin:$PATH</p>
<p>$ sudo /opt/ruby-enterprise-1.8.6-20080810/bin/passenger-install-apache2-module</p></blockquote>
<p>あとは、次のような感じでいつもどおり LoadModule などを設定するだけ。</p>
<blockquote><p>LoadModule passenger_module /opt/ruby-enterprise-1.8.6-0080810/lib/ruby/gems/1.</p>
<p>8/gems/passenger-2.0.3/ext/apache2/mod_passenger.so</p>
<p>PassengerRoot /opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3</p>
<p>PassengerRuby /opt/ruby-enterprise-1.8.6-20080810/bin/ruby</p></blockquote>
<p>ちなみに、ruby-enterprise 1.8.6-20080810 のバージョンは同梱されている rubygems が 1.2.0 なので、gem list &#8211;installed コマンドに<a href="http://rubyforge.org/forum/forum.php?forum_id=27728" onclick="javascript:pageTracker._trackPageview('/outbound/article/rubyforge.org');">不具合</a>があります。</p>
<p>ruby-enterprise に同梱されている rubygems を差し替えるには、次のように rubygems ディレクトリを差し替えるだけです。</p>
<blockquote><p>$ wget http://rubyforge.org/frs/download.php/41040/ruby-enterprise-1.8.6-20080810.tar.gz</p>
<p>$ tar zxf ruby-enterprise-1.8.6-20080810.tar.gz</p>
<p>$ cd ruby-enterprise-1.8.6-20080810 </p>
<p>$ rm -fr rubygems</p>
<p>$ wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz</p>
<p>$ tar zxf rubygems-1.3.1</p>
<p>$ mv rubygems-1.3.1 rubygems</p>
<p>$ sudo ./installer</p></blockquote>
<p> </p>
<p>ついでに、gem の mysql バインディングも普通にはインストールできないので、mysql_config を指定する必要がある。</p>
<blockquote><p>$ sudo /opt/ruby-enterprise-1.8.6-20080810/bin/gem install mysql &#8212; &#8211;with-mysql-config=/opt/local/bin/mysql_config5</p></blockquote>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/471207011" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/994/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/994</feedburner:origLink></item>
		<item>
		<title>svk を導入してみた</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/461631842/992</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/992#comments</comments>
		<pubDate>Sat, 22 Nov 2008 06:17:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[svk]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=992</guid>
		<description><![CDATA[最近、subversion で管理されているプロジェクトを、オフラインで開発していていたり、チームのコードを自分なりに変更して元に戻したりすることが多くなってきたので svk を導入してみた。
環境は、OSX 10.5。 [...]]]></description>
			<content:encoded><![CDATA[<p>最近、subversion で管理されているプロジェクトを、オフラインで開発していていたり、チームのコードを自分なりに変更して元に戻したりすることが多くなってきたので svk を導入してみた。</p>
<p>環境は、OSX 10.5。</p>
<p>まず、svk を mac ports 経由でインストールする.</p>
<ol>
<li>$ sudo port -d sync</li>
<li>$ sudo port install svk</li>
</ol>
<div>次のようなエラーがでたので、perl 5.8 を deactivate してみる。</div>
<div></div>
<blockquote>
<div>Error: Target org.macports.activate returned: Image error: /opt/local/lib/perl5/5.8.8/Getopt/Long.pm is being used by the active perl5.8 port.  Please deactivate this port first, or use the -f flag to force the activation.</div>
<div></div>
<div>$  sudo port deactivate perl5.8</div>
</blockquote>
<div>
<div>deactivate してみると、今後は perl がないとうエラーになってしまうので、-f オプションで強制にインストールしてみた。</div>
<div></div>
<blockquote>
<div>$ sudo port -f install svk</div>
<div></div>
</blockquote>
<div>インストールにはけっこう時間がかかるが、インストールは正常に終了したっぽい。-v オプションで確認してみる。OSX には、デフォルトで一つ前のバージョンの svk が /usr/bin に入っているので要注意。</div>
<div></div>
<blockquote>
<div>$ svk -v</div>
<div>This is svk, version v2.0.2 (using Subversion bindings 1.5.4)</div>
</blockquote>
<div>動いている様子。subversion は、1.4.4 の binding を使っているっぽいけれど、同じバージョンの subversion で管理されているので問題なし。</div>
</div>
<div></div>
<div>まず、svk 用のリポジトリを作成する。</div>
<div></div>
<blockquote>
<div>$ svk depotmap &#8211;init</div>
<div>Repository /$HOME/.svk/local does not exist, create? (y/n) y</div>
</blockquote>
<div>svk の使い方については、help で確認する。</div>
<blockquote>
<div>$ svn help</div>
</blockquote>
<div>さっそく、対象の subversion のリポジトリを svk でミラーする。</div>
<blockquote>
<div>$ svk mirror svn+ssh://example.com/myproject/trunk //mirror/myproject</div>
<div>Mirror initialized.  Run svk sync //mirror/myproject to start mirroring.</div>
<div>$ svk sync //mirror/myproject</div>
<div>Committed revision 1 from revision 1.</div>
<div>&#8230;</div>
</blockquote>
<div>svk でミラーを開始すると、リポジトリからローカルの //mirror へ順番にコミットが行われる。</div>
<div></div>
<div>ミラーが終了したら、ミラーの状態をみてみる。</div>
<blockquote>
<div>$ svk mirror &#8211;list</div>
<div>
<div>Path           Source</div>
<div>========================================================================</div>
<div>//mirror/myproject   svn+ssh://example.com/myproject/trunk</div>
</div>
</blockquote>
<div>ミラーは、定期的にリモートサーバ上のリポジトリと同期する必要がある。同期するには、sync を使う。</div>
<blockquote>
<div>$ svk sync //mirror/myproject</div>
</blockquote>
<div>複数のミラーがあって、まとめて同期したいときには、&#8211;all オプションを使えばいい。</div>
<blockquote>
<div>$ svk sync &#8211;all</div>
</blockquote>
<div></div>
<div>さて、さっそく編集作業を開始するために、ミラーからコピーする。ミラーからチェックアウトすると直接リモートのリポジトリにコミットされてしまうらしい。</div>
<blockquote>
<div>$ svk mkdir //work</div>
<div>
<div>Waiting for editor&#8230;</div>
<div>Waiting for Emacs&#8230;</div>
</div>
<div>$ svk copy //mirror/myproject //work/myproject</div>
<div>Waiting for editor&#8230;</div>
<div>Waiting for Emacs&#8230;</div>
<div>Committed revision X.</div>
<div>$ svk checkout //work/myproject $HOME/myproject</div>
<div>&#8230;</div>
</blockquote>
<div>コピーから checkout できた。info コマンドを使うと、その作業コピーの情報をみることができる。</div>
<blockquote>
<div>$ cd $HOME/myproject</div>
<div>$ svk info</div>
<div>
<div>Checkout Path: $HOME/myproject</div>
<div>Depot Path: //work/myproject</div>
<div>Revision: X</div>
<div>Last Changed Rev.: X</div>
<div>Copied From: /mirror/myproject, Rev. X</div>
<div>Merged From: /mirror/myproject, Rev. X</div>
</div>
</blockquote>
<div>あとは、変更したら svk commit で、ローカルにコミットすることができる。add なども、subversion と同じ間隔で使うことができる。</div>
<div></div>
<div>そして、オンラインになったとき、リポジトリにローカルの変更を追加したい場合は smerge を使う。</div>
<blockquote>
<div>$ svk smerge -C //mirror/myproject //work/myproject</div>
<div>$ svk smerge -l //mirror/myproject //work/myproject</div>
</blockquote>
<div>-C はコンフリクトがないかどうか判定するオプション、-l はローカルへコミットしたログを自動的にリモートのリポジトリへのコミットログをして入れてくれるオプションという意味。</div>
<div></div>
<div>今までなんで使わなかったのだろうかと思うくらい便利です。</div>
<blockquote>
<div></div>
<div></div>
</blockquote>
<div></div>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/461631842" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/992/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/992</feedburner:origLink></item>
		<item>
		<title>Apache HTTPD Server 2.2.10</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/456128979/976</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/976#comments</comments>
		<pubDate>Mon, 17 Nov 2008 16:10:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=976</guid>
		<description><![CDATA[先日、Apache HTTPD Server 2.2.10 がリリースされたわけですが、ChangeLog を眺めていたら、いくつか気になる変更点がありました。
それは、

mod_proxy_balancer: Add [...]]]></description>
			<content:encoded><![CDATA[<p>先日、<a href="http://www.apache.org/dist/httpd/CHANGES_2.2.10" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.apache.org');">Apache HTTPD Server 2.2.10 がリリース</a>されたわけですが、ChangeLog を眺めていたら、いくつか気になる変更点がありました。</p>
<p>それは、</p>
<ul>
<li>mod_proxy_balancer: Add &#8216;bybusyness&#8217; load balance method. [Joel Gluth , Jim Jagielski]</li>
<li>mod_proxy: Add connectiontimeout parameter for proxy workers in order to be able to set the timeout for connecting to the backend separately.PR 45445. [Ruediger Pluem, rahul ]</li>
</ul>
<p>の二つです。</p>
<p>まず、最初の mod_proxy_balancer に「bybusyness」というロードバランサの振り分けメソッドが追加されたという内容です。mod_proxy_balancer といえば、Apache HTTPD Server でかかせない L7 ロードバランサのモジュールです。mod_proxy_balancer の<a href="http://httpd.apache.org/docs/trunk/mod/mod_proxy.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/httpd.apache.org');">該当ドキュメント</a>をみると、ProxyPass ディレクティブに次のように振り分けメソッドを定義できます。</p>
<blockquote><p>ProxyPass / balancer://hotcluster/lbmethod=bybusyness</p></blockquote>
<p>lbmethod のデフォルト値は、byrequests となっていて、byrequests とはバックエンドのウェブサーバにリクエスト回数で重み付けする振り分け方法が選択されます。その他の選択肢には、bytraffic があります。bytraffic は、転送量で重み付けする振り分け方法です。そこに、2.2.10 から bybusyness という選択肢が追加されました。bybusyness は、ドキュメント原文では「perform          pending request balancing」となっているので処理待ちのリクエスト数で重み付けする方法のようです。</p>
<p>ProxyPass を使っている場合は上の設定でいいですが、mod_rewrite を使っている場合は Proxy ディレクティブの中で設定することができます。</p>
<blockquote><p>&lt;Proxy balancer://neoad&gt;<br />
balancermember http://web1.example.com loadfactor=10 keepalive=off retry=2<br />
balancermember http://web2.example.com loadfactor=10 keepalive=off retry=2<br />
ProxySet lbmethod=bybusyness<br />
&lt;/Proxy&gt;</p></blockquote>
<p>設定したら、ちゃんと lbmethod が確認されるが知るために、次のような感じで balancer-manager を設定します。</p>
<blockquote><p>ProxyPass /balancer-manager !<br />
&lt;Location /balancer-manager&gt;<br />
SetHandler balancer-manager<br />
Order Deny,Allow<br />
Deny from all<br />
Allow from 127.0.0.1<br />
&lt;/Location&gt;</p></blockquote>
<p>Allow from は、自分がアクセスする接続元の IP アドレスを書くか、認証をかけるようにしてください。</p>
<p>設定したら、Apache HTTPD Server を再起動して、/balancer-manager にアクセスします。アクセスしたページに次のようななっていれば設定はできています。</p>
<p>LoadBalancer Status for balancer://example<br />
StickySession	Timeout	FailoverAttempts	Method<br />
-                   	0           	1                        	bybusyness</p>
<p>さっそく、bybusyness の動作確認をみてみる。</p>
<p>接続したバックエンドのサーバが分かるように s1、s2 と出力するようにしておいて、curl を 10 回連続で実行させてみる。</p>
<p>bybusyness の前に、byrequest で確認する。</p>
<p>通常稼働時</p>
<blockquote><p>s1<br />
s2<br />
s1<br />
s2<br />
s1<br />
s2<br />
s1<br />
s2<br />
s1<br />
s2</p></blockquote>
<p>順番にラウンドロビンされている。</p>
<p>意図的に s1 をダウンさせたとき。</p>
<blockquote><p>s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2</p></blockquote>
<p>あたりまえだが、s2 のみ。s1 を復帰させて retry 時間がたったあと。</p>
<blockquote><p>s2<br />
s1<br />
s2<br />
s1<br />
s2<br />
s1<br />
s2<br />
s1<br />
s2<br />
s1</p></blockquote>
<p>ちゃんと s1 が復帰した。</p>
<p>次に bybusyness で同じように試してみる。</p>
<blockquote><p>s1<br />
s2<br />
s1<br />
s2<br />
s1<br />
s2<br />
s1<br />
s2<br />
s1<br />
s2</p></blockquote>
<p>次に s1 をダウンさせる。</p>
<blockquote><p>s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2</p></blockquote>
<p>次に s1 を復帰させて、retry 時間待つ。</p>
<blockquote><p>s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2<br />
s2</p></blockquote>
<p>あれ？おかしい、s1 が復帰しない。しばらく待ってみたが、プロキシを再起動しない限り、s1 は復帰しなかった。balancer-manager をみてみても Status が OK のままになっているにもかかわらず、s1 にはまったく振られない。</p>
<p>理由を知りたいと思ったので、ソースコードをみてみた。modules/proxy/mod_proxy_balancer.c の 1100 行目に find_best_bybusyness という static 関数がある。おそらく、この関数で行っている処理だと思うので念入りに観てみた。とても短く、シンプルな関数だが、Apache のソースコードをみるのは初めてなのでよく分からないが、関数の最後にデバッグログを出力していること、バックエンドのサーバが選ばれるところは、次のようになっていた。</p>
<blockquote><p>if (!mycandidate<br />
|| worker-&gt;s-&gt;busy &lt; mycandidate-&gt;s-&gt;busy<br />
|| (worker-&gt;s-&gt;busy == mycandidate-&gt;s-&gt;busy &amp;&amp; worker-&gt;s-&gt;lbstatus &gt; mycandidate-&gt;s-&gt;lbstatus))<br />
mycandidate = worker;</p></blockquote>
<p>この busy と lbstatus の内容はデバッグログで出力されているので、デバッグログを出力するようにしてみた。デバッグログは、LogLevel debug を追加する。LogLevel は、ErrorLog ディレクティブの前に設定したほうがよい。</p>
<p>通常稼働時のログでは、次のように出力されている。</p>
<blockquote><p>[Tue Nov 18 01:42:33 2008] [debug] mod_proxy_balancer.c(1173): proxy: bybusyness selected worker &#8220;http://s1/&#8221; : busy 0 : lbstatus 0</p>
<p>[Tue Nov 18 01:43:03 2008] [debug] mod_proxy_balancer.c(1173): proxy: bybusyness selected worker &#8220;http://s2/&#8221; : busy 0 : lbstatus 10</p></blockquote>
<p>busy がどちらとも 0 なのでラウンドロビンされている。</p>
<p>s1 を落として、デバッグログをみてみる。</p>
<blockquote><p>[Tue Nov 18 01:44:20 2008] [debug] mod_proxy_balancer.c(1173): proxy: bybusyness selected worker &#8220;http://s2/&#8221; : busy 0 : lbstatus 10</p></blockquote>
<p>s1 を復帰させてみる。</p>
<blockquote><p>[Tue Nov 18 01:46:00 2008] [debug] mod_proxy_balancer.c(1173): proxy: bybusyness selected worker &#8220;http://s2/&#8221; : busy 0 : lbstatus 0</p></blockquote>
<p>s1 を復帰させて、接続したとき s1 が復帰したデバッグログは出力されるが、lbstatus がマイナスになっていた。</p>
<blockquote><p>[Tue Nov 18 01:51:05 2008] [debug] mod_proxy_balancer.c(1173): proxy: bybusyness selected worker &#8220;http://s2/&#8221; : busy 0 : lbstatus -30</p></blockquote>
<p>そのあと、s1 のオフオンを繰り返すたびに s2 の lbsatus が -10 ずつ減っていって、s1 を復帰させた直後の接続しても s1 が復帰したというデバッグログが出力されない。</p>
<p>byrequests で試してみると、s1 が復帰した直後の接続すると、次のようなログが出力される。s1 の lbstatus は 0、s2 の lbstatus は 10 になっている。</p>
<blockquote><p>[Tue Nov 18 01:56:51 2008] [debug] mod_proxy_balancer.c(1008): proxy: byrequests selected worker &#8220;http://s1/&#8221; : busy 0 : lbstatus 0<br />
[Tue Nov 18 01:56:51 2008] [debug] mod_proxy_balancer.c(543): proxy: BALANCER (balancer://test) worker (http://s1/) rewritten to http://x1/<br />
[Tue Nov 18 01:56:51 2008] [debug] mod_proxy.c(988): Running scheme balancer handler (attempt 0)<br />
[Tue Nov 18 01:56:51 2008] [debug] mod_proxy_http.c(1924): proxy: HTTP: serving URL http://s1/</p></blockquote>
<p>busy という変数の意味を調べ観ると、どうやらリクエストを振り分ける前に ++ されて、リクエストが終わったあとに &#8212; されるという単純な整数値のようです。lbstatus という変数は、Balancermember ディレクティブの値がそのまま使われているようです。</p>
<p>とここまで調べて、Apache のバグとして上がっているかなと思って調べてみたが、すでに<a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=46215" onclick="javascript:pageTracker._trackPageview('/outbound/article/issues.apache.org');">あがっていた</a>。</p>
<p>というわけで、bybusyness を使うとバックエンドのサーバが復帰しないという問題があるので使うのはやめておくことにしました。修正されるまでは、byrequests でいこうと思います。</p>
<p>mod_proxy_balancer のソースコードをすこし読んで、keepalived のように一定時間おきにチェックするのではなくて、HTTP リクエストがあったときに調べてどのサーバにリクエストを振り分けているということが分かりました。</p>
<p>振り分けを決めている find_best_XXX 関数は自分でも独自のルールで定義できそうです。</p>
<p>次に気になった connectiontimeout というのは、mod_proxy の <a href="http://httpd.apache.org/docs/2.2/mod/mod_proxy.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/httpd.apache.org');">ProxyPass 変数で定義できる値</a>です。原文を要約すると、バックエンドのサーバに接続するまでのタイムアウト時間を秒単位で指定する設定です。すでに、timeout や retry という設定があって同じような意味で困惑しますが、timeout はバックエンドのサーバに / リクエストを送ったときのタイムアウト時間、retry はバックエンドのサーバが復帰させるときのリトライ時間です。</p>
<p>ということで、次のように設定することにしました。</p>
<blockquote><p>&lt;Proxy balancer://test&gt;<br />
balancermember http://s1/ loadfactor=10 retry=7 connectiontimeout=2<br />
balancermember http://s2/ loadfactor=10 retry=7 connectiontimeout=2<br />
&lt;/Proxy&gt;</p></blockquote>
<p>サーバの設定は、一度稼働したらメンテナンスを計画しない限りずっとそのままなので、最初に気合いを入れてしっかりと設定したいものです。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/456128979" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/976/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/976</feedburner:origLink></item>
		<item>
		<title>アメリカの真実</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/454872476/974</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/974#comments</comments>
		<pubDate>Sun, 16 Nov 2008 12:39:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[book]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=974</guid>
		<description><![CDATA[久しぶりに、とても興味深く考えさせられる本を読んだ。「超・格差社会アメリカの真実」この本は、スタンフォード大学に留学したのが初めての海外という小林由美氏によって書かれたアメリカ社会の構図について詳しい考察がされている本。 [...]]]></description>
			<content:encoded><![CDATA[<p>久しぶりに、とても興味深く考えさせられる本を読んだ。「超・格差社会アメリカの真実」この本は、スタンフォード大学に留学したのが初めての海外という小林由美氏によって書かれたアメリカ社会の構図について詳しい考察がされている本。</p>
<p>最初の方は、富の格差について具体的な数字を上げながら紹介されていて、後半は教育環境からアメリカ人の考え方や筆者の体験談などが紹介されていた。</p>
<p>アメリカという社会に興味のある人は、必読の一冊だと思う。</p>
<p> </p>
<p> </p>
<p><img src="http://ecx.images-amazon.com/images/I/41E5GP5CPAL._SL500_.jpg" alt="" width="300px" /></p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/454872476" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/974/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/974</feedburner:origLink></item>
		<item>
		<title>まくおさんを試してみた</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/444481731/963</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/963#comments</comments>
		<pubDate>Thu, 06 Nov 2008 15:28:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=963</guid>
		<description><![CDATA[先日のサーバインフラ Tech Meeting で、安井さんが公開すると宣伝していたファイルコピーツール「まくおさん (Multicasts All-Kinds of Updating Operation for Ser [...]]]></description>
			<content:encoded><![CDATA[<p>先日の<a href="http://gihyo.jp/event/2008/24svr-tech-meeting" onclick="javascript:pageTracker._trackPageview('/outbound/article/gihyo.jp');">サーバインフラ Tech Meeting</a> で、安井さんが公開すると宣伝していたファイルコピーツール「<a href="http://lab.klab.org/wiki/Makuosan" onclick="javascript:pageTracker._trackPageview('/outbound/article/lab.klab.org');">まくおさん</a> (Multicasts All-Kinds of Updating Operation for Servers on Administered Network)」が公開されたので、さっそく試してみた。</p>
<p>環境は、CentOS 5.2 x86_64 です。</p>
<ul>
<li>ソースコードを <a href="http://sourceforge.net/project/showfiles.php?group_id=241125" onclick="javascript:pageTracker._trackPageview('/outbound/article/sourceforge.net');">sourceforge</a> からダウンロードする</li>
<li>ソースコードを展開する</li>
<li>./configure &amp;&amp; make する、問題なくコンパイルが通る</li>
<li>init スクリプトがないっぽいので、<a href="http://www.sssg.org/blogs/naoya/wp-content/uploads/2008/11/makuosan.sysv" >作ってみた</a></li>
<li>RPM にしたかったので、SPEC も<a href="http://www.sssg.org/blogs/naoya/wp-content/uploads/2008/11/makuosan.spec" >作ってみた</a></li>
<li>init スクリプトを追加したまるおさんの tarball を作って、_topdir/SOURCES に入れる</li>
<li>rpmbuild -ba makuosan.spec して、RPM を作る</li>
<li>作った RPM をインストールする</li>
<li>/etc/sysconfig/makuosan に、ベースディレクトリ (BASE_DIR) の設定をする</li>
<li>sudo /etc/init.d/makuosan start する（sudo しているのはかなり微妙かもしれないが、lock ファイルを作っているので必要）</li>
</ul>
<p>これでまくおさんを起動したので、さっそく動作確認</p>
<blockquote><p>$ /usr/bin/msync &#8211;members</p>
<p>1.0.0: s1.example.com  192.168.1.1<br />
Total: 1 members</p></blockquote>
<p>認識している。さっそくファイルを転送してみる。</p>
<blockquote><p>$ /usr/bin/msync -r</p></blockquote>
<p>-v を指定しないと、何も表示されないが確認してみるとちゃんとコピーされている。ちょっと試した感じだと非常に便利なので、実際のシステムで使うように引き続き検証をしておく予定。あと、FreeBSD でも動かせないか調べてみたい。</p>
<p>今までは、社内の自作シェルスクリプトで rsync していたので、サーバ情報の管理がかなりめんどうだったけれど、まくおさんを使うとファイルをコピーするということに限ってはかなりシンプルになりそう。</p>
<p>せっかくなので、<a href="http://www.sssg.org/blogs/naoya/wp-content/uploads/2008/11/makuosan-100-1x86_64.rpm" >作った RPM</a> を公開しておきます。ダウンロードした RPM のファイル名がおかしいので、なおしてください。正しくは、makuosan-1.0.0-1.x86_64.rpm です。</p>
<p>init スクリプトと SPEC がソースコードに含まれることに期待しています。</p>
<p>こんな素敵なツールを作って公開してくださった KLab Inc. の安井さんに感謝！！！</p>
<p># 追伸</p>
<p>設定している途中で、「<strong>まくおさん</strong>」なのか「<strong>まるおさん</strong>」なのか、自分の中で勝手に混乱しまった。。。個人的には「まるおさん」の方が覚えやすい＞＜</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/444481731" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/963/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/963</feedburner:origLink></item>
		<item>
		<title>英英辞典 on iPhone</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/443756691/958</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/958#comments</comments>
		<pubDate>Wed, 05 Nov 2008 23:18:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=958</guid>
		<description><![CDATA[最初、英語の勉強のために電子辞書を買おうかなと思っていたけれど、けっこう高いし、辞書が別に携帯するのがいやなので、iPhone でないかなと思って調べてみた。そうすると、意外にもたくさんの選択肢があった。
個人的に英英辞 [...]]]></description>
			<content:encoded><![CDATA[<p>最初、英語の勉強のために電子辞書を買おうかなと思っていたけれど、けっこう高いし、辞書が別に携帯するのがいやなので、iPhone でないかなと思って調べてみた。そうすると、意外にもたくさんの選択肢があった。<br />
個人的に英英辞典でポイントなる項目は、次のとおり。</p>
<ul>
<li>収録語数</li>
<li>Native の発音を聞くことができることか</li>
<li>米国英語、英国英語、の発音記号を表示できるか</li>
</ul>
<table border="0">
<tbody>
<tr>
<th>アプリケーション名</th>
<th>収録語数</th>
<th>発音を聞けるか</th>
<th>発音記号</th>
<th>価格</th>
<th>iTMS URL</th>
</tr>
<tr>
<td><a href="http://www.pandawords.com/iphone.jsp" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.pandawords.com');">Cambridge Advanced Talking Dictionary</a></td>
<td>約19万語</td>
<td>米国、英国、どちらでも聞ける</td>
<td>米国、英国、どちらもあり</td>
<td>\2,500</td>
<td><a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=292393918&amp;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/phobos.apple.com');">URL</a></td>
</tr>
<tr>
<td><a href="http://penreader.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/penreader.com');">Concise Oxford Dictionary</a></td>
<td>約24万語</td>
<td>あり(Oxford なので英国のみの可能性が高い）</td>
<td>なし</td>
<td>\2,900</td>
<td><a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=292520867&amp;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/phobos.apple.com');">URL</a></td>
</tr>
<tr>
<td><a href="http://penreader.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/penreader.com');">Merriam Webster Collegiate Dictionary</a></td>
<td>約22.5万語</td>
<td>なし</td>
<td>あり</td>
<td>\2,900</td>
<td><a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=290612566&amp;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/phobos.apple.com');">URL</a></td>
</tr>
<tr>
<td><a href="http://www.enfour.com/iphone/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.enfour.com');">American Heritage® Dictionary - Fourth Edition</a></td>
<td>約7万語</td>
<td>あり</td>
<td>あり</td>
<td>\3,500</td>
<td><a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284965601&amp;mt=8" onclick="javascript:pageTracker._trackPageview('/outbound/article/phobos.apple.com');">URL</a></td>
</tr>
</tbody>
</table>
<p>こんな感じでした。すべて有料なので気軽に試せなかったので、上から検討した結果「Cambridge Advanced Talking Dictionary」を初の iPhone 有料アプリとして購入してみました。</p>
<p>米国、英国、両方の発音記号と実際の発音を iPhone で見れて聞けるのでこれからも重宝しそうです。</p>
<p>その他にも和英や英和もかなり充実しているし、無料の英英辞典も english とか dictionary とかで検索するとたくさんあるので使ってみるといいかもしれません。カテゴリでいうと、Reference、Education、などに属していますね。</p>
<p><a href="http://www.flickr.com/photos/naoya_n/3006737500/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.flickr.com');" title="CAMBRIDGE Advanced Learnes's Dictionary by n0ts, on Flickr"><img src="http://farm4.static.flickr.com/3171/3006737500_c1f5c1fe5a.jpg" width="320" height="480" alt="CAMBRIDGE Advanced Learnes's Dictionary" /></a></p>
<p><a href="http://www.flickr.com/photos/naoya_n/3005901247/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.flickr.com');" title="CAMBRIDGE Advanced Learnes's Dictionary by n0ts, on Flickr"><img src="http://farm4.static.flickr.com/3026/3005901247_8609b1d3c0.jpg" width="320" height="480" alt="CAMBRIDGE Advanced Learnes's Dictionary" /></a></p>
<p>追伸：<br />
iPhone アプリのアイコンは、どうやってブログに張るのだろうか。。。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/443756691" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/958/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/958</feedburner:origLink></item>
		<item>
		<title>JTPA シリコンバレーカンファレンス2009</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/443272696/956</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/956#comments</comments>
		<pubDate>Wed, 05 Nov 2008 14:15:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=956</guid>
		<description><![CDATA[JTPA 主催のシリコンバレーカンファレンス2009が、2009/3/21 に開催されます。
今回は、なんと200名の募集のようです。おそらく、現地集合、現地解散という楽しそうなカンファレンスになるようです。

応募方法 [...]]]></description>
			<content:encoded><![CDATA[<p>JTPA 主催の<a href="http://www.jtpa.org/event/svtour/000412.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.jtpa.org');">シリコンバレーカンファレンス2009</a>が、2009/3/21 に開催されます。<br />
今回は、なんと200名の募集のようです。おそらく、現地集合、現地解散という楽しそうなカンファレンスになるようです。</p>
<p><a href="http://www.jtpa.org/event/svtour/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.jtpa.org');"><img border="0" alt="Silicon Valley Conference" src="http://www.jtpa.org/images/svconf2009.png" width="175" height="144" /></a></p>
<p>応募方法は、近いうちに JTPA のサイトで案内がでると同時に上のバナーも変わると思います。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/443272696" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/956/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/956</feedburner:origLink></item>
		<item>
		<title>ネットプリントサービスが便利</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/442304950/954</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/954#comments</comments>
		<pubDate>Tue, 04 Nov 2008 17:25:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=954</guid>
		<description><![CDATA[セブンイレブンで展開しているネットプリントというサービスが、とても便利で感動した。
このネットプリントというサービスは、富士ゼロックスがやっている。
使い方は、次のとおりでとても簡単で自宅にプリンタがない僕の場合はかなり [...]]]></description>
			<content:encoded><![CDATA[<p>セブンイレブンで展開している<a href="http://www.fujixerox.co.jp/evolution/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.fujixerox.co.jp');">ネットプリント</a>というサービスが、とても便利で感動した。<br />
この<a href="http://www.printing.ne.jp/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.printing.ne.jp');">ネットプリント</a>というサービスは、富士ゼロックスがやっている。</p>
<p>使い方は、次のとおりでとても簡単で自宅にプリンタがない僕の場合はかなり重宝するサービスになった。</p>
<ul>
<li>ネットプリントにユーザ登録（無料）する</li>
<li>ネット プリントのプリントしたいファイルをアップロードする（エクセルや PDF などに対応している、対応している用紙サイズでないと自動的にエラーになるのでとても親切）</li>
<li>ファイルをアップロードすると発行される登録キーをメモする</li>
<li>あとは、全国のセブンイレブンで登録キーを入力するだけで印刷をすることができる</li>
<li>料金は、<a href="http://www.printing.ne.jp/attention/attention.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.printing.ne.jp');">ここ</a>に書いてあるとおりで、モノクロA3やA2で1枚20円というリーズナブル、さらに実際に印刷してみると会社のプリンタよりもきれいに鮮明にきれいに印刷できる</li>
</ul>
<p><a title="netprint by n0ts, on Flickr" href="http://www.flickr.com/photos/naoya_n/3002457443/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.flickr.com');"><img src="http://farm4.static.flickr.com/3136/3002457443_9c1bf3c5c5.jpg" alt="netprint" width="500" height="480" /></a></p>
<p>こういう身直に精通しているウェブサービスは、本当に便利だと思うが、こういったサービスは普通の人たちが使うので簡単に使えなければならない。</p>
<img src="http://feeds.feedburner.com/~r/n0ts/~4/442304950" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.sssg.org/blogs/naoya/archives/954/feed</wfw:commentRss>
		<feedburner:origLink>http://www.sssg.org/blogs/naoya/archives/954</feedburner:origLink></item>
		<item>
		<title>iPhone を買った</title>
		<link>http://feeds.feedburner.com/~r/n0ts/~3/440857265/949</link>
		<comments>http://www.sssg.org/blogs/naoya/archives/949#comments</comments>
		<pubDate>Mon, 03 Nov 2008 10:58:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[day]]></category>

		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.sssg.org/blogs/naoya/?p=949</guid>
		<description><![CDATA[今年も、無事誕生日を迎えることができた。誕生日の日は、会社の同僚と元同僚たちに大好きなベルギービールでお祝いしてもらって、すばらしい時間を過ごすことができた。
自分への誕生日プレゼンとして、もうすでに祭りは終わっているけ [...]]]></description>
			<content:encoded><![CDATA[<p>今年も、無事誕生日を迎えることができた。誕生日の日は、会社の同僚と元同僚たちに大好きなベルギービールでお祝いしてもらって、すばらしい時間を過ごすことができた。</p>
<p>自分への誕生日プレゼンとして、もうすでに祭りは終わっているけれど iPhone を買った。iPhone は、電話というより、個人的にアプリケーションを本格的に作りたくなったからだ。iPhone を新規契約したが、何の問題もなく在庫もあって、運転免許証と運転免許証の住所と現住所が違う場合は公共料金の領収書と月々の支払いに必要なクレジットカードだけで問題なく契約ができた。契約時間は、店員さんが慣れていたということもあって、約30分ほどで終わった。iPhone のパッケージは自分で開封するのだけれど、みごとに箱の一部をはがしてしまった。箱は必要なのかよく分からないが、ちょっとやってしまったと思った。わざわざ自分で開封させる意味が、ちゃんと理解できてよかった。</p>
<p><a title="DSC_0001.JPG by n0ts, on Flickr" href="http://www.flickr.com/photos/naoya_n/2998308123/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.flickr.com');"><img src="http://farm4.static.flickr.com/3146/2998308123_3dde82a71d.jpg" alt="DSC_0001.JPG" width="500" height="333" /></a></p>
<p>全損がかなり怖いので、Apple Care には加入しておいた。白か黒かすこし迷ったが、16GB の黒にした。</p>
<p>購入した直後の iPhone は、バージョンが 2.0系でバッテリーもほとんどない状態がだったが、USB 電源アダプターは新しいものに交換されていた（あたりまえか）。</p>
<p>家に帰ってから、iPhone をバージョンアップしようとして、ファームウェアをダウンロード開始したところで寝て朝起きたら iPhone にロックがかかってしまい、緊急電話しか使えないただの箱になってしまった。</p>
<p>近くのソフトバンクショップに修理のお願いに行ったら、<a href="http://mb.softbank.jp/mb/iphone/contact/" onclick="javascript:pageTracker._trackPageview('/outbound/article/mb.softbank.jp');">iPhone テクニカルサポート</a>に確認しないと交換できませんと言われてしまう。ちょうど行ったのが土曜日の5時すぎということで、タイミングよくテクニカルサポートが終了していた。ショップから交換品を取り寄せておくので、翌日テクニカルサポートに確認して、それでもダメならまた来てくださいと言われた。今日みたいな日も日割で料金が発生しているんだよなと不満をかかえつつも、翌日テクニカルサポートに午前10時頃に問い合わせしてみた。テクニカルサポートで、確認されたことが次のとおり。ちなみに、前日にすべて自分で試していた。</p>
<ul>
<li>OSX のバージョンは最新ですか？ -&gt; 最新の 10.5.5 です</li>
<li>iTunes のバージョンは最新ですか？ -&gt; 最新の 8.0.1 です</li>
<li>SIM カードを抜き差しして症状が変わらないですか？ -&gt; （すでに5回くらいやっていたが、念のためちゃんとやって）症状が変わりません</li>
</ul>
<p>これだけかと思いつつも、予想通りロックがかかりっぱなしだったので、ショップに行った。ショップに行ったら、Apple Care から交換品が届いて SIM カードをショップで用意されているものに交換してみたが症状が変わらないということで本体を無料で交換してもらった。もし、Apple Care に入っていない場合は、90日を過ぎると有償になるとのこと。Apple Care に入っていると、それが2年に延長されるとのこと。</p>
<p>新品に交換しても、iPhone のバージョンは 2.0 系のままだったので家に帰ってからバージョンアップしたら、今度はすんなりとバージョンアップすることができた。</p>
<p>今まで、ずっと iPod Touch 1G を持っていたが、いろいろと違っていることが多いので、同梱はされていないが <a href="http://manuals.info.apple.com/ja_JP/iPhone_User_Guide_JP.pdf" onclick="javascript:pageTracker._trackPageview('/outbound/article/manuals.info.apple.com');">iPhone の説明書</a>を一通り読みながら実際に操作してみた。このあたりの情報は、<a href="http://iphone.wikiwiki.jp/?%B8%F8%BC%B0%A5%B5%A5%A4%A5%C8%A4%CA%A4%C9#m090630e" onclick="javascript:pageTracker._trackPageview('/outbound/article/iphone.wikiwiki.jp');">iPhone 3G Wiki</a> によくまとまっている。</p>
<p>この説明書も、iPhone のアプリとして入れてくれればいいのにと思ったが、もし作ったら確実に Reject されそうだが PDF を iPhone の表示用にフォーマットしなおさないといけないでできるかどうか調べてみたい。</p>
<p>一通り操作をしてあと、いろいろとアプリを入れて遊んでみた。日本製のはブログなどでかなり紹介されているが、海外製のは適当に探しながら入れてみた。ユニクロのアプリは Wifi を使ってもダウンロードに時間がかかりすぎなのと、起動や動作も重いので速攻で削除した。アプリを作るときには、アプリサイズも重要なポイントになるだろうと実感した。</p>
<p>海外製でよくできたアプリとしては、 <a href="http://www.smugmug.com/iphone/smugshot/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.smugmug.com');">SmugShot</a> というサイトが提供しているアプリ。 iPhone のカメラで撮影した写真をアップロードできたり、iPhone からアカウントを登録できたりと、かなり使いやすかった。iPhone のカメラで撮影した写真をアップロードするアプリを作るときには、このアプリを参考にしたいと思った。</p>
<p>iPhone を堪能したあと、iPod Touch 1G を JB してみようと iPod Touch を初期化してから、Pwnagetool なるものを使ってみたが DFU モードに入ってもカスタムファームウェアをインストールすることができなかった。そろそろ、2.2 が登場しそうなので、また機会をみて試したいと思う。iPhone は、JB するリスクがけっこうありそうなのでやめ