<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="ja-JP" xmlns="http://www.w3.org/2005/Atom">
  <title>Design Recipe &#21029;&#39208; Blog - Home</title>
  <id>tag:blog.designrecipe.jp,2010:mephisto/</id>
  <generator version="0.8.0" uri="http://mephistoblog.com">Mephisto Drax</generator>
  <link href="http://blog.designrecipe.jp/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://blog.designrecipe.jp/" rel="alternate" type="text/html"/>
  <updated>2010-01-02T10:19:12Z</updated>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-12-31:501</id>
    <published>2009-12-31T10:42:00Z</published>
    <updated>2010-01-02T10:19:12Z</updated>
    <category term="ruby"/>
    <link href="http://blog.designrecipe.jp/2009/12/31/callback-filters" rel="alternate" type="text/html"/>
    <title>Rails &#12398;&#12467;&#12531;&#12525;&#12540;&#12521;&#12398;&#12501;&#12451;&#12523;&#12479;&#12398;&#12424;&#12358;&#12394;&#12418;&#12398;&#12434;&#23455;&#35013;&#12375;&#12390;&#12415;&#12427;</title>
<content type="html">
            &lt;p&gt;Rails のコントローラで利用できるフィルターのような機能を Rails ではないアプリに組み込みたく、実装してみることにした。&lt;/p&gt;

&lt;p&gt;ちなみに、Rails のコントローラ内で利用できるフィルタには、以下のものがある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;before_filter&lt;/code&gt;: アクションの前に実行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;after_filter&lt;/code&gt; : アクションの後に実行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;around_filter&lt;/code&gt;: アクションの前後で実行&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;あまりよい例を出せないのだが、現在以下のクラスが既に実装されているものとする。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;initialize&lt;/span&gt;(out = &lt;span class=&quot;co&quot;&gt;STDOUT&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt; = out&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;hello&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;.puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;hello!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;Rails のフィルターのように上記の &lt;code&gt;hello&lt;/code&gt; メソッドの前後で実行するための機能を&lt;strong&gt;Class Macro&lt;/strong&gt;で追加できるようにしたい。
実装イメージとしては、以下のような感じ。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ...&lt;tt&gt;
&lt;/tt&gt;  before_filter &lt;span class=&quot;sy&quot;&gt;:before_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  after_filter &lt;span class=&quot;sy&quot;&gt;:after_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  ...&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  private&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;before_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;.puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Ya!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;after_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;.puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;bye!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Greeting&lt;/span&gt;.new.hello&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; Ya!      # 「hello!」の前に表示される&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; hello!&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; bye!     # 「hello!」の後に表示される&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;通したいテストは以下のような感じ。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test/unit&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;GreetingTest&lt;/span&gt; &amp;lt; &lt;span class=&quot;co&quot;&gt;Test&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Unit&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;TestCase&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;setup&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;StringIO&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@greeting&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;Greeting&lt;/span&gt;.new(&lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;test_running_filters&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@greeting&lt;/span&gt;.hello&lt;tt&gt;
&lt;/tt&gt;    assert_equal [&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Ya!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;hello!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;bye!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;], &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;.string.split(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;やることは、2つ。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;既に実装されている&lt;code&gt;Greeting#hello&lt;/code&gt;メソッドには手を入れないで機能を追加する。&lt;/li&gt;
&lt;li&gt;前後に呼び出す機能をコールバックとして定義し、実行できるようにする。&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;全て1から実装するのはシンドイので。。なにかと便利な ActiveSupport を使う。&lt;/p&gt;

&lt;p&gt;ActiveSupport には、&lt;code&gt;ActiveSupport::Callbacks&lt;/code&gt; というモジュールがあり、Rails のコントローラのフィルタでもこのモジュールが利用されている。拝借する。&lt;/p&gt;

&lt;p&gt;まずは、前後に挟む機能を定義するためのフィルタの準備。モジュールで準備する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;rubygems&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;active_support&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Filters&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.included(base)&lt;tt&gt;
&lt;/tt&gt;    base.class_eval &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      include &lt;span class=&quot;co&quot;&gt;ActiveSupport&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Callbacks&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      define_callbacks &lt;span class=&quot;sy&quot;&gt;:before_filter&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:after_filter&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;このモジュールは、利用するクラスでインクルードされると、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ActiveSupport::Callbacks&lt;/code&gt; モジュールをインクルードする。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ActiveSupport::Callbacks&lt;/code&gt; モジュールで定義されている &lt;code&gt;define_callbacks&lt;/code&gt; メソッドで &lt;code&gt;:before_filter&lt;/code&gt;、&lt;code&gt;:after_filter&lt;/code&gt; をコールバックメソッドとして定義する。&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;ということを行う。&lt;/p&gt;

&lt;p&gt;これで、&lt;code&gt;Greeting&lt;/code&gt; クラスで &lt;code&gt;Filters&lt;/code&gt; モジュールをインクルードすれば、&lt;code&gt;before_filter&lt;/code&gt;、&lt;code&gt;after_filter&lt;/code&gt; でコールバックメソッドが定義できるようになる。&lt;/p&gt;

&lt;p&gt;後は、&lt;code&gt;Greeting&lt;/code&gt; クラスの中で、それぞれのコールバックされるメソッドを記述し、コールバックメソッドの呼び出しを行なわないといけない。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Class&lt;/strong&gt; で &lt;code&gt;Greeting&lt;/code&gt; クラスを再定義し、&lt;strong&gt;Around Alias&lt;/strong&gt; で既にある &lt;code&gt;hello&lt;/code&gt; メソッドに機能を追加する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  include &lt;span class=&quot;co&quot;&gt;Filters&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  before_filter &lt;span class=&quot;sy&quot;&gt;:before_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  after_filter &lt;span class=&quot;sy&quot;&gt;:after_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;hello_with_filters&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run_callbacks(&lt;span class=&quot;sy&quot;&gt;:before_filter&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    hello_without_filters&lt;tt&gt;
&lt;/tt&gt;    run_callbacks(&lt;span class=&quot;sy&quot;&gt;:after_filter&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  alias_method &lt;span class=&quot;sy&quot;&gt;:hello_without_filters&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:hello&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  alias_method &lt;span class=&quot;sy&quot;&gt;:hello&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:hello_with_filters&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  private&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;before_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;.puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Ya!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;after_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;.puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;bye!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;最終的に1つのファイルに以下のように記述している。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;filter_example1.rb&lt;/code&gt;:&lt;/strong&gt;
&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;51&lt;tt&gt;
&lt;/tt&gt;52&lt;tt&gt;
&lt;/tt&gt;53&lt;tt&gt;
&lt;/tt&gt;54&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;55&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;56&lt;tt&gt;
&lt;/tt&gt;57&lt;tt&gt;
&lt;/tt&gt;58&lt;tt&gt;
&lt;/tt&gt;59&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;60&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;61&lt;tt&gt;
&lt;/tt&gt;62&lt;tt&gt;
&lt;/tt&gt;63&lt;tt&gt;
&lt;/tt&gt;64&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;65&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# 既存のクラス&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;initialize&lt;/span&gt;(out = &lt;span class=&quot;co&quot;&gt;STDOUT&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt; = out&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;hello&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;.puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;hello!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;rubygems&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;active_support&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Filters&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.included(base)&lt;tt&gt;
&lt;/tt&gt;    base.class_eval &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      include &lt;span class=&quot;co&quot;&gt;ActiveSupport&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Callbacks&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      define_callbacks &lt;span class=&quot;sy&quot;&gt;:before_filter&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:after_filter&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# Greetin クラスを再定義&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  include &lt;span class=&quot;co&quot;&gt;Filters&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  before_filter &lt;span class=&quot;sy&quot;&gt;:before_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  after_filter &lt;span class=&quot;sy&quot;&gt;:after_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;hello_with_filters&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run_callbacks(&lt;span class=&quot;sy&quot;&gt;:before_filter&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    hello_without_filters&lt;tt&gt;
&lt;/tt&gt;    run_callbacks(&lt;span class=&quot;sy&quot;&gt;:after_filter&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;c&quot;&gt;# &lt;code&gt;ActiveSupport::CoreExtensions::Module#alias_method_chain&lt;/code&gt; を使えば1行で書ける&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  alias_method &lt;span class=&quot;sy&quot;&gt;:hello_without_filters&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:hello&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  alias_method &lt;span class=&quot;sy&quot;&gt;:hello&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:hello_with_filters&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  private&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;before_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;.puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Ya!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;after_greeting&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;.puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;bye!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# テスト&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test/unit&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;GreetingTest&lt;/span&gt; &amp;lt; &lt;span class=&quot;co&quot;&gt;Test&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Unit&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;TestCase&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;setup&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;StringIO&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@greeting&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;Greeting&lt;/span&gt;.new(&lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;test_running_filters&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@greeting&lt;/span&gt;.hello&lt;tt&gt;
&lt;/tt&gt;    assert_equal [&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Ya!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;hello!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;bye!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;], &lt;span class=&quot;iv&quot;&gt;@out&lt;/span&gt;.string.split(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;テストを実行。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; ruby filter_example1.rb&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Loaded&lt;/span&gt; suite filter_example1&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Started&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;.&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Finished&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;fl&quot;&gt;0.000389&lt;/span&gt; seconds.&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt; tests, &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt; assertions, &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt; failures, &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt; errors&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;OK だ。&lt;/p&gt;

&lt;p&gt;このくらいのことであれば、&lt;a href=&quot;http://aspectr.sourceforge.net/&quot;&gt;AspectR&lt;/a&gt; を使うこともできるが、より自由な組み込みができそう。&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-12-19:390</id>
    <published>2009-12-19T13:28:00Z</published>
    <updated>2009-12-19T14:27:06Z</updated>
    <category term="bash"/>
    <category term="linux"/>
    <link href="http://blog.designrecipe.jp/2009/12/19/bash-tips" rel="alternate" type="text/html"/>
    <title>bash &#12467;&#12510;&#12531;&#12489;&#12434;&#12418;&#12387;&#12392;&#20415;&#21033;&#12395;&#20351;&#12358;</title>
<content type="html">
            &lt;p&gt;地味ではあるが、bash が標準でもっている機能だけで、知っておくと結構便利に bash コマンドを利用できるので、メモしておく。&lt;/p&gt;

&lt;h2&gt;ディレクトリの移動&lt;/h2&gt;

&lt;h3&gt;ディレクトリをスタックして活用する/&lt;code&gt;pushd&lt;/code&gt;、&lt;code&gt;popd&lt;/code&gt;、&lt;code&gt;dirs&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;ディレクトリの移動には、&lt;code&gt;pushd&lt;/code&gt;、&lt;code&gt;popd&lt;/code&gt;、&lt;code&gt;dirs&lt;/code&gt; コマンドに慣れると便利。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pushd&lt;/code&gt; は移動したディレクトリをディレクトリスタックに追加していく。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;popd&lt;/code&gt; はその逆で、ディレクトリスタックを削除していく。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; pwd&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;taka&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; pushd ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Documents&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Documents ~&lt;tt&gt;
&lt;/tt&gt;$ pwd&lt;tt&gt;
&lt;/tt&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;Users&lt;/span&gt;/taka/&lt;span class=&quot;co&quot;&gt;Documents&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; pushd ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Desktop&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Desktop ~&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;Documents&lt;/span&gt; ~&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; pwd&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;taka/&lt;span class=&quot;co&quot;&gt;Desktop&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; pushd ..&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;radiant/tmp/&lt;tt&gt;
&lt;/tt&gt;~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;radiant/tmp ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Desktop ~&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;Documents&lt;/span&gt; ~&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; pwd&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;taka/work/radiant/tmp&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;追加されたディレクトリは、&lt;code&gt;dirs -v&lt;/code&gt; で確認できる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; dirs -v&lt;tt&gt;
&lt;/tt&gt; &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;  ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;radiant/tmp&lt;tt&gt;
&lt;/tt&gt; &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;  ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Desktop&lt;tt&gt;
&lt;/tt&gt; 2  ~&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;Documents&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;  ~&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;上記のディレクトリスタックの状態で、&lt;code&gt;~/Documents&lt;/code&gt; に移動したい場合は、&lt;code&gt;pushd +n&lt;/code&gt; を使う。&lt;code&gt;n&lt;/code&gt; には、上記リストの左側に表示されている番号を使用する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; pushd &lt;span class=&quot;i&quot;&gt;+2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Documents ~ ~&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;work/radiant/tmp ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Desktop&lt;tt&gt;
&lt;/tt&gt;$ pwd&lt;tt&gt;
&lt;/tt&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;Users&lt;/span&gt;/taka/&lt;span class=&quot;co&quot;&gt;Documents&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;ちょっとしたことだが、楽になる。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~/Desktop&lt;/code&gt; をディレクトリスタックから削除する場合には、&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; popd &lt;span class=&quot;i&quot;&gt;+1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;radiant/tmp ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Documents ~&lt;tt&gt;
&lt;/tt&gt;$ dirs -v&lt;tt&gt;
&lt;/tt&gt; 0  ~&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;work/radiant/tmp&lt;tt&gt;
&lt;/tt&gt; &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;  ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Documents&lt;tt&gt;
&lt;/tt&gt; 2  ~&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h3&gt;直前のディレクトリに戻る/&lt;code&gt;cd -&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;直前のディレクトリに戻りたい時は、&lt;code&gt;cd&lt;/code&gt; に &lt;code&gt;-&lt;/code&gt; の引数を与えればよい。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Documents&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd -&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;taka/&lt;span class=&quot;co&quot;&gt;Documents&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; pwd&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;taka/&lt;span class=&quot;co&quot;&gt;Documents&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;引数の再利用&lt;/h2&gt;

&lt;p&gt;前回利用したコマンドを再度利用する場合などには、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;直前のコマンドであれば、&lt;code&gt;!!&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ヒストリからの再利用であれば、&lt;code&gt;!n&lt;/code&gt;。&lt;code&gt;n&lt;/code&gt; は、&lt;code&gt;history&lt;/code&gt; コマンドで表示される履歴の番号&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;などが便利だが、この考え方は、引数にも利用できる。&lt;/p&gt;

&lt;p&gt;あるファイルをコピーして、そのファイルを vi などで開く場合、&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cp a.txt b.txt&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; vi b.txt&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;これは、以下の方法でいける。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cp a.txt b.txt&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; vi !:&lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;!&lt;/code&gt; を使うのはコマンドの時と同じ。その後に&lt;code&gt;:&lt;/code&gt;(コロン)と &lt;code&gt;n&lt;/code&gt;(数字)と入力する。数字の部分が前回のコマンドで利用した引数の位置。
上記の場合は、&lt;code&gt;b.txt&lt;/code&gt; を指定したいので、前回コマンドの2番目ということで、2 を指定している。&lt;/p&gt;

&lt;p&gt;また、最後の引数を使いたい場合には、&lt;code&gt;M-.&lt;/code&gt; (ESC キーを押した後に、&lt;code&gt;.&lt;/code&gt;)を入力すると、最後に使用したコマンドの最後の引数を自動で入力してくれる。&lt;/p&gt;

&lt;p&gt;上記のコマンドであれば、&lt;code&gt;vi&lt;/code&gt; と入力して、スペース、&lt;code&gt;M-.&lt;/code&gt; と入力すれば、&lt;code&gt;vi b.txt&lt;/code&gt; と入力される。&lt;/p&gt;

&lt;h2&gt;&lt;code&gt;{}&lt;/code&gt;(ブレース)を利用したファイルパスの展開&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;{}&lt;/code&gt;(ブレース)による文字列の展開は便利に使える。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; echo {one,two,three}sheep&lt;tt&gt;
&lt;/tt&gt;onesheep twosheep threesheep&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;{}&lt;/code&gt;(ブレース)の中で、文字列を並べる際にカンマの後にスペースを入れたくなるが、入れてしまうと展開してくれないので注意。&lt;/p&gt;

&lt;p&gt;日常生活でどう使えるか？&lt;/p&gt;

&lt;p&gt;ある設定ファイルを編集しようとする時に、その設定ファイルのバックアップファイルを作っておくのはよくやる行為。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{}&lt;/code&gt;(ブレース)を使って、以下のように書ける。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; sudo cp -p &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;etc&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;apache2/httpd.conf{,.back}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;ちょっと奇妙に見えるが、結果として、&lt;code&gt;/etc/apache2&lt;/code&gt; ディレクトリに &lt;code&gt;httpd.conf&lt;/code&gt; ファイルのコピーである &lt;code&gt;httpd.conf.back&lt;/code&gt; ファイルが作成される。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{}&lt;/code&gt;(ブレース)の最初のところで、&lt;code&gt;{&lt;/code&gt; の後に&lt;code&gt;,&lt;/code&gt;(コンマ)だけというのがミソで、上記のコマンドは、以下のように展開される。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; sudo cp -p &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;etc&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;apache2/httpd.conf &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;etc&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;apache2/httpd.conf.back&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;編集後、&lt;code&gt;diff&lt;/code&gt; を取る時にも同じ要領で便利に使える。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; diff -u &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;etc&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;apache2/httpd.conf{,.back}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;履歴(&lt;code&gt;history&lt;/code&gt;)を活用&lt;/h2&gt;

&lt;h3&gt;履歴をインクリメンタル検索/&lt;code&gt;C-r&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;上下矢印キー、もしくは、&lt;code&gt;C-p&lt;/code&gt;(コントロールキーを押しながらp) or &lt;code&gt;C-n&lt;/code&gt; でコマンドの履歴を表示できるが、探したいコマンドがある程度予測のついている場合には、&lt;code&gt;C-r&lt;/code&gt; が便利。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;C-r&lt;/code&gt; を入力後、過去に入力していたはずで、今回使用したいコマンドの文字列を入力すると、部分一致でインクリメンタルサーチとなる。入力一文字一文字で過去の履歴の中から検索してくれる。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;history&lt;/code&gt; から検索しているので、コマンドそのものでなくても、引数として預けた文字列でも探してくれる。&lt;/p&gt;

&lt;p&gt;希望のものが見つかったらそのまま Enter で即実行だが、引数などをちょっと変更したいときには、&lt;code&gt;C-f&lt;/code&gt;なり、&lt;code&gt;C-b&lt;/code&gt;などをタイプし、&lt;code&gt;C-r&lt;/code&gt; から抜けると、それまで部分一致で表示されていたコマンドがそのままプロプトに表示されるので、好きに編集する。&lt;/p&gt;

&lt;h3&gt;履歴の残し方をカスタマイズ&lt;/h3&gt;

&lt;p&gt;連続して入力した同じコマンドを全て履歴として残すことにはあまり必要性を感じないなぁという場合には、連続して入力された同じコマンドは残さないようにすることができる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; export &lt;span class=&quot;co&quot;&gt;HISTCONTROL&lt;/span&gt;=ignoreboth&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;コマンドが発行された時間を残しておきたい場合には、以下のようにする。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; export &lt;span class=&quot;co&quot;&gt;HISTTIMEFORMAT&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;%Y-%m-%d %T &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; history&lt;tt&gt;
&lt;/tt&gt;...&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;i&quot;&gt;496&lt;/span&gt;  &lt;span class=&quot;i&quot;&gt;2009&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;12&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;i&quot;&gt;21&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;56&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;37&lt;/span&gt; history&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;i&quot;&gt;497&lt;/span&gt;  &lt;span class=&quot;i&quot;&gt;2009&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;12&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;i&quot;&gt;21&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;56&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;40&lt;/span&gt; cp -p a.txt c.txt&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;i&quot;&gt;498&lt;/span&gt;  &lt;span class=&quot;i&quot;&gt;2009&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;12&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;i&quot;&gt;21&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;56&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;45&lt;/span&gt; cp -p a.txt d.txt&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;i&quot;&gt;499&lt;/span&gt;  &lt;span class=&quot;i&quot;&gt;2009&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;12&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;i&quot;&gt;21&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;56&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;49&lt;/span&gt; history&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;i&quot;&gt;500&lt;/span&gt;  &lt;span class=&quot;i&quot;&gt;2009&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;12&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;i&quot;&gt;21&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;58&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;50&lt;/span&gt; exit&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;i&quot;&gt;501&lt;/span&gt;  &lt;span class=&quot;i&quot;&gt;2009&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;12&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;19&lt;/span&gt; &lt;span class=&quot;i&quot;&gt;21&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;58&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;57&lt;/span&gt; history&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-11-28:248</id>
    <published>2009-11-28T22:00:00Z</published>
    <updated>2009-11-28T22:01:44Z</updated>
    <category term="ruby"/>
    <link href="http://blog.designrecipe.jp/2009/11/28/ruby-yaml-utf-8" rel="alternate" type="text/html"/>
    <title>Ruby YAML &#12521;&#12452;&#12502;&#12521;&#12522;&#12391;&#12398; UTF-8 &#12394;&#26085;&#26412;&#35486;&#12398;&#25201;&#12356;</title>
<content type="html">
            &lt;p&gt;日本発の言語でありながら、Ruby の YAML 標準ライブラリには弱点がある。。&lt;/p&gt;

&lt;p&gt;Ruby の YAML ライブラリは、日本語を正しく扱ってくれない。&lt;/p&gt;

&lt;p&gt;具体的には、&lt;code&gt;Object#to_yaml&lt;/code&gt; を使用した際に、UTF-8 な日本語が binary 扱いになってしまう。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; irb --prompt simple&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class=&quot;gv&quot;&gt;$KCODE&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;NONE&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class=&quot;gv&quot;&gt;$KCODE&lt;/span&gt; = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; str_ja = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;日本語&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;日本語&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; str_ja.to_yaml&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;--- !binary |&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;5pel5pys6Kqe&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;この問題を回避するためのライブラリが幾つかある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/kakutani/yaml_waml&quot;&gt;kakutani's yaml_waml at master - GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/ptb/ya2yaml/&quot;&gt;ptb's ya2yaml at master - GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;ここでは、&lt;code&gt;yaml_waml&lt;/code&gt; を使ってみる。&lt;/p&gt;

&lt;h2&gt;&lt;code&gt;yaml_waml&lt;/code&gt; を使う準備&lt;/h2&gt;

&lt;p&gt;gem で提供されているので、インストールしていない場合はインストールしておく。&lt;br /&gt;
なお、&lt;a href=&quot;http://gemcutter.org/&quot;&gt;gemcutter&lt;/a&gt; に移行されているので、gemcutter をまだ使っていない場合は、先に準備しておく。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; gem install gemcutter&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; gem tumble&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; gem sources&lt;tt&gt;
&lt;/tt&gt;*** &lt;span class=&quot;co&quot;&gt;CURRENT&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;SOURCES&lt;/span&gt; ***&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;http&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/gemcutter.org&lt;tt&gt;
&lt;/tt&gt;http&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/gems.rubyforge.org/&lt;tt&gt;
&lt;/tt&gt;http&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/gems.github.com&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;yaml_waml&lt;/code&gt; のインストール。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; gem install yaml_waml&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Successfully&lt;/span&gt; installed yaml_waml-&lt;span class=&quot;fl&quot;&gt;0.3&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt; gem installed&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; ri documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; yaml_waml-&lt;span class=&quot;fl&quot;&gt;0.3&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;RDoc&lt;/span&gt; documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; yaml_waml-&lt;span class=&quot;fl&quot;&gt;0.3&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;...&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;&lt;code&gt;yaml_waml&lt;/code&gt; を使ってみる&lt;/h2&gt;

&lt;p&gt;先程の irb のプロンプトに引き続き実験。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;yaml_waml&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; str_ja.to_yaml&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;--- &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;er&quot;&gt;日&lt;/span&gt;&lt;span class=&quot;er&quot;&gt;本&lt;/span&gt;&lt;span class=&quot;er&quot;&gt;語&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;OK だ。&lt;/p&gt;

&lt;h2&gt;Rails で使用する&lt;/h2&gt;

&lt;p&gt;Rails で対応する場合には、&lt;code&gt;config/environment.rb&lt;/code&gt; で gem の指定しておく。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;Radiant&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Initializer&lt;/span&gt;.run &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |config|&lt;tt&gt;
&lt;/tt&gt;...&lt;tt&gt;
&lt;/tt&gt;  config.gem &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;yaml_waml&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:version&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;~&amp;gt; 0.3&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:source&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://gemcutter.org&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;のような感じ。&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-11-25:244</id>
    <published>2009-11-25T11:38:00Z</published>
    <updated>2009-11-25T11:40:46Z</updated>
    <category term="emacs"/>
    <category term="firefox"/>
    <link href="http://blog.designrecipe.jp/2009/11/25/edit-textbox-using-favorite-editor" rel="alternate" type="text/html"/>
    <title>&#12502;&#12521;&#12454;&#12470;&#12398;&#12486;&#12461;&#12473;&#12488;&#20837;&#21147;&#12434;&#22909;&#12415;&#12398;&#12456;&#12487;&#12451;&#12479;&#12391;</title>
<content type="html">
            &lt;h2&gt;&quot;It's All Text!&quot; を使ってみることに&lt;/h2&gt;

&lt;p&gt;最近になってこんな便利なものがあることに気づいた。。&lt;/p&gt;

&lt;p&gt;Web アプリケーションはホントに便利になり、大半のことはブラウザで行えてしまう。&lt;/p&gt;

&lt;p&gt;ただ・・・wiki、ブログ、tracking system などテキストを入力する機会が多いアプリを扱う際には、ブラウザのテキストボックスの入力欄ではちょっとストレスが溜まる。&lt;br /&gt;
最近はそれを補うワードプロセッサーのような機能を提供するものもあるが、好みのエディタで編集したいという欲望は抑え切れない。&lt;/p&gt;

&lt;p&gt;と、Radiant CMS の screencast を見ていた時にテキストボックスの編集を TextMate で行っているものがあった。そういうツールが既にあるんだ!ということでちょっと調べてみた。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/ja/firefox/addon/4125&quot;&gt;It's All Text! :: Add-ons for Firefox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;という Firefox のアドオンもあるようだ。&lt;br /&gt;
他にも、textserver というものがある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/tarao/textserver&quot;&gt;tarao's textserver at master - GitHub&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/tarao/20091105/1257463316&quot;&gt;好きなエディタでFirefoxに入力 - 貳佰伍拾陸夜日記&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;好んで使用しているのは Mac OS なのだが、Windows も使う必要がある。両方でうまく動作したのが &lt;a href=&quot;https://addons.mozilla.org/ja/firefox/addon/4125&quot;&gt;It's All Text!&lt;/a&gt; の方だったので、しばらくこちらを使っていくことにした。&lt;/p&gt;

&lt;h2&gt;ブラウザのテキストエリアを Emacs で編集&lt;/h2&gt;

&lt;p&gt;エディタは Emacs である必要はないのだが、大半のこと Emacs でやってしまっている身としては、Emacs が使えると非常にありがたい。&lt;br /&gt;
他エディタでも同様のことは可能だが、テキストボックスに入力するテキストの入力フォーマットに合わせて Emacs 側で編集モードをかえて編集できるのは便利だ。
Markdown であれば、&lt;a href=&quot;http://jblevins.org/projects/markdown-mode/&quot;&gt;Emacs markdown-mode&lt;/a&gt;、HTML であれば &lt;a href=&quot;http://ourcomments.org/Emacs/nXhtml/doc/nxhtml.html&quot;&gt;nXhtml - an Emacs mode for Web Development&lt;/a&gt; などという感じ。非常に快適だ。&lt;/p&gt;

&lt;h3&gt;インストールと設定&lt;/h3&gt;

&lt;p&gt;Firefox へのインストールは、下記から通常の手順で実施する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/ja/firefox/addon/4125&quot;&gt;It's All Text! :: Add-ons for Firefox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;アドオンの設定には、以下の設定を行う。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;上記は、Mac OS X の Carbon Emacs をエディタとして使用する場合の設定。上記のエディタのパスは汎用的なものではない。理由については後述する。&lt;/p&gt;

&lt;h3&gt;既に起動している Emacs のフレームのバッファを使用する&lt;/h3&gt;

&lt;p&gt;Carbon Emacs のパスは、&lt;code&gt;/Applications/Emacs.app/Contents/MacOS/Emacs&lt;/code&gt; となるので、これを指定してあげればいいのだが、これだと &quot;It's All Text!&quot; を使う度に、新たにフレームから立ち上げてしまう。Emacs は常に立ち上っているので、編集の度にフレームが複数上がるのはメンドい。既に起動している Emacs のバッファに表示させるようする。&lt;/p&gt;

&lt;p&gt;こういう時には、Emacs Server/Client を使えばよいようだ。&lt;/p&gt;

&lt;p&gt;エディタのパスには、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/Applications/Emacs.app/Contents/MacOS/bin/emacsclient&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;を指定しておいて、Emacs 側では、Emacs Server を起動しておく。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;M&lt;/span&gt;-x server-start&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;常に起動させるようにするには、&lt;code&gt;.emacs&lt;/code&gt; なりに、&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;(server-start)&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;を記入しておく。&lt;/p&gt;

&lt;p&gt;ただ、1つ問題が・・・&lt;br /&gt;
何故か設定画面にて、&lt;code&gt;emacsclient&lt;/code&gt; のフルパスが保存されない。理由はよくわからないが。&lt;/p&gt;

&lt;p&gt;仕方ないので、自身のホームディレクトリ配下の bin 配下に上記のシンボリックリンクを用意して、それを参照させる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;bin&lt;tt&gt;
&lt;/tt&gt;$ ln -s &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;Applications&lt;/span&gt;/&lt;span class=&quot;co&quot;&gt;Emacs&lt;/span&gt;.app/&lt;span class=&quot;co&quot;&gt;Contents&lt;/span&gt;/&lt;span class=&quot;co&quot;&gt;MacOS&lt;/span&gt;/bin/emacsclient emacsclient&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;これで、最初の設定画面のエディタのパスに &lt;code&gt;/Users/taka/bin/emacsclient&lt;/code&gt; が入ることになった。&lt;/p&gt;

&lt;p&gt;Emacs Client からバッファを開いた場合には、&lt;code&gt;C-x #&lt;/code&gt; でそのバッファを終了させるのがお行儀のよいやり方。&lt;/p&gt;

&lt;h3&gt;使い方&lt;/h3&gt;

&lt;p&gt;テキストボックスにカーソルを持っていくと、デフォルトでは右下(設定で変更可能)に &lt;strong&gt;&quot;編集&quot;&lt;/strong&gt; ボタンがでるので、それをクリック。設定したエディタがアクティブになる。&lt;/p&gt;

&lt;p&gt;マウスでわざわざクリックしなくても、ショトカットキーも割り合てることもできる。こちらも設定画面にて設定。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;以下は、エディタ(Emacs)側で編集を行っている画面。エディタ(Emacs)で保存を行えば、それがブラウザのテキストボックスに反映される。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;もっと早く知っておけばよかった。。&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-11-07:223</id>
    <published>2009-11-07T07:01:00Z</published>
    <updated>2009-11-07T09:20:27Z</updated>
    <category term="ruby"/>
    <category term="twitter"/>
    <link href="http://blog.designrecipe.jp/2009/11/7/twitter-unfollowers-simple-script" rel="alternate" type="text/html"/>
    <title>Twitter &#12391; Unfollowers (&#12450;&#12531;&#12501;&#12457;&#12525;&#12540;&#12434;&#12375;&#12383;&#26041;)&#12434;&#12481;&#12455;&#12483;&#12463;&#12377;&#12427;&#31777;&#26131;&#12473;&#12463;&#12522;&#12503;&#12488;</title>
<content type="html">
            &lt;h2&gt;スクリプトを準備した経緯&lt;/h2&gt;

&lt;p&gt;Twitter を始めて早2ヶ月が経とうとしている。&lt;/p&gt;

&lt;p&gt;「Google Reader なんかもういらない!」(&lt;a href=&quot;http://www.techcrunchit.com/2009/05/05/rest-in-peace-rss/&quot;&gt;Rest in Peace, RSS&lt;/a&gt;)という記事に触発されて始めてみたのだが、自分自身には相変わらず Google Reader は必需品だ。。(用途の棲み分けはできている)&lt;/p&gt;

&lt;p&gt;ただ、これまで触れ合うことはなかった方々と触れ合えたり、Google Reader と合わせて貴重な情報源となっており、今では Twitter も必需品だ。&lt;/p&gt;

&lt;p&gt;そんな中、「Twitter で Unfollowers (アンフォローをした方)を調べるにはどうしたらいいの？」という質問を受けた。&lt;/p&gt;

&lt;p&gt;現状身近な方には特に知らせることも無く、こっそり静かに Twitter を使っているのだが、自身の follower さんも少しづつ増えてきている。&lt;br /&gt;
この follower さん、増えるだけでは無く、当然ながら減ることもある。フォローされた場合は、メール通知の設定をしておけば、メールで知ることができるが、確かに、一度フォローした後、そのフォローを解除している方を知るための機能は標準では無さげだ。(きっと)&lt;/p&gt;

&lt;p&gt;標準では無さそうだが、同様のことをしてくれるサービスは既にあるだろう。車輪の再開発だが、Twitter のサードパティのサービス/アプリは多すぎて、、、簡単なものであれば自分で準備した方が手軽だ。&lt;/p&gt;

&lt;p&gt;しかし、もしかすると、これからやろうとしていることはパンドラの箱なのかもしれない。。&lt;br /&gt;
例えば、妻のアカウントからフォローされていたのに、ある日突然そのフォローが外れていたら、どう対応すればよいのだろう・・・知らぬが仏のような気もする。。&lt;/p&gt;

&lt;h2&gt;Unfollowers をチェックするスクリプト&lt;/h2&gt;

&lt;p&gt;まずは、Twitter API とやり取りを行うベースとなる簡易 Twitter クライアントを用意する。適当な名前付けで&lt;code&gt;SimpleTwitter&lt;/code&gt;とする。&lt;/p&gt;

&lt;h3&gt;SimpleTwitter&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;標準ライブラリ以外の原材料

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;httparty&lt;/code&gt; gem (&lt;a href=&quot;http://github.com/jnunemaker/httparty&quot;&gt;jnunemaker's httparty at master - GitHub&lt;/a&gt;)&lt;br /&gt;
 Twitter クライアントに特化した &lt;a href=&quot;http://twitter.rubyforge.org/&quot; title=&quot;Ruby Twitter Gem by John Nunemaker&quot;&gt;Ruby Twitter Gem&lt;/a&gt; などもあるが、
 汎用的なものを使いたくてこちらを選択。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用している Twitter API

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://apiwiki.twitter.com/Twitter-API-Documentation&quot;&gt;Twitter API Wiki / Twitter API Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;code&gt;httparty&lt;/code&gt; gem がインストールされていない場合には、事前にインストール。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; sudo gem install httparty&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; gem list httparty&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;*** &lt;span class=&quot;co&quot;&gt;LOCAL&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;GEMS&lt;/span&gt; ***&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;httparty (&lt;span class=&quot;fl&quot;&gt;0.4&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;)&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;今回の目的からは外れるが、Timeline の表示、Mention の表示も一応入れておく。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;simple_twitter.rb&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;forwardable&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;rubygems&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;httparty&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;SimpleTwitter&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  extend &lt;span class=&quot;co&quot;&gt;Forwardable&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  include &lt;span class=&quot;co&quot;&gt;HTTParty&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  base_uri &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;https://twitter.com&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# SSL で&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  def_delegator &lt;span class=&quot;sy&quot;&gt;&lt;span class=&quot;sy&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:get&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:get&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;initialize&lt;/span&gt;(user, password, options = {})&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; options.key? &lt;span class=&quot;sy&quot;&gt;:http_proxy&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      options[&lt;span class=&quot;sy&quot;&gt;:http_proxy_port&lt;/span&gt;] ||= &lt;span class=&quot;i&quot;&gt;8080&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.class.http_proxy options[&lt;span class=&quot;sy&quot;&gt;:http_proxy&lt;/span&gt;], options[&lt;span class=&quot;sy&quot;&gt;:http_proxy_port&lt;/span&gt;].to_i&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;iv&quot;&gt;@auth_info&lt;/span&gt; = { &lt;span class=&quot;sy&quot;&gt;:username&lt;/span&gt; =&amp;gt; user, &lt;span class=&quot;sy&quot;&gt;:password&lt;/span&gt; =&amp;gt; password }&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;timeline&lt;/span&gt;(which = &lt;span class=&quot;sy&quot;&gt;:friends&lt;/span&gt;, options = {})&lt;tt&gt;
&lt;/tt&gt;    auth_info_merge! options&lt;tt&gt;
&lt;/tt&gt;    get(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/statuses/&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;which&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;_timeline.json&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, options)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;mentions&lt;/span&gt;(options = {})&lt;tt&gt;
&lt;/tt&gt;    auth_info_merge! options&lt;tt&gt;
&lt;/tt&gt;    get(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/statuses/mentions.json&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, options)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;followers&lt;/span&gt;(options = {})&lt;tt&gt;
&lt;/tt&gt;    auth_info_merge! options&lt;tt&gt;
&lt;/tt&gt;    options[&lt;span class=&quot;sy&quot;&gt;:query&lt;/span&gt;] ||= {}&lt;tt&gt;
&lt;/tt&gt;    options[&lt;span class=&quot;sy&quot;&gt;:query&lt;/span&gt;].merge!({ &lt;span class=&quot;sy&quot;&gt;:cursor&lt;/span&gt; =&amp;gt; &lt;span class=&quot;i&quot;&gt;-1&lt;/span&gt; }) &lt;span class=&quot;r&quot;&gt;unless&lt;/span&gt; options[&lt;span class=&quot;sy&quot;&gt;:query&lt;/span&gt;].key? &lt;span class=&quot;sy&quot;&gt;:cursor&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    get(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/statuses/followers.json&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, options)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class=&quot;cl&quot;&gt;self&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;# 日付表示のフォーマット&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;format_time&lt;/span&gt;(time, format = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;%Y/%m/%d %H:%M:%S&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;      (time.is_a?(&lt;span class=&quot;co&quot;&gt;String&lt;/span&gt;) ? &lt;span class=&quot;co&quot;&gt;Time&lt;/span&gt;.parse(time) : time).strftime(format)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  private&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;auth_info_merge!&lt;/span&gt;(options)&lt;tt&gt;
&lt;/tt&gt;    options.merge!({ &lt;span class=&quot;sy&quot;&gt;:basic_auth&lt;/span&gt; =&amp;gt; &lt;span class=&quot;iv&quot;&gt;@auth_info&lt;/span&gt; })&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;タイムラインの表示などには、以下のような感じで使える。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;simple_twitter&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# 'user', 'password' には Twitter のログインアカウントとパスワードを指定&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;twitter = &lt;span class=&quot;co&quot;&gt;SimpleTwitter&lt;/span&gt;.new(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# Proxy を経由する必要がある場合&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# twitter = SimpleTwitter.new('user', 'password',&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;#   { :http_proxy =&amp;gt; 'proxy_server', :http_proxy_port =&amp;gt; 8080 })&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# query count のデフォルトは 20&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;twitter.timeline(&lt;span class=&quot;sy&quot;&gt;:friends&lt;/span&gt;, { &lt;span class=&quot;sy&quot;&gt;:query&lt;/span&gt; =&amp;gt; { &lt;span class=&quot;sy&quot;&gt;:count&lt;/span&gt; =&amp;gt; &lt;span class=&quot;i&quot;&gt;5&lt;/span&gt; } }).each &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |twit|&lt;tt&gt;
&lt;/tt&gt;  puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;twit[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;][&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;screen_name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;]&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;SimpleTwitter&lt;/span&gt;.format_time(twit[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;created_at&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;])&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;twit[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].to_s&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;):&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; +&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;twit[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;]&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;表示は以下のような感じ。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; delicious50 [2009/11/07 15:47:58](5501187604):&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   地球人ネットワークを創るアルク:スペースアルク http://bit.ly/lcfEp japan&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; delicious50 [2009/11/07 15:47:56](5501187311):&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   findability.org - by Peter Morville http://bit.ly/15KKUP findability ia&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; GuyKawasaki [2009/11/07 15:46:52](5501173816):&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   Guess who is a Glamour woman of the year? http://om.ly/bTqX&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; tek_news [2009/11/07 15:46:49](5501173203):&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   HNews: Someone actually created a pyramid scheme for Twitter popularity. http://bit.ly/20gVa5&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; GuyKawasaki [2009/11/07 15:46:46](5501172663):&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   The official rules of Shotgun http://om.ly/bTqU&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h3&gt;Unfollowers をチェックするスクリプト&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;標準ライブラリ以外の原材料

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;simple_twitter.rb&lt;/code&gt;&lt;br /&gt;
 上記にあるスクリプト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;&lt;code&gt;follows_unfollowers_check.rb&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;51&lt;tt&gt;
&lt;/tt&gt;52&lt;tt&gt;
&lt;/tt&gt;53&lt;tt&gt;
&lt;/tt&gt;54&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;55&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;56&lt;tt&gt;
&lt;/tt&gt;57&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;simple_twitter&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;FOLLOWERS_CSV&lt;/span&gt; = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;followers.csv&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;INDENT&lt;/span&gt; = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; * &lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;get_follower_user_list&lt;/span&gt;(twitter, cursor = &lt;span class=&quot;i&quot;&gt;-1&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  users = []&lt;tt&gt;
&lt;/tt&gt;  twit_followers = twitter.followers(&lt;span class=&quot;sy&quot;&gt;:query&lt;/span&gt; =&amp;gt; { &lt;span class=&quot;sy&quot;&gt;:cursor&lt;/span&gt; =&amp;gt; cursor })&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  twit_followers[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].each &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |follower|&lt;tt&gt;
&lt;/tt&gt;    users &amp;lt;&amp;lt; follower[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;screen_name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  next_cursor = (twit_followers[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;next_cursor&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;] ||= &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;unless&lt;/span&gt; next_cursor.to_i == &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    users.concat(get_follower_user_list(twitter, next_cursor))&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  users&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# 'user', 'password' には Twitter のログインアカウントとパスワードを指定&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;twitter = &lt;span class=&quot;co&quot;&gt;SimpleTwitter&lt;/span&gt;.new(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# Proxy を経由する必要がある場合&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# twitter = SimpleTwitter.new('user', 'password',&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;#   { :http_proxy =&amp;gt; 'proxy_server', :http_proxy_port =&amp;gt; 8008 })&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;current_users = get_follower_user_list(twitter)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;previous_users = []&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.exist? &lt;span class=&quot;co&quot;&gt;FOLLOWERS_CSV&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;begin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    previous_users = &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.open(&lt;span class=&quot;co&quot;&gt;FOLLOWERS_CSV&lt;/span&gt;).read.split(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;rescue&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    puts &lt;span class=&quot;gv&quot;&gt;$!&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    exit(&lt;span class=&quot;i&quot;&gt;9&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;unfollowers = previous_users - current_users&lt;tt&gt;
&lt;/tt&gt;new_follow_users = current_users - previous_users&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Follow User Stats at &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;SimpleTwitter&lt;/span&gt;.format_time(&lt;span class=&quot;co&quot;&gt;Time&lt;/span&gt;.now)&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; * &lt;span class=&quot;i&quot;&gt;50&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Current Follow Users count: %s&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; % current_users.size.to_s&lt;tt&gt;
&lt;/tt&gt;puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Unfollowers count: %s&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; % unfollowers.size.to_s&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;unfollowers.each &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |user|&lt;tt&gt;
&lt;/tt&gt;  puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;INDENT&lt;/span&gt;&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;user&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\t&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;SimpleTwitter&lt;/span&gt;.base_uri&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;user&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;New follow Users count: %s&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; % new_follow_users.size.to_s&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;new_follow_users.each &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |user|&lt;tt&gt;
&lt;/tt&gt;  puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;INDENT&lt;/span&gt;&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;user&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\t&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;SimpleTwitter&lt;/span&gt;.base_uri&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;user&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.open(&lt;span class=&quot;co&quot;&gt;FOLLOWERS_CSV&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;) { |f| f.write current_users * &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; }&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;結果は以下のような出力になる。(Emacs 上で &lt;a href=&quot;http://eigenclass.org/hiki.rb?rcodetools&quot;&gt;rcodetools&lt;/a&gt; を利用した際の表示)&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; Follow User Stats at 2009/11/07 15:03:01&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; ==================================================&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; Current Follow Users count: 65&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; Unfollowers count: 7&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   SavvyExplorer     https://twitter.com/SavvyExplorer&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   talyaalove        https://twitter.com/talyaalove&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   59minlearning     https://twitter.com/59minlearning&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   lifefulfillment   https://twitter.com/lifefulfillment&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   follow4profit     https://twitter.com/follow4profit&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   Forex_Blog        https://twitter.com/Forex_Blog&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   VirtualTotte      https://twitter.com/VirtualTotte&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt; New follow Users count: 6&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   RecognitionApps   https://twitter.com/RecognitionApps&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   kazuyo_k          https://twitter.com/kazuyo_k&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   Dewina_Olivera    https://twitter.com/Dewina_Olivera&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   HP_AppSecurity    https://twitter.com/HP_AppSecurity&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   videotodaynews    https://twitter.com/videotodaynews&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# &amp;gt;&amp;gt;   devtube           https://twitter.com/devtube&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;実行は、&lt;code&gt;simple_twitter.rb&lt;/code&gt; と &lt;code&gt;follows_unfollowers_check.rb&lt;/code&gt; を同じディレクトリにおいておいて、&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; ruby ./follows_unfollowers_check.rb&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;前回スクリプトを動かした時との差分が表示される。&lt;/p&gt;

&lt;p&gt;正確にやろうと思うと、細目にこのスクリプトを動かしておかないといけない。前回動作時との間に follow/unfollow の両方を行ったアカウントは捉えられないので。&lt;br /&gt;
また、結果の出力は標準出力以外のもの、メールでの送信などにしておくのもよいかもしれない。&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-11-03:220</id>
    <published>2009-11-03T22:51:00Z</published>
    <updated>2009-11-03T23:06:20Z</updated>
    <category term="cloud"/>
    <category term="git"/>
    <link href="http://blog.designrecipe.jp/2009/11/3/issue-bug-tracking-unfuddle-create-account" rel="alternate" type="text/html"/>
    <title>Issue/Bug &#12488;&#12521;&#12483;&#12461;&#12531;&#12464;&#12471;&#12473;&#12486;&#12512;/Git &#12522;&#12509;&#12472;&#12488;&#12522; Unfuddle &#12434;&#35430;&#12375;&#12390;&#12415;&#12427;</title>
<content type="html">
            &lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://unfuddle.com/&quot;&gt;Unfuddle: Subversion Hosting, Git Hosting, Bug and Issue Tracking&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Issue/Bug トラッキングシステムであり、Git/Subversion リポジトリの管理(Viewer だけではない)も行えるサービス。&lt;/p&gt;

&lt;p&gt;Issue/Bug トラッキングシステムとソースリポジトリの連携は今では無くてはならない環境と(個人的には)なっている。&lt;br /&gt;
チケット駆動型の開発に慣れてしまうと、チケットを作成せずにソースに手を入れるというのは何となく心許ない。。&lt;/p&gt;

&lt;p&gt;このような Issue 管理システムを使わずとも、リポジトリだけでもコメントは残せて、何故そのような commit を残したのかは記録され、振り返りは行える。&lt;br /&gt;
だが、その commit を残すまでの経緯、その commit を残すことになるトリガーを Issue 管理システム側のチケットを利用して記録し、経過を管理しておくことで、作業の漏れが少なくなり、一緒に作業を行っているメンバ間での途中経過の情報共有も行え、時間の節約に繋がる。&lt;/p&gt;

&lt;p&gt;また、あれやこれやと空いた時間で手をつけている自分のような状況の者にとってすると、時間が経過した後に以前の作業に戻り易くなる。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.redmine.org/&quot;&gt;Redmine&lt;/a&gt; は愛用しているのだが、現在内部ネットワークの閉じた環境で使用している。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;「あちら側」(クラウド)へ Issue 管理システムとソースリポジトリを移行したい&lt;/li&gt;
&lt;li&gt;システムの運用管理はサービス提供者側にお任せしたい&lt;br /&gt;
(もの作り、プロジェクトの運用に専念したい)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;という思いがあり、Unfuddle を試してみることにした。&lt;/p&gt;

&lt;p&gt;何故 Unfuddle なのか？は以下の記事に感化され、「agile reporting!」をやってみたくなったのもある。。&lt;br /&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.elctech.com/articles/stop-wasting-time---create-bug-tickets-with-screenshots-using-freshlog&quot;&gt;Stop wasting time - create Bug Tickets with Screenshots using Freshlog Article « elc technologies&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;他にも同様のサービスはあるので、もしかするともっと素敵なサービスがあるかもしれない。現在他サービスの検証までは行っていない。&lt;/p&gt;

&lt;p&gt;ここでは、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issue/Bug トラッキングシステム Unfuddle のアカウント開設&lt;/li&gt;
&lt;li&gt;Git リポジトリの登録&lt;/li&gt;
&lt;li&gt;&quot;Agile Reporting&quot; のお試し (結局、次回の投稿に回すことに)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;までをやってみる。&lt;/p&gt;

&lt;h2&gt;Unfuddle でアカウントを作成する&lt;/h2&gt;

&lt;p&gt;まずは Unfuddle でアカウントの作成を行う。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://unfuddle.com/&quot;&gt;Unfuddle: Subversion Hosting, Git Hosting, Bug and Issue Tracking&lt;/a&gt; のトップページ &lt;strong&gt;&quot;Start Unfuddling Now!&quot;&lt;/strong&gt; からアカウントを作成する。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;まずはお試しなので &quot;Private FREE&quot; で。本格的に使うとした場合、最低&lt;strong&gt;&quot;Compact&quot;&lt;/strong&gt; のパッケージにはしたい。月 24 ドルか・・・。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Unfuddle で利用する自身のサイトの URI は、上記で指定する &lt;strong&gt;&quot;Subdomain&quot;&lt;/strong&gt; になる。必要項目を入力して&lt;strong&gt;&quot;Continue&quot;&lt;/strong&gt;。アカウントが作成される。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;以下はアカウントのトップページになる Dashboard と、プロジェクト単位の Dashboard。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Trac、Redmine などを使ったことのある方などは、さくさくと使い込なせるのではないかと思う。&lt;/p&gt;

&lt;p&gt;利用方法については、本家のサイトのツアーを見て頂くのがよいかと思う。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://unfuddle.com/about/tour/dashboard&quot;&gt;Unfuddle Tour: Dashboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Git リポジトリの登録と利用&lt;/h2&gt;

&lt;p&gt;Unfuddle のリポジトリには、Git、Subversion が利用できる。&lt;br /&gt;
ここでは Git を使用する。&lt;/p&gt;

&lt;p&gt;Unfuddle にリモートリポジトリを作成し、ローカルリポジトリとの連携は、通常通り git コマンドを使用して行うことになる。
作成したリモートリポジトリとローカルリポジトリとのネットワークプロトコルは SSH になる。&lt;/p&gt;

&lt;p&gt;手順としては、git でリモートリポジトリを利用する方法と同様。リモートリポジトリの管理部分だけ Unfuddle の UI を使って実施することになる。
ざっくりとした流れは以下の通り。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;リモートリポジトリを作成 - Unfuddle のサイトで&lt;/li&gt;
&lt;li&gt;SSH で利用する鍵ペアの作成 (作成していない場合) - ローカル環境&lt;/li&gt;
&lt;li&gt;ユーザアカウントに SSH 公開鍵を登録する - Unfuddle のサイトで&lt;/li&gt;
&lt;li&gt;ローカルリポジトリの準備 (作成していない場合) と反映する状態の FIX - ローカル環境&lt;/li&gt;
&lt;li&gt;ローカルリポジトリに Unfuddle のリモートリポジトリを追加 - ローカル環境&lt;/li&gt;
&lt;li&gt;ローカルリポジトリをリモートリポジトリに反映(push) - ローカル環境&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;アクセス管理を含めたリモートリポジトリの管理の手間が減るのが自前でやるのと比べてうれしい。&lt;/p&gt;

&lt;h3&gt;1. Unfuddle のサイトでリモートリポジトリを作成&lt;/h3&gt;

&lt;p&gt;Account、もしくは、Project の &lt;strong&gt;&quot;Repositories&quot;&lt;/strong&gt; メニューから &lt;strong&gt;&quot;Repositories&quot;&lt;/strong&gt; のページを開く。
&lt;strong&gt;&quot;New Repository&quot;&lt;/strong&gt; をクリックし、新規のリポジトリ情報を入力する。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&quot;Create Repository&quot;&lt;/strong&gt; を実行し、リポジトリを作成する。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;2. SSH で利用する鍵ペアの作成 (作成していない場合)&lt;/h3&gt;

&lt;p&gt;まだ作成していない場合には、SSH の鍵ペアの作成を行う。SSH の鍵ペアの生成方法については、Unfuddle でドキュメントを用意してくれている。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://unfuddle.com/docs/topics/ssh_keypair&quot;&gt;Unfuddle Help Creating an SSH Keypair&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;3. ユーザアカウントに SSH 公開鍵を登録する&lt;/h3&gt;

&lt;p&gt;Unfuddle のサイトで 2. で作成した SSH 公開鍵(&lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt;)をユーザアカウントに紐付ける。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&quot;People&quot;&lt;/strong&gt; タブで &lt;strong&gt;&quot;Personal Settings&quot;&lt;/strong&gt; ページを開き、ユーザアカウントを選択する。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;該当ユーザアカウントの&lt;strong&gt;&quot;Edit&quot;&lt;/strong&gt;クリックし、&lt;strong&gt;&quot;Edit Person&quot;&lt;/strong&gt; ページを開く。ページの下の方に&lt;strong&gt;&quot;Public Keys&quot;&lt;/strong&gt;という項目があるので、&lt;strong&gt;&quot;New Public Key..&quot;&lt;/strong&gt; をクリックする。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;上記 2. で作成した SSH 公開鍵のファイル(通常は、&lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt;)を開き、その内容を&lt;strong&gt;&quot;Value&quot;&lt;/strong&gt;にコピペする。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&quot;Add&quot;&lt;/strong&gt; をクリックし、公開鍵を登録する。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h4&gt;4. ローカルリポジトリの準備 (作成していない場合) と反映する状態の FIX&lt;/h4&gt;

&lt;p&gt;管理するリポジトリをまだ準備していない場合には、準備しておく。&lt;/p&gt;

&lt;p&gt;Unfuddle 固有の話ではなく、Git に関する話なのでここでは割愛する。以下の Unfuddle の提供しているドキュメントが参考になると思う。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://unfuddle.com/docs/git&quot;&gt;Git Repositories&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;5. ローカルリポジトリに Unfuddle のリモートリポジトリを追加&lt;/h3&gt;

&lt;p&gt;Unfuddle のリモートリポジトリの情報をローカルリポジトリに追加する。&lt;/p&gt;

&lt;p&gt;まずは、ローカルの環境にて以下を実施。&lt;br /&gt;
&lt;code&gt;&amp;lt;subdomain&amp;gt;&lt;/code&gt;と&lt;code&gt;&amp;lt;abbreviation&amp;gt;&lt;/code&gt;は、以下の情報に置き換える。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;subdomain&amp;gt;&lt;/code&gt;: アカウントのサブドメイン&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;abbreviation&amp;gt;&lt;/code&gt;: 1. でリモートリポジトリを作成した際に登録を行った &lt;strong&gt;&quot;Avvreviation&quot;&lt;/strong&gt; の情報。&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;反映するローカルリポジトリのディレクトリに移動して実施。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;to/repository&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; git remote add unfuddle git&lt;span class=&quot;er&quot;&gt;@&lt;/span&gt;&amp;lt;subdomain&amp;gt;.unfuddle.com&lt;span class=&quot;sy&quot;&gt;:&amp;lt;&lt;/span&gt;subdomain&amp;gt;&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;abbreviation&amp;gt;.git&lt;tt&gt;
&lt;/tt&gt;$ git config remote.unfuddle.push refs&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;heads/master&lt;span class=&quot;sy&quot;&gt;:refs&lt;/span&gt;/heads/master&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;Git の設定情報に以下が追加される。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; git config --list&lt;tt&gt;
&lt;/tt&gt;...&lt;tt&gt;
&lt;/tt&gt;remote.unfuddle.url=git&lt;span class=&quot;er&quot;&gt;@&lt;/span&gt;&amp;lt;subdomain&amp;gt;.unfuddle.com&lt;span class=&quot;sy&quot;&gt;:&amp;lt;&lt;/span&gt;subdomain&amp;gt;&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;abbreviation&amp;gt;.git&lt;tt&gt;
&lt;/tt&gt;remote.unfuddle.fetch=+refs&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;heads/*&lt;span class=&quot;sy&quot;&gt;:refs&lt;/span&gt;/remotes/unfuddle/*&lt;tt&gt;
&lt;/tt&gt;remote.unfuddle.push=refs/heads/master&lt;span class=&quot;sy&quot;&gt;:refs&lt;/span&gt;/heads/master&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h3&gt;6. ローカルリポジトリをリモートリポジトリに反映(push)&lt;/h3&gt;

&lt;p&gt;準備は整ったので、ローカルリポジトリをリモートリポジトリに反映(push)する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; git push unfuddle master&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;The&lt;/span&gt; authenticity of host &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;subdomain&amp;gt;.unfuddle.com (xxx.xxx.xxx.xxx)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; can&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;t be established.&lt;tt&gt;
&lt;/tt&gt;RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.&lt;tt&gt;
&lt;/tt&gt;Are you sure you want to continue connecting (yes/no)? yes&lt;tt&gt;
&lt;/tt&gt;Warning: Permanently added &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&amp;lt;subdomain&amp;gt;.unfuddle.com,xxx.xxx.xxx.xxx&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; (RSA) to the list of known hosts.&lt;tt&gt;
&lt;/tt&gt;Counting objects: 307, done.&lt;tt&gt;
&lt;/tt&gt;Compressing objects: 100% (282/282), done.&lt;tt&gt;
&lt;/tt&gt;Writing objects: 100% (307/307), 214.83 KiB, done.&lt;tt&gt;
&lt;/tt&gt;Total 307 (delta 111), reused 0 (delta 0)&lt;tt&gt;
&lt;/tt&gt;To git@&amp;lt;subdomain&amp;gt;.unfuddle.com:&amp;lt;subdomain&amp;gt;/&amp;lt;abbreviation&amp;gt;.git&lt;tt&gt;
&lt;/tt&gt; * [new branch]  master -&amp;gt; master&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;Unfuddle のサイトで確認してみる。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;リモートリポジトリからの clone は、以下の通りとなる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; git clone git&lt;span class=&quot;er&quot;&gt;@&lt;/span&gt;&amp;lt;subdomain&amp;gt;.unfuddle.com&lt;span class=&quot;sy&quot;&gt;:&amp;lt;&lt;/span&gt;subdomein&amp;gt;&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;abbreviation&amp;gt;.git&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;感想&lt;/h2&gt;

&lt;p&gt;感想の前に、、&lt;br /&gt;
「&quot;Agile Reporting&quot; のお試し」を誌面(?)の都合でまとめて書くことができなかったので、別の投稿に分けて記載する。&lt;/p&gt;

&lt;p&gt;まだ感想を書けるまでは使い込なしていないが、現在使用している Redmine が持っている機能的なところでの比較としては、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;リポジトリは Issue 管理システムからの参照ではなく、Issue 管理システム内で管理される&lt;/li&gt;
&lt;li&gt;プロジェクトとリポジトリを M対N で紐付けることができる(できそう)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;というところがうれしい。&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-10-27:203</id>
    <published>2009-10-27T21:50:00Z</published>
    <updated>2009-10-27T21:51:09Z</updated>
    <category term="emacs"/>
    <category term="ruby"/>
    <link href="http://blog.designrecipe.jp/2009/10/27/ruby-gem-emacs-dired" rel="alternate" type="text/html"/>
    <title>Ruby gem &#21517;&#31216;&#12434;&#25351;&#23450;&#12375;&#12390; Emacs &#12398; Dired &#12391;&#12381;&#12398;&#12521;&#12452;&#12502;&#12521;&#12522;&#12398;&#12487;&#12451;&#12524;&#12463;&#12488;&#12522;&#12434;&#21363;&#24231;&#12395;&#38283;&#12367;</title>
<content type="html">
            &lt;p&gt;やりたいことはタイトルの通りなのだが、Emacs を使用中に Ruby の gem 名称でそのライブラリのディレクトリを Dired で開くこと。&lt;/p&gt;

&lt;p&gt;Ruby には素敵な gem が多くあるが、
付属の Readme、RDoc だけでは使い方がよくわからない、
どうやったらこのような素敵なことができるのかソースを見てみたい、
などの理由でソースを読んでみたくなる。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/bguthrie&quot;&gt;@bguthrie&lt;/a&gt; さんが Textmate でやっているのを見て、Emacs にも流用できるなと。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://gist.github.com/214434&quot;&gt;gist: 214434 - GitHub&lt;/a&gt;&lt;br /&gt;
via &lt;a href=&quot;http://twitter.com/bguthrie/status/5023115330&quot;&gt;Twitter / Brian Guthrie: A quick Ruby script for op ...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;上記のソースで &lt;code&gt;gem which &amp;lt;gem name&amp;gt;&lt;/code&gt; なんて便利なコマンドが使えるのを初めて知った。。&lt;/p&gt;

&lt;p&gt;Emacs のディレクトリ操作には標準で Dired が利用できる。
&lt;code&gt;C-x C-f&lt;/code&gt;(find-file) で該当する gem のディレクトリを開けばよいのだが、
ちょっとしたことではあるが、タブ補完が効くとは言え、そのパスを入力するのは少々面倒臭い。&lt;/p&gt;

&lt;p&gt;また、仕事の関係上、Mac、Win と併用して使っているので、異なる環境でパスを思い出すのもメンドイ。。&lt;br /&gt;
gem の名称だけでわかれば直接そして即座に開けるようだと、メモリ容量が減ってしまっている自分の頭にもやさしい。&lt;/p&gt;

&lt;p&gt;elisp は全くの初心者なので、かなり無理やり感も漂い、もっといい方法もありそうなのだが、とりあえず以下のような感じでいけそう。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;(defun search-gem-path (name)&lt;tt&gt;
&lt;/tt&gt;  (shell-command-to-string&lt;tt&gt;
&lt;/tt&gt;    (format &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;gem which %s | ruby -n -e 'if /lib/; print $_[0, $_.rindex(%%[lib])]; end'&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; name)))&lt;tt&gt;
&lt;/tt&gt;(defun find-ruby-gem (name)&lt;tt&gt;
&lt;/tt&gt;  (interactive &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;sRuby gem libraray name: &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  (find-file (search-gem-path name)))&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;上記スクリプトを .emacs.el なりに書いて &lt;code&gt;M-x find-ruby-gem &amp;lt;gem 名称&amp;gt;&lt;/code&gt; とやることで、gem 名称に指定した gem のルートディレクトリが Dired で開かれる。&lt;/p&gt;

&lt;p&gt;例えば、twitter gem を開く場合、&lt;code&gt;M-x find-ruby-gem twitter&lt;/code&gt; として、&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Enter!&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;ホントちょっとしたことではあるが、うれしい。。&lt;/p&gt;

&lt;p&gt;ちなみに、標準ライブラリのソースを開く場合には、
&lt;code&gt;devel-which&lt;/code&gt; ライブラリ(http://raa.ruby-lang.org/list.rhtml?name=devel-which)を使うとよい。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; irb --prompt simple&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;devel/which&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; which_library &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;net/http&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/opt/local/lib/ruby/1.8/net/http.rb&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-10-26:199</id>
    <published>2009-10-26T10:46:00Z</published>
    <updated>2009-10-26T10:47:32Z</updated>
    <category term="ruby"/>
    <link href="http://blog.designrecipe.jp/2009/10/26/ruby-metaprogramming-eg-ar" rel="alternate" type="text/html"/>
    <title>Ruby ActiveRecord &#12398;(&#36229;)&#31777;&#26131;&#23455;&#35013;&#12391;&#23398;&#12406;&#12513;&#12479;&#12503;&#12525;&#12464;&#12521;&#12511;&#12531;&#12464;</title>
<content type="html">
            &lt;h2&gt;しっかり抑えておきたいと思うメタプログラミング&lt;/h2&gt;

&lt;p&gt;Ruby のメタプロミングは奥が深くて楽しいが、やり過ぎると暗黒面に堕ちてしまう。。
効果的な使い方を心掛けていきたい。&lt;br /&gt;
Rails でもよく利用されているように、CoC (Convention over Configuration) と組み合わせることで更に効果的となる。&lt;/p&gt;

&lt;p&gt;なかなかとっつきにいところもあり、コンパクトにまとまった文書がないかと探していた。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://weare.buildingsky.net/2009/08/25/rubys-metaprogramming-toolbox&quot;&gt;Ruby's Metaprogramming Toolbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;上記サイトなどはコンパクトによくまとまっているように思う。&lt;/p&gt;

&lt;p&gt;メタプログラミングに必要となる、通常はあまり使用しないメソッドをメタプログラミングツールボックスというかたちでリストアップし、その説明はドキュメントへのレファレンスで構成している。
最後にメタプログラミングの適用例として ActiveRecord の簡易実装をサンプルとして掲載している。&lt;/p&gt;

&lt;p&gt;記載されているツールボックスの利用の前に、基本となる、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruby のクラス階層&lt;br /&gt;
Object クラス、Module クラス、Class クラスと任意のクラスとの関連。&lt;/li&gt;
&lt;li&gt;メソッド参照のルール&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;もしっかり抑えておく必要があるようには思う。その方が混乱が少なくて済む。。&lt;/p&gt;

&lt;p&gt;個人的にはメタプログミングと言えば、why の Metaid が思い付くのだが、why はもう姿を現してくれないのだろうか・・・&lt;br /&gt;
&quot;why's (poignant) guide to ruby&quot; が以下のサイトで再掲されているようだ。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://mislav.uniqpath.com/poignant-guide/book/&quot;&gt;why's (poignant) guide to ruby&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.aoky.net/articles/why_poignant_guide_to_ruby/&quot;&gt;ホワイの(感動的)Rubyガイド&lt;/a&gt; (日本語翻訳版)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;時間を見つけて以下のサイトを読み込んでみるのも良さそうだ。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://ruby-metaprogramming.heroku.com/&quot;&gt;First Step on Ruby Metaprogramming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;また、&quot;Metaprogramming Ruby&quot; は非常に楽しみしている書籍で、まだベータブックではあるが、&lt;a href=&quot;http://pragprog.com/titles/ppmetr/metaprogramming-ruby&quot;&gt;The Pragmatic Bookshelf | Metaprogramming Ruby&lt;/a&gt; を購入して読んでみようと思う。&lt;/p&gt;

&lt;div class=&quot;mm-middle&quot;&gt;
  &lt;div class=&quot;mm-image&quot;&gt;
    &lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/1934356476/muratakaweblo-22/ref=nosim&quot;&gt;
      
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class=&quot;mm-content&quot;&gt;
    &lt;div class=&quot;mm-title&quot;&gt;
      &lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/1934356476/muratakaweblo-22/ref=nosim&quot;&gt;
        Metaprogramming Ruby
      &lt;/a&gt;
    &lt;/div&gt;
    &lt;div class=&quot;mm-detail&quot;&gt;
      Paolo Perrotta&lt;br /&gt;Pragmatic Bookshelf ( 2010-01-31 )&lt;br /&gt;ISBN: 9781934356470&lt;br /&gt;
      &amp;lt;!--div style=&quot;margin:7px 0px&quot;&gt;
        &amp;lt;a href=&quot;http://mediamarker.net/u/drtaka/?asin=1934356476&quot; target=&quot;_blank&quot;&gt;drtakaのバインダーで詳細を見る&amp;lt;/a&gt;
      &amp;lt;/div--&gt;
      &lt;div&gt;
        &lt;a href=&quot;http://mediamarker.net/&quot;&gt;MediaMarker&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;と、今回のこのメモの中では、先に挙げた &lt;a href=&quot;http://weare.buildingsky.net/2009/08/25/rubys-metaprogramming-toolbox&quot;&gt;Ruby's Metaprogramming Toolbox&lt;/a&gt; で掲載されている
ActiveRecord の簡易実装サンプルを SQLite 版で書いてみて、使用されているツールボックスのツールを確認してみたいと思う。&lt;/p&gt;

&lt;h2&gt;ActiveRecord の簡易実装 (ちょっとした検索だけ)&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://weare.buildingsky.net/2009/08/25/rubys-metaprogramming-toolbox&quot;&gt;Ruby's Metaprogramming Toolbox&lt;/a&gt; では最後にメタプログミングの適用例として、
ActiveRecord の簡易実装を記載している。&lt;br /&gt;
これが MySQL 用のものであるので、もっと手軽に試せる SQLite 版にしてみた。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;35&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;45&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;51&lt;tt&gt;
&lt;/tt&gt;52&lt;tt&gt;
&lt;/tt&gt;53&lt;tt&gt;
&lt;/tt&gt;54&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;55&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;56&lt;tt&gt;
&lt;/tt&gt;57&lt;tt&gt;
&lt;/tt&gt;58&lt;tt&gt;
&lt;/tt&gt;59&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;60&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;61&lt;tt&gt;
&lt;/tt&gt;62&lt;tt&gt;
&lt;/tt&gt;63&lt;tt&gt;
&lt;/tt&gt;64&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;65&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;66&lt;tt&gt;
&lt;/tt&gt;67&lt;tt&gt;
&lt;/tt&gt;68&lt;tt&gt;
&lt;/tt&gt;69&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;70&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;71&lt;tt&gt;
&lt;/tt&gt;72&lt;tt&gt;
&lt;/tt&gt;73&lt;tt&gt;
&lt;/tt&gt;74&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;75&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;76&lt;tt&gt;
&lt;/tt&gt;77&lt;tt&gt;
&lt;/tt&gt;78&lt;tt&gt;
&lt;/tt&gt;79&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;80&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;81&lt;tt&gt;
&lt;/tt&gt;82&lt;tt&gt;
&lt;/tt&gt;83&lt;tt&gt;
&lt;/tt&gt;84&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;85&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;86&lt;tt&gt;
&lt;/tt&gt;87&lt;tt&gt;
&lt;/tt&gt;88&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;rubygems&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;sqlite3&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# SQLite バージョン&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# AR の CoC はとりあえず無視&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;PoorManWithSqlite&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;c&quot;&gt;# クラスインスタンス変数に生成されたクラスのリストを保持する&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class=&quot;cl&quot;&gt;self&lt;/span&gt;; attr_reader &lt;span class=&quot;sy&quot;&gt;:generated_classes&lt;/span&gt;; &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;iv&quot;&gt;@generated_classes&lt;/span&gt; = []&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;initialize&lt;/span&gt;(attributes = &lt;span class=&quot;pc&quot;&gt;nil&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; attributes&lt;tt&gt;
&lt;/tt&gt;      attributes.each_pair &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |key, value|&lt;tt&gt;
&lt;/tt&gt;        instance_variable_set(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; + key, value)&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.connect(database = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;data.db&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;cv&quot;&gt;@@db&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;SQLite3&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Database&lt;/span&gt;.new(database)&lt;tt&gt;
&lt;/tt&gt;    sql = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;lt;&amp;lt;-SQL&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      select tbl_name&lt;tt&gt;
&lt;/tt&gt;        from sqlite_master&lt;tt&gt;
&lt;/tt&gt;       where type = 'table'&lt;tt&gt;
&lt;/tt&gt;         and tbl_name != 'sqlite_sequence'&lt;tt&gt;
&lt;/tt&gt;       order by tbl_name;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;SQL&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;cv&quot;&gt;@@db&lt;/span&gt;.execute(sql).flatten.each &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |table_name|&lt;tt&gt;
&lt;/tt&gt;      class_name = table_name.split(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;).map { |word| word.capitalize }.join&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;c&quot;&gt;# Module#const_set を使用してテーブル用の新しいクラスを作成する&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;iv&quot;&gt;@generated_classes&lt;/span&gt; &amp;lt;&amp;lt; klass = &lt;span class=&quot;co&quot;&gt;Object&lt;/span&gt;.const_set(class_name,&lt;tt&gt;
&lt;/tt&gt;                                                     &lt;span class=&quot;co&quot;&gt;Class&lt;/span&gt;.new(&lt;span class=&quot;co&quot;&gt;PoorManWithSqlite&lt;/span&gt;))&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      klass.module_eval &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;span class=&quot;cv&quot;&gt;@@fields&lt;/span&gt; = []&lt;tt&gt;
&lt;/tt&gt;        &lt;span class=&quot;cv&quot;&gt;@@table_name&lt;/span&gt; = table_name&lt;tt&gt;
&lt;/tt&gt;        &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;fields&lt;/span&gt;; &lt;span class=&quot;cv&quot;&gt;@@fields&lt;/span&gt;; &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;c&quot;&gt;# テーブルのフィールドのリストを収集し、&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;c&quot;&gt;# それらに対する getter/setter を用意する。&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;cv&quot;&gt;@@db&lt;/span&gt;.table_info(table_name) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |field|&lt;tt&gt;
&lt;/tt&gt;        &lt;span class=&quot;c&quot;&gt;# getter/setter の追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        klass.send &lt;span class=&quot;sy&quot;&gt;:attr_accessor&lt;/span&gt;, field[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].to_sym&lt;tt&gt;
&lt;/tt&gt;        &lt;span class=&quot;c&quot;&gt;# field セットに追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        klass.module_eval { &lt;span class=&quot;cv&quot;&gt;@@fields&lt;/span&gt; &amp;lt;&amp;lt; field[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;] }&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;cv&quot;&gt;@@db&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.close&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;cv&quot;&gt;@@db&lt;/span&gt;.close&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;c&quot;&gt;# id でレコードを取得する&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.find(id)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;# SQLite3::Database#execute2 は、最初の行としてカラム名称の配列を返す。&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    result = &lt;span class=&quot;cv&quot;&gt;@@db&lt;/span&gt;.execute2(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;select * from &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;cv&quot;&gt;@@table_name&lt;/span&gt;&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; where id = &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;id&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; limit 1&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    attributes = &lt;span class=&quot;co&quot;&gt;Hash&lt;/span&gt;[*result.transpose.flatten]&lt;tt&gt;
&lt;/tt&gt;    new(attributes) &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; attributes&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;c&quot;&gt;# 全てのレコードを取得する&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.all&lt;tt&gt;
&lt;/tt&gt;    results = &lt;span class=&quot;cv&quot;&gt;@@db&lt;/span&gt;.execute2(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;select * from &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;cv&quot;&gt;@@table_name&lt;/span&gt;&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    fields = results.shift&lt;tt&gt;
&lt;/tt&gt;    records = []&lt;tt&gt;
&lt;/tt&gt;    results.each &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |result|&lt;tt&gt;
&lt;/tt&gt;      records &amp;lt;&amp;lt; new(&lt;span class=&quot;co&quot;&gt;Hash&lt;/span&gt;[*fields.zip(result).flatten])&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    results&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;PoorManWithSqlite&lt;/span&gt;.connect&lt;tt&gt;
&lt;/tt&gt;table_classes = &lt;span class=&quot;co&quot;&gt;PoorManWithSqlite&lt;/span&gt;.generated_classes &lt;span class=&quot;c&quot;&gt;# =&amp;gt; [Departments, Employees]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;table_classes[&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;].superclass               &lt;span class=&quot;c&quot;&gt;# =&amp;gt; PoorManWithSqlite&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;employee = &lt;span class=&quot;co&quot;&gt;Employees&lt;/span&gt;.find(&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;)              &lt;span class=&quot;c&quot;&gt;# =&amp;gt; #&amp;lt;Employees:0x11f20d8&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;                                                 &lt;span class=&quot;iv&quot;&gt;@department_id&lt;/span&gt;=&lt;span class=&quot;pc&quot;&gt;nil&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;                                                 &lt;span class=&quot;iv&quot;&gt;@name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;taka&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;                                                 &lt;span class=&quot;iv&quot;&gt;@id&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;employee.name                             &lt;span class=&quot;c&quot;&gt;# =&amp;gt; &amp;quot;taka&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;employees = &lt;span class=&quot;co&quot;&gt;Employees&lt;/span&gt;.all                 &lt;span class=&quot;c&quot;&gt;# =&amp;gt; [[&amp;quot;1&amp;quot;, &amp;quot;taka&amp;quot;, nil],&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;                                                [&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;goro&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;pc&quot;&gt;nil&lt;/span&gt;]]&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;PoorManWithSqlite&lt;/span&gt;.close                             &lt;span class=&quot;c&quot;&gt;# =&amp;gt; true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;上記の実行にあたっては、簡単な DB を用意しておく必要がある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create-table.sql&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;ファイルの内容は以下の通り。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;r&quot;&gt;create&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;&quot;&gt;departments&lt;/span&gt; (&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;integer&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;&quot;&gt;AUTOINCREMENT&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;NULL&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;varchar&lt;/span&gt;(&lt;span class=&quot;i&quot;&gt;255&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;);&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;create&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;&quot;&gt;employees&lt;/span&gt; (&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;integer&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;KEY&lt;/span&gt; &lt;span class=&quot;&quot;&gt;AUTOINCREMENT&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;NULL&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;varchar&lt;/span&gt;(&lt;span class=&quot;i&quot;&gt;255&lt;/span&gt;),&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;&quot;&gt;department_id&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;integer&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;);&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;data.db&lt;/code&gt; を作成し、上記 DDL 文を流し込む。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; sqlite3 data.db &amp;lt; creat-table.sql&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;ポイントメモ&lt;/h2&gt;

&lt;p&gt;幾つかポイントをメモ。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;動的なクラスの生成(しかもサブクラス)&lt;/li&gt;
&lt;li&gt;動的なアクセサの生成とコンストラクタによる値のセット&lt;/li&gt;
&lt;li&gt;クラスインスタンス変数の利用とそのアクセサの生成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Object#send&lt;/code&gt; を使った private メソッドへのアクセス&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;1. 動的なクラスの生成(しかもサブクラス)&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Module#const_set&lt;/code&gt; を利用して、テーブルの名前から動的に &lt;code&gt;PoorManWithSqlite&lt;/code&gt; クラスのサブクラスとなる各テーブルのクラスを生成している。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# Module#const_set を使用してテーブル用の新しいクラスを作成する&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;iv&quot;&gt;@generated_classes&lt;/span&gt; &amp;lt;&amp;lt; klass = &lt;span class=&quot;co&quot;&gt;Object&lt;/span&gt;.const_set(class_name,&lt;tt&gt;
&lt;/tt&gt;                                               &lt;span class=&quot;co&quot;&gt;Class&lt;/span&gt;.new(&lt;span class=&quot;co&quot;&gt;PoorManWithSqlite&lt;/span&gt;))&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;&lt;code&gt;Module#const_set(name, value) -&amp;gt; object&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;モジュールに name で指定された名前の定数を value という値に定義し、value を返す。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;C&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;Object&lt;/span&gt;.const_set(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Con&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;i&quot;&gt;10&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Con&lt;/span&gt;                             &lt;span class=&quot;c&quot;&gt;# =&amp;gt; 10&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;C&lt;/span&gt;                               &lt;span class=&quot;c&quot;&gt;# =&amp;gt; 10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;Ruby の場合、クラス名は全て定数となる。name にテーブル名から生成した名称のクラス名を指定し、
value には、&lt;code&gt;PoorManWithSqlite&lt;/code&gt; のサブクラスを指定している。&lt;/p&gt;

&lt;p&gt;その value の指定に使用されているのは &lt;code&gt;Class::new&lt;/code&gt; メソッド。Class の new メソッドには、インスタンスメソッドとクラスメソッドがある。
上記で利用しているのはクラスメソッド(&lt;code&gt;Class::new&lt;/code&gt;)の方になる。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Class::new(superclass = Object) -&amp;gt; Class&lt;/code&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;&lt;code&gt;Class::new(superclass = Object) {|klass| ... } -&amp;gt; Class&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;新しく superclass の無名のサブクラスを生成する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;SuperAClass&lt;/span&gt;; &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;sub_k = &lt;span class=&quot;co&quot;&gt;Class&lt;/span&gt;.new(&lt;span class=&quot;co&quot;&gt;SuperAClass&lt;/span&gt;)  &lt;span class=&quot;c&quot;&gt;# =&amp;gt; #&amp;lt;Class:0x2533c&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;sub_k.class                     &lt;span class=&quot;c&quot;&gt;# =&amp;gt; Class&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;sub_k.superclass                &lt;span class=&quot;c&quot;&gt;# =&amp;gt; SuperAClass&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;コードブロックを預けてメソッドを定義することもできる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;k = &lt;span class=&quot;co&quot;&gt;Class&lt;/span&gt;.new(&lt;span class=&quot;co&quot;&gt;SuperAClass&lt;/span&gt;) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |klass|&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;hoge&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;hoge hoge&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;o = k.new                       &lt;span class=&quot;c&quot;&gt;# =&amp;gt; #&amp;lt;#&amp;lt;Class:0x273e4&amp;gt;:0x273a8&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;o.hoge                          &lt;span class=&quot;c&quot;&gt;# =&amp;gt; &amp;quot;hoge hoge&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;各テーブルのクラスを &lt;code&gt;PoorManWithSqlite&lt;/code&gt; クラスのサブクラスとすることで、各テーブルクラスにおいて &lt;code&gt;PoorManWithSqlite&lt;/code&gt; の機能が利用できる。&lt;/p&gt;

&lt;h3&gt;2. 動的なアクセサの生成とコンストラクタによる値のセット&lt;/h3&gt;

&lt;p&gt;動的なアクセサを用意しているところ。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt; &lt;span class=&quot;c&quot;&gt;# テーブルのフィールドのリストを収集し、それらに対する getter/setter を用意する。&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;span class=&quot;cv&quot;&gt;@@db&lt;/span&gt;.table_info(table_name) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |field|&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# getter/setter の追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   klass.send &lt;span class=&quot;sy&quot;&gt;:attr_accessor&lt;/span&gt;, field[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].to_sym&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# field セットに追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   klass.module_eval { &lt;span class=&quot;cv&quot;&gt;@@fields&lt;/span&gt; &amp;lt;&amp;lt; field[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;] }&lt;tt&gt;
&lt;/tt&gt; &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;テーブルのフィールドをイテレートし、そのテーブルクラスの読み書き両用のインスタンス変数を生成している。&lt;/p&gt;

&lt;p&gt;次に値をセットしているところ。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;initialize&lt;/span&gt;(attributes = &lt;span class=&quot;pc&quot;&gt;nil&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; attributes&lt;tt&gt;
&lt;/tt&gt;    attributes.each_pair &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |key, value|&lt;tt&gt;
&lt;/tt&gt;      instance_variable_set(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; + key, value)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;コンストラクタで引数にフィールド名を key、そのフィールドの値を value とした Hash を受け取り、
&lt;code&gt;Object#instance_variable_set&lt;/code&gt; で値のセットを行う。&lt;code&gt;'@'&lt;/code&gt; を文字列連結しているところはちょっとカッコ悪いが致し方ない。&lt;/p&gt;

&lt;p&gt;上記 &lt;code&gt;initialize&lt;/code&gt; メソッドが利用される実際に値をセットしているところは以下の箇所となる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;results.each &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |result|&lt;tt&gt;
&lt;/tt&gt;  records &amp;lt;&amp;lt; new(&lt;span class=&quot;co&quot;&gt;Hash&lt;/span&gt;[*fields.zip(result).flatten])&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;Hash[*fields.zip(result).flatten]&lt;/code&gt; は検索結果の配列からフィールド名を key、そのフィールドの値を value とした Hash を生成している。&lt;/p&gt;

&lt;h3&gt;3. クラスインスタンス変数の利用とそのアクセサの生成&lt;/h3&gt;

&lt;p&gt;各テーブルクラスは、&lt;code&gt;PoorManWithSqlite&lt;/code&gt; クラスを継承する。&lt;/p&gt;

&lt;p&gt;継承の際のクラス変数の扱いには注意が必要だ。&lt;br /&gt;
1.8 系まではクラス変数は継承される(1.9 はまだ触っていない。。)。&lt;/p&gt;

&lt;p&gt;Database への接続の参照は唯一のインスタンスとして持たせたいので、クラス変数が適している。&lt;br /&gt;
ただ、作成されたテーブルクラスの管理情報を各テーブル毎に持たせても仕方ない。このサンプルでは &lt;code&gt;PoorManWithSqlite&lt;/code&gt; クラスのクラスインスタンス変数にその情報を保持している。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# クラスインスタンス変数に生成されたクラスのリストを保持する&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class=&quot;cl&quot;&gt;self&lt;/span&gt;; attr_reader &lt;span class=&quot;sy&quot;&gt;:generated_classes&lt;/span&gt;; &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;iv&quot;&gt;@generated_classes&lt;/span&gt; = []&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;アクセサは、&lt;code&gt;PoorManWithSqlite&lt;/code&gt; クラスオブジェクトの特異クラスで記述する必要がある。&lt;/p&gt;

&lt;h3&gt;4. &lt;code&gt;Object#send&lt;/code&gt; を使った private メソッドへのアクセス&lt;/h3&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt; &lt;span class=&quot;c&quot;&gt;# テーブルのフィールドのリストを収集し、それらに対する getter/setter を用意する。&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt; &lt;span class=&quot;cv&quot;&gt;@@db&lt;/span&gt;.table_info(table_name) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |field|&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# getter/setter の追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   klass.send &lt;span class=&quot;sy&quot;&gt;:attr_accessor&lt;/span&gt;, field[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].to_sym&lt;tt&gt;
&lt;/tt&gt;   &lt;span class=&quot;c&quot;&gt;# field セットに追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;   klass.module_eval { &lt;span class=&quot;cv&quot;&gt;@@fields&lt;/span&gt; &amp;lt;&amp;lt; field[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;] }&lt;tt&gt;
&lt;/tt&gt; &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;klass&lt;/code&gt; というのは、&lt;code&gt;PoorManWithSqlite&lt;/code&gt; を継承したテーブル毎のクラスなのだが、このクラスの &lt;code&gt;attr_accessor&lt;/code&gt; メソッドには、&lt;code&gt;klass&lt;/code&gt; をレシーバとしてはアクセスできない。
&lt;code&gt;Object#send&lt;/code&gt; を使うことにより、アクセスコントロールをバイパスしている。&lt;/p&gt;

&lt;p&gt;例示のため使っているのだと思うが、その下にある &lt;code&gt;Module#module_eval&lt;/code&gt; のブロックの中で一緒に書いてもよいと思う。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;# getter/setter の追加とfield セットの追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;klass.module_eval { attr_accessor field[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].to_sym; &lt;span class=&quot;cv&quot;&gt;@@fields&lt;/span&gt; &amp;lt;&amp;lt; field[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;] }&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-09-11:106</id>
    <published>2009-09-11T13:03:00Z</published>
    <updated>2009-09-11T13:04:00Z</updated>
    <category term="twitter"/>
    <link href="http://blog.designrecipe.jp/2009/9/11/started-twitter" rel="alternate" type="text/html"/>
    <title>Twitter &#12434;&#22987;&#12417;&#12390;&#12415;&#12383;</title>
<content type="html">
            &lt;h2&gt;Twitter を3日ほど使ってみた感想&lt;/h2&gt;

&lt;p&gt;最近、Twitter を使い始めてみた。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://twitter.com/&quot; title=&quot;Twitter / ホーム&quot;&gt;Twitter / ホーム&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;まずは、Twitter って何？というところで、以下のサイトにざっと目を通すと概要が掴める。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.greenspace.info/twitter/&quot;&gt;Twitter(ツイッター) をはじめよう！ - GreenSpace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ja.wikipedia.org/wiki/Twitter&quot; title=&quot;Twitter - Wikipedia&quot;&gt;Twitter - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gihyo.jp/lifestyle/serial/01/twitter&quot; title=&quot;連載：先取り！ Twitter使いへの道 AtoZ｜gihyo.jp … 技術評論社&quot;&gt;連載：先取り！ Twitter使いへの道 AtoZ｜gihyo.jp … 技術評論社&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://usy.jp/twitter/index.php?Twitter&quot; title=&quot;Twitter - TwitterまとめWiki&quot;&gt;Twitter - TwitterまとめWiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;呟くだけで何が楽しいのか？と斜に構え、敬遠していた Twitter だが、始めるきっかけになったのが以下の記事。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.techcrunch.com/2009/09/02/oh-rss-is-definitely-dead-now-feedburner-ceo-dick-costolo-to-become-twitter-coo/&quot; title=&quot;Oh, RSS Is Definitely Dead Now: Feedburner CEO Dick Costolo To Become Twitter COO&quot;&gt;Oh, RSS Is Definitely Dead Now: Feedburner CEO Dick Costolo To Become Twitter COO&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://jp.techcrunch.com/archives/20090902oh-rss-is-definitely-dead-now-feedburner-ceo-dick-costolo-to-become-twitter-coo/&quot; title=&quot;これでRSSは完全に死んだ：FeedburnerのCEO、Dick CostoloがTwitterのCOOに&quot;&gt;これでRSSは完全に死んだ：FeedburnerのCEO、Dick CostoloがTwitterのCOOに&lt;/a&gt; (日本語訳)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Feedburner の共同ファウンダー兼 CEO のDick Costoloが、Twitterの新 COO になったことに関する記事なのだが、この記事のタイトルは、Steve Gillmor 氏の以下の記事に発端がある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.techcrunchit.com/2009/05/05/rest-in-peace-rss/&quot; title=&quot;Rest in Peace, RSS&quot;&gt;Rest in Peace, RSS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;blockquote&gt;&lt;p&gt;It’s time to get completely off RSS and switch to Twitter.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;All my RSS feeds are in Google Reader. I don’t go there any more. Since all my feeds are in Google Reader and I don’t go there, I don’t use RSS anymore.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;自分にとってみたら、RSS Reader は今や生活の一部(?)になっているほど。それが Twitter にとって変わる？
ちょっと飛ばし過ぎの記事にも思えたのだが、まぁそこまで言うのであれば・・・と使ってみる気になった。&lt;/p&gt;

&lt;p&gt;使って3日程経過したが、使ってみた感想としては、RSS Reader を捨てるまでにはいかないが、なかなかどうして、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;リアルタイム性&lt;/li&gt;
&lt;li&gt;気になる人(企業)の発言を気軽に追っかけることができる&lt;/li&gt;
&lt;li&gt;思いもしなった情報が入ってくる&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;というところはよかった。感覚的には、ラジオを&quot;見る&quot;感覚に近い気がした。&lt;/p&gt;

&lt;p&gt;また、能動的な使い方としては、ちょっとしたメモを含めた自身のライフログ的なものを Twitter に集約できることがわかった。これまでその手の目的には、ChangeLog などにメモを書き殴っていたのだが、Twitter でいいかもしれない。&lt;/p&gt;

&lt;p&gt;個人的な利用ではこんなものだが、企業が使うとした場合、カスタマーサービスでの利用に効果がありそうな気がする。&lt;/p&gt;

&lt;p&gt;ただ、まだ3日。まだまだ使い込なせていないが、Twitter 自体は非常にシンプルな設計になっているので、それを使う人の使い方によってはもっと面白い効果を出すことができそうだ。&lt;/p&gt;

&lt;p&gt;まずはどういうものか知りたいため、この数日は、なるべく Twitter に触れる時間を作っていたが、時間は有限。。やるべき作業も他にもあるので、今後はバランス良くお付き合いしていきたい。。&lt;/p&gt;

&lt;h2&gt;フォローする人を探す&lt;/h2&gt;

&lt;p&gt;誰をフォローするかで、Twitter の楽しさは変わってくると思う。&lt;br /&gt;
以下のようなまとめサイトがある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://ideapad.jp/64627fd9/show/&quot; title=&quot;フォローすべきTwitterアカウント一覧 - IDEA*PAD&quot;&gt;フォローすべきTwitterアカウント一覧 - IDEA*PAD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.livedoor.jp/kensuu/archives/50875638.html&quot; title=&quot;最近Twitterを始めた人向けの便利な bot 厳選まとめ : ロケスタ社長日記&quot;&gt;最近Twitterを始めた人向けの便利な bot 厳選まとめ : ロケスタ社長日記&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hemiolia.com/blog/200902/000150&quot; title=&quot;30 Japanese geeks you should follow on Twitter | hemiolia.com&quot;&gt;30 Japanese geeks you should follow on Twitter | hemiolia.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.yytwitter.com/&quot; title=&quot;ツイッターのポータルサイト「ワイワイツイッター」〜YYtwitter.com〜&quot;&gt;ツイッターのポータルサイト「ワイワイツイッター」〜YYtwitter.com〜&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Twitter への企業の取り組み&lt;/h2&gt;

&lt;p&gt;まだまだ情報収集できていないが、ここ数日だけでも以下のような内容が耳に入ってきた。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ecstudio.jp/ec_studio_blog/090911twitter.html&quot; title=&quot;Twitterを全社導入して気づいたこと - EC studio 社長ブログ&quot;&gt;Twitterを全社導入して気づいたこと - EC studio 社長ブログ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.publickey.jp/blog/09/twittersalesforcetwitter.html&quot; title=&quot;Twitterは企業と顧客をダイレクトに結ぶツールとなる、SalesforceがTwitterに対応 － Blog on Publickey&quot;&gt;Twitterは企業と顧客をダイレクトに結ぶツールとなる、SalesforceがTwitterに対応 － Blog on Publickey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.itmedia.co.jp/enterprise/articles/0909/10/news069.html&quot; title=&quot;今度はKaaS：Salesforce.com、「Service Cloud 2」でTwitter連係強化 - ITmedia エンタープライズ&quot;&gt;今度はKaaS：Salesforce.com、「Service Cloud 2」でTwitter連係強化 - ITmedia エンタープライズ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.techcrunch.com/2009/09/08/everything-you-need-to-know-about-salesforces-service-cloud-2/&quot; title=&quot;Everything You Need To Know About Salesforce’s Service Cloud 2&quot;&gt;Everything You Need To Know About Salesforce’s Service Cloud 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://japan.cnet.com/sp/twitter2009/story/0,3800100455,20399653,00.htm&quot; title=&quot;Twitterマーケティングの効果測定を考える:特集 - CNET Japan&quot;&gt;Twitterマーケティングの効果測定を考える:特集 - CNET Japan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Salesforce の以下のデモは興味深い。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;関連ツールいろいろ&lt;/h2&gt;

&lt;p&gt;Twitter には関連ツールがいろいろあるようだ。ここ数日使っていて便利だったものをメモしておく。&lt;/p&gt;

&lt;h3&gt;Twitter クライアント&lt;/h3&gt;

&lt;p&gt;Web サイトで完結できるのだが、便利なクライアントツールがある。&lt;/p&gt;

&lt;p&gt;自分の場合、Emacs をメインで使っているので、elisp のクライアントが欲しかった。以下のものが使い勝手がよかった。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/hayamiz/twittering-mode/tree/master&quot; title=&quot;hayamiz's twittering-mode at master - GitHub&quot;&gt;hayamiz's twittering-mode at master - GitHub&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/hayamiz/&quot; title=&quot;日記を書く [・w・] はやみずさん&quot;&gt;日記を書く はやみずさん&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;ただ、ダイレクトメッセージが見られないのが玉に瑕。&lt;/p&gt;

&lt;p&gt;Emacs 何それ？・・・という方には、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://tweetdeck.com/beta/&quot; title=&quot;TweetDeck&quot;&gt;TweetDeck&lt;/a&gt;&lt;br /&gt;
via &lt;a href=&quot;http://lifehacking.jp/2009/01/tweetdeck-twitter-client/&quot; title=&quot;もっと評価されてしかるべき Twitter クライアント： TweetDeck | Lifehacking.jp&quot;&gt;もっと評価されてしかるべき Twitter クライアント： TweetDeck | Lifehacking.jp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;などが評価が高い模様。Adobe AIR で作成されているので、プラットフォームは選ばない。iPhone でも利用可能なようだ。&lt;/p&gt;

&lt;p&gt;確かに、カラム機能とフィルータ機能がすばらしい。&lt;/p&gt;

&lt;p&gt;デフォルトでは日本語の呟きが表示されないようなので、[Settings]-&gt;[Colors/Font] で &lt;strong&gt;'Original Font'&lt;/strong&gt; から &lt;strong&gt;'International Font/TwitterKey'&lt;/strong&gt; へ変更を行っておく。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;Twitter のつぶやきをブログ形式で保存してくれる - Twilog&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://twilog.org/&quot; title=&quot;Twilog - Twitterのつぶやきをブログ形式で保存&quot;&gt;Twilog - Twitterのつぶやきをブログ形式で保存&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Twitter の過去ログはブラウザで全て見ることはできない。Twilog は Twitter のつぶやきをブログ形式で保存してくれる。&lt;br /&gt;
ライフログ的な使い方を考えていたので、これは助かる。&lt;/p&gt;

&lt;p&gt;保存されたブログは、http://twilog.org/twitterのアカウント で公開される。&lt;/p&gt;

&lt;h3&gt;ブログの更新を Twitter に流す&lt;/h3&gt;

&lt;h4&gt;twitterfeed&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://twitterfeed.com/&quot; title=&quot;twitterfeed.com : feed your blog to twitter&quot;&gt;twitterfeed.com : feed your blog to twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;ブログの更新を一定間隔で Twitter に流してくれるサービス。&lt;/p&gt;

&lt;p&gt;まとめて配信された RSS を twitterfeed で流すという方法もあるようだ。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://netafull.net/twitter/031858.html&quot; title=&quot;[N] ブログの1日分の更新をまとめてツイッターに流す方法&quot;&gt;N ブログの1日分の更新をまとめてツイッターに流す方法&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://dailyfeed.jp/&quot; title=&quot;DailyFeed - デイリーフィード | サイトの更新を翌日まとめてRSSでお届け&quot;&gt;DailyFeed - デイリーフィード | サイトの更新を翌日まとめてRSSでお届け&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;blockquote&gt;&lt;p&gt;デイリーフィードはサイトの更新を翌日まとめてRSSでお届けします。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;twitbackr&lt;/h4&gt;

&lt;p&gt;更新 Ping を送ってやることで、Twitter へ更新情報をポストする。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://twitbackr.com/&quot; title=&quot;twitbackr - ブログの更新情報をtwitterに&quot;&gt;twitbackr - ブログの更新情報をtwitterに&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;その他いろいろ&lt;/h3&gt;

&lt;p&gt;関連するツールは他にもかなりの数があるので、以下のサイトなどで確認してみるのもよいかと思う。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://kachibito.net/web-service/twitter/14-japanese-tools.html&quot; title=&quot;日本国内でリリースされた14のTwitter系ツール - かちびと.net&quot;&gt;日本国内でリリースされた14のTwitter系ツール - かちびと.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kachibito.net/web-service/twitter/165-twitter-tools.html&quot; title=&quot;Twitter関連ツール・まとめ - かちびと.net&quot;&gt;Twitter関連ツール・まとめ - かちびと.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/mazucon2/20090131/1233382793&quot; title=&quot;そろそろ Twitter 関連のツールでもまとめてみようか - 空飛ぶ飛行士&quot;&gt;そろそろ Twitter 関連のツールでもまとめてみようか - 空飛ぶ飛行士&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-09-06:101</id>
    <published>2009-09-06T16:50:00Z</published>
    <updated>2009-09-10T17:15:20Z</updated>
    <category term="ruby"/>
    <link href="http://blog.designrecipe.jp/2009/9/6/ruby-rest-client" rel="alternate" type="text/html"/>
    <title>Ruby &#12391; REST &#12522;&#12477;&#12540;&#12473;&#12395;&#12450;&#12463;&#12475;&#12473;&#12377;&#12427;&#12383;&#12417;&#12398; REST Client</title>
<content type="html">
            &lt;p&gt;Ruby の場合、組み込みライブラリの &lt;code&gt;net/http&lt;/code&gt; を使用すれば、如何ようにでもできるのだが、もう少し扱い易くシンプルなインターフェイスで操作したい。これまで、&lt;code&gt;open-uri&lt;/code&gt; を拡張した &lt;code&gt;rest-open-uri&lt;/code&gt; を使用していたのだが、heroku のクライアントで使われていた REST Client を使ってみることにした。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/adamwiggins/rest-client/tree/master&quot; title=&quot;adamwiggins's rest-client at master - GitHub&quot;&gt;adamwiggins's rest-client at master - GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;blockquote&gt;&lt;p&gt;A simple REST client for Ruby, inspired by the Sinatra‘s microframework style of specifying actions: get, put, post, delete.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;gem でインストールできる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; sudo gem install rest-client&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Password&lt;/span&gt;:&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Successfully&lt;/span&gt; installed rest-client-&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt; gem installed&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; ri documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; rest-client-&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;RDoc&lt;/span&gt; documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; rest-client-&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;...&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;REST リソースとのやりとり&lt;/h2&gt;

&lt;h3&gt;REST リソースを提供するサーバの準備&lt;/h3&gt;

&lt;p&gt;まずは、サーバ側の準備をしておく。Rails プロジェクトで作成しておく。今回は、認証部分は考慮していない。&lt;/p&gt;

&lt;p&gt;Rails プロジェクトを作成。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; rails -d sqlite3 rest-test&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd rest-test&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;Scaffold を使って簡単な記事の投稿、表示、変更、削除ができるアプリケーションの雛形を作成する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; script/generate scaffold &lt;span class=&quot;co&quot;&gt;Article&lt;/span&gt; title&lt;span class=&quot;sy&quot;&gt;:string&lt;/span&gt; content&lt;span class=&quot;sy&quot;&gt;:text&lt;/span&gt; published_at&lt;span class=&quot;sy&quot;&gt;:datetime&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      exists  app/models/&lt;tt&gt;
&lt;/tt&gt;      exists  app/controllers/&lt;tt&gt;
&lt;/tt&gt;      exists  app/helpers/&lt;tt&gt;
&lt;/tt&gt;      create  app/views/articles&lt;tt&gt;
&lt;/tt&gt;      exists  app/views/layouts/&lt;tt&gt;
&lt;/tt&gt;      exists  test/functional/&lt;tt&gt;
&lt;/tt&gt;      exists  test/unit/&lt;tt&gt;
&lt;/tt&gt;      create  test/unit/helpers/&lt;tt&gt;
&lt;/tt&gt;      exists  public/stylesheets/&lt;tt&gt;
&lt;/tt&gt;      create  app/views/articles/index.html.erb&lt;tt&gt;
&lt;/tt&gt;      create  app/views/articles/show.html.erb&lt;tt&gt;
&lt;/tt&gt;      create  app/views/articles/new.html.erb&lt;tt&gt;
&lt;/tt&gt;      create  app/views/articles/edit.html.erb&lt;tt&gt;
&lt;/tt&gt;      create  app/views/layouts/articles.html.erb&lt;tt&gt;
&lt;/tt&gt;      create  public/stylesheets/scaffold.css&lt;tt&gt;
&lt;/tt&gt;      create  app/controllers/articles_controller.rb&lt;tt&gt;
&lt;/tt&gt;      create  test/functional/articles_controller_test.rb&lt;tt&gt;
&lt;/tt&gt;      create  app/helpers/articles_helper.rb&lt;tt&gt;
&lt;/tt&gt;      create  test/unit/helpers/articles_helper_test.rb&lt;tt&gt;
&lt;/tt&gt;       route  map.resources &lt;span class=&quot;sy&quot;&gt;:articles&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  dependency  model&lt;tt&gt;
&lt;/tt&gt;      exists    app/models/&lt;tt&gt;
&lt;/tt&gt;      exists    test/unit/&lt;tt&gt;
&lt;/tt&gt;      exists    test/fixtures/&lt;tt&gt;
&lt;/tt&gt;      create    app/models/article.rb&lt;tt&gt;
&lt;/tt&gt;      create    test/unit/article_test.rb&lt;tt&gt;
&lt;/tt&gt;      create    test/fixtures/articles.yml&lt;tt&gt;
&lt;/tt&gt;      create    db/migrate&lt;tt&gt;
&lt;/tt&gt;      create    db/migrate/&lt;span class=&quot;i&quot;&gt;20090906091207&lt;/span&gt;_create_articles.rb&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;マイグレーションを行い、スキーマを生成しておく。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; rake db&lt;span class=&quot;sy&quot;&gt;:migrate&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;(&lt;span class=&quot;r&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;taka/work/rest-test)&lt;tt&gt;
&lt;/tt&gt;==  &lt;span class=&quot;co&quot;&gt;CreateArticles&lt;/span&gt;: migrating =================================================&lt;tt&gt;
&lt;/tt&gt;-- create_table(&lt;span class=&quot;sy&quot;&gt;:articles&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;   -&amp;gt; &lt;span class=&quot;fl&quot;&gt;0.0032&lt;/span&gt;s&lt;tt&gt;
&lt;/tt&gt;==  &lt;span class=&quot;co&quot;&gt;CreateArticles&lt;/span&gt;: migrated (&lt;span class=&quot;fl&quot;&gt;0.0035&lt;/span&gt;s) ========================================&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;サーバの起動。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; script/server &lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;co&quot;&gt;Booting&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Mongrel&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;co&quot;&gt;Rails&lt;/span&gt; &lt;span class=&quot;fl&quot;&gt;2.3&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;2&lt;/span&gt; application starting on http&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/&lt;span class=&quot;fl&quot;&gt;0.0&lt;/span&gt;.&lt;span class=&quot;fl&quot;&gt;0.0&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;3000&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;co&quot;&gt;Call&lt;/span&gt; with -d to detach&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;co&quot;&gt;Ctrl&lt;/span&gt;-&lt;span class=&quot;co&quot;&gt;C&lt;/span&gt; to shutdown server&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;ブラウザから記事を2つほど登録しておく。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;リソースを取得する&lt;/h3&gt;

&lt;p&gt;REST Client の &lt;code&gt;RestClient.get&lt;/code&gt; で Article の一覧を取得する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; irb&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;rubygems&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;rest_client&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.get &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://localhost:3000/articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;?xml version=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; encoding=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;UTF&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;articles type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;array&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;article&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;content&amp;gt;This is the first article!!&amp;lt;/content&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;created-at type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;datetime&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;2009-09-06T09:13:46+09:00&amp;lt;/created-at&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;id type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;integer&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;1&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;published-at type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;datetime&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;2009-09-06T09:13:00+09:00&amp;lt;/published-at&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;title&amp;gt;First Article&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;updated-at type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;datetime&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;2009-09-06T09:13:46+09:00&amp;lt;/updated-at&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;/article&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;article&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;content&amp;gt;This is the second article!&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\r&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;/content&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;created-at type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;datetime&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;2009-09-06T18:17:35+09:00&amp;lt;/created-at&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;id type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;integer&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;2&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;published-at type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;datetime&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;2009-09-06T18:17:00+09:00&amp;lt;/published-at&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;title&amp;gt;Second Article&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;updated-at type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;datetime&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;2009-09-06T18:17:35+09:00&amp;lt;/updated-at&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;/article&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;/articles&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;レスポンスとなっている XML の解析には、REXML を使用する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;rexml/document&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; doc_root = &lt;span class=&quot;co&quot;&gt;REXML&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Document&lt;/span&gt;.new(&lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.get(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://localhost:3000/articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)).root&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; articles typearray .... &lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; doc_root.elements.each(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;//article&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |article|&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;   puts [&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;     article.elements[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].text,&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;     article.elements[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].text,&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;     article.elements[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].text&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;   ].join(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sy&quot;&gt;:First&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Article&lt;/span&gt;&lt;span class=&quot;sy&quot;&gt;:This&lt;/span&gt; is the first article!!&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy&quot;&gt;:Second&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Article&lt;/span&gt;&lt;span class=&quot;sy&quot;&gt;:This&lt;/span&gt; is the second article!&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; [article .... &lt;span class=&quot;er&quot;&gt;,&lt;/span&gt; article .... &lt;span class=&quot;er&quot;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;この後、いろいろ試してみるにあたり、投稿一覧を取ってくるメソッドがあると便利なので、定義しておく。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;ostruct&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# OpenStruct を使用するため&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# Time.parse を使用するため&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;get_article_list&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;   doc_root = &lt;span class=&quot;co&quot;&gt;REXML&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Document&lt;/span&gt;.new(&lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.get(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://localhost:3000/articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)).root&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;   articles = []&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;   doc_root.elements.each(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;//article&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |article|&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;     art = &lt;span class=&quot;co&quot;&gt;OpenStruct&lt;/span&gt;.new&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;     art.resource_id = article.elements[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].text.to_i&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;     art.title = article.elements[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].text&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;     art.content = article.elements[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].text&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;     art.published_at = &lt;span class=&quot;co&quot;&gt;Time&lt;/span&gt;.parse article.elements[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published-at&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;].text&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;     articles &amp;lt;&amp;lt; art&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;   &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt;   articles&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;get_article_list&lt;/code&gt; で投稿一覧を取得する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; get_article_list&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; [&lt;span class=&quot;c&quot;&gt;#&amp;lt;OpenStruct published_at=Sun Sep 06 09:13:00 +0900 2009, resource_id=1, content=&amp;quot;This is the first article!!&amp;quot;, title=&amp;quot;First Article&amp;quot;&amp;gt;,&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;#&amp;lt;OpenStruct published_at=Sun Sep 06 18:17:00 +0900 2009, resource_id=2, content=&amp;quot;This is the second article!\n&amp;quot;, title=&amp;quot;Second Article&amp;quot;&amp;gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h3&gt;リソースを更新する&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;RestClient.put&lt;/code&gt; を使って2番目の投稿の本文を更新してみる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; article2 = get_article_list[&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;c&quot;&gt;#&amp;lt;OpenStruct published_at=Sun Sep 06 18:17:00 +0900 2009, resource_id=2, content=&amp;quot;This is the second article!\n&amp;quot;, title=&amp;quot;Second Article&amp;quot;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.put(&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;   &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://localhost:3000/articles/&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;article2.resource_id.to_s&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;   &lt;span class=&quot;sy&quot;&gt;:article&lt;/span&gt; =&amp;gt; { &lt;span class=&quot;sy&quot;&gt;:content&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;article2.content&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; Changed&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; })&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;RequestFailed&lt;/span&gt;: &lt;span class=&quot;co&quot;&gt;HTTP&lt;/span&gt; status code &lt;span class=&quot;i&quot;&gt;422&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;エラーコード 422 は、&lt;code&gt;Unprocessable Entity&lt;/code&gt; になる。サーバ側のログを覗いてみると、&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;Processing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;ArticlesController&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#update (for 127.0.0.1 at 2009-09-07 00:13:06) [PUT]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Parameters&lt;/span&gt;: {&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;{&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; Changed&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;ActionController&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;InvalidAuthenticityToken&lt;/span&gt; (&lt;span class=&quot;co&quot;&gt;ActionController&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;InvalidAuthenticityToken&lt;/span&gt;):&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;送信したリクエストの中に、CSRF 対策のために Rails で使用されている &lt;code&gt;AuthenticityToken&lt;/code&gt; が無いためだ。&lt;/p&gt;

&lt;p&gt;今回は、&lt;code&gt;AuthenticityToken&lt;/code&gt; のトークンチェックは行わずに、検証を続ける。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;app/controllers/articles_controller.rb&lt;/code&gt; に以下の記述を追加し、トークンチェックを省略する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;ArticlesController&lt;/span&gt; &amp;lt; &lt;span class=&quot;co&quot;&gt;ApplicationController&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  skip_before_filter &lt;span class=&quot;sy&quot;&gt;:verify_authenticity_token&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;再度クライアントから更新を行う。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; &lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.put(&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;   &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://localhost:3000/articles/&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;article2.resource_id.to_s&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;   &lt;span class=&quot;sy&quot;&gt;:article&lt;/span&gt; =&amp;gt; { &lt;span class=&quot;sy&quot;&gt;:content&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;article2.content&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; Changed&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; })&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; get_article_list&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; [&lt;span class=&quot;c&quot;&gt;#&amp;lt;OpenStruct published_at=Sun Sep 06 09:13:00 +0900 2009, resource_id=1, content=&amp;quot;This is the first article!!&amp;quot;, title=&amp;quot;First Article&amp;quot;&amp;gt;,&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;#&amp;lt;OpenStruct published_at=Sun Sep 06 18:17:00 +0900 2009, resource_id=2, content=&amp;quot;This is the second article!\n Changed&amp;quot;, title=&amp;quot;Second Article&amp;quot;&amp;gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;更新されたようだ。&lt;/p&gt;

&lt;p&gt;サーバ側のログも確認してみる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;Processing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;ArticlesController&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#update (for 127.0.0.1 at 2009-09-07 00:22:03) [PUT]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Parameters&lt;/span&gt;: {&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;{&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;This is the second article!&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; Changed&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Article&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Load&lt;/span&gt; (&lt;span class=&quot;fl&quot;&gt;0.2&lt;/span&gt;ms)   &lt;span class=&quot;co&quot;&gt;SELECT&lt;/span&gt; * &lt;span class=&quot;co&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;WHERE&lt;/span&gt; (&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;.&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Article&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Update&lt;/span&gt; (&lt;span class=&quot;fl&quot;&gt;0.7&lt;/span&gt;ms)   &lt;span class=&quot;co&quot;&gt;UPDATE&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;This is the second article!&lt;tt&gt;
&lt;/tt&gt; Changed&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;updated_at&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;2009-09-07 00:22:03&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Completed&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;i&quot;&gt;12&lt;/span&gt;ms (&lt;span class=&quot;co&quot;&gt;View&lt;/span&gt;: &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;co&quot;&gt;DB&lt;/span&gt;: &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;) | &lt;span class=&quot;i&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;OK&lt;/span&gt; [http&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/localhost/articles/&lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;]&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h3&gt;リソースを新規に追加する&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;RestClient.post&lt;/code&gt; を使って新規に投稿する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; &lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.post(&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;   &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://localhost:3000/articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;   &lt;span class=&quot;sy&quot;&gt;:article&lt;/span&gt; =&amp;gt; { &lt;span class=&quot;sy&quot;&gt;:title&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Third Article&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:content&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;This is third article!!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;     &lt;span class=&quot;sy&quot;&gt;&lt;span class=&quot;sy&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at(1i)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;2009&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;&lt;span class=&quot;sy&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at(2i)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;&lt;span class=&quot;sy&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at(3i)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;?&amp;gt;&lt;/span&gt;     &lt;span class=&quot;sy&quot;&gt;&lt;span class=&quot;sy&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at(4i)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;22&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;&lt;span class=&quot;sy&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at(5i)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;})&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;?xml version=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; encoding=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;UTF&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;article&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;content&amp;gt;This is third article!!&amp;lt;/content&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;created-at type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;datetime&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;2009-09-07T00:33:11+09:00&amp;lt;/created-at&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;id type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;integer&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;3&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;published-at type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;datetime&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;2009-09-06T22:10:00+09:00&amp;lt;/published-at&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;title&amp;gt;Third Article&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;updated-at type=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;datetime&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;2009-09-07T00:33:11+09:00&amp;lt;/updated-at&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;/article&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;新規に追加されたようだ。DB の id も新規に 3 が採番されている。&lt;/p&gt;

&lt;p&gt;サーバ側のログも確認してみる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;Processing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;ArticlesController&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#create (for 127.0.0.1 at 2009-09-07 00:33:11) [POST]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Parameters&lt;/span&gt;: {&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;{&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Third Article&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at(1i)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;2009&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;This is third article!!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at(2i)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at(3i)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at(4i)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;22&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at(5i)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}}&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Article&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Create&lt;/span&gt; (&lt;span class=&quot;fl&quot;&gt;37.3&lt;/span&gt;ms)   &lt;span class=&quot;co&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;INTO&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; (&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;updated_at&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;published_at&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;created_at&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) VALUES(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;2009-09-07 00:33:11&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Third Article&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;This is third article!!&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;2009-09-06 22:10:00&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;2009-09-07 00:33:11&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Completed&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;i&quot;&gt;51&lt;/span&gt;ms (&lt;span class=&quot;co&quot;&gt;View&lt;/span&gt;: &lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;co&quot;&gt;DB&lt;/span&gt;: &lt;span class=&quot;i&quot;&gt;37&lt;/span&gt;) | &lt;span class=&quot;i&quot;&gt;201&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Created&lt;/span&gt; [http&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/localhost/articles]&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;当然ながら、ブラウザで確認してみても、これまでの作業の内容が確認できる。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;リソースを削除する&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;RestClient.delete&lt;/code&gt; を使って投稿を削除する。
1番目に投稿したリソースの削除を行う。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; article1 = get_article_list[&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;]&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;c&quot;&gt;#&amp;lt;OpenStruct published_at=Sun Sep 06 09:13:00 +0900 2009, resource_id=1, content=&amp;quot;This is the first article!!&amp;quot;, title=&amp;quot;First Article&amp;quot;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.delete &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://localhost:3000/articles/&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;article1.resource_id.to_s&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; get_article_list&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; [&lt;span class=&quot;c&quot;&gt;#&amp;lt;OpenStruct published_at=Sun Sep 06 18:17:00 +0900 2009, resource_id=2, content=&amp;quot;This is the second article!\n Changed&amp;quot;, title=&amp;quot;Second Article&amp;quot;&amp;gt;,&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;c&quot;&gt;#&amp;lt;OpenStruct published_at=Sun Sep 06 22:10:00 +0900 2009, resource_id=3, content=&amp;quot;This is third article!!&amp;quot;, title=&amp;quot;Third Article&amp;quot;&amp;gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;確かに削除されている。&lt;/p&gt;

&lt;p&gt;サーバ側のログも確認する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;Processing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;ArticlesController&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#destroy (for 127.0.0.1 at 2009-09-07 00:47:24) [DELETE]&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Parameters&lt;/span&gt;: {&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Article&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Load&lt;/span&gt; (&lt;span class=&quot;fl&quot;&gt;0.2&lt;/span&gt;ms)   &lt;span class=&quot;co&quot;&gt;SELECT&lt;/span&gt; * &lt;span class=&quot;co&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;WHERE&lt;/span&gt; (&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;.&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;) &lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Article&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Destroy&lt;/span&gt; (&lt;span class=&quot;fl&quot;&gt;0.6&lt;/span&gt;ms)   &lt;span class=&quot;co&quot;&gt;DELETE&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Completed&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;i&quot;&gt;10&lt;/span&gt;ms (&lt;span class=&quot;co&quot;&gt;View&lt;/span&gt;: &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;co&quot;&gt;DB&lt;/span&gt;: &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;) | &lt;span class=&quot;i&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;OK&lt;/span&gt; [http&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/localhost/articles/&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;]&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;REST Client のそれ以外の特徴&lt;/h2&gt;

&lt;h3&gt;HTTP のベーシック認証&lt;/h3&gt;

&lt;p&gt;HTTP のベーシック認証にも対応している。リソースの前に &lt;code&gt;&amp;lt;account id&amp;gt;:&amp;lt;password&amp;gt;@&lt;/code&gt; を追加してあげればよい。&lt;/p&gt;

&lt;p&gt;以下は、delicious で最後にブックマークを追加した時間を取得する API を叩いた例。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; &lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.get &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;https://taro:password@api.del.icio.us/v1/posts/update&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;?xml version=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; encoding=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;UTF&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;update time=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;i&quot;&gt;2009&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;09&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;06&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;T07&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;23&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;43&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;Z&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; inboxnew=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;!-- fe10.feeds.del.ac4.yahoo.net compressed/chunked Sun Sep  6 09:09:45 PDT 2009 --&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h3&gt;ロギング&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;RestClient.log=&lt;/code&gt; にて、ログのファイル名、または &lt;code&gt;stdout&lt;/code&gt;、&lt;code&gt;stderr&lt;/code&gt; も指定できる。&lt;/p&gt;

&lt;p&gt;以下は、&lt;code&gt;stdout&lt;/code&gt; を指定した例。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; &lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.log = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; &lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.get &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;https://taro:password@api.del.icio.us/v1/posts/update&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.get &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;https://drtaka:fastone13@api.del.icio.us/v1/posts/update&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;# =&amp;gt; 200 OK | text/xml 179 bytes&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;?xml version=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; encoding=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;UTF&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;update time=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;i&quot;&gt;2009&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;09&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;06&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;T07&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;23&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;43&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;Z&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; inboxnew=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;!-- fe10.feeds.del.ac4.yahoo.net compressed/chunked Sun Sep  6 09:09:45 PDT 2009 --&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h3&gt;ヘッダーの取得&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;RestClient::Response#headers&lt;/code&gt; でレスポンスの HTTP ヘッダーの取得が可能。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; (&lt;span class=&quot;co&quot;&gt;RestClient&lt;/span&gt;.get &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://localhost:3000/articles&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;).headers&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; {&lt;span class=&quot;sy&quot;&gt;:etag&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;i&quot;&gt;33&lt;/span&gt;ccfb63496b854f2bd158a91962a48a&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:x_runtime&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:content_type&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;application/xml; charset=utf-8&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:cache_control&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;private, max-age=0, must-revalidate&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:content_length&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;793&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:connection&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:date&lt;/span&gt;=&amp;gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Sun, 06 Sep 2009 16:17:11 GMT&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h3&gt;その他&lt;/h3&gt;

&lt;p&gt;それ以外にも、プロキシの指定、&lt;code&gt;restclient&lt;/code&gt; コマンドでの操作、など扱い易いインターフェイスを揃えてくれている。以下の readme を参照。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://rest-client.heroku.com/rdoc/&quot; title=&quot;rest-client, fetch RESTful resources effortlessly&quot;&gt;rest-client, fetch RESTful resources effortlessly&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;参考サイト&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://rest-client.heroku.com/rdoc/&quot; title=&quot;rest-client, fetch RESTful resources effortlessly&quot;&gt;rest-client, fetch RESTful resources effortlessly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.javapassion.com/handsonlabs/rails_rest/&quot; title=&quot;LAB-5534: Rails REST&quot;&gt;LAB-5534: Rails REST&lt;/a&gt;&lt;br /&gt;
NetBeans を使って検証した例。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://delicious.com/help/api&quot; title=&quot;delicious/help/api&quot;&gt;delicious/help/api&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://aligach.net/diary/20080927.html#p01&quot; title=&quot; rest-client が便利 - あーありがち (2008-09-27)&quot;&gt;rest-client が便利 - あーありがち (2008-09-27)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://aligach.net/diary/20090405.html#p01&quot; title=&quot; RestClient は 0.9 でヘッダが取れるようになってた - あーありがち (2009-04-05)&quot;&gt;RestClient は 0.9 でヘッダが取れるようになってた - あーありがち (2009-04-05)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-08-16:68</id>
    <published>2009-08-16T16:13:00Z</published>
    <updated>2009-08-16T16:15:15Z</updated>
    <category term="cucumber"/>
    <category term="emacs"/>
    <link href="http://blog.designrecipe.jp/2009/8/16/emacs-cucumber-feature-mode-el" rel="alternate" type="text/html"/>
    <title>Emacs &#12391; Cucumber &#12398; Feature &#12434;&#32232;&#38598;&#12375;&#26131;&#12367;&#12377;&#12427; feature-mode.el</title>
<content type="html">
            &lt;p&gt;&lt;a href=&quot;http://github.com/aslakhellesoy/cucumber/tree/master&quot;&gt;Cucumber&lt;/a&gt; の Feature の記述を楽にしてくれる elisp。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/michaelklishin/cucumber.el/tree/master&quot;&gt;michaelklishin's cucumber.el at master - GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;インストールと設定の例は以下の通り。&lt;br /&gt;
($HOME/.emacs.d 配下に追加の elisp は突っ込んでいる。)&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;.emacs.d&lt;tt&gt;
&lt;/tt&gt;$ git clone git:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;/github.com/michaelklishin/cucumber.el.git cucumber&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;.emacs&lt;/code&gt; には以下を追加。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;(add-to-list &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;load-path &amp;quot;~/.emacs.d/cucumber&amp;quot;)&lt;tt&gt;
&lt;/tt&gt;(autoload &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;feature-mode &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;feature-mode&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Mode for editing cucumber files&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; t)&lt;tt&gt;
&lt;/tt&gt;(add-to-list &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;auto-mode-alist &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;.feature$&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; . feature-mode))&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;git clone したディレクトリの中に snippets も用意されているので、snipet の laod directory にパスを追加しておく。&lt;br /&gt;
&lt;strong&gt;yasnippet&lt;/strong&gt; の設定は、下記のページなどが参考になる。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/gan2/20080402/1207135480&quot;&gt;yasnippet を導入してみた - gan2 の Ruby 勉強日記&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-08-01:57</id>
    <published>2009-08-01T18:32:00Z</published>
    <updated>2009-08-16T16:31:51Z</updated>
    <category term="cloud"/>
    <link href="http://blog.designrecipe.jp/2009/8/1/hotpads-amazon-ec2-s3" rel="alternate" type="text/html"/>
    <title>HotPads &#12398; Amazon EC2/S3 &#12434;&#21033;&#29992;&#12375;&#12383;&#12469;&#12540;&#12499;&#12473;&#12398;&#23455;&#38555;&#12398;&#12467;&#12473;&#12488;</title>
<content type="html">
            &lt;p&gt;&lt;strong&gt;&quot;クラウド&quot;&lt;/strong&gt;という言葉はちょっと前まではあまり好きではなかった。
その言葉に対しての実体がイマイチイメージがつき辛く、ボンヤリしたものであったためだ。&lt;/p&gt;

&lt;p&gt;(なんちゃって)コンサルタントの方々がその言葉を口にして、予算を握っている方々に、
&lt;strong&gt;&quot;クラウド&quot;&lt;/strong&gt; という言葉通りのボンヤリとした絵の書かかれたスライドを片手に、
もっともらしい話をしているのを各所で聞いていた影響もあるのかもしれない。。&lt;/p&gt;

&lt;p&gt;ただ、最近はサービスの実用化が進んでおり、個人的にも興味を惹かれ始めていることもあり、現実的な話がアンテナにひっかかってくるようになった。&lt;/p&gt;

&lt;h2&gt;HotPads が示した AWS の具体的な利用例とそのコスト&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://daily.hotpads.com/hotpads_daily/2009/06/hotpads-on-aws.html&quot;&gt;HotPads Daily :: The Official Blog of HotPads.com: HotPads on AWS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;この記事は結構インパクトがあった。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/tracylaxdal/hotpads-on-aws?type=powerpoint&quot; title=&quot;AWS Start-Up Event DC 2009: HotPads On AWS&quot;&gt;AWS Start-Up Event DC 2009: HotPads On AWS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;上記のスライドの中で、サービス規模、システム構成、実際にかかっている月々のコストが具体的に示されている。&lt;/p&gt;

&lt;p&gt;運用しているサービスの規模としては、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;800,000 訪問者/月&lt;/li&gt;
&lt;li&gt;4.5 百万ページビュー/月&lt;/li&gt;
&lt;li&gt;日々アップデートされる 3.5 百万件の不動産情報&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;となっている。めちゃくちゃ大規模というものではないが、かといって小規模という枠でもない。&lt;/p&gt;

&lt;p&gt;上記スライドの内容をうまくまとめてくれているコラムが以下のコラム。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://highscalability.com/hotpads-shows-true-cost-hosting-amazon&quot;&gt;HotPads Shows the True Cost of Hosting on Amazon | High Scalability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;上記からコストの詳細部分を引用する。&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Costs&lt;/p&gt;

&lt;p&gt;・EC2 - $7400/month - run 20 of various size instances at anyone time. Most work is in the background processing of images, not web serving.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$150: 2 Small HAProxy Load Balancers - 2 for failover, these have the elastic IPs, round robin DNS point at the elastic IPs.&lt;/li&gt;
&lt;li&gt; $1,200: 3-5 Large Tomcat Web Servers - an array of 3 run at night and 5 during the day.&lt;/li&gt;
&lt;li&gt;$1,500: 5 Large Tomcat Job Servers&lt;/li&gt;
&lt;li&gt;$900: 1 X-Large 1 Large Index Server - used to power property search and have several GB of RAM for the JVM&lt;/li&gt;
&lt;li&gt;$1,200: 1 X-Large 2 Large MySQL masters&lt;/li&gt;
&lt;li&gt;$1,200: 1 X-Large 2 Large MySQL slaves&lt;/li&gt;
&lt;li&gt;$300: 1 Large Messaging Server ActiveMQ - will be replaced with SQS&lt;/li&gt;
&lt;li&gt;$300: 1 Large Map tile creation servers Tilecache&lt;/li&gt;
&lt;li&gt;$600: Development/testing/migration/ servers&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;・S3 - $1500/month - few hundred million objects for files for maps and real-estate listing photos. 4TB of database backup stored as EBS diffs ($600/month).&lt;/p&gt;

&lt;p&gt;・Elastic Block Storage - $500/month&lt;/p&gt;

&lt;p&gt;・CloudFront - $460/month - is used to serve static files and map files throughout the world. It serves static files, map tiles, and listing photos.&lt;/p&gt;

&lt;p&gt;・Elastic IP Addresses - $8/month&lt;/p&gt;

&lt;p&gt;・RightScale - $500/month - used for management and deployment.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;現在 100円 を切っているが、1ドルを100円計算とした場合、&lt;strong&gt;約110万/月&lt;/strong&gt;で上記のサービス規模、システムを稼動させている。&lt;/p&gt;

&lt;p&gt;金額だけの観点からいくと、以前プロバイダに支払っていた金額と同じ金額だということだ。このコストについて、同じコラムで Todd Hoff 氏は以下の感想を述べている。&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I found this is a little surprising as I thought the cloud would be more expensive, but they only pay for what they need instead of having to over provision for transient uses like testing. And some servers aren't necessary anymore as EBS handles backups so database slave servers are no longer required.&lt;/p&gt;

&lt;p&gt;私にとってはこのことはちょっとした驚きだった。クラウドはもっとコストのかかるものだと思っていたのだが、テスト環境のような一時的な利用における備えをしておく必要はなく、それが必要な時に必要な金額だけを払えばいいのだ。また、(実際の運用では必要になる)幾つかのサーバはもはや必要ないのだ。例えば、EBS がバックアップは行ってくれるので、スレーブのデータベースサーバはもはや必要なくなっている。&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;(括弧内の言葉は自分の方で補記した。)&lt;/p&gt;

&lt;p&gt;この HotPads の例から学んだこととして、&lt;strong&gt;&quot;Lessons Learned&quot;&lt;/strong&gt; の項の中で Todd Hoff 氏は幾つか挙げている。印象に残ったところを。&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;・Overall cost is about the same as with previous hosting site but the overall speed of development and ease of management is night and day different. Getting more servers and lots more flexibility.&lt;/p&gt;

&lt;p&gt;・全体のコストは、以前のホスティングサイトとほぼ同じ。だが、開発のスピードと管理の容易さは、夜と昼ほどの違いがある。より多くのサーバを得られて、より多くの柔軟性を得る。&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;インフラのスペシャリスト達が作ったプラットフォームで、そのプラットフォームの運用は任せられる。
ソフトウェアと同様、インフラ部分においても大変なところは初期の構築はもちろんだが、その後の運用。
当然ながらコストの中には&quot;もの&quot;だけではなく、人件費(その人間力/技術力含めて)のコストが含まれる。&lt;/p&gt;

&lt;p&gt;セキュリティ、もろもろの規定含めて考えないといけないところはあるかと思うが、PaaS (Platform as a Service) という&lt;strong&gt;&quot;クラウドサービス&quot;&lt;/strong&gt;はとても魅了的に映る。&lt;/p&gt;

&lt;p&gt;これまでのように、3年後、5年後にはシステム開発のあり方はまた変化しているのだろう・・・と思わざるを得ない。その手法だけでなく、業界の構造としても。&lt;/p&gt;

&lt;h2&gt;参考サイト&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://gihyo.jp/dev/serial/01/amazon_ec2&quot; title=&quot;連載：はじめてのAmazon EC2&amp;amp;S3　～これからの新サービスの公開の形～｜gihyo.jp … 技術評論社&quot;&gt;連載：はじめてのAmazon EC2&amp;amp;S3　～これからの新サービスの公開の形～｜gihyo.jp … 技術評論社&lt;/a&gt;&lt;br /&gt;
HotPads が利用している Amazon EC2 と S3 の説明。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://codezine.jp/article/detail/3137&quot; title=&quot;AWSの概要と登録手順　～Amazon EC2/S3環境構築のすべて～（1/3）：CodeZine&quot;&gt;AWSの概要と登録手順　～Amazon EC2/S3環境構築のすべて～（1/3）：CodeZine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://codezine.jp/article/corner/230&quot; title=&quot;流行りのクラウドサービスを操ってみよう！Amazon EC2/S3環境構築のすべて：CodeZine（コードジン）&quot;&gt;流行りのクラウドサービスを操ってみよう！Amazon EC2/S3環境構築のすべて：CodeZine（コードジン）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-07-27:53</id>
    <published>2009-07-27T16:44:00Z</published>
    <updated>2009-07-28T15:44:26Z</updated>
    <category term="radiant"/>
    <category term="ruby"/>
    <link href="http://blog.designrecipe.jp/2009/7/27/about-radiant" rel="alternate" type="text/html"/>
    <title>Radiant CMS - &#12501;&#12524;&#12461;&#12471;&#12502;&#12523;&#12394; Ruby On Rails &#12505;&#12540;&#12473;&#12398; CMS</title>
<content type="html">
            &lt;p&gt;これまで Radiant に何度か触れながら、そもそも Radiant って何？というメモを残していなかったので、改めて。&lt;/p&gt;

&lt;h2&gt;Radiant とは？&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://radiantcms.org/&quot; title=&quot;Radiant CMS&quot;&gt;Radiant CMS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;blockquote&gt;&lt;p&gt;Radiant is a no-fluff, open source content management system designed for small teams. It is similar to Textpattern or MovableType, but is a general purpose content management system (not just a blogging engine).&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&quot;no-fluff&quot;&lt;/strong&gt; という表現は時々見かけるのだが、どのようなニュアンスなのだろう。。&lt;/p&gt;

&lt;p&gt;Radiant は Ruby On Rails をベースに作成されたオープンソースの CMS (Content Management System) アプリケーションになる。&lt;br /&gt;
Radiant が提供する管理画面を利用してブラウザからコンテンツの作成、編集などのコンテンツ管理が行える。&lt;/p&gt;

&lt;p&gt;コンテンツの作成には、HTML 以外に Radiant タグという便利なタグが使用できるようになっており、条件文、コンテンツの繰り返し処理など、静的なページだけでなく動的なページの作成も可能となる。&lt;br /&gt;
また、必要に応じてエクステンションという拡張モジュールを導入することで追加のタグや機能が利用可能となり、フレキシブルなサイト構築が可能となる。&lt;/p&gt;

&lt;p&gt;必要とする機能がエクステンションとして提供されていなければ、エクステンションを自分で作成してしまえばよい。
Ruby On Rails を扱ったことがあれば、そこまで難しい話ではない。&lt;/p&gt;

&lt;p&gt;Radiant の概要を理解するのは、デモを使ってみるのが手っ取り早い。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.radiantcms.org/demo/&quot; title=&quot;Demo&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;現在 2009/06/14 にリリースアナウンスが行われた v.0.8.0 が最新バージョンであるが、Radiant 自体は 2006年(確か)から開発が続いており、歴史もあり、完成度も高い。&lt;/p&gt;

&lt;p&gt;海外では結構実績のあるアプリケーションになるのだが、日本では Ruby 本家のサイトで採用されていたりはするのだが、メジャーな存在だとはいい難い。。その理由については、思いつくところをこのメモの後ろ方で考えてみた。&lt;/p&gt;

&lt;h2&gt;Radiant の特徴&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.radiantcms.org/overview/&quot; title=&quot;Radiant Overview&quot;&gt;Radiant Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;上記ページにて 10 個の特徴が挙げられている。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;シンプルな管理者サイトのインターフェイス&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Built from the ground up to be as simple as possible, Radiant features an elegant administrative interface that centers around three key components: pages, snippets, and layouts.&lt;/p&gt;

&lt;p&gt;可能な限りシンプルに構築されている。3つのキーコンポーネント (ページ、スニペット、レイアウト)を軸としたエレガントな管理者サイトのインターフェイスに特徴がある。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ページ (Pages)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Pages contain the meat of the content for a Web site and may use Markdown, Textile, or plain HTML. Pages are composed of multiple parts such as a body and sidebar.&lt;/p&gt;

&lt;p&gt;ページは、Web サイトのコンテンツを意味する。その記述には、Markdown、Textile、プレーンな HTML の利用が可能となる。ページは、&lt;strong&gt;body&lt;/strong&gt;、&lt;strong&gt;sidebar&lt;/strong&gt; といった複合的なパート(multiple part)によって構成される。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;スニペット (Snippets)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Content that is used in multiple places can be stored in a snippet. Snippets are very similar to PHP includes or Rails partials.&lt;/p&gt;

&lt;p&gt;いろいろなところで利用されるコンテンツは、スニペットの中にストアしておく。スニペットは、PHP の &lt;strong&gt;includes&lt;/strong&gt;や Rails の &lt;strong&gt;partials&lt;/strong&gt; によく似ている。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;レイアウト (Layouts)&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Layouts generally contain most of the HTML for a page's design. Layouts can render pages parts in any way they choose. One layout could choose to render the body and sidebar of a page, while another layout (a print layout) could render only the body.&lt;/p&gt;

&lt;p&gt;レイアウトは、通常、ページのデザインのための HTML の大半を含む。レイアウトは、レイアウトに記載されるページのパーツをレンダリングする。あるレイアウトでは、&lt;strong&gt;body&lt;/strong&gt; と &lt;strong&gt;sidebar&lt;/strong&gt; をレンダリングし、別のレイアウト(印刷用レイアウト)には、&lt;strong&gt;body&lt;/strong&gt; だけをレンダリングさせることができる。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;フレキシブルなサイト構成&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Unlike many other blogging engines Radiant allows you to arrange pages according to any hierarchy. A Weblog in Radiant can be as simple as a collection of child pages underneath a parent page.&lt;/p&gt;

&lt;p&gt;多くの他のブログエンジンとは異なり、Radiant は階層構造によってページの管理を行える。Radiant におけるウェブログは、&quot;親ページ&quot;の下に位置する単純な&quot;子ページ&quot;のコレクションとなる。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Radius テンプレート言語&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Radiant has a special macro language (similar to HTML) called Radius which makes it easy to include content from other pages, iterate over page children, and display content conditionally. Radius tags are available in pages, snippets, and layouts.&lt;/p&gt;

&lt;p&gt;Radiant は、&lt;strong&gt;Radius&lt;/strong&gt; という特別なマクロ言語(HTML に似ている)を使用できる。そのマクロ言語は、他のページからのコンテンツを含めることや、&quot;子ページ&quot; をイテレートすることや、条件に合わせてコンテンツを表示する、といったことを容易に可能とする。&lt;strong&gt;Radius&lt;/strong&gt; タグは、ページ、スニペット、レイアウトで利用可能。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;カスタムテキストフィルター&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Radiant ships with support for Markdown and Textile, but developers can easily create text filters for any markup language such as RDoc, BBCode, or Structured Text.&lt;/p&gt;

&lt;p&gt;Radiant は Markdown と Textile のサポートを標準装備としている。とはいえ、開発者は RDoc、BBCode、構造化されたテキストのようなマークアップ言語のテキストフィルターを容易に作成するこができる。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;インテリジェントなページキャシング&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Radiant includes an intelligent caching mechanism which allows content to be cached for a maximum of 5 minutes. This ensures that content is always fresh and provides an optimal level of performance.&lt;/p&gt;

&lt;p&gt;Radiant はコンテンツを最大5分間キャッシングするインテリジェントなキャッシュの仕組みを持っている。このことは、コンテンツがいつも新鮮であることを保証しつつ、最適なレベルのパフォーマンスを提供する。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ruby On Rails で構築されている&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Radiant is built using Ruby on Rails. This means it’s easy for developers to extend Radiant because it’s built on a widely accepted (and understood) Web application development platform.&lt;/p&gt;

&lt;p&gt;Radiant は Ruby On Rails を使用して構築されている。このことは、開発者にとっては Radiant を容易に拡張できることを意味する。なぜなら、Ruby On Rails は、広く受け入れられ(かつ理解されている) Web アプリケーション開発プラットフォームだから。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MIT ライセンス&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Radiant is licensed under the MIT License. This means that Radiant is free for commercial and non-profit use. It also means that you are free to modify and distribute Radiant as long as you don't remove the appropriate notices from the source code.&lt;/p&gt;

&lt;p&gt;Radiant は MIT ライセンスのもと、ライセンスされている。このことは、Radiant が商用、非営利の利用に対して自由に利用できることを意味する。また、ソースコードからしかるべき条項(著作権表示、許諾表示など)を削除しない限り、Radiant を変更することや、配布することも自由であることを意味する。&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;Radiant のインストール&lt;/h2&gt;

&lt;p&gt;gem コマンドで一発だ。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; sudo gem install radiant&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;Radiant プロジェクトの作成&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;radiant&lt;/code&gt; コマンドを使用して、Radiant プロジェクトの作成を行う。&lt;code&gt;radiant&lt;/code&gt; コマンドの詳細は、ヘルプを参照。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; radiant -v&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Radiant&lt;/span&gt; &lt;span class=&quot;fl&quot;&gt;0.8&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; radiant -h&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Usage&lt;/span&gt;: &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;opt&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;local/bin/radiant &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;to/radiant/app [options]&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Options&lt;/span&gt;:&lt;tt&gt;
&lt;/tt&gt;    -r, --ruby=path                  &lt;span class=&quot;co&quot;&gt;Path&lt;/span&gt; to the &lt;span class=&quot;co&quot;&gt;Ruby&lt;/span&gt; binary of your choice (otherwise scripts use env, dispatchers current path).&lt;tt&gt;
&lt;/tt&gt;                                     &lt;span class=&quot;co&quot;&gt;Default&lt;/span&gt;: &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;opt&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;local/bin/ruby&lt;tt&gt;
&lt;/tt&gt;    -d, --database=name              &lt;span class=&quot;co&quot;&gt;Preconfigure&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; selected database (options: mysql, postgresql, sqlite3, sqlserver).&lt;tt&gt;
&lt;/tt&gt;                                     &lt;span class=&quot;co&quot;&gt;Default&lt;/span&gt;: mysql&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Radiant&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Info&lt;/span&gt;:&lt;tt&gt;
&lt;/tt&gt;    -v, --version                    &lt;span class=&quot;co&quot;&gt;Show&lt;/span&gt; the &lt;span class=&quot;co&quot;&gt;Radiant&lt;/span&gt; version number &lt;span class=&quot;r&quot;&gt;and&lt;/span&gt; quit.&lt;tt&gt;
&lt;/tt&gt;    -h, --help                       &lt;span class=&quot;co&quot;&gt;Show&lt;/span&gt; this help message &lt;span class=&quot;r&quot;&gt;and&lt;/span&gt; quit.&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;General&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Options&lt;/span&gt;:&lt;tt&gt;
&lt;/tt&gt;    -p, --pretend                    &lt;span class=&quot;co&quot;&gt;Run&lt;/span&gt; but &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;not&lt;/span&gt; make any changes.&lt;tt&gt;
&lt;/tt&gt;    -f, --force                      &lt;span class=&quot;co&quot;&gt;Overwrite&lt;/span&gt; files that already exist.&lt;tt&gt;
&lt;/tt&gt;    -s, --skip                       &lt;span class=&quot;co&quot;&gt;Skip&lt;/span&gt; files that already exist.&lt;tt&gt;
&lt;/tt&gt;    -q, --quiet                      &lt;span class=&quot;co&quot;&gt;Suppress&lt;/span&gt; normal output.&lt;tt&gt;
&lt;/tt&gt;    -t, --backtrace                  &lt;span class=&quot;co&quot;&gt;Debugging&lt;/span&gt;: show backtrace on errors.&lt;tt&gt;
&lt;/tt&gt;    -c, --svn                        &lt;span class=&quot;co&quot;&gt;Modify&lt;/span&gt; files with subversion. &lt;span class=&quot;er&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;Note&lt;/span&gt;: svn must be &lt;span class=&quot;r&quot;&gt;in&lt;/span&gt; path)&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;新しい Radiant アプリケーションの作成、そして、初期設定を行う。&lt;/p&gt;

&lt;p&gt;以下は、データベースに &lt;strong&gt;&lt;code&gt;sqlite3&lt;/code&gt;&lt;/strong&gt;、Radiant アプリケーションの名前として &lt;strong&gt;&lt;code&gt;my-app&lt;/code&gt;&lt;/strong&gt; を指定して Radiant アプリケーションの新規作成を行っている。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; radiant -d sqlite3 my-app&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;アプリケーションディレクトリに移動して、初期設定を行う。途中何度か入力の必要がある。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd my-app&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; rake production db&lt;span class=&quot;sy&quot;&gt;:bootstrap&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;(&lt;span class=&quot;r&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;hoge/work/radiant/my-app)&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;This&lt;/span&gt; task will destroy any data &lt;span class=&quot;r&quot;&gt;in&lt;/span&gt; the database. &lt;span class=&quot;co&quot;&gt;Are&lt;/span&gt; you sure you want to &lt;tt&gt;
&lt;/tt&gt;continue? [yn] y&lt;tt&gt;
&lt;/tt&gt;==  &lt;span class=&quot;co&quot;&gt;CreateRadiantTables&lt;/span&gt;: migrating ============================================&lt;tt&gt;
&lt;/tt&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Create&lt;/span&gt; the admin user (press enter &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; defaults).&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Name&lt;/span&gt; (&lt;span class=&quot;co&quot;&gt;Administrator&lt;/span&gt;): &lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Username&lt;/span&gt; (admin): &lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Password&lt;/span&gt; (radiant): &lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;管理者の情報を入力する。&lt;code&gt;()&lt;/code&gt; 内がデフォルトの値となる。&lt;strong&gt;Name&lt;/strong&gt; はそのままでよいだろう。&lt;strong&gt;Username&lt;/strong&gt;、&lt;strong&gt;Password&lt;/strong&gt; は管理サイトにログインする際に必要になる。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;Initializing&lt;/span&gt; configuration.........&lt;span class=&quot;co&quot;&gt;OK&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Select&lt;/span&gt; a database template:&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;. &lt;span class=&quot;co&quot;&gt;Empty&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;. &lt;span class=&quot;co&quot;&gt;Roasters&lt;/span&gt; (a coffee-themed blog / brochure)&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;. &lt;span class=&quot;co&quot;&gt;Simple&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Blog&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;4&lt;/span&gt;. &lt;span class=&quot;co&quot;&gt;Styled&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Blog&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;[&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;-&lt;span class=&quot;i&quot;&gt;4&lt;/span&gt;]: &lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;テンプレート(サンプル)となるページを選択する。&lt;/p&gt;

&lt;p&gt;1 はその名の通りテンプレートは何もなく全くの白紙からページを作っていくことになる。
これを選択した場合、おそらく管理サイトを見た瞬間、手が止まるだろう。。&lt;br /&gt;
初めて Radiant プロジェクトを作成する際には、2 〜 4 のテンプレートを選択し、実際にどのようにコンテンツ管理を行っているのか、参考にするのがよいと思う。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;Creating&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Snippets&lt;/span&gt;....&lt;span class=&quot;co&quot;&gt;OK&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Creating&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Pages&lt;/span&gt;....&lt;span class=&quot;co&quot;&gt;OK&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Creating&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Layouts&lt;/span&gt;....&lt;span class=&quot;co&quot;&gt;OK&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Creating&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Page&lt;/span&gt; parts....&lt;span class=&quot;co&quot;&gt;OK&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Finished&lt;/span&gt;.&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;以上で Radiant プロジェクトが作成されている。&lt;/p&gt;

&lt;p&gt;起動する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; script/server -e production&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;co&quot;&gt;Booting&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Mongrel&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;co&quot;&gt;Rails&lt;/span&gt; &lt;span class=&quot;fl&quot;&gt;2.3&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;2&lt;/span&gt; application starting on http&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/&lt;span class=&quot;fl&quot;&gt;0.0&lt;/span&gt;.&lt;span class=&quot;fl&quot;&gt;0.0&lt;/span&gt;:&lt;span class=&quot;i&quot;&gt;3000&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;co&quot;&gt;Call&lt;/span&gt; with -d to detach&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;co&quot;&gt;Ctrl&lt;/span&gt;-&lt;span class=&quot;co&quot;&gt;C&lt;/span&gt; to shutdown server&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;http://localhost:3000/ にアクセスしてみる。&lt;br /&gt;
以下は、&lt;strong&gt;&quot;Select a database template&quot;&lt;/strong&gt; の選択の際に、&lt;strong&gt;&quot; 2. Roasters (a coffee-themed blog / brochure)&quot;&lt;/strong&gt; を選択した場合のテンプレートになる。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;管理サイトには、http://localhost:3000/admin でアクセスする。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;ログイン後の管理サイトのトップページ。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;上記は、Mongrel サーバを使って簡易的に動作させている。&lt;/p&gt;

&lt;p&gt;本格的に運用する場合には、Ruby On Rails を稼動させる環境の選択肢は幾つかあるが、Apache のモジュールとして連動させることができる Passenger が設定も比較的容易でお勧めだ。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.modrails.com/&quot; title=&quot;Overview — Phusion Passenger™ (a.k.a. mod_rails / mod_rack)&quot;&gt;Overview — Phusion Passenger™ (a.k.a. mod_rails / mod_rack)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;(蛇足) CMS として、Radiant が日本でなぜブレイクしないのか&lt;/h2&gt;

&lt;p&gt;個人的には非常によいアプリケーションだと思っているのだが、しつこいが、日本では流行っていないように感じる。。&lt;br /&gt;
理由はいろいろあると思うのだが、以下思い付く範囲で。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ruby On Rails がベースになっている (日本に限った話ではない。。)&lt;/li&gt;
&lt;li&gt;日本語による情報の不足 + 国際化対応の遅れ&lt;/li&gt;
&lt;li&gt;Ruby On Rails を十分なパフォーマンスで稼動させる手軽な環境(サービス)の不足&lt;/li&gt;
&lt;li&gt;Radiant コアがシンプルすぎる？ (日本に限った話ではない。。)&lt;/li&gt;
&lt;li&gt;開発者でない方には少々扱いが難しい？ (日本に限った話ではない。。)&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;「日本」に限った話ではなくなっている。。&lt;/p&gt;

&lt;h3&gt;Ruby On Rails がベースになっている&lt;/h3&gt;

&lt;p&gt;「日本」に限った話ではない。&lt;/p&gt;

&lt;p&gt;Ruby On Rails は非常によく考えられたフレームワークで、Ruby の世界だけでなく、他言語の世界にもインパクトを与えた。
Ruby On Rails をベースとしていることはメリットではあるのだが、Ruby On Rails を触ったことのない方には敷居になる。&lt;/p&gt;

&lt;p&gt;Radiant はある程度の環境を作りあげてしまえば言語の知識など必要なくなるのだが、そのある程度の環境にもっていくまでに多少の Ruby On Rails の知識を要する。&lt;br /&gt;
と言っても、それ程専門的な知識ではないのだが、Ruby On Rails を触ったことのない方にとってはちょっとだけ学習コストがかかる。&lt;/p&gt;

&lt;p&gt;ちなみに、Radiant にインスパイアされた PHP 版 Radiant である Frog CMS というものもある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.madebyfrog.com/&quot;&gt;Frog CMS - Content Management Simplified | Frog CMS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;日本語による情報の不足 + 国際化対応の遅れ&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.radiantcms.jp/&quot; title=&quot;Radiant CMS Japan - Ruby on Rails製オープンソースCMSの日本語サポートサイト&quot;&gt;Radiant CMS Japan - Ruby on Rails製オープンソースCMSの日本語サポートサイト&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;のような精力的な活動もあり、最近 Radiant に関する書籍も出版されたようなので、徐々に解消されていくのではないかと思っている。&lt;br /&gt;
だが、5つ目の理由を含めて日本語の情報の充実だけでは難しい面もあるように感じている。&lt;/p&gt;

&lt;p&gt;国際化対応については、コンテンツの作成に関しては、日本語を使用しても問題ないのだが、管理画面は手を入れないと表示が英語のままとなる。&lt;br /&gt;
GitHub のブランチで i18n 対応は進められているが、v0.8.0 のリリースには、残念ながら含まれなかった。&lt;/p&gt;

&lt;h3&gt;Ruby On Rails を十分なパフォーマンスで稼動させる手軽な環境(サービス)の不足&lt;/h3&gt;

&lt;p&gt;専用サーバ、VPS 以外で手軽にレンタルサーバを借りて稼動することは難しい。海外だと、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://heroku.com/&quot; title=&quot;Heroku&quot;&gt;Heroku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.joyent.com/&quot; title=&quot;Joyent&quot;&gt;Joyent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://railsplayground.com/&quot; title=&quot;RailsPlayground.com Ruby On Rails Hosting&quot;&gt;RailsPlayground.com Ruby On Rails Hosting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://avlux.net/&quot; title=&quot;AVLUX Hosting :: Ruby Rails Radiant :: Subversion Trac Redmine :: Dedicated Servers :: Domain Names - Home&quot;&gt;AVLUX Hosting :: Ruby Rails Radiant :: Subversion Trac Redmine :: Dedicated Servers :: Domain Names - Home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://radiant-machine.com/&quot; title=&quot;Radiant Machine&quot;&gt;Radiant Machine&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://radiant-machine.com/blog/2008/07/10/hello-world/&quot; title=&quot;Hello, World - The Radiant Machine Blog&quot;&gt;Hello, World - The Radiant Machine Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;など Ruby On Rails のアプリケーションを十分なパフォーマンスで稼動させることができるサービスがあるのだが、国内では敷居が高い状況が続いている。&lt;/p&gt;

&lt;h3&gt;Radiant コアがシンプルすぎる？&lt;/h3&gt;

&lt;p&gt;「日本」に限った話ではない。&lt;/p&gt;

&lt;p&gt;それがよい面でもあり、ポリシー的には個人的にはよいと思っているのだが、例えば画像をアップロードしたいと思っても、Radiant コアにはその機能は無い。。&lt;br /&gt;
メジャーな CMS では最初から使えるような機能が、エクステンション形式での提供になっている。メジャーな CMS に備わっている機能を全て扱えるようにしようと思った場合に、幾つかのエクステンションを導入するという一手間がかかる。&lt;/p&gt;

&lt;p&gt;これは、要件にマッチする、または、良質なエクステンションを自由に選択できるという利点でもあるが、エクステンションの数も半端ではないため、その選択に迷うことになるかもしれない。&lt;br /&gt;
自分自身そうだったため、今後エクステンションに関するメモを残しておこうと思っている。&lt;/p&gt;

&lt;p&gt;また、この件については、Radiant のメーリングリストにおいても最近また議論がされており、&lt;strong&gt;Radiant More&lt;/strong&gt; という感じで、よく使用されるエクステンションはそれを含めた状態での配布、もしくは、ほとんど手間なく導入できる仕組みが考えられている。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/radiantcms-dev/browse_thread/thread/860c27c41a8c0110/95ef7437481786e5#95ef7437481786e5&quot; title=&quot;Radiant More - Radiant CMS: Dev | Google グループ&quot;&gt;Radiant More - Radiant CMS: Dev | Google グループ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;開発者でない方には少々扱いが難しい？&lt;/h3&gt;

&lt;p&gt;「日本」に限った話ではない。&lt;/p&gt;

&lt;p&gt;先にも書いたが、ある程度の環境を整えるまでにエンジニア的な知識が必要となる。&lt;br /&gt;
ある程度の環境ができあがっていたとしても、WordPress や MovableType などのようなツールとは若干赴きを異にしていることもあり、「ちょっと更新お願い!」という感じであまり IT 系に詳しくない方に頼むのは難しいかもしれない。&lt;/p&gt;

&lt;p&gt;開発者、特に Ruby、Ruby On Rails に触れあっている方にとっては非常に扱い易いものだと思うのだが、運用には一工夫必要かなと思う。&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-07-25:52</id>
    <published>2009-07-25T17:16:00Z</published>
    <updated>2009-07-25T17:36:32Z</updated>
    <category term="heroku"/>
    <category term="ruby"/>
    <category term="sinatra"/>
    <link href="http://blog.designrecipe.jp/2009/7/25/heroku-memo" rel="alternate" type="text/html"/>
    <title>Heroku &#12434;&#21033;&#29992;&#12375;&#12390;&#26032;&#35215; Sinatra &#12450;&#12503;&#12522;&#12434;5&#20998;&#12367;&#12425;&#12356;&#12391;&#20844;&#38283;&#12377;&#12427;</title>
<content type="html">
            &lt;p&gt;誇張表現でもなく、サービスの利用開始の手続から公開まで、本当に5分以内でできてしまう。。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://heroku.com/&quot;&gt;Heroku&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Heroku は、&lt;strong&gt;&quot;instant ruby platform&quot;&lt;/strong&gt; と言われるもので、ホスティングサービスではあるが、&lt;strong&gt;&quot;準備不要なデプロイ環境&quot;&lt;/strong&gt; である。
ローカルで作成した Ruby アプリケーション(Rails、Sinatra、Merb etc)をコマンド一発で公開できるプラットフォームを提供する。&lt;/p&gt;

&lt;p&gt;そのインターフェイスも素晴らしいが、サービスの公開にあたり、サーバ側のシステム管理作業を行う必要はなく、また、自動的にスケールしてくれる仕組みも提供している点が素晴らしい。&lt;/p&gt;

&lt;p&gt;存在自体は以前小耳に挟んでいたのだが、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/radiantcms-dev/browse_thread/thread/9d4eb4761608e99a/ea919a69a4ec16b4?show_docid=ea919a69a4ec16b4&amp;amp;pli=1&quot;&gt;Hosting Radiant and Spree - Radiant CMS: Dev | Google グループ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;で触れられていたの読み、試してみることにした。&lt;/p&gt;

&lt;p&gt;Heroku は長くベータ版として運用されていたが、2009/04/24 に商用サービスのスタートがアナウンスされた。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.heroku.com/archives/2009/4/24/commercial_launch/&quot;&gt;Heroku | Commercial Launch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;商用サービスがスタートした後も、無料で利用可能なサービスを残している。ちょっとしたアプリの公開、ステージング環境、テスト環境などとして利用できる。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://heroku.com/pricing#blossom-1&quot;&gt;Heroku | Pricing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;ここでは、その公開手順のメモを残す。&lt;/p&gt;

&lt;h2&gt;Heroku サービスのサインナップ&lt;/h2&gt;

&lt;p&gt;サインナップを行う。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://heroku.com/signup&quot;&gt;Heroku | Sign up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;メールアカウントの入力を行うと、入力したアカウントにメールが送られてくる。&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Heroku is a platform for instant deployment of Ruby apps. Develop your app using your local tools, then deploy via Git and the Heroku gem.  Follow the link to activate your account:&lt;/p&gt;

&lt;p&gt;http://heroku.com/signup/accept/oio2oo2o2o2&lt;/p&gt;

&lt;p&gt;To learn more about deploying apps on Heroku, check out the docs:&lt;/p&gt;

&lt;p&gt;http://docs.heroku.com&lt;/p&gt;

&lt;p&gt;Have fun, and don't hesitate to contact us with your feedback.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Heroku Team
http://heroku.com/&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;指示に従い、&lt;code&gt;http://heroku.com/signup/accept/oio2oo2o2o2&lt;/code&gt; (最後の数値は左記の通りではない) にアクセスする。&lt;/p&gt;

&lt;p&gt;開いた画面にて、パスワードの登録を行い、アクティベートする。&lt;/p&gt;

&lt;p&gt;Welcome 画面が開き、この後の作業ステップが書かれている。&lt;/p&gt;

&lt;p&gt;
&lt;/p&gt;

&lt;p&gt;これで Heroku サービスの利用が可能となる。&lt;/p&gt;

&lt;h2&gt;ローカル(開発環境)側の環境準備&lt;/h2&gt;

&lt;p&gt;gem で heroku コマンドをインストールする。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; sudo gem install heroku&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Password&lt;/span&gt;:&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Building&lt;/span&gt; native extensions.  &lt;span class=&quot;co&quot;&gt;This&lt;/span&gt; could take a &lt;span class=&quot;r&quot;&gt;while&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Successfully&lt;/span&gt; installed rest-client-&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Successfully&lt;/span&gt; installed configuration-&lt;span class=&quot;fl&quot;&gt;0.0&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;5&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Successfully&lt;/span&gt; installed launchy-&lt;span class=&quot;fl&quot;&gt;0.3&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Successfully&lt;/span&gt; installed json-&lt;span class=&quot;fl&quot;&gt;1.1&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;7&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Successfully&lt;/span&gt; installed heroku-&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;i&quot;&gt;5&lt;/span&gt; gems installed&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; ri documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; rest-client-&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; ri documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; configuration-&lt;span class=&quot;fl&quot;&gt;0.0&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;5&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; ri documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; launchy-&lt;span class=&quot;fl&quot;&gt;0.3&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; ri documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; json-&lt;span class=&quot;fl&quot;&gt;1.1&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;7&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; ri documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; heroku-&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;RDoc&lt;/span&gt; documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; rest-client-&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;RDoc&lt;/span&gt; documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; configuration-&lt;span class=&quot;fl&quot;&gt;0.0&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;5&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;RDoc&lt;/span&gt; documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; launchy-&lt;span class=&quot;fl&quot;&gt;0.3&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;RDoc&lt;/span&gt; documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; json-&lt;span class=&quot;fl&quot;&gt;1.1&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;7&lt;/span&gt;...&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Installing&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;RDoc&lt;/span&gt; documentation &lt;span class=&quot;r&quot;&gt;for&lt;/span&gt; heroku-&lt;span class=&quot;fl&quot;&gt;1.0&lt;/span&gt;...&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;お試しなので、デプロイするアプリは何でもよいのだが、ここでは、GitHub にある Sinatra アプリの Heroku へのデプロイサンプルを使ってみる。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/sinatra/heroku-sinatra-app/tree/master&quot;&gt;sinatra's heroku-sinatra-app at master - GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&quot;Congradulations! You're running a Sinatra application on Heroku!&quot; とだけ表示する非常にシンプルなアプリケーションだ。。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;work&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; git clone git&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/github.com/sinatra/heroku-sinatra-app dr-heroku-sinatra-test&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Initialized&lt;/span&gt; empty &lt;span class=&quot;co&quot;&gt;Git&lt;/span&gt; repository &lt;span class=&quot;r&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;hoge/work/dr-heroku-sinatra-test/.git/&lt;tt&gt;
&lt;/tt&gt;remote: &lt;span class=&quot;co&quot;&gt;Counting&lt;/span&gt; objects: &lt;span class=&quot;i&quot;&gt;38&lt;/span&gt;, done.&lt;tt&gt;
&lt;/tt&gt;remote: &lt;span class=&quot;co&quot;&gt;Compressing&lt;/span&gt; objects: &lt;span class=&quot;i&quot;&gt;100&lt;/span&gt;% (&lt;span class=&quot;i&quot;&gt;32&lt;/span&gt;/&lt;span class=&quot;i&quot;&gt;32&lt;/span&gt;), done.&lt;tt&gt;
&lt;/tt&gt;remote: &lt;span class=&quot;co&quot;&gt;Total&lt;/span&gt; &lt;span class=&quot;i&quot;&gt;38&lt;/span&gt; (delta &lt;span class=&quot;i&quot;&gt;8&lt;/span&gt;), reused &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt; (delta &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Receiving&lt;/span&gt; objects: &lt;span class=&quot;i&quot;&gt;100&lt;/span&gt;% (&lt;span class=&quot;i&quot;&gt;38&lt;/span&gt;/&lt;span class=&quot;i&quot;&gt;38&lt;/span&gt;), &lt;span class=&quot;fl&quot;&gt;5.58&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;KiB&lt;/span&gt;, done.&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Resolving&lt;/span&gt; deltas: &lt;span class=&quot;i&quot;&gt;100&lt;/span&gt;% (&lt;span class=&quot;i&quot;&gt;8&lt;/span&gt;/&lt;span class=&quot;i&quot;&gt;8&lt;/span&gt;), done.&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd dr-heroku-sinatra-test/&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;アプリケーションを Heroku に配置する&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;heroku&lt;/code&gt; コマンドを使って、ローカルにあるアプリを Heroku にデプロイできる状態にする。&lt;/p&gt;

&lt;p&gt;この作業を実施するにあたっては、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;アカウント作成時に登録を行ったメールアドレスとパスワードの準備&lt;/li&gt;
&lt;li&gt;SSH で使用する鍵&lt;/li&gt;
&lt;li&gt;Git の利用環境&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;上記3点が用意されている必要がある。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;heroku create&lt;/code&gt; を利用する。引数には、任意のアプリケーション名称を与える。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; heroku create dr-heroku-sinatra-test&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Enter&lt;/span&gt; your &lt;span class=&quot;co&quot;&gt;Heroku&lt;/span&gt; credentials.&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Email&lt;/span&gt;: hoge&lt;span class=&quot;iv&quot;&gt;@designrecipe&lt;/span&gt;.jp&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Password&lt;/span&gt;: &lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Uploading&lt;/span&gt; ssh public key &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;hoge/.ssh/id_rsa.pub&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Created&lt;/span&gt; http&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/dr-heroku-sinatra-test.heroku.com/ | git&lt;span class=&quot;iv&quot;&gt;@heroku&lt;/span&gt;.com&lt;span class=&quot;sy&quot;&gt;:dr&lt;/span&gt;-heroku-sinatra-test.git&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;Git&lt;/span&gt; remote heroku added&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;上記コマンドの中で、SSH で利用する公開鍵の登録も行っている。&lt;/p&gt;

&lt;p&gt;また、git の設定情報が変更されている。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; git config --list&lt;tt&gt;
&lt;/tt&gt;user.name=&lt;span class=&quot;co&quot;&gt;Hoge&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Fuga&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;user.email=hoge&lt;span class=&quot;iv&quot;&gt;@designrecipe&lt;/span&gt;.jp&lt;tt&gt;
&lt;/tt&gt;color.ui=auto&lt;tt&gt;
&lt;/tt&gt;core.repositoryformatversion=&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;core.filemode=&lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;core.bare=&lt;span class=&quot;pc&quot;&gt;false&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;core.logallrefupdates=&lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;core.ignorecase=&lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;remote.origin.url=git&lt;span class=&quot;sy&quot;&gt;:/&lt;/span&gt;/github.com/sinatra/heroku-sinatra-app&lt;tt&gt;
&lt;/tt&gt;remote.origin.fetch=+refs/heads/*&lt;span class=&quot;sy&quot;&gt;:refs&lt;/span&gt;/remotes/origin/*&lt;tt&gt;
&lt;/tt&gt;branch.master.remote=origin&lt;tt&gt;
&lt;/tt&gt;branch.master.merge=refs/heads/master&lt;tt&gt;
&lt;/tt&gt;remote.heroku.url=git&lt;span class=&quot;iv&quot;&gt;@heroku&lt;/span&gt;.com&lt;span class=&quot;sy&quot;&gt;:dr&lt;/span&gt;-heroku-sinatra-test.git&lt;tt&gt;
&lt;/tt&gt;remote.heroku.fetch=+refs/heads/*&lt;span class=&quot;sy&quot;&gt;:refs&lt;/span&gt;/remotes/heroku/*&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;remote&lt;/code&gt; の情報が追加されているようだ。&lt;/p&gt;

&lt;p&gt;Heroku の環境に配置する。と言っても、通常の Git コマンドを利用して push しているだけだ。。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; git push heroku master&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;co&quot;&gt;The&lt;/span&gt; authenticity of host &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;heroku.com (75.101.145.87)&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; can&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;t be established.&lt;tt&gt;
&lt;/tt&gt;RSA key fingerprint is 8b:48:5e:67:0e:c9:16:47:32:f2:87:0c:1f:c8:60:ad.&lt;tt&gt;
&lt;/tt&gt;Are you sure you want to continue connecting (yes/no)? yes&lt;tt&gt;
&lt;/tt&gt;Warning: Permanently added &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;heroku.com,&lt;span class=&quot;fl&quot;&gt;75.101&lt;/span&gt;.&lt;span class=&quot;fl&quot;&gt;145.87&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; (RSA) to the list of known hosts.&lt;tt&gt;
&lt;/tt&gt;Counting objects: 38, done.&lt;tt&gt;
&lt;/tt&gt;Compressing objects: 100% (24/24), done.&lt;tt&gt;
&lt;/tt&gt;Writing objects: 100% (38/38), 5.72 KiB, done.&lt;tt&gt;
&lt;/tt&gt;Total 38 (delta 8), reused 38 (delta 8)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;-----&amp;gt; Heroku receiving push&lt;tt&gt;
&lt;/tt&gt;-----&amp;gt; Sinatra app detected&lt;tt&gt;
&lt;/tt&gt;   Compiled slug size is 4K&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;-----&amp;gt; Launching...... done&lt;tt&gt;
&lt;/tt&gt;   http://dr-heroku-sinatra-test.heroku.com deployed to Heroku&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;To git@heroku.com:dr-heroku-sinatra-test.git&lt;tt&gt;
&lt;/tt&gt; * [new branch]  master -&amp;gt; master&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;以上で完了となる。&lt;/p&gt;

&lt;p&gt;デフォルトでは、heroku.com のサブドメインとして、&lt;strong&gt;&lt;code&gt;&amp;lt;app_name&amp;gt;.heroku.com&lt;/code&gt;&lt;/strong&gt;で公開される。
&lt;code&gt;&amp;lt;app_name&amp;gt;&lt;/code&gt; は、&lt;code&gt;heroku create&lt;/code&gt; を使用した際に命名したアプリケーション名になる。&lt;br /&gt;
上記手順の場合、http://dr-heroku-sinatra-test.heroku.com/ になる。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;当然ながら、自ドメインも利用することは可能。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.heroku.com/custom-domains&quot;&gt;Heroku | Custom domain names&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;参考サイト&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.heroku.com/quickstart&quot;&gt;Heroku | Heroku Quickstart Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.heroku.com/rack&quot;&gt;Heroku | Deploying Rack-based apps&lt;/a&gt;&lt;br /&gt;
Rack ベースのアプリ(Sinatra、Merb、Ramaze など)のデプロイ方法。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/jp/news/2009/05/heroku-provisionless-revolution&quot;&gt;InfoQ: Herokuの準備不要なRailsアプリケーションホスティングは革新的&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://blog.designrecipe.jp/">
    <author>
      <name>taka</name>
    </author>
    <id>tag:blog.designrecipe.jp,2009-07-24:51</id>
    <published>2009-07-24T17:04:00Z</published>
    <updated>2009-07-24T17:12:21Z</updated>
    <category term="ruby"/>
    <category term="sinatra"/>
    <link href="http://blog.designrecipe.jp/2009/7/24/sinatra-scanty" rel="alternate" type="text/html"/>
    <title>Sinatra &#12505;&#12540;&#12473;&#12398;&#36605;&#37327;&#12450;&#12503;&#12522;&#12356;&#12429;&#12356;&#12429; Scanty &#32232;</title>
<content type="html">
            &lt;p&gt;Sinatra ベースのアプリを調べており、その一環として、あちこちで名前を聞く手頃なアプリを見てみることにする。&lt;/p&gt;

&lt;h2&gt;とってもシンプルなブログツール Scanty&lt;/h2&gt;

&lt;p&gt;「スキャンティ」と片仮名で書いてしまうと、若干いやらしくも響くが、とてもシンプルな Sinatra ベースのブログエンジンだ。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/adamwiggins/scanty/tree/master&quot;&gt;adamwiggins's scanty at master - GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;作者本人もこのツールを利用してブログを書いているようだ。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://adam.blog.heroku.com/&quot;&gt;a tornado of razorblades&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;と・・・この作者の方って、&lt;a href=&quot;http://heroku.com/&quot;&gt;Heroku&lt;/a&gt; の人なんだ。。&lt;/p&gt;

&lt;p&gt;Scanty の特徴としてはサイトの記載から拾ってみると、以下のような内容になっている。&lt;/p&gt;

&lt;h3&gt;特徴&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ブログ&quot;エンジン&quot;とまでは言えないけれど、コンパクトでカスタマイズを入れるのは容易。&lt;br /&gt;
ブログツールの基礎として使える。&lt;/li&gt;
&lt;li&gt;ポストできる!(特徴かな。。)&lt;/li&gt;
&lt;li&gt;タグ付け&lt;/li&gt;
&lt;li&gt;入力に使用できる記法: Markdown&lt;/li&gt;
&lt;li&gt;コメント機能: Disqus&lt;/li&gt;
&lt;li&gt;Atom feed&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;作者も書いているように、これを土台に自分色に染めてね(この通りには作者は言っていない)、というものである。&lt;/p&gt;

&lt;p&gt;コメント機能に関しは、ツールの中に抱えないで、&lt;a href=&quot;http://disqus.com/&quot;&gt;DISQUS&lt;/a&gt; を使用するようにしている。&lt;/p&gt;

&lt;h3&gt;原材料&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Web フレームワーク: Sinatra&lt;/li&gt;
&lt;li&gt;Markdown -&gt; HTML への変換: Maruku&lt;/li&gt;
&lt;li&gt;コードシンタックスハイライト(Only Ruby): Syntax&lt;/li&gt;
&lt;li&gt;ORM: Sequel&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;ライセンスは、&lt;a href=&quot;http://www.opensource.org/licenses/mit-license.php&quot;&gt;MIT License&lt;/a&gt; だ。&lt;/p&gt;

&lt;p&gt;軽く動作を見てみて、ちょっと気になるところには手を入れてみることにする。&lt;/p&gt;

&lt;h2&gt;インストールと設定、そして起動&lt;/h2&gt;

&lt;p&gt;Sinatra がもしインストールされていないのであれば先に Sinatra を入れておく。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; gem sudo install sinatra&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;Scanty を GitHub から clone し、自分用のブランチを用意しておく。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd ~&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;work&lt;tt&gt;
&lt;/tt&gt;$ git clone git:&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;/github.com/adamwiggins/scanty.git&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; cd scanty&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; git checkout -b taka-blog&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; git branch&lt;tt&gt;
&lt;/tt&gt;  master&lt;tt&gt;
&lt;/tt&gt;* taka-blog&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;main.rb&lt;/code&gt; に書いてあるデフォルトの設定を変更しておく。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;Blog&lt;/span&gt; = &lt;span class=&quot;co&quot;&gt;OpenStruct&lt;/span&gt;.new(&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;sy&quot;&gt;:title&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;a scanty blog&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;sy&quot;&gt;:author&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;John Doe&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;sy&quot;&gt;:url_base&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://localhost:4567/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;sy&quot;&gt;:admin_password&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;changeme&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;sy&quot;&gt;:admin_cookie_key&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;scanty_admin&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;sy&quot;&gt;:admin_cookie_value&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;51d6d976913ace58&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;tt&gt;
&lt;/tt&gt;       &lt;span class=&quot;sy&quot;&gt;:disqus_shortname&lt;/span&gt; =&amp;gt; &lt;span class=&quot;pc&quot;&gt;nil&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;)&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;とりあえずローカルでの動作確認レベルであればこのままでもよいが、外部公開するのであれば、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:admin_password&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:admin_cookie_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:admin_cookie_value&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;の変更が必須だろう。cookie value はランダムな値で。&lt;/p&gt;

&lt;p&gt;起動する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; ruby main.rb&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;先に設定した &lt;code&gt;main.rb&lt;/code&gt; の &lt;code&gt;:usr_base&lt;/code&gt; のアドレスにアクセスする。&lt;/p&gt;

&lt;p&gt;また、rake による起動も可能。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; rake -&lt;span class=&quot;co&quot;&gt;T&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;(&lt;span class=&quot;r&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Users&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;taka/work/sinatra/scanty)&lt;tt&gt;
&lt;/tt&gt;rake start  &lt;span class=&quot;c&quot;&gt;# Start the app server&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;rake stop   &lt;span class=&quot;c&quot;&gt;# Stop the app server&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;code&gt;Rakefile&lt;/code&gt; に &lt;code&gt;start&lt;/code&gt;、&lt;code&gt;stop&lt;/code&gt; タスクが定義してある。&lt;code&gt;port&lt;/code&gt; 番号の定義がデフォルトで 3030 になっているので、適切なポート番号に変更。&lt;/p&gt;

&lt;h2&gt;投稿してみる&lt;/h2&gt;

&lt;p&gt;サーバを起動し、初めてアクセスを行うと以下の画面が表示される。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;まずは、&lt;strong&gt;&quot;Log in&quot;&lt;/strong&gt; をクリックしログインする。&lt;/p&gt;

&lt;p&gt;(次回以降のログインの際には、/auth のパスを直打ちする)&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;パスワードが合っていれば、最初に開いた画面に戻るので、今度は、&lt;strong&gt;&quot;create a post&quot;&lt;/strong&gt; をクリックする。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;投稿画面は非常にシンプル。項目のラベルが何もないが、上から、タイトル、タグ、本文の入力項目となっている。&lt;br /&gt;
タグはスペース区切りで複数指定できるようになっている。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&quot;save&quot;&lt;/strong&gt; ボタンで投稿する。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;続けて投稿してみて、トップページを見てみる。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;2回目の投稿に、Ruby のソースを含めてみたのだが、少々表示がおかしいようだ。
また、入力の必須チェックなどが全く入っていない、日本語を含んだタイトルはまともに扱えない、というところがあるので、手を入れてみる。&lt;/p&gt;

&lt;h2&gt;オリジナルに変更を入れておく&lt;/h2&gt;

&lt;p&gt;起動してちょっと見ていただけで、とりあえず手を入れておきたいところが数点あった。手始めに以下の3点の変更を入れておくことにする。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;入力項目の必須チェック&lt;/li&gt;
&lt;li&gt;タイトルで日本語の利用を可能に&lt;/li&gt;
&lt;li&gt;ソースコードの表示部分の変更&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;入力項目の必須チェックぐらいは入れておく&lt;/h3&gt;

&lt;p&gt;全く入っていないので入れておく。&lt;/p&gt;

&lt;p&gt;この Scanty は、ORM に &lt;a href=&quot;http://sequel.rubyforge.org/&quot;&gt;Sequel&lt;/a&gt; を使用している。Sequel は初体験で全く知識がない。ActiveRecord に似てるところもあるので、今回は深く調査せず、勘だけで書いてみる。。&lt;/p&gt;

&lt;p&gt;検証ロジックは、ActiveRecord 同様、Model の validate メソッドに入れておいて、エラーのコレクションを追加してやればよさそうだ。
検証失敗時のハンドルは、&lt;code&gt;Sequel::Model#save&lt;/code&gt; 時の validation チェックにが raise する &lt;code&gt;Sequel::ValidationFailed&lt;/code&gt; の例外でハンドルしようと思ったのだが、&lt;code&gt;Sequel::ValidationFailed&lt;/code&gt; がないと言われる。。&lt;/p&gt;

&lt;p&gt;Scanty は、Sequel を vendor ディレクトリ配下に持っているのだが、取得したリポジトリに含まれているものはバージョン的に古そうだ。gem で最新のものをインストールし、そちらを使うようにする。自前で持っている vendor 配下への load path の追加は消しておく。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; gem list sequel&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;*** &lt;span class=&quot;co&quot;&gt;LOCAL&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;GEMS&lt;/span&gt; ***&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;sequel (&lt;span class=&quot;fl&quot;&gt;3.2&lt;/span&gt;.&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;)&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;サーバの再起動をかけると、&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; ruby main.rb &lt;tt&gt;
&lt;/tt&gt;./lib/post.rb:&lt;span class=&quot;i&quot;&gt;7&lt;/span&gt;: undefined method &lt;span class=&quot;sh&quot;&gt;&lt;span class=&quot;dl&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;table_exists?' for Post:Class (NoMethodError)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;と怒られる。
新しいバージョンではお作法が変わったようだ。&lt;code&gt;Sequel::Model.plugin(:schema)&lt;/code&gt; を &lt;code&gt;main.rb&lt;/code&gt; の &lt;code&gt;configure&lt;/code&gt; メソッドのコードブロックに追加しておく。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;main.rb&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;configure &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Sequel&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Model&lt;/span&gt;.plugin(&lt;span class=&quot;sy&quot;&gt;:schema&lt;/span&gt;)  &lt;span class=&quot;c&quot;&gt;# 追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;co&quot;&gt;Sequel&lt;/span&gt;.connect(&lt;span class=&quot;co&quot;&gt;ENV&lt;/span&gt;[&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;DATABASE_URL&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;] || &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;sqlite://blog.db&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;(なんとも手探りな状態だ。。)&lt;/p&gt;

&lt;p&gt;気を取り直して Model にバリデーションを入れておく。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;lib/post.rb&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Post&lt;/span&gt; &amp;lt; &lt;span class=&quot;co&quot;&gt;Sequel&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Model&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;...&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;c&quot;&gt;# validate メソッドの追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;validate&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    errors[&lt;span class=&quot;sy&quot;&gt;:title&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;can't be empty&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; title.empty?&lt;tt&gt;
&lt;/tt&gt;    errors[&lt;span class=&quot;sy&quot;&gt;:body&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;can't be empty&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; body.empty?&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;そのハンドリングは、&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;main.rb&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;post &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/posts&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  auth&lt;tt&gt;
&lt;/tt&gt;  post = &lt;span class=&quot;co&quot;&gt;Post&lt;/span&gt;.new(&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:title&lt;/span&gt; =&amp;gt; params[&lt;span class=&quot;sy&quot;&gt;:title&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:tags&lt;/span&gt; =&amp;gt; params[&lt;span class=&quot;sy&quot;&gt;:tags&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:body&lt;/span&gt; =&amp;gt; params[&lt;span class=&quot;sy&quot;&gt;:body&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:created_at&lt;/span&gt; =&amp;gt; &lt;span class=&quot;co&quot;&gt;Time&lt;/span&gt;.now,&lt;tt&gt;
&lt;/tt&gt;    )&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;c&quot;&gt;# begin - resucue - end を追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;begin&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    post.save&lt;tt&gt;
&lt;/tt&gt;    redirect post.url&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;Sequel&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;ValidationFailed&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    erb &lt;span class=&quot;sy&quot;&gt;:edit&lt;/span&gt;, &lt;span class=&quot;sy&quot;&gt;:locals&lt;/span&gt; =&amp;gt; { &lt;span class=&quot;sy&quot;&gt;:post&lt;/span&gt; =&amp;gt; post, &lt;span class=&quot;sy&quot;&gt;:url&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/posts&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; }&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;としておく。&lt;/p&gt;

&lt;p&gt;エラーがあった時の表示だが、さすがに、&lt;code&gt;ActionView::Helpers::ActiveRecordHelper#error_messages_for&lt;/code&gt; のようなものは無い。。&lt;/p&gt;

&lt;p&gt;適当に作っておく。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;main.rb&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;helpers &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ...&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;c&quot;&gt;# なんちゃって error_message_for を追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;error_message_for&lt;/span&gt;(model)&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;unless&lt;/span&gt; model.errors.size == &lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      html = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      html &amp;lt;&amp;lt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      model.errors.each &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |k, v|&lt;tt&gt;
&lt;/tt&gt;        html &amp;lt;&amp;lt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;k.to_s.capitalize&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;v.first&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;.&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      html &amp;lt;&amp;lt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;else&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;view に追加しておく。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;lib/edit.erb&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;&amp;lt;%&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# error_message_for の呼び出しを追加 &lt;/span&gt;&lt;span class=&quot;idl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;&amp;lt;%=&lt;/span&gt; error_message_for(post) &lt;span class=&quot;idl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;一応、これで必須チェックは入るようになる。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;タイトルで日本語の表示を可能に&lt;/h3&gt;

&lt;p&gt;最近の舶来物の場合、permalink の生成に以下のようなロジックを入れてくる。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;lib/post.rb&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.make_slug(title)&lt;tt&gt;
&lt;/tt&gt;    title.downcase.gsub(&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;).gsub(&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;[^a-z0-9_]&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;).squeeze(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;これだと、マルチバイト文字は空文字になってしまう。。それがタイトルに日本語を使えない理由。&lt;/p&gt;

&lt;p&gt;URL エンコードするのは嫌なので、対応としては、タイトルはタイトルとして入力値をそのまま残し、permalink を構成する slug 部分は、投稿者に自分で入れてもらうことにする。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;view に入力用の slug フィールドの追加&lt;/li&gt;
&lt;li&gt;Post インスタンス生成時のパラメータに直接 slug フィールドの入力項目を設定&lt;/li&gt;
&lt;li&gt;slug フィールドも必須チェック対象に&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;とすることにする。&lt;/p&gt;

&lt;p&gt;1つ目の対応。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;lib/edit.erb&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;postzoom&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;h2&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;&amp;lt;%=&lt;/span&gt; post.title &lt;span class=&quot;idl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;p&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;slug&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;&amp;lt;%=&lt;/span&gt; post.slug &lt;span class=&quot;idl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- 追加 --&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;ta&quot;&gt;&amp;lt;p&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;class&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;&amp;lt;%=&lt;/span&gt; post.tags &lt;span class=&quot;idl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;2つ目の対応。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;main.rb&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;post &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/posts&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  auth&lt;tt&gt;
&lt;/tt&gt;  post = &lt;span class=&quot;co&quot;&gt;Post&lt;/span&gt;.new(&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:title&lt;/span&gt; =&amp;gt; params[&lt;span class=&quot;sy&quot;&gt;:title&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:tags&lt;/span&gt; =&amp;gt; params[&lt;span class=&quot;sy&quot;&gt;:tags&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:body&lt;/span&gt; =&amp;gt; params[&lt;span class=&quot;sy&quot;&gt;:body&lt;/span&gt;],&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:created_at&lt;/span&gt; =&amp;gt; &lt;span class=&quot;co&quot;&gt;Time&lt;/span&gt;.now,&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;sy&quot;&gt;:slug&lt;/span&gt; =&amp;gt; params[&lt;span class=&quot;sy&quot;&gt;:slug&lt;/span&gt;] &lt;span class=&quot;c&quot;&gt;# 追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    )&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;3つ目の対応。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;lib/post.rb&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Post&lt;/span&gt; &amp;lt; &lt;span class=&quot;co&quot;&gt;Sequel&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Model&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  ...&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;validate&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    errors[&lt;span class=&quot;sy&quot;&gt;:title&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;can't be empty&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; title.empty?&lt;tt&gt;
&lt;/tt&gt;    errors[&lt;span class=&quot;sy&quot;&gt;:slug&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;can't be empty&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; slug.empty? &lt;span class=&quot;c&quot;&gt;# 追加&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    errors[&lt;span class=&quot;sy&quot;&gt;:body&lt;/span&gt;] &amp;lt;&amp;lt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;can't be empty&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; body.empty?&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;以上で OK。&lt;/p&gt;

&lt;p&gt;投稿画面にラベルが無いと流石にわかり難くなってきたので、ラベルをついでにつけておく。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;ソースコードの表示部分の変更&lt;/h3&gt;

&lt;p&gt;投稿された本文は、Markdown のパーサ(Maruku) を通って HTML 化され、さらに Syntax を通ってコードハイライト用のタグが補足される。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://maruku.rubyforge.org/&quot;&gt;Maruku: a Markdown-superset interpreter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://syntax.rubyforge.org/&quot;&gt;Syntax Manual&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;ソースの該当箇所は、以下のようになっている。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;lib/post.rb:&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Post&lt;/span&gt; &amp;lt; &lt;span class=&quot;co&quot;&gt;Sequel&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Model&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;....&lt;tt&gt;
&lt;/tt&gt;  def to_html(markdown)&lt;tt&gt;
&lt;/tt&gt;    h = &lt;span class=&quot;co&quot;&gt;Maruku&lt;/span&gt;.new(markdown).to_html&lt;tt&gt;
&lt;/tt&gt;    h.gsub(&lt;span class=&quot;rx&quot;&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;code&amp;gt;([^&amp;lt;]+)&amp;lt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;code&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mod&quot;&gt;m&lt;/span&gt;&lt;/span&gt;) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      convertor = &lt;span class=&quot;co&quot;&gt;Syntax&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Convertors&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;HTML&lt;/span&gt;.for_syntax &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;ruby&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      highlighted = convertor.convert(&lt;span class=&quot;gv&quot;&gt;$1&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;      &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;code&amp;gt;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;highlighted&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;....&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;で、表示は以下の通り。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;まず、ソースコードの枠の部分が2重になっているのは、&lt;code&gt;&amp;lt;pre&amp;gt;...&amp;lt;/pre&amp;gt;&lt;/code&gt; の中に、&lt;code&gt;&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;...&amp;lt;/pre&amp;gt;&amp;lt;pre&amp;gt;...&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/code&gt; と &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; タグが入れ子になってしまうからのようだ。作者の&lt;a href=&quot;http://adam.blog.heroku.com/&quot;&gt;ブログのページ&lt;/a&gt; を見てみたが、そうはなっていない。HTML の表記として何が正しいのかをキチンと確認する必要もあるが、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; が入れ子になっている&lt;/li&gt;
&lt;li&gt;ソースコード部分での実体参照への勝手な置き換えが行なわれている&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;という点に修正を入れないと表示がおかしくなってしまう。&lt;/p&gt;

&lt;p&gt;まずは現在のソースでどのように動作するか、状況を把握する。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;er&quot;&gt;$&lt;/span&gt; irb&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;rubygems&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;maruku&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;syntax/convertors/html&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; str = &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.read(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;t.md&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;second!&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;class Hello&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;   def hello&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; puts 'hello!'&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;   end&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; org_reg = &lt;span class=&quot;co&quot;&gt;Regexp&lt;/span&gt;.new(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;code&amp;gt;([^&amp;lt;]+)&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;co&quot;&gt;Regexp&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;MULTILINE&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; code[]codem&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; org_syn_convert_proc = lambda { &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;code&amp;gt;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;co&quot;&gt;Syntax&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Convertors&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;HTML&lt;/span&gt;.for_syntax(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;ruby&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;).convert(&lt;span class=&quot;gv&quot;&gt;$1&lt;/span&gt;)&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; }&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;c&quot;&gt;#&amp;lt;Proc:0x0110169c@(irb):8&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; org_h = &lt;span class=&quot;co&quot;&gt;Maruku&lt;/span&gt;.new(str).to_html&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;p&amp;gt;second!&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;class Hello&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;   def hello&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; puts &amp;amp;#39;hello!&amp;amp;#39;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;   end&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;end&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; org_h.gsub(org_reg, &amp;amp;org_syn_convert_proc)&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;p&amp;gt;second!&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;pre&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;code&amp;gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;pre&amp;gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;keyword&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;class &amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;Hello&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;keyword&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;def &amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;method&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;hello&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;ident&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;puts&amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;punct&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;&amp;amp;amp;&amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;comment&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;#39;hello!&amp;amp;amp;#39;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;keyword&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;end&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;keyword&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;end&amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;/pre&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;/code&amp;gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;確かに問題となっている状況の通りだ。&lt;/p&gt;

&lt;p&gt;この状況に対して、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;シンタックスハイライトを適用させるための Convert 処理を変更する

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; が入れ子になっている件への対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Markdown から HTML への変換には、Maruku の代わりに、BlueCloth を使う

&lt;ul&gt;
&lt;li&gt;ソースコード部分での実体参照への勝手な置き換えが行なわれている件への対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;の2点を行ってみた。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&amp;gt;&amp;gt; require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;bluecloth&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; changed_reg = &lt;span class=&quot;co&quot;&gt;Regexp&lt;/span&gt;.new(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;([^&amp;lt;]+)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;co&quot;&gt;Regexp&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;MULTILINE&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; precode[]codeprem&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; changed_syn_convert_proc = lambda { &lt;span class=&quot;co&quot;&gt;Syntax&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Convertors&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;HTML&lt;/span&gt;.for_syntax(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;ruby&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;).convert(&lt;span class=&quot;gv&quot;&gt;$1&lt;/span&gt;) }&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;c&quot;&gt;#&amp;lt;Proc:0x0108f27c@(irb):15&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; b_h = &lt;span class=&quot;co&quot;&gt;BlueCloth&lt;/span&gt;.new(str).to_html&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;p&amp;gt;second!&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;class Hello&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;   def hello&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; puts 'hello!'&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;   end&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;gt;&amp;gt; b_h.gsub(changed_reg, &amp;amp;changed_syn_convert_proc)&lt;tt&gt;
&lt;/tt&gt;=&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;lt;p&amp;gt;second!&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;pre&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;keyword&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;class &amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;Hello&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;keyword&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;def &amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;method&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;hello&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;ident&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;puts&amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;punct&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;'&amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;string&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;hello!&amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;punct&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;'&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;keyword&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;end&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;span class=&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;keyword&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&amp;gt;end&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;/pre&amp;gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;一応、これで表示上は問題なくなる。&lt;br /&gt;
(後で、もう少しちゃんと考えよう。)&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;最終的な &lt;code&gt;Post#to_html&lt;/code&gt; の変更箇所は以下の通り。&lt;/p&gt;

&lt;div class=&quot;CodeMacro&quot;&gt;
&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt;
  &lt;td title=&quot;click to toggle&quot; class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;25&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;div class=&quot;head&quot;&gt;$ git diff&lt;/div&gt;&lt;div class=&quot;head&quot;&gt;diff --git a/lib/post.rb b/lib/post.rb&lt;/div&gt;&lt;div class=&quot;head&quot;&gt;index 3acb149..9f5c20b 100644&lt;/div&gt;&lt;div class=&quot;head&quot;&gt;&lt;span class=&quot;head&quot;&gt;--- &lt;/span&gt;a/lib/post.rb&lt;/div&gt;&lt;div class=&quot;head&quot;&gt;&lt;span class=&quot;head&quot;&gt;+++ &lt;/span&gt;b/lib/post.rb&lt;/div&gt;&lt;div class=&quot;chg&quot;&gt;&lt;span class=&quot;chg&quot;&gt;@@&lt;/span&gt; -1,4 +1,4 &lt;span class=&quot;chg&quot;&gt;@@&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;del&quot;&gt;&lt;span class=&quot;del&quot;&gt;-&lt;/span&gt;require File.dirname(__FILE__) + '/../vendor/maruku/maruku'&lt;/div&gt;&lt;div class=&quot;ins&quot;&gt;&lt;span class=&quot;ins&quot;&gt;+&lt;/span&gt;require 'bluecloth'&lt;/div&gt;&lt;span class=&quot;c&quot;&gt; &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt; $LOAD_PATH.unshift File.dirname(__FILE__) + '/../vendor/syntax'&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt; require 'syntax/convertors/html'&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;div class=&quot;chg&quot;&gt;&lt;span class=&quot;chg&quot;&gt;@@&lt;/span&gt; -56,11 +56,10 &lt;span class=&quot;chg&quot;&gt;@@&lt;/span&gt; class Post &amp;lt; Sequel::Model&lt;/div&gt;&lt;span class=&quot;c&quot;&gt;   ########&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt; &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;   def to_html(markdown)&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;div class=&quot;del&quot;&gt;&lt;span class=&quot;del&quot;&gt;-&lt;/span&gt;    h = Maruku.new(markdown).to_html&lt;/div&gt;&lt;div class=&quot;del&quot;&gt;&lt;span class=&quot;del&quot;&gt;-&lt;/span&gt;    h.gsub(/&amp;lt;code&amp;gt;([^&amp;lt;]+)&amp;lt;\/code&amp;gt;/m) do&lt;/div&gt;&lt;div class=&quot;ins&quot;&gt;&lt;span class=&quot;ins&quot;&gt;+&lt;/span&gt;    h = BlueCloth.new(markdown).to_html&lt;/div&gt;&lt;div class=&quot;ins&quot;&gt;&lt;span class=&quot;ins&quot;&gt;+&lt;/span&gt;    h.gsub(/&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;([^&amp;lt;]+)&amp;lt;\/code&amp;gt;&amp;lt;\/pre&amp;gt;/m) do&lt;/div&gt;&lt;span class=&quot;c&quot;&gt;       convertor = Syntax::Convertors::HTML.for_syntax &amp;quot;ruby&amp;quot;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;div class=&quot;del&quot;&gt;&lt;span class=&quot;del&quot;&gt;-&lt;/span&gt;      highlighted = convertor.convert($1)&lt;/div&gt;&lt;div class=&quot;del&quot;&gt;&lt;span class=&quot;del&quot;&gt;-&lt;/span&gt;      &amp;quot;&amp;lt;code&amp;gt;#{highlighted}&amp;lt;/code&amp;gt;&amp;quot;&lt;/div&gt;&lt;div class=&quot;ins&quot;&gt;&lt;span class=&quot;ins&quot;&gt;+&lt;/span&gt;      convertor.convert($1)&lt;/div&gt;&lt;span class=&quot;c&quot;&gt;     end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class=&quot;c&quot;&gt;   end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;感想&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;機能が最小限ということもあるが、Sinatra ベースのアプリは非常にシンプルでわかり易い。&lt;/li&gt;
&lt;li&gt;「HTTP メソッド + パス」がダイレクトに処理コードに紐付くのは気持ちいい。&lt;/li&gt;
&lt;li&gt;Sequel って結構いいかも。&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Sinatra の作者が言うように Sinatra はフレームワークというよりは、ライブラリ的なものだ。
Rack に対して非常にセンスのよいデコレーションを行っている。&lt;/p&gt;

&lt;p&gt;Rails はフルセットのフレームワークであり、非常に有用で、その設計は勉強にもなる。
ただ、その内部は複雑化しており、何か問題のあった時などには知っておくべきことが多すぎて、思わぬところで時間をとられる場合がある。&lt;/p&gt;

&lt;p&gt;適材適所で、シンプルで扱い易い Sinatra を使ってみたいと思えてくる。&lt;/p&gt;
          </content>  </entry>
</feed>
