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

<channel>
	<title>ディノオープンラボラトリ</title>
	<atom:link href="http://openlab.dino.co.jp/feed" rel="self" type="application/rss+xml" />
	<link>http://openlab.dino.co.jp</link>
	<description>株式会社ディノ社員による技術メモ</description>
	<pubDate>Thu, 12 Nov 2009 13:37:58 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/feed" />
		<item>
		<title>Go For C++ Programmers #Conceptual Differences の勝手に和訳</title>
		<link>http://openlab.dino.co.jp/2009/11/11/231252628.html</link>
		<comments>http://openlab.dino.co.jp/2009/11/11/231252628.html#comments</comments>
		<pubDate>Wed, 11 Nov 2009 14:12:52 +0000</pubDate>
		<dc:creator>tumf</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<category><![CDATA[lang]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=628</guid>
		<description><![CDATA[たかはらです。
Googleが新しいプログラム言語を発表しました。早速プログラムされている方(1 2)とか尊敬します。最近はご無沙汰ですが、C++最強説を今だに唱え続ける自分としてはGo For C++ Programm [...]]]></description>
			<content:encoded><![CDATA[<p>たかはらです。</p>
<p>Googleが新しいプログラム言語を発表しました。早速プログラムされている方(<a href="http://d.hatena.ne.jp/amachang/20091111/1257928890" target="_blank">1</a> <a href="http://d.hatena.ne.jp/moriyoshi/20091111/1257929640" target="_blank">2</a>)とか尊敬します。最近はご無沙汰ですが、C++最強説を今だに唱え続ける自分としては<a href="http://golang.org/doc/go_for_cpp_programmers.html" target="_blank">Go For C++ Programmers</a>のようなドキュメントをみるとうれしくなってしまいまして、<a href="http://golang.org/doc/go_for_cpp_programmers.html" target="_blank">Go For C++ Programmers</a>の最初の&#8221;Conceptual Differences&#8221;部分を勝手に和訳しました。権利的に問題があれば削除します。</p>
<p>適当に訳したので致命的な誤訳はありそうです。コメント欄で指摘頂けるとありがたいです。</p>
<p>以下、訳となります。</p>
<p><span id="more-628"></span>GoはC++のような汎用システム用のプログラム言語を目指しています。C++プログラマ向けにいくつかの注意点があります。このドキュメントでは、GoとC++の違いについて説明する事であまり違わない事が判るよ。</p>
<p>Goのもっと一般的な紹介は、&#8221;Go tutorial&#8221;や&#8221;Effective Go&#8221;を見てくださいね。</p>
<p>Goの細かい仕様を知りたいなら、&#8221;Go spec&#8221;をみてね。</p>
<p><strong>GoとC++の概念的な違い:</strong></p>
<ul>
<li>Goにはコンストラクタやデストラクタをもったクラスはないよ。クラスメソッド・階層的なクラスの継承・仮想関数の替わりにGoにはこの後に詳しく説明するインターフェイスがあるよ。インターフェイスはC++でいうとテンプレートみたいなものだ。</li>
<li>Goはガベージコレクションを使うよ。メモリーを明確にリリースする事は必要ないよ。ガベージコレクションは最近のプロセッサーではますます効果的になっているよ。</li>
<li>GOはポインターを持ってるけど、加減算はできないよ。文字列の各バイトを順に調べるのにポインタの値を使う事はできないよ。</li>
<li>Goの配列は<em>ファーストクラスの値</em>です。配列が関数のパラメータとしてつかわれると、関数は配列のポインター(参照)ではなくコピーを受け取るよ。しかしながら、実用的な関数では、よくパラメータにスライスが使われるよ。スライスは配列の元になるポインタをもっているよ。スライスについてはあとで説明するね。</li>
<li>文字列が言語の機能にあるよ。文字列は生成されてから変更されないよ。</li>
<li>ハッシュテーブルも言語の機能にあるよ。これらはマップと呼ばれているよ。</li>
<li>チャンネルというスレッド間通信も言語の機能にあるよ。これについてはあとで説明するね。</li>
<li>いくつかの型(map, channel, etc.)は値渡しではなく参照で渡されるよ。つまり、マップは関数に渡される時にコピーされないし、関数の中で変更されると、呼び出し側も変わるよ。C++でいうと参照型ですね。</li>
<li>Goはヘッダファイルを使わないよ。かわりに、それぞれのソースファイルは定義されたパッケージの一部になるよ。パッケージが大文字から始まる名前のオブジェクト(型,定数,変数,関数)として定義されると、そのオブジェクトはそのパッケージをインポートした他のファイルからも見えるようになるよ。</li>
<li>Go は 暗黙の型変換はしないよ。異なる型の変換にはキャストが必要ですよ（Goではコンバージョンとよびます）</li>
<li>Go は関数のオーバーロードやユーザが定義できる演算子はないよ。</li>
<li>Go にはconst や volatile制約はないよ。</li>
<li>C++ではNULLや0だったけど、Go無効なポインタにはnilを使うよ。</li>
</ul>
<p>以上：</p>
<p>あれ、C++ と <a href="http://www.boost.org/" target="_blank">Boost</a> の組み合わせってやっぱ最強ですか。</p>
<hr />追記1: 2009-11-12 20:27 tokuhiromさんのご指摘によりfirst class value を修正しました。多謝。</p>
<p>追記2: <a href="http://d.hatena.ne.jp/propella/20091111/p1" target="_blank">#interfaceの和訳</a>を発見しました！。つづきはこちらで<br />
ならって本稿のタイトルも修正しました。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2009/11/11/231252628.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2009/11/11/231252628.html" />
	</item>
		<item>
		<title>株式会社ディノの中途採用について</title>
		<link>http://openlab.dino.co.jp/2009/07/17/230007579.html</link>
		<comments>http://openlab.dino.co.jp/2009/07/17/230007579.html#comments</comments>
		<pubDate>Fri, 17 Jul 2009 14:00:07 +0000</pubDate>
		<dc:creator>hnw</dc:creator>
		
		<category><![CDATA[お知らせ]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=579</guid>
		<description><![CDATA[
株式会社ディノでは技術者の中途採用を随時行っています。いま現在も一緒に仕事する仲間を募集しています。本記事では、採用の方針や採用フローのご紹介をさせて頂きます。

募集するエンジニアについて

ディノではプログラミング [...]]]></description>
			<content:encoded><![CDATA[<p>
株式会社ディノでは技術者の中途採用を随時行っています。いま現在も一緒に仕事する仲間を募集しています。本記事では、採用の方針や採用フローのご紹介をさせて頂きます。
</p>
<h3>募集するエンジニアについて</h3>
<p>
ディノではプログラミング・データベース・サーバ管理などの分野について一家言あるようなエンジニアを募集しています。ディノは社長が技術者ということもあり、技術指向の強いメンバーが集まっている会社だと思います。これは本ブログの内容からも見て取れるのではないでしょうか。
</p>
<p>
弊社ではプログラミング言語としてPHPを採用していますが、プログラミング言語の知識はそれほど重視していません。Webで複数人での開発を経験されている方なら、言語の知識は大して重要ではないと考えています。また、多少経験が足りなくても熱意のある方なら大歓迎です。入社後にはsymfonyを利用してWeb+DBシステム構築のプロジェクトに参加して頂くことになります。
</p>
<p>
サーバ・ネットワークまわりに特化したエンジニアも募集しています。サーバ周りでは仮想化技術に特に注力していますので、面白そうな会社だと思った方はぜひ一度面接にいらしてください。
</p>
<p><span id="more-579"></span></p>
<h3>面接の流れと内容</h3>
<p>
<a href="http://www.dino.co.jp/recruit/">採用情報</a>からエントリーしてください。担当者が面接の日時を調整いたします。
</p>
<p>
1次面接では、技術面に関してお伺いします。技術力だけで仕事をするわけではありませんが、仕事上の重要な基礎力の一つとして、現時点で獲得している知識、技術的な興味、今後伸ばして行きたい方向などをお聞きします。
</p>
<p>
過去の案件での具体的な苦労話や、案件からは少し離れた知識、最近試した面白い技術、などについて、ざっくばらんに話して頂きたいです。アピールできるような材料やエピソードを用意してきて頂けると面接がスムーズに進むと思います。
</p>
<p>
2次面接は開発部トップの役員が担当します。希望するポジションについてのすり合わせを行わせて頂きます。社内のどのチームでどう働いてもらえそうか、具体的なイメージを持てるレベルでお話させて頂きます。また、これまでの経験や実績についての話を1次面接より具体的にお聞きし、希望する条件についてもお話いただきます。
</p>
<p>
最終面接は社長の高原が担当します。お互いに長く働けそうかを確認しあった上で、最終的な条件の確認を行います。これから働いてもらう人のためにも、入社前に自分の目と肌で会社の雰囲気と社長の人となりを判断してもらいたい、というのが高原の考えです。
</p>
<p>
もし興味を持った方がいらっしゃれば是非ご応募ください。社員一同、未来の同僚を心待ちにしております。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2009/07/17/230007579.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2009/07/17/230007579.html" />
	</item>
		<item>
		<title>PHPで最小の整数を得る方法</title>
		<link>http://openlab.dino.co.jp/2009/07/14/204659612.html</link>
		<comments>http://openlab.dino.co.jp/2009/07/14/204659612.html#comments</comments>
		<pubDate>Tue, 14 Jul 2009 11:46:59 +0000</pubDate>
		<dc:creator>hnw</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=612</guid>
		<description><![CDATA[
PHP 4.4.0以降およびPHP 5.0.5以降では、最大の整数が定数PHP_INT_MAXとして定義されています。


$ php -r 'var_dump(PHP_INT_MAX);'
int(214748364 [...]]]></description>
			<content:encoded><![CDATA[<p>
PHP 4.4.0以降およびPHP 5.0.5以降では、最大の整数が定数PHP_INT_MAXとして定義されています。
</p>
<pre>
$ php -r 'var_dump(PHP_INT_MAX);'
int(2147483647)
</pre>
<p>
64bit環境では次のような結果になります。
</p>
<pre>
$ php -r 'var_dump(PHP_INT_MAX);'
int(9223372036854775807)
</pre>
<p>
ところで、最小の整数が必要な場合はどうすればいいのでしょうか。実は最小の整数は定数定義されていないのですが、次のようにすれば取得できます。
</p>
<p><span id="more-612"></span></p>
<pre>
$ php -r 'var_dump(~PHP_INT_MAX);'
int(-2147483648)
</pre>
<p>
64ビット環境でも同様です。
</p>
<pre>
$ php -r 'var_dump(~PHP_INT_MAX);'
int(-9223372036854775808)
</pre>
<p>
ここで利用した~というのはビット反転した値を返す単項演算子です。<a href="http://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0">2の補数表現</a>を思い出してください。
</p>
<ul>
<li>最大の整数の2進表現：0111&#8230;111</li>
<li>最小の整数の2進表現：1000&#8230;000</li>
</ul>
<p>
上記のように、最大の整数をビット反転させれば最小の整数になることがわかります。短く書けてカッコいいと感じたので紹介しました。
</p>
<p>
Web業界にいるとビット演算と縁遠くなってしまう気がしますけど、エンジニアの基礎体力の一つだと思うので、読めばわかる程度には慣れておいた方がいいと思います。
</p>
<p>
もちろん、仕事で書くなら次のように書いた方が親切かもしれません。
</p>
<pre>
$ php -r 'var_dump(-PHP_INT_MAX-1);'
int(-2147483648)
</pre>
<p>
PHP_INT_MINをdefineすれば更に親切ですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2009/07/14/204659612.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2009/07/14/204659612.html" />
	</item>
		<item>
		<title>Firebugの「要素を調査」ボタンを出すと便利！</title>
		<link>http://openlab.dino.co.jp/2009/07/13/225705586.html</link>
		<comments>http://openlab.dino.co.jp/2009/07/13/225705586.html#comments</comments>
		<pubDate>Mon, 13 Jul 2009 13:57:05 +0000</pubDate>
		<dc:creator>hnw</dc:creator>
		
		<category><![CDATA[Firefox]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=586</guid>
		<description><![CDATA[Firefoxのアドオンの中でもFirebugは便利ですよね。無いと死ぬって人も多いかと思います。ところで、このFirebugの機能の中でも「要素を調査」ボタンが便利すぎるのでご紹介します。
ここで言っている「要素を調査 [...]]]></description>
			<content:encoded><![CDATA[<p>Firefoxのアドオンの中でも<a href="https://addons.mozilla.org/ja/firefox/user/95117">Firebug</a>は便利ですよね。無いと死ぬって人も多いかと思います。ところで、このFirebugの機能の中でも「要素を調査」ボタンが便利すぎるのでご紹介します。</p>
<p>ここで言っている「要素を調査」ボタンというのは、下記のキャプチャ画像にある、ナビゲーションツールバーの眼鏡のアイコンのことです。</p>
<p><img src="http://openlab.dino.co.jp/wp-content/uploads/2009/06/firebug.png" alt="「要素を調査」ボタン" title="「要素を調査」ボタン" width="468" height="83" class="size-full wp-image-587" /></p>
<p>この眼鏡ボタンを押すとFirebugの「要素を調査」の機能が働きます。要するに、Firebugの「調査」ボタンと同じです。Firebugをインストールしたままの状態だと、ステータスバーのFirebugのアイコンを押してから「調査」を押して、と2回クリックするところが、1回クリックするだけで実行できるというのが違いです。こうして説明すると小さな差ですけど、このおかげで私の「調査」をする頻度が格段に上がった気がします。JavaScriptやCSSを触る人は「調査」する機会が多いと思いますので、この差は大きいのではないでしょうか。</p>
<p><span id="more-586"></span></p>
<p>このボタンの増やし方は簡単です。ナビゲーションツールバー上で右クリックして、「カスタマイズ」を選択すると、ナビゲーションツールバーのボタンを増減できます。ここで眼鏡ボタンをナビゲーションツールバーまでドラッグすれば完了です。インストールしているアドオンによっては他にもボタンが増やせるものがあります。</p>
<p>私の場合は<a href="https://addons.mozilla.org/ja/firefox/addon/59">User Agent Switcher</a>のボタンも出しています。これもナビゲーションバーにあると非常に便利です。User Agent Switcherに関して言うと、標準以外のUser Agnetにしているとアイコンの色が変わる（下図参照）のも気に入っています。</p>
<p><img src="http://openlab.dino.co.jp/wp-content/uploads/2009/06/ua-switcher.png" alt="User Agent Switcher" title="User Agent Switcher" width="253" height="258" class="size-full wp-image-590" /></p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2009/07/13/225705586.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2009/07/13/225705586.html" />
	</item>
		<item>
		<title>講習会「正規表現入門 (3)実習＆ツール紹介」を開催しました</title>
		<link>http://openlab.dino.co.jp/2009/06/30/181402503.html</link>
		<comments>http://openlab.dino.co.jp/2009/06/30/181402503.html#comments</comments>
		<pubDate>Tue, 30 Jun 2009 09:14:02 +0000</pubDate>
		<dc:creator>hnw</dc:creator>
		
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=503</guid>
		<description><![CDATA[「正規表現入門 (3)実習＆ツール紹介」というタイトルで、経験2〜3年目の人をターゲットに社内勉強会を開催しました。正規表現に対して苦手意識を持っている人は多いようなので、実習を交えた形のプレゼンを試してみました。実験的 [...]]]></description>
			<content:encoded><![CDATA[<p>「正規表現入門 (3)実習＆ツール紹介」というタイトルで、経験2〜3年目の人をターゲットに社内勉強会を開催しました。正規表現に対して苦手意識を持っている人は多いようなので、実習を交えた形のプレゼンを試してみました。実験的な試みでしたが、おおむね好評だったようです。
</p>
<h3>まとめ</h3>
<ul>
<li>次の機能が使いこなせれば正規表現は怖くない！（たぶん）
<ul>
<li>グルーピング</li>
<li>繰り返し</li>
<li>後方参照</li>
</ul>
</li>
<li>正規表現作成のコツ
<ul>
<li>構造を日本語で説明できれば、正規表現が書けたも同然
<ul>
<li>例：「ドットの後に英数字2文字以上」の1回以上繰り返し</li>
</ul>
</li>
<li>「ナントカのN回繰り返し」の組み合わせを作っていく</li>
</ul>
</li>
<li>Perlは便利！</li>
</ul>
<p><span id="more-503"></span></p>
<h3>ムービー</h3>
<div align="center">
<object id="zp" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="384"><param name="movie" value="http://zoome.jp/follow-up/zpdia/p/106/16" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed type="application/x-shockwave-flash" src="http://zoome.jp/follow-up/zpdia/p/106/16" width="480" height="384" allowFullScreen="true" allowScriptAccess="always" /></object>
</div>
<h3>発表資料</h3>
<ul>
<li>
    <a href='http://openlab.dino.co.jp/wp-content/uploads/2009/04/followup-20090423.pdf' title='followup-20090423.pdf'>スライド(PDF)</a>
  </li>
</ul>
<h3>スライド中の問題</h3>
<p>
実習形式で、スライドの途中で正規表現を答える問題を出題していますが、この問題部分だけ取り出して紹介します。
</p>
<p>
これに答えられる人は出席の必要はないですよ、と事前に社内のMLに流しておいたところ、これを見て出席しなかった人もいたようです。こんな風に事前にレベルを伝えられれば、勉強会の運営もスムーズに行きそうな気がします。
</p>
<ul>
<li>Q1: 部分文字列の2回以上の繰り返しになっている文字列にマッチする正規表現は？
<ul>
<li>○：abcabcabc（３回繰り返し）</li>
<li>○：hogehoge（２回繰り返し）</li>
<li>×：hogefugahogeやhogege</li>
</ul>
</li>
<li>Q2: 3桁ごとにカンマ区切りされた数字文字列にマッチする正規表現は？
<ul>
<li>○：100や3,000,000</li>
<li>×：1,00や1000</li>
</ul>
</li>
</ul>
<h3>参考URL</h3>
<p>
スライド中で紹介している正規表現関連のツールです。
</p>
<ul>
<li><a href="http://betterthangrep.com/">ack</a>Perlで書かれたgrepモドキです</li>
<li><a href="http://hnw.jp/tools/rename.pl.txt">rename.pl</a>（赤ラクダ本に載っていたものを筆者が改造したものです。オリジナルはもっとシンプルでした）</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2009/06/30/181402503.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2009/06/30/181402503.html" />
	</item>
		<item>
		<title>続・$HOME/.ssh/configを活用していますか？</title>
		<link>http://openlab.dino.co.jp/2009/05/28/235026555.html</link>
		<comments>http://openlab.dino.co.jp/2009/05/28/235026555.html#comments</comments>
		<pubDate>Thu, 28 May 2009 14:50:26 +0000</pubDate>
		<dc:creator>hnw</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[UNIX]]></category>

		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=555</guid>
		<description><![CDATA[
以前の記事「$HOME/.ssh/configを活用していますか？」では、設定ファイルを少し頑張って書けば普段のSSHライフが随分変わりますよ、と紹介しました。今日はその続編です。前回よりマニアックな設定を紹介します。 [...]]]></description>
			<content:encoded><![CDATA[<p>
以前の記事「<a href="http://openlab.dino.co.jp/2007/10/03/17550797.html">$HOME/.ssh/configを活用していますか？</a>」では、設定ファイルを少し頑張って書けば普段のSSHライフが随分変わりますよ、と紹介しました。今日はその続編です。前回よりマニアックな設定を紹介します。
</p>
<ul>
<li><a href="#proxycommand">2段以上先のサーバにログインする</a></li>
<li><a href="#dynamicforward">Dynamic Forward機能を使う</a></li>
<li><a href="#wildcard">共通設定をまとめて書く</a></li>
</ul>
<p><span id="more-555"></span></p>
<h3 id="proxycommand">2段以上先のサーバにログインする</h3>
<p>
目的のサーバにログインするために、踏み台的なサーバを経由しないと入れない環境があります。例えば、dmzというサーバ経由でないとdb1 （＝192.168.0.201）というホストにログインできない環境があるとします。このような場合に、ProxyCommandパラメータが利用できます。
</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">Host db1
  HostName 192.168.0.201
  ProxyCommand ssh dmz nc %h %p</pre></div></div>

<p>
上の設定で「ssh db1」とすると、sshでdmzに接続し、dmzから192.168.0.201へログインします。これを利用するには踏み台サーバにncコマンドが必要ですが、大抵の環境にインストールされているのではないでしょうか。
</p>
<h3 id="dynamicforward">Dynamic Forward機能を使う</h3>
<p>
最近のOpenSSHには、SOCKS Proxy機能が付いています。これは、自分専用のProxyサーバをログイン先に立てるような機能です。もうすこし正確に言うと、ローカルサーバの特定ポートがSOCKSプロトコルを受け付け、ポートフォワーディング機能によりリモートサーバから通信を行うものです。
</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">Host dmz
  HostName dmz.example.com
  DynamicForward <span style="">1080</span></pre></div></div>

<p>
こうすることで、「ssh dmz」してからローカルサーバの1080番ポートとSOCKSプロトコルで話せば、dmzサーバを経由して通信を行うことができます。
</p>
<p>
SOCKSという名前を初めて聞く人もいるかもしれません。これは汎用のproxyプロトコルで、実は多くのソフトウェアが対応しています。例えばFirefoxなども対応していますので、直接アクセスできないURLにWebブラウザでアクセスしたい場合に利用できます。データセンター内のネットワーク機器のWebインターフェースや、アプリケーション開発中のWebサーバなど、これが無いと苦労する状況も多いのではないでしょうか。
</p>
<h3 id="wildcard">共通設定をまとめて書く</h3>
<p>
複数のホストに同内容の設定をしたい場合、ホスト名としてワイルドカードが指定できます。例えば、次のように全サーバ共通の設定を記述できます。
</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">Host *
  ForwardAgent yes
  ServerAliveInterval <span style="">200</span>
  ForwardX11 no</pre></div></div>

<p>
ただし、$HOME/.ssh/configファイル内で最初に出現した設定が有効になることに注意が必要です。「man ssh_config」すると以下のように書いてあります。
</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">Since the first obtained value for each parameter is used,
more host-specific declarations should be given near
the beginning of the file, and general defaults at the end.</pre></div></div>

<p>
ですから、全サーバ用の設定「Host *」は$HOME/.ssh/configの最後に書く必要があります。うっかりファイル先頭に書いてしまった場合、それ以降にホストごとの設定を書いても無効になってしまいます。
</p>
<p>
また、既に紹介したProxyCommandもワイルドカードを利用すればまとめて書くことができます。
</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">Host db1
  HostName 192.168.0.201
Host db2
  HostName 192.168.0.202
Host db?
  ProxyCommand ssh dmz nc %h %p</pre></div></div>

<p>
もしくは次のような設定も考えられます。
</p>

<div class="wp_syntax"><div class="code"><pre class="" style="font-family:monospace;">Host dmz dmz-proxy
  HostName dmz.example.com
Host dmz2 dmz2-proxy
  HostName dmz2.example.com
Host *-proxy
  DynamicForward <span style="">1080</span></pre></div></div>

<p>
これだと、「ssh dmz」した場合は普通にログインし、「ssh dmz-proxy」したときだけSOCKS Proxyが有効になります。このようにワイルドカードを使うことで、共通の設定を一括でシンプルに記述できて便利です。
</p>
<h3>参考リンク</h3>
<ul>
<li>
    <a href="http://dsas.blog.klab.org/archives/50765770.html">DSAS開発者の部屋:OpenSSH クライアントの proxy &#8212; 踏み台サーバを経由しての ssh</a>
    </li>
<li>
    <a href="http://www.typemiss.net/blog/kounoike/20061019-100">SSH のダイナミック転送ってすごいんですよ | Typemiss.net</a>
    </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2009/05/28/235026555.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2009/05/28/235026555.html" />
	</item>
		<item>
		<title>lgrepコマンドで再帰的に日本語をファイル検索する</title>
		<link>http://openlab.dino.co.jp/2009/05/18/202918541.html</link>
		<comments>http://openlab.dino.co.jp/2009/05/18/202918541.html#comments</comments>
		<pubDate>Mon, 18 May 2009 11:29:18 +0000</pubDate>
		<dc:creator>hnw</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Mac OS X]]></category>

		<category><![CDATA[UNIX]]></category>

		<category><![CDATA[文字エンコーディング]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=541</guid>
		<description><![CDATA[lgrepコマンドをご存知でしょうか。日本語対応ページャlvの付属品で、対象ファイルの文字コードを推定して日本語文字列をうまく見つけてくれるという、優れもののgrepです。
古いプロジェクトだと、プログラムはEUCだけど [...]]]></description>
			<content:encoded><![CDATA[<p>lgrepコマンドをご存知でしょうか。日本語対応ページャ<a href="http://www.ff.iij4u.or.jp/~nrt/lv/">lv</a>の付属品で、対象ファイルの文字コードを推定して日本語文字列をうまく見つけてくれるという、優れもののgrepです。</p>
<p>古いプロジェクトだと、プログラムはEUCだけど静的ファイルはSJIS、なんてことがあると思います。そんなときに大活躍です。</p>
<p>grepした結果の文字コード変換も勝手にやってくれるので、grep結果をnkfする必要もありません。至れり尽くせりですね。</p>
<p>そんなlgrepコマンドにも弱点があります。grepで言う-r（再帰的にファイルを検索）オプションが無いのです。どこに書いてあるかわからないエラーメッセージを探す、なんてときに-rは必須ですよね。無いなら作ってしまえ、ということで作ってみました。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">alias</span> lgrep-r=<span style="color: #ff0000;">&quot;find . -type d -name .svn -prune -o -type f -print | xargs lgrep&quot;</span></pre></div></div>

<p>上記を.bashrcなり.zshrcなりに書けばlgrep-rコマンド（というかエイリアス）の出来上がりです。私は普段の便利さのために.svnディレクトリを無視するようにしてみましたが、環境に合わせて工夫してみてください。</p>
<p>思いつきで作ったんですが、これは便利！最近UTF-8のプロジェクトオンリーの恵まれた人はともかく、そうでない人にはオススメですよ。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2009/05/18/202918541.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2009/05/18/202918541.html" />
	</item>
		<item>
		<title>dsvn.el + subversion 1.6が変だったのでパッチを作りました</title>
		<link>http://openlab.dino.co.jp/2009/05/13/211725525.html</link>
		<comments>http://openlab.dino.co.jp/2009/05/13/211725525.html#comments</comments>
		<pubDate>Wed, 13 May 2009 12:17:25 +0000</pubDate>
		<dc:creator>tumf</dc:creator>
		
		<category><![CDATA[Emacs]]></category>

		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=525</guid>
		<description><![CDATA[たかはらです、いつもながら小ネタですいません。
以前、arashoが紹介してくれたdsvn.elを便利に使っていたのですが、先日Subversionを1.6.1にバージョンアップしたらステータスバッファのファイル名の認識 [...]]]></description>
			<content:encoded><![CDATA[<p>たかはらです、いつもながら小ネタですいません。</p>
<p>以前、<a href="http://openlab.dino.co.jp/author/arasho">arasho</a>が<a href="http://openlab.dino.co.jp/2008/04/23/185154236.html">紹介してくれた</a>dsvn.elを便利に使っていたのですが、先日Subversionを1.6.1にバージョンアップしたらステータスバッファのファイル名の認識を誤るようになり、先頭に空白が一つ入るようになりました。</p>
<p>dsvn.elが古いのか？と思い以下の最新版を試したのですが結果は同じでした。</p>
<blockquote><p>wget http://svn.collab.net/repos/svn/trunk/contrib/client-side/emacs/dsvn.el</p></blockquote>
<p>svn statusの出力の解釈に失敗しているようだったので、dsvn.elのファイルの中身を以下のように書き換えたところ動作するようになりました。</p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;">--- dsvn.el.orig        <span style="">2008</span>-<span style="">12</span>-02 <span style="">23</span>:<span style="">46</span>:<span style="">43.000000000</span> +0900
<span style="color: #888822;">+++ dsvn.el     <span style="">2009</span>-05-<span style="">13</span> <span style="">17</span>:08:<span style="">30.000000000</span> +0900</span>
<span style="color: #440088;">@@ -<span style="">1041</span>,<span style="">7</span> +<span style="">1041</span>,<span style="">7</span> @@</span>
<span style="">&#40;</span>insert str<span style="">&#41;</span>
<span style="">&#40;</span>goto-char svn-output-marker<span style="">&#41;</span>
<span style="">&#40;</span>while <span style="">&#40;</span>cond <span style="">&#40;</span><span style="">&#40;</span>looking-at
<span style="color: #991111;">-                     &quot;\\<span style="">&#40;</span><span style="">&#91;</span> ACDGIMRX?!~<span style="">&#93;</span><span style="">&#91;</span> CM<span style="">&#93;</span><span style="">&#91;</span> L<span style="">&#93;</span><span style="">&#91;</span> +<span style="">&#93;</span><span style="">&#91;</span> S<span style="">&#93;</span><span style="">&#91;</span> KOTB<span style="">&#93;</span>\\<span style="">&#41;</span> \\<span style="">&#40;</span>.*\\<span style="">&#41;</span>\n&quot;<span style="">&#41;</span></span>
<span style="color: #00b000;">+                     &quot;\\<span style="">&#40;</span><span style="">&#91;</span> ACDGIMRX?!~<span style="">&#93;</span><span style="">&#91;</span> CM<span style="">&#93;</span><span style="">&#91;</span> L<span style="">&#93;</span><span style="">&#91;</span> +<span style="">&#93;</span><span style="">&#91;</span> S<span style="">&#93;</span><span style="">&#91;</span> KOTB<span style="">&#93;</span>\\<span style="">&#41;</span> +\\<span style="">&#40;</span>.*\\<span style="">&#41;</span>\n&quot;<span style="">&#41;</span></span>
<span style="">&#40;</span>let <span style="">&#40;</span><span style="">&#40;</span>status <span style="">&#40;</span>match-string <span style="">1</span><span style="">&#41;</span><span style="">&#41;</span>
<span style="">&#40;</span>filename <span style="">&#40;</span>match-string <span style="">2</span><span style="">&#41;</span><span style="">&#41;</span><span style="">&#41;</span></pre></div></div>

<p>他に困っている方はどうぞ。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2009/05/13/211725525.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2009/05/13/211725525.html" />
	</item>
		<item>
		<title>講習会「文字集合と文字エンコーディング」を開催しました</title>
		<link>http://openlab.dino.co.jp/2009/04/21/145256491.html</link>
		<comments>http://openlab.dino.co.jp/2009/04/21/145256491.html#comments</comments>
		<pubDate>Tue, 21 Apr 2009 05:52:56 +0000</pubDate>
		<dc:creator>hnw</dc:creator>
		
		<category><![CDATA[workshop]]></category>

		<category><![CDATA[文字エンコーディング]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=491</guid>
		<description><![CDATA[「文字集合と文字エンコーディング」というタイトルで、経験2〜3年目の人をターゲットに社内勉強会を開催しました。文字集合という単語を知っている必要はないですけど、少なくともUTF-8とShift_JISとでは扱える文字の種 [...]]]></description>
			<content:encoded><![CDATA[<p>「文字集合と文字エンコーディング」というタイトルで、経験2〜3年目の人をターゲットに社内勉強会を開催しました。文字集合という単語を知っている必要はないですけど、少なくともUTF-8とShift_JISとでは扱える文字の種類数が違うことだけは伝えたかったので、その意味では目標が達成できたと思っています。</p>
<h3>まとめ</h3>
<ul>
<li>文字集合とは、扱える文字の集合
<ul>
<li>JIS X 0208なら6000文字くらいの日本語の文字</li>
<li>UCS-2なら60000文字くらいの世界中の主要な文字</li>
</ul>
</li>
<li>文字エンコーディングとは、文字の集合をバイト列に直す方式
<ul>
<li>Shift_JISはJIS X 0208（など）を1〜2バイトにする</li>
<li>UTF-8はUCS-2を1〜3バイトにする</li>
</ul>
</li>
<li>文字エンコーディング関連のツールを使いこなそう
<ul>
<li>nkfやlvを使いこなそう</li>
<li>日本語を探すならlgrep</li>
<li>最終兵器：hexjaで16進ダンプ</li>
</ul>
</li>
</ul>
<p><span id="more-491"></span></p>
<h3>ムービー</h3>
<div align="center">
  <object width="480" height="384"><param name="movie" value="http://zoome.jp/follow-up/zpdia/p/105/28" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed type="application/x-shockwave-flash" src="http://zoome.jp/follow-up/zpdia/p/105/28" width="480" height="384" allowFullScreen="true" allowScriptAccess="always" /></object>
</div>
<h3>発表資料</h3>
<ul>
<li>
    <a href='http://openlab.dino.co.jp/wp-content/uploads/2009/04/followup-20090416.pdf' title='followup-20090416.pdf'>スライド(PDF)</a>
  </li>
</ul>
<h3>補足など</h3>
<p>
若い人がターゲットということで、難しいことを言わないように、でも嘘はつかないように心がけたつもりです。でも、万一嘘があったら教えてください。
</p>
<p>
正確に言うとUTF-8の扱う文字集合はUCS-4で、UTF-8の1文字は1〜4バイトになりますけど、説明が長くなりそうだったので上のように説明してしまいました。UCS-2だけ扱うなら1〜3バイトであり、身近なデータであればASCII1バイト、日本語3バイトになるよ、という程度の理解で十分だろうと思います。
</p>
<p>
また、今回の説明ではUCS-2を文字集合の意味で使いましたが、サロゲートペアなしのUTF-16と同義の文字エンコーディングという意味で使っても間違いでは無いようです。というか、あれこれ調べてみましたが、何が正しいのか私自身混乱していたりします…。</p>
<p><h3>参考URL</h3>
<ul>
<li><a href="http://www.ff.iij4u.or.jp/~nrt/lv/">LV Homepage</a></li>
<li><a href="http://hexja.sourceforge.jp/">hexja - 日本語対応 16 進数ダンプツール</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2009/04/21/145256491.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2009/04/21/145256491.html" />
	</item>
		<item>
		<title>cronでは「毎月第1月曜日に実行」ができない</title>
		<link>http://openlab.dino.co.jp/2009/04/07/135417453.html</link>
		<comments>http://openlab.dino.co.jp/2009/04/07/135417453.html#comments</comments>
		<pubDate>Tue, 07 Apr 2009 04:54:17 +0000</pubDate>
		<dc:creator>hnw</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[UNIX]]></category>

		<category><![CDATA[cron]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=453</guid>
		<description><![CDATA[社内の技術メモに「cronでは第1月曜日に実行などはできないので、実行されるスクリプト側で条件判定しないとダメ」というような記述がありました。一体どういうことでしょうか。
crontabの書式は「分 時 日 月 曜日 コ [...]]]></description>
			<content:encoded><![CDATA[<p>社内の技術メモに「cronでは第1月曜日に実行などはできないので、実行されるスクリプト側で条件判定しないとダメ」というような記述がありました。一体どういうことでしょうか。</p>
<p>crontabの書式は「分 時 日 月 曜日 コマンド」です。また、数字はハイフンで範囲指定ができます。下記のように指定すれば毎月第1月曜日の午前3時にコマンドを実行できそうな気がします。</p>
<pre>
0 3 1-7 * 1 /path/to/command/execute-only-1st-monday
</pre>
<p>しかし、これは期待通りには動きません。「1日から7日までの期間の唯一の月曜日」を指定したつもりが、実際には「1日から7日のすべて、または日付に関係なく月曜日」と解釈されます。マニュアルにも書いてあるのですが、「日」と「曜日」が両方指定された場合、OR条件になるのです。</p>
<p>ネット上を探すと、これでハマって試行錯誤した人が複数いるようです。testコマンドとdateコマンドを使ってcrontabのコマンド指定部分で条件判定している人を見つけましたが、それは頑張り過ぎな気がします。趣味の問題ですけど、crontabはシンプルに保って呼び出される側で条件判定した方がいいんじゃないでしょうか。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2009/04/07/135417453.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2009/04/07/135417453.html" />
	</item>
	</channel>
</rss>
