OmniAICreator/Qiita-1.07M huggingface dataset:
M5StackでARライク動作のMMDビューアを作ってみた

nekosystemさんがM5StackでARライクな動作をする素晴らしいアプリを作ってくれました。
[M5Stackで姿勢に応じた3D表示をする](http://neko-kousaku.hatenadiary.jp/entry/2019/03/17/194249)

これを少し変更してMMDモデルを表示できるようにしました。
![ARlikeMotion0.png](https://qiita-image-store.s3.amazonaws.com/0/174906/3244bdd4-864b-b18a-5e73-e8bfbdf111a3.png)

# 用意するもの
・[M5Stack Fire](https://www.switch-science.com/catalog/3953/) ： Fireを使用するのは加速度センサーとPSRAMが搭載されているためです。
・SDカード： MMDモデルのデータを入れます。

# プログラム
プログラムは[M5Stack_MMD](https://github.com/MhageGH/M5Stack_MMD)のM5StackFIRE_MMDになります

# 使い方
1. [M5Stack_MMD](https://github.com/MhageGH/M5Stack_MMD)にあるModelフォルダ内の各pmdファイルとbmpファイルを全てSDカードのルートフォルダに置く。
2. Arduino IDEでM5StackにM5StackFIRE_MMD.inoを書き込む。
3. MMDモデルが表示される。M5Stackを動かすとARライクな動作をする。
4. ボタンを押すことで拡大・縮小とモデルの変更ができる。
![button.png](https://qiita-image-store.s3.amazonaws.com/0/174906/533611e3-1073-8680-2356-ece38ec224c3.png)

# 好きなMMDモデルを使う
M5StackFIRE_MMDで使えるMMDモデルは本アプリの専用データではなく、本家MikuMikuDanceやPmxeditorでも使えるものですが、以下の制限があります。
1. PMDファイル名、テクスチャファイル名はASCIIコードでなければならない
2. テクスチャファイルは128×128ピクセルの16bit ARGB(1-5-5-5)ビットマップ形式ファイルでなければならない。
3. PMX形式は非対応。PMD形式でなければならない。

テクスチャファイルは[Gimp](https://www.gimp.org/)を使ってサイズの変更、ファイル形式の変更をすることが出来ます。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/174906/bb688528-11b5-059f-02e3-841e200c348f.png)
MMDモデルは[PmxEditor](http://kkhk22.seesaa.net/category/14045227-1.html)を使ってテクスチャファイル名の変更、PMX形式からPMD形式への変更が出来ます。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/174906/86c39221-0db1-2a4f-d7aa-8a347c081a1f.png)

MMDモデルはフリーのものがWeb上に大量にあります。しかしモデルによって改造許可や再配布許可の規約が異なります。readme.txtを良く見てご利用ください。

描画速度は秒間約27000ポリゴンです。ポリゴン数が多いモデルは描画が遅くなります。
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/174906/09cb645a-08af-1edf-38f4-7d0f75d73c6e.png)

# 理論
M5Stackではありませんが、マイコンによる3Dレンダリングを以下の動画で解説しています。
[【ゆっくり解説】 PICマイコンでMMD 【電子工作】](https://www.nicovideo.jp/watch/sm21224686)
[小ネタ]PowerShell のエラー内容をログに書く

メモ。

# 参考

+ [Handling Errors the PowerShell Way](https://devblogs.microsoft.com/scripting/handling-errors-the-powershell-way/)

# 本文


`ErrorVariable`を使うとエラーを変数に格納出来るのでこれを使う。

例えば以下のように実行すると失敗するコマンドがある。

```powershell
PS C:\> Stop-Process -Name invalidprocess
Stop-Process : Cannot find a process with the name "invalidprocess". Verify the process name and call the cmdlet again.
At line:1 char:1
+ Stop-Process -Name invalidprocess
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (invalidprocess:String) [Stop-Process], ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.StopProcessCommand
```

この時のエラーを変数に格納するために コマンド実行時に `-ErrorVariable` を指定しつつ、`out-file` でファイルへ内容を書き出す。

```test.ps1

# 変数を宣言
$errvar

Try {
  # エラー時に停止するように指定
  $ErrorActionPreference = 'Stop'
  # エラーを発生させる。エラーは errvar に記載する
  Stop-Process -Name invalidprocess -ErrorVariable errvar
}
Catch {
  # 失敗したので終了ステータスコード1で終わらせる
  exit 1;
}
Finally {
  # ログにエラーを書き出す
  $time=Get-Date
  "Attempted to run script at $time with error $errvar " | out-file C:\temp\scriptExec.log -Append
}
```

ファイルにはエラー内容が書き込む事ができる

```C:\temp\scriptExec.log
Attempted to run script at 03/31/2019 06:37:33 with error System.Management.Automation.ActionPreferenceStopException: The running command stopped because the preference variable "ErrorActionPreference" or common parameter is set to Stop: Cannot find a process with the name "invalidprocess". Verify the process name and call the cmdlet again.
   at System.Management.Automation.ExceptionHandlingOps.CheckActionPreference(FunctionContext funcContext, Exception exception)
   at System.Management.Automation.Interpreter.ActionCallInstruction`2.Run(InterpretedFrame frame)
   at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
   at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame) 

```
rails g ~~~ まとめ

##初めに
以下はプログラミング初心者である私の初心者の言葉によるまとめです。
違うところがあるかもしれません。
間違いに気づき次第修正していきます。

###`rails g controller ○○`
※○○にはコントローラーの名前が入る。
「コントローラー」＋「ビューフォルダ」の生成

これで以下のファイルとフォルダが作られる
app/controllers/○○_controller.rb
app/views/○○（○○コントローラーのアクションに対応するビューファイルを入れるためのフォルダ）

※コントローラーとは、あるURLが検索バーに書かれたとき、どんな動きをするかを支持する役割を持つ。


###１つの「コントローラー（アクション付き）」＋１つの「ビューフォルダ（複数のビューファイル付き）」
`rails g controller ○○ ~ ~ ~`
※○○にはコントローラーの名前が、~にはアクション名が入る。

###`rails g model モデル名 カラム名:型 カラム名:型 ....`
「マイグレーションファイル」＋「モデルファイル」の生成

- 「マイグレーションファイル」 = db/migrate/(作成日時)_create_モデル名.rb
 - DBのテーブルを作ったり、カラムを追加したりする。 

- 「モデルファイル」 = app/models/モデル名.rb
 - Rubyのコードでデータベースを扱えるファイル。（まだよくわからない）
windos10 powershellでAnacondaを使う

#設定ファイルをどこに書けばいいのか調べる
```:PowerShell
> $profile
C:\Users\hayate\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
```

#設定ファイル作成
```
>notepad C:\Users\hayate\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
```
メモ帳が起動したら、Anacondaのディレクトリをパスに追加する。

```:Microsoft.PowerShell_profile.ps1
# Anaconda
$Env:Path += ";C:\Users\hayate\Anaconda3\Library\bin\"
$Env:Path += ";C:\Users\hayate\Anaconda3\Scripts"
```

#PowerShellの権限を設定
管理者権限でPowershellを起動して以下を入力

```:PowerShell
> Set-ExecutionPolicy RemoteSigned
```

#確認
```:PowerShell
> conda -V
conda 4.5.12
```
#activateできるようにする
```
> conda install -n root -c pscondaenvs pscondaenvs
```

#参考
[PowerShellでAnacondaを使う方法](https://www.gesource.jp/weblog/?p=8254)
ABC - 070- A&B&C

#AtCoder ABC 070 A&B&C
[AtCoder - 070](https://atcoder.jp/contests/abc070)

#A問題

 - 数値の比較ではなく文字列で比較。StringBuilder#reverseで逆順に変換
    - 便利なんだけど速度は遅い

```java
	private void solveA() {
		String numN = next();

		out.println(numN.equals(new StringBuilder(numN).reverse().toString()) ? "Yes" : "No");
	}

```

#B問題

 - A,B,C,Dの組み合わせは以下になる
    - （A↔C）（B↔D）の位置は変換可
    - ● の位置が重なる秒数（と思って）

||||||
|:-:|:-:|:-:|:-:|:-:|
|---|---|---|---|---|
|A|●|●|●|B|
|C|●|●|●|D|
|---|---|---|---|---|
|A||●|B||
||C|●||D|
|---|---|---|---|---|
||A|●|B||
|C||●||D|
|---|---|---|---|---|
|A|B||||
||||C|D|

```java
	private void solveB() {
		int numA = nextInt();
		int numB = nextInt();
		int numC = nextInt();
		int numD = nextInt();

		int wkRes = Math.min(numB, numD) - Math.max(numA, numC);
		//wkReが0より小さい場合、二人がスイッチを押していた時間の被りはない
		out.println(wkRes >= 0 ? wkRes : 0);
	}
```

#C問題

 - この時計達の最小公倍数を求めれば、もう一度すべての針が上を向く
    - 最小公倍数=$(val1 * val2)/(val1とval2の最大公約数)$

```java
	private void solveC() {
		int numN = nextInt();

		BigDecimal[] times = new BigDecimal[numN];
		for (int i = 0; i < numN; i++) {
			times[i] = new BigDecimal(next());
		}


		/*
		 * 1つしか要素がない場合は要素の秒数がかかる秒数
		 */
		if (times.length == 1) {
			out.println(times[0]);
			return;
		}

		/*
		 * 最小公倍数を求める
		 */
		BigDecimal res = BigDecimal.ZERO;
		for (int i = 1; i < times.length; i++) {
			if (i == 1) {
				res = getMinKoubaisu(times[i - 1], times[i]);
			} else {
				res = getMinKoubaisu(res, times[i]);
			}
		}

		out.println(res.longValue());
	}

	private BigDecimal getMinKoubaisu(BigDecimal val1, BigDecimal val2) {
		BigDecimal wk = getMaxKouyaku(val1, val2);
		return (val1.multiply(val2).divide(wk));
	}

	private BigDecimal getMaxKouyaku(BigDecimal val1, BigDecimal val2) {

		BigDecimal wkVal1 = val1.compareTo(val2) <= 0 ? val1 : val2;
		BigDecimal wkVal2 = val1.compareTo(val2) > 0 ? val1 : val2;
		BigDecimal amari = wkVal2.remainder(wkVal1);
		while (!amari.equals(BigDecimal.ZERO)) {
			wkVal2 = wkVal1;
			wkVal1 = amari;
			amari = wkVal2.remainder(wkVal1);
		}

		return wkVal1;
	}
```
enumを日本語化する

# 今回の目的
[Materializeとsimple_formでシンプルでいい感じのフォームを作りたい！]
(https://qiita.com/sakuraniumarete/items/762a21d7abfbf536b537)
[enumを使ったselectボックスの実装](https://qiita.com/sakuraniumarete/items/ac09780f6b42cc287815)
上記からの作業となります。今回前回実装したenumを日本語化します。

#Gemfileに追加からのbundle install
まずは「enum_help」をGemfileに記載して「bundle install」します。

```Gemfile.
gem 'enum_help' 
```

```ターミナル.
bundle install
```

#  ja.ymlとapplication.rbに記載で日本語化
ja.ymlに下記を記載します。ファイルがない場合は作成しましょう。
またapplicatio.rbでデフォルトの言語を日本語にします。

```config/locales/ja.yml
ja:
  enums:
    product:
      unit:
        yen: "円"
        usd: "ドル"
        eur: "ユーロ"
```
```config/application.rb
module EcSite #アプリケーション名
  class Application < Rails::Application
    config.load_defaults 5.2
    config.i18n.default_locale = :ja #追記
  end
end
```
# selectボックスの記述を修正
下記の部分を日本語化します。

```new.html.haml
  = simple_form_for(@product) do |f|
    .row
      .input-field.col.s6
        = f.input :name
        = f.input :description
        = f.input :price
        = f.select :unit,Product.units_i18n.invert, {}, placeholder: 0 
　　　　# Product.units_i18n.invertに修正
        = f.input :image
        = f.button :submit
```
enum_helpを導入することにより「Product.units_i18n.invert」を使用することができます。

```ターミナル.
Product.units_i18n.invert
=> {"円"=>"yen", "ドル"=>"usd", "ユーロ"=>"eur"}
```
完了したら、サーバーを再起動します。

```ターミナル.
サーバー停止
rails s #サーバー再起動
```

#結果
<img width="902" alt="enum日本語化.png" src="https://qiita-image-store.s3.amazonaws.com/0/332038/f4e84e25-b4a8-8054-1726-a9daab00224c.png">
正常に表示できました！

以上です。少しでも参考になりましたら、いいねやフォロー気軽にしていただけると励みになります！＼(^o^)／

# 参考
[[初学者]Railsのi18nによる日本語化対応
](https://qiita.com/shi-ma-da/items/7e5c3d75c9a9f51abdd5)
Protobuf.jsを使って.protoファイルからNode.jsのprotobufのjavascriptコードを生成する

## 環境

```bash
$ node -v 
v10.15.3
```

## 前提

```bash
$ npm i -g protobufjs
$ pbjs                                                                                                                                                    
protobuf.js v6.7.0 CLI for JavaScript
...
```

※ protobufjsをインストールすると `pbjs` でcliツールを呼び出すことができる


前提として次の `hero.proto` がheroディレクトリ以下にある状態でこの後の手順を解説する。
これは、nestjsの [sample/04-grpc](https://github.com/nestjs/nest/blob/master/sample/04-grpc/src/hero/hero.proto) から拝借した。

```proto
syntax = "proto3";

package hero;

service HeroService {
  rpc FindOne (HeroById) returns (Hero) {}
}

message HeroById {
  int32 id = 1;
}

message Hero {
  int32 id = 1;
  string name = 2;
}
```

## 生成する

次のコマンドを実行して生成する。
オプションが複数になるのと、環境に依存するpathを使用する箇所があるので、シェルスクリプト化しても良さそう。

```bash
pbjs \
--target static-module \
--wrap commonjs \
--keep-case \
--out ./hero_pb.js \
./hero/hero.proto
```

- --target
    - 出力ファイルのフォーマットを指定
- --wrap
    - 使用するwrapperの指定
- --keep-case
    - .protoのmessage定義がcamelCaseに変換されることを防ぐオプション
- --out
    - 出力ファイル名

全オプションを確認したい場合は、 `pbjs` を引数無しで実行すれば利用できるオプション一覧が表示される。

## 生成されるファイルの確認

- hero_pb.js
    - protobufのmessageオブジェクトをjavascriptのclassで表現したもの

`--out` オプションで指定したファイル名でclient実装が生成されることがわかる。
生成されたファイルの内容をここに貼り付けることはしないが、hero_pb.jsの内容を確認すると、.protoに定義した通りのスキーマでprotobufのmessageオブジェクトのコードが生成されているのがわかる。


## 参考

- https://github.com/dcodeIO/protobuf.js#command-line
LookingGlassのHoloPlay SDKのマイグレーションメモ(0.1.4->1.0.0)

# はじめに

LookingGlassの開発に必要なHoloPlay SDKですが、2019.03.30にメジャーバージョンとなる`1.0.0`がリリースされました。

Release & Update Note
https://blog.lookingglassfactory.com/https-blog-lookingglassfactory-com-holoplay-sdk-1-0-0-release-a54abdfc526e

`1.0.0'ではそれまでの最新版`0.1.4`のコードを全て書き直したらしく、互換性がありません。
そこでマイグレーション(移行)の手順のメモを残したいと思います。

# SKDのアップデート

`0.1.4`と`1.0.0`はディレクトリ構成が異なるため、`.unitypackage`で上書きしても古いスクリプトが残ってしまいます。そのため以前の`HoloPlay`ディレクトリ毎削除して後に、新しい`.unitypackage`をインポートしましょう。

# スクリプトの移行

気がついた変更点を列挙します。参考になれば幸いです。

- 名前空間の変更: HoloPlay->LookingGlass
- Quiltクラスがstaticな非MonoBehabiorに変更
- Quiltクラスのいくつかの機能がHoloPlayに移行
    - quilt.tiling->holoplay.quiltSettings
    - quilt.tiling->holoPlay.customQuiltSettings
    - quilt.overrideQuilt->holoplay.overrideQuilt
    - quilt.SetupQuilt()->holoplay.SetupQuilt()
- SetupQuilt()適用前にholoplay.quiltPreset = Quilt.Preset.Customの変更が必要に
- Quilt設定に関する構造体の命名が変更: Quilt.Tiling->Quilt.Settings
    - メンバ変数の命名が変更
        - tileSizeX->viewWidth, tileSizeY->viewHeight
        - tilesX->viewColumns, tilesX->viewRows
- overrideQuiltがTexture型->Texture2D型
- Buttons->ButtonManager

# まとめ

まだしっかり使っていませんが、プレビュー周りなどかなり使いやすくなっているように思いました。Looking Glassはいいぞ
ABC - 071- A&B&C

#AtCoder ABC 071 A&B&C
[AtCoder - 071](https://atcoder.jp/contests/abc071)

#A問題

 - 2点間の距離の絶対値を比較する

```java
	private void solveA() {
		int numX = nextInt();
		int numA = nextInt();
		int numB = nextInt();

		if (Math.abs(numX - numA) > Math.abs(numX - numB)) {
			out.println("B");
		} else {
			out.println("A");
		}

	}
```

#B問題

 - 比較用に、'a' - 'z'　のcharが詰まったsetを用意
 - 文字列をchar[]として読み込み
 - 初期化した中から読み込んだcharをremoveしていく
 - removeが終わったsetをchar[]に戻す
 - ソート（文字コード順になる）後出力

```java
	private void solveB() {

		Set<Character> wk = IntStream.range('a', 'z' + 1).collect(() -> new TreeSet<Character>(),
				(t, i) -> t.add(new Character((char) i)),
				(t, u) -> t.addAll(t));

		char[] wkA = next().toCharArray();

		for (int j = 0; j < wkA.length; j++) {
			wk.remove(wkA[j]);
		}

		Character[] res = wk.stream().toArray(Character[]::new);

		if (res.length == 0) {
			out.println("None");
		} else {
			out.println(res[0]);
		}
	}
```

#C問題

1. 出現回数が2以上の棒の中のみ利用
    2. 出現回数が2未満の棒は方形を作れないので除外
3. 利用可能な棒を長さでソートして、2つ×2個用意する


 - 値をMapに読み込みつつ出現回数をカウント
 - 出現回数2未満の棒を除外してListに変換して長さの昇順にソート
 - 長さ順に2個ずつ取得（2個ずつでないと辺を作れない）
 - 計4個取得出来たら終了

```java
	private void solveC() {
		int numN = nextInt();

		Map<Integer, Integer> wk = IntStream.range(0, numN).map(i -> nextInt())
				.collect(() -> new HashMap<Integer, Integer>(), (t, i) -> {
					t.merge(i, 1, (oldV, newV) -> oldV + newV);
				}, (t, u) -> t.putAll(u));

		List<int[]> operatedWk = wk.entrySet().stream().filter(e -> e.getValue() > 1).collect(
				() -> new ArrayList<int[]>(),
				(t, i) -> {
					t.add(new int[] { i.getKey(), i.getValue() });
				},
				(t, u) -> {
					t.addAll(u);
				});

		Collections.sort(operatedWk, (x, y) -> Long.compare(x[0], y[0]));

		long radX = 0;
		long radY = 0;

		for (int j = operatedWk.size() - 1; j >= 0; j--) {
			for (int k = 0; k < 2; k++) {
				long radTmp = 0;
				if (operatedWk.get(j)[1] >= 2) {
					operatedWk.get(j)[1] = operatedWk.get(j)[1] - 2;
					radTmp = operatedWk.get(j)[0];
				}
				if (radX == 0) {
					radX = radTmp;
					radTmp = 0;
				}
				if (radY == 0) {
					radY = radTmp;
					radTmp = 0;
				}
			}

			if (radX > 0 && radY > 0) {
				break;
			}
		}

		out.println(radX * radY);
	}
```
grpc-toolsを使って.protoファイルからNode.jsのgRPC clientコードを生成する

## 環境

```bash
$ node -v 
v10.15.3
```

## 前提

```bash
$ npm i -g grpc-tools 
```

※ grpc-toolsには `protoc` 本体も含まれている


前提として次の `hero.proto` がheroディレクトリ以下にある状態でこの後の手順を解説する。
これは、nestjsの [sample/04-grpc](https://github.com/nestjs/nest/blob/master/sample/04-grpc/src/hero/hero.proto) から拝借した。

```proto
syntax = "proto3";

package hero;

service HeroService {
  rpc FindOne (HeroById) returns (Hero) {}
}

message HeroById {
  int32 id = 1;
}

message Hero {
  int32 id = 1;
  string name = 2;
}
```

## 生成する

次のコマンドを実行して生成する。
オプションが複数になるのと、環境に依存するpathを使用する箇所があるので、シェルスクリプト化しても良さそう。

```bash
grpc_tools_node_protoc \
--js_out=import_style=commonjs,binary:. \
--grpc_out=. \
--plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` \
hero/hero.proto
```

- --js_out
    - protobufのmessageクラス定義の出力先ディレクトリを指定
- --grpc_out
    - client実装の出力先ディレクトリを指定
- --plugin
    - 利用するプラグインのパスを指定

## 生成されるファイルの確認

- hero_pb.js
    - protobufのmessageオブジェクトををjavascriptのclassで表現したもの

- hero_grpc_pb.js
    - clientの実装
    - 内部的にhero_pb.jsが読み込まれているため利用する場合はhero_pb.jsも必要になる

生成されたファイルの内容をここに貼り付けることはしないが、hero_grpc_pb.jsの内容を確認すると、.protoに定義した通りのスキーマで呼び出しコードが生成されているのがわかる。


## 参考

- https://grpc.io/docs/tutorials/basic/node.html
- https://github.com/grpc/grpc/tree/master/examples/node/static_codegen
モバイルアプリの動作確認とリモートデバッグについて簡単にまとめてみた

## はじめに

モバイルアプリの動作確認をするとき、ぬけもれなく確認したい、というケースがあると思います。

しかしながら、クライアントとなるモバイルは端末、OS、動作環境、通信環境など、多種多様な要素が組み合わさるため、もれなく確認するということが難しいなと感じています。

そこで、備忘としてモバイルアプリの動作確認方法について簡単にまとめておきます。

## 動作確認について

### デベロッパーコンソールで確認する　

おなじみなのが、PC の Web ブラウザに搭載されているデベロッパーコンソールを利用する方法だと思います。

ユーザーエージェントや縦横幅を切り替えて iPhone や Pixel 2 などといった端末に見せかけて確認できるだけでなく、独自にユーザーエージェントを指定して確認することも出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/797c25dd-8d8e-9f26-39bb-408756f1a617.png)

#### 確認項目例

* レスポンシブな画面の崩れの確認
* ユーザーエージェントによる処理切り替えの確認

### シミュレーターで確認する

OS 特有の動作の不具合などを検知するためには、デベロッパーコンソールによる確認だけでは足りないケースもあります。そんなとき、シミュレーターを利用する方法が便利です。

シミュレーターを利用することにより、ある WebView のバージョン特有の不具合といった、デベロッパーコンソールでは確認しきれない部分の確認もすることができるようになります。

#### 確認項目例

* OS バージョン差異による挙動の違いの確認

##### Android

Android のシミュレーターは、 Android Studio にある AVD Manager から仮想デバイスを作成することで利用することが出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/f522506c-0e43-0467-3e7e-00e43ba450f3.png)

Android のバージョンも、デバイスを作成するウィザードの途中で System Image を選択する画面が出てくるので、そこで古いバージョンの OS を指定することも可能です。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/a08f0890-6f64-e4b3-b82a-e9d08fb6f4b6.png)

#### iOS

iOS のシミュレーターは、xcode に同梱されている Simulator を使うことが出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/f066102e-3be4-1702-20ac-ab13471ec23f.png)

また Simulator の上部メニューの [Hardware] - [Device] - [Manage Device] - [Simulator] と遷移していくと、過去バージョンの iOS 端末を指定してシミュレーターを起動することも可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/c5a3ea1f-7861-cfcf-cb0e-f94e919ed155.png)

### 実機で確認する

上記だけでなく、やはり実機でも確認できたほうが良いでしょう。自分の持っているモバイル端末を使っても良いですし、検証機があればそれを使っても良いと思います。

シミュレーターでも確認できないような、実機特有の挙動の確認する際に必要になります。

#### 確認項目例

* 端末のスペック(CPU、メモリ)によるパフォーマンス確認
* 通信環境(Wi-Fi、3G、4G など)の違いによるパフォーマンス確認
* アプリ起動時の電池消費の確認

## リモートデバッグについて

モバイルアプリの動作確認を進めて挙動に違和感や不具合が見つかった場合、それを修正するためにデバッグ作業をすることになると思います。

その際、モバイル上の挙動も、PC のデベロッパーコンソールのように見える化できるとデバッグが進めやすくなります。リモートデバッグと呼ばれているようです。

ここでは Chrome と Safari のみの例になりますが、モバイルのリモートデバッグについて簡単にまとめます。

### Chrome で確認する

Chrome を利用していれば、Android 上の Chrome や、WebView を使っているアプリに関してリモートデバッグをすることができます。利用方法は以下をご参照下さい。

[Android 端末のリモート デバッグを行う | Tools for Web Developers | Google Developers](https://developers.google.com/web/tools/chrome-devtools/remote-debugging/?hl=ja)

利用イメージは以下の通りで、PC の Web ブラウザのデベロッパーコンソールと同じような感覚で利用することが出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/ea040e4e-d8a5-e4a1-b232-1f4aa16e53cb.png)

### Safari で確認する

Simulator 上の Safari も、PC の Safari からデバッグすることが可能です。利用方法は以下のドキュメントをご確認下さい。

[Safari Web Inspector Guide - Getting Started](https://developer.apple.com/library/archive/documentation/AppleApplications/Conceptual/Safari_Developer_Guide/GettingStarted/GettingStarted.html)

こちらも使用感としては PC の Safari のデベロッパーコンソールと同じ形式で利用できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222030/8c8ea1e2-ce89-0363-a216-2c1f7806ee57.png)

## おわりに

一旦思いつく限り書いてみました。他にも観点あれば教えて下さい！

## 参考

* [アプリの動作確認をする時に心がけていること](https://techlife.cookpad.com/entry/2016/02/26/093000)
NuxtアプリをHerokuでホスティングする

公式サイトだけではわからなかったので、手順化しました。

## 公式サイト
```
https://ja.nuxtjs.org/faq/heroku-deployment/
```

## Nuxtアプリを作成
```
yarn create nuxt-app noracorn-heroku-nuxt
```

```
? Project name noracorn-heroku-nuxt
? Project description My divine Nuxt.js project
? Use a custom server framework express
? Choose features to install Axios
? Use a custom UI framework vuetify
? Use a custom test framework jest
? Choose rendering mode Universal
? Author name noracorn
? Choose a package manager yarn
```

## ビルドして確認
```
cd noracorn-heroku-nuxt
yarn dev
```

## APIを追加
```server/api.js
const express = require('express')
const router = express.Router()

router.get('/otameshi', (req, res, next) => {
  const param = { response: 'success' }
  res.header('Content-Type', 'application/json; charset=utf-8')
  res.send(param)
})

module.exports = router
```

apiの設定変更

```server/index.js
const express = require('express')
const consola = require('consola')
const { Nuxt, Builder } = require('nuxt')
const app = express()

const apiRouter = require('./api') // 追記

// Import and Set Nuxt.js options
let config = require('../nuxt.config.js')
config.dev = !(process.env.NODE_ENV === 'production')

async function start() {
  // Init Nuxt.js
  const nuxt = new Nuxt(config)
  const { host, port } = nuxt.options.server

  // Build only in dev mode
  if (config.dev) {
    const builder = new Builder(nuxt)
    await builder.build()
  } else {
    await nuxt.ready()
  }

  app.use('/api', apiRouter)  // 追記

  // Give nuxt middleware to express
  app.use(nuxt.render)

  // Listen the server
  app.listen(port, host)
  consola.ready({
    message: `Server listening on http://${host}:${port}`,
    badge: true
  })
}
start()
```

## herokuアプリ作成
```
cd noracorn-heroku-nuxt
heroku create noracorn-heroku-nuxt
```

## heroku設定
```
heroku config:set NPM_CONFIG_PRODUCTION=false
heroku config:set HOST=0.0.0.0
heroku config:set NODE_ENV=production
```

## herokuのbuildpacks設定
```
heroku buildpacks:set heroku/nodejs
```

## AxiosのURLを設定
```
heroku config:set API_URL=$(heroku info -s | grep web_url | cut -d= -f2)
```

## herokuに反映
```
heroku plugins:install heroku-config 
heroku config:push
```

## githubの設定
githubで、noracorn-heroku-nuxtのリポジトリを作成しておく

```
git init
git add .
git commit
git remote add origin https://github.com/noracorn/noracorn-heroku-nuxt.git
git push origin master
```

## herokuにデプロイ
```
git push heroku master
```

## 確認
```
https://noracorn-heroku-nuxt.herokuapp.com/
https://noracorn-heroku-nuxt.herokuapp.com/api/otameshi
```

## 記事作成時に参考にさせていただきました。
```
https://qiita.com/kawaMk4/items/298f95f751540b96d39b
https://qiita.com/ta1nakamura/items/3d799d1176c15885cc6f
```

## サイドリポジトリを落としたときなのに紐づけ直し
```
heroku git:remote --app noracorn-heroku-nuxt
```
numpyの地味に知らなかった便利機能

今まで地味に知らなかったnumpyの便利な機能があったらメモっとく備忘録。
無知の知。。。

#cumsum()
numpy配列を足し込んでいく。

```
>>> numpy_numbers = np.arange(10)
>>> numpy_numbers.cumsum()
array([ 0,  1,  3,  6, 10, 15, 21, 28, 36, 45])
>>> np.cumsum(numpy_numbers)
array([ 0,  1,  3,  6, 10, 15, 21, 28, 36, 45])
```
DTMF信号の生成と検出アプリを作った

ボタンを押すと、DTMF音声を出力し、同時に検出を行うアプリを作りました。検出にはgoertzelアルゴリズムを使用しています。ネット上で拾った関数を改造して利用し、数学的な理屈はちゃんと理解していません。Qt5を使用しています。Windows、Linux、macOSで動作します。

https://github.com/soramimi/QtDTMF

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61222/920587e8-24e2-c278-317d-e9856e95f092.png)
【初心者向け】AnacondaでPythonの仮想環境を作成・切り替える(多分)最も簡単な方法

# はじめに (読んでください)
Anacondaでの仮想環境の作成方法と切り替え方法についてのまとめです。
Anacondaでは、たとえ仮想環境下であっても`pip`と`conda`の競合を起こすと最悪**再インストール**しなければなりません。逆に言うと再インストールさえすれば大した問題ではないです。よって、Anacondaを使用する際には、

* 目的に合った仮想環境を作成
* `conda`にあるライブラリは`conda`でインストールする。
* その他のライブラリは`pip`で慎重にインストールする。

という方針がオススメです。

そもそもAnacondaを入れたはずなのにcondaコマンドが使えねぇ！という方はおそらくPATHが通っていないためなので、自力で解決できそうな方は以下のように`.bashrc`や`.zshrc`にPATHを通してみてください。
ピンと来ない方は、Anacondaを再インストールしてPATHがどうたらって聞かれたときにチェックしましょう。warningされると思いますが無視で大丈夫です。

以下のPATHは**Macの環境のもの**なので、windowsの方は別途お調べください。

```shell:.bashrc
export　PATH=/opt/anaconda3/bin:$PATH
```

# 環境
windows 10 (コマンド自体はMacでも問題ありません)
Anaconda 3

# 現状の確認
まずは今の環境の確認です。`conda info -e`でAnacondaにある全ての環境が確認できます。

```shell-session:cmd
C:\Users\Owner>conda info -e
```

```shell-session:出力
# conda environments:
#
base                  *  C:\Users\Owner\Anaconda3
```
環境名とファイルの場所が出力されました。*印が今の環境です。何もしていない状態だと大体こんな感じでしょう。

また、`conda list` で現環境にインストールされているライブラリの一覧が見れます。

```shell-session:cmd
C:\Users\Owner>conda list
```

```:出力
# packages in environment at C:\Users\Owner\Anaconda3:
#
# Name                    Version                   Build  Channel
_ipyw_jlab_nb_ext_conf    0.1.0                    py37_0
alabaster                 0.7.12                   py37_0
anaconda                  2018.12                  py37_0                   
......
```

# 仮想環境の作成
今の状態が分かったところで、早速新しい仮想環境を作成しましょう。
以下のコマンドで簡単に仮想環境を作ることが出来ます。

```shell-session:cmd
C:\Users\Owner>conda create -n 環境名 python=バージョン ライブラリ名=バージョン
```

今回、自分はPython2.7の環境が作りたかったので、環境名を`py27`、インストールするpythonを`python=2.7`のように指定しました。バージョンは特に指定しなければ最新のものになります。

```shell-session:cmd
C:\Users\Owner>conda create -n py27 python=2.7 numpy jupyter
```

これで仮想環境を作ることが出来ました。`conda info -e`で確認しましょう。

```shell-session:出力
C:\Users\Owner>conda info -e
# conda environments:
#
base                  *  C:\Users\Owner\Anaconda3
py27                     C:\Users\Owner\Anaconda3\envs\py27
```
しっかり作成できています。

## 仮想環境の切り替え
しかし*印は切り替わっていないので、`activate 環境名`で仮想環境を有効にします。

```shell_session:cmd
C:\Users\Owner>activate py27
```
`python` でpythonを起動させてバージョンを確認しましょう。

```:cmd
(py27) C:\Users\Owner>python
Python 2.7.16 |Anaconda, Inc.| (default, Mar 14 2019, 15:42:17) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

仮想環境を終了させるときは`deactivate`と入力します。

```shell-session:cmd
(py27) C:\Users\Owner>deactivate
```

先ほどと同様にpythonを起動させて確かめると

```:cmd
C:\Users\Owner>python
Python 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
となっています。正しく切り替えられました。


# 仮想空間の削除
```cmd
conda remove -n 環境名 --all
```
で削除できます。

# VSCode
`ctrl`+`shift`+`P`でpython実行環境の切り替えが出来ます。

# 参考にさせていただいた記事
https://qiita.com/ozaki_physics/items/985188feb92570e5b82d
アロー関数　Java Script

なかなか慣れないと書きづらい、アロー関数の基本的な書き方のまとめ。

例として、通常の関数の書き方は

```javascript.js
const sum = function(a, b, c) {
      return a + b + c;
};
```

これをアロー関数で書くと

```javascript.js
const sum = (a, b, c) => {
      return a + b + c;
};
```

となる。functionを削除して、引数の後にハッシュロケット(=>)をつければ良い。

また、この場合returnが1行なので、次のようにさらに短くすることができる。

```javascript.js
const sum = (a, b, c) => a + b + c;
```
 
また引数((a, b, c)の部分)が1つの場合は、さらに（）も除くことができる。

```javascript.js
const sum = a => a + 2;
```

このように少し癖があるが、アロー関数を使えば短く関数式を書くことができる。
RSpecまとめ

# RSpecでやったことをまとめ
RSpecでテストを書くことがあったので、内容をまとめるために記事にしときます。
#### 参考資料
* RSpecでテストを書くときの進め方と考え方が学べる(文法の記事ではない)
 https://qiita.com/jnchito/items/624f6d5023c279046a1c
* 構文知りたかったらこっち
https://qiita.com/jnchito/items/42193d066bd61c740612


## RSpecを書く上での考え方
・どんな機能のテストを書くのかを事前に決めておく。それに対していきなり機能そのもののテストを書いていくのではなく、細分化して簡単なテストから書いていく。これをテストの為のテストを書く、仮実装という。
例えば、ユーザー一人分のデータを作成して、このユーザーはnameというデータをもっているかというテストから始めてもいい。細分化することで最終的な本実装のテストのバグを減らすことができ、気が楽になる。
・仮実装のテストに対して違うデータを使ったテストを作成していく。これを三角測量という。
・仮実装と三角測量で不安な部分を消していったら、本格的な実装に進んでいく。
・作成したテストが通ったら、今度はリファクタリングをして、重複しているコード、無駄なコードを無くしていく。

### RSpecの構成例
・ テストケースの整理と分類　describe、context
・ テストコードの実行部分を書くところ　before、it

```
describe '投稿機能' do
  before do ・・・①
    下記二つのテストの実行に必要な事前の共通部分をbefore内に記述できる
  end
  describe '投稿一覧表示' do
    before do ・・・②
      投稿一覧表示だけの事前準備
    end
    it '何か表示される' do ・・・③
      期待する動作
    end
  end
  describe '投稿詳細表示' do
    it '詳細が表示されるテスト' do　・・・④
      期待する動作
    end
  end
end
```
③のテストがされるまでの流れ　①→②→③
④のテストがされるまでの流れ　①→④
Windows 10 IoT Coreでのサイドロードアプリ自動更新

# AppInstallerによる更新
Windows 10 バージョン 1709 から、UWPアプリケーションをAppInstallerによってサイドローディングするとアプリの自動更新が利用できる。
この機能は IoT Core でも利用が可能で、サイドローディングした(というかストアインストールではない)アプリをAppInstallerに自動更新させることができる。

## デバイスポータルからのインストール時
App managerからアプリをインストールする際に、*.appinstallerファイルを指定すれば自動更新される状態となる。
appx/msix/bundleなどを直接指定してインストールした場合には自動更新にはならない。

## カスタムFFUでのプリインストール時
[Update apps on your Windows 10 IoT Core devices](https://docs.microsoft.com/en-us/windows-hardware/service/iot/updating-iot-core-apps) を見る限り、OMA-DMを利用するのが正攻法のように見える。(通常はAzureを利用するのだろうか。)
しかし閉じた環境で行いたかったのと、OMA-DMのサーバは簡単に用意できるようなものでもなさそうなので、appinstallerを利用してどうにかできないかを試みた。

[IoT Core manufacturing guide](https://docs.microsoft.com/en-us/windows-hardware/manufacture/iot/iot-core-manufacturing-guide) に説明されているカスタムFFUイメージのビルド手順にて、自分のアプリをイメージに追加する箇所でappinstallerファイルを指定することはできない。
カスタムFFUイメージの初期状態で自動更新を有効にすることは今のところできないように思われる。
(ICDでプロビジョニングパッケージの構成ができないか探したが見つからない。なにか方法があれば知りたい。)

一応、以下のような方法でプリインストールアプリをAppInstallerの管理に置き換えることはできる模様。
公式にサポートされた方法かどうかはわからないので、とりあえずこれをしたら出来た、という状態。

- アプリに ```packageManagement``` の機能要求を追加する。
  - この機能要求は [Restricted capabilities](https://docs.microsoft.com/en-us/windows/uwp/packaging/app-capability-declarations#restricted-capabilities) という種類のもので、appxmanifestファイルを手編集して名前空間やIgnorableNamespacesへの追加等必要となる。
- アプリになにかの方法で自身のパッケージを示す appinstaller のURIを含めておき、初回起動時などに [PackageManager.AddPackageByAppInstallerFileAsync()](https://docs.microsoft.com/en-us/uwp/api/windows.management.deployment.packagemanager.addpackagebyappinstallerfileasync#Windows_Management_Deployment_PackageManager_AddPackageByAppInstallerFileAsync_Windows_Foundation_Uri_Windows_Management_Deployment_AddPackageByAppInstallerOptions_Windows_Management_Deployment_PackageVolume_) を呼び出してappinstallerからインストールを行う。
  - アプリケーションパッケージのバージョンが新しければ更新が行われる。(```ForceTargetAppShutdown```を指定すれば呼び出した時点でアプリ再起動が行われる。)
  - アプリパッケージのバージョンが同じ場合は呼び出しは失敗(例外発生)する。(たぶん古い場合も同様と思われる)
  - アプリの起動直後にこのメソッドを呼び出した場合にも失敗することがあるように思われる。(遭遇ケースが少なくて不確か)
  - 少なくとも[Package.GetAppInstallerInfo()](https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.package.getappinstallerinfo)はアプリ起動直後に呼び出すとエラーを生ずることは確か。
- 自身の更新に成功したら、以後はAppInstallerが自動更新してくれる。


## その他

- [PackageManager.UpdatePackageAsync()](https://docs.microsoft.com/en-us/uwp/api/windows.management.deployment.packagemanager.updatepackageasync)による自身の更新も可能である。
  - しかし、更新対象パッケージのURIの特定や依存パッケージなども指定が必要のため、appinstallerファイルのようなものでパッケージ構成情報を得て処理するような、まさにAppInstallerの動作を自分で実装しないといけなそう。
Terminalカスタマイズまとめ

#1.テーマ切り替え
・標準terminal
icebergを利用する
https://qiita.com/kinchiki/items/57e9391128d07819c321

・iterm2
Gitクローンして、readme参照
Iceberg
https://github.com/Arc0re/Iceberg-iTerm2
Japanesque 現在の設定
https://github.com/aereal/dotfiles/tree/master/colors/Japanesque

command+D ウィンドウ作成
command+[ ウィンドウ移動
command+ W 

#2. shell
bashからZshに変更
パッケージインストーラーを事前にインストール(homebrew)
zshを設定するためのframeworkをインストールすることでカスタム
Preztoというフレームワークの設定　-> zshをカスタムできる
https://www.labohyt.net/blog/environment/post-321/amp/

#3. プロンプト
Pureを導入する
Prompt -pでテーマ一覧が見ることができる
http://kinchiki-it.hatenablog.jp/entry/build-command-line-environment-mac-2#zshの導入

#4. emacs テーマ
ver24以降
標準スキームが導入
(load-theme 'manoj-dark t)
/usr/local/share/emacs/25.1/etc/themes/
https://www.yokoweb.net/2017/01/17/emacs-theme-customize/

#4. emacs フォント日本語
https://qiita.com/ybiquitous/items/5b319a62e9260b65bab0

#5. tmux
https://codeiq.jp/magazine/2014/01/5143/
enumを使ったselectボックスの実装

selectボックスの項目が増えた場合、その度にコードの修正が必要となります。
enumを使って拡張性のあるselectボックスを作りたいと思います。

#enumとは
int型、boolean型で定義されたカラムを、文字列で表現できるようにする機能です。
例えば曜日でいうと下記のように表現できるようにしたものです。

```
    MON = 1
    TUE = 2
    WED = 3
    THU = 4
    FRI = 5
    SAT = 6
    SUN = 7
```

# 事前準備
- 前述の通りenumに定義するカラムはint型、boolean型で定義されている必要があります。
- Materializeやsimple_formの導入については下記をご参照ください。<br>
[Materializeとsimple_formでシンプルでいい感じのフォームを作りたい！](https://qiita.com/sakuraniumarete/items/762a21d7abfbf536b537)

# Materialize確認事項
selectボックスを使用するには、jqueryの設定が必要です。
application.jsに下記記載を行います。また公式ページを参考に
language-javascript.jsを作成し、下記記載を行いました。

```application.js
//= require jquery
//= require jquery_ujs
//= require materialize-sprockets
//= require turbolinks
//= require_tree .
```

```language-javascript.js
document.addEventListener('DOMContentLoaded', function() {
  var elems = document.querySelectorAll('select');
  var instances = M.FormSelect.init(elems, options);
});

// Or with jQuery

$(document).ready(function(){
  $('select').formSelect();
});
```
# enumの設定
該当モデルのファイルに記載を行います。
今回は通貨を設定しているProductモデルのunitカラム(integer型)に定義します。

```product.rb
class Product < ApplicationRecord
  validates :name, presence: true
  validates :description, presence: true
  validates :price, presence: true
  validates :unit, presence: true

  enum unit: [:yen, :usd, :eur] #追記

  mount_uploader :image, ImageUploader
end
```

上記により定義が行えました。ターミナルの結果です。
[モデル].[カラムの複数形]で確認ができます。

```ターミナル.
Product.units
=> {"yen"=>0, "usd"=>1, "eur"=>2}

```

またkeysと追加で記述するとkeyのみ取得することも可能です。

```ターミナル.
Product.units.keys
=> ["yen", "usd", "eur"]
```

# selectボックスを追加
下記のように記述することでselectボックスを使用することができます。

```new.html.haml
  = simple_form_for(@product) do |f|
    .row
      .input-field.col.s6
        = f.input :name
        = f.input :description
        = f.input :price
        = f.select :unit,Product.units.keys, {}, placeholder: 0 #追加
        = f.input :image
        = f.button :submit
```

# 結果
![selectbox.gif](https://qiita-image-store.s3.amazonaws.com/0/332038/ffa956c8-6094-1ec4-3beb-4a827c20b00e.gif)
正常に実装することができました！

# おまけ
続きでenumの日本語化を下記にまとめてます。よかったら引き続きどうぞー
[enumを日本語化する](https://qiita.com/sakuraniumarete/items/90d3fbaebcd5fdb31646)

以上です。少しでも参考になりましたら、いいねやフォロー気軽にしていただけると励みになります！＼(^o^)／

# 参考
[参考][Github simple_form](https://itsakura.com/https://github.com/plataformatec/simple_form)
[参考][Github materialize-sass](https://github.com/mkhairi/materialize-sass)
Oculus Go のキャプチャ方法

※PCはWindows10接続時の想定

## 写真
`シェア > 写真を撮る`

- 機能：数秒後に1枚のスクショを撮影する
- HMD内表示：`ナビゲーション > ギャラリー > 内部ストレージ` から画像表示
- PC保存場所：`PC\VR-Headset\内部共有ストレージ\oculus\Screenshots`


## 動画
`シェア > 録画`

- 機能：音声付きで動画をキャプチャする
- HMD内表示：`ナビゲーション > ギャラリー > 内部ストレージ` から動画再生  
（VRシアターで鑑賞できるのでVRライブを丸ごと録画しておくといい）
- 保存場所：`PC\VR-Headset\内部共有ストレージ\oculus\VideoShots`



## キャスト
`シェア > キャスト`

- 機能：ミラーリングするのでスマホ側で録画やスクショを撮れる  
※音声は取得できない

> 参考
[OculusGoの画面をリアルタイムでスマホに出せるようになりました【Casting機能】](http://bibinbaleo.hatenablog.com/entry/2018/10/25/101410)



## PC接続が認識されない
スマホ側のOculusアプリから開発者モードをオフにする

> 参考
[Oculus GoにWindows 10 PCからUSBファイル転送したいのに認識してくれない（解決）](https://www.junt74.com/2018/05/22/oculus-go%E3%81%ABwindows-10-pc%E3%81%8B%E3%82%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%BB%A2%E9%80%81%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%AB%E8%AA%8D%E8%AD%98%E3%81%97%E3%81%A6%E3%81%8F/)



## シェア > 録画 したmp4ファイルがPCで再生できない
VR向けのmp4なのか、PC上で展開すると再生できないものとできるものがある。
調査中。

> 参考
[Oculus Go Video Shots no longer working correctly](https://forums.oculusvr.com/developer/discussion/73437/oculus-go-video-shots-no-longer-working-correctly)
rails6から追加されるActiveRecord::Base#implicit_order_column

# ActiveRecord::Base#implicit_order_column

`first`, `last`などの順序付けられたfinderメソッドを呼び出す時にActiveRecordは主キーで暗黙のソートを行います。UUIDなどの自動インクリメント整数ではないカラムが主キーに指定されていると問題が発生するので、暗黙のソートに使用される列をオーバーライドが可能になります。

# 参考

```ruby:rails\activerecord\CHANGELOG.md
*   Make the implicit order column configurable.
    When calling ordered finder methods such as +first+ or +last+ without an
    explicit order clause, ActiveRecord sorts records by primary key. This can
    result in unpredictable and surprising behaviour when the primary key is
    not an auto-incrementing integer, for example when it's a UUID. This change
    makes it possible to override the column used for implicit ordering such
    that +first+ and +last+ will return more predictable results.

    Example:

        class Project < ActiveRecord::Base
          self.implicit_order_column = "created_at"
        end

```

```ruby:rails\activerecord\lib\active_record\model_schema.rb:
      def ordered_relation
        if order_values.empty? && (implicit_order_column || primary_key)
          order(arel_attribute(implicit_order_column || primary_key).asc)
        else
          self
        end
      end
```
【Rails】期間の重複に関するカスタムバリデーション

# はじめに
実務に入ってもうすぐで1ヶ月が経とうとしていますが、巨大なアプリケーションに日々立ち向かったり、与えられた要件を何とか実装する日々を送っています。

今回は実務の中で出てきて勉強になった`期間の重複に関するカスタムバリデーション`について自分の備忘録として書いていきます。

# 前提
- 例として、あるイベントの抽選期間を登録・管理するためのテーブルを作成している場合を想定する。
- 要件としては、抽選期間は被りがないようにしたい場合を想定する。
- 今回の実装はモデル周りだけであり、コントローラやビューは既に実装しているものとする。
- モデル名は`LotteryPeriod`モデルとする。

# 期間の重複検証ロジック
下記リンクで解説されているように、

> 比較開始日付 <= 対象終了日付 AND 比較終了日付 >= 対象開始日付

というとてもシンプルな表現で表せます。

- [日付期間の重複チェック](https://qiita.com/yaju/items/a58a78f41ee41258a5fe)
- [2つの期間が重なり合うかどうかを判定する。](http://koseki.hatenablog.com/entry/20111021/range)

# カスタムバリデーションの作り方
今回は`ActiveModel::EachValidator`を利用した方法で実装していきます。
これはActiveRecord中にデフォルトではないバリデーションを自分で作りたい時などに使う手法です。
そして、何とたったの3ステップで実装できちゃいます。

## 1. カスタムバリデーション用ファイルの作成
```zsh:
% touch app/models/lottery_period_validator.rb
```

## 2. 作成したカスタムバリデーション用ファイルに実装

以下が目的の期間の重複を検証するためのバリデーションです。

今回は`ActiveModel::EachValidator`を利用し、`validate_each`メソッド中に処理を記述していきました。

`validate_each`メソッド中の`record`、`attribute`、`value`はそれぞれ、以下を意味しています。

- `record`：検証対象のモデルオブジェクト(この例では`LotteryPeriod`モデル)
- `attribute`：検証対象のフィールド名(この例では`lottery_period_start_at`や`lottery_period_end_at`など)
- `value`：検証対象の値(例えば、`2019-03-31 14:00 00:00`などの具体的な値のこと)

カスタムバリデーションをより詳細に知りたい方は、[モデルの属性に自作のバリデーションを追加する](http://komaji504.hateblo.jp/entry/2016/05/14/004130)など、先人達が書いてくださった記事が沢山ありますのでそちらをご参考下さい。

```ruby:app/models/lottery_period_validator.rb
# 抽選期間に重複がないかを検証するバリデーター
class LotteryPeriodValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    # 新規登録する期間
    new_start_date = record.lottery_period_start_at
    new_end_date   = record.lottery_period_end_at
    
    return unless new_start_date.present? && new_end_date.present?

     # 重複する期間を検索(編集時は自期間を除いて検索)
    if record.id.present?
      not_own_periods = LotteryPeriod.where('id NOT IN (?) AND lottery_period_start_at <= ? AND lottery_period_end_at >= ?', record.id, new_end_date, new_start_date)
    else
      not_own_periods = LotteryPeriod.where('lottery_period_start_at <= ? AND lottery_period_end_at >= ?', new_end_date, new_start_date)
    end

    record.errors.add(attribute, 'に重複があります') if not_own_periods.present?
  end
end
```

## 3. `LotteryPeriod`モデルの中身に追記

上記で設定したクラス名(上記例では`lottery_period`)を用いて`クラス名: true`と追加してあげるとそのバリデーションファイルを参照して検証が行われるようになります。

```ruby:app/models/lottery_period.rb
 class LotteryPeriod < ActiveRecord::Base
   ・・・
   # lottery_period: true と記述することで上記バリデーションを使えるようになります。
   validates :lottery_period_start_at, lottery_period: true
   validates :lottery_period_end_at,   lottery_period: true
   ・・・
 end
```

# まとめ
- `期間の重複に関するカスタムバリデーション`の自作方法についてまとめた。
- 期間の重複条件はとてもシンプルに書けることを知ることができた。

# 参考URL
- [日付期間の重複チェック](https://qiita.com/yaju/items/a58a78f41ee41258a5fe)
- [2つの期間が重なり合うかどうかを判定する。](http://koseki.hatenablog.com/entry/20111021/range)
- [Railsバリデーションまとめ](https://qiita.com/shunhikita/items/772b81a1cc066e67930e)
C#のフォームアプリからC++のモジュールを呼び出す



必要に迫られてフォームもしくはコンソールアプリからC++のモジュールを呼び出すことになった。
が、今更C++でフォーム(コンソール)を作るのは嫌なのでC#で作ったフォームからC++のモジュールを呼び出すことにした。

まあまあめんどくさかったので以下に残しておく。


１．フォームアプリのプロジェクトを作る(C#)
普通のフォームでOK。
※コンソールアプリでも特段問題無し

２．ライブラリ側のプロジェクトを追加する
・プロジェクトのプロパティで[構成の種類]を[ダイナミックライブラリ(dll)]に変更
・出力ディレクトリを１のアプリのdebugにしておく。
※リリース時にはrelease側にした方がいいと思われる

３．ライブラリ側で以下な感じで記載
ヘッダ

```
// library.h

#pragma once
extern "C"
{
	__declspec(dllexport) void __stdcall Test1();
}
```

ソース

```
// library.cpp
#include <iostream>
#include "library.h"

void __stdcall Test1()
{
	std::cout << "Cの関数が呼び出されました(Test1)" << std::endl;
}
```

４．呼び出し側を記載

＜using＞

```
using System.Runtime.InteropServices;
```


＜使用するクラス内＞

```
[DllImport("CPP_Project1.dll")]
static extern void Test1();
```

＜使用したいタイミングで以下をCALL＞

```
Test1();
```

これで呼び出せる。

引数を渡したい場合、いろいろと気を付ける必要があるが、
とりあえず文字列を渡したいのであれば、こんな感じでできた。

C++側ヘッダ

```
__declspec(dllexport) void __stdcall SendData(const char *t);
```


C++側ソース

```
void __stdcall SendData(const char *t)
{
	std::string _wstr = std::string(t);
	std::cout << _wstr.c_str() << std::endl;
}
```

C#側定義

```
[DllImport("CPP_Project1.dll")]
static extern void SendData(string t);

C#側呼び出し
string[] fields = new string[] { "test1","test2","test3","test4" };
SendData(string.Join(",", fields));
```


参考を見るといろいろ気を付けるべき点が書いてあるが、今回は特定の環境でとりあえず動けばいいので今回は気にしないでおく。
※逆に上記で動かなかったら追記していく。

参考
https://qiita.com/tan-y/items/64711b244cf294d6bb9d
http://nprogram.hatenablog.com/entry/2018/05/16/213033
統計学2 - 統計量

※こちらの記事は"Pythonで学ぶあたらしい統計学の教科書"に基づいて、統計学初学者が頭の整理とアウトプットを目的に掲載している記事です。本の内容のみならず、自分で調べた内容、自分のイメージにマッチした内容を追記している場合もあります。

※今回含めて3回ほどはPythonを使用しません。

## 基本的な統計量
データを集計した値のことを、統計量と呼びます。
標本が得られたら、母集団を推定したい!!! とはすぐに行かず、まずは標本の特徴を分析する必要があります。
特徴を見る方法としては、2つの方法があります。
- 統計量を計算する
- 図示する
この内、統計量を見ていきます。

### 平均値
与えられたデータの総和を、データの個数で割ると算出されます。
$$ \bar{X} = \frac{X_1 + X_2 +････+ X_n}{n} $$
ちなみに、この平均値は相加平均といいます。
その他の平均値については下記リンクに詳細に記載されています。
>[平均値の種類とその使い分けの方法 - 株式会社環境計画研究所](https://www.ries.co.jp/project/topic_point_of_view.html)

### 期待値
統計学においては、平均値のことをしばしば期待値とも呼ばれます。期待値は$\mu$で表されることが多いです。
1回の試行で得られる"全ての結果"と"その結果に対する確率"をかけ合わせて算出されます。
期待値は｢未知のデータであっても適用できる平均値｣という捉え方ができます。
結果が$n$個あるとして期待値を数式で表すと下記のようになります。$P_k$は確率、$X_k$は結果です。
$$ \mu = \sum_{k=1}^nP_kX_k $$
>[期待値 - 統計WEB](https://bellcurve.jp/statistics/course/6349.html)

### 分散
得られたデータが、平均値(期待値)とどれだけ離れているかを表した指標です。
分散という名前からも想像できるように、平均値からの"ちらばり具合"なわけです。
つまり、確率変数の分布が平均値に対してどの程度散らばっているか、ということになります。
分散は下記の式で表されます。
$$ \sigma^2 = \frac{1}{n}\sum_{k=1}^n(X_k - \bar{X})^2   $$
>[分散の意味、分散の求め方 - sci-pursuit.com](https://sci-pursuit.com/math/statistics/variance.html#1)

## コメント
分散ってどういう意味があるんでしょう。
色々考えてみましたが、やはり本質を理解できるのはかなり先のことかもしれない･･･

## その他参考サイト
[統計学における分散と不偏分散 - to-kei.net](https://to-kei.net/basic/glossary/variance/)
[【統計学】初めての「標準偏差」（統計学に挫折しないために） - Qiita](https://qiita.com/kenmatsu4/items/e6c6acb289c02609e619)
音声をテキストに起こす。 Cloud Speech-to-Text API  

自然言語周りがどの程度楽できるのか見たかったので Cloud Speech-to-Text API の動作を確認。

## 1. GCP設定
GCPはプロジェクト作成、API有効化、サービスアカウントキー作成、JSONで取得。

## 2. 音声ファイル用意
適当な音源を用意。

## 3. 動作確認ソース
注意点は音源のサンプリングレート、コーデックを確認すること。確認も変換もVLC使うと楽。
音源取得部分は適宜変更。

```speech2text.py
import base64
import requests
import httplib2

from googleapiclient import discovery
from oauth2client.client import GoogleCredentials

DISCOVERY_URL = ('https://{api}.googleapis.com/$discovery/rest?version={apiVersion}')

def __recognize_speech(content):
    content_base64 = base64.b64encode(content)
    service = __get_service()
    service_request = service.speech().recognize(
        body={
            'audio': {
                'content': content_base64.decode()
            },
            'config': {
                'encoding': 'FLAC',
                'sampleRateHertz': 8000,
                'languageCode': 'ja-JP',
            },
        })
    response = service_request.execute()

    return response

def __get_service():
    credentials = GoogleCredentials.get_application_default().create_scoped(['https://www.googleapis.com/auth/cloud-platform'])
    http = httplib2.Http()
    credentials.authorize(http)

    return discovery.build(
        'speech', 
        'v1p1beta1', 
        http=http, 
        discoveryServiceUrl=DISCOVERY_URL
    )

if __name__ == '__main__':
    audio_url = 'http://127.0.0.1:8080/sample.flac'
    r = requests.get(audio_url)
    resp = __recognize_speech(r.content)
    print(resp['results'])
```

ソースは下記サイトを参考に作成 ※APIに変更があったので変更
https://dev.classmethod.jp/cloud/aws/voice-to-text-with-twilio-and-speech-api/


## 4. 実行
```
$ export GOOGLE_APPLICATION_CREDENTIALS="/path/to/サービスアカウントキー.json"
$ python ./speech2text.py
```

## 5. 実行結果
```
[
	{
		"alternatives": [
			{
				"transcript": "無添加のシャボン玉石鹸ならもう安心天然の保湿成分が含まれるため肌に潤いを与え健やかに保ちますお肌のことでお悩みの方ぜひ1度無添加シャボン玉石鹸をお試しください",
				"confidence": 0.92699486
			}
		],
		"languageCode": "ja-jp"
	},
	{
		"alternatives": [
			{
				"transcript": "お求めは012000559号まで",
				"confidence": 0.9149359
			}
		],
		"languageCode": "ja-jp"
	}
]
```

## 所感
- とても正確にテキスト化出来ている。※音源の発音が良かったので当たり前
- 句読点がないので読みづらい。config に enableAutomaticPunctuation があるが動かなかった。※日本語は未対応なのかな
- クラウドサービス便利すぎて職無くしそう。

## 他
- Cloud Speech-to-Text API利用料金 https://cloud.google.com/speech-to-text/pricing?hl=ja
- VLC https://www.videolan.org/vlc/index.ja.html
AWSでPolkadotノードを立ち上げてValidatorに俺はなる[2/3] Polkadotノードの建て方編

##３部建でお送りします。
###1. [AWSで環境構築](https://qiita.com/MasakiBerlin/items/0d2dd0c07d30a7bc802d#1-aws%E3%81%A7%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)
###2. [ノードを立てる](https://qiita.com/MasakiBerlin/items/1cb4b31106365d33d202)◀︎今回
###3. [Polkadotでアカウント作成 Validatorになる](https://qiita.com/MasakiBerlin/items/9c139ffee38763c2a1e0)


###いよいよここからPolkadotを触っていきます。
まずはここを見て下さい。
https://telemetry.polkadot.io/#/Alexander
今動いているノードが確認できます。世界地図でも表示できるのでかっこいいですよね。
今回はここにあなたのかっこいい名前のノードを建てることをゴールとします。

##やり方
一番手っ取り早くて簡単な方法は最新版のイメージを使うことです。
chevdorのdockerイメージを使います。どれが最新版かは[ここ](https://hub.docker.com/r/chevdor/polkadot/tags)から確認してください。
現状で0.3.21が最新なのでそれでやってみます。最新版で挙動がおかしい場合はバージョンを下げてみてくだい。

１）以下を実行でdockerにイメージがインストールされ、バージョンが確認できます。

~~```terminal:ubuntu@<YourIP>
$ docker run --rm -it polkasource/substrate-alexander:v0.4.1 polkadot --version
```~~

4月４日にPOC0.4に移行したので以下を実行。

```terminal:ubuntu@<YourIP>
$ docker run --rm -it polkasource/substrate-alexander:v0.4.1 polkadot --version
```

２）以下を実行でノードが立ち上がり、同期が始まります。
--chain　チェーンを指定
--name　ノードにつけたいセンスある名前を入力

チェーン名のalexというのはAlexanderplatzのことです。Kurumme Lankeはベルリンのヌーディストビーチです。懐かしい....

```terminal:ubuntu@<YourIP>
$ docker run --rm -it polkasource/substrate-alexander:v0.4.1 polkadot --chain alex --name "masaki-unchained"
```

すると既に上の[Telemetry](https://telemetry.polkadot.io/#/Alexander)であなたのつけた名前のノードが確認できるはずです！

![Screen Shot 2019-03-31 at 13.52.52.png](https://qiita-image-store.s3.amazonaws.com/0/380311/5a54897f-e4f0-bb6b-554f-95c13b4a99ce.png)

3) 名前が気に入ったら早速同期を始めていきましょう。
2019年3月31日時点で700,000近くのブロックが既にあるので3〜4日くらいかかるかもしれません。デーモンを立ち上げてほっときましょう。
`--restart=unless-stopped`　自分で止めないと勝手に再起動
`-d` デーモン立ち上げ。やめるときは`$ docker stop pid`だった気がします。

```terminal:ubuntu@<YourIP>
$ docker run -d -p 30333:30333 -p 9933:9933 -v /<path-to>/polkadot-data:/data polkasource/substrate-alexander:v0.4.1 polkadot --chain alex --name "masaki-unchained"
```

####今回のようにメモリ、CPUが限られたVPSを使っている場合、Polkadotがメモリーを全部使ってしまい、VPSがクラッシュしまうことがあります。以下でリソース制限しましょう。
好きな数字を入れてください。
`--memory="512m" --cpus=".6"`

なんか同期したデータが保存されないって方は`-d /data`をつけて見て下さい。



次はいよいよValidatorになってブロックじゃんじゃん検証していきます！
[次回バリデーターになってブロック検証してみる](https://qiita.com/MasakiBerlin/items/9c139ffee38763c2a1e0)
Resource:
・https://github.com/paritytech/polkadot/blob/master/doc/docker.adoc
Rails　チュートリアル②　

#＜Railsチュートリアル　メモ＞

気づいたことや覚えておきたいことをメモとして残します。


#〜Railsチュートリアル３章より〜
・①：Git
Gitを使う場合は、masterブランチでずっと作業するのではなく、
その都度トピックブランチを作成して作業するのがよい。
Gitでバージョン管理を行っているのであれば、
次のコマンドを実行して、静的なページ用のトピックブランチをチェックアウトしましょう。

```$ git checkout -b static-pages```

コントローラーを作成

```$ rails generate controller StaticPages home help```

変更をしたらこまめにpushする。
StaticPagesコントローラファイルをGitリポジトリに追加してく。

```$ git add -A
$ git commit -m "Add a Static Pages controller"
$ git push -u origin static-pages```

```git push```




・②：元に戻す方法（あ！コントローラ名変えたいなど・・）

一般的に多いのは生成したコードを元に戻したい場合。
（例えばコントローラを生成した後で、もっといいコントローラ名を思い付き、
生成したコードを削除したくなった場合などです。）

Railsはコントローラ以外にも関連ファイルを大量に生成するので、
生成されたコントローラファイルを削除するだけでは元に戻らない。
自動生成されたコードを元に戻すためには、
新規作成されたファイルを削除するだけではなく、
既存のファイルに挿入されたコードも削除する必要がある。

→
このようなときは、「generate」という言葉に因んで、
```rails destroy```というコマンドを実行することで元に戻すことができる。

```$ rails generate controller StaticPages home help
   $ rails destroy  controller StaticPages home help```


次のようにモデルを自動生成。
  ```$ rails generate model User name:string email:string```
モデルの自動生成についても、同様の方法で元に戻すことができます。
  ```$ rails destroy model User```


マイグレーションの変更を元に戻す方法も用意されている。
まず```db:migrate```でデータベースのマイグレーションを変更。

  ```$ rails db:migrate```

元に戻したいときは、```db:rollback```で1つ前の状態に戻す。

  ```$ rails db:rollback```

最初の状態に戻したいときは、```VERSION=0```オプションを使う。

  ```$ rails db:migrate VERSION=0```

マイグレーションは逐次的に実行され、
それぞれのマイグレーションに対してバージョン番号が付与される。
したがって、上記の0を別の数字に置き換えることによって、
指定したバージョンの状態に戻すことができる！