OmniAICreator/Qiita-1.07M huggingface dataset:
[Kubernetes]Minikubeのdashboard起動時503の解決方法

macでminikube環境を構築中に躓いた1つです。
もし同様のエラーで困った人の助けになれば幸いです。

## 環境
|項目|内容|
|:----|----:|
| ホストOS | Mac OS X 10.13.6 |
| VirtualBox | 6.0.4 |
| Minikube | v1.0.1 |

## エラー内容
```shell
kusumoto-t:~$ minikube dashboard
🔌  Enabling dashboard ...
🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
💣  http://127.0.0.1:54555/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/ is not responding properly: Temporary Error: unexpected response code: 503
Temporary Error: unexpected response code: 503
Temporary Error: unexpected response code: 503
Temporary Error: unexpected response code: 503
Temporary Error: unexpected response code: 503
Temporary Error: unexpected response code: 503
Temporary Error: unexpected response code: 503
Temporary Error: unexpected response code: 503
Temporary Error: unexpected response code: 503
Temporary Error: unexpected response code: 503
Temporary Error: unexpected response code: 503
...割愛
```

## 原因
試行錯誤の中で、バージョンを入れ直ししたりしていた結果
~/.minikube　がおかしくなっていた様子。（v1.0.0→v0.35.0→v1.0.1）
決め手となったのは以下コマンド。

```shell
rm -rf ~/.minikube
```

## クラスタ削除から再スタートまで

```shell
kusumoto-t:~$ minikube delete
🔥  Deleting "minikube" from virtualbox ...
💔  The "minikube" cluster has been deleted.
kusumoto-t:~$ rm -rf ~/.minikube
kusumoto-t:~$ minikube start
😄  minikube v1.0.1 on darwin (amd64)
🤹  Downloading Kubernetes v1.14.1 images in the background ...
🔥  Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...
📶  "minikube" IP address is 192.168.99.105
🐳  Configuring Docker as the container runtime ...
🐳  Version of container runtime is 18.06.3-ce
⌛  Waiting for image downloads to complete ...
✨  Preparing Kubernetes environment ...
💾  Downloading kubelet v1.14.1
💾  Downloading kubeadm v1.14.1
🚜  Pulling images required by Kubernetes v1.14.1 ...
🚀  Launching Kubernetes v1.14.1 using kubeadm ...
⌛  Waiting for pods: apiserver proxy etcd scheduler controller dns
🔑  Configuring cluster permissions ...
🤔  Verifying component health .....
💗  kubectl is now configured to use "minikube"
🏄  Done! Thank you for using minikube!
kusumoto-t:~$ minikube service list
|-------------|------------|--------------|
|  NAMESPACE  |    NAME    |     URL      |
|-------------|------------|--------------|
| default     | kubernetes | No node port |
| kube-system | kube-dns   | No node port |
|-------------|------------|--------------|
kusumoto-t:~$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.105
kusumoto-t:~$ minikube dashboard
🔌  Enabling dashboard ...
🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
🎉  Opening http://127.0.0.1:61290/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/ in your default browser...
```

## 結果
<img width="1277" alt="スクリーンショット 2019-05-08 19.46.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277170/3f9e4e21-9bd4-668e-515e-c9586ddfbcf0.png">


## 参考
https://stackoverflow.com/questions/52916548/minikube-dashboard-returns-503-error-on-macos
完全学務爆破マニュアル Light版 ~ 基礎から始める飛翔体の力学 ~ 目次


次のページ [ 地上座標系と機上座標系の変換](https://qiita.com/lier80/items/1fd2be8226aff1cb0c2d)

# This is how to BLOW OFF your enemy

# 完全学務爆破マニュアル Light版 ~ 基礎から始める飛翔体の力学 ~

## 始めに

皆さんこんにちは、はじめましての人ははじめまして、80がラッキーナンバーの人です。 
ところで、カルタゴと学務は滅ぶべきだと思います。 
と言うわけで、早速学務を爆破したいと思います。どうせなら最も美しい形で吹き飛ばしてあげましょう。

## 概要

一般人でも身近に入手できる飛翔体(弾道ミサイル、戦術ロケット、RPG)を用いて学務課を破壊する。

## 目的

学務課の完全かつ徹底的な爆破をお手軽に実行できるようにする。

## 方法

誘導弾を発射した後のふるまいを、機上座標系からみた積分値で計算する。
何らかの世界座標系と機上座標系の連関を表し続け、いろいろな処理を行う。

## 手順

1. 飛翔体の状態を処理しやすい形で表す。具体的には、地上の座標系から飛翔体の座標系までの変換を行う。
2. 地上の座標系から飛翔体の座標系までの変換を行い、飛翔体の座標そのものを得る方法を作る。ただし、ここではシステムに累積誤差が発生しないものとする。
3. 座標系を四元数で取り直す。
4. 実際のセンサを用いた時の誤差累積を考慮して飛翔体の状態を得る。具体的には、カルマンフィルタを用いた移動体の位置推定を行う。
5. 機上座標からの視線を考慮し、センサ系から得たデータを実座標空間に直す。
6. 機上座標系からの情報を元に、パスプランニングを行う。
7. 空力を考慮する。具体的には、入力(ジェット噴射やコントロールサーフェス(羽根のパタパタする奴))と出力(姿勢や位置の変更)を結んでいる安定微係数やCl,Cdなどの定数を考える。
8. 飛翔体のダイナミクスに加えキネマティクスを考慮する。具体的には、ミサイルは強烈な荷重がかかりグワングワンと変形する。これがダイナミクスと相関する部分を考慮する。
9. CEPを考慮した、確率的な"当たり外れ"を考慮して学務課を確実かつ徹底的に爆破する。

参考資料として、いろいろな本を読んでいますが、できれば例のターンする飛行機の絵が扉絵の航空機の力学の入門書を読むなどしてください。(なしでもわかるようにはしておきます)

次のページ [ 地上座標系と機上座標系の変換](https://qiita.com/lier80/items/1fd2be8226aff1cb0c2d)
数検１級 (8) 無限級数

# 問題

次の級数の和を求めなさい。ただし正の整数 $n$ に対して $n!$ は $n$ の階乗を表します。

$$ \sum_{n=1}^{\infty} \frac{n^2}{n!}$$

<details><summary></summary><div>

# 知識

$e^x$ のマクローリン展開：

```math
\mathrm{e}^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \cdots
```

したがって、$x=1$ を代入することで、

```math
\mathrm{e} = 1 + 1 + \frac{1}{2!} + \frac{1}{3!} + \frac{1}{4!} + \cdots = \sum_{n=0}^{\infty} \frac{1}{n!}1
```


# 解答

既知の級数 $\sum_{n=0}^{\infty} \frac{1}{n!} = \mathrm{e}$ に寄せるため、次のように変形する。

```math
\begin{align}
\sum_{n=1}^{\infty} \frac{n^2}{n!} 
&= \sum_{n=1}^{\infty} \frac{n^2-n+n}{n!} \\
&= \sum_{n=1}^{\infty} \frac{n(n-1)}{n!} + \sum_{n=1}^{\infty} \frac{n}{n!} \\
&= \sum_{n=2}^{\infty} \frac{n(n-1)}{n!} + \sum_{n=1}^{\infty} \frac{n}{n!} && \text{（第１項は $n=1$ でゼロ）} \\
&= \sum_{n=2}^{\infty} \frac{1}{(n-2)!} + \sum_{n=1}^{\infty} \frac{1}{(n-1)!} \\
&= \sum_{m=0}^{\infty} \frac{1}{m!} + \sum_{k=0}^{\infty} \frac{1}{k!} && \text{（$m=n-2, k=n-1$ と定義）}\\
&= \mathrm{e} + \mathrm{e} \\
&= 2 \mathrm{e}.
\end{align}
```


# 感想

* 無限級数は一般的な方針がないから怖い
* テイラー展開でちょうどいいものを探す

</div></details>
Educational DP Contest C - Vacation

#問題概要
[問題のリンク](https://atcoder.jp/contests/dp/tasks/dp_c)

太郎君は$N$日間、毎日以下の$A, B, C$いずれかの活動を行う。

- A: 海で泳ぐ。 幸福度 $a_i$ を得る。
- B: 山で虫取りをする。 幸福度 $b_i$ を得る。
- C: 家で宿題をする。 幸福度 $c_i$ を得る。

2日以上同じ活動を行うことはできない。この時、幸福度の最大値を求めよ。

#制約条件

- 入力はすべて整数である。
- $1≤N≤10^5$
- $1≤a_i,b_i,c_i≤10^4$

#考えたこと

2日以上同じ活動は不可能なので例えば、
1日目：10 40 70
2日目：20 50 80
3日目：30 60 90
となっていた場合Cの値、70, 80, 90を連続で取ることは不可能。
なので一つ前の処理でどの値をとったかインデックスを記録していこうと思ったがめんどくさそうだったので、2次元配列を作り、A,B,C全ての活動に対してその日行った場合の幸福度を求めた。
そうすれば前の日に行われたのはその日の活動を除いた二つのうち大きい方となるので。例えばその日Aを行った場合、前の日はBとCのうち大きい方を行っている。

よって以下のような遷移をさせる。

```.cpp
dp[i] = {a[i]+max(b[i-1],c[i-1]), 
         b[i]+max(a[i-1],c[i-1]), 
         c[i]+max(a[i-1],b[i-1])}
```

この時計算量は$O(N)$

#解答

```c.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n; cin >> n;
    vector<vector<int>> abc(n, vector<int>(3));
    for(int i = 0; i < n; i ++) cin >> abc[i][0] >> abc[i][1] >> abc[i][2];
    vector<vector<int>> dp(n, vector<int>(3));
    dp[0] = {abc[0][0], abc[0][1], abc[0][2]};
    for(int i = 1; i < n; i++) {
        dp[i] = {abc[i][0]+max(dp[i-1][1], dp[i-1][2]), abc[i][1]+max(dp[i-1][0], dp[i-1][2]), abc[i][2]+max(dp[i-1][0], dp[i-1][1])};
    }
    cout << *max_element(dp[n-1].begin(), dp[n-1].end()) << endl;
}
```
【Java】クラスの継承

新しいクラスを作成するときに、すでにあるクラスを流用できたら効率よくクラスを作成することができますよね。Javaの「継承」によって実現することができます。
#クラスの継承とは
例えば、既製品を改良して新製品を作るとき、全く無の状態から新に設計図を作るのも1つの方法ですが、既製品の設計図を元に改良を加えて新製品の設計図を作成すると変更点と追加点の設計だけ行えばよいので効率よく設計図を作成できます。
Javaのクラスの作成についても同様です。既クラスの機能を拡張したり、別の機能を追加したりするときに拡張や追加する部分だけを記述することで新しいクラスを作成することができます。これを**継承**と呼び、継承するための既クラスを**スーパークラス**または**親クラス**と呼びます。一方で新クラスを**サブクラス**または**子クラス**や**派生クラス**と呼びます。
１つの親クラスから複数の子クラスを作成できます。しかし、子クラスは複数の親クラスを持つことはできません。Javaでは２つ以上の設計図を混ぜて新しい設計図を作成することはできないんです。これを「単一継承」と言ったりします。
#継承
クラスの継承にはextendsを使用します。

```
class クラス名 extends スーパークラス名{
  インスタンス変数・メソッド
}
```


#継承とコンストラクタ
継承を行ってもコンストラクタだけは継承されません。これは、初期化を行う対象がサブクラスで追加や削除されていたり、型が変更されていたりするかもしれないからです。たとえスーパークラスにコンストラクタを同じコンストラクタであったとしてもサブクラスにそれを記述しなければなりません。
#super()
継承したときに新にコンストラクタを作成することで再びコンストラクタが使えるようになりましたが同じ内容のコンストラクタをサブクラスにも記述しなければならないのは面倒ですし、せっかくの継承の利点が半減してしまいます。スーパークラスのコンストラクタを使用して継承した部分の初期化を済ませておいてサブクラスの中で追加した部分の初期化を行うなど、コンストラクタでも共通の部分は継承し、違う部分だけをサブクラスのコンストラクタで記述できたら便利ですよね。
Javaでは**super**を使って実現できます。superはそのクラスのスーパークラスのコンストラクタを呼び出します。スーパクラスの名前がなんであっても必ずこのsuperを使って呼び出します。実際のスーパクラスの名前を入れてもコンストラクタとしては動作しませんので注意してください。また、引数がある場合でもsuper()のカッコ内に引数を書くことで、それに対応したスーパクラスのコンストラクタを呼び出すことができます。
なお、コンストラクタは最初にスーパクラスのコンストラクタを実行し、その後でサブクラス特有の処理を行うために、このsuper()はサブクラスのコンストラクタの一番初めに記述しなければいけません。また、super()によるスーパクラスのコンストラクタの呼び出しを明記しない場合でも、クラスに引数なしのコンストラクタがないとコンパイラが自動的にスーパクラスのコンストラクタを参照してコンストラクタを作成させます。
#再定義：オーバーライド
継承によってスーパクラスのすべての性質を受け継ぐことになるので、場合によっては不要なメソッドを継承してしまうことも生じます。そのようなときは、継承した側でメソッドを再定義してしまいましょう。この再定義を**オーバーライド**といいます。名称が似ている「オーバーロード」と混同しないように気を付けてください。オーバーライドはすでに定義されていたメソッドをサブクラスで記述したものに置き換えてしまうため、以前のメソッドは使われなくなります。
オーバーライドの仕方は通常のメソッドの定義と何ら変わりません。ただし、スーパクラスのメソッドを誤ってオーバーライドしたつもりが別のメソッドを定義してしまったなどということが起こらないように、メソッドがオーバーライドするものであることを `@Override` と表記することで明示します。これをオーバーライドアノテーションといい、オーバーライドの失敗を防ぐことができます。
Google カレンダーの予定作成日を確認するスクリプト

# 予定を作った日時が知りたい
Google カレンダーを見ていて「あれ、これ何の予定だ？」となる事がたまにあるのですが
そういった時「いつ作った予定なのか」が分かれば「あぁあの人と会話してる時に作ったんだな」とか「あのメンツで飲んでる時に入れたんだな」といった事が分かったり、
Google のアクティビティログから その時刻にどこに居たのか調べたり、Facebook のアクティビティログで当日やりとりした人を確認したり と調べる道筋が出てきます。

しかし Google カレンダーは WEB UI 上で、予定の作成日を確認する事ができません。
公開状態にしても問題ないカレンダーであれば、iCal をダウンロードしてデータを直接調べる事もできますが、公開にする事への抵抗や、長期間使っているカレンダーの場合 iCal が長大で煩雑だったりもします。
そこで GAS で利用できる API を調べてみた所、Google Calendar を操作する API も存在し、[getDateCreated](https://developers.google.com/apps-script/reference/calendar/calendar-event#getDateCreated()) でイベントの作成日を取得できる事が分かった為、簡単なスクリプトを作って確認しました。

ごくごく簡単なものですが、他に そういったものを公開してる人も見かけなかったので、誰かの役に立てば と思うので置いておきます。

https://gist.github.com/tyoro/33cd84e9f45c584cb088240ec6fff4c2


# 使い方とか簡単な解説

解説するまでもないというか、GAS までの導入は↓の参考記事とか見てもらった方がはやい。

```return CalendarApp.getCalendarById('hogehoge@gmail.com')```

に取得したい予定が入っているカレンダーのアカウントを設定して

```var e = getEvents(2019,5,18);```

の部分で日付け指定してスクリプトを走らせて、メニューから「表示 > ログ」を選んでログを開くと。

![daa29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78375/659f55ae-7e77-ab8c-c306-828e8991f2d2.png)

といった感じのログが出ます。
簡単ですね。


# 参考
[GoogleAppsScriptでGoogleカレンダーの予定をチャットワークに通知するやつ作る【GAS初心者向け】](https://qiita.com/mi0/items/d55324db83c4e98ae3fa)
※1からドキュメント見るの面倒だったので、基礎部分を拝借しました。
How To Consume HashiCorp Vault API Using Lumen

This is another Rest Api tutorial using php. I am accessing HashiCorp Vault API using Lumen micro-restframework.The vault is use to store the enterprise level secrets data,password and keys etc, We can access stored secrets data using rest api.

https://www.restapiexample.com/build-rest-api/how-to-consume-hashicorp-vault-api-using-lumen/
deviseで作成したコントローラー,ルーティングのカスタマイズ

#deviseで生成したコントローラーのカスタマイズ

deviseで色々操作する機会があったので、備忘録として残しておきます。

deviseをインストールする手順は省きます！

```ruby

$ rails g devise:controllers users
```

以下のファイルが生成されます。

confirmations_controller.rb
omniauth_callbacks_controller.rb
passwords_controller.rb
registrations_controller.rb
sessions_controller.rb
unlocks_controller.rb

##コントローラーのカスタマイズ

```ruby:routes.rb
  devise_for :users, controllers: {
    registrations: 'users/registrations',
    sessions: 'users/sessions'
  }
```
Devise.controllerの設定が上記のようにできます。
今回はregistrationsとsessionをカスタマイズしてみました！！



##ルーティングのカスタマイズ

ルーティングもカスタマイズができます。

```ruby:routes.rb
   devise_scope :user do
    get 'users/index', to: 'users/registrations#index'
    get 'users/destroy', to: 'users/sessions#destroy'
  end 
```



上記２つ合わせてみると,,,

```ruby:routes.rb
Rails.application.routes.draw do
  devise_for :users, controllers: {
    registrations: 'users/registrations',
    sessions: 'users/sessions'
  }
   devise_scope :user do
    get 'users/index', to: 'users/registrations#index'
    get 'users/destroy', to: 'users/sessions#destroy'
  end 
```



あとは$rake routesで変更がかかっているか確認をします




>参考サイト

https://easyramble.com/cutomize-controllers-on-rails-devise.html
【超初心者向け】ChromeでCSSのどの要素が当たってるのか確認する

#はじめに
これは既に多くの記事があるのですが、中途半端な内容の記事が多くやり方がまったくわかりませんでした。私の理解力が糞雑魚ナメクジなだけかもしれませんが、ナメクジにもわかるよう記事を残しておきます（Qiitaに中途半端な記事が多いと言うわけではなく、Googleで検索した時に上位にヒットするようなサイトの内容です。私の検索の仕方が悪いのかもしれませんが。）

#やりかた
F12を押してデベロッパーツールを表示させた後に、こちらをクリックします。
ボタンが小さいですが、デベロッパーツール上の左上ですね。
![2019-05-09 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374426/b9c56d8a-68ea-27c8-f162-89d7e28032b8.png)



そしたら要素を確認したいところを選択すればOK。
![2019-05-09 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374426/4d7257ba-5671-429a-1871-7c2c6bfd7d72.png)
ssコマンドメモ

## 列情報

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301697/0f7e07c3-2e82-0f82-4541-f447a2f68f4e.png)

| カラム | 内容 | 備考 |
|:--|:--|:--|
| Netid | ソケットタイプとプロトコル | |
| State | 接続状態 | |
| Recv-Q | 受信待ちのデータ | |
| Send-Q | 送信待ちのデータ | |
| Local Address:Port | ローカルのIPアドレスとポート | |
| Peer Address:Port | 通信相手のIPアドレスとポート | |

※ ソケットはTCP/IP機能を呼び出すAPI
※ "*"で表示されるところは任意の値が入りうることを示す。

## 接続時と未接続時の比較

* SSH接続がされていないとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301697/440e9ff8-5f99-f7aa-5c5a-8b04f35a2b8e.png)

* SSH接続されているとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301697/db5005ed-2f8c-92fb-df1e-8eb9f4aac96d.png)

※ 接続されると具体的なIPアドレス、ポート番号の情報が表示される。

## 個人的によく使いそうなコマンド

##### 自身のPCのポートが開いているかどうかを確認したいときのコマンド
```
ss -l
```
※ lオプションはリスニングしているポート情報を出力する。

##### プロセス情報も取得したいときのコマンド
```
ss -lp
```

##### プロトコルがTCP、UDPの情報を取得したいときのコマンド
```
ss -ltu
```
C++ ベクトルの書き方

# 1-3次元配列のベクトルによる書き方
1, 2, 3次元をそれぞれ vec, mat, tns と書く。

```vecmac.cpp
template<typename T> using vec = std::vector<T>;
template<typename T> using mat = std::vector<std::vector<T> >;
template<typename T> using tns = std::vector<std::vector<std::vector<T> > >;
```

# 初期化
## 1次元の場合

```vecinit.cpp
std::vector<int> a = {0, 10, 5}; // c++11
vec<double> res(n, 0.0); // initialize a vector with 0.0
vec<X> res(n); // initialize a vector with n elements
```

## 複数次元（3次元 x, y, z）の場合

```tnsinit.cpp
 tns<double> alpha = vec<vec<vec<double>>>(x, vec<vec<double>>(y, vec<double>(z, 0.0)));
```

# 要素の追加と削除

ソートされたベクトル v に順序を保ったまま、要素の削除と追加を行う例

```
  vector<int>::iterator p;
  vector<int> v, arr;
  sort(v.begin(), v.end());
  for (int i = 0; i < n - d; i++) {
    // delete arr[i] from v
    p = lower_bound(v.begin(), v.end(), arr[i]);
    v.erase(p);
    // insert arr[i+d] into v
    p = lower_bound(v.begin(), v.end(), arr[i + d]);
    trail.insert(p, arr[i + d]);
  }
```
p = lower_bound(v.begin(), v.end(), a) は指定された値 a 以上の最初の要素を指すイテレータが入る。
laravel5.5 ページネーションでpage以外のGetパラメータを引き継がせる

laravelでページネーションの処理を追加した際にもともとgetメソッドで受け渡したい変数がpageにとって変わられる事件がおきたので対処した。

postsテーブルのtextを1ページ10件ごとに表示するようにする。

```ruby:Controller
#データベースpostsテーブルの情報を、１ページ10件ずつ表示させるように実装
	$user_id = Auth::user()->id;
	$posts = DB::table('posts')->where('user_id', $user_id)->paginate(10);
	return view('#', compact('posts'));

```

```ruby:View
##text、created_atカラムを10件ずつ表示
@foreach ($posts as $post)
{{ $post->text }}
{{ $post->created_at }}
@endforeach
<br/>
{{ $posts->links() }}

```

`{{ $posts->links() }}`  はページ選択ボタン


しかしこれだとページ選択ボタンをおすと、getメソッドがpageに取って代わられるので、以下のように修正した。

```ruby:
	$user_id = Auth::user()->id;
	$posts = DB::table('posts')->where('user_id', $user_id)->paginate(10);
    $posts->withPath('1?$2=3') #追記(1にリンク、２に変数名、３に２に格納する変数の中身)
	return view('#', compact('posts'));

```

これで、ページ選択ボタンを押しても&&でpageに加え、もともとのgetメソッドの値を残すことができた。
【IntelliJ IDEA】Language Injectionsを使ってみる

今回はIntelliJのLanguage Injectionsという機能を使ってみたいと思います。
IntelliJの細かい設定や操作の詳細は[公式ドキュメント](https://www.jetbrains.com/help/idea/using-language-injections.html)を参考にしてください。

### Language Injectionsとは
Language Injectionsとは、文字列の中でJSON,やSQLなどの言語を記述する際に、文法チェックや補完などをIDEがおこなってくれたり、文字列の中の言語をより書きやすくしてくれる機能です。

### Language Injectionsを使わない場合
例えば文字列の中でJSONを記述しようとすると、以下のようにダブルクオーテションをエスケープしながら記述する必要があるのですが、これを手で書いていくのはなかなかつらいと思います。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160829/46e4cc36-8a4b-529a-0b37-1ba8ffc3167b.png)

また、以下のようにJSONの文法エラーとなるような記述をしても、文字列として扱われるためIDEはエラーと認識しません。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160829/09b04284-8a58-4e86-dffe-cef54445aca9.png)

Language Injectionsを有効にするとこういった不便な問題を解決することができます。

### Language Injectionsを使った場合
まず、空の文字列を記述して、カーソルを文字列に合わせた状態でalt + returnを押して、以下を表示させます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160829/287451a7-ec8f-10dd-3c9f-1bf3f46c2b87.png)

Inject language or referenceをクリックして、JSONを選択します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160829/1166594b-3115-7eea-642a-62ce4b9eb016.png)

もう一度文字列にカーソルを合わせてalt + returnを押すと、Edit JSON Fragmentが表示されるのでクリックします。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160829/506d8c62-d5cc-9eda-c8e7-9929e3d92220.png)

クリックすると、JSON Fragementというviewが表示されます。そこに生のJSONを記述すると、実際のコードの文字列の中でも自動的にダブルクオーテーションがエスケープされた状態でJSONが同時に記述されます。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160829/a5682a6e-70a2-c09b-e1e4-191ede501370.png)

また、この状態で文字列の中にJSONの文法エラーとなるような記述を書くと以下のようにIDEがエラーを表示してくれるのでとても便利です。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160829/74d145dd-5bba-bd05-c86f-fb628a25f114.png)

### おわりに
今回はJSONのケースを紹介しましたが、SQLでは候補予測や補完が有効になったり、他にもxmlやyaml, JPAのJPQLやJiraのJQLなど様々な言語に対応しているので、ぜひ試してみると良いと思います。
Laravel.shibuya #1 スライドまとめ

## イベント情報
日時：2019/5/9(木) 19:30~
場所：株式会社オウケイウェイヴ ＠恵比寿(←渋谷ではないので注意w)
https://laravel-shibuya.connpass.com/event/127768/

## LTスライドまとめ

### 「DIとは何かを探す旅に出た話」 
- よしにゃん.php(<a href=https://twitter.com/yoshi_php>@yoshi_php</a>)さん

- スライド：https://speakerdeck.com/yoshi1234/di-travel

- 一言感想：私みたいな「DIって何？」という初心者でも、DIについて分かった気になれるぐらい分かりやすかったです。初心者の方におすすめ。

### 「LaravelのUser::find(1)で知るコードの読み方」

- ういろう(<a href=https://twitter.com/nyamucoro>@nyamucoro</a>)さん

- スライド：https://docs.google.com/presentation/d/1zs20cl5hGcWaXXj47NQ8DeTumo63i7_lpFPeAhM-TZA/edit#slide=id.p

- ブログ：https://www.nyamucoro.com/entry/2019/05/09/002551

- 一言まとめ："関数の定義が見つからない時は、継承やtraitでなければ、``__call``を疑え。"

- 参考：メソッドのオーバーロード(https://www.php.net/manual/ja/language.oop5.overloading.php)


### 「バリデーション駆動開発(仮称)でプロジェクトメンバー全員を幸せにした話　Laravel/オレオレ 両対応」
- 武田 憲太郎(<a href=https://twitter.com/KentarouTakeda>@KentarouTakeda</a>)さん

- スライド：https://www.slideshare.net/KentarouTakeda/laravelshibuya

- 一言まとめ："問題はバグが存在したことではなく、```バグの可能性```が存在したことである。バリデーションをうまく使ってその可能性をあらかじめ潰しておこう。"

## その他参考URL
みく(D. Horiyama)(<a href=https://twitter.com/wand_ta>@wand_ta</a>)さんがブログでわかりやすくまとめています。
イベント前半のIRT(Interactive Round Table)の内容についても触れています。
https://wand-ta.hatenablog.com/entry/2019/05/08/231804
.fastqをfor回して手軽に落とした話



とりあえず目標遺伝子のchip-seqとかrna-seqのfastqファイルが欲しい。

https://www.ncbi.nlm.nih.gov/sra
こういうところで比較実験とかやってるいい感じのサンプルを探しましょう。

いい感じの原著論文を見つけたらstudyとかを遡ってGSEナンバー（プロジェクトごとに振られてるID的なやつ）を手に入れるといいです。
GSE12345みたいな文字列がそれです。


https://ddbj.nig.ac.jp/DRASearch/

ここのキーワードのところにGSEナンバー入れると.fastqのsampleがずらっと表示される。srrって書いてあるやつが一番下の層に振られてるIDっぽい。
SRR1234567...的に表記されてて、だいたい研究ごとに連番になってる
ここからまとめてお手元にダウンロードしたい。楽して


#ダウンロードするための手立て


https://www.ncbi.nlm.nih.gov/sra/docs/toolkitsoft/
ここでsratoolkitをOSに合わせてダウンロードする。
落としたら解凍しよう。finderでダブルクリックすればできる。
sratoolkit.2.9.6-mac64をいい感じのディレクトリに移すと良い。今回はホームとかで、
そしたらsratoolkit.2.9.6-mac64の中の/binにパスを通す必要がある。terminalで同じディレクトリに移動してパスを通す。

```
cd
export PATH=${PATH}:~/sratoolkit.2.9.6-mac64/bin

```
これでprefetchとfastq-dumpが使えるようになる。

```
prefetch#なんか出たらok
fastq-dump#なんか出たらok
```

##prefetch
SRRナンバーに対応して.sra形式のファイルを落とす。
この中にfastqも含まれてる。下のディレクトリにncbi/public/sra作って、その中に落としてくれるのでかくにんするとよい。

```
prefetch SRR1234567
```
##fastq-dump
.sraからfastqを抜き取ってくれる。reverseもくっついてきちゃうので　--split-filesをくっつけると正しく分離できて良い。

```
fastq-dump --split-files SRR1234567.sra
```

容量圧縮するのやなんでrmで元のファイル消してgzipで.fastq.gzに圧縮

```
rm SRR12345"$i".sra

gzip SRR1234567_1.fastq
gzip SRR1234567_2.fastq
```
#まとめ


```bush:matomete.txt
cd
export PATH=${PATH}:~/sratoolkit.2.9.6-mac64/bin

for i in {01..10}
do
prefetch SRR12345$i
done

cd ncbi/public/sra

for i in {01..10}
fastq-dump --split-files SRR12345"$i".sra

rm SRR12345"$i".sra

gzip SRR12345"$i"_1.fastq
gzip SRR12345"$i"_2.fastq


done
```

#Appendix
容量圧迫を避けるために外部ストレージで作業したほうがいい
次やる時はこうする

```
cd /Volumes/USBNAME/#これで外部ストレージに移動。まじか
for i in {1..10}
do
wget ftp://ftp-trace.ncbi.nih.gov/sra/sra-instant/reads/ByRun/sra/SRR/SRR1234/
SRR12345"$i"/SRR12345"$i".sra #wget有能　(brew install wgetとかはあらかじめやっとく)
done
```
swift 5.0 の map, reduce における index の取り方

Array の functional loop (map, reduce) で、要素のindexが取りたい場面があった。

```swift
let arr: Array<String> = ["A", "B", "C", "D", "E"]

// $0 $1 を使う書き方

arr.map{ $0 + "F" } 
arr.reduce("", { $0 + $1 }) //=> "ABCDE"

// 定義する書き方

arr.map{ elem in
  elem + "F"
}
arr.reduce("", {acc, cur in
  acc + cur
})

// どちらの書き方でも結果はそれぞれ同じ。
// map --> arr = ["AF", "BF", "CF", "DF", "GF"]
// reduce --> "ABCDE"
```

今回は例として、奇数番目の要素だけを `"X"` にしたいとする。

loop内で要素のindexを取得し、 `index % 2 == 0` か否か場合分けしたい。

調べると、swift 3.0 までは、要素が格納されている変数 (上の例だと`$0`, `$1`, `elem`, `cur`)の`.0`でindexを取得できたようであった。

```swift
// swift 3.0 までで可能な書き方

arr.map { $0.0 % 2 == 0 ? "X" : elem }
```

swift 5.0でこれを行うと、次のようにエラーが出た。

```
Value of type 'String.Element' (aka 'Character') has no member '0'
```

解決策としては、配列を一旦 `EnumeratedSequence` に変換してやる。

そうすると、全ての要素が「値とoffset(=index)のペア」に変わったシーケンスを取得できる。

値には`.element`、indexには`.offset`でアクセスできる。

```swift
// swift 5.0 で可能な書き方

arr.enumerated().map { $0.offset % 2 == 0 ? "X" : $0.element }
// --> arr = ["X", "B", "X", "D", "X"]
```
コメントの書き方

|          | バージョン   |
|:---------|-----------:|
| Xcode    |   10.2.1   |
| iOS      |   12       |


#コメントの書き方

###書き方①
コメントの前に「//」を入れる

```
//ここにコメントを記載
```

###書き方②
コメントアウトする行を「/*」「*/」ではさむ

```
/*
ここにコメントを記載
ここにコメントを記載
*/
```



###補足
- Xcodeで複数行をまとめてコメントアウトするときは、コメントアウトしたい行を選択して<kbd>Ctrl</kbd>+<kbd>/</kbd>を押すと一括でできる
【Java】オーバーロード

#オーバーロード
Javaにおいて、同じ働きをするメソッドでも、引数の数が違ったり、その引数の数にあったメソッドをそれぞれ作成しなければなりません。このとき、メソッド名をどのようにつければよいでしょうか。重複がないように名前を付けることももちろん可能ですが、引数の数の文だけ名前があると、それだけで覚えるのが大変になります。この場合に、役立つのが**オーバーロード**です。
###同じ名前をもつメソッド
以下のプログラムを見てください。max()メソッドは２つのint型変数のうちどちらか大きいほうを返すものです。

```java
class Max{
  static int max(int x, int y){
    if(x>y)
      return x;
    return y;
  }
}
```

これをdouble型変数に対して大きいものを返すように拡張することを考えます。
double型の引数に対応したメソッドを新たに作ることになるのですが、このときにメソッド名をどうするかがカギになります。Javaにおいてメソッド名は変数名と同じルールでプログラマが自由に付けることができます。int型値を処理することと、double型値を処理することは、引数型も返値型も異なりますから、doubleMax()などとメソッド名を区別してつけることは決しておかしいことではありません。しかし、メソッドを利用する立場から見ると「数は異なっていても引数の中から最も大きい値を返す」という処理は変わりませんから、引数の数や型の種類によっていろいろな名前をつけメソッドを作成しそれを適宜選択していくのではなく、引数の数が異なっていても同じ名前であったほうが使いやすいはずです。
このような、引数の数が違う同じ名前のメソッドを定義することを**オーバーロード**と呼びます。オーバーロードによってプログラマは引数に対応したメソッドを探し出す必要がなくなり、メソッドがもつ「機能」自体に着目してプログラムを記述することができるようになります。

```java
class Max{
  static int max(int a, int b){
    if(a>b)
      return a;
    return b;
  }
  static double max(double a, double b){
    if(a>b)
      return a;
    return b;
  }
}
```
はじめてのC++【45日目】

# はじめに
皆様アドバイスありがとうございます。
コードの設計がダメダメで、自分でも迷走中です。
## .gitignore
次のリポジトリを作るときにまた作ると思うので、ここにメモしておく。
### .gitignoreの作り方
```:.gitignore
#コメントはこのように書く
*消したいディレクトリ
*消したいファイル
```
### commit済みのファイルを消したいときに使うコマンド

```:ターミナル
$ git rm -r --cached 消したいファイル
# --cached は、リモートリポジトリにあるファイルを消して、ローカルリポジトリには残しておくというオプション
# git rm -r ファイル名　ならローカルリポジトリのファイルも消えてしまうので注意が必要
.
.
.
#　処理を終えたら,
$ git add -A
$ git commit -m コメント書く
$ git push origin master
```
# 終わりに
今日は時間があまり取れなかった。
ロベールやるやる詐欺してるけど、明日は時間があるので明日こそはロベールをやる。
Vue.js基本文法1

#Vue.js入門編

##導入方法

まずは一番簡単な奴から

```html
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
```
上記をhtmlで読み込む
## Vueアプリケーションの作成

```js

const app = new Vue({
  //オプション
})
```
コンストラクタ関数Vueを使用し、Vueインスタンスを作成する。
戻り値はルートのインスタンスとなっているので、変数化しておく事でコンソールからアクセスできる。

##　基本機能

###テキストのバインディング

```html:index.html
<p>{{message}}</p>
```

```js:main.js
new Vue({
    el:"#app",
    data:{
        message:'Hello World!'
    }
})
```

```html:結果
<p>Hello World!</p>
```

###v-forディレクティブ
```html:index.html
<ul>
  <li v-for="item in list">{{ item }}</li>
</ul>
```

```js:main.js
new Vue({
    el:"#app",
    data:{
        list:['hoge1','hoge2','hoge3']
    }
})
```

```html:結果
<ul>
  <li>hoge1</li>
  <li>hoge2</li>
  <li>hoge3</li>
</ul>
```

###イベントハンドリング
```html:index.html
<button v-on:click="click">ボタン</button>
```

```js:main.js
new Vue({
    el:"#app",
    methods:{
        click(){
            console.log(event);
        }
    }
})
```

```console:結果
　MouseEvent
```

###フォーム入力バインディング

```html:index.html
  <input v-model="message">
  <p>{{ message }}</p>
```

```js:main.js
new Vue({
    el:"#app",
    data:{
        message:'同期するぞ！'
    }
})
```
v-model.numberと書くと入力値を数値として受け取ることができる

###v-ifディレクティブ

```html:index.html
    <button v-on:click="show=!show">切り替え</button>
    <p v-if="show">Hello Vue.js</p>
```

```js:main.js
new Vue({
    el:"#app",
    data:{
        show:true
    }
})
```
上記で表示の切り替えができます。
強化学習×推薦アルゴリズムを試せる環境「RecoGym」とは？

Datumixの奥戸です．
あ，このアカウントの@teamOkudoの"Okudo"とは自分のことですw
とうとう正体を現しました．
さて，今回はRecoGymという推薦システム×強化学習を試せる環境の説明と導入部分について記事を書きたいと思います．

## RecoGymとは？
　RecoGymは推薦システムのトップカンファレンスである RecSys2018 で発表されたOpenAI Gym上で推薦アルゴリズムを試すことのできる学習（テスト）環境です．Open AI gymの説明に関してはここでは省略します．

## 強化学習環境上での推薦システム
　強化学習×推薦システムに関して少しここで説明しておきます．まず，強化学習をざっくり書くと，エージェントと呼ばれる行動主体が環境とのインタラクションを通して獲得できる報酬を元に行動の仕方（方策）を学習する枠組みになります．強化学習の枠組みで記述できる推薦システムの概図は下図になります．
<img width="751" alt="rl_setup_rec.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284535/707fd026-8818-f3d9-e496-ef6e88c6d50d.png">

　上図で出てきた要素と強化学習の文脈で出てくる言葉を対応づけると下表のようになります．

|強化学習|図内で対応する要素|補足|
|:-----:|:-------:|:----|
|エージェント|agent|推薦アルゴリズム|
|環境|user|推薦を受け取るユーザー|
|行動|action|推薦|
|観測（状態）|observation|ユーザーが商品に対してとった行動情報|
|報酬|reward|ユーザーが推薦した商品をクリックしたかどうか|

　推薦システムがユーザーに対して商品の推薦を行います．その結果，商品に対してとったユーザーの行動情報と推薦した商品をクリックしたかどうかのフィードバックを推薦システムが受け取ってアルゴリズムを更新することを繰り返す形になっています．

## RecoGymの特徴
　RecoGymでは以下のような流れで学習を行うことができます．

<img width="655" alt="flow rec.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284535/29a41e13-d053-edf4-3d5a-8ee6c63d9769.png">

　オフライン学習（Offline Learning）のためにRecoGymがデータの生成を担ってくれます．具体的には固定方策で商品を推薦し，その推薦に対するフィードバックを記録しておきます．ここで記録された訓練データを用いてエージェントはオフライン学習を行うことができます．
　次のオンライン学習（Online Learning）では行動決定，その決定に伴う状態と報酬の観測，方策の更新の繰り返しを行います．
オフライン学習は，推薦システムでよくあるコールドスタートに対する対処ですね．初期の学習にはコストがかなりかかるので訓練データの収集と学習部分を切り離しています．

## 導入
　推奨されているのはAnaconda上でのPython 3.7+環境です．あと，OpenAI gymの環境のインストールが必要になります．まず，conda-envをインストールします．

```
# install conda env
conda install -c conda conda-env
conda install -c r r-essentials
```

　次に，[RecoGymのレポジトリ](https://github.com/criteo-research/reco-gym) をクローンしてきて，必要なライブラリをインストールします．OpenAI gymはAnacondaでのインストールに対応していないみたいなのでpipでインストールします．

```
git clone https://github.com/criteo-research/reco-gym.git
cd reco-gym
```
```
# create environment based on environment.yml
conda-env create environment.yml
pip install gym
```

これで導入は終了になります．お疲れ様でした．

## 最後に
　今回は，強化学習環境であるOpenAI gym上で推薦システムを試せる環境であるRecoGymの説明とその導入まで行いました．次回は，このRecoGymを使って実際にプログラムを動かしていきたいと思います．乞うご期待！

[Datumix](http://www.datumix.co.jp/)では一緒に推薦システムの構築や強化学習の実装や調査を手伝ってくれる仲間を募集しています．強化学習の社会実装に興味がある，推薦システムを作って見たいなど，あれば[気軽に連絡をください](https://www.wantedly.com/companies/datumix/projects)！



## 参考文献
1. [RecoGym Repository](https://github.com/criteo-research/reco-gym)
2. [RecoGym Paper](https://arxiv.org/pdf/1808.00720.pdf)
勉強用に書籍を購入

# 結局本にした
- まず言い訳から。考え方に共感している[アクシア社の米村社長](https://twitter.com/yonemura2006)がブログに書いていた[プログラマーになりたいと思った人がやるべき７つのこと](https://axia.co.jp/2018-03-16)に書いていた「毎日やろう」（昔書いてあった覚えがあるけど、今見たらそんな事書いてない。違う人かな？）を昨日は実行出来なかった。疲れて寝てしまったので...
- なので今日は書きます
- 時は２１世紀。勉強するツールは沢山あるが、この業界に入った時にはエンジニアの勉強ツールは本が絶対だった。なのでその昔の記憶のせいかやはり本に原点回帰してしまう様子
- Goに関して色々な本が出版されている。そんな中で色々調べた結果、「[スターティングGo言語](https://www.amazon.co.jp/dp/4798142417/ref=cm_sw_em_r_mt_dp_U_77U0CbNSE5P2J)」が判断
- 本日９日までKindle版だと40%オフなのもあり購入
- 技術書をKindleで購入する事には抵抗はあったが、費用は大切なのでという言い訳です
- 今日は遅いので明日の通勤時から読み始めよう。内容のフィードバックはまた明日から。おやすみなさい（月
仕事で使うロリポップマネージドクラウドの勘所

私家版の備忘録。

β版の頃から使っていたロリポップマネージドクラウドを利用する機会が増えたので久々に仕様を再確認し、WordPressサイト構築など軽めのアプリにロリポップマネージドクラウド PHP コンテナを使う時の良さと注意について思ったことを書き出してみた。

### Pros
- 一瞬で起動
- フルマネージド
- 安い
- オートスケール対応
- PHP バージョン選択
- キャッシュアドオンあり
- SSH, SFTPのみ
- ログインにパスワードが使用不能で公開鍵認証のみ
- git あり
- きちんとログを吐く

### Cons
- SLA なし
- ミドルウェアはいじれない
- 証明書が自前で用意できない（機能として Let's Encrypt のみ）
- Zone Apexで利用できない(CNAME もしくは ALIAS として登録するため)
- 複数ユーザーアカウントをプロジェクトに紐づけられない（共有アカウント前提。公開鍵は複数登録可能）

今の時代に欲しいレンタルサーバーといった方向で便利で安くて最高。
そのシンプルさ故に万が一のサービス廃止を想定をしたとしても余りある便利さ。
ただし仕事で使おうとする場合、開発主体の規約として SLA 記載なしな点や https 用の証明書含めドメイン周りの設定が問題となる可能性はある。

SLA が保証されない場合に使えなかったり、利用する証明書に制限がある場合は諦めるしかなく、 Zone Apex で利用をしたい場合も諦めるか Cloudflare などを前段に置き www サブドメインにリダイレクトさせる等を検討する必要がある。

そういえばいつの間にか WordPress や EC-CUBE など新規アプリケーションテンプレートはなくなっていたが、難しい作業でも無いのでシンプルさを重視して良い気がする。ただし関連するドキュメントが更新されていないっぽいのは気になる。

以上。ハマる構築ではこれ以上便利な PaaS は無い。どんどん使うぞい。

#### 備考 ログ位置について
[コンテナのログファイル名を変更しました｜ロリポップ！マネージドクラウド｜note](https://note.mu/mclolipopjp/n/ne41838827266)
[Scala] Seq[Option]において、NoneFirst、NoneLastのsortの実装について考えてみる

要素がOption型のSeqについて、NoneFirst、NoneLastなソートがしたい場合があったので、いろいろ考えてみました。
([@yasube2613](https://qiita.com/yasuabe2613)さんの助言を反映しました。コメントありがとうございました。)


今回考えるケース：

```
// サンプルデータ
// Seq(Some(1)), None, Some(3))

// 得たい結果
// Some(昇順) → Noneのソート
// Seq(Some(1), Some(3), None)

// Some(降順) → Noneのソート
// Seq(Some(3), Some(1), None)

// None → Some(昇順)のソート
// Seq(None, Some(1), Some(3))

// None → Some(降順)のソート
// Seq(None, Some(3), Some(1))
```

# Orderingを定義する

再利用性が高くていい感じですね！

```
val seq = Seq(Some(1), None, Some(3))

def noneFirstAsc[T](implicit o: Ordering[T]): Ordering[Option[T]] = Ordering.Option
def noneFirstDesc[T](implicit o: Ordering[T]): Ordering[Option[T]] = noneFirstAsc(o.reverse)
def noneLastDesc[T](implicit o: Ordering[T]): Ordering[Option[T]] = noneFirstAsc.reverse
def noneLastAsc[T](implicit o: Ordering[T]): Ordering[Option[T]] = noneLastDesc(o.reverse)

seq.sorted(noneLastAsc[Int])   == Seq(Some(1), Some(3), None)
seq.sorted(noneFirstDesc[Int]) == Seq(Some(3), Some(1), None)
seq.sorted(noneLastDesc[Int])  == Seq(None, Some(1), Some(3))
seq.sorted(noneLastAsc[Int])   == Seq(None, Some(3), Some(1))
```

# ワンライナーで書く

簡潔に書ける場合もあるので、使う場所、頻度によっては、こちらでもいいかもしれません。

```
val seq = Seq(Some(1), None, Some(3))

// NoneLastでSomeは昇順
seq.partition(_.nonEmpty) match { case (someSeq, noneSeq) =>
  someSeq.sorted ++ noneSeq
} == Seq(Some(1), Some(3), None)

// NoneLastでSomeは降順
seq.sorted.reverse == Seq(Some(3), Some(1), None)
// or
seq.partition(_.nonEmpty) match { case (someSeq, noneSeq) =>
  someSeq.sorted.reverse ++ noneSeq
} == Seq(Some(3), Some(1), None)

// NoneFirstでSomeは昇順
seq.sorted == Seq(None, Some(1), Some(3))
// or
seq.partition(_.isEmpty) match { case (noneSeq, someSeq) =>
  noneSeq ++ someSeq.sorted
} == Seq(None, Some(1), Some(3))

// NoneFirstでSomeは降順
seq.partition(_.isEmpty) match { case (noneSeq, someSeq) =>
  noneSeq ++ someSeq.sorted.reverse
} == Seq(None, Some(3), Some(1))

```

他にいい方法があればコメントください！
Node.jsのWebSocketでユーザー識別をする方法

## Node.jsのWebSocketでユーザー識別をする方法
以下のようなコードによって、ws変数にuidプロパティを設定して、ユーザーをuidで識別します。

```javascript
wss.on('connection', (ws, req) => {
  const {query: {uid}} = url.parse(req.url, true);
ws.uid = uid;
}
```
送信側は`ws://localhost:3000?uid=12345`に向けて接続します。

参考: https://github.com/websockets/ws/issues/859
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Swiftでセルを扱うときの注意点

セルをタップして次の画面に遷移することはよくあると思います。
そこでの注意点が1つあります(小ネタです!)

最初、セルをタップするから下記のようにすれば、遷移すると思ってました。

<img width="447" alt="スクリーンショット 2019-05-06 17.02.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239560/0667cb5d-e423-c685-2a01-eb9148d67a5e.png">

すると遷移しません

下記のようにすれば、上手く遷移します。

<img width="431" alt="スクリーンショット 2019-05-06 17.01.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239560/dd6a7474-8abf-6dac-0f61-cfc51a9b61bc.png">

セルと次の画面を紐付けるのではなく、Controllerと次の画面を紐付けます。

そして、遷移元の`func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)`でセルをタップしたときの処理を書きます。
(segueについてなど)

Stroryboard上だと視覚的になるので、細かいミスが発生するかもしれません
Leetcode #47: Permutation II

```swift
func permuteUnique(_ nums: [Int]) -> [[Int]] {
    var answer = [[Int]]()
    helper(nums.sorted(), [], &answer)
    return answer
}

private func helper(_ nums: [Int], _ ar: [Int], _ answer: inout [[Int]]) {
    if nums.isEmpty {
        answer.append(ar)
    }
    for (index, num) in nums.enumerated() {
        if index >= 1 && nums[index] == nums[index-1] {
            continue
        }
        var tmp = nums
        tmp.remove(at: index)
        helper(tmp, ar+[num], &answer)
    }
}
```
VLC media playerを使ったストリーミング配信と受信、ffmpegによる動画保存

# はじめに

- ここでは、以下の３点についてまとめています。

    - VLC media playerを使った動画のRTSP形式でのストリーミング配信
    - VLC media playerを使ったストリーミング配信の受信
    - ffmpegによる動画の保存方法

# VLC media player にてRTSP形式のストリーミング配信＋受信

## ストリーミング配信

### １．「メディア」→「ストリーム」をクリック
![881163e2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/a46df011-bb6e-a3d3-76ee-9a53965a9d7b.png)

### ２．再生したい動画ファイルを追加し、「ストリーム再生」をクリック
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/47eb337f-6bd9-ae44-2b8a-ed8578d940d5.png)


### ３．「次へ」をクリック
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/97c5e524-e8fb-666a-30f1-02f113fc7c5a.png)

### ４．新しい出力先から「ＲＴＳＰ」を選択し、「追加」をクリック
![6c6dfe4d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/db1d1c9c-003b-742b-c50f-3c413a5f8ccf.png)

### ５．特に指定のない場合は「次へ」をクリック
![05608a80.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/6522277a-88c5-a4b3-a13b-9f72e3f63217.png)

### ６．「次へ」をクリック
**※「トランスコーディングを有効にする」のチェックはどちらでも可）**


### ７．「ストリーム」をクリックするとストリーミング配信される
![066b58bc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/831ed343-b9b2-af6d-341d-dc7a62041026.png)

## ストリーミング受信

### １．「メディア」→「ネットワークストリームを開く」をクリック
![fae697b1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/21ac7e38-2511-2ca9-7fc1-4b1b46944d37.png)

### ２．ネットワークＵＲＬを入力し、「再生」をクリック
- 今回はRTSPでのストリーミング配信のため、「rtsp://～」とする。
- ローカルでの配信のため、IPアドレスは「127.0.0.1」もしくは「localhost」とする。
- ポート番号は、配信時に設定したものとする。
![2d2b4c4a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/ac9c8252-81de-7ab9-0792-059e14cbc700.png)

### ３．ストリーミング配信を受信
![675c7322.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/113ae2ce-6674-9812-07a0-b81bf308f518.png)

# ffmpegを実行してストリーミング配信を保存

例として以下のコマンドを実行すると、対象フォルダに60秒刻みでmp4ファイルが保存される。

```
ffmpeg -i "rtsp://127.0.0.1:8554/" -f segment -segment_time "60" -segment_format_options movflags=+faststart -reset_timestamps "1" -strftime "1" d:\temp\sample_%Y-%m-%d_%H-%M-%S.mp4
```
※コマンド解説  

- -i  "rtsp://127.0.0.1:8554/" ：入力ファイル(URLも可)
- -f segment：出力フォーマットをsegment
- -segment_time "60" ：セグメントを60秒
- -segment_format_options movflags=+faststart ：読み込みから再生開始を早める
- -reset_timestamps "1"：タイムスタンプを初期化 
- -strftime "1" ：各セグメント名にstrftime の書式(%Y%m%d%H%M%S)を用いる
- d:\temp\sample_%Y-%m-%d_%H-%M-%S.mp4：ファイルの保存先
Windows のイベント ログに特定のイベントが記録されたら LINE WORKS の Bot で通知

Windows のイベント ログに特定のエラー イベントが記録された時に、LINE WORKS の Bot API で通知します。

# PowerShell スクリプト

以下の記事に記載した PowerShell のスクリプトを基に、Get-EventLog コマンドレットでイベントの内容を取得し、トークに含めるような変更を行いました。

TITLE: PowerShell から トーク Bot API で LINE WORKS にメッセージ送信
URL: https://qiita.com/iwaohig/items/92a3b5b4af288c22a96a

Windows のタスク スケジューラにイベントをトリガーに、スクリプト ファイルを実行するようタスクを作成します。

スクリプト例は以下のとおりです。

```
$header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$header.Add("Content-Type","application/json; charset=UTF-8")
$header.Add("consumerKey","<Server API Consumer Key>")
$header.Add("Authorization","Bearer <Server Token>")
$header.Add("Cache-Control","no-cache")

$botno = "<Bot No.>"
$accountId = "<user id>"

$GetEventLog = Get-EventLog -LogName System  -Newest 1 -EntryType Error
$EventLog = "エラーを検知しました \r\n\r\n[日時] \r\n" + [string]$GetEventLog.TimeGenerated + "\r\n\r\n[ソース] \r\n" + [string]$GetEventLog.Source + "\r\n\r\n[メッセージ] \r\n" + [string]$GetEventLog.Message


$request = @"
{
    "botNo": $botno,
    "accountId": "$($accountId)",
    "content": {
        "type": "text",
        "text": "$($EventLog)"
    }
}
"@


$Body = [System.Text.Encoding]::UTF8.GetBytes($request)

$Uri = "https://apis.worksmobile.com/<API ID>/message/sendMessage/v2"
Invoke-RestMethod -Uri $Uri -ContentType 'application/json' -Method Post -Header $header -Body $Body
```
単純にトークで通知を送るだけでなく、トリガーとなったイベントの概要を含めたメッセージを生成するために Get-EventLog コマンドレットを用います。

Get-EventLog の詳細はこちらの Microsoft のドキュメントを参照してください。

TITLE: Get-EventLog
URL: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-eventlog?view=powershell-5.1

上記のスクリプト例では、以下のようにシステムのイベント ログを取得しています。
適宜、取得対象のイベントに合わせて書き換えてください。
```
Get-EventLog -LogName System  -Newest 1 -EntryType Error
```
さらにスクリプト例では、取得したイベントの詳細から生成日時、ソース、内容の項目をトーク メッセージに含める処理を行っています。こちらも、トーク メッセージに含めたい項目に合わせて書き換えてください。

# タスクスケジューラ

Windows のタスクスケジューラを起動し、イベント ログの記録をトリガーに PowerShell スクリプトを実行するタスクを作成します。

カスタム イベント フィルターで任意のイベント記録をトリガーとするよう設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/7dd4a959-98f9-4d39-5ad1-a92cbc838658.png)

作成した PowerShell スクリプト ファイルが実行されるよう設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/460260e5-c88f-1fc1-8029-7ed64e1b1241.png)


# 動作確認

トリガーに指定したイベントの記録時に Bot から当該イベントの概要を含む通知メッセージが届きます。
かけだし大学生プログラマーのふりかえり〜ひと月め〜

#自己紹介
はじめまして
かけだし大学生プログラマーのさかがみです。
4月の２週目からKotlinのエンジニアとして、
関西地方のWebシステム会社でアルバイトをはじめました。
いつか誰かの役にたつ為に
今回から、ある程度仕事が軌道に乗ってくるまで、
月刊で近況報告していきたいと思います。
~~もしかしたらこれが最終回かもしれませんが、~~

#スタート時点の自分のスキル
- PHP + LaravelでCRUD + ちょっと足したやつ程度のアプリケーションを作った
- Javaは基本的な文法は理解しているがオブジェクト指向でコードはかけない
- Reactはボタン押したら数字が増える程度の制作物は作ったことがある
- LinuxコマンドはLPICで勉強していて"あんまり"抵抗はない
- WEB制作会社で３ヶ月程度のアルバイト経験はあるが雑務が主だった

#4月に仕事でやっていたこと
自分のスキルセット的に、こんなレベルじゃとても、
要件見て設計から実装までを担当する仕事なんて出来ないので、
4月はずっとペアプロという形で社員さんと一緒に作業を進め、
仕事の流れや、実装の手順、周辺ツールの使い方を見せてもらいつつ、
簡単なコードの一部分や単体テストの部分だけ書かせてもらうという形でがんばってました。

#4月働いて感じたこと
実際、エンジニア向けの情報サイトで、
基本的な機能を実装した制作物があれば会社には入れてもらえるという情報を多く目にしていて、
それをやった結果会社には入れてもらえたわけですが、
その一方で、「こんなんで仕事になるんかいな？」的な不安があったのですが、
案の定、全く仕事になりませんでした。
それでも会社に入れてもらえたのは、成長してくれるはずという期待あってのものだと思うし、
実際非常にたくさんの時間をアルバイトである自分のペアプロに割いていただいてて、
「はやく成長して戦力になりたいな〜」
と思わされるばかりです。

#5月にやろうと思ってること
社員さんがオブジェクト指向の考え方を使って、
複雑そうな機能をうまいことモデリングして、実装してしまったのを見て、
このレベルにコーディングできるようになれば仕事として出来ることグッと増えそうやなと思ったし、
実際ババ抜きの実装を自分でやってみてかなり成長出来そうな手応えを掴んだので、
モデリングからコーディングまでをやりきる練習を5月中にいくつかしたいと思ってます。

また、仕事で使うツール（Docker,JOOQなど）の使いかたを基礎的な部分でいいので押さえると、ブラックボックスな部分が減って、
仕事に対してどっしり構えられそうな感じがするので、
それも時間を作りつつやってみたいなと思います。

#これからの目標
当面は「仕様見て、設計して、コーディング」という仕事の流れをこなせるようになることが目標です。
6月時点のどこかでそうなれてたら体感いいペースだなと感じるので、
はやくそうなれるようにがんばります。

#あとがき
しょうみ、反応ないと寂しくてやめちゃう気がしてるので、
コメントめちゃくちゃウェルカムです、
新人エンジニアのかた、
情報共有しましょう。~~馴れ合いましょう~~
Macでlsを叩いた時のエラー対処法

macOS Mojave[^1]で`ls`を叩いたら次のようなエラーがでた。

```
ls: illegal option -- - usage
```

原因は`~/.zshrc`で`alias ls="ls --color"`と色付けで出力してくれるオプションをつけたものにエイリアスを張っていたから。`ls --color`はUbuntu (おそらくLinux全般的に)で動いていたが、Macではだめらしい。解決方法は以下の二つ。

## その1: linux環境のlsを使うようにする

```
brew install coreutils
```
そして、以下を`~/.bashrc` (bashの場合)または `~/.zshrc` (zshの場合)に追加し、パスを通してあげる。

```
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
```

## その2: Mac標準のlsで頑張る

以下のエイリアスを張る。

```
alias ls="ls -G"
```
ただ、Linuxのlsよりも全体的に暗めの色が使われるようで背景が真っ黒だとかなり見辛い。
ただ、これはターミナルの色設定を変えればなんとなる気がする。

ちなみに、linuxとMacで-Gのオプションの意味が異なる。

* Linux: `-l`で詳細出力した場合にグループ名を省略する
* Mac: 色付けして出力

# 参考資料

- [linux - How do I get ls --color=auto to work on Mac OS X? - Super User](https://superuser.com/questions/183876/how-do-i-get-ls-color-auto-to-work-on-mac-os-x)

[^1]: 正確には10.14.4
Script-Fuを書く

# スクリプトのサンプルを参照する。
場所：GIMP 2\share\gimp\2.0\scripts

## 用語
car … 配列の要素を先頭から取り出す
cdr … 配列の要素を尾から取り出す
let* … ローカル変数

## 関数のフォーマット

(define (square x) (* x x))

以下のC言語と同義
void square(x) { return x*x; }

## GIMPで使用するスクリプトの構成

①スクリプトの中身
   関数
②ダイアログ
   GIMPからスクリプトを起動したときに表示されるダイアログ
③GIMPのGUIからのリック
   GIMPのコンソールからのリンク
    → 下記例ではFile->Create->MyScripts->Square


```Script-Fu:sqwuare.scm
(define (square x) (* x x))   → スクリプトの中身
(script-fu-register "square"  → ダイアログ
  _"Title"
  _"Description"
  "Vince Heart"
   "Vince Heart"
  "May 2019"
  "*"
)
(script-fu-menu-register "square"   → GIMPのGUIからのリンク
                         "<Image>/File/Create/MyScripts")
```

## 参考リンク
[リンク](https://www.gimp.org/tutorials/Basic_Scheme/)

## サンプル
画像を任意のサイズにcropするサンプルスクリプト

``` script-fu:shougi-next-move.scm
;  SHOUGI-NEXT-MOVE
;   Change the width and height of the picture of the shougi.
(define (script-fu-shougi-next-move image)
    (gimp-image-crop image 594 569 663 159)
    (gimp-selection-all image)
)

(script-fu-register "script-fu-shougi-next-move"
  _"_shougi next move..."
  _"Change the width and height of the picture of the shougi."
  "Vince Heart"
  "Vince Heart"
  "2019"
  "*"
  SF-IMAGE    "Image"        0
)

(script-fu-menu-register "script-fu-shougi-next-move"
                         "<Image>/File/Create/Logos")
```
GLFWでOpenGLを始めるには in 2019 on Windows

OpenGLを進めるにあたってデファクトなのでは、と思えるGLFWですが、新たに環境を作ろうとした際に（個人的に）躓くところが幾つもありましたので、記録として残しておこうと思います。
Windows限定です。

# 範囲
GLFWをダウンロードして Example Code ( https://www.glfw.org/documentation.html ) が実行できるようになるまで。

# 環境（すべて64bit）
- Windows 10 Pro（Homeでも変わらないと思います）
- Visual Studio Community 2019 （インストールの説明はしません）
- GLFW 3.3 64-bit Windows binaries

# GLFW Pre-Compiledのダウンロード
GLFWのトップページ（https://www.glfw.org/index.html）にも "Download GLFW 3.X"といったリンクがありますが、これはGLFWのソースコードなので今回はダウンロードページ（ https://www.glfw.org/download.html ）にある64-bit Windows binariesを使用します。
ダウンロード、解凍し、後程includeフォルダとlib-vc2019フォルダをVisual Studioソリューション内にコピーして使用します。
![フォルダ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/c6af646b-701e-e211-8a5f-f79b2163c3df.png)

# Visual Studioでプロジェクトの作成
空のプロジェクトで新規プロジェクトを作成し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/53255173-1801-124a-9b20-aee80f21f1c8.png)

ソリューションエクスプローラーのソースファイルにC++ファイルを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/ef2e2a4e-e668-3f5f-ad60-88cf3d824786.png)

Example Codeの内容を上で追加したc++ファイルにコピーします。（真っ赤っか）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/0d4eb25f-a1a3-ecd7-1375-0c88547a2506.png)

# GLFWファイルの設置
（きちんとパスが追えれば、多分どこでもいいのでしょうが）ダウンロードしたGLFWの２つのフォルダをソリューションフォルダ内にコピーします。(libにリネーム済み）
![ソリューションafter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/b750ee1f-d35b-35dd-4a95-7bb244b57b27.png)

# VS側設定について
プロジェクトのプロパティにインクルードパスとライブラリのパス／ファイル名の指定を入れます。
GLFWは64bitのものを使用しているので、プラットフォームを64bitにすることを忘れないこと。

インクルードディレクトリの欄に、ソリューションフォルダにコピーしたincludeフォルダまでのパスを追加する。
![インクルード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/9de50f96-40fc-f636-e53c-a4b92dd60942.png)

ライブラリをリンクするため「追加のライブラリディレクトリ」に、ソリューションフォルダにコピーしたlibフォルダまでのパスを追加します。
![リンカー１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/4abaede1-1ab8-87d4-fa0e-e3023db38611.png)

さらにリンクするライブラリ(glfw3.libとopengl32.lib)を「追加の依存ファイル」欄に追加します。
（私はopengl32.libの追加に気が付かず１時間ほど格闘しました。）
![リンカー２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/590de77c-d72c-faee-dee2-9b3454ce038c.png)

# ビルド＆ラン
プロジェクトの設定が終わったので、ビルド・実行するとGLFWのウィンドウが表示されます。以上。
（再三ですが、ターゲットを64bit(x64)にするのを忘れないように）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/e87e0ace-6c0f-63e3-86f2-850ec7a58c7c.png)

今回は静的リンクで。DLLを使うのは別の機会に。
Flutter関連備忘録

# 概要
Flutterに関する忘れがちなことをメモっておく

# アプリ名変更

## Android

```xml:android/app/src/main/AndroidManifest.xml
<application
        android:name="io.flutter.app.FlutterApplication"
        android:label="【アプリ名】"
        android:icon="@mipmap/launcher_icon">
```

## iOS

```xml:ios/Runner/Info.plist
	<key>CFBundleDisplayName</key>
	<string>【アプリ名】</string>
```

# リリース手順

## Android

https://flutter.dev/docs/deployment/android

## iOS

https://flutter.dev/docs/deployment/ios
MongoDB便利コマンドメモ

# 概要
よく使うけれど忘れてしまう便利なコマンドのメモ。随時更新中。

# ドキュメントの更新
・nameがaのドキュメントのageを20に更新

```
$ db.collection.update({name:"a"}, {$set: {age:20}})
```
・nameがaのドキュメントのageを20、genderをXに更新

```
$ db.collection.update({name:"a"}, {$set: {age:20, gender:'X'}})
```
# コレクション名変更
コレクション「oldname」を「newname」に変更

```
$ db.oldname.renameCollection("newname");
```

# フィールド名変更
コレクション「collection」のフィールド「oldname」を「newname」に変更

```
$ db.collection.update({}, {$rename:{oldname : 'newname'}}, {multi:true});
```
# 新しいデータ10件を検索

```
$ db.collection.find().sort({ $natural: -1 }).limit(10)
```

#部分一致・先頭一致・後方一致
```
$ db.collection.find(name: /a/);
$ db.collection.find(name: /^a/);
$ db.collection.find(name: /a$/);
```
 
# バックアップ・リストア
・コレクション単位でバックアップ

```
$ mongodump -d database -c collection -o dump
```
[mongodump — MongoDB Manual](https://docs.mongodb.com/manual/reference/program/mongodump/)

・コレクション単位でリストア

```
$ mongorestore --drop -d database -c collection collection.bson
```
`--drop` をつけると移行対象になっているコレクションを削除してからリストアしてくれる。
[mongorestore — MongoDB Manual](https://docs.mongodb.com/manual/reference/program/mongorestore/)

# 各コレクションについて一括で調べる
一括操作したいときに便利
[db.getCollectionNames() — MongoDB Manual](https://docs.mongodb.com/manual/reference/method/db.getCollectionNames/)

・サイズを一括で調べる

```
$ db.getCollectionNames().forEach(function(n){print(n + "," + db[n].stats().storageSize/1024/1024/1024 + "GB")})
```
・ドキュメント数を一括で調べる

```
$ db.getCollectionNames().forEach(function(n){print(n + "," + db[n].count())})
```
・インデックスを一括で調べる

```
$ db.getCollectionNames().forEach(function(n){print(n); printjson(db[n].getIndexes())})
```
jenkinsくんでAndroidBuildしようとしたらNDK読み込んでくれないんですが案件

jenkinsくんどうしてなの

##まず結論
Jenkins君に通すためのパスって、Unity上であっても\じゃなくて/にしなきゃ反応してくれないんですね
（開発環境はWindowsです）

NDKのパスをそのままコピーして貼り付けてたのが原因みたいです
勉強になるね

#備忘録
ここで引っかかって1週間以上無駄にしたって本当ですか？

JenkinsでAndroidバイナリを作ろうね！
さーて！Jenkinsから勉強だぞー！

(途中でUnity3Dプラグイン使うこともあきらめたけど、やっぱり上記が原因じゃねーの)

どうにかGitHubとつなげて最新バージョンを持ってくるようになったよ！
(SSHキーなんて知らないよ……勉強しようね？)
シェルを書いて実行だー！

` Invalid NDK versionUnable to detect NDK version, please pick a different folder. `

……？使用バージョンは合ってるぞ？
色々知らべて試した結果、すべて惨敗
そしてとあるサイトを見つける

[Unity on WIndowsで/を使ってるのに\パスが紛れ込む原因がわかった話](http://sassembla.github.io/Public/2015:10:01%2012-13-37/2015:10:01%2012-13-37.html)

`設定ファイルとかに\を使うと、おめでとう、Jenkinsやらなにやらで一切動かないものが出来上がる。`

人類として生きていくためのまともな知識を持ち合わせていないのでここでやっと可能性に気が付く

Unity上で\指定しているから認識してくれていないのでは…？

######まぁそうですよね
今までWindowsでしか開発したことがなかったからそんな違いがあることすら実はよく知らなかったりする
他にもJenkins君とは二度と分かり合えないと思うくらい引っかかった部分もあるのですが
とりあえずこれだけは忘れないでほしい。未来の自分。
いっそパス指定は全部/でいいのでは説あるんですがその辺どうなんですかね。
Day006 webエンジニアへの道 - rails tutorial 第1章を完了 -

こんにちは。
webエンジニアを目指す[tomo](https://twitter.com/tomo_tech_)です。

エンジニアの勉強をしている日々の学びを記録しています。

私自身の頭の整理と今後迷った時のリファレンスも兼ねて書き連ねていきますが、同じようにエンジニア転職を考えている方の参考にもなればと考えています。
また、「ここ間違ってる！こっちが正しい！」といったご指摘もあれば頂けると嬉しいです🙏

#Day006のまとめ

**今日の気づき & 今後調べることなど**
- Qiitaやエンジニアの方のブログは日本語かつ説明が分かりやすいが、内容が部分的だったり少し古い場合が多いので、網羅的に知りたい場合は公式ドキュメントを見るなど使い分けするべき。

- コマンドラインで連番フォルダを作る方法は以下の通り。

```:commandline
# 連番にしたい数字を{◯..◯}で表すと no1_directory ~ no10_directory が作成される
# 連番はアルファベットでもOK
$ mkdir no{1..10}_directory
```

- catコマンドはconcatnate(連結する）の略。

- エラーが発生した際に慌ててごちゃごちゃ作業すると何が原因か混乱するので、対応前にエラーメッセージを読み解きちゃんと原因を探る。いつでもエラー前に立ちもどれるよう、こまめにgitに挙げることがマジで大切。

- 前回、railsチュートリアルの各章にサッと目を通したおかげでゴールのイメージが掴めたので学習を進める上で気が楽になった。今後、発展した内容や他言語を学習する際にも、まずは全体に目を通した方が良い。

- **railsチュートリアルの第1章完了！**

#特に学んだこと

###git addにおけるオプションについて

git add [ファイル名、ディレクトリ名]　→　指定したファイル・ディレクトリをコミット対象にする
git add *.[拡張子] →　カレントディレクトリ内の[拡張子]に一致するファイルをaddする

git add -A (--all) →　変更のあった全てのファイルをaddする
git add . →　カレントディレクトリ内の変更のあった全てのファイルをaddする
git add --ignore-removal . →　追加・変更された全てのファイルをaddする（削除されたファイルはadd対象外）
git add -u (--update) →　変更・削除されたファイルをaddする（新規に追加されたファイルはadd対象外）

よく使用しそうなオプションは`git add -A`。
上述の他にもオプションがあるので、詳しくは以下の`git documentation`を参照。

[参考]
[git documentation](https://git-scm.com/docs/git-add)
[Gitコマンドについて調べる【git add】](https://kimromi.hatenablog.jp/entry/2015/08/04/082357)

###公開鍵の作成方法

[参考]
[Git サーバー - SSH 公開鍵の作成](https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-SSH-%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E4%BD%9C%E6%88%90)

公開鍵は通常`~/.ssh`ディレクトリ内に`id_dsa.pub`または`id_rsa.pub`というファイル名で作成される。

###pg Gemのインストールにおけるエラーの解消

チュートリアル通りに`pg Gem`のインストールを試みるも、下記のエラーメッセージが発生。

```:commandline
An error occurred while installing pg (0.20.0), and Bundler cannot
continue.
Make sure that `gem install pg -v '0.20.0' --source 'https://rubygems.org/'`
succeeds before bundling.
```

原因を調べたところGemfile上でスペルミスを発見...

スペルミスのコマンドを実行する直前に`git push`していたので`git checkout -f`でインストール実行前に戻り、正しいスペルでやり直ししたところ問題なくインストール完了。

###git pushまでのイメージ

**初回**
1. `git init`
2. `git add -A`
3. `git add -m "[comment]"`
4. `変更`<br>　　→ コミット前に戻る場合は`git checkout -f`
5. `git remote add origin [gitのpush先]`
6. `git push -u origin --all`

**branchで編集**
7. `git checkout -b [branch名]`
8. `変更`
9. `git commit -a -m "[comment]"`
10. `git checkout master`
11. `git merge [branch名]`<br>　　→ branchを削除する場合は`git branch -d [branch名]`
12. `git push`<br>　　→ herokuにアップする場合は`git push heroku (master)`

##今日のひとこと

今まで手探りで勉強してきたけれど、railsチュートリアルのおかげで体系的に理解が進んでる気がします。
少しずつですが成長を感じられるので、学習するのがかなり楽しくなってきました。

---

twitterもやっているので、宜しければフォローお願いします！
[@tomo_tech_](https://twitter.com/tomo_tech_)
Leetcode #46: Permutations

```swift
func permute(_ nums: [Int]) -> [[Int]] {
    var answer = [[Int]]()
    helper(nums, [], &answer)
    return answer
}

private func helper(_ nums: [Int], _ ar: [Int], _ answer: inout [[Int]]) {
    if nums.isEmpty {
        answer.append(ar)
    }
    for index in 0..<nums.count {
        var tmp = nums
        let num = tmp.remove(at: index)
        helper(tmp, ar+[num], &answer)
    }
}
```