<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
  <title>iddy.jp - RSS feeds by mattn</title> 
  <link>http://iddy.jp/rss/blog/mattn/</link> 
  <description>RSS feeds by mattn hosted at http://iddy.jp/</description>
  <language>ja</language>
  <item>
    <title>Vim で XML Reformat</title> 
    <description>
    <![CDATA[
    
たとえばこういう XML があったとして、

<blockquote>
&lt;status&gt;&lt;created_at&gt;Mon Feb 06 21:07:52 +0000 2012&lt;/created_at&gt;&lt;id&gt;166629198054690816&lt;/id&gt;&lt;text&gt;Post-Bowl Twitter analysis http://t.co/OYYSRSew http://t.co/M0AtLQVd&lt;/text&gt;&lt;source&gt;web&lt;/source&gt;&lt;truncated&gt;false&lt;/truncated&gt;&lt;favorited&gt;false&lt;/favorited&gt;&lt;in_reply_to_status_id&gt;&lt;/in_reply_to_status_id&gt;&lt;in_reply_to_user_id&gt;&lt;/in_reply_to_user_id&gt;&lt;in_reply_to_screen_name&gt;&lt;/in_reply_to_screen_name&gt;&lt;retweet_count&gt;454&lt;/retweet_count&gt;&lt;retweeted&gt;false&lt;/retweeted&gt;&lt;user&gt;&lt;id&gt;783214&lt;/id&gt;&lt;name&gt;Twitter&lt;/name&gt;&lt;screen_name&gt;twitter&lt;/screen_name&gt;&lt;location&gt;San Francisco, CA&lt;/location&gt;&lt;description&gt;Always wondering what's happening. &lt;/description&gt;&lt;profile_image_url&gt;http://a0.twimg.com/profile_images/1124040897/at-twitter_normal.png&lt;/profile_image_url&gt;&lt;profile_image_url_https&gt;https://si0.twimg.com/profile_images/1124040897/at-twitter_normal.png&lt;/profile_image_url_https&gt;&lt;url&gt;http://blog.twitter.com/&lt;/url&gt;&lt;protected&gt;false&lt;/protected&gt;&lt;followers_count&gt;7625563&lt;/followers_count&gt;&lt;profile_background_color&gt;ACDED6&lt;/profile_background_color&gt;&lt;profile_text_color&gt;333333&lt;/profile_text_color&gt;&lt;profile_link_color&gt;038543&lt;/profile_link_color&gt;&lt;profile_sidebar_fill_color&gt;F6F6F6&lt;/profile_sidebar_fill_color&gt;&lt;profile_sidebar_border_color&gt;EEEEEE&lt;/profile_sidebar_border_color&gt;&lt;friends_count&gt;822&lt;/friends_count&gt;&lt;created_at&gt;Tue Feb 20 14:35:54 +0000 2007&lt;/created_at&gt;&lt;favourites_count&gt;16&lt;/favourites_count&gt;&lt;utc_offset&gt;-28800&lt;/utc_offset&gt;&lt;time_zone&gt;Pacific Time (US &amp;amp; Canada)&lt;/time_zone&gt;&lt;profile_background_image_url&gt;http://a1.twimg.com/profile_background_images/378245879/Twitter_1544x2000.png&lt;/profile_background_image_url&gt;&lt;profile_background_image_url_https&gt;https://si0.twimg.com/profile_background_images/378245879/Twitter_1544x2000.png&lt;/profile_background_image_url_https&gt;&lt;profile_background_tile&gt;true&lt;/profile_background_tile&gt;&lt;profile_use_background_image&gt;true&lt;/profile_use_background_image&gt;&lt;notifications&gt;false&lt;/notifications&gt;&lt;geo_enabled&gt;true&lt;/geo_enabled&gt;&lt;verified&gt;true&lt;/verified&gt;&lt;following&gt;true&lt;/following&gt;&lt;statuses_count&gt;1266&lt;/statuses_count&gt;&lt;lang&gt;en&lt;/lang&gt;&lt;contributors_enabled&gt;true&lt;/contributors_enabled&gt;&lt;follow_request_sent&gt;false&lt;/follow_request_sent&gt;&lt;listed_count&gt;68708&lt;/listed_count&gt;&lt;show_all_inline_media&gt;true&lt;/show_all_inline_media&gt;&lt;default_profile&gt;false&lt;/default_profile&gt;&lt;default_profile_image&gt;false&lt;/default_profile_image&gt;&lt;is_translator&gt;false&lt;/is_translator&gt;&lt;/user&gt;&lt;geo/&gt;&lt;coordinates/&gt;&lt;place/&gt;&lt;possibly_sensitive&gt;false&lt;/possibly_sensitive&gt;&lt;contributors&gt;&lt;user_id&gt;7694352&lt;/user_id&gt;&lt;/contributors&gt;&lt;/status&gt;
</blockquote>

見づらいので vimrc に1行書いてあげると、

<blockquote class="code">
map &lt;Leader&gt;x !python -m BeautifulSoup&lt;CR&gt;<br />
</blockquote>

範囲選択してから &lt;Leader&gt; x でキレイに整形してくれます。

<blockquote class="code">
<span class="Identifier">&lt;</span><span class="Identifier">status</span><span class="Identifier">&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">created_at</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;Mon Feb 06 21:07:52 +0000 2012<br />
&nbsp;<span class="Identifier">&lt;/created_at&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">id</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;166629198054690816<br />
&nbsp;<span class="Identifier">&lt;/id&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">text</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;Post-Bowl Twitter analysis <a href="http://t.co/OYYSRSew">http://t.co/OYYSRSew</a> <a href="http://t.co/M0AtLQVd">http://t.co/M0AtLQVd</a><br />
&nbsp;<span class="Identifier">&lt;/text&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">source</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;web<br />
&nbsp;<span class="Identifier">&lt;/source&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">truncated</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;false<br />
&nbsp;<span class="Identifier">&lt;/truncated&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">favorited</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;false<br />
&nbsp;<span class="Identifier">&lt;/favorited&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">in_reply_to_status_id</span><span class="Identifier">&gt;</span><br />
&nbsp;<span class="Identifier">&lt;/in_reply_to_status_id&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">in_reply_to_user_id</span><span class="Identifier">&gt;</span><br />
&nbsp;<span class="Identifier">&lt;/in_reply_to_user_id&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">in_reply_to_screen_name</span><span class="Identifier">&gt;</span><br />
&nbsp;<span class="Identifier">&lt;/in_reply_to_screen_name&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">retweet_count</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;454<br />
&nbsp;<span class="Identifier">&lt;/retweet_count&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">retweeted</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;false<br />
&nbsp;<span class="Identifier">&lt;/retweeted&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">user</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">id</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; 783214<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/id&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">name</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; Twitter<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/name&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">screen_name</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; twitter<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/screen_name&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">location</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; San Francisco, CA<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/location&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">description</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; Always wondering what's happening.<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/description&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_image_url</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; <a href="http://a0.twimg.com/profile_images/1124040897/at-twitter_normal.png">http://a0.twimg.com/profile_images/1124040897/at-twitter_normal.png</a><br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_image_url&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_image_url_https</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; <a href="https://si0.twimg.com/profile_images/1124040897/at-twitter_normal.png">https://si0.twimg.com/profile_images/1124040897/at-twitter_normal.png</a><br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_image_url_https&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">url</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; <a href="http://blog.twitter.com/">http://blog.twitter.com/</a><br />
&nbsp;&nbsp;<span class="Identifier">&lt;/url&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">protected</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; false<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/protected&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">followers_count</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; 7625563<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/followers_count&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_background_color</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; ACDED6<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_background_color&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_text_color</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; 333333<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_text_color&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_link_color</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; 038543<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_link_color&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_sidebar_fill_color</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; F6F6F6<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_sidebar_fill_color&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_sidebar_border_color</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; EEEEEE<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_sidebar_border_color&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">friends_count</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; 822<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/friends_count&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">created_at</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; Tue Feb 20 14:35:54 +0000 2007<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/created_at&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">favourites_count</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; 16<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/favourites_count&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">utc_offset</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; -28800<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/utc_offset&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">time_zone</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; Pacific Time (US&nbsp;<span class="Type">&amp;</span><span class="Statement">amp</span><span class="Type">;</span>&nbsp;Canada)<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/time_zone&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_background_image_url</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; <a href="http://a1.twimg.com/profile_background_images/378245879/Twitter_1544x2000.png">http://a1.twimg.com/profile_background_images/378245879/Twitter_1544x2000.png</a><br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_background_image_url&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_background_image_url_https</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; <a href="https://si0.twimg.com/profile_background_images/378245879/Twitter_1544x2000.png">https://si0.twimg.com/profile_background_images/378245879/Twitter_1544x2000.png</a><br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_background_image_url_https&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_background_tile</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; true<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_background_tile&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">profile_use_background_image</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; true<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/profile_use_background_image&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">notifications</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; false<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/notifications&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">geo_enabled</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; true<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/geo_enabled&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">verified</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; true<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/verified&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">following</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; true<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/following&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">statuses_count</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; 1266<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/statuses_count&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">lang</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; en<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/lang&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">contributors_enabled</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; true<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/contributors_enabled&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">follow_request_sent</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; false<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/follow_request_sent&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">listed_count</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; 68708<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/listed_count&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">show_all_inline_media</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; true<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/show_all_inline_media&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">default_profile</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; false<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/default_profile&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">default_profile_image</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; false<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/default_profile_image&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">is_translator</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp; false<br />
&nbsp;&nbsp;<span class="Identifier">&lt;/is_translator&gt;</span><br />
&nbsp;<span class="Identifier">&lt;/user&gt;</span><br />
&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">geo</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">coordinates</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">place</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">possibly_sensitive</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp; false<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">&lt;/possibly_sensitive&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">contributors</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">&lt;</span><span class="Identifier">user_id</span><span class="Identifier">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7694352<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">&lt;/user_id&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">&lt;/contributors&gt;</span><br />
&nbsp;&nbsp;&nbsp;<span class="Identifier">&lt;/place&gt;</span><br />
&nbsp;&nbsp;<span class="Identifier">&lt;/coordinates&gt;</span><br />
&nbsp;<span class="Identifier">&lt;/geo&gt;</span><br />
<span class="Identifier">&lt;/status&gt;</span><br />
<br />
</blockquote>

ネタ元: <a href="http://wozozo.hatenablog.com/entry/2012/02/08/121504">http://wozozo.hatenablog.com/entry/2012/02/08/121504</a><br />
<br />
ちなみに<code>-m</code>だけでやる場合は細かい制御はできなさそう。<br />

    ]]>
    </description>
    <link>http://mattn.kaoriya.net/software/lang/python/20120209221728.htm</link> 
    <pubDate>Thu, 09 Feb 2012 22:21:00 +0900</pubDate>
   </item>
  <item>
    <title>Vimで編集中のMarkdownをプレビュー出来るプラグイン書いた</title> 
    <description>
    <![CDATA[
    
Vimが良くも悪くも「エディタだ」と言われる要因として「画像や異なるグリフのフォントを同時に出せない」ことを上げられます。つまりVimはHTMLやマークダウン等のプレビューを確認する為にいちいちブラウザを起動して確認し、ファイルを更新した際には読み込み直すという面倒な手間が掛かる事を意味しています。<br />
まぁ専用ブラウザを作ればいいんだけど面倒で腰が重かったんだけど、ちょいと作ってみました。<br />
<br />

<blockquote class="quote">
  <a href="https://github.com/mattn/mkdpreview-vim">mattn/mkdpreview-vim - GitHub</a><br />
  <p>MkdPreview Markdown previewer for vimmer</p>
  <cite>https://github.com/mattn/mkdpreview-vim</cite>
</blockquote>

ファイルタイプがmarkdownなバッファで

<blockquote class="code">
:MkdPreview!<br />
</blockquote>

と実行するとプレビューワが起動します。

<blockquote>
<img src="http://go-gyazo.appspot.com/fa5d2b115d806a8d.png" alt="mkdpreview-vim" />
</blockquote>

プレビューワが一度起動している状態なら、以後は他のVimからでも

<blockquote class="code">
:MkdPreview<br />
</blockquote>

でプレビューが表示される様になっています。<code>MkdPreview!</code>を実行したVimに関しては<code>BufWritePost</code>に
対してプレビュー更新が行われる様になっているので<code>:w</code>で自動更新されます。この辺は使い勝手で変えていくかも知れない。<br />
仕組みはpythonスクリプトで書かれたウェブサーバ兼Qt4を使ったプレビューワになっていて
POSTを受けたらそれをmarkdown-jsを使ってQtWebkitに反映させています。

複数起動とかうっとおしいだろうなと思ったので、ポートは固定にしています。
起動に必要な物としては

<ul>
  <li>python (2.7 or later) http://python.org/</li>
  <li>PyQt4 http://www.riverbankcomputing.co.uk/software/pyqt/download</li>
  <li>curl command http://curl.haxx.se/libcurl/</li>
  <li>webapi-vim http://github.com/mattn/webapi-vim</li>
  <li><del>markdown-js https://github.com/evilstreak/markdown-js</del></li>
</ul>

となります。pythonスクリプトは短いのでコードを貼り付けておきます。<br />

<blockquote class="code">
<span class="Comment">#!/usr/bin/env python</span><br />
<span class="Comment"># -*- coding: utf-8 -*-</span><br />
<span class="PreProc">import</span>&nbsp;os<br />
<span class="PreProc">import</span>&nbsp;sys<br />
<span class="PreProc">import</span>&nbsp;json<br />
<span class="PreProc">import</span>&nbsp;cgi<br />
<span class="PreProc">from</span>&nbsp;threading&nbsp;<span class="PreProc">import</span>&nbsp;Thread<br />
<span class="PreProc">from</span>&nbsp;PyQt4.QtCore&nbsp;<span class="PreProc">import</span>&nbsp;*<br />
<span class="PreProc">from</span>&nbsp;PyQt4.QtGui&nbsp;<span class="PreProc">import</span>&nbsp;*<br />
<span class="PreProc">from</span>&nbsp;PyQt4.QtWebKit&nbsp;<span class="PreProc">import</span>&nbsp;*<br />
<span class="PreProc">from</span>&nbsp;PyQt4.QtNetwork&nbsp;<span class="PreProc">import</span>&nbsp;*<br />
<span class="PreProc">from</span>&nbsp;BaseHTTPServer&nbsp;<span class="PreProc">import</span>&nbsp;HTTPServer<br />
<span class="PreProc">from</span>&nbsp;SimpleHTTPServer&nbsp;<span class="PreProc">import</span>&nbsp;SimpleHTTPRequestHandler<br />
<br />
os.chdir(os.path.dirname(__file__))<br />
<br />
port =&nbsp;<span class="Identifier">int</span>(os.getenv(<span class="Constant">&quot;mkdpreview_port&quot;</span>)&nbsp;<span class="Statement">or</span>&nbsp;<span class="Constant">&quot;8081&quot;</span>)<br />
<br />
QNetworkProxyFactory.setUseSystemConfiguration(<span class="Identifier">True</span>)<br />
app = QApplication(sys.argv)<br />
webview = QWebView()<br />
webview.setWindowTitle(<span class="Constant">'Markdown Previewer'</span>)<br />
webview.load(QUrl(<span class="Constant">&quot;<a href="http://localhost:8081">http://localhost:8081</a>&quot;</span>))<br />
<span class="Statement">def</span>&nbsp;<span class="Identifier">do_eval</span>(js):<br />
&nbsp;&nbsp;webview.page().mainFrame().evaluateJavaScript(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Constant">&quot;preview(%s)&quot;</span>&nbsp;% json.dumps(<span class="Identifier">unicode</span>(js,&nbsp;<span class="Constant">'utf-8'</span>)))<br />
QObject.connect(webview, SIGNAL(<span class="Constant">&quot;preview(QString)&quot;</span>), do_eval)<br />
webview.show()<br />
<br />
<span class="Statement">class</span>&nbsp;<span class="Identifier">PreviewHandler</span>(SimpleHTTPRequestHandler):<br />
&nbsp;&nbsp;<span class="Statement">def</span>&nbsp;<span class="Identifier">do_POST</span>(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;s = self.rfile.read(<span class="Identifier">int</span>(self.headers.getheader(<span class="Constant">'content-length'</span>)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;p = cgi.parse_qs(s)<br />
&nbsp;&nbsp;&nbsp;&nbsp;webview.emit(SIGNAL(<span class="Constant">&quot;preview(QString)&quot;</span>), p[<span class="Constant">&quot;data&quot;</span>][<span class="Constant">0</span>])<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.wfile.write(<span class="Constant">&quot;&quot;</span>)<br />
<br />
<span class="Statement">class</span>&nbsp;<span class="Identifier">WebServer</span>(QThread):<br />
&nbsp;&nbsp;<span class="Statement">def</span>&nbsp;<span class="Identifier">__init__</span>(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;QThread.__init__(self)<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.server = HTTPServer((<span class="Constant">&quot;&quot;</span>, port), PreviewHandler)<br />
<br />
&nbsp;&nbsp;<span class="Statement">def</span>&nbsp;<span class="Identifier">run</span>(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;self.server.serve_forever()<br />
<br />
server = WebServer()<br />
server.start()<br />
<br />
sys.exit(app.exec_())<br />
<br />
<span class="Comment"># vim&#0058;set et sw=2 ts=2:</span><br />
</blockquote>

良かったら使ってみて下さい。
なお、ベースとなるHTMLはstaticフォルダにあるのでスタイル等をカスタマイズしたい人はじゃんじゃんやっちゃって下さい。
こうすればもっと使い勝手が良くなるよなどあればpull requestお願いします。<br />
<br />
<em>追記</em><br />
Windowsじゃない人はstatic/mkdpreview.pyに実行権限与えて下さい。<br />
markdown-jsじゃなくpython側でparseする様にしました。<br />

    ]]>
    </description>
    <link>http://mattn.kaoriya.net/software/vim/20120208161751.htm</link> 
    <pubDate>Wed, 08 Feb 2012 16:24:00 +0900</pubDate>
   </item>
  <item>
    <title>Vim scriptはウェブアプリケーション記述言語やったんやー</title> 
    <description>
    <![CDATA[
    
こんにちわ。昨今、ウェブ開発の進化はすざましいですね。PythonやPerlやJava、色んな言語で書かれていると思います。<br />
もちろん編集にはVimを使っているかと思います。<br />
でも編集だけ？<br />
<br />
違うよね！<br />
Vim scriptはウェブアプリケーション記述言語なんだよ！<br />
<br />
<b>Plack::App::Vim</b><br />
<blockquote class="code">
<span class="Statement">package</span><span class="Type">&nbsp;Plack::App::Vim</span>;<br />
<span class="Statement">use strict</span>;<br />
<span class="Statement">use warnings</span>;<br />
<span class="Statement">use parent</span>&nbsp;<span class="Constant">qw/</span><span class="Constant">Plack::Component</span><span class="Constant">/</span>;<br />
<span class="Statement">use&nbsp;</span>Plack::Request;<br />
<span class="Statement">use&nbsp;</span>Encode;<br />
<span class="Statement">use&nbsp;</span>JSON::PP;<br />
<br />
<span class="Statement">sub&nbsp;</span><span class="Identifier">prepare_app&nbsp;</span>{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$self</span>&nbsp;=&nbsp;<span class="Statement">shift</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">vim</span><span class="Identifier">}</span>&nbsp;||=&nbsp;<span class="Constant">'</span><span class="Constant">vim</span><span class="Constant">'</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(!<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">server</span><span class="Identifier">}</span>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">open</span>(<span class="Statement">my</span>&nbsp;<span class="Identifier">$f</span>,&nbsp;<span class="Constant">&quot;</span><span class="Constant">vim --serverlist|</span><span class="Constant">&quot;</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$server</span>&nbsp;= &lt;<span class="Identifier">$f</span>&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">close</span>(<span class="Identifier">$f</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">chomp</span>&nbsp;<span class="Identifier">$server</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">server</span><span class="Identifier">}</span>&nbsp;=&nbsp;<span class="Identifier">$server</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(!<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">encoding</span><span class="Identifier">}</span>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">open</span>(<span class="Statement">my</span>&nbsp;<span class="Identifier">$f</span>,&nbsp;<span class="Statement">sprintf</span>(<span class="Constant">&quot;</span><span class="Constant">%s --servername %s --remote-expr&nbsp;</span><span class="Special">\&quot;</span><span class="Constant">&amp;encoding</span><span class="Special">\&quot;</span><span class="Constant">|</span><span class="Constant">&quot;</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">vim</span><span class="Identifier">}</span>,&nbsp;<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">server</span><span class="Identifier">}</span>));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$encoding</span>&nbsp;= &lt;<span class="Identifier">$f</span>&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">close</span>(<span class="Identifier">$f</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">chomp</span>&nbsp;<span class="Identifier">$encoding</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">encoding</span><span class="Identifier">}</span>&nbsp;=&nbsp;<span class="Identifier">$encoding</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$self</span>;<br />
}<br />
<br />
<span class="Statement">sub&nbsp;</span><span class="Identifier">call&nbsp;</span>{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;(<span class="Identifier">$self</span>,&nbsp;<span class="Identifier">$env</span>) =&nbsp;<span class="Identifier">@_</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$req</span>&nbsp;= Plack::Request-&gt;new(<span class="Identifier">$env</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$json</span>&nbsp;= JSON::PP-&gt;new-&gt;ascii<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;allow_singlequote-&gt;allow_blessed-&gt;allow_nonref;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$str</span>&nbsp;=&nbsp;<span class="Identifier">$json</span><span class="Identifier">-&gt;encode</span>({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Constant">uri</span>&nbsp;=&gt;&nbsp;<span class="Identifier">$env</span><span class="Identifier">-&gt;{</span><span class="Constant">PATH_INFO</span><span class="Identifier">}</span>||<span class="Constant">''</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Constant">method</span>&nbsp;=&gt;&nbsp;<span class="Identifier">$req</span><span class="Identifier">-&gt;method</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Constant">headers</span>&nbsp;=&gt; [<span class="Statement">split</span>(&nbsp;<span class="Statement">/</span><span class="Special">\n</span><span class="Statement">/</span>,&nbsp;<span class="Identifier">$req</span><span class="Identifier">-&gt;headers-&gt;as_string</span>)],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Constant">content</span>&nbsp;=&gt;&nbsp;<span class="Identifier">$req</span><span class="Identifier">-&gt;content</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$str</span>&nbsp;=~&nbsp;<span class="Statement">s!</span><span class="Constant">&quot;</span><span class="Statement">!</span><span class="Special">\\</span><span class="Constant">x22</span><span class="Statement">!g</span>;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$command</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(<span class="Identifier">$</span>^O&nbsp;<span class="Statement">eq</span>&nbsp;<span class="Constant">'</span><span class="Constant">MSWin32</span><span class="Constant">'</span>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$command</span>&nbsp;=&nbsp;<span class="Statement">sprintf</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Constant">'</span><span class="Constant">%s --servername %s --remote-expr &quot;vimplack#handle(&quot;&quot;&quot;%s&quot;&quot;&quot;)&quot;</span><span class="Constant">'</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">vim</span><span class="Identifier">}</span>,&nbsp;<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">server</span><span class="Identifier">}</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encode(<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">encoding</span><span class="Identifier">}</span>&nbsp;||&nbsp;<span class="Constant">'</span><span class="Constant">utf8</span><span class="Constant">'</span>,&nbsp;<span class="Identifier">$str</span>));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="Statement">else</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$command</span>&nbsp;=&nbsp;<span class="Statement">sprintf</span>(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Constant">&quot;</span><span class="Constant">%s --servername %s --remote-expr 'vimplack#handle(</span><span class="Special">\&quot;</span><span class="Constant">%s</span><span class="Special">\&quot;</span><span class="Constant">)'</span><span class="Constant">&quot;</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">vim</span><span class="Identifier">}</span>,&nbsp;<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">server</span><span class="Identifier">}</span>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encode(<span class="Identifier">$self</span><span class="Identifier">-&gt;{</span><span class="Constant">encoding</span><span class="Identifier">}</span>&nbsp;||&nbsp;<span class="Constant">'</span><span class="Constant">utf8</span><span class="Constant">'</span>,&nbsp;<span class="Identifier">$str</span>));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">open</span>(<span class="Statement">my</span>&nbsp;<span class="Identifier">$f</span>,&nbsp;<span class="Constant">&quot;</span><span class="Identifier">$command</span><span class="Constant">|</span><span class="Constant">&quot;</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">binmode</span>&nbsp;<span class="Identifier">$f</span>,&nbsp;<span class="Constant">'</span><span class="Constant">:utf8</span><span class="Constant">'</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$out</span>&nbsp;= &lt;<span class="Identifier">$f</span>&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">close</span>&nbsp;<span class="Identifier">$f</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">my</span>&nbsp;<span class="Identifier">$res</span>&nbsp;=&nbsp;<span class="Identifier">$json</span><span class="Identifier">-&gt;decode</span>(<span class="Identifier">$out</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$res-&gt;[</span><span class="Constant">2</span><span class="Identifier">][</span><span class="Constant">0</span><span class="Identifier">]</span>&nbsp;= encode_utf8&nbsp;<span class="Identifier">$res-&gt;[</span><span class="Constant">2</span><span class="Identifier">][</span><span class="Constant">0</span><span class="Identifier">]</span>&nbsp;<span class="Statement">if</span>&nbsp;<span class="Identifier">$res</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Identifier">$res</span>&nbsp;|| [<span class="Constant">500</span>, [<span class="Constant">'</span><span class="Constant">Content-Type</span><span class="Constant">'</span>&nbsp;=&gt;&nbsp;<span class="Constant">'</span><span class="Constant">text/plain</span><span class="Constant">'</span>], [<span class="Constant">'</span><span class="Constant">Internal Server Error</span><span class="Constant">'</span>]];<br />
}<br />
<br />
<span class="Constant">1</span>;<br />
<br />
<span class="Comment">__END__</span><br />
<br />
<span class="Comment">=head1 NAME</span><br />
<br />
<span class="Comment">Plack::App::Vim - The Vim App in Plack</span><br />
<br />
<span class="Comment">=head1 SYNOPSIS</span><br />
<br />
<span class="Comment">&nbsp;&nbsp;use Plack::Builder;</span><br />
<span class="Comment">&nbsp;&nbsp;use Plack::App::Vim;</span><br />
<br />
<span class="Comment">&nbsp;&nbsp;builder {</span><br />
<span class="Comment">&nbsp;&nbsp;&nbsp;&nbsp;mount &quot;/&quot; =&gt; Plack::App::Vim-&gt;new(server =&gt; 'VIM');</span><br />
<span class="Comment">&nbsp;&nbsp;};</span><br />
<br />
<span class="Comment">=head1 DESCRIPTION</span><br />
<br />
<span class="Comment">Plack::App::Vim allows you to write web application with Vim script.</span><br />
<br />
<span class="Comment">=head1 AUTHOR</span><br />
<br />
<span class="Comment">Yasuhiro Matsumoto</span><br />
<br />
<span class="Comment">=head1 SEE ALSO</span><br />
<br />
<span class="Comment">L&lt;Plack&gt;</span><br />
<br />
<span class="Comment">=cut</span><br />
</blockquote>
<code>Plack::App</code>のアプリケーションハンドラを書いたよ。これを起動するpsgiファイルを用意するよ！<br />
<br />
<b>app.psgi</b><br />
<blockquote class="code">
<span class="PreProc">#!perl</span><br />
<span class="Statement">use lib</span>&nbsp;<span class="Constant">qw/</span><span class="Constant">lib</span><span class="Constant">/</span>;<br />
<span class="Statement">use&nbsp;</span>Plack::Builder;<br />
<span class="Statement">use&nbsp;</span>Plack::App::Vim;<br />
<br />
builder {<br />
&nbsp;&nbsp;&nbsp;&nbsp;mount&nbsp;<span class="Constant">&quot;</span><span class="Constant">/</span><span class="Constant">&quot;</span>&nbsp;=&gt; Plack::App::Vim-&gt;new(<span class="Constant">server</span>&nbsp;=&gt;&nbsp;<span class="Constant">'</span><span class="Constant">VIM</span><span class="Constant">'</span>);<br />
};<br />
</blockquote>
引数の<code>server</code>にはclientserver機能が使えるVimを立ち上げ、そのサーバIDを指定しておく必要があるよ！<br />
そしてVim側にハンドラを書くよ！<br />
<br />
<b>autoload/vimplack.vim</b><br />
<blockquote class="code">
<span class="Statement">scriptencoding</span>&nbsp;utf<span class="Statement">-</span><span class="Constant">8</span><br />
<br />
<span class="Statement">function</span>! vimplack#handle<span class="Special">(</span>req<span class="Special">)</span><br />
&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">req</span>&nbsp;<span class="Statement">=</span>&nbsp;json#<span class="Normal">decode</span><span class="Special">(</span><span class="Identifier">a:req</span><span class="Special">)</span><br />
&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">res</span>&nbsp;<span class="Statement">=</span>&nbsp;[<span class="Constant">200</span>, {}, [<span class="Constant">&quot;hello world&quot;</span>]]<br />
&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;json#<span class="Normal">encode</span><span class="Special">(</span>res<span class="Special">)</span><br />
<span class="Statement">endfunction</span><br />
</blockquote>
PSGIプロトコルそのままですね！便利！<br />
<br />
起動しよう！<br />
<blockquote class="code">
# plackup app.psgi<br />
HTTP::Server::PSGI: Accepting connections at http://0:5000/<br />
</blockquote>
ブラウザで<code>http://localhost:5000</code>を開こう！<br />
<blockquote>
<img src="http://go-gyazo.appspot.com/6266a87ce3893313.png" alt="Vim on PSGI" />
</blockquote>
やたー！<br />
あとはアプリケーション書き放題ですね！<br />
試しに掲示板書いてみるよ！<br />
<br />
<b>autoload/vimplack.vim</b><br />
<blockquote class="code">
<span class="Statement">scriptencoding</span>&nbsp;utf<span class="Statement">-</span><span class="Constant">8</span><br />
<br />
<span class="Statement">let</span>&nbsp;<span class="Identifier">s</span>:comments&nbsp;<span class="Statement">=</span>&nbsp;<span class="Identifier">get</span><span class="Special">(</span>s:,&nbsp;<span class="Constant">'comments'</span>, []<span class="Special">)</span><br />
<br />
<span class="Statement">function</span>! vimplack#handle<span class="Special">(</span>req<span class="Special">)</span><br />
&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">req</span>&nbsp;<span class="Statement">=</span>&nbsp;json#decode<span class="Special">(</span><span class="Identifier">a:req</span><span class="Special">)</span><br />
&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;req<span class="Statement">.</span>uri&nbsp;<span class="Statement">==</span>&nbsp;<span class="Constant">&quot;/&quot;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">res</span>&nbsp;<span class="Statement">=</span>&nbsp;[<span class="Constant">200</span>,&nbsp;<span class="Special">{</span><span class="Constant">&quot;Content-Type&quot;</span>:&nbsp;<span class="Constant">&quot;text/html; charset=utf-8&quot;</span><span class="Special">}</span>, [<span class="Constant">&quot;&quot;</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Constant">&quot;&lt;html&gt;&quot;</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Constant">&quot;&lt;link rel='shortcut icon' href='/static/favicon.ico'&gt;&quot;</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Constant">&quot;&lt;title&gt;comment board&lt;/title&gt;&quot;</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Constant">&quot;&lt;body&gt;&quot;</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Constant">&quot;&lt;form action='/regist' method='post'&gt;&quot;</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Constant">&quot;コメント:&lt;input type='text' name='comment' value='' /&gt;&lt;br /&gt;&quot;</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Constant">&quot;&lt;input type='submit' value='登録' /&gt;&quot;</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Constant">&quot;&lt;/form&gt;&quot;</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Identifier">join</span><span class="Special">(</span><span class="Identifier">map</span><span class="Special">(</span><span class="Identifier">copy</span><span class="Special">(</span>s:comments<span class="Special">)</span>,&nbsp;<span class="Constant">'html#encodeEntityReference(v:val)'</span><span class="Special">)</span>,&nbsp;<span class="Constant">'&lt;br /&gt;'</span><span class="Special">)</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Constant">&quot;&lt;/body&gt;&quot;</span><br />
<span class="Special">\</span><span class="Statement">.</span><span class="Constant">&quot;&lt;/html&gt;&quot;</span><br />
<span class="Special">\</span>]]<br />
&nbsp;&nbsp;<span class="Statement">elseif</span>&nbsp;req<span class="Statement">.</span>uri&nbsp;<span class="Statement">==</span>&nbsp;<span class="Constant">'/regist'</span>&nbsp;<span class="Statement">&amp;&amp;</span>&nbsp;req<span class="Statement">.</span>method&nbsp;<span class="Statement">==</span>&nbsp;<span class="Constant">'POST'</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">params</span>&nbsp;<span class="Statement">=</span>&nbsp;<span class="Special">{}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">for</span>&nbsp;_&nbsp;<span class="Statement">in</span>&nbsp;<span class="Identifier">map</span><span class="Special">(</span><span class="Identifier">split</span><span class="Special">(</span>req<span class="Statement">.</span>content,&nbsp;<span class="Constant">'&amp;'</span><span class="Special">)</span>,&nbsp;<span class="Constant">'split(v:val,&quot;=&quot;)'</span><span class="Special">)</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">params</span>[_[<span class="Constant">0</span>]]&nbsp;<span class="Statement">=</span>&nbsp;<span class="Identifier">iconv</span><span class="Special">(</span>http#decodeURI<span class="Special">(</span>_[<span class="Constant">1</span>]<span class="Special">)</span>,&nbsp;<span class="Constant">'utf-8'</span>, &amp;encoding<span class="Special">)</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">endfor</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;<span class="Identifier">has_key</span><span class="Special">(</span>params,&nbsp;<span class="Constant">'comment'</span><span class="Special">)</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">call</span>&nbsp;<span class="Identifier">add</span><span class="Special">(</span>s:comments, params[<span class="Constant">'comment'</span>]<span class="Special">)</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">endif</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">res</span>&nbsp;<span class="Statement">=</span>&nbsp;[<span class="Constant">302</span>,&nbsp;<span class="Special">{</span><span class="Constant">&quot;Location&quot;</span>:&nbsp;<span class="Constant">&quot;/&quot;</span><span class="Special">}</span>, [<span class="Constant">&quot;&quot;</span>]]<br />
&nbsp;&nbsp;<span class="Statement">else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">let</span>&nbsp;<span class="Identifier">res</span>&nbsp;<span class="Statement">=</span>&nbsp;[<span class="Constant">404</span>,&nbsp;<span class="Special">{}</span>, [<span class="Constant">&quot;404 Dan Not Found&quot;</span>]]<br />
&nbsp;&nbsp;<span class="Statement">endif</span><br />
&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;json#encode<span class="Special">(</span>res<span class="Special">)</span><br />
<span class="Statement">endfunction</span><br />
</blockquote>
アプリケーションの更新はVimを再起動するか<code>autoload/vimplack.vim</code>を開いている常態なら
<blockquote class="code">
:so %<br />
</blockquote>
で行けるよ！<br /
よしブラウザでF5だ！<br />
<blockquote>
<img src="http://go-gyazo.appspot.com/5ba20ac7c5e430e7.png" alt="Vim on PSGI" />
</blockquote>
<br />
知らんかったー<br />
Vim scriptはウェブアプリケーション記述言語やったんやー<br />

<blockquote class="quote">
 <a href="https://github.com/mattn/p5-Plack-App-Vim">mattn/p5-Plack-App-Vim - GitHub</a><br />
 <p>Vim Application Handler for PSGI</p>
 <cite>https://github.com/mattn/p5-Plack-App-Vim</cite>
</blockquote>

    ]]>
    </description>
    <link>http://mattn.kaoriya.net/software/vim/20120127204609.htm</link> 
    <pubDate>Fri, 27 Jan 2012 21:00:00 +0900</pubDate>
   </item>
  <item>
    <title>新言語rustでhello world</title> 
    <description>
    <![CDATA[
    
やっぱり最初はhello worldって事で...<br />
<br />

<blockquote class="quote">
 <a href="http://www.rust-lang.org/">Rust</a><br />
 <p><img src="http://www.rust-lang.org/logos/rust-logo-128x128-blk.png" alt="Rust" align="right" />Rust a safe, concurrent, practical language Rust is a curly-brace, block-structured expression langu...<br />Rust is a curly-brace, block-structured expression language. It visually resembles the C language family, but differs significantly in syntactic and semantic details. Its design is oriented toward concerns of “programming in the large”, that is, of creating and maintaining boundaries – both abstract and operational – that preserve large-system integrity, availability and concurrency.<br clear="all" /></p>
 <cite>http://www.rust-lang.org/</cite>
</blockquote>

windowsのインストーラがダウンロード出来なかったのでgithubからダウンロードしてビルドした。<br />

<blockquote class="quote">
 <a href="https://github.com/mozilla/rust">mozilla/rust - GitHub</a><br />
 <p>a safe, concurrent, practical language</p>
 <cite>https://github.com/mozilla/rust</cite>
</blockquote>

ビルドはmingw/msysで<code>./configure &amp;&amp; make install</code>。<br />
LLVM上のコンパイラなのでビルドは結構リソースを食う。かなり食う。<br />
<br />
ただ単にfizzbuzz出しても<a href="http://blog.livedoor.jp/dankogai/archives/51767615.html" class="external" target="_blank">danさん</a>の真似になって面白く無かったのでメッセージボックス出してみた。<br />
<blockquote class="code">
<span class="Statement">use</span>&nbsp;std;<br />
<span class="Statement">import</span>&nbsp;std::io;<br />
<br />
#[abi&nbsp;=&nbsp;<span class="Constant">&quot;stdcall&quot;</span>]<br />
<span class="Statement">native</span>&nbsp;<span class="Statement">mod</span>&nbsp;user32&nbsp;{<br />
&nbsp;&nbsp;<span class="Statement">fn</span>&nbsp;MessageBoxA(h:&nbsp;ctypes::c_uint,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message:&nbsp;<span class="Type">str</span>::sbuf,&nbsp;title:&nbsp;<span class="Type">str</span>::sbuf,&nbsp;flag:&nbsp;ctypes::c_uint)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;&nbsp;ctypes::c_uint;<br />
}<br />
<br />
<span class="Statement">fn</span>&nbsp;main() {<br />
&nbsp;&nbsp;<span class="Type">str</span>::as_buf(<span class="Constant">&quot;hello&quot;</span>, { |message|<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Type">str</span>::as_buf(<span class="Constant">&quot;world&quot;</span>, { |title|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user32::MessageBoxA(0u,&nbsp;message,&nbsp;title,&nbsp;0u);<br />
&nbsp;&nbsp;&nbsp;&nbsp;})<br />
&nbsp;&nbsp;})<br />
}<br />
</blockquote>
abiとしてcdeclやstdcallが指定出切る。<code>rustc</code>コマンドはuser32に対してちゃんと<code>-luser32</code>というリンクオプションを足してくれるので、コマンドラインでガチャガチャやるイメージはあまりない。<br />
なお、<code>CARGO_ROOT</code>という環境変数に<code>c:/rust/bin</code>や<code>c:/rust/lib</code>でいう所の<code>c:/rust</code>を指定しておくと、ちゃんとリンカが判断してファイルを探してくれる。<br />

vim編集中に簡単に実行出切る様に、quickrunにもプルリクエストを送っておいた。(マージされた)<br />
<blockquote class="quote">
 <a href="https://github.com/thinca/vim-quickrun/pull/22">#22: support mozilla rust. by mattn for thinca/vim-quickrun - Pull Request - GitHub</a><br />
 <cite>https://github.com/thinca/vim-quickrun/pull/22</cite>
</blockquote>
<br />

環境が揃うユーザならば、vimでファイル開いて<code>&lt;leader&gt;r</code>とタイプすればメッセージボックスが出る様になります。<br />

<blockquote>
<img src="http://go-gyazo.appspot.com/1028b5efd45895cc.png" alt="rust-win32" />
</blockquote>

所感としては、<code>str::as_buf</code>がブロック式なので、rubyっぽく思えると同時に引数2つの場合めんどくさ過ぎる！と思った。言語というか、仕組み的にはGo言語が近いなーとか思ってたら、Dubheadさんから教えてもらったリンクに既に書いてあった。<br />

<blockquote class="quote">
 <a href="https://github.com/mozilla/rust/wiki/Doc-language-FAQ">Doc language FAQ - GitHub</a><br />
 <p>Have you seen this Google language, Go? How does Rust compare?</p>
</blockquote>
面白そうなのでしばらく触ってみる。

    ]]>
    </description>
    <link>http://mattn.kaoriya.net/software/lang/rust/20120125195418.htm</link> 
    <pubDate>Wed, 25 Jan 2012 20:06:00 +0900</pubDate>
   </item>
  <item>
    <title>trie_tree書いてみた。</title> 
    <description>
    <![CDATA[
    
trieなんたらが話題になってたのでなんとなく書いてみた。<br />
ベンチとかはやってない。<br />

<blockquote class="quote">
 <a href="http://blog.livedoor.jp/dankogai/archives/51765855.html">404 Blog Not Found:Algorithm - 連想配列の実装としてのハッシュはオワコン?</a><br />
 <p>そのデータ構造は、君の魂を差し出すに足るものかい? 連想配列( Associative array )がコレクション( Collection )、すなわち数多のデータ構造をまとめるデータ構造としての覇...</p>
 <cite>http://blog.livedoor.jp/dankogai/archives/51765855.html</cite>
</blockquote>

<blockquote class="code">
<span class="PreProc">#include&nbsp;</span><span class="Constant">&lt;stdio.h&gt;</span><br />
<span class="PreProc">#include&nbsp;</span><span class="Constant">&lt;stdlib.h&gt;</span><br />
<br />
<span class="Type">typedef</span>&nbsp;<span class="Type">struct</span>&nbsp;_trie {<br />
&nbsp;&nbsp;<span class="Type">char</span>&nbsp;c;<br />
&nbsp;&nbsp;<span class="Type">unsigned</span>&nbsp;<span class="Type">int</span>&nbsp;n;<br />
&nbsp;&nbsp;<span class="Type">struct</span>&nbsp;_trie** next;<br />
&nbsp;&nbsp;<span class="Type">void</span>* value;<br />
} trie;<br />
<br />
trie*<br />
trie_new() {<br />
&nbsp;&nbsp;trie* p = (trie*) malloc(<span class="Statement">sizeof</span>(trie));<br />
&nbsp;&nbsp;p-&gt;c =&nbsp;<span class="Constant">0</span>;<br />
&nbsp;&nbsp;p-&gt;n =&nbsp;<span class="Constant">0</span>;<br />
&nbsp;&nbsp;p-&gt;next =&nbsp;<span class="Constant">NULL</span>;<br />
&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;p;<br />
}<br />
<br />
<span class="Type">void</span><br />
trie_free(trie* p) {<br />
&nbsp;&nbsp;<span class="Type">unsigned</span>&nbsp;<span class="Type">int</span>&nbsp;i;<br />
&nbsp;&nbsp;<span class="Statement">for</span>&nbsp;(i =&nbsp;<span class="Constant">0</span>; i &lt; p-&gt;n; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;trie_free(p-&gt;next[i]);<br />
&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(p-&gt;n)<br />
&nbsp;&nbsp;&nbsp;&nbsp;free(p-&gt;next);<br />
&nbsp;&nbsp;free(p);<br />
}<br />
<br />
trie*<br />
trie_put(trie* p,&nbsp;<span class="Type">const</span>&nbsp;<span class="Type">char</span>* key,&nbsp;<span class="Type">const</span>&nbsp;<span class="Type">void</span>* value) {<br />
&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(*key ==&nbsp;<span class="Constant">0</span>) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;value = (<span class="Type">void</span>*) value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;p;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;trie* next =&nbsp;<span class="Constant">NULL</span>;<br />
&nbsp;&nbsp;<span class="Type">int</span>&nbsp;i;<br />
&nbsp;&nbsp;<span class="Statement">for</span>&nbsp;(i =&nbsp;<span class="Constant">0</span>; i &lt; p-&gt;n; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(p-&gt;next[i]-&gt;c == *key) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next = p;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">break</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(!next) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(!(next = trie_new()))&nbsp;<span class="Statement">return</span>&nbsp;<span class="Constant">NULL</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;trie** children = (trie**) realloc(p-&gt;next, p-&gt;n *&nbsp;<span class="Statement">sizeof</span>(trie*));<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(!children)&nbsp;<span class="Statement">return</span>&nbsp;<span class="Constant">NULL</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;next = children;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;next-&gt;c = *key;<br />
&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;next[p-&gt;n] = next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;n++;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;trie_put(next, key+<span class="Constant">1</span>, value);<br />
}<br />
<br />
trie*<br />
trie_get(trie* p,&nbsp;<span class="Type">const</span>&nbsp;<span class="Type">char</span>* key) {<br />
&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(p-&gt;c) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(p-&gt;c != *key)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;<span class="Constant">NULL</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(p-&gt;c == *key &amp;&amp; *(key+<span class="Constant">1</span>) ==&nbsp;<span class="Constant">0</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;p;<br />
&nbsp;&nbsp;&nbsp;&nbsp;key++;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<span class="Type">int</span>&nbsp;i;<br />
&nbsp;&nbsp;trie* value =&nbsp;<span class="Constant">NULL</span>;<br />
&nbsp;&nbsp;<span class="Statement">for</span>&nbsp;(i =&nbsp;<span class="Constant">0</span>; i &lt; p-&gt;n; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;((value = trie_get(p-&gt;next[i], key)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;value;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;<span class="Constant">NULL</span>;<br />
}<br />
<br />
<span class="Type">void</span><br />
safe_puts(<span class="Type">const</span>&nbsp;<span class="Type">char</span>* key,&nbsp;<span class="Type">const</span>&nbsp;trie* p) {<br />
&nbsp;&nbsp;<span class="Statement">if</span>&nbsp;(!p)<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="Constant">&quot;</span><span class="Special">%s</span><span class="Constant">&nbsp;not found</span><span class="Special">\n</span><span class="Constant">&quot;</span>, key);<br />
&nbsp;&nbsp;<span class="Statement">else</span>&nbsp;<span class="Statement">if</span>&nbsp;(!p-&gt;value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="Constant">&quot;</span><span class="Special">%s</span><span class="Constant">: null</span><span class="Special">\n</span><span class="Constant">&quot;</span>, key);<br />
&nbsp;&nbsp;<span class="Statement">else</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(<span class="Constant">&quot;</span><span class="Special">%s</span><span class="Constant">:&nbsp;</span><span class="Special">%s</span><span class="Special">\n</span><span class="Constant">&quot;</span>, key, (<span class="Type">char</span>*) p-&gt;value);<br />
}<br />
<br />
<span class="Type">int</span><br />
main(<span class="Type">int</span>&nbsp;argc,&nbsp;<span class="Type">char</span>* argv[]) {<br />
&nbsp;&nbsp;trie* p = trie_new();<br />
&nbsp;&nbsp;trie* v;<br />
<br />
&nbsp;&nbsp;trie_put(p,&nbsp;<span class="Constant">&quot;foo&quot;</span>,&nbsp;<span class="Constant">&quot;bar&quot;</span>);<br />
&nbsp;&nbsp;trie_put(p,&nbsp;<span class="Constant">&quot;bar&quot;</span>,&nbsp;<span class="Constant">&quot;baz&quot;</span>);<br />
<br />
&nbsp;&nbsp;v = trie_get(p,&nbsp;<span class="Constant">&quot;baz&quot;</span>);<br />
&nbsp;&nbsp;safe_puts(<span class="Constant">&quot;baz&quot;</span>, v);<br />
<br />
&nbsp;&nbsp;v = trie_get(p,&nbsp;<span class="Constant">&quot;foo&quot;</span>);<br />
&nbsp;&nbsp;safe_puts(<span class="Constant">&quot;foo&quot;</span>, v);<br />
<br />
&nbsp;&nbsp;v = trie_get(p,&nbsp;<span class="Constant">&quot;bar&quot;</span>);<br />
&nbsp;&nbsp;safe_puts(<span class="Constant">&quot;bar&quot;</span>, v);<br />
<br />
&nbsp;&nbsp;trie_put(p,&nbsp;<span class="Constant">&quot;うんこ&quot;</span>,&nbsp;<span class="Constant">&quot;うんこっこー&quot;</span>);<br />
&nbsp;&nbsp;v = trie_get(p,&nbsp;<span class="Constant">&quot;うんこ&quot;</span>);<br />
&nbsp;&nbsp;safe_puts(<span class="Constant">&quot;うんこ&quot;</span>, v);<br />
<br />
&nbsp;&nbsp;v = trie_get(p,&nbsp;<span class="Constant">&quot;404 blog&quot;</span>);<br />
&nbsp;&nbsp;safe_puts(<span class="Constant">&quot;404 blog&quot;</span>, v);<br />
<br />
&nbsp;&nbsp;trie_free(p);<br />
&nbsp;&nbsp;<span class="Statement">return</span>&nbsp;<span class="Constant">0</span>;<br />
}<br />
</blockquote>


<blockquote class="code">
baz not found<br />
foo: bar<br />
bar: baz<br />
うんこ: うんこっこー<br />
404 blog not found<br />
</blockquote>

    ]]>
    </description>
    <link>http://mattn.kaoriya.net/software/lang/c/20120117135034.htm</link> 
    <pubDate>Tue, 17 Jan 2012 13:52:00 +0900</pubDate>
   </item>
</channel>
</rss>
