PyQt5を使ってOS X上で開発する準備
事前にMarvericks上に、pyenv+virtualenvwrapperでpython-3.4.0な環境を作成
…とおもったらhomebrew一発だった
$ brew intall pyqt5 --with-python $ export PYTHONPATH=/usr/local/lib/python3.4/site-packages:$PYTHONPATH (↑python3.4なので)
Gentoo Linuxにgollumを導入する
Portageでインストールしたruby-2.0なGentooLinuxにgollumをインストールします。
gollumに必要なcharlock_holmesというgemのインストールでエラーが出てしまいます。
$ gem install charlock_holmes Building native extensions with: '--with-icu-dir=/usr/lib/icu' This could take a while... ERROR: Error installing charlock_holmes: ERROR: Failed to build gem native extension. /usr/bin/ruby20 extconf.rb --with-icu-dir=/usr/lib/icu checking for main() in -licui18n... yes checking for main() in -licui18n... yes checking for unicode/ucnv.h... yes -- tar zxvf file-5.08.tar.gz -- ./configure --prefix=/home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/dst/ --disable- shared --enable-static --with-pic -- patch -p0 < ../file-soft-check.patch -- make -C src install -- make -C magic install checking for main() in -lmagic_ext... yes checking for magic.h... yes creating Makefile make "DESTDIR=" compiling converter.c In file included from converter.c:2:0: common.h:23:14: warning: ‘charlock_new_str’ defined but not used [-Wunused-function] common.h:32:14: warning: ‘charlock_new_str2’ defined but not used [-Wunused-function] compiling ext.c In file included from ext.c:1:0: common.h:14:14: warning: ‘charlock_new_enc_str’ defined but not used [-Wunused-function] common.h:23:14: warning: ‘charlock_new_str’ defined but not used [-Wunused-function] common.h:32:14: warning: ‘charlock_new_str2’ defined but not used [-Wunused-function] compiling encoding_detector.c In file included from encoding_detector.c:3:0: common.h:14:14: warning: ‘charlock_new_enc_str’ defined but not used [-Wunused-function] compiling transliterator.cpp linking shared-object charlock_holmes/charlock_holmes.so converter.o: In function `rb_converter_convert': converter.c:(.text+0xb4): undefined reference to `ucnv_convert' converter.c:(.text+0xf4): undefined reference to `ucnv_convert' converter.c:(.text+0x18e): undefined reference to `u_errorName' encoding_detector.o: In function `rb_get_supported_encodings': encoding_detector.c:(.text+0xa0): undefined reference to `uenum_count' encoding_detector.c:(.text+0xc1): undefined reference to `uenum_next' encoding_detector.c:(.text+0x12a): undefined reference to `uenum_next' encoding_detector.c:(.text+0x16c): undefined reference to `uenum_next' encoding_detector.c:(.text+0x1aa): undefined reference to `uenum_next' encoding_detector.c:(.text+0x1f1): undefined reference to `uenum_next' encoding_detector.o:encoding_detector.c:(.text+0x22e): more undefined references to `uenum_next' follow encoding_detector.c:(.text+0x1f1): undefined reference to `uenum_next' [59/930] encoding_detector.o:encoding_detector.c:(.text+0x22e): more undefined references to `uenum_next' follow encoding_detector.o: In function `rb_encdec__alloc': encoding_detector.c:(.text+0x73d): undefined reference to `u_errorName' transliterator.o: In function `rb_transliterator_id_list': transliterator.cpp:(.text+0x158): undefined reference to `u_errorName' transliterator.o: In function `rb_transliterator_transliterate': transliterator.cpp:(.text+0x2dd): undefined reference to `icu::UnicodeString::UnicodeString(char const*, int)' transliterator.cpp:(.text+0x305): undefined reference to `icu::UnicodeString::~UnicodeString()' transliterator.cpp:(.text+0x31b): undefined reference to `icu::UMemory::operator new(unsigned long)' transliterator.cpp:(.text+0x331): undefined reference to `icu::UnicodeString::UnicodeString(char const*, int)' transliterator.cpp:(.text+0x36a): undefined reference to `icu::UnicodeString::toUTF8(icu::ByteSink&) const' transliterator.cpp:(.text+0x3b5): undefined reference to `icu::ByteSink::~ByteSink()' transliterator.cpp:(.text+0x405): undefined reference to `u_errorName' transliterator.cpp:(.text+0x46f): undefined reference to `icu::UMemory::operator delete(void*)' transliterator.cpp:(.text+0x4a0): undefined reference to `icu::UnicodeString::~UnicodeString()' transliterator.o: In function `icu::StringByteSink<std::string>::~StringByteSink()': transliterator.cpp:(.text._ZN3icu14StringByteSinkISsED2Ev[_ZN3icu14StringByteSinkISsED5Ev]+0xf): undefined reference to `icu::ByteSink::~ByteSink()' transliterator.o: In function `icu::StringByteSink<std::string>::~StringByteSink()': transliterator.cpp:(.text._ZN3icu14StringByteSinkISsED0Ev[_ZN3icu14StringByteSinkISsED0Ev]+0x13): undefined reference to `icu::ByteSink::~ByteSink()' transliterator.cpp:(.text._ZN3icu14StringByteSinkISsED0Ev[_ZN3icu14StringByteSinkISsED0Ev]+0x1c): undefined reference to `icu::UMemory::operator delete(void*)' transliterator.o:(.data.rel.ro._ZTVN3icu14StringByteSinkISsEE[_ZTVN3icu14StringByteSinkISsEE]+0x28): undefined reference to `icu::ByteSink::GetAppendBuffer(int, int, char*, int, int*)' transliterator.o:(.data.rel.ro._ZTVN3icu14StringByteSinkISsEE[_ZTVN3icu14StringByteSinkISsEE]+0x30): undefined reference to `icu::ByteSink::Flush()' transliterator.o:(.data.rel.ro._ZTIN3icu14StringByteSinkISsEE[_ZTIN3icu14StringByteSinkISsEE]+0x10): undefined reference to `typeinfo for icu::ByteSink' ./libmagic_ext.a(compress.o): In function `uncompressgzipped': /home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/src/file-5.08/src/compress.c:357: undefin ed reference to `inflateInit2_' /home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/src/file-5.08/src/compress.c:363: undefin ed reference to `inflate' /home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/src/file-5.08/src/compress.c:370: undefin ed reference to `inflateEnd' collect2: error: ld returned 1 exit status make: *** [charlock_holmes.so] Error 1 Gem files will remain installed in /home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4 for inspection. Results logged to /home/rkmathi/.gem/ruby/2.0.0/gems/charlock_holmes-0.6.9.4/ext/charlock_holmes/gem_make.out
/usr/lib/ruby/2.0.0/x86_64-linux/rbconfig.rb
のLDFLAGSを編集したら通りました。
CONFIG["LDFLAGS"] = "-L. -Wl,-O1 -Wl,--as-needed -rdynamic -Wl,-export-dynamic -Wl,--no-undefined"
という行を、
CONFIG["LDFLAGS"] = "-L. -Wl,-O1 -Wl,--as-needed -rdynamic -Wl,-export-dynamic"
にすればインストールできました。
Docker 0.9.1 on OS X Mavericksを試す
手順とメモ
1. VirtualBoxをインストール
VirtualBox - Downloads から、「VirtualBox X.X.X for OS X hosts」をダウンロード、インストール
2. Homebrewでdockerとboot2dockerをインストール
$ brew update
$ brew install docker boot2docker
3. boot2docker init
sysctl
コマンドを使うから、/usr/sbin
にPATHが通ってないと落ちる。
$DOCKER_HOST
変数を設定する。
$ export PATH=/usr/sbin:$PATH $ export DOCKER_HOST=tcp://localhost:4243 $ boot2docker init [2014-04-00 00:00:00] Creating VM boot2docker-vm Virtual machine 'boot2docker-vm' is created and registered. ... [2014-04-00 00:00:00] Done. [2014-04-00 00:00:00] You can now type boot2docker up and wait for the VM to start. $
4. Docker daemonを起動
boot2docker up
か、boot2docker start
で起動。
デフォルトだと、User:docker
、Password:tcuser
だった。
$ boot2docker up [2014-04-00 00:00:00] Starting boot2docker-vm... [2014-04-00 00:00:00] Started. To connect the docker client to the Docker daemon, please set: export DOCKER_HOST=tcp://localhost:4243 $ boot2docker ssh docker@localhost s password: ## . ## ## ## == ## ## ## ## === /""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| boot2docker: 0.8.0 docker@boot2docker:~$ uname -mnr boot2docker 3.13.3-tinycore64 x86_64 docker@boot2docker:~$ exit $
5. コマンドの実行
base環境を入れて、uname -a
してみる。
$ docker run base uname -a $ docker run base Unable to find image 'base' locally Pulling repository base b750fe79269d: Download complete 27cf78414709: Download complete Linux 4db1b899c036 3.13.3-tinycore64 #1 SMP Wed Mar 26 03:16:13 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux $
5. Docker daemonの終了
boot2docker down
か、boot2docker stop
か、boot2docker halt
で終了。
$ boot2docker down [2014-04-00 00:00:00] Shutting down boot2docker-vm... $
6. boot2dockerのアップデート
$ boot2docker down $ boot2docker download $ boot2docker up
Homebrew楽ちんだった
「Differences Between PyQt4 and PyQt5」の抄訳
PyQt使ってみたかったけど、ver.4とver.5で違いが結構あるぽいので Differences Between PyQt4 and PyQt5 — PyQt 5.2.1 Reference Guide を抄訳してみた。
なにか変なところがあったら教えてくだちい。
PyQt4とPyQt5の違い
PyQt5とPyQt4は、互換性がありません(が、PyQt4からPyQt5へのアプリケーションの移植は難しいことではないと言えます)。 このセクションでは、PyQt5とPyQt4の間の主要な違いについて説明します。
サポートするPythonのバージョン
Python2.6より古いバージョンはサポートしません。
廃止予定の機能
PyQt5では、deprecatedになった又はQt v5.0で廃止したAPIについてはサポートしません。 しかし、いくつかのAPIをうっかり含んでしまうかもしれません。 それらはバグなので、見つけ次第直していきます。
複数のAPI
PyQt4では複数バージョンのAPIをサポートしています(例えば、QString, QVariantなど )。 PyQt5ではQVariantを除いて、全てのAPIはv2のみが実装しています。 QVariantの変更と、QPyNullVariantについては、 Support for QVariant — PyQt 5.2.1 Reference Guide を参考にしてください。
古いスタイルのシグナルとスロット
PyQt4での古いスタイルのシグナルとスロットはサポートしません。 そのため、次のメソッドPyQt5では実装していません。
QObject.connect()
QObject.emit()
SIGNAL()
SLOT()
SIGNAL()
とSLOT()
の返り値を引数としてつかうメソッドは、全てサポートしません。
シグナルか、それぞれ呼ばれるメソッドは常に同等なものとして、違いがなくなります。
加えて、次のメソッドは違いが発生します。
disconnect()
は、引数を取らず全てのQObjectインスタンスから切断します。
新しいスタイルのシグナルとスロット
Qtは2つの異なる引数を持つシグナルを実装しています、1つは引数を使うもので、もうひとつは引数を使わないものです。 PyQt4では、好きな方を選んで使うことができました。 しかしながら、シグナルを発するときに、あなたは適切な引数を持つシグナルを使う必要がありました。
PyQt5では、全ての引数が指定されたシグナルのみを使うことができます。 しかし、シグナルを発するときに不要な引数は省略することができます。
PyQt4とは違って、PyQt5ではプロパティでの定義をサポートしており、シグナルとスロットはQObjectのサブクラスではなくなりました。
QtDeclarative、QtScript、QtScriptToolsモジュール
PyQt4のQtDeclarative
、QtScript
、QtScriptTools
モジュールはサポートしません。
PyQt5では、これらはQtQml
とQtQuick
モジュールに置き換えました。
PyQt4と違って、PyQt5ではQMLからPythonオブジェクトの生成をサポートします。
QtGuiモジュール
PyQt4のQtGui
モジュールは、PyQt5ではQtGui
、QtPrintSupport
、QtWidgets
モジュールに分割しました。
QtOpenGLモジュール
PyQt5では、QGLContext
、QGLFormat
、QGLWidget
クラスのみをサポートします。
QtWebkitモジュール
PyQt4のQtWebKit
モジュールは、PyQt5ではQtWebKit
とQtWebKitWidgets
モジュールに分割しました。
QtXmlモジュール
PyQt4のQtXml
モジュールはサポートしません。
QXMLStreamReader
クラスかQXMLStreamWriter
クラスか、Pythonの標準XMLモジュールを使ってください。
pyqtconfigモジュール
PyQt4のpyqtconfig
モジュールはサポートしません。
この The PyQt5 Extension API — PyQt 5.2.1 Reference Guide で、PyQt5でのサードパーティのパッケージ(例:QScintilla)についてを説明しています。
dbus.mainloop.qtモジュール
PyQt4のdbus.mainloop.qt
モジュールは、PyQt5ではdbus.mainloop.pyqt5
になりました。
これは、並べて実行することも許可し、どちらも同じ機能になります。
QDataStream
readUInt8()
、readInt8()
、writeUInt8()
、writeInt8()
メソッドは、全て数値の読み書きとして解釈されます。
PyQt4では、これらは1つの文字について解釈されていました。
QFileDialog
PyQt4のQFileDialog
に属するgetOpenFileNameAndFilter()
、getOpenFileNamesAndFilter()
、getSaveFileNameAndFilter()
メソッドは、PyQt5ではgetOpenFileName()
、getOpenFileNames()
、getSaveFileName()
に改名しました。PyQt4のgetOpenFileName()
、getOpenFileNames()
、getSaveFileName()
はPyQt5ではサポートしません。
QGraphicsItemAnimation
廃止予定だったQGraphicsItemAnimation
クラスは削除しました。
もし、移植したいPyQt4アプリケーションで使用していた場合は、QPropertyAnimation
をかわりに使うことを検討してみてください。
QMatrix
廃止予定だったQMatrix
クラスは削除しました。
もし、移植したいPyQt4アプリケーションで使用していた場合は、QTransform
をかわりに使うことを検討してみてください。
QPyTextObject
PyQt4はQPyTextObject
を複数のQtのクラスからサブクラス化されたPythonクラスを定義することができないことの回避策として使用しています。
PyQt5はQ_DECLARE_INTERFACE
のようにC+ +で宣言されている、インタフェースがあるものであれば、複数のQtのクラスからサブクラスであるPythonのクラスを定義する機能をサポートしています。
したがってQPyTextObject
はPyQt5に実装されていません。
QSet
PyQt4では、QSet
はPython v2ではリストとして、Python v3ではセットとして実装していました。
PyQt5では、常にセットとして実装しています。
pyuic5
pyuic5
は、pyuic4
の--pyqt3-wrapper
フラグをサポートしません。
pyrcc5
pyrcc5
はpyrcc4
の-py2
と-py3
フラグをサポートしません。
pyrcc5
の出力は、Python v2.6以降の全てのバージョンに互換性があるものになります。
Cooperative Multi-inheritance
Releasing the GIL
Object Destruction on Exit
時間無くなっちゃった(・ω<)