<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="http://blog.xole.net/rss/style.css" type="text/css"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:content="http://purl.org/rss/1.0/modules/content/"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         xml:lang="ja">
<channel rdf:about="http://blog.xole.net/rss/recent.php">
<title>ハタさんのブログ(復刻版)</title>
<link>http://blog.xole.net/index.php</link>
<dc:date>2010-04-07T01:09:29+09:00</dc:date>
<description>
ハタさんのブログ(復刻版) - RSS (RDF Site Summary) Feed.
</description>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://blog.xole.net/article.php?id=757" />
<rdf:li rdf:resource="http://blog.xole.net/article.php?id=756" />
<rdf:li rdf:resource="http://blog.xole.net/article.php?id=755" />
<rdf:li rdf:resource="http://blog.xole.net/article.php?id=754" />
<rdf:li rdf:resource="http://blog.xole.net/article.php?id=753" />
<rdf:li rdf:resource="http://blog.xole.net/article.php?id=752" />
<rdf:li rdf:resource="http://blog.xole.net/article.php?id=751" />
<rdf:li rdf:resource="http://blog.xole.net/article.php?id=750" />
<rdf:li rdf:resource="http://blog.xole.net/article.php?id=749" />
<rdf:li rdf:resource="http://blog.xole.net/article.php?id=748" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://blog.xole.net/article.php?id=757">
<title>SVG で横書きの文字のまま、タテに表示</title>
<link>http://blog.xole.net/article.php?id=757</link>
<dc:date>2010-04-07T01:09:29+09:00</dc:date>
<description>
前回の続きです

横書きに表示されている文字をタテに表示するというのを挑戦してます。
今回は SVG を利用しているので、ほぼ全てが座標で表現されます。
こんな感じ↓



ブラウザで座標を考える場合 (0, 0) が左上に...</description>
<content:encoded>
<![CDATA[
<p>
<a href="http://blog.xole.net/article.php?id=756">前回</a>の続きです</p>

<p>横書きに表示されている文字をタテに表示するというのを挑戦してます。<br />
今回は SVG を利用しているので、ほぼ全てが座標で表現されます。<br />
こんな感じ↓<br />
<img src="http://blog.xole.net/resources/point_0.jpg" />
</p>

<p>ブラウザで座標を考える場合 (0, 0) が左上になり、それよりも外側はブラウザの表示の外になります。<br />
<img src="http://blog.xole.net/resources/point_1.jpg" />
</p>

<p>そこで、「美しい日本語」という文字列を (0, 0) からレンダリングするとこんな感じになります。<br />
<img src="http://blog.xole.net/resources/point_2.jpg" />
</p>

<p>単純に考えれば、この文字列を 90° 垂直に回転 させれば、タテに表示されそうですがそうもいきません。<br />
文字列を (0, 0) にレンダリングしてしまったので、そのまま回転させてしまうと、画面の外に出てしまいます。<br />
<img src="http://blog.xole.net/resources/point_4.jpg" />
</p>

<p>ちなみに、SVG の回転は <a href="http://www.w3.org/TR/SVG11/coords.html#TransformAttribute">transform(rotate)</a> を使うんですが、rotateの引数に rotate(rangle, cx, cy) と X座標(cx) と Y座標(cy) の回転位置を指定できるので、この引数を使い回転位置を調整します。<br />
<img src="http://blog.xole.net/resources/point_3.jpg" />
</p>

<p>これで、回転位置を調整する事で無事表示領域内に文字列をタテに表示できるようになります。<br />
<img src="http://blog.xole.net/resources/point_2_1.png" />
</p>

<p>(中略)</p>

<p>ということで、この SVG を使った実装を <a href="http://figit.net/">Figit</a> に実装してみた。(CSSと合わせて左側にくっついてきます)<br />
残念ながら、SVG をサポートしていない IE と 文字の rotate が上手くいかない Opera はちゃんと表示されません...。<br />
Firefox や Webkit系(Safari, Chrome) などはちゃんと↓のように表示されているハズ...。(たぶん iPhone/Androidも大丈夫だと思う)<br />
<a href="http://blog.xole.net/resources/figit_20100406.png">
<img src="http://blog.xole.net/resources/figit_20100406_thumb.png" />
</a>
</p>

<p>今回利用したソースは http://figit.net/js/pig.svg.js にもあるけど、ここにも一応書いておこう</p>

<pre class="javascript">
<span class="keyword" >if</span>(<span class="keyword" >typeof</span> Pig == <span class="string" >'undefined'</span>){
  <span class="keyword" >var</span> Pig = {};
}
Pig.SVG = {
  namespace: <span class="string" >'http://www.w3.org/2000/svg'</span>,
  create: <span class="keyword" >function</span>(tagName, attributes){
    attributes = attributes || {};
    <span class="keyword" >var</span> tag = document.createElementNS(Pig.SVG.namespace, tagName);
    Element.writeAttribute(tag, attributes);
    <span class="keyword" >return</span> tag;
  },
  createSVG: <span class="keyword" >function</span> (attribtues){
    <span class="keyword" >return</span> <span class="keyword" >this</span>.create(<span class="string" >'svg'</span>, attribtues);
  },
  createRect: <span class="keyword" >function</span> (attributes){
    <span class="keyword" >return</span> <span class="keyword" >this</span>.create(<span class="string" >'rect'</span>, attributes);
  },
  createText: <span class="keyword" >function</span> (attributes){
    <span class="keyword" >return</span> <span class="keyword" >this</span>.create(<span class="string" >'text'</span>, attributes);
  }
};
Pig.SVG.VarticalBox = Class.create({
  initialize: <span class="keyword" >function</span> (){
    <span class="keyword" >var</span> fontSize = document.body.getStyle(<span class="string" >'fontSize'</span>);
    <span class="keyword" >this</span>.fontSize = parseInt(fontSize);
  },
  create: <span class="keyword" >function</span>(_str, _style){
    <span class="keyword" >var</span> fontSize = <span class="keyword" >this</span>.fontSize;
    <span class="keyword" >var</span> strLength = _str.length;
    
    <span class="keyword" >var</span> chars = _str.toArray();
    <span class="keyword" >var</span> textLength = 0;
    <span class="keyword" >for</span>(<span class="keyword" >var</span> i = 0; i &lt; chars.length; ++i){
      <span class="keyword" >var</span> ch = chars[i];
      <span class="comment" >// isAscii</span>
      <span class="keyword" >if</span>(ch == escape(ch)){
        textLength += 0.5;
      } <span class="keyword" >else</span> {
        textLength += 1;
      }
    }
    
    <span class="comment" >// textLength + 2em(paddig-left: 1em, padding-right: 1em)</span>
    <span class="keyword" >var</span> rectWidth = (textLength * (fontSize)) + (fontSize + fontSize);
    <span class="keyword" >var</span> rectHeight = fontSize * 3;
    <span class="keyword" >var</span> halfRectHeight = rectHeight / 2;
    <span class="keyword" >var</span> halfRectWidth = rectWidth / 2;
    
    <span class="keyword" >var</span> style = Object.extend({
      <span class="string" >'backgroundColor'</span>: <span class="string" >'#ddd'</span>,
      <span class="string" >'borderColor'</span>: <span class="string" >'#333'</span>,
      <span class="string" >'opacity'</span>: 0.3,
      <span class="string" >'color'</span>: <span class="string" >'#333'</span>,
      <span class="string" >'fontFamily'</span>: <span class="string" >'sans-serif'</span>
    }, _style || {});
    
    <span class="keyword" >var</span> rect = Pig.SVG.createRect({
      <span class="string" >'x'</span>: rectHeight,
      <span class="string" >'y'</span>: 0,
      <span class="string" >'width'</span>: rectWidth,
      <span class="string" >'height'</span>: rectHeight,
      <span class="string" >'fill'</span>: style.backgroundColor,
      <span class="string" >'opacity'</span>: style.opacity,
      <span class="string" >'stroke'</span>: style.borderColor,
      <span class="string" >'transform'</span>: <span class="string" >'rotate(90, '</span> + rectHeight + <span class="string" >', 0)'</span>
    });
    <span class="keyword" >var</span> text = Pig.SVG.createText({
      <span class="string" >'x'</span>: halfRectHeight,
      <span class="string" >'y'</span>: halfRectWidth,
      <span class="string" >'fill'</span>: style.color,
      <span class="string" >'font-family'</span>: style.fontFamily,
      <span class="string" >'writing-mode'</span>: <span class="string" >'tb-rl'</span>,
      <span class="string" >'glyph-orientation-vertica'</span>: <span class="string" >'90'</span>,
      <span class="string" >'text-anchor'</span>: <span class="string" >'middle'</span>,
      <span class="string" >'alignment-baseline'</span>: <span class="string" >'central'</span>,
      <span class="string" >'dominant-baseline'</span>: <span class="string" >'central'</span>,
      <span class="string" >'transform'</span>: <span class="string" >'rotate(90, '</span> + halfRectHeight + <span class="string" >', '</span> +  halfRectWidth + <span class="string" >')'</span>
    });
    text.textContent = _str;

    <span class="keyword" >var</span> svg = Pig.SVG.createSVG({
      <span class="string" >'width'</span>: rectHeight,
      <span class="string" >'height'</span>: rectWidth
    });
    svg.appendChild(rect);
    svg.appendChild(text);
    <span class="keyword" >return</span> svg;
  }
});
</pre>

<p>ということで、今後とも <a href="http://figit.net/">Figit</a> に色々のっけていきます</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.xole.net/article.php?id=756">
<title>横書きのままタテに表示するアレ</title>
<link>http://blog.xole.net/article.php?id=756</link>
<dc:date>2010-03-29T23:52:54+09:00</dc:date>
<description>最近よく見かけるようになった、スクロールバーのとこにくっついてくるアレ




(follow me とか)


(feedback とか)

問題は、これがスクロールについてくることじゃなくて、横書きなのに、縦に表示されてい...</description>
<content:encoded>
<![CDATA[
<p>最近よく見かけるようになった、スクロールバーのとこにくっついてくるアレ</p>

<p>
<img src="http://blog.xole.net/resources/follow_me.jpg" />
<br />
(follow me とか)<br />
<img src="http://blog.xole.net/resources/feedback.jpg" />
<br />
(feedback とか)</p>

<p>問題は、これがスクロールについてくることじゃなくて、横書きなのに、縦に表示されているってこと。<br />
これ、どうやるんだろう...。</p>

<p>(中略)</p>

<p>やっぱここは流行りのSVGだよね。ってことで、やってみた(注:Firefox,Chrome以外動かないと思う)<br />
ref - <a href="http://xole.net/svg.html">http://xole.net/svg.html</a>
<a href="http://xole.net/svg.html">
<img src="http://blog.xole.net/resources/hello_world.jpg" />
</a>
</p>

<p>横書きのままタテに表示されるようになったけど、リンクが動かない...。<br />
しょうがないので、onclickで逃げる。<br />
ソースは↓</p>

<pre class="javascript">(<span class="keyword" >function</span> (){
    <span class="keyword" >var</span> anchor = <span class="keyword" >function</span> (href, str){
        <span class="keyword" >var</span> svg = document.createElementNS(<span class="string" >'http://www.w3.org/2000/svg'</span>, <span class="string" >'svg'</span>);
        svg.setAttribute(<span class="string" >'width'</span>, 300);
        svg.setAttribute(<span class="string" >'height'</span>, 200);

        <span class="keyword" >var</span> rect = document.createElementNS(<span class="string" >'http://www.w3.org/2000/svg'</span>, <span class="string" >'rect'</span>);
        rect.setAttribute(<span class="string" >'x'</span>, 0);
        rect.setAttribute(<span class="string" >'y'</span>, 0);
        rect.setAttribute(<span class="string" >'width'</span>, 200);
        rect.setAttribute(<span class="string" >'height'</span>, 50);
        rect.setAttribute(<span class="string" >'fill'</span>, <span class="string" >'#ccc'</span>);
        rect.setAttribute(<span class="string" >'opacity'</span>, 0.3);
        rect.setAttribute(<span class="string" >'stroke'</span>, <span class="string" >'#333'</span>);

        <span class="keyword" >var</span> text = document.createElementNS(<span class="string" >'http://www.w3.org/2000/svg'</span>, <span class="string" >'text'</span>);
        text.setAttribute(<span class="string" >'x'</span>, 50);
        text.setAttribute(<span class="string" >'y'</span>, 30);
        text.setAttribute(<span class="string" >'writing-mode'</span>, <span class="string" >'tb-rl'</span>);
        text.setAttribute(<span class="string" >'glyph-orientation-vertica'</span>, <span class="string" >'90'</span>);
        text.setAttribute(<span class="string" >'fill'</span>, <span class="string" >'#333'</span>);
        text.setAttribute(<span class="string" >'transform'</span>, <span class="string" >'rotate(90, 90, 90)'</span>);
        text.textContent = str;
        text.onclick = <span class="keyword" >function</span>(){location.href = href};

        text.appendChild(rect);
        svg.appendChild(text);

        <span class="comment" >//</span>
        svg.style.display = <span class="string" >'block'</span>;
        <span class="keyword" >return</span> svg;
    };

    <span class="keyword" >var</span> element = document.createElement(<span class="string" >'div'</span>);
    element.style.position = <span class="string" >'absolute'</span>;
    element.style.left = 0;
    element.style.padding = 0;

    element.appendChild(anchor(<span class="string" >'http://www.google.co.jp/'</span>, <span class="string" >'こんにちは!'</span>));
    element.appendChild(anchor(<span class="string" >'http://www.google.com/'</span>, <span class="string" >'hello world'</span>));
    document.body.appendChild(element);
})();
</pre>

<p>他にいい方法あるんかな...。(やっぱ画像?)</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.xole.net/article.php?id=755">
<title>Javascript Library 毎のパフォーマンス比較</title>
<link>http://blog.xole.net/article.php?id=755</link>
<dc:date>2010-03-29T01:18:51+09:00</dc:date>
<description>というこよで、貼ってみる

ちなみに DOM 操作編










やっぱ jQuery は早いねー

(2010/03/31追記)

出展元を書くのを忘れてました。
via - http://figit...</description>
<content:encoded>
<![CDATA[
<p>というこよで、貼ってみる</p>

<p>ちなみに DOM 操作編</p>

<script type="text/javascript" src="http://figit.net/widget/post/graph/644.js?size=400x300">
</script>

<script type="text/javascript" src="http://figit.net/widget/post/graph/643.js?size=400x300">
</script>

<script type="text/javascript" src="http://figit.net/widget/post/graph/645.js?size=400x300">
</script>

<p>やっぱ jQuery は早いねー</p>

<p>(2010/03/31追記)</p>

<p>出展元を書くのを忘れてました。<br />
via - <a href="http://figit.net/post/644">http://figit.net/post/644</a>
<br />
（上記グラフは単位がmsになります）
</p>

<p>さらに、元ネタは <a href="http://docs.jquery.com/Release:jQuery_1.3#Performance">http://docs.jquery.com/Release:jQuery_1.3#Performance</a>がソースになります</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.xole.net/article.php?id=754">
<title>クックパッドのレシピ数</title>
<link>http://blog.xole.net/article.php?id=754</link>
<dc:date>2010-03-27T12:19:26+09:00</dc:date>
<description>


via - Figit / Fig on クックパッド: 順調に増えるレシピ数
...</description>
<content:encoded>
<![CDATA[
<script type="text/javascript" src="http://figit.net/widget/post/graph/634.js?size=400x300">
</script>

<p>via - <a href="http://figit.net/post/634">Figit / Fig on クックパッド: 順調に増えるレシピ数</a>
</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.xole.net/article.php?id=753">
<title>やったー グラフ投稿サイトできたよー＼(^o^)／</title>
<link>http://blog.xole.net/article.php?id=753</link>
<dc:date>2010-03-26T22:47:26+09:00</dc:date>
<description>
合宿の成果第一段の グラフ投稿サイト「Figit」ができたよー
ref - http://figit.net/








コンセプトとか細かいことは @figit が考えているけど、どうやら世界一(?) シンプルなグラフ投...</description>
<content:encoded>
<![CDATA[
<p>
<a href="http://blog.xole.net/category.php?k=%E5%90%88%E5%AE%BF">合宿</a>の成果第一段の グラフ投稿サイト「<a href="http://figit.net/">Figit</a>」ができたよー<br />
ref - <a href="http://figit.net/">http://figit.net/</a>
</p>

<p>
<a href="http://figit.net/">
<img src="http://blog.xole.net/resources/header_logo_ja.png" />
</a>
</p>

<p>コンセプトとか細かいことは <a href="http://twitter.com/figit_net">@figit</a> が考えているけど、どうやら<a href="http://twitter.com/figit_net/status/11076944798">世界一(?) シンプルなグラフ投稿サイト</a>らしいよ！</p>

<p>今のところアカウント登録とか面倒な事は一切なしで、みんなグラフをガンガン投稿しまくれるよ！（性善説に基づいてるので、面倒な事は一切省いてシンプルに！）</p>

<h3>僕たちが作りました</h3>
<p>
<img src="http://blog.xole.net/resources/3ren_small.jpg" />
<br />
（オフィス出発前の画像を勝手に加工してみた）</p>

<p>バグや要望、質問などは <a href="http://figit.uservoice.com/forums/47407-general?lang=ja&utm_campaign=Widgets&utm_content=tab-widget&utm_medium=widget&utm_source=figit.uservoice.com">figit.uservoice.com</a>か <a href="http://twitter.com/figit_net">@figit_net</a> へどうぞ。</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.xole.net/article.php?id=752">
<title>開発合宿。三日目</title>
<link>http://blog.xole.net/article.php?id=752</link>
<dc:date>2010-03-25T10:01:34+09:00</dc:date>
<description>今日は最終日です。気合を入れていきましょー

(更新中)

(追記、すいません全然更新できませんでした...)

午前中
2泊3日の部屋を見て愕然とする...



その後、再びもくもく実装中...。

お昼
唯一...</description>
<content:encoded>
<![CDATA[
<p>今日は最終日です。気合を入れていきましょー</p>

<p>(更新中)</p>

<p>(追記、すいません全然更新できませんでした...)</p>

<h3>午前中</h3>
<p>2泊3日の部屋を見て愕然とする...<br />
<img src="http://blog.xole.net/resources/201003251218_125.jpg" />
</p>

<p>その後、再びもくもく実装中...。</p>

<h3>お昼</h3>
<p>唯一の娯楽であるお昼を堪能<br />
(写真は忘れてた...。)</p>

<h3>午後</h3>
<p>なんとかカタチになるサイトっぽくなってきた。<br />
細かい部分の修正などをして、17時合宿を終える<br />
<img src="http://blog.xole.net/resources/78566014.jpg" />
<br />
（深谷での帰り道の一コマ）</p>

<h3>解散</h3>
<p>おわたー<br />
ちょー疲れた合宿でした。<br />
次回は座椅子を持っていくことにします。</p>

<h3>合宿の成果</h3>
<p>合宿の成果は近日公開します</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.xole.net/article.php?id=751">
<title>開発合宿。二日目</title>
<link>http://blog.xole.net/article.php?id=751</link>
<dc:date>2010-03-25T10:00:04+09:00</dc:date>
<description>この日は朝っぱらから雨。しかも寒い。
昨日と違い、みんな余裕が無い事に気づき、あまり写真は無し。
ってか開発の模様は全然書いてない...。

午前中
Skypeでビデオミーティング
skypeがあってよかった。

その後お昼...</description>
<content:encoded>
<![CDATA[
<p>この日は朝っぱらから雨。しかも寒い。<br />
昨日と違い、みんな余裕が無い事に気づき、あまり写真は無し。<br />
ってか開発の模様は全然書いてない...。</p>

<h3>午前中</h3>
<p>Skypeでビデオミーティング<br />
skypeがあってよかった。</p>

<p>その後お昼までもくもく。<br />
<img src="http://blog.xole.net/resources/78154094-3002e32a2289d1050e63449fecf3ea13.4baab0d1-scaled.jpg" />
<br />
作業風景。静かです</p>

<h3>お昼</h3>
<p>どうやら近くにデニーズがあるらしい。...のでデニーズでお昼です</p>

<p>
<img src="http://blog.xole.net/resources/78209455.jpg" />
<br />
メニューの写真はこんな感じで大きなハンバーグだったのに...</p>

<p>
<img src="http://blog.xole.net/resources/78209722.jpg" />
<br />
実際はちょっと小さめ...orz</p>

<h3>午後</h3>
<p>もくもく</p>

<h3>深夜</h3>
<p>一通り作業も終わり、合宿で忘れてはならない3人大富豪大会へ...！<br />
<img src="http://blog.xole.net/resources/201003250944_124.jpg" />
<br />
（成績表。何回やってるんだ...。3人で）</p>

<h3>二日目終了〜</h3>
<p>
<img src="http://blog.xole.net/resources/78319931-fef123b1c3d89e7cbce685e4b91611f4.4baab1f5-scaled.jpg" />
<br />
（↑ちなみにこれ、僕たちのアバターです）</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.xole.net/article.php?id=750">
<title>開発合宿。一日目</title>
<link>http://blog.xole.net/article.php?id=750</link>
<dc:date>2010-03-24T00:39:43+09:00</dc:date>
<description>開発合宿一日目は移動がほぼメイン

2010-03-23 14:00


フィルモアを出発出発時の写真は失念...。

2010-03-23 14:25



上野駅を出発

2010-03-23 14:30



...</description>
<content:encoded>
<![CDATA[
<p>開発合宿一日目は移動がほぼメイン</p>

<h3>2010-03-23 14:00</h3>

<p>
<a href="http://www.fillmoreadvisory.jp/">フィルモア</a>を出発<br />出発時の写真は失念...。</p>

<h3>2010-03-23 14:25</h3>
<p>
<img src="http://blog.xole.net/resources/77901697-1a62e8431afaa8d69c455504806810f8.4ba879e9-scaled-ueno.jpg" />
<br />
上野駅を出発</p>

<h3>2010-03-23 14:30</h3>
<p>
<img src="http://blog.xole.net/resources/77902110-256ed385c5c74587965866e28cd7023a.4ba879ea-scaled-three.jpg" />
<br />
車内で3人で何をつくろっかーで盛り上がる。この先につく駅で愕然とすることも知らず...。</p>

<h3>2010-03-23 16:00</h3>
<p>
<img src="http://blog.xole.net/resources/77915689-be857326ced424723347f00dc416ef02.4ba8db2b-full-hukaya.jpg" />
<br />
埼玉県 深谷に到着<br />
<img src="http://blog.xole.net/resources/77916304-745bbe7446b8b1d6bf66f13aaf692dd8.4ba86bc8-full-hu.jpg" />
<br />
うわー駅がきれー<br />
（でもけっこう殺風景な街なのね...。）</p>

<h3>2010-03-23 16:05</h3>
<p>合宿の宿を探すため移動。<br />
宿は<a href="http://www.kaihachu.com/archives/2007/01/post_16.html">合宿場所一覧 - kaihachu.com</a> より見つけた <a href="http://www.kintow.com/">きんとう　埼玉　深谷　ビジネスホテル　宴会　懐石　</a>
</p>

<h3>2010-03-23 16:10</h3>
<p>無事チェックインを済まし、部屋へ。</p>
<p>
<img src="http://blog.xole.net/resources/77919021-a06664bb357762d7f4a3ce33c3f3ccf4.4ba86c8d-scaled-net.jpg" />
<br />
全員おもむろにPCを取り出し、ネット環境のセットアップへ。<br />
一応、pocket wifi を持ってきたけど、無線LAN はホテルのものが利用できたのでそれを利用。<br />
会社へのVPNはPPTPは何故か繋がらなかったけど、L2TPが繋がったのでよしとする。</p>

<h3>2010-03-23 16:30</h3>
<p>ネットの環境など、一通り終えたので、駅の方面にあったコンビニへ夜食などを買いに移動。</p>

<h3>2010-03-23 17:00</h3>
<p>コンビニから戻り、開発再開。<br />
もくもく。</p>

<h3>2010-03-23 18:45</h3>
<p>
<img src="http://blog.xole.net/resources/77948288-a53b8bc921d587be030a460f0d1b5976.4ba8db0f-full-foo.jpg" />
<br />
夜食が出たので、食堂へ。<br />
コース(?)は日本食でした。（写真は食堂にあったふりかけ）</p>

<h3>2010-03-23 20:30</h3>
<p>
<img src="http://blog.xole.net/resources/77935031-dab199411721a9448357a159ade45b92.4ba8dfca-scaled-zab.jpg" />
<br />
椅子とかそういうものはなく、座敷なので、座布団を何枚も重ねながらもくもく。<br />
<img src="http://blog.xole.net/resources/77978568-b62bece202b33f89c3d4834f50d18d17.4ba8db01-scaled.jpg" />
<br />
「冷えピタ」を貼りつつ、もくもく。</p>

<h3>2010-03-24 0:30</h3>
<p>ブログを書く</p>

<h3>明日に続く</h3>
<p>まだ続きます...。</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.xole.net/article.php?id=749">
<title>開発合宿なう</title>
<link>http://blog.xole.net/article.php?id=749</link>
<dc:date>2010-03-23T17:47:03+09:00</dc:date>
<description>我がフィルモアでは、新しいサービスを展開するために開発合宿を行うことになりました！






男3人で開発準備中。（vizooよりもいいサービスを作るぞ！）※撮影者は僕です

なるべく、開発の様子はなるべくリアルタイムでここで更...</description>
<content:encoded>
<![CDATA[
<p>我が<a href="http://www.fillmoreadvisory.jp/">フィルモア</a>では、新しいサービスを展開するために開発合宿を行うことになりました！</p>

<p>
<a href="http://blog.xole.net/resources/77919021-a06664bb357762d7f4a3ce33c3f3ccf4.4ba86c8d-scaled.jpg">
<img src="http://blog.xole.net/resources/77919021-a06664bb357762d7f4a3ce33c3f3ccf4.4ba86c8d-scaled.jpg" width="400" height="300" />
</a>
<br />
男3人で開発準備中。（<a href="http://www.visualzoo.com/">vizoo</a>よりもいいサービスを作るぞ！）<br />※撮影者は僕です</p>

<p>なるべく、開発の様子はなるべくリアルタイムでここで更新できるようにしたいと思いますが、実況は <a href="http://twitter.com/nowelium">@nowelium</a> または <a href="http://twitter.com/figit_net">@figit_net</a> にて。</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://blog.xole.net/article.php?id=748">
<title>JNA で mecab</title>
<link>http://blog.xole.net/article.php?id=748</link>
<dc:date>2010-03-08T01:21:07+09:00</dc:date>
<description>JNIなmecabを使っていたけど、libmecab(JNI) の *.soとか、*.dylib のコンパイルを環境(LinuxとかMacとか)毎に用意するのが面倒になってきたので、JNAでアクセスできないかと挑戦中...。

meca...</description>
<content:encoded>
<![CDATA[
<p>JNIなmecabを使っていたけど、libmecab(JNI) の *.soとか、*.dylib のコンパイルを環境(LinuxとかMacとか)毎に用意するのが面倒になってきたので、JNAでアクセスできないかと挑戦中...。</p>

<p>mecab.h をよみつつ、こんなインタフェースを用意</p>

<pre class="java">
<span class="keyword" >package</span> org.chasen.mecab;

<span class="keyword" >import</span> com.sun.jna.Library;
<span class="keyword" >import</span> com.sun.jna.PointerType;
<span class="keyword" >import</span> com.sun.jna.Structure;

<span class="keyword" >public</span> <span class="keyword" >interface</span> LibMecab <span class="keyword" >extends</span> Library {
    
    <span class="keyword" >final</span> <span class="keyword" >int</span> MECAB_NOR_NODE = <span class="number" >0</span>;
    <span class="keyword" >final</span> <span class="keyword" >int</span> MECAB_UNK_NODE = <span class="number" >1</span>;
    <span class="keyword" >final</span> <span class="keyword" >int</span> MECAB_BOS_NODE = <span class="number" >2</span>;
    <span class="keyword" >final</span> <span class="keyword" >int</span> MECAB_EOS_NODE = <span class="number" >3</span>;
    <span class="keyword" >final</span> <span class="keyword" >int</span> MECAB_EON_NODE = <span class="number" >4</span>;
    
    <span class="keyword" >final</span> <span class="keyword" >int</span> MECAB_USR_DIC = <span class="number" >1</span>;
    <span class="keyword" >final</span> <span class="keyword" >int</span> MECAB_SYS_DIC = <span class="number" >0</span>;
    <span class="keyword" >final</span> <span class="keyword" >int</span> MECAB_UNK_DIC = <span class="number" >2</span>;

    <span class="keyword" >int</span> mecab_do(<span class="keyword" >int</span> argc, String...argv);

    mecab_t mecab_new(<span class="keyword" >int</span> argc, String...argv);
    
    mecab_t mecab_new2(<span class="keyword" >final</span> String arg);
    String mecab_version();
    
    String mecab_strerror(mecab_t mecab);
    <span class="keyword" >void</span> mecab_destroy(mecab_t mecab);

    <span class="keyword" >int</span> mecab_get_partial(mecab_t mecab);
    <span class="keyword" >void</span> mecab_set_partial(mecab_t mecab, <span class="keyword" >int</span> partial);
    <span class="keyword" >float</span> mecab_get_theta(mecab_t mecab);
    <span class="keyword" >void</span> mecab_set_theta(mecab_t mecab, <span class="keyword" >float</span> theta);
    <span class="keyword" >int</span> mecab_get_lattice_level(mecab_t mecab);
    <span class="keyword" >void</span> mecab_set_lattice_level(mecab_t mecab, <span class="keyword" >int</span> level);
    <span class="keyword" >int</span> mecab_get_all_morphs(mecab_t mecab);
    <span class="keyword" >void</span> mecab_set_all_morphs(mecab_t mecab, <span class="keyword" >int</span> all_morphs);

    String mecab_sparse_tostr(mecab_t mecab, <span class="keyword" >final</span> String str);
    String mecab_sparse_tostr2(mecab_t mecab, <span class="keyword" >final</span> String str, <span class="keyword" >int</span> len);
    String mecab_sparse_tostr3(mecab_t mecab, <span class="keyword" >final</span> String str, <span class="keyword" >int</span> len, String ostr, <span class="keyword" >int</span> olen);
    mecab_node_t mecab_sparse_tonode(mecab_t mecab, <span class="keyword" >final</span> String chr);
    mecab_node_t mecab_sparse_tonode2(mecab_t mecab, <span class="keyword" >final</span> String chr, <span class="keyword" >int</span> size);
    String mecab_nbest_sparse_tostr(mecab_t mecab, <span class="keyword" >int</span> N, <span class="keyword" >final</span> String str);
    String mecab_nbest_sparse_tostr2(mecab_t mecab, <span class="keyword" >int</span> N, <span class="keyword" >final</span> String str, <span class="keyword" >int</span> len);
    String mecab_nbest_sparse_tostr3(mecab_t mecab, <span class="keyword" >int</span> N, <span class="keyword" >final</span> String str, <span class="keyword" >int</span> len, String ostr, <span class="keyword" >int</span> olen);
    <span class="keyword" >int</span> mecab_nbest_init(mecab_t mecab, <span class="keyword" >final</span> String str);
    <span class="keyword" >int</span> mecab_nbest_init2(mecab_t mecab, <span class="keyword" >final</span> String str, <span class="keyword" >int</span> len);
    String mecab_nbest_next_tostr(mecab_t mecab);
    String mecab_nbest_next_tostr2(mecab_t mecab, String ostr, <span class="keyword" >int</span> olen);
    mecab_node_t mecab_nbest_next_tonode(mecab_t mecab);
    String mecab_format_node(mecab_t mecab, <span class="keyword" >final</span> mecab_node_t node);
    
    mecab_dictionary_info_t mecab_dictionary_info(mecab_t mecab);
    <span class="keyword" >int</span> mecab_dict_index(<span class="keyword" >int</span> argc, String...argv);
    <span class="keyword" >int</span> mecab_dict_gen(<span class="keyword" >int</span> argc, String...argv);
    <span class="keyword" >int</span> mecab_cost_train(<span class="keyword" >int</span> argc, String...argv);
    <span class="keyword" >int</span> mecab_system_eval(<span class="keyword" >int</span> argc, String...argv);
    <span class="keyword" >int</span> mecab_test_gen(<span class="keyword" >int</span> argc, String...argv);
    
    <span class="keyword" >class</span> mecab_t <span class="keyword" >extends</span> PointerType {
        <span class="keyword" >public</span> <span class="keyword" >static</span> <span class="keyword" >class</span> Type <span class="keyword" >extends</span> Structure {
            <span class="keyword" >public</span> <span class="keyword" >int</span> allocated;
        }
        <span class="keyword" >public</span> Type get(){
            Type type = (Type) Structure.newInstance(Type.<span class="keyword" >class</span>);
            type.writeField(<span class="string" >"allocated"</span>, getPointer().getInt(<span class="number" >0</span>));
            <span class="keyword" >return</span> type;
        }
    }
    <span class="keyword" >class</span> mecab_node_t <span class="keyword" >extends</span> PointerType {
    }
    <span class="keyword" >class</span> mecab_dictionary_info_t <span class="keyword" >extends</span> PointerType {
    }
    
    <span class="keyword" >abstract</span> <span class="keyword" >class</span> Tagger <span class="keyword" >extends</span> PointerType {
        <span class="keyword" >abstract</span> String parse(<span class="keyword" >final</span> String str);
        <span class="keyword" >abstract</span> Node parseToNode(<span class="keyword" >final</span> String str);
        <span class="keyword" >abstract</span> String parseNBest(<span class="keyword" >int</span> N, <span class="keyword" >final</span> String str);
        <span class="keyword" >abstract</span> <span class="keyword" >boolean</span> parseNBestInit(<span class="keyword" >final</span> String str);
        <span class="keyword" >abstract</span> Node nextNode();
        <span class="keyword" >abstract</span> String next();
        <span class="keyword" >abstract</span> String formatNode(<span class="keyword" >final</span> Node node);

        <span class="comment" >// configuration</span>
        <span class="keyword" >abstract</span> <span class="keyword" >boolean</span> partial();
        <span class="keyword" >abstract</span> <span class="keyword" >void</span> set_partial(<span class="keyword" >boolean</span> partial);
        <span class="keyword" >abstract</span> <span class="keyword" >float</span> theta();
        <span class="keyword" >abstract</span> <span class="keyword" >void</span> set_theta(<span class="keyword" >float</span> theta);
        <span class="keyword" >abstract</span> <span class="keyword" >int</span> lattice_level();
        <span class="keyword" >abstract</span> <span class="keyword" >void</span> set_lattice_level(<span class="keyword" >int</span> level);
        <span class="keyword" >abstract</span> <span class="keyword" >boolean</span> all_morphs();
        <span class="keyword" >abstract</span> <span class="keyword" >void</span> set_all_morphs(<span class="keyword" >boolean</span> all_morphs);
        
        <span class="keyword" >abstract</span> DictionaryInfo dictionary_info();
        <span class="keyword" >abstract</span> String what();

        <span class="keyword" >static</span> Tagger create(<span class="keyword" >int</span> argc, String...argv){
            <span class="keyword" >return</span> <span class="keyword" >null</span>;
        }
        <span class="keyword" >static</span> Tagger create(String...argv){
            <span class="keyword" >return</span> <span class="keyword" >null</span>;
        }
    }
    
    <span class="keyword" >class</span> Node <span class="keyword" >extends</span> PointerType {
        
    }
    
    <span class="keyword" >class</span> DictionaryInfo <span class="keyword" >extends</span> PointerType {
        
    }
}</pre>

<p>で、いざ実行...。</p>

<pre class="java">
<span class="keyword" >package</span> org.chasen.mecab;

<span class="keyword" >import</span> org.chasen.mecab.LibMecab.mecab_t;

<span class="keyword" >import</span> com.sun.jna.Native;

<span class="keyword" >public</span> <span class="keyword" >class</span> Main {
    <span class="keyword" >public</span> <span class="keyword" >static</span> <span class="keyword" >void</span> main(String...args){
        LibMecab mecab = (LibMecab) Native.loadLibrary(<span class="string" >"mecab"</span>, LibMecab.<span class="keyword" >class</span>);
        System.out.println(mecab.mecab_version());
        
        mecab_t _ = mecab.mecab_new2(<span class="string" >""</span>);
        System.out.println(mecab.mecab_strerror(_));
        
        <span class="comment" >// 文字化けだし、動かない...</span>
        String result = mecab.mecab_sparse_tostr(_, <span class="string" >"こんにちは！"</span>);
        System.out.println(result);
        mecab.mecab_destroy(_);
    }
}</pre>

<p>こんな結果は出た。バージョンはちゃんと取れてた。けど、ちゃんと動かない...。</p>

<pre class="java">
<span class="number" >0.97</span>

?	M
??	t
???	d
?ち	t
?	M
??	t
??	d
EOS</pre>

<p>うーん。もう少し。。これができれば結構楽になるハズ...。<br />
継続していきます<br />
ref - <a href="http://github.com/nowelium/JNA-Mecab">http://github.com/nowelium/JNA-Mecab</a>
</p>
]]>
</content:encoded>
</item>

</rdf:RDF>