忍者ブログ

Py淡 (PyTan)

Home > ブログ > 記事一覧

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

"import antigravity" actually works!

Wow. I did not expect it to work but I just tried it for fun. And guess what! It actually works!

Fire up your python console and try importing "antigravity". It brings you to that xkcd page http://www.xkcd.com/353/.

The history behind how this made into python by Guido can be found here: http://python-history.blogspot.ch/2010/06/import-antigravity.html




あ゛ーびっくりした。さっきこのブログのサブタイトルに”In the spirit of import antigravity”と追加したので、なんとなく試しにインポートしてみてみたらウェブブラウザが開いてあのページが出てきた。面白いのでみなさんもお試しあれ。

もともとはグーグルアプエンジンのイースターエッグ

これだけではなんなのでちょっとググってみたら、The history of antigravityというブログに記事があって、
But it really originated in Google App Engine! It was a last-minute addition when we launched App Engine on April 7, 2008. A few weeks before launch, when most code was already frozen, the App Engine team at Google decided we wanted an easter egg.

なんて書いてある。つまりもともとは2008の4月7日にGoogleのAppEngineがランチしたときに公開されたGAEのイースターエッグとして追加されたモジュールだったようです。それがPython3にマージされて、Python2系にも降りてきたらしい。

ちなみにこの記事はGuido van Rossum本人の書き込みだった。彼がグーグルにいた時の逸話でしょうか。


PR

Sublime Text2からPythonコードをgeany_run_script.batっぽく実行。

OpenCVで複数namedWindowを使ったコードをSublime Text2から走らせるとなぜか最初のウィンドウが出てこないという奇妙なバグがあって、これのせいでSublime Text断念して、Geanyへ戻ったというエントリーを書いたばかりですが、自分でビルドしたoverviewプラグインがまだ不安定で二度ほどクラッシュしてしまったので、overviewは正式版のリリースを待った方がいいかもしれないので、Sublimeを再考してみました。

自分用のGeanyのRunスクリプトっぽいPythonビルドシステムをつくって差し替えればいいのではないかと思いついた。

SublimeのビルドシステムについてはUnofficial docを参考にした。

GeanyはPythonスクリプトを起動する度に動的にgeany_run_script.batという起動スクリプトを生成して、ここからPythonコードを起動する。strerrとかstroutとか全部このbatが走っているcmdにくるという仕様。簡単だが恐ろしく安定しているので理に適っていると思う。

geany_run_script.batの内容は以下の感じ。

python "your_script.py"

pause
del "%0"

pause

delのラインで自分自身を消しているので、基本的にはgeany_run_script.batというファイルはお目にかかれないが、たまに消し損ないがある。たぶんDropboxとかその辺が同期しようとしてファイルをロックしてしまうのではないかと推定。


これと同じようなことをbatでやればいいのだから第一引数の%1をpythonスクリプトへのパスにして、

C:\\Python27\\python.exe %1


とかやって、これをRunLikeGeany.batとかで保存。このバッチファイルをビルドシステムから呼び出したいので、

{
    "cmd": ["C:/path/to/RunLikeGeany.bat", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python"
}

こんな感じの設定をpython-geany-style.sublime-buildとかの名前でSublimeのData/Packages/Userに保存しておけば新たなビルドシステムが登録される。

これで、Geanyと似たような動作が得られて、OpenCVの問題も一部解消した(ウィンドウが全部でた)。しばらくSublimeを試そう。。。


追記:このバッチファイルをつかっても、Sublimeがcmdとsubprocessモジュールのパイプで通信しながらstdoutを読み出しているっぽいけども、これがやたら遅れる。もともとビルドメッセージを取ってくるためのものなので遅くても問題ないからしょうがないが、なんとかパイプをフラッシュするタイミングを速くできないものか。やっぱGeanyがいいかも・・。

追記2:一番動作がGeanyのRunスクリプトに近くなるのは、

C:\\Python27\\python.exe %1
pause

というバッチをPythonスクリプトと同じフォルダにおいておいて、これにドラッグすると一応同じ動作になって、Pythonスクリプト終了してもpauseでcmdが生き残るのでエラーがあった場合は確認できる。

しかし、これでもまだ何度も繰り返すことを考えるとまだ面倒なのでAHKスクリプトでショートカットキーをSublimeに割り当てて、このバッチを呼び出すという荒業も考える。スマートな解決法ではないので最後の手段だな。


追記3:Sublimeの中でPythonのコンソールを持てるSublimeREPLというのを知って、つかってみたらすごかった。OpenCVの問題も解決し、さらにはコードセレクションをぽちぽちDreamPieに送っている私のAHKスクリプトを引退に追いやる勢い。Sublime恐るべし。Geanyとはユーザー数とエコシステムが違うなぁ。

追記4:REPLにLoadFileToReplを組み合わせたらかなりGeanyの実行環境に近づいてきて、これでGeanyから乗り換え完了かと思ったが、REPLはすごいんだけども、やっぱり複雑なことをすると変なことがおこったりもするようだ。multiprocessingモジュールとQueueをつかったスクリプト(https://gist.github.com/i-namekawa/a24709d92f890b541bb4)を走らせたらWorkerクラスが__main__に見つからないとかでエラー。Geanyで同じのを実行するとちゃんと動いた。REPLの特殊な環境が干渉してたぶんスクリプトの実行しているスコープに影響が出たっぽい。やっぱりGeanyのシンプルさと安定性はすごいのかも。

http://stackoverflow.com/a/23722631/566035
Ctrl + BでReplでPythonスクリプトを実行するためのビルド設定。

Sublime TextのミニマップみたいなGeanyプラグインOverviewをウィンドウズでビルドしてみた。



Sublime Textのミニマップはとてもかっこいい見た目だし、しかも使ってみると便利。Geanyから乗り換えようと何度か したことがあるけども、SublimeからOpenCVを使うとnamedWindowの挙動がたまに変なので結局戻ってきてしまった。

Sublimeもちゃんと設定すれば快適になるだろうけど、GeanyはPythonとの相性がよくなんの設定もなくいきなり使い始められる。パスが通っているPythonが使われるが、必要ならビルドコマンドをいじってPython27とPython34とか切り替えるのも非常にわかりやすい。

Geanyに「ミニマップさえあれば完璧なのに!」とダメ元でググってみたらなんとcodebrainz氏がひと月前の2015年3月にOverviewというGeanyプラグインをGitHubで公開していました。

メーリングリストでのアナウンスメントは3月12日ですね。GitHub上のスクリーンショットではLinuxっぽい画面ですが、GeanyはクロスプラットフォームなGtkアプリだし、codebrainz氏の他のGitHubのプロジェクトはウィンドウズもサポートしているようなので自分でビルドしてみました。

私は、wafをつかったビルドシステムも初めてだったし、C/C++のプロジェクトのビルドはほとんど経験がなかったので不安でしたが、公式ウィキのBuild Geany on Windowsにある指示どうりにやったら初心者の私でも大体問題なくできました。

ただ、まったく問題がなかったわけでもないので覚書として記事にしておきます。

使い勝手ですが、かなり良いです。本家のSublimeに比べると多少もっさりした動作ですが、ミニマップをクリックしたままドラックする感じでするすると上下に移動すると速く快適です。これならデフォルトのスクロールバーもいらないかなと。Zoom設定を-100くらいにすると見栄えもSublimeっぽくなります。

ディペンデンシーのインストール

公式なプラグインを集めたgeany-pluginsというGitHubのプロジェクトにoverviewプラグインがすでに含まれているので、これをクローンしてビルとします。

手順としては、公式ウィキのBuild Geany on Windowsの通りにまずGeanyをビルドして、それからgeany-pluginsをビルドします。

まずはGeanyが依存するパッケージをインストールしていきます。

    Git
    Python
    Perl
    NSIS
    UnxUtils
    GTK+
    Gettext
    DocUtils

GitとPython27に関してはもうインストールしてあったものを使い回しました。Perlはなんで必要なのかと思いましたが、Strawberry Perlだとmingw-gccとか色々とついてくるらしく、Strawberry Perlのインストール後に自動でパスもbinに通ってこれがGeanyのビルドにも使われているようです。

その後、geany-pluginsが依存するパッケージをとってきます。zip形式ですが、c:\libsというフォルダをつくって、ここに解凍して順番とか気にせずどんどん上書きします。

geany-pluginsにはLuaのプラグインも含まれていたりする関係でLua for Windowsもインストールします。

その後、書いてある通りウィンドウズの環境変数のPathを設定します。Perlに関してはすでにインストーラーがパスを 追加してました。

私の場合、pythonxyがC:\MinGW32-xyとかC:\Program Files (x86)\pythonxy\gettext\binにパスを追加していて、gettextが干渉してしまったのでpythonxy関係のもの(下記)は全部外しました。

C:\MinGW32-xy\bin;C:\Program Files (x86)\pythonxy\SciTE-3.3.2-3;C:\Program Files (x86)\pythonxy\console;C:\Program Files (x86)\pythonxy\swig;C:\Program Files (x86)\pythonxy\gettext\bin;

私の場合、git cloneコマンドにproxyが必要でしたが、

git config --global http.proxy http://myproxy:8080

としてから

git clone git://github.com/geany/geany

としたらだめでしたが、よく考えたらプロキシはhttpプロトコルに設定してるので、

git clone http://github.com/geany/geany.git

としてうまくいきました。

Geanyをビルドする

いよいよPythonベースのビルドシステムwafでのビルドです。geanyをクローンしたフォルダから

python waf configure

とするとあっさり成功。なんと。./configureとかにはいい思い出がないのでこれは感動。

python waf build

では上で書いたようにpythonxyからのgettextが使われてエラーになったのでパスを外したら成功。

python waf install

もあっさり成功。これでgit/Geany内にGeany-1.25というフォルダができた。これがいまビルドされたもの。

Geany-1.25というフォルダにはプラグインのビルドに必要なヘッダーとpkgconfigファイルがあるので、これをC:/libsにコピーする。ウィキにあるスクリプトはLinux用っぽいのでVERSIONとDESTに手直しが必要でした。


git\geany\geany-1.25フォルダ内の

include\geanyにあるヘッダーファイル
bin\geany-0.dll
libにあるもろもろのdll
lib\pkgconfig\geany.pc

がコピーされているようです。

プラグインのビルド

これでプラグインのビルドの用意が整いました。

git clone git://github.com/geany/geany-plugins

もしくは

git clone http://github.com/geany/geany-plugins.git

でクローンして、

geany-pluginsのフォルダへ行きます。ウィキではgeanyフォルダへ行けとありますが、間違いです。

python waf configure

すると

Checking for 'geany' >= 1.24             : not found
The configuration failed

というエラーでとまりました。

overviewプラグインのGitHubページには

If your Geany installation is in an usual place, you'll probably have to use the PKG_CONFIG_PATH environment variable so the build system finds the correct Geany build flags and paths.

とあり、PKG_CONFIG_PATH という環境変数を設定して、ターゲットのGeanyの場所がわかるようにしないといけないようです。

PKG_CONFIG_PATHの正しい値はなんなのかしばらく悩みましたが、ここを読む限りgeany.pcをコピーしたC:\libs\lib\pkgconfigにするのが正しいようです。

さらにgeany.pcの一行目は

prefix=geany-1.25

となっていますが、ここを

prefix=C:/git/geany/geany-1.25

などとちゃんとビルドされたgeanyがある場所に変更してやります。

wafでのビルド中に使われるpkg-configの実行ファイルは

C:\Python27\Lib\site-packages\gtk-2.0\runtime\bin>pkg-config.exe

のようなので、普通のcmdのプロンプト上で

set PKG_CONFIG_PATH=C:\libs\lib\pkgconfig

としてから

pkg-config geany --modversion

として正しいバージョンの1.25がでるのを確認し、再び

python waf configure

をするとこのエラーは解消し、configureができました。

python waf build

すると、今度はoverviewプラグインのコンパイルエラーになりました。

..\overview\overview\overviewscintilla.c:270:28: error: 'CAIRO_ANTIALIAS_GOOD' u
ndeclared (first use in this function)
   cairo_set_antialias (cr, CAIRO_ANTIALIAS_GOOD);


どうやらCAIRO_ANTIALIAS_GOODという変数が未設定のようなので、

#define CAIRO_ANTIALIAS_GOOD             1

というラインをoverviewscintilla.cのソースのはじめの方に追加しました。値が1でいいのかどうか知りませんが、これでうまくコンパイルできました。

python waf install

の方もうまくいきました。

動作テスト

これでoverview.dllがビルドされているんですが、これをGeanyのリリース版の1.24に置いてみてもgeany-0.dllがないとエラーになります。

ちゃんとプラグインをビルドしたターゲットのGeanyバージョンでないと動かないようです。


ウィキには動作テストについてもインストラクションがあるので大体これに従って動作確認出来ました。
  • create directory: c:\git\geany_test
  • copy everything from c:\git\geany\geany-1.25 to c:\git\geany_test
  • copy bundled GTK runtine environment to c:\git\geany_test
  • copy everything from c:\git\geany-plugins\geany-plugins-1.25 to c:\git\geany_test
  • copy plugins dependencies from c:\git\geany-plugins\contrib to c:\git\geany_test
とあります。最初の2つは簡単ですが、3つ目は上の方でC:/libsにコピーしたGtkのライブラリなので

http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip

このzipを解凍して、c:\git\geany_testにコピーしました。
4つ目、c:\git\geany-plugins\geany-plugins-1.25は今自分でビルドしたgeany-pluginsですね。
最後のgeany-plugins\contribに関しては見つかりませんでしたので、無視しましたが大丈夫でした。

ここまで手作業でやれば、大丈夫でした。その下にある_geany_test.batというバッチファイルは同じことをするのだと思いますが、必要ありません。

バグ

動いたものの、いまのところコンフィグレーションのダイアログがまっさらで、ウィンドウズではうまく動かないようです。

 

ダイアログが動かないので、設定にはプラグインの設定ファイルを直接編集することで可能ですが、Geanyの終了時にプラグインの設定ファイルが上書きされるので、Geanyを閉じて、Geany以外のエディタで編集します。設定ファイルのパスは

"C:\Users\UserName\AppData\Roaming\geany\plugins\overview\prefs.conf"

あたりのはずです。

内容は

[overview]
width=120
zoom=-80
show-tooltip=true
show-scrollbar=false
double-buffered=true
scroll-lines=6
overlay-enabled=true
overlay-inverted=false
visible=true
position=right
overlay-color=#ef440085cd28
overlay-alpha=0
overlay-outline-color=#ef440085cd28
overlay-outline-alpha=0

こんな感じで、ダイアログを開いた後ズームの設定がおかしくなるのでzoom=-100とかにするともとに戻ります。Zoom値はマイナスなので注意。

show-scrollbar=false
にすると縦のスクロールバーがなくなりsublimeっぽくなりますが、合ったほうが便利な気もします。スクロールバーの位置が右端だったらよかったのですが、今のところミニマップとエディターの間に来てしまうのが嫌で私は外しました。

今のところ1時間くらい平気ですが、残念ながら予期なくクラッシュすることがあるので本格的に使うのは止めにしました。Geanyはいま1.24ですが、1.25のリリースに含まれればいいですね。