艦メモ 0.15 betaで録画機能テスト中です

端的にいうと人柱版ですね。

/// 概要 ///
ゲーム画面を連続的にキャプチャしてffmpegで最終的に結合することで録画します。いじょ


/// 注意事項 ///
 ・ffmpeg必須です。
 ・PCのマスター音源を拾うのでメディアプレイヤーなどで音楽再生してるとひろってしまいます。
 ・キャッシュフォルダにガンガン画像を保存します。ディスクの残量は考慮しません。
 ・マップ攻略などを記録に残そうと録画をして「ボス戦で勝った!」というタイミングで艦メモが落ちても責任取れません。
 ・用法用量を察して計画的にご利用下さい。


/// 準備・設定 ///
1.ffmpegのインストール
  公式サイトからダウンロードしてください。
2.コントロールパネルでPC内の音を録音できるようにします。
  コントロールパネル→サウンド→録音タブ
  一覧を右クリックして「向こうなデバイスの表示」「切断されているデバイスの表示」をONにします。
  「ステレオミキサー」が表示されたらそれを既定のデバイスにしてください。
  controlpanel_sound_record00.jpg
  もし表示されないときは、サウンドボードのドライバが対応していないようです。残念です。
  マイク入力はあると思うのでスピーカーの出力を物理的にマイク入力へつないでください。
3.艦メモを起動して録画設定をします。
  ファイル→録画設定
   ・ffmpegのパスを設定してください。
   ・音源を選択して下さい。
   ・fpsを調整してください。録画開始しただけでゲームがカクカクするならここを調整です。


/// 使用方法 ///
1.ファイル→思い出を動画で残す
  ゲーム画面右にボタンが表示されます。
2.赤丸の録画ボタンを押して録画開始
  経過時間とステータスが表示されます。
3.録画ボタンを押して停止
  ステータスが、Recording->Saving->Convert->-
  と、変化します。
4.Convertが終わるのを待ちます
  ディスクへの書き込みが遅いとSavingでかなり待たされるかもしれません。
5.動画をお楽しみください


/// 動作確認環境 ///
 以下のマシンでざっくり30fpsで録画できました。
  ・CPU : Intel Core i7-4770 3.4GHz
  ・Mem : 32BG
  ・HDD : SEAGATE ST2000DM001(SATA3 2TB 7200rpm 64MB)
  ・M/B : ASRock H87 Pro4
  ・G/B : Palit NE5X65001301-1071F(GTX650 1G GD5 1D1A1mH)U
  ・OS : Windows 8.1

Qt Developer Day Tokyo 2014が開催されました

Qt Developer Day Tokyo 2014が5/20に秋葉原で開催されました。
数年ぶりのQt公式のイベントとと言うことで平日でしたが会社を休んで参加しました。

イベントの内容としては、午前中にキーノート、午後からいくつかの部屋に別れてセッションが開かれました。
細かいことは他の方にお任せするとして・・・。
Qt 5 の未来は明るいブログ
Qt DEVELOPER DAY 2014 Tokyo に行ってきました

■自分が気になった事
・Qt Quick Compiler
 QMLを予めコンパイルしてネイティブコードにできるようになるそうです。
 今まで、JITでコンパイルしている時間分だけアプリの起動時間が伸びたりとあったのですがなくなります。
 起動しきったあとの処理スピードにどれくらい差があるかは未知数ですが、JITが使えないデバイスなどでは差がでると思います。
 別の面としては今まではQMLファイルをそのまま添付するかリソースに含めて配布しますがソースコードが丸見えになってしまいます。それがバイナリになるのでセキュリティ的な面でも期待できるとのことでした。
 (リソースに含めればて多少はマシになりますが、実行ファイルを開くとベタッとテキストのソースが見れます)

・マルチスクリーン対応
 Qtのモバイル対応が進んでいろいろなサイズのモニターサイズでアプリを動かす事になるのでその辺りにも対応しますよーって事でした。(僕の聞き間違いじゃなければ)
 今回発表された内容と一致するかはわからないですが。実は、1年位前にUbuntuPhoneのSDKが公開されたときに、そちらは対応されてました。Androidで言うところの「dp」みたいなのです。
 Qt Quickアプリはレイアウトが柔軟に変化させることができるので、スクリーンサイズの違いへの対応が無いのが辛かったです。どうしても対応したいときは、自力で倍率を変化させられるように作りこむ必要がありました。
 最近は、11インチでフルHDという高dpiなノートPCが登場したりしていて、デスクトップ向けQtの世界だけでも必須機能になると思っています。
 今後どうなるかに期待したいです。

■その他、雑感など
・同時通訳
 キーノートから各セッションまで全て同時通訳がついてて良かったです。英語の不自由な自分には安心設計です。
 しかも質問も逆の同時通訳がされててすごいなーと思いました。
・おやつ部の差し入れ
 チロルチョコとおせんべい。
 まさか、名古屋から遠征していた@sazusさんがおせんべいを用意してくれていたとは。僕ほんとに遊びに行っただけ状態でした。
・受付がアナログだった
 紙に印刷したリストでチェックしてました。僕もですが参加者が「あ、これです」とか指さしてるの見るとちょっと技術系のイベントなのにと思ってしまいますね。(自分たちの勉強会のことは棚にあげますよーすっごい大きい棚にあげますよー)
 せめて、シリアル番号発行するだけでもしてれば楽そうだったのにって感じですね。
・受付のおねーさん方
 イベント請負のところからきてたのかとても対応が良かったです。みんな綺麗だったし。
・Androiderな方々に会いました
 かなり久々な人も含めて意外とお会いすることができて、ちょっとは興味持ってもらえてるのかなと思いました。
・スライドの字が小さいことがちょこちょこ
 ついついやってしまいがちですが、情報を詰め込んでたら字が小さくて読めなかったところがありました。
 特に字が小さい上にハイコントラストな背景に白文字は全く読めませんでした。
・いろいろな発表で「Qt QuickではじめるクロスプラットフォームUIプログラミング」を紹介していただきました。
 SRAさんのキーノートでも口頭でしたけどご紹介していただいたのでびっくりしました
 Qt 5.0.2の頃に書いたのでQt Quick Controlsの事とか入ってない内容もありますが、QMLの基本的なことは変わってませんので基礎を知るには十分だと思います。
 
・お昼のLT大会
 お昼ごはんを食べつつ暇つぶしがてら聞いてもらえていればと思いました。
 ひさびさに沢山の人の前でしゃべったらもード緊張で終始シドロモドロでした。それでもちょこちょことリアクションを貰えてたので良かったです(本当か・・・

他にもいろいろあった気がするけど思い出せないので、以上で。
これからもQtで楽しんで行けそうだなと思ったので良かったと思います。

あ、Ambassador制度復活しないですかね?

艦メモに遠征時間の自動取得機能追加してみました。
例によって似非画像認識で実装していて通信データを見ていません。
1ドット数字の位置ずらされただけでアウトな弱々仕様ですのでご了承ください。
その辺りに対応する逃げ機能も盛り込む予定です。(労力の方向性が・・・)

時間を取得するタイミングに違和感があるかもしれませんので挙動や注意事項について簡単に説明です。

・実際に残り時間がわかる画面(遠征の各項目の詳細)を表示すると取得します。
 艦メモを起動しただけでは時間は反映されません。
 画像認識なので必要な情報を見れる状態になる必要があります。

遠征を始めるとき
 1.遠征選択画面で「決定」を押した時にトータル時間を取得
 2.艦隊選択後に、「遠征開始」を押した時にカウントスタート

既に遠征に出ているとき
 1.遠征に出している項目を選択
 2.画面上の任意の位置をクリックしたときに、残り時間を取得してカウントスタート

時間の取得はクリックしたときにキャプチャして遠征の時間を取得しようとします。
そのため、クリックして画面が切り替わった後に表示される情報の取得はできなくは無いですが負荷も上がるので避けてます。画面の切り替わりの終了を判定しないといけないので。
というわけで、既に遠征にでている艦隊の情報の取得はちょっと違和感があるかもしれませんがご了承ください。

遠征を始めるときの残り時間の表示が実際のゲームの時間とずれるかもしれません。
可能性としては、
・サーバーとPCの時計がずれていて見かけ上の時間がずれてた
・ネットワークの調子が悪くてボタンを押すタイミングと開始タイミングが大きくずれてしまった
遠征を始めるときは、「遠征開始」ボタンを押したタイミングで(サーバーの応答に関係なく勝手に)トータル時間からカウントするのでサーバーが返してくる終了時間と一致しないかもしれません。
 通信内容を調べてないので予想ですが、サーバーは何時何分に終了しますという情報をクライアントに投げてきています。(PCの時計を大きくずらすと開始直後にマイナス表示したりします。)ですので、見かけ上の時間が一致していなくても結果的に遠征が終わるタイミングは大体同じになると思います。


最新版のダウンロードはこちらから
 艦メモ ~艦娘メモリーズ~(艦これ専用ブラウザ)

 

Qt 5.2になってからQt Quickアプリへの対応がされてました。
(Qt 5.3リリースされようとしている中で今更感ありますが。)

Qt Quickアプリへの対応として、「-qmldir」が追加されました。
使用方法は、

$ macdeployqt -qmldir=<path> hoge.app/

となります。
QMLファイルを保存しているパスのルートを指定するとサブフォルダも検索してくれます。
これで、QMLで importしているライブラリが自動的に追加されます。
今までは、自力でコピーしてライブラリへのリンクを書き換える必要がありましたがお手軽になります。
サードパーティ製のライブラリなどでQtのディレクトリにないものは今まで通り手動でコピーです。

おまけ
Qt 5.2からアプリ内のフォルダ構成でQt Quick関連のプラグインの配置位置が変更になってます。
(今までと同じ場所に保存してたら Qt Quick 2.0がないと怒られてなんじゃこりゃってなってました)
この辺りにあるライブラリは
 Qt5.2.1/5.2.1/clang_64/qml/
ここにコピーする必要があります。
 hoge.app/Contents/Resources/qml
ご注意ください。
macdeployqt使えばほとんど気にしなくていいのですけどね。


Qtで作成したアプリケーションを配布するとき、必要なライブラリ(dllとかsoとかdllibとか)を実行ファイルと一緒にする必要があります。
必要なライブラリを調べるのが意外と面倒だったりします。
Macではmacdeployqtというツール以前から使えていたのですが、他の環境ではありませんでした。

が、これから違います。
Qt 5.2からWindows用にも作成されSDKに同梱されるようになりました。
このツールのすばらしいところは、QMLファイルのimport構文を解析して必要なプラグインも同梱してくれるところです。
正直、ここが一番面倒でしたので。

この記事は、Qt 5.2.1 MSVC2012版で書きました。

/// 入手場所 ///
標準のインストールフォルダだと以下のあたりにあります。(VS2012版の例)
C:\Qt\Qt5.2.1\5.2.1\msvc2012_64\bin

/// 使用方法 ///
簡単で以下の書式でOKです。

> windployqt <実行ファイルのパス>

これで、実行ファイルと同じフォルダにライブラリをコピーしてくれます。
QMLファイルがある場合は、以下のようにします。

> windeployqt --qmldir <qmlのパス> <実行ファイルのパス>

QMLファイルのフォルダは中を再帰的に調べてくれますのでトップのフォルダを指定すればOKです。

ライブラリをコピーして配布パッケージを作るフォルダを実行ファイルが現在あるところから変更することもできます。
(実行ファイルはコピーされません)

> windployqt --dir <コピー先のパス> <実行ファイルのパス>

その他のオプションのことは「windeployqt.exe -h」です。

/// 注意 ///
・1つコピーされるライブラリが変です。
 このファイルだけはツール実行後に手動でコピーしてください。
  誤:D3Dcompiler_47.dll
  正:d3dcompiler_46.dll
・サードパーティ製のライブラリはコピーされないようです。
 手動でコピーしてください。
・QMLファイルがリソースに含まれる場合はサーチしてくれません。
 「--qmldir」オプションでプロジェクトにある生データのパスを指定してください。
・OpenSSL系のライブラリはコピーされないようです。(調べようがないですよね)
 手動でコピーしてください。

 

2014 Qt Developer Day Tokyoが開催されます。

2014 Qt Developer Day Tokyoが5/20に開催されるそうです。
開発元が公式に開催するイベントとしては2011年以来で楽しみです。
今回は、Qt Developer Days Asia 2014と題して中国と日本で開催され5/20に東京となります。
Qt Project のチーフメンテナ Lars Knoll氏も来るそうなので興味の有る方には是非参加してほしいです。

Qt公式ブログに東京で開催する理由めいたことも書いてありますが、中の人達が日本に興味を持ってもらえてるのはコミュニティなどを通じて関わっている身としては嬉しいですね。

Qtユーザー会からもアプローチしてイベントを盛り上げれないかを@task_jpさんがきっかけを作ってくれました。参加するだけじゃない関わり方もできるかもしれません。社会人の人も学生の人も中の人達と密に関われるチャンスが来そうです。
ぜひ、お休みとって参加しよう(笑)
自分は有給決定だけど、火曜日なのがちょっと残念。金曜日だったら泊まりにできたのに。。。

2014 Qt Developer Day Tokyoで、メールアドレスを登録して最新情報を入手しましょう。


前回の2011年の時は、Nokia Japanの方のサプライズで端末もらえたりとかあっていい事もあったなーと思い出に浸ってみたり。

Android関連(だけじゃないけど)では北陸の重鎮のとげとげさんが満を持してコミケに送り出す新感覚技術書のお知らせですよ!

まずは、サークル名と場所

トゲトゲ団 3日目 西す-20a
http://toge2dan.cnu.jp/2013/12/18/c85/

内容は、3D関連の技術がライトに学べるそうですよ。
3Dは難しいと思ってるあなたの固定観念(げんそう)をぶち殺しに行く感じのようです。

あ、お手伝いで売り子してるので遊びに来てくさいね!

OpenSSLをWindowsでビルド(32bit/64bit)

QtアプリでWebViewとかhttprequestとかするときにhttpsな通信しようとすると必要になるのですがSDKのパッケージにバイナリが含まれてないので自力ビルドする必要があるのでメモです。
4.7.xの時に入ってたのでずっと使ってた・・・のですが、さすがに64bit版が欲しかったのでビルド方法を調べたメモです。

準備物
Visual C++(Express 2012で説明します)
・Perl(ActivePerlあたりでもどうぞ)

作業フォルダ
・c:\openssl
・c:\oepnssl\x86
・c:\openssl\x64

ソースのダウンロード
OpenSSL公式(自分ときは1.0.1eでした)

32bit版の手順
「VS2012 x86 Native Tools コマンド プロンプト」を起動
>cd c:\openssl\openssl-1.0.1e
>perl Configure no-asm --prefix=..\x86 VC-WIN32
>ms\do_ms.bat
>nmake -f ms\ntdll.mak install

64bit版の手順
「VS2012 x64 Cross Tools コマンド プロンプト」を起動
>cd c:\openssl\openssl-1.0.1e
>perl Configure no-asm --prefix=..\x64 VC-WIN64A
>ms\do_win64a.bat
>nmake -f ms\ntdll.mak install

確認
c:\openssl\x86\binとc:\openssl\x64\binに
・libeay32.dll
・ssleay32.dll
が、できてればOK

クリーン
>nmake -f ms\ntdll.mak clean

さほど難しいことではないので必要なときに調べれば良いのだけど、プラットフォームごとにいちいち調べるのは面倒なのでまとめてみました。

Windowsでいうところのマイドキュメントや、Unix系のユーザーフォームのフォルダは環境やバージョンによって変わってしまいます。
このフォルダをハードコードするわけにも行きませんのでQtの力を使います。
というか、Qtがいい感じにしてくれます。

フォルダを取得するには「QStandardPaths」を使用します。
取得できる情報は列挙型「QStandardPaths::StandardLocation」で定義されています。Qt 5.1.xの時点で16種類あります。
例えば
StandardPaths::DesktopLocation 0
QStandardPaths::DocumentsLocation 1
QStandardPaths::FontsLocation 2
の、ような感じですがそれぞれの説明あらかじめ日本語で書くよりも具体的なパスを見たほうがピンとくると思いますのでプラットフォームごとにまとめます。

まとめの前に、使用するメソッドをいくつか消化します。
QStandardPaths::displayName
 プラットフォームごとのフォルダの名称(呼び名)が取得できます。
QStandardPaths::standardLocations
 いい感じにしてくれた結果のフォルダがQStringListで取得できます。リストの先頭から優先度の高いものが入っています。
 空の時はそのシステムには存在しない種類のフォルダになります。
QStandardPaths::writableLocation
 いい感じにしてくれた結果のフォルダが1つ取得できます。大抵は何かを書き込むために必要になったりすると思うのでこちらで十分かもしれません。

注意としては、取得したフォルダにアプリケーション名が含まれるため取得した時点でフォルダが存在しているとは限らないことです。
実際に使用する前にフォルダの存在を確認してなければ作成してください。

艦メモが保存する各種ファイルとその保存場所についてです。

/// 保存するファイルの種類 ///
設定
 KanmusuMemory.ini : 各種設定やCookie情報など
 KanmusuMemoryFav.ini : ユーザーが保存したお気に入り情報
ダウンロードデータ
 favoritedata.json : 初期配置されてるお気に入り(wikipediaなど)
 timerselectguide.json : タイマーの建造や遠征のテンプレ情報
キャッシュ
 いろいろ

/// Windowsの場合 ///
設定
 C:\Users\Iori\AppData\Roaming\KanmemoProject\
ダウンロードデータ
 C:\Users\USERNAME\AppData\Local\KanmusuMemory\
キャッシュ
 C:\Users\USERNAME\AppData\Local\KanmusuMemory\cache\ (Ver0.11まで)
 C:\Users\USERNAME\AppData\Local\KanmusuMemory\cache2\ (Ver0.12から)


/// Ubuntuの場合 ///
設定
 ~/.config/KanmemoProject/
ダウンロードデータ
 ~/.local/share/KanmusuMemory/
キャッシュ
 ~/.cache/KanmusuMemory/ (Ver0.11まで)
 ~/.cache/KanmusuMemory/ (Ver0.12から)

/// Mac OS Xの場合 ///
設定
 ~/.config/KanmemoProject/
ダウンロードデータ
 ~/Library/Application Support/KanmusuMeory/
キャッシュ
 ~/Library/Caches/KanmusuMeory/ (Ver0.11まで)
 ~/Library/Caches/KanmusuMeory/ (Ver0.12から)


/// お知らせ ///
Ver 0.12から開発環境のQtのバージョンを5.2.1に変更しました。
その都合で今までのキャッシュデータが使用できなくなったためパスを変更しました。

ある日突然DMMのログイン画面からゲーム画面へ進めなくなった」ときは、以下の方法で対処してください。
 ・全てのバージョン
  艦メモを落とした状態で、キャッシュフォルダの内容を削除する。
 ・Ver 0.12以降
  コマンドラインから以下の引数を追加して実行してください。引数はWin/Mac/Ubuntu共通です。
  (毎回使用すると毎回キャッシュを削除してしまいます。)
  >KanmusuMemory /clearcache




/// 解説 ///
保存場所についてですが、Qtでは環境ごとにお作法の違う保存先をいい感じに処理してくれます。

まず、設定の保存場所ですが、こちらはQSettingsクラスが自動的に選んでくれています。
下記のサンプルの「今」のコンストラクタの使用方法だとユーザーエリアに保存してくれます。「以前」の使用方法ではファイル名を指定方法でカレントディレクトリに保存されます。大抵は実行ファイルと同じフォルダになります。
実はこれだとMac OS X 10.9から保存できなくなってしまいました。(セキュリティ強化なのでしょうか)そのため、保存先を変更する意味もあって使用方法を変更しています。
//今
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "organization", "application");
//以前
QSettings settings("hoge.ini", QSettings::IniFormat);

ダウンロードデータとキャッシュについてはQStandardPaths::writableLocation()を使用して場所を取得します。
このメソッドを使用するとシステム内で書き込み可能なフォルダパスを取得することが可能です。
引数にデスクトップやドキュメント、一時フォルダなど取得したいパスを指定するだけです。
書き込み可能であればパスが実際に返ってきます。

艦メモでは以下のように取得してます。
//ダウンロードデータ
qDebug() << QStandardPaths::writableLocation(QStandardPaths::DataLocation);
//キャッシュ用フォルダ
qDebug() << QStandardPaths::writableLocation(QStandardPaths::CacheLocation);

基本的にはQtがなんとかしてくれるので細かいこと考えなくても良いのでいいですね。