OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10でPython，Pipenvを使えるようにする

## はじめに
Windows 10に開発環境を映したときにPythonの構築に苦しめられたので書き残しです．
WindowsでPythonを始める方の手助けになればとも・・・

##構築環境
- Windows 10 Home
- Python 3.7.5

## Python，Pipの準備
- [Pythonの公式](https://www.python.org/downloads/windows/)からPythonのインストーラーをダウンロードしてきます．
    - ex. ```Download Windows x86-64 executable installer``` これが個人的におすすめです．
- インストーラーを実行してPythonをインストールしましょう．
    - この時のインストール場所のパスをどこかに記録しておいてください（メモ帳とか)
    
![スクリーンショット (1)-1-1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182036/8fd7e0be-9890-a376-fe3e-d6c5df1a1106.png)
    - 私の場合なら，　```C:\\Users\hagan\AppData\Local\Programs\Python\Python37```　ですね．[*1](https://qiita.com/Haaamaaaaa/items/a2852ed0b3e0b7c4d1ab#%E8%A3%9C%E8%B6%B3)
    - Users\\[username]は適宜読み替えてください[*2](https://qiita.com/Haaamaaaaa/items/a2852ed0b3e0b7c4d1ab#%E8%A3%9C%E8%B6%B3)

- Pythonの実行ファイル(Python.exe)にパスを通します[*3](https://qiita.com/Haaamaaaaa/items/a2852ed0b3e0b7c4d1ab#%E8%A3%9C%E8%B6%B3)
    - システム環境変数を開きましょう[*4](https://qiita.com/Haaamaaaaa/items/a2852ed0b3e0b7c4d1ab#%E8%A3%9C%E8%B6%B3)
    - なぜか ```システムのプロパティ``` が開くので枠の右下にある ```環境変数(N)...``` を左クリックします．
    - ```環境変数``` の画面上側にある，```[username]のユーザー環境変数(U) ``` の変数に```Path```があるので```Path```をダブルクリックして環境変数名の編集を表示してください．
    - ```新規```を押して，先ほどメモしておいたパスを登録してください．
    - ex.  ```C:\\Users\hagan\AppData\Local\Programs\Python\Python37```
- pipも使えるように実行ファイル(pip.exe)にパスを通します．
    - ex. ```C:\\Users\hagan\AppData\Local\Programs\Python\Python37\Scripts```
- これでPowerShellでpython及び，pipが使えるようになったと思うので```python -V```， ```pip -V```で確認してください
    - ```python```と打つとMicrosft Storeが表示される場合は補足[*5](https://qiita.com/Haaamaaaaa/items/a2852ed0b3e0b7c4d1ab#%E8%A3%9C%E8%B6%B3)を見てください．

## Pipenvの準備
- PowerShellを管理者権限で起動しましょう．[*6](https://qiita.com/Haaamaaaaa/items/a2852ed0b3e0b7c4d1ab#%E8%A3%9C%E8%B6%B3)
- ```pip install --upgrade pip```で```pip```を最新にしときます．
- 管理者権限で開いたPowerShellは閉じてユーザ権限でPowerShellを開きましょう．(普段通りPowerShellを開く)
- ```pip install pipenv```をしてPipenvをインストールします．
- ```pipenv```と打って動くかどうか確認しましょう！
- pipenvの使い方は[公式](https://pipenv-ja.readthedocs.io/ja/translate-ja/basics.html#example-pipenv-workflow)を参照してもらえると嬉しいです．


## 補足
*1 : あんまりUser\\[username]あたりは見せないほうがいいんですがまあ，今回は見せないと面倒なことが多いので見せます．
*2 : パスを通すの余裕だぜとか，いやカスタムパスにしたいわって方はあんまり気にしなくてもいいです．
*3 : windowsのパスを通すはシステム環境変数にPython.exeの上位ディレクトリまでのパスを登録することです．
*4 : Windowsロゴを左クリックして```システム環境変数の編集```と検索すると出てきます．
*5 : システム環境変数を開いて```Path```の中身を見てもらうと```%USERPROFILE%\AppData\Local\Microsoft\WindowsApps```こんな奴や```C:\\User\\[username]\AppData\Local\Microsoft\WindowsApps```みたいなやつらがいます．実はこいつの優先順位が高いと```python```と打った時に先に上記のパスにある実行ファイルを動かしてしまいます．なので，以下の図のように順位を一番最後まで下げましょう．
![スクリーンショット (4)-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182036/f542bece-0d91-b87d-8d44-4825ccb9cfd1.png)
別にこんなパスいらねーよ！って方は消しちゃいましょそうしましょ
*6 : PowerShellを右クリックすると```管理者として実行する```があります．

## おわりに
PythonとPipenvの構築は非常に楽だと思ってますのでぜひとも使ってみてください
PowerShellでPython叩けない人が少しでもいなくなればと・・・
Winでの開発も意外といいのよ（個人論）
Zeit Now で Nest.js 使って HelloWlrld!

# 概要
Zeit Now で`HelloWorld!`を表示してみました！
５分ほどでデプロイできました。
めっちゃ簡単。

無料でも使える！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/b30324fc-b639-09df-bc15-a11c2cd4e27f.png)

# 準備

下記よりユーザー登録
https://zeit.co/onboarding

`now`コマンドをインストール

```bash

$ npm i -g now
```

`now login` を実行し、emailより、認証を行う。

```bash
$ now login
```

# sample-app作成

```bash

$ npx create-next-app sample-app
$ cd sample-app
```

# sample-app デプロイ
詳細な設定は不要で、`now` コマンドのみでデプロイできる！

```bash

$ now
> Deploying ~/tmp_test/sample-app under hayashikengojp
> Using project sample-app
> Synced 1 file [534ms]
> NOTE: This is the first deployment in the sample-app project. It will be promoted to production.
> NOTE: To deploy to production in the future, run `now --prod`.
> https://sample-app-1bcic4d43.now.sh [3s]
> Ready! Deployment complete [28s]
- https://sample-app.now.sh
- https://sample-app.hayashikengojp.now.sh [in clipboard]

$ open https://sample-app-1bcic4d43.now.sh/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/7fff2d0b-5643-ee58-f072-9bfaec63d05c.png)

# HelloWorld表示


`pages/hello.js`追加。
`pages` 配下にファイルを置くとルーティングしてくれる。

```jsx

import React from "react";

import Nav from "../components/nav";

const Hello = () => (
  <div>
    <Nav />
    <p>HelloWorld!</p>
  </div>
);

export default Hello;
```

now コマンドで実行

```bash

$ now
now
> Deploying ~/tmp_test/sample-app under hayashikengojp
> Using project sample-app
> Synced 1 file [852ms]
> https://sample-app-w4eczjs3g.now.sh [4s]
> Ready! Deployed to https://sample-app.hayashikengojp.now.sh [in clipboard] [29s]

$ https://sample-app-w4eczjs3g.now.sh/hello
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121224/3b6e5a74-85a3-333a-47a1-0c4a1f7b3b36.png)

カスタムドメイン設定もでき、ブログなど静的なサイトなど作る際はかなりお手軽に作れる。
しかも無料枠で結構使える。
今回作成した`sample-app`は[こちら](https://github.com/hkengo/now-sample-app)

# 参照
* https://github.com/zeit/next.js
* https://github.com/zeit/now
* https://zeit.co/account/plan-v1
勉強日記　〜基本情報令和元年秋季午前問わからなかったシリーズ〜

# 問２１ シフトレジスタの値はどれか
これを見た瞬間、用語がわからんすぎて、絶句したのを今でもはっきり覚えています笑
先日、職場の先輩に解説してもらって少し理解できたのでアウトプットします！！

![スクリーンショット 2019-12-23 19.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554577/072ccb30-7c84-5c1b-937c-ddfe891efce7.png)
問題：[基本情報技術者試験ドットコムさんより](https://www.fe-siken.com/kakomon/01_aki/q21.html)


教えてくださった先輩は以下の順番で解決していくといいと教えてくださりました。
  
1. わからない用語を抜き出す
2. 図を読む
3. 計算する

今回はこれにそってどういう風にこの問題を理解したのか追っていきます！！

## わからない用語を抜き出す
* シフトレジスタ
* シリアル入力パラレル出力シフトレジスタ
* 正論理
* 立ち上がりエッジ

###  シフトレジスタ

> 電子計算機の構成要素の一つで数値や計算指令を表す一連の２進数字の記憶装置をレジスタという。フリップフロップを並べたレジスターに適当な論理回路を付加して、桁送り信号（シフトパルス）がくるごとに記憶内容が右または左に１つずつ移動するようにしたものをシフトレジスタという。SFQ回路では、SFQ(単一磁束量子)が回路内に在るか無いかを２進数字の「1」「0」に対応させ、これを左右にシフトさせることでシフトレジスタを実現している。

引用： [Weblio シフトレジスタ](https://www.weblio.jp/content/%E3%82%B7%E3%83%95%E3%83%88%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF)

簡単にいうと１か０が入る箱がレジスタで、データが更新していくと、右か左に値がシフトしていく記憶装置だそうです！

↓図に表すとこんな感じ 
![スクリーンショット 2019-12-23 20.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554577/85d5f5e9-55e5-0c4b-c88a-535cc5fabe3e.png)

### シリアル入力パラレル出力シフトレジスタ
データを１ビットずつ順番に入力していき、出力は一度に複数ビットで伝達する方式

### 正論理
> 論理回路において 1を真(Hi, High)，0を偽(Log)として論理回路を構成することを正論理 (positive logic, Active Hight)といい， 逆に，0を真(High)，1を偽(Low)として論理回路を構成する場合を 負論理(negative logic, Active Low)と呼ぶ．
ブール代数の双対性から，正論理と不論理の間には単純な関係が成立する．

参考：http://www.ee.t-kougei.ac.jp/tuushin/lecture/lcircuit/3/index.html

### 立ち上がりエッジ
> デジタル信号において、電位がLowレベルからHighレベルへ遷移することを指す。一般的にデジタル回路(同期回路)の動作は、ある信号の立ち上がりエッジや立ち下がりエッジに同期して、別の信号の状態が変化する、という繰り返しになる。

参考：http://yougo.ascii.jp/caltar/%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%8C%E3%82%8A%E3%82%A8%E3%83%83%E3%82%B8

## 図を読む
![スクリーンショット 2019-12-23 21.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554577/b28b77f3-2d6c-cf5e-db6a-558ffed1fb6b.png)
クロック：データをシフトレジスタに取り込むタイミング（問題文より）
ストローブ：値を確定する（問題文より）
データ：凸の部分を１、凹の部分を０とする（正論理より）


よって、データは以下のように求められます。
![スクリーンショット 2019-12-23 21.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554577/ad1471c2-bc1d-cce5-9025-d1ec950f9bab.png)

このデータを８ビットのシリアル入力パラレル出力シフトレジスタに取り込みます。
![スクリーンショット 2019-12-23 22.00.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554577/bffd5ab3-3769-6c8c-f98f-bff9094543f4.png)

以上によって、確定後のシフトレジスタは、１０００１１０１ということがわかりました！！

## 計算する
### ２進数から１６進数へ！
２進数から１６進数にするには３ステップあります！

1. 2進数の数値を４桁ずつに分割
2. 2進数から10進数に変換
3. 10進数から16進数に変換

この３ステップで考えると...
![スクリーンショット 2019-12-23 22.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554577/6c608ea1-9dae-b9dc-b132-1e2d2ed5fe37.png)

解は 「イ.８D」でした！！


## まとめ
少しまとめが丁寧すぎたかなと思いつつ、しっかり理解ができたと思います！！
escriptを動かすDockerfileのサンプル

- `mix escript.build` で生成されるバイナリを動かしたい
- 面倒なことは避けたい
- コード変更した後短い時間でimage作成したい
- imageのサイズは小さくしたい

を満たすDockerfileを作りました。
手元で動かすだけであれ必要はないのだけれども、github actionsで利用したかったので image 化しました。

できあがったものは [niku/nwiki](https://github.com/niku/nwiki/blob/950c5ffaa5959b5952ebc1ecb42c96104991de0f/Dockerfile) にあります。
`docker image ls` によると 257MB のようです。
あんまり小さくはないけれど、これ以上がんばる気力がなかった。

[Elixir Advent Calendar 2019](https://qiita.com/advent-calendar/2019/elixir)で埋まっていないところがあったので参加させてもらいました :pray:

# 方針

- 面倒なことは避けたい
  - 可能なら出来合いのimageをベースに使う
  - Debian/Ubuntuをベースに使う（私がalpine linuxよりよく知っているから）
    - ["removing some extra files that are normally not necessary within containers, such as man pages and documentation"](https://hub.docker.com/_/debian) な slim バリアントを使う
- コード変更した後短い時間でimage作成したい
  - 上から変更の頻度が低い順に並べる。アプリケーションのコードが変更されたら、アプリケーションのレイヤーだけビルドされるように構築した。
    - apt-get
    - mix が共通で利用する hex と rebar パッケージのインストール、コンパイル
    - mix がアプリケーションで利用するパッケージをインストール、コンパイル
    - アプリケーションを読みこみ、コンパイル
- imageのサイズは小さくしたい
  - MultiStageビルドを利用
  - escriptをビルドする環境と、escriptを動かす環境を分けることでビルド時に必要で動かすときには不要な依存を保持しなくともよい
    - escript化したらerlangの実行環境のみでよい(elixirは必要ない)
    - ビルドする環境と動かす環境は同じOS、CPUでないと動かない点には注意すること

# Dockerfile

```Dockerfile
#
# Building stage
#
FROM elixir:slim
ENV LANG=C.UTF-8 \
    MIX_ENV=prod

# os dependency
# mix global dependency
RUN set -xe \
    && apt-get update \
    && apt-get install -y --no-install-recommends \
    git \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/* \
    && mix local.hex --force \
    && mix local.rebar --force

# mix dependency
COPY mix.exs mix.lock ./
RUN set -xe \
    && mix deps.get --only prod \
    && mix deps.compile

# application code
COPY lib ./lib/
RUN set -xe \
    mix escript.build

#
# Runtime stage
#
# elixir:slim based on erlang:22-slim
FROM erlang:22-slim
ENV LANG=C.UTF-8
COPY --from=0 nwiki .
ENTRYPOINT ["./nwiki"]
```
CakePHPでクリスマスをお祝いする準備をする

### CakePHPでクリスマスをお祝いする準備をする

Cakephp3で利用できる、ジョブスケジューラーを用いてクリスマスをお祝いしたいと思います。
[この記事](https://php-tips.com/2019/12/17/running-symfony-console-app-on-cakephp/)でも紹介されている [cakephp-cron-jobs](https://github.com/nojimage/cakephp-cron-jobs/) というジョブスケジューラーを利用します。

PHPのジョブスケジューラーである、[lavary/crunz](https://github.com/lavary/crunz) のラッパーしてCakePHP3で使いやすくしてくれています。


### この企画の意図

CakePHP3のジョブスケジューラーを見つけた時に、
これを使って「メリークリスマス〜」っていうとなんかクリスマスっぽいなという企画です。

でもよくよく考えると、12月24日 00:00 はメリークリスマスではありませんね。。。。
「メリークリスマスイブ〜」とさせていただきます。。。。。

抑えた日付をミスりました。。。。

### 準備

あまりにも簡単に動いたので。。。。
そんなにボリュームはありませんが、準備手順をご紹介。
README.mdに従えばサクサク動きます！
ドキュメントが充実してて素晴らしいです。

https://github.com/nojimage/cakephp-cron-jobs/blob/master/README.md

### 準備1 composer install

```
composer require elstc/cakephp-cron-jobs
```

### 準備2  Pluginの設定

CakePHP >= 3.6.0

```
src/Application.php
$this->addPlugin('Elastic/CronJobs');
```

CakePHP <= 3.5.x

```
config/bootstrap.php
Plugin::load('Elastic/CronJobs');
```

### 準備3 設定ファイル作成

下記のコマンドを実行
```
bin/cake CronJobs publish:config
```
ルートディレクトリ配下に crunz.yml というファイルが作成されます。
コマンドを打つ時にタイムゾーン指定する必要があります。

### 準備4 タスクの設定

bootstrap_cli.php

```php
use Cake\Event\Event;
use Cake\Event\EventManager;

EventManager::instance()->on('CronJobs.buildSchedule', static function (Event $event) {

    $schedule = $event->getSubject();
    /* @var $schedule \Elastic\CronJobs\Schedule\CakeSchedule */

    // Add scheduled shell command
    $schedule->run('echo "めりーくりすます いぶー"')
        ->description('Christmas')
        ->cron('0 0 24 12 *');
});
```

### 準備5 タスクの確認

```
bin/cake CronJobs schedule:list vendor/elstc/cakephp-cron
```

<img width="342" alt="スクリーンショット 2019-12-23 22.30.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30844/9c27d47e-d257-d402-3c7a-1c314f3beb52.png">

### めりーくりすます いぶー

<img width="127" alt="スクリーンショット 2019-12-23 22.31.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30844/16db5b2f-ee4a-d86e-cf35-83f4b14e37d4.png">

みなさま良いお年を。
【画像処理100本ノックに挑戦】Q.28. アフィン変換(平行移動)

# 使用したライブラリ
[【画像処理100本ノック】独自の画像入出力クラスを作る](https://qiita.com/jajagacchi/items/834e8425b84f94df8a49)
[【画像処理100本ノックに挑戦】独自の行列クラスを作る](https://qiita.com/jajagacchi/items/df881888ee6a116f7730)

# Q.28. アフィン変換(平行移動)
> アフィン変換を利用して画像をx方向に+30、y方向に-30だけ平行移動させよ。

これのために独自の行列クラスを作ったのです。簡単な行列演算をするだけです。

```c++
int main()
{
	PPM ppm("imori.pnm");
	int width = ppm.Get_width();
	int height = ppm.Get_height();

	Matrix A(3, 3);
	A.set({
		1,0,30,
		0,1,-30,
		0,0,1
		});
	
	PPM ppm2(width, height);
	for(int i=0; i<width; i++)
		for (int j = 0; j < height; j++)
		{
			ppm2(i, j, 'r') = 0;
			ppm2(i, j, 'g') = 0;
			ppm2(i, j, 'b') = 0;
		}
	for(int i=0; i<width; i++)
		for (int j = 0; j < height; j++)
		{
			Matrix X(3);
			X.set({
				(double)i,
				(double)j,
				1.
				});
			Matrix X2 = A * X;
			int i2 = X2(0, 0);
			int j2 = X2(1, 0);
			if (0 <= i2 && i2 < width && 0 <= j2 && j2 < height)
			{
				ppm2(i2, j2, 'r') = ppm(i, j, 'r');
				ppm2(i2, j2, 'g') = ppm(i, j, 'g');
				ppm2(i2, j2, 'b') = ppm(i, j, 'b');
			}
		}
	
	ppm2.Flush("out.ppm");
	return 0;
}
```

![imori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/c5f258aa-ae82-0ac4-ffd1-20f75000ec20.png) ![out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/3f17b7d5-86f4-934a-67c0-095d3e5c181a.png)
人種も育ってきた環境も違う二人がともに生活を始め、価値観の違いを埋めながら成長し、まだ見ぬ未来に希望をつなげる話

#はじめに
先にタイトルのオチを書いてしまいましょう！

人種も育ってきた環境も違う二人がともに生活を始め、価値観の違いを埋めながら成長し、まだ見ぬ未来に希望をつなげる話
↓
OSもこれまでの保守会社も違うiOSとAndroidアプリを一つの会社がまとめて受け持つことになり、過去の実装方針や思想の違いを感じながら保守を行い、いつ行われるかわからない次のリニューアルに向けで準備をすすめる話です。


弊社では現在デイリーアクティブユーザー120万人超えのモバイルアプリの保守をしています。
2011年から8年間iOSの保守のみを受け持って来たのですが、その実績から今年の5月末にAndroidもやってほしいと言われ、是非にということで、そのお話をお受けしました。
私自身がiOSよりもAndroid寄りのエンジニアなので、いつかAndroidの保守もやれればと思っていたことが、ついに現実になったのです！！

###ところが、そんなに甘い話ではなかった
Androidは今まで保守していた会社が複数あり、内部の構造はかなり煩雑
クラスの命名規則が意味不明、変数はキャメルケースとスネークケースが入り混じり、可読性最悪
更に前回行ったUIリニューアルで問題が悪化、ライフサイクルを無視した書き方やそもそもライフサイクルが正常に呼ばれないなどたくさんの問題を抱えていました。

#さて本題
色々すっ飛ばしますが、あの手この手を使って修正を行い、最低限想定通りな挙動をすることろまで修正を行うことができました。
この半年間何度ココロが折れそうになったことか。。。。(←ただ愚痴りたかっただけw)
でも今回のテーマは未来に希望を繋げる話です。
過去は過去ということで一旦水に流して~~本当に流せるのか？おい！~~、次のリニューアルにどんなことをやってやろうか考えてワクワクしたいと思います。
夢は大きく持って勉強していきましょ

##言語

選択肢としてはほぼ一択と言っていいほどですよね
もし新規案件だとしたらフレームワーク使うという方法もあるかもしれません

###Android

- [ ] Java
- [x] Kotlin

### iOS
- [ ] Objective-c
- [x] Swift

##アーキテクチャ

ここはそれなりに選択肢が多くなります。
初めてAndroidでMVVMに触れたときはかなりの衝撃で、それ以来AndroidではMVVMを溺愛しております
iOSのMVVMにはRxSwiftが不可欠、ならばいっそのことという感じで、Clean Architectureを選択

###Android
- [ ] MVP
- [x] MVVM
- [ ] Clean Architecture
- [ ] Flux


###iOS
- [ ] MVC
- [ ] MVP
- [ ] MVVM
- [x] Clean Architecture
- [ ] Flux
- [ ] Redux
- [ ] VIPER

##Rx

正直まだRxはちゃんと使ったことがありません、今回引き継いたAndroid版で使っていて正直意味不明
学習コストが高いと言われるのはやはり間違っていないのだなという印象、でもこれがないと始まらないんですよね。。。

###Android

- [x] RxJava
- [x] RxAndroid
- [x] RxKotlin

###iOS
- [x] RxSwift
- [x] RxCocoa


## 通信系

Androidに関してはVolleyはそもそもDeprecatedですし。。。
OkHttpとRetrofitの組み合わせはについては、何も言うことはありませんね
iOSはAlamofireをラップしたライブラリMoyaを選択します
更にシンプルに実装ができるそう

###Android
- [x] Retrofit2
- [x] OkHttp3
- [ ] Volley

###iOS
- [ ] Alamofire
- [x] Moya

##画像系

画像系からはすでに使ったことのあるものをチョイスしました

###Android
- [ ] glide
- [x] picasso

###iOS
- [x] SDWebImage
- [ ] AlamofireImage

##DB

やはりレガシーなDBより高速でわかりやすいRealmを使用します

###Android
- [ ] MySQL
- [x] Realm

###iOS
- [ ] CoreData
- [x] Realm

##Jsonパーサー

Jsonパーサーも同じく使ったことがあるものを選択です

###Android
- [ ] gson
- [x] Jackson

###iOS
- [ ] Codable
- [x] SwiftyJSON


##DI

###Android

せっかくkotlinを使うのだらkoinを使いましょう

- [ ] dagger2
- [x] koin

##その他
その他にも便利そうなライブラリをいくつか
###Android
- Data Binding Library
- LiveData
- MergeRecyclerAdapter

###iOS
- FrameAccessor
- NSLayoutAnchor


#まとめ
という感じで、未来に向けてボクの考える最強のアプリ開発設計です。
でもまだまだ抜けはある気がする。。。
もしこれが全部使いこなすことができれば、それなりのレベルの開発者になれるはず。
そしてどんどん新しい技術が出ているので、これだけにこだわらずアンテナを広げていきたいなと思います！


そう言えば先日弊社が猫会社として取材されました！！
https://sippo.asahi.com/article/12960031
猫が好きな方はぜひ読んでみてください♪
JavaScriptで配列を結合


オブジェクトの配列を結合するメモ。

```js:index.js
//deptsマスタ
const depts = [
    { deptNo: 1, deptName: '総務' },
    { deptNo: 2, deptName: '経理' },
    { deptNo: 3, deptName: '人事' },
];

//membersマスタ
const members = [
    { name: 'foo', deptNo: 1 },
    { name: 'boo', deptNo: 2 },
    { name: 'hoge', deptNo: 3 },
];


//ループしながら結合
const newMembers = members.map(item =>
    ({
        name: item.name,
        deptname: depts.find(value => value.deptNo === item.deptNo).deptName
    })
);

//配列の中身を表示
console.log(newMembers);
```

実行した結果は下記の通り。

```
node index.js

[
  { name: 'foo', deptName: '総務' },
  { name: 'boo', deptName: '経理' },
  { name: 'hoge', deptName: '人事' }
]
```

配列を作らず直接表示時に結合するなら、

```js
members.map(item => {
    console.log(`name: ${item.name} deptName: ${depts.find(value=>value.deptNo === item.deptNo).deptName}`)
});
```

という感じでしょうか。
【F9が教える】Torなどの匿名化技術を上手く使いこなして犯罪から身を守り、身バレを防ごう

どうもF9（ホットラインセンター）と申します。2ちゃん（5ちゃん）でコテハンをやっているものです。
本日は匿名化技術について書かせていただきます。
ある程度インターネット知識がある方にとっては読む価値もない記事かもしれませんが、生暖かい目で見守ってください。
また私はIT知識に関してはまだまだ未熟者ですので、その辺りも考慮していただけると幸いです。

#匿名化ブラウザ「Tor」とは
皆様は「Tor」という匿名化ソフトをご存じでしょうか？
Torは複数のサーバを中継してIPアドレスを秘匿しながらインターネットに接続する匿名化ブラウザです。
具体的には
あなた→入口ノード→中継ノード→出口ノード→インターネット
といった形で接続を行います。
ただし、出口ノードのサーバー管理者は接続内容を見る事が可能です。サーバの中には監視目的で立てられたサーバもあるので要注意です。
Torを使用することで、所謂ダークウェブと呼ばれるアングラサイトへの接続も可能になります。似たような技術として「I2P」がありますが、こちらに関しては敢えて記述しません。

全世界のネットユーザがサーバを提供しており、その数は6000個ほどとも言われます。
どのサーバに接続するかは完全にランダムですが、Torrc（後述）を設定すればアメリカのサーバには接続しないなどの設定が可能です。
Torは複数のサーバをランダムに接続して、追跡をしづらくします。この技術は「オニオンルーティング」とも呼ばれています。

使い方はとても簡単。
Torをインストールして（Tor インストール辺りでggってください）それで終わりです。
とはいえ、そのまま使うのはおすすめしません。
必ずブリッジ接続にしておくこととHTTPS EverywhereをONにしておくことをおすすめします。
ブリッジ接続をすることで、プロバイダにTorを使用しているという情報が漏れなくなり、HTTPS EverywhereをONにしておくと、SSL化されたサイト以外にはアクセスしなくなります。SSL化していないサイトに接続するのは接続が暗号化されていないということになり、とても危険です。
何故なら、TorはIPアドレスの秘匿自体はしますが接続の暗号化は行ってくれないからです。必ず設定しておきましょう。

Torで見たいサイトが見れないという場合はWebプロキシを使用しましょう。これでTor接続であることをサイト側に隠して接続できます。

##Torrcの設定
torrcとは、Torに関する自由な設定ファイルのことです。
Torの場合、スタートメニューから「torrc」と打ち込んだ際に出て来る三つのうち、名前の後ろに余計なものが付いていない、テキストファイルをメモ帳等から展開することによって編集が可能になります。

以下引用。これらのコマンドをメモ帳の一番下に追記すればいいだけです。ただし、ノード数を増やしすぎたりすると接続が極端に遅くなったりしてまともに使えなくなるので注意してください。
少なくともExcludeExitNodes {jp},{us}（出口ノードにて日本とアメリカのサーバに接続しない）は設定しておいた方がいいです。

 >NumEntryGuards 5
例えばこの設定を書き加えると、中継ノードの数を5に増やすことが可能です
調子に乗って15だとか設定するとどこにも接続できなくなるでしょう

 >ExcludeNodes {jp},{us},{cn},{ru}
中継ノード、出口ノード双方からここに記述された国籍のサーバが除外されます
これらのカントリーコードはそれぞれ日本、アメリカ、中国、ロシアを指します

>ExcludeExitNodes {jp},{us},{cn},{ru}
前述のものと違い、出口ノードのみからこの四国のサーバを除外します
あまり増やしすぎるとonionサイトへの接続に不可欠なランデブーポイントの生成にかかわります

>StrictNodes 1
これを追記すると上記で除外されたサーバに絶対にアクセスしなくなります

>ExcludeNodes SlowServer
遅いサーバを回避して接続を速くします

#匿名化OS「Tails」を使おう
TailsはLinuxディストリビューションの一つです。接続を全てTor経由で行いなおかつ、PCから痕跡を消してくれる匿名化にはうってつけなOSです。

インストール方法についてはこちら
https://matome.naver.jp/odai/2150141472649592701

USBメモリなどが必要となってきます。
似たようなOSとしてはWhonixがありますが、こちらも接続を全てTorで行います。

#VPNを使おう
VPNはVPNサーバを経由して接続する仮想ネットワークのことです。VPNの場合はIPアドレスの秘匿よりも接続の暗号化に特化しています。

VPNサービスには無料で使えるものと有料のものがありますが、基本的に有料の方が匿名性的には優れています。とはいえ、普通に使う分なら無料のものでも十分だと思いますが・・・。Torと違ってTCP接続のみではなく、UDP接続も使用することが可能なことや、日本のサーバも使えるのが利点です。

Torなどと組み合わせると匿名性が増します。接続が遅くなることはあるかもしれませんので程々に。

#過去には悪用された事例も
インターネット上で「ハセカラ民」と呼ばれる匿名群衆によって悪用された事件が非常に多いです。
彼らは唐澤弁護士やチンフェ（ハッセなどとも）と呼ばれる人物に対する殺害予告や嫌がらせを日常的に行っております。悪戯目的で爆破予告や、サイトに対してクラッキングをする際にTorといった匿名化ソフトを使って行うことが確認されています。

Torとはこういった使い方をするものではございませんので、きちんと使い方を弁えましょう。

#まとめ ～なぜ匿名化が必要なのか～
匿名化は犯罪にも利用できますが、逆に言えば不正アクセスやネットストーカー行為などから身を守れるということでもあります。
TorやVPNはネット検閲を回避できる特性から、ネット規制の厳しい国では日常的に使用されています。
そうでなくとも、インターネットの接続を政府や警察に監視されることを防ぐことが可能なのでやって損はないです。

ネット初心者の方、この記事を見ましたら是非匿名化ツールと正しく付き合って安全なインターネットライフを楽しみましょう。

#関連リンク
こちらのサイトもどうぞ。

- [初心者が解説するTor browserの基本](https://matome.naver.jp/odai/2145977345281799201?&page=1)
- [まったく痕跡を残さず匿名でコンピューターを使える『Tails』](https://www.lifehacker.jp/2012/11/121128tails.html)
- [ログなしVPN：その真実とは](https://ja.wizcase.com/blog/%E3%83%AD%E3%82%B0%E3%81%AA%E3%81%97vpn%EF%BC%9A%E3%81%9D%E3%81%AE%E7%9C%9F%E5%AE%9F%E3%81%A8%E3%81%AF/)
JavaFX＋NetBeans＋Gradle

「New Project」から「Java with Gradle」ー「Java Application」でプロジェクトを作成。
build.gradleに「org.openjfx.javafxplugin」追加、「javafx」を宣言。
後は淡々JavaFXのコードを書くだけ。
他に設定等は不要です。

## Project
<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/12/JavaFX_NetBeans_Gradle_01.png"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/12/JavaFX_NetBeans_Gradle_01-1024x763.png" alt="" width="1024" height="763" class="alignnone size-large wp-image-2659" /></a>

## build.gradle
```groovy
plugins {
  id 'application'
  id 'org.openjfx.javafxplugin' version '0.0.8'
  id 'java'
}

javafx {
    version = "11"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

repositories {
    jcenter()
}

dependencies {
    testCompile 'junit:junit:4.12'
}

mainClassName = 'ExampleJavaFX.HelloFX'
```

## HelloFX.java
```java
package ExampleJavaFX;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class HelloFX extends Application {

    @Override
    public void start(Stage stage) {
        try {
            stage.setTitle("FxmlSmpl");
            FXMLLoader fxml = new FXMLLoader(getClass().getResource("/fxmlSmpl.fxml"));
            
            HBox root = fxml.load();
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.show();
        }
        catch(Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch();
    }

}
```

## fxmlSmpl.fxml
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<?import javafx.scene.control.* ?>
<?import javafx.scene.layout.* ?>

<HBox>
    <children>
        <Label text="ラベル" prefWidth="80.0" />
    </children>
</HBox>
```
bashからzshへの乗り換え

:pencil: このエントリーは、MacOS Catalinaからデフォルトシェルが `bash` から `zsh` になったことを期に、bashからzshへ乗り換えるための作業メモ

# 前提条件
## ホームディレクトリで作業

```
$ pwd
/Users/gentamura
```

## 現在利用しているシェルはbash

```
$ echo $SHELL
/bin/bash
```

## zshがインストールされている

```
❯ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```


# 移行作業
## ログインシェルを入れ替え

```
$ chsh -s /bin/zsh
```

## 一旦ターミナルを閉じて、再起動

## 利用しているシェルを確認
```
$ echo $SHELL
/bin/bash
```

## 設定ファイルをコピー

```
$ cp .bash_profile .zsh_profile
```

## 設定ファイルを一部書き換え

```
$ vim .zsh_profile
```
```zsh:.zsh_profile
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"

export PATH="$HOME/.cargo/bin:$PATH"
export PATH="/Applications/flutter/bin:$PATH"

export GOPATH="$(go env GOPATH)"
export PATH="$GOPATH/bin:$PATH"

eval "$(starship init bash)" => eval "$(starship init zsh)" に変更
```

## 再起動
```
$ source .zsh_profile
```

以上です。
今の所無事動いているので、なにかあれば追記します:elephant:

---
追記
ターミナル再起動したところ、 `starship` が適用されなかったので、以下を追加

```zsh:.zshrc
source ~/.zsh_profile
```
コマンドから環境変数に追加しましょう～

# はじめに
私は開発する時にWindowsとLinuxを使っています。時々他の方が作ったライブラリーを使う事があります。その時はできるだけインストーラーを使わずにZIPやTARでダウンロードしてから使うようにしています。インストーラーを使うと環境変数に新しい情報追加されたり、実行ファイルを色々な場所にコピーされたりします。一時的に動かしたいのに既存の環境に影響与えるのなんか気持ち悪いです。そのため、タミナルを起動して一時的に環境変数を変更してから使うようにしています。変更の影響はそのタミナルのみなのでほかのシステムには何の影響も与えません。そのタミナルを閉じれば、設定も全部元通りになります。

それぞれの環境で以下のようにPATH変数に実行ファイルがあるフォルダーのパスを追加してから使います。

## Linux
```bash
export PATH=$PATH:/opt/dakc/bin
```

## Windows
### 1. Command Promt
```
set PATH=%PATH%;C:\dakc\bin
```

### 2. Powershell
```powershell
$env:Path += ";C:\dakc\bin"
```
コードを書いてQueryBuilderに慣れよう

Doctrineの話題になるとよく出てくるQueryBuilder。

SQLっぽく書くためによく使うと思いますが、自分自身なんとなく使っていたところがあります。

いい機会なので使い方のメモを残します。

## 前提条件：テーブルとSQL

テーブルは下記を想定します。

- テーブル名：item

|id|name|date|
|:---|:---|:---|
|1|hoge|2019-12-23|
|2|fuga|2019-12-24|
|3|fuga|2019-12-25|
|4|piyo|2019-12-26|

下記のsqlをQueryBuilderを使って再現します。

```sql

select * from item i where i.name = 'fuga';
```

## 書いてみる

```php
function getItem($string itemName)
{
    $qb = $this->entityManager->createQueryBuilder();
    $resultData = $qb->select('*')
        ->from('item', 'i')
        ->Where('i.name = :itemName')
        ->setParameter('itemName', $itemName)
        ->getQuery()
        ->getResult();

    return $resultData;
}
```


書いてみると上のような形になります。上記を`$this->getItem('fuga')`のように呼び出してあげるとsqlと同様の結果が取得できると思います。


## QueryBuilderを用意しておいて使い回す

汎用的なQueryBuilderを用意して使い回すこともできます。

```php
public function templateItemQB($string itemName)
{
    $qb = $this->entityManager->createQueryBuilder()
        ->select('*')
        ->from('item', 'i')
        ->Where('i.name = :itemName')
        ->setParameter('itemName', $itemName);

    return $qb;
}

public function getItem()
{
     $qb = $this->templateQB('fuga');
     $qb->andWhere('i.date = :itemDate')
        ->setParameter('itemDate', '2019-12-25');

     $rerultData = $qb->getQuery()->getResult();
}

```



## まとめ

QueryBuilderはとっつきづらいイメージを持っていましたが、コードを書いていくと理解が深まると思います。

食わず嫌いせず、簡単な物でもいいのでまずは書いて動かしてみましょう。
【Laravel】Requestによるバリデーションは効かせつつ、他は共通エラー

Requestによるバリデーションチェックによるエラー表示は機能させつつ、
他のエラー発生時は共通エラー画面に遷移させる方法です。

## 環境
- PHP：バージョン7.3.7
- Laravel：バージョン5.8
- OS：Windows10

## はじめにやったこと
エラーが発生したら、とりあえずエラー画面に遷移させればいいんだよね、
というわけで、デフォルトの記述をコメントアウトし、以下のように変更。
※リダイレクト先は、\routes\web.php で制御しています。

```php:\app\Exceptions\Handler.php

    public function render($request, Exception $e)
    {
        return redirect('/');
        /* 
        以下はデフォルトの記述
        return parent::render($request, $e);
        */

    }
```



## 問題発生
ところが、問題発生。
Requestを使ったバリデーションチェックで、エラー発生時にも共通エラー画面に遷移してしまった。
この場合はエラー内容を自画面に表示させたいので、これでは困る・・・。

## 解決方法
結論から言うと、\app\Exceptions\Handler.phpで、以下のように記述してあげればOK。

```php:\app\Exceptions\Handler.php

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
// 以下を追記
use Illuminate\Validation\ValidationException; 

class Handler extends ExceptionHandler
{

##
## 省略
##

    public function render($request, Exception $e)
    {
        if($e instanceof ValidationException) {
            // バリデーションエラー発生時
            return $this->convertValidationExceptionToResponse($e, $request);
        }else{
            // それ以外は共通エラー画面へ（リダイレクト先は\routes\web.phpで指定）
            return redirect('/');
        }
    }
}

```

use Illuminate\Validation\ValidationException; 
して、バリデーションエラーの場合のみ、
return $this->convertValidationExceptionToResponse($e, $request);
で、バリデーションエラーが出るようにする。
それ以外は共通エラー画面へ。

## もう少し詳しく見てみる
\app\Exceptions\Handler.phpで読み込まれていた、
\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php
を見てみましょう。

```php:\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php
##
## 省略
##
use Illuminate\Validation\ValidationException;
##
## 省略
##

class Handler implements ExceptionHandlerContract
{
##
## 省略
##

    // \app\Exceptions\Handler.phpのrenderファンクションの親に当たるメソッド
    public function render($request, Exception $e)
    {
        if (method_exists($e, 'render') && $response = $e->render($request)) {
            return Router::toResponse($request, $response);
        } elseif ($e instanceof Responsable) {
            return $e->toResponse($request);
        }

        $e = $this->prepareException($e);

        if ($e instanceof HttpResponseException) {
            return $e->getResponse();
        } elseif ($e instanceof AuthenticationException) {
            return $this->unauthenticated($request, $e);
        } elseif ($e instanceof ValidationException) {   // この部分を拝借
            return $this->convertValidationExceptionToResponse($e, $request);
        }

        return $request->expectsJson()
                        ? $this->prepareJsonResponse($request, $e)
                        : $this->prepareResponse($request, $e);
    }

##
## 省略
##
```
上のように、バリデーションエラーに関する記述があったので、その部分を拝借しました。
※「ValidationException」で検索してみてください。

## 感想
うまく条件分岐させれば、他のエラー発生時にも、応用効きそう。
そのうちやってみようと思います。

## 参考
以下を参考にさせていただきました。
ありがとうございました！

- [Laravelでエラー時に表示するページのカスタマイズ](https://qiita.com/sakuraya/items/af38c4cf84459a8b5967)
Markdown テーブルを作るときのメモ

# 目的

- Markdownでテーブルを作成する時の自分用メモをまとめる

# 書き方の例(基本)

- 下記に基本なテーブルの書き方を記載する。

    ```markdown
    |項目1  |項目2  |項目3  |
    |---|---|---|
    |データ1  |データ2  |データ３  |
    |データ4  |データ5  |データ6  |
    ```

- 前述の書き方の例のプレビューを下記に記載する。

    |項目1  |項目2  |項目3  |
    |---|---|---|
    |データ1  |データ2  |データ３  |
    |データ4  |データ5  |データ6  |

# 書き方の例(ちょっと応用)

- セル内の記載内容を右、中央、左に寄せる。
- テーブル記載の二列目の`|---|---|---|`の部分でセル内の記載内容の寄せる箇所を指定する。
- 右寄せの時`|--:|--:|--:|`とする。
- 中央寄せの時`|:-:|:-:|:-:|`とする。
- 左寄せの時`|:--|:--|:--|`とする。
- 何も設定せず`|---|---|---|`だと左寄せになる。
- 下記に各内容を記載する。

    ```markdown
    <!-- 右寄せ -->
    |項目1  |項目2  |項目3  |
    |--:|--:|--:|
    |データ1  |データ2  |データ３  |
    |データ4  |データ5  |データ6  |

    <!-- 中央寄せ -->
    |項目1  |項目2  |項目3  |
    |:-:|:-:|:-:|
    |データ1  |データ2  |データ３  |
    |データ4  |データ5  |データ6  |

    <!-- 左寄せ -->
    |項目1  |項目2  |項目3  |
    |:--|:--|:--|
    |データ1  |データ2  |データ３  |
    |データ4  |データ5  |データ6  |

    <!-- 左寄せ -->
    |項目1  |項目2  |項目3  |
    |---|---|---|
    |データ1  |データ2  |データ３  |
    |データ4  |データ5  |データ6  |
    ```

- 前述の書き方の例のプレビューを下記に記載する。
- 右寄せ

    <!-- 右寄せ -->
    |項目1  |項目2  |項目3  |
    |--:|--:|--:|
    |データ1  |データ2  |データ３  |
    |データ4  |データ5  |データ6  |

- 中央寄せ

    <!-- 中央寄せ -->
    |項目1  |項目2  |項目3  |
    |:-:|:-:|:-:|
    |データ1  |データ2  |データ３  |
    |データ4  |データ5  |データ6  |

- 左寄せ

    <!-- 左寄せ -->
    |項目1  |項目2  |項目3  |
    |:--|:--|:--|
    |データ1  |データ2  |データ３  |
    |データ4  |データ5  |データ6  |

    |項目1  |項目2  |項目3  |
    |---|---|---|
    |データ1  |データ2  |データ３  |
    |データ4  |データ5  |データ6  |
【jinja2】ハイフンの位置による改行の変化

# はじめに
<バージョン>
Python: 3.7.4
jinja2: 2.7.2

jinja2テンプレートでfor/if文を書く際に、ハイフンの有無や位置で改行のされ方が変わります。
for文を書くときにいつも迷うのでまとめます。
以下の出力を得るにはどう書けばよいのでしょう？

```text:出力
start

apple0
orange0

apple1
orange1

end
```

# パターン1：全てにハイフンを入れる
以下のテンプレートが今回の基準になります。
for文の開始位置、終了位置の前後それぞれにハイフンを入れます


```jinja:jinja_test1.j2
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
```

#  パターン1：実行結果
appleとorangeの間だけ改行が入ります。
for文の中に書いてある内容は勝手に改行してくれるようです。

```jinja:出力
startapple0
orange0apple1
orange1end
```

# パターン2：for文開始位置の手前のハイフンを消す


```jinja:jinja_test2.j2
start
{% for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
```

#  パターン2：実行結果
startとapple0の間が改行されました。
for文開始位置の手前は、for文の開始時に1回だけ改行します。

```jinja:出力
start
apple0
orange0apple1
orange1end
```

# パターン3：for文開始位置の後ろのハイフンを消す

```jinja:jinja_test3.j2
start
{%- for i in range(2) %}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
```

# パターン3：実行結果
apple0とapple1の手前に改行が入りました。
for文開始位置の後ろは、for文内の開始位置で毎回改行します。

```jinja:出力
start
apple0
orange0
apple1
orange1end
```

# パターン4：for文終了位置の手前のハイフンを消す


```jinja:jinja_test4.j2
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{% endfor -%}
end
```

# パターン4：実行結果
orange0とorange1の後ろに改行が入るようになりました。
for文終了位置の手前は、for文内の最終行で毎回改行します。

```jinja:出力
startapple0
orange0
apple1
orange1
end
```
# パターン5：for文終了位置の後ろのハイフンを消す

```jinja:jinja_test5.j2
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor %}
end
```

# パターン5：実行結果
orange1の後ろに改行が入るようになりました。
for文終了位置の後ろは、for文を出るときに1回だけ改行するようです。

```jinja:出力
startapple0
orange0apple1
orange1
end
```

# まとめ
今までの内容を踏まえると以下のようになります。

| ハイフンを消す位置 | 改行の仕方 | 
|:-----------|------------:|
| for文開始位置の手前 | for文開始時に1回だけ改行| 
| for文開始位置の後ろ | ループの先頭で毎回改行| 
| for文終了位置の手前 | ループの末端で毎回改行| 
| for文終了位置の後ろ | for文終了時に1回だけ改行| 

つまり、最初の出力を得るには、
・startとapple0の間で2回改行している
　→for文開始位置の前後のハイフンは不要
・orange1とendの間で2回改行する必要がある
　→for文終了位置の前後のハイフンは不要
ということで、「全てのハイフンを消す」が正解となり、以下のようになります。

```jinja:jinja_test6.j2
start
{% for i in range(2) %}
apple{{ i }}
orange{{ i }}
{% endfor %}
end
```
```text:出力
start

apple0
orange0

apple1
orange1

end
```
ホッケーやブロック崩しなどでただたんに跳ね返したい人へ

## 単純に摩擦なく跳ね返したいだけ

https://qiita.com/JunShimura/items/dfb2bdbbc328869f62ec

こんなふうに簡単にやりたいけど、なぜかうまくいかない。
（スピードをあげればできるのに）

## そんなときには

ProjectSettings > Physics > BounceThresholdをさげてみましょう
AWS S3バケットのオブジェクトがずっと削除されてた話

# バケットのオブジェクトがずっと削除されてた話
ある日、動作テストしてくれてる先輩から、「ステージングのデータが何か消えてるらしいよほげ」と言われました。

そのデータは実行履歴のデータでシステムを使うとデータがAWS S3に溜まって来て、AWS Athenaを利用してデータをクエリしてるのがざっくりの仕組みでした。

オブジェクトを削除してるコードは一切ない、
毎日ちゃんと溜まってる、
他の環境では何ヶ月間ちゃんと溜まってる、
ライフサイクルも必要な特定ディレクトリだけ指定して置いただけでした。

最初はAthenaのTableやDBが削除されると消える？とAthenaを疑ったり、
Terraformの処理のせい？と会社のTerraformマスターを疑ったり、
酔っ払ってやっちゃった？と自分をを疑ってました。

# 原因
しかし、見つかった原因は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108364/62d394f2-2ffa-cf91-2afe-3d7064e1559d.png)

ライフサイクル設定ルールを間違ってルール名に書いてしまったことが恥ずかしい原因でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108364/c8598b58-d448-e628-1e61-f399cb832d92.png)
先輩、すみません！

# まとめ
こんなアホみたいなミスは誰もしない珍しい話でしたが、ルールを指定しないとS3バケット全体が対象になりますので、お気をつけてください！
ちなみに、今回の事故で何があっても消さない実行履歴のデータだと気づき、**Amazon S3 オブジェクトロック**を使うことになりました！
[🔗S3オブジェクトのロック（なにをどうやっても改竄削除が不可）がリリースされました！](https://dev.classmethod.jp/cloud/aws/s3-object-lock/)
[Rust] Cargo.toml の dependencies に記載するバージョンの探し方

# 結論
- https://crates.io/crates/reqwest からコピペする
    - @sinkuu さんに教えていただきました。ありがとうございます :pray:
- `https://docs.rs/crate/{crate名}` の `Versions` から選択する

# 直面した問題
- reqwest (https://docs.rs/reqwest) を利用したいが `cargo install reqwest` を実行しても失敗する
    - ``error: specified package `reqwest v0.9.24` has no binaries`` が出力される

# 対応
## なぜerrorになるのか
- https://doc.rust-lang.org/cargo/commands/cargo-install.html
- `This command manages Cargo’s local set of installed binary crates. Only packages which have executable [[bin]] or [[example]] targets can be installed, and all executables are installed into the installation root’s bin folder.`
    - google翻訳 `このコマンドは、Cargoのインストール済みバイナリクレートのローカルセットを管理します。実行可能な[[bin]]または[[example]]ターゲットを持つパッケージのみをインストールでき、すべての実行可能ファイルはインストールルートのbinフォルダーにインストールされます。`
- reqwestはbinターゲットを持つパッケージでないから
- `npm install` のノリではダメらしい
- Cargo.tomlのdependenciesに追記する必要がある

## Cargo.toml にどう書くか
### crates.ioでの探し方
- 例えばreqwestであれば https://crates.io/crates/reqwest にCargo.tomlの記載方法が書いてあるのでコピペする
    - @sinkuu さんに教えていただきました。ありがとうございます :pray:

### doc.rsでの探し方
- `reqwest` でググると `https://docs.rs/reqwest/0.10.0-alpha.2/reqwest/` が上位にhitする（2019.12.23現在）
    - ググラビリティが高くて素晴らしい
- 上記ページを開いてもdependenciesにどう書けばいいか載っていない
- <img width="477" alt="スクリーンショット_2019-12-23_21_09_20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48788/42497c8a-6934-8642-6df6-1a8f9d242c04.png">
- 上画像の赤枠をクリックすると `https://docs.rs/crate/{crate名}` に遷移する
- 左カラムにバージョン一覧（ `Versions` ）があるのでそこから選択してCargo.tomlに書くと利用できる
    - 例: `reqwest = "0.9.24"`
- 自分の環境では `~/.cargo/registry/src/github.com-{ハッシュ}/reqwest-0.9.24` にダウンロードされていた
アセンブリ(NASM)で関数作ってC++で呼ぶ

# はじめに
C++からでもNASMで作った関数呼べちゃいました。

#環境

- OS : Ubuntu 18.04 LTS
- アセンブラ : NASM 2.13.02
- リンカ : ld 2.30
- コンパイラ : g++ 7.4.0

#ソース

```C++:main.cpp
extern "C" void _nasm_hello(void);
extern "C" [[noreturn]] void _nasm_exit(void);

int main(void){

	_nasm_hello();
	_nasm_exit();

	return 0;
}
```

```nasm:function.asm
global _nasm_hello
global _nasm_exit

[section .data]
	string: db "Hello", 0x0a
	length: equ $ - string

[section .text]

_nasm_hello:
	mov rax, 1
	mov rdi, 1
	mov rsi, string
	mov rdx, length
	syscall
	ret

_nasm_exit:
	mov rax, 60
	mov rdi, 0
	syscall
```

```make:Makefile
build:
	nasm -felf64 function.asm -o function.obj
	g++ -c -o main.obj main.cpp
	ld -e main -o exe main.obj function.obj

run:
	./exe
```

#実行結果
`Hello`

# 結果
C++からNASMで作った簡単な関数を呼べました。
[過去記事](https://qiita.com/C_Assembly/items/370ee4e38cab2662da20)のように`void main(void)`を使わないのは、こう書くと
`error: ‘::main’ must return ‘int’`と出るからです。
かと言って`_nasm_exit();`を書かないと、
`Segmentation fault (コアダンプしました)`と出ます。

#最後に
C++は最高。
私の使っている開発環境について

#私の使っている開発環境について
##パソコン編
・Ubuntu機1台（古いNetBookですが軽いですよ）
・MacBookWhite2008（OSが古いですが使えます）
・MacBookAir２０１３（OSはすべて最新です）
・MacBookAir2018（現在の主要開発機）
以上になります。

以前はWindowsも使ってますが今はほとんどMacやUbuntuで事が足りてます。
いちおうはWindowsもBootcampで入れてありますけどｗｗｗｗ。

##開発IDE
・VirtualBox６（Ubuntu）
・VisualStudio
・VisualStudioCode
・Eclipse
・IntelliJ
・AndroidStudio
・PyCham
・Xcodeです。

最近はVisualStudioCodeしか使ってません。
たまにIntelliJを使うかな。

##開発言語
・HTML5
・CSS
・jQuery
・RIOT.js
・BABEL
・Java
・C#
・PHP
・node.js
・Python

##今後学びたい言語
・React
・Vue
・Deno
・Ruby
・Scala
・Haskell
ですね。

やれる言語も増えつつも覚えたい言語も多いのでバリバリがんばります。
まだまだ若いやつには負けません。
.orderで並び替えたデータ取得時の注意点

映画レビューアプリを作成中に気づいたことです！

レビュー投稿画面に移行時に
①Movieテーブル最新データ１つ取得→　*fleshmovie = Movie.order(updated_at: :desc).limit(1)*
②最新データidカラムの値をインスタンス変数に定義→　*@movie = fleshmovie.id*



```ruby:reviews_controller.rb
def new
  fleshmovie = Movie.order(updated_at: :desc).limit(1)
  @movie = fleshmovie.id
end
```

```ruby:error_code
[2] pry(#<ReviewsController>)> @movie
  Movie Load (0.6ms)  SELECT  `movies`.* FROM `movies` ORDER BY `movies`.`updated_at` DESC LIMIT 1
  ↳ app/controllers/reviews_controller.rb:10
=> [#<Movie:0x00007fb5d5e845d0
  id: 37,
  mtdb_id: "10315",
  created_at: Mon, 23 Dec 2019 11:08:37 UTC +00:00,
  updated_at: Mon, 23 Dec 2019 11:08:37 UTC +00:00>]
[3] pry(#<ReviewsController>)> @movie.id
NoMethodError: undefined method `id' for #<Movie::ActiveRecord_Relation:0x00007fb5d6b6bd98>
Did you mean?  ids
```

@movieで最新データは取得できているのに、idカラムが参照できない！


rails documentを確認
**.orderは並び替えるメソッドなので、@movieは配列を取得している気がする**
**まず配列の1つめを取得する必要がありそう！**


fleshmovie.id →　fleshmovie[0].idで解決しました！

```ruby:reviews_controller.rb
def new
  fleshmovie = Movie.order(updated_at: :desc).limit(1)
  @movie = fleshmovie[0].id
end
```
Laravel用 MySQL チートシート

使用頻度の高いコマンドまとめ

# データベース一覧を表示
```bash
show databases;
```

# データベース切り替え
```bash
use データベース名;
```

# DB検索

```bash
select カラム名 from テーブル名;
```

DBのテーブルを表示

```bash
SHOW TABLES FROM データベース名;
```

# テーブルのカラムを表示

```bash
DESCRIBE テーブル名;
```

# docker-composeからMySQLにアクセス

```bash
docker-compose exec db bash -c 'mysql -uroot -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}'
```

# マイグレーションコマンド系

```bash
# php artisan ~
migrate:status # マイグレーション履歴を確認
migrate              マイグレーションを実行
migrate:refresh      全てのマイグレーションをリセットし、再度実行
php artisan migrate:refresh --seed 再度実行したあと、シーダーを実行
migrate:reset        全てのマイグレーションをロールバック
migrate:rollback     過去1件のマイグレーションをリセット
```


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

```bash
php artisan make:migration make_users_table
php artisan make:migration change_users_table --table=users
```

随時更新予定
競技プログラミングでよく使う便利系関数をまとめてみた

#競技プログラミングでよく使う便利系関数をまとめてみた
　今回はAtCoderでよく使う便利系関数をまとめてみました。とりあいず今思いつく範囲で書いてますが、思い出したら追加していきます。

###0.前提
```c
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD=pow(10,9)+7;
```
　前提として以上のようにしています。

###1.最大公約数、最小公倍数
```c
ll gcd(ll a,ll b){
    if(a<b)swap(a,b);
    if(a%b==0)return b;
    return gcd(a%b,b);
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
```
　gcdが最大公約数、lcmが最小公倍数です。どちらも計算量はO(log N)程度らしいです。lcmはa/gcd(a,b)*bとしてるのがポイントです。(オーバーフローしないように)

###2.modPow
```c
ll modPow(ll x,ll n,ll mod=MOD){
    if(n==0)return 1;
    if(n%2==0)return modPow(x*x,n/2,mod)%mod;
    return x%mod*modPow(x,n-1,mod)%mod;
}
```
　xのn乗をmodで割ったものを返します。繰り返し2乗法を用いてるため計算量はO(log N)と高速です。

###3.各位の和を返す
```c
ll getSumDigit(ll N){
    string s=to_string(N);
    ll ret=0;
    for(int i=0;i<s.size();i++)ret+=(s[i]-'0');
    return ret;
}
```

###4.nCk mod p
```c
class Combination{
public:
    vector<ll>fac;
    vector<ll>finv;
    vector<ll>inv;

    Combination(ll MAX,ll mod=MOD){
        fac.resize(MAX+2);
        finv.resize(MAX+2);
        inv.resize(MAX+2);
        fac[0] = fac[1] = 1;
        finv[0] = finv[1] = 1;
        inv[1] = 1;
        for (int i = 2; i < MAX; i++){
            fac[i] = fac[i - 1] * i % MOD;
            inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
            finv[i] = finv[i - 1] * inv[i] % MOD;
        }
    }

    ll com(int n, int k){
        if (n < k) return 0;
        if (n < 0 || k < 0) return 0;
        return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
    }
};
```
  コンビネーションをmodで割った余剰を求めるものを求めるものです。[この記事](http://drken1215.hatenablog.com/entry/2018/06/08/210000)を参考(丸パクリ)してます。本家ではグローバル変数でやってましたが、クラス化してます。前処理でO(N)、comはO(1)で返すことができます。

###5.ランレングス圧縮っぽいもの
```C
vector<ll> countVector(vector<ll>v,ll guard=-1){
    ll size=v.size();
    //番兵を追加(初期値は-1)
    v.push_back(guard);
    vector<ll>ret;
    ll count=1;
    for(int i=0;i<size;i++){
        if(v[i]==v[i+1]){
            count++;
        }else{
            ret.push_back(count);
            count=1;
        }
    }
    return ret;
}
```
 (2019/12/24追記)うまく言えませんが、例えば{2,2,2,3,3,1,2}を渡したら{3,2,1,1}みたいに連続する個数の配列を返す関数です。意外とよく使うので便利です。
 (2019/12/29追記)ランレングス圧縮なんていうそうです。

###INF.最後に
　一旦はこんな感じでまとめてみました。思い出したら追加していきます。お役になてれば幸いです。最後になりましたが、コードを勝手に参考にさせていただいた方ありがとうございましたm(_ _)m
StreamでBuffer.concatしない冴えたやりかた

## はじめに

この記事は [Node.js Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nodejs) の 24 日目です。

> https://twitter.com/yosuke_furukawa/status/1201778011286065153
> Yosuke FURUKAWA @yosuke_furukawa
> なんだこの誕生日アドベントカレンダーは / “Node.js Advent Calendar 2019 - Qiita”
> 午後5:19 · 2019年12月3日·はてなブックマーク

最初は誕生日カレンダーみたいになってたので、ネタ記事を書こうかなーと思っていました。
ですが、始まってみると案外真面目な記事ばかりだったので、真面目に書くことにしました。
*(そう、私は12/24生まれです！{クリスマス,誕生日}{ケーキ,プレゼント}はいつも一つ。)*

## StreamでBuffer.concatしない冴えたやりかた

一般的にStreamを扱う時は `on("data", ...)` で処理することが多いと思います。
しかし、実際に使うサイズと流れてくるサイズは一致しないことが多く…

```js
const net = require('net');

function onRecv(packet){ /* ... */ }

const server = net.createServer(conn => {
	let receivedQueue = Buffer.alloc(0);
	conn.on('data', chunk => {
		let data = Buffer.concat([receivedQueue, chunk]);
		//40バイトずつ読み出したい
		while(data.length >= 40){
			onRecv(data.slice(0, 40));
			data = data.slice(40);
		}
		receivedQueue = data;
	});
}).listen(3000);
```

のような処理になりがちです。…なんだか冗長に感じませんか？

他の言語では読み出し可能バイト数を取得、指定バイト以上なら一気に読み出す…みたいな処理を書くことが多いと思います。Arduinoのシリアル通信とか。
Node.jsで同じような処理は書けないのか？**書けます。**

Node.jsには、任意のバイト数を読み出すための `readable` イベントが存在します。

しかし、以前までは "読み出し可能なバイト数" を取得する方法が
`stream._readableState.length`
しかありませんでした。`_`が気になりますね…
でも今は大丈夫！
v9.4.0から、これを取得するための `readableLength` プロパティが追加されています。
`stream.readableLength`
罪悪感(?)が無くなりましたね。

これを使うと、先程のコードを以下のように書くことができます:


```js
const net = require('net');

function onRecv(packet){ /* ... */ }

const server = net.createServer(conn => {
	conn.on('readable', () => {
		while(conn.readableLength >= 40){
			onRecv(conn.read(40));
		}
	});
}).listen(3000);
```

ああ…気持ちいい！これが書きたかった。これが求めていたもの・・・
コードが綺麗になることは勿論、Buffer.concatはデータの複製を行うので、処理速度の改善も期待できます。
このパターンが使える場面では積極的にreadableイベントを使っていきましょう。

## 注意点

この方法で読み込める最大バイト数は `highWaterMark` までになります。
大きなデータをまとめて取得したい時は、 `highWaterMark` の上限値を拡大する必要があります。
※ただ、デフォルトの `highWaterMark` を超えるデータを一気に処理する処理自体あまり良くないので、少しずつ処理できるようにしたほうがいいかもしれません。

p.s. `highWaterMark` は、シンプルに説明すると他言語のbufferSizeみたいなものです。(実際にはもっとイケてる実装の一部だったりしますが、とりあえずはそんなものだと思えば十分。)
## さいごに

あまりreadableイベントを使った記事を見かけないので書いてみました。お試しあれ。
おわりー。
CircleCiで、mysqlのDBに接続してテストを通す。ruby on rails

# ruby on railsのCircleCiで結構はまったのでメモ

## データベースの接続設定

```appli/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost

test:
  <<: *default
  username: 'root'
  password: 'rootpass'
  port: 3306
  host: '127.0.0.1'
  database: ci_test
```

```circleci/config.yml
# Ruby CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
#
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here 
      - image: circleci/ruby:2.6.5-node-browsers
        environment:
          BUNDLER_VERSION: 2.0.1
          RAILS_ENV: test
          DB_HOST: 127.0.0.1
          DB_USERNAME: 'root'
          DB_PASSWORD: 'rootpass'

      - image: circleci/mysql:5.7.22
        environment:
          MYSQL_DATABASE: 'ci_test'
          MYSQL_USER: 'root'
          MYSQL_ROOT_PASSWORD: 'rootpass'
      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # - image: circleci/postgres:9.4

    working_directory: ~/repo

    steps:
      - checkout
      - run:
          name: yarn install
          command: yarn install
      - run:
          name: setup bundler
          command: |
            sudo gem update --system
            sudo gem uninstall bundler
            sudo rm /usr/local/bin/bundle
            sudo rm /usr/local/bin/bundler
            sudo gem install bundler
        # Download and cache dependencies
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-

      - run:
          name: install dependencies
          command: |
            yarn install --check-files
            bundle install --jobs=4 --retry=3 --path vendor/bundle

      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}

      # Database setup
      - run:
          name: bundle exec
          command: |
            dockerize -wait tcp://127.0.0.1:3306 -timeout 120s
            bundle exec rake db:create
            bundle exec rake db:schema:load

      # run tests!
      - run:
          name: run tests
          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
              circleci tests split --split-by=timings)"

            sudo gem install bundler
            sudo gem install rspec
            sudo gem install rspec-core
            bundle exec rspec \
              --format progress \
              --format RspecJunitFormatter \
              --out /tmp/test-results/rspec.xml \
              --format progress \
              $TEST_FILES

      # collect reports
      - store_test_results:
          path: /tmp/test-results
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results

```
React Nativeを始めて4ヶ月の人間が1週間でどこまでアプリを作れるか？

React Native Advent Calendar 2019 [21日目](https://qiita.com/advent-calendar/2019/react-native)の記事です。

## はじめに
初めまして。
ecbo株式会社でエンジニアをしている江原（[@yakiniku](https://twitter.com/yakiniku040220))と申します。
今年の8月にecbo株式会社に転職してきて初めてアプリの開発に携わったので、何かしらアウトプットしたいと思い、今回React Native Advent Calendar参加させていただきました。（土日体調崩して公開遅れました。:bow_tone1:）

内容はReact Nativeを始めて4ヶ月の人間が1週間でどこまでアプリが作れるかという内容です。（担当する曜日の1週間前に決めました。そのため内容は薄いのと、他の方の記事と比べて役になるような内容はほとんどないのでご了承ください。）

## 1週間で作った成果物
僕自身幼稚園から料理趣味でやっていて、日頃料理のメモをよく取るので個人で使いやすいようなメモアプリにしました。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271450/b8e93f79-e091-a158-79f4-b2986cc25dbc.gif)

gifなので画質が荒くてすみません。
この１週間で終わっている内容として
- Splash Screenの設定
- 起動時のLottie作成
- BottomMenuの作成
- 投稿ボタンからフォームへの遷移
- TextInputの追加実装
- 画面ロックの設定
が完了しました。

平日普通に働いてるのもあり、あまり進んでいませんが起動からフォームまでの導線がある程度できたのは良かったかなと思います。
現状の開発でそこまで実装の沼にハマった部分はないですが、今後FireStore周りやAlgoliaを使う予定なのでそこで実装の沼にハマる気がしますw

今後の開発として
- settingページ作成
- FireStoreに投稿
- FireStoreからデータを取得
- listページ作成
- Algoliaを使っての検索
- Bitriseを使ってのbuild
- App Distributionを使ってのアプリ配布
- Android端末での開発

を実装する予定です。
ここで得られた知見があったらどんどん記事にしようかと思ってます。

## モジュール一覧
現状使用しているものは以下の内容です。
- [lodash](https://github.com/lodash/lodash)
- [lottie-react-native](https://github.com/react-native-community/lottie-react-native)
- [react-native-splash-screen](https://github.com/crazycodeboy/react-native-splash-screen)
- [react-native-vector-icons](https://github.com/oblador/react-native-vector-icons)
- [react-navigation](https://github.com/react-navigation/react-navigation)
- [react-navigation-stack](https://github.com/react-navigation/stack)
- [react-navigation-tabs](https://github.com/react-navigation/tabs)
- [typescript](https://github.com/microsoft/TypeScript)
- [react-native-keyboard-aware-scroll-view](https://github.com/APSL/react-native-keyboard-aware-scroll-view)


## まとめ
アプリを開発してまだまだ日が浅いですが、Webとは違った開発の楽しさがあるので
またReactをいじったことがあってアプリを作りたい人にはかなりおすすめです。

あと個人的にはreact-navigationはかなり使いやすいなと思いました。
ドキュメントは英語ですが、機能がかなり充実しているので汎用性が高いモジュールかなと思います。

今後もReact Nativeに関して色々発信できたらと思いますので宜しくお願い致します。
アプリを見比べたいじゃない

# アプリを見比べたい

アプリもリリースしてから年月が経つと

「今のアプリの動きってどんなだっけ。。。」

「あれ？改修後はどうなるんだっけ？？」

といった具合で改修前、改修後のアプリを見比べたい時なんかが発生してきます

ですが普通にアプリを端末にインストールするとPackege（ApplicationID）が一緒なもんだからアプリを上書きインストールしてしまうんですよね。。。

あーこまった。。

##そんな時にFlavor

そう、そんな時に役立つのがFlavorなんです

前回[こちらの記事](https://qiita.com/ga_ga_chickin/items/2226f334ced1b4de2fa3)でConstファイルとか切り替えられるよっていう話をしたんですけど、Flavorさんが変えられるのはファイルだけじゃなかった

##接頭詞をつけちゃうよ

今回Flavorにやってもらう仕事はApplicationIDに接頭詞をつけることです
開発APIサーバに向いているFlavorにはdev
<img width="952" alt="スクリーンショット 2019-12-23 20.38.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241057/e58d5a06-056e-3524-64e3-e9a45fc69c3a.png">
本番APIサーバに向いているFlavorにはprod
<img width="952" alt="スクリーンショット 2019-12-23 20.37.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241057/5db1637c-f336-0787-6a22-592de51c1ce8.png">

みたいな感じね

ついでにアプリの名前も変えちゃおう
開発API向きには「テスト」
<img width="1417" alt="スクリーンショット 2019-12-23 20.41.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241057/1d8d610b-1351-8270-fd9b-d600e44afeda.png">
本番API向きは「本番」
<img width="1417" alt="スクリーンショット 2019-12-23 20.41.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241057/d18372b6-4ff3-8296-8a36-6b4b294500c1.png">

とかつけちゃう

これでインストールしてみよう

##いいかんじ
![Screenshot_20191223-204809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241057/e4eb1857-9430-8154-18c3-e3900f5e018c.png)

見事「本番」アプリと「テスト」アプリを２つ一緒にインストールできました

名前もパット見でわかりやすくていいですね

Flavorを増やせば好きなようにアプリを見比べることができるので

この小技はおすすめです

では