OmniAICreator/Qiita-1.07M huggingface dataset:
プロジェクト起動したら画面が真っ黒になった。"Default Configuration" for UIWindowSceneSessionRoleApplication contained UISceneDelegateClassName key, but could not load class with name

## 状況
Tinderの擬似アプリ作ろうと久々に新規プロジェクト作成してビルドしたら

```
"Default Configuration" for UIWindowSceneSessionRoleApplication contained UISceneDelegateClassName key, but could not load class with name
```
こんなエラー出て画面が真っ黒に。。。。

## 対策
`Main.storyboard`を`Move to Trash`して
`Home.storyboard`を新たに作成したらちゃんと読み込んでくれました

※追記(19/12/16)
**・[プロジェクト起動したら画面真っ黒[Swift][Info.plist configuration "Default Configuration" for UIWindowSceneSessionRoleApplication contained UISceneDelegateClassName...] - Qiita](https://qiita.com/emperorProgKen/items/211b3e4de9c8ff4cec5c)**
作り直したと書いているので上の記事とはまた違う状況かもしれないけどもう覚えてない。
上の記事と同じで`SceneDelegate.swift`を消してしまっていたパターンだったオチかもしれない。。。

#### ポイント
- `is Inisital ViewController`はチェック入れてた
CAPL - getLocalTimeで現在日時を取得する

# CANにおける日時情報って？
ご存知の通り車載のCANバス上には様々なメッセージが流れていますが、
その中でも重要な情報のひとつに日時情報があります。

データを記憶したときのタイムスタンプとしていっしょに覚える、時間の同期として使う。いろいろな用途があるかと思います。

送り主は時計機能を持ったECU。受け手はその情報が必要なECUです。

# 日時情報が必要なときって？
前項にある、「受け手のECU」を開発しているときです。
開発中、通常はCANoeなどのCANモニタを使って、ECU単体を評価します。
このとき、送り手ECUを模擬し、日時情報を送信してあげる必要があります。

# 日時情報の取得の仕方
CAPLが標準提供しているgetLocalTime()関数を使いましょう。

引数には要素を9個持ったlong型配列を渡します。戻りとして、引数にお使いのコンピュータのシステム日時が格納されます。

配列の各バイトにはそれぞれのデータが格納されます。例を見てみましょう。

　　long tm[9];
　　getLocalTime(tm);
　　tm[0]; /* 秒(0-59) */
　　tm[1]; /* 分(0-59)  */
　　tm[2]; /* 時(0-23)    */
　　tm[3]; /* 日(1-31)     */
　　tm[4]; /* 月(0-11)   */
　　tm[5]; /* 年(1900年からの相対年数)    */

6番目の年だけ注意が必要です。2019年の場合、119が格納されます。
配列７～９番目にも何かしら格納されるのですが、使ったことが無いので割愛します笑
気になる方はCANoe等のヘルプページをご覧ください。

# まとめ
今回は、getLocalTimeでの日時取得方法をご紹介しました。
CAN開発する上で、頻出ではないかもしれませんが、重要な日時情報。
自由に使えるようになると、開発・評価の幅が広がるかもしれません。

コメントお待ちしています！
初めてのVulkanプログラミング step6 シェーダステージの作成

実際にシェーダーをパイプラインで使用できるようにするには、パイプラインステージにシェーダーを割り当てる必要があります。

```cpp
	VkPipelineShaderStageCreateInfo shaderStageCreateInfoVert;
	shaderStageCreateInfoVert.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
	shaderStageCreateInfoVert.pNext = nullptr;
	shaderStageCreateInfoVert.flags = 0;
	shaderStageCreateInfoVert.stage = VK_SHADER_STAGE_VERTEX_BIT;
	shaderStageCreateInfoVert.module = _shaderModuleVert;
	shaderStageCreateInfoVert.pName = "main";
	shaderStageCreateInfoVert.pSpecializationInfo = nullptr;
```

stype... 構造体のタイプ

stage... どのタイプのシェーダーか指定します。VKShaderStageFlagBitsから指定する。下記

module...このステージで含む、シェーダーモジュール

pName...このシェーダーのエントリーポイント名を指定するポインター

```c++
typedef enum VkShaderStageFlagBits {
    VK_SHADER_STAGE_VERTEX_BIT = 0x00000001,
    VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = 0x00000002,
    VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = 0x00000004,
    VK_SHADER_STAGE_GEOMETRY_BIT = 0x00000008,
    VK_SHADER_STAGE_FRAGMENT_BIT = 0x00000010,
    VK_SHADER_STAGE_COMPUTE_BIT = 0x00000020
}
```

同様に**フラグメントシェーダ**のステージを作成します。

```c++
	VkPipelineShaderStageCreateInfo shaderStageCreateInfoFrag;
	shaderStageCreateInfoFrag.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
	shaderStageCreateInfoFrag.pNext = nullptr;
	shaderStageCreateInfoFrag.flags = 0;
	shaderStageCreateInfoFrag.stage = VK_SHADER_STAGE_FRAGMENT_BIT;
	shaderStageCreateInfoFrag.module = _shaderModuleFrag;
	shaderStageCreateInfoFrag.pName = "main";
	shaderStageCreateInfoFrag.pSpecializationInfo = nullptr;
```
Linux プロセス

今回はlinuxのプロセス
つまり稼動経緯について書きます。

# プロセス
WEBサーバやコマンドなどLinux上で実行されている処理
プロセスはプロセス名とプロセスIDという番号が自動的に付与されてます。

プロセスの性質として

* プロセス毎に自分だけのメモリを割り当てられる
* WEBサーバなどネットワーク機能を利用するプロセスはポートを専有する

1つのCPUが一度に実行できるプロセスは1つだけなので
基本格プロセスが順番に使っている形です。

# psコマンド (プロセスを確認)

```bash:ターミナル
$ ps 

確認例
 PID TTY           TIME CMD
 1139 ttys000    0:00.03 -bash
```

## psコマンドのオプション
| オプション名 | 意味 |
|:-:|:-:|
| -a | 自分以外のユーザーのプロセスも表示する。 |
| -r | 実行中のプロセスのみを表示する。 |
| -u | ユーザー名とプロセスが実行された時刻を表示する。 |
| -aux | 実行中のすべてのプロセスに関してCPU使用率などの詳細な情報つきで表示する。 |

# | (パイプ)処理　(複数のコマンドを組み合わせ)
パイプ処理とは、あるコマンドの結果を次のコマンドに渡す処理のことです。パイプ処理を用いたコマンドの組み合わせは以下の様になります。

```bash:ターミナル
$ <最初に実行されるコマンド> | <右の結果を受けて最終的な結果を返すコマンド>

例
$ cd ~ #ホームディレクトリに移動
$ ls | grep p  #ホームディレクトリ以下のファイル群から 'p'という文字が含まれるものだけを表示
$ ps aux | grep mysql | grep -v grep  #mysqlサーバーの実行プロセスを探しだして表示
```

## grepコマンド
grepコマンドは特定の文字列が含まれる一行を抽出するためのコマンドです。

```bash:ターミナル
grep [検索ファイル] [検索パターン]
```

# kill <...> (プロセスを終了)
プロセスIDに対して特定のコマンドを実行することで、プロセスを再起動したり、強制終了したりできます。

```bash:ターミナル
$ kill [プロセスID] # プロセスを終了させる
$ kill -9 [プロセスID] # プロセスを強制終了させる
````

強制終了の場合、オプションで-9をつけます。
通常のkillコマンドで削除できない場合はこちらを使用。
GoogleColabratoryでGoogleDriveにある画像を表示するためのTips

# GoogleColaboratoryで画像をうまく貼り付けられない問題
GoogleColabでは画像を貼り付けようとしても、画像ボタンを押して出てくるのはURLを貼り付けるといった状態でうまく行かないなんてことありませんか？
そんなColabでもGoogleDriveで、**あること**をすればうまく行くことがわかったのでTipsとして共有します。

# GoogleDriveに載せたい画像を準備
まず、GoogleDriveにColab上で載せたい画像をアップロードします。
<img width="442" alt="画像アップロード時の様子" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/6596fc89-85e6-f608-a1e6-3c6b43d16398.png">
(この画像元は[ここから](https://arxiv.org/abs/1512.00567)の引用です。InceptionV3での説明の際に引用させて頂きました。)
アップロードした画像を右クリックすると、共有と言う項目が出現する
<img width="415" alt="共有項目" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/30ad9730-93da-391a-7031-09b20280c3b0.png">

共有で、「リンクを知っている全員が閲覧可」として設定しておきましょう。
<img width="580" alt="スクリーンショット 2019-11-26 22.15.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/2fc94eda-7c54-e832-0e77-9f65e54010ba.png">

もし社用のDriveなどを使っている場合は、詳細から「URLを知っている人のみ閲覧可」としましょう。
<img width="532" alt="社用DriveからOpenAccessする方法１" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/ca48ca2e-9b35-f808-0993-f5a568ea893a.png">
<img width="493" alt="社用DriveからOpenAccessする方法2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/3f5c5904-08d9-907c-e6c1-7499a539fd74.png">

(この設定で社外の人も観れますが、検索で引っかかることはないので安心してください。)
(また、個人で記事を載せるのに社用Driveを使っているとリソースを不当に扱っているとも場合によっては判断されかねないので注意です)

# 画像URLを取得
公開準備ができた画像のURLを取得します。再度画像を右クリックして、今度は「共有可能なリンクを取得」から共有リンクを持ってきます。
<img width="448" alt="共有可能なリンクを取得する" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/daca89fe-3088-ff99-4f2a-74bcf8a551c8.png">
<img width="384" alt="共有可能なリンクがこちら" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/1c9bea6b-8ac7-0c31-9cb1-c1ebdb5c9410.png">


共有リンクをそのままColab上で画像ボタンをクリックして出てきたURLに上書きします。

<img width="682" alt="colab上でURLを設定する" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/c9d32489-63e2-26bc-8f8f-f68572c884d6.png">


ただ、これだけではうまく行かないので、urlの**open?id の部分をuc?idに変更します。**
<img width="686" alt="スクリーンショット 2019-11-26 22.30.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/e48d8dc3-dfa6-f364-055a-23e674cdb7e9.png">

これで画像がColab上に表示されるようになりました。

# なぜOpenではうまく行かないのか。

OpenではDrive上でのサイトに飛んでしまうリンクだからです。直リンクは別で、ucタグをつけなければいけません。
ただし、ucタグは検索したところでは、どうやら裏コマンド的存在らしく、Downloadの際に使っているものらしいです。
なので、24時間以内に閾値以上の多数の画像リクエストが飛ぶと、blockされるようになっています。
[参考サイトはこちら](https://www.ghacks.net/2017/04/14/fix-google-drive-sorry-you-cant-view-or-download-this-file-error/)
もしこのURLの指定方法で、静的サイト等の画像を表示させようとしてるなら、辞めることをオススメします。
素直にS3とかGCPのCloudStrageとか使いましょ。

# 代替手段はないの？

今の所クラウドストレージ全般、こんな感じみたいなのでどこも一緒みたいです。
「画像 アップロード 永久」みたいな検索ワードで調べても、セキュリティソフトが反応するようなサイトしかないので、やめておいたほうがいいです。

GitHubという手もなくはないですが(静的サイトなら載せられるくらいだし)、今回のような引用系の画像ですと、
レポジトリって再配布しているようなものだし、著作権的に難しいですよね。
引用は良くても、再配布目的になってしまいかねないので、私はGoogleDriveをオススメします。
java学習４日目

<h1>スッキリわかるjava入門 第２版 ５章まで</h1>

<ul>
<li>１章　プログラムの書き方</li>
<li>２章　式と演算子</li>
<li>３章　条件分岐と繰り返し</li>
<li>４章　配列</li>
<li>５章　メソッド</li>
</ul>



<p>今日で５章のメソッドまで読むことが出来た。<br>ProgateでJavaコースを達成してからこの参考書を読み始めたので今のところは、割とすんなり理解できている。</p>
AKS ConfigMap でアプリケーションの設定情報を管理する

今回は、アプリケーションの設定情報を管理する方法をみていきたいと思います。認証情報や API キーは環境に依存するため、コンテナーイメージそのもので管理するのではなく、別の方法で管理するのが望ましいです。Kubernetes の場合は、ConfigMap を使用して管理を実施します。
2つの代表的な方法を見ていきましょう。

#Kubernetes のマニフェストファイルを作成する方法
マニフェストファイルの Kind を `ConfigMap` として作成します。以下の例では、キーが `project.id` で値が `hello-kubernetes` である ConfigMap を示しています。

```configmapsample.yaml
apiVersion: v1
kind: ConfigMap
metadata:
    name: project-config

data:
    project.id: "hello-kubernetes"
```

これを Pod を作成するのと同じ要領で、マニフェストファイルの適用を実行します。

```
$ kubectl apply -f ConfigMap/configmap.yaml
configmap/project-config created
```

Pod の詳細を確認するのと同じように、`describe` コマンドを使用して、ConfigMap の詳細を確認します。これでクラスターに ConfigMap が作成されたことを確認することができました。

```
$ kubectl describe configmap project-config
Name:         project-config
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"v1","data":{"project.id":"hello-kubernetes"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"project-config","names...

Data
====
project.id:
----
hello-kubernetes
Events:  <none>
```

#アプリケーションの Config ファイルをマウントする
もうひとつの方法は、アプリケーションの config ファイルそのものをマウントする方法です。その際は Azure CLI から以下の `kubectl create configmap` コマンドを実行することで適用できます。実際に見ていきましょう。

例えば作成したアプリケーションに以下の様なアプリケーションの config ファイルがあるとします。

```ui.ini
color.top = blue
text.size = 10
```

このファイルを `kubectl create configmap` コマンドで適用してみましょう。

```
$ kubectl create configmap app-config --from-file=ConfigMap/config
configmap/app-config created
```

以下コマンドにて確認すると、`app-config` という名前の ConfigMap が作成されていることが分かります。

```
$ kubectl get configmap
NAME             DATA   AGE
app-config       1      31s
project-config   1      9m4s
```

この二つの方法がクラスターでアプリケーションの設定情報を管理する方法です。マニフェストファイル / ConfigMap コマンドで管理できるので、変更のあった際でもクラスターへの割り当てや Pod の管理が容易だということが想像えきるかと思います。次回は Pod から ConfigMap の値を見る方法についてみていきたいと思います。

#参考
Configure a Pod to Use a ConfigMap
https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
libvipsを使ってRails6でActiveStorageする【Windows,Ubuntu環境】

#この記事でつくるもの
RailsのActiveStorageを使って簡単なサムネイル表示するCRUDを作成します。
![tmp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530426/ff266c39-8d57-2504-9fdf-66e42b8daf3c.gif)

#手順
- Ubuntuにlibvipsの最新ソースを持ってきて、ビルドとインストール
- UbuntuからWindow環境をマウントしてrails new
- ActiveSrorageに必要なRailsコマンドと設定
- 必要なgemのインストール
- Ubuntuからrails s



#Ubuntuにlibvipsの最新ソースを持ってきて、ビルドとインストール
RailsのActiveStorageはlibvipsまたはImageMagickが必要です。
この記事では実行速度の速いlibvipsを使用します。

まずは必要なパッケージをインストールします。

```Ubuntu:Ubuntu
$ sudo apt-get install git build-essential libxml2-dev libfftw3-dev \
	libmagickwand-dev libopenexr-dev liborc-0.4-0 \
	gobject-introspection libgsf-1-dev \
	libglib2.0-dev liborc-0.4-dev
```
<br>gitソースから取得したソースをビルドするのに必要なパッケージ

```Ubuntu:Ubuntu
$ sudo apt-get install automake libtool swig gtk-doc-tools 
```
<br>libvips取得し、ビルドとインストール

```Ubuntu:Ubuntu
$ git clone https://github.com/libvips/libvips.git
$ cd libvips
libvips$ ./autogen.sh
libvips$ make
libvips$ sudo make install
```
<br>PATHの設定

```Ubuntu:Ubuntu
$ export VIPSHOME=/usr/local
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$VIPSHOME/lib
$ export PATH=$PATH:$VIPSHOME/bin
$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$VIPSHOME/lib/pkgconfig
$ export MANPATH=$MANPATH:$VIPSHOME/man
```
#UbuntuからWindow環境をマウントしてrails new
UbuntuではWindow環境をマウントして参照できます。
Windowsからの方がソース編集しやすいので、マウントしてrails newします。

```Ubuntu:Ubuntu
$ cd /mnt/c/tmp_rails
/mnt/c/tmp_rails$ rails new sample
/mnt/c/tmp_rails$ cd sample
```
#ActiveSrorageに必要なRailsコマンドと設定
ActiveSrorageを使うためのマイグレーションファイルを作成

```Ubuntu:Ubuntu
/mnt/c/tmp_rails/sample$ rails active_storage:install
```
<br>Userモデルをscaffoldで作成

```Ubuntu:Ubuntu
/mnt/c/tmp_rails/sample$ rails g scaffold user name image:attachment
```
<br>Userモデルにはimage:attachmentによりhas_one_attachedが追加される

```Ruby:app/models/user.rb
class User < ApplicationRecord
  has_one_attached :image
end
```
<br>モデルをマイグレーションする

```Ubuntu:Ubuntu
/mnt/c/tmp_rails/sample$ rails db:migrate
```
<br>showページでサムネイル表示するようにする

```ERB:app/views/users/show.html.erb
<p>
  <strong>Image:</strong>
  <%= image_tag @user.image.variant(resize_to_limit: [100, 100]) %>
</p>
```

<br>libvipsを使うように指定

```Ruby:app/config/application.rb
module Sample
  class Application < Rails::Application
    config.load_defaults 6.0
    config.active_storage.variant_processor = :vips #追記
  end
end
```

#必要なgemのインストール
image_processingはコメントアウトを外し、ruby-vipsは追記します

```Gemfile:Gemfile
gem 'image_processing', '~> 1.2'
gem 'ruby-vips'
```

#Ubuntuからrails s
```Ubuntu:Ubuntu
/mnt/c/tmp_rails/sample$ rails s
```
これで http://127.0.0.1:3000/users をブラウザから開けばデモのように動きます。

#参考
https://github.com/libvips/libvips/wiki/Build-for-Ubuntu
【区間推定】最尤推定量を利用した近似的な信頼区間の構成法を数値実験で確かめる

# 背景
前回（[【区間推定】信頼区間の解釈、構成法について数値実験してみる](https://qiita.com/jajagacchi/items/1bc96cafd3e6701b56b1)）は尤度比検定を用いて信頼区間を構成しました。
「現代数理統計学」(竹村彰通)（以後教科書）の９章５節では最尤推定量を利用した近似的な信頼区間の構成法について述べられています。この方法はフィッシャー情報量と最尤推定量があれば汎用的に使えるため便利そうです。数値実験してみます。

# 最尤推定量の漸近的な性質を利用する
最尤推定量は標本サイズ$n$が大きいとき、近似的に平均$\theta$(母数)、分散$1/(nI(\theta))$の正規分布に従います。$I(\theta)$はフィッシャー情報量です。よって、統計量$\sqrt{nI(\theta)}(\hat\theta_n-\theta)$は標準正規分布に従い、$z_{\alpha/2}$を標準正規分布の両側$\alpha$点とすると、

```math
-z_{\alpha/2}<\sqrt{nI(\theta)}(\hat\theta_n-\theta) < z_{\alpha/2}
```
に$1-\alpha$の確率で入ります。これを$L<\theta<R$の形にすれば信頼区間がわかります。

# 数値実験
ポアソン分布から$n$個の数をサンプリングし、$\lambda$を区間推定します。フィッシャー情報量は

```math
I(\lambda) = 1/\lambda
```
です（計算は省略します）。$\lambda$の最尤推定量は$\hat\lambda_n = \bar x$です。

```math
-z_{\alpha/2} < \sqrt{n/\lambda}(\bar x-\lambda) < z_{\alpha/2}
```
を$L<\lambda<R$の形に変形することを考えます。しかし、$1/\sqrt\lambda$がやっかいです。教科書で紹介されている近似法では、$n$が十分に大きければ$\lambda \simeq \bar x$が期待されますので、$I(\lambda)\simeq I(\bar x)$とします。こうすれば

```math
\bar x - \sqrt{\bar x/n}z_{\alpha/2} < \lambda < \bar x + \sqrt{\bar x/n}z_{\alpha/2}
```
となりますので、信頼区間が求まります。
教科書には書いてありませんが、せっかく目の前にこの教科書が書かれた当時には信じられない性能を持つ計算機がありますので、網羅的に不等式を満たす$\lambda$を探索する方法も試してみたいと思います。$\lambda=3,\alpha=0.05$とします。$z_{\alpha/2}\simeq 1.96$となります。標本サイズは$n=5$としました。

```c++
#include <iostream>
#include <fstream>
#include <random>
#include <vector>

int factorial(int k)
{
	int ret = 1;
	for (int i = 1; i <= k; i++)
	{
		ret *= i;
	}
	return ret;
}

int main(int argc, char **argv)
{
	std::mt19937 mt(0);
	double lambda = 3;
	int N = 100;//標本サイズ
	std::poisson_distribution<int> poi(lambda);
	double alpha = 0.05;
	double z = 1.96;
	
	int Iter = 100;
	std::ofstream ofs0("aprox.txt");
	std::ofstream ofs("loop.txt");
	for (int iter = 0; iter < Iter; iter++)
	{
		std::vector<int> data(N);
		double av = 0;
		for (int n = 0; n < N; n++)
		{
			data[n] = poi(mt);
			av += data[n] / (double)N;
		}
		double l, r;
		l = av - sqrt(av / (double)N) * z;
		r = av + sqrt(av / (double)N) * z;

		double L, R;

		for (double lambda0 = 0; lambda0 < 20; lambda0 += 0.01)
		{
			if (-z<sqrt((double)N/lambda0)*(av-lambda0) && z > sqrt((double)N / lambda0) * (av - lambda0))
			{
				L = lambda0;
				break;
			}

		}
		for (double lambda0 = 20; lambda0 >= 0; lambda0 -= 0.01)
		{
			if (-z<sqrt((double)N / lambda0) * (av - lambda0) && z > sqrt((double)N / lambda0) * (av - lambda0))
			{
				R = lambda0;
				break;
			}
		}

		ofs0 << iter << " " << av << " " << l << " " << r << std::endl;
		ofs << iter << " " << av << " " << L << " " << R << std::endl;
	}

	return 0;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/f899eb84-c17b-6974-a2ec-1f95ec86f3de.png)
標本サイズが小さい割にはフィッシャー情報量を近似しても大きな差はありません。意外でした。$n=100$まで増やしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/c0f35fed-7369-bd86-34ec-ed915d73235d.png)
前回行った尤度比検定の結果とそれほど変わらないように見えます。教科書によりますと、近似なので$\alpha$からやや離れてしまうこともあるということですが、今回はよい結果が得られていると思います。

# 今後
とりあえずここで区間推定の勉強は一区切りとします。本当は、ブートストラップ法との比較などもしたいのですが、教科書を一通り読んでしまうことを優先します。その後にブートストラップ法との比較等もしたいと思っています。
３年目webプログラマの頭が冴える現在ベストな生活習慣

qiita初投稿。
・７時間睡眠時間を確保。(必要であれば睡眠時間を削る。削った分は翌日仮眠で必ず補う。
・朝食は食パン一枚を毎日固定して食べている。これは思考しないことで時間を増やして他の作業に一分でも割ける。
・コーヒーなどのカフェイン飲料を頼る。一日に４～５杯は飲む。
・朝に５分以上の運動をする。（
・眠気ややる気が出ないときは激しい曲を聴く。歌詞等でやる気が出る音楽でも良い。
・とにかくTodoリストなどを書く。
・個人的に人の短期記憶は信用してないので反復的な記憶やメモを取ったりして忘れたときに読み返したりすることによって確実に定着することを何度も経験してるのでメモを取りまくっている。
qiitaなどもそれで活用しようと決心した。
・とにかく行動すればやる気は後からついてくると言い聞かせる。寝落ちしない限り疲れは気のせいと言い聞かせる。
・普段は専門書などは流し読みしている。読みたい部分だけとか。体系的な知識を入れることに活用している。あとは掘り下げて作ったりしている。体系的な知識と手を動かすことは多ければ多いほどいいと思う。

前にも述べたがメモして反復しての繰り返しは最強。習慣化すれば少しの行動でも慣れてくる。
macOS Catalinaにアップデートした後にgccが使えなくなった

##macOS Catalinaにアップデートしたらgccが使えなくなった。

結論:`xcode-select --install`をターミナルで実行する

##詳細
具体的なエラーは`xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun`
と出た。
xcodeの問題かと思ってxcodeのアップデートをしようと考えたが、アップデートさえできない。
調べたら、xcode-selectがxcurnを管理しているらしい。
xcode-selectはデベロッパディレクトリの場所を管理しているらしい。

##感想
xcode-selectを初めて聞いた。
デベロッパディレクトリも初めて聞いた。
もっと勉強しなきゃ。

##参照
https://qiita.com/nishina555/items/e23d73067a5cac182a63
https://qiita.com/gooichi/items/017cf84ec52726ccd785
【C++】std::thread についての覚え書き

#はじめに
**std::thread**を利用していて、困った箇所、詰まった箇所がいくつかあったため、覚え書き程度に。

#基本

**std::thread**を利用しているということは、マルチスレッド処理をしたい！ということであります。
まずは簡単な基本的な使い方から。

```C++:sample.cpp
// threadを利用するために必要
#include <thread>

void temp1()
{
     // 何らかの処理
}

void temp2()
{
     // 何らかの処理
}

int main()
{
     std::thread th1(temp1);
     std::thread th2(temp2);

     th1.join();
     th2.join();
     return 0;
}
```

とりあえず、temp1、temp2をスレッド分けすることにします。

std::threadオブジェクトを生成する際に、コンストラクタには関数ポインタを渡します。

join()関数で実行され、その後実行済みのthreadオブジェクトの中身はemptyになります。
join()した後に、もう一度同じオブジェクトをjoin()すると、怒られます。

```C++:sample.cpp
// 省略

void temp(int a)
{
}

int main()
{
     std::thread th(temp, 12);
     th.join();

     return 0;
}
```
引数がある場合は、関数ポインタの後ろに、引数順に渡してあげましょう。

ここまでが、基本的な使い方であります。

#ちょっと応用

関数ポインタではなくても、ラムダ式を渡すこともできます。

```C++:sample.cpp
int main()
{
     std::thread th([&](int a, int b)
     {
          // 処理
     }, 1, 2
     );
     th.join();
     return 0;
}
```
個人的にはあまり使わないですが、これも可能です。

#メンバ関数でやりたい場合

ここが、自分が少しだけ詰まったところです。

```C++:sample.cpp
class Temp
{
private:
    int m_count = 0;
public:
     void Work(){ m_count++; }
}
```
例えば、TempクラスのWork関数をマルチスレッドで処理したい！としましょう。

```C++:sample.cpp
int main()
{
     std::thread th(Temp::Work);
     th.join();
     return 0;
}
```
もちろん、コレはダメです。
Work関数がstaticなら動きそう？(試してない)

```C++:sample.cpp
int main()
{
     Temp temp;
     std::thread th(temp.Work);
     th.join();
     return 0;
}
```
これは一応動きます。
ですが、tempがnewしたオブジェクトだったり、Workの中身でシングルトンパターンの何かを利用していたりすると、エラーを吐かれることが稀によくありました。

とりあえず、Tempオブジェクトをnewしているということで進めていきます。

```C++:sample.cpp
int main()
{
     Temp* temp = new Temp();

     std::thread th(Temp::Work, temp);
     th.join();

     return 0;
}
```

先程ダメだと言ったばかりの、**Temp::Work**バージョンの関数ポインタに、引数としてWorkメンバ関数を持っているオブジェクトのポインタを渡してあげます。

これはmainで使っているサンプルですが、何らかのクラス内で、自分のクラスの関数をマルチスレッドにする場合、thisポインタを渡してあげましょう。

```C++:sample.cpp
class Temp
{
     void add(){}
public:
     void Work()
     {
          std::thread th(Temp::add, this);
     }
}
```
こんな感じです。

引数がある場合は、次のようにします。

```C++:sample.cpp
class Temp
{
     void add(int a, int b){ a + b; }
public:
     void Work()
     {
          std::thread th(Temp::add, this, 1, 2);
     }
}
```

メンバ関数ポインタ、オブジェクトポインタ、引数...の順です。

実はこれ以外にもラムダ式を使ってみたり、色々試行錯誤してみましたが、これが正解でした。

これであなたも、マルチスレッドできるね。

#おわりに

困った事が解決したら、とにかくQiitaでもなんでもいいので、文書化して記録として残しましょう。
それで救われる人間も、いるはずです...。
astah*のデータをiPadで持ち運ぶ

# 手順

- 「<a href="http://www.cloudsquare.jp/kumonosu/program/astah/diagramtohtml/">DiagramToHTML</a>」プラグインを使用<br />astah*データをindex.html＋画像化
- 出力されたファイル群を圧縮してiPadに移動
- 「Documents」アプリで閲覧<br />
画像に書き込みも可能

# 操作キャプチャ
![astah_carry_ipad_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23378/56f7e142-8ec8-92ec-c726-a6432fe66fd2.png)

![astah_carry_ipad_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23378/ced43ea4-55db-e907-2920-863ec829ead1.png)

![astah_carry_ipad_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23378/468f25e9-ca3d-2683-0c4d-97ae2d0c1db5.png)

![astah_carry_ipad_04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23378/0d021a7c-f8cb-bfe9-2bf1-131e7927d1b5.png)

![astah_carry_ipad_05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23378/7e708889-d426-0f32-ea40-bd384f30aff4.png)

![astah_carry_ipad_06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23378/3bbdfdce-4961-7f39-72c0-62844cfaf626.png)

![astah_carry_ipad_07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23378/c1bb6e24-b3c3-b86f-9097-a2027358c5ff.png)

![astah_carry_ipad_08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23378/28441da5-f106-e7a4-b8cc-6d0191163664.png)
部・科のチームが「家でクイズ番組を見ている家族」になってしまった

# 諸注意
本記事はいわゆる愚痴記事です。有益なことは記載されていません
が、「あるある」という共感や、「あーすればいい」、「こーすればいい」というご意見等々いただければすごく嬉しいです

## 現状
* 自分自身は某企業でAzureを主としたクラウドを扱うSIer
* 平社員
* 会社自体は
今更
クラウドの波に乗ろうとOffice 365を導入
  * その中でチャット ツールとしてTeamsを使用
  * AzureやOffice 365の設計もしてるのに今まで自社に導入しなかったのはホント謎

## よかったところ
* 案件ごとにチームを作成してコミュニケーション円滑化
  * メールや電話の手間と時間が減ったので予想以上に楽になった。チャット ツール最高！
* ついでに個人チャットや身内だけのたれ流しチームも作成
  * 語録がずるずるして気持ちが良い
  * (会話履歴が全部保存されてたり管理者で見れたりできるのはO365の設計もしているので承知済)

## 問題点

問題点はないんですが体裁的によくないところ

### メジャーな問題
* Teamsの浸透が遅い
* 浸透しても使用率が低い

もうこれはメジャー中のメジャーな問題なので時間が解決してくれるものと信じています。

### (体感)マイナーな問題

ほんへです。  

* 部・科のチームが「家でクイズ番組を見ている家族」になってしまった

「どういうこと？」となっているかと思いますが1つ以下の状況を思い浮かべてみてください。

〜ある日の夜〜
子「脳内サ○リ見る！ これの答えなんだろ？」
母「□□ね」
父「□□だな」
子「すごーい！ パパママ正解だ！ 次の問題は？」
母・父「…………」
子「？？？」

こういう経験みなさん一度くらいは体験したことあるのではないでしょうか。
完全に自分がわかっていることしか発言せず、わからない難しい内容だと一気に静かになる現象です。
最初の方は勢いのあった部・科のチームですが、この現象が頻繁に発生し今や完全に失速してしまいました。

間違ったことを発信してしまうのが恥ずかしいのか、指摘されることが恥ずかしいのか。
はたまた誰かが反応するから自分は反応しなくていいんだろう。と思っているのかは不明です。
ただ、個別にチャットで聞いてみると大体の人は「わからない」、「わかる。カクカクシカジカ」と何かしらのレスポンスがあります。

集団心理（？）というのかわかりませんが、こういう状況の打破の仕方があれば、
よく見るQiitaの記事のように和気あいあいとした職場環境が……  
と、夢見ています
勉強記録　3日目 〜コピーコンストラクタとコピー代入演算子〜 - Effective C++ 第3版 -

#　はじめに

Effective C++ 第3版のイントロダクションxxiiのページから勉強していきます。
今回扱うのは、「コピーコンストラクタとコピー代入演算子」 についてです。

# Effective C++ 第3版 - イントロダクションxxii -

## コピーコンストラクタとコピー代入演算子

### コピーコンストラクタとは？

オブジェクトを「同じ型の別のオブジェクト」で初期化するときに使われる。

### コピー代入演算子とは？

オブジェクトを「同じ型の別のオブジェクト」で代入するときに使われる。

下にコピーコンストラクタを用いてオブジェクトを初期化した場合とコピー代入演算子を用いてオブジェクトの代入を行った場合のサンプルコードを示します。

下のサンプルコードでコンストラクタでオブジェクトを初期化している箇所は、、

```
Widget a(1);
```

の部分です。
コピーコンストラクタでオブジェクトを初期化している箇所は、

```
Widget b(a);
Widget c = b;
```

の部分です。
コピー代入演算子でオブジェクトの代入をしている箇所は、

```
a        = b;
```

の部分です。

新しいオブジェクトが定義されている時には必ず、コンストラクタ or コピーコンストラクタが呼ばれていることが分かる。
そのため、代入しているのは, a = bの1回だけであることが分かる。

ちなみに、各変数a, b, cのアドレスは、
![intro_default_constructor3_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367151/b2f3e8ed-aaf1-bc9f-2a6f-6b1e8df763ed.png)
のようになっていることが分かる。
そのため、値だけが代入されており、例え、b を代入した a をいじっても bには関係ないことが分かる。
ポインタの代入とは異なる。 

分からなかった点
コピーコンストラクタに explicitを付けるべきかどうか？
本のサンプルコードには乗ってなかったが、前のページで理由がなければコンストラクタには explicit を付けろと書いてあった。。。

### サンプルコード

```cpp:intro_default_constructor3.cpp
#include <iostream>

class Widget {
 public:
  explicit Widget(int a) { std::cout << "コンストラクタ" << std::endl; };
  Widget(const Widget& rhs) { std::cout << "コピーコンストラクタ" << std::endl; };
  Widget& operator=(const Widget& rhs) { std::cout << "コピー代入演算子" << std::endl; };
  ~Widget(){};
};

int main(int argc, char* argv[]) {
  std::cout << "intro_default_constructor3.cpp" << std::endl;
  Widget a(1);   // コンストラクタ
  Widget b(a);   // コピーコンストラクタ
  a        = b;  // コピー代入演算子
  Widget c = b;  // コピーコンストラクタ

  std::cout << "aのアドレス : " << &a << std::endl;
  std::cout << "bのアドレス : " << &b << std::endl;
  std::cout << "cのアドレス : " << &c << std::endl;
}
```

### 実行結果

![intro_default_constructor3_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367151/78988f76-afe1-2c36-374e-5dafd7a7426a.png)


## 参考文献

・https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0
Colabratoryって画面上だけでGitHubにPushして差分まで見れちゃうって知ってた？

# GoogleColabratoryでGitHubが使えるって知ってました？

実は無料で使えるあのColabratoryが、GitHubに対応していて、指定したブランチにCommit+Push、
さらに**変更履歴**まで見ることができます。



## そもそもColabratoryとは？
知っている方はこの項はすっ飛ばしてください。

知らないのにこの記事を読んでくださってありがとうございます！
Colabratoryとは、無料でGPUつきのPython環境を使うことが出来るブラウザ型の開発環境です。
標準装備で色々なことができちゃうというすごいやつです！

実際に使ってみたい方は[こちらから](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)どうぞ



# GitHubと連携する方法
まず、自分のGitHubアカウントに、notebookを作成したいレポジトリ、もしくはブランチを作成しましょう。
![レポジトリを作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/293892dd-d06e-4368-082b-ad26ef15bb77.png)

その後、空の`.ipynb`もしくは、すでにあるnotebookをアップロードしましょう。
もしくは、Colabから直接Uploadすることもできます。今回はそっちでやってみましょう。

### ColabからGithubに新規ファイルを送る

まず[こちら](https://colab.research.google.com/notebooks/welcome.ipynb)にアクセス後、ファイルから新規ファイルを作成までいきます。
![新規ノートブック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/89ebaf4d-eca4-710e-ebd5-35228dd6ec7d.png)
Python3の新しいノートブックをクリックして、新しく作って、内容を書きます。

![内容を書く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/086f9a4c-ac9a-9db2-1543-b23fc4e204bb.png)

これをGitHubにコミットしましょう。
![GitHubにコピーを保存](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/1216b82d-e483-b3ee-39ef-b2d51e82c89b.png)
GitHubにコピーを保存をクリックするだけで、Commitへの画面が表示されます。
どこに保存するかを選択して保存しましょう。

![Commit](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/792bfa4e-0780-5d53-d101-9e0f3a86bf79.png)

ここにブランチ名、ファイルPathを指定し、最後にCommitメッセージを入れます。

（ここでColabのリンクを貼ると、Notebookの一番上にColabのメッセージが追加されます。)

これでOKを押せば、Commit + Pushが走ります。

![GitHubにCommit後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/6d05a926-f3fd-29ba-bdc7-0ff9c8f321c6.png)


# 他人のレポジトリのNotebookをいじってプルリクを出すまで
Tensorflowなどはそうなんですが、OSSでDocumentの一部に`.ipynb`を使っているOSSもあります。

また、それだけでなくとも、他人のレポジトリのNotebookを編集したい、共同作業したい場合はもちろん出てきます。

その場合の手順は以下の通りです。

## まず、Forkする。

![Forkする](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/baf7e411-457e-154d-a986-eb71ff72bba2.png)

Forkしましょう。それで自分のレポジトリにしましょう。そしてプルリク用のブランチを切ります。

編集＋Commitを行います。

## プルリクを出す

できたところでそのままプルリクを出します。

しかし、実際に出されるデータはipynbそのもの。つまりJson型で保存されたデータが映るだけです。

# 差分をみる
レビュワーや、プルリク提出する人に取っては差分を見るのが結構難しいと言うか、面倒臭いのですが、

実は、Colabratory上でプルリクの差分を見ることができます。

ファイル→変更履歴から見れれます。

<img width="1650" alt="スクリーンショット 2019-12-14 18.46.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/d9dc6be3-1c00-1346-3c55-48d06a973a5b.png">


このように、変更履歴を見ることができるので、簡単に比較できますね。

ちなみに、翻訳の場合、適宜改行することで無駄にワンライナーになって読みづらくなることがなくなるのでおすすめです。

# 最後に

これを使えば、チュートリアル記事などもColabで編集して、
公開するだけでいいので、楽チンでいいですね。
今度からはこれでソース管理などもしていきたいと思います。
Raspberry PiとSense Hatで漢字表示のコンパスを作る

# Raspberry PiとSense Hatで漢字表示のコンパスを作る

![kanjicompass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538088/72c31a56-a263-8937-59d3-f304577833a6.png)


## 概要
2年くらい前にラズパイとSense Hatで地磁気をどうにかする必要があって、ためしに作ったプログラムです。

今はWebのエミュレーターにしか残ってませんが、当時はちゃんと実機(RPi3+Sense Hat)で動いてました。

## RPi + Sense Hat エミュレーター
https://trinket.io/library/trinkets/a50728f4da

RPiエミュレーターのtrinketです。
実機と比べても遜色ない動きをしてくれます。
これが無料で使える時代素晴しすぎます。

## 解説
まったく大したことはしてません。
Pythonだとライブラリでいきなり方位角がとれるので、方位角の数値によって、何度から何度まではこの方位というのを決めてやり、表示しているだけです。

漢字表示は、Sense Hatの液晶ディスプレイが8x8ドットなので、漢字っぽくドットを打った8x8のJPEG画像を作って表示するだけです。

他のOSだと、加速度センサーと磁気センサーの生の値しか取れなかったりするので、そこから端末の傾きを補正してセンサーの値から方位角を計算したりとか超面倒なのですが、Pythonは世界の有志が有用なライブラリを用意してくれているで超ラクチンです。

実機がなくても、Webのエミュレーターだけでも楽しめるのでおススメです。
やっぱプログラミングは、なにか動くものを作ると楽しいですからね。
僕がAndroidアプリ開発をする上で気を付けていること

　こんにちは！データベースからデータを取り出す際によくCursorIndexOutOfBoundsExceptionと怒られるヨースケです。だいたいがmoveToFirst()の書き忘れで、初めてデータベースを使ったときもこのエラーでした。最初は訳も分からずめちゃくちゃ原因を特定するのにだいぶ時間がかかりました(笑)。

　今回はアプリ開発をするときに気を付けていること、心掛けていることを書いていこうと思います。

- 普段使っているアプリを注意深く見る
- コピーはするがペーストはしない
- ユーザー目線
- 設計書的なものを書く

### 普段使っているアプリを注意深く見る
　これは開発する時のレイアウトの参考になります。特に意識はしていませんが、初めて使うアプリやいろんなところで見かける端末で表示されているシステムチック？なものを見るとどういうプログラムなのかなぁとか、これはダイアログを使っているのかな？とか考えちゃいます。
　例えば![twitter.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/44e68c1a-ff5c-672c-e434-f33d819aa871.jpeg)
Twitterのプロフィールを見るとオプションメニューやタブパネルを使っているのかな？と考えます。
　個人的に好きな画面があって、パズドラの
![pzdr2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/05575ad0-2616-8053-bc15-f3994cd14e97.jpeg)
![pzdr3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/284a1cc0-8d68-c5a8-3149-095d9d563b84.jpeg)
進化サーチボタンを押したときに見えるこの画面。非常に簡潔で進化させるにはどの素材が必要なのかも一目瞭然で分かりやすいですね。それともう一つが、
![pzdr1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/4b191312-8c43-5d95-ad0b-3f104fc4f0e1.jpeg)
これです。ソーシャルゲームは結構複雑になるので、いちいちそれ専用の画面を用意して遷移する。といった煩わしさがなく、ユーザー目線で良い画面だと僕は思います。

### コピーはするがペーストはしない
　これは大学からJavaを習い始めて決めていることです。最初は全く分からなくて授業ではかなりつまづいていました。演習問題では友達に見せてもらうこともしばしば...で悔しい思いもありました。
　アプリ開発をしていると参考書を見ても分からないことがありネットに頼る、なんてことは皆さんも経験があると思います。コピペは確かに楽ではありますが、それでは自分のためにならないと思います。一から自分で打ってどういう動きになるかを理解しながらプログラムを組むことが大切かなと思います。

### ユーザー目線
　前のパズドラの画面でも触れましたが、多くの人が扱うアプリでは簡潔なものが求められます。どういう風なレイアウトにすればよいか、分かりやすくするにはどうすればよいかetc...開発者、特に個人でやっている人はかなり悩みます。実際僕もこのアプリを使う人が理解できるのか？複雑になっていないか？ユーザーを困らせるような処理・表示になっていないかなど、全員が全員「OK」と言えるようなアプリは難しいですがそういう風に近づいていけばなと思います。
　アプリは当然、初めて使う人が多いと思います。例えば
![Screenshot_20191126-135849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/f1fb31f4-50c9-fdc0-5b52-c472d0ccad90.png)
無料通信アプリの『LINE』のウォレットの画面ではどうでしょうか？一つの画面に16種類以上の機能がありますね。ご覧の通りよくわからないものばかりで何も触っていないのでNewマークがついています(笑)。ある程度いじったことがあればそこまでないと思いますが、これを初めて見たらいろんなのがあって気後れしちゃうのかなー思ってしまいます。LINEを否定するつもりはありませんし、気軽に友達と繋がられる便利なツールだと思っています。機能が増えるのは良いですが、ユーザーが分かりやすいレイアウトも大事なのかなと思います。(まぁこれはこれでいいのかもしれません...)

### 設計書的なものを書く
　これはメモ程度だと考えていいと思います。僕の場合は誰かに見せるわけでも、発表会をするわけでもないのでExcelに
![mydesign1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/54bb7b50-8a63-4fc9-fe9b-a79ffea4e115.png)
![mydesign2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/e13e3a12-cbc7-5129-5785-b24bc2dc59ef.png)
![mydesin3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534506/83ddbdcb-1ef6-3226-8bda-22f913d1aaaa.png)
↑こんな感じでまとめています。また、ノートにも思いついたことや複雑なシステムを考えるときに書きなぐっています。これをするとどういう目的のアプリなのか、遷移図、詳しい機能やプログラム的な話などを振り返ったり、考え直したりできます。

　以上がAndroidアプリを作るときに僕が心掛けていることです。「そうなんだ～」程度で見ていただけたら幸いです。長文失礼しました。
シェルスクリプト bash select 文

PS3 はシェル変数で select 文において入力を促すメッセージとなる。

```bash:select
PS3='Please select.'
select num in 1 2 3 4 5 end
do
  case $num in
    1)
      echo 'Selected number 1.';;
    2)
      echo 'Selected number 2.';;
    3)
      echo 'Selected number 3.';;
    4)
      echo 'Selected number 4.';;
    5)
      echo 'Selected number 5.';;
    end)
      echo 'Good Bye.'
      break;;
    *)
      echo "{REPLY}"
      echo 'Not valid, input again.';;
  esac
  echo
done
```

実行すると、以下のように番号で選択するように要求される。
以下は3番を入力した例。

```
1) 1
2) 2
3) 3
4) 4
5) 5
6) end
Please select.3
Selected number 3.
```

番号ではなく、関係のない文字列を入力した例。
入力した文字はシェル変数 REPLY に格納されるため、それを元に条件分岐させることも可能。

```
Please select.ABC 
ABC
Not valid, input again.
```

bash に依存(shでは動かない)しているため、積極的には使わないほうがよさそう。
OSM日本のマッピング状況を県別に比べてみた(2019年版)


[前回(2019/上期)](https://qiita.com/higa4/items/422f00de8b58d375fb97)は建物数が対前年比109.2%と伸び率が鈍っていたが、増加のペースは今回2019/11/26段階ではどうなっただろうか。以下シリーズ6回目の統計として、この約１年間の伸びを分析した。

## 1.[都道府県別OSMマッピング状況表_20191126](https://docs.google.com/spreadsheets/d/1ZawmypIJ5dCTfRvtfWA9bP6UdOkLgcC0bklq0eUc9Gc/edit#gid=0)

[2018年の表](https://docs.google.com/spreadsheets/d/1eGxDcmGXKLj-UWIJHTvvYyWo1xFRnL2KGWOAv0Y6Jjs/edit#gid=0)に2019年分を追加したものが[こちら](https://docs.google.com/spreadsheets/d/1ZawmypIJ5dCTfRvtfWA9bP6UdOkLgcC0bklq0eUc9Gc/edit#gid=0)。T－Y及びAG-AM列のグリーン列が今回更新分。
![](https://i.imgur.com/Tu5k3gF.png)

## 2.[概況](https://docs.google.com/spreadsheets/d/1ZawmypIJ5dCTfRvtfWA9bP6UdOkLgcC0bklq0eUc9Gc/edit#gid=1497821190)
![](https://i.imgur.com/guqSkUk.png)
建物数については2018/12/7時点での対前年比150.7%に対して、上期では109.2%と伸び率が落ち込んだが、今回通年では124.2%とやや復調。
道路距離については102.0%と微増。
amenityは114.9%と1割強の伸び率であった。

## 3.建物数
### 3.1 [マッピング済み建物数（絶対数）](https://docs.google.com/spreadsheets/d/1ZawmypIJ5dCTfRvtfWA9bP6UdOkLgcC0bklq0eUc9Gc/edit#gid=1326225953)
![](https://i.imgur.com/TphEXGM.png)
上から北海道、静岡、愛知は変わらず。東京がオリンピックの影響か4位に伸びてきた。5位は大阪。

### 3.2 [建物数伸び率](https://docs.google.com/spreadsheets/d/1ZawmypIJ5dCTfRvtfWA9bP6UdOkLgcC0bklq0eUc9Gc/edit#gid=1055704425)
![](https://i.imgur.com/1ofL4lN.png)
アクティブなOSMerの登場で急激にマッピングされるようになった地域やクライシスマッピング対象域が上位に現れることが多い。今回は長崎、長野、栃木、沖縄、千葉といったところ。長崎はたぶんワリと個人的な頑張り（笑）。以下は豪雨災害関連か。

### 3.3 [建物コンプリート率（推定）](https://docs.google.com/spreadsheets/d/1ZawmypIJ5dCTfRvtfWA9bP6UdOkLgcC0bklq0eUc9Gc/edit#gid=17169321)
![](https://i.imgur.com/l582i3R.png)
建物数は人口との相関があることが想定されるため、人口の半分の数が建物数というアバウトな仮説を立てた場合の建物マッピング達成率。静岡が初めてトップに。以下北海道、鳥取、福島の4強に続き、京都が5番目に。

## 4.道路距離
### 4.1 [道路コンプリート率（推定）](https://docs.google.com/spreadsheets/d/1ZawmypIJ5dCTfRvtfWA9bP6UdOkLgcC0bklq0eUc9Gc/edit#gid=197437285)
![](https://i.imgur.com/M16o2QE.png)
国や自治体の管理道路の総距離に対するOSM道路距離数の比率。主要道路はほぼ描き終えて、管理道路に入っていない住宅街道路、山道、歩道といったところがどれだけ描かれているか、という目安を表すのではないか。全体的に微増。神奈川、大阪、静岡、京都、熊本といった順番は前回と変わらず。

## 5.その他
### 5.1 [amenity密度](https://docs.google.com/spreadsheets/d/1ZawmypIJ5dCTfRvtfWA9bP6UdOkLgcC0bklq0eUc9Gc/edit#gid=2124261809)
![](https://i.imgur.com/KSF2bA1.png)
amenityだけの数だが、POIマッピングの進展状況を横比較する目安にはなりそう。人口1000人あたりのamenity数を密度と表現。
京都、高知、鳥取、山形、宮城といった順。宮城は大きく伸びた。
### 5.2 病院
統計対象とせず。
### 5.3 河川
統計対象とせず。


詳細分析してみたい方は[スプレッドシート](https://docs.google.com/spreadsheets/d/1ZawmypIJ5dCTfRvtfWA9bP6UdOkLgcC0bklq0eUc9Gc/edit#gid=0)をコピーしてご自由にどうぞ。CC0としています。
Ruby on railsの基本箇所についての復習②(rake db:create)

#はじめに
引き続きrailsでアプリを作成する手順を開設します。
#実行
アプリのフォルダを作ったら、アプリのディレクトリに移動して`rails s`というコマンドを入力するとアプリが起動します。
…と言いたいところですが、この時点ではアプリに対応するデータベースが存在していないので、エラーが発生してしまいます。
これを解決するには、データベースを作ります。
データベースの作成は次のコマンドをターミナルで実行すれば完了します。

```terminal
rake db:create
```

そして次のようにコマンドを実行すればアプリが実行します。

```terminal
rails s
```

```terminal
（前略）
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```
という風に表示されたら成功です。
初心者でもFirebaseを使えばいきなり本格的なサービスを開発・運用できる話

#この記事でわかること
＊この記事はネイティブアプリ開発（iOS/Androidなど）をメインターゲットにしています

今の時代はUdemyやProgateなどのプログラミング独学のためのサービスが充実してきましたが、**プログラミング初学者がネクストステップでつまづきやすいのが、「本格的なサービス開発に移行する段階」です**。

画面遷移を実装したり、ボタンを押して特定イベントを発火したりなどは比較的容易に到達できるかと思いますが、いざ本格的なサービスに開発にする移行しようとすると以下のような機能が必要となってきます。

**・ユーザー認証・登録**

**・ユーザーの生み出すコンテンツ（テキスト、画像の投稿など）の保存、更新**

**・ユーザー同士のコミュニケーション（フォロー、コメント、チャットなど）**

これらの機能を開発するためには、最低でも以下の知識が必要となります。

**①インフラ（サーバーの設置・稼働場所）**

**②データベース（ユーザーの生み出す様々なデータの保存場所）**

**③API（アプリやWEBブラウザからデータベース内のデータを操作する）**

**④UIを構成するクライアントアプリの開発**

＊より詳しく知りたい方は「LAMPスタック」とか「MEANスタック」とかでググってみてください。
開発の現場ではよく①、②、③を**「バックエンド」**、④を**「フロントエンド」**と呼びますが基本全てのサービスはフロントエンドからバックエンドの機能やデータを呼び出したり操作したりすることによって動いているわけです。

**初学者は④は比較的容易に習得できるのですが、①〜③でどこから着手したらよいかわからず止まってしまうケースがほとんどかと思います**。

この記事ではそれくらいのレベルの人たちを対象に、結論から言うと**「Firebaseを使えばインフラ、データベース、APIを学びつつ、簡単にリリース可能なサービスを開発できるよ」**というのを説明していきたいと思います。



#Firebaseとは
![logo-built_black.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69560/6074c4f3-ddb3-9140-3b8b-bd5a8a075452.png)


まずそもそも「Firebase」とは何かと言うと、ネットで調べると色々と説明が見つかるかと思いますが、初学者向けに思い切り簡潔に言ってしまえば**「Googleの提供する、バックエンドで必要とされる一連の機能を提供してくれるサービス」**です。（[公式ページはこちら](https://firebase.google.com/)）

Firebaseを使用することで**開発者はフロントエンド（上記で述べた④）の開発のみに専念することが可能となる**わけです。

＊Firebaseについてより詳しく知りたい方は、[こちらの記事](https://qiita.com/owen/items/c51c6ec27c9e2f5804b0)が平易な言葉遣いで説明してくれていて参考になります。

FirebaseはGoogleが提供するサービスだけあり様々な機能がありますが、この記事では初学者向けということで、サービス開発で必要な最低限の機能に絞って説明していきたいたいと思います。



#ミニマムなサービス開発に必要なFirebaseの機能
結論から言うとまずは以下の２つで充分です、、

以降の記事はやや長いので、[こちらのnote](https://note.com/daikiichikawa/n/nf1c8703ee2eb)にまとめています。
**導入方法の概要を紹介**しているので、是非ご覧ください！
Rails6でActiveStorageをルートから削除する方法

[Active Storageをルートから削除する方法](https://qiita.com/Uuya/items/1154edc322c638f7e422)

上記ページの手順だけだとrails6ではルートを削除できなかったのでメモ。
調査したところ、rails6から導入されたActionTextでActiveStorageがrequireされていました。
なのでapplication.rbで、ActiveStorageとActionTextもコメントアウトすることでルートから削除することができます。
僕の場合は、ActiveMailboxも不要でしたのでコメントアウトしてます。

```ruby:application.rb
require "rails"
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
# require "active_storage/engine"
require "action_controller/railtie"
require "action_mailer/railtie"
# require "action_mailbox/engine"
# require "action_text/engine"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
```

また、ActiveStorageには`config.active_storage.draw_routes`というルートに関する設定があるっぽいんですが、falseにしても設定が反映されませんでした。

```ruby:application.rb
# 機能してない？
config.active_storage.draw_routes = false
```
https://github.com/rails/rails/blob/master/activestorage/lib/active_storage/engine.rb#L78
iOS 13からFLAnimatedImageが点滅するようになってしまった。。。

# 問題
UITableViewでFLAnimatedImage使うとなぜかimageが点滅されてしまう。iOS 12以下は全然問題ないのに〜と思って色々試してみて、forkするしかないと思いました。

# 解決
ま、誰かに役に立ったらって感じで書いているんですがaddSubviewのタイミング変えれば治ってくれました〜

```swift
imageView.animatedImage = animatedImage
self.addSubview(imageView)
```

```swift
self.addSubview(imageView)
imageView.animatedImage = animatedImage
```

iOS 13からlayout周り何かの順番が変わったみたいで、ライブラリー内のshouldAnimateが正しく判定してくれなかったかな〜と思っています。
⌘+Dが必須だということに気がついた

vscodeを入れてから色々ショートカットキーを覚えてきたつもりだったがまだまだ使っていないものばかりであることがわかった。

その中でも⌘+Dは絶対覚えるべきショートカットキーだった。

⌘+Dは複数行を同時に編集できる機能だ。今まで私は一行ずつ編集していた。同じことを複数行書くところも一行ずつ直していたため非常に時間がかかっていた。だがこの機能を知り、使用してみたところ、作業時間が大幅に削減された。この機会にショートカットキーを覚え直してみようと思った。
初心者によるプログラミング学習ログ 169日目

# 100日チャレンジの169日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

169日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>169日目<br><br>webサイトコーディング課題<br>ちょっとワケワカメになってきたので、全体的にもういちど見直し<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1199055929699782656?ref_src=twsrc%5Etfw">November 25, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
MySQLのjson型

#はじめに
MySQL5.7.8以降はjson型が使えるようになりました。
JSONを慣れた開発者に対して選択肢が増えました。

数点をメモとして残ります。

The JSON Data Type: https://dev.mysql.com/doc/refman/8.0/en/json.html

#WorkbenchからカラムをJSONに変更しようとするとサポートされないエラー
WorkbenchツールでテーブルのカラムをJSON型に設定してみると、サポートされませんってエラーが出る場合があります。
##問題１：接続しているサーバは5.7.8以上ではない　
これはバージョンアップするしかないです。

##問題２：MySQLサーバは5.7.8以上でもエラー
これはWorkbenchの設定問題かもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/1d6a1e81-a6b5-d8e5-4ad0-988138b4a5be.png)

#操作してみる
#JSON文字列でインサート
```sql
insert into json_test(json_data) values('{"key1":"value1", "key2":"value2"}')
```

#JSON_OBJECT関数でインサート
JSON_OBJECT関数を使って属性を設定する可能です。

```sql
insert into json_test(json_data) values(JSON_OBJECT('key11', 'value11', 'key22', 'value22'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/9a22e8fd-9bc9-b617-db84-c1db29af147d.png)


#複数行をJsonArrayに変換
```sql
SELECT JSON_ARRAYAGG(JSON_OBJECT('userName', userName, 'email', email)) from User;
```

#MySQL8.0のクライアントから接続で認証失敗？
mysql_native_passwordのユーザー変更で解消できます。

```sql
ALTER USER 'dbuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'dbUserPasswordxxxx';
```

#トリガー作成できない？
##問題１：権限ありません

```log
ERROR 1419 (HY000) at line 3155: You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
```
log_bin_trust_function_creatorsを1設定変更で回避できます。

##問題２：DEFINER記載しないと作成権限があってもエラー
`CREATE DEFINER=`root`@`localhost` TRIGGER xxx` の感じでDEFINERを定義で回避できる場合があります。

#MySQLのJSONメソッド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/29ed381a-36f7-ce2d-5495-e5b6d58a558d.png)

出典：　https://dev.mysql.com/doc/refman/8.0/en/json-function-reference.html

以上
JJUG CCC 2019 FALLに参加しました

# 概要
* 主催 :                 日本Javaユーザグループ
* 開催日時 :          2019年11月23日（土）
* 場所 :                   ベルサール新宿グランド コンファレンスセンター 5F
* ハッシュタグ :  #jjug_ccc

 
# JJUGとは
* 日本Javaユーザグループ(Japan Java User Groupの略称)
* Java 技術の向上・発展、開発者の支援を目的とした任意団体です。2007年4月に発足して、現在は9000人以上の Javaエンジニアが参加する日本最大のJavaコミュニティです。

 
# 詳細
## 会場雰囲気

![IMG_1508.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/e795e9c3-c7bc-20a4-cfbc-9b06a8e2a50a.jpeg)

![IMG_20191123_105343.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/6b98a1d3-49b2-bca5-95e9-56e3d27e9c6f.jpeg)

![IMG_20191123_105353.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/70358826-da85-dcac-1dcb-c3de2f908c5c.jpeg)

![IMG_20191123_115404.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/ffdae516-94b8-0ec2-5bd1-7d558d54e958.jpeg)




## 所感
### Gradle を完全に理解した人が、何も分からなくなるための第一歩
* JavaでAndroid Appを開発して、Android Studioでずっとgradleでビルドしているが、gradleでタスクの作り方が全然わからないです。今後は自動テスト実装してgradleでAndroid Studio以外環境に実行するかもしれないので、gradleの使い方を勉強したいです。

* このセッションには、以下二つのgradleの使い方が説明されました。
   * タスクの実行順番
   * ファイルコピーの実装方法
   * ファイルの選択

 
#### タスクの実行順番
* 既存タスクにdoFirst, doLastを追加して事前(事後）処理を追加できる
* 実行順序は「〜〜したら、〜〜する」ではなく
* 依存関係でやる：　「〜〜するためには、先に〜〜が必要」	
      
 ```  		
        task taskA {
        		    doFirst { println "Task A" }
        		}
        		
        		task taskB {
        		    dependsOn "taskA"
        		    doFirst { println "Task B" }
        		}
   ```     		
    	
* 同時に実行されたら順序を制御したい場合は	
        
```		
        buildした時にclean後にやる				
        plugins { id "java" }
        build.mustRunAfter clean
```      				
        		

#### ファイルコピーの実装方法
* 実現方法がいくつある	
    * Javaの標準APIを使う
    * GroovyのAPIを使う
    * Projectのcopy()メソッドを使う
    * Copyタスクを使う
        		
* 進め：Copyタスク	
    * タスクの入出力まで定義する
    * 入出力が前回と同じ場合、タスクは実行されない
        		

#### ファイルの選択
* file()	
    * 単一のファイルを指定して File を取得する
* files()	
    * 複数のファイルを指定して FileCollection を取得する
* fileTree()	
    * ディレクトリを指定して FileTree を取得する
        		

 
### 開け！ドメイン駆動設計の扉

* DDDをよく聞いた事があって、記事や本をざっくり読んだが、完全に入門できないです。今回のセッションは詳しくDDDを説明じゃなくて、DDDに入門できるように色々な説明されました
    * モチベーション
    * DDDとは
    * 知識の蒸馏
    * 構成要素

#### モチベーション
* 問題	
    * 専門者は説明できたが開発者は理解できない
    * 開発者はプロジェクト最初に入る時に仕様がない
    * 開発者はコードより探してすぐ理解できない
* ゴール	
    * ソフトウェアの利用者とコードの開発が続きになること
        		

#### DDDとは
* ドメインが何	
    * ドメインに含まれることが何		
    * 例えば、トラックには荷物やアクセルが含まれる
    * 抽象化モデル
        		
* ドメインモデル	
    * コード上の表現：ドメインオブジェクト
    * トラック <> ドメインモデル <> ドメインオブジェクト
    * ドメインの変化がコードに伝わる
    * 実装時にの気づきがドメインに影響する
        		

#### 知識の蒸馏

* ドメインエキスパート -> ドメインことをよく知っている（業務によく知っている方)
* エキスパートと開発者は一緒に考える
* 理解するには会話必要が、技術ご vs. 固有語
* ユビキタス言語 -> 単語帳ではない、いつでもどこでもの言語
* 言葉は文化である相手の言葉を使うことほど理解を進める

#### 構成要素

* 表現する	
    * 値オブジェクト
    * エンティティ
    * サービス
    * 集約   		
* 専念させる	
    * リポジトリ
    * ファクトリ		
* 隔離する	
    * アーキテクチャ
二次元vectorの特定キーでのソート

# C++で二次元vector vector\<vector\<T>>を特定のキーでソートしたい

次のような二次元vectorを

||要素0|要素1|要素2|
|---|---|---|---|
|vector[0]|5|2|3|
|vector[1]|1|4|5|
|vector[2]|3|3|2|
要素0をキーとして昇順ソートして、

||要素0|要素1|要素2|
|---|---|---|---|
|vector[0]|1|4|5|
|vector[1]|3|3|2|
|vector[2]|5|2|3|

このような結果が得たいなーと思って、色々調べた結果次の方法でソートすることが出来ました。

## 結論
とりあえず方法が見たい人用に先に書いておきます。

```cpp
 sort(myVec.begin(),myVec.end(),[](const vector<int> &alpha,const vector<int> &beta){return alpha[0] < beta[0];});
``` 

## テストコード (C++11)
テスト用に書いたコードを載せておきます。


```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 2次元vectorの中身のセット
void setVec(vector<vector<int>>& v){
    vector<int> tmp;

    tmp.push_back(5);tmp.push_back(2);tmp.push_back(3);
    v.push_back(tmp);
    tmp.clear();

    tmp.push_back(1);tmp.push_back(4);tmp.push_back(5);
    v.push_back(tmp);
    tmp.clear();

    tmp.push_back(3);tmp.push_back(3);tmp.push_back(2);
    v.push_back(tmp);
    tmp.clear();
}

//2次元ベクトルを表示
void printVec(const vector<vector<int>> v){
    for(int i=0;i<v.size();i++){
        for(int j=0;j<v[i].size();j++){
            cout << v[i][j] << " ";
        }
        cout << endl;
    }
}

int main(void){
    vector<vector<int>> myVec;
    setVec(myVec);
    
    cout << " -- 初期状態 -- " << endl;
    printVec(myVec);


    cout << " -- 要素0でソート -- " << endl;
    sort(myVec.begin(),myVec.end(),[](const vector<int> &alpha,const vector<int> &beta){return alpha[0] < beta[0];});
    printVec(myVec);
    
    cout << " -- 要素1でソート -- " << endl;
    sort(myVec.begin(),myVec.end(),[](const vector<int> &alpha,const vector<int> &beta){return alpha[1] < beta[1];});
    printVec(myVec);

    cout << " -- 要素2でソート -- " << endl;
    sort(myVec.begin(),myVec.end(),[](const vector<int> &alpha,const vector<int> &beta){return alpha[2] < beta[2];});    
    printVec(myVec);
}
```

## 実行結果
 -- 初期状態 -- 
5 2 3 
1 4 5 
3 3 2 
 -- 要素0でソート -- 
1 4 5 
3 3 2 
5 2 3 
 -- 要素1でソート -- 
5 2 3 
3 3 2 
1 4 5 
 -- 要素2でソート -- 
3 3 2 
5 2 3 
1 4 5 

## コードの中身で何をしているのか
今回のsort関数の記述方式は、[C++日本語リファレンスサイト](https://cpprefjp.github.io/reference/algorithm/sort.html)によると、

```cpp
template <class RandomAccessIterator, class Compare>
  void sort(RandomAccessIterator first,
            RandomAccessIterator last,
            Compare comp);                        // (2) C++03
```
に該当すると考えられます。
第三引数のCompare compに比較対象を記述したいので、`vector[][i]`を取り出せれば良いことになります。そこで、C++11から利用可能なラムダ式を使って、sort時の比較対象である`vector`2つをalpha,betaと置き、それらの値が来たときに中括弧で囲まれた式を用いて結果を返すようにします。

```cpp
sort(myVec.begin(),myVec.end(),[](const vector<int> &alpha,const vector<int> &beta){return alpha[0] < beta[0];});
``` 

ソートの流れを考えると、
1. `sort(myVec.begin(),myVec.end(),compare)`より、myVec内の`myVec[0]`と`myVec[1]`が取り出される。
2. ラムダ式に沿って、`alpha`に`myVec[0]`,`beta`に`myVec[1]`が入る。
3. `alpha`と`beta`が来たので、中括弧内の判定`alpha[0]<beta[0]`より真偽値が返される。
4. `myVec[0]`と`myVec[1]`が3.の結果に基づいてソートされる。
5. 以降ソートが終了するまで繰り返し。

ソートを行う時、それぞれのvectorの中身を参照しているため、alphaとbetaの添字を変更することで、ソートをするキーを変更できるよ！っていう話でした。

## 参考にさせていただいたサイト

[c – 整数の多次元ベクトルをソートする](https://codeday.me/jp/qa/20190301/348182.html)
[cpprefjp - C++日本語リファレンス　std::sort](https://cpprefjp.github.io/reference/algorithm/sort.html)
APIキー・環境変数を設定したのにうまく反映されない時には.....

##概要
メルカリのクローンサイトを作成する際にインフラ、デプロイ関係の担当をした者が沼にハマった部分を共有し、同じような状態から抜け出すための一助になればと思ったことが投稿するきっかけになります。
今回は、API関連のキーや環境変数を設定したのに本番環境では上手く挙動しない際に対処した方法をいくつか紹介します！
基本的なことから盲点な部分まで、同じような状況で困っている方の一助に少しでもなれたら幸いです。

##環境
- Rails v5.2.3
- Ruby v2.5.1
- Unicorn 
- capistrano
- nginx
- mysql 
- AWS, EC2（本番環境）

## ①まずはスペルミス、スペース（空白）の確認
最初から言われなくても分かるよっていう内容ですいません。
しかし、スペルミスは皆さん気をつけていることだとは思いますが、意外と足を引っ張るのは**スペース（空白）**の確認です。

```
（例）
AWS_SECRET_ACCESS_KEY = '************************'
=> スペースあり
AWS_SECRET_ACCESS_KEY='************************'
=> スペースなし
```
上記の微妙な違いで、内容は正確だがキーや環境変数が反映されない状態に陥ってしまいます。
まずは初心に戻った気持ちで**スペース(空白）**のチェックをしてみるのも良いかもしれません。

##②設定を反映させるためには...
スペルミスやスペースもなく設定が完了。以上終わり。　ではないのです。
設定した内容を反映させるためにはAWS（EC2)であれば、一度EC2上からログアウトし再度ログインすることによって設定が反映されます。
ただし、 .bash_profile などに設定をし直ぐに反映をさせたい場合は以下のコマンドを打つことによって反映されます。

```
source ~/.bash_profile
```
設定ファイル名は任意のもので大丈夫です。
また、設定ファイルの違いって案外知らないと思うので（自分は笑）、気になる方は下記にまとめたので見てみてください！

| 読み込み順    |       設定ファイル |    概要    |
|:-----------------|------------------:|:---------------------:|
| １            |            /etc/profile |        ログインする全ユーザー共通設定 |
| 2          |            ~/.bash_profile  |       ※下記に概要記載    |
| 3             |              ~/.bashrc |        bash起動時に読み込ませたい設定|
| 4             |                /etc/bashrc|         システム全体の関数等の設定|

※　~/.bash_profileに関しては、~/.bash_login, ~/.profileと順に、上のファイルが無ければ下のファイルが読み込まれる流れになります。

##③capistrano（自動デプロイ）導入後に設定が反映されない時
今回の投稿で一番伝えたかった内容になります。なぜかと言いますと...自身が沼にハマったからです。笑
スペルミス、余計なスペースも無い、EC2からログアウト・再ログインして設定の反映もバッチリ。さあ、後はcapistranoを動かして挙動を見に行きますか.....？　んん？　あれ、反映されていない。（白目）
この状況で沼にハマり、かれこれ2~3時間。　やっと見つけた救世主のコマンドを紹介します。（※今回はcapistranoを使用しています。）

```
bundle exec cap -t production unicorn:stop
=> unicornの停止。これを打たないとコードが反映されていない状況に。
bundle exec cap production deploy
=>再度capistranoで自動デプロイの実行。これで反映。
```
この2つのコマンドを実行することによって、本番環境でAPIを利用したり、しっかりと環境変数も用いることができていました。

##終わりに
インフラ関連に対する苦手意識を持っていましたが、何事も根拠があって、それを理解することによって物事の流れを掴むことができ、やりがいに繋がっていくと感じます。僕もまだまだこれからですが、また沼ったことを共有できればと考えています。長々と見て頂きありがとうございました。

###参照
https://qiita.com/yunzeroin/items/480a3a677f78a57ac52f