Monthly Archives: 12月 2013

PythonでWindowsアプリケーションを作ってみよう

Pocket

Pythonには、pythonスクリプトを手軽にWindowsアプリケーション化できるツールが揃っている。
有名なのはPy2exeとPyInstallerである。
違いをまとめたうえで、PyInstallerでのWindowsアプリ化をまとめる。

Py2exeとPyInstallerの違い

サイト
http://www.pyinstaller.org/
http://www.py2exe.org/

  • インストールの容易さ
    →PyInstallerが有利
  • 対応Pythonバージョン
    →Py2exe: 2.4~3.1
    →PyInstaller: 2.4~2.7
  • 単独exeファイル作成の容易さ
    →PyInstallerがやや有利
  • 「manifest」ファイル埋め込みの容易さ
    →Py2exeが有利

手軽さの点でPyInstallerを選んだ。

PyInstallerの制限(日本語パスはダメ)

※2014/5/29追記
PyInstallerで生成したアプリには制限がある。
そのアプリを、日本語、要するにNon-ASCII文字列の含まれるパスに置くと起動に失敗する。
Python2なせいだと思うが、じゃあPython3で作ったらどうよ?と考えるも、そもそもPyInstallerはPython3に対応してないし…。
運用回避するしかないです。
作ったアプリを人に配って初めて気づいたよ。

PyInstallerのインストール

pyinstallerのインストールを参照。
ダウンロードして展開するだけ。
インストールっぽいことは不要。
追加でUPXがあれば準備するとよい。後述。

http://www.pyinstaller.org/ からダウンロード。
2013/12/6現在、最新版は2.1。

UPXのインストール

UPXとは、実行ファイルを、実行できる形式のまま圧縮してくれるツールである。
メリットはストレージの占有スペースを少なく出来ること。デメリットは実行時の展開処理。
UPXは実行時の展開処理がすごく速いうえにメモリ消費量も少ないとのこと。
大規模なプログラムだったら使ってもよいかな。

http://upx.sourceforge.net/‎
http://ja.wikipedia.org/wiki/UPX

インストールはごく簡単。
公式サイトからアーカイブをダウンロード。
Win32/i386版。
展開したらupx.exeが出てくるので、それをパスの通ったところに置くだけ。
Pythonのインストールされているディレクトリ(例: C:\Python27)の下に置くのがよいでしょう。
あるいは別ディレクトリに置いてそこにパスを通す。

PyInstallerの使い方

python pyinstaller.py targetscript.py とするだけである。

以下、詳細。
サンプルpythonスクリプトを一つ用意。
コマンドプロンプトを開いて展開したPyInstallerのディレクトリに移る。
cdで移るのが面倒なら、SHIFT+右クリックで開く。
pyicmdprmpt

pythonにパスが通っていることを確認。

対象スクリプトをpyinstallerのディレクトリに置くか、パスを取得する。
パスの取得は、対象ファイルをSHIFT+右クリックで出来る。

pyipthcp

 

Windowsプログラムのできあがり

PyInstallerのフォルダに、スクリプト名でフォルダが出来ているはず。
pyiblddn

その下に、さらにbuildとdistという、二つのフォルダがある。
他人にプログラムを配る場合には、distフォルダの下にある方を配ること。
実行に必要なDLL(pythonのDLL, MSVCRのDLL)もセットになっているので。

pyidist

その他のオプション説明

以下参照。
http://pythonhosted.org/PyInstaller/

以下にピックアップ。

-w, –windowed
実行時にコマンドプロンプトを開かないようになる。
GUIプログラムのときに便利。

-F, –onefile
プログラムを一つにまとめてくれる。
なかなか魅力的なオプションだが、プログラム実行時にけっこう時間がかかってしまう。
(試してみると分かるが、イライラするレベル)
おすすめしない。

-i <アイコンファイル>, –icon=<アイコンファイル>
プログラムのアイコンを設定できる。アイコンは拡張子.icoのファイル。

-y
–clean
-yは既存の実行ファイルを問答無用で上書きする。
修正しては何回も実行ファイルを作るときには便利。
–cleanはログファイルや作業ファイルを消してから実行ファイル作成を始める。

–noupx
UPXを使いたくないときに指定。

日常使いのpkgng:pkgを探してインストール

Pocket

インストールしたいpkgがある場合、どのように探すか。
pkg searchに与えるオプションを変えながら探していく。
sageというpkgを探す場合を例に取って記録しておく。

まずはsearchから

pkg seach sageですな。

山のように引っかかって面倒。
検索する文字列を考慮してみよう。

searchで正規表現

正規表現が使えるので、頭にsageとつくpkgを探す。”^sage”を与えればよいですな。

一件になった。
ではインストール…の前に必ず確認。

インストールしていないpkgの詳細を知る

インストール済みのpkgであればpkg infoで調べることができる。
未インストールならどうするか。
-fを付ければよい。

欲しいsageは数学関連のものなので、どうも違うようですな。
危なかった!
しかし狙いのsageは無いのだろうか。

カテゴリで探す

pkgはカテゴリ分けされている。
狙いのsageは数学関連であるから、おそらくmathの下にあるはずだ。

あるいは:

しかし。
ありませんでした。

仕方がないのでportsでインストールしよう。

math/sageはportsにはないのだろうか。
psearchを使う。

あった。

portsでのインストールは最小限に。

しかしportsからインストールするソフトウェアは最小限にしたい。
つまりmath/sageだけはportsを使ってもよいが、依存するものはpkgを使いたい。
本命ではない依存ソフトウェアのコンパイルなど待ちたくないし。

portmasterを使うなら-Pを与えればよい。
以下、portmasterのman抜粋。

 

pkgのアップグレードも提案された。
嫌な予感しかしない。
pkgのアップグレードはやめよう。
いったんNで抜ける。

portmasterで特定のportsのアップグレードを抑止したい。

-xオプションを使う。
portmasterのmanから抜粋。

 

意図した通りpkgのupgradeが外れている。
ただ…pkgレポジトリのものよりportsのバージョンが新しいとやっぱりportsが選ばれてしまう。

[報告]pkg-1.2.3でproxy越しのレポジトリ接続が可能に

Pocket

pkgngのレポジトリがsrvレコードなせいで、proxy越しだったりするとpkgがダウンロードできない問題があった。

2013/12/19現在のpkg-1.2.3でこの件が修正されている。
したがって、デフォルトの設定ファイル/etc/pkg/FreeBSD.confをそのまま使うことが出来る。

以下のような状態で、つまり、FreeBSD.confが有効(enabled:yes)になっている状態で;

pkg updateが問題なくできる。

ああよかった。
こちらからは以上です。

(追記)
FreeBSD-9.xの場合には以下の内容を/usr/local/etc/pkg/repos/FreeBSD.confとして保存すればよい。

 

No tags for this post.

Graphvizでカックいいグラフを描こう

Pocket

Graphvizとは、AT&T研究所の作ったグラフ描画ソフトである。
ここでのグラフとは棒グラフのグラフではなく、ソーシャルグラフとかのグラフである。
点(ノード)と線(エッジ)で表されるもので、例えば、何らかの状態遷移や、路線図や、ネットワークなどの「関係」の表現に使われる。

もともとオイラーの一筆書きのような経路探索の分野があって、それを視覚的に表現するためのツールとしてこういったソフトがある(たぶん)。
そんな分野はとても手に負えない。
しかし、グラフ描画に注目するだけでも、とても面白いんである。

例えば、ふだん利用する路線の、各駅の関係と乗降数をグラフに書いてみるだけでも、表で見たときは比べ物にならないくらいのインパクトがある。

keikyu
これは、京浜急行の駅の繋がりと乗降者数をグラフにしてみたもの。
隣り合う駅は繋ぐし、特急などで途中の駅をすっ飛ばす場合も繋ぐ。
乗降者数に応じて駅の大きさを変えてみた。
(何気なく作ったら一辺が10,000ピクセルを超える巨大画像になったので泣く泣く縮小した。)

そういったわけで、この記事では(Python経由で)graphvizのグラフ描画についてまとめた。

以下、特に指定のないかぎり、グラフと記載があれば、それは上記の意味でのグラフである。

Graphvizについて

手っ取り早くどんなグラフが描けるのかを知りたければこちらのサンプルグラフなどを。

関連のwebsiteは以下のとおり。

Graphviz(公式) http://www.graphviz.org/
Graphviz(wiki) http://ja.wikipedia.org/wiki/Graphviz

Graphvizでは、DOTという形式でグラフを描画する。
しかしDOT形式をそのまま扱うのはちょっと難しい。
そこで他の言語を通して使う。
具体的にはpygraphviz。
PyGraphvizはGraphvizのpythonインタフェースである。

PyGraphvizのインストール

FreeBSD, OS Xでのインストールは確認済みである。
しかし意外や意外、WindowsのActivePythonではPyGraphvizをインストールできない。PyPMにないのである。
素のPythonなら出来るのかもしれないが。

しかし、Graphviz単体ならインストールできる。DOT形式のファイル(以降、DOTファイル)を別マシンからもらえば、WIndows上でもグラフ描画は可能。

FreeBSDでのインストール

portsでもpkgでも、pygraphvizで探せば出てくるのでそれをインストールすればよい。
以下はpkgでの例。
gccを連れてきてダウロードサイズが100MBを超えた。驚いた。
ついでnumpyも入れた。

 

OS Xでのインストール

graphvizをインストールし、そのあとPython上でpygraphvizをインストールすればよろし。
以下の例ではbrewでgraphvizを、そのあとpipでpygraphvizをインストールしている。

 

Windowsでのインストール(graphvizだけ)

WindowsのActivePythonではpygraphvizが使えない。
素のgraphvizをインストールする。
以下あたりからダウンロードする。

http://www.graphviz.org/Download_windows.php

インストーラがよければmsiを、レジストリを汚したくないならzipをダウンロード。
zipは展開するとreleaseというフォルダが出来る。
リネームしてどこにでも置けばよい。
実行ファイルはbinの下にある。
必要ならパスを通しておく。

実際に使う実行ファイルはdot、circo、neatoあたりでしょう。

pygraphvizインストールの確認

pygraphvizをimportしてみてエラーの出ないことを確認しておこう。
たとえばIDLEで。

 

PyGraphvizを使ってみよう。

基本はここのチュートリアルに沿えばよい。
http://networkx.lanl.gov/pygraphviz/tutorial.html

pygraphvizをimportし、AGraphクラスを作る。

ノードの追加

エッジの追加

そして描画。
layoutを指示すると各ノード、エッジの配置がなされ、drawで画像に書き込める。

dotファイルを書き出すには。

 

サンプルスクリプト

以下、サンプルスクリプトとその結果つくられるグラフを列挙する。
先述の通りWindowsではpygraphvizが使えない。
Windowsでグラフを描こうとするなら、MacやFreeBSD他、pygraphvizで生成しておいたdotをWindows上のgraphvizで読みこむしかない。
その方法は最後に触れる。

サンプル1

sample01

サンプル2

ノードの追加は、リストでまとめてできる。

sample02

サンプル3

同じエッジを二回追加しても変わらない。

sample03

サンプル4

しかし、最初のクラス作成時にstrict=Falseと指定すれば。

sample04
二本になる。

サンプル5

さらにdirectを指定すれば。

sample05
矢印になる。

サンプル6

ここまでは殺風景であったが、色だって形だって変更できる。

sample06

 

参考

ここから先は、以下を参考にして各自素敵なグラフを作ってくれたまえ。
https://github.com/pygraphviz/pygraphviz/blob/master/examples/miles.py

pygraphviz attrの一覧
http://www.graphviz.org/doc/info/attrs.html

Windowsでdotからグラフを描画する。

インストールしたdot, circo, neatoのいずれかに、-Tで出力形式を、-oで出力ファイル名を指定したうえで、dotファイルを与えればよい。

 

 

No tags for this post.

[メモ]zpoolのupgrade

Pocket

 

zpoolのupgradeをしたのでメモ。
結論としては、zpoolのupgradeとは、単にversionを上げるだけ以外にもあるようだ。

legacy on-disk formatでformat??

気がつくと、zpool statusで文句を言われていた。

曰く、「このpoolはlegacy on-disk formatでフォーマットされている。
もちろんpoolは引き続き使えるけれども、いくかの機能が使えない。」とのこと。

zpoolを調べてみたが、最新のv28である。

 

zpool upgradeで調べて分かってきた。
zpoolバージョンではなくfeature flagsのことを言っているわけだ。

 

で、もういちど調べてみると。

featureがいくつかdiabledになっている。
そうと分かれば素直にupgradeである。

zpoolのupgrade

zpool upgradeとするだけ。
ただ、バージョンが変わらないとはいえ、ファイルシステムの基盤をアップグレードするわけだからバックアップは取っといた。

あっけなく終了。

調べてみるとversionが消えて(なぜ….でもpropertiesがdefaultだからよしとしよう)、その代りfeatureはすべてenabledに変化したことが分かる。
なお、enabledは「その機能が使えますよ」という表示。
実際に有効にするとenabledはactiveに変化する。

 

zpool upgrade、zpool statusの表示いずれも問題なし。

 

No tags for this post.

[メモ] ディスクを追加してZFSを作り、他zpoolのsnapshotを送り込む

Pocket

 

HDDを増設してZFSを作ったのでメモ。
一本のHDDにpool、zfsを作成し、圧縮、重複排除機能の有効化まで。
環境は(残念ながら10.0-Rではなく)FreeBSD 9.2-RELEASE-p1。

lz4でzfsの圧縮機能を気軽に試せるように

ファイルシステムで圧縮機能を有効にすると、読み書きのいずれにもCPUパワーが必要で、要するに遅くなる。
非力なCPUを使っているとなかなか使いにくい機能なのだが、圧縮方法にlz4が選べるようになってハードルは下がったように思う。
lz4はここでも触れたが、めっぽう速い圧縮アルゴリズムである。
これはぜひとも使ってみなければ。

 

 

ディスクの確認とzfs機能の確認

物理ディスクを追加し、ブートしたらdmesgを確認する。

ada2とのこと。

作業前にzfs, zpoolのバージョンを確認しておいてもいいかも。
zfs, zpoolそれぞれにupgradeオプションを与えればよい。
upgradeという名前の通り、upgradeのためのコマンドだが、バージョン確認にも使える。

zfsはバージョン5、zpoolはバージョン28。
このバージョンであれば、lz4による圧縮機能(LZ4 Compression algorithm support)と、重複排除機能(Deduplication)を使える。

pool、zfsの作成

warehouseというzpoolを作り、そこからbackupというボリュームを切り出す。

まずzpoolを作る。
ほんと簡単で速くて助かる。

で確認。

ではzpoolからzfsの切り出し。
先ほど作成したwarehouseからbackupという名前で。

あとは/etc/fstabに書くだけ。
warehouse/backupを/backupにマウントするとして以下のように書いておき。

/warehouse/backupをいったんunmountしてそれからmount。

 

圧縮機能と重複排除機能を有効に

ではさっそく圧縮機能と重複排除機能を有効にする。
といっても、すっごく簡単なんだけどね。

確認。
zfs getで対象zfsの属性を確認できる。

タイプが面倒ならzfs get allですべての属性を表示させ、grepすればよい。

 

書き込んでみる

今回追加したHDDはもともとバックアップ用途のつもり。
ここにスナップショットを流しこんでみる。

以下のようにしてスナップショットを作成する。

スナップショットのサイズは以下のとおりである。

これらスナップショットをバックアップのHDDに流し込む。
zfs sendとzfs recvをパイプで繋ぐ必要がある。
sudoを使う場合にはsh -cで。

注意点がある。
以上のようにsnapshotを送ると、受け側では:
①warehouse/backup/chamber ができ、さらに;
②warehouse/backup/chamber@20131121 つまり;
実ディレクトリで言えばwarehouse/backup/chamber/.zfs/snapshot/20131121ができる。

漠然とvault/chamber@20131121の内容がwarehouse/backup/chamberに書き込まれる思っていたので驚いた。

 

また、ロードアベレージを監視するような仕組みは特に入れていなかったので、topの出力を見たところ5を超えてた。ちょっと怖い。

そしてたかだか913GBのsnapshotの転送にかかった時間であるが。

まる二日半て…。
これは圧縮か重複排除か、どちらか止めた方がいいかもわからんね。

差分snapshotの転送

オリジナルディスクで複数回snapshotを作成した場合、バックアップディスクにはその差分を送ることができる。
zfs sendに-iを与え、二つのsnapshotを指定すればよいだけ。

以上

qjailならjailのユーザランド更新にmake worldは不要ッ!

Pocket

 

この件があって、jailはqjailで管理している。
上記記事では触れなかったのだが、qjailにはもう一つ大きな利点がある。
qjailでは、jailのユーザランド更新にmake buildworldが不要なのである。
細かいところは後で述べる。
まずその使い方から。

qjailでのユーザランド更新

jailを止めたあとに、qjail update -bだけでOK。
jailを止めないで実行しようとしても、下記のように怒られる。
update -bはすぐに終わる。

 

qjail update -bとは

マニュアルから俺訳で引用すると:

freebsd-updateはホストしか調べてくれず、jailは対象外だ。ホストには最新の環境があるのに、jailのためにわざわざ make buildworld/installworldするのは次男の無駄無駄無駄。
だからして、ホストのバイナリをsharedfsにコピーできるようした。

 

原文は以下の通り。

 

 

 

No tags for this post.

pkgng 1.2へのアップデートに伴うあれこれ。

Pocket

 

pkgngを1.2にアップデートしたら、設定ファイルの扱いが変わって、ちょっとした修正が必要になった。
それをまとめる。

まとめ。

  • pkgngを更新したらpkg upgradeを忘れずに
  • すべてコメントの設定ファイルは受け付けてくれない。
  • 設定ファイルでのキー指定は、”(クオート)で囲わないこと。

 

pkg のアップデートあり

pkg updateをしたら、やたら文句を言われる。

そしてupgradeすると、pkgに更新があるとな。
1.2.1である。
pkgに更新がある場合には、まずpkgを更新し、そのあとpkg upgradeをせよ、とのお達し。

 

pkg 1.2でアップデートができない。

pkgの更新は問題なく完了。
念のためもう一回pkg updateを試みるが、設定ファイルを読めないと怒られる。

どうも設定ファイルがおかしいようだ。
しかし現状、/etc/pkgの下や、/usr/local/etc/reposの下にも設定ファイルがあって訳の分からない状態だ。

調べた結果は以下のようなものだ。
pkgはREPOS_PATHで指定される全てのディレクトリから設定ファイルを探す。
デフォルトでは、/etc/pkgと/usr/local/etc/pkg/reposである。

詳しくは以下を参照。
http://lists.freebsd.org/pipermail/freebsd-questions/2013-November/254682.html

注意すべきは、すべてコメント文で出来ている設定ファイルがあると、”pkg: Cannot parse configuration file!”と言い出してそれ以上の処理をしてくれなくなることだ。
どうもバグのようだが。
1.2より前では文句だけだった。

私の場合、以下の通り/usr/local/etc/pkg.confがコメント文だけだったので、rmした。(RCSに保存しているので消したって平気)

 

設定ファイルでのkey指定方法の変更

改めてpkg update。今度は問題なしか?

今度は設定ファイルの内容に文句が付いた。
booleanを期待してたのに違うぞ、と。
文句だけなので進めはするが、気持ち悪いので修正する。
設定ファイルの中でenabledなどのキー指定からクオートを外せばよい。

before

after

 

pkg upgrade

そうしたら指定通りpkg upgradeを実行。
今度は問題なし。
通常のアップグレードのほかに、依存が変わったとかで再インストールの必要なものが結構あった。

そしてまた、autoremoveで掃除をしておこう。

 

余談

以下のようにpy27-distributeが邪魔だというので、pkg delete -f py27-distributeしてpkg upgradeした。

 

No tags for this post.

ActivePythonでPythonパッケージを扱うにはPyPM

Pocket

 

PyPMはActivePythonのPythonパッケージマネージメントシステムである。
パッケージの提供はActiveState

ただ、すべてのパッケージが揃っているわけではなく、ものによってはコンパイルに失敗し、結果としてPyPMでは入手できないものもある。

たとえば2013/11/14現在、pygraphvizは入手できない。
http://code.activestate.com/pypm/pygraphviz/

pygraphviz is unavailable in PyPM, because there aren’t any builds for it in the package repositories.

前後したが、PyPMで揃えられるパッケージは以下のサイトで確認できる。
http://code.activestate.com/pypm/
また、PyPMにもパッケージ検索機能が備わっている。

PyPMの起動

ActivePythonをインストールすると、Python Package Manager(PyPM)というプログラムがスタートメニューにできているはず。
これがPyPM。
startmenu

プログラムとは言っても、実体はcmd.exeに引数を与えて実行するショートカットである。

実行すると、コマンドプロンプトが開く。
pypm

 

PyPMの使い方

以下を参照

http://docs.activestate.com/activepython/3.3/pypm.html

 

実行例

matplotlibを検索、インストールしてみる。

検索

インストール

インストール済みのパッケージ一覧

 

プロキシの設定

もしインターネット接続がproxy越しの場合には、環境変数の設定が必要だ。
以下に記載のあるとおり。
http://docs.activestate.com/activepython/3.3/pypm.html#proxies-and-firewalls

PyPMを実行したあと、以下のように設定してから進めればよい。

 

なお、activestateのサイト通りだとうまくいかなくて、経験的な結果として:

  •  ダブルクオーテーションで囲ったらダメ。
  •  (おそらく)URLの最後はスラッシュで終わらないとダメ。

使用例

以上

No tags for this post.