2013年11月10日アーカイブ

遅まきながら、「艦隊これくしょん~艦これ~ - オンラインゲーム - DMM.com」と言うゲームを始めました。
このゲーム、flash が必須になっているのでiPhoneでやることができません。でも、運営がdmmと言うこともあって、職場からはアクセスしずらい・・・。
そして、私が持っているMacBook Proは蓋が閉じているとリモートアクセスできないと言う謎仕様なので、リモートでやることができません。
うちで常時起動しているのはFreeBSD8のサーバだけ。
ならば、こいつで艦これが動けばいいのです。
まずは、FreeBSD上のfirefoxでflashが使えるようにする必要があります。この手順は、FreeBSDハンドブックの7.2. Web ブラウザを見ればそのままで行けます。
これで、firefox上で艦これができるようになるのですが、それだけではつまりません。
艦メモ ~艦娘メモリーズ~(艦これ専用ブラウザ) - 理ろぐと言うQtで書かれた艦これ専用ブラウザアプリがあるので、これをFreeBSDで動かすことにします。
Qtは、マルチプラットフォームが売りのGUIライブラリなので、FreeBSDでもそのまま動くはず。
が、portsにあるのはQt 4.8だけ。5系はまだportsで対応していないようです。
しょうがないので、Download Qt, the cross-platform application framework | Qt Project からソースを持ってきてビルドすることにします。
持ってくるのは、The source code is also available as a single zip (280 MB) (Info) file for Windows users or as tar.gz (226 MB) (Info) file for Linux/Mac users.って書いてある「tar.gz」のリンク先から、qt-everywhere-opensource-src-5.1.1.tar.gz。
こいつを展開して、以下のようなシェルスクリプトを作成して実行します。(別にシェルスクリプトにしなくても良いんだけど、何度もやり直すので)
#!/bin/bash

./configure -opensource -confirm-license -no-compile-examples |& tee configure.log
configure.logの最後の方だけ引用しておくと、
Build options:
  Configuration .......... accessibility accessibility-atspi-bridge alsa audio-backend clock-gettime clock-monotonic concurrent cups dbus evdev fontconfig full-config getaddrinfo getifaddrs glib gnu-libiconv gstreamer gtk2 gtkstyle icu ipv6ifname large-config largefile medium-config minimal-config nis opengl openssl png precompile_header qpa qpa reduce_exports release rpath shared small-config sse2 sse3 ssse3 system-freetype system-jpeg system-png system-zlib v8 v8snapshot xcb xcb-glx xcb-render xcb-xlib xinput2 xlib xrender 
  Build parts ............ libs tools examples
  Mode ................... release
  Using C++11 ............ no
  Using PCH .............. yes
  Target compiler supports:
    SSE2/SSE3/SSSE3 ...... yes/yes/yes
    SSE4.1/SSE4.2 ........ no/no
    AVX/AVX2 ............. no/no

Qt modules and options:
  Qt D-Bus ............... yes (loading dbus-1 at runtime)
  Qt Concurrent .......... yes
  Qt GUI ................. yes
  Qt Widgets ............. yes
  JavaScriptCore JIT ..... yes (To be decided by JavaScriptCore)
  QML debugging .......... yes
  Use system proxies ..... no

Support enabled for:
  Accessibility .......... yes
  ALSA ................... yes
  CUPS ................... yes
  FontConfig ............. yes
  Iconv .................. gnu
  ICU .................... yes
  Image formats: 
    GIF .................. yes (plugin, using system library)
    JPEG ................. yes (plugin, using system library)
    PNG .................. yes (in QtGui, using system library)
  Glib ................... yes
  GStreamer .............. yes
  GTK theme .............. yes
  Large File ............. yes
  libudev ................ no
  Networking: 
    getaddrinfo .......... yes
    getifaddrs ........... yes
    IPv6 ifname .......... yes
    OpenSSL .............. yes (loading libraries at run-time)
  NIS .................... yes
  OpenGL ................. desktop
  OpenVG ................. no
  PCRE ................... system
  pkg-config ............. yes 
  PulseAudio ............. no
  QPA backends: 
    DirectFB ............. no
    EGLFS ................ no
    KMS .................. no
    LinuxFB .............. no
    XCB .................. yes (system library)
      MIT-SHM ............ yes
      Xcursor ............ yes (loaded at runtime)
      Xfixes ............. yes (loaded at runtime)
      Xi ................. no
      Xi2 ................ yes
      Xinerama ........... yes (loaded at runtime)
      Xrandr ............. yes (loaded at runtime)
      Xrender ............ yes
      XKB ................ no
      XShape ............. yes
      XSync .............. yes
      XVideo ............. yes
  Session management ..... yes
  SQL drivers: 
    DB2 .................. no
    InterBase ............ no
    MySQL ................ yes (plugin)
    OCI .................. no
    ODBC ................. yes (plugin)
    PostgreSQL ........... yes (plugin)
    SQLite 2 ............. yes (plugin)
    SQLite ............... yes (plugin, using bundled copy)
    TDS .................. no
  udev ................... no
  xkbcommon .............. yes
  zlib ................... yes (system library)


Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into /usr/local/Qt-5.1.1

みたいな感じ。実際には、ここまで来るのが長くて、必要なライブラリをいろいろ入れて上げないとこの状態になりません。元から入っているものがあるので、全て列挙できませんが、私が追加したライブラリ(ports)を以下に列挙しておきます。
  • graphics/svgalib
  • x11/libxcb
  • x11/libxkbcommon
  • x11/xcb
  • x11/xcb-proto
  • x11/xcb-util
  • x11/xcb-util-image
  • x11/xcb-util-keysyms
  • x11/xcb-util-renderutil
  • x11/xcb-util-wm
configureに成功したら、ビルドします。必ず、make ではなく gmake を使うこと。configureの出力に書いてあるのですが、気が付かずに make を使っていてずっとはまっていました。
ビルドしていくと、以下のエラーで止まります。
/usr/bin/ld: cannot find -ldl
gmake[6]: *** [../../../../plugins/platforms/libqxcb.so] エラー 1
gmake[6]: ディレクトリ `/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/src/plugins/platforms/xcb' から出ます
libdlがないと言うエラーですが、FreeBSDの場合はlibcに含まれています。
mkspecsにはないみたいだし、なんでかな〜と思ってソースを眺めていると、qtbase/src/plugins/platforms/xcb/xcb-plugin.pro に LIBS += -ldl なんて書いてあります。
今回は、とりあえずFreeBSDでビルドできればいいので、この行を消してしまいましょう。
diff --git a/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro b/qtbase/src/plugins/pl
atforms/xcb/xcb-plugin.pro
index 8299528..4559081 100644
--- a/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro
+++ b/qtbase/src/plugins/platforms/xcb/xcb-plugin.pro
@@ -40,7 +40,7 @@ HEADERS = \
         qxcbimage.h \
         qxcbxsettings.h
 
-LIBS += -ldl
+#LIBS += -ldl
 
 # needed by GLX, Xcursor ...
 contains(QT_CONFIG, xcb-xlib) {
先に進むと、今度はsqlite3のビルドでエラーになります。
../../../3rdparty/sqlite/sqlite3.c:23531: error: 'fchmod' undeclared here (not in a function)


(中略)


gmake[5]: *** [.obj/release-shared/sqlite3.o] エラー 1
gmake[5]: ディレクトリ `/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/src/plugins/sqldrivers/sqlite' から出ます
fchmod は sys/stat.h にプロトタイプ宣言があるはずで、/usr/include/sys/stat.h を見ると #if __POSIX_VISIBLE >= 200112 であれば宣言されるように見えますが、__POSIX_VISIBLEがなんなのかわかりません。追うのも面倒なので、sqlite3.c に直接プロトタイプ宣言を追加してしまいます。
diff --git a/qtbase/src/3rdparty/sqlite/sqlite3.c b/qtbase/src/3rdparty/sqlite/sqlit
e3.c
index 03fa649..2675d25 100644
--- a/qtbase/src/3rdparty/sqlite/sqlite3.c
+++ b/qtbase/src/3rdparty/sqlite/sqlite3.c
@@ -23019,6 +23019,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
 #include <sys/mman.h>
 #endif
 
+int fchmod(int, mode_t);
 
 #if SQLITE_ENABLE_LOCKING_STYLE
 # include <sys/ioctl.h>
さらに進むと、リンク時にundefined referenceが出ます。
g++ -Wl,--no-undefined -Wl,-O1 -pthread -Wl,-rpath,/usr/local/Qt-5.1.1/lib -Wl,-rpath-link,/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib -shared -o libqevdevmouseplugin.so .obj/release-shared/main.o  -L/usr/local/lib -L/usr/X11R6/lib -L/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib -lQt5PlatformSupport -lfontconfig -lfreetype -lgthread-2.0 -pthread -lglib-2.0 -lintl -lXext -lX11 -lm -lXrender -lQt5DBus -lQt5Gui -lQt5Core -lGL  
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x994): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::create(QFlags<QDeviceDiscovery::QDeviceType>, QObject*)'
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x9b4): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::scanConnectedDevices()'
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x16f4): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::create(QFlags<QDeviceDiscovery::QDeviceType>, QObject*)'
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/lib/libQt5PlatformSupport.a(qevdevmousemanager.o)(.text+0x1714): In function `QEvdevMouseManager::QEvdevMouseManager(QString const&, QString const&, QObject*)':
: undefined reference to `QDeviceDiscovery::scanConnectedDevices()'
gmake[5]: *** [../../../../plugins/generic/libqevdevmouseplugin.so] エラー 1
gmake[5]: ディレクトリ `/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/src/plugins/generic/evdevmouse' から出ます
createとscanConnectedDevicesはQDeviceDiscoveryにあるはずですが、なんでビルドされないんだろーと思って見ていたところ、qtbase/src/platformsupport/devicediscovery/devicediscovery.pri の中で、linux のときしかビルドされないようになっていました。evdev があるならlinuxじゃなくてもビルドして良いだろうと、限定を外します。
diff --git a/qtbase/src/platformsupport/devicediscovery/devicediscovery.pri b/qtbase
/src/platformsupport/devicediscovery/devicediscovery.pri
index 9a58eee..f5176dc 100644
--- a/qtbase/src/platformsupport/devicediscovery/devicediscovery.pri
+++ b/qtbase/src/platformsupport/devicediscovery/devicediscovery.pri
@@ -1,4 +1,4 @@
-linux:contains(QT_CONFIG, evdev) {
+contains(QT_CONFIG, evdev) {
     HEADERS += $$PWD/qdevicediscovery_p.h
 
     contains(QT_CONFIG, libudev) {
さらに先に進むと、flexのオプションが違うとエラーに。
( test -e Makefile.ANGLE.DerivedSources || /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtbase/bin/qmake /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/ThirdParty/ANGLE/DerivedSources.pri -o Makefile.ANGLE.DerivedSources ) && make -f Makefile.ANGLE.DerivedSources
flex --noline --nounistd --outfile=generated/glslang_lex.cpp src/compiler/glslang.l
flex: unknown flag '-'.  For usage, try
        flex --help
*** Error code 1

Stop in /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/ThirdParty/ANGLE.
調べてみると、システムに標準で入っているflex 2.5.4 だとlong形式のオプションはなくて、portsから入れた2.5.37だと解釈できるらしい。私の場合、portsのflexはインストールされていたんだけど、PATHが/usr/local/bin/よりも/usr/bin/を優先していたのでエラーになっていた。
これは、/usr/local/bin/を優先することで先に進んだ。
qtbaseが終わって先に進んで行くと、webkitで以下のエラー
enerated/SettingsMacros.h:31:11: error: missing binary operator before token "("
generated/SettingsMacros.h:54:11: error: missing binary operator before token "("
generated/SettingsMacros.h:77:11: error: missing binary operator before token "("
generated/SettingsMacros.h:108:11: error: missing binary operator before token "("
*** Error code 1

Stop in /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/WebCore.
なんだべーと思って調べた所、Building Qt 5.0.0 fails on Windows 8 with MinGW 4.7.2 | Qt Project forums | Qt Projectと言う記事を発見。
SettingsMacros.hはヘッダなのに、これをビルドして.oを作ろうとしてるのが問題らしい。
記事の通りに、qtwebkit/Source/WebCore/Makefile.WebCore.Target から SettingsMacros.h を削除してあげたら先に進んだ。
このファイル自体が生成されるファイルなので、git diff の出力はなし。
次は、またundefined reference。
/var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/lib/libQt5WebKit.so: undefined reference to `void WTF::freeOwnedGPtr<_GError>(_GError*)'
*** Error code 1

Stop in /var/src/qt/qt-everywhere-opensource-src-5.1.1/qtwebkit/Source/WebKit2.
undefined referenceが出たら*.proか*.priを疑え、と言うことでqtwebkit/Source/WTF/WTF.pri が犯人。
diff --git a/qtwebkit/Source/WTF/WTF.pri b/qtwebkit/Source/WTF/WTF.pri
index 2b4e8bc..f88b3fd 100644
--- a/qtwebkit/Source/WTF/WTF.pri
+++ b/qtwebkit/Source/WTF/WTF.pri
@@ -20,7 +20,7 @@ mac {
     }
 }
 
-linux-*:use?(GSTREAMER) {
+use?(GSTREAMER) {
     DEFINES += ENABLE_GLIB_SUPPORT=1
     PKGCONFIG += glib-2.0 gio-2.0
 }
これで、無事にQtのビルドが成功。後は、rootになってgmake installしてあげれば、/usr/local/Qt-5.1.1にインストールされる。

後は、艦メモのビルド方法(Ubuntu編) - 理ろぐを見ながら艦メモをビルド。
はまりポイントは2つ。
Twitter4QMLのビルド時に使うsyncqt.plとqmakeの位置が、/usr/local/Qt-5.1.1/binであること(ハマるところではないか)
後は、KanmusuMemoryは CONFIG += c++11 しているので、OS標準のg++ 4.2.1 ではビルドできない。
portsから g++ 4.6.3 を入れたら、ビルドできた。(指定方法を調べるのが面倒だったので、qmakeでできたMakefileの、CC, CXX, LINKをgcc46/g++46に書き換え)
後は、初めてtwitterのコンシューマーキーとコンシューマーシークレットを取得したりした。

後は、こいつをiPhoneから使うために、vncを試してみたんだけど、なかなかうまくいかず。長くなるので詳細は書かないけど、通常のvncだとQtにキー入力ができず、OpenGLも使えないため艦メモのスクリーンショット機能が使えない。
コンソールでXを立ちあげて、x0vncserverを使うと、うまく行きそうな雰囲気だ。(あまり検証できていない)
redmineをportupgradeしようとしたら、redmineはruby 1.9を要求していて、今インストールされているruby 1.8と競合していた。
さらに、portsディレクトリや、/usr/ports/UPDATINGを見たところ、FreeBSDはシステムのrubyを1.8から1.9に変更して、さらにportsは1.8をもうサポートしないらしい。
今うちでrubyを使っているのは何かと調べたところ、fastladder と tiarra、wig.rbくらい。(ってwassrはサービス終了しているから、wig.rbは動いている意味がないな)
問題はfastladderで、随分古いrails(2.0.2)を使っているし、少し自分で手を入れたりしているので、動かない可能性が高い。
んで、ruby 1.9 で誰か動かしていないかな〜と思って探したところ、github にfastladder/fastladderを発見。
Gemfileを見ると、rails 4.0.0に対応しているらしい。
これが使えれば、ruby 1.9に移行できると思い、早速 git clone。
と、その前に、ruby 1.9をインストール。

README.md の通りに、bundle installして、config/database.yml.sqlite3をconfig/database.yml にコピーして、bundle exec rake db:create db:migrate してみた。
そして、bin/rails server とやると、mongrel?がポート3000で立ち上がるので、ブラウザから:3000にアクセスすると、普通に動くっぽい。
これなら行ける!と思ってdb/schema.rb を古いものと比較してみても、書き方が変わっているだけでDBのテーブル構造自体は変わっていないように見える。
そこで、試しに今のDBの内容をテスト用のDBに流し込んで、そのまま使えるか見てみる。
% pg_dump -f db.dump fastladder_production
% createdb fastladder_development
% psql fastladder_development -f db.dump
こんな感じでDBをコピーして、config/database.ymlをpostgres用に直して、fastladder_developmentを指定してみる。
起動しようとしたら、pgがないよ的なことを言われたので、Gemfile に require 'pg' を追加。
これでmongrelを起動して、アクセスしてみると、PendingMigrationError とか言われてしまう。
schema.rbに書いてあるversionが悪いのかな〜と思って、古いのと同じ8にしてみても状況変わらず。
しょうがないので、sqlite3 db/development.sqlite3 して、.schema でスキーマを見比べてみると、古いものはschame_infoと言うテーブルがあるのに対し、新しいものは schema_migrations と言うテーブルがある。両方共カラムはversionだけだが、古いものはintで新しいものはvarchar(255)だ。
それ以外は同じように見えるので、コピーしたデータベースにschema_migrationsテーブルだけ足してみることにする。
とりあえず、postgresにダミーのDBを作って、DBを作りなおして、ダンプしてschema_migrationsテーブルの情報を取り出すことにする。
% createdb hoge
% vi config/database.yml (データベースの接続先をhogeにする)
% bundle exec rake db:create db:migrate
% pg_dump -f hoge.dump hoge
% vi hoge.dump (schema_migrationsテーブル関連だけ残して他を消す)
% psql fastladder_development -f hoge.dump (schema_migrationsを入れる)
vi config/database.yml (データベースの接続先をfastladder_developmentに戻す)
これで起動して試してみると、見事に読めることを確認。
後は、ruby 1.9 用に passenger を入れなおして、apacheの設定を新しい passenger 用に変更すれば行けるはず。
# gem install passenger
# passenger-install-apache2-module
# vi /usr/local/etc/apache22/httpd.conf (Passengerの設定変更)
# /usr/local/etc/rc.d/apache22 stop
# /usr/local/etc/rc.d/apache22 start
httpd.confの変更は以下の様な感じ
diff --git a/apache22/httpd.conf b/apache22/httpd.conf
index 69044b1..292c143 100644
--- a/apache22/httpd.conf
+++ b/apache22/httpd.conf
@@ -288,19 +288,24 @@
-LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.5/ext/apache2/mod_passenger.so
+LoadModule passenger_module /usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.23/buildout/apache2/mod_passenger.so
 
-# Passenger
-PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.5
-PassengerRuby /usr/local/bin/ruby18
+# Passenger 1.9
+PassengerRoot /usr/local/lib/ruby/gems/1.9/gems/passenger-4.0.23
+PassengerDefaultRuby /usr/local/bin/ruby19
基本はpathが変わってるだけだけど、PassengerRubyディレクティブがPassengerDefaultRubyに変わってる
あ、設定に合わせて、古いfastladderの置いてあった場所に新しいfastladderを置く。
これで行ける〜!と思ってアクセスしてみたら、gemが足りないからbundle installしろと言われる。
bundle installしても変わらず。
しばらく悩んだ後で、--deploymentオプションをつけてみたら、vender/bundle にインストールされてうまくいったっぽい。(Passenger is preventing Bundler from seeing my git gems - nginx, deployment, phusion-passenger, rvm, bundler - TechQues.com)
# bundle install --deployment
今度こそ!と思ってアクセスしても、やっぱりうまくいかない。fastladderのlog/production.logを見ると、reader.jsにアクセスが来てるけど、reader.jsなんて知らないと言うエラーが出ている。
reader.jsってなんだろーと思って調べてみると、app/assets/javascripts/ にあり、public/javascriptsにはない。そして、config/environments/production.rb では、config.assets.precompile に出てくるが、development.rb には出てこない。
なんだろなーと調べていると、Rails3.1のAsset Pipelineと仲良くなる -と言うサイトを発見。
ここを見習って、以下のようにしたら今度こそうまくアクセスできるようになった。(最初、precompileについてだけ調べていて、RAILS_ENVを指定しないで実行して、うまくいかなくて悩んだ)
# bundle exec rake assets:precompile RAILS_ENV=production
あ、本来は script/crawler とかを動かさないとクロールしてくれないけど、うちの環境はplaggerでfastladderのDBに入れているので、fastladder自身のクローラーは動かさない。

これで、ruby 1.9 環境に移行することができたのでした。github の fastladderのcontrobutorの方々に感謝。
2013年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

このアーカイブについて

このページには、2013年11月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2013年8月22日です。

次のアーカイブは2013年11月23日です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1