OmniAICreator/Qiita-1.07M huggingface dataset:
ラズベリーパイzeroWにDocokerをインストールしてみた

#Dockerのインストール方法
コマンド一行でOKです。
*ただメモリ領域の関係かうまくいかないときがありました。

```
curl https://get.docker.com | sh
```


##SSHからの接続設定の場合（screen）
sshで作業をするとセッションが切れる場合があるので
screenを利用したほうがいいですよ。




#Dockerのインストールが完了
```
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:36:04 2019
 OS/Arch:           linux/arm
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea
  Built:            Wed Nov 13 07:30:06 2019
  OS/Arch:          linux/arm
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker your-user

Remember that you will have to log out and back in for this to take effect!

WARNING: Adding a user to the "docker" group will grant the ability to run
         containers which can be used to obtain root privileges on the
         docker host.
         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
         for more information.
```

最下部に記載されていますが、userが利用できるようにするには、

```
  sudo usermod -aG docker your-user

```

簡単にdockerのインストールが完了
サーバサイドとフロントサイドの概略図

# サーバサイドの概要

![Web Application with HTML and Steps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282788/9a3ece70-1f04-291f-24cc-c179dc6efe70.png)

リンク元はこちらです
https://developer.mozilla.org/ja/docs/Learn/Server-side/First_steps/Introduction

#落書き
![IMG_20191226_195357.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282788/a8ad4414-fde5-bfcd-c70b-dbfc93ba88b8.jpeg)
【webpack】npm run dev でbuild.jsが読み込めない

#症状
Javascript + Vue.js + Webpack で開発しているプログラムで、`npm run dev`が急に動かなくなった！！大変だー！！

「急に」という場合は大体急ではなく原因があるのですが、今回はいまだに原因が見つかっていません。

以下詳しい症状です。
1. 昨日までは動いていた
2. `npm run dev` 自体にエラーは出ない
3. `npm run build` は成功する
4. `npm run dev` を　`Ctrl + C` でkillしてもポートが解放されない（killできていない）
5. localhost:8080などに置いてあるビルド後のファイル（build.jsなど）が読み込めない
6. Activity monitorでnodeのCPU占領率がすごいことになる。

と以上のような症状が出た人向けの記事です。

#環境
- OS: Mac OS Mojave
- webpack: 4
- node: v13.5.0
- vue-cli: 2

お分かりの方もいると思いますが、vue-cliが2系だった頃のプロジェクトで、webpackやnodeを必要に駆られてアップグレードしています。
ここが問題で、@vue/cli(3系)で作ったプロジェクトではこうしたエラーは確認していません。

#やったこと

####パッケージのバージョン統一
[こちら](https://qiita.com/Shoryu_N/items/9ae2417489c9faaa271c)を参考にwebpack, webpack-cli, webpack-dev-serverのバージョンの組み合わせを適切なものにしましたが、**失敗**。

####以前のgitのバージョンをrevert
最悪これでいけるだろうという手段。
**失敗**。
nodeのバージョンも変えていないのになぜ。。？

#解決策
新たにgithubからcloneしてきて`npm run dev`したらいけました。
違いはなんでしょうか。。

webpackやnodeのバージョンも同じなので、キャッシュがいたずらしている？
→ 削除しましたがダメなようです。

何かご存知の方いましたらコメントお願いします。
まつもとゆきひろさんの講演【若手エンジニアが市場価値を上げるために必要なこと】まとめ

こんにちは。[KEN](https://twitter.com/ken_0205_jp)と申します。

タイトルの通り、[まつもとゆきひろさん](https://twitter.com/yukihiro_matz)さん(本文中ではMatzさんと呼ばせていただいています)の講演会にオンラインで参加してきましたので、そこで仰っていたことを忘れないようにまとめようと思います！

## この講演の目的
1. 参加者にエンジニアとして今後を考えてもらう。
2. 参加者に何かを始めるきっかけを与える。

## そもそもなぜ市場価値を高めた方が良いのか？
市場価値が高いと得をする。
主に下の2点で得をする。

* 給料を上げられる。(正しい判断をしてくれる会社であれば)
* ストレスを減らせる。イライラすることを減らせる。

### なぜストレスが減る？
本当にやめるかどうかは別としていつでも今の会社を辞められる状態になれるから。
→我慢しなくても良くなる。つまり心理的安全を確保できる。
→笑顔で働くことができる。

### Matzさんオススメのストレスを減らす技
There must be a reasonを3回唱えること！
例えば運転中後ろの車にすごく煽られて、しまいには猛スピードで抜かれた時。イライラしますよね。
そういうときに、「あーあの人はたぶん、今会社に遅刻しそうで、遅れたらこっぴどく𠮟られるから急いでいるのかな？」など理由を考えてみる。
こうすることでイライラする自分に言い聞かせることができる。

## では市場価値とは何か
自分の価値？スキル？知識？

市場価値とはつまり他人からの評価です。
**市場価値 = 他人からの評価**

つまり自分で市場価値をコントロールするのは不可能に近い。
相手目線の判断だから。
自分の視点と他人の評価にはギャップがある。
だからスキルさえ上がれば市場価値が上がるというのは幻想にすぎない。


Rubyも同じ。
MatzさんがRubyのヒットをコントロールすることはできなかった。

**コントロールはできないけど、市場価値を高める努力はできる**
MatzさんがRubyを作る際にできたのは精一杯良い言語を作ることのみ。
つまり「人事を尽くして天命を待つ」！

特に下記の要素を得る努力はとても大事。

* **インデックスを作る**(誰に聞けば、どう調べればその情報を得られるのかを知っていること)
* **経験**
* **キャリア** (掛け合わせは強い エンジニアの後エンジニア採用人事とか)
* **コネクション** (例えばgoogleの採用。普通のルートだとコンピューターサイエンスのmaster持っていないと面接してもらえないが、リファラルだと持っていなくても面接してくれることもあったり。)

でもこれらは全部自分の視点になりがち。

## 市場価値を高める方法

* インベントリ
* コネクティング・ドッツ
* 情報発信(Twitter, Qiita, GitHub, Quora, OSS Github)

### ①インベントリ
自分のことについての棚卸し。まとめをする。
つまりちゃんと自分興味、関心、自分と他人の違う点を知ろう。

#### 他人との違いは大切
日本では同調圧力とかもあるが、同調圧力への鈍感さも大事。　
違うからこそ価値が生まれる！
もちろん労働の管理者側からすると、同じような人材である方が管理しやすいし、交換しやすいという同質性のメリットはある。

でも同質性を重視する組織とはWin Winの関係が築けない。
Matzさん的には同調圧力への鈍感さを伸ばし、違いを認めてくれる企業とのWinWinの関係性を作ることをオススメする。

７つの習慣によると持続可能な取引は2種類のみ。Win WinかNo Deal。つまり同質性を重要視するような企業とはWin Loseになる必要はない。No Dealで良いのだ。

### ②コネクティング・ドッツ
スティーブ・ジョブズの有名な言葉。
好きなことや関心ごとを追求していった結果、それが繋がって線となり何かが新しいモノが生まれる。

つまり自分の興味、関心をインベントリで知ったら、それを全力でやろう。

Matzさんの場合
プログラミング、心理学への興味があり、英語などもたまたま使う機会に恵まれて勉強していった。そういう組み合わせがあってRubyが生まれた。まさにコネクティング・ドッツの人生。実は高校時代、理系なのにも関わらず英語、国語が得意で、数学や物理は苦手分野だった。


### ③情報発信
何か行動し始めたら、それをTwitterでも何でもいいから外に発信しよう。
他人の視点に立ち、あなたが人を採用する側だとすればどんな人が欲しいだろうか？と考え、自分を魅力的に見せることを意識しよう。

あなたが全く外に発信してもないのに、あなたの才能をたまたま見出してくれるという漫画のようなことはまず起こらない。。
だから他人があなたを見つけられるように、発見してもらえるように発信しよう。

#### ちゃんと魅せる相手を選ぶ。
ちゃんとWin Winの関係を築けるところ(会社など)にアピールしよう。

相手を侮ったり、下に見てはいけない。
全員を自分よりスゴイ所を持っていると思っておく。





## すごく大切なあと二つのこと
### ①笑顔

笑ってみよう
ゴキゲンでいよう。あなたの魅力がプラスになる。

### ②ストーリーの力
自分のエピソードを紐づけて話す人は色んな人を惹きつける力がある。
話が魅力的な人は自分が体験したストーリーをたくさん持っている。ネタ帳を持とう！

## まとめ
講演に参加する前は、市場価値なんてスキルさえ上げれば上がるんじゃないかと安直に考えていました。
しかし価値や評価というのは自分ではなく、他の人が決めるもの。
いかに自分という人間を他人に伝えるのか。この大切さを改めて認識できた良い機会でした。

では最後まで読んでくださりありがとうございました！！
リモートワークがメインのエンジニアが普段意識していること

こんにちは、[@y_temp4](https://twitter.com/y_temp4)です。

自分は現在フリーランスのフロントエンドエンジニアとして働いており、主にリモートワークで開発を行っています。

そこで今回は自分がリモートワークをする上で心がけていることを、

- 環境面（開発環境や普段の生活）
- 立ち回り面（仕事をする上での振る舞い方）

の2点から紹介させていただければなと思います。

ただし、今回触れることは割と基本的なことが多いと感じています。ですが、基礎こそ大切なことはないという捉え方もできる･･･かと思うので、あえて触れてみます。

もし「自分もリモートワークやってるけど、こんなことを意識してるよ！」といった意見がありましたら、ぜひコメントをお願いします🙇‍♂️


## 環境面

ではまず、自宅の開発環境について触れていきます。リモートワークだと開発する環境を自分の好きなようにカスタマイズしやすいので、自分も色々試してきました。

### 1. スタンディングデスク

スタンディングデスクに関しては[自分のブログ](https://blog.y-temp4.com/entry/improve-daily-productivity)にも少し解説を書いたことがあるのですが、やはり非常にオススメです。

スタンディングデスクを取り入れることによって、リモートワークでありがちな運動不足という問題が圧倒的に改善されます。

その上、集中力も座って作業しているときよりも格段に向上し、まさにいい事ずくめです。

リモートワークの運動不足に悩んでいる方や、なかなか集中できないという方はまずはじめに試してみてほしいです。

### 2. 昼寝

自分はだいたい昼休憩の時間の最後に、約10~15分くらいの昼寝をすることが多いです。

昼寝には集中力の改善やパフォーマンスの向上などの効果があり、適度な時間であれば積極的に取り入れたほうが全体での生産性は上がると感じています。

自分はあまり深い眠りに入らないように、寝る前にコーヒーを飲むことが多いです。また、寝るときはイスに座って寝ています。


### 3. ブルーベリー

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">最近冷凍ブルーベリーを購入して主に昼と夜に食べてるけど、量がめちゃくちゃ多くてかつ味もそこそこおいしいのでおすすめ。<br><br>ただ難点としては手でそのまま食べると手がブルーベリーの汁まみれになって「お前、何やったんだ･･･」みたいな感じになること😅<a href="https://t.co/44PQaJ8XKn">https://t.co/44PQaJ8XKn</a> <a href="https://t.co/hLc9XDV7yz">pic.twitter.com/hLc9XDV7yz</a></p>&mdash; てらしま＠フリーランスエンジニア (@y_temp4) <a href="https://twitter.com/y_temp4/status/1187866929861545984?ref_src=twsrc%5Etfw">October 25, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

適当に気が向いたら、お菓子の代わりにブルーベリーを食べています。

ブルーベリーは目のためというよりは脳機能の向上と、ほどよい酸っぱさによるリフレッシュのために食べています。

## 立ち回り

次に、普段のコミュニケーションなど会話面での立ち回りで意識していることについて触れていきます。

### 1. 質問するときは自分の考えも交える

完全にリモートな環境での質問だと、直接の会話に比べて意図が伝わりにくいことがあります。

また、質問をする際も、なるべくわかりやすく書かないと、質問したい内容が伝わらずに時間のロスになってしまうこともあります。

ですので、自分は質問をするときはなるべく質問に加えて

- このように操作したが動かなかった
- このようにすれば解決するのではないか

などといった追加の情報を付け加える事が多いです。

こうすると、ただ漠然と質問されるよりも答えやすくなることが多いと感じています（自分が質問されるときにもそう感じる）。

### 2. 手持ち無沙汰にならないようにする（次の作業も伝える）

リモートワークでは実際に働いている姿が見えないので、より成果が求められるようになります。ですので、何もしていない時間を作らないように心がけて仕事をすることが重要です。

自分は基本的に作業のはじめにその作業がどれくらいで終わりそうか・その作業の後に何をやるべきかをイメージして働いています。

### 3. チャットでは絵文字と感嘆符を使う

文面での会話は直接会話するよりも感情が伝わりにくく、場合によっては普通に伝えているだけなのに怒っているように捉えられてミスコミュニケーションが発生することもあります。

ということで自分は普段のチャットでは、感嘆符(!)や絵文字をよく使うようにしています。

ちなみにですが、Macを利用している方であれば`control + command + スペース`で絵文字ビューアが表示できて便利です。

![スクリーンショット 2019-12-12 13.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90682/cf08f345-ec23-8fa2-ebfe-bfce3dfbe292.png)


## さいごに

リモートワークはデメリットもあるものの、慣れてしまえば最高なので、もっと流行るといいな〜と思っています。

これは完全に余談ですが、remote-in-japanというリポジトリには日本のリモートワークできる企業がまとまっています。

[uiur/remote\-in\-japan: Tech companies in Japan that hire remote workers](https://github.com/uiur/remote-in-japan)

フリーランスに限らず、これらの企業であればリモートで仕事できるのでぜひ参考にしてみてください！

それではみなさん、よいリモートライフを👋
[日記] 今日の AtCoder 過去問 (ABC143)

今日は ABC143 の青以下の過去問を埋めました。

E まで自力で通せてよかったです（でもタイム的にはだめそう）。

# ABC143
## ABC143 A Curtain

A と B が与えられるので、 `A - B * 2` を表示する。ただしマイナスになる場合は `0` と表示する。

### 印象

やるだけ

### 解法

問題文どおり条件分岐を書けば ok

## ABC143 B TAKOYAKI FESTIVAL 2019

`N < 50` 個のたこ焼きがあって、 `i` 番目の大きさが `d[i]` で与えられる。たこ焼きを２個同時に食べると相乗効果で `d[i] * d[j]` だけ美味しい。

全通りの組み合わせについて美味しさを計算して、その合計を表示する。

### 印象

たこ焼き問題、リアルタイムだったので懐かしいw

`N` が小さいので愚直に二重ループで合計していけば間に合う

### 解法

二重ループで足していくだけ

## ABC143 C Slimes

`N <= 10^5` 文字の文字列が与えられる。それぞれの文字はスライムの色を表していて、同じ色のスライムが隣り合っているとこれらはいずれ合体する。最終的に何匹のスライムになるか。

### 印象

文字列を左から順に舐めて、文字の種類が変わったところでカウントを足せば良さそう

C にしてはやや簡単…？

### 解法

印象通り。たとえば `aaabbbccc` だったら文字の種類が `a -> b`, `b -> c` と二回変わる。これに `1` を加えて、３匹。

## ABC143 D Triangles [二分探索２回]

`N <= 2 * 10^3` 本の棒があって、それぞれの長さが `L[i]` で与えられる。ここから三本選んで三角形を作りたいとき、何種類の三角形が作れるか。

ただし３つの辺 `a, b, c` が以下の条件を満たせば三角形は作れる：

```
a < b + c
b < a + c
c < a + b
```

### 印象

三本の組み合わせについて総当たりすると `(2 * 10^3)^3 = 8 * 10^9` 通りになるので厳しそう。逆に言えば２本ならいける。

２本 (たとえば `a`, `b`) を決めると、残りの `1` 本に対する条件が

```
abs(a - b) < b かつ b < a + b
```

とはっきりするので、これを満たす `b` を `O(log N)` で数えられれば良さそう。

辺のリストをあらかじめソートしておけば、二分探索でいけそう。

### 解法

印象通り。

あらかじめ入力をソートしておいて、二重ループ回して棒二本の組み合わせ `(1, 2) <= (i, j) <= (N-1, N)` にそれぞれについて：

```
abs(L[i] - L[j]) < L[k1]
```

を満たす最小の `k1` と、

```
L[k2] < L[i] + L[j]
```

を満たす最大の `k2` をそれぞれ二分探索で探す（二分探索を２回やる）。

もし `k1 <= k2` になったら、その範囲にある棒は条件を満たす（三角形ができる）ので、個数 `k2 - k1 + 1` をカウントに加える。ただしすでに選んでいる棒 (`i`, `j`) は使えないのでその分だけ引く必要があることに注意。

二分探索がちょっと厄介で、「全ての辺が条件を満たす」パターンとか「すべての辺が条件を満たさない」パターンがありうる。「あらかじめ範囲の両端の棒について条件を満たすか調べて、二分探索するまでもない場合はやらない」とするか、「端に番兵をおいてから二分探索」するといい感じになるはず（番兵法 ... `-1` など明らかに条件を満たさない項目を勝手に追加すること。条件を満たさないので結果には影響ない）。

## ABC143 E Travel by car [ワーシャルフロイド２回]

`N <= 300` 個の街がある。 `M` 本の道 `A[i] B[i] C[i]` が与えられて、これは街 `A[i]` から街 `B[i]` までの距離が `C[i]` km あることを表している。

この道を容量 `L` l の燃料タンクを積んだ、燃費 `1` k/l の車で移動したい。それぞれの街では給油してタンクを一杯にすることができる（しなくてもよい）が、道の途中で燃料が切れた場合はおしまい。

二つの街の番号 `s`, `t` が与えられるので、その間を最小何回の給油で移動できるか求めよ。移動できない場合は `-1` と表示する。

### 印象

`街 x 残オイル容量` でダイクストラしたらいけそうかな…？

と思ったけど、燃料タンクの容量がかなりでかいので厳しいか。

一度シンプルなダイクストラをして、その結果を使ってもう一度何かする系か、二種類のダイクストラの結果を組み合わせるとなんか見えてくる系に感じる。

あ、距離でワーシャルフロイドすると、適当な経由地点を取って移動するときに、スタートから経由地点までの距離と経由地点からゴールまでの距離がそれぞれ一撃で求まるので、なんか使えそうかな。

距離でワーシャルフロイドした結果を使うと、離れた２つの街に対しても「その間を給油せずに移動できるか」ももとまるな。それを使って今度は「給油回数」についてワーシャルフロイドすればいけるのでは…？

### 解法

概ね印象通りでいけた、これは嬉しい！

とりあえず与えられた距離の情報で素朴に「ワーシャルフロイド法」をすると、任意の二つの街について、最短何キロ走ればその間を行き来できるかが求まる (ワーシャルフロイドについてはちゃんと説明できないので検索)。これが `L` 以下の街は給油一発で行き来できて、 `L` を超える街は給油一発では行き来できない。

この情報を使って、こんどは「給油一発でいける街の間にだけコスト `1` の道が生えている」ような新しいグラフを作る。このグラフでもう一度ワーシャルフロイドすれば、こんどは任意の二つの街について、最小何回給油すれば移動できるかが求まる。この情報を使って質問に答えれば ok。

(せっかく解法思いついたのにワーシャルフロイドの添字の順番ミスで WA もらってしまった…)
SSL証明書どれ選ぶ？

お客さんから「Webサイトのhttps対応が必要なのはわかるんだけど、SSL証明書はどれを選んだらいいの？」と聞かれることが多いので、証明書の選び方をまとめてみました。
※暗号化方式がどうとかの技術的な内容ありません。

# WebサイトSSL化の目的
大きく分けて２つあると思っています。
- 通信経路の暗号化
- サイト所有者の証明

# SSL証明書の種別
## DV(Domain Validation) 
・ドメイン認証
ドメイン所有者であれば誰でも申請ができて、ほぼ審査無しの全自動で即日発行される。
そのためフィッシング詐欺等に悪用されるケースがある。
つまりサイトがhttps化されているといって安全なサイトである保証は無い。
価格は最も安く、年間1000円程度で取得できる。
無料SSLのLet's Encryptもこれ。
松竹梅の梅。
## OV(Organization Validation)
・組織実在認証
申請企業・組織に対して、実際に存在する組織であるかの審査が行われる。
第三者機関のデータベースに登録されている代表電話番号に確認電話が来ることが多い。
書類審査もある。
松竹梅の竹。
## EV(Extended Validation)
OVをさらに厳格にし、登記情報の確認や第三者機関のデータベースによる審査が行われる。
最も金額が高く、手間もかかる。
金融機関のオンラインバンキング等で使用されている。
EV証明書を使用しているWebサイトにアクセスすると、ブラウザのアドレスバーに緑で企業名が表示されていたが、chrome/firefox/safariでは表示されなくなった。
https://japan.zdnet.com/article/35141280/
松竹梅の松。

# まとめ
第一の目的である通信経路の暗号化についてはどの証明書タイプでも違いは無いので、
第二の目的のサイト所有者の証明で求められる要件によって選ぶことになりますが、
結局はサイトの性格やセキュリティポリシーによって決まるものかと思います。
EV証明書のアドレスバー表示が多くのブラウザから削除されたため、対外的なアピールポイントが
弱くなりましたが、それでも金融機関など最上級の安全性が必要とされるサイトでは必須かと思います。
Raspberry Pi でOctave を使う（2020年5月）

Octaveはフリーの数値計算ソフトです。

# 2020年5月7日現在の状況

raspbian buster でGNU Octave （4.4.1）が正常に動作しない。（OpenGLの関係？）
GUIが乱れる、グラフがプロットできない。計算はできる。

raspbian buster 公開直後から不具合情報が上がってましたが、いまだに動作した報告を見つけられませんし、実際に動作しません。

# Ubuntu で正常動作した！

|OS|グラフプロット|備考|
|---|---|---|
|raspbian stretch|○|Pi4では使えない|
|raspbian buster 32bit カーネル|×||
|raspbian buster 64bit カーネル|×||
|ubuntu server 19.10.1 32bit|×|サポート期限2020年7月|　
|ubuntu server 19.10.1 64bit|○|サポート期限2020年7月|
|ubuntu server 20.04 32bit|×||　
|ubuntu server 20.04 64bit|○||
ダメなものはデスクトップ環境はもちろん ssh -X でもダメです。

# Ununtu 20.04 のインストール
公式サイト参照
https://ubuntu.com/download/raspberry-pi

Octaveのインストール

`sudo apt install octave`


Ubuntu20.04でインストールされるOctaveのバージョン
5.2.0

# 結論
2020年5月7日時点でRaspberry Pi でOctaveを動かす場合には

1. Pi0〜Pi3: バージョンが古くても良ければRaspbian Stretch を使用
1. Pi3 〜 Pi4: UbuntuServer 20.04(64bit)にデスクトップ環境を入れて使用
(ssh -X で使用するならデスクトップ環境がなくても可) 

原因や対策については全く調べられていません。
単なる動作報告です。他のディストリビューションは試してないので情報がある方はコメントください。
またRaspbianで動作した報告があれば教えてください。
JDLA ディープラーニング E資格 2020年2月 試験概要

# ディープラーニングE資格とは
　ディープラーニングの実装能力と理論理解度の認定資格です。ＪＤＬＡの主催する検定にはＧ(Generalist)検定とＥ(Engineer)資格があり、Engieerの言葉の通りエンジニアの技能が図られます。
参考：[JDLA公式ページ](https://www.jdla.org/)
# 出題範囲
参考：[JDLA公式シラバス](https://www.jdla.org/wp/wp-content/uploads/2019/09/JDLA_E%E3%82%B7%E3%83%A9%E3%83%90%E3%82%B9_2020%E7%89%88.pdf)
上記JDLAの公式ページにシラバスが明記されています。
![JDLA_Eシラバス_2020版_page-0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285788/42cd39bb-8df7-cb04-ae26-5053b182853c.jpeg)
![JDLA_Eシラバス_2020版_page-0002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285788/78fe479d-ee5c-48f7-7f82-51d24c6882bf.jpeg)
一般的な、ディープラーニングの実装のほかに、上記シラバスの内容を重点的に勉強しておく必要がありそうです。

# 出題割合
過去に受験した方々の記事を見ると、
応用数学:10%, 機械学習:15%, 深層学習:75%程度と、機械学習からの出題も意外と多いようです。機械学習の出題範囲も広いので、ヤマを張った勉強は難しそうです。


# 参考図書
[1. ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://www.amazon.co.jp/gp/product/4873117585/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117585&linkCode=as2&tag=takumiban0d-22&linkId=7ef0a04e785b975b4f98e1ef0b6b69e7)
　ディープラーニングの基本的な本です。この本を勉強しておけば間違いはないでしょう。

[2. 深層学習(通称:Goodfellow本)](https://www.amazon.co.jp/gp/product/4048930621/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4048930621&linkCode=as2&tag=takumiban0d-22&linkId=dc1de08d50021d0f879a173b985ce8c5)
　過去のとある会では、このGood Fellow本から多数出題されたようです。
文章が難しいらしいが一読の価値がありそう。
# 所感
エンジニア資格という言葉の通り、実務で機械学習やディープラーニングを触っているレベルでないと、受験のために相当の試験勉強が必要そうな印象です。

これから2020年2月受験に向けて、試験勉強をしていきます。
シラバスに記載してある内容について、一通り勉強して、素人なりに勉強した内容をQiitaに連載していきます。
NetworkXのファイル形式からC++でノード構造を格納する

グラフとは点の辺で構築される一般的なデータ構造の一つです。
身近な例では友人ネットワークやWebページなどもグラフとして表現することができます。

現在、グラフを扱う場合PythonのNetworkxが非常に便利なツールとなっています。
書きやすく簡単なとても便利なライブラリです。
グラフを扱ってみようと思ったらまず試してみると良さそうです。

- [【Python】NetworkX 2.0の基礎的な使い方まとめ](https://qiita.com/kzm4269/items/081ff2fdb8a6b0a6112f)
- [Python の NetworkX 入門](https://qiita.com/tomov3/items/64f7315474747fc01a6c)

しかし、NetworkXには大規模なグラフに対して非常に処理が重くなってしまうという問題点があります。

そこで本記事では処理が高速であるC++を用い、NetworkXでグラフを構築するときのファイル形式のままC++でのグラフ構築の情報に用いる方法を紹介します。

前提知識としてC++の一通りの書き方は知っているものとします。
なおNetworkxについての記述がありますがNetworkXについて知らなくても問題はありません。

---

## NetworkX形式のノード

NetworkXでは行ごとの各頂点のスペース区切りで頂点の出次点が書かれています。
※今回NetworkXのファイル形式にこだわりましたが、後述のsplit関数の区切り文字を変更すればcsv形式にも対応できます。
[この記事](https://qiita.com/tomov3/items/64f7315474747fc01a6c)を参考にエッジのリストは [こちら](https://snap.stanford.edu/data/egonets-Facebook.html) の Facebook のグラフを使用します。
（リンク先のページ下部にある "facebook_combined.txt.gz" が該当ファイル）

ファイルはこのような形式になっています。

```facebook_combined.txt
0 1
0 2
0 3
0 4
0 5
0 6
︙
```
(始点ノードid) (終点ノードid) という形式です。


このようなノード情報に対してNetworkXでは一瞬でできますがC++ではひと手間必要です。
実際の手順として
1. ファイルの読み込み
2. ストリングの分割
3. vectorへの代入

順に説明していきます。

## ファイルの読み込み
```input_file
	string path = argv[1];
	string num_nodes = stoi(argv[2]);
	ifstream ifs(path);

	vector<vector<int>> nodes;
	nodes = vector<vector<int>>(num_nodes);
```

## String の分割関数
```cpp
vector<string> split(string& input, char delimiter){
    istringstream stream(input);
    string field;
    vector<string> result;
    while (getline(stream, field, delimiter)) {
        result.push_back(field);
    }
    return result;
}
```

C++ でよくあるstringの分割関数です。
対象のstringと分割文字を引数にしてその分割文字でstringを分割しvectorを返します。

## ファイルを一行ずつ読み込みsplitしたあとvectorに代入
```cpp:assignment
	string str;
	int from, to;

	while(getline(ifs, str)){
		// スペース区切りで分割
		vector<string> strvec = split(str, ' ');
		from = stoi(strvec.at(0));
        to = stoi(strvec.at(1));
		nodes[from].push_back(to);
	}
```

getline関数でファイルを一行ずつ読み込みsplit 関数を用いることでスペース区切りで分割された行を解釈します。
結果として返ってきた始点ノードid と終点ノードid の情報をvector に代入します。
こうしてノードの構造情報をvector に格納することができました。

## 確認

```cpp
	for(int i = 0; i < num_nodes; i++){
		cout << i << "->";
		for(int j = 0; j < nodes[i].size(); j++){
			cout << nodes[i][j];
			if(j != nodes[i].size()-1)cout << ",";
		}
		cout << endl;
	}
```

### 結果
``` output
1->48,53,54,73,88,92,119,126,133,194,236,280,299,315,322,346
2->20,115,116,149,226,312,326,333,343
3->9,25,26,67,72,85,122,142,170,188,200,228,274,280,283,323
4->78,152,181,195,218,273,275,306,328
︙
```
このようにノードのエッジ情報を確認することができます。
ここまでするのでも大変ですね。
プレゼン手法のススメ

# はじめに
QUELCODEアドベントカレンダー？日目
今日はLTなどでも活用できるプレゼン手法について書いていきたいと思います。
もうもはやプログラミング学習関係なくて怒られそう…

# 論旨展開の手法
プレゼンというのは大勢の前で資料を使って自分の考えや商品、サービスの説明を行うもので、それらがプレゼンを聞いている相手に伝わらないと意味がありません。そのためにも論旨展開の手法をいくつか抑えておくといいです。
私が良く使う4つの論旨展開の手法をここでは紹介したいと思います。

1. PREP法
プレゼン相手がある程度予備知識がある場合に趣旨を早く伝えることができる手法です。強く勧めたい場合や説得したい場合にも効果があります。
　Point(結論)→Reason(理由)→Example(事例)→Point(結論)
上記のような順番で話を展開していきます。

2. ホールパート法
プレゼンの情報量が多い場合に用いる手法で、内容が迷子になりづらい特徴があります。
Whole導入(主題、概要)→Part詳細(事例や体験談)→Whole結論(主題、結論の確認)
上記のような順番で話を展開していきます。

3. SDS法
テレビのニュースと同じようなイメージで話を展開していく手法です。シンプルで汎用的な手法になります。
Summary(要約)→Details(詳細)→Summary(全体まとめ)
上記のような順番で話を展開していきます。

4. DESC法
人に何かを承認させたいときに使用する手法で、問題提起を行った後にその解決策を提案する手法になります。
Describe(描写)→Express(表現)→Suggest(提案)→Consequence(結果)
上記のような順番で話を展開していきます。


# プレゼン資料編
最後にスライドを作成するうえで気を付けなければいけないことについて書いていきます。ここでは人前で発表する資料としてのスライドについての注意点を書くので、配布資料としてのスライドの注意点とは異なることを先にことわっておきます。

1. 分量と形式
- 基本的に1分1スライド
- いきなり書き出さず、アウトラインを使うなどして概要や構成から伝える
- 1スライドに1つのメッセージ(=伝えたいこと)をもりこむ。多くても3メッセージくらいが限界
- QAの場合は1スライドに1つの質問と1つの答えで構成する。

2. 見た目
- フォントサイズは「タイトル/見出し/本文」の3段階
- 文字や画像などの配置は一定にそろえる
- ポジティブな情報やネガティブな情報はそれぞれで色を統一
- 数値は大きく、単位は小さく表示する

# まとめ
- プレゼンも論理的に構成することで相手が受け取りやすくなる。
- 1スライドに情報を詰めすぎない
- 最初が一番怖いが一回LTやってみる
mockmockで大量のmockを一度に登録してみる

本日は[mockmockアドベントカレンダー](https://qiita.com/advent-calendar/2019/mockmock)の21日目です。
昨日まで@cheekykorkindが状態遷移についての3部作を書いてくれました。

本日は**負荷試験**についてです。
バックエンド側の負荷試験（オートスケールなど）をしたい時は、デバイスを数百、数千台用意したいですよね。
でもいくら1個の設定が簡単でも同じ作業を何回もしたくない…！

ご安心ください。mockmockには`CSV形式`で`mockを量産`する機能があります！

## CSVテンプレート

mockグループ > CSVテンプレート/エクスポート より
mockの台数を入力し、ダウンロードします。今回は100台にしました。

<img width="853" alt="2019-11-29-14-10-16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290135/9519d034-6252-6811-daee-7040c9cabd1d.png">

ダウンロードしたCSVファイルを開くと、mock_idには`+`がすでにセットされています。
mock_idは自動的に割り振られるため、入力は不要です。
serial_numberを任意の値に設定します。

<img width="408" alt="2019-11-29-14-15-14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290135/69109667-4ffd-5e42-033d-bc64ddfc66b6.png">

## CSVインポート

保存したCSVをインポートします。

<img width="907" alt="2019-11-29-14-33-41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290135/1f96ba00-50de-4961-dba9-354cf456b908.png">

しばらく待つと、、

<img width="1020" alt="2019-11-29-14-37-23-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290135/cae020b0-57fb-2408-2c82-32a762569856.png">

100台増えました！

## CSVエクスポート

さらに作成済みのmock一覧をエクスポートできます。

<img width="323" alt="2019-11-29-14-39-34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290135/02431723-8b57-b8e0-f8c2-955fd27a9c61.png">

もともと作っていた1台を含めて101台分のmock一覧が出力できました。

やったね ✨💪✨
# 明日は
また私！w
今日はmockの大量登録をしたので、明日は特定数のmockを一括で操作してみたいと思います。

明日もよろしくお願いします！
DockerにPostgreSQLを入れる（使い捨て）

####コンテナ作成および起動

```bash
docker container run -d --rm --name postgrescon -e POSTGRES_USER=postgresusr -e POSTGRES_PASSWORD=postgrespass -p 5432:5432 postgres
```

| オプション | 意味 |
|:--|:--|
| --name | コンテナ名 |
| -d | バックグラウンド実行 |
| --rm | 停止後にコンテナ削除 |
| -p 5432:5432 | ホストのポート:コンテナのポート |
| -e POSTGRES_USER | スーパユーザー名 |
| -e POSTGRES_PASSWORD | スーパユーザーパスワード |
| postgres | 使用イメージ |


####コンテナ動作確認
```bash
$ docker container exec -it postgrescon bash

root@xxxxxx:/# psql --version
psql (PostgreSQL) 11.0 (Debian 11.0-1.pgdg90+2)

```

####ログイン
```bash
root@xxxxxx:/# psql -U postgresusr
psql (11.0 (Debian 11.0-1.pgdg90+2))
Type "help" for help.

postgres=#
```


####ホストからの接続確認
```bash
#psqlのためpostgresqlをインストール
$ brew install postgresql

#自動起動停止
$ brew services stop postgresql

#停止確認
$ brew services list

#接続できることを確認する
$ psql -h localhost -U postgresusr
Password for user postgresusr: 
#以下のように出ればOK
psql (12.1)
Type "help" for help.

postgresusr=# 
```
Object.assign({}, obj) と { ...obj } の違い

オブジェクトリテラル内のスプレッド構文は、ES2018で追加されたたいへん便利な構文です。特に、`{ ...obj }`という形のコードでオブジェクトをコピーするのはJavaScriptプログラミングでは極めて頻出です。

スプレッド構文が無かった時代は`Object.assign({}, obj)`として同様のことを達成していた方も多いと思われます。`Object.assign`はES2015から使用可能でした。

では、この2種類の方法は同じでしょうか。タイトルにもある通り、もちろん違います。今回は、この違いに触れている日本語資料が[MDN日本語版](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)で一瞬触れているくらいしか無かったので記事にまとめました。

## 結論

最初に結論を述べると、**`Object.prototype`が汚染されていた場合にのみ違いが発生します**。特に、`Object.prototype`にsetterを持つプロパティ名が存在し、そのプロパティ名でコピーしようとした場合に違いが現れます。

### 例

```js
Object.defineProperty(Object.prototype, "foo", {
  get() { return 100; },
  set(n) { console.log(`foo is set to ${n}`); }
});

console.log({}.foo); // 100

const sourceObj = { foo: 999 };

const obj1 = Object.assign({}, sourceObj); // foo is set to 999 と表示される
const obj2 = { ...sourceObj };             // 何も表示されない

console.log(obj1.foo, obj2.foo); // 100 999
```

`obj1`と`obj2`を2つの方法で作ったあと、それぞれの`foo`プロパティの値を調べると異なる値となっています。

## 解説

`Object.assign`とスプレッド構文は非常に似た動作をしますが、その違いを一言でまとめるとこうです。すなわち、`Object.assign`は**代入**によってプロパティをコピーする一方で、スプレッド構文は**プロパティ自体の作成**によってプロパティをコピーします。

すなわち、`sourceObj`が`{ foo: 999 }`であるという前提で、`const obj1 = Object.assign({}, sourceObj)`の挙動は以下とおおよそ同様です。

```js
const obj1 = {};
obj1.foo = sourceObj.foo;
```

一方、`const obj2 = { ...sourceObj };`の挙動は以下とおおよそ同様です。

```js
const obj2 = {};
Object.defineProperty(obj2, "foo", {
  configurable: true,
  enumerable: true,
  writable: true,
  value: sourceObj.foo
});
```

前者は`obj1.foo`に対する代入ですから、`obj1.foo`がセッタを持っていた場合はそれが呼び出されることになります。一方、後者は`Object.defineProperty`によるプロパティの作成なので、セッタが呼び出されません。今回は`{}`で新規オブジェクトを作ってそれを対象としているので、その違いを引き出すためには`Object.prototype`を汚染する必要がありました。

仕様書を実際に見てみると、`Object.assign`と`...obj`は非常に似た処理をしていることが分かります。

まず`Object.assign`の定義を[仕様書](https://tc39.es/ecma262/#sec-object.assign)から画像で引用します。

![19.1.2.1 Object.assign](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233667/dea90efe-37a0-bbc5-dafc-489b7e5c0811.png)

次に、[`...obj`の処理の本体部分](https://tc39.es/ecma262/#sec-copydataproperties)を使用書から画像で引用します。なお、この場合*excludedItems*は空リストになります。

![7.3.24CopyDataProperties](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233667/a6bbe28b-8ba4-b8d3-de3e-c5aeaf0c1bd9.png)

この2つの仕様を注意深く比べると、本質的な違いは下から2行目だけであることが見て取れます。`Object.assign`はここで[Set](https://tc39.es/ecma262/#sec-set-o-p-v-throw)を使っているのに対し、スプレッド構文では[CreateDataPropertyOrThrow](https://tc39.es/ecma262/#sec-createdatapropertyorthrow)を使っています。深入りするのはやめておきますが、前者がプロパティへの代入に相当する操作である一方、後者は`Object.defineProperty`に相当する操作です。

## まとめ

<del>`Object.prototype`が汚染されていたときのことを考えながらコードを書きましょう！</del>**`Object.prototype`を汚染するのはやめましょう。**
herokuにruby on railsアプリをmysqlを使用してデプロイする。deploy

## 前提条件
nodeとyarnは必ず最新にしておいてください。
それは書きません。

## プロジェクトの作成
noracorn-railsというプロジェクトで作成します

```
ghq get https://github.com/noracorn/noracorn-rails.git
rails new noracorn-rails
cd noracorn-rails
```

## scaffoldで、適当にサイトを作成

```
rails generate scaffold person name:string age:integer
rake db:migrate
```

トップページをいったんscaffoldで作成したものにする

```noracorn-rails/config/routes.rb
Rails.application.routes.draw do
  resources :people
  root 'people#index'
end
```

## 立ち上がることを確認しましょう

以下のコマンドを打ってから、http://localhost:3000/にアクセス
Personのscaffoldにアクセスできることを確認する

```
bundle install
rails server
```

## herokuでアプリを作成する

```
heroku login
heroku create noracornrails
```

## herokuにmysqlを追加
（herokuにクレジットカードを登録してないと追加できません。）

```
heroku addons:add cleardb:ignite -a noracornrails
```

## database設定

```noracorn-rails/database.yml
production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>
  username: <%= ENV['DATABASE_USERNAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
```

以下のコマンドを打つと、データベース接続情報が表示されます。

```
heroku config
```

こんな感じで表示されます

```
mysql://user_xxx:password_xxx@host_xxx/dename_xxx?reconnect=true
```

表示された接続情報をherokuの環境変数に入れていく

```
heroku config:set DATABASE_URL="mysql2://user_xxx:password_xxx@host_xxx/dename_xxx?reconnect=true"
heroku config:set DATABASE_USERNAME="user_xxx"
heroku config:set DATABASE_PASSWORD="password_xxx"
```

## config.assets.initialize_on_precompile = falseを、application.rbに入れる

```noracorn-rails/config/application.rb
module NoracornRails
  class Application < Rails::Application
    config.load_defaults 6.0
    config.assets.initialize_on_precompile = false
  end
end
```
## production.rbのconfig.assets.compileをtrueにする

```noracorn-rails/config/environments/production.rb
config.assets.compile = true
```

## Gem Fileを編集する。
ローカル環境とテストでは、sqlite3を使用してherokuではmysqlを使用するようにした。
上のほうで定義されているsqlite3は、コメントアウトしておいてください。

```noracorn-rails/Gemfile
#gem 'sqlite3', '~> 1.4'

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'sqlite3', '~> 1.4'
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'sqlite3', '~> 1.4'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

group :production do
  gem 'mysql2'
end
```

## bundle installする
```
bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"

bundle install
```

すべてコミットして、herokuにpush

```
git add .
git commit
git push origin master
heroku git:remote --app noracornrails
git push heroku master
```

## herokuのmysqlをマイグレーション

```
heroku run rails db:migrate
```

## アプリが動いているか確認する

```
heroku open
```
Dockerコンテナ(mysql)に接続する



##Dockerコンテナ(mysql)にアクセスする


起動中のコンテナを確認する

```terminal
$docker-compose ps
``` 

```terminal
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                NAMES
847c99b0929c        nginx:latest                   "nginx -g 'daemon of…"   20 minutes ago      Up 20 minutes       0.0.0.0:8080->80/tcp                 docker_php_nginx_1
5e2039b237df        docker_php_php                 "docker-php-entrypoi…"   20 minutes ago      Up 20 minutes       9000/tcp                             docker_php_php_1
8193d899b38d        phpmyadmin/phpmyadmin:latest   "/docker-entrypoint.…"   20 minutes ago      Up 20 minutes       0.0.0.0:8888->80/tcp                 docker_php_phpmyadmin_1
f4ff8b6b8ac3        mysql:5.7                      "docker-entrypoint.s…"   22 minutes ago      Up 20 minutes       33060/tcp, 0.0.0.0:13306->3306/tcp   docker_php_db_1
```

##ホストPCからコンテナ(mysql)に接続する
CONTAINER IDを指定

```terminal
$docker exec -it f4ff8b6b8ac3 bash
```

##mysqlに接続
```terminal
root@f4ff8b6b8ac3:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.28 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

```terminal
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.03 sec)

```
zshでよくお世話になっているプラグインの紹介

あまり詳細には書かず、どういうことができるのかとどこらへんが便利かだけを簡潔に書いていきます。

## zdharma/zplugin 

[zdharma/zplugin](https://github.com/zdharma/zplugin)
遅延読み込みを使った高速な起動が持ち味のzshのプラグインマネージャーです。

[zplug](https://github.com/zplug/zplug)の開発が最近あまり活発でないみたいなんで乗り換えました。
プラグインのインストール・アップデートは同期実行しているようでzplugに比べて遅いですが、シェルの起動時の遅延設定などが充実しているためシェルの起動が高速になるのでメリットは大きいと思います。

```shell:インストールの設定例
if [ -z "$ZPLG_HOME" ]; then
    ZPLG_HOME="${ZHOMEDIR:-$HOME}/zplugin"
fi

if ! test -d "$ZPLG_HOME"; then
    mkdir "$ZPLG_HOME"
    chmod g-rwX "$ZPLG_HOME"
    git clone --depth 10 https://github.com/zdharma/zplugin.git ${ZPLG_HOME}/bin
fi

typeset -gAH ZPLGM
ZPLGM[HOME_DIR]="${ZPLG_HOME}"
source "$ZPLG_HOME/bin/zplugin.zsh"
autoload -Uz _zplugin
(( ${+_comps} )) && _comps[zplugin]=_zplugin
```

#### zplugからの乗り換え方法

基本的にzplugで１行で書いていたものが2行に分かれる感じです。

```diff
- zplug 'zsh-users/zsh-completions'
+ zplugin ice wait'!0' lucid
+ zplugin light 'zsh-users/zsh-completions'
```

1行目にどのファイルを読み込むか、どのブランチを使うかなどプラグインを使用するときの設定が書けます。
プラグイン内で使う設定があるときは別ファイルにして `atinit` で読み込むとよいと思います。

```diff
- zplug 'rupa/z', use:"*.sh"
+ zplugin ice pick"*.sh" atinit"source $ZHOMEDIR/rc/pluginconfig/z_atinit.zsh"
+ zplugin light 'rupa/z'
```

私が乗り換えた際の書き換えた詳細は↓
https://github.com/yutakatay/dotfiles/pull/662/files#diff-70de4f64ddc0a08431e029bcd57c6eb5


## woefe/git-prompt.zsh

[woefe/git-prompt.zsh](https://github.com/woefe/git-prompt.zsh)
プロンプト上にGitのブランチ名やステータス状態を表示できるようになります。どんな環境であってもほぼ必須です。

以前は[olivierverdier/zsh-git-prompt](https://github.com/olivierverdier/zsh-git-prompt)を使っていましたがこちらのほうが非同期で実行できるのでプロンプトの表示がはやくなります。

![20191221_154537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107220/89349929-695f-1dbe-6b63-8de86ab4aaa2.png)


## zdharma/fast-syntax-highlighting

[zdharma/fast-syntax-highlighting](https://github.com/zdharma/fast-syntax-highlighting)
入力したコマンドの引数とかに色をつけてくれます。

以前は[zsh-users/zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)を使用していましたがこちらのほうが高速らしいです。


## hchbaw/auto-fu.zsh

[hchbaw/auto-fu.zsh](https://github.com/hchbaw/auto-fu.zsh)
最近更新が止まっていて悲しいですが今も愛用してます。Tabを押さなくても補完候補を表示してくれます。

![Peek 2019-12-21 15-59.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107220/78de6db2-a6bb-4b07-28b3-8c4651681f85.gif)


古くて嫌な人は、代替としては[zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions)がありますが、補完候補をすべて表示する機能には対応していないです。https://github.com/zsh-users/zsh-autosuggestions/issues/15


## mollifier/cd-gitroot

[mollifier/cd-gitroot](https://github.com/mollifier/cd-gitroot)

gitのプロジェクトルート(.gitがあるディレクトリに)移動してくれます。ただそれだけですが、`cd-gitroot`と結構な頻度でタイプしている気がします。


## t413/zsh-background-notify

[t413/zsh-background-notify](https://github.com/t413/zsh-background-notify)

パッケージ更新コマンドやビルドコマンドなど時間がかかるコマンドを打ったあとに、処理が終わったら「終わったよ！」って通知してくれるようになります。
ターミナルが声をかけてくれてうれしくなれます :relaxed: 


## popstas/zsh-command-time

[popstas/zsh-command-time](https://github.com/popstas/zsh-command-time)

今のコマンド処理なげーな！一体何分かかってるんだよ！ってときにかかった処理時間を教えてくれます。〇〇秒以下は教えてくれなくていいよって設定もできるので便利です。
新卒エンジニアがわからなかった単語

こんにちは！(こんばんは、おはようございます！)新卒エンジニア1年目の@rynkd08です。
この記事は、All About Group（株式会社オールアバウト） Advent Calendar 2019 21日目の記事となっております。

# はじめに
大学時代は生命科学を専攻していて、大学4年生の6月までは総合職で就職活動をしていました。

その6月に「厚切りジェイソンが語るITセミナー」というものに参加してプログラミングをやってみた結果、ものを作り出せる人ってすごくね！？となりエンジニアになろうと決めました。

そこからはprogateとドットインストールを徐々に進めていきました。progateは有料枠で確かレベル200ぐらいにはなっていたと思います。

## 入社前に触ったことがある言語
- HTML
- CSS
- Javascript
- PHP
- Ruby on Rails
- SQL

少し事前準備をした(と勝手に思っていた)段階で入社しました。
パソコンは大学のレポートで触ったぐらいのレベル感なのでどれだけ素人だったかは想像できると思います。

# 単語集

## 環境系

### Docker
仮想環境の１つ。主に自分のパソコン内でローカル開発環境を作る際に用いる。dockerイメージからコンテナが作られ、その中でアプリケーションが動いている。dockerイメージファイルをやり取りすることで簡単にローカル環境を立ち上げることができる。

#### dockerイメージ
コンテナを立てる元となるファイルのこと。mysqlにつなぐ処理や、公式のphp-apacheのイメージを引っ張ってくる処理を記載しておく。

#### dockerコンテナ
dockerイメージを元に立てる。この中でアプリケーションが動いている。

### Apache
Webサーバーソフトの１つ。世界的に利用されていてドキュメントなどが充実している。
同じようなものとしてnginxがある。

### KVS
Key Value Storeの略。
キーとバリューからなるシンプルなデータを保存することができる。また、キャッシュをためておくことができる。
memchachedやredisなどがある。

- メリット
データ取り出しの際の速度が早い

- デメリット
シャットダウンや再起動でデータが消える

## CIツール
Continuous Integrationの略。
プログラミングしたソースコードの品質を担保するために自動でテストを行ってくれるツール。
CircleCI、werker、jenkinsなどがある。


## ネットワーク
### DNS
サーバーはそれぞれ住所のようなIPアドレスを持っている。
我々は普通、`https://〇〇.com`のようなURLにアクセスするが、この`〇〇.com`とIPアドレスを繋いでいるのがDNSと呼ばれるサーバーである。

### GCP
Google Cloud Platformの略。Googleが提供するWebサービスを動作させるための基盤。

## その他

### マウント
ファイルをコピーしてそのコピー元も書き換えること。
例. パソコンにUSBをさしてUSBファイルの中身を書き換えるとUSBの中のものもパソコン上でも中身が書き換わっている。
同期処理を行っている。

### cron
何かの処理を自動で行わせるという仕組みのこと。
いつ、何を実行させたいかをファイルに書いておくことで自動でその処理を指定した時間に実行させることができる
cf) バッチ処理
バッチ処理は何かの処理をまとめて自動で行ってくれること
バッチ処理を管理しているのがcronである。

### デプロイ
ソースコードを最新に本番反映すること。
「本番にデプロイする」などという。この場合、変更したコード等をサーバーにアップロードする。

# 終わりに
未経験でエンジニアになった人にとって先輩エンジニアの人たちが話している言葉がわからないことはよくあると思います。
そんな時に逐一わからなかった言葉はメモしておき、調べることで話していることを段々理解できるようになると思います。

理解できるようになると楽しくなってくると思うので同じような境遇の人にとってこの記事が参考になると幸いです。
Echoで簡単なwebサーバーを実装してみる

VOYAGE GROUPのサマーインターン「Treasure」の[アドベントカレンダー](https://adventar.org/calendars/3943)17日目の記事. 
遅れてごめんなさい. 

# 目的
Goのwebフレームワークの一つであるEchoを使って簡単なwebサーバーをさくっと生やす

# なんでEcho?
Goのwebフレームワークはたくさんある. ginとかbeegoとか...
そんな中Echoを選んだ理由は
1. 公式のドキュメントがすごい丁寧でわかりやすかった
2. 軽量で処理が高速 (らしい)
3. 書き方がわかりやすかった

という感じ. 他のフレームワークにももちろん良いところはあるのだろうが, とっつきやすさを感じたのでEchoを使うことにした. 

[echo公式ドキュメント](https://echo.labstack.com/guide)

# 実践
## サーバーの起動
Echoでwebサーバーを起動させるのは超簡単


```go:main.go
package main

import "github.com/labstack/echo/v4"

func main() {
	e := echo.New()
	e.Start(":1991")
}
```

これでmain.goを実行すると以下のようにwebサーバーが立ち上がる. 
<img width="498" alt="スクリーンショット 2019-12-21 16.24.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242603/a300dc46-579a-046c-9f62-d3396e8bdc56.png">

## APIの実装
それではAPIを作っていく. 今回は`/hello`に`GETリクエスト`を送ったら`Hello World`という文字列がレスポンスとして返ってくるような簡単なAPIを作る. 
main.goに数行追加する. 

```go:main.go
package main

import (
	"net/http"

	"github.com/labstack/echo/v4"
)

func main() {
	e := echo.New()
    // 追加部分
	e.GET("/hello", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello World")
	})

	e.Start(":1991")
}

```

今回はリクエストに対してDBの操作などをしないので, ルーティングの部分でレスポンスを返しているが, もちろん関数に切り出せる. 
それではリクエストを実際に飛ばしてレスポンスが返ってくるか確認しよう. まずはmain.goを実行し, 別のターミナル上で以下のコマンド叩く. 

```shell
curl http//localhost:1991/hello
```
Hello Worldが返ってきた. 
<img width="395" alt="スクリーンショット 2019-12-21 16.48.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242603/d8c3ec60-9269-7d89-23b2-c2b21e8a61b9.png">

# まとめ
書いてから気づいたがechoの公式ドキュメントのQuick Startとやってることが99%一緒だった. 今回は簡単な事しかやらなかったがEchoは色々とカスタマイズができる. ログの表示の仕方とかも自分でいじれたりルーティングのグループ化ができたり... 時間ができたらそういったこともアウトプットしていきたい.
kinesisからkinesisへ

気がついたら仕事納めまであと約１週間
上京して仕事をしている皆様、新幹線の指定席は取れましたでしょうか？
私は取れなかったのでデッキで立ちながら帰ることになりました。orz
それではパーソンリンクアドベントカレンダー22日目になります。

#はじめに
今回、私が書くのは業務で扱ったシステムの流れ図、苦労した点などを書きたいと思います。
各サービスの説明をしているといくら時間があっても足らないので詳しい仕様などは省いていきたいと思います。
なおこれから説明していくものは全てAWSのEC２上にインストールしているものです。


#システムの流れ図

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/7cbda2fd-5338-c850-0854-7d0e3a77b622.png" width=10%><img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/5d743e48-c36e-62b7-be80-7d05b7ebcba0.jpeg" width=10%><img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/aa0ea20d-0dee-6ea5-9b19-fc737759f8d1.png" width=20%><img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/5d743e48-c36e-62b7-be80-7d05b7ebcba0.jpeg" width=10%><img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/ec3791d0-5e76-a549-50dd-5434c989efc9.png" width=15%><img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/5d743e48-c36e-62b7-be80-7d05b7ebcba0.jpeg" width=10%><img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/aa0ea20d-0dee-6ea5-9b19-fc737759f8d1.png" width=20%>
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/5d743e48-c36e-62b7-be80-7d05b7ebcba0.jpeg" width=10%><img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416620/7cbda2fd-5338-c850-0854-7d0e3a77b622.png" width=10%>

上記の流れ図を業務で実装しました。全て苦労しましたがその中でも特に苦労したfluentdについての苦労した点、良かった点を書いていこうと思います。
#fluentdで苦労した点

##　fluetdの理解
業務で扱う前まで「fluentd? 何それ　おいしいの？」ってレベルでしたが調べていくうちになんとか分かるレベルになることができました。学習コストは高いほうだと思うので業務で触ることができ自分の武器にすることができてよかったと思います。
##　バージョンによっては動かないプラグイン
今回、使用したプラグインは
・fluent-plugin-in-kiesis
の他に標準プラグインである
・forward
・exec
なのですが、バージョンが違うとどれか１つが動かなかったりしたので全てが動くバージョンを見つけるのが大変でした。
最終的にはnpmが保管されているサイトがあったのでそこからインストールすることで解決することができました。

#fluentdのよかった点
## 管理が楽
そのままの意味です。本当に楽でした。

## プラグインが豊富
仕様の中で　ここはこうして欲しい　があったのですが、プラグインが豊富なおかげで１度も無理ということはありませんでした。プラグインを作っていただいた方には感謝しかありません。

#終わりに
今回の業務ではプログラムを書くというよりも環境構築の色が強く出ていました。プログラムを書くのも楽しいのですが
私はクラウドサービスをいじっている方が楽しいと感じたのでクラウドサービスを自分の武器にしていきたいと思います。
ひん
【Vue-CLI】favicon（タブに表示されるWebページ画像）の場所

# はじめに
faviconを変えようと思ったが、すぐに場所が分からなかったので調べた内容を下記する。

# 場所
[プロジェクトルート]/public以下にある。
public
├── favicon.ico
└── index.html

このfacicon.icoを変更したいものに置き換えることで変更することができる。
[こちら](https://www.favicon.cc/)等でfaviconの作成ができる。
[初学者向け]mysqlの操作マニュアル

mysqlに関して、操作方法を過去に学習してましたが、完全に忘れてしまってましたので、備忘録としてまとめます！

#mysqlへの接続

```:terminal
#rootの部分はユーザー名を記入。
$ mysql -u root
```
#注意事項
SQL文の終わりには;をつけましょう。

```:terminal
# ;をつけ忘れた時は->の後に;をつけましょう。
mysql> SHOW DATABASES
     ->;
```

#データベース一覧確認

```:terminal
#以下コマンドでデータベース一覧が確認できます。
SHOW DATABASES;
```

#データベース作成

```:terminal
#以下コマンドでデータベースが作成できます。
CREATE DATABASES データベース名;
```

#データベース選択
データベースの操作を行う場合は、そのデータベースを選択する必要があります。

```:terminal
#以下コマンドでデータベースが選択できます。
USE データベース名;
```

#テーブルの確認
データベース選択後、テーブルの確認をしてみましょう。

```:terminal
#以下コマンドでデータベースのテーブルの確認ができます。
SHOW TABLES;
```

#テーブルの作成

```:terminal
#以下コマンドでテーブルが作成できます。
CREATE TABLE テーブル名（カラム名　カラムの型,カラム名２　カラム型...）;
```
カラムの型について、以下に記載します。
Railsでは数字を入れる型は"Integer"、文字列を入れる型は"String"となっていましたが、mysqlで数字型や文字列型を定義する際は以下のような型名を使用します。

|　 |    |
|:--|:--|
|型名 |	保存できる値|
|INT |数字|
|VARCHAR(M) |最大M文字の文字列|

#テーブル構造の確認

```:terminal
#以下コマンドでデータベースのテーブル構造の確認ができます。
SHOW columns FROM テーブル名;
```

#カラムの追加

```:terminal
#以下コマンドでカラムの追加ができます。
#複数の場合は()と,で区切りましょう。
ALTER TABLE テーブル名 ADD (カラム名 カラムの型,カラム名２　カラムの型...);

```

#カラムの修正

```:terminal
#以下コマンドでカラムの修正ができます。
ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型;
```
＊カラムの方は修正しない場合も記載が必要です。

#カラムの削除

```:terminal
#以下コマンドでカラムの削除ができます。
ALTER TABLE テーブル名 DROP カラム名;
```
以上となります。最後までご覧いただき、ありがとうございました！
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします！
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。
【Rails】新規アプリケーションの作成準備

##まえがき
備忘のためのメモでもあるので、少し簡単に記載させていただいております。少しずつ肉付けできればとは考えておりますが、わかりにくいところなどありましたら申し訳ございません。ご質問やご指摘などメッセージいただきましたら私の方でもお調べしますので、共に前進できればと考えております。何卒よろしくお願い申し上げます。
また、TECH::EXPERTにて学習させていただいているため内容は参照させていただいております。

##開発環境
MacOS:10.14.6
Ruby:2.5.1
Rails:5.2.4
MySQL:0.5.2

##index
1.ターミナルで新規アプリケーションのディレクトリを作成
2.gemのバージョン指定を追記/変更
3.データベース作成 + ブラウザで確認


##1.ターミナルで新規アプリケーションのディレクトリを作成

```
# 新規アプリケーションを作成したいディレクトリに移動
$ cd ~/ディレクトリ名

# 新規アプリをバージョンを5.2.3で、-dオプションでMySQLの使用を明示して作成
$ rails _5.2.4_ new アプリ名 -d mysql

# アプリ名ディレクトリに移動
$ cd アプリ名

# 現在のディレクトリのパスを表示（確認までに）
$ pwd
```

###※以下のエラーが出る場合

```
Installing mysql2 0.5.2 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/user_name/Programs/web/foobar-repo/vendor/bundle/ruby/2.5.1/gems/mysql2-0.5.2/ext/mysql2
/Users/user_name/.rbenv/versions/2.5.1/bin/ruby -r (以下略)
```

バージョンに関するエラー
ターミナルで以下のコマンドを実行

```
$ gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/' -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib
$ cd ~/ディレクトリ名/アプリ名
$ bundle install
```

##2.gemのバージョン指定を追記/変更
テキストエディタでアプリ名のディレクトリを開き、Gemfileから必要に応じてgemのバージョンを変更します。
私の場合は「mysql2」と「sass-rails」のバージョンに変更が必要でしたので以下で変更しました。
また一番下に新たにgemを3つ追記しております。

```
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

~中略~

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.2.4'
# Use mysql as the database for Active Record
gem 'mysql2', '0.5.2'
# Use Puma as the app server
gem 'puma', '~> 3.11'
# Use SCSS for stylesheets
gem 'sass-rails', '5.0.7'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'mini_racer', platforms: :ruby

~中略~

gem 'pry-rails'
gem 'compass-rails', '3.1.0'
gem 'sprockets', '3.7.2'
```
ターミナルで以下を実行し
Gemのバージョン指定を管理している「Gemfile.lock」というファイルを更新

```
# Gemfileを元にgemをインストールし、Gemfile.lockを更新する
$ bundle update
```

##3.データベース作成
ターミナルで以下を実行

```
# データベースの作成
$ rails db:create
```

※ここまで終わったら以下のコマンドでサーバーを起動し
ブラウザ([http://localhost:3000](http://localhost:3000))で確認

```
# サーバーを起動
$ rails s
```
Npgsqlを使用したBulk Copyのサンプル

# Import

元データはタブ区切り。

```c#
NpgsqlConnection conn = new NpgsqlConnection(conStr);
conn.Open();
using (var writer = conn.BeginTextImport("COPY Accounts (account_id, record_date, prc_amount) FROM STDIN"))
{
    writer.Write(File.ReadAllText(@"table_import.txt", Encoding.GetEncoding(932)));
}
conn.Close();
```

# Export

NULLは空文字に変更。行末はLFとなる。

```c#
NpgsqlConnection conn = new NpgsqlConnection(conStr);
conn.Open();
using (var reader = conn.BeginTextExport("COPY (select account_id, record_date, prc_amount from Accounts order by account_id) TO STDOUT NULL ''"))
{
    File.WriteAllText(@"table_export.txt", reader.ReadToEnd(), Encoding.GetEncoding(932));
}
conn.Close();
```

# 参考情報

- https://www.npgsql.org/doc/copy.html
- https://www.postgresql.jp/document/11/html/ecpg-sql-connect.html
- https://www.postgresql.jp/document/11/html/sql-copy.html
- https://www.postgresql.jp/document/11/html/datatype.html
- https://www.postgresql.jp/document/11/html/functions-datetime.html
- https://www.postgresql.jp/document/11/html/functions-formatting.html
- https://www.postgresql.jp/document/11/html/functions-string.html
- https://www.postgresql.jp/document/11/html/sql-createsequence.html
SQLのトランザクションと制御、設定 ~駆け出しエンジニア編~

こんにちは！
オズビジョン開発グループのShoです。

2019年9月~29歳で未経験から営業→エンジニアになった私が、
脱未経験エンジニアを目指して、業務の中で学んだこと、会社の業務について書いて行きます。
私の現状については前回の投稿をご参照ください。
[[前回の投稿](https://qiita.com/ssuzuki0301/items/ecfde22d30f8f1032c49)]

今回は、SQLのトランザクション処理の制御について書いて行きます。

# 対象読者
私と同じように、異職種からwebエンジニア(バックエンド、フロントエンド)に転職された方。
経験1年未満で毎日分からないことだらけの方。
トランザクションって何？という方。
**これから人生で初めて本番環境のDBを触る方。**

#今回の投稿の背景
自社のwebサービスにて新機能の追加を担当しており、
実装、テストを終え、本番環境へのリリース手順の作成を任されました。
その際にデータベースへのレコード追加の手順があり、
対象のDBとSQL文を下記のように手順に加えました。

```sql

対象DB:hoge

insert into hoges(hoge,fuga) values('qiita','キータ',now());
```

そして完成したリリース手順をレビュー依頼に出し、
考慮が足りない点、不足している手順、質問などレビューが返ってきました。

その中で、

**トランザクションの設定を行って下さい。**
**本番環境でDBを操作する場合は、ロールバックの余地を残してください。**

というコメントを頂きました。

・・・指摘の内容が分からない！！！

トランザクションの意味は理解していましたが、その設定とはどういうこと??
と頭の中が？？になりました。

という訳で、今回はSQLでのトランザクションの設定、制御について簡単にまとめました。

#トランザクションとは
ざっくり説明すると、

- **「複数の処理」**のまとまり。
- 処理１ →　処理２　→　処理３  = 1つのトランザクション
- １つのトランザクションに於いては、複数の処理は分離できない。
- 上記のトランザクションでは、処理１が組み込まれてるので、処理1だけ切り離して独立させることはできない。
- トランザクションは「成功」か「失敗」のいずれかの結果となる。

よく銀行の振込み処理などが例で使用されます。
**AさんからBさんの口座へ1,000円の振込みをする**
**処理１:** Aさんの口座から1,000円を差し引き、残高10,000円-1,000円=9,000円にする。
**処理2:** Bさんの口座へ1,000円プラスして、残高20,000円+1,000円=21,000円にする。
上記のトランザクションでは、
Aさんの残高が9,000円、Bさんの残高が21,000円となったので**「成功」**です！

もし、処理2で何かしらのエラーで起きた場合は、
処理1でAさんの口座から1,000円が引かれているので、
振込み前の状態に戻す必要があります。
Aさんの１,000円どこ行った！！となってしまったら大変です。
これはトランザクションの**「失敗」**です。

このような**複数の処理のまとまり**による、**一連の処理**が**トランザクション**です。

SQLでもテーブル作成やカラムの追加、レコードの追加の流れもトランザクションです。
この際にどこかの処理で、**エラーが起きた際にロールバックできるようにしてね!!!**
というのが私が受けたレビューでの指摘です。
本番環境のDBでエラーが起きて最初の状態に戻れなかったら厄介です。
(考えただけで怖い)

#SQLでのトランザクションの制御、設定
では、私はどのように修正すべきでしょうか。
結果のSQL文から書きます。

```sql

begin;

select  * from hoges where hoge = 'Qiita';
# 検索して0件

insert into hoges(hoge,fuga) values('Qiita','キータ',now());

select  * from hoges where hoge = 'Qiita'; 
#検索して1件

commit;
```

- `begin;`でここからトランザクションの開始です！という開始の宣言。
- `Qiita`が新しく追加するものなので、追加前に存在しないかの確認
- レコードの追加
- レコードが本当に追加されたかの確認。
- `commit;`で処理の確定(この場合はinsert)

上記のように`begin;`から`commit;`で処理の確定が行われるまでが、一連のトランザクションとして扱われます。
今回の処理でエラーが起きた際には`rollback;`で**処理前の状態に戻すことができます。**

今回は一つのトランザクションなので省略していますが、
複数のトランザクションがある場合は、トランザクション毎に名前をつければ、指定した処理をロールバックすることが可能です。
`begin transaction [トランザクション名];`
`rollback transaction [トランザクション名];`

途中の`select`は実際の処理ではなく、確認の為に挟んでいます。
本番環境ともなれば随時確認しながら進めて行くことが重要、ということも勉強になりました。

レビューがなかったら、本番DBに直でinsertしてました。
今考えると危なすぎです...。

もし、初めて本番環境でDBを操作することがある方は頭に入れておくと良いと思います。
誰かの参考になれば幸いです。

#余談
手順のレビューをもらい、手順にトランザクションの制御を入れ上述のように修正しました。

実はOKをもらう前にもう一回修正をしております。
`"Qiitaで検索して0件"`
`"Qiitaで検索して１件"`
という項目も入れた方がいいよ！と言われ、
手順に上記の文章をそのまま書きました。

そしてレビューで
...いやそこはSQL文で書いてよ！笑
と突っ込まれ、上記のselect文にするんだ！と気づきました。
そりゃそうですよね。当たり前です...。
恥ずかしい...。

エンジニア力のなさを実感した瞬間です。笑
最近のgit操作環境（2019/12/21時点）

最近、Gitの環境を整理して使いやすい環境になってきたので記事にしてまとめておこうと思います。
使用している OS は Ubuntu 18.04 です。

# シェル
現在使用しているシェルは fish を利用しています。
fishは構文の強調表示、入力時に入力候補の表示、タブ補完などの機能をデフォルトで使用することができます。

### インストール
下記コマンドを実行すれば完了です。

```bash:fishのインストール
sudo apt-add-repository ppa:fish-shell/release-3
sudo apt-get update
sudo apt-get install fish
```

デフォルトのシェルをfishに設定します。

```bash
chsh -s $(which fish)
```

ログインしなおせばシェルがfishに設定されているはずです。

ついでにfishのパッケージを管理するツール、fisherをインストールします。

```fish:fisherのインストール
curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
```


# リポジトリ操作

### リポジトリの移動

私が設定しているGit関連の設定は以下の２つです

- cloneしたリポジトリへの移動
- ブランチ移動

この２つについて、キーバインドで完結できるように設定します。

まずはじめに fzf というコマンドラインで使用できる対話式のフィルタツールを使用します。
これと似たツールにpecoというものもありますが、fzfではあいまい検索ができるため、こちらを使っています。

ではインストールしていきます。インストールは以下のコマンドで行うことができます。

```bash:fzfのインストール
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install --no-bash --no-zsh --key-bindings --completion --update-rc
```

---
次に、にcloneしてきたリポジトリを管理する方法として ghq を使います。
ざっくりと説明するとcloneしてきたリポジトリを特定のディレクトリに配置して一括管理できるようにしてくれるツールです。

インストールについては[ghqのリポジトリ](https://github.com/motemen/ghq)を参考にしてインストールします。

ghqには`ghq list`というghqでcloneしたリポジトリをリスト表示する機能があるのですが、この機能とfzfのあいまい検索を連携させるためのプラグインをfisherでインストールします。

```fish
fisher add decors/fish-ghq
```

インストール後、Ctrl+Gで`ghq get`で取得したリポジトリがfzfのインターフェースでリストアップされあいまい検索と対話的選択でリポジトリを移動することができるようになります。

![fish_fzf_repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85225/4c77c35f-a882-dad1-a42e-c97697360406.png)


### リポジトリのブランチ移動

ブランチの移動には gitコマンドとfzfコマンドを組み合わせて移動します。
fzfのwikiにある[fishでの例](https://github.com/junegunn/fzf/wiki/Examples-(fish)#git)で紹介されているコマンドを使ってキーバインドでのブランチ移動を実現します。

```fish:~/.config/fish/functions/__git_branch.fish
function __git_branch -d "Fuzzy-find and checkout a branch"
  git branch --all | grep -v HEAD | string trim | fzf | read -l result; and git checkout "$result"
  commandline -f repaint
end
```

次に、先程作成したコマンドをキーバインドに紐付けます。

```fish:~/.config/fish/conf.d/keybinding.fish
bind \cb '__git_branch'
if bind -M insert > /dev/null 2>/dev/null
    bind -M insert \cb '__git_branch'
end
```

fishにログインしなおせばキーバインドの紐付けが完了しているはずなので、Ctrl+bでリポジトリの移動時のような画面で現在のリポジトリのブランチを対話的に切り替える事ができるようになります。

![git_checkout_fzf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85225/249d93f2-581b-57fa-504d-a7b79b92aca1.png)


以上で、最近のgit操作今日の紹介は終わりにしようと思います。
これら使っていく中でよりよいものがあれば追記していこうと思います。
【React練習問題】（回答）①カウントアップ、ダウンをつくろう

# 課題の目的
以下の基礎的な使い方を理解してもらいたかった。
・useStateの使い方
・useCallbackの使い方
・memoの使い方
・コンポーネントに分けること

この書き方に慣れてくれることで、まずはreactのソースが少しずつ理解出来てくる。
useCallbackの機能自体はあまり活用出来ていないが、使って子のコンポーネントに渡すことが基礎であることも知ってほしかった。

# 回答
実装方法はそれぞれ違うと思うので、一つの例だと思って見てほしいです。

```jsx
import React, { useState, useCallback, memo} from "react";
import ReactDOM from "react-dom";

function App() {
  const [count, setCount] = useState(0);
  const countUp = useCallback(() => setCount(count + 1), [count]);
  const countDown = useCallback(() => {
    if(count > 0) {
      setCount(count - 1);
    }
  }, [count]);
  
  return (
    <div>
      {count}
      <CountButton onClick={countUp} label="UP!!" />
      <CountButton onClick={countDown} label="DOWN!!" />
    </div>
  );
}

const CountButton = memo(({onClick, label}) => 
  <button onClick={onClick}>{label}</button>
)

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
```

## 仕様の実装
・useStateの利用

```jsx
const [count, setCount] = useState(0);
```

・useCallbackの利用

```jsx
const countUp = useCallback(() => setCount(count + 1), [count]);
const countDown = useCallback(() => {
  if(count > 0) {
    setCount(count - 1);
  }
}, [count]);
```

・memoの利用
・コンポーネントの切り出し
今回はボタン自体をコンポーネント化して、propsで動きを変えれるようにした。

```jsx
const CountButton = memo(({onClick, label}) => 
  <button onClick={onClick}>{label}</button>
)
```