<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10titles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>Clouder::Blogger</title>
    <link rel="alternate" type="text/html" href="http://blog.clouder.jp/" />
    
    <id>tag:blog.clouder.jp,2008-11-09://2</id>
    <updated>2009-12-29T10:17:00Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Commercial 4.22-ja</generator>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/clouder" /><feedburner:info uri="clouder" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
    <title>よいプログラマってなんだろう？</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/Bvl6Uk-JeCc/001123.html" />
    <id>tag:blog.clouder.jp,2009://2.1123</id>

    <published>2009-12-29T10:04:14Z</published>
    <updated>2009-12-29T10:17:00Z</updated>

    <summary>なんか急に書いてみようと思い立ちました。 すべてを書ききれてないし、どの会社なのか、なんのプログラマ...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Programmer" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="docs" label="docs" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="programmer" label="programmer" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[なんか急に書いてみようと思い立ちました。<br /><br />

すべてを書ききれてないし、どの会社なのか、なんのプログラマなのか、どんな立場なのか、だれから見てなのかなど多角的に見たら正しくなかったり当てはまらないところもあるかもですが、個人的になんとなく「よいプログラマってなんだろう？」について現時点で思っていることをまとめてみました。<br /><br />

ちなみに、これらは今の時点で思っていることなので、またしばらくしたら変ってくるかもしれません。<br /><br />

<ul>
<li><span style="font-weight: bold;">目的への近道を知っている</span><br />
<ul>
<li>バグってる箇所を効率的に見付ける方法を知っている</li>
<li>目的の実装をする近道を知っている</li>
<li>ターミナルでの操作が早い(我流でもよい)</li>
</ul></li>

<li><span style="font-weight: bold;">広い視野で設計できる</span><br />
<ul>
<li>場当たり的な対応をしない</li>
<li>場当たり的な対応ができる(敢えて)</li>
<li>複数人での開発を意識できる</li>
<li>プログラム・作業量・インフラなどのコストを計算できる</li>
<li>自分の書いたプログラムの影響範囲を把握している</li>
</ul></li>

<li><span style="font-weight: bold;">実装が早い</span><br />
<ul>
<li>無駄な実装をしない</li>
<li>無駄な実装をしてもそれが結果として良い実装に繋がると知っている</li>
<li>とはいっても早けりゃいいってもんじゃない</li>
</ul></li>

<li><span style="font-weight: bold;">トラブル経験が豊富</span><br />
<ul>
<li>経験がものを言う</li>
<li>トラブル時になにを捨てて、なにを残すかの選択ができる</li>
<li>どこでトラブルっているかの把握が早い、見付けるのが早い</li>
</ul></li>

<li><span style="font-weight: bold;">温故知新と温新知故</span><br />
<ul>
<li>古い技術を理解していることで、新しい技術の取捨選択ができる</li>
<li>新しい技術を理解しつつ、古い技術を選択できる</li>
<li>無駄に新しい技術に飛び付かない</li>
</ul></li>

<li><span style="font-weight: bold;">コードが綺麗</span><br />
<ul>
<li>センスが半分(いや半分以上かも...？)</li>
<li>他人のコードを多く読んでいる</li>
<li>無駄なコード(スニペットとか)をいっぱい書いている</li>
</ul></li>

</ul>

人それぞれ思うところはあると思いますが、自分としては現状こんな感じに思っています。
]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001123.html</feedburner:origLink></entry>

<entry>
    <title>Tokyo (Cabinet|Tyrant)でインデックスを張る</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/yhCW07I5v1g/001122.html" />
    <id>tag:blog.clouder.jp,2009://2.1122</id>

    <published>2009-12-25T14:12:08Z</published>
    <updated>2009-12-25T14:55:12Z</updated>

    <summary>最近Tokyo Cabinet(正確にはTokyo Tyrant経由でTokyo Cabinet)の...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Development" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="database" label="database" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tokyocabinet" label="tokyocabinet" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tokyotyrant" label="tokyotyrant" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[最近<a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a>(正確には<a href="http://1978th.net/tokyotyrant/">Tokyo Tyrant</a>経由でTokyo Cabinet)のテーブルデータベースを使っているんですが、どうも検索が遅いなぁと思ったらインデックスを張り忘れてて、Tokyo (Cabinet|Tyrant)でどうやってインデックスを張るのかを調べたので、そのまとめです。<br /><br />

実際にTCのテーブルデータベースでインデックスをどう張るのかというと、foo.tctってDBのnameってカラムにインデックスを張るとすると<br />

<pre class="command">% tctmgr setindex foo.tct name</pre>

ってやればOK。実際には張るインデックスのタイプが選べますが、その辺は<a href="http://1978th.net/tokyocabinet/spex-ja.html">ドキュメント</a>に載っていますのでそちらをご覧ください。<br /><br />

PerlモジュールのTokyoCabinetを使って張る場合は、<br />

<pre class="code">my $tdb = TokyoCabinet::TDB->new;
$tdb->open("foo.tct", $tdb->OWRITER | $tdb->OCREAT);
$tdb->setindex("name", $tdb->ITLEXICAL);</pre>

ってやるだけでOK。<br /><br />

Tokyo Tyrant経由でもTokyoTyrant::RDBTBLにsetindex()って関数があるのでそれでインデックスが張れます。<br /><br />

また、Tokyo Tyrantのttserverでテーブルを指定して起動する際にも<br />

<pre class="command">% ttserver "foo.tct#idx=name:lex"</pre>

って感じにファイル名のあとに指定することもできるみたい。<br />
いろいろな張り方があるんですねぇ。<br /><br />

ちなみインデックスを張るとfoo.tctとは別に「foo.tct.idx.name.lex」ってファイルが出来ます。どうやらここにインデックスが入ってるようです。<br />
ファイル名がどのDBのどのカラムにどんなタイプのインデックスが張られているのか一目瞭然ですね！最後の.lexはインデックスのタイプですね。<br /><br />

で、ここまでわかって思ったのが、これって一度作成したらレコードがputされる毎に更新されるのか、わからなかったのでTokyo Cabinetのソースをみてみたらputされるタイミング(tctdbputimpl())でtctdbidxput()が呼ばれるようなので(両関数ともにtctdb.cの中)、一度作成作成しておけば、あとは勝手に更新されるようだ。<br /><br />

なるほどねぇ。<br />
よくできてるなぁ。<br /><br />
]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001122.html</feedburner:origLink></entry>

<entry>
    <title>Text::MicroTemplateのEmacsのメジャーモード作ったよ</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/PJfLYlIyvgM/001121.html" />
    <id>tag:blog.clouder.jp,2009://2.1121</id>

    <published>2009-12-04T05:39:45Z</published>
    <updated>2009-12-04T09:48:24Z</updated>

    <summary>追記: githubにリポジトリを作りました。 #soozy@freenodeでidコールされてて、...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Emacs" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="emacs" label="emacs" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[追記: <a href="http://github.com/yoshiki/tmt-mode">githubにリポジトリを作りました。</a><br /><br />

#soozy@freenodeでidコールされてて、なにかと思ったらText::MicroTemplateのEmacsのメジャーモードがあったらいいねーみたいな話しだったのでてきとうにでっちあげてみた。<br /><br />

そしたらすぐに<a href="http://d.hatena.ne.jp/IMAKADO/">imakado先生</a>が問題あるところを修正をしてくれました。<br /><br />

imakado++<br /><br />

まだT::MTのパッケージには入れてないですがgithubのリポジトリの権限はもらったので問題なさそうだったら入れさせて頂こうかと思います。<br /><br />

名前はIRCですでに呼ばれてたtmt-modeにしてみた。<br /><br />

<script src="http://gist.github.com/248130.js?file=tmt-mode.el"></script>

]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001121.html</feedburner:origLink></entry>

<entry>
    <title>termcap/terminfoでAlternate Screen Bufferをオフにする方法</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/lNIVMoqG7JE/001120.html" />
    <id>tag:blog.clouder.jp,2009://2.1120</id>

    <published>2009-10-06T05:37:34Z</published>
    <updated>2009-10-06T06:09:16Z</updated>

    <summary>自分はずっと環境変数TERMにvt100を設定していたのですがvt100だとemacsとか使ったとき...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Unix" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="env" label="env" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="term" label="TERM" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="terminfo" label="terminfo" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xtermcolor" label="xterm-color" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[<p>自分はずっと環境変数TERMにvt100を設定していたのですがvt100だとemacsとか使ったときに色が付かないというのがあってここしばらくはxterm-colorを設定していたんです。</p>

<p>でも、xterm-colorだとAlternate Screen Bufferといって、lessやmanやviなどの使用時に使う前の画面状態を覚えておいて、それらが終了したときに元の画面に戻すという機能あって、それがが有効になってしまい、これをどうやったら回避できるのかずっと悩んでいました。</p>

<p>これが有効になってると、直前まで見てたファイルを参考にコマンドを打ったりしたいのにそれが消えてしまい開発効率半減、いや半減以下になってしまうのです(個人的に)。</p>

<p>ということで昨日ずっとその解決法を探していたら、やっとみつけました。</p>

<p><a href="http://slashdot.jp/~doda/journal/438524">http://slashdot.jp/~doda/journal/438524</a></p>

<p><br />
詳しくは上記のページを参照してほしいのですが、やり方としては</p>

<pre class="command">% infocmp &gt; xterm-color.ti</pre>

<p>と、やって現在のterminfoを出力して「rmcup=ふんふん,」と「smcup=ほんほん,」の部分を削除。</p>

<pre class="command">% tic -o $HOME/.terminfo xterm-color.ti</pre>

<p>とやることで、ホームディレクトリに.terminfo/というディレクトリが出き、その中に編集したterminfoの設定が生成されます。</p>

<p>これでいまわしきAlternate Screen BufferがOFFになるというわけです。</p>

<p>ちなみに自分はtermcapの方は設定してませんが今のところ問題ありません。<br />
でも、termcapを見るソフトだとそちらも設定だめかもしれませんね。</p>

<p>もし今後困ったらそっちも設定してみようと思います。</p>

<p><br />
</p>]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001120.html</feedburner:origLink></entry>

<entry>
    <title>YAPC::Asia 2009 2日目</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/hY-TcUZlQKc/001119.html" />
    <id>tag:blog.clouder.jp,2009://2.1119</id>

    <published>2009-09-16T03:39:08Z</published>
    <updated>2009-09-16T06:19:22Z</updated>

    <summary>二日目はちょっと仕事があって午後からの参加になってしまったのですが感想をば。 まずは、見たかったけど...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="yapcasia2009" label="yapcasia2009" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[二日目はちょっと仕事があって午後からの参加になってしまったのですが感想をば。<br /><br /><br />


まずは、見たかったけど時間的に見られなかったものとしては<br /><br />

<ul>
	<li>大規模画像配信を支えるPerl‎(id:kazeburoさん)</li>
	<li>Asynchronous Programming for (A)synchronous Communication‎(id:malaさん)</li>
</ul>

<br />
かなぁ。<br />
他にもいくつかあるけど、その辺はあとで録画を見ようと思います。<br /><br /><br />


次に見たもので印象深いのはYuvalのKiokuDBですね。前々から使おうと思って使ってなかったので、これを機会にちょっといじってみようと思います。<br />

あとはmiyagawaさんの「Remedie: Building a desktop app using Perl, SQLite and jQuery‎」を途中から見たのですが、今までデスクトップアプリは作ったことないんですがなんか作りたくなりました。その時はこれを参考にしようかと思います。<br /><br /><br />


で、最後のLTの感想ですが、yusukebeがあいかわらず面白かったのとtypesterがemacs使おうよって言ってたのが笑えた。emacs好きとしてはtypesterのLTはとても嬉しかったなぁ。ほんとemacsいいのでみんな使いましょうよ。<br /><br /><br />


毎回YAPC::Asiaが終わると思うんだけど、いろいろな刺激を受けるいい機会になってますよね。あーこれ使いたかったんだよねとか、へーこういうことやってる人いるんだとか、そういう人とリアルに話せたりするのはとても重要と感じます。<br /><br />

多くのエンジニアの熱気を空気を肌で感じて、コードを書くモチベーションを上げられて、YAPC::Asiaはとても有意義な場所になってるなぁと思いました。<br /><br /><br />


ちなみに、YAPC::Asia 2009で印象に残ってるトーク以外の話としては下のようなことがありました。<br /><br />

<ul>
        <li>前夜祭で少しだけYAPC::Asia 2009に貢献できた<br />ほんとに少しですが貢献できて嬉しかったです。</li>
	<li>懇親会で<a href="http://fukuoka.pm.org/">Fukuoka.pm</a>、<a href="http://shibuya.pm.org/">Shibuya.pm</a>、<a href="http://yokohama.pm.org/">Yokohama.pm</a>のリーダで集まって話せた<br />機会があったら今度Fukuoka.pmも参加してみたいなぁと思った。</li>
	<li>raflにTシャツのデザインで話し掛けられた<br />来ていたTシャツは下のやつです。<br />どうやらこのTシャツはおとぎ話のものらしく、それについて話をしてたんですが英語がなかなか出てこなく、いろいろ話したいのになかなかコミュニケーションできず悔しい思いをしました。もっと話しておけばよかったなぁと後悔しています。<br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="yapcasia2009_tshirts.jpg" src="http://blog.clouder.jp/archives/images/yapcasia2009_tshirts.jpg" width="375" height="500" class="mt-image-none" style="" /></span></li>
	<li>オライリーさんのガチャガチャで本が当った<br />次の日にZIGOROuさんが、前回の記事を読んで600円(?)すっちゃったYO!と言ってたのが忘れられない。</li>
</ul>

<br /><br />
そんなこんなのYAPC::Asia 2009でした。<br />
いやー楽しかった。<br /><br />
]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001119.html</feedburner:origLink></entry>

<entry>
    <title>YAPC::Asia 2009 1日目</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/Z5Ku4FhR-j0/001118.html" />
    <id>tag:blog.clouder.jp,2009://2.1118</id>

    <published>2009-09-10T16:25:47Z</published>
    <updated>2009-09-10T16:47:24Z</updated>

    <summary>前夜祭のYokohama.pmはそつがなく終わり、ほっとしたのも束の間。 YAPC::Asia 20...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="yapcasia2009" label="yapcasia2009" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[<p>前夜祭のYokohama.pmはそつがなく終わり、ほっとしたのも束の間。<br />
YAPC::Asia 2009 1日目が本日行われました。</p>

<p><br />
いろいろなセッションを見させて頂きましたが、その中でも個人的に面白かったものとしては LT、Ficia、PSGI/Plack、そしてAnyEvent ですかね。</p>

<p><br />
LT以外は単純に自分が知らないものの話ということで大変興味深く聞かせて頂きました。<br />
Ficiaは今迄あまり弄っていないmod_perl2のチューニングや設定うんぬん。PSGI/Plackはこれから期待の内容。AnyEventは今後いろいろと実務でも遊びでも使えそうということで、これからじっくりいじってみようと思いました。</p>

<p><br />
あと懇親会は、去年以上に多くの方とリアルで話すことでいろいろと刺激を受けることができました。<br />
やっぱりこういうのは必要だなぁと思った。</p>

<p><br />
明日は2日目。そして最終日となりますのが今から楽しみです。<br />
といいつつ午前中は参加できないんですけどね...。</p>

<p><br />
あ、あとオライリーさんの販売所の横にあるガチャガチャでバッジが300円でゲットできるということで、やってみたら「当たり」の紙切れがでてきた！</p>

<p><br />
なんとその場にある本の中で好きなものを1冊もらえるというじゃありませんか。</p>

<p><br />
ということで、普段ならば自分ではなかなか買えないであろう「LINUXカーネル」という分厚い本を頂きました！(他の欲しい本はだいたい持っていたというのもありますが...)</p>

<p><br />
オライリーさん太っ腹！<br />
ということで明日はみんなもガチャガチャやったらいいんじゃないでしょうか。</p>

<p><br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="yapcasia2009_oreilly.jpg" src="http://blog.clouder.jp/archives/images/yapcasia2009_oreilly.jpg" width="480" height="853" class="mt-image-none" style="" /></span></p>]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001118.html</feedburner:origLink></entry>

<entry>
    <title>ls ~</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/TelhMR-jcaU/001117.html" />
    <id>tag:blog.clouder.jp,2009://2.1117</id>

    <published>2009-08-28T02:24:17Z</published>
    <updated>2009-08-28T02:24:17Z</updated>

    <summary>Mac OS X 10.5.8 / 1.8GHz Intel Core 2 Duo / Memory...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Unix" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="system" label="System" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="unix" label="Unix" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[Mac OS X 10.5.8 / 1.8GHz Intel Core 2 Duo / Memory 2GB<br /><br />

<pre class="command">% ls ~
Desktop/        Library/        Music/          Sites/          public_html/    work/
Documents/      Mail/           Pictures/       dev/            shipit-dist/
Downloads/      Movies/         Public/         local/          tmp/</pre>

tmpの中はカオスです。
あと仕事系は work/ に、自分で小ネタとかは dev/ に収めてます。

<pre class="command">% ls ~/dev
AppleScript/    apache/         c/              elisp/          github/         quicksilver/
SIMBL/          appengine/      chumby/         flashlite/      iPhoneApp/      ruby/
actionscript/   arduino/        coderepos/      flex/           oauth/
android/        as2/            ec2/            gisty/          perl/</pre>

こっちもややカオスですね。
]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001117.html</feedburner:origLink></entry>

<entry>
    <title>共有メモリと排他処理のメモ</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/EEQkDVe43cE/001116.html" />
    <id>tag:blog.clouder.jp,2009://2.1116</id>

    <published>2009-08-27T04:06:12Z</published>
    <updated>2009-08-27T04:06:59Z</updated>

    <summary>自分用メモ 共有メモリ →複数のプロセスやスレッドから扱うことのできるメモリ空間のこと。本当であれば...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="c" label="C" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="memory" label="Memory" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="programming" label="Programming" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[自分用メモ<br /><br />

<dl>
<dt>共有メモリ</dt>
<dd>→複数のプロセスやスレッドから扱うことのできるメモリ空間のこと。本当であれば後述するsemaphoreやmutexで排他処理をすべきだが、しなくても大丈夫という報告もある。要確認。</dd>

<dt>semaphore(セマフォ)</dt>
<dd>→排他処理のこと。ある処理をする際に、セマフォのフラグを取得したプロセス(又はスレッド)のみが扱うことができるようにする機構で、そのフラグの数は1から設定することが可能。</dd>

<dt>mutex(ミューテックス)</dt>
<dd>→排他処理のこと。簡単に言うと先のセマフォのフラグを1に設定したのと同じ。</dd>
</dl>

]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001116.html</feedburner:origLink></entry>

<entry>
    <title>角丸作り放題なApacheモジュール</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/YqedMKDmy_c/001115.html" />
    <id>tag:blog.clouder.jp,2009://2.1115</id>

    <published>2009-08-26T10:31:19Z</published>
    <updated>2009-08-26T10:31:19Z</updated>

    <summary>mod_rounded_cornersという角丸を生成するための Apacheモジュール(Apach...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Apache" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="apache" label="Apache" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="c" label="C" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[mod_rounded_cornersという角丸を生成するための<br />
Apacheモジュール(Apache2系用)を作りました。<br /><br />

というか会社のなんかのミーティングで誰かが<br />
言ってたので勉強がてら作ってみた。<br /><br />

<a href="http://github.com/yoshiki/mod_rounded_corners/tree/master">http://github.com/yoshiki/mod_rounded_corners/tree/master</a><br /><br />

インストールは下記のようにすればOK。<br /><br />

<pre class="command">% autoconf
% ./configure
% make
# make install</pre>
<br />

設定はhttpd.confに<br /><br />

<pre class="code">&lt;VirtualHost *:80&gt;
ServerName rounded-corners.example.com

&lt;Loction /&gt;
SetHandler rounded-corners
&lt;/Location&gt;
&lt;/VirtualHost&gt;</pre>
<br />

て感じで書けばOK。<br />
今のところはLocationが「/」以外だとうまく動かないよ。<br /><br />

で、Apacheを再起動したら<br /><br />

http://rounded-corners.example.com/ffffff/000000/20.gif<br /><br />

にアクセスすると、bgが黒(000000)でfgが白(ffffff)の<br />
半径20pxのGIF画像が生成されるはず。<br /><br />

これをCSS Spriteでごにょれば角丸なテーブルとかに<br />
使えるような使えないような。<br /><br />

あまり処理速度とか考えずに作ったんですが、<br />
前段にプロキシとかかませてキャッシュしてやれば<br />
ちょっとサイトでも使えなくもない。<br /><br />

Apacheモジュールの練習で作った簡単な物なので<br />
煮くなり焼くなり、ご自由にどうぞ。<br /><br />

TODO:<br />
・bgを透明化できるようにする<br />
・「/」じゃなくても使えるようにする<br />
・blah blah blah<br />
<br />]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001115.html</feedburner:origLink></entry>

<entry>
    <title>最速Android開発環境構築手順</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/dg69hZ80sME/001114.html" />
    <id>tag:blog.clouder.jp,2009://2.1114</id>

    <published>2009-08-26T02:45:26Z</published>
    <updated>2009-08-26T10:43:00Z</updated>

    <summary>Androidの開発環境を構築して、HelloAndroidするまで。   JDK 6、antをイン...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="android" label="Android" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mobile" label="Mobile" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[Androidの開発環境を構築して、HelloAndroidするまで。<br /><br />

<ol>
<li>
  JDK 6、antをインストール<br /><br />
  Mac OS XだとDeveloper Tools入れてると<br />
  Javaとantは既にインストールされてるかも？<br /><br />
  <ul>
    <li>JDK6<br /><a href="http://developer.android.com/sdk/1.5_r3/index.html">http://developer.android.com/sdk/1.5_r3/index.html</a></li>
    <li>ant<br /><a href="http://ant.apache.org/bindownload.cgi">http://ant.apache.org/bindownload.cgi</a></li>
    <li>Android SDK<br /><a href="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</a></li>
  </ul>
  <br />
</li>
<li>
  Android SDKをインストール(といっても解凍して適当な場所に置くだけ)<br /><br />

  以下のようにtools/をPATHに追加(↓はtcsh用のもの)。<br />
  .bashrcとか.tcshrcとかに書いとけばOK。<br />
  あと場合によってはJava用にCLASSPATHの設定が必要かも。<br />
  <pre class="command">% setenv PATH ${PATH}:/path/to/android-sdk-linux_x86-1.5_r3/tools</pre>
  <br />
</li>
<li>
  avdを作成(なんかよくわからんけど、開発環境のプロファイルっぽい)<br /><br />

  なんか聞かれるけど、とりあえずデフォルトの[no]のままでいいのでリターン<br />
  <pre class="command">% android create avd --target 2 --name my_avd
Android 1.5 is a basic Android platform.
Do you wish to create a custom hardware profile [no]
Created AVD 'my_avd' based on Android 1.5</pre><br />
  これで環境は整った。<br />
  <br />
</li>
<li>
  HelloAndroidプロジェクトを作成<br /><br />

  <pre class="command">% android create project --target 2 --path HelloAndroid --activity HelloAndroid --package com.example.helloandroid</pre>
  <br />
</li>
<li>
  なにもコードは付け加えないで、とりあえずantでビルド(デバッグモード)<br /><br />

  <pre class="command">% ant debug
Buildfile: build.xml
      [setup] Project Target: Android 1.5
      [setup] API level: 3

  dirs:
       [echo] Creating output directories if needed...
      [mkdir] Created dir: /path/to/HelloAndroid/bin/classes

  resource-src:
       [echo] Generating R.java / Manifest.java from the resources...

  aidl:
       [echo] Compiling aidl files into Java classes...

  compile:
      [javac] Compiling 2 source files to /path/to/HelloAndroid/bin/classes

  dex:
       [echo] Converting compiled files and external libraries into bin/classes.dex...

  package-resources:
       [echo] Packaging resources
   [aaptexec] Creating full resource package...

  debug:
  [apkbuilder] Creating HelloAndroid-debug.apk and signing it with a debug key...
  [apkbuilder] Using keystore: /home/username/.android/debug.keystore

  BUILD SUCCESSFUL
  Total time: 7 seconds</pre><br />
  最近のマシンだったら数秒でビルドが完了するはず。<br />
  <br />
</li>
<li>
  エミュレーターを起動<br /><br />

  <pre class="command">% emulator -avd my_avd &</pre><br />
  <pre>A N D R O I D _</pre>って画面に出る。<br /><br />

  で、しばらくすると(だいぶ待ちます)、Androidが起動します。<br />
  最終的にデスクトップっぽいのが表示されるまで待つ。<br />
  (マシンによっては5分とかかかりますので辛抱強く待ちます…)<br /><br />

  ちなみに自分はnetbookでやったんですが、ウィンドウの大きさがデカすぎて<br />
  縦が画面から飛び出ちゃったのですが下記のように「-scale」って<br />
  オプションを指定することでウィンドウの大きさを変えられます。<br />
  <pre class="command">% emulator -avd my_avd -scale 0.8 &</pre><br /><br />

  起動するとアラートでるので「Force close」で無視する
  <span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="android_sdk01.png" src="http://blog.clouder.jp/archives/images/android_sdk01.png" class="mt-image-none" style="" /></span><br /><br />
</li>
<li>
  エミュレータ上のAndroidにHelloAndroidをインストール。<br /><br />

  <pre class="command">% adb install bin/HelloAndroid-debug.apk</pre><br /><br />

  HelloAndroidがインストールされた
  <span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="android_sdk02.png" src="http://blog.clouder.jp/archives/images/android_sdk02.png" class="mt-image-none" style="" /></span><br /><br />
</li>
<li>
  あとはAndroid上でアプリ実行すると<br /><br />

  文字が表示された
  <span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="android_sdk03.png" src="http://blog.clouder.jp/archives/images/android_sdk03.png" class="mt-image-none" style="" /></span><br /><br />
</li>
</ol>

エミュレータが激重以外はすんなりここまでできる。<br />
エミュレータだけはどうにかして欲しいです。ほんとに。<br />
]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001114.html</feedburner:origLink></entry>

<entry>
    <title>YAPC::Asia 2009のチケット販売開始</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/cCTIOTSo8Ps/001113.html" />
    <id>tag:blog.clouder.jp,2009://2.1113</id>

    <published>2009-08-07T02:57:14Z</published>
    <updated>2009-08-07T02:57:14Z</updated>

    <summary>YAPC::Asia 2009のチケット販売が開始したようです。 詳しくはこちらをご覧になってみてく...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[YAPC::Asia 2009のチケット販売が開始したようです。<br /><br />

詳しくは<a href="http://conferences.yapcasia.org/ya2009/payment.html">こちら</a>をご覧になってみてください。<br /><br />

受領書に配送先って書いてあるんだけど、<br />
なんか配送されてくるのかしら。<br />

間違って旧住所で購入しちゃったのでちょっとドキドキしている。<br />

]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001113.html</feedburner:origLink></entry>

<entry>
    <title>Android Dev Phone 1を買、えなかった...</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/bJSMboU9yq0/001112.html" />
    <id>tag:blog.clouder.jp,2009://2.1112</id>

    <published>2009-07-22T13:12:32Z</published>
    <updated>2009-07-22T13:19:33Z</updated>

    <summary>こないだikasam_aさんとtypesterとで呑んだんだけど、そんときtypesterがAndr...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Mobile" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="android" label="Android" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="gadget" label="Gadget" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="google" label="Google" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mobile" label="Mobile" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[<p>こないだikasam_aさんとtypesterとで呑んだんだけど、そんときtypesterがAndroidの開発端末のDev Phone 1を持ってた。</p>

<p><br />
ドコモからHT-03Aが出たのでそれを買おうと思ってたんだけど、typesterがDev Phone 1を買ったらいいのにって言うので、いろいろ悩んだあげく買うこと決めた。</p>

<p><br />
で、さっそく今日販売してるページにいったら在庫ぎれで買えなかったorz</p>

<p><br />
でも先日のGoogle Developers Dayの件もあるので、もしかしたらDev Phone 2が出る予兆なのかなと思ったりして。</p>

<p><br />
GDDのHTC Magicだとハードウェアキーボードがないので、できればDev Phone 1がいいんだけどなぁ。いやもしかしたらDev Phone 2はHTC Magicじゃないかもしれないし、と今日はもんもんとしていました。</p>

<p><br />
しばらくは販売ページをウオッチの日々になりそうです。</p>

<p><br />
ということで久々の更新でした。<br />
もうちょっと更新するようにします、はい。<br />
</p>]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001112.html</feedburner:origLink></entry>

<entry>
    <title>vimperatorでLDRからTomblooしたい</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/--Fz7VUis_I/001111.html" />
    <id>tag:blog.clouder.jp,2009://2.1111</id>

    <published>2009-06-04T03:42:06Z</published>
    <updated>2009-06-04T03:49:03Z</updated>

    <summary>最近Firefoxの機能拡張で、vim風な操作でFirefoxを操ることができるvimperator...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Firefox" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ldr" label="LDR" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tombloo" label="Tombloo" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="vimperator" label="vimperator" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[最近Firefoxの機能拡張で、vim風な操作でFirefoxを操ることができる<a href="http://vimperator.org/">vimperator</a>を使い始めました。<br /><br />

で、vimperatorのプラグインをいろいろ入れて楽しんでるのですが、Tomblooをvimperatorから使うのに<a href="http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/trunk/tombloo.js">tombloo.js</a>ってのがあってそれを使ってたのですが、<a href="http://reader.livedoor.com/">LDR</a>からは使えないっぽかったのでLDRから使えるようにしてみました。(もしかしたら他に同じことできるものがあるかも。もしあったら教えてください＞＜)<br /><br />

tombloo.jsはCodeReposにあるので直接変更しちゃおうかとも思ったのですがブランチとか切りづらかったので、ちょっと長いですがここに貼っておきます。<br /><br />

使い方はLDRでフィードを読んでいる時に「:tomblooReader」と打てば候補が出てくるので「Link\ -\ LDR」を選べばアクティブはエントリがクリップできます。ちなみに「:tomblooReader!」でやればTomblooのウィンドウも出せます。<br /><br />

JSは得意ではないので微妙なところがあるかも。<br />
もしあったら修正をお願いします。<br /><br />

<pre class="code">let PLUGIN_INFO =
&lt;VimperatorPlugin&gt;
&lt;name&gt;{NAME}&lt;/name&gt;
&lt;description&gt;Tombloo integrate plugin&lt;/description&gt;
&lt;description lang=&quot;ja&quot;&gt;Tombloo 統合プラグイン&lt;/description&gt;
&lt;author&gt;Trapezoid&lt;/author&gt;
&lt;version&gt;0.1e&lt;/version&gt;
&lt;minVersion&gt;2.0pre&lt;/minVersion&gt;
&lt;maxVersion&gt;2.0pre&lt;/maxVersion&gt;
&lt;updateURL&gt;http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/tombloo.js&lt;/updateURL&gt;
&lt;detail&gt;&lt;![CDATA[

== EX-COMMANDS ==

:tombloo arg:
    post by Tombloo (don't use prompt)

:tombloo! arg:
    post by Tombloo (use prompt)

:tomblooAction arg:
    execute Tombloo's action in tool menu

:tomblooReader arg:
    post by Tombloo on LDR (don't use prompt)

:tomblooReader! arg:
    post by Tombloo on LDR (use prompt)

]]&gt;&lt;/detail&gt;
&lt;detail lang=&quot;ja&quot;&gt;&lt;![CDATA[
== EX-COMMANDS ==

:tombloo arg:
    Tombloo を使って投稿します ( ダイアログは出てきません )

:tombloo! arg:
    Tombloo を使って投稿します ( ダイアログが出てきます )

:tomblooAction arg:
    ツールバーから選択できる Tombloo のメニューを実行します

:tomblooReader arg:
    LDR で Tombloo を使って投稿します ( ダイアログは出てきません )

:tomblooReader! arg:
    LDR で Tombloo を使って投稿します ( ダイアログが出てきます )

]]&gt;&lt;/detail&gt;
&lt;/VimperatorPlugin&gt;;

(function () {

// ts: &quot;T&quot;ombloo &quot;S&quot;ervice
let tomblooService;
try { tomblooService = getTombloo(); }
catch (e) {
    liberator.log(e.message, 0);
    return;
}

with (tomblooService) {

commands.addUserCommand(
    ['tomblooAction'],
    'Execute Tombloo actions',
    function (arg) {
        let f = Tombloo.Service.actions[arg.string];
        (f instanceof Function)
            ? f.execute()
            : liberator.echoerr(arg.string + ' is not Tombloo Action.');
    },
    {
        completer: function (context) {
            context.title = ['Tombloo Actions'];

            let names = Tombloo.Service.actions.names;
            let candidates = [[n, n] for([, n] in Iterator(names))];
            context.completions = candidates.filter(
                function ($_) this.test($_[0]),
                new RegExp(context.filter, 'i')
            );
        },
    }
);

commands.addUserCommand(
    ['tombloo'],
    'Post by Tombloo',
    function (args, special) {
        //let f = Tombloo.Service.extractors[args.string];
        let arg = args.string.replace(/\\(?=\u0020)/g, '');
        liberator.log(args.string, 0);
        liberator.log(arg, 0);

        let f = Tombloo.Service.extractors[arg];
        (typeof f === 'object')
            ? Tombloo.Service.share(getContext(), f, special)
            : liberator.echoerr(args.string + ' is not Tombloo command');
    },
    {
        bang: true,
        completer: function (context) {
            context.title = ['Tombloo'];

            let extensions = Tombloo.Service.check(getContext());
            let candidates = [[e.name, e.name] for ([, e] in Iterator(extensions))];
            context.completions = candidates.filter(
                function($_) this.test($_[0]),
                new RegExp(context.filter, 'i')
            );
        }
    }
);

commands.addUserCommand(
    ['tomblooReader'],
    'Post by Tombloo on LDR',
    function (args, special) {
        let win = content.window.wrappedJSObject;
        let item;
        try {
            item = win.get_active_item(true);
        } catch(e) {
            liberator.echoerr('Use only on LDR');
            return;
        }
        let target = item.element;
        let ctx = getContextOnLDR(target);
        let arg = args.string.replace(/\\(?=\u0020)/g, '');
        liberator.log(args.string, 0);
        liberator.log(arg, 0);

        let f = Tombloo.Service.extractors[arg];
        (typeof f === 'object')
            ? Tombloo.Service.share(ctx, f, special)
            : liberator.echoerr(args.string + ' is not Tombloo command');
    },
    {
        bang: true,
        completer: function (context) {
            context.title = ['TomblooReader'];

            let win = content.window.wrappedJSObject;
            try {
                item = win.get_active_item(true);
            } catch(e) {
                liberator.echoerr('Use only on LDR');
                return;
            }
            let target = item.element;
            let ctx = getContextOnLDR(target);
            let extensions = Tombloo.Service.check(ctx);
            let candidates = [[e.name, e.name] for ([, e] in Iterator(extensions))];
            context.completions = candidates.filter(
                function($_) this.test($_[0]),
                new RegExp(context.filter, 'i')
            );
        }
    }
);

} // with (tomblooService)

// helper ---
function getTombloo() {
    const serviceId = '@brasil.to/tombloo-service;1';

    if (!Cc[serviceId])
        throw new Error('Tombloo is not found. install from http://github.com/to/tombloo/wikis');

    return Cc[serviceId].getService().wrappedJSObject;
}

function getContext() {
    const doc = content.window.document;
    const win = content.window.wrappedJSObject;
    return implant(
        implant(
            {
                document:   doc,
                window:     win,
                title:      doc.title.toString() || '',
                selection:  win.getSelection().toString(),
                target:     doc,
                //event     : event,
                //mouse     : mouse,
                //menu      : gContextMenu,
            },
            {}
        ),
        win.location
    );
}

function getContextOnLDR(target) {
    const doc = content.window.document;
    const win = content.window.wrappedJSObject;
    return implant(
        implant(
            {
                document  : doc,
                window    : win,
                title     : null,
                selection : win.getSelection().toString(),
                target    : target,
            },
            {}
        ),
        win.location
    );
}

// stuff ---
function implant(dst, src, keys){
    if (keys) {
        keys.forEach(function(key) { dst[key] = src[key]; });
    }
    else {
        for (let key in src) dst[key] = src[key];
    }

    return dst;
}

})();

// vim:sw=4 ts=4 et:</pre>]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001111.html</feedburner:origLink></entry>

<entry>
    <title>Apple MailもREINDEXでちょっとだけ速くなる</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/Tyqb1UAwSzs/001110.html" />
    <id>tag:blog.clouder.jp,2009://2.1110</id>

    <published>2009-05-29T15:32:01Z</published>
    <updated>2009-05-29T16:06:08Z</updated>

    <summary>ちょっと前にFirefoxがSQL OptimizerでREINDEXして速くなったと書いたのですが...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Mac" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="apple" label="Apple" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mail" label="Mail" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sqlite" label="SQLite" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[ちょっと前にFirefoxがSQL OptimizerでREINDEXして速くなったと書いたのですが、そういやApple Mailもsqliteだったのを思い出しました。<br /><br />

以前Apple Mailも速度アップのためにVACUUMをしたことはあったのですが、REINDEXはしたことなかったのでさっそく試してみたら、なんか心なしかメールのリスト表示が速くなってる気がします。<br /><br />

まぁ、ある程度のメール量がないと意味ないかもしれませんが。。。<br /><br />

やり方は<br /><br />

<pre class="command">% cd ~/Library/Mail/
% sqlite3 Envelope\ Index
sqlite> REINDEX subjects;</pre><br />

こんな感じでVACUUMするときとほぼ同じ。<br /><br />

自分はこれ以外にmessagesとaddressesもREINDEXしてみました。<br /><br />

まぁ気休めぐらいにしかならないかもしれませんが、Apple Mailが遅くてかなわんというひとはやってみてはいかがでしょうか。]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001110.html</feedburner:origLink></entry>

<entry>
    <title>Proc::InvokeEditorでスクリプトからエディタ起動</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/clouder/~3/eD22EcjwRWY/001109.html" />
    <id>tag:blog.clouder.jp,2009://2.1109</id>

    <published>2009-05-29T03:39:09Z</published>
    <updated>2009-05-29T03:46:11Z</updated>

    <summary>KiokuDBがちょっと前から気になってて、そしたらたまたまid:tokuhiromがブログで使い方...</summary>
    <author>
        <name>clouder</name>
        <uri>http://blog.clouder.jp/</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="editor" label="Editor" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.clouder.jp/">
        <![CDATA[<a href="http://www.iinteractive.com/kiokudb/">KiokuDB<a/>がちょっと前から気になってて、そしたらたまたま<a href="http://d.hatena.ne.jp/tokuhirom/20090528/1243497769">id:tokuhiromがブログで使い方などを書いてた</a>ので、それを見ながら試してみようと思いインストールしていたら、requiredに入ってるProc::InvokeEditorというモジュールが目につきました。なにをするモジュールだろと思って調べてみたら便利そうだったので紹介。<br /><br />

これ、なにをするモジュールかと言うとよくcvsとかsvnとかgitとかでコミットする際に「-m」でコメント指定しないとエディタが開いて編集させたりすると思うんですが、その挙動を簡単に記述できるようになるモジュールです。<br /><br />

<pre class="code">use Proc::InvokeEditor;

my $unedited_text = '元々のテキスト';
my $edited_text = Proc::InvokeEditor->edit($unedited_text);
warn $edited_text; # 編集後のテキスト</pre><br />

こんな感じで、ものすごく簡単にあれと同じ挙動をさせられます。<br /><br />

あと使うエディタは自分で指定することもできるし、環境変数から拾ったりもできるようです。<br /><br />

デフォルトは下のような順番になってますね。<br />

<pre class="code">$ENV{'VISUAL'}, $ENV{'EDITOR'}, '/usr/bin/vi', '/bin/vi', '/bin/ed'</pre><br />

コマンドラインで動かすアプリがあったら今度使ってみようと思った。<br />]]>
        
    </content>
<feedburner:origLink>http://blog.clouder.jp/archives/001109.html</feedburner:origLink></entry>

</feed>
