コントリビューションしてみたよ！ 

#今年も参戦！
(何故か)日本Qtユーザー会の宴会部長(と呼ばれてしまってるヒト)デス！！
Qt界の「永遠の初心者」として今年も12日目(12/12→1212→一歩ずつ)に投稿すべく参戦しまっす！！

昨日はsoramimiさんの「Raspberry Pi のカメラモジュールで撮影」の記事。自分も昔[スマホのカメラネタ](https://helicalgear.blogspot.jp/2014/12/jolla-jollaqippis.html)を書いたけど、C++で書くとこんな感じなのかーみたいな感じ。←あいかわらずC++書ける気がしないおっさん＞おれ。

さて、とりあえず今年も基本ニッチなネタで攻めてみる(ぉぃ

#きっかけ
[去年のQt Advent Calendarの投稿](https://qiita.com/helicalgear/items/78ec6348dd1de431b52f)からしばらくしてQtCreatorが何度かアップデートされた間に、いつのまにかWindows Mobile Emulatorへのデプロイができなくなってた・・・というか、Mobile Emulatorで実行したいのにローカルでしか実行してくれない。

Bug Trackerでもそれっぽいのが見つからず途方にくれてたんだけど、どうもwinrtrunner実行時の引数が"--profile appxphone"になるべきところが"--profile appx"になってる事に気がついた。
で、いろいろ調べた結果ようやく[これ](https://codereview.qt-project.org/#/c/125841/3)と[これ](https://codereview.qt-project.org/#/c/202431/2)を見つけて、ターゲットデバイスがWINRT_DEVICE_TYPE_EMULATORの時にWinRT Pluginが適切なprofileを指定してくれないことが原因だったという事が判った。

そもそもおそらくWinRT Pluginを積極的に利用している開発者は多分希少種になりつつあって、その中でもWindows Mobile Emulatorを使おうなんていう酔狂なヒトはあまり居ないんだろうなって感じ。別に使えなくてものすごく困るって話でもなかったけど、比較的簡単に直せそうな感じだったから、自力で直してみることにした。
ついでにちょっと勇気を出してpatchを投げてみることにした。

#まずはQtアカウントが必要
とりあえず https://codereview.qt-project.org/ に行って右上の"Sing In"のところから"Create Qt Account"に進んでアカウントを登録しよう。

#Windows上での環境
既にQtがインストールされてる前提なんだけど(笑)、Windowsでの開発環境のインストールは[昔のエントリ](https://helicalgear.blogspot.jp/2016/03/windows-10-mobileqtqcuik.html)が参考になるかしら。今回これやってた時の環境は以下の通り。

- Windows 10 Pro
- Visual Studio 2015 Community
- Qt 5.9.0

少なくともQtCreatorについて(Windows環境で)この後の手順に沿って自分でビルド＆動作確認するのであれば、VS2015の32bit環境＋QtのVS2015_32bitな環境を用意しておく必要がありそう。
その上で、[git](https://git-for-windows.github.io/)と[OpenSSH](https://github.com/PowerShell/Win32-OpenSSH/releases)をインストールしてPATHを通しておこう。

#SSH周りの設定
「コマンド プロンプト」を立ち上げて以下のコマンドで鍵ファイルを作成しておく。

```console
C:\Users\hogehoge>ssh-keygen
```

標準なら"dir .ssh"すると"id_rsa"と"id_rsa.pub"というファイルができてるはず。

上で作ったQtアカウントで https://codereview.qt-project.org にSign Inして、右上のアカウント名が表示されてるところから「settings」を選択する。
![Screenshot_20171211_205455.png](https://qiita-image-store.s3.amazonaws.com/0/57538/e0f05880-d805-2eec-6b9c-14f3c4ba065d.png)
左側に表示されてるメニューの「SSH Public Keys」をクリックして「Add Key ...」をクリックして、出てきた入力枠の中にさっき作った"id_rsa.pub"の中身をコピペしよう。
![ssh_pub_key.png](https://qiita-image-store.s3.amazonaws.com/0/57538/f0bf91bc-199c-e522-613f-26e539cca980.png)
で、まぁ、やらなくてもできるんだけど便利なのでconfigファイルにちょとした設定を加えておく。(初めての場合は".ssh¥config"というファイルを作成する）

```text
Host codereview.qt-project.org
    Port: 29418
    User: hogehoge #ユーザ名を入れる
```

これで端末からsshでcodereview.qt-project.orgにアクセスして、下のように出れば準備完了。

```console
C:\Users\hogehoge>ssh codereview.qt-project.org
The authenticity of host '[codereview.qt-project.org]:29418 ([xxx.xxx.xxx.xxx]:29418)' can't be established.
RSA key fingerprint is SHA256:*******************************************.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[codereview.qt-project.org]:29418,[xxx.xxx.xxx.xxx]:29418' (RSA) to the list of known hosts.

  ****    Welcome to Gerrit Code Review    ****

  Hi R Kake, you have successfully connected over SSH.

  Unfortunately, interactive shells are disabled.
  To clone a hosted Git repository, use:

  git clone ssh://helicalgear@codereview.qt-project.org:29418/REPOSITORY_NAME.git

Connection to codereview.qt-project.org closed.
```

もし以下のようなエラーが出た場合には、

```console
Unable to negotiate with xxx.xxx.xxx.xxx port 29418: no matching cipher found. Their offer: aes128-cbc,aes192-cbc,aes256-cbc,blowfish-cbc
```

configファイルに"Ciphers: aes128-cbc"などを追加すればイケると思う。

```text
Host codereview.qt-project.org
    Port: 29418
    User: hogehoge
    Ciphers: aes128-cbc
```

#ソースの入手と変更
ソースは今回以下のような感じでソースを引っ張ってくる。

```console
C:\Users\hogehoge>git clone ssh://codereview.qt-project.org/qt-creator/qt-creator.git
```

変更のターゲットはここ。

```c++:変更前
    if (m_device->type() == Constants::WINRT_DEVICE_TYPE_LOCAL)
        QtcProcess::addArgs(&runnerArgs, QStringLiteral("--profile appxphone"));
    else if (m_device->type() == Constants::WINRT_DEVICE_TYPE_PHONE)
        QtcProcess::addArgs(&runnerArgs, QStringLiteral("--profile appxphone"));
```

とりあえずターゲットデバイスがEMULATORの時に"--profile appxphone"を指定して欲しいので最初は下のように書いてみた。

```c++:変更後(レビュー前)
    if (m_device->type() == Constants::WINRT_DEVICE_TYPE_LOCAL)
        QtcProcess::addArgs(&runnerArgs, QStringLiteral("--profile appxphone"));
    else if (m_device->type() == Constants::WINRT_DEVICE_TYPE_PHONE)
        QtcProcess::addArgs(&runnerArgs, QStringLiteral("--profile appxphone"));
    else if (m_device->type() == Constants::WINRT_DEVICE_TYPE_EMULATOR)
        QtcProcess::addArgs(&runnerArgs, QStringLiteral("--profile appxphone"));
```

#動作確認のため、QtCreatorをWindowsでビルドしてみる。
どういうやり方がいいのかは正直よくわかんないんだけど、とりあえず自分がやった手順。
ちょっとだけハマったのが、現時点でWindows版のQtCreatorは32bit版じゃないとダメっぽい。なので「VS 2015用 x86 Native Tools コマンド プロンプト」を起動して以下の通りやってみた。

```console
C:\Program Files (x86)¥Microsoft Visual Studio 14.0¥VC>cd C:¥Users¥hogehoge
C:\Users\hogehoge>set PATH=%PATH%;C:¥Qt¥5.9.0¥msvc2015¥bin;C:¥Qt¥Tools¥QtCreator¥bin
C:\Users\hogehoge>mkdir build
C:\Users\hogehoge>cd build
C:\Users\hogehoge>qmake -r ..¥qt-creator
C:\Users\hogehoge>jom
C:\Users\hogehoge>set INSTALL_ROOT=C:¥QtCreator
C:\Users\hogehoge>jom install
C:\Users\hogehoge>winqtdeploy C:¥QtCreator¥bin
```

で、C:¥QtCreator¥bin¥qtcreator.exeを実行してうまく動くことを確認した。

#ここからが本番。アップストリームに投げてみる。
まぁ、本番と言ってもとりあえずpushするところから始まる。と言っても上の流れでやってれば別に特別な作業な必要な訳でなく、変更をcommitした上でpushするだけでいい。

```shell-session
C:\Users\hogehoge>cd qt-creator
C:\Users\hogehoge\qt-creator>git add .
C:\Users\hogehoge\qt-creator>git commit
C:\Users\hogehoge\qt-creator>git push
```

push後、 https://codereview.qt-project.org/ に行ってSing Inするとpushした変更が表示されるので開いてみる。とりあえず第一段階は"Qt Sanity Bot"さんがチェックしてくれるので、何か~~文句言われたら~~指摘されたらそれにしたがって修正する。

Sanity Checkを越えたら次はレビューしてもらわないといけないので、レビューしてくれるヒトを指定する必要がある。
とりあえず今回はwinrtrunnerhelper.cppを変更したので、以下のようなコマンドで変更履歴を見てこのまずはファイルをそれなりの頻度でイジってるヒトを指定すればいいっぽい。

```shell-session
C:\Users\hogehoge>git log src/plugins/winrt/winrtrunnerhelper.cpp
```

あるいは過去同じようにwinrtrunnerhelper.cppを変更したのを https://codereview.qt-project.org/ で探して、とりあえず同じレビュアーをセットすればいいのかも。
レビュアーが足りなくても指定したレビュアーが他に必要なヒトを設定してくれるので、あんまり心配しなくても良さそう。

で、まぁ、ここまで来たらあとはレビューされて特段指摘がなければOKだし、指摘があったらそれにそって変更して再pushということになる。

```c++:変更後(レビュー後)
    if (m_device->type() == Constants::WINRT_DEVICE_TYPE_LOCAL)
        QtcProcess::addArgs(&runnerArgs, QStringLiteral("--profile appxphone"));
    else if (m_device->type() == Constants::WINRT_DEVICE_TYPE_PHONE ||
               m_device->type() == Constants::WINRT_DEVICE_TYPE_EMULATOR)
        QtcProcess::addArgs(&runnerArgs, QStringLiteral("--profile appxphone"));
```

指摘に基づいて変更したら新しくcommitするんじゃなくて「--amend」でコミットしなおす感じにすればいい。

```shell-session
# git add .
# git commit --amend
# git push
```

最終的に承認（Codereviw: +2）されたら、「submit」ボタンを押せばコードが採用される。
めでたしめでたし。

#〆
ニッチで且つ最終的にたった1行の修正だったけど、改善は改善なので暖かく(?)迎え入れてもらえて、そしてChange.logに名前を載っけてもらえたのでなんとなく何か貢献した気分になった(笑)
これ書いてる今時点では明日の記事がまだ決まってない・・・
今年は仕事忙しかったりとかで他のネタ作る余裕が全然ないから誰かホントによろしくね！！！(笑)