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

<channel>
	<title>情報と音楽 &#187; labocho</title>
	<atom:link href="http://penguinlab.jp/blog/post/author/labocho/feed" rel="self" type="application/rss+xml" />
	<link>http://penguinlab.jp/blog</link>
	<description>labochoの日々のアウトプット</description>
	<lastBuildDate>Thu, 26 Jan 2012 12:51:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>新年のごあいさつ (おそい)</title>
		<link>http://penguinlab.jp/blog/post/2194</link>
		<comments>http://penguinlab.jp/blog/post/2194#comments</comments>
		<pubDate>Thu, 26 Jan 2012 12:51:48 +0000</pubDate>
		<dc:creator>labocho</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://penguinlab.jp/blog/?p=2194</guid>
		<description><![CDATA[もう来週は 2 月ですが、あけましておめでとうございます。 昨年は転職したのが一番おおきなイベントでした。人並みに働くのは体力的にしんどいですが、まあ、好きなことを仕事にできてるので、幸せなほうでしょう。 さて、昨年に掲げた目標をみてみましょう。 Web サービス作る夏くらいには 8 割方できてたんだけどほったらかし・・・。仕事がプログラミングだと、個人的なプログラミングはなかなか進まない。 身体を動かす趣味をつくる なにか習い事始めるこの 2 つについては、4 月からフェンシングを始めたので、目標達成。と思ってたんだけど、ここのところ全然行けてないので、今後はどうだろ。 ということで、いまいちな感じ。 では、今年の目標。 Web サービスつくる もう少し文章書く 無理しない 今年もよろしくお願いします。 &#160;]]></description>
			<content:encoded><![CDATA[
<p><a href="http://penguinlab.jp/blog/wp-content/uploads/2012nenga.png"><img class="alignnone size-medium wp-image-2205" title="2012nenga" src="http://penguinlab.jp/blog/wp-content/uploads/2012nenga-269x400.png" alt="" width="269" height="400" /></a></p>
<p>もう来週は 2 月ですが、あけましておめでとうございます。</p>
<p>昨年は転職したのが一番おおきなイベントでした。人並みに働くのは体力的にしんどいですが、まあ、好きなことを仕事にできてるので、幸せなほうでしょう。</p>
<p>さて、昨年に掲げた目標をみてみましょう。</p>
<ul>
	<li>Web サービス作る<br />夏くらいには 8 割方できてたんだけどほったらかし・・・。仕事がプログラミングだと、個人的なプログラミングはなかなか進まない。</li>
	<li>身体を動かす趣味をつくる</li>
	<li>なにか習い事始める<br />この 2 つについては、4 月からフェンシングを始めたので、目標達成。と思ってたんだけど、ここのところ全然行けてないので、今後はどうだろ。</li>
</ul>
<p>ということで、いまいちな感じ。</p>
<p>では、今年の目標。</p>
<ul>
	<li>Web サービスつくる</li>
	<li>もう少し文章書く</li>
	<li>無理しない</li>
</ul>
<p>今年もよろしくお願いします。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://penguinlab.jp/blog/post/2194/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails に XML をボディとするリクエストを JavaScript で送る</title>
		<link>http://penguinlab.jp/blog/post/2167</link>
		<comments>http://penguinlab.jp/blog/post/2167#comments</comments>
		<pubDate>Thu, 17 Nov 2011 13:03:07 +0000</pubDate>
		<dc:creator>labocho</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://penguinlab.jp/blog/?p=2167</guid>
		<description><![CDATA[Rails における XML でのリクエスト Rails に、Content-Type: application/xml で、ボディが XML のリクエストを送ると、コントローラ中では params に展開される。 # リクエスト # ヘッダはいろいろ省略してます POST /entries HTTP/1.1 Content-Type: application/xml &#60;?xml version="1.0" encoding="UTF-8"?&#62; &#60;entry&#62; &#60;body&#62;New blog entry&#60;/body&#62; &#60;/entry&#62; # EntriesController def create p params # =&#62; {"entry" =&#62; {"body" =&#62; "New blog entry"}, ... ... これは主に ActiveResource のための仕様だろうが、XML によるレコードのエクスポートとインポートを行う目的で、同じインターフェイスを HTML から使いたいと考えた。 JavaScript によるリクエスト HTML [...]]]></description>
			<content:encoded><![CDATA[<h3>Rails における XML でのリクエスト</h3>
<p>Rails に、Content-Type: application/xml で、ボディが XML のリクエストを送ると、コントローラ中では params に展開される。</p>
<code># リクエスト
# ヘッダはいろいろ省略してます
POST /entries HTTP/1.1
Content-Type: application/xml

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;entry&gt;
  &lt;body&gt;New blog entry&lt;/body&gt;
&lt;/entry&gt;
</code>
<code class="prettyprint lang-ruby"># EntriesController
def create
  p params # =&gt; {"entry" =&gt; {"body" =&gt; "New blog entry"}, ...
  ...
</code>
<p>これは主に ActiveResource のための仕様だろうが、XML によるレコードのエクスポートとインポートを行う目的で、同じインターフェイスを HTML から使いたいと考えた。</p>
<h3>JavaScript によるリクエスト</h3>
<p>HTML の form で Content-Type を application/xml にすることはできない (よね?) ので、jQuery を使って JavaScript で送る。</p>
<code class="prettyprint lang-js">// url に URL 文字列、
// xml に XML 文字列が格納されているものとする。
$.ajax({
  type: "POST",
  url: url,
  dataType: "xml", // Accept ヘッダをセットする。レスポンスを XML で受けとるなら必要。なくてもよい。
  contentType: "application/xml", // Content-Type を XML にする
  data: xml,
  success: function(res, type) { alert(res); },
  error: function(req, message, error){ alert(error); },       
});
</code>
<p>しかし、HTTP メソッドが GET 以外の場合、リクエストに含まれる authenticity_token をチェックし、無いか session[:authenticity_token] と一致しないと、session が空になってしまう (※)。</p>
<p>これは具合が悪いので authenticity_token を送信する方法を考える。</p>
<p>※ ApplicationController などで protect_from_forgery メソッドが呼ばれている場合。普通呼ばれてます。</p>
<h3>CSRF プロテクショントークンを送る</h3>
<p>form_for で作ったフォームには authenticity_token が hidden フィールドで格納されているので、そのまま submit すればよい。また、Ajax 通信でも、JSON で送るなら、送信するオブジェクトに authenticity_token プロパティを付与すればよい。この場合 authenticity_token は meta タグから取得する。</p>
<code class="prettyprint lang-html">&lt;!-- 最近の Rails (3 以降?) なら application.html.erb の head 要素にこんな記述があるはず --&gt;
&lt;%= csrf_meta_tag %&gt;
&lt;!-- これにより下記のような meta 要素が生成される --&gt;
&lt;meta content="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" name="csrf-token"&gt;
</code>
<code class="prettyprint lang-js">// jQuery でこれを取得する
var csrf_token = $("meta[name=csrf-token]").attr("content");
</code>
<p>しかし、XML はルート要素が 1 つと決められているし、ルート要素は params の 1 要素に納められてしまうため、リクエストボディに authenticity_token を含めることはできない。</p>
<p>そこで、authenticity_token をチェックしている<a href="https://github.com/rails/rails/blob/7fb99e5743d88c04357e09960d112376428a6faa/actionpack/lib/action_controller/metal/request_forgery_protection.rb" title="actionpack/lib/action_controller/metal/request_forgery_protection.rb at 7fb99e5743d88c04357e09960d112376428a6faa from rails/rails - GitHub" onclick="pageTracker._trackPageview('/outgoing/github.com/rails/rails/blob/7fb99e5743d88c04357e09960d112376428a6faa/actionpack/lib/action_controller/metal/request_forgery_protection.rb?referer=');">コード</a>をみてみる。</p>
<code class="prettyprint lang-ruby"># actionpack/lib/action_controller/metal/request_forgery_protection.rb
def verified_request?
  !protect_against_forgery? || request.get? ||
    form_authenticity_token == params[request_forgery_protection_token] ||
    form_authenticity_token == request.headers['X-CSRF-Token']
end
</code>
<p>どうやら X-CSRF-Token ヘッダにトークンを書いてもいいらしい。</p>
<p>jQuery.ajax は beforeSend オプションで、XMLHttpRequest オブジェクトを変更できるので、XMLHttpRequest.setRequestHeader() を使って X-CSRF-Token ヘッダを追加する。</p>
<code class="prettyprint lang-js">var csrf_token = $("meta[name=csrf-token]").attr("content");
$.ajax({
  type: "POST",
  url: url,
  dataType: "xml", // Accept
  contentType: "application/xml",
  beforeSend: function(xhr) {
    // X-CSRF-Token ヘッダのセット
    xhr.setRequestHeader("X-CSRF-Token", csrf_token)
  },
  data: xml,
  success: function(res, type) { alert(res); },
  error: function(req, message, error){ alert(error); },       
});
</code>
<p>これで OK。</p>
]]></content:encoded>
			<wfw:commentRss>http://penguinlab.jp/blog/post/2167/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Processing 環境の比較</title>
		<link>http://penguinlab.jp/blog/post/2113</link>
		<comments>http://penguinlab.jp/blog/post/2113#comments</comments>
		<pubDate>Fri, 30 Sep 2011 14:35:28 +0000</pubDate>
		<dc:creator>labocho</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[processing]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[花火]]></category>

		<guid isPermaLink="false">http://penguinlab.jp/blog/?p=2113</guid>
		<description><![CDATA[このところ、花火シミュレートアプリ HANABICS (Chrome で見てね) というのを開発している (仕事じゃないよ)。 Processing というフレームワークで動かしてるんだけど、開発の過程でいろいろな環境を渡り歩いたので、それぞれの特徴についてまとめてみる。 Processing について簡単に MIT メディアラボ開発のビジュアルプログラミング環境。ビジュアルアートに特化している。Processing.org の Exhibition から、Processing で作られたいろいろな映像作品が見られるので、感じをつかんでほしい。基本となる実装は Java の processing.core パッケージ。 Processing 言語 言語: 独自の言語 (ここでは Processing 言語と呼ぶ。ほぼ Java。) 実行環境: JRE / Java アプレット 配布: Processing.org 特記せずに Processing といえばこれ。開発環境は専用のIDE である PDE (Processing Development Environment) が配布されている。コードは Java のコードにトランスコンパイルされる。 // これくらいの規模だとサクっと書けてすばらしい // クラス使おうとすると茨の道 void setup() { size(640, 480, [...]]]></description>
			<content:encoded><![CDATA[<p>このところ、花火シミュレートアプリ <a href="http://penguinlab.jp/hanabics/" title="HANABICS">HANABICS</a> (Chrome で見てね) というのを開発している (仕事じゃないよ)。</p>
<p>Processing というフレームワークで動かしてるんだけど、開発の過程でいろいろな環境を渡り歩いたので、それぞれの特徴についてまとめてみる。</p>
<span id="more-2113"></span>
<h2>Processing について簡単に</h2>
<p>MIT メディアラボ開発のビジュアルプログラミング環境。ビジュアルアートに特化している。<a href="http://processing.org/" title="Processing.org" onclick="pageTracker._trackPageview('/outgoing/processing.org/?referer=');">Processing.org</a> の Exhibition から、Processing で作られたいろいろな映像作品が見られるので、感じをつかんでほしい。基本となる実装は Java の processing.core パッケージ。</p>
<h2>Processing 言語</h2>
<ul>
	<li>言語: 独自の言語 (ここでは Processing 言語と呼ぶ。ほぼ Java。)</li>
	<li>実行環境: JRE / Java アプレット</li>
	<li>配布: <a href="http://processing.org/" title="Processing.org" onclick="pageTracker._trackPageview('/outgoing/processing.org/?referer=');">Processing.org</a></li>
</ul>
<p>特記せずに Processing といえばこれ。開発環境は専用のIDE である PDE (Processing Development Environment) が配布されている。コードは Java のコードにトランスコンパイルされる。</p>
<code class="prettyprint lang-java">// これくらいの規模だとサクっと書けてすばらしい
// クラス使おうとすると茨の道

void setup() {
  size(640, 480, P2D);
  colorMode(HSB, 100);
  background(0);
}

void draw() {
  noStroke();
  
  rectMode(CORNER);
  fill(0, 5);
  rect(0, 0, width, height);

  rectMode(CENTER);
  fill(random(100), 60, 100);
  rect(random(width), random(height), 40, 40);
}
</code>
<h3>利点</h3>
<ul>
	<li>配布が容易<br />Windows / Mac / Linux で動く実行ファイル、Java アプレットが容易に作成できる。また、後述のように Processing.js でも動作可能。</li>
	<li>もっともサポートが期待できる<br />本家なので、将来的にもっともサポートが期待できる。と思う。</li>
	<li>可搬性がある<br />Processing 言語で書かれたコードは Processing.js でそのまま動く。スマートフォン用の Processing 実行環境などが開発されてもそのまま動くと期待できる。</li>
	<li>速度は Java とともに最速<br />Java のコードに変換されて動くので速度は Java と同じ。</li>
	<li>小規模プロジェクトなら簡潔<br />簡単なプロジェクトなら Java より簡潔に書ける。</li>
</ul>
<h3>欠点</h3>
<ul>
	<li>ある程度の規模のプロジェクトになると問題がある<br />クラスもつくれるが、Java の内部クラスになるため、扱いが難しい。<br />デバッガといえるものがない。<br />複数ファイルのプロジェクトでも、それぞれのファイルを単純に連結するため、エラー時の行番号がわかりにくい、パーサの仕様で color() メソッドが定義できないなど、妙なところでひっかかる。</li>
</ul>
<h2>ruby-processing</h2>
<ul>
	<li>言語: Ruby</li>
	<li>実行環境: JRE + JRuby + ruby-processing gem</li>
	<li>配布: <a href="https://github.com/jashkenas/ruby-processing" title="jashkenas/ruby-processing - GitHub" onclick="pageTracker._trackPageview('/outgoing/github.com/jashkenas/ruby-processing?referer=');">jashkenas/ruby-processing &#8211; GitHub</a></li>
</ul>
<p>JRuby で Processing のライブラリを扱う。最大の特徴は、リアルタイムでコードの書き換えが反映されること。</p>
<code class="prettyprint lang-ruby"># Processing 言語よりもさらに簡潔
# クラスも繰り返しも書きやすいし

def setup
  size 640, 480, P2D
  colorMode HSB, 100
  background 0
end

def draw
  noStroke

  rectMode CORNER
  fill 0, 5
  rect 0, 0, width, height

  rectMode CENTER
  fill random(100), 60, 100
  rect random(width), random(height), 40, 40
end</code>
<code class="prettyprint lang-ruby"># 明示的にクラスを作る書き方もできる
# ちょっと規模が大きくなってきたらこっちのがわかりやすい

class ProcessingDemo &lt; Processing::App
  def setup
    size 640, 480, P2D
    colorMode HSB, 100
    background 0
  end
  
  def draw
    noStroke

    rectMode CORNER
    fill 0, 5
    rect 0, 0, width, height

    rectMode CENTER
    fill random(100), 60, 100
    rect random(width), random(height), 40, 40
  end
end

ProcessingDemo.new :title => "ProcessingDemo", :width => 640, :height => 480
</code>
<h3>利点</h3>
<ul>
	<li>Ruby なので書きやすい<br />好みだけど、当方 Rubyist なので。</li>
	<li>リアルタイムでコードの書き換えが反映される<br />これ実際やってみると楽しい。パラメータの調整がしやすいというわかりやすい利点も。</li>
</ul>
<h3>欠点</h3>
<ul>
	<li>配布が現実的でない<br />実行環境を整えるのは開発者でないと厳しい。手元の環境で動かすのが前提ですかね。</li>
	<li>Java に比べると遅い<br />Ruby だからか、大量のオブジェクトを扱うと Java に比べて遅くなる。HANABICS では結構多めのパーティクルを扱うので、目に見えてフレームレートが落ちた。</li>
</ul>
<h2>Java</h2>
<ul>
	<li>言語: Java</li>
	<li>実行環境: JRE / Java アプレット</li>
	<li>参考: <a href="http://processing.org/learning/eclipse/" title="Processing in Eclipse \ Processing.org" onclick="pageTracker._trackPageview('/outgoing/processing.org/learning/eclipse/?referer=');">Processing in Eclipse \ Processing.org</a></li>
</ul>
<p>Java のプロジェクトで processing.core をインポートして使う。</p>
<code class="prettyprint lang-java">// Processing 言語とほぼ同じ

import processing.core.*;

public class ProcessingDemo extends PApplet{
  public void setup() {
    size(640, 480, P2D);
    colorMode(HSB, 100);
    background(0);
  }

  public void draw() {
    noStroke();

    rectMode(CORNER);
    fill(0, 5);
    rect(0, 0, width, height);

    rectMode(CENTER);
    fill(random(100), 60, 100);
    rect(random(width), random(height), 40, 40);
  }
}
</code>
<h3>利点</h3>
<ul>
	<li>Processing 言語でなく、フル機能の Java が使える</li>
	<li>Eclipse などの IDE が使える<br />デバッガ使えるのは便利ですね。</li>
	<li>速度は Processing 言語とともに最速</li>
</ul>
<h3>欠点</h3>
<ul>
	<li>配布が面倒<br />Java プログラマでない私には PDE と同等のコンパイルはできなかった (特に OpenGL を使う場合)。Java プログラマならできると思うけど、PDE に比べると面倒であるのは間違いない。</li>
	<li>Java が面倒<br />好みによるけど、Java が冗長で面倒。</li>
</ul>
<h2>Processing.js</h2>
<ul>
	<li>言語: Processing 言語 / JavaScript</li>
	<li>実行環境: Web ブラウザ</li>
	<li>配布: <a href="http://processingjs.org/" title="Processing.js" onclick="pageTracker._trackPageview('/outgoing/processingjs.org/?referer=');">Processing.js</a></li>
</ul>
<p>JavaScript による実装。canvas 要素に描画する。3D コンテキストの場合 WebGL が使える。Processing 言語のコードも動くし、JavaScript でも書ける (私は CoffeeScript で書いてる)。ちなみに開発は jQuery や Env.js でおなじみ John Resig 氏。</p>
<code class="prettyprint lang-js">/*
下記の canvas とライブラリの読み込みがあるものとする
&lt;canvas id="processing-canvas" /&gt;
&lt;script src="processing.js"&gt;&lt;/script&gt;
this 多すぎなのが JS らしい
*/

(function(){
  var canvas = document.getElementById("processing-canvas");
  new Processing(canvas, function(p5){
    p5.setup = function(){
      this.size(640, 480, this.P2D);
      this.colorMode(this.HSB, 100);
      this.background(0);
    };
    p5.draw = function(){
      this.noStroke();

      this.rectMode(this.CORNER);
      this.fill(0, 5);
      this.rect(0, 0, this.width, this.height);

      this.rectMode(this.CENTER);
      this.fill(this.random(100), 60, 100);
      this.rect(this.random(this.width), this.random(this.height), 40, 40);
    };
  })
}());
</code>
<code class="prettyprint lang-ruby"># 同じものを CoffeeScript で書いた例
# まあこれくらいだとあんまり変わんないけど (this. が @ になっただけでも読みやすいけど)、
# クラス (的なもの) を作ったり、for 文が多かったりするとだいぶ楽

canvas = document.getElementById("processing-canvas")
new Processing canvas, (p5) -&gt;
  p5.setup =  -&gt;
    @size(640, 480, @P2D)
    @colorMode(@HSB, 100)
    @background(0)
  p5.draw = -&gt;
    @noStroke()

    @rectMode(@CORNER)
    @fill(0, 5)
    @rect(0, 0, @width, @height)

    @rectMode(@CENTER)
    @fill(@random(100), 60, 100)
    @rect(@random(@width), @random(@height), 40, 40)
</code>
<p>※ Processing 言語のコード例は省略。そのまま動きます。</p>
<h3>利点</h3>
<ul>
	<li>配布が容易<br />とにかくブラウザだけで動くのは他にはない利点 (Java アプレットもブラウザで動くけど、起動が重い、環境によっては JRE のインストールが必要など敷居が高い)。2D なら iOS の Mobile Safari でも動く。</li>
	<li>JavaScript で書ける<br />好みだけど Java や Processing 言語より簡潔に書ける (特に CoffeeScript を使用した場合)。</li>
	<li>JavaScript の開発環境が使える<br />JavaScript で記述するなら JavaScript 用の開発環境が使える。CoffeeScript で書けるというのもこの特徴ゆえ。</li>
</ul>
<h3>欠点</h3>
<ul>
	<li>速度が遅い<br />これのみ、実行環境が Java でなく JavaScript なので、どうしても遅い。といっても多くのケースには実用的な速度だと思うけど。</li>
	<li>非対応環境が多い<br />まず IE では (そのままでは) 動かない。また 3D コンテキストを使うには、WebGL 対応ブラウザ (Firefox か Chrome) と OpenGL 2.0 対応ビデオカードが必要で、環境を選ぶ (しかも Chrome に比べると Firefox ではあんまり綺麗に描画されない)。ただ、今後は対応環境が増えていくと思う。</li>
	<li>Java のライブラリ<br />当然だけど、Java のライブラリは使えない。かわりに JavaScript のライブラリは使えるけどまあ比較にならない。</li>
	<li>拡張ライブラリ<br />カメラの画像取り込みなど Processing の拡張ライブラリも使えない。これらを使用する場合、完全に選択肢からはずれる。</li>
</ul>
<h2>まとめ</h2>
<p>表にまとめるとこんな感じ。かなり主観ですが。</p>
<table>
<tbody>
<tr>
<th>環境</th>
<th>言語</th>
<th>拡張性</th>
<th>構造化</th>
<th>デバッグ</th>
<th>速度</th>
<th>配布</th>
</tr>
<tr>
<td>Processing</td>
<td>Processing 言語 (ほぼ Java)</td>
<td>○</td>
<td>×</td>
<td>×</td>
<td>○</td>
<td>○</td>
</tr>
<tr>
<td>Java</td>
<td>Java などの JVM 言語</td>
<td>○</td>
<td>○</td>
<td>○</td>
<td>○</td>
<td>△</td>
</tr>
<tr>
<td>ruby-processing</td>
<td>Ruby</td>
<td>○</td>
<td>○</td>
<td>○</td>
<td>△</td>
<td>×</td>
</tr>
<tr>
<td>Processing.js</td>
<td>Processing 言語 / JavaScript</td>
<td>×</td>
<td>○</td>
<td>○</td>
<td>△</td>
<td>○</td>
</tr>
</tbody></table>
<p>私は開発・配布の容易さと将来性から Processing.js (+ CoffeeScript) で書いている。Java に精通した人なら Java もいいと思う。</p>
<p>ちなみに、上の表でもさらっと書いたけど、processing.core は単に Java のパッケージなので、JVM で動く他の言語、Jython、Scala、Clojure なんかでも動く (はず)。Scala については、<a href="http://spde.technically.us/Spde.html" title="Spde: Spde" onclick="pageTracker._trackPageview('/outgoing/spde.technically.us/Spde.html?referer=');">Spde</a> という PDE 相当の IDE もある。</p>
]]></content:encoded>
			<wfw:commentRss>http://penguinlab.jp/blog/post/2113/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyKaigi 2011 メモ (2 日目)</title>
		<link>http://penguinlab.jp/blog/post/2091</link>
		<comments>http://penguinlab.jp/blog/post/2091#comments</comments>
		<pubDate>Thu, 21 Jul 2011 16:06:53 +0000</pubDate>
		<dc:creator>labocho</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://penguinlab.jp/blog/?p=2091</guid>
		<description><![CDATA[RubyKaigi 2011 のメモ、2 日目です。rubykaigi.org に録画があることに気づいたので、リンクをつけてます。 安全なプログラムのつくりかた 安全なプログラムの作り方 &#124; 日本Ruby会議2011(7月16日〜18日) 西山 和広 1995 頃、Perl / CGI で BBS 作成 入力の HTML エスケープ、フィルタリング onclick、javascript: の普及で危険に 対策 入力チェック 出力はエスケープ 環境の変化に注意 javascript URL http / https へのリンクのみ許可 GET は冪等 (副作用なし) js / form なしでアクセスさせられるため GET で削除するようにしてたらクローラに削除された例も /tmp を避ける tmp 直下危険 固定のファイル名は特に危険 symlink attack Windows では /tmp ないし tmpdir tempfile [...]]]></description>
			<content:encoded><![CDATA[<p>RubyKaigi 2011 のメモ、2 日目です。rubykaigi.org に録画があることに気づいたので、リンクをつけてます。</p>
<p><span id="more-2091"></span></p>
<h3>安全なプログラムのつくりかた</h3>
<p><a title="安全なプログラムの作り方 | 日本Ruby会議2011(7月16日〜18日)" href="http://rubykaigi.org/2011/ja/schedule/details/17M01" onclick="pageTracker._trackPageview('/outgoing/rubykaigi.org/2011/ja/schedule/details/17M01?referer=');">安全なプログラムの作り方 | 日本Ruby会議2011(7月16日〜18日)</a></p>
<ul>
	<li>西山 和広</li>
</ul>
<ul>
	<li>1995 頃、Perl / CGI で BBS 作成
<ul>
	<li>入力の HTML エスケープ、フィルタリング</li>
	<li>onclick、javascript: の普及で危険に</li>
</ul>
</li>
</ul>
<ul>
	<li>対策
<ul>
	<li>入力チェック</li>
	<li>出力はエスケープ</li>
	<li>環境の変化に注意</li>
</ul>
</li>
</ul>
<ul>
	<li>javascript URL
<ul>
	<li>http / https へのリンクのみ許可</li>
</ul>
</li>
</ul>
<ul>
	<li>GET は冪等 (副作用なし)
<ul>
	<li>js / form なしでアクセスさせられるため</li>
	<li>GET で削除するようにしてたらクローラに削除された例も</li>
</ul>
</li>
</ul>
<ul>
	<li>/tmp を避ける
<ul>
	<li>tmp 直下危険</li>
	<li>固定のファイル名は特に危険</li>
	<li>symlink attack</li>
	<li>Windows では /tmp ないし</li>
	<li>tmpdir tempfile つかう</li>
	<li>rails なら Rails.root + &#8220;tmp&#8221; でも</li>
</ul>
</li>
</ul>
<ul>
	<li>パーミッションは最小限に。
<ul>
	<li>tmp 直下にソケット作って誰でもアクセスできる状態になっていた例</li>
	<li>umask でデフォルトを最小限のパーミッションに</li>
	<li>コードの所有者と、アップロードファイルなどの所有者を変えて、権限を設定する
<ul>
	<li>脆弱性があった場合に、コードの改変を変えられる可能性がある</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>正規表現によるチェック
<ul>
	<li>予期しないものをスルーしないように</li>
	<li>\w より [A-Za-z0-9] のほうが明確</li>
	<li>[[:alnum]] でも</li>
</ul>
</li>
</ul>
<ul>
	<li>任意のユーザー入力から正規表現を生成するのは危険
<ul>
	<li>パターンによっては DoS 可能</li>
</ul>
</li>
</ul>
<ul>
	<li>コンソールへ任意の出力を許すのは危険。
<ul>
	<li><a href="http://www.ruby-lang.org/ja/news/2010/01/10/webrick-escape-sequence-injection/" onclick="pageTracker._trackPageview('/outgoing/www.ruby-lang.org/ja/news/2010/01/10/webrick-escape-sequence-injection/?referer=');">WEBrick のエスケープシーケンスの脆弱性</a></li>
	<li>rvm でも (<a href="http://jvn.jp/jp/JVN30414126/" onclick="pageTracker._trackPageview('/outgoing/jvn.jp/jp/JVN30414126/?referer=');">JVM#30414126</a>)</li>
	<li>ログ、コンソールへの出力は String#dump で出力</li>
</ul>
</li>
</ul>
<ul>
	<li>コマンドライン処理でのエスケープ</li>
<ul>
	<li>1. コードとしてのエスケープ</li>
	<li>2. シェルが処理するエスケープ</li>
	<li>3. 起動するプログラムが処理するエスケープ</li>
</ul>
</ul>
<ul>
<ul>
	<li>複数引数の system つかう</li>
	<li>ファイル名に空白があっても良いか、ファイル名が &#8211; から始まってもよいか &#8216;&#8221;*\0 などが入っていても良いか</li>
</ul>
</ul>
<ul>
<ul>
	<li>シェルによる違い
<ul>
	<li>foo=&#8221;aaa bbb&#8221;</li>
	<li>some foo</li>
	<li>だとシェルによって aaa と bbb だったり、aaa bbb だったり。</li>
	<li>ARGV で確認</li>
</ul>
</li>
</ul>
</ul>
<h3>jpmobileのベストプラクティス</h3>
<p><a href="http://rubykaigi.org/2011/ja/schedule/details/17M02" onclick="pageTracker._trackPageview('/outgoing/rubykaigi.org/2011/ja/schedule/details/17M02?referer=');">jpmobileのベストプラクティス | 日本Ruby会議2011(7月16日〜18日)</a></p>
<ul>
	<li>
<p>小川 伸一郎</p></li>
</ul>
<ul>
	<li><a href="https://github.com/jpmobile/jpmobile" onclick="pageTracker._trackPageview('/outgoing/github.com/jpmobile/jpmobile?referer=');">https://github.com/jpmobile/jpmobile</a></li>
</ul>
<ul>
	<li>らくらく連絡網
<ul>
	<li>RoR + jpmobile</li>
	<li>MySQL / TokyoTyrant / memcached</li>
	<li>Apache/ nginx</li>
</ul>
</li>
</ul>
<ul>
	<li>emoji / kanji 変換
<ul>
	<li>view を utf8 で書くとキャリアごとに変換して返す
<ul>
	<li>docomo なら utf-8 -&gt; sjis</li>
</ul>
</li>
	<li>リクエストもそれぞれの文字コードから utf8 にする</li>
</ul>
</li>
</ul>
<ul>
<ul>
	<li>rack ミドルウェアで実現
<ul>
	<li>mobile_carrier</li>
	<li>params_filter</li>
</ul>
</li>
</ul>
</ul>
<ul>
<ul>
	<li>Rails.application.config.jpmobile.mobile_filter
<ul>
	<li>を initializer に書く</li>
</ul>
</li>
</ul>
</ul>
<ul>
	<li>session id
<ul>
	<li>a なら url 埋め込み</li>
	<li>form なら hidden に埋め込み</li>
	<li>cookie が使えないときのみ</li>
</ul>
</li>
</ul>
<ul>
	<li>view selecter
<ul>
	<li>規約にそってファイルを探す。</li>
	<li>index_mobile_docomo.html.erb みたいな</li>
	<li>controller で include Jpmobile::ViewSelector</li>
	<li>disable_mobile_view! で探索を拒否することも</li>
	<li>layout / partial も対応</li>
</ul>
</li>
</ul>
<ul>
	<li>japanese mail
<ul>
	<li>body, subject は iso2022jp</li>
	<li>subject は base64 エンコード</li>
	<li>ヘッダは 76 文字 / 行である必要
<ul>
	<li>エンコード後に折り返すと復元に失敗する場合あり</li>
	<li>エンコード前に折り返し</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>emoticon
<ul>
	<li>docomo: sjis</li>
	<li>au: jis</li>
	<li>sb: utf8</li>
	<li>Unicode の私用領域に独自のコードでマッピング</li>
</ul>
</li>
</ul>
<ul>
	<li>Jpmobile::Mail::Base
<ul>
	<li>メールアドレスによって文字コード切り替え</li>
</ul>
</li>
</ul>
<ul>
	<li>Testing
<ul>
	<li>functional test
<ul>
	<li>template</li>
	<li>request.mobile?</li>
	<li>assert_template (&gt;1.0.0.7pre7)</li>
	<li>charset
<ul>
	<li>rack を通過しないので utf-8</li>
	<li>integration test では変換される</li>
</ul>
</li>
</ul>
</li>
	<li>unit test
<ul>
	<li>mailer
<ul>
	<li>mail オブジェクトの段階では utf-8</li>
	<li>デリバリー後、@emails.first.to_s なら変換後</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>known issue
<ul>
	<li>文字コード変換に非可逆のケース</li>
	<li>link_to に utf8 文字列を渡す場合は、そのままだと、docomo からのリクエストに utf8 文字が含まれることになってしまうためエラーや文字化け</li>
	<li>メールで charset がわからない場合、iso1022jp に決めうちなどの対策をとらないとエンコーディングエラー</li>
</ul>
</li>
</ul>
<ul>
	<li>質疑
<ul>
	<li>rfc違反メールにも対応</li>
	<li>unicode 絵文字
<ul>
	<li>1.8 では扱えないので、1.8 対応の必要がなくなれば対応したい。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>Writing Friendly Libraries</h3>
<p><a href="http://rubykaigi.org/2011/ja/schedule/details/17S03" onclick="pageTracker._trackPageview('/outgoing/rubykaigi.org/2011/ja/schedule/details/17S03?referer=');">Writing Friendly Libraries | 日本Ruby会議2011(7月16日〜18日)</a></p>
<p>参照: <a href="http://blog.segment7.net/2008/12/17/friendly-ruby-objects" onclick="pageTracker._trackPageview('/outgoing/blog.segment7.net/2008/12/17/friendly-ruby-objects?referer=');">Friendly Ruby Objects</a></p>
<ul>
	<li><a href="http://twitter.com/drbrain" onclick="pageTracker._trackPageview('/outgoing/twitter.com/drbrain?referer=');">@drbrain</a>
<ul>
	<li><a href="http://blog.segment7.net/" onclick="pageTracker._trackPageview('/outgoing/blog.segment7.net/?referer=');">Segment 7</a></li>
	<li>90 unique gems</li>
	<li>Serious lib (works)</li>
	<li>Joke lib</li>
</ul>
</li>
</ul>
<ul>
	<li>Conventions
<ul>
	<li>ほかのライブラリの規約に従う</li>
	<li>LibraryName::Extention</li>
	<li>bin/executable</li>
</ul>
</li>
</ul>
<ul>
	<li>Version
<ul>
	<li>major.minor.revision</li>
	<li>major: 非互換変更</li>
	<li>minor: 新機能</li>
	<li>revision: バグフィックス</li>
</ul>
</li>
</ul>
<ul>
	<li>使いやすく
<ul>
	<li>実際に使う人が使いやすく</li>
	<li>ruby がどうやってるか参考にする</li>
</ul>
</li>
</ul>
<ul>
	<li>Printable
<ul>
	<li>to_s: 人間が読む用</li>
	<li>inspect: デバッグ用</li>
	<li>pretty_print: 巨大な構造を表現</li>
</ul>
</li>
</ul>
<ul>
	<li>Comparable
<ul>
	<li>==</li>
	<li>&lt;=&gt; と Comparable</li>
	<li>==** と~ をマッチ用に</li>
</ul>
</li>
</ul>
<ul>
	<li>Hashable
<ul>
	<li>hash と eql?</li>
	<li>Array unique</li>
	<li>Array deferable</li>
	<li>each と Enumerable</li>
</ul>
</li>
</ul>
<ul>
	<li>Enumerator
<ul>
	<li>enum_for と Enumerable</li>
</ul>
</li>
</ul>
<ul>
	<li>Chanable
<ul>
	<li>enum.map.with_index &#8230;</li>
	<li>return enum_for __method__unless block_given?</li>
</ul>
</li>
</ul>
<ul>
	<li>Exceptions
<ul>
	<li>Common subclass (ArgmentError とか)を使う</li>
	<li>なぜ例外が起こったのか伝える</li>
	<li>例外オブジェクトに例外に関係のあるデータをくっつける
<ul>
	<li>(ActiveRecord::RecordInvalid なら record メソッドで原因となったオブジェクトが得られる)</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>initialize_copy
<ul>
	<li>dup や clone から作られる</li>
	<li>deep copy</li>
	<li>共有状態の管理</li>
</ul>
</li>
</ul>
<ul>
	<li>Marshal
<ul>
	<li>compact で fast に</li>
	<li>ガイドライン
<ul>
	<li>Arrray か ハッシュで</li>
	<li>marshal_dump は better</li>
	<li>VERSION を必ずつける
<ul>
	<li>互換性</li>
	<li>新機能追加しやすい</li>
	<li>古いデータをこわさない</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>メンテしやすさ
<ul>
	<li>引き継ぎのためにも</li>
	<li>do one thing</li>
	<li>書きやすい</li>
	<li>読みやすい</li>
	<li>再利用しやすさを最大化</li>
</ul>
</li>
</ul>
<ul>
	<li>Release note
<ul>
	<li>important changes</li>
	<li>new features</li>
	<li>bug fixes</li>
	<li>Change log とは異なる、機能、変更ベースで</li>
</ul>
</li>
</ul>
<ul>
	<li>テストせよ
<ul>
	<li>testcase</li>
	<li>abstract test case</li>
	<li>実装</li>
</ul>
</li>
</ul>
<ul>
	<li>bin/executable は最小限に
<ul>
	<li>実際の処理は lib 下に集約</li>
</ul>
</li>
</ul>
<ul>
	<li>後方互換
<ul>
	<li>api と実装をわける</li>
	<li>api レイヤーで互換性を保持する</li>
	<li>less api class better : api に関わるクラスを少なくしよう</li>
</ul>
</li>
</ul>
<ul>
	<li>C Extentsion
<ul>
	<li>C は難しくリファクタリングしにくい</li>
	<li>できるだけ ruby で書く</li>
</ul>
</li>
</ul>
<ul>
	<li>Documentation
<ul>
	<li>API を書く</li>
	<li>内部実装は隠す</li>
	<li>example をつけよう</li>
</ul>
</li>
</ul>
<ul>
	<li>Extensibility
<ul>
	<li>Hooks
<ul>
	<li>callback のしくみを入れる (ActiveRecord.before_save みたいな)</li>
	<li>subclass を作って override method (ActiveRecord#before_save みたいな)</li>
</ul>
</li>
	<li>Plugins
<ul>
	<li>hooks の登録</li>
	<li>Gem.find_files を使って load する</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>Release
<ul>
	<li>README
<ul>
	<li>description</li>
	<li>bugtracker</li>
	<li>source repository</li>
	<li>url</li>
</ul>
</li>
	<li>Release notes
<ul>
	<li>機能の変化、非互換姓</li>
</ul>
</li>
	<li>Automation
<ul>
	<li>test</li>
	<li>manifest</li>
	<li>gem create / upload</li>
	<li>tag release</li>
	<li>update doc</li>
</ul>
</li>
	<li>use libraries
<ul>
	<li>自動化しよう</li>
	<li>コピペするな</li>
</ul>
</li>
	<li>Hoe というライブラリ
<ul>
	<li><a href="https://github.com/seattlerb/hoe" onclick="pageTracker._trackPageview('/outgoing/github.com/seattlerb/hoe?referer=');">https://github.com/seattlerb/hoe</a></li>
	<li>rake release VERSION=x.y.z で全部チェック</li>
	<li>プラグインもあるし設定も DRY</li>
	<li>git / isolate (bundler) / minitest / email などのプラグインあり</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>質疑
<ul>
	<li>news と chage log が違うのになぜ news をすすめる?
<ul>
	<li>changelog は多すぎる revert もあるし</li>
	<li>news はユーザ向け、changelog は (ライブラリ自体の) 開発者むけ</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>C はどういうときに使う?
<ul>
	<li>C library のラッパか、高速処理のため。前者をよくかく。</li>
</ul>
</li>
</ul>
<ul>
	<li>ユーザーからフィードバックを得るための tips があれば
<ul>
	<li>prerelease 版という手もあるけど使う人すくない</li>
	<li>bug tracker を使いやすくする
<ul>
	<li>自分が、じゃなく、ユーザーが。</li>
</ul>
</li>
	<li>bug tracker だけでなく ML を作るのもよい</li>
	<li>rubyforge より github のが好き
<ul>
	<li>github issues は使えるようになった</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>ライブラリが使うリソースはどこに置くべきか
<ul>
	<li>rubygems に data_dir というメソッドがあるのでそれを使う</li>
	<li>ふつう shared だけど記憶あいまい</li>
</ul>
</li>
</ul>
<h3>Use rails_best_practices to refactor your rails codes</h3>
<p><a href="http://rubykaigi.org/2011/ja/schedule/details/17S04" onclick="pageTracker._trackPageview('/outgoing/rubykaigi.org/2011/ja/schedule/details/17S04?referer=');">Use rails_best_practices to refactor your rails codes | 日本Ruby会議2011(7月16日〜18日)</a></p>
<ul>
	<li><a href="http://twitter.com/flyerhzm" onclick="pageTracker._trackPageview('/outgoing/twitter.com/flyerhzm?referer=');">@flyerhzm</a>/ Richard Huang
<ul>
	<li><a href="http://huangzhimin.com/" onclick="pageTracker._trackPageview('/outgoing/huangzhimin.com/?referer=');">huangzhimin.com</a></li>
	<li>openfeint</li>
</ul>
</li>
</ul>
<ul>
	<li>RailsConf in Shang-hai で @ihower が <a href="http://www.slideshare.net/ihower/rails-best-practices" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/ihower/rails-best-practices?referer=');">Rails best practice </a>という発表
<ul>
	<li>チェック、実践が大変</li>
	<li>それを簡単にする gem を作成、全部ではない</li>
	<li>code checker が 28 人いる</li>
</ul>
</li>
</ul>
<ul>
	<li><a href="http://rails-bestpractices.com/" onclick="pageTracker._trackPageview('/outgoing/rails-bestpractices.com/?referer=');">rails-bestpractices.com</a>でベストプラクティスを共有している
<ul>
	<li>70 practices</li>
	<li>gem document</li>
	<li>gem blog</li>
</ul>
</li>
</ul>
<ul>
	<li>使いかた
<ul>
	<li>gem install rails_best_practices</li>
	<li>cd rails_project</li>
	<li>rails_best_practices</li>
	<li>plain でも html でも出力
<ul>
	<li>html は解決法への url つき</li>
	<li>該当箇所をエディタで開ける</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>なぜ使うのか
<ul>
	<li>美しいコードを書くため</li>
	<li>チームでの開発のため</li>
	<li>コード規約
<ul>
	<li>コードレビューの一部を自動化でき、本質だけに言及できる</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>解析ツールについて
<ul>
	<li>java には checkstyle</li>
	<li>ruby には saikuro / flog / flay / reek / roodi などがある</li>
	<li>この gem は rails 開発チームに特価している</li>
</ul>
</li>
</ul>
<ul>
	<li>How works
<ul>
	<li>行末の空白などの lixical チェック</li>
	<li>sexp (symbol expression) に変換して、モデル名や関連のチェック</li>
	<li>ベストプラクティスのチェック</li>
	<li>sexp は ruby_parser で作る (rails_best_practice blog 内 play with sexp)</li>
</ul>
</li>
</ul>
<ul>
	<li>設定
<ul>
	<li>rails_best_practices -g</li>
	<li>config/rails_vest_practices.yml がつくられるので、チェックしないプラクティスをコメントすればよい。</li>
</ul>
</li>
	<li>拡張
<ul>
	<li>github の wiki にチュートリアルつけてる</li>
</ul>
</li>
</ul>
<ul>
	<li>質疑
<ul>
	<li>プロジェクトの一部に対して、テストの内容を限定することはできるか
<ul>
	<li>パターンの除外はコマンドでできるけど、特定のディレクトリとかは未実装</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<ul>
	<li>ruby のバージョンが変わったときにパーサが対応できるか
<ul>
	<li>たぶん。ripper 使うかも。</li>
</ul>
</li>
</ul>
</ul>
<h3>BDD style Unit Testing</h3>
<p><a href="http://rubykaigi.org/2011/ja/schedule/details/17M05" onclick="pageTracker._trackPageview('/outgoing/rubykaigi.org/2011/ja/schedule/details/17M05?referer=');">BDD style Unit Testing | 日本Ruby会議2011(7月16日〜18日)</a></p>
<ul>
	<li><a href="http://twitter.com/ihower" onclick="pageTracker._trackPageview('/outgoing/twitter.com/ihower?referer=');">@ihower</a>
<ul>
	<li><a href="http://ihower.tw" target="_blank" onclick="pageTracker._trackPageview('/outgoing/ihower.tw?referer=');">http://ihower.tw</a></li>
	<li>OptimisDev</li>
	<li>Ruby Taiwan</li>
</ul>
</li>
</ul>
<ul>
	<li>テストの種類
<ul>
	<li>unit test: コードは正しいか</li>
	<li>customer test (acceptance test) : 正しいソフトウェアか</li>
</ul>
</li>
</ul>
<ul>
	<li>テストの役割
<ul>
	<li>verification</li>
	<li>check regression (downgrade を防ぐ)</li>
	<li>api design</li>
	<li>documentation</li>
</ul>
</li>
</ul>
<ul>
	<li>BDD の印象
<ul>
	<li>仕様書のよう、読みやすい</li>
</ul>
</li>
</ul>
<ul>
	<li>フレームワーク
<ul>
	<li>RSpec</li>
	<li>Minitest::Spec</li>
</ul>
</li>
</ul>
<ul>
	<li>記法
<ul>
	<li>description Order do # クラス
<ul>
	<li>description &#8220;#amount&#8221; do &#8230; # インスタンスメソッド</li>
	<li>description &#8220;.size&#8221; do &#8230; # クラスメソッド</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li><a href="https://github.com/citrusbyte/context" target="_blank" onclick="pageTracker._trackPageview('/outgoing/github.com/citrusbyte/context?referer=');">https://github.com/citrusbyte/context</a>
<ul>
	<li>test/unit で context 使う</li>
	<li>matches でマッチャも使える</li>
</ul>
</li>
</ul>
<ul>
	<li><a href="https://github.com/seattlerb/minitest" onclick="pageTracker._trackPageview('/outgoing/github.com/seattlerb/minitest?referer=');">minitest</a>/pride
<ul>
	<li>出力をかわいくする</li>
</ul>
</li>
</ul>
<ul>
	<li>minitest/turn
<ul>
	<li>出力を読みやすくする</li>
</ul>
</li>
</ul>
<ul>
	<li>BDD style caveat (注意点)
<ul>
	<li>too magic
<ul>
	<li>高度な syntax で理解しづらい場合が</li>
	<li>its(:status) { should == &#8220;New&#8221; } みたいな記法</li>
	<li>let は流れを崩すので可読性がおちる</li>
</ul>
</li>
	<li>DSL
<ul>
	<li>マッチャによっては冗長</li>
</ul>
</li>
	<li>深いネスト</li>
	<li>深いネストはよくない</li>
	<li>どの before が適用されるかわかりにくい</li>
	<li>Mock が多すぎるとよくない</li>
	<li>遅い
<ul>
	<li>test/unit に比べて遅い</li>
	<li>とくに RSpec</li>
	<li>ministest/spec は test/unit なみ</li>
	<li>でもプロダクションコードの速さのほうが問題になるよね</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>5 years know-how of RSpec driven Rails app. development.</h3>
<p><a href="http://rubykaigi.org/2011/ja/schedule/details/17M06" onclick="pageTracker._trackPageview('/outgoing/rubykaigi.org/2011/ja/schedule/details/17M06?referer=');">5 years know-how of RSpec driven Rails app. development. | 日本Ruby会議2011(7月16日〜18日)</a></p>
<ul>
	<li><a href="http://twitter.com/moro" onclick="pageTracker._trackPageview('/outgoing/twitter.com/moro?referer=');">@moro</a>
<ul>
	<li>英和システムマネジメント</li>
	<li>Rails レシピブック</li>
	<li>達人出版界</li>
	<li>はじめる! Cucumber</li>
</ul>
</li>
</ul>
<ul>
	<li>コンテキストをつくるのがむつかしい
<ul>
	<li>コンテキスト構築までのテクニック</li>
</ul>
</li>
	<li>モデルのテスト
<ul>
	<li>Skinny controllers, Fat models</li>
	<li>ほかは Cucumber で</li>
</ul>
</li>
</ul>
<ul>
	<li>データの用意がたいへん!
<ul>
	<li>ex. 塾の実習参加 app
<ul>
	<li>events has many cources, has many lessons, has many rooms and periods</li>
	<li>students has many registrations</li>
	<li>lessons has many registrations</li>
	<li>Student#subscribe(cource) でコース全部履修</li>
	<li>Student#register!(lesson_2_4) で一部別のコマに変えれる</li>
	<li>これだけでもいくつもデータを用意しないといけない</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>データの種類
<ul>
	<li>マスターデータ
<ul>
	<li>ほとんど追加更新されない</li>
	<li>依存少ない</li>
	<li>UI を scaffold で納品できるような</li>
	<li>主たるユーザ自身が変更しない</li>
</ul>
</li>
	<li>リソースデータ
<ul>
	<li>運用時、主に追加更新されるもの</li>
	<li>ユーザによって更新される</li>
</ul>
</li>
	<li>イベントデータ
<ul>
	<li>リレーション</li>
	<li>has_many :through =&gt; に入りそうなもの</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>ストラテジー
<ul>
	<li>fixture
<ul>
	<li>速い</li>
	<li>メンテ性低い、柔軟性低い</li>
	<li>マスターデータ向き</li>
</ul>
</li>
	<li>fixture_replacement
<ul>
	<li><a href="https://github.com/paulelliott/fabrication" onclick="pageTracker._trackPageview('/outgoing/github.com/paulelliott/fabrication?referer=');">fabrication</a> / <a href="https://github.com/thoughtbot/factory_girl" onclick="pageTracker._trackPageview('/outgoing/github.com/thoughtbot/factory_girl?referer=');">factory_girl</a></li>
	<li>ひな形からオブジェクトを作る</li>
	<li>使い方が難しい</li>
	<li>遅い</li>
	<li>リソースデータ向き</li>
</ul>
</li>
	<li>before / setup
<ul>
	<li>割と速い</li>
	<li>記述が分散する</li>
	<li>イベントデータ向き</li>
</ul>
</li>
	<li>これらを全部組み合わせて使うといい</li>
</ul>
</li>
</ul>
<ul>
	<li>DRY
<ul>
	<li>fixture_rep や before とかでは同じようなことを何回も書くことになる。</li>
	<li>context を share する</li>
</ul>
</li>
</ul>
<ul>
<ul>
	<li>適切な名前をつける
<ul>
	<li>let(:answer) { 42 }</li>
	<li>answer.should == 42</li>
	<li>名前をつけてしまえば、どこ由来 (fixture, fixture_replacement, before) だろうが OK</li>
</ul>
</li>
</ul>
<ul>
	<li>状況に名前をつける
<ul>
	<li>shared_context: let や context をシェアする</li>
	<li>shared_context &#8220;生徒があるコースを履修している&#8221; do
<ul>
	<li>let &#8230;</li>
	<li>before &#8230;</li>
</ul>
</li>
	<li>include_context で使う</li>
	<li>「いつものあのセット」として使える。そこから状況ごとに変更できる。</li>
</ul>
</li>
</ul>
</ul>
<ul>
	<li>宣伝
<ul>
	<li><a href="http://bit.ly/esm-hiring-rubyists" onclick="pageTracker._trackPageview('/outgoing/bit.ly/esm-hiring-rubyists?referer=');">http://bit.ly/esm-hiring-rubyists</a></li>
	<li>rubyworldconf にでます</li>
</ul>
</li>
</ul>
<h3>Efficient JavaScript integration testing with Ruby and V8 engine.</h3>
<p><a href="http://rubykaigi.org/2011/ja/schedule/details/17M07" onclick="pageTracker._trackPageview('/outgoing/rubykaigi.org/2011/ja/schedule/details/17M07?referer=');">Efficient JavaScript integration testing with Ruby and V8 engine. | 日本Ruby会議2011(7月16日〜18日)</a></p>
<ul>
	<li><a href="http://twitter.com/nu7hatch" onclick="pageTracker._trackPageview('/outgoing/twitter.com/nu7hatch?referer=');">@nu7hatch</a>
<ul>
	<li>chris kowalik</li>
</ul>
</li>
</ul>
<ul>
	<li>JavaScript のテスト
<ul>
	<li>selenium では時間がかかりすぎる。</li>
	<li>ciサーバだと設定面倒</li>
</ul>
</li>
</ul>
<ul>
	<li>selenium / watir / phantom
<ul>
	<li>超おそい</li>
</ul>
</li>
</ul>
<ul>
	<li>ピュア javascript
<ul>
	<li>Jasmine とか</li>
	<li>おそい!</li>
</ul>
</li>
</ul>
<ul>
	<li>ヘッドレスブラウザ
<ul>
	<li>HtmlUnit (Java)</li>
	<li>Zombie (Node.js)</li>
	<li>EnvJS</li>
	<li>Rubyist には苦痛</li>
</ul>
</li>
</ul>
<ul>
	<li>速いのがほしい!
<ul>
	<li>js サポート</li>
	<li>フレンドリな api</li>
	<li>ポータブル</li>
</ul>
</li>
</ul>
<ul>
	<li>ruby 用 v8 拡張 + browser 実装</li>
</ul>
<ul>
	<li>scaffold
<ul>
	<li>Nokogiri で DOM パース</li>
	<li>HTTPクライアントとして RestClient / CURB</li>
	<li>js は Mustang</li>
</ul>
</li>
</ul>
<ul>
	<li>mustang : v8 in ruby
<ul>
	<li><a href="https://github.com/nu7hatch/mustang" target="_blank" onclick="pageTracker._trackPageview('/outgoing/github.com/nu7hatch/mustang?referer=');">https://github.com/nu7hatch/mustang</a></li>
	<li>rubyracer の書き直し</li>
	<li>v8 単体よりは遅いけど</li>
	<li>(高速化のための実装の話、理解できてない)</li>
</ul>
</li>
</ul>
<ul>
	<li>Mike
<ul>
	<li><a href="https://github.com/nu7hatch/mike" target="_blank" onclick="pageTracker._trackPageview('/outgoing/github.com/nu7hatch/mike?referer=');">https://github.com/nu7hatch/mike</a></li>
	<li>LibXML2 / LibCURL / LibV8 で作成 (みんな C++)</li>
	<li>htmlunit / webkit / node.js, zombie に影響されてる</li>
</ul>
</li>
</ul>
<ul>
<ul>
	<li>1. 複数ウィンドウ対応</li>
	<li>2. frame サポート</li>
	<li>3. ユーザの操作 click_link など</li>
	<li>4. js 実行</li>
	<li>5. alert /confirm のモック</li>
	<li>6. api きれい!</li>
</ul>
</ul>
<ul>
	<li>以下はまだ
<ul>
	<li>イベントハンドリング</li>
	<li>XmlHttpRequest</li>
	<li>Web Socket</li>
	<li>Ruby 拡張</li>
</ul>
</li>
</ul>
<h3>Net::HTTP</h3>
<p><a href="http://rubykaigi.org/2011/ja/schedule/details/17M08" onclick="pageTracker._trackPageview('/outgoing/rubykaigi.org/2011/ja/schedule/details/17M08?referer=');">Advancing Net::HTTP | 日本Ruby会議2011(7月16日〜18日)</a></p>
<ul>
	<li><a href="http://twitter.com/wycats" onclick="pageTracker._trackPageview('/outgoing/twitter.com/wycats?referer=');">@wycats</a>
<ul>
	<li><a href="http://yehudakatz.com/" onclick="pageTracker._trackPageview('/outgoing/yehudakatz.com/?referer=');">yehudakatz.com</a></li>
</ul>
</li>
</ul>
<ul>
	<li><code>Net::HTTP.start do |http| http.get do |chunk| end # レスポンス解放 # keep alive できる http.get do |chunk| end # レスポンス解放 end # ソケット解放</code></li>
</ul>
<ul>
	<li>(途中から全然理解できませんでした・・・。並列化とか Reactor とか言ってた気がする。)</li>
</ul>
<h3>Method Shelters : Classboxes でも Refinements でもない別のやり方</h3>
<p><a href="http://rubykaigi.org/2011/ja/schedule/details/17S09" onclick="pageTracker._trackPageview('/outgoing/rubykaigi.org/2011/ja/schedule/details/17S09?referer=');">Method Shelters : Classboxes でも Refinements でもない別のやり方 | 日本Ruby会議2011(7月16日〜18日)</a></p>
<ul>
	<li><a href="http://twitter.com/flexfrank" onclick="pageTracker._trackPageview('/outgoing/twitter.com/flexfrank?referer=');">@flexfrank</a></li>
</ul>
<ul>
	<li>オープンクラスでメソッドかぶっちゃったりする問題
<ul>
	<li>あるライブラリがメソッド追加 -&gt; 別のライブラリがメソッド追加で上書きされちゃう</li>
	<li>別プロセスにして druby でなんとか解決するとか</li>
	<li>mathn が Integer#/ をrational にしちゃうのでつらい</li>
</ul>
</li>
</ul>
<ul>
	<li>これまでの解決案
<ul>
	<li>selector namespaces (smalltalk)</li>
	<li>refinements
<ul>
	<li>class &#8230; のかわりに refine &#8230; として定義し、using &#8230; で使う</li>
	<li>lexical スコープの中のみ</li>
	<li>local rebinding はできない</li>
</ul>
</li>
	<li>classbox
<ul>
	<li>matz 日記参照</li>
	<li>import したクラスに追加などができる。</li>
	<li>同じ名前でその scope でだけ有効なサブクラスをつくる感じ。</li>
	<li>A と、Aを書き換えたクラスを import する B、の両方を import すると B からみた A は改変されてないものになる。</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>method shelter
<ul>
	<li>exposed chamber
<ul>
	<li>public api 用</li>
	<li>呼べるし上書き</li>
</ul>
</li>
	<li>hidden chamber
<ul>
	<li>private 用</li>
	<li>呼べない上書きできない</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>CRubyのロックデザインの解説および改善案について</h3>
<p><a href="http://rubykaigi.org/2011/ja/schedule/details/17S10" onclick="pageTracker._trackPageview('/outgoing/rubykaigi.org/2011/ja/schedule/details/17S10?referer=');">CRubyのロックデザインの解説および改善案について | 日本Ruby会議2011(7月16日〜18日)</a></p>
<ul>
	<li>小崎資広</li>
	<li>(MacBook の電池が切れてしまったため、メモなし。かつ、あまり理解できてなかった。マルチコア環境では、複数スレッドのうち、1 つのスレッドがほとんど処理されない場合があり、Ruby 1.9.3 ではこの問題を解決したという話だったと思う。)</li>
</ul>
<p>(Lightning Talk 1 は聴けませんでした)</p>
]]></content:encoded>
			<wfw:commentRss>http://penguinlab.jp/blog/post/2091/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyKaigi 2011 メモ (1 日目)</title>
		<link>http://penguinlab.jp/blog/post/2067</link>
		<comments>http://penguinlab.jp/blog/post/2067#comments</comments>
		<pubDate>Tue, 19 Jul 2011 20:56:17 +0000</pubDate>
		<dc:creator>labocho</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://penguinlab.jp/blog/?p=2067</guid>
		<description><![CDATA[7 月 16 日から 18 日まで開催された RubyKaigi 2011 に参加してきました。非常に楽しく、ためになる 3 日間でした。 セッションをきいている間、メモをとっていたので (多少整形して) 公開します。 理解できていない部分、誤って理解している部分、抜けている部分など多々あるので、備忘録としての役割が主です。これを読んで気になる部分があれば、他のレポート (RubyKaigi2011 スペシャルレポートとか) を読むなり、ust みるなり、登壇者が発信してる情報をさがすと良いと思います。 Ruby Ruined My Life. @tenderlove / Aaron Patterson (自然) 言語を勉強するとき別の名前を使う 自分じゃないから間違えても恥ずかしくない! Ruby の場合 部分ごとに担当をきめる 低リスク コメントなどが英語でなくてもかまわない 言語の壁で、コミュニケーションがとれないときが。 縦割りだから、作業が人に依存する→開発速度の低下。 添付ライブラリは gem になってる 別のチームになって Rails core コミッタはすべてに関与できる。 便利だけど、各パートのオーナーがいないので、強い意見を持ちにくい。 リリースにも誰も責任を持たない。 高リスク バックポートされないことも feel free to commit feel free to [...]]]></description>
			<content:encoded><![CDATA[
<p>7 月 16 日から 18 日まで開催された RubyKaigi 2011 に参加してきました。非常に楽しく、ためになる 3 日間でした。</p>
<p>セッションをきいている間、メモをとっていたので (多少整形して) 公開します。</p>
<p>理解できていない部分、誤って理解している部分、抜けている部分など多々あるので、備忘録としての役割が主です。これを読んで気になる部分があれば、他のレポート (<a title="レポート：RubyKaigi2011 スペシャルレポート｜gihyo.jp … 技術評論社" href="http://gihyo.jp/news/report/01/rubykaigi2011" onclick="pageTracker._trackPageview('/outgoing/gihyo.jp/news/report/01/rubykaigi2011?referer=');">RubyKaigi2011 スペシャルレポート</a>とか) を読むなり、ust みるなり、登壇者が発信してる情報をさがすと良いと思います。</p>
<p><span id="more-2067"></span></p>
<h3>Ruby Ruined My Life.</h3>
<ul>
	<li><a href="http://twitter.com/tenderlove" onclick="pageTracker._trackPageview('/outgoing/twitter.com/tenderlove?referer=');">@tenderlove</a> / Aaron Patterson</li>
	<li>(自然) 言語を勉強するとき別の名前を使う</li>
<ul>
	<li>自分じゃないから間違えても恥ずかしくない!</li>
</ul>
</ul>
<ul>
	<li>Ruby の場合</li>
<ul>
	<li>部分ごとに担当をきめる</li>
	<li>低リスク</li>
	<li>コメントなどが英語でなくてもかまわない</li>
	<li>言語の壁で、コミュニケーションがとれないときが。</li>
	<li>縦割りだから、作業が人に依存する→開発速度の低下。</li>
	<li>添付ライブラリは gem になってる</li>
<ul>
	<li>別のチームになって</li>
</ul>
</ul>
</ul>
<ul>
	<li>Rails core</li>
<ul>
	<li>コミッタはすべてに関与できる。</li>
	<li>便利だけど、各パートのオーナーがいないので、強い意見を持ちにくい。</li>
	<li>リリースにも誰も責任を持たない。</li>
	<li>高リスク</li>
<ul>
	<li>バックポートされないことも</li>
</ul>
</ul>
</ul>
<ul>
	<li>feel free to commit</li>
	<li>feel free to revert</li>
	<li>responsiblity to communicate</li>
</ul>
<ul>
	<li>特定の分野のための Ruby 本が US にはない</li>
<ul>
	<li>racc の本とか</li>
	<li>言語の習得はできても、何が作れるのかわからない</li>
</ul>
</ul>
<ul>
	<li>ASCII8bit * マルチバイト だと変なことに?</li>
	<li>ネットワークでクラスロード</li>
<ul>
	<li>?load_path に URL 追加で</li>
</ul>
</ul>
<ul>
	<li>DTrace</li>
<ul>
	<li>probe</li>
	<li>ruby / スクリプトによる allocate や method calll を見られる。</li>
</ul>
</ul>
<ul>
	<li>Learn / Teach / Communicate / Take risk</li>
</ul>
<h3>Next version of Ruby 1.8 and 1.9</h3>
<ul>
	<li>1.8 に未来はない。</li>
</ul>
<ul>
	<li>1.9.3</li>
<ul>
	<li>実装でいろいろ改良がたまってきたのでそろそろ安定版リリース。</li>
	<li>parallel_test</li>
	<li>IO.write</li>
	<li>プライベート定数</li>
	<li>GVL</li>
</ul>
</ul>
<ul>
	<li>License</li>
<ul>
	<li>これまでは、狭義のRubyライセンス / GPLv2 の好きなほう</li>
	<li>GPLv3 は GPLv2 非互換</li>
	<li>狭義の Ruby ライセンス / 2-clause BSDL に</li>
<ul>
	<li>2-clause BSDL は GPLv2 / GPLv3 互換</li>
	<li>これにより明確に BSDL ライセンス互換。BSD で明確に使える。</li>
</ul>
</ul>
</ul>
<ul>
	<li>private constant</li>
<ul>
	<li>private method みたいな constant が使える。</li>
	<li>constant なので、クラスやなんやも private にできる。</li>
	<li>クラスオープンや const_get ならもちろんアクセスできる。</li>
</ul>
</ul>
<ul>
	<li>Test::Unit</li>
<ul>
	<li>ruby のテストには使われてる</li>
	<li>Master / Worker を作って並列化</li>
</ul>
</ul>
<ul>
	<li>IO.write</li>
</ul>
<ul>
	<li>String#prepend</li>
</ul>
<ul>
	<li>GVL</li>
<ul>
	<li>大量にスレッドつくると遅くなってたのを改善。</li>
</ul>
</ul>
<ul>
	<li>IO.advise</li>
<ul>
	<li>posix_fadvise(3) の wrapper</li>
	<li>IO.advise(:dontneed) でページキャッシュを捨てる</li>
	<li>バックアップ時などに無駄にメモリ食うのを改善</li>
</ul>
</ul>
<ul>
	<li>Timer スレッド</li>
<ul>
	<li>ruby 走らすと、2つスレッドがたつ</li>
	<li>Timer スレッドはスケジューリングとかする</li>
	<li>Timer は 10ms ごとに必ず動くので、何もしてなくても CPU が眠れない</li>
	<li>改善により消費電力ちょっと減った</li>
</ul>
</ul>
<ul>
	<li>既知の問題</li>
<ul>
	<li>Passenger が動かない</li>
<ul>
	<li>変なコード書いてるため</li>
	<li>file descriptor 関係で</li>
</ul>
</ul>
</ul>
<h3>Ruby を利用した大規模 web サービスの開発・運用</h3>
<p>参照: <a href="http://techlife.cookpad.com/2011/07/19/rubykaigi2011/" onclick="pageTracker._trackPageview('/outgoing/techlife.cookpad.com/2011/07/19/rubykaigi2011/?referer=');">Ruby を利用した大規模ウェブサービスの開発・運用 ? RubyKaigi 2011 発表資料 ? クックパッド開発者ブログ</a></p>
<ul>
	<li><a href="http://d.hatena.ne.jp/secondlife/" onclick="pageTracker._trackPageview('/outgoing/d.hatena.ne.jp/secondlife/?referer=');">id:secondlife</a> / <a href="http://twitter.com/hotchpotch" onclick="pageTracker._trackPageview('/outgoing/twitter.com/hotchpotch?referer=');">@hotchpotch</a></li>
</ul>
<ul>
	<li><a href="http://cookpad.com/" onclick="pageTracker._trackPageview('/outgoing/cookpad.com/?referer=');">Cookpad</a></li>
<ul>
	<li>12,300,000 uu</li>
	<li>1000000 recipes</li>
	<li>30代女性の2人に1人</li>
</ul>
</ul>
<ul>
	<li>mobarepi</li>
<ul>
	<li>ケータイ、スマホ向け</li>
	<li>ユーザー多し</li>
</ul>
</ul>
<ul>
	<li>iOS app</li>
<ul>
	<li>2.5 milion DL</li>
</ul>
</ul>
<ul>
	<li><a href="http://tabemiru.com/" onclick="pageTracker._trackPageview('/outgoing/tabemiru.com/?referer=');">tabemiru</a></li>
<ul>
	<li>cookpad のログと位置、地域情報の結びつけ</li>
</ul>
</ul>
<ul>
	<li>環境</li>
<ul>
	<li>ruby 1.8.7 / rails 2.3</li>
	<li>「サーバ/インフラを支える技術」にあるような標準的な構成</li>
</ul>
</ul>
<ul>
	<li>app server</li>
<ul>
	<li>haml / sass / jQuery</li>
	<li>passenger 2.2</li>
	<li>mysql 5.0</li>
	<li>memcached で rails のインスタンス変数をキャッシュ</li>
	<li><a href="https://www.varnish-cache.org/" onclick="pageTracker._trackPageview('/outgoing/www.varnish-cache.org/?referer=');">varnish 2.1.5</a></li>
<ul>
	<li>キャッシュ</li>
	<li>ヒットすれば 30ms 程度で</li>
</ul>
</ul>
</ul>
<ul>
	<li>写真サーバ</li>
<ul>
	<li>aws</li>
	<li>url でリサイズやクロッピング指定。</li>
	<li>アップロードサーバ</li>
<ul>
	<li>ec2</li>
	<li>rails 3 -&gt; s3</li>
	<li>リサイズや検証</li>
</ul>
	<li>デリバリサーバ ec2</li>
<ul>
	<li>apache 2.2</li>
	<li>akamai</li>
</ul>
</ul>
</ul>
<ul>
	<li>検索</li>
<ul>
	<li><a href="http://lucene.apache.org/solr/" onclick="pageTracker._trackPageview('/outgoing/lucene.apache.org/solr/?referer=');">Solr</a></li>
	<li>かつては mysql + trironn</li>
	<li>柔軟な検索</li>
	<li>facet 集合 / boost 重み付け / dynamic fields 動的フィールド</li>
	<li>速くなった、というわけでなく変更に強い</li>
	<li>ログはs3に送る</li>
</ul>
</ul>
<ul>
	<li>tabemiru</li>
<ul>
	<li>統計処理</li>
	<li>ec2? / hadoop</li>
	<li>aws の elastic map_reduce (mapper / reducer は ruby)</li>
	<li>スケールアウトできるので、ruby が遅くても問題ない</li>
</ul>
</ul>
<ul>
	<li>アプリケーションサーバからのレスポンスは &lt; 200ms</li>
	<li>定石をきちんと</li>
	<li>good はやらない、best のみに。機能の追加は慎重に。</li>
<ul>
	<li>本当に必要な機能のみに絞る。</li>
</ul>
	<li>シンプルにする</li>
<ul>
	<li>キャッシュにのりやすい</li>
	<li>クエリーがシンプルに</li>
</ul>
</ul>
<ul>
	<li>遅延ロード</li>
<ul>
	<li>ユーザー固有の情報は非同期でロードする</li>
	<li>はじめのページは 30ms、続けて 200ms。</li>
</ul>
</ul>
<ul>
	<li>「ウェブオペレーション」にも記事あり</li>
</ul>
<ul>
	<li>開発体制</li>
<ul>
	<li>cookpad は 30人以上の rails engineer</li>
	<li>rails で多人数開発</li>
	<li>開発 -&gt; デプロイ -&gt; フィードバック &#8230; のサイクル</li>
</ul>
</ul>
<ul>
	<li>テスト</li>
<ul>
	<li>rspec 1.x</li>
	<li>unit / functional / integration</li>
	<li>以前より integration をだいぶ重視。unit も。</li>
	<li>integration だと js もテストできる。</li>
	<li><a href="https://github.com/thoughtbot/capybara-webkit" onclick="pageTracker._trackPageview('/outgoing/github.com/thoughtbot/capybara-webkit?referer=');">capybara-webkit</a></li>
</ul>
</ul>
<ul>
	<li>スペック増えるとテスト時間かかる</li>
<ul>
	<li>テストをリモートで行う。</li>
	<li>remote spec</li>
	<li>rsync でソースを同期、ssh で結果取得</li>
	<li>oedo rubykaigi01 で詳細</li>
</ul>
</ul>
<ul>
	<li>デプロイ</li>
<ul>
	<li>CI (continuos integration) のビルドが通るか</li>
	<li><a href="http://jenkins-ci.org/" onclick="pageTracker._trackPageview('/outgoing/jenkins-ci.org/?referer=');">jenkins</a></li>
	<li>テスト通らないとデプロイできない。</li>
	<li>新しい技術を入れる -&gt; CI で動くテストを書く。</li>
	<li>Ruby 勉強会@札幌 で詳細 (<a title="継続的インテグレーションについて、Ruby勉強会@札幌-18 で発表しました - 川o・-・）＜2nd life" href="http://d.hatena.ne.jp/secondlife/20110704/1309759409" onclick="pageTracker._trackPageview('/outgoing/d.hatena.ne.jp/secondlife/20110704/1309759409?referer=');">http://d.hatena.ne.jp/secondlife/20110704/1309759409</a>)</li>
	<li>デプロイの通知</li>
<ul>
	<li>デプロイ時に必ずメッセージ記入</li>
	<li>スタッフに通知される</li>
</ul>
</ul>
</ul>
<ul>
	<li>エラーのモニタリング</li>
<ul>
	<li>rails / js のエラーログ</li>
	<li>バースト検知</li>
<ul>
	<li>エラーを 0 にするのは難しい</li>
	<li>急激に増えたときにアラート</li>
</ul>
</ul>
</ul>
<ul>
	<li>Extentions</li>
<ul>
	<li>rails のプラグイン</li>
	<li>ある機能を Extention としてひと塊にして記述できる</li>
	<li>一部ユーザにのみ限定公開など可能</li>
	<li>プロトタイプ開発向き</li>
	<li>これ使う場合は spec を書かなくてもよいこととする</li>
	<li>捕捉してない例外が発生したら 自動で無効化する</li>
	<li>利用の統計、ユーザーからのフィードバックをとる</li>
	<li>1 つの Extention は下記のように配置</li>
<ul>
	<li>/app/extensions/some_ext</li>
<ul>
	<li>some_ext.rb</li>
	<li>spec</li>
	<li>views</li>
	<li>controllers</li>
	<li>&#8230;</li>
</ul>
</ul>
	<li>使わないと決定したら、独立して無効化・削除できる</li>
	<li>参照: <a href="http://techlife.cookpad.com/2011/07/15/extension-framework/" onclick="pageTracker._trackPageview('/outgoing/techlife.cookpad.com/2011/07/15/extension-framework/?referer=');">どんどん使う ? Extension Frameworkの紹介 ? クックパッド開発者ブログ</a></li>
</ul>
</ul>
<h3>Ruby 用のリアルタイムプロファイラ</h3>
<p>参照: <a href="http://sunagae.net/blog/archives/1210" onclick="pageTracker._trackPageview('/outgoing/sunagae.net/blog/archives/1210?referer=');">RubyKaigi2011で発表しましたよ | sunagæ.net</a></p>
<ul>
	<li>sasada lab. の 須永高浩 氏</li>
	<li><a href="http://twitter.com/sunagae" onclick="pageTracker._trackPageview('/outgoing/twitter.com/sunagae?referer=');">@sunagae</a></li>
</ul>
<ul>
	<li><a href="http://sunagae.net/software/llprof" onclick="pageTracker._trackPageview('/outgoing/sunagae.net/software/llprof?referer=');">http://sunagae.net/software/llprof</a></li>
	<li>ドキュメントなかったりするので、困ったらメールでも</li>
</ul>
<ul>
	<li>ruby-profile</li>
<ul>
	<li>オーバーヘッド大きい</li>
	<li>終わらないと測定できない</li>
</ul>
</ul>
<ul>
	<li>llprof</li>
<ul>
	<li>ProfilingModule を include することで使える</li>
</ul>
</ul>
<ul>
	<li>構成</li>
<ul>
	<li>App (include Profiling module) &#8211; Profile Information Server &#8211; Web Server</li>
	<li>プロファイラの情報をためるサーバを起動</li>
	<li>サーバからプロセスにアクセス?</li>
</ul>
</ul>
<ul>
	<li>View</li>
<ul>
	<li>ノードごとツリービュー</li>
	<li>メソッドごと消費時間</li>
	<li>面積比例表示</li>
	<li>時系列グラフ表示</li>
</ul>
</ul>
<ul>
	<li>利点</li>
<ul>
	<li>リアルタイム</li>
	<li>気になったときに見られる</li>
	<li>動かしながら見られる</li>
	<li>たとえば Web アプリで連続してリクエスト送ったとき、どうなるかが見られる</li>
	<li>ネットワーク越しに見られる</li>
	<li>Web ブラウザから見られる (JavaScript 動けば OK)</li>
	<li>calling context 込みで見られる</li>
<ul>
	<li>メソッドごとに見られるだけでなく、そのメソッドがどこで呼ばれたかでも見られる</li>
</ul>
	<li>オーバーヘッド低い</li>
<ul>
	<li>profiler に優しくない事例で、実行時間の4倍程度</li>
</ul>
</ul>
</ul>
<ul>
	<li>実稼働している Web アプリで使った例</li>
<ul>
	<li><a href="http://www.arrow-arrow.com/" onclick="pageTracker._trackPageview('/outgoing/www.arrow-arrow.com/?referer=');">http://www.arrow-arrow.com/</a></li>
<ul>
	<li>メッセージをランダムに送る、ランダムにきたメッセージに返信する。</li>
	<li>返事が早い、確実にくる、ことが売り。</li>
	<li>F5アタック的な状態がデフォルト。</li>
	<li>python で作成!</li>
</ul>
	<li>言語非依存なので python でも</li>
	<li>追加した機能</li>
<ul>
	<li>リクエストごとにプロファイリングできるように</li>
	<li>複数プロセスからの情報を集約する</li>
</ul>
	<li>複数稼働しているうちの1つのwebサーバでプロファイリング</li>
	<li>リクエストごとに処理するため、プロファイラに「ここから」「ここまで」と伝える処理だけ追加</li>
</ul>
</ul>
<ul>
	<li>最新版は XML でダンプできる</li>
</ul>
<h3>Toggleable Mocks and Testing Strategies in a Service Oriented Architecture</h3>
<ul>
	<li><a href="http://twitter.com/adelcambre" onclick="pageTracker._trackPageview('/outgoing/twitter.com/adelcambre?referer=');">@adelcambre</a></li>
	<li><a href="http://www.engineyard.com/" onclick="pageTracker._trackPageview('/outgoing/www.engineyard.com/?referer=');">Engine Yard</a></li>
</ul>
<ul>
	<li>SOA
<ul>
	<li>unix の単一責任の原則</li>
	<li>コードみじかい</li>
	<li>それぞれの部品を別々にデプロイ</li>
	<li>並行開発</li>
	<li>SSO (シングルサインオン)
<ul>
	<li>他のサービスがユーザーの概念をしらなくても OK</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>テストどうする
<ul>
	<li>むつかしい</li>
</ul>
</li>
</ul>
<ul>
	<li>例
<ul>
	<li>サーバとクライアント</li>
	<li>サーバに</li>
</ul>
</li>
</ul>
<ul>
	<li>モックを使わない
<ul>
	<li>本物のサーバ側アプリケーションを使う</li>
	<li>簡単</li>
	<li>カバレッジ高い</li>
	<li>遅い</li>
	<li>1 テストごとに初期化が必要</li>
</ul>
</li>
</ul>
<ul>
	<li>Mock
<ul>
	<li>本物のように振る舞う</li>
	<li>どのメソッドが呼ばれるか知ってる</li>
</ul>
</li>
</ul>
<ul>
	<li>Stub
<ul>
	<li>メソッドを仮のデータで置き換えるもの</li>
</ul>
</li>
</ul>
<ul>
	<li>Fake
<ul>
	<li>メモリに格納された SQLite データベースなど</li>
	<li>ほぼ本物だが、本物にはつかえない</li>
</ul>
</li>
</ul>
<ul>
	<li>Stub を使う
<ul>
	<li>速い</li>
	<li>内部をテストできない</li>
</ul>
</li>
</ul>
<ul>
	<li>Fakeweb
<ul>
	<li><a href="https://github.com/chrisk/fakeweb" onclick="pageTracker._trackPageview('/outgoing/github.com/chrisk/fakeweb?referer=');">https://github.com/chrisk/fakeweb</a></li>
	<li>net/http のスタブ</li>
	<li>http サーバのスタブ</li>
	<li>method, url, response を登録して使う</li>
	<li>http レイヤーをテストできる</li>
	<li>内部実装をしりすぎ</li>
</ul>
</li>
</ul>
<ul>
	<li>フェイクをライブラリに組み込む
<ul>
	<li>(よくわからん)</li>
	<li>http レイヤーでない</li>
</ul>
</li>
</ul>
<ul>
	<li>artifice
<ul>
	<li><a href="https://github.com/wycats/artifice" onclick="pageTracker._trackPageview('/outgoing/github.com/wycats/artifice?referer=');">https://github.com/wycats/artifice</a></li>
	<li>rack アプリ</li>
	<li>net/http のスタブとして使う</li>
	<li>http レイヤーはフェイク</li>
	<li>実際にサーバ立ち上げる場合と同じテストがかける</li>
	<li>カバレッジ高い</li>
	<li>実装を知らなくてよい</li>
</ul>
</li>
</ul>
<ul>
<ul>
	<li>env で mock を使うかどうか決めれる</li>
	<li>mock を使ったスペックが早い。</li>
	<li>本物のサーバに替えることもできる -&gt; integration テストが正しくできる</li>
	<li>テストを書き換えなくてよい</li>
	<li>双方のテストが通らないとデプロイしない</li>
	<li>CI でフェイクを認証する必要あり</li>
	<li>サービス側がフェイクを提供? ライブラリに含めてかな?</li>
</ul>
</ul>
<ul>
<ul>
	<li>テストのたびにクリーンアップしないといけない</li>
	<li>ユニークデータの衝突 : 同時に実行する時</li>
</ul>
</ul>
<ul>
	<li>サーバは rack アプリ
<ul>
	<li>サーバコードを fake として使うことも?</li>
</ul>
</li>
</ul>
<ul>
	<li>(スライドは <a href="https://github.com/schacon/showoff" onclick="pageTracker._trackPageview('/outgoing/github.com/schacon/showoff?referer=');">showoff</a> で作成)</li>
</ul>
<h3>軽量 Ruby</h3>
<ul>
	<li><a href="http://twitter.com/yukihiro_matz" onclick="pageTracker._trackPageview('/outgoing/twitter.com/yukihiro_matz?referer=');">@yukihiro_matz</a></li>
</ul>
<ul>
	<li>Rite VM</li>
	<li>Rite または mruby (embeded ruby)</li>
</ul>
<ul>
	<li>Core: C99</li>
	<li>Minimal (配列とかまで): C99</li>
	<li>JIS X 3017 (JIS Ruby): POSIX</li>
</ul>
<ul>
	<li>ソフトリアルタイム
<ul>
	<li>ハードリアルタイムはなくてもソフトではほしい</li>
	<li>GCで止まっては困る</li>
</ul>
</li>
</ul>
<ul>
	<li>FPGA による汎用CPUコア
<ul>
	<li>メソッド検索や GC 用の命令を追加</li>
</ul>
</li>
</ul>
<ul>
	<li>コンポーネント
<ul>
	<li>ruby コード -コンパイラ-&gt; 構文木 -コードジェネレータ-&gt; バイトコード</li>
	<li>全部入りでも、バイトコードを実行できるランタイムだけでも</li>
</ul>
</li>
</ul>
<ul>
	<li>Minimal とかのほかに、プラットホーム依存ライブラリの追加も</li>
</ul>
<ul>
	<li>C でライブラリインクルードして、open、read_string、run で実行
<ul>
	<li>Lua的</li>
</ul>
</li>
</ul>
<ul>
	<li>用途
<ul>
	<li>機器組み込み</li>
	<li>アプリ組み込み</li>
	<li>ゲーム組み込み</li>
	<li>node.rite (node.js みたいな、minimal なら IO とかないし)</li>
</ul>
</li>
</ul>
<ul>
	<li>福岡CSK、九州工業大</li>
</ul>
<ul>
	<li>利用法はみんなかんがえて!</li>
</ul>
<ul>
	<li>ほぼ C だが、ブロックをとるメソッドは Ruby で書かなくちゃいけない (バイトコードにしてリンクする)。</li>
</ul>
<ul>
	<li>Rite VM は ruby の大きめのサブセット。rite にだけある機能、というのはない。</li>
</ul>
<ul>
	<li>ライセンスは未定、組み込みは BSD が多いので BSD だけど、事業化を考えると GPLv2 / v3 か。Ruby ライセンスはつく。</li>
</ul>
<h3>日本の図書館はどのように Ruby を使っているか</h3>
<p>参照: <a href="http://d.hatena.ne.jp/nabeta/20110716/1310792063" onclick="pageTracker._trackPageview('/outgoing/d.hatena.ne.jp/nabeta/20110716/1310792063?referer=');">RubyKaigi2011「日本の図書館はどのようにRubyを使っているか」資料集 &#8211; 簡単な日記 はてな仮店舗</a></p>
<ul>
	<li><a href="http://twitter.com/nabeta" onclick="pageTracker._trackPageview('/outgoing/twitter.com/nabeta?referer=');">@nabeta</a></li>
</ul>
<ul>
	<li>まちづくり三鷹 「ruby 図書館システム」</li>
	<li>リブネット 「トップネット」</li>
	<li>全部 rails</li>
</ul>
<ul>
	<li>利用者向けの検索UIと</li>
	<li>司書向けの検索UIが必要 : 詳細な絞り込みが必要</li>
</ul>
<ul>
	<li>Next-L Enju
<ul>
	<li>Rails + HE のサンプルで、使えそうと判断</li>
	<li>REST を備える図書館システム増加 (えー)
<ul>
	<li>OCLCとか。</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>問題
<ul>
	<li>遅い! join が多い。</li>
	<li>フラグメントキャッシュで対応
<ul>
	<li>フラグメントキャッシュの適切なテストの方法知ってたら教えて</li>
</ul>
</li>
	<li>貸出・返却処理は速度重要!
<ul>
	<li>ajax 利用、過剰な validation けずる。</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>HE -&gt; Solr へ
<ul>
	<li>acts_as_solr -&gt; sunspotへ</li>
</ul>
</li>
</ul>
<ul>
	<li>カードリーダ使って貸出・返却</li>
	<li>物質・材料研究機構は夏公開</li>
</ul>
<ul>
	<li>NDL Search
<ul>
	<li>モジュールの一部に Next-L Enju。</li>
	<li>書誌5800万件</li>
	<li>資料の自動同定処理</li>
</ul>
</li>
</ul>
<ul>
	<li>商用のパッケージでは
<ul>
	<li>FRBR、Web API へ対応してない</li>
	<li>改修は高額</li>
</ul>
</li>
</ul>
<ul>
	<li>成果物をオープンソースソフトウェアとして公開できること</li>
</ul>
<ul>
	<li>主にフロントエンドを Next-L Enju で</li>
</ul>
<ul>
	<li>管理画面
<ul>
	<li>書誌のコピーやら、利用統計やら</li>
</ul>
</li>
</ul>
<ul>
	<li>書誌を XML (DCNDL) で持つ
<ul>
	<li>psql の TEXT に</li>
</ul>
</li>
</ul>
<ul>
	<li>Solr
<ul>
	<li>sunspot -&gt; rsolr</li>
	<li>Solr のインデクス作成は Java + Hadoop で。書誌同定もおなじく。</li>
</ul>
</li>
</ul>
<ul>
	<li>10 年前から ruby が使われていた例
<ul>
	<li>神戸市図書館情報ネットワーク</li>
	<li>ruby + gtk</li>
	<li>90% が Ruby。のこりは C と Emacs Lisp!</li>
	<li>書誌登録時、emacs が起動して、Emacs Lisp で検証したり</li>
</ul>
</li>
</ul>
<ul>
	<li>Ruby の利点
<ul>
	<li>図書館員が多少は改修できる</li>
	<li>日本語の情報をえやすい</li>
</ul>
</li>
</ul>
<h3>Ruby で作った &#8220;mission critical&#8221; システムについて</h3>
<ul>
	<li><a href="http://twitter.com/emorima" onclick="pageTracker._trackPageview('/outgoing/twitter.com/emorima?referer=');">@emorima</a></li>
	<li>KCS carrot</li>
</ul>
<ul>
	<li>CGIKit -&gt; RoR</li>
	<li>daemon process</li>
</ul>
<ul>
	<li>mission critical
<ul>
	<li>24/365 動かす、止まってはならない</li>
	<li>relilability</li>
</ul>
</li>
</ul>
<ul>
	<li>某システム
<ul>
	<li>(100 thread / process) * 100</li>
	<li>UDP socket</li>
	<li>センサーからのデータをリアルタイムに集めたい</li>
</ul>
</li>
</ul>
<ul>
	<li>スレッド動かない
<ul>
	<li>file descriptor 上限を超える</li>
	<li>一般ユーザの上限かかるので su で動かした</li>
</ul>
</li>
</ul>
<ul>
	<li>UDP Socket のタイムアウト
<ul>
	<li>timeout module-&gt; 10000 errors!</li>
	<li>select を使って解決?</li>
	<li>自前で監視
<ul>
	<li><a href="http://www.slideshare.net/MayumiEmori/ruby01-7577766" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/MayumiEmori/ruby01-7577766?referer=');">大江戸Ruby会議01　&#8221;mission critical&#8221;なシステムでも使えるThreadの作り方</a></li>
	<li>スレッドが落ちても再起動する仕組み</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
	<li>計算処理
<ul>
	<li>C で</li>
</ul>
</li>
</ul>
<ul>
	<li>process 数
<ul>
	<li>プロトタイプ時は 3 種</li>
	<li>リニューアル時は 230 プロセス!</li>
	<li>C で 230 も書くのは嫌。Ruby だと結構楽しい。</li>
</ul>
</li>
</ul>
<ul>
	<li>ruby だと thread と socket の扱いが楽</li>
	<li>意外と大規模システム向き</li>
</ul>
<h3>闇 RubyKaigi</h3>
<ul>
	<li>VDD! VDD!</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://penguinlab.jp/blog/post/2067/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac の特殊キー記号の由来</title>
		<link>http://penguinlab.jp/blog/post/2035</link>
		<comments>http://penguinlab.jp/blog/post/2035#comments</comments>
		<pubDate>Tue, 19 Jul 2011 16:01:01 +0000</pubDate>
		<dc:creator>labocho</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[レファレンス]]></category>
		<category><![CDATA[文字]]></category>

		<guid isPermaLink="false">http://penguinlab.jp/blog/?p=2035</guid>
		<description><![CDATA[Mac では、特殊キー (修飾キー) を記号で表現することがよくある。下記がその一覧。 記号キーコードポイントUnicode での文字名 &#x2318;commandU+2318PLACE OF INTEREST SIGN &#x2303;controlU+2303UP ARROWHEAD &#x2325;option / altU+2325OPTION KEY &#x21e7;shiftU+21E7UPWARDS WHITE ARROW &#x2324;enterU+2324UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS &#x238b;escape / escU+238BBROKEN CIRCLE WITH NORTHWEST ARROW &#x2196;homeU+2196NORTH WEST ARROW &#x2198;endU+2198SOUTH EAST ARROW &#x21a9;returnU+21A9LEFTWARDS ARROW WITH HOOK &#x2191;▲U+2191UPWARDS ARROW &#x2193;▼U+2193DOWNWARDS ARROW &#x2190;&#x25c0;U+2190LEFTWARDS ARROW &#x2192;&#x25b6;U+2192RIGHTWARDS ARROW &#x232b;deleteU+232BERASE TO THE LEFT &#x2326;forward [...]]]></description>
			<content:encoded><![CDATA[<style>.mac_key{font-family: 'Lucida Grande'}</style>
<p>Mac では、特殊キー (修飾キー) を記号で表現することがよくある。下記がその一覧。</p>

<table>
  <tr><th>記号</th><th>キー</th><th>コードポイント</th><th>Unicode での文字名</th></tr>
  <tr><td><span class="mac_key">&#x2318;</span></td><td>command</td><td>U+2318</td><td>PLACE OF INTEREST SIGN</td></tr>
  <tr><td><span class="mac_key">&#x2303;</span></td><td>control</td><td>U+2303</td><td>UP ARROWHEAD</td></tr>
  <tr><td><span class="mac_key">&#x2325;</span></td><td>option / alt</td><td>U+2325</td><td>OPTION KEY</td></tr>
  <tr><td><span class="mac_key">&#x21e7;</span></td><td>shift</td><td>U+21E7</td><td>UPWARDS WHITE ARROW</td></tr>
  <tr><td><span class="mac_key">&#x2324;</span></td><td>enter</td><td>U+2324</td><td>UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS</td></tr>
  <tr><td><span class="mac_key">&#x238b;</span></td><td>escape / esc</td><td>U+238B</td><td>BROKEN CIRCLE WITH NORTHWEST ARROW</td></tr>
  <tr><td><span class="mac_key">&#x2196;</span></td><td>home</td><td>U+2196</td><td>NORTH WEST ARROW</td></tr>
  <tr><td><span class="mac_key">&#x2198;</span></td><td>end</td><td>U+2198</td><td>SOUTH EAST ARROW</td></tr>
  <tr><td><span class="mac_key">&#x21a9;</span></td><td>return</td><td>U+21A9</td><td>LEFTWARDS ARROW WITH HOOK</td></tr>
  <tr><td><span class="mac_key">&#x2191;</span></td><td><span class="mac_key">▲</span></td><td>U+2191</td><td>UPWARDS ARROW</td></tr>
  <tr><td><span class="mac_key">&#x2193;</span></td><td><span class="mac_key">▼</span></td><td>U+2193</td><td>DOWNWARDS ARROW</td></tr>
  <tr><td><span class="mac_key">&#x2190;</span></td><td><span class="mac_key">&#x25c0;</span></td><td>U+2190</td><td>LEFTWARDS ARROW</td></tr>
  <tr><td><span class="mac_key">&#x2192;</span></td><td><span class="mac_key">&#x25b6;</span></td><td>U+2192</td><td>RIGHTWARDS ARROW</td></tr>
  <tr><td><span class="mac_key">&#x232b;</span></td><td>delete</td><td>U+232B</td><td>ERASE TO THE LEFT</td></tr>
  <tr><td><span class="mac_key">&#x2326;</span></td><td>forward delete</td><td>U+2326</td><td>ERASE TO THE RIGHT</td></tr>
</table>

<p>command は使用頻度高いし、キーに印字してあるからすぐ覚えたんだけど、control や option は、印字してないし (MacBook Pro 2010-2011)、使用頻度同じくらいだしでよく間違える。</p>
<p>そこで、友達から、記号の意味がわかれば覚えるんじゃないか、といわれ、なるほどと思って調べてみた &amp; 推測してみた。</p>
<p>資料はおもに日本語版および英語版の Wikipedia なので、悪しからず。</p>

<h3><span class="mac_key">&#x2318;</span> (command)</h3>
<p>command キーを示す <span class="mac_key">&#x2318;</span> については、Wikipedia に詳しい記述がある</p>
<blockquote>
<p>初代Mac開発メンバーであったスーザン・ケアが、北欧の史跡などを示す交通標識に使われる <span class="mac_key">&#x2318;</span> マークを記号辞典で見つけ、採用したといわれている。開発段階ではアップルマークが使われていたが、コマンドキー表示としてアップルマークが連なるメニューを見たスティーブ・ジョブズが自社ロゴを濫用していると感じ、別のマークにするよう指示した。</p>
<p><a href="http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%AD%E3%83%BC#%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AE%E7%94%B1%E6%9D%A5" title="コマンドキー - Wikipedia" onclick="pageTracker._trackPageview('/outgoing/ja.wikipedia.org/wiki/_E3_82_B3_E3_83_9E_E3_83_B3_E3_83_89_E3_82_AD_E3_83_BC_E3_83_9E_E3_83_BC_E3_82_AF_E3_81_AE_E7_94_B1_E6_9D_A5?referer=');">コマンドキー &#8211; Wikipedia</a></p></blockquote>
<p>記号自体については <a href="http://en.wikipedia.org/wiki/Saint_John%27s_Arms" title="Saint John's Arms - Wikipedia, the free encyclopedia" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Saint_John_27s_Arms?referer=');">Saint John&#8217;s Arms</a> に詳しく、北欧で5-7世紀頃に使われていた記号だそうだ。Saint John&#8217;s Arms のほか Saint Hannes Cross などと呼ばれており (ただし、紀元前の木製スキーにも描かれているためキリスト教起源ではないとされる)、フィンランドでは、魔除けとして家の壁にペイントしたりするそうだ。</p>

<h3><span class="mac_key">&#x2303;</span> (control)</h3>
<p>そもそも control キーは下記のような役割をもつ。</p>
<blockquote>
<p>テレタイプ端末、及び初期のコンピューターキーボードでは、コントロールキーを押しながら他のキーを押すと、生成されるASCIIの下位5ビット以外がゼロとなった。これによりユーザーはASCIIの非表示文字である最初の32文字 (0&#215;00 &#8211; 0x1f) を生成、入力できる。</p>
<p><a href="http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%BC" title="コントロールキー - Wikipedia" onclick="pageTracker._trackPageview('/outgoing/ja.wikipedia.org/wiki/_E3_82_B3_E3_83_B3_E3_83_88_E3_83_AD_E3_83_BC_E3_83_AB_E3_82_AD_E3_83_BC?referer=');">コントロールキー &#8211; Wikipedia</a></p></blockquote>
<p>たとえば、J (0x4A, 1001010b) を control とともに押下することで、改行 (0x0A, 0001010b) を得られる。制御文字 = Control character を入力するためのキーなので control キーというわけだ。</p>
<p>上記の例で、改行文字を ^J と書く記法があり (<a href="http://en.wikipedia.org/wiki/Caret_notation" title="Caret notation - Wikipedia, the free encyclopedia" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Caret_notation?referer=');">Caret notation</a>, <a href="http://ja.wikipedia.org/wiki/ASCII#ASCII.E5.88.B6.E5.BE.A1.E6.96.87.E5.AD.97" title="ASCII - Wikipedia" onclick="pageTracker._trackPageview('/outgoing/ja.wikipedia.org/wiki/ASCII_ASCII.E5.88.B6.E5.BE.A1.E6.96.87.E5.AD.97?referer=');">ASCII</a> も参照)、この事で control を ^ で表すことになったらしい。そもそもなぜ ^ が使われたかはわからなかったが、この記法は Mac に限らない、一般的な記法らしい。</p>
<p>ただし、Unicode では、ASCII に含まれる ^ (U+005E, caret) と、Mac で control を示す <span class="mac_key">&#x2303;</span> (U+2303, up arrowhead) を区別している。</p>

<h3><span class="mac_key">&#x2325;</span> (option)</h3>
<p>option キーを示す <span class="mac_key">&#x2325;</span> については、Wikipedia に記述がない。Google で調べてみたら、Quora にそのものずばりの質問があった。</p>
<blockquote>
<p><a href="http://www.quora.com/Computer-Keyboards/What-is-the-origin-of-the-Macs-option-key-symbol-%E2%8C%A5" title="Computer Keyboards: What is the origin of the Mac's "option key" symbol (&#x2325;)? - Quora" onclick="pageTracker._trackPageview('/outgoing/www.quora.com/Computer-Keyboards/What-is-the-origin-of-the-Macs-option-key-symbol-_E2_8C_A5?referer=');">Computer Keyboards: What is the origin of the Mac&#8217;s &#8220;option key&#8221; symbol (<span class="mac_key">&#x2325;</span>)? &#8211; Quora</a></p></blockquote>
<p>その回答として、一番支持されてたものがこちら (抜粋)。</p>
<blockquote>
<p>It was clearly inspired by the electrical symbol for an SPDT switch:</p>
<p><img src="http://d2o7bfz2il9cb7.cloudfront.net/main-qimg-4dea10cdaa69e8b04531ff9cd7cd86a7" /></p></blockquote>
<p>この回路図の左側から流れる電流を、スイッチによって、右上に流すか、左下に流すか選択できる。通常の動作を別のものに切り替えるという事で option や alternate (alt) を示すのだろう。</p>

<h3><span class="mac_key">&#x21e7;</span> (shift)</h3>
<p>まずはシフトキーの由来。</p>
<blockquote>
<p>シフトキーの名称は、英文タイプライターが由来である。当初は刻印用の文字盤が水平に置かれて、下からの打鍵圧力により打刻される(アップストライク方式)構造だったが、その文字盤をシフトキーで「シフト(shift,ずらす)」という構造になっていた。</p>
<p><a href="http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%95%E3%83%88%E3%82%AD%E3%83%BC" title="シフトキー - Wikipedia" onclick="pageTracker._trackPageview('/outgoing/ja.wikipedia.org/wiki/_E3_82_B7_E3_83_95_E3_83_88_E3_82_AD_E3_83_BC?referer=');">シフトキー &#8211; Wikipedia</a></p></blockquote>
<p>shift は移す、替えるという意味で必ずしも上向きではない。上向きの矢印になったのは、下記の経緯によるのではないか。</p>
<blockquote>
<p>のちにタイプライターは文字盤を手前側に置かれ、前からの打鍵圧力によって打刻される(フロントストライク方式)構造へと移り変わった。その文字盤は「ずらす」のではなく「リフト(lift,持ち上げる)」されるが、呼称は変わることなく「シフト」と呼ばれ続けた。</p>
<p><a href="http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%95%E3%83%88%E3%82%AD%E3%83%BC" title="シフトキー - Wikipedia" onclick="pageTracker._trackPageview('/outgoing/ja.wikipedia.org/wiki/_E3_82_B7_E3_83_95_E3_83_88_E3_82_AD_E3_83_BC?referer=');">シフトキー &#8211; Wikipedia</a></p></blockquote>

<h3><span class="mac_key">&#x2324;</span> (enter)</h3>
<p>上の破線で部屋の入り口を、下の折れ線でその部屋に入る (enter) ことを示していると考えられる。</p>

<h3><span class="mac_key">&#x238B;</span> (escape)</h3>
<p>○で示した領域から、逃げ出す (escape) 様を矢印で示していると考えられる。</p>

<h3><span class="mac_key">&#x21df;</span> (page down) / <span class="mac_key">&#x21de;</span> (page up)</h3>
<p>省略を示す二本線をともなう矢印だろうか。</p>

<h3><span class="mac_key">&#x2196;</span> (home) / <span class="mac_key">&#x2198;</span> (end)</h3>
<p>欧文の文書における、文の始め = 一番上の行の一番左、文の終わり = 一番下の行の一番右、を示していると考えられる。</p>

<h3><span class="mac_key">&#x21a9;</span> (return) / <span class="mac_key">↑↓←→</span> / <span class="mac_key">&#x232b;</span> (delete) / <span class="mac_key">&#x2326;</span> (forward delete)</h3>
<p>このあたりは明確ですよね。</p>

<h3>ちなみに</h3>
<p>上記の記号を使うときは、フォントは Lucida Grande にしとくといい感じですよ。</p>
]]></content:encoded>
			<wfw:commentRss>http://penguinlab.jp/blog/post/2035/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Picup を利用して Rails アプリに iPhone / iPad から画像をアップロードする</title>
		<link>http://penguinlab.jp/blog/post/2004</link>
		<comments>http://penguinlab.jp/blog/post/2004#comments</comments>
		<pubDate>Thu, 14 Jul 2011 14:38:11 +0000</pubDate>
		<dc:creator>labocho</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://penguinlab.jp/blog/?p=2004</guid>
		<description><![CDATA[ご存じ iPhone / iPad のブラウザである Mobile Safari は、HTML5 の機能を多数実装してるわりに、&#60;input type=&#8221;file&#8221; /&#62; を使ったファイルのアップロードができない。 もちろん専用のネイティブアプリを作成すれば可能だけど、まあ、ほとんどの場合めんどくさいよね。 そこで、多少ユーザを選ぶけど、便利そうなのが William Lindmeier 氏制作の iOS アプリ Picup である。 ここでは、Picup の仕組みと、Rails アプリでの実装例を紹介する。 Picup の仕組み iOS や MacOS (X?) では、URL スキームにアプリケーションを関連づけられる。Picup の場合 fileupload:// に続けて、アプリに渡したいパラメータをつけて Safari 等で開けば、Picup にパラメータが渡され起動する。 サーバ側では、Picup の Web サイトで配布しているスクリプト (picup.js) を利用して、&#60;input type=&#8221;file&#8221; /&#62; を、fileupload://&#8230; を開くボタンに書き換える (別にこのスクリプトを使わなくても fileupload://&#8230; へのリンクを自前で作ってもいい)。 このボタンがクリックされると、POST 先の URL (postURL)、フィールド名 [...]]]></description>
			<content:encoded><![CDATA[<p>ご存じ iPhone / iPad のブラウザである Mobile Safari は、HTML5 の機能を多数実装してるわりに、&lt;input type=&#8221;file&#8221; /&gt; を使ったファイルのアップロードができない。</p>
<p>もちろん専用のネイティブアプリを作成すれば可能だけど、まあ、ほとんどの場合めんどくさいよね。</p>
<p>そこで、多少ユーザを選ぶけど、便利そうなのが <a href="http://wdlindmeier.com/blog/" title="William Lindmeier :: Post No Bills" onclick="pageTracker._trackPageview('/outgoing/wdlindmeier.com/blog/?referer=');">William Lindmeier</a> 氏制作の iOS アプリ <a href="http://Picupapp.com/" title="Picup ? File Upload App for The iPhone" onclick="pageTracker._trackPageview('/outgoing/Picupapp.com/?referer=');">Picup</a> である。</p>
<p>ここでは、Picup の仕組みと、Rails アプリでの実装例を紹介する。</p>
<h3>Picup の仕組み</h3>
<p>iOS や MacOS (X?) では、URL スキームにアプリケーションを関連づけられる。Picup の場合 fileupload:// に続けて、アプリに渡したいパラメータをつけて Safari 等で開けば、Picup にパラメータが渡され起動する。</p>
<p>サーバ側では、Picup の Web サイトで配布しているスクリプト (picup.js) を利用して、&lt;input type=&#8221;file&#8221; /&gt; を、fileupload://&#8230; を開くボタンに書き換える (別にこのスクリプトを使わなくても fileupload://&#8230; へのリンクを自前で作ってもいい)。</p>
<p>このボタンがクリックされると、POST 先の URL (postURL)、フィールド名 (postImageParam) などのパラメータを渡して Picup が起動される。そして、Picup 上で、ユーザーが、カメラで撮影するか既存の写真を選択し、Done をタップすると、さきほど渡されたパラメータをもとに POST してくれる。</p>
<p>さらに、callbackURL を指定すると、POST 後に任意の URL を Safari で開くこともできる。その際に # 以降にいくつかパラメータが渡されるので、それを利用して、ユーザーを誘導することもできる。</p>
<h3>Rails での作例</h3>
<p>以下では、Ruby 1.9.2 + Rails 3.0.7 + carrierwave で Picup による写真のアップロードに対応した Rails アプリを作る。</p>
<p>とりあえず初期設定。</p>

<code class="prettyprint lang-bsh">$ rails new picup_demo -d mysql -J</code>

<code class="prettyprint lang-ruby"># Gemfile
- gem 'mysql2'
+ gem 'mysql2', '0.2.7'
+ gem 'carrierwave'
+ gem 'jquery-rails'</code>

<code class="prettyprint lang-bsh">$ bundle
$ rails g jquery:install</code>

<p>jquery や後述の picup.js をロードするようにする。</p>

<code class="prettyprint lang-ruby"># app/views/layouts/application.html.erb
- &lt;%= javascript_include_tag :defaults %&gt;
+ &lt;%= javascript_include_tag :all %&gt;</code>

<p>写真のモデル・コントローラ・ビューを scaffold でつくる。</p>

<code class="prettyprint lang-bsh">$ rails g scaffold photo file:string
$ rake db:create
$ rake db:migrate</code>

<p>アップローダをつくり、photos.file に設定する。</p>

<code class="prettyprint lang-bsh">$ rails g uploader photo</code>

<code class="prettyprint lang-ruby"># app/models/photo.rb
class Photo &lt; ActiveRecord::Base
+ mount_uploader :file, PhotoUploader
end</code>

<p>フォームのフィールドを、type=&#8221;file&#8221; にする。show で写真を表示する。</p>

<code class="prettyprint lang-ruby"># app/views/photos/_form.html.erb
- &lt;%= form_for(@photo) do |f| %&gt;
+ &lt;%= form_for(@photo, html: {multipart: true}) do |f| %&gt;
- &lt;%= f.text_field :file %&gt;
+ &lt;%= f.file_field :file %&gt;</code>

<code class="prettyprint lang-ruby"># app/views/photos/show.html/erb
- &lt;%= @photo.file %&gt;
+ &lt;%= image_tag(@photo.file.url) %&gt;</code>

<p>この時点で PC の Web ブラウザからアップロードできるか確認しておくとよい。</p>

<code class="prettyprint lang-bsh">$ rails s
# http://localhost:3000/photos/new へ Web ブラウザでアクセス</code>

<p>Picup のヘルパースクリプトを導入。<a href="http://picupapp.com/picup.js.zip" onclick="pageTracker._trackPageview('/outgoing/picupapp.com/picup.js.zip?referer=');">http://picupapp.com/picup.js.zip</a> をダウンロード、展開し、picup.js を public/javascripts 下に移動する。</p>
<p>type=&#8221;file&#8221; のフィールドを Picup を開くボタンに置き換える。</p>

<code class="prettyprint lang-html"># app/views/photos/_form.html.erb
&lt;script type="text/javascript" charset="utf-8"&gt;
  $(function(){
    window.name = "Picup_demo_new_photo"; // アップロード後表示されるページから遷移するためにウィンドウ名をつけておく
    Picup.convertFileInput(
      "photo_file", // &lt;input type="file" /&gt; の ID
      { 'referrername': escape('Picup Demo'), // Picup に表示されるアプリケーション名
        'purpose': escape('Upload A Photo'), //Picup に表示されるメッセージ
        'postImageParam': 'photo_file', // フィールド名、この場合、rails では params[:photo_file] でアクセスできる。
        'postURL': 'http://192.168.1.10:3000/photos.json', // post先
        'callbackURL': 'http://192.168.1.10:3000/uploaded' // アップロード後に開く URL
      }
    );
  });
&lt;/script&gt;</code>

<code class="prettyprint lang-ruby"># app/controllers/photos_controller.rb
def create
- @photo = Photo.new(params[:photo])
+ @photo = Photo.new(file: params[:photo_file])</code>

<p>IPアドレスは適当に書き換えて。 ここまででとりあえずアップロードはできる。 (アップロード後表示されるページは RoutingError になっちゃうけど、/photos を見ると、正しくアップロードできているのが確認できる)</p>

<p>アップロード後、アップロードされた写真のページへ遷移させたいので、create のレスポンスに、そのページの URL を含ませる。</p>

<code class="prettyprint lang-ruby"># app/controllers/photos_controller.rb
  format.html { redirect_to(@photo, :notice =&gt; 'Photo was successfully created.') }
  format.xml { render :xml =&gt; @photo, :status =&gt; :created, :location =&gt; @photo }
+ format.json {
+   imgur_like_response = {
+     rsp: {
+       stat: "ok",
+       image: {
+         original_image: photo_url(@photo)
+       }
+     }
+   }
+   render :json =&gt; imgur_like_response
+ }</code>

<p>{rsp: &#8230;} となっているハッシュは、<a href="http://imgur.com/" title="imgur: the simple image sharer" onclick="pageTracker._trackPageview('/outgoing/imgur.com/?referer=');">imgur</a> に画像をアップロードした際のレスポンスを模したものである。いままで触れなかったが、Picup は postURL の指定がない場合、imgur.com に画像をアップロードする。その際、レスポンスに含まれる original_image の値は、アップロード後開かれる URL の # 以降に remoteImageURL=&#8230; の形で渡される (imgur.com からのレスポンスでは他にもいろいろな情報が付与されているが、無視されている)。</p>

<code class="prettyprint lang-html"># public/uploaded.html
&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
  &lt;title&gt;Picup Demo&lt;/title&gt;
    &lt;script&gt;
      &lt;!--
      var redirect = function() {
        var keys_values = window.location.hash.substring(1).split("&amp;");
        var params = {};
        for(var i = 0; i &lt; keys_values.length; i += 1){
          var key_value = keys_values[i].split("=");
          params[key_value[0]] = key_value[1];
        }
        if (params.remoteImageURL) {
          window.open(unescape(params.remoteImageURL), 'Picup_demo_new_photo');
          window.close();
        }
      };
      redirect();
      //--&gt;
    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;アップロード完了&lt;/h1&gt;
    &lt;a href="javascript:redirect();"&gt;自動的に移動しない場合はここをタップしてください。&lt;/a&gt;
  &lt;/body&gt;
&lt;/html&gt;</code>

<p>これが、アップロード後開かれるページである。URL の # 以降の remoteImageURL=&#8230; の値を読み出し、もともとフォームを表示していたタブ (Picup_demo_new_photo) で開き、このページ自身は閉じるようにしている。いちおうこれで、PC のブラウザからアップロードした際と似た挙動を実現できる。</p>
<p>なお、&lt;input type=&#8221;file&#8221; /&gt; の置き換えを、UA が Mobile Safari であることを確認した上で (Apple 公式の <a href="http://trac.webkit.org/wiki/DetectingWebKit" title="DetectingWebKit ? WebKit" onclick="pageTracker._trackPageview('/outgoing/trac.webkit.org/wiki/DetectingWebKit?referer=');">DetectingWebKit</a> を使えば簡単) 行えば、PC のブラウザでも Mobile Safari でもほぼ同じように使える。</p>
<h3>気になるところ</h3>
<p>先述のとおり Picup.convertFileInput には postImageParam オプションで、送信されるファイルのフィールド名を指定できる。ここは、Rails の規約に従って photo[file] としたいところだが、実際に試してみると、Rails にはフィールド名が photo%5bfile%5d として渡されてしまい、params[:photo][:file] のようなかたちではアクセスできない。無用なエスケープがされちゃってるんですね。ちょっと残念。</p>
<p>あと、POST のレスポンスをもうすこし利用できるとうれしい。imgur のレスポンスに特化してるのがもったいない。</p>
]]></content:encoded>
			<wfw:commentRss>http://penguinlab.jp/blog/post/2004/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>iBooks で日本語の辞書を引くように EPUB ファイルを変換するスクリプト</title>
		<link>http://penguinlab.jp/blog/post/1995</link>
		<comments>http://penguinlab.jp/blog/post/1995#comments</comments>
		<pubDate>Sat, 11 Jun 2011 12:50:21 +0000</pubDate>
		<dc:creator>labocho</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[epub]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://penguinlab.jp/blog/?p=1995</guid>
		<description><![CDATA[iPhone / iPad などの iBooks で、EPUB ファイルを読むとき、文字列を選択して辞書を引ける。ただ、ここで引ける辞書は (なぜか) EPUB の言語に依存するので、英語の本で辞書を引くと、英英辞書を引くことになる。 英和辞書を引くためには、EPUB 内のファイルを編集し、言語を日本語 (ja) にする必要がある。この手順は下記ページに詳しい。 2010-07-30 &#8211; 登 大遊＠筑波大学大学院コンピュータサイエンス専攻の SoftEther VPN 日記 ただ、この手順、結構めんどくさいので Ruby でスクリプト書いた。 Change language of EPUB file for looking up dictionary in iBooks &#8211; Gist Ruby (1.8.7 か 1.9.2) と RubyGems (1.8 の場合) があるなら、 gem install zipruby で、必要な gem を導入して、上記スクリプトをダウンロード。スクリプトのあるディレクトリで、 ruby change_lang_of_epub.rb (変換したい [...]]]></description>
			<content:encoded><![CDATA[
<p>iPhone / iPad などの iBooks で、EPUB ファイルを読むとき、文字列を選択して辞書を引ける。ただ、ここで引ける辞書は (なぜか) EPUB の言語に依存するので、英語の本で辞書を引くと、英英辞書を引くことになる。</p>
<p>英和辞書を引くためには、EPUB 内のファイルを編集し、言語を日本語 (ja) にする必要がある。この手順は下記ページに詳しい。</p>
<ul>
	<li><a title="2010-07-30 - 登 大遊＠筑波大学大学院コンピュータサイエンス専攻の SoftEther VPN 日記" href="http://d.hatena.ne.jp/softether/20100730" onclick="pageTracker._trackPageview('/outgoing/d.hatena.ne.jp/softether/20100730?referer=');">2010-07-30 &#8211; 登 大遊＠筑波大学大学院コンピュータサイエンス専攻の SoftEther VPN 日記</a></li>
</ul>
<p>ただ、この手順、結構めんどくさいので Ruby でスクリプト書いた。</p>
<ul>
	<li><a title="Change language of EPUB file for looking up dictionary in iBooks - Gist" href="https://gist.github.com/1009210" onclick="pageTracker._trackPageview('/outgoing/gist.github.com/1009210?referer=');">Change language of EPUB file for looking up dictionary in iBooks &#8211; Gist</a></li>
</ul>
<p>Ruby (1.8.7 か 1.9.2) と RubyGems (1.8 の場合) があるなら、</p>
<p><code>gem install zipruby</code></p>
<p>で、必要な gem を導入して、上記スクリプトをダウンロード。スクリプトのあるディレクトリで、</p>
<p><code>ruby change_lang_of_epub.rb (変換したい EPUB ファイル)</code></p>
<p>とすれば、(元のファイル名).ja.epub というファイルが生成されます。</p>
<p><code>ruby change_lang_of_epub.rb (変換したい EPUB ファイル) (言語コード)</code></p>
<p>とすれば、日本語 (ja) 以外の言語コードも指定できます。</p>
<p>Ruby はこの手のスクリプトがさくっと書けてよかですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://penguinlab.jp/blog/post/1995/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>無限大を含む Date の Range で include? (include_with_range?) に失敗する</title>
		<link>http://penguinlab.jp/blog/post/1986</link>
		<comments>http://penguinlab.jp/blog/post/1986#comments</comments>
		<pubDate>Tue, 10 May 2011 16:24:03 +0000</pubDate>
		<dc:creator>labocho</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://penguinlab.jp/blog/?p=1986</guid>
		<description><![CDATA[Ruby + ActiveSupport で、ある期間と別の期間との関係を調べるメソッドを書いてたところ、期間に無限大を含む場合に失敗した。 # ruby 1.8.7 require "date" require "rubygems" require "active_support" (Date.today..(1.0 / 0)).include?(Date.today..Date.tomorrow) # true これは問題ないが、逆にすると... (Date.today..Date.tomorrow).include?(Date.today..(1.0 / 0)) # NoMethodError: undefined method `]]></description>
			<content:encoded><![CDATA[<p>Ruby + ActiveSupport で、ある期間と別の期間との関係を調べるメソッドを書いてたところ、期間に無限大を含む場合に失敗した。</p>
<code class="prettyprint lang-ruby"># ruby 1.8.7
require "date"
require "rubygems"
require "active_support"

(Date.today..(1.0 / 0)).include?(Date.today..Date.tomorrow) # true これは問題ないが、逆にすると...
(Date.today..Date.tomorrow).include?(Date.today..(1.0 / 0)) # NoMethodError: undefined method `<=' for nil:NilClass
</code>
<p>ActiveSupport のコードを追ってみると、原因は Float &lt;=&gt; Date で nil が返ってしまう点にあるらしい。</p>
<code class="prettyprint lang-ruby">Date.today <=> 1.0 # 1
1.0 <=> Date.today # nil
</code>
<p>Date が演算子の左側にある場合、Date#&lt;=&gt; が呼ばれる。実装は下記。</p>
<code class="prettyprint lang-ruby"># File lib/date.rb, line 1267
def &lt;=&gt; (other)
  case other
  when Numeric; return @ajd  &lt;=&gt; other
  when Date;    return @ajd  &lt;=&gt; other.ajd
  end
  nil
end
</code>
<p>演算子の右側が Numeric なら、@ajd と比較している。@ajd は、紀元前4713年1月1日からの日数を示す数値。数値なので Float と比較できる。</p>
<p>いっぽう、Float が演算子の左側にある場合は、Float#&lt;=&gt; が呼ばれるため、Date をどう扱っていいかわからず、比較できない。</p>
<p>そこで Date#coerce を実装した。</p>
<code class="prettyprint lang-ruby">require "date"
class Date
  def coerce(other)
    return [other, @ajd] if other.is_a? Numeric
    nil
  end
end
</code>
<p>Numeric は、比較対象と型が異なる場合、比較対象の coerce メソッドを (あれば) 呼び出して、型を合わせてから比較する。これにより、@ajd を使って比較できるようにする。<br />これで演算子の左側が Float でも比較できるようになり、include? や overlaps? も動く。</p>
<code class="prettyprint lang-ruby">1.0 <=> Date.today # -1
(Date.today..Date.tomorrow).include?(Date.today..(1.0 / 0)) # false
</code>
<p>また、始点に Float を、終点に Date を持つ Range も作成できる。</p>
<code class="prettyprint lang-ruby">(-(1.0 / 0)..Date.today) # 無限遠の過去から今日までの Range
</code>
<p>include? や overlaps? 含め、おおむね期待どおりに動くが、この場合、Date の範囲でなく Float の範囲になってしまうので、Enumerable にならないなどの制限がある。</p>
<p>しかし coerce なんて、ごく最近、<a href="http://www.amazon.co.jp/gp/product/4873113946/ref=as_li_ss_tl?ie=UTF8&#038;tag=labocho-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4873113946" onclick="pageTracker._trackPageview('/outgoing/www.amazon.co.jp/gp/product/4873113946/ref=as_li_ss_tl?ie=UTF8_038_tag=labocho-22_038_linkCode=as2_038_camp=247_038_creative=7399_038_creativeASIN=4873113946&amp;referer=');">プログラミング言語 Ruby</a><img src="http://www.assoc-amazon.jp/e/ir?t=&#038;l=as2&#038;o=9&#038;a=4873113946" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
 読むまで知らなかった。記述細かいなあと思ってたけど、役に立つもんですね。</p>
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=labocho-22&#038;o=9&#038;p=8&#038;l=as4&#038;m=amazon&#038;f=ifr&#038;ref=ss_til&#038;asins=4873113946" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
]]></content:encoded>
			<wfw:commentRss>http://penguinlab.jp/blog/post/1986/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>転職しました</title>
		<link>http://penguinlab.jp/blog/post/1972</link>
		<comments>http://penguinlab.jp/blog/post/1972#comments</comments>
		<pubDate>Thu, 31 Mar 2011 12:42:40 +0000</pubDate>
		<dc:creator>labocho</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://penguinlab.jp/blog/?p=1972</guid>
		<description><![CDATA[以下、私的な内容です。 年始のご挨拶 でも、ちらっと書いていますが、2011 年 3 月31 日付で、三重大学附属図書館を退職し、同 4 月 1 日より、Web アプリケーション開発を主たる事業とする会社に就職しました。 三重大学附属図書館には、4 年もの間お世話になり、いろいろな人と出会い、いろいろな仕事をやらせていただきました。月並みですが、この 4 年間がなければ、今の私はなかったと思います。 同僚のみんなと毎日会えなくなるのは、ほんとにさみしいです。こんな気持ちは大学の卒業式以来です。 また、ネットを通じて、素敵なライブラリアンの皆さんを知ることができたのも幸せでした。ライブラリアンっておもしろいひと多いよね (観測範囲狭いけど)。 今後、図書館との関わりがどうなっていくのか、まだわかりませんが、なんだかんだでゆるいつながりがあるので、ときどきは図書館と関わっていくんじゃないかと予想しています。 みなさん、ありがとうございました。そして、これからもよろしく。]]></description>
			<content:encoded><![CDATA[
<p>以下、私的な内容です。</p>
<p><a href="http://penguinlab.jp/blog/post/1946">年始のご挨拶</a> でも、ちらっと書いていますが、2011 年 3 月31 日付で、三重大学附属図書館を退職し、同 4 月 1 日より、Web アプリケーション開発を主たる事業とする会社に就職しました。</p>
<p>三重大学附属図書館には、4 年もの間お世話になり、いろいろな人と出会い、いろいろな仕事をやらせていただきました。月並みですが、この 4 年間がなければ、今の私はなかったと思います。</p>
<p>同僚のみんなと毎日会えなくなるのは、ほんとにさみしいです。こんな気持ちは大学の卒業式以来です。</p>
<p>また、ネットを通じて、素敵なライブラリアンの皆さんを知ることができたのも幸せでした。ライブラリアンっておもしろいひと多いよね (観測範囲狭いけど)。</p>
<p>今後、図書館との関わりがどうなっていくのか、まだわかりませんが、なんだかんだでゆるいつながりがあるので、ときどきは図書館と関わっていくんじゃないかと予想しています。</p>
<p>みなさん、ありがとうございました。そして、これからもよろしく。</p>
]]></content:encoded>
			<wfw:commentRss>http://penguinlab.jp/blog/post/1972/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)

Served from: penguinlab.jp @ 2012-02-08 10:15:00 -->
