2013年10月9日水曜日

PyInstallerで簡単exeファイルの作成

py2exeからPyInstallerに乗り換えるとすこぶる簡単だったというはなし。

PyQtで作ったGUIアプリを職場のみんなに使ってもらうにはexeファイルを作成しなければならない状況にあって、以前はpy2exeでmatplotlibやPyQt4のアプリをexeファイル化していたが、py2exeを実行すると
The following modules appear to be missing
と言うエラーメッセージが 出てうまくいかない。どうもオプションでbundle=1と設定するとうまくいかないようだ。(bundle=1はDLLなどを1つexeに詰め込む設定。bundle=3だとうまく動いた。)
しかも何が足りないって、IronPythonとか使った記憶がないモジュールばかりなので、ちょっとわけがわからなくなった。

StackOverflowなんかを見てみるとpy2exeは止めてPyInstallerを使えって回答が多かった。
なんとなくPyInstallerはインストーラーを作るイメージがあって使ってなかったけど、exeファイルもつくれるようだ。食わず嫌いでした。


ほんで、実際にPyInstallerを使ってみたらすこぶる簡単だった。今までの時間は何だったのか。
インストールの仕方など調べてみると少し古いのもあって混乱したので、ここに簡単な使い方を紹介しておく。


1. インストール

PyInstallerのドキュメントにインストール方法が書いてある。Installing Using pipに従うと、
>pip install pyinstaller
とするだけ。
その下にPyWin32が必要とか書いてあるけど、今回は特に何もしなかった。多分Python(x,y)をインストールしたときに色々一緒にいれたので、そのときに入っていたのかもしれない。


2. exeファイル化

Pythonのスクリプトファイルがある場所に移動して、
>pyinstaller hoge.py

とするだけ。自動で必要なファイルやらなんやらを取得してくれるらしい。
buildとdistというフォルダが生成されてdistの中にあるexeファイルを実行ればpythonで作成したアプリが動作する。

今回はexeにすべて詰め込みたかった+実行時コマンドプロンプトを表示させたくなかったので
>pyinstaller hoge.py --onefile --noconsole 
というオプションを加えた。オプションについてはここを参照。

今回はPyQt4を使ったものをexe化したけど、matplotlibやOpenGLでもこんなに簡単やったらいいなぁ。

2013年10月8日火曜日

アメリカの高校の授業その1 About Me

アメリカの高校は2学期制。
後半のクラスでAbout Meという授業をとった。分類としてはEnglishに分類される。
内容は自分について深く掘り下げようという授業で、よく就活でやる自己分析みないなのをグループでディスカッションしたりする。そして、学期も終わりに差し掛かったあたりで一人ひとり自分のこれまでの行き方についてスピーチを行う。

そのスピーチにはひとつ決まり事があって、自分を表すものを持ってこなければならないということ。それが自分とどう関係するかを説明する。思い出の品を持ってきてもいいし、スクラップブックを作ってもよい。なんでもよい。でも一番手っ取り早いのは親友として人をつれてくること。結構この手の手段を使う人は多かった。(親友はもちろん別の授業に出とるときもあるけど、先生にいえば抜ける許可は簡単に下りる)

スピーチ時間は特に決まってなかった。今思うと不思議だが、その時は30分くらいスピーチした。意外と自分について喋れるものだ。細かい内容は忘れたけど、理科が好きで将来は科学者とかエンジニアになりたいみたいなことを言っと思う。

スピーチの後には聴衆から一言カードがもらえる。自分がもらったやつには、「頭いいからがんばれよ」みたいな意見がいっぱいあったのを覚えている。同じ内容の意見ばかりだったので、あまりおもしろくないスピーチだったのだろう。ちょっと残念だった。

この記事を書いていると、あの時とそんなに変わっていない自分がおることに気がつく。

2013年10月4日金曜日

C++ コンストラクタの:(コロン)について

サンプルコードを見ていると変なコンストラクタを見た。
どうやら、Initialization listと呼ばれるものらしい。
http://stackoverflow.com/questions/2785612/c-what-does-the-colon-after-a-constructor-mean

サイトによると
1.親クラスの初期化
2.コンストラクタが呼び出される前にメンバを初期化する。

らしい。更に
http://ameblo.jp/nana-2007-july/entry-10037680575.html
によると初期化の実行速度も違うらしい。