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のQtDeclarativeQtScriptQtScriptToolsモジュールはサポートしません。 PyQt5では、これらはQtQmlQtQuickモジュールに置き換えました。 PyQt4と違って、PyQt5ではQMLからPythonオブジェクトの生成をサポートします。

QtGuiモジュール

PyQt4のQtGuiモジュールは、PyQt5ではQtGuiQtPrintSupportQtWidgetsモジュールに分割しました。

QtOpenGLモジュール

PyQt5では、QGLContextQGLFormatQGLWidgetクラスのみをサポートします。

QtWebkitモジュール

PyQt4のQtWebKitモジュールは、PyQt5ではQtWebKitQtWebKitWidgetsモジュールに分割しました。

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では、QSetPython v2ではリストとして、Python v3ではセットとして実装していました。 PyQt5では、常にセットとして実装しています。

pyuic5

pyuic5は、pyuic4--pyqt3-wrapperフラグをサポートしません。

pyrcc5

pyrcc5pyrcc4-py2-py3フラグをサポートしません。 pyrcc5の出力は、Python v2.6以降の全てのバージョンに互換性があるものになります。

Cooperative Multi-inheritance

Releasing the GIL

Object Destruction on Exit


時間無くなっちゃった(・ω<)