<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.f99aq8ove.net/~d/styles/atom10japanesefull.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.f99aq8ove.net/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja"><title type="text">◆F99a.q8oVE::Blog</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/" /><updated>2008-08-12T18:29:21+00:00</updated><id>tag:blog.f99aq8ove.net,2005:/</id><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/3.0/" /><link rel="self" href="http://feeds.feedburner.jp/f99aq" type="application/atom+xml" /><entry><title type="html">perl で seq を実装してみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/08/1218565761.html" /><category term="perl" /><author><name>◆F99a.q8oVE</name></author><updated>2008-08-13T03:29:21+09:00</updated><id>tag:blog.f99aq8ove.net,2008-08-13:/archive/2008/08/1218565761.html</id><content type="html">&#xD;
			&lt;p&gt;&#xD;
この前は &lt;a href="http://blog.f99aq8ove.net/archive/2008/08/1217763880.html"&gt;mktemp&lt;/a&gt; を書いてましたが、今度は seq を書いてみました。&#xD;
seq は、shell script でループを書く時によく使ってます。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
勉強ということで、Test::Base を使ってみたり、コードは gist に貼ってみたり...。&#xD;
しかし、これだと feed reader 上で直接コードが読めないところが難点かな。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
(ref: &lt;a href="http://gihyo.jp/dev/feature/01/test-perl/0002"&gt;Happy Testing Perl:第 2 回 Test::Base の紹介|gihyo.jp ... 技術評論社&lt;/a&gt;)&#xD;
&lt;/p&gt;&#xD;
&lt;a href="http://gist.github.com/5103"&gt;gist: 5103 — GitHub&lt;/a&gt;&#xD;
&lt;script src="http://gist.github.com/5103.js"&gt;&lt;/script&gt;&#xD;
		</content></entry><entry><title type="html">perl で mktemp を実装してみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/08/1217763880.html" /><category term="perl" /><author><name>◆F99a.q8oVE</name></author><updated>2008-08-03T20:44:40+09:00</updated><id>tag:blog.f99aq8ove.net,2008-08-03:/archive/2008/08/1217763880.html</id><content type="html">&#xD;
			&lt;p&gt;&#xD;
最近、シェルスクリプトをいじってることが多いんだけど、シェルスクリプト中で使って便利なのが mktemp.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
それで、乱用ぎみに使っていたのですが、とある環境で作業をしていて、mktemp を使おうと思ったら無かったんで perl で実装してみたり。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
&lt;a href="http://freehg.org/u/f99aq/utils/file/09177d8ec349/perl/mktemp"&gt;utils: perl/mktemp@09177d8ec349&lt;/a&gt;にあげておいた。&#xD;
ライセンスは&lt;a href="http://opensource.org/licenses/bsl1.0.html"&gt;Boost Software License 1.0 (BSL1.0)&lt;/a&gt;.&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
もっときれいに書けないかな〜。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&lt;span class="PreProc"&gt;#!/usr/bin/env perl&lt;/span&gt;&#xD;
&lt;span class="Statement"&gt;use strict&lt;/span&gt;;&#xD;
&lt;span class="Statement"&gt;use warnings&lt;/span&gt;;&#xD;
&lt;span class="Statement"&gt;use &lt;/span&gt;Fcntl;&#xD;
&#xD;
&lt;span class="Comment"&gt;# use Data::Dumper;&lt;/span&gt;&#xD;
&#xD;
&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$try_count&lt;/span&gt; = &lt;span class="Constant"&gt;10&lt;/span&gt;;&#xD;
&#xD;
&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;%options&lt;/span&gt; = (&#xD;
  &lt;span class="Constant"&gt;t &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;using_tempdir&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;,&#xD;
  &lt;span class="Constant"&gt;u &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;unsafe&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;,&#xD;
  &lt;span class="Constant"&gt;d &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;dir&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;,&#xD;
);&#xD;
&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;%mode&lt;/span&gt; = (&#xD;
  &lt;span class="Constant"&gt;using_tempdir &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;0&lt;/span&gt;,&#xD;
  &lt;span class="Constant"&gt;unsafe &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;0&lt;/span&gt;,&#xD;
  &lt;span class="Constant"&gt;dir &lt;/span&gt;=&amp;gt; &lt;span class="Constant"&gt;0&lt;/span&gt;,&#xD;
);&#xD;
&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$template&lt;/span&gt;;&#xD;
&#xD;
&lt;span class="Statement"&gt;foreach&lt;/span&gt; &lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$arg&lt;/span&gt; (&lt;span class="Identifier"&gt;@ARGV&lt;/span&gt;) {&#xD;
  &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$arg&lt;/span&gt; =~&lt;span class="Statement"&gt; /&lt;/span&gt;&lt;span class="Constant"&gt;^-&lt;/span&gt;&lt;span class="Special"&gt;(.*)&lt;/span&gt;&lt;span class="Constant"&gt;$&lt;/span&gt;&lt;span class="Statement"&gt;/&lt;/span&gt;) {&#xD;
    &lt;span class="Statement"&gt;foreach&lt;/span&gt; (&lt;span class="Statement"&gt;split&lt;/span&gt;&lt;span class="Statement"&gt; //&lt;/span&gt;, &lt;span class="Identifier"&gt;$1&lt;/span&gt;) {&#xD;
      &lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Constant"&gt;unknown option: &lt;/span&gt;&lt;span class="Identifier"&gt;$_&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt; &lt;span class="Statement"&gt;unless&lt;/span&gt; &lt;span class="Statement"&gt;exists&lt;/span&gt; &lt;span class="Identifier"&gt;$options&lt;/span&gt;{&lt;span class="Identifier"&gt;$_&lt;/span&gt;};&#xD;
      &lt;span class="Identifier"&gt;$mode&lt;/span&gt;{&lt;span class="Identifier"&gt;$options&lt;/span&gt;{&lt;span class="Identifier"&gt;$_&lt;/span&gt;}} = &lt;span class="Constant"&gt;1&lt;/span&gt;;&#xD;
    }&#xD;
  } &lt;span class="Statement"&gt;else&lt;/span&gt; {&#xD;
    &lt;span class="Identifier"&gt;$template&lt;/span&gt; ||= &lt;span class="Identifier"&gt;$arg&lt;/span&gt;;&#xD;
  }&#xD;
}&#xD;
&#xD;
&lt;span class="Statement"&gt;unless&lt;/span&gt; (&lt;span class="Statement"&gt;defined&lt;/span&gt; &lt;span class="Identifier"&gt;$template&lt;/span&gt;) {&#xD;
  &lt;span class="Identifier"&gt;$mode&lt;/span&gt;{using_tempdir} ||= &lt;span class="Constant"&gt;1&lt;/span&gt;;&#xD;
  &lt;span class="Identifier"&gt;$template&lt;/span&gt; = &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;tmp.XXXXXXXXXX&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;;&#xD;
}&#xD;
&#xD;
&lt;span class="Comment"&gt;# warn Dumper \%mode;&lt;/span&gt;&#xD;
&lt;span class="Comment"&gt;# warn $template;&lt;/span&gt;&#xD;
&#xD;
&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;;&#xD;
&#xD;
&lt;span class="Statement"&gt;while&lt;/span&gt; (&lt;span class="Identifier"&gt;$try_count&lt;/span&gt;) {&#xD;
  &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt; = &lt;span class="Identifier"&gt;$template&lt;/span&gt;;&#xD;
  &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt; =~ &lt;span class="Statement"&gt;s/&lt;/span&gt;&lt;span class="Special"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;X&lt;/span&gt;&lt;span class="Special"&gt;)&lt;/span&gt;&lt;span class="Statement"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;&amp;amp;rand_char(&lt;/span&gt;&lt;span class="Identifier"&gt;$1&lt;/span&gt;&lt;span class="Constant"&gt;)&lt;/span&gt;&lt;span class="Statement"&gt;/eg&lt;/span&gt;;&#xD;
  &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$mode&lt;/span&gt;{using_tempdir}) {&#xD;
    &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt; = (&lt;span class="Identifier"&gt;$ENV&lt;/span&gt;{TMPDIR} || &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;/tmp&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;) . &lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Constant"&gt;/&lt;/span&gt;&lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;;&#xD;
  }&#xD;
  &lt;span class="Comment"&gt;# warn $temp_name;&lt;/span&gt;&#xD;
  &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$mode&lt;/span&gt;{dir}) {&#xD;
    &lt;span class="Statement"&gt;last&lt;/span&gt; &lt;span class="Statement"&gt;if&lt;/span&gt; &lt;span class="Statement"&gt;mkdir&lt;/span&gt; &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;;&#xD;
  } &lt;span class="Statement"&gt;else&lt;/span&gt; {&#xD;
    &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Statement"&gt;sysopen&lt;/span&gt; &lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$fh&lt;/span&gt;, &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;, O_WRONLY | O_CREAT | O_EXCL) {&#xD;
      &lt;span class="Statement"&gt;close&lt;/span&gt; &lt;span class="Identifier"&gt;$fh&lt;/span&gt;;&#xD;
      &lt;span class="Statement"&gt;last&lt;/span&gt;;&#xD;
    }&#xD;
  }&#xD;
  &lt;span class="Identifier"&gt;$try_count&lt;/span&gt;--;&#xD;
}&#xD;
&#xD;
&lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Constant"&gt;make temp failed: &lt;/span&gt;&lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt; &lt;span class="Statement"&gt;if&lt;/span&gt; &lt;span class="Identifier"&gt;$try_count&lt;/span&gt; == &lt;span class="Constant"&gt;0&lt;/span&gt;;&#xD;
&#xD;
&lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$mode&lt;/span&gt;{unsafe}) {&#xD;
  &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$mode&lt;/span&gt;{dir}) {&#xD;
    &lt;span class="Statement"&gt;rmdir&lt;/span&gt; &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt; &lt;span class="Statement"&gt;or&lt;/span&gt; &lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="Identifier"&gt;$!&lt;/span&gt;;&#xD;
  } &lt;span class="Statement"&gt;else&lt;/span&gt; {&#xD;
    &lt;span class="Statement"&gt;unlink&lt;/span&gt; &lt;span class="Identifier"&gt;$temp_name&lt;/span&gt; &lt;span class="Statement"&gt;or&lt;/span&gt; &lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="Identifier"&gt;$!&lt;/span&gt;;&#xD;
  }&#xD;
}&#xD;
&#xD;
&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Identifier"&gt;$temp_name&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;;&#xD;
&#xD;
&lt;span class="Statement"&gt;sub&lt;/span&gt;&lt;span class="Identifier"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;rand_char&lt;/span&gt;&lt;span class="Identifier"&gt;()&lt;/span&gt;&lt;span class="Identifier"&gt; &lt;/span&gt;{&#xD;
  &lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;@chars&lt;/span&gt; = (&lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;a&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;..&lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;z&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;, &lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;A&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;..&lt;span class="Constant"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;Z&lt;/span&gt;&lt;span class="Constant"&gt;'&lt;/span&gt;, &lt;span class="Constant"&gt;0.&lt;/span&gt;.&lt;span class="Constant"&gt;9&lt;/span&gt;);&#xD;
  &lt;span class="Statement"&gt;return&lt;/span&gt; &lt;span class="Identifier"&gt;$chars&lt;/span&gt;[&lt;span class="Statement"&gt;rand&lt;/span&gt;(&lt;span class="Statement"&gt;scalar&lt;/span&gt; &lt;span class="Identifier"&gt;@chars&lt;/span&gt;)];&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
		</content></entry><entry><title type="html">TAP on C++</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/06/1214149170.html" /><category term="C++" /><category term="tap" /><author><name>◆F99a.q8oVE</name></author><updated>2008-06-23T00:39:30+09:00</updated><id>tag:blog.f99aq8ove.net,2008-06-23:/archive/2008/06/1214149170.html</id><content type="html">&#xD;
			&lt;p&gt;&#xD;
Test Anything Protocol - TAP ですが、なんとなく C++ で実装してみました。&#xD;
&lt;/p&gt;&#xD;
&lt;h3&gt;tap.hpp&lt;/h3&gt;&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synPreProc"&gt;#ifndef TAP_HPP_526c07e9e0a11dc15e7838c85f7e46780782392d&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#define TAP_HPP_526c07e9e0a11dc15e7838c85f7e46780782392d&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synType"&gt;namespace&lt;/span&gt; tap {&#xD;
    &lt;span class="synType"&gt;size_t&lt;/span&gt; tests__ = &lt;span class="synConstant"&gt;0&lt;/span&gt;;&#xD;
    &lt;span class="synType"&gt;size_t&lt;/span&gt; numof_tested__ = &lt;span class="synConstant"&gt;0&lt;/span&gt;;&#xD;
&#xD;
    &lt;span class="synType"&gt;void&lt;/span&gt; tests(&lt;span class="synType"&gt;size_t&lt;/span&gt; n) {&#xD;
        tests__ = n;&#xD;
        std::cout &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"1.."&lt;/span&gt; &amp;lt;&amp;lt; n &amp;lt;&amp;lt; std::endl;&#xD;
    }&#xD;
&#xD;
    &lt;span class="synType"&gt;void&lt;/span&gt; ok_notok__(&lt;span class="synType"&gt;bool&lt;/span&gt; is_ok, &lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; name) {&#xD;
        std::cout &amp;lt;&amp;lt; (is_ok ? &lt;span class="synConstant"&gt;"ok "&lt;/span&gt; : &lt;span class="synConstant"&gt;"not ok "&lt;/span&gt;) &amp;lt;&amp;lt; ++numof_tested__ &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;" - "&lt;/span&gt; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; std::endl;&#xD;
    }&#xD;
&#xD;
    &lt;span class="synType"&gt;template&lt;/span&gt; &amp;lt;&lt;span class="synType"&gt;typename&lt;/span&gt; T, &lt;span class="synType"&gt;typename&lt;/span&gt; U&amp;gt; &lt;span class="synType"&gt;void&lt;/span&gt; is__(&lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; file, &lt;span class="synType"&gt;size_t&lt;/span&gt; line,&#xD;
            T got, U expected, &lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; name = &lt;span class="synConstant"&gt;""&lt;/span&gt;) {&#xD;
        &lt;span class="synStatement"&gt;if&lt;/span&gt; (got != expected) {&#xD;
            ok_notok__(&lt;span class="synConstant"&gt;false&lt;/span&gt;, name);&#xD;
            std::cerr&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   Failed test '"&lt;/span&gt; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   at "&lt;/span&gt; &amp;lt;&amp;lt; file &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;" line "&lt;/span&gt; &amp;lt;&amp;lt; line &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;".&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#          got: '"&lt;/span&gt; &amp;lt;&amp;lt; got &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#     expected: '"&lt;/span&gt; &amp;lt;&amp;lt; expected &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'"&lt;/span&gt; &amp;lt;&amp;lt; std::endl;&#xD;
        } &lt;span class="synStatement"&gt;else&lt;/span&gt; {&#xD;
            ok_notok__(&lt;span class="synConstant"&gt;true&lt;/span&gt;, name);&#xD;
        }&#xD;
    }&#xD;
&#xD;
    &lt;span class="synType"&gt;template&lt;/span&gt; &amp;lt;&lt;span class="synType"&gt;typename&lt;/span&gt; T, &lt;span class="synType"&gt;typename&lt;/span&gt; U&amp;gt; &lt;span class="synType"&gt;void&lt;/span&gt; isnt__(&lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; file, &lt;span class="synType"&gt;size_t&lt;/span&gt; line,&#xD;
            T got, U expected, &lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; name = &lt;span class="synConstant"&gt;""&lt;/span&gt;) {&#xD;
        &lt;span class="synStatement"&gt;if&lt;/span&gt; (got == expected) {&#xD;
            ok_notok__(&lt;span class="synConstant"&gt;false&lt;/span&gt;, name);&#xD;
            std::cerr&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   Failed test '"&lt;/span&gt; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   at "&lt;/span&gt; &amp;lt;&amp;lt; file &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;" line "&lt;/span&gt; &amp;lt;&amp;lt; line &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;".&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#     '"&lt;/span&gt; &amp;lt;&amp;lt; got &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#         ne&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
                &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#     '"&lt;/span&gt; &amp;lt;&amp;lt; expected &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'"&lt;/span&gt; &amp;lt;&amp;lt; std::endl;&#xD;
        } &lt;span class="synStatement"&gt;else&lt;/span&gt; {&#xD;
            ok_notok__(&lt;span class="synConstant"&gt;true&lt;/span&gt;, name);&#xD;
        }&#xD;
    }&#xD;
&#xD;
    &lt;span class="synType"&gt;void&lt;/span&gt; fail__(&lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; file, &lt;span class="synType"&gt;size_t&lt;/span&gt; line, &lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; name) {&#xD;
        ok_notok__(&lt;span class="synConstant"&gt;false&lt;/span&gt;, name);&#xD;
        std::cerr&#xD;
            &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   Failed test '"&lt;/span&gt; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"'&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
            &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"#   at "&lt;/span&gt; &amp;lt;&amp;lt; file &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;" line "&lt;/span&gt; &amp;lt;&amp;lt; line &amp;lt;&amp;lt; std::endl;&#xD;
    }&#xD;
&#xD;
    &lt;span class="synType"&gt;void&lt;/span&gt; diag__(&lt;span class="synType"&gt;const&lt;/span&gt; std::string&amp;amp; d) {&#xD;
        std::cerr &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;"# "&lt;/span&gt; &amp;lt;&amp;lt; d &amp;lt;&amp;lt; std::endl;&#xD;
    }&#xD;
}&#xD;
&#xD;
&lt;span class="synPreProc"&gt;#define is(g, e, n) tap::is__(&lt;/span&gt;&lt;span class="synConstant"&gt;__FILE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, &lt;/span&gt;&lt;span class="synConstant"&gt;__LINE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, (g), (e), (n))&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#define isnt(g, e, n) tap::isnt__(&lt;/span&gt;&lt;span class="synConstant"&gt;__FILE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, &lt;/span&gt;&lt;span class="synConstant"&gt;__LINE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, (g), (e), (n))&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#define fail(n) tap::fail__(&lt;/span&gt;&lt;span class="synConstant"&gt;__FILE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, &lt;/span&gt;&lt;span class="synConstant"&gt;__LINE__&lt;/span&gt;&lt;span class="synPreProc"&gt;, (n))&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#define diag(d) tap::diag__((d))&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synPreProc"&gt;#endif&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
こんな風に使います。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;"tap.hpp"&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synStatement"&gt;using&lt;/span&gt; &lt;span class="synType"&gt;namespace&lt;/span&gt; std;&#xD;
&#xD;
&lt;span class="synType"&gt;int&lt;/span&gt; main(&lt;span class="synType"&gt;void&lt;/span&gt;) {&#xD;
    tap::tests(&lt;span class="synConstant"&gt;6&lt;/span&gt;);&#xD;
    is(&lt;span class="synConstant"&gt;1&lt;/span&gt;, &lt;span class="synConstant"&gt;3&lt;/span&gt;, &lt;span class="synConstant"&gt;"hoge"&lt;/span&gt;);&#xD;
    string hoge = &lt;span class="synConstant"&gt;"hoge"&lt;/span&gt;;&#xD;
    string geho = &lt;span class="synConstant"&gt;"hoge"&lt;/span&gt;;&#xD;
    isnt(hoge, geho, &lt;span class="synConstant"&gt;"hoge"&lt;/span&gt;);&#xD;
    isnt(&lt;span class="synConstant"&gt;0&lt;/span&gt;, &lt;span class="synConstant"&gt;0&lt;/span&gt;, &lt;span class="synConstant"&gt;"hoge"&lt;/span&gt;);&#xD;
    fail(&lt;span class="synConstant"&gt;"asdf"&lt;/span&gt;);&#xD;
    is(&lt;span class="synConstant"&gt;0&lt;/span&gt;, &lt;span class="synConstant"&gt;0&lt;/span&gt;, &lt;span class="synConstant"&gt;"asf"&lt;/span&gt;);&#xD;
    diag(&lt;span class="synConstant"&gt;"asdf"&lt;/span&gt;);&#xD;
    &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synConstant"&gt;0&lt;/span&gt;;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
実行すると...。&#xD;
&lt;pre&gt;&#xD;
% g++ -Wall -Wextra test.cpp &amp;amp;&amp;amp; ./a.out&#xD;
1..6&#xD;
not ok 1 - hoge&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 10.&#xD;
#          got: '1'&#xD;
#     expected: '3'&#xD;
not ok 2 - hoge&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 13.&#xD;
#     'hoge'&#xD;
#         ne&#xD;
#     'hoge'&#xD;
not ok 3 - hoge&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 14.&#xD;
#     '0'&#xD;
#         ne&#xD;
#     '0'&#xD;
not ok 4 - asdf&#xD;
#   Failed test 'asdf'&#xD;
#   at test.cpp line 15&#xD;
ok 5 - asf&#xD;
# asdf&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
a.t を用意して...。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synComment"&gt;#!/bin/sh&lt;/span&gt;&#xD;
./a.out&#xD;
&lt;/pre&gt;&#xD;
&lt;pre&gt;&#xD;
% prove -v ./a.t&#xD;
./a......&#xD;
1..6&#xD;
not ok 1 - hoge&#xD;
not ok 2 - hoge&#xD;
not ok 3 - hoge&#xD;
not ok 4 - asdf&#xD;
ok 5 - asf&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 10.&#xD;
#          got: '1'&#xD;
#     expected: '3'&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 13.&#xD;
#     'hoge'&#xD;
#         ne&#xD;
#     'hoge'&#xD;
#   Failed test 'hoge'&#xD;
#   at test.cpp line 14.&#xD;
#     '0'&#xD;
#         ne&#xD;
#     '0'&#xD;
#   Failed test 'asdf'&#xD;
#   at test.cpp line 15&#xD;
# asdf&#xD;
 Failed 5/6 subtests&#xD;
&#xD;
Test Summary Report&#xD;
-------------------&#xD;
./a.t (Wstat: 0 Tests: 5 Failed: 4)&#xD;
  Failed tests:  1-4&#xD;
  Parse errors: Bad plan.  You planned 6 tests but ran 5.&#xD;
Files=1, Tests=5,  0 wallclock secs ( 0.03 usr +  0.01 sys =  0.04 CPU)&#xD;
Result: FAIL&#xD;
[1]    3716 exit 1     prove -v ./a.t&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
こうなる。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
freeHG にあげときました。BSL1.0 です。&lt;a href="http://freehg.org/u/f99aq/utils/file/3370b4d11c7b/cpp/tap/"&gt;utils: Manifest&lt;/a&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
テストに失敗したときの戻り値を...には、まだ対応していません。&#xD;
&lt;/p&gt;&#xD;
		</content></entry><entry><title type="html">GNU/Linux で Expert Mouse を使うメモ</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/06/1214138301.html" /><category term="linux" /><author><name>◆F99a.q8oVE</name></author><updated>2008-06-22T21:38:21+09:00</updated><id>tag:blog.f99aq8ove.net,2008-06-22:/archive/2008/06/1214138301.html</id><content type="html">&#xD;
			&lt;p&gt;&#xD;
EM7 用 /etc/X11/xorg.conf 設定メモ&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
&lt;a href="http://www.amazon.co.jp/o/ASIN/B0006J09LU/f99aq-22/ref=nosim"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/41HYXS04FJL._SL160_.jpg" alt="KENSINGTON 64325 EXPERT MOUSE OPTICAL"&gt;&lt;/img&gt;KENSINGTON 64325 EXPERT MOUSE OPTICAL&lt;/a&gt;&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synStatement"&gt;Section "InputDevice"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Identifier&lt;/span&gt;     &lt;span class="synConstant"&gt;"em7"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Driver&lt;/span&gt;         &lt;span class="synConstant"&gt;"mouse"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;CorePointer&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;Protocol&lt;/span&gt;&lt;span class="synConstant"&gt;" "auto"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;Device&lt;/span&gt;&lt;span class="synConstant"&gt;" "/dev/input/mice"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;Buttons&lt;/span&gt;&lt;span class="synConstant"&gt;" "9"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;Emulate3Buttons&lt;/span&gt;&lt;span class="synConstant"&gt;" "&lt;/span&gt;&lt;span class="synSpecial"&gt;true&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;EmulateWheelButton&lt;/span&gt;&lt;span class="synConstant"&gt;" "8"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;EmulateWheel&lt;/span&gt;&lt;span class="synConstant"&gt;" "&lt;/span&gt;&lt;span class="synSpecial"&gt;true&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;YAxisMapping&lt;/span&gt;&lt;span class="synConstant"&gt;" "4 5"&lt;/span&gt;&#xD;
    &lt;span class="synType"&gt;Option&lt;/span&gt;         &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synIdentifier"&gt;XAxisMapping&lt;/span&gt;&lt;span class="synConstant"&gt;" "6 7"&lt;/span&gt;&#xD;
  &lt;span class="synComment"&gt;# Option    "DragLockButtons" "8"&lt;/span&gt;&#xD;
&lt;span class="synStatement"&gt;EndSection&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&#xD;
これで、右奥のボタンを押しながらボールを転がすことでスクロール可能に。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
加えて Firefox の設定を以下にする(about:config で)と、横スクロールもできるようになる。Firerox 3 だと標準でこの設定になってるっぽい。&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
  &lt;li&gt;mousewheel.horizscroll.withnokey.action = 0&lt;/li&gt;&#xD;
  &lt;li&gt;mousewheel.horizscroll.withnokey.numlines = 1&lt;/li&gt;&#xD;
  &lt;li&gt;mousewheel.horizscroll.withnokey.sysnumlines = true&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
		</content></entry><entry><title type="html">GNOME Do - Gnome 版 QuickSilver 見たいな奴</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/06/1212299777.html" /><category term="gnome" /><category term="linux" /><author><name>◆F99a.q8oVE</name></author><updated>2008-06-01T14:56:17+09:00</updated><id>tag:blog.f99aq8ove.net,2008-06-01:/archive/2008/06/1212299777.html</id><content type="html">&#xD;
			&lt;a href="http://www.flickr.com/photos/11212545@N05/2538132089/" title="GNOME Do by f99aq, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2160/2538132089_9a249ee782_o.png" width="544" height="360" alt="GNOME Do"&gt;&lt;/img&gt;&lt;/a&gt;&#xD;
&lt;p&gt;&#xD;
タイトルどおり、Gnome 版 QuickSilver 見たいな奴 GNOME Do です。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
インストールは↓&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
% sudo aptitude install gnome-do&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
起動は&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
% gnome-do&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
ショートカットキーで起動するようにするといいですね。自分は、C-\で起動するようにしてしています。&#xD;
&lt;/p&gt;&#xD;
		</content></entry><entry><title type="html">Gnome でも mumbles を使って Growl っぽく twitter のつぶやきを表示してみた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/05/1211370550.html" /><category term="twitter" /><category term="gnome" /><category term="mumbles" /><author><name>◆F99a.q8oVE</name></author><updated>2008-05-21T20:49:10+09:00</updated><id>tag:blog.f99aq8ove.net,2008-05-21:/archive/2008/05/1211370550.html</id><content type="html">&#xD;
			&lt;p&gt;&#xD;
Gnome でも Growl っぽく twitter を流し見したいなぁと思っていたところ、mumbles というものをみつけたので Growl のマネをしてみた! という記録です。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
ちなみに、Mac は持ってません。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
まず、mumbles っていうのは DBus 経由で飛んできた通知を、growl っぽく表示する奴です。&#xD;
&lt;a href="http://www.mumbles-project.org/"&gt;mumbles-project.org » mumbles&lt;/a&gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
これを使うと、Pidgin 側の DBus プラグインを有効にすることによって、IM に流れてきたついったったーのつぶやきを growl っぽく表示することができます。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
しかし、標準では twitter から流れてきたつぶやきには Pidgin のアイコンがついて寂しいので、ついったったーのアイコンを表示するパッチを書いてみました。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
&lt;a href="http://www.flickr.com/photos/11212545@N05/2505024755/" title="mumbles pidgin plugin mod by f99aq, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3145/2505024755_73cac62d6f.jpg" width="500" height="400" alt="mumbles pidgin plugin mod"&gt;&lt;/img&gt;&lt;/a&gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
まず、以下から mumbles をダウンロードしてインストールします。&#xD;
&lt;a href="http://www.mumbles-project.org/download/"&gt;mumbles-project.org » Download&lt;/a&gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
で、パッチをダウンロード。&#xD;
&lt;a href="http://www.f99aq8ove.net/file/mumbles_pidgin_twitter.tar.gz"&gt;mumbles_pidgin_twitter.tar.gz&lt;/a&gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
展開したら、pidgin_twitter.patch 内の _twitter_id に twitter の ID と、_twitter_pass に twitter のパスワードを入力してください。パスワードとかは、アイコンの URL をもらってくるときに API を叩くので使います。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
あとは、make &amp;amp;&amp;amp; make install で OK.&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
あと、標準のテーマでは文字がアイコンにかぶってしまうので、こんな感じに /usr/share/mumbles/themes/default/config.xml を改造しています。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synIdentifier"&gt;&amp;lt;mumbles-theme &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;=&lt;span class="synConstant"&gt;'default'&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;version&lt;/span&gt;=&lt;span class="synConstant"&gt;'1.0'&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&#xD;
        &lt;span class="synIdentifier"&gt;&amp;lt;width&amp;gt;&lt;/span&gt;250&lt;span class="synIdentifier"&gt;&amp;lt;/width&amp;gt;&lt;/span&gt;&#xD;
        &lt;span class="synIdentifier"&gt;&amp;lt;height&amp;gt;&lt;/span&gt;80&lt;span class="synIdentifier"&gt;&amp;lt;/height&amp;gt;&lt;/span&gt;&#xD;
        &lt;span class="synIdentifier"&gt;&amp;lt;spacing&amp;gt;&lt;/span&gt;10&lt;span class="synIdentifier"&gt;&amp;lt;/spacing&amp;gt;&lt;/span&gt;&#xD;
        &lt;span class="synIdentifier"&gt;&amp;lt;icon&amp;gt;&lt;/span&gt;&#xD;
                &lt;span class="synIdentifier"&gt;&amp;lt;x_pos&amp;gt;&lt;/span&gt;10&lt;span class="synIdentifier"&gt;&amp;lt;/x_pos&amp;gt;&lt;/span&gt;&#xD;
                &lt;span class="synIdentifier"&gt;&amp;lt;y_pos&amp;gt;&lt;/span&gt;30&lt;span class="synIdentifier"&gt;&amp;lt;/y_pos&amp;gt;&lt;/span&gt;&#xD;
        &lt;span class="synIdentifier"&gt;&amp;lt;/icon&amp;gt;&lt;/span&gt;&#xD;
        &lt;span class="synIdentifier"&gt;&amp;lt;text&amp;gt;&lt;/span&gt;&#xD;
                &lt;span class="synIdentifier"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;font&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;family&amp;gt;&lt;/span&gt;Sans&lt;span class="synIdentifier"&gt;&amp;lt;/family&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;color&amp;gt;&lt;/span&gt;#fff&lt;span class="synIdentifier"&gt;&amp;lt;/color&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;size&amp;gt;&lt;/span&gt;12&lt;span class="synIdentifier"&gt;&amp;lt;/size&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;/font&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;width&amp;gt;&lt;/span&gt;250&lt;span class="synIdentifier"&gt;&amp;lt;/width&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;height&amp;gt;&lt;/span&gt;20&lt;span class="synIdentifier"&gt;&amp;lt;/height&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;padding&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;left&amp;gt;&lt;/span&gt;15&lt;span class="synIdentifier"&gt;&amp;lt;/left&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;right&amp;gt;&lt;/span&gt;5&lt;span class="synIdentifier"&gt;&amp;lt;/right&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;upper&amp;gt;&lt;/span&gt;8&lt;span class="synIdentifier"&gt;&amp;lt;/upper&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;lower&amp;gt;&lt;/span&gt;2&lt;span class="synIdentifier"&gt;&amp;lt;/lower&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;/padding&amp;gt;&lt;/span&gt;&#xD;
                &lt;span class="synIdentifier"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;&#xD;
                &lt;span class="synIdentifier"&gt;&amp;lt;message&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;font&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;family&amp;gt;&lt;/span&gt;Sans&lt;span class="synIdentifier"&gt;&amp;lt;/family&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;color&amp;gt;&lt;/span&gt;#fff&lt;span class="synIdentifier"&gt;&amp;lt;/color&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;size&amp;gt;&lt;/span&gt;8&lt;span class="synIdentifier"&gt;&amp;lt;/size&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;/font&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;width&amp;gt;&lt;/span&gt;250&lt;span class="synIdentifier"&gt;&amp;lt;/width&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;height&amp;gt;&lt;/span&gt;60&lt;span class="synIdentifier"&gt;&amp;lt;/height&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;padding&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;left&amp;gt;&lt;/span&gt;60&lt;span class="synIdentifier"&gt;&amp;lt;/left&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;right&amp;gt;&lt;/span&gt;5&lt;span class="synIdentifier"&gt;&amp;lt;/right&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;upper&amp;gt;&lt;/span&gt;5&lt;span class="synIdentifier"&gt;&amp;lt;/upper&amp;gt;&lt;/span&gt;&#xD;
                                &lt;span class="synIdentifier"&gt;&amp;lt;lower&amp;gt;&lt;/span&gt;5&lt;span class="synIdentifier"&gt;&amp;lt;/lower&amp;gt;&lt;/span&gt;&#xD;
                        &lt;span class="synIdentifier"&gt;&amp;lt;/padding&amp;gt;&lt;/span&gt;&#xD;
                &lt;span class="synIdentifier"&gt;&amp;lt;/message&amp;gt;&lt;/span&gt;&#xD;
        &lt;span class="synIdentifier"&gt;&amp;lt;/text&amp;gt;&lt;/span&gt;&#xD;
&lt;span class="synIdentifier"&gt;&amp;lt;/mumbles-theme&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
		</content></entry><entry><title type="html">Skype version 2.0.0.43 Beta for Linux を入れた</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2008/02/1203253635.html" /><category term="skype" /><author><name>◆F99a.q8oVE</name></author><updated>2008-02-17T22:07:15+09:00</updated><id>tag:blog.f99aq8ove.net,2008-02-17:/archive/2008/02/1203253635.html</id><content type="html">&#xD;
			&lt;p&gt;&#xD;
Skype 2.0.0.43 Beta for Linux が出ていたので入れてみました。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
言語で日本語を選べるようになってました。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
っと、これだけじゃアレなんで、私が使っている Ubuntu (Gutsy)マシンでのインストール方法の説明でも。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
次のリンクから手動でダウンロードしてインストールしてもいいのですが、ここは違う手段でいきましょう。&#xD;
&lt;a href="http://www.skype.com/intl/en/download/skype/linux/beta/"&gt;Download the latest version of Skype for Linux&lt;/a&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;h2&gt;Ubuntu (Gutsy) でのインストール&lt;/h2&gt;&#xD;
&lt;p&gt;&#xD;
&lt;a href="https://help.ubuntu.com/community/Medibuntu"&gt;Medibuntu - Community Ubuntu Documentation&lt;/a&gt;&#xD;
を見ながら、Repository に Medibuntu を加えます。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
具体的には、リンク先に書いてあるように以下で OK.&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
% sudo wget http://www.medibuntu.org/sources.list.d/gutsy.list -O /etc/apt/sources.list.d/medibuntu.list&#xD;
% wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O- | sudo apt-key add - &amp;amp;&amp;amp; sudo apt-get update&#xD;
&lt;/pre&gt;&#xD;
実際のインストールは、&#xD;
&lt;pre&gt;&#xD;
% sudo aptitude install skype&#xD;
&lt;/pre&gt;&#xD;
でできます。&#xD;
&lt;h2&gt;Skype version 2.0.0.43 Beta for Linux Release note 勝手に日本語訳&lt;/h2&gt;&#xD;
&lt;p&gt;&#xD;
ところで、今回のベータ版の変更点なんですが、結構量があります。ちまちま訳してたんですが、力尽きました。&#xD;
とりあえず、貼っておきます。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
&lt;a href="https://developer.skype.com/LinuxSkype/ReleaseNotes"&gt;LinuxSkype/ReleaseNotes - Skype Developer Zone&lt;/a&gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
6.02.2008, Skype version 2.0.0.43 Beta for Linux&#xD;
&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;feature: ビデオコールで X11オーバレイ出力をサポート(Xv 無しで OK)&lt;/li&gt;&#xD;
&lt;li&gt;feature: チャットでハイライト場所への自動スクロール&lt;/li&gt;&#xD;
&lt;li&gt;feature: コンタクトカードの通話ボタンをクリックして押しつづける(ボタンを放さずに1秒ほど)と SkypeOut 用メニュー(自宅電話番号宛とか)を表示&lt;/li&gt;&#xD;
&lt;li&gt;feature: 電話がかかってきて表示されたポップアップの通話ボタンをクリックして押しつづけると、カンファレンスコールに招待できる&lt;/li&gt;&#xD;
&lt;li&gt;feature: コンタクトの追加/検索ボタンを押しつづけると、追加検索のオプションを表示&lt;/li&gt;&#xD;
&lt;li&gt;feature: イベント履歴にチャットのトピックをプリロード&lt;/li&gt;&#xD;
&lt;li&gt;feature: コンタクトの誕生日通知は、誕生日に表示((今までは規則はわかんないけど誕生日とずれて表示されてた)&lt;/li&gt;&#xD;
&lt;li&gt;feature: 日本語、イタリア語、コリアン、Lithuanian, ポルトガル語(ブラジル語), スペイン語、タイ語が使えるように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: API: CHAT CREATE でからのウィンドーを開かないように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: API: CALL コマンドには OK で答えないように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: API: CALL skypenameA, skypenameB で、ちゃんとカンファレンスコールが開始されるように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: ビデオデバイスをすでに存在しないものから変更可能に&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: 1対1のチャットでは、コンタクトカードを常に大きめに表示する用に&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: すでに表示されているチャットウィンドをさらに開こうとすると、それをアクティブに&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: 赤い×印(停止用)をファイル転送が終わったら緑の奴に変更&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: チャットでの検索失敗エラーダイアログは、チャットウィンドの真ん中に表示&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: チャットメンバーリストではキー入力を無効に&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: チャットウィンドーでスクロールバーをクリックしても、インプットエリアからのフォーカスを奪わないように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: ミュート状態をちゃんと表示&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: DBUS のチェックボックスが画面外に行ってたのを修正&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: カンファレンスコールから、カンファレンスコールを招待できないように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: /leave コマンドでは、いちいち確認ダイアログを出さないように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: ファイルパスのスペースが2重にエスケープされていたのを修正&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: 最後のコンタクトカードを閉じても現在のインデックスを残す((?))&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: SkypeOut 番号を追加・変更時に前の番号を消さないように((?))&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: トピック変更時に、エスケープして送信していたのを修正&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: 誕生日通知に年齢は表示しないように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: ホスト以外はカンファレンスコールに新たに人を招待できないように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: 招待ダイアログを&amp;lt;ESC&amp;gt;で閉じるように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: エラーダイアログを&amp;lt;ESC&amp;gt;で閉じるように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: イベント履歴とコンタクトリストを行き来しても、コンタクトリストの表示フィルターをリセットしないように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: ファイル転送をキャンセルしたら、ファイル受信数が更新されてなかったのを修正&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: ボイスメールが失敗またはキャンセルされたときは、コール失敗と表示するように&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: 保留メッセージとスピーキングインジケーターが重なるのを修正&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: [Shift]+[方向キー], [Ctrl]+[方向キー]をメインリストで使ったときの動作を修正&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: PSTN 番号の表示名をすごく短いものに変更するとクラッシュしていたのを修正&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: カンファレンスコールがかかってきたときにクラッシュしていたのを修正&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: SkypeOut ダイアログに短い電話番号を入力するとクラッシュしていたのを修正&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: プロファイルビューアを閉じるときに問題があったのを修正&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Fix for a layout drawing bug in transfer window when adding to expanded transfer groups.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Fix for issues with holding calls and duration continuing&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Fix for listview layout breakage when window is sized at minimum.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Fix for menus appearing below the mouse cursor on buttons.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Fix for tooltips disappearing elsewhere in the client during a call with technical call info enabled.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Fix for topic editing bar remaining open after window switch.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Fix minimum size being invalid in Invite users to chat dialog.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Fix mute button and tooltip in fullscreen video widget.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Fix some memory leaks and crashes related to historical calls.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Fix stray selection area visible after clearing selection in chat.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Hide Video button during a conference call.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: If you hangup on a conference call participant whilst sending them a voicemail, they couldn't be invited again.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Invite user to chat dialog should be centred on the chat.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Listboxes in Options Dialog should stretch.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Maintain avatar background colour during a sending-only video call.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Make Ctrl-Space toggle the selection of the current contact on the contact list.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Make Ctrl-V work when opening Call Ordinary Phones dialog.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Make Speaking indicator a bit more reliable during status changes.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Mouse cursor needs to be updated after moving over a link in chat and using the mouse wheel to scroll.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Numbers in Skype chats open in user's browser instead of calling in Skype.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Open file paths in file browser, not Web browser.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Pasting a new mood message with the middle mouse button wouldn't save.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Prevent empty new events panel bug to do with Calls/Birthdays.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Ringing sound may not stop if inviting an incoming call to a conference call fails.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Remember file transfer window location and size.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Remove 25fps video send limit due to uvc driver fix.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Remove over-complicated contact menu call actions.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Removed 8) B) b) emoticon definitions.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Scrollbar shouldn't be scrollable when the chat window is empty.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Search dialog could be resized below valid minimum size.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Select previous name in Rename Contact when opening dialog.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Sending an empty message to the API could crash the client.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Show contact's name instead of ellipses when shortening chat history.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Show if a 1:1 call is held in the window title.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Turning Auto-Away/NA option off would not save correctly. (#SCL-308)&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Update chat window when message is delivered/undelivered to correctly redraw layout.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Update video preview to new device if applying changes in options dialog.&lt;/li&gt;&#xD;
&lt;li&gt;bugfix: Wrap words correctly in chat input box.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
		</content></entry><entry><title type="html">[C++] template で2進数表記(改)</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2007/10/1192340317.html" /><category term="C++" /><category term="Programming" /><author><name>◆F99a.q8oVE</name></author><updated>2007-10-14T14:38:37+09:00</updated><id>tag:blog.f99aq8ove.net,2007-10-14:/archive/2007/10/1192340317.html</id><content type="html">&#xD;
			&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/h0shu/20071011/p1"&gt;C/C++で2進数値を記述 - きまぎらすほしゅの不定記&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.kmonos.net/wlog/78.html#_1716071011"&gt;d.y.d.&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&#xD;
2進数表記がはやってるみたいですね。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
そこで、テンプレート版を頭に0付けても大丈夫なようにしてみました。ただ、マクロにするとネームスペースからはみ出ちゃうのがちょっとなぁ。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;boost/config.hpp&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synType"&gt;namespace&lt;/span&gt; util {&#xD;
&lt;span class="synType"&gt;template&lt;/span&gt; &amp;lt;&lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;char&lt;/span&gt; x&amp;gt;&#xD;
&lt;span class="synType"&gt;struct&lt;/span&gt; binary_number_check {&#xD;
    &lt;span class="synType"&gt;typedef&lt;/span&gt; binary_number_check&amp;lt;x&amp;gt; self;&#xD;
    &lt;span class="synType"&gt;typedef&lt;/span&gt; &lt;span class="synType"&gt;typename&lt;/span&gt; self::invalid_binary_number error;&#xD;
};&#xD;
&#xD;
&lt;span class="synType"&gt;template&lt;/span&gt; &amp;lt;&amp;gt; &lt;span class="synType"&gt;struct&lt;/span&gt; binary_number_check&amp;lt;&lt;span class="synConstant"&gt;0&lt;/span&gt;&amp;gt; {};&#xD;
&lt;span class="synType"&gt;template&lt;/span&gt; &amp;lt;&amp;gt; &lt;span class="synType"&gt;struct&lt;/span&gt; binary_number_check&amp;lt;&lt;span class="synConstant"&gt;1&lt;/span&gt;&amp;gt; {};&#xD;
&#xD;
&lt;span class="synType"&gt;template&lt;/span&gt; &amp;lt;&lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;long&lt;/span&gt; b&amp;gt;&#xD;
&lt;span class="synType"&gt;struct&lt;/span&gt; binary_number : binary_number_check&amp;lt;b % &lt;span class="synConstant"&gt;8&lt;/span&gt;&amp;gt; {&#xD;
    BOOST_STATIC_CONSTANT(&lt;span class="synType"&gt;int&lt;/span&gt;, value = (binary_number&amp;lt;b / &lt;span class="synConstant"&gt;8&lt;/span&gt;&amp;gt;::value &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;1&lt;/span&gt;) + (b % &lt;span class="synConstant"&gt;8&lt;/span&gt;));&#xD;
};&#xD;
&#xD;
&lt;span class="synType"&gt;template&lt;/span&gt; &amp;lt;&amp;gt;&#xD;
&lt;span class="synType"&gt;struct&lt;/span&gt; binary_number&amp;lt;&lt;span class="synConstant"&gt;0&lt;/span&gt;&amp;gt; {&#xD;
    BOOST_STATIC_CONSTANT(&lt;span class="synType"&gt;int&lt;/span&gt;, value = &lt;span class="synConstant"&gt;0&lt;/span&gt;);&#xD;
};&#xD;
&#xD;
&lt;span class="synPreProc"&gt;#define B(b) binary_number&amp;lt;&lt;/span&gt;&lt;span class="synConstant"&gt;0&lt;/span&gt;&lt;span class="synPreProc"&gt; ## b&amp;gt;::value&lt;/span&gt;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
こんなふうにして使います。&#xD;
&lt;pre&gt;&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;boost/static_assert.hpp&amp;gt;&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;"util/binary.hpp"&lt;/span&gt;&#xD;
&#xD;
&lt;span class="synType"&gt;int&lt;/span&gt; main(&lt;span class="synType"&gt;void&lt;/span&gt;) {&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synConstant"&gt;0&lt;/span&gt;) == &lt;span class="synConstant"&gt;0&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0&lt;/span&gt;) == &lt;span class="synConstant"&gt;0&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synConstant"&gt;1&lt;/span&gt;) == &lt;span class="synConstant"&gt;1&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synConstant"&gt;10&lt;/span&gt;) == &lt;span class="synConstant"&gt;2&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;10&lt;/span&gt;) == &lt;span class="synConstant"&gt;2&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0000100&lt;/span&gt;) == &lt;span class="synConstant"&gt;4&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0001000&lt;/span&gt;) == &lt;span class="synConstant"&gt;8&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0010000&lt;/span&gt;) == &lt;span class="synConstant"&gt;16&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;0100000&lt;/span&gt;) == &lt;span class="synConstant"&gt;32&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synPreProc"&gt;0&lt;/span&gt;&lt;span class="synConstant"&gt;1000000&lt;/span&gt;) == &lt;span class="synConstant"&gt;64&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synConstant"&gt;10000000&lt;/span&gt;) == &lt;span class="synConstant"&gt;128&lt;/span&gt;);&#xD;
    BOOST_STATIC_ASSERT(util::B(&lt;span class="synConstant"&gt;11111111&lt;/span&gt;) == &lt;span class="synConstant"&gt;255&lt;/span&gt;);&#xD;
&#xD;
    &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synConstant"&gt;0&lt;/span&gt;;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
		</content></entry><entry><title type="html">NAS キット CG-NSC4500GT (HDD Bank TERA) 購入、セットアップ記</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2007/09/1189266868.html" /><category term="NAS" /><author><name>◆F99a.q8oVE</name></author><updated>2007-09-09T00:54:28+09:00</updated><id>tag:blog.f99aq8ove.net,2007-09-09:/archive/2007/09/1189266868.html</id><content type="html">&#xD;
			&lt;p&gt;&#xD;
Note PC 購入を機に、Note PC、メイン PC 共通してアクセスできるストレージが欲しいなぁと思い NAS を購入してしまいました。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
どの NAS が良いかと色々悩んでいたところ、デジ埋さんとこ (&lt;a href="http://c-kom.homeip.net/review/blog/archives/2007/07/nfs_promisehdd4.html"&gt;デジモノに埋もれる日々: ホットスワップに NFS 対応まで - Promise から HDD×4台搭載可能な NAS キット&lt;/a&gt;) の記事を見てこれはいいと思い、調べたところ corega が OEM で出してたのでそっちのほうにしました。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
&lt;a href="http://corega.jp/prod/nsc4500gt/"&gt;「CG-NSC4500GT」製品情報| 株式会社コレガ&lt;/a&gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
詳細は、リンク先をご覧いただくとして、NAS キットだから HDD の組み合わせを自分で選べるところが good. で、早速購入。&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;h2&gt;セットアップ&lt;/h2&gt;&#xD;
&lt;p&gt;&#xD;
&lt;a href="http://www.flickr.com/photos/11212545@N05/1345732777/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1308/1345732777_425bac5c5c_m.jpg" width="240" height="180" alt="CG-NSC4500GT"&gt;&lt;/img&gt;&lt;/a&gt;&#xD;
本体の他に、LAN ケーブルと電源ケーブル、HDD 取付用のレール、そして、PC からセットアップする時用の CD-ROM が付属していました。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
画像は携帯電話で撮影したものなんであんまりきれいでないですが、ふた?を開けたところです。&#xD;
&lt;a href="http://www.flickr.com/photos/11212545@N05/1345732797/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1271/1345732797_caa6c100a5_m.jpg" width="180" height="240" alt="CG-NSC4500GT"&gt;&lt;/img&gt;&lt;/a&gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
ここに取り付けるために、HDD にレールを取り付けます。今回は、HDT725032VLA360 (320G SATA300 7200) を2台用意しました。これで、RAID1を構築しようと思います。&#xD;
&lt;a href="http://www.flickr.com/photos/11212545@N05/1345732811/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1288/1345732811_f14345aec2_m.jpg" width="240" height="180" alt="HDT725032VLA360 (320G SATA300 7200) x2"&gt;&lt;/img&gt;&lt;/a&gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
取り付け!&#xD;
&lt;a href="http://www.flickr.com/photos/11212545@N05/1345732831/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1065/1345732831_9bddbf7add_m.jpg" width="240" height="180" alt="CG-NSC4500GT"&gt;&lt;/img&gt;&lt;/a&gt;&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
っと、ここで問題発生。&#xD;
&lt;a href="http://www.flickr.com/photos/11212545@N05/1345732845/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1235/1345732845_557ded5657_m.jpg" width="180" height="240" alt="power cable"&gt;&lt;/img&gt;&lt;/a&gt;&#xD;
プラグが...。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
変換プラグを買ってきて、電源 on!&#xD;
HDD 認識と同時にピーッと鳴って、起動完了です。&#xD;
&lt;a href="http://www.flickr.com/photos/11212545@N05/1345732849/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1199/1345732849_9cc349d927_m.jpg" width="180" height="240" alt="CG-NSC4500GT"&gt;&lt;/img&gt;&lt;/a&gt;&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;h2&gt;Linux マシンから読み書きできるようにする&lt;/h2&gt;&#xD;
&lt;p&gt;&#xD;
Windows から扱う方法は省略して、Linux で mount する方法を書いていきます。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
まず、CG-NSC4500GT 側の設定で適宜ディレクトリを作成し、NFS サービスを有効にします。mount するマシンの IP アドレスを入力して許可をあたえるところがあるのでそこも設定します。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
まぁ、ここで単純にマウントしても良いんですが、いろいろ利点があるので autofs を使ってマウントするようにしてみましょう。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
% sudo aptitude install autofs&#xD;
&lt;/pre&gt;&#xD;
で autofs をインストールして、/etc/auto.master に以下を追記します。&#xD;
&lt;pre&gt;&#xD;
/mnt    /etc/auto.mnt --timeout=600&#xD;
&lt;/pre&gt;&#xD;
CG-NSC4500GT の IP アドレスが192.168.0.3で、MAIN っていうディレクトリを作ってたとして&#xD;
&lt;pre&gt;&#xD;
rhino -fstype=nfs,rw,hard,intr,nosuid,tcp,rsize=32768,wsize=32768 192.168.0.3:/VOLUME1/MAIN&#xD;
&lt;/pre&gt;&#xD;
頭から、"マウントポイント オプション IP アドレス:/ボリューム名/ディレクトリ" です。&#xD;
&lt;p&gt;&#xD;
オプションについては、man mount あたりで調べてください。&#xD;
&lt;/p&gt;&lt;p&gt;&#xD;
なんか、再起動しないといけなかった記憶があるんで再起動すると、/mnt/rhino にアクセスすると自動でマウントされるようになります。&#xD;
&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
% sudo ln -s /mnt/rhino /rhino&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&#xD;
でリンクを貼っとくのが良いかもですね。&#xD;
&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
  &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000TGB4ZA/f99aq-22/ref=nosim"&gt;&lt;img src="http://ec1.images-amazon.com/images/I/11KusbShvbL.jpg" alt="corega 4BAY RAID 対応 LAN 接続ハードディスクケース「HDD Bank TERA」(NAS ディスクレスモデル) corega CG-NSC4500GT" title="corega 4BAY RAID 対応 LAN 接続ハードディスクケース「HDD Bank TERA」(NAS ディスクレスモデル) corega CG-NSC4500GT"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br&gt;&#xD;
  &lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000TGB4ZA/f99aq-22/ref=nosim"&gt;corega 4BAY RAID 対応 LAN 接続ハードディスクケース「HDD Bank TERA」(NAS ディスクレスモデル) corega CG-NSC4500GT&lt;/a&gt;&#xD;
&lt;/div&gt;&#xD;
		</content></entry><entry><title type="html">メールを効率化! - Open subject を使ってみよう with quicktext on thunderbird</title><link rel="alternate" type="text/html" href="http://blog.f99aq8ove.net/archive/2007/08/1186759452.html" /><category term="Thunderbird" /><author><name>◆F99a.q8oVE</name></author><updated>2007-08-11T00:24:12+09:00</updated><id>tag:blog.f99aq8ove.net,2007-08-11:/archive/2007/08/1186759452.html</id><content type="html">&#xD;
			&lt;p&gt;&#xD;
このような記事を読みました。&#xD;
&lt;a href="http://www.itmedia.co.jp/bizid/articles/0708/08/news002.html"&gt;OpenSubject──メールによる会議を可能にする技法 - ITmedia Biz.ID&lt;/a&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
詳しくは直接読んでもらうとして、この記事では、&lt;a href="http://opensubject.pbwiki.com/"&gt;OpenSubject&lt;/a&gt; という、メールの件名にアルファベット 3 文字を付けることで効率化をはかるという提案が紹介されています。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
これは、なかなか面白そうな試みです。&#xD;
ですが、こんなに略語を覚えられそうに無い...ので、Thunderbird の拡張機能 &lt;a href="https://addons.mozilla.org/ja/thunderbird/addon/640"&gt;Quicktext :: Thunderbird Add-ons&lt;/a&gt; でリストを表示するようにしてみました。&#xD;
以下に、スクリーンショットを貼ってみます。&#xD;
&lt;a href="http://www.flickr.com/photos/11212545@N05/1072215784/" title="Open subject on quicktext"&gt;&lt;img src="http://farm2.static.flickr.com/1274/1072215784_bbdf354b3a_o.png" width="755" height="808" alt="Open subject on quicktext"&gt;&lt;/img&gt;&lt;/a&gt;&#xD;
"How About This"をクリックで、"HAT: "が件名として設定されました。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&#xD;
テンプレートをアップロードしましたので、よかったら使ってみてください。&#xD;
&lt;a href="http://www.f99aq8ove.net/arts/etc/open_subject.xml"&gt;http://www.f99aq8ove.net/arts/etc/open_subject.xml&lt;/a&gt;&#xD;
あらかじめ、Thunderbird に Quicktext をインストールした状態で、"ツール -&amp;gt; アドオン"から Quicktext の設定を表示し、インポートボタンでインポート出来ると思います。&#xD;
&lt;/p&gt;&#xD;
		</content></entry></feed>
