OmniAICreator/Qiita-1.07M huggingface dataset:
DockerだけでRailsプロジェクトを立ち上げる

# 目的
ローカルマシンにRailsをインストールせずに、DockerだけでRailsプロジェクトを簡単に立ち上げること

# Step1: プロジェクト作成用の`docker-compose.yml`の作成
任意の作業ディレクトリでdocker-compose.ymlを作成し以下のように編集

~~~yml
version: '3'
services:
  rails:
    image: ruby:2.5.1 # a
    command: tail -f /dev/null # b
    container_name: rails # c
    volumes:
      - .:/app # d
~~~

a. `rails new`を実行するための環境を備えたimageを指定。今回は公式のruby imageから手動でrailsのインストールをしてRailsプロジェクトを作成していく。あくまでrails newを実行するためのimage。プロジェクト作成後`ruby:2.5.1-alpine`などからDockerfileを自作して必要なモジュールだけインストールしてスリムアップした状態で開発していくことも可能。ただ、プロジェクト作成後にimageを変えてしまうとOSの差異で挙動が変わってしまう恐れがあるので、imageを自作するのであれば自作したimageの上で`rails new`するのが安全

b. コンテナはコマンドの実行が終了してしまうとコンテナ自体も終了しまう。そうなると、コンテナ上でコマンドの実行等ができなくなってしまうため、`tail -f /dev/null`でコマンドの実行状態を保つ

c. コンテナの名前。コンテナに入るときに使う

d. ローカルマシンとDockerコンテナを同期させる。`:`で区切られていて左側が同期したいローカルマシン内のpathで右側が同期したいコンテナ内のpath。今回はコンテナ内の`/app`下で作業する

# Step2: コンテナ内でrailsのインストールし、`rails new`
`docker-compose.yml`があるディレクトリ内で以下のコマンドを実行し、コンテナ内に入る

~~~bash
$ docker exec -it rails /bin/bash
~~~

作業ディレクトリに移動し、`gem install rails`

~~~bash
$ cd /app
$ gem install rails
~~~

`rails new`する(オプションはお好みで)

~~~bash
$ rails new -B -d mysql --skip-test .
$ bundle install --path vendor/bundle --jobs=4
~~~
実行すると同期されているのでローカルマシンに作成されたファイル群が追加される。

# まとめ
gitはローカルマシンで管理しないといけないが、その他の開発はコンテナ内で実行することが可能になる。ローカルマシンにはgitとDockerだけ入れておけば作業が始められる
CentOS7 Nginx php の設定


## yum のアップデート

```bash

$ yum update

```

## PHP7.1

優先順位を決定するパッケージのインストール

```bash

$ yum install yum-priorities

```

標準レポジトリの優先順位を設定

```bash

$ vim /etc/yum.repos.d/CentOS-Base.repo

```

`/etc/yum.repos.d/CentOS-Base.repo` に以下を追記する

```/etc/yum.repos.d/CentOS-Base.repo
[base]
priority=1
exclude=php*
 
[updates]
priority=1
exclude=php*
 
[extras]
priority=1
exclude=php*
```

### epelレポジトリのインストール

```bash

$ yum install epel-release

```

### epelレポジトリの優先順位の設定

```bash

$ vim /etc/yum.repos.d/epel.repo

```

`/etc/yum.repos.d/epel.repo` に以下を追記する

```/etc/yum.repos.d/epel.repo

[epel]
priority=2
exclude=php*

```

### remiレポジトリのインストール

```bash

$ yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

```

### remiレポジトリの優先順位を設定

```bash

$ vim /etc/yum.repos.d/remi.repo

```

`/etc/yum.repos.d/remi.repo` に以下を追記する

```/etc/yum.repos.d/remi.repo

[remi]
priority=2

```

### remiレポジトリの優先順位を設定

```bash

$ vim /etc/yum.repos.d/remi-php71.repo

```

`/etc/yum.repos.d/remi-php71.repo` に以下を追記する

```/etc/yum.repos.d/remi-php71.repo

[remi-php71]
enabled=1

```

### 念のため　yum のキャッシュを削除する

```bash

$ yum clean all

```

### PHP7.1 のインストール

```bash

$ yum install php php-cli php-common php-devel php-fpm php-gd php-mbstring php-pdo php-pear php-pecl-apcu php-soap php-xml php-xmlrpc php-mcrypt

```

PHPの起動

```bash

$ systemctl start php-fpm.service

```

サーバー再起動時PHPを自動起動するように設定

```bash

$ systemctl enable php-fpm

```

php のバージョンの確認

```bash

$ php -v
PHP 7.1.10 (cli) (built: Sep 27 2017 08:27:18) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
```

### /etc/php-fpm.d/www.conf内のuserとgroupをnginxに変更

```bash

$ vim /etc/php-fpm.d/www.conf

```

```/etc/php-fpm.d/www.conf

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = apache ← nginxに変更
; RPM: Keep a group allowed to write in log dir.
group = apache ← nginxに変更

```

PHPを再起動

```bash

$ systemctl restart php-fpm

```
CentOS7 WordPress Nignx


## 前提
以下をインストール済み

| 項目 | Version |
|:-----------|------------:|
| MySQL | 5.7 |
| Nginx | 1.10.2 |
| PHP   | 7.1.10 |


## yumのアップデート

```bash

$ yum update

```

## WordPress用にMySQLのユーザーを追加する

### MySQLにログイン

```bash

# mysql -u root -p

```

### MySQLでユーザーを追加

```mysql

mysql> CREATE DATABASE wp;
mysql> GRANT ALL PRIVILEGES ON wp.* to wp@localhost identified by 'パスワード'
mysql>  flush privileges;

```

## WordPressのインストール

```bash

# wget https://ja.wordpress.org/latest-ja.tar.gz

```

解凍する

```bash

# tar xvzf latest-ja.tar.gz

```

wordpressディレクトリを指定のディレクトリへ移動

```bash

# mv wordpress /var/www/html

```

### WordPress 設定ファイルを編集

```bash

# cd /var/www/html/wordpress
# cp wp-config-sample.php wp-config.php
# vim wp-config.php

```

```wp-config.php
/** The name of the database for WordPress */
define('DB_NAME', 'database_name_here');
/* ここにデータベース名 */

/** MySQL database username */
define('DB_USER', 'username_here');

/* ここにユーザー名 */

/** MySQL database password */
define('DB_PASSWORD', 'password_here');
/* ここにパスワード */

/** MySQL hostname */
define('DB_HOST', 'localhost');
/* ここにDBのホストを */

```
apacheとMySQLをdockerで動かす


# How to use
## 環境構築
以下でdockerダウンロードすればおkです． macはdockerとdocker-composeが一緒になってるのであまり気にする必要はありません．
	https://www.docker.com/docker-mac

## 最初の導入時
以下のコマンドを行うことでイメージの作成ができる

```bash/zsh
git clone git@bitbucket.org:POL_TEAM/docker_for_labbase.git
cd docker_for_local
docker-compose -f docker-compose-dev.yml build
```

## DBの設置場所

```
setting_docker/mysql/init/
```

にxxxxxxxxx.sqlを置いておく． dockerコンテナ内で勝手にそれを実行してくれる．

## コンテナを起動する

```bash/zsh
$ docker-compose -f docker-compose-dev.yml up -d
```

## コンテナの停止

```bash/zsh
$ docker-compse -f docker-compose-dev.yml stop
```
VPCとサブネット

# 概要
VPCとサブネットはどちらもネットワークを表します（ここでネットワークとはお互いに通信可能なサーバーの集合を表す）.
なので両方共CIDR表記を用いて定義できます.

## CIDR表記
CIDR表記とは、IPアドレスの範囲を表すもので、```10.10.1.0/16```というようなもので、```IPv4アドレス/二桁の数字```という形式を取ります.
```10.10.1.0/16```は```10.10.1.0~10.10.255.255```のIPアドレス範囲を意味します.
これを理解するにはまず前半部のIPv4```10.10.1.0```を2進数に変換します.
```10.10.1.0/16```を2進数に変換すると、
```00001010.00001010.00000001.00000000```と全部で32桁となります.
スラッシュ部の16が何を示しているかというと
「10.10.1.0から始まる上から**16**桁分が同じIPアドレス」
というふうにIPアドレスの集合の大きさを決めています.

（例）
- ```10.10.1.0/25``` :  ```10.10.1.0 ~ 10.10.1.127```
- ```10.10.1.128/25``` :  ```10.10.1.128 ~ 10.10.1.255```

# VPCとサブネットの違い
VPCとサブネットの違いは、「VPCの中にサブネットが存在する」という関係にすぎません.

またVPCはアベイラビリティーゾーンを超えて作成できますが、サブネットはアベイラビリティーゾーンを超えることができません.

## VPC及びサブネットの作り方
https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Scenario2.html
GitHub.com/GitHub Enterprise両方でhubコマンドを使う(ghq+direnv)

最近数年ぶりに[hub](https://github.com/github/hub)を使っている。
以前使っていた時から扱うGitHubリポジトリ数が数倍に増えた今は便利だなーと思う。

で、勤務先ではGitHub Enterpriseを使っているので「hubコマンドをGitHubとGitHub Enterprise両方で使いたい！」という欲求を満たすことにした。

hubコマンドに加えてお世話になるのは以下。

- ghq: https://github.com/motemen/ghq
- direnv: https://github.com/direnv/direnv

ディレクトリツリーは `ghq` にお任せしているのでこのようになる。

```shell
$ tree -L 2 .
(ghq root)
├── com.mazgi
│   └── Untitled.mov
├── github.com
│   ├── mazgi
│   ├── mazgi-sandbox
│   └── sbtenv
└── github-enterprise.example.com
    ├── AI
    ├── hidenori-matsuki
    └── mazgi
```

そして `$(ghq root)/github-enterprise.example.com/.envrc` で次のように `$GITHUB_HOST` をexportする。
see: https://hub.github.com/hub.1.html

```shell-session
cat $(ghq root)/github-enterprise.example.com/.envrc
# vim: set filetype=bash
export GITHUB_HOST="github-enterprise.example.com"
```

これでhubコマンドがGitHub.com/GitHub Enterprise両方とも参照できるようになった。
at coder beginner 021　幅優先探索応用

A
正整数 N と、 2 の累乗数 1,2,4,8 があります。
これらのうち、 同じ 2 の累乗数をいくつ使っても良い ので、それらの和が N となるような組み合わせを 1 つ求めてください。 組み合わせが複数考えられる場合は、そのうちのどれを出力しても構いません。 
例えば N=5 のとき、5=1+2+2 となることから 1 つの組み合わせとして 1,2,2 が考えられます。

```
#include<iostream>
using namespace std;
int main() {
	int N;
	cin >> N;
	cout << N << endl;
	while (N > 0) {
		cout << 1 << endl;
		N--;
	}
	return 0;
}
```
これで通ってしまったけどなんか問題完全に無視してる感ある。


B
あなたと高橋君は、AtCoder 王国に住んでいます。AtCoder 王国には、N 個の町と、町同士を結ぶ何本かの道路が存在し、道路は双方向に移動可能です。 N 個の町はそれぞれ 町 1,町 2,…,町 N と呼ばれています。
高橋君はあなたの家に遊びに行くことにしました。そして、高橋君は町 a から出発して、ちょうど K 回 AtCoder 王国のどこかの町を経由して町 b にあるあなたの家に到着しました。
高橋君は町 a から町 b まで最短経路で移動してきたと主張していますが、あなたには彼が嘘をついているよう思えます。 しかし、あなたは具体的に町同士を結ぶ道路がどのような構成になっているか全く知らないため、高橋君が辿った経路が本当に最短経路なのかどうか判定できません。
あなたは高橋君がどの順番で町を経由したかを聞き出すことに成功しました。ただし、この情報には出発/到着地点である町 a と町 b が含まれません。
あなたはこの情報を元に、高橋君が最短経路で移動していた可能性があるかどうかを出力するプログラムを書くことにしました。 町 a から町 b への最短経路とは、町 a から町 b への移動経路において道路を通る回数が最小となるような経路のことを言います。
高橋君が辿った経路が最短経路となるような町と道路の構成が 1 つでも存在する場合、最短経路で移動した可能性があると言えます。一方、そのような構成がない場合、その可能性は無いと言えます。
ようするに、スタートからゴールまでなにも被らなきゃいいってこと。

```
#include<iostream>
using namespace std;
int main() {
	int N;
	int a, b;
	int K;
	int p[110];
	cin >> N;
	cin >> a >> b;
	cin >> K;
	for (int i = 0; i < K; ++i) {
		cin >> p[i];
	}
	bool can = true;
	p[K] = a;
	p[K + 1] = b;
	for (int i = 0; i < K+1; ++i) {
		for (int j = i + 1; j < K+2; ++j) {
			if (p[i] == p[j])
				can = false;
		}
	}
	if (can)cout << "YES"<<endl;
	else cout << "NO" << endl;
	return 0;
}
```
これで通った。

C

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<queue>
using ll = long long;
#define rep(i,n) for(int i=0;i<n;++i)
using namespace std;
const int INF = 1e9, mod = 1e9 + 7;
int main() {
	int N, a, b, M;
	cin >> N >> a >> b >> M;
	a--; b--;
	vector<int>G[110];
	int dist[110];//dist[i]:=aからの最短距離
	ll cnt[110];//cnt[i]:=aからiまで最短距離で来る個数
	for (int i = 0; i < M; ++i) {
		int x, y;
		cin >> x>> y;
		x--; y--;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	for (int i = 0; i < N; ++i) {
		dist[i] = INF;
		cnt[i] = 0;
	}
	queue<int>q;
	q.push(a);
	dist[a] = 0; cnt[a] = 1;
	while (!q.empty()) {
		int u = q.front(); q.pop();
		if (u == b)break;
		for (auto v : G[u]) {
			if (dist[v] == INF) {
				dist[v] = dist[u] + 1;
				(cnt[v] += cnt[u]) %= mod;
				q.push(v);
			}
			else if (dist[v] == dist[u] + 1) {
				(cnt[v] += cnt[u]) %= mod;
			}
		}
	}
	cout << cnt[b] % mod << endl;
	return 0;
}
```
初めてのアプリ制作 ~カレンダー~ ②

##cocoapodsのインストール

ここまでいったらあとは難しくない
私も調べ調べして、この:point_down_tone2:やり方でやった:information_desk_person_tone1:

[cocoapodsのインストールの仕方](https://qiita.com/ShinokiRyosei/items/3090290cb72434852460)

私はこのやり方で出来た！:high_brightness:

<font color="MediumVioletRed">ようやくカレンダーをいじれるぞ〜！！</font>

###月曜始まりにする###

左上の9個アイコンがあるところの中で検索:mag:を選ぶ
"firstweekday"で検索すると
FSCalendar.mの中に
_firstWeekday = 0;　という文があるから
この0を1に変更！

これで月曜始まりに:clap_tone1:

###曜日の色を変える###

また検索:mag:のところで
"FSCalendarStandardTitleTextColor"
と検索
そしたらRGB値を好きな色に変えたらオッケ！:ok_hand_tone2:

**ちなみに**
FSCalendarStandardSelectionColor:point_right_tone2:選択した日のマーク色
FSCalendarStandardMonthColor:point_right_tone2:月の色
FSCalendarStandardTodayColor:point_right_tone2:今日の日付のマーク色
FSCalendarStandardTitleTextColor:point_right_tone2:上記の通り曜日の色
ですよ！
[SeleniumWebdriver][Ruby] waitを入れてみる

#SeleniumWebdriverでWaitを入れてみる
例えば、画面上に名前やメールアドレスを登録し、
登録内容と入力内容が間違っていないことを確認する時、
登録ボタンをクリックしてから画面に反映されるまで多少時間がかかることがありますね。
そんな時にwaitを入れずに確認しようとすると、Seleniumさんは要素が見つからないと発狂します。
なので、waitを考慮する必要があります。

##sleep
1番手っ取り早いのは指定した秒数だけ待つというもの。
以下の例の場合、10秒待ちます。
・対象の要素が表示されるのに、2、3秒しかかからなかった。
・対象の要素が表示されるのに、20秒かかった。
こういった時、歯がゆさを感じます。


```
sleep 10
```

##wait.until
事前にタイマーを設け、対象の要素が指定した状態になるまで待つというものです。多用してます。
以下の例は、タイマーを60秒設定して、その間に要素が表示される（要素が見えなくなる）まで待ち、変化があったらタイマーを中断し、次の処理に移行します。

```
# $waitに60秒のタイマーを持たせる
$wait = Selenium::WebDriver::Wait.new(:timeout => 60)

# 要素が表示されるのを60秒待つ
$wait.until{driver.find_element(:id,'OK_btn').displayed?}
# 要素が表示されなくなるのを60秒待つ
$wait.until{!driver.find_element(:id,'OK_btn').displayed?}
```
ちょっと細かく解説すると、
.displayed? は対象の要素が表示されているか否かを確認してくれます。
表示されていれば "true"、表示されていなければ "false" を返します。
これをwait.untilと組み合わせることで、.displayed? の結果が "true" になるか、60秒経過するまで待ってくれます。
60秒経過した場合は Timeout になるので、適宜処理を追加して fail としてカウントできますね。

wait に「$」をつけているのはグローバル変数として扱う為です。
グローバル変数にすることで、タイマーの設定が1ヶ所でもいろんなところから呼び出せるので便利です。

##begin-rescue
wait というよりは、例外処理ですね。
例外処理なので、fail としてカウントさせることも出来ます。
以下の例では、OKボタンがクリック出来るまでリトライし続けます。
つまり、OKボタンがクリック出来なかったらそこで次元の狭間に取り込まれる事になりますので、rescue からの脱出ルートが必要になります。

```
begin
    driver.find_element(:id,'ok_btn').click
rescue
    retry
end
```

##その他
for や while などのループを設けてその中で処理することも可能です。
Selenium を触り始めた初期の頃にこんな感じの組んでモジュール化してましたが、
wait.until を知ってしまってからは使わなくてなりました。

```
timer = 0;
while timer <= 60 do
    if(driver.find_element(:id,'ok_btn').displayed?=="true" then
       driver.find_element(:id,'ok_btn').click
       break
    else
        timer += 1 ;
    end
end
```


##まとめ
個人的には wait.until でほぼほぼ賄えそうですが、終了条件さえきちんと設定すれば begin-rescue も便利だと思います。
とは言えこれらは私が良く使用する(使用した)ものなので、他にももっと便利なものがあるかもしれません。
と言うか、既出感凄いのでまぁ復習程度でしょうかね。
npm で electron を導入する際のエラー ( Ubuntu 18.04 )

npm で electron を Ubuntu18.04 にインストールする際にエラーが出たのでその対処法をメモ程度にまとめます。

まず、npm 及び node のバージョンは次のとおりです。

```bash
$ npm -v
6.4.1
$ node -V
v10.10.0
```
npm、node の導入には "[とりあえず Ubuntu で新しい Node.js, npm をインストール](https://qiita.com/kerupani129/items/60ee8c8becc2fe9f0d28)" を参考にさせていただきました。

次のコマンドで electron をインストールしようとしたところ、以下のようなエラーが出力されました。

```bash
$ sudo npm -g install electron
/usr/local/bin/electron -> /usr/local/lib/node_modules/electron/cli.js

> electron@2.0.9 postinstall /usr/local/lib/node_modules/electron
> node install.js

/usr/local/lib/node_modules/electron/install.js:54
  throw err
  ^

Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/electron/dist'
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! electron@2.0.9 postinstall: `node install.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the electron@2.0.9 postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/tmurakami/.npm/_logs/2018-09-18T10_10_46_444Z-debug.log
```
調べたところ次のコマンドで electron をインストールすることが出来ました ( オプション --allow-root なしでもインストールは可能でした)。

```bash
sudo npm -g install electron --unsafe-perm=true --allow-root
```

問題の解決に当たって、次のページを参考にしました。
[Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/electron/.electron' #17268](https://github.com/npm/npm/issues/17268)
はじめてなElixir(7) なぜElixirにしたのかを振り返る

ようやくそもそもやりたかったIoTに突入します。
先週末の無限リスト遊び [はじめてなElixir(6)](https://qiita.com/kikuyuta/items/1aa99c2e2afe93b80283) は脱線しすぎました。

注：
2019.02.16
この記事をベースに [Elixir を使うようになった経緯 〜電力システム制御の現場から〜](https://qiita.com/kikuyuta/items/96c3f91a850e9274b0e9) という記事を書きました。こちらもご参照ください。

# 背景
次に行く前に自分のやりたいことを整理しておきます。

## なぜElixirか
仕事で制御モノを作ったのですが、まあ今どきですから、マシンの観測データをクラウドに打ち上げたり、ネット側で操作したらマシンに伝わってよろしく動いたり止まったりするようにしたかったです。

そういうのを作ろうとしましたけど、普通機械ものを制御するのはPLC (programmable logic control)なコンピュータを使います。ただこれリレー制御の延長上にあって、PLCやらリレーやらのその向こうにクラウドはないなと。クラウドと相性の良い設計思想が必要です。そこで、まずは Python を使ってみたのです。私が書いたんじゃなくてパートナー会社さんに書いてもらいました。が、Python だと Native な平行プログラミングの概念がありません。ちょっと微妙な制御システムになりました。

次のステップとして、Python じゃなくて Node.js を検討していました。ところが、現場でデバッグしているのを見ると、スクリプトで作ると走ってからバグが見つかるケースが多々あることに気づきます。こりゃインタプリタ前提の言語じゃなくてコンパイラ、それも型チェックとかで走らせる前に一定のチェックができる環境が良いだろうなと。

次の言語を検討しました。
- Go lang
- Haskell
- Rust
- Erlang
話すとかなり長いので、詳細は別途にしますが、結論としては Elixir になりました。Erlang は「記述が記号的すぎてちょっとなぁ…」というところでした。Elixirは、Erlangにチョイと皮をかぶせたぐらいなもんかなと思ってスルーしてたんですが、ガッツリ言語として組まれているのが好感触です。

あとは #fukuoka.ex に行ってみて、今どきのICTのエコシステムというか、エンジニアの置かれてる環境ってのがもう自分の知ってる過去のものとは全く違っているのに感銘を受けたのが大きいです。ああ、今は社会がこうやって成長していくのかと。その一部になれれば楽しいだろうなと思いました。

## 無限リストと遅延評価
なぜ無限リストで遊んだかと言うと、遅延評価を組み合わせて楽しく遊べるのが一つ。もう一つは、入出力の概念と相性が良いかなと思ってるからです。入出力は関数名に!をつけたりして副作用があり得ることの注意喚起をします。単発のI/Oと思うと副作用になりますが、これが無限の入力/出力があるけど今はたまたまその途中の時刻にいるだと思えば、無限リストをLazyにエバってるのと同じ状態と言っても良いだろうなと。

関数型言語の世界を「そもそも時間の概念がない世界で、空間の一部が評価されて行って、最後に欲しかった値が得られる」ようなものだとします。すると評価という概念が時間軸を関数型言語に導入できる手法とも思えます。するってえと、入出力のような時間軸にそって値が変わるものも関数型言語できちんと扱える… かもしれません。

そんなことができて何が嬉しいかというと、例えば型の概念にハマれば入出力も含めて型検査でバグを見つけてもらえる… とかにつながるかなとか思ってます。

# マイルストーン
遊んで楽しいだけじゃなくて、仕事にしていくという文脈がありますので、こういう風に進めようかなと思ってます。
1. Elixir で入出力モジュールを書いてみる
    - 1台の PC（わたしの Macbook air）で入出力をするモジュールを書いてみる
2. いくつかの入出力モジュールから/へのやりとりをする本体モジュールを書いてみる
    - 入出力のモジュールは並行して動くプロセスとする
    - 簡単なもので構わない。
    - これも1台のPCの中で済ます。
3. 入出力モジュールの一部を別PCで動かす
    - センサモジュールがIP的に別であるような状況を仮定して
4. 本体モジュールの計算も一部を別PCに飛ばす
    - CPU の能力が足りなくなった時を想定
5. 作ろうとしているシステム全体の入出力を模倣するような構成で作ってみる
6. ラズパイとかで動くものか試してみる

## 状態マシン(state machine)をどう扱うか
かなり気になってるのが、現在運用中のシステムの設計が状態遷移図で記載されいてることです。これは思いっきり関数型言語パラダイムと相容れません。そこをどう解決できるのかわかってません。

関数型**リアクティブ**プログラミングって概念があるようなので書籍を調達してみました。
[関数型リアクティブプログラミング](https://www.amazon.co.jp/dp/4798145564/)
これ先頭の方で「状態遷移はいかん！」って書いてはあるのですが、本文中にダイレクトにそれを解決するような文章が見当たらないです。全部読むには大変分厚く、これ読んで解法を見つけるよりは、Elixir触りながらあれこれ考える方が早いかなと思ってます。

でも、適当な解法が見つからなかったら "Help!" を叫びますので、そのときはみなさん、どうぞ助けてください。よろしくおねがいします。

# 参考文献
[関数型リアクティブプログラミング](https://www.amazon.co.jp/dp/4798145564/)
Angular6でソート機能、ページング機能付きの表(テーブル)を作成したいと考えている開発者向けのサンプル

# _Ng6UdmMockMatConsumer_ Angular6でソート機能、ページング機能付きの表(テーブル)を作成したいと考えている開発者向けのサンプル
[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)


_Ng6UdmMockMatConsumer_ は、Angular6においてソート機能、ページング機能付きの表(テーブル)を実現しようと考えている開発者向けのサンプルです。

_フルソースコード_,
<https://github.com/Ohtsu/ng6-udm-mock-mat-consumer>

_ビデオ解説 (日本語)_,
<https://youtu.be/AsVctVk0Hxk>

_ビデオ解説 (英語)_,
<https://youtu.be/qt6TsDoQR7g>


## 概要 
   - _Ng6UdmMockMatConsumer_ は表(テーブル)作成のサンプルであり、Angular6におけるAngular Materialに依存しています。

   - _Ng6UdmMockMatConsumer_ は、mat-table, mat-paginator, mat-sort などを利用しています。

   - _Ng6UdmMockMatConsumer_ は、JsonPlaceholderサイトにアクセスするためのng6-udm-mock（ver3.0.2）サービスライブラリを利用しています。
  

## 稼働環境

   - node.js
   - Typescript2
   - Angular6
   - Angular Material
   - ng6-udm-mock


## インストール

以下のように、Gitからクローンを作成します。

```bash
$ git clone https://github.com/Ohtsu/ng6-udm-mock-mat-consumer.git 
```

次に生成されたng6-udm-mock-mat-consumerディレクトリに入り、以下のようにインストールを行います。

```bash
$ npm install 
```

## 起動

コマンドラインで以下のようにローカルサーバを起動すると、JsonPlaceholderサイトのコメントデータを取得し、各列ごとのソート機能、ページング機能並びにページ内表示行数の設定機能を付加した表が表示されます。


```bash
$ ng serve -o
```

  - ***初期画面*** 

  <img src="https://raw.githubusercontent.com/Ohtsu/images/master/ng6-material/TableSort01.png" width= "640" >



## バージョン

   - Ng6UdmMockMatConsumer      : 0.1.0
   - Angular6                   : 6.0.3
   - TypeScript                 : 2.7.2
   - @angular/material          : 6.4.7
   - ng6-udm-mock          	: 3.0.2



## 参考

- "Schematics", 
<https://material.angular.io/guide/schematics>

- "JsonPlaceholder", 
<https://jsonplaceholder.typicode.com/>

- "Angular 5, Angular 6 Custom Library: Step-by-step guide", 
<https://www.udemy.com/angular5-custom-library-the-definitive-step-by-step-guide/>

- "Angular 5, Angular 6用 カスタムライブラリの作成: 完全ステップ・バイ・ステップ・ガイド", 
<https://www.udemy.com/angular5-l/>

- "ng6-udm-mock Angular6 Service Library to use JsonPlaceholder and json-server", 
<https://www.npmjs.com/package/ng6-udm-mock>

- "Reactive Programming with RxJS 5: Untangle Your Asynchronous JavaScript Code", 2018/2/15,Sergi Mansilla
<https://www.amazon.co.jp/Reactive-Programming-RxJS-Asynchronous-JavaScript/dp/1680502476/ref=sr_1_7?ie=UTF8&qid=1537063252&sr=8-7&keywords=reactive+programming>

- "Angular Material Data Table: A Complete Example", Angular University
<https://blog.angular-university.io/angular-material-data-table/>

- "Angular 5 Data Table Example(Pagination+Sorting+Filtering)", 2018/01, Dhiraj Ray
<https://blog.angular-university.io/angular-material-data-table/>




## 変更履歴

  - 2018.9.18 version 0.1 uploaded 

## 著作権

copyright 2018 by Shuichi Ohtsu (DigiPub Japan)


## License

MIT © [Shuichi Ohtsu](ohtsu@digipub-net.com)
at coder beginner 020

B
2 つの正整数 A, B が与えられます。 A の十進表記の右に B の十進表記（先頭に 0 を付けない）を連結して得られる整数を 2 倍したものを出力してください。

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	string a, b;
	cin >> a >> b;
	int x = stoi(a + b);
	cout << 2 * x << endl;
	return 0;
}
```
stoiという文字列を数字に変換できるやつがあるらしい。便利やな。

```
STS mvn installエラー

#開発環境
- Windows10 64bit
- Java8
- Spring5
- Maven 3.5.4
- Spring Tool Suite Version: 3.9.5

[コマンドプロンプト編のエラー](https://qiita.com/iGlobo/items/8ee3594cf24357421c61)

#mvn installエラー
STSでpon.xmlを選択した状態で緑色の「実行」ボタンの黒い↓から「Maven install」を実行すると以下のエラーが出力する。

```Console:STSConsole
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.804 s
[INFO] Finished at: 2018-09-18Txx:xx:xx+09:00
[INFO] ------------------------------------------------------------------------
```

もう一度、「Maven install」を実行すると自動でダウンロードが始まり、ビルド成功した。
コマンドプロンプトと同様のエラーなのでJDKのパス関連だと思った。

```Console:STSConsole
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.093 s
[INFO] Finished at: 2018-09-18Txx:xx:xx+09:00
[INFO] ------------------------------------------------------------------------
```

もし、また同じエラーでダメだった場合は「設定」→「Java」→「インストール済みのJRE」を設定しようとした。
![STS_インストール済みのJRE.png](https://qiita-image-store.s3.amazonaws.com/0/289168/59530aea-69cd-1464-84f9-5f216cc2b627.png)
これも試す可能性もあった。
パッケージエクスプローラーの「JREシステム・ライブラリー」を右クリックし、「プロパティ」を選択する。
JRE システム・ライブラリーのプロパティー画面が開くので「ワークスペースのデフォルト JRE (jre1.8.x)」を選択し、「適用して閉じる」ボタンをクリックする。
![プロジェクトプロパティ_JRE.png](https://qiita-image-store.s3.amazonaws.com/0/289168/f397f137-0657-077a-e144-3761739c7fb9.png)




以上、「いいね」ボタンをよろしくお願いします。
使えるかもしれないbashのイディオム

bashのシェルスクリプトで使えるかもしれないイディオムをまとめてみました
個人的には結構便利に使えています
bash以外のシェルでは動作確認してません


## 絶対パスの取得
realpathの代わりに
シンボリックリンクは展開されない点は注意

```sh
abs_path=$(cd $(dirname $my_path); echo $PWD/$(basename $my_path))
```

## まとめてリダイレクト
サブシェルにすればまとめてリダイレクトできる

```sh
(
  echo hoge
  echo fuga
) >> log.txt
```

## if
bashのifはコマンドのexit codeが0かそれ以外かで分岐する文
`if [ "a" == "b" ]` は`[`というコマンドに`"a" == "b" ]`という引数を渡して実行してそのexit codeで分岐する
当然`[`コマンド以外も渡せる

```sh
if diff -q a.txt b.txt > /dev/null ; then
  echo a.txtとb.txtは同じ
else
  echo a.txtとb.txtは違う
fi
```

## ガード
ifでも出来るが１行でかけるのが魅力

```sh
test "$(id -u)" != "1" || echo user is root
test "$(id -u)" == "1" && echo user is root
```

## ３項演算子
他言語でいう `a ? b : c`
`||`と`&&`の組み合わせで実現できる

```sh
test "$(id -u)" == "1" && echo user is root || echo user is non-root
```

## die
メッセージを表示してexitするだけのfunction
ガードとあわせるとエラーチェックがすっきりする

```sh

function die(){
  echo $@ >&2
  exit 1
}

test "$1" == ""        && die 引数が指定されていません
test "$(id -u)" != "1" && die rootで実行してください
```


## split
setコマンドを使って位置パラメータに代入(上書きされるので注意)

```sh

line="a b c"
set $line

echo $1 # a
echo $2 # b
echo $3 # c
```

## self-documentation
自分自身のコメント行をgrepしてドキュメントやヘルプにする
定義と実装が近くなるのがよい気がする
Makefileとかでよく使ってました

```sh
# @doc hoge [-abcd] <file>
function __hoge(){
  echo do hogehoge
}

# @doc fuga [-xyz]
function __hoge(){
  echo do fugafuga
}

# @doc help
function __help(){
  echo usage:
  grep -e '^# @doc' $0 | cut -c7- | xargs -i echo $(basename $0) {}
}

cmd=$1
shift
case $cmd in
  hoge) __hoge $@ ;;
  fuga) __fuga $@ ;;
  help) __help $@ ;;
esac
```

## trap
trapを使うとシグナルを受信したときや終了時にコマンドを実行できる
`finally`的に使える
SSHのセッションが切れてHUPしたときや`Ctrl-C`で終了された場合も実行されるので安心

```sh
function __clean(){
# 後処理(一時ファイルの削除など)
}

trap __clean EXIT INT QUIT TERM HUP
```
（僕にとって）はじめてのSpring Cloud Pipelines

Spring界隈以外の人にはおそらく馴染みの薄い（失礼）、Spring Cloud Pipilinesについてざっくり紹介する。

## なあに？

* CI/CDパイプラインを作るためのフレームワークのようなもの
  - CI/CDツールそのものでないので、それらは別途用意する必要がある
* デプロイ先としてKubernetes（K8S）、CloudFoundry（CF）に対応
* CI/CDツールとしてJenkins、Concourseに対応

## 公式サイト

* [ドキュメント](https://cloud.spring.io/spring-cloud-pipelines/)
* [GitHub](https://github.com/spring-cloud/spring-cloud-pipelines)

## 前提知識

* **わりと必須**
  - CI/CDツール（Jenkins等）の基本的な仕組み
     - 無いと、Spring Cloud Pipelinesの機能なのかCI/CDツールの機能なのか判断しづらい
  - bashの文法
     - わりとシェル芸が激しいので、知らないと何が起きてるのか良く分からない
  - K8SやCFのコマンド
     - kubectlとか
* **あるとうれしい**
  - groovyの文法
      - サンプルを眺めてるうちになんとかなりそう
  - Dockerの基本的な知識
      - Jenkinsのイメージ起動はstart.shで行うので直接的には不要
      - イメージのカスタマイズ時にDockerfileやdocker-compose.ymlの編集をするときに必要

## 用語定義

* パイプラインジョブ
  - アプリケーションのCI/CDを実行するジョブ
* シードジョブ
  - ジョブを作るジョブ。ここではパイプラインジョブを作るジョブとする
* Jenkinsfile
  - CI/CDのパイプライン定義をgroovy形式で記述するファイル。CI/CDのコア部分


## スクリプトファイルの種類

処理はgroovyファイル、Jenkinsfile、bashファイルに記載する。
以下は、Jenkins＋CF環境の例（①、②はどの環境でも共通）
（）内は、ファイルのあるディレクトリ

* **①init.groovy（jenkins/seed）**
  - Jenkins初期化に呼び出される
* **②jenkins_pipeline.groovy（jenkins/seed）**
   - シードジョブ定義を記載する
   - シードジョブ実行時にパイプラインジョブを複数作る場合、ビルドパラメータにgitのurlをカンマ区切りで指定する
* **③jenkins_pipeline_jenkinsfile_sample.groovy（jenkins/jobs）**
  - パイプラインジョブ定義を記載する
  - Jenkinsfileを指定する
* **④Jenkinsfile-sample（jenkins/declarative-pipeline）**
  - パイプラインジョブ定義を記載する
  - ビルドやデプロイを行うシェルスクリプトをここから呼び出す
* **⑤pipeline.sh（common/src/main/bash）**
  - 環境に応じたビルドやデプロイコマンドを記載する

## 処理の流れ

* **パイプラインジョブの作成**
  - Jenkins起動時にシードジョブを生成する（①→②を呼び出し）
  - JenkinsのWeb画面でシードジョブを実行する
    - ③と④の定義が参照され、パイプラインジョブが生成される
  - JenkinsのWeb画面でパイプラインジョブを実行する
    - ④に定義されたシェルスクリプトが呼び出され、ビルドやデプロイ、テストが実行される

## いけてるところ

* **Jenkinsの構築が楽**
  - 設定済みのDockerfileとdocker-compose.ymlが提供されてる
* **パイプラインジョブが一発で作れる**
  - 画面でポチポチしなくていいのは楽
* **Jenkinsおじさん化の抑止**
  - まがりなりにもテンプレ化・構造化されてるので、方言ができづらい
  - とはいえ、Jenkinsおじさんが完全に駆逐されるとも思えないが...

## いけてないところ

* **K8S、CF以外の環境にデプロイしようとするととたんに難易度が上がる**
  - できなくはないが、修正ポイントが増えてしまう
      - groovyファイル、Jenkinsfile、bashファイルそれぞれに手が入ることになる
  - そこまでするとフレームワークとしてのSpring Cloud Pipelinesの利点が減る
  - そもそもデプロイはSpinnakerあたりにまかせたほうがいいのでは
      - 連携できそうな雰囲気はするが、怪しい...
* **カスタマイズの具体的な方法が提示されていない**
  - そもそもK8S、CF以外向けにカスタマイズする想定はなさそう
* **シェル芸が激しくてつらい**
  - 実際の処理（ビルドとかデプロイ）を実行しているbashの中身がごちゃごちゃで可読性が低い
  - 結局、bashに渡す変数の取り回しのために、groovyファイルの記述も煩雑になってしまっている
* **日本語情報が少ない**
  - ググっても出てこない（皆無？）

## おわりに

* 調査・検証時にK8SやCFをつかわずEC2にDockerコンテナで無理やりデプロイしたので、真価をまだ見極められてない
  - ほんとうはEKSが使えたら使いたかった
* しかし、「Spring Cloud ほにゃらら」シリーズは何でもあるな（追いきれません）
🔰HTML/CSS, classの命名規則 ~ちび記法~


この"ちび記法"命名規則を守ると得られるメリット

- 比較的命名に迷わなくてよい
- 上書きされて "いつの間にか変わってる!"現象がない
- 形容詞を用いるので自然言語に近く可読性が高い
- 形容詞を用いるのでhtmlを見るだけでどんなcssや機能が当てられているかが想像つく

## 命名規則 ~ちび記法~

```html
<div class="flyableBox-closed">
  <div class="flyableBox--head-backgroundColorIsWhite">...</div>
  <div class="flyableBox--body-risableUp-byHover flyableBox--body-risableUp-byClick">...</div>
</div>
```

- UIの要素を体現している名前は長くて良い（上書きされないため） `flyableBox--item, flyableBox--item-closed`
- 汎用的な名前にする（bootstrapに掲載していいくらいの）
  - x: プロダクト名FlyableApple
  - o: flyableApple
- 繋ぎ:
  - 子孫 `--` （特別な理由がない限り、3つ以上繋げる必要はない。A>B>C なら `A--C` でよい）
  - 形容詞 `-` （形容詞を用いるということは、すなわち"主語"のスタイルを拡張しているということである）
  - 関係代名詞 `-` `is`
     - 関係代名詞とは？: "背景が白のBOX" のように `"xxxxがooooな" という形容` が `主語` を修飾する品詞。形容詞と同じくらい日常頻繁に使われている品詞。 "背景が白のBOX" を英語にすると "the box that background color is white"(thatは省略できる)。
     - 関係代名詞を用いる 例: `box-backgroundColorIsWhite`
     - 関係代名詞は主語を形容するので形容詞扱いとする(= `-`を用いる )。すると拡張しやすい。
- 複数の形容詞を持たせたい場合は分ける
  - x: `box-risableUp-byHover-byClick`
  - o: `box-risableUp-byHover`, `box-risableUp-byClick`
  - こうすることでどんなcssや機能が当てられているかが想像つく
- 拡張元セレクタと併記しない。冗長だから
  - x: `class="box-risableUp box-risableUp-byHover"`
  - o: `class="box-risableUp-byHover"`
  - これを実現するために、sassをつかってextendしておきたい
- Aを拡張したB、Bを拡張したCなら `A-B-C` とする
  - 例: `box-risableUp-byHover`

命名以外のルール:

- コンテキスト（イレギュラーなmarginなど）により、2こくらいのプロパティを拡張したい(or打ち消したい)場合:
  - 下記aを併記して使用する
- 未来永劫変化しないプロパティをもつセレクタの名前は短くて良い mt-3, bootstrapなど (*a)
- cssセレクタなのにビジネス層の名前から命名しない
  - x: `box-toDisplayData` （この場合は"data"）

## 早見表

```
- 繋ぎ:
  - 子孫 `--` （特別な理由がない限り、3つ以上繋げる必要はない。A>B>C なら `A--C` でよい）
  - 形容詞 `-` （形容詞を用いるということは、すなわちセレクタAのスタイルを拡張しているということである）
  - イコール `Is`（必ず形容詞扱いとする apple-priceIsTwenty "値段が20のリンゴ"）
```

## 例

```html
<!-- 水平に動かすためのツマミ -->
<div class="knob-toMove-horizontally">...</div>

<!-- フェードインされるbox -->
<div class="box-toBeFadedIn">...</div>

<!-- フェードインしているbox -->
<div class="box-fadingIn">...</div>

<!-- フェードインされたbox -->
<div class="box-fadedIn">...</div>

<!-- 挿入されるbox -->
<div class="box-toBeInserted">...</div>

<!-- displayがnoneであるbox -->
<div class="box-displayIsNone">...</div>

<!-- displayがnoneになるbox -->
<div class="box-toBeDisplayIsNone">...</div>

<!-- transitionでopacityが0になるbox -->
<div class="box-toBeOpacityIs0-withTransition">...</div>

<!-- clickでopacityが0になるbox -->
<div class="box-toBeOpacityIs0-byClick">...</div>

```
C++ - . vs :: vs ->

Strong and simple answer.

* ClassName::FieldName : class public static field and methods
* ClassInstance.FieldName : accessing a public field (or method) through class reference
* ClassPointer->FieldName : accessing a public field (or method) dereferencing a class pointer

https://stackoverflow.com/questions/11902791/what-is-the-difference-between-and-in-c?noredirect=1&lq=1
https://stackoverflow.com/questions/4984600/when-do-i-use-a-dot-arrow-or-double-colon-to-refer-to-members-of-a-class-in-c
【メモ】mysqldumpしたデータを別環境でトランザクションを張って流すときのtips

MySQLにあるデータをdumpしたファイルを、別環境でトランザクションを張ってからdumpしようとした時にハマったメモ

### 環境情報
- innoDB
- MySQL5.6.37

### 最終的なdumpのコマンド
```shell
mysqldump db table1 --add-locks=false --disable-keys=false -t --where 'id > 1' > file.sql
mysqldump db table2 --add-locks=false --disable-keys=false -t --where 'id > 1' >> file.sql
sed -i 'begin;' file.sql #fileにトランザクションを書く
echo echo 'commit;' >> file.sql 
```

### mysqldumpオプション解説1
```shell
--add-locks=false
```
これがないとdumpファイルにLOCK TABLESが出力されるので外す。

```sql
LOCK TABLES `table1` WRITE;
INSERT INTO table1 VALUES(....)
UNLOCK TABLES;
```
LOCK TABLEが暗黙的にコミットしてしまうので除外。
https://dev.mysql.com/doc/refman/5.6/ja/lock-tables.html


### mysqldumpオプション解説2
```shell
--disable-keys=false
```
これがないと `DISABLE KEYS` が出力されるので外す。

```sql
/*!40000 ALTER TABLE `table1` DISABLE KEYS */;
INSERT INTO table1 VALUES(....)
/*!40000 ALTER TABLE `table1` ENABLE KEYS */;
```
 `ALTER TABLE` が暗黙的にコミットしてしまうので除外。あと、 `/*!40000 */;` はコメントアウトじゃなく、バージョンが4以上ならばコマンドを流すという意味。
https://dev.mysql.com/doc/refman/5.6/ja/implicit-commit.html

## 感想
暗黙的なコミットが怖い。
String#split(String regex, int limit) 第二引数の動作仕様覚え書き

javaで文字列をある特定の区切り文字で分割したいケースでよく使うsplitですが、第二引数の動作仕様を毎回忘れてしまうので備忘録としてメモします。

Java SE7, 8, 9でいづれも同じ動作仕様のようです。

## String#split(String regex, int limit)の動き
入力文字列```"あ,い,う,え,お,,"```に対してカンマ文字を区切りで分割したい場合を考えます。

####第二引数limit指定なしの場合
```java
String data = "あ,い,う,え,お,,";
String[] splited = data.split(",");
for(int i=0; i<splited.length; i++) {
    System.out.println("[" + i + "]" + splited[i]);
}
```
実行結果は
```
[0]あ
[1]い
[2]う
[3]え
[4]お
```
⇒最後の空文字は無視されます。

####第二引数limitに -1 を指定した場合
```java
String data = "あ,い,う,え,お,,";
String[] splited = data.split(",", -1);
```
実行結果は
```
[0]あ
[1]い
[2]う
[3]え
[4]お
[5]
[6]
```
⇒最後の空文字も分割対象となります。

####第二引数limitに 0 を指定した場合
```java
String data = "あ,い,う,え,お,,";
String[] splited = data.split(",", 0);
```
実行結果は
```
[0]あ
[1]い
[2]う
[3]え
[4]お
```
⇒引数指定なしと同じ結果です（デフォルトのlimit値が0）。

####第二引数limitに 1 を指定した場合
```java
String data = "あ,い,う,え,お,,";
String[] splited = data.split(",", 1);
```
実行結果は
```
[0]あ,い,う,え,お,,
```
⇒１つに分割ということで分割されません。


####第二引数limitに 2 を指定した場合
```java
String data = "あ,い,う,え,お,,";
String[] splited = data.split(",", 2);
```
実行結果は
```
[0]あ
[1]い,う,え,お,,
```
⇒２つに分割されます。

####第二引数limitに 3 を指定した場合
```java
String data = "あ,い,う,え,お,,";
String[] splited = data.split(",", 3);
```
実行結果は
```
[0]あ
[1]い
[2]う,え,お,,
```
⇒３つに分割されます。

####第二引数limitに 7 を指定した場合
```java
String data = "あ,い,う,え,お,,";
String[] splited = data.split(",", 7);
```
実行結果は
```
[0]あ
[1]い
[2]う
[3]え
[4]お
[5]
[6]
```
⇒７つに分割されます。※空も分割対象


####第二引数limitに 8以上 を指定した場合
```java
String data = "あ,い,う,え,お,,";
String[] splited = data.split(",", 8);
```
実行結果は
```
[0]あ
[1]い
[2]う
[3]え
[4]お
[5]
[6]
```
⇒特にエラーなく７つに分割されます。





以上。
C++ - std::string vs std::basic_string

* std::basic_string is a class template for making strings out of character types
* std::string is a typedef for a specialization of that class template for char
* std::string is an instantiation of std::basic_string<T>

https://stackoverflow.com/questions/1662107/whats-the-difference-between-stdstring-and-stdbasic-string-and-why-are-bot
GOAの生成するコードちょっと変くない？

どうも、お久しぶり。
えいやです。

GOA（v1.4.0）の生成するコードでちょっとおかしいんじゃないのかなー？というのがあったので共有します。

## goagenがビルドが通らないコードを吐くケース

具体的には、

1. 必須じゃない要素を使うと、ポインタ型と値型の対応が逆になっているのか、ビルドエラー
2. ArrayOfを使うと、コードの生成が中途半端で終わってビルドエラー

１では、strConv.Itoa()に*int型を突っ込もうとしたり、*stringを[]byteいキャストしようとしたりして型違反エラー。
２では、定義したけど使っていない変数がでてきて静的チェック違反。

発生するエラーメッセージは以下のようなもの

```
# github.com/aya-eiya/goa-test/apps/app
apps/app/controllers.go:72:2: rawArrs declared and not used
# github.com/aya-eiya/goa-test/apps/client
apps/client/my_resorce.go:63:28: cannot use payload.IntVal (type *int) as type int in argument to strconv.Itoa
```

実際のコードを含むプロジェクトの例を以下に置いときます。

https://github.com/aya-eiya/goa-test

当該問題について、Issueを報告し、PRを投げています。

PRでは2つの問題のうち、片方、ポインタ型の問題を解決しています。

PRの取り込みが遅いようなら、もう一つの問題も解消して一つにまとめておこうかと思います。

https://github.com/goadesign/goa/pull/1863

※ Masterに取り込まれました。
React Nativeで日本語と英語が混ざるとlineHeightが垂直にずれる問題

# React Nativeで日本語と英語が混ざるとlineHeightが垂直にずれる

公式ではマージされていませんが、以下のようなプルリクがありました。

RCTTextShadowView.mの115行目を以下のように変更します。

```swift:node_modules/react-native/Libraries/Text/Text/RCTTextShadowView.m
// CGFloat baseLineOffset = maximumLineHeight / 2.0 - font.lineHeight / 2.0;
CGFloat baseLineOffset = maximumLineHeight / 2.0 - font.pointSize / 2.0;
```

公式でマージされていないのでこれで本当に大丈夫かはわかりませんが、ひとまず治りました。

これ以外にも色々なプルリクがありました。ネイティブわからないので何してるのかは全く判ってません。影響出たらすみません。
https://github.com/facebook/react-native/pull/19653
Pythonで作るGUIアプリ with kivy 導入編

# はじめに
本記事、および後に続く一連の記事は、Pythonでデスクトップアプリ/スマホアプリを作りたい人に向け、PythonのGUIフレームワークの１つである__kivy__の考え方・始め方・使い方について解説した記事になります。

[kivy公式](https://kivy.org/#home)
[日本語のドキュメント](https://pyky.github.io/kivy-doc-ja/)

今回はその第一弾として、早速kivyでのプログラミングに入る前に、「なぜkivyを使うか」という視点で、アプリを作る上で考えておくべき諸項目について簡単にまとめておきたいと思います。

# アプリ・言語・フレームワークについて
## なぜネイティブアプリか
一言で「アプリ」と言っても、実際は「ネイティブアプリ」と「Webアプリ」の２種類が存在します。そしてこれから解説しようとしているkivyは、いわゆる「ネイティブアプリ」を作るためのフレームワークとなります。

[[1]Webアプリとネイティブアプリの違いとは](https://yapp.li/magazine/2093/)
[[2]ネイティブアプリとwebアプリはどちらを使うべきか](https://orange-operation.jp/posrejihikaku/business-app/11556.html)

補足として、デスクトップアプリに限れば、Dockerのような仕組みを使ってWebサーバごと配布・インストールしてしまえば、所謂「Webアプリ」をインターネットなしに使うことも可能といえば可能です。

いずれにせよ、これから作ろうとしているアプリケーションの提供形態として「ネイティブアプリ」という形が本当にベストなのか、作り始める前に一度整理おくと良いかと思います。


## なぜPythonか
Pythonが素晴らしいプログラミング言語であることは間違い無いのですが、そのデメリットとして最も頻繁に挙げられる「処理の遅さ」は、今回のGUIアプリ製作のような「重くなりがち」なプログラムを作る際には常につきまとってくる課題です。

Pythonの多くのライブラリ同様、kivy自体にも処理の高速化のために様々な工夫がなされており、簡単な画面であれば問題なく動作するのですが、画面上の部品を何百・何千の単位で一度に操作しようとすると、どうしても動作の遅さが気になり始めます。アプリの規模(?)がどんどん強大化し、次第に「苦労してでもC++で書いていたらもっとキビキビ動いたはずなのになぁ」と頻繁に後悔するようなことにもしなれば、それはとても悲しいことです。

またネイティブアプリの商用配布を考えたとき、プログラムのコードを暗号化・難読化の必要がある場合も多いです。普段、機械学習やWebのバックエンド等でPythonを使っている方々には馴染みがないかもしれませんが、Pythonの暗号化や難読化は、もちろん不可能ではありませんが、ちょっと一手間かかるという事も、頭に留めておいて損はありません。

改めて、Pythonを使うことよる開発の簡便さ・組み込んで使えるライブラリの豊富さが、本当に出来上がったアプリの起動・挙動の遅さを補って余りあるものなのか、一度考えてみることも大切だと思います。


## なぜkivyか
PythonのGUIフレームワークには、他にもいくつかの選択肢があります。

[[1]【わかりやすく解説】PythonのGUIライブラリを比較10選 おすすめはどれ？](https://hajipro.com/python/python-gui-best)
[[2]【Python】GUIライブラリの比較・おすすめ](https://algorithm.joho.info/programming/python/gui-library-py/)

各記事にある通り、kivyは今も(2018年9月時点)人気と勢いのあるGUIフレームワークであることは間違いないです。日本語の文献が少ないのも、次第と解消されていくでしょう。

ただ、これら記事で書かれておらず、私がkivyを使っていて最も苦労したのが、__「日本語入力ができない」__という点です。

正確には、方法が無いわけではないですが、機能がだいぶ制限されているか、割りと手間がかかりバグが出やすい方法になります。

乱暴な言い方をしてしまえば、GUIの構成要素なんてのは

- 文字や画像を表示するための”ラベル”
- 何かを操作するための”ボタン”
- 何かを入力するための”フォーム”

の３つが約９割を占めます。そのうちの１つに作り方・使い方に制限があるのは、割りと致命的なように思います。そしてこの問題は、公式の対応を見る限り、もうしばらくの間は解消されないでしょう。

とはいえ繰り返しになりますが、方法が全く無いわけではないですし、私が取った方法(別のGUIフレームワークの部品を流用する)も一応ありますので、それについては後ほどご紹介します。


## ここまでのまとめ
長くなりましたので一度まとめます。ここまでだいぶネガティブな内容ばかりを挙げてしまいましたが、私自身はkivyが大好きです。それ故に、こうしたネガティブな側面を敢えて先に紹介することで、「せっかく勉強したのに、せっかく作ったのに、○○ができないせいで全部ムダになった！」といった不幸を減らしたいと考えております。

さて、ここまでのポイントをまとめると

- ネイティブアプリならではのメリット/デメリットを考慮する必要がある
- 本当に大規模なアプリは挙動が重い
- 日本語入力には少々手間がかかる

です。これらを考慮すると、

- ネット環境やブラウザなどが無い端末にも手軽に配りたいアプリ
- (画面的な意味で)割りと小規模なアプリ
- Pythonの強み(開発の楽さ、豊富なライブラリ)を活かせるアプリ
- 日本語入力の必要が少ないアプリ

のようなアプリであれば、本当の意味でkivyを使う価値があるのではないかと私は考えています。



# 最後に
ここまでお付き合い頂きありがとうございました。
最後に、kivyの素晴らしさについて簡単にご紹介します。

以後の記事にて詳しく紹介しますが、kivyには、kivy語と呼ばれる、開発を簡単にするための非常に独特な機構を有しております。この機構は、画面上の構成要素を、ある意味レゴブロックのように「積み上げる・組み立てる」ことを可能にします。

これにより、HTML等のコードと比較しても、部品同士の位置関係が非常に解りやすく、レイアウト変更、色やサイズの微調整が非常に簡単です。また「積み上がったブロックのような画面構成」という仕様から、要素にIDをつけたりブロックの親関係・子関係を辿ることでの「任意の部品へのアクセス」が非常に簡単で、『このボタンを押したら○○と××の色を赤くしたい』のような処理が一切の苦労なく記述出来ます。それによって、簡単なアプリであればものの５分とかからずに完成します。

...とまぁ、文字で説明してもあまり説得力がないと思いますので、次回以降、手を動かしながら実感していただければと思います。


---
「導入編」は以上になります。

次回から、基礎編を進めていきたいと思います。
ありがとうございました。
PythonからMySQLへの接続でcaching_sha2_passwordのエラーが出た場合

Pythonを使ってMySQLへ接続しようとしたら、認証方式のエラーで拒否されたので対策しました。

バージョン：

mysql  Ver 8.0.12 for osx10.13 on x86_64 (Homebrew)caching_sha2_passwordのエラー


## エラーの原因は認証方式

Pythonから接続しようして表示されたエラーは次のようなものです。

```
Traceback (most recent call last):

...略...

_mysql_connector.MySQLInterfaceError: Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/Users/sato/miniconda3/lib/plugin/caching_sha2_password.so, 2): image not found

During handling of the above exception, another exception occurred:
...略...
```

Authentication plugin 'caching_sha2_password' cannot be loaded: 

ということなので認証方式「caching_sha2_password」にエラーがあるらしい。



「caching_sha2_password」はMySQL 8.0からサポートされた認証方式で、デフォルトになっています。

しかし、Pythonから接続するドライバが対応していない。

そこで、pythonが対応している従来の認証方式「mysql_native_password」に変更することにしました。

## MySQLで特定のユーザだけ認証方式を変更する

MySQLにルートでログインして、ユーザごとにどの認証を使っているか表示してみます。

```
mysql> select user, plugin from user;
+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | caching_sha2_password |
| sato             | caching_sha2_password |
+------------------+-----------------------+
5 rows in set (0.00 sec)
```

ユーザ名「sato」からのみPythonに接続できればいいので変更するのはユーザ「sato」だけ、rootはそのままにします。



次のコマンドで変更しました。

```
mysql> alter user 'sato'@'localhost' identified WITH mysql_native_password by 'パスワード';
```



反映されたか確認。

```
mysql> select user, plugin from user;
+------------------+-----------------------+
| user             | plugin                |
+------------------+-----------------------+
| mysql.infoschema | caching_sha2_password |
| mysql.session    | caching_sha2_password |
| mysql.sys        | caching_sha2_password |
| root             | caching_sha2_password |
| sato             | mysql_native_password |
+------------------+-----------------------+
5 rows in set (0.00 sec)
```



これで、Pythonから接続できるようになりました。
Unity+VRTKで物を掴んで拡大縮小

Unity+VRTKで、配置したオブジェクトを掴んでふりまわしたり、拡大縮小する為の方法をまとめました。
簡単な3D Model Viewerならこれだけで作れます(モデルを動的に読みこむことはできませんが…)。

使ったバージョン：

* Unity 2018.2.8f1
* VRTK 3.2.1

## VRTKを使えるようにするまで
1. 新しくプロジェクトを作る
2. VRTKをAsset Storeからインポートする  
環境に応じてOculus IntegrationやSteamVR Plugin等もインポートしましょう。
3. `VRTK_MaterialColorSwapHighlighter.cs`でエラーが出る

```
Assets/VRTK/Scripts/Interactions/Highlighters/VRTK_MaterialColorSwapHighlighter.cs(146,66): error CS1540: Cannot access protected member `UnityEngine.Texture.Texture()' via a qualifier of type `UnityEngine.Texture'. The qualifier must be of type `VRTK.Highlighters.VRTK_MaterialColorSwapHighlighter' or derived from it
```
~~よくわかっていませんが、とりあえず以下のようにエラーが出ている行(146行目)をコメントアウトすればOKです：~~
https://github.com/thestonefox/VRTK/issues/1758 によれば、エラーが出ている行(146行目)を、
```VRTK_MaterialColorSwapHighlighter.cs
if (resetMainTexture && material.HasProperty("_MainTex"))
{
  renderer.material.SetTexture("_MainTex", new Texture2D(0,0));
}
```
とすればいいそうです。
これでVRTKが使えるようになります。
試しに`VRTK/Examples`以下にあるSceneを読み込んで実行してみましょう。

## 物を掴めるようにするまで
以下はちょっと手抜きして、`VRTK/Examples`以下にあるSceneをコピーして利用することにします。
既に作ってあるSceneで対応したい場合は、Scene全体をコピーするのではなく、`[VRTK_SDKManager]`や`[VRTK_Scripts]`などをコピーすれば動くと思います(←適当)。

1. `VRTK/Examples/043_Controller_SecondaryControllerActions`というシーンを開く
2. Sceneを別名で保存する(`File`→`Save Scene as...`を選ぶ)
3. 掴みたいオブジェクトを配置する  
まだ移動はできないので、手が届くところ(原点の近く)に配置する必要があります。[^1]  
[^1]: ここで余計なオブジェクトは削除していいですが、参考にする為にしばらく残しておいた方がいいかもしれません。

4. オブジェクトにColliderを追加  
(既にある場合は飛ばしてよい) オブジェクトを選択して、`Inspector`の`Add Component`から、オブジェクトの形状に応じて適当なColliderを選んで追加し、設定する
5. VRTK_InteractableObjectを追加  
同様に`Add Component`から、`VRTK_InteractableObject`(`VRTK/Scripts/Interactions`にある。検索した方が早いかも)を選んで追加し、`Is Grabbable`にチェックを入れる
6. 重力や慣性の影響を受けて欲しくない場合は、`Add Component`から`Rigidbody`を追加して以下のように設定：
    1. `Use Gravity`のチェックを外す(重力の影響を受けない)
    2. `Is Kinematic`にチェックを入れる(慣性の法則に従わない)

これでコントローラのグリップボタンで掴めるようになります。

## 両手で掴んで拡大縮小
拡大縮小もしたい場合は、上に加えて以下の設定をします。

1. オブジェクトに上と同様、`Add Component`から以下を追加：
    * `VRTK_ChildOfControllerGrabAttach` (`VRTK/Scripts/Interactions/Grab Attach Mechanics/`にある)
        * `VRTK_FixedJointGrabAttach` など他にも類似のものがあるので、状況に応じて使い分ける必要があるかも
    * `VRTK_AxisScaleGrabAction` (`VRTK/Scripts/Interactions/Secondary Controller Grab Actions/`にある)
2. `VRTK_Interactable Object`の`Grab Attach Mechanic Script`と`Secondary Grab Action Script`をオブジェクト自身に設定
3. `VRTK_Axis Scale Grab Action`の`Uniform Scaling`にチェックを入れる
4. `VRTK_Child Of Controller Grab Attach`の`Precision Grab`にチェックを入れると，物体のつかんだ場所を把握してより正確な動作ができるようになる

## おまけ：テレポート

1. 編集しているSceneを保存してから、`VRTK/Examples/004_CameraRig_BasicTeleport`を開く
2. `[VRTK_Scripts]`の`PlayArea`を選択してコピーする
3. 編集していたSceneを再度開き、`[VRTK_Scripts]`以下にペーストする  
(上下移動などもしたい場合は`VRTK/Examples`の他のSceneを参考にしてください)
4. `[VRTK_Scripts]`の`LeftController`と`RightController`に`VRTK_Pointer`、`VRTK_Bazier Pointer Renderer` (または `VRTK_Straight Pointer Renderer`) の 2 つを追加
5. `VRTK_Pointer`の`Pointer Renderer`を自分自身 (`LeftController`または`RightController`) に設定

これでスティックやトラックパッドを押しこむとポインタが表示され、離すとその時指していた場所にテレポートできるようになります。
初めてのアプリ制作 ~カレンダー~ ①

#前提として

私はswiftの知識が全くなかったので
progateでswiftの勉強を軽くしました。
[progateはここから:writing_hand_tone2:](https://prog-8.com/)

あとはやりながらしていけばいいかな、という軽い気持ちです。

よし、頑張ろう！！:fist_tone2::fist_tone2:

#じゃあ、作り始めよう
###:baby_tone2:必要なファイル(FSCalendar)の追加

まずはxcodeの起動
creat a new Xcode projectを選ぶ
<img width="418" alt="スクリーンショット 2018-08-17 18.10.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/281759/ee77c3e1-6f13-2588-712c-93d60a575a9e.png">
Single View Appで名前(calendar)を入れる
<img width="133" alt="スクリーンショット 2018-08-17 18.09.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/281759/d972578c-62c0-3121-ebf2-9322658f3759.png">

調べたところ、
cocoapodsというもののインストールをすると楽そうなのでまずはインストール
[cocoapodsはここから:writing_hand_tone2:](https://cocoapods.org/app)

うわー！
始める前のセットアップから難しかった！！
よし、メモしておこう:pencil2:

ここから少し長いから覚悟が必要:muscle_tone1:

##まず、FSCalendarを導入する

FSCalendarを導入するために
cocoapodsをインストールするんだけど

どこにも一番最初は
ターミナルに
*'sudo gem install cocoapods'*
って書けって書いてあるんだけど
**わたしのはどうしてもエラーが出る**:joy::joy:

どこにもその対処法が書いてないからもう調べに調べた:keyboard:

色々色々色々調べてようやくわかった:blush:

**rubyが最新版になってない**から
cocoapodsがインストールできないみたい

##てことで、rubyを最新版にしていきましょう
ターミナルを開いてやっていきます

:one:https://brew.sh/index_ja.html\
からスクリプトをコピーしてhomebrewをインストール

:two:*'brew doctor'*
で[Your system is ready to brew.]が出たらオッケー

でもわたしはここでエラーが出た
多分色んなエラーが出ると思うけど、わたしのは「xcodeを最新版にしてください」ってやつだった

ので
app storeからxcodeの最新版をアップデート

アップデートが終わったからまた②に戻る

:three:*'brew install rbenv'*
でrbenvをインストール

:four:*'git pull'*

:five:*'rbenv install 2.5.0'*
これでrubyの最新版をインストールする
2.5.0のところは自分で最新版を確認してください

:six:*'rbenv versions'*
で
system (set by /Users/ayane/.rbenv/version)
2.5.0
って出てくる

:seven:*'rbenv global'*
で
system
って出てくる

:eight:*'rbenv versions'*
で
system
2.5.0 (set by /Users/ayane/.rbenv/version)
って出てきて

:nine:*'rbenv global'*
で
2.5.0
って出てきて

:ten:*'ruby --version'*
でようやく
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16]

キターーーーーー
ようやくわたしはrubyを最新版にできましたよ
ようやく
どんだけ時間かかったか笑

てことで
次、cocoapodsをインストールします
at coder beginner 019

A
高橋くんは自分の年齢を忘れてしまいました。
ひとまず 3 人の友達を集めることに成功したので、その 3 人が予想する高橋くんの年齢の中央値を、高橋くんの年齢として代用することにしました。
高橋くんに代わって 3 つの整数 a,b,c から中央値を求めるプログラムを書いてください。
3 つの整数の中央値とは、それらを小さい順に並べて中央に位置する整数のことです。

```
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
	int a, b, c;
	cin >> a >> b >> c;
	vector<int>R = { a,b,c };
	sort(R.begin(),R.end());
	cout << R[1] << endl;
	return 0;
}
```

B
高橋くんはある文字列 s を持っています。文字列を短く表現することに興味のある高橋くんは、以下の圧縮方法を試してみることにしました。
文字列 s を同じ文字が連続する文字列に分割します。（分割）
分割された各文字列を、文字と、その文字が連続する長さをつなげた新たな文字列に変換します。（変換）
最後に、変換した各文字列を前から順に結合します。（結合）
aabbbaad という文字列に上記の圧縮方法を適用すると
aabbbaad を aa bbb aa d に分割
aa bbb aa d を、それぞれ a2 b3 a2 d1 に変換
a2 b3 a2 d1 を a2b3a2d1 と結合
以上より、a2b3a2d1 を得ることができます。
あなたには文字列 s が与えられるので、上記の方法で圧縮された文字列を求めるプログラムを、高橋くんの代わりに書いてください。

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	string s;
	cin >> s;
	int n=0;
		for (int j = 0; j < s.size(); ++j) {
			if (s[j] == s[j + 1]) {
				n++;
			}
			else {
				cout << s[j] << n + 1;
				n = 0;
			}
		}
        cout << endl;
	return 0;
}
```
matplotlibで3次元プロットする際に3軸のスケールを揃える

※[stackoverflow](https://stackoverflow.com/questions/13685386/matplotlib-equal-unit-length-with-equal-aspect-ratio-z-axis-is-not-equal-to)より意訳


matplotlibでグラフを書くときに各軸のスケールを揃えたいことがあると思います．2次元グラフの場合は以下のように設定すればいいです．

```python
import matplotlib.pyplot as plt
fig = plt.figure()
ax = add_subplot(111)
ax.set_aspect('equal')
```

しかし，3次元プロットだとそうはいかないんです．実際にやってみましょう．

```python
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.set_aspect('equal')

X = np.random.rand(100)*10+5
Y = np.random.rand(100)*5+2.5
Z = np.random.rand(100)*50+25

ax.scatter(X,Y,Z)
plt.show()
```
実行結果はこんな感じ
![aspect_equal.png](https://qiita-image-store.s3.amazonaws.com/0/241529/fcf5bf2c-ec54-4ab9-c6db-bd841481e280.png)

自動的にスケーリングされてしまいます．

これを避けるためには，`plt.show()`をする前に次のような処理を追加するといいです．

```python
max_range = np.array([X.max()-X.min(), Y.max()-Y.min(), Z.max()-Z.min()]).max() * 0.5

mid_x = (X.max()+X.min()) * 0.5
mid_y = (Y.max()+Y.min()) * 0.5
mid_z = (Z.max()+Z.min()) * 0.5
ax.set_xlim(mid_x - max_range, mid_x + max_range)
ax.set_ylim(mid_y - max_range, mid_y + max_range)
ax.set_zlim(mid_z - max_range, mid_z + max_range)
```
要するに，各軸でど真ん中の値を求めた後，各軸を同じ幅で表示すればいいです．実行結果はこうなります．
![aspect_equal.png](https://qiita-image-store.s3.amazonaws.com/0/241529/2ee6e2fe-1ea5-d4d2-a89d-96d3f834c87e.png)

無事にできました．実行前と実行後じゃ印象が大違いですね...グラフはちゃんとスケールまで見ないとダメですね（脱線）．

# 追記（2018年10月12日）
`mid_x,mid_y,mid_z`を求める式を修正しました．参照元の[stackoverflow](https://stackoverflow.com/questions/13685386/matplotlib-equal-unit-length-with-equal-aspect-ratio-z-axis-is-not-equal-to)は間違えたままなのでご注意ください．

# さらに追記（2019年5月24日）
`mid_x,mid_y,mid_z`を求める式を再修正しました．参照元の[stackoverflow](https://stackoverflow.com/questions/13685386/matplotlib-equal-unit-length-with-equal-aspect-ratio-z-axis-is-not-equal-to)は正しいです．ネットに嘘を流してしまい大変申し訳ありませんでした．
React Native Android 版の Debug ビルドにバンドルを埋め込む

React Native アプリの開発時は、起動するたびに Metro Bundler から bundle ファイルをロードしますが、デバッグ版でもリリース版と同様に、bundle ファイルを apk に組み込んだ状態でビルドする方法です。ちょっと古めですが、以下は React Native 0.53.3　で試した情報です。

# 方法
eject 済みであることが前提になります。

## build.gradle の修正
- プロジェクトの ./android/app/build.gradle の `project.ext.react` に `bundleInDebug: true` を追加します。
- さらに開発モードも無効化（`__dev__ = false` にする[^1]）なら、`devDisabledInDebug: true` を追加します。

```gradle:./android/app/build.gradle

project.ext.react = [
    entryFile: "index.js",
    bundleInDebug: true,
    devDisabledInDebug: true,
]

apply from: "../../node_modules/react-native/react.gradle"
```

`buildIn〜` や `devDisabledIn〜` の `〜` 部は、実際はフレーバー名とビルドタイプを指定するものです。詳しくは[build.gradle のコメント欄](https://github.com/facebook/react-native/blob/master/local-cli/templates/HelloWorld/android/app/build.gradle#L21-L41)参照。

## gradle.properties の修正
[Configure On Demand](http://gradle.monochromeroad.com/docs/userguide/build_environment.html) が有効だと、バンドルファイルが埋め込まれないことがあるようです。
ので、gradle.properties で明示的に設定をオフにします。

```properties:gradle.properties
org.gradle.configureondemand=false
```

## ビルド
bundleInDebug の true / false を切り替えたときは、クリーンビルドしないと反映されないことがありました。以下は gradle デーモンも停止し、ビルド結果もすべて削除してからクリーンビルドしています。

```shell
$ ./gradlew --stop
$ rm -rf ./app/build
$ ./gradlew clean & ./gradlew assembleDebug
```

[^1]: 端末を振ると出てくる開発者メニューの無効化にはなりません。開発者メニューも無効にする場合は、build.gradle の buildTypes の debug バリアントで `debuggable` を `false` にします。