<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <title>mojavy.com</title>
    <link>http://mojavy.com/blog</link>
    <description></description>
    <pubDate>Wed, 27 Feb 2013 23:46:03 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>pythonのswigエクステンションからdebian packageをつくる手順メモ</title>
      <link>http://mojavy.com/blog/2013/02/27/building-python-debian-package/</link>
      <pubDate>Wed, 27 Feb 2013 23:46:03 JST</pubDate>
      <category><![CDATA[python]]></category>
      <category><![CDATA[debian]]></category>
      <category><![CDATA[linux]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/02/27/building-python-debian-package/</guid>
      <description>pythonのswigエクステンションからdebian packageをつくる手順メモ</description>
      <content:encoded><![CDATA[<p><img alt="debian" src="/images/debian-200.png" /></p>
<p>注: 以下は古めの環境(Lenny or Squeeze)と古めのpython (2.5 or 2.6)をターゲットにしたときの手順なので、最新の環境では別な方法があるかもしれません。</p>
<h2 id="_1">目次</h2>
<div class="toc">
<ul>
<li><a href="#_1">目次</a><ul>
<li><a href="#1">1. 必要なパッケージをインストール</a></li>
<li><a href="#2-setuppy">2. setup.pyをかく</a></li>
<li><a href="#3">3. ビルド確認</a></li>
<li><a href="#4-debianize">4. debianizeする</a></li>
<li><a href="#5-deb">5. debをつくる</a></li>
<li><a href="#_2">その他ツール等</a></li>
</ul>
</li>
</ul>
</div>
<h3 id="1">1. 必要なパッケージをインストール</h3>
<ul>
<li>python-setuptools</li>
<li>python-all-dev</li>
<li>python-support</li>
<li>python-stdeb</li>
<li>swig</li>
<li>debhelper</li>
<li>devscripts</li>
<li>dh_make</li>
</ul>
<p>たぶんこれだけあれば大丈夫。(python-supportはdeprecatedらしいけどここでは無視)</p>
<h3 id="2-setuppy">2. setup.pyをかく</h3>
<p><code>apt-get source python-xxx</code>で適当なパッケージのソースをダウンロードして参考にするとよい</p>
<p>以下例</p>
<div class="pygments_borland"><pre><span class="c">#!/usr/bin/python</span>

<span class="kn">from</span> <span class="nn">setuptools</span> <span class="kn">import</span> <span class="n">setup</span><span class="p">,</span> <span class="n">Extension</span>

<span class="n">__version__</span> <span class="o">=</span> <span class="s">&quot;0.0.1&quot;</span>

<span class="n">setup</span><span class="p">(</span><span class="n">name</span>         <span class="o">=</span> <span class="s">&quot;yourext&quot;</span><span class="p">,</span>
      <span class="n">version</span>      <span class="o">=</span> <span class="n">__version__</span><span class="p">,</span>
      <span class="n">author</span>       <span class="o">=</span> <span class="s">&quot;Your Name&quot;</span><span class="p">,</span>
      <span class="n">author_email</span> <span class="o">=</span> <span class="s">&quot;yourname@example.com,</span>
      <span class="n">url</span>          <span class="o">=</span> <span class="s">&quot;http://example.com/python-yourext&quot;</span><span class="p">,</span>
      <span class="n">download_url</span> <span class="o">=</span> <span class="s">&quot;http://example.com/python-yourext-</span><span class="si">%s</span><span class="s">.tgz&quot;</span> <span class="o">%</span> <span class="n">__version__</span><span class="p">,</span>
      <span class="n">description</span>  <span class="o">=</span> <span class="s">&quot;yourext client library for python&quot;</span><span class="p">,</span>
      <span class="n">long_description</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">&#39;README.md&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span>
      <span class="n">license</span>      <span class="o">=</span> <span class="s">&quot;LGPL&quot;</span><span class="p">,</span>
      <span class="n">platforms</span>    <span class="o">=</span> <span class="p">[</span><span class="s">&quot;Platform Independent&quot;</span><span class="p">],</span>
      <span class="n">classifiers</span>  <span class="o">=</span> <span class="p">[</span>
        <span class="s">&quot;Development Status :: 5 - Production/Stable&quot;</span><span class="p">,</span>
        <span class="s">&quot;Intended Audience :: Developers&quot;</span><span class="p">,</span>
        <span class="s">&quot;License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)&quot;</span><span class="p">,</span>
        <span class="s">&quot;Operating System :: OS Independent&quot;</span><span class="p">,</span>
        <span class="s">&quot;Programming Language :: Python&quot;</span><span class="p">,</span>
        <span class="s">&quot;Topic :: Software Development :: Libraries :: Python Modules&quot;</span>
      <span class="p">],</span>
      <span class="n">ext_modules</span>  <span class="o">=</span> <span class="p">[</span>
        <span class="n">Extension</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;yourext&#39;</span><span class="p">,</span>
                  <span class="n">sources</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;path_to_swig/yourext.i&#39;</span><span class="p">],</span>
                  <span class="n">include_dirs</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;path_to_lib/include&#39;</span><span class="p">],</span>
                  <span class="n">library_dirs</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;path_to_lib/lib&#39;</span><span class="p">],</span>
                  <span class="n">libraries</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;yourlibrary&#39;</span><span class="p">],</span>
                  <span class="n">define_macros</span><span class="o">=</span><span class="p">[(</span><span class="n">FOO_BAR</span><span class="p">,</span> <span class="mi">123</span><span class="p">),</span> <span class="p">(</span><span class="n">DEBUG</span><span class="p">,</span> <span class="bp">None</span><span class="p">)],</span>
                  <span class="n">extra_compile_args</span><span class="o">=</span><span class="p">[</span><span class="s">&#39;-std=gnu99&#39;</span><span class="p">,</span> <span class="s">&#39;-Wextra&#39;</span><span class="p">],</span>
                  <span class="p">)</span>
      <span class="p">],</span>
      <span class="n">py_modules</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;pure_python_module_name&#39;</span><span class="p">,</span> <span class="s">&#39;foo.bar&#39;</span><span class="p">],</span>
      <span class="n">include_dirs</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;&#39;</span><span class="p">],</span>
<span class="p">)</span>
</pre></div>

<ul>
<li>ext_modulesの中にExtensionをかく
<ul></li>
<li>Extension.sources にはswigの定義ファイルを直接指定できる</li>
<li>Extension.include_dirs, Extension.library_dirs, Extension.librariesはそれぞれgccでいう<code>-I, -L, -l</code>の値</li>
<li>Extension.define_macrosはタプルで渡す。上の例だと <code>-DFOO_BAR=123 -DDEBUG</code> の意味</li>
<li>Extension.extra_compile_args はその他のコンパイルオプション
</ul></li>
<li>platforms, classifiersの内容はpython-cjsonあたりからコピーした</li>
<li>pure pythonの部分はpy_modulesにモジュール名を列挙する。パスではない</li>
<li>swigが生成した<code>.py</code>ファイルをpy_modulesに含める汎用的な方法は見つからなかった。(必要な場合はスクリプトでinclude_dirsにコピーすることで対応できる)</li>
</ul>
<h3 id="3">3. ビルド確認</h3>
<p>以下コマンドでpython extのビルドを確認する。成功すると、buildディレクトリ以下に共有ライブラリが生成される</p>
<p><code>python setup.py build</code></p>
<h3 id="4-debianize">4. debianizeする</h3>
<p>以下コマンドでdebianパッケージに必要なファイルを生成する。このときegg-info等も生成される</p>
<p><code>python setup.py --command-package=stdeb.command debianize --force-buildsystem=True</code></p>
<h3 id="5-deb">5. debをつくる</h3>
<p><code>debuild -uc -us</code></p>
<p><code>-uc -us</code>は署名を省略するためのオプション。</p>
<p>成功すると、親ディレクトリにdebファイルができてるはず</p>
<h3 id="_2">その他ツール等</h3>
<ul>
<li>dupload: リポジトリにアップロードするためのもの</li>
<li>dlocate: <code>dlocate -S filename</code> のようにすればそのファイルを含むパッケージを調べることができる</li>
<li>cdbs: debianパッケージを作成するための別なやりかた(?)。 ちゃんとしらべてない</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>ワンライナーでウェブサーバを起動する方法</title>
      <link>http://mojavy.com/blog/2012/07/18/one-line-webserver/</link>
      <pubDate>Wed, 18 Jul 2012 12:30:00 JST</pubDate>
      <category><![CDATA[python]]></category>
      <category><![CDATA[web]]></category>
      <category><![CDATA[ruby]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2012/07/18/one-line-webserver/</guid>
      <description>ワンライナーでウェブサーバを起動する方法</description>
      <content:encoded><![CDATA[<p><img alt="ruby" src="/images/ruby-logo.png" /></p>
<p>とりあえずウェブサーバがたちあがりさえすればいいときは、pythonのSimpleHTTPServerを使うのが便利です。
起動したカレントディレクトリ以下のファイルをブラウズできるので、テスト用のスタティックなスタブデータを一時的に配置したいときとかにも使えます。最近の一般的なlinuxディストリビューションであればデフォルトではいってるpythonで使えると思います。</p>
<div class="pygments_borland"><pre><span class="nv">$ </span>python -mSimpleHTTPServer 3333
</pre></div>

<p>デフォルトポートは8000ですが、引数で指定することもできます。
<br>
ちなみにrubyでもwebrickを使って同様のことができますが、<a href="http://d.hatena.ne.jp/rx7/20090812/p1">こちら</a> で紹介されているwebrickのワンライナーは長すぎて覚えられないのでいつもpythonを使ってます。
<br>
<br>
でもリクエストに応じたロジックを入れたい場合はrubyのsinatraの方が便利です。</p>
<div class="pygments_borland"><pre><span class="nv">$ </span>ruby -rsinatra -e <span class="s1">&#39;get(&quot;/&quot;){sleep 3}&#39;</span>
</pre></div>

<p>ポートを変更する場合は以下のようにします</p>
<div class="pygments_borland"><pre><span class="nv">$ </span>ruby -rsinatra -e <span class="s1">&#39;set :port,3333; get(&quot;/&quot;){sleep 3}&#39;</span>
</pre></div>

<h2 id="_1">参考</h2>
<ul>
<li><a href="http://d.hatena.ne.jp/rx7/20090812/p1">コマンド1つで今すぐWebサーバを起動させるためのワンライナー(Ruby or Python)</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>debian lennyのEnd Of Life対応</title>
      <link>http://mojavy.com/blog/2012/06/06/debian-lenny-oldstable/</link>
      <pubDate>Wed, 06 Jun 2012 10:30:00 JST</pubDate>
      <category><![CDATA[python]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2012/06/06/debian-lenny-oldstable/</guid>
      <description>debian lennyのEnd Of Life対応</description>
      <content:encoded><![CDATA[<p><img alt="debian" src="/images/debian_logo.png" /></p>
<p>debian lennyは2012-02-06にEnd of lifeを迎えました。
それに伴いlennyのリポジトリもoldstable扱いとなりパスが変わったため、デフォルトのsources.listでは404 Not Foundとなってパッケージがインストールできなくなってしまいました。
早めにアップデートしたほうが好ましいですが、そのまま引き続きlennyを使いたい場合もあると思います。
そのような場合は以下のようにsources.listを変更してやれば今までどおりパッケージをとれるようになります。</p>
<div class="pygments_borland"><pre>deb http://archive.debian.org/debian-security/ lenny/updates main
deb-src http://archive.debian.org/debian-security/ lenny/updates main

deb http://archive.debian.org/debian/ lenny main
deb-src http://archive.debian.org/debian/ lenny main
</pre></div>

<p>backportsなどもarchiveのほうにあるのでお好みで追加してください。</p>
<h1 id="_1">参考</h1>
<ul>
<li><a href="http://archive.debian.org/">http://archive.debian.org/</a></li>
<li><a href="http://wiki.debian.org/DebianLenny">http://wiki.debian.org/DebianLenny</a></li>
<li><a href="http://wiki.debian.org/DebianOldStable">http://wiki.debian.org/DebianOldStable</a></li>
</ul>
<p><br></p>]]></content:encoded>
    </item>
    <item>
      <title>1分でpython環境を整える方法</title>
      <link>http://mojavy.com/blog/2012/04/22/virtualenv-burrito/</link>
      <pubDate>Sun, 22 Apr 2012 17:30:00 JST</pubDate>
      <category><![CDATA[python]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2012/04/22/virtualenv-burrito/</guid>
      <description>1分でpython環境を整える方法</description>
      <content:encoded><![CDATA[<p><img alt="python" src="/images/python-logo.gif" /></p>
<p>pythonではvirtualenvというユーティリティを使って複数の環境を切り替えることができます。しかしvirtualenvはセットアップがちょっとわかりにくかったりバージョンによってはこけたりしていまいち使いこなせていませんでした。久し振りにブログを書くついでにpython環境を再構築しようと思って調べたところ、<a href="https://github.com/brainsik/virtualenv-burrito">virtualenv-burrito</a> というのが使いやすかったので紹介します。これを使えば非常に簡単にpython環境を整えることができます。</p>
<h1 id="_1">インストール</h1>
<div class="pygments_borland"><pre><span class="nv">$ </span>curl -s https://raw.github.com/brainsik/virtualenv-burrito/master/virtualenv-burrito.sh | <span class="nv">$SHELL</span>
</pre></div>

<p>として再ログインするだけです。勝手にパスやシェルの補完設定もしてくれます。</p>
<h1 id="_2">使い方</h1>
<p>新しい環境の構築は、</p>
<div class="pygments_borland"><pre><span class="nv">$ </span>mkvirtualenv newname
</pre></div>

<p><br></p>
<p>環境の切り替えは、</p>
<div class="pygments_borland"><pre><span class="nv">$ </span>workon newname
<span class="nv">$ </span><span class="c"># or</span>
<span class="nv">$ </span>workon 2.7
</pre></div>

<p><br></p>
<p>不要な環境の削除は、</p>
<div class="pygments_borland"><pre><span class="nv">$ </span>rmvirtualenv newname
</pre></div>

<p><br></p>
<p>以上が基本的な使い方です。さらに詳しい使い方は<a href="http://www.doughellmann.com/docs/virtualenvwrapper/command_ref.html">virtualenvwrapperのコマンドリファレンス</a>等をみてください。</p>
<h1 id="_3">解説</h1>
<p>virtualenv-burrito自体はvirtualenv+virtualenvwrapperの環境を構築するだけなので、本格的に使いたい場合はvirtualenvについての理解が必要です。ただ、ほとんどの場合は単にバージョンとパッケージが切り替えられればいいと思うので、mkvirtualenvとworkonさえ覚えておけば十分です。
いくつか注意点もあります。</p>
<ul>
<li>pythonのバイナリはあらかじめインストールされている必要があります。</li>
<li>python3だとうごきません。python3環境が作れないという意味ではなく、デフォルトパスのpythonバージョンが3だとvirtualenv-burritoのセットアップ途中でこけます。その場合はpython2系をつかってください。</li>
<li>pipのインストールでこける場合があります。その場合は以下のようなコマンドで回避できます。 <a href="https://github.com/brainsik/virtualenv-burrito/issues/16">(参考)</a></li>
</ul>
<div class="pygments_borland"><pre><span class="nv">$ </span>rm -Rf ~/.venvburrito/lib/python/distribute-0.6.24-py2.7.egg
<span class="nv">$ </span>mkvirtualenv -p <span class="k">$(</span>which python3.2<span class="k">)</span> --distribute py32
</pre></div>

<h1 id="_4">まとめ</h1>
<p>いまからpython環境を構築するならvirtualenv-burritoつかっとくと、virtualenvとvirtualenvwrapperをセットアップするまでの手間が省けていいと思います</p>
<h1 id="_5">関連リンク</h1>
<ul>
<li><a href="https://github.com/brainsik/virtualenv-burrito">virtualenv-burrito</a></li>
<li><a href="http://pypi.python.org/pypi/virtualenv">virtualenv</a></li>
<li><a href="http://www.doughellmann.com/docs/virtualenvwrapper/">virtualenvwrapper</a>
<br></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>blogofileでサムネイル画像を表示する方法</title>
      <link>http://mojavy.com/blog/2011/11/06/blofofile-test/</link>
      <pubDate>Sun, 06 Nov 2011 20:32:51 JST</pubDate>
      <category><![CDATA[python]]></category>
      <category><![CDATA[memo]]></category>
      <category><![CDATA[blogofile]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2011/11/06/blofofile-test/</guid>
      <description>blogofileでサムネイル画像を表示する方法</description>
      <content:encoded><![CDATA[<p><img alt="rena" src="/images/rena.jpg" /></p>
<p>こんな風にイメージ画像がある記事の場合は、一覧ページでもこの画像をサムネイルで表示させたい。</p>
<p>例えば、
<a href="http://mojavy.com">http://mojavy.com</a>
のトップページ右カラムにある最近の記事一覧みたいに画像を表示できるようにする。</p>
<p>これをするには、postオブジェクトにそういう属性をもたせればよいので、controllers/blog/post.pyに以下のように一行追加する。</p>
<div class="pygments_borland"><pre><span class="gi">+++ b/_blogofile/_controllers/blog/post.py</span>
<span class="gu">@@ -93,6 +93,7 @@ class Post(object):</span>
         self.slug = None
         self.draft = False
         self.filters = None
<span class="gi">+        self.image = None</span>
         self.__parse()
         self.__post_process()
</pre></div>

<p>そうしておくと、各記事のヘッダにあるyamlから勝手に読み込んでくれるので、</p>
<div class="pygments_borland"><pre><span class="l-Scalar-Plain">categories</span><span class="p-Indicator">:</span>
<span class="l-Scalar-Plain">date</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">2011/11/06 20:32:51</span>
<span class="l-Scalar-Plain">title</span><span class="p-Indicator">:</span>
<span class="l-Scalar-Plain">image</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">/images/rena.jpg</span>
</pre></div>

<p>のようにすれば${post.image}のようにして参照できる。</p>
<ul>
<li><a href="https://github.com/taksatou/taksatou.github.com">https://github.com/taksatou/taksatou.github.com</a></li>
</ul>]]></content:encoded>
    </item>
  </channel>
</rss>
