<?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, 10 Nov 2011 11:53:52 +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>スケーラブルで堅牢な参照用NFSサーバのつくりかた</title>
		<link>http://openlab.dino.co.jp/2011/11/10/204822806.html</link>
		<comments>http://openlab.dino.co.jp/2011/11/10/204822806.html#comments</comments>
		<pubDate>Thu, 10 Nov 2011 11:48:22 +0000</pubDate>
		<dc:creator>tumf</dc:creator>
		
		<category><![CDATA[Cent]]></category>

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

		<category><![CDATA[ネットワーク]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=806</guid>
		<description><![CDATA[今開発しているサービで、約100台位のサーバに対し/usrマウントを提供しているのNFSサーバがあります。参照専用とはいえ、100台位になってくるとそこそこのパフォーマンスが要求されますし、/usrという重要なポイントを [...]]]></description>
			<content:encoded><![CDATA[<p>今開発しているサービで、約100台位のサーバに対し<code>/usr</code>マウントを提供しているのNFSサーバがあります。参照専用とはいえ、100台位になってくるとそこそこのパフォーマンスが要求されますし、<code>/usr</code>という重要なポイントをマウントしているため冗長化も重要です、また台数が日に日に増えているためとスケールアウトも出来なくてはなりません。そこで、スケーラブルで障害に強い参照用NFSサーバを構築してみました。<br />
<span id="more-806"></span></p>
<p>簡単なイメージは下図のとおりです。</p>
<p><a href="http://openlab.dino.co.jp/wp-content/uploads/2011/11/nfs-11.jpg"><img src="http://openlab.dino.co.jp/wp-content/uploads/2011/11/nfs-11-300x223.jpg" alt="nfs-11" title="nfs-11" width="300" height="223" class="aligncenter size-medium wp-image-814" /></a></p>
<p>NFSサーバはA,Bの2台ありそれぞれ<code>rsync</code>で内容が同期されています。それぞれのNFSサーバには仮想IPアドレス(以下、VIP)がそれぞれついています。クライアントはマウント時に、<code>nfs.mynet</code>(mynet部分はサービスのドメイン名等)をDNSに問い合わせると、DNSはNFSサーバのVIPのどれかを返却します。問い合わせごとに返却されるVIPが変わるため、各ホストがマウントするNFSサーバが分散する用になっています。</p>
<p>障害時には下図のとおり、VIPが正常な他方のNFSサーバに自動的に集められてサービスを継続します。</p>
<p><a href="http://openlab.dino.co.jp/wp-content/uploads/2011/11/nfs-2.jpg"><img src="http://openlab.dino.co.jp/wp-content/uploads/2011/11/nfs-2-300x129.jpg" alt="nfs-2" title="nfs-2" width="300" height="129" class="aligncenter size-medium wp-image-813" /></a></p>
<p>障害が解決すると、負荷分散のためフェイルバックをします。</p>
<p><a href="http://openlab.dino.co.jp/wp-content/uploads/2011/11/nfs-3.jpg"><img src="http://openlab.dino.co.jp/wp-content/uploads/2011/11/nfs-3-300x134.jpg" alt="nfs-3" title="nfs-3" width="300" height="134" class="aligncenter size-medium wp-image-815" /></a></p>
<p>ここまでの説明で「なんだ<code>keepalived</code>か」と分かってしまう*勘の良い方*はもう以下読む必要がないかもしれません。NFS-1,2にはそれぞれ<code>keepalived</code>がインストールしてあり、お互いを<code>VRRP</code>で監視しVIPを奪い合っています。全く難しいことはしていないのですが、強いて言うとVIPを実サーバ数分持ち、これを本来あるべきサーバに優先度をつけて設定するというのがミソです。</p>
<p><code>keepalived.conf</code>の設定は以下のようにNFSサーバ毎に優先度が異なっており、それぞれ変える必要があります。</p>
<h3>NFS-1の設定</h3>
<p><script src="https://gist.github.com/1354672.js?file=gistfile1.txt"></script></p>
<h3>NFS-2の設定</h3>
<p><script src="https://gist.github.com/1354676.js?file=gistfile1.txt"></script></p>
<h3>DNSの設定</h3>
<p>DNSラウンドロビンで<code>nfs.mynet</code>を問い合わせられたら、NFS-AのVIP(192.168.0.101)もしくは、NFS-BのVIP(192.168.0.102)が返されるように設定します。方法はDNSサービスにより異なりまた難しくないのでここでは説明を省かせて頂きます。</p>
<h3>NFSクライアント</h3>
<p><code>/etc/fstab</code>にてマウントポイントを記述します。私は以下のようにしました。</p>
<pre><code>
nfs.mynet:/usr   /usr  nfs  tcp,ro,soft,intr  0 0
</code></pre>
<p>フェイル時にすんなりアプリケーションから再試行が掛けられるようにsoftマウントしてあります。</p>
<p>以上のような簡単な構成でスケーラブルな参照用NFSサーバの構築をすることができました。まだ運用試験段階なのですが、今のところ問題なく動いておりNFSサーバの再起動も気兼ねなくできるようになりました。「もっとこうやったほうがいいよ!」という知見をお持ちの方、貴重なご意見を是非コメント欄にお願いいたします。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2011/11/10/204822806.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2011/11/10/204822806.html" />
	</item>
		<item>
		<title>rdefs を emacs/anything から使おう！</title>
		<link>http://openlab.dino.co.jp/2011/05/23/184501727.html</link>
		<comments>http://openlab.dino.co.jp/2011/05/23/184501727.html#comments</comments>
		<pubDate>Mon, 23 May 2011 09:45:01 +0000</pubDate>
		<dc:creator>kmori</dc:creator>
		
		<category><![CDATA[Emacs]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=727</guid>
		<description><![CDATA[はじめまして、kmori と申します。最近は主に Ruby/Rails 案件を担当しています。初見で他人の Ruby で書かれたライブラリなどを読むときに便利な rdefs というツールがあります。モジュール、クラス、メ [...]]]></description>
			<content:encoded><![CDATA[<p>はじめまして、kmori と申します。最近は主に Ruby/Rails 案件を担当しています。初見で他人の Ruby で書かれたライブラリなどを読むときに便利な rdefs というツールがあります。モジュール、クラス、メソッドなどを単位にファイルの構造を一覧/可視化するコマンドラインツールです。著名なスーパーハッカー青木峰郎さんの書かれた小さな Ruby スクリプトです。ターミナルからこんなかんじに利用します。</p>
<p><img class="alignnone size-full wp-image-769" src="http://openlab.dino.co.jp/wp-content/uploads/2011/05/dino-blog-1.png" alt="dino-blog-1" width="429" height="248" /></p>
<p>rdefs 自体は <a href="http://jp.rubyist.net/magazine/?0015-CodeReview">るびまの添削記事</a> や <a href="http://i.loveruby.net/d/20060909.html">青木日記</a>で紹介されています。これを emacs の anything から利用する anything-rdefs という emacs 拡張 を書いたので紹介します。anything の説明と導入方法の解説は行いません。</p>
<p><img class="alignnone size-full wp-image-771" src="http://openlab.dino.co.jp/wp-content/uploads/2011/05/dino-blog-2.png" alt="dino-blog-2" width="473" height="366" /></p>
<p>rdefs を emacs から利用することで、以下のようなメリットがあります。ただし、私が emacs はウィンドウ分割せずに利用していることもあり、細かくウィンドウ分割された状況での利用は想定していません。</p>
<ul>
<li>rdefs の結果を ruby-mode の配色で表示するので見やすい</li>
<li>左のウィンドウで定義をプレビューできる(後述のスクリーンキャスト参照)</li>
<li>anything の絞り込みができる</li>
<li>該当行にかんたんに移動できる</li>
</ul>
<p>インストールと設定方法を説明します。emacs に anything をインストールし、rdefs.rb をパスの通ったところに配置し、実行権限を付与します。rdefs.rb は </p>
<ul>
<li><a href="http://i.loveruby.net/svn/public/bin/trunk/rdefs.rb">http://i.loveruby.net/svn/public/bin/trunk/rdefs.rb</a> </li>
</ul>
<p>で公開されています。<br />
次に anything-rdefs を </p>
<ul>
<li><a href="https://github.com/wakaran/anything-rdefs/raw/master/anything-rdefs.el">https://github.com/wakaran/anything-rdefs/raw/master/anything-rdefs.el</a>
</li>
</ul>
<p>からダウンロードし、ロードパスの通ったところに配置します。そして、dot.emacs などの設定ファイルに以下の内容を追記します。</p>
<pre><code>
(require 'anything)
(require 'anything-rdefs)

(setq ar:command "/path/to/rdefs.rb")
(add-hook 'ruby-mode-hook
  (lambda ()
    (define-key ruby-mode-map (kbd "C-@") 'anything-rdefs)))
</code></pre>
<p><code>(setq ar:command "/path/to/rdefs.rb") </code>のところは rdefs.rb までフルパスで指定して下さい。Mac だと emacs がログインシェルの PATH を引き継がないことがあるらしいのでフルパスで指定するようにしました。<br />
あとは、ruby-mode で開いているバッファで Ctrl-@ を押下すれば上の画像のようなウィンドウが表示されます。スクリーンキャストも作ってみました。</p>
<ul>
<li><a href='http://openlab.dino.co.jp/wp-content/uploads/2011/05/anything-rdefs-demo-video.avi'>anything-rdefs-demo-video</a></li>
</ul>
<p>それから同様に、Sphinx などで利用されている rst ファイルの構造を表示し移動を簡単にする <a href="https://github.com/wakaran/rst-goodies/raw/master/rst-goodies.el">rst-goodies.el</a> というのも書きました。よろしければお試し下さい。</p>
<h3>最後に</h3>
<p>ディノでは Ruby/Rails 案件を募集しています。6月中旬頃までに小さめのが一つ決まると最高なのですがどうでしょうか。ご検討のほどよろしくお願い致します。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2011/05/23/184501727.html/feed</wfw:commentRss>
<enclosure url="http://openlab.dino.co.jp/wp-content/uploads/2011/05/anything-rdefs-demo-video.avi" length="1431098" type="video/x-msvideo" />
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2011/05/23/184501727.html" />
	</item>
		<item>
		<title>OpenSSHのauthorized_keys2はもう古い</title>
		<link>http://openlab.dino.co.jp/2010/12/08/195856719.html</link>
		<comments>http://openlab.dino.co.jp/2010/12/08/195856719.html#comments</comments>
		<pubDate>Wed, 08 Dec 2010 10:58:56 +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=719</guid>
		<description><![CDATA[お久しぶりです。ずいぶん記事を書くのをサボっていてごめんなさい。ディノでもAdvent Calendarやろうよ、なんて話もあったんですが、タイミングを逸した感がありますね。毎日とは言わなくても、またボチボチ書いていきた [...]]]></description>
			<content:encoded><![CDATA[<p>お久しぶりです。ずいぶん記事を書くのをサボっていてごめんなさい。ディノでもAdvent Calendarやろうよ、なんて話もあったんですが、タイミングを逸した感がありますね。毎日とは言わなくても、またボチボチ書いていきたいと思います。</p>
<p>さて、今日は社内での雑談の話題から、「~/.ssh/authorized_keys2」ファイルはobsolete（古い、時代遅れ）だよ、という話題です。</p>
<p>SSH1とSSH2が混在していたころの習慣だと思うのですが、~/.ssh/authorized_keysにはSSH1の公開鍵を、~/.ssh/authorized_keys2にはSSH2の鍵を置くきまりだと聞いたことがあります。しかし、これはもはや正しくないようです。</p>
<p><a href="http://www.openssh.com/txt/release-3.0">OpenSSH3.0のリリースノート</a>には下記のような記述があります。</p>
<blockquote><p>
2) The files<br />
	/etc/ssh_known_hosts2<br />
	~/.ssh/known_hosts2<br />
	~/.ssh/authorized_keys2<br />
   are now obsolete, you can use<br />
	/etc/ssh_known_hosts<br />
	~/.ssh/known_hosts<br />
	~/.ssh/authorized_keys
</p></blockquote>
<p>このように、~/.ssh/authorized_keysで一本化されています。</p>
<p>OpenSSH3.0は2001年にリリースされたようなので、なんと9年前からobsoleteなんですね。9年経った今でも使えるということは、今後も当分は利用可能ということかもしれません。</p>
<p>私も長いことauthorized_keys2を使っていましたが、最近少しずつリネームしています。そこまで頑張って直すような性質のものではないと思いますが、私のように知らずに使い続けている人もいるかと思って紹介してみました。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2010/12/08/195856719.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2010/12/08/195856719.html" />
	</item>
		<item>
		<title>autotest で Symfony + Lime を自動テストする</title>
		<link>http://openlab.dino.co.jp/2010/05/13/144546693.html</link>
		<comments>http://openlab.dino.co.jp/2010/05/13/144546693.html#comments</comments>
		<pubDate>Thu, 13 May 2010 05:45:46 +0000</pubDate>
		<dc:creator>sou</dc:creator>
		
		<category><![CDATA[Mac OS X]]></category>

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

		<category><![CDATA[開発環境]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=693</guid>
		<description><![CDATA[

ruby 界隈でよく使われている自動テストツール autotest の Symfony + Lime 用スタイルを書いて公開しました。
  プロジェクトのローカルルールに合わせてあるのですが、軽く手を入れれば他のプロ [...]]]></description>
			<content:encoded><![CDATA[<p>
<img src="http://openlab.dino.co.jp/wp-content/uploads/2010/05/screen-shot-2010-05-12-at-140931-300x111.png" alt="screen-shot-2010-05-12-at-140931" width="300" height="111" class="size-medium wp-image-695" /><br />
ruby 界隈でよく使われている自動テストツール autotest の Symfony + Lime 用スタイルを書いて公開しました。<br />
  プロジェクトのローカルルールに合わせてあるのですが、軽く手を入れれば他のプロジェクトでも、また Symfony や PHP 以外でも使えると思います。
</p>
<ul>
<li>TDD で書いていないと不安が高じて動悸と息切れが始まる</li>
<li>red-green-refactoring を唱えなさいとじっちゃに言われた</li>
<li>growl の red を見ないとコードが先に進まない</li>
</ul>
<p>よくある話だと思います。<br />
  まずテストが無いと何も始まらない！書いたテストはがんがん自動実行して使い倒したい！<br />
となるとやはり、自動テストの出番ですね。
</p>
<p><span id="more-693"></span></p>
<h3>インストール手順</h3>
<p>
  autotest コマンドをインストールします。rspec + autotest + インストール辺りでぐぐってください。<br />
  mac の人は autotest-fsevent を一緒にぶち込んでおくと良いのですが、<a href="http://github.com/svoop/autotest-fsevent" title="svoop's autotest-fsevent at master - GitHub">fsevent</a>の README により軽量な autotest コマンドのインストールガイドがあったのでそちらを参考にするのが良いかも知れません。<br />
  （RSpec2 beta + Rails 3 beta で偶然か動作しなかったため、私は ZenTest を継続利用中です）
</p>
<p>
  続いて <a href="http://github.com/sousk/autotest-any" title="sousk's autotest-any at master - GitHub">autotest-any</a>をローカルに落とします。<br />
  gem 化してません。サボってます。
</p>
<p>
  Symfony プロジェクトのルートディレクトリに移動し、autotest 用のディレクトリ autotest と設定ファイル .autotest を作成します。<br />
  ファイル群は autotest-ary/example 以下にあります。<br />
  ここで作成、配置するファイルはプロジェクトに応じて随時カスタマイズします。
</p>
<pre>
autotest
|-- dinolimetest_php.rb
`-- discover.rb
.autotest
</pre>
<p>
  .autotest を適宜書き換えてください。
</p>
<h3>挙動とカスタマイズ</h3>
<p>
  autotest はファイルとテストを対で覚えており、ファイルが更新されるとそれに該当するテストをテストコマンドに渡し、自動実行を行います。<br />
  $target_patterns はその監視対象とするファイルを指定するための正規表現集合です。<br />
  $exception_patterns はその通り、テスト実行や監視から外したいファイルを指定するための正規表現集合です。
</p>
<p>
  監視対象ファイルとテストファイルを結びつけているのは次の部分です。
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">at.<span style="color:#9900CC;">add_mapping</span><span style="color:#006600; font-weight:bold;">&#40;</span>$target_patterns<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>filename, _<span style="color:#006600; font-weight:bold;">|</span>
  testfiles = <span style="color:#006600; font-weight:bold;">&#91;</span>
    at.<span style="color:#9900CC;">find_local_unit_test</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>,
    at.<span style="color:#9900CC;">find_local_functional_test</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">&#93;</span>;
&nbsp;
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;src: #{filename}  -&amp;gt;  test: #{testfiles.join(', ')}&quot;</span>
  testfiles
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>
  filename は監視対象となるファイルのパスです。　<br />
  find_local_*_test(filename) により対となるテストファイルのパスを決定しています。　<br />
  弊社の、某プロジェクトのメンバーには便利なメソッドだと思います。<br />
  メソッドの中身は簡単な正規表現なので、ここでさくさくっと書いてしまうのも良いと思います。
</p>
<h3>red-green できゃっきゃうふふする</h3>
<p>
  あとは symfony のプロジェクトルートで autotest を実行するだけです。
</p>
<pre>
/Users/sou_sk/work/project/working% autotest
loading autotest/dinolimetest_php
style: DinolimetestPhp
src: lib/model/JobQueue/JqProcPeer.php  -&gt;  test: test/unit/lib/model/JobQueue/JqProcPeerUnitTest.php, test/functional/lib/model/JobQueue/JqProcPeerFunctionalTest.php
src: lib/model/JobQueue/JqJob.php  -&gt;  test: test/unit/lib/model/JobQueue/JqJobUnitTest.php, test/functional/lib/model/JobQueue/JqJobFunctionalTest.php
src: lib/proc/ProcTest.class.php  -&gt;  test: test/unit/lib/proc/ProcTestUnitTest.php, test/functional/lib/proc/ProcTestFunctionalTest.php
src: lib/model/JobQueue/JqJobPeer.php  -&gt;  test: test/unit/lib/model/JobQueue/JqJobPeerUnitTest.php, test/functional/lib/model/JobQueue/JqJobPeerFunctionalTest.php
src: lib/model/JobQueue/JqProc.php  -&gt;  test: test/unit/lib/model/JobQueue/JqProcUnitTest.php, test/functional/lib/model/JobQueue/JqProcFunctionalTest.php
src: lib/proc/ProcBase.class.php  -&gt;  test: test/unit/lib/proc/ProcBaseUnitTest.php, test/functional/lib/proc/ProcBaseFunctionalTest.php
src: lib/model/JobQueue/JqTask.php  -&gt;  test: test/unit/lib/model/JobQueue/JqTaskUnitTest.php, test/functional/lib/model/JobQueue/JqTaskFunctionalTest.php
src: lib/model/JobQueue/JqTaskPeer.php  -&gt;  test: test/unit/lib/model/JobQueue/JqTaskPeerUnitTest.php, test/functional/lib/model/JobQueue/JqTaskPeerFunctionalTest.php
src: lib/proc/ProcHaveALunch.class.php  -&gt;  test: test/unit/lib/proc/ProcHaveALunchUnitTest.php, test/functional/lib/proc/ProcHaveALunchFunctionalTest.php
php test/unit/lib/model/JobQueue/JqJobPeerUnitTest.php &amp;&amp; echo "----------------------" &amp;&amp; php test/functional/lib/proc/ProcHaveALunchFunctionalTest.php &amp;&amp; echo "----------------------" &amp;&amp; php test/functional/lib/model/JobQueue/JqProcPeerFunctionalTest.php &amp;&amp; echo "----------------------" &amp;&amp; php test/unit/lib/model/JobQueue/JqProcPeerUnitTest.php
</pre>
<p>
  といった形でテストが走ってくれれば成功です。<br />
  src: .. -&gt; test: .. はデバッグ用に表示しており、全ての監視対象ファイルとテストファイルを列挙しています。<br />
  最終ラインに表示されているのは実行コマンドで、ここに現れない場合はテストファイルが存在しない（パスが違う）可能性が濃厚です。<br />
  また autotest コマンドがぱたっと終了してしまう場合は、add_mapping のブロック内で何らかのエラーが発生している可能性を疑ってみてください。
</p>
<p>
  スクリーンが二面あるともっと幸せになれます。<br />
  ちなみに私は Dell の縦回転するディスプレイを用意して自動テストのログをだらだらと表示し、もう片面をテキストエディタで埋めてコーディングに没頭するのが好きです。ヘンな脳内麻薬が出てきますよ。お勧めです！<br />
  TextMate のようなショートカットからコマンドを実行出来るエディタ + AppleScript を使うとブラウザのリフレッシュまでコマンド一発、スクリーン固定で出来るのでもっとお勧めです。
</p>
<p>
  余談ついでに、autotest のような監視＆実行を行うツールとしては他に<br />
  <a href="http://github.com/mynyml/watchr" title="mynyml's watchr at master - GitHub">wathcr</a>や<br />
  弊社高原の <a href="http://openlab.dino.co.jp/2007/08/28/1018094.html" title="ゆとり時代のプログラミング環境(watchdir編)   &#8212; ディノオープンラボラトリ">watchdir</a>があります。<br />
  autotest でうまくいかない！ もっと他の方法がいい！という人はこちらもお試しください。</p>
<p>  autotest-any を作った後に watchr に気付きました、、、今から作るなら watchr かも知れません。</p>
<p>追記:<br />
<a href="http://gist.github.com/404686">TextMate の LimeTest 実行コマンド</a>を書きました。<br />
需要ある方はご利用ください。
</p>
<p>
株式会社ディノではテストフェチな開発者を絶賛募集中しています。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2010/05/13/144546693.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2010/05/13/144546693.html" />
	</item>
		<item>
		<title>Subversionのブランチ操作をgit並に簡単にする</title>
		<link>http://openlab.dino.co.jp/2010/04/07/225425663.html</link>
		<comments>http://openlab.dino.co.jp/2010/04/07/225425663.html#comments</comments>
		<pubDate>Wed, 07 Apr 2010 13:54:25 +0000</pubDate>
		<dc:creator>tumf</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

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

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=663</guid>
		<description><![CDATA[svnとgit両方使うようになりました。するとgitの便利さに感嘆する一方、svnのブランチ操作の面倒臭さが際立ってきました。特に、ブランチ操作ではgitは素晴らしく例えば以下のような例をご覧いただくとその差は一目瞭然か [...]]]></description>
			<content:encoded><![CDATA[<p>svnとgit両方使うようになりました。するとgitの便利さに感嘆する一方、svnのブランチ操作の面倒臭さが際立ってきました。特に、ブランチ操作ではgitは素晴らしく例えば以下のような例をご覧いただくとその差は一目瞭然かと思います。</p>
<p>ブランチ一覧を得る</p>
<pre>
git branch
</pre>
<pre>
svn list http://example.com/svn/branches
</pre>
<p>ブランチを作る</p>
<pre>
git branch mybranch
</pre>
<pre>
svn cp http://example.com/svn/trunk http://example.com/svn/branches/mybranch -m 'create mybranch from trunk'
</pre>
<p>以上のように、svnはブランチをブランチとして扱っていないためとても面倒なコマンドを打たなくてはなりません。これではとてもsvnのブランチなんて使ってられないのでとっととgitに移動したいところです。しかしながら、諸処の都合によりまだ、しばらくは両方使い続けなくてはならないため、svnのブランチ操作を簡単にする、svnbrというRubyスクリプトを書きました。</p>
<p><span id="more-663"></span></p>
<p>ソース: <a href="http://github.com/tumf/svn-utils/blob/master/svnbr" target="_blank">http://github.com/tumf/svn-utils/blob/master/svnbr</a></p>
<p>このスクリプトが利用出来るのは、/branches以下にブランチを作って/tags以下にタグを作る人向けです。殆どの人がこの構成を使っているはずですが、svnはこれ以外のパスにも自由にブランチやタグを作れますので（というより、タグとブランチの区別がない）ご注意ください。</p>
<p>使い方をざっと説明します。svnbrはすべてワーキングディレクトリの上で実行します。まず、何もつけずに実行するとブランチの一覧を表示します。</p>
<pre>
$ svnbr
mybranch-1.2
mybranch-2.x
*trunk
</pre>
<p>頭に*がついているブランチが現在のワーキングディレクトリのブランチです。svnbrでは、例外的に/trunkもブランチと同じ扱いをします。</p>
<p>次に、他のブランチにswitchしてみます。</p>
<pre>
$ svnbr sw mybranch-1.2
</pre>
<p>これは以下のコマンドを実行するのと同義です。</p>
<pre>
svn sw http://example.com/svn/branches/mybranch-1.2
</pre>
<p>もしsw先のブランチがなかったときはsvnのswと異なった挙動をします。</p>
<pre>
$ svnbr sw mybranch-1.3
</pre>
<p>これは以下のsvnコマンドと同義です。</p>
<pre>
svn cp http://example.com/svn/branches/mybranch-1.2 http://example.com/svn/branches/mybranch-1.3 ¥
-m 'make mybranch-1.3 branch from mybranch-1.2'
svn sw  http://example.com/svn/branches/mybranch-1.3
</pre>
<p>上記のように、現在のワーキングディレクトリのブランチをコピーしてsw先のブランチ作成し、swします。</p>
<p>以下のようにして、タグからブランチを作ることもできます。</p>
<pre>
$ svnbr sw mybranch-1.2 --from-tag=VERSION-1.2.3
</pre>
<p>mybranch-1.2をtrunkへマージするときも、svnコマンドと同様にできます。</p>
<pre>
$ svnbr sw trunk
$ svnbr merge mybranch-1.2 -c 4,5
</pre>
<p>いらなくなったブランチを消すには</p>
<pre>
$ svnbr rm mybranch-1.2
</pre>
<p>他にも、logを見る時には以下のようにします。</p>
<pre>
$ svnbr log mybranch-1.2
</pre>
<p>これは、以下のように&#8211;stop-on-copyをつけて実行します。</p>
<pre>
svn --stop-on-copy http://example.com/svn/branches/mybranch-1.2
</pre>
<p>ブランチのリネーム</p>
<pre>
$ svnbr mv mybranch-1.2 mybranch-1.3
</pre>
<p>これは、以下のように実行します。</p>
<pre>
svn mv http://example.com/svn/branches/mybranch-1.2 http://example.com/svn/branches/mybranch-1.3　¥
-m 'move branch mybranch-1.2 to mybranch-1.3'
</pre>
<p>以上のように、ざっくり作ったスクリプトなんで不具合等ありましたら申し訳ありません。<br />
githubにおいてあるので、是非forkして改良してくださいね。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2010/04/07/225425663.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2010/04/07/225425663.html" />
	</item>
		<item>
		<title>rsyncの-Cオプションの指示を上書きする</title>
		<link>http://openlab.dino.co.jp/2010/03/31/213840657.html</link>
		<comments>http://openlab.dino.co.jp/2010/03/31/213840657.html#comments</comments>
		<pubDate>Wed, 31 Mar 2010 12:38:40 +0000</pubDate>
		<dc:creator>hnw</dc:creator>
		
		<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=657</guid>
		<description><![CDATA[rsyncの-Cまたは--cvs-excludeオプションって便利ですよね。これは、下記のファイル・ディレクトリを転送対象から外す設定です。

                     RCS  SCCS  CVS  C [...]]]></description>
			<content:encoded><![CDATA[<p>rsyncの<code>-C</code>または<code>--cvs-exclude</code>オプションって便利ですよね。これは、下記のファイル・ディレクトリを転送対象から外す設定です。</p>
<blockquote><p>
                     RCS  SCCS  CVS  CVS.adm   RCSLOG   cvslog.*   tags   TAGS<br />
                     .make.state  .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak<br />
                     *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so  *.exe<br />
                     *.Z *.elc *.ln core .svn/ .git/ .bzr/
</p></blockquote>
<p>転送すると問題になりがちなファイルを転送対象から外せるので、普段はとても便利です（よく見るとEmacsユーザーにしか影響の無いファイル*.elcも混ざってますね）。でも、「上記のうち*.soだけは転送したい」なんて時はどうすればいいんでしょうか。</p>
<p>解決方法は色々あると思いますが、私はrsyncのオプションに「<code>--include-from=rsync_include.txt</code>」を追加し、rsync_include.txtを下記の内容で作成しました。</p>
<blockquote><p>*.so</p></blockquote>
<p>これで-Cにより他のファイルを転送しないままで*.soだけ転送するようにできます。バイナリ配布されている共有ライブラリをデプロイしたい状況で上記のように対処したので、小ネタとして記録しておきます。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2010/03/31/213840657.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2010/03/31/213840657.html" />
	</item>
		<item>
		<title>jquery.mockAjax でサーバ待ちしないさくさく開発を</title>
		<link>http://openlab.dino.co.jp/2010/02/10/150946638.html</link>
		<comments>http://openlab.dino.co.jp/2010/02/10/150946638.html#comments</comments>
		<pubDate>Wed, 10 Feb 2010 06:09:46 +0000</pubDate>
		<dc:creator>sou</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://openlab.dino.co.jp/?p=638</guid>
		<description><![CDATA[
ディノ日本酒調達部員の sou です。こんにちは。 今日はAjax開発に便利なjQueryプラグインを紹介します。


ディノも昨年から JavaScript 案件が増えており、本格的な JavaScript アプリケ [...]]]></description>
			<content:encoded><![CDATA[<p>
ディノ日本酒調達部員の sou です。こんにちは。 今日はAjax開発に便利なjQueryプラグインを紹介します。
</p>
<p>
ディノも昨年から JavaScript 案件が増えており、本格的な JavaScript アプリケーションも実装するようになってきました。ただ、サーバサイドのみの開発に比べるとXMLHttpRequest経由でサーバサイドとのつなぎ込みが発生するので、問題の切り分けや実装スケジュール調整など難しい点もあるのではないでしょうか。
</p>
<p>
そんな時には <a href="http://github.com/sousk/jquery.mockAjax">jquery.mockAjax プラグイン</a>が便利です。
</p>
<p><span id="more-638"></span></p>
<h3>
  概要<br />
</h3>
<p>
これを使うと $.ajax のリクエスト先を条件に従い振り分ける事が出来、スクリプトや HTML の書き換え無しにサーバ側への通信をカットし、<br />
ローカルファイルで用意した JSON や HTML フラグメントを代わりに持ってくる事が出来ます。
</p>
<p>
小さい＆単純なコードですが、これでサーバ側の実装に依存せずクライアント開発をさくさく進める事が出来ます。
</p>
<p>
また、クライアントとサーバ側の開発担当を分けるような場面でも、クライアント側が期待するレスポンスを具体的な JSON  として示すことが出来るので話が早く進んだり、<br />
開発中のサーバに接続出来ない環境でのデモを見せる際など、方々に活躍、、していた気がします！
</p>
<h3>
  使い方<br />
</h3>
<p>
  使い方は簡単、
</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">mockAjax</span><span style="color: #009900;">&#40;</span>
  <span style="color: #009900;">&#123;</span>
    cond<span style="color: #339933;">:</span> <span style="color: #009966; font-style: italic;">/\/search\?.*q=no_result/</span><span style="color: #339933;">,</span>
    method<span style="color: #339933;">:</span> <span style="color: #3366CC;">'get'</span><span style="color: #339933;">,</span>
    url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'/pseudo_data/search_response_no_result.json'</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
  <span style="color: #009900;">&#123;</span>
    cond<span style="color: #339933;">:</span> <span style="color: #3366CC;">'/map/search?q'</span><span style="color: #339933;">,</span>
    method<span style="color: #339933;">:</span> <span style="color: #3366CC;">'get'</span><span style="color: #339933;">,</span>
    url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'/pseudo_data/search_response.json'</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>
  のように引数の JSON で設定を与えます。 <br />
  リクエスト先 URL が cond の正規表現と method にマッチした場合、url に置き換えられます。 <br />
  検索語句によってレスポンスを変えたい！と言った場合にも、上記のようにして対応しています。
</p>
<p>
  興味を持たれた方は是非一度お試しください。 「他にこんなやり方もあるぜ！」といったツッコミ、情報もお待ちしております。
</p>
<p>
株式会社ディノではエンジニアを絶賛募集中です。</p>
]]></content:encoded>
			<wfw:commentRss>http://openlab.dino.co.jp/2010/02/10/150946638.html/feed</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://openlab.dino.co.jp/2010/02/10/150946638.html" />
	</item>
		<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>
	</channel>
</rss>

