python

gypでdebugとrelease設定を分ける
gypでdebugとrelease設定を分ける gypでvc2010向けのプロジェクトが生成できたので、 実用に向けて設定のテンプレート的なものを準備する。 ビルドオートメーションツールGYPを使おう https://code.google.com/p/gyp/source/browse/trunk/test/win/linker-flags/pdb-output.gyp?spec=svn1832&r=1832 を参考に設定を追加。 Debug, Release設定の追加 main.cpp projects.gyp common.gypi > gyp projects.gyp --depth . とりあえずDebugでステップ実行できた。 こりゃ、よく使うパターンの雛形を揃えるまでは苦しいですな。 premake4, cmakeもそうだった。

python製のビルドツールgypを使ってみる
python製のビルドツールgypを使ってみる gyp(Generate Your Projects) は、 pythonで記述されたプロジェクト生成ツールで設定からVC向けプロジェクトや、GCC向けMakefileを生成するツールである。 chromeやnode.jsのビルドツールとして採用されているそうな。 機能的にはpremake4やcmakeと同じ範囲をカバーするがそれぞれ以下のような問題があった。 premake4はわりと気に入っているのだが布教困難。luaで宣言的に記述するのが分かりづらい cmakeはcmake語が解読不能でちょっとしたプロジェクトのカスタマイズが困難すぎる(OpenCVとかのことだ) そこで、python製のgypを試してみた。 gyp導入 環境は、Windows7 + python3。 > python setup.py install : 中略 : SyntaxError: invalid syntax File "c:\python33\lib\site-packages\gyp-0.1-py3.3.egg\gyp\generator\ninja.py", line 475 print "Warning: Actions/rules writing object files don't work with " \ ^ SyntaxError: invalid syntax File "c:\python33\lib\site-packages\gyp-0.1-py3.3.egg\gyp\generator\xcode.py", line 126 except OSError, e: ^ SyntaxError: invalid syntax python3非対応だった。まぁpython2で。 とりあえずc++の”hello world”をビルドするところから hello_gyp + main.cpp + projects.gyp main.cpp projects.gyp

pythonによるビルドスクリプトwafを使い始めた
pythonによるビルドスクリプトwafを使い始めた pythonによるビルドシステムwafを使ってみた。 使ってみた感触ではvcとgcc両方でビルドするとかそういうのに向いていそうなので、要するにわしのニーズに合っているように思える。 https://code.google.com/p/waf/ 前から気にはなっていたのだけれどどうにも取っ付きが悪くて使えるところまでたどりつけていなかったのだが、やっと最初の一歩を踏み出すことができたのでメモを残す。 早速実践から行く。 +hello/ +hello.cpp hello.cpp #include <iostream> int main(int argc, char **argv) { std::cout << "hello waf !" << std::endl; return 0; } というプロジェクトを作ったとする。 https://code.google.com/p/waf/downloads/detail?name=waf-1.7.13 からwaf(python scriptの圧縮されたもの)をダウンロードしてwscriptを記述する。 +hello/ +hello.cpp +waf +wscript wscriptは以下のようにする。 APPNAME='hello' VERSION='1.0.0' def configure(conf): conf.env['MSVC_TARGETS'] = ['x86'] conf.load('msvc') conf.env.CXXFLAGS = ['/nologo', '/EHsc'] def build(bld): bld.program( source='hello.cpp', target=APPNAME ) 初回とwscriptのconfigureを修正する度にconfigureする。 > python waf configure Setting top to : C:\work\_waf\hello Setting out to : C:\work\_waf\hello\build Checking for program CL : C:\Program Files (x86)\Microsoft Visual Studio 9.

wafでdebugとreleaseの設定を記述する(variant)
wafでdebugとreleaseの設定を記述する(variant) wafでdebug版とrelease版の出力を分けるにはvariantなる機能を使う。 +hello +hello.cpp +waf +wscript と前回と同様のプロジェクト。 wscriptを以下のように記述する。 # coding: utf-8 APPNAME='hello' VERSION='1.0.0' def configure(conf): # config 'debug'を作る conf.setenv('debug') # debugの設定 conf.env['MSVC_TARGETS'] = ['x86'] conf.load('msvc') conf.env.CXXFLAGS = ['/nologo', '/EHsc'] # PDBやNDEBUG等の設定をきっちり書く必要がある # config 'release'を作る。debugの設定は引き継がない conf.setenv('release') # releaseの設定 conf.env['MSVC_TARGETS'] = ['x86'] conf.load('msvc') conf.env.CXXFLAGS = ['/nologo', '/EHsc'] # BuildContextの設定 def build(bld): bld.program( source='hello.cpp', target=APPNAME ) from waflib.Build import BuildContext # BuildContextを使うコマンド class BuildDebug(BuildContext): # config 'debug' を使うvariant # 出力ディレクトリがbuild/debugに変わる variant = "debug" # 呼び出しコマンドはbuild_debug cmd = "build_debug" # BuildContextを使うコマンド class BuildRelease(BuildContext): # config 'release' を使うvariant # 出力ディレクトリがbuild/releaseに変わる variant = "release" # 呼び出しコマンドはbuild_release cmd = "build_release" variantという概念を使う。 http://docs.

Tinkererに引越し
Tinkererに引越し Octpressが手に負えなくなってきたので手軽に使えそうな tinkererに引越しというかシステムを変更することにした。 http://tinkerer.me/index.html 以下作業手順メモ。 tinkererインストール > python --version Python 3.3.0 > easy_install tinkerer サイト生成 > mkdir pages_src pages_src> tinkerer --setup pages_src> gvim conf.py 記事生成 pages_src> tinkerer --post "tinkerer" 2013/10/21/tinkerer.rstが生成されるとともにmaster.rstのtoctreeに記事が追加される。 categoriesとtagsの違いが良くわからん。 pages_src> gvim 2013/10/21/tinkerer.rst html生成 pages_src> tinkerer --build github転送 既存のgithub-pages(user)があるのでそこれに送ってみる。 > mkdir pages_dst > cd pages_dst pages_dst> git init pages_dst> git remote add origin url pages_dst> cp -r ../pages_src/blog/html/* . pages_dst> echo "" > .

おれおれmsgpack-rpc-pythonを作る
おれおれmsgpack-rpc-pythonを作る MsgPackRPCのpythonバインディング(クライアント側)が必要になったのでmsgpack-rpc-pythonを使ってみたのだが、 GUI(pyqt)に載せて接続制御とエラーハンドリングを細やかに制御したいので俺俺で類似品を作ることにした。 tonado-msgpackと名付けて取り合えず作業開始。 https://github.com/ousttrue/tornado-msgpack msgpack-rpc-pythonのおかげでtornadoの存在を知ったのだがtornado.ioloopが見れば見るほどboost::asioっぽい。 ということで、c++で作成中のmsgpack-rpc-asioのpython版のような感じのAPIにしてみた。 以下の点を考慮している。 tornado.ioloopを隠さない tornado.ioloopをスレッドに乗せて回しっぱなしにする tornado.ioloopひとつで複数の接続を扱う dispatcherを乗せ換え易くする。 接続ステータスの変化をコールバックで受け取る 非同期リクエストのコールバックを早期にセットする TCP以外は考慮しない プロジェクト作成 tonado_msgpack/ setup.py sample/ sample.py tonado_msgpack setup.py from distutils.core import setup setup( name='tonado_msgpack', version='0.1', py_modules=['tonado_msgpack'], ) 作業開始 $ python setup.py develop --user sample/sample.py #!/usr/bin/env python import tornado_msgpack import tornado if __name__=="__main__": port=18080 # dispatcher dispatcher=tornado_msgpack.Dispatcher() def add(a, b): return a+b dispatcher.add_handler("add", add) # server server_loop=tornado.ioloop.IOLoop() def on_receive(msg, session): result=dispatcher.dispatch(msg) session.

Pythonモジュールをユーザーローカルにインストールする
Pythonモジュールをユーザーローカルにインストールする $ python setup.py installをユーザローカルにインストールする方法 $ PYTHONPATH=$HOME/local/lib64/python3.2/site-packages python setup.py install --prefix=$HOME/local ではなく下がよい $ python setup.py install --user --prefixの値と環境変数PYTHONPATHの値が対応している必要がある。 PYTHONPATHにはsite-packagesまでを指定する。 devlopの場合は、 $ python setup.py develop --user http://docs.python.org/2/install/#alternate-installation-the-user-scheme

sphinxも入れてみる
sphinxも入れてみる OctopressのサブディレクトリにSphinxを入れた。 今回のディレクトリ配置 work + octopress + Rakefile + _deploy + sphinx + Makefile + source + conf.py + build + sphihnx-to-github + setup.py + sphinxtogithub + __init__.py octopressをメインにサブディレクトリにsphinxを導入してみる。 octopressの外のディレクトリで、 $ mkdir sphinx $ cd sphinx $ sphinx-quickstart とした。 Makefileに octopress: html rm -rf ../octopress/_deploy/sphinx cp -rp build/html ../octopress/_deploy/sphinx と追記。 さらにoctopress/Rakefileを改造。 {% codeblock lang:ruby %} multitask :push do puts “## Deploying branch to Github Pages “ (Dir[“#{deploy_dir}/*“]).

[PyQt4]QTableViewとQAbstractTableModel
[PyQt4]QTableViewとQAbstractTableModel ディレクトリ表示をする専用のウィジェットがあったような気がするが、練習のため実装。 # !/usr/bin/env python # coding: utf-8 import re import operator import os import sys import stat from PyQt4.QtCore import * from PyQt4.QtGui import * class File(object): header=[ ‘type’, ‘name’, ‘size’, ‘mtime’ ] def __init__(self, path): self.path=os.path.abspath(path) self.data=[None, None, None, None] s=os.stat(path) mode=s[stat.ST_MODE] if stat.S_ISDIR(mode): self.data[0]=‘dir’ elif stat.S_ISLNK(mode): self.data[0]=‘link’ elif stat.S_ISREG(mode): self.data[0]=‘file’ else: self.data[0]=‘unknown’ self.data[1]=os.path.basename(path) self.data[2]=s[stat.ST_SIZE] self.data[3]=s[stat.ST_MTIME] def __str__(self): return “<%s %s>” % (self.

[PyQt4]カスタムデリゲート
[PyQt4]カスタムデリゲート C++のQt4と平行してPyQt4を使い始めた。大概の用途にはこっちで十分な気がする。 pyqtのチュートリアルには、 http://zetcode.com/tutorials/pyqt4/ がいい。wxWidgetsとかgtkでも世話になったが、ここのチュートリアルはサンプルが小さいので助かる。 ビューのアイテム表示をカスタマイズするデリゲートについて調査中。 # !/usr/bin/python # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore from random import randint class CustomDelegate(QtGui.QItemDelegate): def __init__(self, parent = None): super(CustomDelegate, self).__init__(parent) self.editor = QtGui.QSpinBox() # 編集時 # create widget def createEditor(self, parent, styleOption, index): editor = QtGui.QSpinBox(parent) return editor # model to editor def setEditorData(self, editor, index): data=index.model().data(index, QtCore.Qt.EditRole) editor.