<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss1full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="ja">
<channel rdf:about="http://blog.fuktommy.com/">
  <title>blog.fuktommy.com</title>
  <link>http://blog.fuktommy.com/</link>
  <description />
  <dc:creator>Fuktommy</dc:creator>
  <items><rdf:Seq>
    <rdf:li rdf:resource="http://blog.fuktommy.com/1245590071" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1244268863" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1244267814" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1243151199" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1243063300" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1242533005" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1242489347" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1241972052" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1241967258" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1241233077" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1240845189" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1240153535" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1240074944" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1239421534" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1238932989" />
    <rdf:li rdf:resource="http://blog.fuktommy.com/1238078816" />
</rdf:Seq></items><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/blogfuktommycom" type="application/rss+xml" /></channel>
  <item rdf:about="http://blog.fuktommy.com/1245590071">
  <title>キーワード引数の代わりとしての関数はアリか否か</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/9c6ls0-JRsE/1245590071</link>
  <dc:date>2009-06-21T22:14:31+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1245590071" />
  <description>   流れるようなインターフェイス - 予定は未定Blog版  
から、部分文字列を作る疑似コード？ 

   
"hogepiyofoobar".Substr().From(2).To(5);
   

 なんか素直じゃない気がするんですよね。
これ、言語仕様が許すのであればキーワード引数を使って 

  "hogepiyofoobar".substr(from=2, to=5);  

 と書いた方が素直だと思う。
JavaとかPHPはキーワード引数がないからこんなになっちゃう
(元記事はC#なんだけど、C#は知らない)。
PHPだと連想配列を使って、 

  "hogepiyofoobar".substr(array('from' =&amp;gt; 2, 'to' =&amp;gt; 5));  

 みたいなスタイルも可能ではあるのだろうけど、これはこれでもやもやする。 

 流れるようなインターフェイス、
あるいは単なるメソッドチェインでもいいんだけど、...</description>
  <content:encoded><![CDATA[<p><cite><a href="http://d.hatena.ne.jp/bleis-tift/20090620/1245485402">流れるようなインターフェイス - 予定は未定Blog版</a></cite>
から、部分文字列を作る疑似コード？</p>

<blockquote cite="http://d.hatena.ne.jp/bleis-tift/20090620/1245485402"><p><code>
"hogepiyofoobar".Substr().From(2).To(5);
</code></p></blockquote>

<p>なんか素直じゃない気がするんですよね。
これ、言語仕様が許すのであればキーワード引数を使って</p>

<pre class="code"><code>"hogepiyofoobar".substr(from=2, to=5);</code></pre>

<p>と書いた方が素直だと思う。
JavaとかPHPはキーワード引数がないからこんなになっちゃう
(元記事はC#なんだけど、C#は知らない)。
PHPだと連想配列を使って、</p>

<pre class="code"><code>"hogepiyofoobar".substr(array('from' =&gt; 2, 'to' =&gt; 5));</code></pre>

<p>みたいなスタイルも可能ではあるのだろうけど、これはこれでもやもやする。</p>

<p>流れるようなインターフェイス、
あるいは単なるメソッドチェインでもいいんだけど、
<code>"hoge".substr().from(2).to(5)</code>
みたいな書き方をすると、from()関数、to()関数に適切な機能が分割できて、
それぞれの関数がすっきりして、
使う側からも読みやすくなるというのが幸せなのだろうとは思う。</p>

<p>依存性の逆転原則を生かしてコーディングすると、
オブジェクトに、それが依存するオブジェクトをいろいろ設定しなければならなくて、
コンストラクタの引数で渡せればいいのだけど、</p>

<pre class="code"><code>$hoge = new Hoge(logger = $logger, pdo = $pdo, memcache = $memcache);</code></pre>

<p>のようにキーワード引数が使えないから、</p>

<pre class="code"><code>$hoge = Hoge::factory()
      -&gt;withLogger($logger)
      -&gt;withPdo($pdo)
      -&gt;withMemcache($memcache);</code></pre>

<p>こんな風に書いてたりする。
妥協の産物ではあるんだけど、
with*() 関数がそれなりにすっきりするので、そんなに嫌いではない。</p>

<p>キーワード引数がもっといろんな言語で使えたらいいんだけどなあ。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/ATqdyYYgDrtt_HiRWKlgIefmdBo/0/da"><img src="http://feedads.g.doubleclick.net/~a/ATqdyYYgDrtt_HiRWKlgIefmdBo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ATqdyYYgDrtt_HiRWKlgIefmdBo/1/da"><img src="http://feedads.g.doubleclick.net/~a/ATqdyYYgDrtt_HiRWKlgIefmdBo/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/9c6ls0-JRsE" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1245590071</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1244268863">
  <title>説明の下手な人</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/Vf51Q2ZOOVI/1244268863</link>
  <dc:date>2009-06-06T15:14:23+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1244268863" />
  <description> 今さら  ディズニーが嫌いになった  に反応するんだけど、 

  
両親が泊るのを代わりに予約してやっただけなのに、
宿泊者名で予約しないとダメですの一点張り。
  

 ディズニーかつ名前つながりで似たようなことがあったからね。
保険組合の優待券でディズニーランドに行ったら、
優待券には本人が会社名とか被保険者名とか被扶養者名とか書くんですけど、
窓口に持って行ったら「被扶養者の名前を書いてください」って言われたんですよ。
でも僕は被保険者本人であって、被扶養者ではなかったので、
「僕は本人ですよ」と言ったのですが、
「被扶養者の名前を書いてください」の一点張り。 

 これってまずい状態なんですよ。...</description>
  <content:encoded><![CDATA[<p>今さら<cite><a href="http://anond.hatelabo.jp/20090309155514">ディズニーが嫌いになった</a></cite>に反応するんだけど、</p>

<blockquote cite="http://anond.hatelabo.jp/20090309155514"><p>
両親が泊るのを代わりに予約してやっただけなのに、
宿泊者名で予約しないとダメですの一点張り。
</p></blockquote>

<p>ディズニーかつ名前つながりで似たようなことがあったからね。
保険組合の優待券でディズニーランドに行ったら、
優待券には本人が会社名とか被保険者名とか被扶養者名とか書くんですけど、
窓口に持って行ったら「被扶養者の名前を書いてください」って言われたんですよ。
でも僕は被保険者本人であって、被扶養者ではなかったので、
「僕は本人ですよ」と言ったのですが、
「被扶養者の名前を書いてください」の一点張り。</p>

<p>これってまずい状態なんですよ。
僕としては被扶養者の名前を書きたくないわけじゃなくて、
書く内容がないよということ、
あるいは「じゃあ何を書けばいいんだよ」「言ってる意味がわからないよ」
ということを伝えたいんですけど、
それが「僕は本人ですよ」の一点張りになってるんですね。
窓口の人には窓口の人なりの考え方があるはずで、
「被扶養者の名前を書いてください」の一点張りになってると。</p>

<p>結局「じゃあ何を書けばいいんですか」と聞くことで
「本人の名前を書いてください」という返事を引き出すことはできたのだけど、
なんかもやもやするんだよなあ。
「被保険者本人なら被扶養者名の欄には本人の名前を書いてください」
というのは窓口の人が最初に言うことじゃないかと。
標準的ではない書き方だし、
そういう特殊な書き方をするというのを知っているのは窓口の人で、
客としてはそんな特殊ルールの存在にすら思いが至らないので。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/shaS0YO_OiElhaSQr62xT5xQVrw/0/da"><img src="http://feedads.g.doubleclick.net/~a/shaS0YO_OiElhaSQr62xT5xQVrw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/shaS0YO_OiElhaSQr62xT5xQVrw/1/da"><img src="http://feedads.g.doubleclick.net/~a/shaS0YO_OiElhaSQr62xT5xQVrw/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/Vf51Q2ZOOVI" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1244268863</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1244267814">
  <title>私の頭の中のソースコード</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/7wqxCON9J-o/1244267814</link>
  <dc:date>2009-06-06T14:56:54+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1244267814" />
  <description> 今いちばん興味があるのは頭の中にある設計図を
できる限りそのままプログラムに書き出すことなんだよね。
多くの場合はプログラミング言語の書き方に引きずられて、
設計図がそのままプログラムにならない。 

 コンパイラでソースをアセンブリ言語に変換することができたりするので、
それを比喩に使うと、
真のソースは頭の中にしかなくて、
プログラム書いたよと言ってる「それ」は
コンパイル済みのアセンブリコードであり、
読もうとすれば読めないこともないけど、
ソースじゃないよね、という感じです。 

 つってもこれって個人的な技能の域を出ない話なんだよなあ。...</description>
  <content:encoded><![CDATA[<p>今いちばん興味があるのは頭の中にある設計図を
できる限りそのままプログラムに書き出すことなんだよね。
多くの場合はプログラミング言語の書き方に引きずられて、
設計図がそのままプログラムにならない。</p>

<p>コンパイラでソースをアセンブリ言語に変換することができたりするので、
それを比喩に使うと、
真のソースは頭の中にしかなくて、
プログラム書いたよと言ってる「それ」は
コンパイル済みのアセンブリコードであり、
読もうとすれば読めないこともないけど、
ソースじゃないよね、という感じです。</p>

<p>つってもこれって個人的な技能の域を出ない話なんだよなあ。
設計の技能、つまり頭の中にある設計図をよりよいものにする技能の方が、
よりプロダクトに貢献するだろうし。
いやもちろん、設計図がそのままソースコードになっていれば理解しやすいから、
メンテナンスコストが下がるとか、
重複コードを書かなくて済むようになって開発速度が向上するとか、
設計の技能に繋がってはいるはずなんだけど、
直結している気はしないんだよね。</p>

<p>うーん。
全体設計とかアーキテクトとかいう言葉を意識しすぎ？</p>
<p><a href="http://feedads.g.doubleclick.net/~a/gli7I-7q3jP3adjEPmjT-I2vLQQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/gli7I-7q3jP3adjEPmjT-I2vLQQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/gli7I-7q3jP3adjEPmjT-I2vLQQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/gli7I-7q3jP3adjEPmjT-I2vLQQ/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/7wqxCON9J-o" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1244267814</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1243151199">
  <title>プログラムの出来がわかるのは半年後</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/lnSW5GdSoeQ/1243151199</link>
  <dc:date>2009-05-24T16:46:39+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1243151199" />
  <description> 「 渋日記: きれいなソースコードを書けるようになるためには 」を読んで連想したこと。
プログラムって書いたときには「わかりやすくて、きれいなソースコード書いたぞー」
って思ってるはずなんですね。
最初から出来が悪いと思ってるコードを本番環境にマージしたりはしないはず。
ところがですよ。
半年くらい経つと、新機能を追加しなければならなくなったりして、
このコードに手を入れることになるんですが、
このときに、はたして「わかりやすくて、きれいなソースコード」かというと、
そんなことなかったりするんですね。 

 
   そもそも何をやってる関数なんだ、これ？ 
   どこに手を入れればいいんだろう？...</description>
  <content:encoded><![CDATA[<p>「<a href="http://blog.shibu.jp/article/28983162.html">渋日記: きれいなソースコードを書けるようになるためには</a>」を読んで連想したこと。
プログラムって書いたときには「わかりやすくて、きれいなソースコード書いたぞー」
って思ってるはずなんですね。
最初から出来が悪いと思ってるコードを本番環境にマージしたりはしないはず。
ところがですよ。
半年くらい経つと、新機能を追加しなければならなくなったりして、
このコードに手を入れることになるんですが、
このときに、はたして「わかりやすくて、きれいなソースコード」かというと、
そんなことなかったりするんですね。</p>

<ul>
  <li>そもそも何をやってる関数なんだ、これ？</li>
  <li>どこに手を入れればいいんだろう？</li>
  <li>直すべき箇所はわかったけど、
      ここを直すと関数名と処理が不整合になっちゃうよな。</li>
  <li>直したはいいけど、既存の機能に悪影響を与えていないかな？</li>
  <li>短かった関数がどんどん長くなるよー</li>
</ul>

<p>最初にプログラムを書いているときは、頭の中に完璧な設計図があって、
実際のコードはその設計図をきちんと反映してなく、
ドキュメントにも設計図はきちんと反映してないのですが、
とにかく頭の中の設計図をもとにコーディングして、読んでるので、
読めるんですね、きっと。
それが半年後になると、頭の中の設計図は失われ、
残ったのは不十分なソースコードのみということになってしまうと。</p>

<p>なので「心掛け」としては、
「頭の中の設計図を全部コードに反映させさい」ということなのだけど、
それはすぐにできるようにはならない。
もし昨日やったことを忘れてしまう薬があれば、
それを毎日飲むことで頭の中の設計図を消去し、
コードしか頼りにならないという状況を作ることで、
頭の中の設計図を全部コードに反映させるということができるのだろうけど。</p>

<p>20代後半とか、30代とかになると、
脳の力が衰えてきて、頭の中に設計図を保つことができなくなってきて、
コードの質を良くしないとコーディングできなくなるというのは、
あるかもしれない。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/ZQWUWX5RbsAZ5-kNDTFZAWVqLTw/0/da"><img src="http://feedads.g.doubleclick.net/~a/ZQWUWX5RbsAZ5-kNDTFZAWVqLTw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ZQWUWX5RbsAZ5-kNDTFZAWVqLTw/1/da"><img src="http://feedads.g.doubleclick.net/~a/ZQWUWX5RbsAZ5-kNDTFZAWVqLTw/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/lnSW5GdSoeQ" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1243151199</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1243063300">
  <title>規制の前提</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/oSB-FQHCopQ/1243063300</link>
  <dc:date>2009-05-23T16:21:40+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1243063300" />
  <description> 「 人間はみんなバラバラなんだと思う。 - NaokiTakahashiの日記 」読んで、
前から思ってたことを思い出したんだけど、
規制について。 

 
   最大公約数的な規制。
      最小限のことだけ決め、その決まりは絶対に守る。 
   最小公倍数的な規制。
      なんでもかんでも規制するが、時と場合によって守らなくてもよい。 
 

 人によって、文脈によって、国によって、文化によって、
この2つのどちらを頭においているかが変わるんじゃないかなあ。
「未成年の飲酒は禁止。でも大学生だしいいんじゃね？」
みたいなのが後者。 

 これをごっちゃにするとまずいと思う。
努力目標的な、最小公倍数的な規制としてルールを作ったら、...</description>
  <content:encoded><![CDATA[<p>「<a href="http://d.hatena.ne.jp/NaokiTakahashi/20090523/p2">人間はみんなバラバラなんだと思う。 - NaokiTakahashiの日記</a>」読んで、
前から思ってたことを思い出したんだけど、
規制について。</p>

<ul>
  <li>最大公約数的な規制。
      最小限のことだけ決め、その決まりは絶対に守る。</li>
  <li>最小公倍数的な規制。
      なんでもかんでも規制するが、時と場合によって守らなくてもよい。</li>
</ul>

<p>人によって、文脈によって、国によって、文化によって、
この2つのどちらを頭においているかが変わるんじゃないかなあ。
「未成年の飲酒は禁止。でも大学生だしいいんじゃね？」
みたいなのが後者。</p>

<p>これをごっちゃにするとまずいと思う。
努力目標的な、最小公倍数的な規制としてルールを作ったら、
絶対に守らなければならない規制として厳格に運用されるとかね。
厳格に運用されるという前提なら、
その規制は最大公約数的に、最小限のものだけにするべきだし。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/cCbP2Un2QeAmFZmVZMsiiWRwyHk/0/da"><img src="http://feedads.g.doubleclick.net/~a/cCbP2Un2QeAmFZmVZMsiiWRwyHk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/cCbP2Un2QeAmFZmVZMsiiWRwyHk/1/da"><img src="http://feedads.g.doubleclick.net/~a/cCbP2Un2QeAmFZmVZMsiiWRwyHk/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/oSB-FQHCopQ" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1243063300</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1242533005">
  <title>8割わかればいいんだよ</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/yo95mW2SVmA/1242533005</link>
  <dc:date>2009-05-17T13:03:25+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1242533005" />
  <description> 「 名前を見ても分からない。 - IHARA Note 」からバトンを受け取ったので。
「  情報理工学部のご案内 | 国立大学法人 電気通信大学  」から新学科とその説明文を抜き出すと、 

  
   情報・通信工学科 
   コンピュータ、通信、ネットワーク、メディア処理技術、
      マンマシンインターフェース、数理情報解析技術の分野 

   知能機械工学科 
   ロボット、自動車、産業機器などの
      メカトロニクス製品に代表される分野とこれらの融合先端分野 

   先進理工学科 
   電子工学、光エレクトロニクス、自然科学、バイオサイエンスの分野 

   先端工学基礎課程 
   平日の夜と土曜日に授業を受けられるカリキュラム(教育課程) 
  

 となって、よくわかります。...</description>
  <content:encoded><![CDATA[<p>「<a href="http://d.hatena.ne.jp/tihara/20090512#p1">名前を見ても分からない。 - IHARA Note</a>」からバトンを受け取ったので。
「<cite><a href="http://www.uec.ac.jp/ies/new_faculty/">情報理工学部のご案内 | 国立大学法人 電気通信大学</a></cite>」から新学科とその説明文を抜き出すと、</p>

<blockquote cite="http://www.uec.ac.jp/ies/new_faculty/"><dl>
  <dt>情報・通信工学科</dt>
  <dd>コンピュータ、通信、ネットワーク、メディア処理技術、
      マンマシンインターフェース、数理情報解析技術の分野</dd>

  <dt>知能機械工学科</dt>
  <dd>ロボット、自動車、産業機器などの
      メカトロニクス製品に代表される分野とこれらの融合先端分野</dd>

  <dt>先進理工学科</dt>
  <dd>電子工学、光エレクトロニクス、自然科学、バイオサイエンスの分野</dd>

  <dt>先端工学基礎課程</dt>
  <dd>平日の夜と土曜日に授業を受けられるカリキュラム(教育課程)</dd>
</dl></blockquote>

<p>となって、よくわかります。
1つ足りないって？　
だって説明読んでも意味わかんねえんだもん。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/huVWtr73grScwjuMuKJh9nYdEWM/0/da"><img src="http://feedads.g.doubleclick.net/~a/huVWtr73grScwjuMuKJh9nYdEWM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/huVWtr73grScwjuMuKJh9nYdEWM/1/da"><img src="http://feedads.g.doubleclick.net/~a/huVWtr73grScwjuMuKJh9nYdEWM/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/yo95mW2SVmA" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1242533005</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1242489347">
  <title>クラス分けは関数を決めた後がいい場合もある</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/3sqLx1psNd0/1242489347</link>
  <dc:date>2009-05-17T00:55:47+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1242489347" />
  <description> 設計はトップダウンで進めるから、
大きい方であるクラスをどう分けるかを考えて、
次に小さい方である関数のインタフェースを決める、
という流れでやるべきだと思い込んでいたのだけど、
実際は逆の場合もあるんじゃないかという話。 

 どっかのWebAPIから何か取ってきて、
それをXMLだとしてパーズして、
キー名を変えたり不要な要素を取り除いたりして、
最後に配列が欲しい、というようなことを考えます。
これをクラスから先に考えると
「WebAPIにアクセスするクラス」というようなものが抽象的に浮んでくるのですが、
そこから先に進めません。
エイヤで始めてしまって、あとで直したり、直しきれなかったりします。...</description>
  <content:encoded><![CDATA[<p>設計はトップダウンで進めるから、
大きい方であるクラスをどう分けるかを考えて、
次に小さい方である関数のインタフェースを決める、
という流れでやるべきだと思い込んでいたのだけど、
実際は逆の場合もあるんじゃないかという話。</p>

<p>どっかのWebAPIから何か取ってきて、
それをXMLだとしてパーズして、
キー名を変えたり不要な要素を取り除いたりして、
最後に配列が欲しい、というようなことを考えます。
これをクラスから先に考えると
「WebAPIにアクセスするクラス」というようなものが抽象的に浮んでくるのですが、
そこから先に進めません。
エイヤで始めてしまって、あとで直したり、直しきれなかったりします。</p>

<p>そこで発想を逆転させて、まずそれぞれの機能を関数として考えます。</p>

<pre class="code"><code>$hoge-&gt;connect($url)
     -&gt;fetch()
     -&gt;parseAsXml()
     -&gt;filter(array('callback1', 'callback2'))
     -&gt;toArray();</code></pre>

<p>メソッドチェインとして考えるのもたぶんポイントで、
戻値がどんなクラスであるかは一旦考えなくてよくなります。
まずは関数だけを考えると。</p>

<p>んで、次にクラスを考えます。
connect()が返すのはきっとConnectionだろう。
fetch()はConnectionに対する副作用であるべきか、
同じクラスの新たなインスタンスか、
それともResponseというようなクラスに分けるべきだろうか。
parseAsXml()の結果も同じく副作用であるべきか、新しいクラスか。
filter()を使うかどうかは任意だから、
parseAsXml()の戻値と同じクラスでいいだろうな。
toArray()の戻値は配列に決まってる。
等々。</p>

<p>これは「接続」や「接続の結果戻ってきた文字列」、
「接続の結果戻ってきた文字列を解釈したもの」のような、
抽象的なものをクラス分けするときに威力を発揮しそうだと思いました。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/yV8CCymRDcrDjjNy7Y6QIkwzuMw/0/da"><img src="http://feedads.g.doubleclick.net/~a/yV8CCymRDcrDjjNy7Y6QIkwzuMw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/yV8CCymRDcrDjjNy7Y6QIkwzuMw/1/da"><img src="http://feedads.g.doubleclick.net/~a/yV8CCymRDcrDjjNy7Y6QIkwzuMw/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/3sqLx1psNd0" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1242489347</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1241972052">
  <title>テンプレートについて思いつくままに</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/KRtK8ERS1Js/1241972052</link>
  <dc:date>2009-05-11T01:14:12+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1241972052" />
  <description> テンプレート、
具体的にいうと Smarty なんだけど、
なんとなく感じてる問題点を思いつくままに書きます。 

 サイズが大きくなる問題 
 
   通常ページの上から下まで全部記述するから、サイズが大きくなるし、
      タグの開き-閉じの関係もわかにくい。 
   プログラミングでいうところの関数みたいなことでどうにかなるか。 
   Smartyであれば{include}。これは関数のようにも使える。 
   つまりヘッダ、本文、サイドバー、フッタのような
      別々のテンプレートにしておく。 
   使える局面では使えるだろうな。 
 

 文章とデザインの関係 
 
   デザインを記述するのはテンプレートをおいてほかにない。 
   文章って関数的なものなのか。...</description>
  <content:encoded><![CDATA[<p>テンプレート、
具体的にいうと<a href="http://www.smarty.net/manual/ja/">Smarty</a>なんだけど、
なんとなく感じてる問題点を思いつくままに書きます。</p>

<h3>サイズが大きくなる問題</h3>
<ul>
  <li>通常ページの上から下まで全部記述するから、サイズが大きくなるし、
      タグの開き-閉じの関係もわかにくい。</li>
  <li>プログラミングでいうところの関数みたいなことでどうにかなるか。</li>
  <li>Smartyであれば{include}。これは関数のようにも使える。</li>
  <li>つまりヘッダ、本文、サイドバー、フッタのような
      別々のテンプレートにしておく。</li>
  <li>使える局面では使えるだろうな。</li>
</ul>

<h3>文章とデザインの関係</h3>
<ul>
  <li>デザインを記述するのはテンプレートをおいてほかにない。</li>
  <li>文章って関数的なものなのか。
      「概要説明」とう関数があって、
      その中に「このページはこれこれです」とあって、
      テンプレート内では{概要説明を呼ぶ}とか書いてあるとか。</li>
  <li>文章の長さにまどわされずにデザイン的なタグの開く-閉じるがわかる。</li>
  <li>可能なところはやっぱり{include}か。やたら長い説明文とか。</li>
  <li>全ての文章を{include}するというのは変な気がする。</li>
  <li>実験としてそういうコーディング作法を試してみる価値はあるかも。</li>
</ul>

<h3>リソースファイル</h3>
<ul>
  <li>何かのファイルを差し替えると、
      文章が日本語になったり英語になったりするイメージ。</li>
  <li>文章とデザインの関係をつきつめていくとそうなる？</li>
</ul>

<h3>分岐の爆発</h3>
<ul>
  <li>構造化プログラミング用語でいうところの順次はただのHTML。</li>
  <li>反復はそれ用の変数に配列なりイテレータなりを入れるので、
      プログラマとデザイナーとの連携は取れているはず。</li>
  <li>条件分岐は爆発する可能性が高い。</li>
  <li>分岐はネストの深さ、条件文のどちらも複雑になる。</li>
  <li>リファクタリング的にはネストした中身を適切に関数にしたり、
      条件文を関数にしたりすることですっきりさせる工夫がある。</li>
  <li>ネストした中身を関数化するといえば{include}で大体できるか。</li>
  <li>条件文を関数にするのって、本来はコントローラの仕事じゃね？</li>
</ul>

<h3>MVCモデルと作業者</h3>
<ul>
  <li>ある条件のときに何を見せるかというのは、
      本来的にはコントローラの管轄だよな。</li>
  <li>ある条件のときに何を見せるかというのは、
      作業の上ではデザイナー兼ライターの管轄になりがち。</li>
  <li>結果としてコントローラは素のフラグを大量に渡して、
      テンプレートのif文で表示を切り替えるようなことをしがち。</li>
  <li>Smartyの言語構造を駆使してプログラミングをすることはできるけど、
      それってたぶん斧で釘を打つようなアレ。</li>
</ul>

<h3>Smartyには助手が要るんじゃね</h3>
<ul>
  <li>簡易なプログラミング言語のような何か。</li>
  <li>条件文あたりを吸収する。</li>
  <li>{assign var="flag" val=...}でもいいんじゃね？</li>
  <li>assignでもいいんだけど、遅延評価的な何かか。
      でもそれって単にコスト的な問題で、
      富豪プログラミングでは無視できるか。</li>
</ul>

<h3>暫定的まとめ</h3>
<ul>
  <li>長すぎる文章は別ファイルにしてinclude</li>
  <li>if文のネストは別ファイルにしてinclude</li>
  <li>if文の複雑な条件は上の方で適切な名前の変数にassign</li>
</ul>
<p><a href="http://feedads.g.doubleclick.net/~a/bTwpAyBEtMwpz6hiGNN1tpvfFMU/0/da"><img src="http://feedads.g.doubleclick.net/~a/bTwpAyBEtMwpz6hiGNN1tpvfFMU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/bTwpAyBEtMwpz6hiGNN1tpvfFMU/1/da"><img src="http://feedads.g.doubleclick.net/~a/bTwpAyBEtMwpz6hiGNN1tpvfFMU/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/KRtK8ERS1Js" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1241972052</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1241967258">
  <title>きれいなソースコードを書くためのただ1つのルール</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/Xrhkp9HWklA/1241967258</link>
  <dc:date>2009-05-10T23:54:18+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1241967258" />
  <description> 「 渋日記: きれいなソースコードを書けるようになるためには 」と
「 きれいなソースコードを書くために必要な、たったひとつの単純な事 - よくわかりません 」
の流れで。 

  ユニットテスト を書け。 </description>
  <content:encoded><![CDATA[<p>「<a href="http://blog.shibu.jp/article/28983162.html">渋日記: きれいなソースコードを書けるようになるためには</a>」と
「<a href="http://d.hatena.ne.jp/r-west/20090510/1241962864">きれいなソースコードを書くために必要な、たったひとつの単純な事 - よくわかりません</a>」
の流れで。</p>

<p><a href="http://blog.fuktommy.com/1238932989">ユニットテスト</a>を書け。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/xF5lM2dfCyTo67bn-aCr7Gi2nZ4/0/da"><img src="http://feedads.g.doubleclick.net/~a/xF5lM2dfCyTo67bn-aCr7Gi2nZ4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/xF5lM2dfCyTo67bn-aCr7Gi2nZ4/1/da"><img src="http://feedads.g.doubleclick.net/~a/xF5lM2dfCyTo67bn-aCr7Gi2nZ4/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/Xrhkp9HWklA" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1241967258</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1241233077">
  <title>本人確認義務は開発者にも負担</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/hbIJARvQAFA/1241233077</link>
  <dc:date>2009-05-02T11:57:57+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1241233077" />
  <description>   「ミネルバ」は無罪、グーグルは本人確認を拒否　揺れる韓国ネット規制 インターネット-最新ニュース:IT-PLUS  より: 

  
韓国では2009年4月1日から、
1日訪問者数が10万人以上のポータルサイトや動画サイト、
ニュースサイトの掲示板にユーザーが書き込みをする際の
「本人確認」が義務付けられた。
ユーザーの住民登録番号と氏名を照会して実名確認をしたうえでないと、
会員登録できない。
  

 10万人以上と制限がついてるからいいのですが、
これがもし「全ての掲示板」みたいなことになったとすると、
個人で掲示板スクリプトを作って公開するとか、
スクリプトに手を入れるとか、が難しくなるよなあ、とか思ったりしました。...</description>
  <content:encoded><![CDATA[<p><cite><a href="http://it.nikkei.co.jp/internet/news/?n=MMIT13000030042009">「ミネルバ」は無罪、グーグルは本人確認を拒否　揺れる韓国ネット規制 インターネット-最新ニュース:IT-PLUS</a></cite>より:</p>

<blockquote cite="http://it.nikkei.co.jp/internet/news/?n=MMIT13000030042009"><p>
韓国では2009年4月1日から、
1日訪問者数が10万人以上のポータルサイトや動画サイト、
ニュースサイトの掲示板にユーザーが書き込みをする際の
「本人確認」が義務付けられた。
ユーザーの住民登録番号と氏名を照会して実名確認をしたうえでないと、
会員登録できない。
</p></blockquote>

<p>10万人以上と制限がついてるからいいのですが、
これがもし「全ての掲示板」みたいなことになったとすると、
個人で掲示板スクリプトを作って公開するとか、
スクリプトに手を入れるとか、が難しくなるよなあ、とか思ったりしました。</p>

<p>自分で本人確認しようと思ったら個人情報を抱え込むことになってリスクあるから、
OpenIDを使うとかになるのかな。
それでも厳密なログを取ることが必要になるかもしれない。
Wikiであれば最新版とか、最新版と1つ前の状態だけ取っておけばよいとかではなく、
全てのリビジョンを保存しておいて、
誰が何を書いたかがわかるようになってなければならないとか。</p>

<p>たとえば何かの検索エンジンでも、
検索履歴が誰でも見れるようにしたら面白いとか思ったとして、
そういうのを作ったとしますよね。
そしたら検索履歴で会話できるから、
これは本人確認の義務あり、となると、
検索するのにもOpenIDでログインしないといけないとか、そんな感じ。
あるいは監視の義務があるとかね。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/zuf3gbq2BRaLywTlPrv3BAY8lUs/0/da"><img src="http://feedads.g.doubleclick.net/~a/zuf3gbq2BRaLywTlPrv3BAY8lUs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/zuf3gbq2BRaLywTlPrv3BAY8lUs/1/da"><img src="http://feedads.g.doubleclick.net/~a/zuf3gbq2BRaLywTlPrv3BAY8lUs/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/hbIJARvQAFA" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1241233077</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1240845189">
  <title>福冨式野菜スープ</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/W5zbklpAN1A/1240845189</link>
  <dc:date>2009-04-28T00:13:09+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1240845189" />
  <description> 最近はこんなのばっかり作ってます。
具を適当に変えれば飽きませんし、30分くらいででき、
うち20分は待ってるだけです。 

 道具 
 
   包丁 
   まな板 
   ピーラー (あれば) 
   片手鍋 (大は小を兼ねる) 
   計量カップ 
   お玉 
 

 野菜 
 この中から適当に選んで切って鍋に入れます。
量は2人前で、うちの鍋だと8分目くらいかなあ。 
 
   タマネギ (これメイン。2個くらい入れます) 
   ニンジン 
   大根 
   カイワレ大根 
   エリンギ 
   ジャガイモ 
   そのほか適当に 
 
 野菜によっては青臭くなるので注意しましょう。
インゲンマメは鬼門。 

 魚・肉 
 1種類選んで鍋に入れます。 
 
   ベーコン・ハムの類 
   つみれなど練り物の類 
   鮭水煮缶などの缶詰...</description>
  <content:encoded><![CDATA[<p>最近はこんなのばっかり作ってます。
具を適当に変えれば飽きませんし、30分くらいででき、
うち20分は待ってるだけです。</p>

<h3>道具</h3>
<ul>
  <li>包丁</li>
  <li>まな板</li>
  <li>ピーラー (あれば)</li>
  <li>片手鍋 (大は小を兼ねる)</li>
  <li>計量カップ</li>
  <li>お玉</li>
</ul>

<h3>野菜</h3>
<p>この中から適当に選んで切って鍋に入れます。
量は2人前で、うちの鍋だと8分目くらいかなあ。</p>
<ul>
  <li>タマネギ (これメイン。2個くらい入れます)</li>
  <li>ニンジン</li>
  <li>大根</li>
  <li>カイワレ大根</li>
  <li>エリンギ</li>
  <li>ジャガイモ</li>
  <li>そのほか適当に</li>
</ul>
<p>野菜によっては青臭くなるので注意しましょう。
インゲンマメは鬼門。</p>

<h3>魚・肉</h3>
<p>1種類選んで鍋に入れます。</p>
<ul>
  <li>ベーコン・ハムの類</li>
  <li>つみれなど練り物の類</li>
  <li>鮭水煮缶などの缶詰</li>
</ul>

<h3>そのほか</h3>
<ul>
  <li>水320cc (固形コンソメのマニュアルによると300ccですが、蒸発分を入れるとこんな感じかと)</li>
  <li><a href="http://www.ajinomoto.co.jp/consomme/" title="【味の素KK】「コンソメ」で野菜をおいしく、スープをおいしく。">固形コンソメ</a></li>
  <li>胡椒・唐辛子等 (あれば)</li>
</ul>

<h3>作り方</h3>
<ol>
  <li>野菜を切って鍋に入れます。</li>
  <li>魚・肉を鍋に入れます。</li>
  <li>固形コンソメを鍋に入れます。</li>
  <li>水を鍋に入れます。この時点では野菜が水にひたりきっていませんが、気にしません。</li>
  <li>フィーリングで胡椒をかけます。</li>
  <li>4分間強火にかけます。すると沸騰します。</li>
  <li>15分間弱火で煮ます。</li>
  <li>気分で胡椒・唐辛子等をかけます。</li>
</ol>
<p><a href="http://feedads.g.doubleclick.net/~a/FhiDnW7tuizOOJ2DjW7ztbePSZA/0/da"><img src="http://feedads.g.doubleclick.net/~a/FhiDnW7tuizOOJ2DjW7ztbePSZA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/FhiDnW7tuizOOJ2DjW7ztbePSZA/1/da"><img src="http://feedads.g.doubleclick.net/~a/FhiDnW7tuizOOJ2DjW7ztbePSZA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/W5zbklpAN1A" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1240845189</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1240153535">
  <title>IRC関係の環境を揃えた</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/glnj27xoXcM/1240153535</link>
  <dc:date>2009-04-20T00:05:35+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1240153535" />
  <description> ircd-hybrid 
 Fedora9 では ircd-hybrid と ircd-ratbox が選べるのだけど、
何故かircd-ratboxにはNadokaが繋げなかったので、ircd-hybridを選択。 

 # yum install ircd-hybrid
# chkconfig --add ircd  ←要るのかな。ircd-ratbox は要った。
# chkconfig --level 3 ircd on
# chkconfig --list ircd
ircd            0:off   1:off   2:off   3:on    4:off   5:off   6:off 

  ウノウラボ Unoh Labs: ircdをインストールしたのでメモ 
を参考にして設定。 


 Nadoka 
  Nadoka: IRC Client Server Program - nadokaさんとあそぼう  をインストール。
これは
 はてなブックマーク - Fuktommyのミニブログ - お気に入り 
を監視するためなんだけど、
1分おきにアクセスしてたら差分が取れなくなってるっぽい。
 id:naoya がSBM勉強会で、...</description>
  <content:encoded><![CDATA[<h3>ircd-hybrid</h3>
<p>Fedora9 では ircd-hybrid と ircd-ratbox が選べるのだけど、
何故かircd-ratboxにはNadokaが繋げなかったので、ircd-hybridを選択。</p>

<pre class="code"># yum install ircd-hybrid
# chkconfig --add ircd  ←要るのかな。ircd-ratbox は要った。
# chkconfig --level 3 ircd on
# chkconfig --list ircd
ircd            0:off   1:off   2:off   3:on    4:off   5:off   6:off</pre>

<p><a href="http://labs.unoh.net/2008/08/ircd.html">ウノウラボ Unoh Labs: ircdをインストールしたのでメモ</a>
を参考にして設定。</p>


<h3>Nadoka</h3>
<p><a href="http://www.atdot.net/nadoka/nadoka.ja.html">Nadoka: IRC Client Server Program - nadokaさんとあそぼう</a> をインストール。
これは
<a href="http://b.hatena.ne.jp/fuktommy/favorite">はてなブックマーク - Fuktommyのミニブログ - お気に入り</a>
を監視するためなんだけど、
1分おきにアクセスしてたら差分が取れなくなってるっぽい。
<a href="http://d.hatena.ne.jp/naoya/">id:naoya</a>がSBM勉強会で、
RSSならガンガンアクセスしてもいいよ、でもHTMLは勘弁な、って言ってたのに…
とりあえず様子見。</p>

<p>いじったところは
plugins/rss_checkbot.nb で tojis だったのを toutf8 にしたとか、
そのくらい。</p>

<pre class="code">  Servers = [
   { :host =&gt; 'localhost' }
  ]
  User     = 'nadoka'
  Nick     = 'nadoka'

  BotConfig = [
    { :name      =&gt; :RSS_CheckBot,
      :rss_paths =&gt;
        [
          'http://b.hatena.ne.jp/fuktommy/favorite.rss',
        ],
      :cache     =&gt; "./tmp/rss-cache",
      :ch        =&gt; '#fuktommy',
      :tm        =&gt; 5,
      :over_message =&gt; nil
    },
  ]</pre>


<h3>tig.rb</h3>
<p><a href="http://subtech.g.hatena.ne.jp/cho45/20070415/1176631923">tig.rb (twitter irc gareway) - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech</a>
を参考にして設定。</p>

<pre class="code"># yum install ruby rubygems ruby-devel gcc 
# gem install json
svn co http://svn.coderepos.org/share/lang/ruby/net-irc/trunk net-irc</pre>

<p>なぜか401エラー出ていたので、試行錯誤した結果、次のように修正。</p>

<pre class="code">Index: examples/tig.rb
===================================================================
--- examples/tig.rb     (リビジョン 32627)
+++ examples/tig.rb     (作業コピー)
@@ -186,7 +186,7 @@
        end

        def api_source
-               "tigrb"
+               ""
        end

        def jabber_bot_id</pre>

<h3>起動スクリプト</h3>
<p>たとえばtig.rbはこんな感じのスクリプトで。</p>
<pre class="code">#!/bin/sh -e
#
# start/stop Twitter IRC Gateway.
#

USER=ircclient
COMMAND=/srv/ircclient/tig/tig.sh
PIDFILE=/var/local/run/ircclient/tig.pid

test -x $COMMAND || exit 0
cd /var/tmp

case "$1" in
    start)
        echo -n "Starting twitter irc gateway: tig"
        sudo -u $USER $COMMAND &lt; /dev/null &gt; /dev/null 2&gt;&amp;1 &amp;
        echo "."
        ;;
    stop)
        echo -n "Stopping twitter irc gateway: tig"
        if [ ! -f $PIDFILE ]; then
            echo " not running."
            exit 0
        fi
        kill -TERM `cat $PIDFILE`
        pkill -KILL `cat $PIDFILE` &gt; /dev/null 2&gt;&amp;1 || true
        rm $PIDFILE
        echo "."
        ;;
    restart|force-reload)
        $0 stop
        $0 start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|force-reload}"
        exit 1
        ;;
esac

exit 0</pre>

<pre class="code">#!/bin/sh -e
cd /srv/ircclient/tig/net-irc
echo $$ &gt; /var/local/run/ircclient/tig.pid
export HOME=/srv/ircclient/home
exec /usr/bin/ruby ./examples/tig.rb</pre>


<h3>クライアント側</h3>
<p>サーバからはsshトンネルでクライアントに持ってきて、
<a href="http://limechat.net/">LimeChat</a>
で見るように設定。</p>


<h3>とはいえ</h3>
<p>事実上はてブが見れないので、こんなことやっても無駄なんだよなあ。
Twitterだけなら専用クライアントでいいし。
<a href="http://hateber.fuktommy.com/">はてバーぶろぐ</a>を追う用の環境という感覚なんだよね。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/5GU8qYqVAQKyrdlZzDQdWhm8UNA/0/da"><img src="http://feedads.g.doubleclick.net/~a/5GU8qYqVAQKyrdlZzDQdWhm8UNA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/5GU8qYqVAQKyrdlZzDQdWhm8UNA/1/da"><img src="http://feedads.g.doubleclick.net/~a/5GU8qYqVAQKyrdlZzDQdWhm8UNA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/glnj27xoXcM" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1240153535</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1240074944">
  <title>声のかけら。にDigest認証をかけてみたよ</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/CvNo6meRC_c/1240074944</link>
  <dc:date>2009-04-19T02:15:44+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1240074944" />
  <description>  bbs.fuktommy.com は
 声のかけら。 
で作られています。
今回解決しようとした問題は次の2つです。 

 
   スパム投稿を制限したい。 
   検索エンジンが検索履歴を削除するのを制限したい。 
 

 どちらも完全に防ぐことは難しいですが、
ある程度防げればいいかなあ、という程度です。
必要な箇所だけにDigest認証をかけることにしました。 

 スパム投稿の制限は、POSTに限ってダイジェスト認証をかけるという作戦で、
これは検索すると定番の設定が出てきます。 

  &amp;lt;Location "/"&amp;gt;
    &amp;lt;Limit POST&amp;gt;
        Require valid-user
    &amp;lt;/Limit&amp;gt;
&amp;lt;/Location&amp;gt;  

 検索履歴を削除するのの制限というのはどういうことかというと、
hogeという単語で検索すると、それが履歴に残り、...</description>
  <content:encoded><![CDATA[<p><a href="http://bbs.fuktommy.com/">bbs.fuktommy.com</a>は
<a href="http://www.hyuki.com/kakera/about.html">声のかけら。</a>
で作られています。
今回解決しようとした問題は次の2つです。</p>

<ul>
  <li>スパム投稿を制限したい。</li>
  <li>検索エンジンが検索履歴を削除するのを制限したい。</li>
</ul>

<p>どちらも完全に防ぐことは難しいですが、
ある程度防げればいいかなあ、という程度です。
必要な箇所だけにDigest認証をかけることにしました。</p>

<p>スパム投稿の制限は、POSTに限ってダイジェスト認証をかけるという作戦で、
これは検索すると定番の設定が出てきます。</p>

<pre class="code"><code>&lt;Location "/"&gt;
    &lt;Limit POST&gt;
        Require valid-user
    &lt;/Limit&gt;
&lt;/Location&gt;</code></pre>

<p>検索履歴を削除するのの制限というのはどういうことかというと、
hogeという単語で検索すると、それが履歴に残り、
?mycmd=delsearch&amp;myword=hoge にアクセスすると
履歴から消えるという仕組みになっています。
これってPOSTでやるべきじゃね、という説もありますが、
直すのめんどくさいので今回はGETのままでやりました。
投稿もPOSTだけに制限されてるのか謎。</p>

<pre class="code"><code>RewriteEngine On
RewriteCond %{QUERY_STRING} mycmd=delsearch
    RewriteCond %{LA-U:REMOTE_USER} ^$
    RewriteRule ^$ /login/ [R]
&lt;Location "/login/"&gt;
    Require valid-user
&lt;/Location&gt;</code></pre>

<p>/login/ って何かというと、
docrootで ln -s . login として作ったシンボリックリンクです。
Apacheの設定だけでやろうとしたけど、うまく行かなかった。
んで、削除URLにアクセスしようとすると、
/login/ に飛ばされて、Digest認証を要求されるという仕組み。
%{LA-U:REMOTE_USER} のところは思ったように機能してないんだけど、
これを外すと /login/ に2回アクセスしてる。謎。</p>

<p>パスワードファイルはこんな感じにして作る。</p>

<pre class="code"><code>% htdigest -c bbs.fuktommy.com bbs.fuktommy.com guest</code></pre>

<p>全体をまとめた設定ファイルはこんな感じ。</p>

<pre class="code"><code>&lt;VirtualHost *&gt;
    ServerAdmin webmaster@fuktommy.com
    DocumentRoot /srv/www/bbs.fuktommy.com
    ServerName bbs.fuktommy.com
    ErrorLog /var/log/httpd/bbs.fuktommy.com.error.log
    CustomLog /var/log/httpd/bbs.fuktommy.com.access.log combined

    &lt;Directory "/srv/www/bbs.fuktommy.com"&gt;
        Options +Indexes +ExecCGI
        AllowOverride None

        RewriteEngine On
        RewriteCond %{QUERY_STRING} mycmd=delsearch
            RewriteCond %{LA-U:REMOTE_USER} ^$
            RewriteRule ^$ /login/ [R]
    &lt;/Directory&gt;

    &lt;Location "/"&gt;
        AuthType Digest
        AuthName "bbs.fuktommy.com"
        AuthUserFile /srv/passwd/bbs.fuktommy.com
        &lt;Limit POST&gt;
            Require valid-user
        &lt;/Limit&gt;
    &lt;/Location&gt;

    &lt;Location "/login/"&gt;
        Require valid-user
    &lt;/Location&gt;
&lt;/VirtualHost&gt;</code></pre>
<p><a href="http://feedads.g.doubleclick.net/~a/yUr2_56URrzhOCNGGS0EsCaJNAo/0/da"><img src="http://feedads.g.doubleclick.net/~a/yUr2_56URrzhOCNGGS0EsCaJNAo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/yUr2_56URrzhOCNGGS0EsCaJNAo/1/da"><img src="http://feedads.g.doubleclick.net/~a/yUr2_56URrzhOCNGGS0EsCaJNAo/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/CvNo6meRC_c" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1240074944</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1239421534">
  <title>テンプレート内のメソッドチェイン</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/tIYIDiBnUDo/1239421534</link>
  <dc:date>2009-04-11T12:45:34+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1239421534" />
  <description>  Smartyで一番好きなのは修飾子の連結なので、メソッドチェーンなりでそのあたりをなんとかすれば素のPHPでも我慢できるかも。 
って書いて、コーディングしはじめたんだけど
 Smarty 
との互換性を取るのが面倒になって放置していた件ですが、
「 エクスギア技術系サイト PHP5限定　CakePHPのView内の関数処理を綺麗に記述する（邪道でしょうか？） 」
で先を越されたので、あわてて再開して、
 ModifireChain 
で公開しました。 </description>
  <content:encoded><![CDATA[<p><q cite="http://b.hatena.ne.jp/fuktommy/20090125#bookmark-11817443">Smartyで一番好きなのは修飾子の連結なので、メソッドチェーンなりでそのあたりをなんとかすれば素のPHPでも我慢できるかも。</q>
って書いて、コーディングしはじめたんだけど
<a href="http://www.smarty.net/manual/ja/">Smarty</a>
との互換性を取るのが面倒になって放置していた件ですが、
「<a href="http://www.exgear.jp/tech/doc/detail/85">エクスギア技術系サイト PHP5限定　CakePHPのView内の関数処理を綺麗に記述する（邪道でしょうか？）</a>」
で先を越されたので、あわてて再開して、
<a href="http://fuktommy.com/modchain/">ModifireChain</a>
で公開しました。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/X-eO65GLV2f9HtBg4rj-uvcR_7s/0/da"><img src="http://feedads.g.doubleclick.net/~a/X-eO65GLV2f9HtBg4rj-uvcR_7s/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/X-eO65GLV2f9HtBg4rj-uvcR_7s/1/da"><img src="http://feedads.g.doubleclick.net/~a/X-eO65GLV2f9HtBg4rj-uvcR_7s/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/tIYIDiBnUDo" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1239421534</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1238932989">
  <title>ユニットテストを書こう</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/jUFOFjH9LQU/1238932989</link>
  <dc:date>2009-04-05T21:03:09+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1238932989" />
  <description> 
   自動テストなので一度書いておけば「めんどくさいからテスト省略」→省略したところに不具合あった、のコンボを阻止できる。 
   関数を大きくしすぎるとテストしにくくなるので、
      適度なサイズに保つ働きがある。 
   クラスを大きくしすぎるとモックが使いにくくなるので、
      適度なサイズに保つ働きがある。 
   新機能追加のときにエンバグする可能性が減る。 
   新機能追加のときに、最初にテストの方に手を入れれば、
      コードのどこを直せばいいかすぐわかる。 
   デバッグのとき、バグが再現するようなテストを書いておけば、
      直ったと自信を持って言える。 
   テストしやすくしようとすると、自然に疎結合になる
      (cf....</description>
  <content:encoded><![CDATA[<ul>
  <li>自動テストなので一度書いておけば「めんどくさいからテスト省略」→省略したところに不具合あった、のコンボを阻止できる。</li>
  <li>関数を大きくしすぎるとテストしにくくなるので、
      適度なサイズに保つ働きがある。</li>
  <li>クラスを大きくしすぎるとモックが使いにくくなるので、
      適度なサイズに保つ働きがある。</li>
  <li>新機能追加のときにエンバグする可能性が減る。</li>
  <li>新機能追加のときに、最初にテストの方に手を入れれば、
      コードのどこを直せばいいかすぐわかる。</li>
  <li>デバッグのとき、バグが再現するようなテストを書いておけば、
      直ったと自信を持って言える。</li>
  <li>テストしやすくしようとすると、自然に疎結合になる
      (cf. <a href="http://msdn.microsoft.com/ja-jp/magazine/cc337885.aspx">疎結合: ソフトウェアの依存関係を緩和してアプリケーションの柔軟性を高める</a>)。</li>
  <li>クラスや関数について、
      通常の使い方とテストでの使い方の2種類を最初から用意するわけなので、
      以降の拡張で3種類、4種類と使い方が増えたとしても
      対応しやすいコードになっているはず。</li>
  <li>できあがったプログラムは、
      適度なサイズに分割された関数・クラスの集合になっていて、
      必要に応じて様々に組み合わせることができる状態になっており、
      将来の拡張がしやすい。</li>
</ul>

<p>というようなことを説いて新入社員を洗脳する計画である。
今日「<a href="http://fuktommy.com/am/4894712288">リファクタリング</a>」
という本買ったし、
前に「<a href="http://fuktommy.com/am/4894717115">テスト駆動開発入門</a>」
も読んだんだけど、
デザインパターンとユニットテストを網羅というか、
関連づけて説明した本ってないかなあ。
こういう時はこのパターンを使い、そのときのテストはこう書くべし、みたいな。
つか、デザインパターンに挙げられているような設計はテストしやすいのだ、
というのが素早く実感できればいいのだけど。</p>

<p>テストファーストというとユニットテストのことだけど、
自動化できない機能テスト、結合テストについても、
予め(実装以前・実装と並行して)
テスト項目を作っておいた方がいいのかなとか思ったり。
自動化できないということは
「めんどくさいからテスト省略」→省略したところに不具合あった、
のコンボを起こしやすいんだよなあ。人間の心理的に考えて。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/1i_BINLByez0H0QYanWPHxt4PaQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/1i_BINLByez0H0QYanWPHxt4PaQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/1i_BINLByez0H0QYanWPHxt4PaQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/1i_BINLByez0H0QYanWPHxt4PaQ/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/jUFOFjH9LQU" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1238932989</feedburner:origLink></item>
  <item rdf:about="http://blog.fuktommy.com/1238078816">
  <title>窓口というか、個人と組織というか</title>
  <link>http://feedproxy.google.com/~r/blogfuktommycom/~3/kIRtQSIWLag/1238078816</link>
  <dc:date>2009-03-26T23:46:56+09:00</dc:date>
  <dc:creator>Fuktommy</dc:creator>
  <dc:rights>http://creativecommons.org/licenses/by/2.1/jp/</dc:rights>
  <cc:license rdf:resource="http://blog.fuktommy.com/1238078816" />
  <description> 「 合法 P2P のためにできること。 - a4lg の準技術的日記 (縮小運営中) 」の感想として。 

 ここでいうP2Pってたぶん「 朔のP2Pガイドラインに基く表示を書いた 」で触れたような、
「運営母体のあるP2P」というか「サービスとしてのP2P」というか、
なんかそういうことだと思うのですね。
「 P2Pネットワーク実験協議会シンポジウムに行ってきた 」も挙げときます。 

 僕の見解としては、
「サービスとしてのP2P」が大きくなっていって、
1つの運営母体ではまかないきれないほどの規模になると
「インフラとしてのP2P」になると思っていて、
「インフラとしてのP2P」って何かというと、
電子メールだったりウェブだったりするわけです。...</description>
  <content:encoded><![CDATA[<p>「<a href="http://d.hatena.ne.jp/xna/20090326/1237982307">合法 P2P のためにできること。 - a4lg の準技術的日記 (縮小運営中)</a>」の感想として。</p>

<p>ここでいうP2Pってたぶん「<a href="http://blog.fuktommy.com/1203735766">朔のP2Pガイドラインに基く表示を書いた</a>」で触れたような、
「運営母体のあるP2P」というか「サービスとしてのP2P」というか、
なんかそういうことだと思うのですね。
「<a href="http://blog.fuktommy.com/1203521331">P2Pネットワーク実験協議会シンポジウムに行ってきた</a>」も挙げときます。</p>

<p>僕の見解としては、
「サービスとしてのP2P」が大きくなっていって、
1つの運営母体ではまかないきれないほどの規模になると
「インフラとしてのP2P」になると思っていて、
「インフラとしてのP2P」って何かというと、
電子メールだったりウェブだったりするわけです。
電子メールもウェブも、「サーバ」がありますが、
それは実際にはPCでもいいわけで、
実際母校の大学ではサーバにFreeBSDやLinuxを入れたり、
Sunのワークステーションを使ったりして、
電子メールやウェブのサーバを運用したこともありました。</p>

<p>そういう「インフラとしてのP2P」では、
サーバ、あるいはサーバント、ノードといってもいいんですけど、
そのノードには責任者がいて、苦情受け付け、訴訟受け付けの窓口があるわけです。
「お前のサーバでこんなファイルを公開していたが、我々の権利を侵害しているぞ」
と言われるための窓口があって、
それに対して説明するなりする、そういう窓口です。
年中無休24時間営業、とはいかなくてもレスポンスの早さも必要になりそう。
これはP2Pに限らないと思うんですが、
たとえば<a href="http://www.hatena.ne.jp/">はてな</a>を例にすると、
どこかのデータセンターの中にはてなのサーバがあるわけですが、
はてなへの苦情ははてなに行くのであって、
データセンターの会社に行くわけではない、と。</p>

<p>これが再帰的であれば、
例えば<a href="http://b.hatena.ne.jp/fuktommy/">僕のブクマ</a>への苦情は
僕に来るのであって、はてなに行くわけではない、ということになるんでしょうけど、
実際にははてなに行く場合もありそうです。
その場合は、僕は「窓口」としての能力があるとはみなされてなくて、
はてなには能力があるとみなされている、ということになるでしょう。
仮にはてなにも「窓口」の能力がないとしたら、
データセンターの会社に行くということもあるかもしれません。
たぶん能力がないとしたら、
データセンターを借りる契約ができないとは思いますけど。</p>

<p>僕がはてなを使うときには利用規約に同意したわけですけど、
「窓口」の能力がなければはてなは使うな、
という仕組みにはなってないような気がしますね。
よくわかんないけど。</p>

<p>で、P2Pにまで戻ると、
「僕の理想の社会」では
P2Pのノードを管理している人、
たとえば全てのWinnyユーザは「窓口」を持つわけで、
自分の公開しているファイルについては責任を持つということになります。
でもたぶんそうはならなくて、
運営会社みたいなところの「窓口」までは行くんですけど、
各ユーザに直接問い合わせがあるという気はしません。
これを保護されていると解釈するか、
軽んじられていると解釈するかは、どちらもできそうですが。</p>

<p>そんなわけで、
個人、例えばはてなの1ユーザが「窓口」を持ち、
はてなに苦情が行ったら「それは筋違いだからそのユーザに言ってくれ」
とはならないんだろうなあ、とか思いつつも、
社会全体としてそうならないかなあ、
例えばレスポンスの遅さ(入院なんかしたら対応できない)も含めて、
やむを得ないとして仕組みができていかないかなあ、
とか思ったりします。
個人の機能を括り出して組織をつくるわけだから、
それに逆行する流れは退化かもしんないなあ。</p>
<p><a href="http://feedads.g.doubleclick.net/~a/jwL7ZnSWhQmOyE72H9667QJjneA/0/da"><img src="http://feedads.g.doubleclick.net/~a/jwL7ZnSWhQmOyE72H9667QJjneA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/jwL7ZnSWhQmOyE72H9667QJjneA/1/da"><img src="http://feedads.g.doubleclick.net/~a/jwL7ZnSWhQmOyE72H9667QJjneA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/blogfuktommycom/~4/kIRtQSIWLag" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://blog.fuktommy.com/1238078816</feedburner:origLink></item>
</rdf:RDF>
