<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>inforno</title><link>http://inforno.net/</link><description>Inferno + Information ... inforno</description><copyright>inforno</copyright><lastBuildDate>Mon, 01 Mar 2010 19:51:57 GMT</lastBuildDate><generator>inforno</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Inforno" /><feedburner:info uri="inforno" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item><title>rayphe - 軽量Python web framework</title><link>http://inforno.net/articles/2009/07/24/raphe</link><description>&lt;ul&gt;
 &lt;li&gt;
     2010-2-10: v0.3.0リリースしました。またプロジェクト名を変更しています。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちょっと前にRubyでSinatraが取り上げられて、結構注目されたように思います。ということはRailsだと大げさすぎるなあ、と思うような場合に対する需要というのはやっぱりそれなりにあるんですよね。
&lt;/p&gt;
&lt;p&gt;Pythonで軽量、というと&lt;a href="http://webpy.org/"&gt;web.py&lt;/a&gt;が一番有名ですよね。他には&lt;a href="http://brianreily.com/project/juno"&gt;Juno&lt;/a&gt;、&lt;a href="http://github.com/defnull/bottle/tree/master"&gt;Bottle&lt;/a&gt;なんかがあります。
&lt;/p&gt;
&lt;p&gt;このブログで使っているのはweb.pyです。結構昔から使っています。が、不満もおおくweb.pyを拡張するようなライブラリを作っていて、それがそこそこの量あったりします。
&lt;/p&gt;
&lt;p&gt;そこで、これくらい量があるなら自分でフレームワーク作っても大してかわんなくね？と思い始めました。あれ、そういえば俺、&lt;a href="http://inforno.net/articles/2009/02/12/the-embedded-python-implementation"&gt;テンプレートエンジンもつくっちゃってるじゃん&lt;/a&gt;、簡易O/Rマッパも自分用につくってあるじゃん、と次々に気づき始め、それらをまとめて作っちゃいました。軽量フレームワーク。
&lt;/p&gt;

&lt;h3&gt;rayphe&lt;/h3&gt;
&lt;p&gt;「rayphe」はPython用軽量ウェブフレームワークです。ルーティング、テンプレート、O/Rマッパなどが1ファイルにまとめられていて、依存するライブラリもありません。
&lt;/p&gt;
&lt;p&gt;また、共通の処理をまとめる「フィルタ」があったり、やアプリケーションの各フェーズをフックできたりと柔軟です。
&lt;/p&gt;
&lt;p&gt;raypheはGitHubにおいてあります。それなりにドキュメントも書いていて、テストもしてあります。詳しくは以下をどうぞ。
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;a href="http://yuin.github.com/rayphe/index.html"&gt;ドキュメント&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href="http://github.com/yuin/rayphe/tree/master"&gt;リポジトリ&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;たとえば、サンプルアプリのコードの一部はこんな感じです。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;python&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;context_setup_filter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;except&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;static_file&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}]):&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;static/(unicode:.*)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;static_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;static_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;..&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show_pages&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nd"&gt;@app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;page/(int:\d+)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select_one_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;cond&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;page_id=? order by created_at asc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;page_id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;comment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;comment&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show_page&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;c&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;という感じでわかりやすくかけます。また、「単純化しすぎない」ということにも気を使っていたりします。&lt;code&gt;self&lt;/code&gt;と書くのが好きなPythonistaらしく、&lt;code&gt;status 404&lt;/code&gt;とかじゃなく&lt;code&gt;c.res.notfound()&lt;/code&gt;です。
&lt;/p&gt;

&lt;h3&gt;というわけで&lt;/h3&gt;
&lt;p&gt;Pythonで小さなウェブアプリをつくるときは是非。
&lt;/p&gt;</description><category>framework</category><category>library</category><category>python</category><category>rayphe</category><guid isPermaLink="true">http://inforno.net/articles/2009/07/24/raphe</guid><pubDate>Thu, 23 Jul 2009 15:00:00 GMT</pubDate></item><item><title>XREAで好きなバージョンのPythonを使う方法2</title><link>http://inforno.net/articles/2009/01/25/using-any-version-of-python-on-xrea-servers-part2</link><description>&lt;p&gt;やんごとなき事情によりxrea内でWEBサーバを移動しました。
&lt;/p&gt;
&lt;p&gt;というわけで、このブログ(web.pyによる自作ブログ)を移したわけですが、今までのようにバイナリ化して動かすにはサーバと似た環境が手元にないといけません。が、移動した先のサーバでは環境がだめ。
&lt;/p&gt;
&lt;p&gt;ということで、python2.5をxreaにインストールしました。virtual-pythonもいいんですが、xreaのサーバはpython2.4なので。ちょっと工夫すれば入るし、快適ですね。以下作業ログ。
&lt;/p&gt;

&lt;h3&gt;Pythonをインストール&lt;/h3&gt;
&lt;p&gt;まずはPythonのソースをダウンロードしてコンパイル。&lt;code&gt;~/root/usr/local&lt;/code&gt;にいれます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;mkdir -p ~/root/usr/local/src&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;cd ~/root/usr/local/src&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;wget http://www.python.org/ftp/python/2.5.4/Python-2.5.4.tgz&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;tar zxvf Python-2.5.4.tgz&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;cd Python-2.5.4&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;./configure --prefix=~/root/usr/local&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;make&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;make install&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;サクっと入ります。で、次にeasy_installを入れるわけですが、はいりません。OpenSSLとの絡みで&lt;code&gt;hashlib.md5&lt;/code&gt;が使えないから。&lt;code&gt;easy_install&lt;/code&gt;を入れるときに&lt;code&gt;md5&lt;/code&gt;を検証するのに使ってるんですよね。
&lt;/p&gt;

&lt;h3&gt;hashlibをインストール&lt;/h3&gt;
&lt;p&gt;なんで、自前でhashlibを単体でいれます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;cd ~/root/usr/local/src&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;wget http://code.krypto.org/python/hashlib/hashlib-20081119.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;tar zxvf hashlib-20081119.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;cd hashlib-20081119&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;vi setup.py&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;はい、&lt;code&gt;setup.py&lt;/code&gt;を編集しましょう。普通にbuildするとこれでも&lt;code&gt;md5&lt;/code&gt;が入りません。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;105　　 if (ssl_inc_dir and&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;106　　　　 ssl_lib is not None and&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;107　　　　 openssl_ver &amp;gt;= 0x00907000):&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;108&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;109　　　　 print &amp;#39;Using OpenSSL version 0x%08x from&amp;#39; % openssl_ver&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;110　　　　 print &amp;#39; Headers:\t&amp;#39;, ssl_inc_dir&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;111　　　　 print &amp;#39; Library:\t&amp;#39;, ssl_lib&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;112&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;113　　　　 # The _hashlib module wraps optimized implementations&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;114　　　　 # of hash functions from the OpenSSL library.&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;115　　　　 exts.append( Extension(&amp;#39;_hashlib&amp;#39;, [&amp;#39;_hashopenssl.c&amp;#39;],&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;116　　　　　　　　　　　　　　　　include_dirs = [ ssl_inc_dir ],&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;117　　　　　　　　　　　　　　　　library_dirs = [ os.path.dirname(ssl_lib) ],&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;118　　　　　　　　　　　　　　　　libraries = osNameLibsMap[os.name]) )&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;119　　 exts.append( Extension(&amp;#39;_sha&amp;#39;, [&amp;#39;shamodule.c&amp;#39;]) )　　　　　　　　　&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;120　　 exts.append( Extension(&amp;#39;_md5&amp;#39;,　　　　　　　　　　　　　　　　　　&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;121　　　　　　　　　　 sources = [&amp;#39;md5module.c&amp;#39;, &amp;#39;md5.c&amp;#39;],&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;122　　　　　　　　　　 depends = [&amp;#39;md5.h&amp;#39;]) )&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;119-120あたり、強制的に&lt;code&gt;_md5&lt;/code&gt;を入れるようにします。あとは
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;~/root/usr/local/bin/python setup.py build&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;~/root/usr/local/bin/python setup.py install&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;で&lt;code&gt;hashlib&lt;/code&gt;が入ります。
&lt;/p&gt;

&lt;h3&gt;easy_installをインストール&lt;/h3&gt;
&lt;p&gt;これで&lt;code&gt;md5&lt;/code&gt;が使えるようになったので
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;cd ~/root/usr/local/src&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;wget http://peak.telecommunity.com/dist/ez_setup.py&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;~/root/usr/local/bin/python ez_setup.py&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;これで無事&lt;code&gt;easy_install&lt;/code&gt;が入ります。あとは
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;~/root/usr/local/bin/easy_install -U -Z MySQL_Python&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;てな感じで必要なモジュールを入れていきましょう。
&lt;/p&gt;

&lt;h3&gt;というわけで&lt;/h3&gt;
&lt;p&gt;わりと普通にxreaでPythonが使えています。 
&lt;/p&gt;</description><category>python</category><category>xrea</category><guid isPermaLink="true">http://inforno.net/articles/2009/01/25/using-any-version-of-python-on-xrea-servers-part2</guid><pubDate>Sat, 24 Jan 2009 16:00:00 GMT</pubDate></item><item><title>個人的Go雑感&amp;メモ</title><link>http://inforno.net/articles/2009/11/11/go-language</link><description>&lt;p&gt;Googleが&lt;a href="http://golang.org/"&gt;Goという新しいプログラミング言語&lt;/a&gt;を出したようで。早速、インストールして軽くドキュメントを流し読みしてみました。
&lt;/p&gt;
&lt;p&gt;英語なんて読みたくないよ、という人もいるかもしれないし、誰かの役に立つかもしれないので自分用メモおいときます。完全に自分用なんである程度他の言語の知識がある人向けな上、ざっくり流し読みなんで間違ってるかも。
&lt;/p&gt;

&lt;h3&gt;どんな言語？&lt;/h3&gt;
&lt;ul&gt;
 &lt;li&gt;
     ネイティブコードを吐く、コンパイル型。
 &lt;/li&gt;

 &lt;li&gt;
     速度はCレベル。
 &lt;/li&gt;

 &lt;li&gt;
     GC搭載。ポインタはあるけど、ポインタ演算はできません。
 &lt;/li&gt;

 &lt;li&gt;
     各種アーキに最適化された、それぞれのコンパイラセットを持ちます。例：&lt;ul&gt;
 &lt;li&gt;
     6g, 6l : amd64
 &lt;/li&gt;

 &lt;li&gt;
     8g, 8l : i386
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;
     linux, mac, naclに対応。
 &lt;/li&gt;

 &lt;li&gt;
     動的型言語と静的型言語のおいしいとこどり。
 &lt;/li&gt;

 &lt;li&gt;
     concurrent処理が組み込まれてます。
 &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;個人的雑感&lt;/h3&gt;
&lt;ul&gt;
 &lt;li&gt;
     こんな言語設計思想かなあと感じたり&lt;ul&gt;
 &lt;li&gt;
     とにかく、シンプルな言語に。&lt;ul&gt;
 &lt;li&gt;
     C++の複雑な部分などはできるだけはずしているような。&lt;ul&gt;
 &lt;li&gt;
     いわゆるクラスベースのオブジェクト指向はない。&lt;ul&gt;
 &lt;li&gt;
     継承はない。
 &lt;/li&gt;

 &lt;li&gt;
     あるのはフラットなインタフェース空間のみ。
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;
     例外もない。
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;
     低レイヤからは離れすぎたくない。
 &lt;/li&gt;

 &lt;li&gt;
     concurrentを言語的にサポートしたい。
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;
     以下の言語からの影響を感じたり&lt;ul&gt;
 &lt;li&gt;
     言語コアはC。
 &lt;/li&gt;

 &lt;li&gt;
     C++はパッケージの書き方、記法に影響がみられる。
 &lt;/li&gt;

 &lt;li&gt;
     命名規則や記法にPythonの影響がみられる。
 &lt;/li&gt;

 &lt;li&gt;
     concurrentな部分はErlangから影響をうけている。
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;言語仕様&lt;/h3&gt;
&lt;p&gt;自分なりに簡単にまとめて見ます。
&lt;/p&gt;

&lt;h4&gt;変数への代入&lt;/h4&gt;
&lt;p&gt;下へ行くほど省略形。&lt;code&gt;var&lt;/code&gt;もあるから&lt;code&gt;const&lt;/code&gt;もあるでよ。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;var s string = &amp;quot;&amp;quot;;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;var s = &amp;quot;&amp;quot;;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;s := &amp;quot;&amp;quot;;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;h4&gt;オブジェクト構造&lt;/h4&gt;
&lt;p&gt;値扱いの型と参照型があります。
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     値扱い : 代入、関数への私はコピーとなる。配列もまるごとコピーされる。&lt;ul&gt;
 &lt;li&gt;
     各種数値 : &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;float&lt;/code&gt;といったプラットフォームごとにサイズがきまる型と&lt;code&gt;int32&lt;/code&gt;のようにサイズ固定の型。
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;string&lt;/code&gt; : 不変、UTF8、ただのバイト配列
 &lt;/li&gt;

 &lt;li&gt;
     配列
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;struct&lt;/code&gt; : ユーザ定義型
 &lt;/li&gt;

 &lt;li&gt;
     などなど
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;
     参照 : 3つのみ&lt;ul&gt;
 &lt;li&gt;
     &lt;code&gt;map&lt;/code&gt; : 辞書
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;slice&lt;/code&gt; : 明示的なサイズを持たない、配列のようなもの
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;channel&lt;/code&gt; : concurrentで使う
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;値扱い型のアロケート方法 : &lt;code&gt;new -&amp;gt; T*&lt;/code&gt;を返す
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;var t *T = new(T);&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;参照型のアロケート方法 : &lt;code&gt;make -&amp;gt; T&lt;/code&gt;を返す
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;m := make(map[string]int);&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;// これはダメ&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;var m map[string]int;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;h4&gt;配列とスライス&lt;/h4&gt;
&lt;ul&gt;
 &lt;li&gt;
     配列は「値」。でユーザがメモリ構造などを読める。スライスはコンパイラがよしなに確保する、参照型。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば&lt;code&gt;int&lt;/code&gt;型配列のポインタを受け取る場合。
&lt;/p&gt;
&lt;p&gt;標準配列(&amp;amp;がいる)
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;s := sum(&amp;amp;[3]int{1,2,3});&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;s := sum(&amp;amp;[...]int{1,2,3});&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;スライス
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;s := sum([]int{1,2,3});&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;h4&gt;辞書型&lt;/h4&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;timeZone := map[string]int{&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;quot;UTC&amp;quot;: 0*60*60,&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;quot;EST&amp;quot;: -5*60*60,&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;quot;CST&amp;quot;: -6*60*60,&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;quot;MST&amp;quot;: -7*60*60,&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;quot;PST&amp;quot;: -8*60*60,&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;seconds, ok = timeZone[tz]&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;//値がなければokはfalse&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;if seconds, ok := timeZone[tz]; ok {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return seconds&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;//消す場合&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;timeZone[&amp;quot;UTC&amp;quot;] = 0, false;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;h4&gt;パッケージ、制御構造、型定義、関数とメソッド、インタフェース&lt;/h4&gt;
&lt;p&gt;命名規則に特徴があります。&lt;strong&gt;大文字始まり以外は外部から見えない&lt;/strong&gt;が原則。単なる命名規則ではなく、そういう仕様。
&lt;/p&gt;
&lt;h5&gt;パッケージ&lt;/h5&gt;&lt;p&gt;パッケージ文でファイルの先頭に書きます。これが基本的な単位となります。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;package file&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;h5&gt;制御構造&lt;/h5&gt;&lt;p&gt;特徴は
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     ()がいらない。
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;if&lt;/code&gt;や&lt;code&gt;switch&lt;/code&gt;などの条件部に複数の文がかける
 &lt;/li&gt;

 &lt;li&gt;
     ループは&lt;code&gt;for&lt;/code&gt;のみ(&lt;code&gt;while&lt;/code&gt;や&lt;code&gt;do&lt;/code&gt;はない)
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;switch&lt;/code&gt;が強力に(内容的にif-else if-elseチェイン)
 &lt;/li&gt;

 &lt;li&gt;
     concurrent用に&lt;code&gt;select&lt;/code&gt;がある
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という点。かと。
&lt;/p&gt;
&lt;p&gt;ifの例
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;if i % prime != 0 {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;%d&amp;quot;, i);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;switchの例
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;switch nr, er := f.Read(&amp;amp;buf); true {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case nr &amp;lt; 0:&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Fprintf(os.Stderr, &amp;quot;cat: error reading from %s: %s\n&amp;quot;, f.String(), er.String());&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;os.Exit(1);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case nr == 0: // EOF&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case nr &amp;gt; 0:&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if nw, ew := file.Stdout.Write(buf[0:nr]); nw != nr {&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Fprintf(os.Stderr, &amp;quot;cat: error writing from %s: %s\n&amp;quot;, f.String(), ew.String());&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;caseに条件式がかける。breakは自動でされる。
&lt;/p&gt;
&lt;h5&gt;型定義&lt;/h5&gt;&lt;p&gt;&lt;code&gt;type&lt;/code&gt;,&lt;code&gt;struct&lt;/code&gt;キーワードを組み合わせる。&lt;strong&gt;メンバにメソッドは含みません。&lt;/strong&gt;
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;type File struct {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fd int; // file descriptor number&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name string; // file name at Open time&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;メンバ名が小文字なので、パッケージ外からは見えません。
&lt;/p&gt;
&lt;h5&gt;関数とメソッド&lt;/h5&gt;&lt;ul&gt;
 &lt;li&gt;
     両方とも&lt;code&gt;func&lt;/code&gt;キーワードで定義。
 &lt;/li&gt;

 &lt;li&gt;
     違いはレシーバを指定するか否か。 レシーバを明示的に書くところはPythonっぽい。
 &lt;/li&gt;

 &lt;li&gt;
     多値が返せる。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この多値がかえせる、というのがGoでは非常に重要な意味をもっています。
&lt;/p&gt;
&lt;p&gt;関数定義: 多値を返しています。大文字始まりなので、外部に公開されます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;func Open(name string, mode int, perm int) (file *File, err os.Error) {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r, e := syscall.Open(name, mode, perm);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if e != 0 {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err = os.Errno(e);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return newFile(r, name), err&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;返す型に&lt;code&gt;(file *File, err os.Error)&lt;/code&gt;と変数名がついてますね。これをつけておけば&lt;code&gt;return;&lt;/code&gt;ってかくだけでその名前の変数を返してくれます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;func Open(name string, mode int, perm int) (file *File, err os.Error) {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r, e := syscall.Open(name, mode, perm);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if e != 0 {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;err = os.Errno(e);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file = newFile(r, name)&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;こんな風にもかけるってことです。おそらく、エラー処理が絡む場合とかこっちのほうが書きやすかったりするんじゃないですかね。
&lt;/p&gt;
&lt;p&gt;クロージャにもなります。いわゆる関数ポインタをとるようなところで、関数がそのままかけて外部変数も見えます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;startServer(func(a, b int) int { return a + b });&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;メソッド定義。&lt;code&gt;(file *File)&lt;/code&gt;がレシーバの指定。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;func (file *File) Close() os.Error {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if file == nil {&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return os.EINVAL&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e := syscall.Close(file.fd);&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file.fd = -1; // so it can&amp;#39;t be closed again&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if e != 0 {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return os.Errno(e);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return nil&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;メソッド定義が&lt;code&gt;struct&lt;/code&gt;での型定義時ではないことに注目。つまり&lt;strong&gt;組み込み型などに対してもあとからメソッドを作成できるのです&lt;/strong&gt;。こんな感じ。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;type IntArray []int&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;func (p IntArray) Len() int { return len(p); }&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;h5&gt;インタフェース&lt;/h5&gt;&lt;p&gt;これ重要。Goはいわゆるクラスがないので、継承などもなく&lt;strong&gt;インタフェースによるダックタイピングでそれらを片付けます&lt;/strong&gt;。 &lt;code&gt;interface&lt;/code&gt;キーワードで定義。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;type reader interface {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Read(b []byte) (ret int, err os.Error);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String() string;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;このように、&lt;code&gt;Read&lt;/code&gt;と&lt;code&gt;String&lt;/code&gt;が定義されていればそれは&lt;code&gt;reader&lt;/code&gt;なんだ、と考えます(&lt;strong&gt;ダックタイピング&lt;/strong&gt;)。
&lt;/p&gt;
&lt;p&gt;実行時、動的にインタフェースが実装されているかも検査できます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;s, ok := v.(Stringer);&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;v&lt;/code&gt;が&lt;code&gt;Stringer&lt;/code&gt;インタフェースを満たしていれば
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;code&gt;s&lt;/code&gt;に&lt;code&gt;Stringer&lt;/code&gt;オブジェクトとしてのv
 &lt;/li&gt;

 &lt;li&gt;
     &lt;code&gt;ok&lt;/code&gt;に&lt;code&gt;true&lt;/code&gt;が
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;がかえってきます。
&lt;/p&gt;

&lt;h4&gt;Concurrency&lt;/h4&gt;
&lt;p&gt;concurrentプログラミングはGoの大きな特徴。&lt;strong&gt;CSP(Communicating Sequential Processes)&lt;/strong&gt;に基づいてます。並行して動く「goroutines」という軽量プロセスが「channel」を介してやりとり。ガードと多重化のためにselect文があります。
&lt;/p&gt;
&lt;p&gt;channelは単体ではなくchan 受け渡しする型という感じで書きます。以下はチュートリアルのコードまんまです。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;func generate(ch chan int) {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i := 2; ; i++ {&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ch &amp;lt;- i // Send &amp;#39;i&amp;#39; to channel &amp;#39;ch&amp;#39;.&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;int&lt;/code&gt;を扱う&lt;code&gt;channel&lt;/code&gt;を受け取ってそれにiを送っていきます。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;func filter(in, out chan int, prime int) {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for {&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i := &amp;lt;-in; // Receive value of new variable &amp;#39;i&amp;#39; from &amp;#39;in&amp;#39;.&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if i % prime != 0 {&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out &amp;lt;- i // Send &amp;#39;i&amp;#39; to channel &amp;#39;out&amp;#39;.&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;送られた&lt;code&gt;i&lt;/code&gt;が一定の条件を満たしていたら、&lt;code&gt;int&lt;/code&gt;を扱う&lt;code&gt;out&lt;/code&gt;というchannelに送ります。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;func main() {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ch := make(chan int); // Create a new channel.&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;go generate(ch); // Start generate() as a goroutine.&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for {&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prime := &amp;lt;-ch;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(prime);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ch1 := make(chan int);&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;go filter(ch, ch1, prime);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ch = ch1&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;channelは参照型なので&lt;code&gt;make&lt;/code&gt;で作ります。&lt;code&gt;go&lt;/code&gt;で実行します。これは丁寧に書いた感じ。クロージャを使えばもっとシンプル。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;func generate() chan int {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ch := make(chan int);&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;go func(){&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i := 2; ; i++ {&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ch &amp;lt;- i&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}();&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ch;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;h5&gt;多重化とガード&lt;/h5&gt;&lt;p&gt;複数のチャンネルをとりあつかって、それらをガードにより振り分けられます。ErlangやScalaでおなじみの書き方です。
&lt;/p&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;func server(op binOp, service chan *request, quit chan bool) {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for {&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select {&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case req := &amp;lt;-service:&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;go run(op, req); // don&amp;#39;t wait for it&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case &amp;lt;-quit:&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;request&lt;/code&gt;型のポインタを扱うchannelと&lt;code&gt;bool&lt;/code&gt;型を扱うchannelを使って、多重化しています。&lt;code&gt;quit&lt;/code&gt;チャンネルに値が送られてくるまでは、送られてきたものから良しなに処理してくれる、という感じですね。
&lt;/p&gt;

&lt;h3&gt;というわけで&lt;/h3&gt;
&lt;p&gt;なぐり書きしたメモでした。変なことかいてたらすみません。まぁこんな感じな言語かなあ、という程度で。
&lt;/p&gt;
&lt;p&gt;繰り替えしになりますが、C言語を元にシンプルに保ちながらconcurrentプログラミングしやすくしてます、って感じですね。完全にダックタイピングベースで多値を多様するスタイルはおもしろいですね。なんとなく見た目がキモく感じるのは私の気のせいでしょう。
&lt;/p&gt;
&lt;p&gt;というか数ヶ月もブログ放置してたのかー。コード書いてないわけじゃないんですけど、たいしたもんかいてないんですよね。割合的には8割がたCかな。月一くらいはブログ書いていきたいなあ・・・ 
&lt;/p&gt;</description><category>go</category><category>language</category><guid isPermaLink="true">http://inforno.net/articles/2009/11/11/go-language</guid><pubDate>Wed, 11 Nov 2009 11:00:00 GMT</pubDate></item><item><title>一瞬で今いるフォルダでcmd.exeを開く</title><link>http://inforno.net/articles/2009/06/28/open-cmd-here</link><description>&lt;p&gt;Windows XPを使用していると、とにかく開いているフォルダでcmd.exeを起動したい、となることは多いです。
&lt;/p&gt;
&lt;p&gt;よくあるのは右クリックから開く、というやつ。まぁ当然、キーボード派の私にはありえない選択です。
&lt;/p&gt;
&lt;p&gt;んで、昔からCのプログラムとWSHをくみあわせてキーボードから開けるようにしていたのですが、やっぱWSHが絡むので遅い。
&lt;/p&gt;
&lt;p&gt;というわけでCだけで作ってみました。せっかくなのでおいておきます。
&lt;/p&gt;

&lt;h3&gt;ダウンロード&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://inforno.net/static/files/explorexe.zip"&gt;explorexe.zip&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;使い方&lt;/h3&gt;
&lt;p&gt;解凍してできたexplorexe.exeのショートカットをデスクトップにつくります。
&lt;/p&gt;
&lt;p&gt;んで、ショートカットを右クリックして、
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     「リンク先」で&lt;code&gt;cmd.exe /k cd /d %s&lt;/code&gt;を後ろに追加します。&lt;ul&gt;
 &lt;li&gt;
     例:&lt;code&gt;C:\Documents and Settings\yourname\デスクトップ\explorexe.exe cmd.exe /k cd /d %s&lt;/code&gt;
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;

 &lt;li&gt;
     「ショートカットキー」を適当に設定します。&lt;ul&gt;
 &lt;li&gt;
     例:Ctrl + Alt + C
 &lt;/li&gt;
&lt;/ul&gt;

 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これでOK。あとはエクスプローラを表示して、&lt;code&gt;Ctrl + Alt + C&lt;/code&gt;を押せばそのエクスプローラに表示されているフォルダをカレントにしてcmd.exeが開きます。
&lt;/p&gt;
&lt;p&gt;あとは、コマンドライン型ランチャーなんかに同様に登録するとめっさ快適です。
&lt;/p&gt;

&lt;h3&gt;応用？&lt;/h3&gt;
&lt;p&gt;えー、見てのとおり引数の文字列に&lt;code&gt;printf&lt;/code&gt;しているだけなので、cmd.exe以外にも使えます。&lt;code&gt;%s&lt;/code&gt;にあたるカレントフォルダのパスは空白が含まれている場合は自動的に「"」で囲まれます。
&lt;/p&gt;</description><category>windows</category><guid isPermaLink="true">http://inforno.net/articles/2009/06/28/open-cmd-here</guid><pubDate>Sat, 27 Jun 2009 15:00:00 GMT</pubDate></item><item><title>Python版Yahooテキスト解析 APIライブラリをキーフレーズ抽出に対応させました</title><link>http://inforno.net/articles/2009/06/04/yahoo-jlp-api-wrapper-for-python-4</link><description>&lt;p&gt;しました。
&lt;/p&gt;

&lt;h3&gt;ダウンロード&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://inforno.net/static/files/yahooapi_0_4.zip"&gt;yahooapi&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;使い方&lt;/h3&gt;
&lt;div class="hightlight"&gt;&lt;span class="lang"&gt;python&amp;nbsp;code&lt;/span&gt;&lt;ol&gt;&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;yahooapi.jlp&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yahooapi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyphraseServiceAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;apikey&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="n"&gt;result_obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentence&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;u&amp;quot;東京ミッドタウンから青山一丁目駅まで歩いて15分かかります&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result_obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Keyphrase&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="c"&gt;# =&amp;gt; 東京ミッドタウン&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&lt;span class="c"&gt;# =&amp;gt; 青山一丁目駅&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="odd"&gt;&lt;code&gt;&lt;span class="c"&gt;# =&amp;gt; 15分&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li class="even"&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;うむ。
&lt;/p&gt;</description><category>api</category><category>library</category><category>python</category><category>text</category><category>yahoo</category><guid isPermaLink="true">http://inforno.net/articles/2009/06/04/yahoo-jlp-api-wrapper-for-python-4</guid><pubDate>Wed, 03 Jun 2009 15:00:00 GMT</pubDate></item></channel></rss>

