OmniAICreator/Qiita-1.07M huggingface dataset:
【UE4】TopDownテンプレートをAR化してみる ～本編～

# 補足
本記事は過去(2016-07-13)にブロマガで書いた記事の移植です。

<h1>はじめに</h1>
<hr><span style="color:rgb(0,0,255);"><a href="http://ch.nicovideo.jp/ka_z_sdvx/blomaga/ar1066087"><span style="color:rgb(0,0,255);">前回</span></a></span>の続きです。<br>
今回は本格的にやります。<h1>本題</h1>
<hr>ARToolKitBaseを置きます。<br>
<br>
<img data-ubi="158070" src="http://bmimg.nicovideo.jp/image/ch2559076/158070/78873cb2c6fb1fa353f6557a8b7acadeda7df550.jpg" width="680" alt=""><br>
<br>
ノードを組みます。<br>
ここで注目して欲しいのが、Get Markerノードです。<br>
返り値を見ると、「マーカーの座標と回転」と「カメラの座標と回転」があります。<br>
マーカー形式・・・Demoがこれ、オブジェクトを表示するだけとかなら断然こっち<br>
カメラ形式・・・今回はこっち、作るものが大きかったり複数オブジェクトあるならこっちかな。<br>
<br>
<img data-ubi="158068" src="http://bmimg.nicovideo.jp/image/ch2559076/158068/71d3ac439ee6a921639a6fbf7babafb8597c5a59.jpg" width="680" alt=""><br>
<br>
実行してみると・・・。<br>
なんだかよくわからん感じに・・・。<br>
一応床と柱らしきものが見えてますね。<br>
<br>
<img data-ubi="158067" src="http://bmimg.nicovideo.jp/image/ch2559076/158067/e57047920c92ada1d2fe866962bb3312d3300abe.jpg" width="680" alt=""><br>
<br>
シミュレーションで実行してみるとわかるのですが、カメラが物理的な距離で離れた板(実際はCube)を見てる、といった感じになってます。<br>
加えて原点からのカメラの距離は、現実世界のスケールなので、全然見下ろす感じになりません。<br>
<br>
<img data-ubi="158069" src="http://bmimg.nicovideo.jp/image/ch2559076/158069/05acc5bcc18db802921a5d51d04e34c29f345e52.jpg" width="680" alt=""><br>
<br>
ということで、カメラの距離にバイアスをかけてやりましょう。<br>
<br>
<img data-ubi="158071" src="http://bmimg.nicovideo.jp/image/ch2559076/158071/ee584af70b1a86093303bd5f93850cccd32365d8.jpg" width="680" alt=""><br>
<br>
それっぽくなった！<br>
が・・・なにやらおかしなことに・・・。<br>
先ほど説明したように、カメラが板にくっついてくるって感じなので、こんなことになってます。<br>
<br>
<img data-ubi="158072" src="http://bmimg.nicovideo.jp/image/ch2559076/158072/167763c7abb5d29306b390b0b7b6d97167c4b47c.jpg" width="680" alt=""><br>
<br>
ってことで、その板との距離を、画面の比率を保ちながら離してやりましょう。<br>
<br>
<img data-ubi="158073" src="http://bmimg.nicovideo.jp/image/ch2559076/158073/20e49951dc35e7d57dbd42bd4ab9e65fbd58a5c8.jpg" width="680" alt=""><br>
<br>
実行！<br>
今度こそやったぜ。<br>
でもなんかAR感ないですね・・・。<br>
<br>
<img data-ubi="158074" src="http://bmimg.nicovideo.jp/image/ch2559076/158074/27faa6926ddbce9d5d5e45a9c6b080b245e861fc.jpg" width="680" alt=""><br>
<br>
とりあえず床を見えないものにしてやりましょう。<br>
<br>
<img data-ubi="158076" src="http://bmimg.nicovideo.jp/image/ch2559076/158076/54ce85dabf61ec000fd4f4ffa98a5b59b2d12221.jpg" width="680" alt=""><br>
<br>
お！それっぽくなった！<br>
<br>
<img data-ubi="158075" src="http://bmimg.nicovideo.jp/image/ch2559076/158075/9755c4dc9ea0932675a7023a869b22c3b6cf02ca.jpg" width="680" alt=""><br>
<br>
床すれすれからみると若干浮いてますが・・・。<br>
ここらへんは微調整ですね。<br>
<br>
<img data-ubi="158077" src="http://bmimg.nicovideo.jp/image/ch2559076/158077/83835fb84d43d78f0baf2c771270bc92e033d573.jpg" width="680" alt=""><br>
<br>
<h1>おわりに</h1>
<hr>ってことで長かったですがARやりました。<br>
ちなみにライセンスの関係上、配布等はできないのであしからず・・・。<br>
<br>
おまけですが、BlueprintのカメラIDを変えれば、HTC Viveのフロントカメラも使えます。<br>
なんですが、いろいろ工夫が必要みたいなので、今度はそれに挑戦しようかと。
Javaのお勉強＃0

今日から”スッキリわかるJava入門第2版”を読みながら勉強していきます。
今日は遅い時間からの勉強だったので33pまで・・・
IDEとかいろいろ環境設定に時間かけすぎだと思う。良くない・・・＼(^o^)／
【UE4】TopDownテンプレートをAR化してみる ～導入編～

# 補足
本記事は過去(2016-07-12)にブロマガで書いた記事の移植です。

<h1>はじめに</h1>
<hr><a href="http://ch.nicovideo.jp/ka_z_sdvx/blomaga/ar1065569">前回</a>はDemoの導入だけでした。<br>
今回は実際にゲームっぽくしてみようと思います。<br>
<br>
長いので、ARPluginを他プロジェクトで使えるようにするまでで記事を分けます。<h1>導入(<span>他プロジェクトで使えるようにする</span>)</h1>
<hr>とりあえずプロジェクト作ります。<br>
<span style="color:rgb(255,0,0);">Verは4.12</span>です。<br>
<br>
<img data-ubi="157949" src="http://bmimg.nicovideo.jp/image/ch2559076/157949/374229884a88b54c9fbf8c07f33c0161b6e0c35b.jpg" height="400" alt=""><br>
<br>
プロジェクトを作り終わったら、<span style="color:rgb(255,0,0);">さっそくプロジェクトを閉じます(</span><br>
そして、前回にも紹介したARSampleのプロジェクトを立ち上げます。<br>
そして、<span style="color:rgb(255,0,0);">Levelごとさっきの移植します。</span><br>
(Levelを右クリックです、詳しくはggってくだしあ)<br>
<br>
<img data-ubi="157950" src="http://bmimg.nicovideo.jp/image/ch2559076/157950/e537fe28770dfef2d129a0cece2f0de103622b7c.jpg" width="680" alt=""><br>
<br>
続いて、サンプルのバイナリとプラグインをさっきの移植します。<br>
<br>
<img data-ubi="157951" src="http://bmimg.nicovideo.jp/image/ch2559076/157951/669a78371d1bbcf7dbbee6e4b3d3379c35c064b9.jpg" width="680" alt=""><br>
<br>
<span>そして<span style="color:rgb(255,0,0);">コンテンツディレクトリの中にあるARToolKitも</span>移植します。</span><br>
<br>
<img data-ubi="157952" src="http://bmimg.nicovideo.jp/image/ch2559076/157952/4f669c019a1117ddf5689d8d43092786c238cdb7.jpg" width="680" alt=""><br>
<br>
さっき作ったプロジェクトに戻ってみましょう。<br>
動作確認のために移植したLevelを開いて実行してみましょう。<br>
ARマーカーを認識したら移植成功です。<br>
<br>
<img data-ubi="157953" src="http://bmimg.nicovideo.jp/image/ch2559076/157953/ccd021736aae98949122d69b41b1bfce931071a2.jpg" width="680" alt=""><br>
<h1>おわりに</h1>
<hr>とりあえず他プロジェクトに移植はできました。<br>
(ここまで到達するのも割と苦労した)<br>
<br>
次回はいよいよゲームっぽくします。
【UE4】UNREAL4ARを使ってAR

# 補足
本記事は過去(2016-07-11)にブロマガで書いた記事の移植です。

<h1>はじめに</h1>
<hr>今回は<a href="http://www.unreal4ar.com/">UNREAL4AR</a>というプラグインを使ってARを実現してみます。<h1>インストール</h1>
<hr><a href="http://www.unreal4ar.com/">サイト</a>にアクセスします。<br>
<br>
<img data-ubi="157883" src="http://bmimg.nicovideo.jp/image/ch2559076/157883/22b85983a41889fef4871bbb845943db249f0f75.png" width="680" alt=""><br>
<br>
ライセンスではDemoを選びます。<br>
(それ以外は有料)<br>
<br>
<img data-ubi="157885" src="http://bmimg.nicovideo.jp/image/ch2559076/157885/0e48b42bc1c765e510eb30b17765b516b9be8cd4.png" width="680" alt=""><br>
<br>
必要な項目を埋めます。<br>
チェックボックスは任意です。<br>
<br>
<img data-ubi="157884" src="http://bmimg.nicovideo.jp/image/ch2559076/157884/ccc9953dbc8a28f326de49352bba4ba60af72173.png" width="680" alt=""><br>
<br>
<img data-ubi="157886" src="http://bmimg.nicovideo.jp/image/ch2559076/157886/d00011f1465bbf22d5caaaee64027f801ad3dd9e.png" width="680" alt=""><br>
<br>
DLが終わって中身を見るとこんな感じです。<br>
<br>
<img data-ubi="157887" src="http://bmimg.nicovideo.jp/image/ch2559076/157887/afb564f67bc1de4d007e9b3cb9199271746dbd36.png" alt=""><br>
<h1>動作確認</h1>
<hr>開くとこんな感じです。<br>
<br>
<img data-ubi="157888" src="http://bmimg.nicovideo.jp/image/ch2559076/157888/c3fba24cd45b8fd0a41f346c97d5e84337d933bd.png" width="680" alt=""><br>
<br>
事前にARマーカーを印刷しておきましょう。<br>
Webカメラの用意も忘れずに。<br>
実行してARマーカーを写すと・・・<br>
<br>
<img data-ubi="157889" src="http://bmimg.nicovideo.jp/image/ch2559076/157889/55d295800fe8b3f17947921e431eaba25e26acb2.jpg" width="680" alt=""><br>
<br>
やったぜ。<h1>おわりに</h1>
<hr>とりあえずサンプルが動きました。<br>
次回はARを使ってゲームを作ってみようと思います。
【UE4】マルチプレイヤーFPSみたいに自分と他人で違う見え方するキャラクターの作り方

# 補足
本記事は過去(2015-11-16)にブロマガで書いた記事の移植です。

<h1>はじめに</h1>
いいタイトルが思いつきませんでした(<br>
今回はggっても出てこなかったけどちょっと探したら発見出来た機能を紹介します。<h1>今回作るもの</h1>
<br>
<img data-ubi="133675" src="http://bmimg.nicovideo.jp/image/ch2559076/133675/09f40a64e13a4459222f53401469acdd228b90c2.png" height="400" alt=""><br>
<br>
このように<span style="color:rgb(255,0,0);">自分では腕が見えるが他人からは人が見える</span>みたいな、<br>
FPSでよくある処理を目指します。<h1>解説</h1>
キャラクターコンポーネントに<span style="color:rgb(255,0,0);">自分視点用の腕と他人視点用のマネキン</span>を用意します。<br>
<br>
<img data-ubi="133673" src="http://bmimg.nicovideo.jp/image/ch2559076/133673/0c4ab9355b0e338fe2ab9cd1be6b0305397e73cf.png" height="400" alt=""><br>
<br>
次に各Meshのコンポーネント(今回の場合は腕(Mesh2P)とOtherSeeMesh)を選択し、<br>
<span style="color:rgb(255,0,0);">Rendering</span>の項目の詳細を開き、<br>
<span style="color:rgb(255,0,0);">"Owner No See"</span>と<span style="color:rgb(255,0,0);">"Only Owner See"</span>を調整します。<br>
<br>
<img data-ubi="133674" src="http://bmimg.nicovideo.jp/image/ch2559076/133674/149315fa04cff4f7e198c6195cd1e2e031a7c6b0.png" width="680" alt=""><br>
<br>
<span style="color:rgb(51,102,255);">Owner No See → 他人からしか見えない<br>
Only Owner See → 自分からしか見えない</span><br>
といった項目になってます。<br>
<br>
今回の場合は<span style="color:rgb(255,0,0);">腕を"</span><span><span style="color:rgb(255,0,0);">Only Owner See"にチェックを入れ</span>、<br>
</span><span style="color:rgb(255,0,0);">マネキンに"Owner No See"のチェックを入れ</span>ました。<br>
<br>
<img data-ubi="133675" src="http://bmimg.nicovideo.jp/image/ch2559076/133675/09f40a64e13a4459222f53401469acdd228b90c2.png" height="400" alt=""><br>
<br>
やったぜ。
【UE4】オープンワールドを作るにあたっての自分的注意点と詰みポイント その1

# 補足
本記事は過去(2015-10-10)にブロマガで書いた記事の移植です。

<h1>1.はじめに</h1>
ぷちコンのノミネート作品が発表されましたね！<br>
残念ながら自分の作品はノミネートされませんでした・・・<br>
ですが、オープンワールド作品は恐らく少ないだろうと思い(まだ全部見てない)<br>
記事を残します。<br>
<br>
元々ggってもなかなか情報が出てこないことが多かったのでこれを機に。<br>
<br>
<span style="color:rgb(0,0,255);">動画URL:</span><span><span style="color:rgb(0,0,255);">https://youtu.be/cNt65BDWakk</span><br>
<br>
<img data-ubi="129547" src="http://bmimg.nicovideo.jp/image/ch2559076/129547/597a1cc21a7cb4827c568f5a8193f7b26e86f1a3.jpg" width="680" alt=""><br>
</span><br>
<h1>2.本題</h1>
今回は主に<span style="color:rgb(255,0,0);">準備編</span>です。<br>
<h2>2-1.そもそも必要なPCスペック</h2>
<br>
オープンワールド制作において<span style="color:rgb(255,0,0);">一番重要なパーツは恐らくメモリ</span>です。<br>
メモリが足りないと恐らく作業が劇的に遅くなります。<br>
<br>
----私のPCスペック----<br>
CPU:i7-4770<br>
RAM:16GB<br>
GPU:GTX760<br>
<br>
今回用意したマップは8km四方だったのですが、<br>
完成時点でのエディタでの<span style="color:rgb(255,0,0);">ピークメモリは大体6～11GB</span>くらいでした。<br>
<br>
このことから<span style="color:rgb(255,0,0);">メモリは最低8GB、推奨16GB以上</span>と言ったところでしょうか。<br>
<br>
おまけ:今回の実行ファイルでの消費メモリは1GB前後でした。<br>
<br>
<img data-ubi="129549" src="http://bmimg.nicovideo.jp/image/ch2559076/129549/68b6728ebd7b08e002940e6a9f2905a8ea6082eb.jpg" width="680" alt=""><br>
<h2>2-2.全てにおいて時間がかかる</h2>
マップが広いので作業時間はともかく、<br>
<span style="color:rgb(255,0,0);">セーブ/ロードやカメラ移動やビルド、あらゆる行動に時間がかかるようになります。</span><br>
特に毎回セーブに20秒弱かかるのはなかなか辛かったです・・・。<br>
<br>
対策としては、<span style="color:rgb(255,0,0);">早めにマップ分割</span>をして、必要な部分のみロードするというようにすることです。<br>
<span style="color:rgb(0,0,255);">参考_公式ドキュメント:https://docs.unrealengine.com/latest/JPN/Engine/LevelStreaming/WorldBrowser/index.html</span><br>
ですが公式ドキュメントだけではわかりづらい部分が多々ありました。<br>
機会があればマップ分割の詳しいやり方と詰みポイントについて書きたいです。<br>
<br>
<img data-ubi="129552" src="http://bmimg.nicovideo.jp/image/ch2559076/129552/986aca10dbe90782570a4defed19c578e6b2c48f.png" height="400" alt=""><br>
<h2>2-3.OpenWorldDemoCollectionを使う</h2>
個人制作の場合、<span style="color:rgb(255,0,0);">公式から無料で配布されている</span><span><span style="color:rgb(255,0,0);">OpenWorldDemoCollection</span>を使うのがオススメです。強くオススメです。<br>
</span>なぜなら<span style="color:rgb(255,0,0);">LOD込み(ここ重要)</span>のハイクオリティなモデルが沢山入っているからです。<br>
<br>
木など一部の頂点数のヤバいモデルは設定で<span style="color:rgb(255,0,0);">最低LODを上げておく</span>と使いやすいでしょう。<br>
<br>
<img data-ubi="129553" src="http://bmimg.nicovideo.jp/image/ch2559076/129553/2b8bf55511b8bd8caa7008df60cb676bfd75f85f.jpg" width="680" alt=""><br>
<h1>3.終わりに</h1>
当時の事を思い出しながら、書いております。<br>
その1とか書きましたが、気まぐれなので続けるかどうかはビミョーですww<br>
<br>
【UE4】ソースコントロールにGitを使ってみた

# 補足
本記事は過去(2015-07-05)にブロマガで書いた記事の移植です。

<h1>はじめに</h1>
<br>
こんにちは、最近インターンシップで使うのがUE4ではなくUnityばかりな事に悲しみを覚えているかーずです。<br>
（当たり前といえば当たり前か）<br>
<br>
今回はUE4にGitを導入してみたいと思います。<br>
使うVerは<span style="color:rgb(255,0,0);">UE4.7.6</span>です。<br>
この時点でGitはβ版となっており、正式なものではないので、不完全な部分があります。<br>
（あるみたいです）<br>
なお僕が使ってるのは<span style="color:rgb(255,0,0);">msysgit</span>です。<br>
<br>
基本的なgitの使い方は省略いたします。<br>
<h1>導入する</h1>
<br>
とりあえずプロジェクト作ります。<br>
<br>
<img data-ubi="118992" src="http://bmimg.nicovideo.jp/image/ch2559076/118992/99d612b345473bbc24dbad979bdeca4e5c9f7b2a.png" height="400" alt=""><br>
<br>
プロジェクトのフォルダで"git init"します。<br>
<br>
<img data-ubi="118993" src="http://bmimg.nicovideo.jp/image/ch2559076/118993/45bbc49040ef363328c70f9d13ab82ccb7445556.png" alt=""><br>
<br>
ソースコントロールを選び、プロパイダをGitにします。<br>
Pathは僕の場合は初期のままで大丈夫でした。<br>
これで設定を承認します。<br>
導入完了です。<br>
<br>
<img data-ubi="118994" src="http://bmimg.nicovideo.jp/image/ch2559076/118994/84d8b035dc5d61cadee7102d4c0a90db8a06d946.png" width="680" alt=""><br>
<br>
<h1>コミットする</h1>
<br>
ソースコントロールからサブミットを選ぶと、自動的に変更・追加があったファイルを選択してくれます。<br>
<br>
<img data-ubi="118995" src="http://bmimg.nicovideo.jp/image/ch2559076/118995/2edfb7c24cf9f4a195236c6f49bc10c2f91e5b01.png" height="400" alt=""><br>
<br>
あとはコメントを書いてOKをクリック。<br>
<br>
gitkをみてみると、ちゃんとコミットされてますね。<br>
<br>
<img data-ubi="118996" src="http://bmimg.nicovideo.jp/image/ch2559076/118996/eafea064756f2a534bf4ed08606b1d0e872faa22.png" alt=""><br>
<br>
<span style="color:rgb(255,0,0);">※注意</span>：.uprojectファイルはコミットされないので、必要に応じて自分で"git add"する必要があります。<br>
<br>
あとは通常通りのGitの使い方と一緒です。<br>
<br>
コミットだけはエディタの方でやったほうがいいでしょう。多分。<br>
<h1>終わりに</h1>
<br>
僕も最近UE4にGit導入を試したばかりなので、競合が起きた時どうなるかはまだ試してません。<br>
（一番重要なところじゃねーか！！！！）<br>
まだβ版なのであしからず。<br>
【UE4】画面が勝手に明るくなったり暗くなったりする"自動露光"について

# 補足
本記事は過去(2015-04-01)にブロマガで書いた記事の移植です。

<h1>はじめに</h1>
約2週間ぶりの投稿かなー。<br>
<br>
今回は僕がUE4を初めてすぐ辺りの頃に悩まされた現象について書きます。<br>
タイトル通り<span style="color:rgb(255,0,0);"><span>画面が勝手に明るくなったり暗くなったりする現象</span></span>についてです。<br>
<br>
解決方法を昨日知りました・・・ﾅﾝﾃｺｯﾀｲ。<br>
いやぁ今まで解決しようとggろうとしてもなんて検索かければいいかわからなくて、<br>
いろいろあたってみたけどダメだったんですよ・・・。<br>
そして昨日たまたま公式ドキュメントを眺めてたら犯人を見つけてました。<br>
<h1>どういうことが起こるのか<br>
</h1>
<span style="color:rgb(255,0,0);"><span><br>
<img data-ubi="105654" src="http://bmimg.nicovideo.jp/image/ch2559076/105654/a2e07de16b5eb1811ef076337fd0554ebc20cf27.jpg" height="400" alt=""><br>
</span></span><br>
↑こうなります<br>
これはプロジェクトを作るときに<span style="color:rgb(255,0,0);"><span>最高設定</span></span>にすると起こる現象です。<br>
<br>
これの原因はポストプロセスエフェクトの1つの<span style="color:rgb(255,0,0);"><span>「自動露光」</span></span>という昨日が原因です。<br>
初期設定だとONになっています。<br>
<br>
ではOFFにしてみましょう。<br>
<br>
<img data-ubi="105656" src="http://bmimg.nicovideo.jp/image/ch2559076/105656/9e77bf43da4e1da7b2641cc18da0735ed257b5c7.png" width="680" alt=""><br>
<br>
↑<span style="color:rgb(255,0,0);"><span>プロジェクト設定 ＞ レンダリング </span></span>の項目にあります。<br>
これのチェックを外しましょう。<br>
これで自動露光を切ることが出来ました。<br>
<h1>自動露光について<br>
</h1>
そもそもこの機能はなんなのかといいますと、<br>
<span style="color:rgb(255,0,0);"><span>人間の目と同じのように</span><span>明るいところ、</span><span>暗いところを移るときの</span><span>人間の視覚が体験する効果を再現するための機能</span></span>です。<br>
現実で暗い部屋から明るい外に出た時、「眩しい！」となってから段々目が慣れて見えるようになるように、<br>
明るい外から暗い部屋に入ると「真っ暗で何も見えないぞ！」<span>となってから段々目が慣れて見えるように</span><span>なるような</span>効果を出すものとなっているようです。<br>
詳しくは公式ドキュメントを御覧くださいな。<br>
https://docs.unrealengine.com/latest/JPN/Engine/Rendering/PostProcessEffects/AutomaticExposure/index.html<br>
<h1>おわりに</h1>
ちなみにレンダリングの項目では他にもブルームなどが初期設定でONになっています。<br>
必要に応じてOFFにしてあげてパフォーマンスを上げるのもアリです。<br>
【UE4】MacBook AirでUE4を動かしてみた

# 補足
本記事は過去(2015-03-14)にブロマガで書いた記事の移植です。

<h1>はじめに</h1>
先日MacBook Airを購入しました。<br>
その直後Appleの発表で新しいMacBookが発表されました。<br>
買った直後に新作発表とか稀によくあるよね(涙目<br>
<br>
ということでMacBook AirでUE4を動かしてみました。<br>
ちなみに今回買ったMacBook Airは11インチのSSD256GBのやつです。<br>
<h1>最高品質でやってみる</h1>
最高品質設定でプロジェクトを動かしてみます。<br>
<br>
<img data-ubi="103698" src="http://bmimg.nicovideo.jp/image/ch2559076/103698/ab5522e2dcf4d4a030936fbd685eae7a97d7f8f4.png" width="680" alt=""><br>
<br>
FirstPersonのテンプレートでやってみます。<br>
<br>
エディターが立ち上がった瞬間MacBook Airがうねりを上げ始めました(<br>
そしてそのまま、つまり<span style="color:rgb(255,0,0);"><span>最高設定のまま</span></span>プレイしてみます。<br>
<br>
<img data-ubi="103699" src="http://bmimg.nicovideo.jp/image/ch2559076/103699/f5ec174c8303561819a0aa0a0386bcbb7f25ce36.png" width="680" alt=""><br>
<br>
<span style="color:rgb(255,0,0);"><span>約</span><span>38FPS</span></span>ですね、最高設定でも実はボチボチ動きますね。<br>
<br>
では次にレンダリングの質を<span style="color:rgb(255,0,0);"><span>「低</span><span>」</span></span>にしてやってみます。<br>
<br>
<img data-ubi="103700" src="http://bmimg.nicovideo.jp/image/ch2559076/103700/26a8b0863cb8db14c97272877344776cfeddac66.png" width="680" alt=""><br>
<br>
<img data-ubi="103701" src="http://bmimg.nicovideo.jp/image/ch2559076/103701/6e96e150e610f04c19e81738acf07de2331c2e82.png" width="680" alt=""><br>
<br>
<span style="color:rgb(255,0,0);"><span>約</span><span>68FPS</span></span>と、申し分ないフレームレートが出ました。<br>
しかし画質が「低」なので、スクショではわかりにくいですが、ひどいことになってます・・・<br>
<h1>描画をモバイル/HTML5向けにする</h1>
UE4には描画をDirectX,OpenGLを使ったものやOpenGL ESを使ったものに変更できます。<br>
<br>
そこで、初期設定ではOpenGLを使った描画になってますので、ここを<span style="color:rgb(255,0,0);"><span>OpenGL ESに変更</span></span>します。<br>
<span>シェーダーのコンパイルが入るので場合によっては</span><span>しばらく待つことになります。</span><br>
<br>
<img data-ubi="103702" src="http://bmimg.nicovideo.jp/image/ch2559076/103702/f63d7a0e77f0f0f2fceafde7fc0ea962fc850ff6.png" width="680" alt=""><br>
<br>
これで実行してみると・・・<br>
<br>
<img data-ubi="103703" src="http://bmimg.nicovideo.jp/image/ch2559076/103703/f7068905765f723551315bfc7935e17e8ac377f5.png" width="680" alt=""><br>
<br>
<span><span style="color:rgb(255,0,0);"><span>最高画質のまま約75FPS</span></span></span>を出すことができました<br>
<h1>おわりに</h1>
これでMacBook AirでもUE4を動かすことができました。<br>
しかし相変わらずファンがうねりをあげるので、ちょっとPC的には優しくないですね・・・<br>
もしかしたらWindowsのノートPCでも設定をいじれば普通に動くかもしれませんね。<br>
Tkinterでwindowが表示されない

windowsでpythonだけでプログラミングを書きたい人向けに
Tkinterはいいライブラリだと思いますが
表示させるところで躓く方は以下を参照。

ポイントは最後のroot.mainloop()をつける事。
これで一発解決します。
これが出来ればあとは、ボタン追加や
csvインポート、文字表示など多岐にわたり組み込み可能です。

```py
# coding: utf-8
from tkinter import *
import tkinter as tk

root = Tk()

root.mainloop()
windowsバッチ処理でPythonスクリプトを実行

pythonファイルbatファイルで、実行させたい時に必要な処理。

後は自動起動させるなりタスクスケジューラに入れるなりすると、
該当スクリプトが実行されます。

環境:
PC:windows 10 PRO
python:python3.4
ファイル名:test.bat
実行ファイル：test.py

【要点】
1.windows のpython.exeをインストールすれば、c:\python34 or c:\python27に実行 
  ファイルが作成される。
2. python 2.7でも34の箇所を27にすれば問題無し。

【中身(test.bat)】

↓ここから
cd /d %~dp0
C:\Python34\python.exe C:/Users/UserName/test.py %*
cd
pause
↑ここまで
【python】100本ノックにチャンレンジ！(これまでの投稿一覧)

#これまでの投稿一覧
作成スクリプトの数が多くなってきたので、これまでの投稿を一覧で整理。今後は100本ノックに関する投稿を行ったら本リストも更新していく予定。

#第1章: 準備運動
| リンク| トピック| 利用モジュール |
|:-----------:|:------------:|:------------:|
| [001〜005](https://qiita.com/masassy/items/6e25c0adc4ef7c8bf4fc)| 文字列, ユニコード, リスト型, 辞書型, 集合型, イテレータ, スライス, 乱数|特になし|
| [006〜009](https://qiita.com/masassy/items/4bd0b901e2fa5b43dd48)| 同じ| Template,re,random|


#第2章: UNIXコマンドの基礎
| リンク| トピック| 利用モジュール |
|:-----------:|:------------:|:------------:|
|[010〜014](https://qiita.com/masassy/items/7d68388299160ba62cc2)| head, tail, cut, paste, split, sort, uniq, sed, tr, expand|subprocess,codecs|
| [015〜019](https://qiita.com/masassy/items/154a79f9b7100f996f6a)   | 同じ | 上段＋math,collections,operator |



#第3章: 正規表現
| リンク| トピック| 利用モジュール |
|:-----------:|:------------:|:------------:|
|[020〜024](https://qiita.com/masassy/items/fd77592c7fd6607c26df)| 正規表現, JSON, Wikipedia|json,gzip,re|
| [025〜029](https://qiita.com/masassy/items/b969bc065888ee6f469f)  | 同じ | 上段＋requests,urllib.parse|


#第4章: 形態素解析
| リンク| トピック| 利用モジュール |
|:-----------:|:------------:|:------------:|
|[030〜034](https://qiita.com/masassy/items/40dd49cd5a7c1a66c3a0)| 形態素解析, MeCab, 品詞, 出現頻度|MeCab,codecs,ast,re|
|[035〜039](https://qiita.com/masassy/items/125d3a6a1d5b3b53b886) | 上段＋Zipfの法則, matplotlib| 上段＋collections,operator,matplotlib,numpy|

#第5章: 係り受け解析
取組中！

#番外編
| リンク| トピック| 利用モジュール |
|:-----------:|:------------:|:------------:|
|[twitterからテキストマイニング](https://qiita.com/masassy/items/91db087c734a905f83c3)|twitter_api,形態素解析,MeCab,出現頻度,正規表現|tweepy,re,codecs,ast,collections,operator,MeCab|
|[apacheのログ分析](https://qiita.com/masassy/items/cc9abab529de497f3ada)|apache,出現頻度,正規表現|re,codecs|
カプレカ数をPythonで求めた



話題だったので求めました。カプレカ数の定義はこんな感じです。

> 桁を並べ替えて最大にしたものから最小にしたものの差を取ったとき、元の値に等しくなるもの。
> from [カプレカ数 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%97%E3%83%AC%E3%82%AB%E6%95%B0)

# コード

python 3.5で動作確認。[kaprekar.ipynb](https://gist.github.com/Ryuichirou/dba85cfa5cbecface48bdd092a989017)でJupyter Notebookで公開しました。


```python
from functools import reduce

def kaprekar_function(n, digits):
    l =  [int(x) for x in list(str(n).zfill(digits))]
    l.sort()
    min_n = int(reduce(lambda x, y: x + y, [str(x) for x in l]))
    max_n = int(reduce(lambda x, y: x + y, [str(x) for x in l[::-1]]))
    return max_n - min_n

def kaprekar_routine(n):
    pre = n
    digits = len(str(n))
    suc = kaprekar_function(n, digits=digits)
    result = [pre]
    print(pre)
    print(suc)
    while suc not in result:
        result.append(suc)
        pre, suc = suc, kaprekar_function(suc, digits=digits)
        print(suc)
    return result
```

# 実行結果

```
>>> kaprekar_routine(3522)
3522
3087
8352
6174
6174

Out[2]:
[3522, 3087, 8352, 6174]
```

こんなのやっても大丈夫です。

```
>>> kaprekar_routine(35000000000000)
35000000000000
52999999999965
74429999996553
76554408554433
84311108888652
87776308632222
86555326644432
64331108886654
87733208766222
86555326644432

Out[4]:
[35000000000000,
 52999999999965,
 74429999996553,
 76554408554433,
 84311108888652,
 87776308632222,
 86555326644432,
 64331108886654,
 87733208766222]
```

# 周期性がある理由

鳩ノ巣原理を使うと簡単に証明できるので、略。
Tech-Circle HoloLensハンズオン 音声対話をしてみよう！（事前準備編）

##環境
OS：Windows 10
Unity：5.6.1か5.6.2(推奨）
Visial Studio：Visial Studio Community 2017
gitがインストールされていること

HoloLensの環境がまだできていない方は下記の手順を参考にしてください。
https://www.slideshare.net/kaorun55/hololens-79529893

##プロジェクト作成前の事前準備
###プロジェクトのクローン
https://github.com/decchi/OrenoYome_Hands_On
からクローンしてください。

###oculus-lipsync-unityのダウンロード
https://developer.oculus.com/downloads/package/oculus-lipsync-unity
からovr_audio_lipsync_unity_1.16.0をダウンロードします。
ダウンロード後展開し、ovr_audio_lipsync_unity_1.16.0\LipSync\UnityPlugin
にあるOVRLipSync.unitypackageをわかりやすい場所においておいてください。
###HoloToolkit-Unity-v1.5.8のダウンロード
https://github.com/Microsoft/HoloToolkit-Unity/releases/tag/v1.5.8.0
からHoloToolkit-Unity-v1.5.8.0.unitypackageをダウンロードし、
わかりやすい場所においておいてください。
2017を使う人は対応するunitypackageをダウンロードしてください。
###Unityちゃんのダウンロード
Unityちゃんのパッケージ(ver.1.2)を下記リンクからダウンロードし、
わかりやすい場所においておいてください。
http://unity-chan.com/download/releaseNote.php?id=UnityChan
##Unityプロジェクト事前準備
###Unityを起動し、OrenoYome_Hands_Onプロジェクトを開く
先ほどダウンロード/クローンしたOrenoYome_Hands_OnのプロジェクトをUnity Editorで開きます。
※最初はエラーがでますが、気にしない。

###HoloToolkit-Unityのインポート
先ほどダウンロードしておいたHoloToolkit-Unity-v1.5.8.0.unitypackageをプロジェクトにインポートします。
###oculus-lipsync-unityのインポート
先ほどダウンロードしておいたOVRLipSync.unitypackageをプロジェクトにインポートします。
その際、Plugins/x86_64をインポート対象から外しておきます。（下図参照）
ダイアログとかでても問題ないので、そのままインポートしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/106ebaaa-d8cf-3c2c-147b-1d18d8b8939c.png)


###Unityちゃんのインポート
先ほどダウンロードしておいたUnityChan_1_2.unitypackageをプロジェクトにインポートします。
その際、Scriptsをインポート対象から外しておきます。（下図参照）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/8122b0f1-dbc0-1109-751d-ce21e336e779.png)
###HoloLens用のプロジェクト設定
エディタのHoloToolKit→ConfigureでHoloLens用のプロジェクト設定を行う。
下記の３つの設定についてすべてチェックを入れ、適用する。（Project Settingではエディタの再起動要）


![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/11028929-9860-324c-74fc-1c778abd3610.png)
###事前準備完了
Assets/OrenoyomeにあるOrenoYomeProject.sceneを開いて保存してください。
HierarchyウィンドウとProjectウィンドウが下図と同じになっていればOKです。
お疲れさまでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/0021b8ba-7918-9bf2-ca39-d52a9328356b.png)

###ハンズオンの資料
ハンズオンの資料はこちらです。
https://www.slideshare.net/MasahiroIde/hololens-80521364
linuxbridge をループさせてみる

# はじめに
Linux の仮想 bridge をループさせます。

![computer_hub_loop_setsuzoku.png](https://qiita-image-store.s3.amazonaws.com/0/31573/7c09c3ca-3038-1991-d5a9-e6f47dc669fd.png)
> ループ接続のイラスト | かわいいフリー素材集 いらすとや http://www.irasutoya.com/2016/07/blog-post_529.html


# 環境
iproute2(ip コマンド), brctl がインストールされた Linux
ループで CPU 利用率が 100% になるため、支障をきたさないマシンで行ってください。


# 手順
## veth の作成
```bash
ip link add a-to-b type veth peer name b-to-a
```
コマンド実行後 `ip l` をすると、a-to-b@b-to-a, b-to-a@a-to-b が一覧に追加されています。

## bridge の作成
```
brctl addbr br
ip link set dev br up
```
`brctl show` で作成されたブリッジ一覧を見れます。


## veth を bridge に接続する
```
brctl addif br a-to-b
brctl addif br b-to-a
```
実機ではこの時点でループしますが、仮想ではまだ大丈夫です。
`brctl show` で intefaces に a-to-b, b-to-a が接続されていることを確認してください。

## 仮想インタフェースを up させる
```
ip link set dev a-to-b up
ip link set dev b-to-a up
```
ループします。CPUが100%になります。お疲れ様でした。

※止めるには `ip link set dev a-to-b down` とかで。。



## おまけ STP を有効にする
```
brctl stp br on
```
`brctl show stp br`

![1506255954.png](https://qiita-image-store.s3.amazonaws.com/0/31573/dc9716a1-a76b-6329-2dc4-d5c1f7a7f9d9.png)
Xcode9でiPhoneX/iOS11のシミュレーターが凄まじく重いのをどうにかする

**このバグは既にXcode9.1 beta2でfixされています (2017/10/18追記)**


# はじめに

iOS11のリリースに加え、先日のイベントでiPhoneXとかいう変態仕様端末が発表されたために、デザイナー・エンジニア界隈は対応に追われているかと思います。
まだ実機が出回ってないため、UI周りの確認などはXcode9GM版以降のシミュレーターで調整をするしか無いと思うのですが、Xcode9内臓のiPhoneXシミュレーターを使おうとすると尋常じゃない重さでとてもやってられません。(というかiOS11だとだめっぽいので、iPhone8でも同様かと思います）
特に描画処理の多いゲーム系のアプリケーションだと頭がおかしくなりそうなくらい重いです。

Xcode9beta4の辺りからMapViewでも起きてたバグらしくOpenGLESが原因らしいです。
https://forums.developer.apple.com/thread/83570

# 対処

**Xcode9.1 beta2でfixされたため、基本的にはXcode9.1 beta2にアップデートするのが良いです。**
どうしてもXcode9.0系でなければいけない複雑な事情がある場合は以下の対処を行ってください。


　
https://twitter.com/i/web/status/910203896332783616
このツイートを試したら解消しました。@stroughtonsmithさんありがとう🙇

要するに**Xcode9で使われているOpenGLES.frameworkをXcode9beta3以前のものに取り替えてあげる**とかなり軽くなります。(コメントで指摘いただきましたが、Xcode8.3.3でも問題ないようです。なので8系でも大丈夫？)
beta2以前やXcode8系のものに差し替えた場合どうなるかは未確認です。
念のためもともとのOpenGLES.Framesworkは保存しておくのが良いかと思います。


```
cp Xcode9_beta3.app/Contents/Developer/Platforms/iPhoneOS.platforms/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platforms/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/OpenGLES.framework
```

Apple公式フォーラムでも出ている話題なので次のXcodeのリリースでは修正されていると思いたいですね…
こういった事があるので、過去のバージョンのXcodeもどこかに保存しておくようにしたほうがいいのかなー、と思いました。

恒例の新iOSリリースの際のバグ祭りですが、今回は一段とひどいような気がします😔
Windows7でFirefoxヘッドレスモードの動作確認


自分用のメモとして確認した手順を残す。

### 確認した環境
・Windows7 64bti
・Mozilla Firefox 55.03 Nightly
・node.js 6.11.3
・geckodriver 0.19.0

### インストール
・Firefox Nightlyのインストール
以下のURLよりダウンロードしてインストールする
```
https://download.mozilla.org/?product=firefox-devedition-latest-ssl&os=win64&lang=ja
```

・node.jsのインストール
以下のURLよりダウンロードしてインストールする。
```
https://nodejs.org/dist/v6.11.3/node-v6.11.3-x64.msi
```

インストール後、環境変数パス設定だけは忘れないこと。
```
変数名：NODE_PATH
値：C:\Users\ユーザー名\AppData\Roaming\npm\node_modules;
```

・selenium-webdriverインストール
node.jsのインストールが完了していればnpmコマンドが使用できるようになって
いるはずなので、以下のコマンドでインストールする
```node.js
npm -g install selenium-webdriver
```

・geckodriverのインストール
以下のURLよりダウンロードして、Cドライブ直下にgeckodriverディレクトリを作成し、
環境変数PATHを設定する。
```
https://github.com/mozilla/geckodriver/releases/download/v0.19.0/geckodriver-v0.19.0-win64.zip
```
```
変数名：Path
値：C:\geckodriver
```

### 動作確認
以下のURLを参考にし、期待通り動作するか確認したところ問題なくできた。
```
https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Your_own_automation_environment#Setting_up_Selenium_in_Node
```
実際に確認した際の画面キャプチャ
![確認結果.png](https://qiita-image-store.s3.amazonaws.com/0/77607/156724d4-13da-fa12-05d6-9c06bf5fa7f7.png)
ランダムに生成した数字列を、SKKの辞書から抽出した語呂合わせリストで語呂合わせする

# ランダムに生成した数字列を語呂合わせしたい
昨日、[数字に語呂合わせ可能な文字列をSKKの辞書データから探す](https://qiita.com/kazinoue/items/a7c0d381c03131eb4127)という実装を行ってみましたが、こういう方法でリストが出来上がったら実際にやってみたいのは、ランダムな数字列への語呂合わせですよね。

というわけで実際にやってみることにします。実装例は後半に記載しますが、まずは実際に動かしてみたものを。

# 動作例

実装例ではこんな感じになります。

```
4077 しれいななつななつ /指令;†上からの命令/司令;†軍隊などの指揮/死霊/使令;†命じて使役する//七つ/七ツ//七つ/七ツ/
8193 はいきゅうみっつ /配給/配球/排球/廃休//三つ/３つ/3つ/
1670 いちろなれ /一路//慣れ/熟れ;-鮨/馴/
3797 みなきゅうしち /皆/美奈/美菜/美那//久七/
5265 ごじるいつつ /呉汁/豆汁//五つ/５つ/5つ/
75489 ななつごよやく /七つ/七ツ//御予約/
```

左から順に、入力数字列、語呂合わせ読み、語呂合わせの漢字です。まあまあ使えそうな、使えなさそうな？

でも網羅的に試してみると、なかなか厳しい語呂合わせもあります。網羅的に試す場合はこんな感じで行えますので気になる方はお手元でお試しください。

```
seq -w 000 999 | mapping-number2goroawase.awk
seq -w 0000 9999 | ./mapping-number2goroawase.awk
```


# 実装例

5行目の infile の箇所で、あらかじめ作成しておいた語呂合わせリストを読み込んでいます。
あとは標準入力から渡された数字列の全桁を語呂合わせに置換し終わるまで処理を行います。

ただしこの記事を作成するにあたり [数字に語呂合わせ可能な文字列をSKKの辞書データから探す](https://qiita.com/kazinoue/items/a7c0d381c03131eb4127) で生成するデータの形式を少し変えています。この記事はすでに更新していますが、古い記事の内容でリストを作成済みの場合は、この内容を試す場合にはリストを再作成してください。

また、この実装には少々問題がありまして、ある数字列に複数の語呂合わせが適用できたとしても、そのうちの1つしか適用していません。そういう意味ではせっかくのリストを使いきれていないのですが、あくまでこれは実装例ということでご容赦を。

```awk:mapping-number2goroawase.awk
#!/usr/bin/awk -f

BEGIN {
    idx=0
    infile = "cat goroawase_list.txt"

    while ( infile | getline ) {
        goroawase_num[idx]=$2
        goroawase_yomi[idx]=$3
        goroawase_kanji[idx]=$4
        idx++
    }
    close(infile)
}

{
    goroawase_buffer = $1
    goroawase_output = $1
    goroawase_output_kanji = $1

    # 入力された数値の桁数だけループする
    for ( looploop = 0 ; looploop < length($1) ; looploop++ ) {
        # 語呂合わせリストを総当たりで当てて語呂合わせを試行する
        for ( loop = 0 ; loop < length(goroawase_num) ; loop ++ ) {
            if ( match(goroawase_output,goroawase_num[loop]) ) {

                # 語呂合わせ済みの数字列はバッファから消す
                gsub(goroawase_num[loop],"",goroawase_buffer)

                # 出力文字列（初期値は数字列）から語呂合わせ部分を読みに置換する
                gsub(goroawase_num[loop],goroawase_yomi[loop],goroawase_output)

                # 出力文字列（初期値は数字列）から語呂合わせ部分を漢字に置換する
                gsub(goroawase_num[loop],goroawase_kanji[loop],goroawase_output_kanji)
#print $1,goroawase_buffer,goroawase_output,goroawase_num[loop]
            }
            if ( length(goroawase_buffer) == 0 ) break;
        }
        if ( length(goroawase_buffer) == 0 ) break;
    }

    print $1, goroawase_output,goroawase_output_kanji
}
```
文字列の折り返しを表現するCSSプロパティ

先日、テーブル内に表示している文字列の折り返しを表現する際にちょっと悩んだので調べたことをまとめます。

テーブルのセル内に長い文字列が入る場合、幅を割り当てていてもと意図しない動作をします。以下の単純なサンプルで試してみます。

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Sample</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <div class="container">
      <table>
        <tr>
          <th>name</th>
          <th>key</th>
        </tr>
        <tr>
          <td>Jiji</td>
          <td>50csdhdfvf867c7dcv8787cdcndygcsiyyt76d7c</td>
        </tr>
        <tr>
          <td>Kiki</td>
          <td>clmv77543cdkdvbcdc65454hf7565cd6c5mm44c34</td>
        </tr>
      </table>
    </div>
  </body>
</html>
```

```style.css
.container {
  width: 300px;
  height: auto;
  margin: auto;
  background: #CAF6E6;
  padding: 20px;
}

table {
  width: 100%;
}
```

上記のサンプルをブラウザで表示すると下のイメージのように長い文字列がテーブルからはみ出してしまいます。

<img width="761" alt="スクリーンショット 2017-09-24 18.12.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/188446/7d4e9aec-dbad-9104-5b03-fd65bcf4fbd6.png">

このような意図しない動作を避けるために、`word-break`プロパティを使用してみます。style.cssに以下を追加。


```style.css
table td {
  word-break : break-all;
}
```

すると文字列がテーブルセルの内部で改行されています。

<img width="694" alt="スクリーンショット 2017-09-24 18.31.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/188446/327522bb-969b-c35d-8b4a-7a9a616bd71d.png">

しかしながら`word-break : break-all;`は単語の途中であっても問答無用で折り返します。例のようなランダムな文字列であれば気にしなくていいのかもしれませんが、好ましいとは言い切れません。

# 好ましい書き方

`word-break : break-all;`を使わない書き方を紹介します。

```
table {
  width: 100%;
  table-layout: fixed;
}

table td {
  /*word-break: break-all;*/
  overflow-wrap : break-word;
}
```

`overflow-wrap`は **単語の途中で改行するかどうかを指定する**ためのプロパティです。改行方法を指定する`word-break`とは用途が異なります。そのため、親要素に対して`table-layout: fixed;`を指定する必要があります。

<img width="736" alt="スクリーンショット 2017-09-24 20.15.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/188446/748cf774-8485-db82-c3f2-2df39da5c86f.png">

基本方針として`word-break: break-all;`はできるだけ使わず、親要素を固定レイアウトにし`overflow-wrap`を指定する方法がいいのかもしれません。

ちなみにですが`overflow-wrap`はMicrosoftの独自拡張だった`word-wrap`が多くのブラウザで実装されたためにCSS3 Text仕様書で現在の`overflow-wrap`に改名されました。改名された現在でも`word-wrap`は今のところ問題なく使えます。

# 参考

[overflow-wrap](https://developer.mozilla.org/ja/docs/Web/CSS/overflow-wrap)
[word-breakとword-wrapはややこしい](https://w3g.jp/blog/confusing_word-break_word-wrap)
ルーティングの定義で外部URLも自然に書けるdirectメソッドの使い方

```rb
require "action_controller/railtie"
ActionPack::VERSION::STRING     # => "5.1.4"

Class.new(Rails::Application).routes.draw do
  direct :google do |options|
    "https://www.google.co.jp/?q=#{options[:query]}"
  end
end

include Rails.application.routes.url_helpers

url_for(:google)                   # => "https://www.google.co.jp/?q="
url_for([:google, query: "rails"]) # => "https://www.google.co.jp/?q=rails"
google_url                         # => "https://www.google.co.jp/?q="
google_url(query: "rails")         # => "https://www.google.co.jp/?q=rails"
google_path                        # => "/?q="
google_path(query: "rails")        # => "/?q=rails"
```

Rails4 まで routes.rb にはアプリ内だけのルーティングを書く感じでしたので、外部URLの場合はどこに書いていいか悩ましいところでした。Rails5 からは routes.rb に集約できるようになっていました。
railsでカラムを追加する方法

# やり方

* マイグレーションファイルを作成し、ファイル内にchangeメソッドを書いてカラムを追加
* コマンドでカラムを追加してしまう

どちらでも良いが既存のtableにカラムを追加する場合、前者でmodelごと作成する場合後者を個人的にはよく使う。

# マイグレーションファイルを作成し、そのファイル内に変更内容を書く方法

## テーブルの追加方法

```
rails g model モデル名（最初大文字の単数形）
```

## マイグレーションファイルの作成

```
rails generate migration クラス名
```

クラス名はどのテーブルかの指定。下記のようにmigratinfileのファイル名を明示するものでする事+model名が多い。

```
rails generate migration addcolumnimage
```

migration fileの命名規則

https://qiita.com/yasumasaabe/items/825e960bbac216424329

## changeメソッドを書く

```ruby:db/migrate/20170924062454_user.rb
class User < ActiveRecord::Migration[5.1]
  def change
    add_column :users, :icon_id, :integer
    add_column :users, :icon_back_id, :integer
    add_column :users, :sex, :integer
    add_column :users, :line_id, :text
  end
end
```

## rails db:migrate

```
rails db:migrate
```

で反映。

# コマンドでのカラム追加

```
rails g model テーブル名 カラム名:型
```

で追加。カラム名は連ねることで複数一気に追加できる。
【PHP】Oracle DBへの接続

# 概要：Oracle DBへ接続するPHPアプリケーション


# ソースコード
```
<?php


	try {
		// tnsnames.oraの内容
		$tns = "
	  		(DESCRIPTION =
	    		(ADDRESS = (PROTOCOL = TCP)(HOST = {ホスト名})(PORT = 1521))
	    		(CONNECT_DATA =
	      			(SERVER = DEDICATED)
	      			(SERVICE_NAME = XE)
	    		)
	  		)";

		// DB接続
		$db = new PDO('oci:dbname='.$tns,'{ユーザID}', 'パスワード');
		print '---------------DB接続成功------------------</br>';

		// DBクローズ
		$conn = null;

	} catch (PDOException $e) {
		print "ERROR: " . mb_convert_encoding($e->getMessage(),"UTF-8","SJIS") . "\n";
		die();
	}
?>
```

# 作業環境
* OS : Windows 10 64bit
* DB ： Oracle Express Edition 11.2.0.2.0 64bit production
* PHP： 7.1.8
* XAMPP Control Panel V3.2.2
* instantclient-basic-nt-12.2.0.1.0.zip(32bit版)

# Try & Error

● ociによる接続
Fatal error: Call to undefined function oci_connect() in エラー部分の行数

● PDO接続
PDO Exception could not find driver
⇒dllがみつからない
● php.iniの編集
● extension=php_oci8_12c.dll の";"を除去し、設定を有効にした
● extension=php_pdo_oci.dllの";"を除去し、設定を有効にした
● oracle instant client(64bit)をダウンロードし、phpフォルダへdllをコピー
● XAMPPによるApache再起動後、php再実行
● Windowsの環境変数pathにdllまでのパスを追加
⇒エラーは解消されず

● oracle instant client64bitをダウンロードして解凍し、phpフォルダ、phpフォルダ\extにコピー
⇒エラーは解消されず

● oracle instant clientの32bitを、phpフォルダ、phpフォルダ\extにコピー
⇒これでdllがみつからない、のエラーが消えた

● ERROR: SQLSTATE[HY000]: pdo_oci_handle_factory: ORA-12560: TNS:protocol adapter error (ext\pdo_oci\oci_driver.c:640)
⇒接続文字列が正しくなかった。

● Warning: Uncaught PDOException: SQLSTATE[42S02]: pdo_oci_handle_factory:
ORA-12154: TNS:could not resolve the connect identifier specified (ext\pdo_oci\oci_driver.c:640)
⇒接続文字列が正しくなかった。

● 接続文字列を修正
⇒接続成功

# まとめ
* php.iniの編集
* oracle instant client32bitをphp\extフォルダにコピー
* Windowsの環境変数pathにdllまでのパスを追加(これは必要かどうかはわからない)
WKWebViewでPinchZoomを有効にする方法

初投稿になります！！
最近AbemaTVのインターンに行き、たくさん学んで田舎に帰ってきたところです。。
帰って来てからMVVMとRxSwiftで自身のアプリを書き直しています。

さて本題ですが、ネット上にWKWebViewの情報が少なかったのと、メモという形で残しておきます。

```swift
override func loadView() {
    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.ignoresViewportScaleLimits = true // trueにするとPinchZoomが有効
    webView = WKWebView(frame: .zero, configuration: webConfiguration)
    webView.uiDelegate = self
    view = webView
}
```

`loadView()`でWKWebViewを生成する時の`WKWebViewConfiguration()`のプロパティで、
`ignoresViewportScaleLimits = true`にすればOKです。
[AppleのWKWebViewの使い方](https://developer.apple.com/documentation/webkit/wkwebview)を参考にしています。

それでは👋
Windowsで"."から始まるフォルダ/ファイルを作る

Windowsのエクスプローラーで"."から始まるフォルダ/ファイルを作ろうとして毎回エラーになるので、解決策をメモしておきます
![error.png](https://qiita-image-store.s3.amazonaws.com/0/192172/0230bbd5-6115-73fa-b835-367141351878.png)

## .からはじまるフォルダ
"C:\tmp\"フォルダに".ssh"フォルダを作る場合

1. コマンドプロンプトを開く
2. 作成したいディレクトリに移動する
3. 以下のコマンドを実行する

```
C:\tmp\> mkdir .ssh
```

## .からはじまるファイル
"C:\tmp\"フォルダに".gitignore"ファイルを作る場合

1. "C:\tmp\"フォルダに何か適当なファイルを作る（ここでは"nodot"とする）
2. コマンドプロンプトを開く
3. 作成したいディレクトリに移動する
4. 以下のコマンドを実行する

```
C:\tmp\> move nodot .gitignore
```
一度作ってしまえば編集はできます

## エクスプローラーで作る
エクスプローラーでも作れるとコメントで教えて頂きました
ありがとうございます

ファイル/フォルダ両方で使えます

1. ファイル名の末尾に"."をつける

![exploler_before.png](https://qiita-image-store.s3.amazonaws.com/0/192172/35bff81a-40ed-4a2b-2ba3-d6f08858363e.png)

確定すると末尾の"."は消えます
![exploler_after.png](https://qiita-image-store.s3.amazonaws.com/0/192172/19038260-bb5d-9d65-32e3-53874cf0a947.png)
Git LFSのストレージ容量をダイエットする方法

みなさん[Git LFS](https://git-lfs.github.com/) (Git Large File Storage) 使ってますか？巨大なバイナリファイルを含むリポジトリはGit操作全般が重くなりがちなので、Git LFS登場時は救世主のように思われましたが、当初の予想より普及していないのが現状ではないでしょうか。

イマイチ普及していない原因として、覚えることが増えるであったりcloneその他が案外遅いなど色々あるかと思います。加えて、個人レベルではお財布に優しくないのも普及を妨げているかもしれません。下記にGitHub・BitBucketでのGit LFS利用料金をまとめてみました。

|        |       GitHub |    BitBucket    |
|:-----------------|:------------------:|:------------------:|
| 無料枠            |              ストレージ1GB/月<br>下り転送量1GB/月 |        ストレージ1GB/月<br>転送量制限なし        |
| 有料プラン          |           $5/月<br>（追加ストレージ50GB・<br>下り転送量50GB） |      $10/月<br>（追加ストレージ100GB）       |

デカいバイナリファイルを扱いたいからGit LFSを使いたいのに無料枠1GBとはショボすぎじゃないですかね…と思わないでもありません。

# Git LFS容量のダイエット

Git LFSでは管理下のバイナリファイルの全ての履歴が保存されます。つまり、LFS管理下の100MBのファイルを10回更新するとGit LFSストレージを1GB消費となり、無料枠を使い切ることになります。これでは長期プロジェクトになるほど古いバイナリファイル履歴による課金が増えていくことになりかねません。

プロジェクトによっては一定以上古いバイナリファイルは不要なこともあるので、これを削除して少しでも課金額が減らせたらいいですよね。しかし、Git LFSではリモートリポジトリのファイルを消す統一的インターフェースは提供されておらず、各サービス事業者ごとの実装依存になっています。

GitHub・BitBucketについては、以下のような対応状況です。

## GitHubの場合

GitHubでは個別にGit LFSの履歴を消す方法は提供されていないようです。唯一Git LFSのストレージ容量を減らす方法はリポジトリごと削除することです。

手元にbareリポジトリを確保した上で、深夜早朝などにGitHub上のリポジトリを削除・再作成して[BFG Repo-Cleaner](https://rtyley.github.io/bfg-repo-cleaner/)で巨大ファイルを削除して再度pushするなどすればダイエットは実現できそうですが、プロジェクトメンバー全員がcloneからやり直しになるので面倒なのは間違いないでしょう。

## BitBucketの場合

BitBucketではGit LFS管理のファイルを個別に消すWebインターフェースが提供されているそうです。チマチマ消せば多少延命できそうですね。

<img src="https://wac-cdn.atlassian.com/dam/jcr:46218516-f4aa-490a-9afc-c36ca863c98f/09.png">

（「[Git LFS - large file storage | Atlassian Git Tutorial](https://www.atlassian.com/git/tutorials/git-lfs#deleting-remote-files)」より引用）

# 参考URL

- [About storage and bandwidth usage - User Documentation](https://help.github.com/articles/about-storage-and-bandwidth-usage/)
- [Bitbucket - 価格 | Atlassian](https://ja.atlassian.com/software/bitbucket/pricing?tab=cloud)
- [Removing files from Git Large File Storage - User Documentation](https://help.github.com/articles/removing-files-from-git-large-file-storage/)
- [Git LFS - large file storage | Atlassian Git Tutorial](https://www.atlassian.com/git/tutorials/git-lfs#deleting-remote-files)
- [BitBucketのプラン改定でLFS容量が10GBから1GBになった話 - かせノート。](http://yutakaseda3216.hatenablog.com/entry/2017/06/14/142804)
[Survey] Kaggle - Santander 14位解法まとめ

Kaggle - Santander Product Recommendation[^1]の14位解法[^2]の調査記事です．

Title: Some ideas from my solution
Author: alijs
Kaggle https://www.kaggle.com/c/santander-product-recommendation/discussion/26808

## データ

- 解法の中核は2015年6月だったが，2015年6月〜2016年5月までのデータが季節性とトレンドのため性能改善につながった．
- 2016年5月+その他の月の多くの異なるペアに対してアンサンブルを取って予測
- 理想の分布で異なる月からサンプリングしたデータで訓練した．(単独モデルとしては性能はいまいちだったが，組み合わせることで性能改善に繋がった)

## 特徴量

- 他参加者と同様(lag-5, month-1の製品, month-2の製品など)
- データ選択と後処理に時間を費やしていたことは失着だったとのこと．

## モデル

- XGBoostとKerasのNNモデルで予測(予測結果は平均することでアンサンブル)

## 後処理

- 特徴量nominaの予測値 > 特徴量nom_pensの予測値なら，nom_pensの予測値としてnomina+0.00001を設定．
- 特徴量cnoの予測値 < 特徴量nom_pensの予測値なら，cnoの予測値として(cnoの予測値+nom_pensの予測値)/2を設定
- 特徴量delaの予測値を-0.15減算
- 特徴量recaの予測値を1.4倍
- 特徴量demeやviv,decoからの予測値を除去

後処理は非常に大きい改善に繋がったが，過学習の可能性も高かった．
後処理を行った版とそうでない版の二種類を提出．(どちらが良かったかは定かではないとのこと)

## References

[^1]: Kaggle, [Santander Product Recommendation](https://www.kaggle.com/c/santander-product-recommendation).
[^2]: alijs, [Some ideas from my solution](https://www.kaggle.com/c/santander-product-recommendation/discussion/26808).
JDK9のモジュールとjlinkでアプリ配布向けのJVMを作る

JavaOne2017を前にして、待望のJava9が遂にリリースしましたね！ 

さて、Java9といえばやはり気になるのはjigsawによるモジュール機能です。モジュールの使い方までは良く見ますが、jlinkが個人的には気になってたので試した結果をまとめました。

はじめに
-------------

Jigsawに関してですが少なくとも現時点では、fat-jarやgo言語のようなシングルバイナリを代替するようなことは単独ではできません。

ただ、モジュールとjlinkを使うことでアプリケーションを含んだ配布用のJVMを生成することが可能で、今回はそれについての説明になります。
モジュールで公開範囲の改善や依存の早期発見ができるようになったことは特に触れないので、その辺は[この記事](https://qiita.com/nmatsui/items/73ad642838631bcdc92e#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%99%E3%82%8B%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)とかを参考にされると良いと思います。

コードの準備
-----------

まずは、コードの準備です。
下記のような感じでアプリからライブラリが三階層で呼ばれてるようなサンプルを作ります。

![alt](https://yuml.me/d79ef971)

こちらにできたものが。特に語ることがないので詳細は省きますが、それぞれのトップディレクトリに`module-info.java`を配置して、モジュールの設定を書いています。
https://github.com/koduki/example-jlink

ビルド
----------------

続いて各モジュールのビルドです。

その前にまずモジュール配置先のディレクトリを作ります。

```bash
$ mkdir modules
```

当たり前ですが、依存が無い方から順番にビルドしていきます。

```bash
$ javac -d commons/classes/ -cp commons/src/main/java $(find commons/src/main/java -name "*.java")
$ jar cvf modules/commons.jar -C commons/classes/ .
```

ビルドは基本的には通常のjarと同じで良さそうですが、コンパイル時に`p`オプションでモジュールのディレクトリを指定するところが違います。
また、古いバージョンだと`mp`としてオプションが記載されているので要注意です。

```bash
$ javac -d libs/classes/ -cp "libs/src/main/java/" -p modules/ $(find libs/src/main/java -name "*.java") 
$ jar cvf modules/libs.jar -C libs/classes/ .
```

ライブラリがビルドできたらメインアプリケーション。とはいえこれも他と同様です。

```bash
$ javac -d apps/classes/ -cp apps/src/ -p modules $(find apps/src -name "*.java")
$ jar cvf modules/app.jar -C apps/classes/ .
```

以下のような形で実行できます。

```bash
$ java -p modules/ -m apps/cn.orz.pascal.app.MyApp
Hello, cn.orz.pascal.common.CommonLib
Hello, cn.orz.pascal.lib.MyLib
Hello, MyApp
```

実行が確認できましたね？ モジュールを指定するときは`m`オプションで`モジュール名/実行するクラス`という形で記述します。

JLinkによる配布用JVMの作成
------------

これだけだと、配布観点ではあまり嬉しく無いので、いよいよJLinkの出番です。
JLinkを使えば指定したモジュールに必要な最小構成のJVMが作れます。つまり、WebアプリでSwingやAWTのライブラリを持たなくて良くなるという事です。

Macの場合はインストールしただけだとパスが通って無いので下記のように対応します。

```bash
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/   
$ alias jlink=${JAVA_HOME}/bin/jlink     
```

続いてjlinkによるリンクの実行です。今回は合わせて`apps/cn.orz.pascal.app.MyApp`を実行するランチャーの作成と、全体のzipでの圧縮をしています。

```bash
$ jlink --compress=2 --module-path $JAVA_HOME/jmods:modules --add-modules apps --output dist/my-app --launcher myapp=apps/cn.orz.pascal.app.MyApp 
```

実行するとdistディレクトリにmy-appができています。実行すると以下の通り。

```bash
$ ./dist/my-app/bin/myapp 
Hello, cn.orz.pascal.common.CommonLib
Hello, cn.orz.pascal.lib.MyLib
Hello, MyApp
```

my-appには指定したモジュールと最小構成のJVMが入ってるのでこのディレクトリを配布するだけで、JVMが無い環境でもそのまま動きます。ポータブルですね！

なお、容量は今回だと下記の通り。わりといい感じです。

```bash
$ du -h dist|tail -n1
 24M	dist

```

まとめ
-----

jlinkによるアプリ配布向けのJVMの作り方について試してみました。パッケージングこそされないものの、JVMがインストールされてない環境への配布もずいぶん楽そうです。
サーバ用途ならDockerにパッケージさせてしまえば特に困らないんじゃ無いでしょうか？

コマンド系など、go言語やjavaのfat-jarで実現してたようなシングルバイナリでの配布には向きませんが、今後electron-packagerみたいなのが作られれば、十分実現できると思います。

それでは、Happy Hacking!
ReactNativeのImageで画像が表示されない

# ReactNativeのImageで画像が表示されなくてはまる

## 最初に結論

- widthとheightを忘れずに！

## Imageタグの使い方

- source属性に画像のURLを設定する

#### ① プロジェクト内に入ってるファイルを使う時

- sourceにファイルをrequire/importしたものを渡す

```jsx
<Image source={require('./sample.png')} />
```

#### ② 外部から画像を取得する場合

- uriプロパティにURLを設定したオブジェクトを渡す

```jsx

<Image source={{ uri: 'https://facebook.github.io/react-native/img/header_logo.png' }} />
```

## ハマりどころ

- ①は特に問題なし
- ②は上記の例だと表示されなくてはまる

## 解決策

- widthとheightをつけると表示される
- こんな感じ

```js
<Image
    source={{ uri: 'https://facebook.github.io/react-native/img/header_logo.png' }}
    style={{ width: 66, height: 58 }}
/>
```

## サンプル

```js
import React from 'react';
import { AppRegistry, Image, View } from 'react-native';

const Sample = () => (
  <View>
    {/* これは問題なく表示される */}
    <Image
       source={require('./sample.png')}
       style={{ backgroundColor: 'lightgreen' }}
       />
    {/* これはwidth/heightがないので表示されない */}
    <Image
       source={{ uri: 'https://facebook.github.io/react-native/img/header_logo.png' }}
       style={{ backgroundColor: 'yellow' }}
       />
    {/* これはwidth/heightがあるので表示される */}
    <Image
       source={{ uri: 'https://facebook.github.io/react-native/img/header_logo.png' }}
       style={{ width: 66, height: 58, backgroundColor: 'lightblue' }}
       />
  </View>
);

AppRegistry.registerComponent('Sample', () => Sample);
```

- こんな感じ

![Screenshot_1506219453.png](https://qiita-image-store.s3.amazonaws.com/0/175213/0079bb48-794f-8714-5937-2144c1ec4e07.png)


## まとめ

- Imageタグ使う時はwidth/heightを忘れずに
Reactの機能概要とgetting start

# React
概要を示すとともに、v16から変更なる点を記述します。

## コンポーネント
`React.createClass` -> `class ClassName extends React.Component`
のようにjs Nativeなクラスを利用するように変更[[参考](https://fb.me/react-create-class)]。

- 現在はjsのnativeクラスへ以降
- プロパティ定義・検証
 - リポジトリが分離？ prop-typesに変更
 - 上記にともないマイグレーションが多少必要そう[[参考](https://fb.me/prop-types-docs)] 
 - 必須プロパティ
 - 型検証
- プロパティのデフォルト値
- `event.target`等によるイベント処理の統一
- read onlyなプロパティに対するwriteできるステート(state)
- mixinsを利用したコードの再利用
- render時に`this.props` or `this.state`のみで描画するものをピュアコンポーネント(関数言語のピュアと同義でrender以外の副作用がないこと)と呼ぶ
- render時にピュアでかつ`this.props` or `this.state`も利用しないものを静的なピュアコンポーネントと呼ぶ
- ライフサイクルに関するメソッドが用意されている
 - `componentWillUpdate` 2回目以降の描画前
 - `componentDidUpdate` DOMへの変更適用後 
 - `componentWillMount` DOMに挿入される直前
 - `componentDidMount` DOMに挿入された直後 描画範囲を知る際などに利用できる
 - `componentWillUnmount` DOMから削除される直前
 - `componentWillReceiveProps` propの変更前
 - `shouldComponentUpdate` `componentWillUpdate`の前 falseを返すことで変更してもrenderを呼び出さなくすることができる ピュアコンポーネントは`props`と`state`に変更がなければfalseを、静的なピュアコンポーネントは無条件でfalseを返すことで描画時間を短縮することが可能([PureRenderMixinとしてAPI提供がある](https://facebook.github.io/react/docs/pure-render-mixin.html))

## Babel(JSX)
JSXのトランスパイラ

- mapをスプレッド演算子で展開できる
- htmlで馴染みのonclick等もキャメルケースにする
- 閉じタグは必須
- ECMAの予約語で使えないものがある
 - `class` -> `className`
 - `for` -> `htmlFor`
Unityのprefab(プレハブ)がScriptの数値とズレる

#はじめに
自分用の簡単なまとめ

#問題点
UnityのPrefabの位置をScriptで数値で操作しようとしたところ
正しい数値を入力しているにもかかわらず、想定した場所とは異なる位置に移動する。

#原因
Prefabを生成する際に「子オブジェクト」だとすると、親オブジェクトの数値も引き継いでいる模様。

#対策
Prefabを一番上に持ってくる。(=誰かの子オブジェクト状態でprefabにしない）
そうすれば、数値と場所が一致する。

#オマケ
world positionとか、local positionの問題と思っていたら全然違った。
Buttonを押してImageを変更する

#Unityの勉強を始めたのでやったことざっくりメモ
**目的：ボタンを押すと画像が切り替わるようにする**

赤丸と緑丸の２つの画像を用意（以下 赤丸→OFF、緑丸→ON）。
画像はAsettsにインポートして使用

|Off|On|
|:----:|:-----------:|
|![off.png](https://qiita-image-store.s3.amazonaws.com/0/203879/bb67e1ea-8648-4008-8f4c-452c2a87a7e0.png)|![on.png](https://qiita-image-store.s3.amazonaws.com/0/203879/e4ad7247-e8eb-0a4e-145f-b4acea148fe7.png)|




プロジェクトを作成してHierarchyにUI>Imageを作成、
Imageを右クリックしてUI>Buttonを作成。
（Imageは始め表示したい画像を設定する）

AssetsにChangeImageとかでC#Scriptを作成する。
`bool flg`で現在OnかOffかを判定して現在と逆の画像を設定する

```csharp:
using
...
using UnityEngine.UI; 　// <- 追加

public class ChangeImage : MonoBehaviour{

	public Sprite _on;
	public Sprite _off;
	private bool flg = true;

	public void changeImage(){
		var img = GetComponent<Image> ();
		img.sprite = (flg) ? _on : _off;
		flg = !flg;
	}
}
```

作成したChangeImage.csをImageにドラッグ・アンド・ドロップすると
ImageのInspectorにChange Image（Script）というものが追加されるので
その欄のOnとOFFに画像をそれぞれ設定する。

ボタンのInspectorにOnClicke()というものがあるので＋ボタンをおして
None(Object)ってなっているところはImage
No　Functionってなってるところは作ったChangeImage.changeImageをそれぞれ設定する。

![Rec1.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/203879/09655428-57f7-8a93-a0bd-143a8a1ef768.gif)

おしまい
アプリ内広告を出してみて分かったユーザー動向

#はじめに
Unityでアプリ内広告を出してみて分かったことを自分用に簡単にまとめておく。


#広告システム
使用した広告はUnity ADSとApp Lovinの2つ。

##Unity ADS
動画広告が流れる。簡単にスキップできる。
ユーザー側から見るとかなり良心的。
ただし回数制限がキツイ。10回程度見ると、もう見れなくなる。

開発側で見ると導入がとても簡単。

##App Lovin
動画広告が流れる。簡単にスキップできない。
スキップボタンを押しても、スキップできなかったり、ページが開いたりするので閉じるのが面倒。
ユーザー側から見るとかなり不親切。
ただし無制限に動画広告を見れたはず。

開発側で見ると導入が少し面倒。
(しかもiOS版に導入する際は更に手間がかかる。1度出来るようになれば問題はないが)

##広告の設置方法
広告は「ゲーム内ポイントが欲しければ広告を見てね」というボタンで実装。

「簡単にスキップできるUnity ADS(回数制限あり）」
「簡単にスキップできないApp Lovin（回数制限なし）」
という2つのボタンを用意した。

ボタンを押すことによる報酬は同額とした。

##収益結果
収益は、1ヶ月という単位で見るとUnity ADSが収益が上であったが、Unity ADSに肉薄する形でApp Lovinも収益があがっていた。
Unity ADSを100%とすれば、App Lovinはその60-70%はあった。

具体的なグラフを出せないので申し訳ないが、ここから分かったことは以下の点である

- ユーザーはストレスの少ないUnity ADSを優先的に使う
- ユーザーはストレスの多いAppLovinを使おうとしない
- 少数のユーザーはとにかく多くのポイントを貰おうとして、AppLovinを何度も使う
- 少数ユーザーによる大量のAppLovin実行が大きな収益を生んでいる


#結論
Unity ADS vs AppLovinで比較した場合は

Unity ADS : 多くのプレイヤーから小額の収益をあげることができる
App Lovin : 少数のプレイヤーから多額の収益をあげることができる

ただし、用意するボタンの条件(報酬額や注意書き）によって、結論が大きく変わると思うので注意。