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

<channel>
	<title>Real Beat &#187; program</title>
	<atom:link href="http://nobu666.com/category/program/feed" rel="self" type="application/rss+xml" />
	<link>http://nobu666.com</link>
	<description>Keep drinking, Keep listening to music, Go fuck yourself</description>
	<lastBuildDate>Mon, 10 May 2010 14:42:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>cmecab-javaとLuceneでMoreLikeThis</title>
		<link>http://nobu666.com/2009/10/07/788.html</link>
		<comments>http://nobu666.com/2009/10/07/788.html#comments</comments>
		<pubDate>Tue, 06 Oct 2009 15:32:04 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>

		<guid isPermaLink="false">http://nobu666.com/?p=788</guid>
		<description><![CDATA[類似検索やりたくて試したんだけどなんかうまくいかねーです。
Lucene詳しいかた、教えてくだしあ＞＜
2009/10/07: 解決したので後ろに追記しました。


package hoge;
import java.i [...]]]></description>
			<content:encoded><![CDATA[<p>類似検索やりたくて試したんだけどなんかうまくいかねーです。<br />
Lucene詳しいかた、教えてくだしあ＞＜</p>
<p><strong>2009/10/07: 解決したので後ろに追記しました。</strong></p>
<p><code>
<pre>
package hoge;
import java.io.*;
import net.moraleboost.lucene.analysis.ja.StandardMeCabAnalyzer;
import org.apache.lucene.*;

public class MeCabTest {
    public static final String DIC_ENCODING = System.getProperty("net.moraleboost.mecab.encoding");
    private static StandardMeCabAnalyzer analyzer = null;
    private static FSDirectory directory = null;
    private IndexWriter writer  = null;
    private static final String DIR = "/path/to/index";

    public void setUp() throws Exception {
        writer  = new IndexWriter(directory, analyzer, new MaxFieldLength(4096));
        Document doc = new Document();
        addField(doc, "text", "ほげほげ");
        ....
        ....
        writer.commit();
        writer.optimize();
        writer.close();
    }
    private void addField(Document doc, String name, String value) throws Exception {
        Field field = new Field(name, value, Store.YES, Field.Index.ANALYZED, Field.TermVector.YES);
        doc.add(field);
        writer.addDocument(doc);
    }

    public static void main(String[] args) {
        MeCabTest t = new MeCabTest();
        IndexSearcher searcher = null;
        IndexReader reader = null;
        analyzer = new StandardMeCabAnalyzer(DIC_ENCODING, "");
        directory = FSDirectory.open(new File(DIR));
        t.setUp();
        reader = IndexReader.open(DIR, false);
        searcher = new IndexSearcher(directory, true);
        QueryParser parser = new QueryParser("text", analyzer);
        parser.setDefaultOperator(QueryParser.Operator.OR);
        MoreLikeThis mlt = new MoreLikeThis(reader);
        mlt.setAnalyzer(analyzer);
        mlt.setMinTermFreq(1);
        mlt.setFieldNames(new String[]{"text"});
        Query query = mlt.like(new ByteArrayInputStream("ほげ".getBytes()));
        TopDocs topDocs = searcher.search(query, 100);
        if (topDocs.totalHits > 0) {
            for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
                Document doc = searcher.doc(scoreDoc.doc);
                System.out.println(doc.get("text"));
            }
        }
    }
}
</pre>
<p></code></p>
<p>try〜catchとか省略。addField(&#8230;);のところ、実際にはニュースサイトから本文引っ張ってきて、いくつかいれた。7個くらい適当に選んで、3個くらいは同じニュース（台風18号関連）を違うサイトから引用した。</p>
<p>MoreLikeThis#like()には、台風18号関連のさらに別のニュースを入れてみたが、topDocs.totalHitsがindexに入れたニュース数と同数、つまり全部ヒットになっちゃった。しかも1件目に入れたやつしか表示されない…なんのこっちゃい??</p>
<p>明日以降もうちょっと調べて、わかったら追記しよう…</p>
<p>[追記]<br />
すげーポカやってるし…。単純にDocumentクラスを使い回しちゃダメってことみたい。そりゃそうだよね、別のDocumentとして扱いたいんだから、インスタンスも別だわな。というわけでaddFieldメソッドにDocument渡すのやめて、メソッド内でDocumentクラスのインスタンスを作るようにしたら、上手く動くようになりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2009/10/07/788.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mixiとblogをそのまま同期させると、del.icio.usのdaily postがmixiでは役立たずになってウザそうだからどうにかする</title>
		<link>http://nobu666.com/2008/04/03/609.html</link>
		<comments>http://nobu666.com/2008/04/03/609.html#comments</comments>
		<pubDate>Thu, 03 Apr 2008 09:27:59 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[gentoo]]></category>
		<category><![CDATA[mhp]]></category>
		<category><![CDATA[plagger]]></category>
		<category><![CDATA[program]]></category>
<category>mixi</category><category>plagger</category>
		<guid isPermaLink="false">http://nobu666.com/2008/04/03/609.html</guid>
		<description><![CDATA[mixiにそのまま投稿しちゃうと、本来リンクじゃないと困るものが、ただのテキストになってしまうわけで。どっちみち携帯から見てる人には無用なエントリになっちゃうし、いっそのことmixiには投稿しないようにしようと。一番てっ [...]]]></description>
			<content:encoded><![CDATA[<p>mixiにそのまま投稿しちゃうと、本来リンクじゃないと困るものが、ただのテキストになってしまうわけで。どっちみち携帯から見てる人には無用なエントリになっちゃうし、いっそのことmixiには投稿しないようにしようと。一番てっとり早いのはP::P::MixiDiary.pm内で、単純にif文でほげほげすることなんだけど。ちょっと気が向いたのでplugin初挑戦してみた。</p>
<p><code>
<pre>
package Plagger::Plugin::Filter::StripDeliciousDailyPost;
use strict;
use base qw( Plagger::Plugin );

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'update.entry.fixup' =&gt; \&amp;filter,
    );
}

sub filter {
    my($self, $context, $args) = @_;

    my $title = $args-&gt;{entry}-&gt;title;
    for my $entry ($args-&gt;{feed}-&gt;entries) {
        if ($entry->title =~ /^links for \d{4}-\d{2}-\d{2}$/i) {
            $context-&gt;log(info =&gt; "Delete Delicious daily post entry " . $entry-&gt;link);
            $args-&gt;{feed}-&gt;delete_entry($entry);
        }
    }
}

1;
__END__
</pre>
<p></code></p>
<p>やはりperlは書き慣れんな。yamlを以下のようにして動作確認。</p>
<p><code>
<pre>
plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://nobu666.com/rss?feed=rss2
  - module: Filter::Rule
    rule:
      module: Deduped
      path: /tmp/blog2mixi.tmp
      compare_body: 1
  - module: Filter::Reverse
  - module: Filter::FindEnclosures
  - module: Filter::FetchEnclosure
    config:
      dir: /tmp/fetch-image
  - module: Filter::FormatText
  - module: Filter::EntryFullText
  - module: Filter::StripDeliciousDailyPost
  - module: Publish::MixiDiary
    config:
      username: メールアドレス
      password: パスワード
      interval: 10
      originally_link: 1
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2008/04/03/609.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpressのformatterがキモいタグを生成するので、どうにかする &#8211; v2.3.3の場合</title>
		<link>http://nobu666.com/2008/02/28/568.html</link>
		<comments>http://nobu666.com/2008/02/28/568.html#comments</comments>
		<pubDate>Thu, 28 Feb 2008 07:45:05 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[memo]]></category>
		<category><![CDATA[program]]></category>
		<category><![CDATA[wordpress]]></category>
<category>memo</category><category>program</category><category>wordpress</category>
		<guid isPermaLink="false">http://nobu666.com/2008/02/28/568.html</guid>
		<description><![CDATA[前回のwordpressのformatterがキモいタグを生成するので、どうにかするはME2.2.3以外でpatchすると、管理画面で激しくwarningが出てエライことになる。ので、v2.3.3用のpatch。

--- www/wp-includes/formatting.php.orig Thu Feb 28 16:37:29 2008
+++ www/wp-includes/formatting.php      Thu Feb 28 16:39:27 2008
@@ -63,7 +63,7 @@
        $pee = $pee . "\n"; // just to make things a little easier, pad the end
        $pee = preg_replace('&#124;&#60;br /&#62;\s*&#60;br  [...]]]></description>
			<content:encoded><![CDATA[<p>前回の<a href="http://nobu666.com/2008/02/22/562.html">wordpressのformatterがキモいタグを生成するので、どうにかする</a>はME2.2.3以外でpatchすると、管理画面で激しくwarningが出てエライことになる。ので、v2.3.3用のpatch。</p>
<p><code><br />
--- www/wp-includes/formatting.php.orig Thu Feb 28 16:37:29 2008<br />
+++ www/wp-includes/formatting.php      Thu Feb 28 16:39:27 2008<br />
@@ -63,7 +63,7 @@<br />
        $pee = $pee . "\n"; // just to make things a little easier, pad the end<br />
        $pee = preg_replace('|&lt;br /&gt;\s*&lt;br /&gt;|', "\n\n", $pee);<br />
        // Space things out a little<br />
-        $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';<br />
+       $allblocks = '(?:code|table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';<br />
        $pee = preg_replace('!(&lt;' . $allblocks . '[^>]*&gt;)!', "\n$1", $pee);<br />
        $pee = preg_replace('!(&lt;/' . $allblocks . '&gt;)!', "$1\n\n", $pee);<br />
        $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines<br />
@@ -88,6 +88,10 @@<br />
        if (strpos($pee, '&lt;pre') !== false)<br />
                $pee = preg_replace_callback('!(&lt;pre.*?&gt;)(.*?)&lt;/pre&gt;!is', 'clean_pre', $pee );<br />
        $pee = preg_replace( "|\n&lt;/p&gt;$|", '&lt;/p&gt;', $pee );<br />
+        $pee = preg_replace('| {4}|', str_repeat(' ',4), $pee);<br />
+        $pee = str_replace('\\', '\\\\', $pee);<br />
+        $pee = preg_replace('|&lt;code&gt;.*?&lt;/code&gt;|se', "str_replace(array('&lt;p&gt;', '&lt;/p&gt;'), array('', '&lt;br /&gt;&lt;br /&gt;'), '$0')", $pee);<br />
+        $pee = StripSlashes($pee);</p>
<p>        return $pee;<br />
 }<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2008/02/28/568.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpressのformatterがキモいタグを生成するので、どうにかする &#8211; ME2.2.3の場合</title>
		<link>http://nobu666.com/2008/02/22/562.html</link>
		<comments>http://nobu666.com/2008/02/22/562.html#comments</comments>
		<pubDate>Fri, 22 Feb 2008 09:36:22 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[memo]]></category>
		<category><![CDATA[program]]></category>
		<category><![CDATA[wordpress]]></category>
<category>memo</category><category>program</category><category>wordpress</category>
		<guid isPermaLink="false">http://nobu666.com/2008/02/22/562.html</guid>
		<description><![CDATA[&#60;p&#62;&#60;/code&#62;&#60;/p&#62;とかいう謎タグが生成されて激しく気持ち悪いので、phpに手を入れる。As You Like It ? Blog Archive ? WordPressのエディタとの付き合い方を参照して、その通りに書き換えるだけ。patchにしとく。

--- formatting.php.org  Fri Feb 22 18:23:52 2008
+++ formatting.php      Fri Feb 22 18:21:16 2008
@@ -55,7 +55,7 @@
        $pee = $pee . "\n"; // just to make things a little easier, pad the end
    [...]]]></description>
			<content:encoded><![CDATA[<p>&lt;p&gt;&lt;/code&gt;&lt;/p&gt;とかいう謎タグが生成されて激しく気持ち悪いので、phpに手を入れる。<a href="http://spring.sakurasaita.net/wordpress/25.html">As You Like It ? Blog Archive ? WordPressのエディタとの付き合い方</a>を参照して、その通りに書き換えるだけ。patchにしとく。</p>
<p><code><br />
--- formatting.php.org  Fri Feb 22 18:23:52 2008<br />
+++ formatting.php      Fri Feb 22 18:21:16 2008<br />
@@ -55,7 +55,7 @@<br />
        $pee = $pee . "\n"; // just to make things a little easier, pad the end<br />
        $pee = preg_replace('|&lt;br /&gt;\s*&lt;br /&gt;|', "\n\n", $pee);<br />
        // Space things out a little<br />
-       $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';<br />
+       $allblocks = '(?:code|table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';<br />
        $pee = preg_replace('!(&lt;' . $allblocks . '[^&gt;]*&gt;)!', "\n$1", $pee);<br />
        $pee = preg_replace('!(&lt;/' . $allblocks . '&gt;)!', "$1\n\n", $pee);<br />
        $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines<br />
@@ -80,6 +80,13 @@<br />
        if (strpos($pee, '&lt;pre') !== false)<br />
                $pee = preg_replace('!(&lt;pre.*?&gt;)(.*?)&lt;/pre&gt;!ise', " stripslashes('$1') .  stripslashes(clean_pre('$2'))  . '&lt;/pre&gt;' ", $pee);<br />
        $pee = preg_replace( "|\n&lt;/p&gt;$|", '&lt;/p&gt;', $pee );<br />
+        $pee = preg_replace('| {4}|', str_repeat('&amp;nbsp;',4), $pee);<br />
+        $pee = str_replace('\\', '\\\\', $pee);<br />
+        $pee = preg_replace(<br />
+            '|&lt;code&gt;.*?&lt;/code&gt;|se'<br />
+            , "str_replace(array('&lt;p&gt;', '&lt;/p&gt;'), array('', '&lt;br /&gt;&lt;br /&gt;'), '$0')"<br />
+            , $pee);<br />
+        $pee = StripSlashes($pee);</p>
<p>        return $pee;<br />
 }<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2008/02/22/562.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQLのHEAPテーブル</title>
		<link>http://nobu666.com/2007/03/28/511.html</link>
		<comments>http://nobu666.com/2007/03/28/511.html#comments</comments>
		<pubDate>Tue, 27 Mar 2007 16:50:56 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[diary]]></category>
		<category><![CDATA[program]]></category>
<category>database</category><category>diary</category><category>mysql</category><category>program</category><category>work</category>
		<guid isPermaLink="false">http://nobu666.com/2007/03/28/000511.html</guid>
		<description><![CDATA[5.0からHEAPテーブルでも可変長レコードがサポートされたのだが（BLOBとTEXTは未サポート）、VARCHARでフィールド作っても固定でメモリを食われている気がする…まだちゃんと調べてないけど。
とりあえず、MyS [...]]]></description>
			<content:encoded><![CDATA[<p>5.0からHEAPテーブルでも可変長レコードがサポートされたのだが（BLOBとTEXTは未サポート）、VARCHARでフィールド作っても固定でメモリを食われている気がする…まだちゃんと調べてないけど。</p>
<p>とりあえず、MySQLのデフォルト文字コードをUTF-8にしている場合、HEAPテーブルを使う際には注意が必要だと言うことはわかった。注意が必要って言うか、要はテーブルとフィールドのデフォルト文字コードに気をつけようって言うだけ。日本語を扱わないのであれば、UTF-8のまま使っているとメモリをかなり喰う。30バイト以内のランダムな文字列 + URL、っていうテーブルをHEAPで使っていたのだが、最初はテーブルの定義をVARCHAR(100) + VARCHAR(2048)とかにしていたら、show table statusするとAvg_row_lengthが5kとかになっていた。それをVARCHAR(30) + VARCHAR(512)に変えると2kくらいに減少。ALTER TABLEでテーブルとフィールドの文字コードをUTF-8からASCIIに変えてあげたら550バイトくらいまで小さくなった。やっぱ日本語が絶対に入らないとわかっているのなら、UTF-8を使うのはメモリ（ディスク）の無駄だ。拡張性はあるんだけど、URLとかidとかはASCIIで済むのだから。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2007/03/28/511.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Development Environment Conferenceに行ってきた</title>
		<link>http://nobu666.com/2006/09/09/364.html</link>
		<comments>http://nobu666.com/2006/09/09/364.html#comments</comments>
		<pubDate>Fri, 08 Sep 2006 15:21:38 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[diary]]></category>
		<category><![CDATA[program]]></category>
<category>diary</category><category>event</category><category>program</category><category>programmer</category><category>report</category><category>summary</category>
		<guid isPermaLink="false">http://nobu666.com/2006/09/09/000364.html</guid>
		<description><![CDATA[Development Environment Conferenceに会社の先輩と二人で行ってきた。12:00に受付開始して12:03で定員に達したとか…俺の受付は12:02だったのでギリだったのかも知れないな。
ってい [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://shibuyajs.org/articles/2006/08/28/development-environment-conference" target="_blank">Development Environment Conference</a>に会社の先輩と二人で行ってきた。12:00に受付開始して12:03で定員に達したとか…俺の受付は12:02だったのでギリだったのかも知れないな。</p>
<p>っていうか受付とか特に何もなくて、紙を2枚もらうだけ。早めに行ったりしてたら、申し込みしてなくても潜り込めたんじゃないのかね…。とは言っても席に余裕がなかったのでアレだが。申し込み時のメールアドレスくらいは聞かれるかと思っていたのだが。</p>
<p>スピーカー陣が超豪華だったのだが、一番のお目当ては<a href="http://ma.la" target="_blank">ma.la氏</a>の<a href="http://www.geocities.co.jp/SiliconValley-Oakland/3617/" target="_blank">萌ディタ</a>話。開発環境の話なのでしないはずがないと踏んでいたのだが、案の定してくれました。変態過ぎる環境で仕事をしておられる様子で、大変素敵です。他の方もスピーチ内容は大体予想通りで、<a href="http://www.gnu.org/software/emacs/emacs.html" target="_blank">emacs</a>とか<a href="http://www.vim.org/" target="_blank">vim</a>とか<a href="http://www.gnu.org/software/screen/" target="_blank">screen</a>とか<a href="http://svk.elixus.org/" target="_blank">svk</a>とか。</p>
<p>以下メモ。</p>
<h4>はてなと私の開発環境 : 伊藤直也氏</h4>
<ul>
<li>zsh+screen+emacs
<ul>
<li>bashは小学生まで</li>
<li>/u/l/b/p が /usr/local/bin/perl に展開されたりするよ</li>
</ul>
</li>
<li>subversion
<ul>
<li>cvsは小学生まで</li>
</ul>
</li>
<li>server.pl</li>
<li>perlsh</li>
</ul>
<p>zshそんなに便利なのか。俺は小学生なのでbashだが。emacsは使いたくないがzshは試そうかな。emacsってデフォルトのキーバインドが変態過ぎて覚える気にならないのよね…しかも大体vimでも同じコトできたりするし。screenは基本すぎるので割愛。</p>
<h4>Agile Web Development with 萌ディタ Reloaded : ma.la氏</h4>
<ul>
<li>ハード
<ul>
<li>20inchワイド縦置きデュアル</li>
<li>HHKLite2</li>
<li>トラックボール</li>
<li>ショートカットキー専用キーボード</li>
</ul>
</li>
<li>ソフト
<ul>
<li>萌ディタ / bluewind / AutoHotKey / 窓使いの憂鬱</li>
</ul>
</li>
<li>RubyはWEBrick動かすためにある</li>
<li>それWEBrickでできるよ、WEBrickでどうやるかは訊いてねぇよ、というやりとりがしたい</li>
<li>それAutoHotKeyで（以下略</li>
<li>window.statusデバッグ / document.titleデバッグ</li>
<li>DebugScreen自分で作ったけど使ってない</li>
<li>IEの気持ちがわかればalertで十分</li>
<li>livedoorは技術者を募集しています</li>
</ul>
<p>萌ディタは自分も開発追っかけて使ってたなぁ。久しぶりにサイト見に行ったら経過報告みたいな文章がアップされててビックリした。いつアップしたのか知らないけど…作者さん死んではいなかったのねｗ</p>
<h4>Windows Environment &amp; Vim : secondlife氏</h4>
<ul>
<li>Windowsスキー &amp;&amp; ゲイツスキー</li>
<li>fub
<ul>
<li>migemoが標準で</li>
</ul>
</li>
<li>窓使いの憂鬱 / bluewind / Avesta / Eijiro / シフトムーブ / kbdacc / migemize explorer / Alt-Tab Replacement / htmlhelp</li>
<li>Vimは至高のエディタである
<ul>
<li>移動は/?*#</li>
<li>最短手順よりも思考速度と手順のバランスで自分にマッチする手順で
<ul>
<li>5wとかしないでwwwwwってやる</li>
</ul>
</li>
<li>httpとかscpとかスキームも開ける</li>
<li>C-a, C-xで数値のインクリメント・デクリメント</li>
<li>earlier, laterで時間軸でのundo, redo</li>
</ul>
</li>
<li>dotfileはsubversionで管理してsymlink</li>
</ul>
<p>scp開けるとか、C-aとかC-xとか知らなかった。text-objectsはなんかさっぱりわからず。難しいよ…</p>
<h4>Binary Hacks in Action : 高林哲氏</h4>
<ul>
<li>straceとかgdbの基本的な話</li>
<li>ソースがなくてもバイナリを直接編集
<ul>
<li>文字列を短くするのは簡単だけど、長くするのは難しい
<ul>
<li>ライブドアをはてなにするのは簡単だけど、はてなをライブドアにするのは難しいよ</li>
</ul>
</li>
</ul>
</li>
<li>Binary Hacksが10月にオライリーから出版されるよ</li>
</ul>
<p>Cやってる（やってた）人には割と当たり前な話だった。ていうか開発環境の話じゃないしｗ あ、Binary Hacksは出たら買います…</p>
<h4>Vox/Plaggerの裏側見せます : 宮川達彦氏</h4>
<ul>
<li>Consolasフォントいいよ</li>
<li>dotfileはsubversionとsymlink</li>
<li>Vox
<ul>
<li>Zen+CentOSで1人ずつバーチャルな環境を持ってる</li>
<li>アプリのインフラはrpmで</li>
</ul>
</li>
<li>Plagger
<ul>
<li>IRCとTrac</li>
<li>Test::Base</li>
<li>DRY</li>
<li>svk</li>
</ul>
</li>
<li>CPAN mini
<ul>
<li>最新版だけローカルにミラーしておく</li>
</ul>
</li>
<li>飛行機の中暇だからwikipediaもローカルに置きたい</li>
<li>Aliasでtypoをフォロー</li>
</ul>
<p>Consolasは是非試す。よさげ。svkもsmerge?試そう。svnのマージはうざい。</p>
<h4>オレポータビリティ : 青木峰朗氏</h4>
<ul>
<li>ヒューマンインターフェースには金をかけたいので良い椅子(でもマウスは\1500)</li>
<li>フルキーボードのテンキーは、使わないのでノコギリで切った</li>
<li>様々なプラットフォーム、様々なOSで計20台が置いてある</li>
<li>極力ソフトはインストールしない、カスタマイズしない
<ul>
<li>Ruby, Cコンパイラ, zsh, 素のvi, CVS</li>
</ul>
</li>
<li>ホームは /usr に合わせて全マシン共通にする
<ul>
<li>ツールの作成が楽になる</li>
</ul>
</li>
</ul>
<p>一杯マシンあったけどSGIはなかったな…</p>
<p>終わったときにはもう22時近かったのでそのまま退散。懇親会とか行きたかったけど(あったのかどうかすら知りませんが)、帰れなくなるので…。しかも晩飯食う時間がなかったので死にそうだった。とはいいつつ、せっかくだから名刺交換くらいしておけば良かったな。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2006/09/09/364.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>otsuneさんのはてなダイアリーを購読してるとPlaggerがこける問題は修正されたっぽ</title>
		<link>http://nobu666.com/2006/09/08/363.html</link>
		<comments>http://nobu666.com/2006/09/08/363.html#comments</comments>
		<pubDate>Fri, 08 Sep 2006 14:38:54 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[plagger]]></category>
		<category><![CDATA[program]]></category>
<category>plagger</category><category>program</category>
		<guid isPermaLink="false">http://nobu666.com/2006/09/08/000363.html</guid>
		<description><![CDATA[otsuneさんのはてなダイアリーを購読してるとPlaggerがこける件、http://plagger.org/trac/changeset/1672修正されていました。単にnullチェック漏れだったっぽい。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://nobu666.com/2006/08/23/000349.html/trackback/">otsuneさんのはてなダイアリーを購読してるとPlaggerがこける</a>件、<a href="http://plagger.org/trac/changeset/1672" target="_blank">http://plagger.org/trac/changeset/1672</a>修正されていました。単にnullチェック漏れだったっぽい。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2006/09/08/363.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>なんかPlagger動いてないと思ったら、otsuneさんのはてなダイアリーを購読してるとPlaggerがこけるっぽい</title>
		<link>http://nobu666.com/2006/08/23/349.html</link>
		<comments>http://nobu666.com/2006/08/23/349.html#comments</comments>
		<pubDate>Tue, 22 Aug 2006 16:15:15 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[plagger]]></category>
		<category><![CDATA[program]]></category>
<category>plagger</category><category>program</category>
		<guid isPermaLink="false">http://nobu666.com/2006/08/23/000349.html</guid>
		<description><![CDATA[なんかgmailが寂しいと思ったので、LogLevelをdebugにして動かしてみたら以下のようになった。

Plagger::Plugin::Subscription::LivedoorReader [info] Yo [...]]]></description>
			<content:encoded><![CDATA[<p>なんかgmailが寂しいと思ったので、LogLevelをdebugにして動かしてみたら以下のようになった。</p>
<p><code><br />
Plagger::Plugin::Subscription::LivedoorReader [info] You have 614 unread item(s) on livedoor Reader.<br />
Plagger [info] plugin Plagger::Plugin::Aggregator::Simple loaded.<br />
Plagger::Plugin::Subscription::LivedoorReader [debug] Logging in to Livedoor Reader<br />
Plagger::Plugin::Subscription::LivedoorReader [debug] get unread items of 1967834<br />
Plagger::Plugin::Subscription::LivedoorReader [debug] get unread items of 2023794<br />
The 'epoch' parameter (undef) to DateTime::from_epoch was an 'undef', which is not one of the allowed types: scalar<br />
 at /home/nobu666/perl/lib/site_perl/5.8.8/i386-freebsd/DateTime.pm line 430<br />
        DateTime::from_epoch('undef', 'epoch', 'undef', 'time_zone', 'local') called at /home/nobu666/perl/lib/site_perl/5.8.8/Plagger/Date.pm line 63<br />
        Plagger::Date::from_epoch('Plagger::Date', 'undef') called at /home/nobu666/perl/lib/site_perl/5.8.8/Plagger/Plugin/Subscription/LivedoorReader.pm line 97<br />
        Plagger::Plugin::Subscription::LivedoorReader::sync('Plagger::Plugin::Subscription::LivedoorReader=HASH(0x8a3d72c)', 'Plagger=HASH(0x87b4d44)', 'HASH(0x901eae0)') called at /home/nobu666/perl/lib/site_perl/5.8.8/Plagger/Plugin/Subscription/LivedoorReader.pm line 58<br />
        Plagger::Plugin::Subscription::LivedoorReader::__ANON__('Plagger=HASH(0x87b4d44)', 'HASH(0x901eae0)') called at /home/nobu666/perl/lib/site_perl/5.8.8/Plagger.pm line 328<br />
        Plagger::run('Plagger=HASH(0x87b4d44)') called at /home/nobu666/perl/lib/site_perl/5.8.8/Plagger.pm line 69<br />
        Plagger::bootstrap('Plagger', 'config', '/home/nobu666/plagger/ldr2gmail.yaml') called at /home/nobu666/perl/bin/plagger line 24</code></p>
<p>日付絡みで落ちているっぽい？2023794はsubscription_idっぽいので、LDRのAPIを http://reader.livedoor.com/api/all?subscribe_id=？2023794 こんな感じで叩いてみた。返ってきたJSON抜粋。</p>
<p><code><br />
{"ads":[{"url":"http://www.gyao.jp/rss/","title":"完全無料パソコンテレビ「GyaO」","description":"番組情報をジャンル別にRSS配信。新着情報をチェックすれば見逃しも防げる！"},{"url":"http://blog.livedoor.com/cgm.html","title":"&#65279;ライブドアのブログ・クチコミ","description":"ウィキ、ソーシャルブックマーク、SNS、写真共有、キーワードすべてあります！"}],"subscribe_id":"？2023794","channel":{"error_count":"0","link":"http://d.hatena.ne.jp/otsune/","description":"import otsune from Hatena","image":null,"title":"import otsune from Hatena","feedlink":"http://d.hatena.ne.jp/otsune/rss","subscribers_count":"178","expires":1156265399},"items":[{"enclosure":null,"link":"http://d.hatena.ne.jp/otsune/99990101/p1","enclosure_type":null,"author":"otsune","body":"","created_on":null,"modified_on":null,"id":"554908","title":"いそいで口で吸え","category":""},{"enclosure":null,"link":"http://d.hatena.ne.jp/otsune/20060821/AsyncMedia","enclosure_type":null,"author":"otsune","body":"\n\t\t&lt;div&gt;\n\t\t\t&lt;p&gt;&lt;a href=\"http://blogpal.seesaa.net/article/22560511.html\"&gt;FIFTH　EDITION: メディア・ゲーム・ネットで進む非同期化&lt;/a&gt;&lt;/p&gt;\n\t\t\t&lt;blockquote&gt;\n\t\t\t&lt;p&gt;すいません。ちょっと分かりにくいところが有るので質問します。&lt;/p&gt;......<br />
</code></p>
<p>長いので途中で省略。「いそいで口で吸え」というエントリでcreated_onとmodified_onがnullなせいでしょうか。投稿日付が9999-01-01になってるのがそもそもの原因なの？よくわからない。Perlわかんねー…勉強せねば。</p>
<p>つーか「いそいで口で吸え」というと、「かんたまがきゆいのです」とか「やんこまりたい」とか「めんたまにきんそれーたむを塗ると、きつにじもちがいい」とか「ポール・マッカートニー取調室の菊池です」とか思い出しました。どうでもいいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2006/08/23/349.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>レンタルサーバにPlaggerをインストール</title>
		<link>http://nobu666.com/2006/08/12/338.html</link>
		<comments>http://nobu666.com/2006/08/12/338.html#comments</comments>
		<pubDate>Sat, 12 Aug 2006 14:45:51 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>

		<guid isPermaLink="false">http://nobu666.com/?p=338</guid>
		<description><![CDATA[最近契約したinetdというレンタルサーバに、Plaggerをインストール。Plaggerはなにかっつーと、要するにmixiとかBloglinesとかLivedoor Readerとかそういうところからデータを持ってきて [...]]]></description>
			<content:encoded><![CDATA[<p>最近契約したinetdというレンタルサーバに、<a href="http://plagger.org/trac">Plagger</a>をインストール。Plaggerはなにかっつーと、要するにmixiとかBloglinesとかLivedoor Readerとかそういうところからデータを持ってきて、何かしら変換して吐き出すためのPerlスクリプト。俺の場合は普段Livedoor Readerを使ってRSSを読んでるので、そっから未読のフィードだけを取ってきてGmailで読めるようにした。ついでにmixiのマイミク新着記事やメッセージも、全部Gmailで読めるように。すばらしい。</p>
<p>Plaggerは依存モジュールがかなり多いので、インストールは結構大変。でもまぁPerl素人な俺でも出来たので、基本的には誰でも出来そうな気がする。手順としては</p>
<p>$ perl -MCPAN -e shell</p>
<p>で、色々質問されるけど全部デフォルトでOK。で</p>
<p>&gt;cpan test Plagger</p>
<p>して依存モジュールがバラバラ出てくるので片っ端からinstallしていくだけ。基本的には<a href="http://capsctrl.que.jp/kdmsnr/diary/20060803.html#p02">http://capsctrl.que.jp/kdmsnr/diary/20060803.html#p02</a>に書いてあるようにすりゃいけるはずなんだけど、そう甘くなかった。とりあえず、</p>
<p>$ perl -MCPAN -e &#8216;CPAN::Shell-&gt;install(CPAN::Shell-&gt;r)&#8217;</p>
<p>で最新にして、あとはエラーが出てるモジュールをシコシコ手動でインストールしたらいけた。</p>
<p>足りないモジュールをメモっておく→1つずつCPAN searchで調べる→tar.gzなファイルをwgetで持ってくる→perl Makefile.PL→gmake→gmake test→gmake install の繰り返し。時間かかったけどとりあえず動くようになった…のでcronでmixiは1時間ごと、フィードは10分ごとに回してる。快適すぎる！つかEntryFullTextプラグインがすごい。del.icio.usのnetwork RSSなんかもオリジナルのサイトへ行って全文取ってきてくれるので非常に便利。やばい。</p>
<p>というわけで、俺のmixiのログイン時間は常に1時間以内になっていると思われ、かつマイミクのみんなのとこには足跡が付きまくっていると思われ…まぁ気にしない方向でお願いします。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2006/08/12/338.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>XSS &#8211; 表示系パラメータに存在する盲点</title>
		<link>http://nobu666.com/2006/08/02/327.html</link>
		<comments>http://nobu666.com/2006/08/02/327.html#comments</comments>
		<pubDate>Wed, 02 Aug 2006 14:44:24 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>program</category><category>security</category><category>web</category>
		<guid isPermaLink="false">http://nobu666.com/?p=327</guid>
		<description><![CDATA[ぼくはまちちゃん！で有名なはまちや２さんのエントリ、XSS &#8211; 表示系パラメータに存在する盲点を見て。
そもそもWebアプリケーションにおいて、表示系だとかユーザからの入力で云々だとか、そんなこととは関係なく [...]]]></description>
			<content:encoded><![CDATA[<p>ぼくはまちちゃん！で有名なはまちや２さんのエントリ、<a href="http://mxxi.hamachiya.com/2006/08/xss_1.html">XSS &#8211; 表示系パラメータに存在する盲点</a>を見て。</p>
<p>そもそもWebアプリケーションにおいて、表示系だとかユーザからの入力で云々だとか、そんなこととは関係なくシステムが扱う外部からの入力では、かつ出力に影響する部分ではすべからくスクリプトの無効化を行うべきでしょう。パラメータ然り、HTTPヘッダ然り。改行コードを削除して、&gt;・&lt;・&#8217;・&#8221;・&amp;・スペースは全部エスケープ。コーディングする人は「それが実際にエスケープする必要があるのかどうか」は考えなくていいようにするべきだ。</p>
<p>たとえばどう考えても数値しか取らない変数hogeと、何が入ってくるのかわからない変数mogeがあったとして、それを出力するときにmogeだけをエスケープするのは間違っている。hogeもmogeも同じように処理するのが正しい。なぜならhogeが数値しか取らないことを確認するためには、ソースコードの他の部分を参照して確認する必要があるからだ。そんなのは時間の無駄。そこだけを見て問題ないことが確認できるようにしておくべき。もちろんエスケープすると想定の動作をしないこともあるわけだが、そんなことは例外。どうしてもタグを出力したいとかいうときだけ、例外的に特定のタグだけ許すようにするべき。</p>
<p>なんでそういうことをちゃんと書いてあるセキュリティ関係の本ってないのかな。あるけど俺が知らないだけ？</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2006/08/02/327.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[MySQL] MyISAMとInnoDB</title>
		<link>http://nobu666.com/2006/07/30/320.html</link>
		<comments>http://nobu666.com/2006/07/30/320.html#comments</comments>
		<pubDate>Sat, 29 Jul 2006 17:15:14 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>column</category><category>database</category><category>mysql</category><category>program</category>
		<guid isPermaLink="false">http://nobu666.com/?p=320</guid>
		<description><![CDATA[今運用している某システム、MyISAMのある難癖によって非常に辛い目に遭っております。それはもちろんテーブルロック。これはもうMyISAMを選択した時点でどうしても避けては通れない道。そこんところ仕組みをちゃんと理解して [...]]]></description>
			<content:encoded><![CDATA[<p>今運用している某システム、MyISAMのある難癖によって非常に辛い目に遭っております。それはもちろんテーブルロック。これはもうMyISAMを選択した時点でどうしても避けては通れない道。そこんところ仕組みをちゃんと理解してないと、MyISAMのほうが速いって言うから選んだのに、なんだよ全然遅いじゃん！っていうか使い物にならないよウワァァァァンみたいなことになりがち。今のシステムでどうやってMyISAMかInnoDBかを分けたのかというと、単純に更新頻度だった。頻繁に更新されるテーブルはInnoDB、そうじゃなければMyISAM。参照が殆どならInnoDBを選択するメリットは何もないと思っていた。が、実は全然そうじゃなかった。</p>
<p>MyISAMが辛いのは、INSERT文実行時にテーブルロックされることもそうだが、時間のかかるSELECT文を実行したときにREADロックされることなんじゃなかろうか。特に業務系のシステムを構築する場合、何かと複雑なSQLを発行せざるを得ない場合がある。それはもちろんテーブル設計を行った者の技量不足や、プログラマの技量不足が原因であることが多いのだが、不可避な理由（例えばクソくだらない出来損ないのコーディング規約など）によってそうせざるを得ない場合も、悲しいかな下っ端風情の一プログラマには良くあることだ。そこを正していくのが本筋だけども、そこはオトナの事情というかまぁ色々あるので以下略（もちろん技量不足が理由の大半なんだろうけども）。</p>
<p>この場合レプリケーションしていたとしても、悲惨な結末を辿る。例えばマスタ1台に対してスレーブを3台用意していたとしよう。普通に考えるとスレーブへの接続はラウンドロビンで順番に割り振ってやるわけだが、あるSQLによって1台のスレーブが長時間テーブルロックするとシステム全体に影響が及んでしまう。アクセス数が多ければ多いほど（というか発行するSELECT文が多ければ多いほど）、ある時間のかかるSQLによってどっかがテーブルロック→ロックしてないスレーブではすぐに結果を返す→単純なラウンドロビンなのでロックしてるスレーブにすぐに順番が回ってくる→ひたすら実行待ちSQLがキューに入る→コネクション使い切る。かと言ってロックを監視して、それによってどのスレーブに接続するかを選択するってのはオーバーヘッドが大きすぎる気が。ロックによる待ち時間よりは全然ましかも知れないけど…</p>
<p>と言うわけで、InnoDBにするかMyISAMにするかは、単純に更新頻度で考えてはいけないことになる。例え参照が大半を占めようとも、ある程度複雑で時間のかかるSQLを投げることが避けられないのならInnoDBにするべきだ。で、InnoDBとMyISAMと共存してるけど、特にInnoDBだからどうこうということはないように思うです。バックアップに関してはレプリケーションしてれば特に問題ないと思うし、気になるとすれば速度とディスク容量でしょうか。結構InnoDBは容量食うので注意が必要。速度に関してはSQLによるとしか言いようがないので、実際に試してみる以外ないかと。<a href="http://d.hatena.ne.jp/naoya/20060729/1154139996">naoyaさんが言っている</a>ような「運用が面倒臭いのは萎える」のは例えばどのようなことを言ってるのかわかりかねますが…俺の中のイメージでは定期的にoptimizeしてあげたりしなくちゃいけない分、MyISAMのほうが運用は面倒なのではと思ったりします。</p>
<p>ちなみにMyISAM の「速い」というのがどう速いのか、という疑問についてはインデックスが絡んでいるのでは?MyISAMは文字列のキーに対してプリフィックス圧縮を行うのに対してInnoDBでは単なるB-Tree。また、InnoDBではINSERTやUPDATEのたびにインデックスの統計情報が最適化されるが、MyISAMではoptimize tableしない限り最適化しない。あとMyISAMはMVCCじゃないので、COUNTがインデックス見ただけで分かるので速い。それ以上はソース読んでないのでわかりませぬ…ちゃんと読んでみようと思いながら怠けてます。</p>
<p>結局のところ俺の中では、単純なSELECT文しか発行しない、かつDELETEやUPDATEが極端に少ないテーブルならMyISAM、それ以外はInnoDB、という結論で落ち着いています。あくまで4.1系の話ですが…5系はInnoDBが極端に遅いという話も聞く（検証はしてない）のでよくわからず。でも5.1からNDB Clusterがオンメンモリじゃなくても動くようになるらしいので、それについては動向をウォッチして行きたい所存。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2006/07/30/320.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[MySQL]optimizeの落とし穴</title>
		<link>http://nobu666.com/2006/07/28/317.html</link>
		<comments>http://nobu666.com/2006/07/28/317.html#comments</comments>
		<pubDate>Thu, 27 Jul 2006 16:47:07 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>database</category><category>mysql</category><category>program</category>
		<guid isPermaLink="false">http://nobu666.com/?p=317</guid>
		<description><![CDATA[MySQLのMyISAM型テーブルは、レコードの追加・削除を繰り返しているとどんどん効率が悪くなっていく。そこで定期的にoptimize tableを発行して統計情報の更新や、インデックスページのソートを行ってやることで [...]]]></description>
			<content:encoded><![CDATA[<p>MySQLのMyISAM型テーブルは、レコードの追加・削除を繰り返しているとどんどん効率が悪くなっていく。そこで定期的にoptimize tableを発行して統計情報の更新や、インデックスページのソートを行ってやることでテーブルの状態を最適化することが出来る。のだが…そこで思いっきり嵌った。</p>
<p>全部のテーブルをoptimizeして、今までslow-logに出ていたあるSQLを実行すると7秒かかっていた処理が1秒かからないまでに実行時間が短縮されたため、効果が出たと喜んでいたのだが。しばらく経って普通にシステムを使ってみると、時折異様に処理が遅いことがある。いままでDBの構成はMaster1+Slave1の２台構成だったのだが、メンテナンスでSlaveを2台増やした。どうも増設したSlaveにアクセスすると重いことがわかった。既存のSlaveと増設Slaveでの違いは、optimizeしたかどうか。optimizeしたSlaveのほうが、ある特定のSQLで200倍も遅くなっていることが判明した…200倍って！</p>
<p>問題になったSQLは、outer joinやunionを使いまくった、一目見ただけでは何をしているのかサッパリわからないほど複雑なSQLだった。保守性を考えれば、そういう複雑なSQLは使わずに、プログラム側でループを使うなりハッシュを使うなりしてわかりやすくするべきだ。しかし今回はあくまで処理速度重視というかアプリサーバとDBサーバ間の通信を極力減らす必要があったため、複雑なSQL1発で済ませなければならない事情があった。</p>
<p>最適化していないDBでは、explainしてみるときちんとインデックスが使われているのに対し、最適化したほうのDBではkeyがnullになっており、あるテーブルがフルスキャンされていた。そのフルスキャンされているテーブルはレコードが100万近く入っており、そりゃ時間かかるわなって話。2000秒以上テーブルロックして（MyISAM型は行ロックではなくテーブルロックがかかる…その間readもwriteも不可）、そのせいでアプリサーバもウェブサーバもコネクション使い切って死ぬ。</p>
<p>結局その問題はforce indexを使うことで無理矢理解決。あるいはstraight joinを使うことでも同様の効果が得られた。たまたま同じデータで最適化したものとしてないものがあったので、explainでどのindexを使えば速くなるのかすぐわかったので助かった…</p>
<p>実際のところforce joinよりもstraight joinのほうが、optimizerが順序を考えなくて済む分若干速いのかな？その辺はちゃんと調べる余裕がなかったので謎。まぁ複雑なクエリを投げるときはoptimizerに頼っちゃダメってことですな…</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2006/07/28/317.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>俺メモ : bashでCSVを扱う</title>
		<link>http://nobu666.com/2006/07/20/309.html</link>
		<comments>http://nobu666.com/2006/07/20/309.html#comments</comments>
		<pubDate>Wed, 19 Jul 2006 17:39:23 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>memo</category><category>program</category><category>shell</category>
		<guid isPermaLink="false">http://nobu666.com/?p=309</guid>
		<description><![CDATA[bashで本格的なCSVを扱うにはPerlなんかを使うほか道はないっぽいけど、ダブルクォート内のカンマは文字列として扱うとか、そういうことを無視して極単純なCSVを扱うだけならbashだけで以下のようにいける。

$ c [...]]]></description>
			<content:encoded><![CDATA[<p>bashで本格的なCSVを扱うにはPerlなんかを使うほか道はないっぽいけど、ダブルクォート内のカンマは文字列として扱うとか、そういうことを無視して極単純なCSVを扱うだけならbashだけで以下のようにいける。</p>
<p><code><br />
$ cat read_csv<br />
IFS=,<br />
while read FILE<br />
do<br />
  set -- $FILE<br />
  echo "field1:" $1 ",field2:" $2<br />
done<br />
$ cat data.csv<br />
aiueo,12345<br />
hogehoge,mogemoge<br />
$ sh ./read_csv &lt; ./data.csv<br />
field1:aiueo,field2:12345<br />
field1:hogehoge,field2:mogemoge<br />
</code></p>
<p>なんかPerlとか使うと負けた気がするのよね…</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2006/07/20/309.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lessとtail -f</title>
		<link>http://nobu666.com/2006/07/17/306.html</link>
		<comments>http://nobu666.com/2006/07/17/306.html#comments</comments>
		<pubDate>Mon, 17 Jul 2006 05:57:13 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>command</category><category>memo</category><category>program</category><category>unix</category>
		<guid isPermaLink="false">http://nobu666.com/?p=306</guid>
		<description><![CDATA[
lessでファイルを開いてshift+f押すとtail -fのように動作する。止めるときはctrl+c
tail -fと同じ動作をする（厳密には微妙に違うが）その名もズバリtailfというコマンドがある

知らなかった [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li>lessでファイルを開いてshift+f押すとtail -fのように動作する。止めるときはctrl+c</li>
<li>tail -fと同じ動作をする（厳密には微妙に違うが）その名もズバリtailfというコマンドがある</li>
</ul>
<p>知らなかった…</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2006/07/17/306.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>j2se5.0から1.4へ</title>
		<link>http://nobu666.com/2005/11/09/227.html</link>
		<comments>http://nobu666.com/2005/11/09/227.html#comments</comments>
		<pubDate>Tue, 08 Nov 2005 16:51:30 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>java</category><category>program</category><category>work</category>
		<guid isPermaLink="false">http://nobu666.com/?p=227</guid>
		<description><![CDATA[新しもの好きの俺的には、仕事にも新しいものをガンガン取り入れて行きたい派。なので、今回のプロジェクトもJavaは5.0、MySQLも5.0ととにかく最新の安定版を使った開発を提案して実践していた。幸いPMも新しもの好きだ [...]]]></description>
			<content:encoded><![CDATA[<p>新しもの好きの俺的には、仕事にも新しいものをガンガン取り入れて行きたい派。なので、今回のプロジェクトもJavaは5.0、MySQLも5.0ととにかく最新の安定版を使った開発を提案して実践していた。幸いPMも新しもの好きだったので、あっさりOK出て良かったのだが。</p>
<p>でも客としてはやはり枯れた技術に拘りたいみたいだ。つか最初に確認したハズなんだが、今更になってJavaは1.4じゃなきゃダメとかいいだして大惨事に。なんとか1日でコンパイルは通るように修正したが、殆ど全部のファイルを修正する羽目になってしまった。</p>
<p>Generics使え、enum使えと口うるさくメンバーに言っていたので、非常に気が重かった…。せめてもの罪滅ぼしに（って俺が悪いわけではないのだが）、2/3ほどひとりで修正してenumもTypesafe Enumパターン使って全部置き換えた。Typesafe Enumは日本語のドキュメントがあまりないのだが、まぁ<a href="http://www.amazon.co.jp/exec/obidos/redirect?link_code=ur2&amp;camp=247&amp;tag=realbeat-22&amp;creative=1211&amp;path=ASIN/4894714361">Effective Java</a><img src="http://www.assoc-amazon.jp/e/ir?t=realbeat-22&amp;l=ur2&amp;o=9" width="1" height="1" border="0" alt="" />読めってことです。</p>
<p>しかしこれ、switch文で使えないのが難点なのよね。Java5.0でも逆コンパイルしてみたら結局if-elseになってた。なにか美しい方法はないのかな……</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2005/11/09/227.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Winnyの技術</title>
		<link>http://nobu666.com/2005/10/10/199.html</link>
		<comments>http://nobu666.com/2005/10/10/199.html#comments</comments>
		<pubDate>Mon, 10 Oct 2005 06:28:15 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>book</category><category>program</category><category>review</category>
		<guid isPermaLink="false">http://nobu666.com/?p=199</guid>
		<description><![CDATA[
買って読んだ。ソースコードは一行も書いてないが、ネットワークに関する深い知識が無くても（基本的な知識さえあれば）普通に読める。ノードの管理方法、クエリやキーの管理方法、暗号化、プロトコルに至るまで、一通りの説明がなされ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4756145485/realbeat-22/ref=nosim/"><img src="http://images-jp.amazon.com/images/P/4756145485.09.TZZZZZZZ.jpg" alt="Winnyの技術" border="0" /></a><br />
買って読んだ。ソースコードは一行も書いてないが、ネットワークに関する深い知識が無くても（基本的な知識さえあれば）普通に読める。ノードの管理方法、クエリやキーの管理方法、暗号化、プロトコルに至るまで、一通りの説明がなされている。これを読んだらWinnyと同等の機能を持ったソフトを作ることも、ある程度の知識がある人ならば可能だろう。</p>
<p>なんか金子勇氏本人が、この書籍をPDF化したものをWinnyに流すとか言っているようだが、興味があるならそんなケチくさいこと言わないで買うべき。説明も凄くわかりやすいので、やっぱこの人は頭がいいのだなぁと改めて思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2005/10/10/199.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AjaxFaces</title>
		<link>http://nobu666.com/2005/07/26/141.html</link>
		<comments>http://nobu666.com/2005/07/26/141.html#comments</comments>
		<pubDate>Mon, 25 Jul 2005 15:34:13 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>ajax</category><category>java</category><category>program</category><category>work</category>
		<guid isPermaLink="false">http://nobu666.com/?p=141</guid>
		<description><![CDATA[JSFでAjaxを簡単に実現 &#8211; AjaxFaces 1.0公開
AjaxはWebのUIにおいては、とても有益な技術というか手法であることは間違いないのだけど、実装が異様に面倒だという点で敬遠していた人も多い [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pcweb.mycom.co.jp/news/2005/06/07/025.html">JSFでAjaxを簡単に実現 &#8211; AjaxFaces 1.0公開</a></p>
<p>AjaxはWebのUIにおいては、とても有益な技術というか手法であることは間違いないのだけど、実装が異様に面倒だという点で敬遠していた人も多いのではないかと思う。なので、こういったツールが出現することは必然ではあったのだけど、吉報ですな。他にも<a href="http://www.getahead.ltd.uk/dwr/index.html">DWR</a>、<a href="http://www.modernmethod.com/sajax/">Sajax</a>なんかがあるけど、選択肢が増えるのはいいことだわ。早速明日にでも、会社で遊んでみようかと。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2005/07/26/141.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RSSリーダー</title>
		<link>http://nobu666.com/2005/07/25/140.html</link>
		<comments>http://nobu666.com/2005/07/25/140.html#comments</comments>
		<pubDate>Mon, 25 Jul 2005 14:34:05 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>feed</category><category>program</category><category>service</category><category>web</category>
		<guid isPermaLink="false">http://nobu666.com/?p=140</guid>
		<description><![CDATA[新しいプロジェクトの絡みで、RSS関連のサービスについてあれこれ調べたり使ってみたりしている。主に調べているのはソフトをダウンロードして、クライアント側で使うRSSリーダーではなく、Web型のもの。で、単なるRSSリーダ [...]]]></description>
			<content:encoded><![CDATA[<p>新しいプロジェクトの絡みで、RSS関連のサービスについてあれこれ調べたり使ってみたりしている。主に調べているのはソフトをダウンロードして、クライアント側で使うRSSリーダーではなく、Web型のもの。で、単なるRSSリーダーではなく、なんらかの付加機能（たとえば今注目されている記事をお勧めしてくれる、とかそんなような機能）の付いているものを調査中。</p>
<p>今日Internet Watchで<a href="http://internet.watch.impress.co.jp/cda/news/2005/07/25/8537.html">紹介</a>されていた<a href="http://feedbringer.net/">FeedBringer</a>、凄い。Alpha版ということで、まだ実装されていない機能があったりするんだけど、使い勝手がいい。個人的にはBloglinesより好きだ。ドラッグ&amp;ドロップ使えるのが新しい感じ。Ajax駆使してますな…</p>
<p><a href="http://www.u-1.net/t/20050725.html#p02">今日も今日とて</a>さんで言及されているが、個人的にありがたいのはフォルダが2階層掘れる点。元々Sageを使っていたんだけど、このOPMLをエクスポートしてBloglinesでインポートしてみたら上手くいかなくて、イラついていたのです。FeedBringerではサックリとインポートできた。</p>
<p>あとはユーザ数が増えたときに、どれだけ安定して動作するかって点が問題か。こればっかりは時間が経ってみたいと評価しようがないのだけど。これからBeta、正式版とバージョンがあがるにつれて、どんなサービスが提供されるのか注目していきたい。</p>
<p>ていうかぶっちゃけた話、非常においしいタイミングで出てきてくれたサービスなんだな。今、某所某プロジェクトの企画書書いてる段階なんだけど、ガッツリ参考にさせてもらいますよｗ</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2005/07/25/140.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最近の興味はXUL</title>
		<link>http://nobu666.com/2005/05/24/137.html</link>
		<comments>http://nobu666.com/2005/05/24/137.html#comments</comments>
		<pubDate>Mon, 23 May 2005 16:12:17 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>program</category><category>xul</category>
		<guid isPermaLink="false">http://nobu666.com/?p=137</guid>
		<description><![CDATA[Firefoxのプラグインとして、とあるものを作りたいと思っている。あまり受けそうなものではないが、少なくともうちの会社の人はあれば便利と思ってくれるものになる……予定ｗ
以下、参考になりそうなとこ。

XUL Wiki [...]]]></description>
			<content:encoded><![CDATA[<p>Firefoxのプラグインとして、とあるものを作りたいと思っている。あまり受けそうなものではないが、少なくともうちの会社の人はあれば便利と思ってくれるものになる……予定ｗ</p>
<p>以下、参考になりそうなとこ。</p>
<ul>
<li><a href="http://wiki.fdiary.net/xul/">XUL Wiki</a></li>
<li><a href="http://xul-app.hp.infoseek.co.jp/">XUL研</a></li>
<li><a href="http://www.mozilla-japan.org/catalog/architecture/xul/">Mozilla 資料集: コアアーキテクチャ: XUL</a></li>
<li><a href="http://roachfiend.com/">roachfiend.com</a></li>
</ul>
<p>その絡みで@ITの連載、<a href="http://www.atmarkit.co.jp/fxml/rensai2/xmltool01/01.html">役に立つXMLツール集</a>も一通り目を通したい。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2005/05/24/137.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>あれこれポップアップ</title>
		<link>http://nobu666.com/2004/09/06/127.html</link>
		<comments>http://nobu666.com/2004/09/06/127.html#comments</comments>
		<pubDate>Mon, 06 Sep 2004 13:33:14 +0000</pubDate>
		<dc:creator>nobu</dc:creator>
				<category><![CDATA[program]]></category>
<category>blog</category><category>diary</category><category>program</category>
		<guid isPermaLink="false">http://nobu666.com/?p=127</guid>
		<description><![CDATA[リンクなんかにカーソルをあわせた時に、ポップアップウィンドウで情報を表示させるようにあれこれポップアップを入れてみた。便利だし、なかなか&#65398;&#65402;&#65394;&#65394;ではないか。

でも [...]]]></description>
			<content:encoded><![CDATA[<p>リンクなんかにカーソルをあわせた時に、ポップアップウィンドウで情報を表示させるように<a href="http://www.remus.dti.ne.jp/~a-satomi/bunsyorou/ArekorePopup.html" title="あれこれポップアップ">あれこれポップアップ</a>を入れてみた。便利だし、なかなか&#65398;&#65402;&#65394;&#65394;ではないか。<br />
<span id="more-127"></span><br />
でもどうしても「見難い」とか「ウゼー」って人は、<a href="http://www.remus.dti.ne.jp/~a-satomi/bunsyorou/ArekorePopup.html#userFAQ" title="適用サイト利用者向け FAQ">適用サイト利用者向け FAQ</a>を参考に。ポップアップを止める方法が書かれているので。</p>
]]></content:encoded>
			<wfw:commentRss>http://nobu666.com/2004/09/06/127.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
