OmniAICreator/Qiita-1.07M huggingface dataset:
macOS Catalinaへアップグレードしたら「空き容量が足りません」エラーが出たときの対処方法

macOSをMojaveからCatalinaへアップグレードしたら

>コンピュータにmacOSをインストールできませんでした
>
>Macintosh HDにはインストールに必要な空き領域がありません

と出てインストールが途中で止まってしまった。
画面に再起動ボタンが出ているので、これをクリックして再起動しても、
再び同じメッセージでOS起動できない状態。。。

MACサポートへ問合せしてみたら、以下の手順を教えてくれ、その手順でやったら
復活できたので、その手順をメモ。

# 準備
データが入っていない空の外付けHDDを用意（USBタイプ）

# 外付けHDDへCatalinaインストール

- macを起動時に Option + Command + R でmacOS復元モードで起動
- ディスクユーティリティを選択
- guidパーティションテーブル方式を選択できるようにするために、以下のようにすべてのデバイスを表示させる![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397664/90a31fef-da95-4bed-7eae-867d1ec9a927.png)
- 外付けHDDを挿す
- ディスクユーティリティ画面の左ペインに外付けHDDが表示されるのを確認し、それを選択
- 「消去」ボタンをクリックし、以下を選択
    - フォーマット：macos拡張ジャーナリング
    - 方式：GUIDパーティションマップ
- 「消去」ボタンをクリック
- macOS復元画面に戻り、「macOSを再インストール」を選択
    - インストール先のディスクに、先ほどフォーマットした外付けHDDを選択
- Catalinaが外付けHDDにインストールされるので、完了するまで待つ

# データの退避と、不要データの削除

- osインストールが完了したら、Finderをクリックし、左ペインにMacintoshHDが見えるか確認
- MacintoshHDが見えたら元のデータが取り出せる
    - MacintoshHD のDataに元のデータが入っているので、MacintoshHDを選択してもそのままだと見えない。Finderの検索窓に”home”と打つとData内のファイルが見えるので、そのファイルを右クリックし、置き場所のフォルダを表示させる。
    - 退避しておきたい対象のフォルダ or ファイルをデスクトップにDrag & Dropして退避する
- MacintoshHDの不要なファイルを削除して、ディスク容量を空ける

# 内蔵DiskへCatalinaインストール

- OS再起動させ、Command + R でmacOS復元モードで起動
- 「macOSを再インストール」を選択し、Catalinaのインストールを実行
- Catalinaインストールが無事完了！
【プロジェクト管理向け】Githubで使えるネタ5選

# はじめに

こんにちは。PMをやってるものです。
当記事は[VALUアドベントカレンダー](https://qiita.com/advent-calendar/2019/valu)の 15 日目の記事になります。

VALUではGithubをバージョン管理のほか、
プロジェクト管理・進行管理にも使っています。

メンバーが増えてくるにつれ色々ちゃんとしなければいけなくなったのと、
3プラットフォームにてサービス提供していることから同じような作業を
3リポジトリ横断で行わなければいけないため、
issueを適切に管理するだけでもなかなかに工数がかかることから
効率化の知見が溜まってきたので共有します。

どこかのディレクターに届け。

# 弊社のプロジェクト管理

Githubで完結させています。（[ドキュメント管理は全社横断でesa](https://esa-pages.io/p/sharing/6700/posts/1406/207a6d0f55dcec5e041b.html)です）
Github内のmilestoneはリリース単位で存在し、projectsは週次の振り返りとタスク出しに利用しています。

この辺は日々日々試行錯誤で移ろいます。

ではそんなGithub運用をしている中でみつかった嬉しい小ネタをお送りします。

# ネタ5選

## /issues から新規のマイルストーンを設定する

Set milestone > Filter milestone して未作成のmilestone 名を入力すると、
新たにmilestone をCreateして、当該のissue に設定することができます。

![1_create_milestone.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317327/d4b39820-a2b7-3d04-6089-fb743722d5bf.gif)

これによって事前にmilestone を準備してから当該のissue で設定してやる必要がなくなります。

なおこの類の動作は <>Code でbranchをFilter する箇所からも行えます。

<img width="201" alt="1.5_branch.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317327/26bdde0b-1f66-c9e5-a271-4326eb97de97.png">

（こちらではFilter or Create と表示されていて親切さが伺えます）

Create の際baseとなるbranch は元々表示していたものになります。
（master以外の場合、/tree/hoge/fuga のようにURLからも確認できます）

## /issues から一括でマイルストーンを設定する

そうこうして出来上がったmilestoneを、別のissueにも適用したい場合は
当該のissueをチェックボックスにて選択 > Milestones のプルダウンより適用したいmilestone を選択することで行えます。

![2_change_milestone.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317327/a6aeda20-d5a8-3311-bb3a-050f98313ebb.gif)

便利。すごいぞGithub。

## /milestone/* からLabelを変更する

![3_change_label.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317327/059acd4a-cd1d-1f64-5eb3-a48d5ef0c581.gif)

こちらもチェックボックス > プルダウンより、
多数のissueの情報を一括で編集することができます。

## /projects/* にてassignee:でフィルタする

Githubアイコンをクリックすると、assignee:username でフィルタすることができます。
1つの看板で10名ぐらいのタスクを管理することもあるので、非常に便利機能です。

![4_assign.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317327/5764761d-05ca-c425-c967-6f0077cd8c18.gif)

ここまでくるとお気づきかと思いますが、issueに付与されているLabelでも同じように、
クリックでフィルタすることができます。

## /labels にて多数のLabel を一括で編集する

これはシンプルに、複数のLabelに対して同時にeditをすることができるというものです。

<img width="967" alt="5_edit_label.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317327/1243b8a0-083a-bafb-f2b7-7208b28f8ef6.png">

Colorを同じにしたい時などに地味に役立ちます。

# さいごに

Githubの扱いに慣れていない方でもわかるようにと冗長な記述となったこと、日々の至らぬ自分を棚上げして当記事をしたためことご容赦くださいませ。

また、つらつらと効率化の手段を述べましたが、
前提として運用について些細なことでも関係各位と合意を取ることが大事だと日々感じています。

合意の過程で話し合いやヒアリングをすればするほどに
意見をもらうことで精度がより高いものになりますし、知らなかったTipsも教えてもらえたりと嬉しいことが多いです。
（今回のネタも、教わったものが多いです。ありがとうございます）

しかし、組織の移り変わりとともに運用も変えていかなければいけないので、
話し合いにかける工数もバランスだなあと思うこともあるのです。

2019年も残すところあとわずか。頑張っていきましょう。

## appendix

当記事のgifはみんな大好き[ffmpeg](https://qiita.com/yusuga/items/ba7b5c2cac3f2928f040)で作成しました。
issueの添付にも有用なので是非。
0クリアするためだけに遅延セグ木を書かない

## 需要
[三井住友信託銀行コンテスト2019-E](https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_e) を想定解とは違う方法で解いていて以下のような操作を高速に($O(\log (N))$くらいで)できる配列が欲しくなりました

 - 一点代入/一点取得 (普通の配列の操作)
 - 全ての要素を0に変える

こういう状況はたまにありそうです。
「区間代入だから遅延セグ木 !」と思って遅延セグ木を書いても良いんですが遅延セグ木は計算量にlogがつく上に実装が面倒で、ライブラリで殴れば別ですがこの単純な遅延セグ木である程度慣れていても10~15分は実装に飛ぶと思います。(あとバグると大変)

## 0クリア

この操作をサポートするデータ構造(っぽいもの)を3分で書ける方法を紹介します。

そのアイディアは至ってシンプルで(配列の初期値を0とすると)最後に0クリアされてから一点代入が行われた回数しか配列中に非0の要素は出現しないというものです。
このため

 - 一点代入した時にそのインデックスをvector(writtenという名前とする)にでも入れておいく
 - 0クリアのときにwrittenに入っている全ての位置に0を代入してwrittenをクリアする

とすると0クリアで見るwrittenの要素数の和は高々一点代入が行われた回数なので全操作のならし計算量が$O(1)$になります。

実装は以下の通りです(C++)

```c++
class ZeroClearableArray {
	std::vector<int> data; // 管理している配列そのもの
	std::vector<int> written; // 最後に0クリアされてから一点代入が行われたインデックスが全部入っている
public :
	int n;
	ZeroClearableArray (int n) : data(n), n(n) {}
	int operator [] (int i) { return data[i]; }
	void assign(int i, int val) { data[i] = val; written.push_back(i); }
	void zero_clear() {
		for (auto i : written) data[i] = 0;
		written.clear();
	}
};
```

これなら3分で書けますね !
計算量からlogが落ちるので銀行コンEの例では遅延セグ木を使ったときと比べて206ms->33msの高速化にもなりました。

## kクリア(1)

ところでちょっと工夫すると0クリアに限らず一般の$k$クリアの操作も簡単に実装できます。
配列の要素の値域に含まれない値を一つ$e$ととります。(そんなものがなければ半群をモノイドにする要領で要素にboolフラグを足して無理やり作ってください)

 - dataの初期値は$e$にします
 - $k$クリアの時には先ほどと同様の手順で書き込まれた所全てを$e$に変えます(そして$k$をどっかに保存します)
 - 一点取得の際はdata[i]が$e$なら最後に$k$クリアされたときの$k$(まだされてなければ配列の初期値にしたいもの)を返し、そうでなければdata[i]をそのまま返します
 - 一点代入の際は普通にdata[i]に代入します(iは例のvectorに入れておきます)

例えば非負整数を扱う配列(初期値0)とすると$e=-1$ととれて実装は以下のようになります。

```c++
class AllAssignableArray {
	std::vector<int> data;
	std::vector<int> written;
	int last_k = 0; // この0は配列の初期値の0
public :
	int n;
	AllAssignableArray (int n) : data(n, -1), n(n) {}
	int operator [] (int i) { return data[i] == -1 ? last_k : data[i]; }
	void assign(int i, int val) { data[i] = val; written.push_back(i); }
	void assign_all(int k) {
		for (auto i : written) data[i] = -1;
		written.clear();
		last_k = k;
	}
};
```

## kクリア(2)
これについて考えていたら$k$クリアをサポートする別の方法を思いついたので乗っけておきます。
こちらは$k$クリアしたときにのみ1進む「時間」を定義し、各要素について最後に一点代入された値(data)と時間(updated_time)を持っておきます
一点取得の際にその要素のupdated_timeが今の時間より前だったら、最後に一点代入された後に$k$クリアされているので最後の$k$クリアの$k$を返します。
そうでなければdataの方を返します。

```c++
class AllAssignableArray {
	std::vector<int> data;
	std::vector<int> updated_time;
	int time = 0;
	int last_k = 0; // この0は配列の初期値
public :
	AllAssignableArray (int n) : data(n), updated_time(n) {}
	void assign(int i, int val) { data[i] = val; updated_time[i] = time; }
	int operator [] (int i) { return updated_time[i] < time ? last_k : data[i]; }
	void assign_all(int k) { time++; last_k = k; }
};
```

## まとめ
どれも冷静に考察すれば思いつくことができそうですが、コンテスト中は案外「これは遅延セグ木で解ける !」の方に脳死で飛びつきがちです
これを知って実装時間を省略 !
cssだけでうんち書いてみた

# 💩世界はうんちで満ちている💩
大人が1日に排せつするうんちの量は平均して400～500g、これは1年で換算すると142kgに相当します。142kgという重さはパンダ1頭分だそうです。
![大人の💩](https://i.gzn.jp/img/2018/03/22/poop-lifetime/002_m.png)

地球上の人間が1年で排せつするうんちの量は、約2900億kgに相当するとのこと。
![地球の💩](https://i.gzn.jp/img/2018/03/22/poop-lifetime/005_m.png)

これだけ世界を満たしている💩！
こりゃcssだけで書く需要ありそうです！💩💩💩

# 💩cssだけで書く💩
といってもhtmlも使わないといけない。
でも、それでも、極力使わない方法で書いてみたぞ！💩💩💩

<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="petapetapeta" data-slug-hash="JjoRyaX" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="unchi">
  <span>See the Pen <a href="https://codepen.io/petapetapeta/pen/JjoRyaX">
  unchi</a> by petapetapeta (<a href="https://codepen.io/petapetapeta">@petapetapeta</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

ちょっと僕の形（アイコン画像）からは遠のいてしまった。
だがしかし、ある程度似ているはずだから許してもらいたい。
ポイントは、`background-image`の`radial-gradient()`でゴリ押ししていくことだ！
`background-size`と`background-position`も併用してゴリ押しする！
`before` `after`の疑似要素を使って目と口を添えてやれば、立派なうんちの出来上がりだ！💩💩💩

# 💩参考💩
[人は一生でどのくらいのうんちをするのか？をイラストで解説するとこうなる](https://gigazine.net/news/20180322-poop-lifetime/)
RxJavaで連続してAPIを叩いた時に発生したエラーのハンドリング

RxJavaで連続してAPIを叩いた時に発生したエラー、独自の形式にすることで処理を切り分けたいと思ったこと、ありませんか？僕はあります(そもそもAPIのエラーで判別したいけど、実装がアレだったもんで)。

## NGパターン

チェインの途中で`doOnError`を挟んでエラーをthrowしたけど、止まらずその後の`flatMap`に流れてしまうのでダメ。

```kotlin
repo.getAuth("xxx")
    .doOnError { throw AuthError("${it.message}") }
    .flatMap { repo.getPayment(it.token) }
```

## OKパターン

`onErrorResumeNext`を使うと、エラーが発生した時に別のObservableを流せる。ここで独自のエラーを返せば、`onError`で処理を切り分けることが可能。

```kotlin
repo.getAuth("xxx")
    .onErrorResumeNext { Single.error(AuthError("${it.message}")) }
    .flatMap { repo.getPayment(it.token) }
```

## 参考
[RxJava error handling in chain API calls
](https://stackoverflow.com/questions/49643148/rxjava-error-handling-in-chain-api-calls/49644486)
【ソフトウェア開発】学習メモ / 開発プロセスまとめ

プログラミングだけでなく、ソフトウェアの開発プロセスの全体像を勉強しようと思い調べたので学習用にメモ。
書籍などを参考に、一般的な開発のプロセスについてざっくりまとめます。開発プロセスはウォーターフォールモデルを参考にします。
不足する部分も多々あると思います。

参考文献：
・[ずっと受けたかったソフトウェアエンジニアリングの新人研修](https://www.shoeisha.co.jp/book/detail/9784798157566)
・[SEの基本](https://www.amazon.co.jp/SE%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B1%B1%E7%94%B0-%E9%9A%86%E5%A4%AA/dp/4534045123)
・各種WEBサイト

目次：
開発方法
作業標準
開発プロセス
　１、要求定義
　２、要件定義
　３、システム提案
　４、設計
　　４−１、外部設計
　　４−２、内部設計
　５、プログラミング
　６、テスト
　　６−１、単体テスト
　　６−２、結合テスト
　　６−３、総合テスト

#開発方法
###ウォーターフォール型開発
最も一般的な開発手法。開発プロセスを一段階ずつ順番に終わらせていく。要件定義から始まり設計、プログラミング、テスト、運用と時系列に沿って一気通貫で進めていく。

メリット：
段階を追って開発を進めるので分かりやすい。

デメリット：
・テストで見つかった不具合が上流工程であるほど修正に手間がかかる。
・いずれかの工程が遅れると全体に影響する。

###スパイラル型開発
設計と、各工程にて実際に動く見本を作り確認するプロトタイピングを繰り返しながら進めていく。

メリット：
各工程の完成度を高めながら進めることができる。

デメリット
・フィードバックごとに問題が出た場合、各工程で時間が掛かりやすい。


###アジャイル型開発
変化する顧客の要望を取り入れながら、素早く開発するという目的のもと生み出された手法。
メンバー間でお互いどうコミュニケーションを取るかという所に重点が置かれている。

>・プロセスやツールより、個人そのものや個人間の交流を重視せよ
・広範にわたる大量の文書作成より、きっちり動くソフトウェアの作成に注力せよ
・契約に関わる交渉より、顧客と強調することに重点をおけ
・無理に計画に従うより、目の前の変化へ柔軟に対応せよ。
　　　　　　　　　　　　　　　　　　　引用：Agile Allianceのアジャイル宣言より


#作業標準
開発を進めていく上で、様々なメンバーが携わり、また途中から参加する人もいるためニュアンスの違いなどによるトラブルを避けるべく標準的な開発手法を定めておくのが一般的。

例：
・用字と用語
・工程の名称
・作成文書と記述項目
・使用するチャート記法
・コーディング規約
・レビュー実施ガイドライン
・適用する設計手法
・適用するプログラミング言語
・適用する開発プロセス
・ユーザーインタフェースガイドライン
など


#開発プロセス

##１、要求定義
顧客が自分のやりたいこと、つまり「顧客の要求」を見定める工程。
顧客の「そもそも何がしたい？」をまずは把握する。

どんな業務があり、そこにどのような問題があり、どう解決したいのかという顧客の業務の要望をヒアリングし、整理して文書化する。まずは、問題点や課題を洗い出すということが目的なので、この段階ではまだ矛盾や重複、不足があってもOK。

###機能要求
顧客の業務に必要な手順を実現するための機能。
在庫管理のためにこういう機能が欲しい、データの検索や登録、参照ができるなど実際に使用する機能のこと。
「やりたいことを実現する」機能。目に見える部分。

###非機能要求
処理速度やセキュリティといったバックグラウンドで動く機能。顧客の業務自体に直接関係ないが、システムが備えるべき機能。範囲は広く「機能要求以外は全て非機能要求」。

##２、要件定義
要求定義を基にして、顧客が開発企業の協力を得ながらシステム化すべき項目を整理する工程。
顧客の実現したいことに対し「やりたいことを実現する為に何をどう実装する？」を整理する。

この段階では、矛盾や重複、不足があってはならない。
ここで固まった内容を基に設計、開発を進めていく。

##３、システム提案
顧客にシステム開発の全体像を説明するための「システム提案書」も作成する。
要求定義でヒアリングし、要件定義で実装内容を整理したのでシステム提案書としてまとめる。
これによりシステム化により解決したい問題、機能、構成、経済性メリット、稼働時期などをユーザーに理解してもらい、発注を決定してもらう。

##４、設計

###４-１外部設計
システムが持つべき機能や性能、構成などについての設計。
どういうレイアウトか、どういう項目をどう配置するか、操作方法など。
プログラミング手法などは含まれない。

####外部設計書
システム提案書、開発計画書、要求定義署の内容を基に外部設計書を作成する。

>業務フローの作成
↓
サブシステムへの分割
↓
画面レイアウトや帳票レイアウトの作成
↓
コード設計
↓
論理データ設計（ER図、CRUD図作成）
↓
システムインターフェース設計
↓
外部設計書として取りまとめる
↓
レビュー


###４-２内部設計
外部設計書を基にプログラムの内部データを決定するなど、システムの具体的な実現方法を定義。データベース設計などが含まれる。機能設計や詳細設計と呼ぶこともある。

####内部設計書

>画面の詳細設計
↓
帳票の詳細設計
↓
外部インターフェースの詳細設計
↓
処理ロジックの詳細設計
↓
リクエスト処理の詳細設計
↓
メッセージの詳細設計
↓
物理データ設計
↓
内部設計書としてまとめる
↓
レビュー

##5、プログラミング
内部設計書の内容に沿ってプログラミングを行う。
関数、受け取るデータの数や種類、呼び出し元へ返す処理結果などは全て内部設計書の内容を基にする。

##6、テスト
###６−１　単体テスト
関数や手続きなど最小単位のプログラムを単体で動かし、内部設計書通りの動きをするか確認する。
準備：
テスト項目を作成し、それに対応するテストデータを定める。入力する値がAであればAがテストデータとなる。
####ホワイトボックステスト
内部テストとしては、ホワイトボックステストを行う。これは、プログラムの内部（制御構造、ロジック）を確認しながら進めるテスト。機能というより、システムの整合性を確認する。開発者側視点。

####ドライバとスタブ
本来は様々なプログラム同士連携して動くものであるが、単体テストでは１つの機能ごとにテストをするので仮のプログラムを用意してテストを行う。
テスト対象のプログラムを呼び出すためのプログラムをドライバ、呼び出し先として使うプログラムをスタブという。

###６−２　結合テスト
プログラムが外部設計書通りに動くか確認するテスト。単体テストが内部のロジックを見ていたのに対し、結合テストでは実際に動くかどうかの確認をする。ユーザー視点。

####ブラックボックステスト
プログラムの内容がどうかは考慮せず、あくまで入力と出力の対応が正しいかを確認する。

###６−３　総合テスト
結合テストを通ったプログラムとハードウェア、ネットワークなどを連携させて動作を確認。本番環境でのテスト。
npm install -g create-react-appでcheckPermissions が出た時の対処法

##状況

macで、udemyの動画でreactを勉強するために
```npm install -g create-react-app```
で最新版をインストールしようとしたところ、

```
npm WARN checkPermissions Missing write access to /Users/tagawahirotaka/.npm-global/lib/node_modules/create-react-app
```
と怒られた。

##解決できなかった策
[npmでpermission deniedになった時の対処法[mac]](https://qiita.com/okohs/items/ced3c3de30af1035242d)
を参考にして、pathの設定をしたりbrewでnodeをインストールしたりしても同じエラーがでた。

##解決策

エラー文に

```
npm ERR! path /Users/tagawahirotaka/.npm-global/lib/node_modules/create-react-app
```

```
enoent ENOENT: no such file or directory, access '/Users/tagawahirotaka/.npm-global/lib/node_modules/create-react-app'
```

とあったので、なんだかよく分からないが、
```/Users/tagawahirotaka/.npm-global/lib/node_modules/create-react-app```
にあった```create-react-app```を削除した。

その後、```npm install -g create-react-app```をしたら、
```/Users/tagawahirotaka/.npm-global/bin/create-react-app```
ができて無事に最新版がインストールできた。


##が、しかし

```npm start```をしたところ、

```
A template was not provided. This is likely because you're using an outdated version of create-react-app.
Please note that global installs of create-react-app are no longer supported.
```

というエラーに遭遇。

[ひさしぶりにcreate-react-appしたらテンプレートができなかった時の対処法](https://qiita.com/kijibato/items/ca74c6582141f3292240)
この記事を参考にし、
```npm uninstall -g create-react-app```
```yarn create react-app my-app```
```yarn start```
でいけた。

##が、しかし

```
There might be a problem with the project dependency tree.
It is likely not a bug in Create React App, but something you need to fix locally.
```

というエラーに遭遇。
webpackがプロジェクトフォルダーではないところにインストールされてしまっているのが原因らしいので、
```/Users/tagawahirotaka/node_modules/webpack```　を削除。
その後、```yarn start```でいけた。
Formファサードでバリデーションエラー時にCSSクラスをあてる

バリデーションエラー時に、Formファザードで作ったタグにエラー用のCSSクラスをあてる方法を調べました。

---
ルーティングと簡単なコントローラーを用意します。

```php:routes/web.php
Route::get('/form', 'FormController@index');
Route::post('/form', 'FormController@post');
```

```php:app/Http/Controllers/FormController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FormController extends Controller
{
    public function index()
    {
        $list = [
            ''  => '選択してください',
            '1' => 'ほげ',
            '2' => 'ふが',
        ];

        return view('form', compact('list'));
    }

    public function post(Request $request)
    {
        $request->flash();

        $request->validate([
            'text' => 'required',
            'id'   => 'required',
        ],[
            'text.required' => 'テキストを入力してください。',
            'id.required'   => 'リストを選択してください。',
        ]);

        return redirect('form')->with('flash_message', '送信完了しました。');
    }
}
```

テンプレートを用意します。
デフォルトのレイアウトとCSSを流用しています。

```php:resources/views/Form.blade.php
@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            @if (session('flash_message'))
            <div class="alert alert-success" role="alert">
                {{ session('flash_message') }}
            </div>
            @endif
            <div class="card">
                <div class="card-header">フォーム</div>
                <div class="card-body">
                {{Form::open(['url' => '/form'])}}
                    {{Form::token()}}
                    <div class="form-group">
                        {{Form::text('text',
                                      old('text'),
                                      $errors->has('text') ? ['class' => 'form-control is-invalid', 'placeholder' => '入力してください']
                                                           : ['class' => 'form-control', 'placeholder' => '入力してください'])}}
                        <span class="invalid-feedback" role="alert">@error('text'){{ $message }}@enderror</span>
                    </div>
                    <div class="form-group">
                        {{Form::select('id',
                                        $list,
                                        old('id'),
                                        $errors->has('id') ? ['class' => 'form-control is-invalid']
                                                           : ['class' => 'form-control']
                        )}}
                        <span class="invalid-feedback" role="alert">@error('id'){{ $message }}@enderror</span>
                    </div>
                    {{Form::submit('送信', ['class'=>'btn btn-primary'])}}
                {{Form::close()}}
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
```

三項演算子で、`$errors->has('id') ? ['class' => 'form-control is-invalid'] : ['class' => 'form-control']`のようにエラーの有無でクラスの配列引数を変えています。

バリデーションエラーがあるとこんな感じでエラーの装飾があたります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/33cb6047-2f46-f7bb-e51d-857f08d0eb95.png)
[AWS初心者向け] AWS スポットインスタンスで割安の Kaggle 計算環境を構築

## はじめに
データ分析コンペの Kaggle に参加する際、Notebook (Kernel) やラップトップを使用していましたが、モデルの学習時にリソースが足りなくなることが多くあります。単純に AWS で EC2インスタンス を立てて Jupyter を導入することもできますが、**出来るだけ低コストに使えるように AWS のスポットインスタンスで Jupyter を起動するまでの手順** について書こうと思います。

## AWS スポットインスタンスとは
スポットインスタンスはオンデマンド価格より低価格で利用できる未使用の EC2 インスタンスで、需要と供給によって利用料金が変動します。GCP でいうとプリエンティブインスタンスにあたると思います。**オンデマンドに比べて大幅に割引されます**が、いくつかの理由によりインスタンスを中断されることがあります。今回の Kaggle 計算環境のように中断されてもそこまで影響の無いワークロードに向いています。

参考：[AWS ドキュメント スポットインスタンス](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-spot-instances.html)

## 手順
早速ここから手順について説明します。

### スポットインスタンスのリクエスト
EC2のページのスポットインスタンスからスポットインスタンスのリクエストを選択します。まずどんなタスクに使用するかの選択をします。ここでは Big data workloads を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/441ecb7d-7892-65b1-c45a-0d717970843a.png)


AMI やコンピュートユニットを選択します。ここでは、既存のインスタンスタイプから r3.xlarge を選択します。様々なインスタンスタイプがあるので、[Amazon EC2 料金表 ](https://aws.amazon.com/jp/ec2/pricing/on-demand/)などを参考に決めるといいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/9c787759-626b-7c96-f03b-3c434e831073.png)

その他もろもろの設定をしてリクエストの作成をする時に割引率が提示されます。この時は**81%offの価格で利用できること**が分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/bbdb0f52-9218-e1b1-f492-f8e9d30d627f.png)

少し時間がたつとインスタンスが作成されるので、ターミナル(Macの場合)などから ssh します。インスタンスに ssh する前には、インスタンスのセキュリティグループ(ファイアウォールのようなもの)の設定が必要です。

### セキュリティグループの設定
インスタンスのセキュリティグループが下記赤枠から確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/d1df612d-34f0-2259-a54f-3b85f23d4ac9.png)

対象のセキュリティグループのインバウンドルールにクライアントのIPを設定します。
個々の環境によって異なるかと思いますが、下記のようにMy IPを選択すれば今使っている端末のグローバルIPが自動で設定されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/03c576fa-a3fc-e909-7719-3e5d0c4636f0.png)

### SSH接続する
作成したインスタンスにSSH接続します。SSH接続するためのコマンドは**接続**をクリックすると表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/3b0f3732-a851-2f29-7010-98a949117dab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184983/5572bc44-a740-547d-0715-691a4a4515bf.png)


```sh
$ chmod 400 spot-instance-key.pem 

$ ssh -i "spot-instance-key.pem" root@ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com

# SSH完了
[ec2-user@ip-xxx-xx-xx-xx ~]$
```

これでスポットインスタンスへのSSHが完了しました。 
 
ここからは各自自由にJupyterを起動するまでの手順を進めてください。  
今回自分の場合は、ローカル環境で Docker を使って環境構築して開発していたものを Github リポジトリで管理していたので、git clone をして、docker run をしました。Kaggle 公式の Docker イメージを取得するのもありです。
Dockerのインストールは[ Get Docker CE for Ubuntu ](https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-from-a-package)を参考に進めます(Ubuntuの場合)。

Kaggle 公式 Dockerイメージの pull

```sh
$ docker pull gcr.io/kaggle-images/python
```

### AMI作成
**スポットインスタンスは停止をすることができない**ため、計算が完了したら削除をしないといけません。よって、2度目以降に同じ環境を構築するためにAMIを作成しておきます。  
AMIを作成しておけば、再度スポットインスタンスを作成するときに、テンプレートとしてそのAMIを指定することで同じ環境を構築することができます。

参考：[インスタンスと AMI](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instances-and-amis.html)
Zendesk support のはじめのはじめ

この記事は、[Zendesk Support/Guide/chat/talk/Explore Advent Calendar 2019](http://adventar.org/calendars/4834)15日目の記事です！

BtoBクラウドサービスのカスタマーサポートをしている渡辺です。本NOTEは「Zendesk supportを導入した際、まず最初に何から始めるのか」について書いていきます。

```
目次
　はじめに
　1　切り替え前の運用
　2　フロー図作成
　3　フロー図完成
 最後に
```

###はじめに

カスタマーサポートで利用している顧客サポートツールを
運用の効率化を目的にメールディーラーからZendesk supportに切り替えました。

「Zendeskは機能が充実しているからできないことはなさそう」
「色々な工夫で何でも実現できそう」

ということは分かっていましたが、
どうすれば効率化された理想の運用が実現できるのか、分かりませんでした。。
そこで、どこまで理想の運用が実現できるのかを検証しました。
今回はその検証過程をまとめてみました！

### 1.切り替え前の運用

【改善したかった点】
    - 顧客情報の確認に時間がかかる。
    - 問い合わせ内容の分類が正しくされず正確なデータが取れない。

【引き続き実現したかった点】
    - 関係者が多いため、メール振り分けができる。
    - メールのステータス管理ができる。

### 2.フロー図作成

####（1）フロー図の作成

まずはじめに実現できるかは置いておいて、
理想的な運用のフロー図を作成しました。
この図を作成することによってどんな機能を活用するのか、
が明確になり、ガイドやコミュニティでの質問もしやすくなります。

![iOS の画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331955/ef930c77-ce1a-9236-88c4-0a0785ae47d1.jpeg)

この図を作成しながら、出てきた疑問が以下の4つでした。

①顧客情報を常に最新の状態にするにはどうすればよいの？
→顧客管理ツールとしてSFDCを利用していたため、SFDCとZendeskを連携したい。

②人ではなく、チームにチケットを振り分けるにはどうしたらよいの？
→複数のチームに分かれて顧客対応をしていたため、問い合わせを個人ではなく、各チームに振り分けたい。

③メールのステータス管理はカスタムできないの？
→メールの返信時に「オープン」「保留」「解決済み」
というステータスを選択することはできるが、
何を優先的に対応すれば良いのか分かりづらくなってしまうため、
もう少し細かく、ステータス管理をしたい。

④問い合わせ分析をするために何をすればいいの？
→「めんどくさく」なく、個人の主観で分類されない、正しいデータ分析がしたい。

####（2）利用する機能を調べる！聞く！

Zendeskはガイドが充実しているため、調べれば大体のことは分かる！
ただ、はじめて利用される方は、
Zendeskユーザーコミュニティで質問する、もしくは
イベントや勉強会でどんどん質問するのがおすすめです。
「これを実現したい」に対して、様々な方法をシェアしてくださいます。


①顧客情報を常に最新の状態にするにはどうすればよいの？
SFDCに更新される情報を常にZendeskに反映し続けるには開発工数がかかると判明。
段階を追って、連携を進めることにしました。

・まずは、一番簡単な方法は、管理画面のメンバーよりCSVファイルをダウンロードし、
　既存顧客ユーザーを登録
・次に、アプリをDLし、SFDCの顧客情報を表示させる
・最後に、ZendeskとSFDCを一定期間で同期させる

②人ではなく、グループにチケットを振り分けるにはどうしたらよいの？
これはグループを作成し、メンバーを中に所属させる。
チケットの担当者にグループをアサインすることで実現できました！
また、アサインされたグループメンバーは、
自分たちに関係するチケットのみ確認することができるようになります。

③メールのステータス管理はどうやってやるの？
ステータスごとのviewを作成し、
チケット移動させることでステータス管理することができました。
（※viewへのチケット移動は手動では行えないため、
viewを移動する条件を指定する必要があります。）
こうすることで、メールチェックがしやすくなるし、対応漏れも防げそうです！

④問い合わせ分析をするために何をすればいいの？
タグとマクロ（テンプレ）を使うことで、
問い合わせの分類を自動化できるということが分かりました。
問い合わせを分類したい種類で、タグを作成する。
マクロを選択する際にタグも自動で選択されることで実現可能でした！


####（3）フロー図完成！
<img width="387" alt="フロー図.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331955/966ce378-e336-7f52-a4b6-d8f791752559.png">

###さいごに
　実際にどこまで効率化されたのかを検証して、
もっとブラッシュアップしていこうと思ってます。
また、正確なデータを蓄積して、サポートの品質向上に役立てていきたいと思います。
皆さんの知恵も借りられたら嬉しいです＞＜
GitHub Actionsを使ったECSデプロイ

## はじめに
普段はGitLab-CIを使ってECSへデプロイしてます。
今回はGitHub Actionsがどんなものなのか検証してみたいと思います。

ソースは[こちら]()

## 図説
![Github_Actions_ECS-全体構成 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27525/a800be9c-28f2-a910-e447-c4de600db429.png)

## フロー
1. リポジトリ準備
2. インフラ構築
3. GitHub Actionsの設定
4. GitHub Actions実行
5. 動作確認

## リポジトリ準備
今回は下記リポジトリを使用します。

- https://github.com/yacchin/django-app

## インフラ構築
今回は[AWS CDKを使ったAWS Fargate Serviceの構築](https://qiita.com/yacchin/items/e2c48984a3a68e77c3c5)でインフラ構築しています。

## GitHub Actionsの設定

- リポジトリのActionsを押下

![スクリーンショット 2019-12-11 23.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27525/b12bd19f-cbb0-b95e-2924-911fe91ed251.png)

- `Deploy to Amazon ECS` の `set up this workflow` を押下

![スクリーンショット 2019-12-11 23.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27525/19e3209d-ae98-5a76-13b2-712517b57b75.png)

- `aws.yml` に記載されているenvの値を書き換える。

1. ECR_REPOSITORY
2. aws-region
4. container-name
5. service
6. cluster

- 値を修正して、 `Start Commit` を押下

![スクリーンショット 2019-12-13 23.48.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27525/4dc94757-31fc-09be-f3d2-c58a1247fe9c.png)

- `Secrets`に下記環境変数を設定

<img width="1084" alt="スクリーンショット 2019-12-13 17.01.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27525/f563a6e3-c4dc-1c89-6bc2-63d9c06d2ae6.png">

## GitHub Actions実行
- masterにpushすると動作
- workflowの一覧

<img width="1440" alt="スクリーンショット 2019-12-13 16.20.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27525/035d0c0d-066e-b064-c1e3-6335aa87cfd4.png">

- workflowの詳細

<img width="1440" alt="スクリーンショット 2019-12-13 16.25.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27525/02ba8643-c869-a042-1790-2c9734963ec4.png">


## 動作確認
- ブラウザで確認、うごいとる🎉

![スクリーンショット 2019-12-11 23.18.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27525/78f1f663-0a19-3447-94e2-6463d09aaae8.png)


## まとめ
- GitLab-CIより予め枠組みが用意されているのですごい簡単に導入できました。
- ECSに限らず様々なworkflowが用意されているので使っていきたいです。

## 参考文献
- https://aws.amazon.com/jp/blogs/opensource/github-actions-aws-fargate/
Meta.parse()関連の続き

## ファイルのMeta.parse()の結果
　ファイル全体を文字列として読み込みMeta.parse()をかけると、何かのArray{Any,1}になる。

　REPLで"f(x,g(y))"などをMeta.parse()するとExprだけがかえってくるがファイルから読み込んだstringをMeta.parse()すると、Stringも混在する。さらに、Exprのargsのひとつとして、アノテーションのような情報もはいってくる。

　Stringは、ファイルの中にコメント(文字列)だけの行らしい。

　Exprのheadにはjulia言語をparseしたときの構文要素がはいってくる。関数呼出しを示す:callについてはマニュアルに書いてあったと思うが、それ以外にも代入文は:(=) つまり Symbol("=") がheadになるし、function定義だと headは:functionになる。

　ちなみに、w=Meta.parse(...)し、REPLで

```julia
julia> w
```

　とした場合と、w.head, w.argsで見た場合、あるいはdump(w)した場合、それぞれ表現が違うので確かめながら見ていく必要がある。単に w<enter>でみると、一番シンブルな表示になるのだろう。

　dump()でみると Exprでなく、LineNumberNodeというものがargsに含まれるようになる。これはExprではないのでheadを持たない。ファイルの何行目なのかを示すような情報。
  REPLでみると

```julia
julia> pt[4].args[2].args[1]
:(#= none:15 =#)

julia> dump(pt[4].args[2].args[1])
LineNumberNode
  line: Int64 15
  file: Symbol none
```

というような表示になる。
LineNUmberNodeのhelpをみると、

```julia
  struct LineNumberNode <: Any

  Fields
  ≡≡≡≡≡≡≡≡

  line :: Int64
  file :: Any
```

となっている。


## 関数定義の呼び出される関数を再帰的に処理するときの制御

余計なことをひとつ。
Exprの構造を再帰的にたどって処理するときの典型的なmethodの引数の型は次のようになるだろう。

 1) Expr
 2) Array
 3) otherwise(Any)

Exprのmethodの中では、headの値によって場合わけをするようになるが、Arrayについては、その要素ひとつひとつに同じ名前のmethodを呼び出すような作りになるはずだ。
headの中に、:callがあったら、関数呼出しだと判定してargs[1]を関数名とみなす。
Juliaの予約語については、それぞれで処理がかわる。
otherwiseは、LineNumberNodeなどのExprでもArrayでもないものにたいする処理になる。
VisualStudioでAtCoderのプログラムを書くために準備したこと

AtcoderでPython使って問題とくときにした準備作業のメモ書き。

## 環境

MacOS

## Visual Studio Codeの設定

VisualStudioCodeの拡張機能【Coder Runner】の追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230829/f182adf4-11ad-3623-f176-4deb24cb91e4.png)

コマンド「⌘ + ,」で設定を開き、以下２つを設定

clearPreviousOutputをONにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230829/c12a2294-f05a-23e6-8a5e-d97eaa747858.png)

runInTerminalをONにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230829/39670cbb-d1e9-3d6b-9034-d2c2f65d07a9.png)

Python３の実行コマンドに変換

```json:settings.json
    "code-runner.executorMap": {
        "python": "python3 -u",
    }
```

↓　変更後のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230829/ad273a9d-37cb-12a9-94e7-28fe6c07e3ab.png)

右上の矢印でPythonのプログラムを実行する
（設定しないと入力ができない）

![スクリーンショット 2019-12-03 22.50.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230829/eb73f078-b25c-adcc-906c-9ad43d90a087.png)

## ショートカットキーを覚える

**Option ＋　Control　＋　N**　が実行コマンド

▼　探し方
Commnad + Shift + P　でコマンドパレット表示
Runと入力すると、CodeRunnderのコード実行コマンドが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230829/512f339e-c131-54d6-95a3-cde2e6bd6955.png)
BitVisor on VirtualBox チャレンジ (AMD編)

Intelプロセッサについては以下の記事があります:
https://qiita.com/mmi/items/27ef3d2b3de64d0170a3

今回はAMDプロセッサで試します。

# つかうもの

* AMD Athlon 5350
* Microsoft Windows 10 バージョン1909
* Oracle VirtualBox 6.1.0
* https://qiita.com/hdk_2/items/628067fb886c7f8238d1 で使用したBitVisorとFreeDOSが入ったUSBメモリーをディスクイメージファイルに変換したもの

# 結果

![VirtualBox_DOS_15_12_2019_09_07_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103733/8deba20c-7585-d822-f039-1dd9bddc2764.png)

おっと、DOS用の仮想マシンを作成した場合、デフォルトではRAMが32MBしか割り当てられていないのでした。256MBに増やします。

![VirtualBox_DOS_15_12_2019_09_11_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103733/14b58fae-69eb-5de9-74d6-921f46f37d9d.png)

おっと、DOS用の仮想マシンの設定では、AMD64が有効になっていないのでした。設定を64bitのunknownオペレーティングシステムに変更します。

![VirtualBox_DOS_15_12_2019_09_13_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103733/35bbe5f6-1395-dca6-b8c0-35a01439094a.png)

おっと、デフォルトではネステッドVT-x/AMD-Vが有効化されていないのでした。有効にします。

![VirtualBox_DOS_15_12_2019_09_22_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103733/29ef89be-c029-3a5a-7945-6fde5d45bee2.png)
![VirtualBox_DOS_15_12_2019_09_14_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103733/b7806845-8abe-f422-f72e-aad9c4e438ef.png)
(´・ω・`)

```shell
$ objdump -m i386:x86-64 -S bitvisor.elf|sed -n '/^4012bd95/{N;p;q}'
objdump: warning: bitvisor.elf: corrupt GNU_PROPERTY_TYPE (5) size: 0x10
4012bd95:       0f 30                   wrmsr  
        asm_wrmsr64 (MSR_AMD_VM_CR, tmp);
```
MSR_AMD_VM_CRへの書き込みということは、ずいぶん最初のほうです。うーん。とりあえず、CPU 1個だとやらなくてもいいので、スキップしましょう。

![VirtualBox_DOS_15_12_2019_09_48_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103733/b132e748-c5ec-12a2-9e68-747b02fb3c3a.png)

DJGPPでこれをコンパイルして実行して、修正版を作成し、それを使って起動します。

![VirtualBox_DOS_15_12_2019_09_46_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103733/0162b55c-1a3d-db33-e90b-f13300f663fa.png)
![VirtualBox_DOS_15_12_2019_09_47_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103733/9aa9bf0b-e904-1559-5334-5f560867ae08.png)

動きました! なぜかここでキーがきかなかったのですが、今回はここまでにします。
React エラー集（随時更新)

# Refusing to install package with name
package.jsonのnameとnpm installしようとしているパッケージ名が被っているときにでるエラー。
`解決策` package.jsonのnameを変更する。

# prettierいれてるのにeslintrc未設定なのは豚に真珠
```
pm install eslint eslint-config-prettier eslint-plugin-prettier -D
```
これらのツールをいれるとprettierがやったことにeslintは口を出さなくなる（警告しなくなる！)
[https://qiita.com/soarflat/items/06377f3b96964964a65d](https://qiita.com/soarflat/items/06377f3b96964964a65d)
知らずに悪戦苦闘しながらルール追加していた（約2日間）

# eslint: cannot find module 'prettier' require stack.
prettierがローカルに入ってないと怒られます。

```
npm install --save-dev prettier
```



#  [eslint] is not defined

```terminal:.eslintrc.js
"env": {
  node: true,
  commonjs: true,
  browser: true,
  es6: true
}
```

# [eslint]  eslint-disable react/prop-types
警告を消す

```terminal:.eslintrc.js
rules: {
  "react/prop-types": 0
}
```
serverless-cloudform の紹介

# この記事は

[Opt Technologies Advent Calendar 2019](https://qiita.com/advent-calendar/2019/opt-technologies) の 12日目の記事です。（遅れて投稿）

# serverless-cloudform とは

[gcchaan/serverless-cloudform](https://github.com/gcchaan/serverless-cloudform) は [ServerlessFramework](https://serverless.com/)(以下SLS) のプラグインです。
利用用途は [bright/cloudform](https://github.com/bright/cloudform) で SLS の CloudFormation(以下CFn) テンプレートを定義することです。
メリットには serverless.yml から CFn テンプレートを分離できること、cloudform を利用できることなどがあります。

### cloudform とは

cloudform は TypeScript によって CFn テンプレートの定義を可能にするパッケージです。
後発の AWS CDK では 抽象化や diff、deploy コマンドがありますが、cloudform は素直に TypeScript で記述した内容を CFn テンプレートにビルドするのみです。

### serverless-framework の利用シーン

私ごとですが今年は簡単なピアボーナスアプリと広告配信サービスを作りました。
両者とも Slack をインターフェースにしているツールなので Lambda がちょうどよかったです。
このようなちょっとした API の開発の際に SLS は便利ですね。もちろん AWS SAM や chalice もよいですが、SLS も AWS の機能アップデートへの追従も早く、プラグインが充実していて、自力での拡張も簡単で気に入っています。

ところで、ちょっとした API の開発では Lambda と連携して S3 や DynamoDB などを使いたくなることも多いです。かつそのリソースも SLS で一緒に管理できると便利な時もあります。もちろん複数サービスから利用されるリソースであるとか、S3 や DB、Cognito は別途 CDK などで独立して管理したいところですが、そこまでしなくてもよい場合では serverless.yml の Resouces に書くかなと思います。
serverless-cloudform では SLS の package 時に ユーザーが定義した ts ファイルを直接 CFn テンプレートとしてマージします。
cloudform を使うことで、シンタックスのミスに気づきにくいようなこともなく、属性や値が型によって安全に記述できますし、ステージによって条件分岐するとか、アプリケーションコードと同じ設定値の変数を使うとか、ファイルを分けることも比較的簡単にできるのでとても便利です。


# serverless-cloudform を使った例

詳細の使い方は説明するようなものでもないため割愛します。
代わりにといってはなんですが参考用にサンプルコードを作成しました。
serverless-dynamodb-local にも対応しています!

### gcchaan-sandbox/counter-app

いわゆるカウンターです。
[gcchaan-sandbox/counter-app](https://github.com/gcchaan-sandbox/counter-app)

### gcchaan-sandbox/lambda-api-serverless

作業中のリポジトリですが、[lambda-api](https://github.com/jeremydaly/lambda-api) を使った CRUD のコードもあります。
[gcchaan-sandbox/lambda-api-serverless](https://github.com/gcchaan-sandbox/lambda-api-serverless)

# おわりに
Serverless の開発を盛り上げたいです！
この記事がどなたかの参考になりましたら幸いです
MacでDockerを使ってubuntu環境を構築する

## 動作環境

Mac OS Catalina 10.15.1

## 概要

Mac上でROSを動かしたいと思い、公式を確認したところサポートされてるのがubuntu上だけだったので、Dockerを使ってubuntuを入れた後、その中でROSを動かしたいと思ったのでその実行手順をまとめておこうと思う。rosを入れる手順は別の記事でまとめようと思う。今回はmacのdocker上でubuntuを入れるまでをまとめる。

## まずはDockerをインストールする

とりあえず、MacにDockerをインストールする

https://hub.docker.com/editions/community/docker-ce-desktop-mac

公式サイトでまずは自分のアカウントを作ってログインする


<img width="1266" alt="スクリーンショット 2019-12-14 16.18.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537540/89474ace-2505-00af-5544-1dd6a3d85e9f.png">


そして右上のGet Dockerからインストールできる


この時、ターミナル上で以下のコマンドでちゃんとインストールされたか確認できる

```
docker version
```

この時、macのアプリケーションフォルダに入ってるDockerをクリックして起動させてないといけないらしく、参考にした記事には載ってなかったのでこちらには載せておく

## ubuntuを入れる

これでDockerは入ったのでubuntuを入れていく
まずはdockerhubからubuntuイメージを引っ張ってくる

```
docker pull ubuntu:18.04
```

今回はubuntu 18.04を入れる

https://hub.docker.com/_/ubuntu/

こちらのdockerhubの方でpull可能なubuntuのバージョンは載ってるので好きなのを入れよう

```
docker images
```

これで引っ張ってきたイメージを確認する

表示される一覧にubuntu18.04があればきちんとpullできている




## ubuntuが入ったら



まずはubuntuの起動をする

下記のコマンドでubuntuコンテナを立ち上げる

```
docker run -it -d --name ubuntu ubuntu:18.04
```
--nameの後はコンテナに名前をつけてるだけなので任意の名前を勝手につけても行ける



正しく起動されてるか確認する

```
docker ps
```

コンテナ名はubuntuなので、正しく起動されてたら表示一覧に出てくる

もし、出てこない場合は

```
docker ps -a
```

上記のコマンドを実行して一覧に表示されるか確認する
もしubuntuがない場合はコンテナが正しく作れてないのでコンテナを立ち上げるとこからやり直す


起動したらそのコンテナに入る

```
docker exec -it ubuntu /bin/bash
```

これでコンテナ内に入れたので、これからはこのubuntu環境で開発を行える

抜けたい時は

```
exit
```

上記のコマンドでubuntu環境を抜けて、macの環境に戻ってこれる

コンテナを抜けたらちゃんとコンテナを停止させておく

```
docker stop ubuntu
```

コンテナに再度入りたい場合は

```
docker start ubuntu
docker exec -it ubuntu /bin/bash
```

これで入れる


停止と再起動はどちらもコンテナから抜けてからやる必要があるので注意が必要
コンテナから抜ける時は上記と同じ

## ubuntu環境ができてからの初期設定

ubuntu環境を構築してからの初期設定をする
前回同様、下記のコマンドでコンテナに入る

```
docker start ubuntu
docker exec -it ubuntu /bin/bash
```

APT(パッケージ管理ソフト)は最初から入ってるが、念のため最新版にしとく

```
apt-get update
```

次にユーザの設定をする

これでユーザを追加する

```
adduser user_name
```

user_nameには自分の好きな名前を入れよう

```
gpasswd -a user_name sudo
```

これでubuntu内でユーザーが追加された


これで一通りできたわけだが、例えばubuntu内でpythonのコードを書いて実行するには
ファイルの読み書きができないといけないが、docker内で処理されるので、macに入れてるテキストエディタは使えない

ということでubuntuにvimを入れておいた

```
sudo apt-get install vim
```

これでvimをインストールできた

どうせ使うのでgitも入れとこう

```
sudo apt-get install git
```

初期設定もしておく

```
git config --global user.name [任意のユーザ名]
git config --global user.email [任意のユーザ名]
```



ちなみに、最近知ったのですが、vscodeでdockerのコンテナ内のファイルをいじる方法があるみたいなので、置いておきます。
結論からいうと、vscodeの拡張機能を入れるだけです。以下の名前のプラグインを入れてみてください。

Remote-Container

dockerをGUIで操作したり、dockerのコンテナ内のファイルをvscodeでいじれるようになります。




## 参考文献


Dockerをインストールした時に参考にさせていただいた
https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

ubuntu入れる時に参考にさせていただいた
https://weblabo.oscasierra.net/docker-ubuntu1604/

ユーザーを追加する時に参考にさせていただいた
https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa

vim入れる時参考にさせていただいた
https://qiita.com/YumaInaura/items/3432cc3f8a8553e05a6e
Pythonのリリースサイクルが早くなる！

##はじめに

Pythonの生みの親である[Guido van Rossum](https://en.wikipedia.org/wiki/Guido_van_Rossum) さんが6年半務めたDropbox社を辞めるというニュースが入ってきたのがちょうど一ヶ月半くらい前。転職するわけではなくこのまま引退されるという。御年63歳。長きに渡りお疲れさまでした。既に一年以上前にPythonのBDFL(*Benevolent Dictator For Life*: 優しい終身の独裁者)の座を降りていて、Pythonの開発に大きな影響はないですが、ちょっと寂しですね。

彼がPythonを作り始めたのが 1989年12月で、ちょうど30年前になります。クリスマス休暇で趣味のプログラミングをしたかった彼はインタープリタ言語を作ろうと思いたち、それが今のPythonとなったわけですね。

1991年に0.9.0として出されたPythonもバージョンを重ね、2000年に2.0、2008年に3.0が出て、Python2とPython3は並行して開発が進みながら、現時点で2.7.17と3.8.0まで来ています。Python2は今年一杯でサポートが終了するので今後はPython3のみがメンテナンス・バージョンアップされていくことになります。ところが、このリリースのサイクルが変わる！という話が出てきたのでそれについてちょっと書いてみます。

元ネタは[PEP 602 -- Annual Release Cycle for Python](https://www.python.org/dev/peps/pep-0602/)というPEP(Python Enhancement Proposal)です。

##これまでのリリースサイクル

リリース間隔が安定してきた3.1.0以降を書き出してみるとこうなります。

| Version | Release Date |
| ------- | ------------ |
| 3.1     | 2009-06-27   |
| 3.2     | 2011-02-20   |
| 3.3     | 2012-09-29   |
| 3.4     | 2014-03-16   |
| 3.5     | 2015-09-13   |
| 3.6     | 2016-12-23   |
| 3.7     | 2018-06-27   |
| 3.8     | 2019-10-14   |

多少前後しているところはありますが、パッと見るとだいたい1年半くらいの周期でリリースされているように見えます。そして、あるバージョンの開発はその前のバージョンのβが出た時に始まっているので、全体として開発開始から2年近くかかっている。これはちょっと長すぎる、ということで新しいリリースサイクルの提案が出されて採用されています。

##新しいリリースサイクル

まず、今回のリリースサイクルの目玉は「**毎年**Pythonの新しいバージョンを出す」です。これまで1年半周期だったものを1年周期にして毎年10月に新しいバージョンを出す。そのために、こんな感じのスケジューリングになっています。

| フェーズ | 期間                                   |
| -------- | -------------------------------------- |
| 開発     | 5ヶ月（前のβ・RC期間とオーバーラップ） |
| α版      | 7ヶ月                                  |
| β版      | 3ヶ月                                  |
| RC版     | 2ヶ月                                  |

開発は前のバージョンと重なっていて、α＋β＋RCの期間がちょうど12ヶ月なので毎年出せるというわけです。つまりは、前のバージョンの正式版が出たらすぐに次のバージョンのαが出る！ これまでは前のリリースからαまで半年以上あったので、これ結構すごいことですね。

わかりにくいかもしれないので図にするとこうなります。
![スクリーンショット 2019-12-15 9.22.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30342/175cdd19-0b92-1526-02c6-c5c33d92b8bb.png)

そして、リリース後のサポート期間も明確に決められてこのようになります。

* リリースから18ヶ月（1年半）はバグ修正を行い2ヶ月に一度のペースでマイナーバージョンアップを行う。Windows、Macに対するバイナリリリース有り。
* その先、42ヶ月（3年半）は必要に応じてセキュリティフィックスを行う。ソースコードリリースのみ。
* リリースから5年でサポート終了。

##Python3.9はこうなる

Python 3.9のスケジュールは [PEP-596](https://www.python.org/dev/peps/pep-0596/) で既に決まっていてこのようになっています。

3.9 開発開始: 2019-06-04 (完了)
3.9.0 alpha 1: 2019-11-19 (完了)
3.9.0 alpha 2: 2019-12-16
3.9.0 alpha 3: 2020-01-14
3.9.0 alpha 4: 2020-02-17
3.9.0 alpha 5: 2020-03-16
3.9.0 alpha 6: 2020-04-13
3.9.0 beta 1: 2020-05-18 (これ以降は新機能の追加なし)
3.9.0 beta 2: 2020-06-08
3.9.0 beta 3: 2020-06-29
3.9.0 beta 4: 2020-07-20
3.9.0 candidate 1: 2020-08-10
3.9.0 candidate 2: 2020-09-14
3.9.0 final: 2020-10-05

見ての通り、最初のα版は既にもう出ています。そして、これまでα版は4つまでしかなかったのが6つになっていて開発期間の短縮をそれで補っているようです。アルファ版としてリリースして使ってもらいながら徐々に機能追加する、いわばアジャイル的なアプローチになったのも良い変化ではないかと思います。

##まとめ

Python 3.9から導入される新しいリリースサイクルに関してまとめてみました。サイクルが短くなり、新たな機能がタイムリーに使えるようになるので良かったなと思います。
npm エラー集（随時更新）

#err missing required by
必要な依存パッケージをすべてインストールする。

```
npm ci
```

#err missing required by
```
npm install --no-optional
```

#npm ERR! code EJSONPARSE
`npm cache clean'　だめ
`npm cache verify' だめ
`rm -f package-lock.json && npm install'　だめ
jsonファイルがのシンタックスが原因でした! (errに書いてありました！ ）
#Nutanix で実現するハイブリッドクラウドな世界～その３

**本記事は[Nutanix Advent Calendar 2019 #4](https://adventar.org/calendars/4475) 12/15 分の記事です。**

前回はNutanix Clustersの特徴を
他のサービスと比較してご紹介しました。
今回は実際のユースケースを考えてみたいと思います。

なお、今回も予めのお断りですが、
正式なマーケティングメッセージではなく、
個人的に想定するシーンという非公式な
記事である点はご了承ください。

# [シーン1]パブリッククラウド利用のトライアル
パブリッククラウドを止める顧客も
実際一定数は存在します。
それはパブリッククラウドだけですべての要件を満たす、
というわけではないからです。

どんな要件もすべて満たす万能なものは
もちろん世の中に存在しないわけで、
現実的には要件に応じて使い分けていきます。
しかしながら、要件に合致するのかは、試してみないと、
という面も少なからずあるでしょう。

試すということになった場合に、多くのケースでは、
アプリケーションがオンプレミス向けに構築されており、
クラウド化の検討を行うインフラ担当者では
必ずしもタッチできる話であるとは限りません。
今までと異なる仕掛けになることに、
アプリケーションの担当者から強い抵抗を受ける可能性もあります。

そういったシーンでは、Nutanix Clustersを活用することで、
アプリケーション側を改修することなく、
オンプレミス側にあった仮想マシンたちを引っ越しし、
評価してみることが可能です。
そして、ダメならまたオンプレミスに戻してくることが可能です。

特にクラウド化してみてわかる重要なアンマッチポイントに、
ネットワークの遅延があるわけですが、
この辺りも実際に評価して試してもらうことで、
業務環境がクラウド化されて問題がないか、
変換もなく、戻せて、操作はオンプレと同じという、
低いハードルの環境下で試すことができます。

これであれば、アプリケーションの担当者にも
大きな反発を受けることなく、トライアルが
進めるのではないでしょうか。


# [シーン2]一時的な開発環境として
Nutanix Clustersでは、クラスタを停止することによって、
コンピュートリソースを止め、
課金を抑えることができることは、前回解説しました。
つまり一時的なクラスタの構築ができ、
それを安価に保持することができることになります。

これをうまく活用すれば、
オンプレミスで構築する本番環境に対して、
アプリケーションの保全（保守）環境を
Nutanix Clustersで構築することで、
必要な時だけ立ち上げ、保守が終われば落とすことで、
投資を最小限に抑えることが可能となります。

EC2のインスタンスでやらない理由は、
一時的にオンプレミスに持ってくるなどの
柔軟な対応も可能となり、
システム開発に柔軟性を持たせることができるためです。
ハイブリッドクラウドならではの、
非常に面白い使い方なのではないかと思います。


# [シーン3]オンプレ環境調達までのリードタイムを埋める利用
Nutanix Clustersはセルフサービス型で、
いつでも簡単に構築ができます。
（詳細なライセンス等の提供方法は別途GA時のアナウンスをお待ちください）
これをうまく活用すると、NutanixのHCIクラスタを
1時間以内に構築して利用可能になります。

例えばアプリケーション開発で要件の定義がずれ込んで、
ハードウェアの発注が遅れたが、
アプリケーションの開発の都合で今すぐ使える
環境を作りたい場合には、
Nutanix Clustersを活用して今すぐに
リソースを提供して開発を続行し、
後日ハードウェアが届いたタイミングで移行し、
リリースするというやり方も可能になります。

こういう要件定義遅れというのはあまりあってほしくないですが、
可能性として存在する事象なので、
取りうる方策として持っておくと、
PMとしてはリスク回避の新たな手段にできるのではないでしょうか。

# [シーン4]環境依存リスクのないハイブリッド・マルチ環境構築
こちらはシーン１の延長であり、
[Nutanix で実現するハイブリッドクラウドな世界～その１](https://qiita.com/hiroito1118/items/9bd291f2fc5ec7e11b76)
でもご紹介しましたが、
特定のプラットフォームに依存しない仕掛けづくりを、
Nutanix Clustersで実現します。

結局のところ、オンプレミスであっても、
AWSや他のクラウドであっても、
NutanixのEnterprise Cloud OSの技術（AOS&AHV）を被せてしまうことで、
技術的にプラットフォーム環境とは疎結合となり、
変換などなしに、行ったり来たりをすることができる
環境依存リスクをヘッジしたプラットフォーム環境を実現します。

これにより、特定のクラウドによる問題が発生したときに、
他の環境を利用してサービスを再開するということを可能にします。
サプライチェーンのリスクと同じですね。
特定のプラットフォームベンダーに自社のビジネスの生殺与奪を
握られないという重要なBCPの検討項目に対応します。

今後はわかりませんが、
Nutanix Clustersが複数のパブリッククラウドに対応してこれば、
最終的にハイブリッドクラウド・マルチクラウドの
双方に対応した仕掛けづくりが可能になるでしょう。


# 一考の必要がある利用シーン：DR
DRについては、利用を一考する必要があります。
確かに利用していない間、コンピュートの課金が止められる点で、
Nutanix ClustersをDRに利用できれば非常に魅力的な選択肢となります。
しかしながら、DRの実現にはデータをDR側でも受け取る仕組みが
稼働しなければなりません。
Nutanix Clustersの一時停止機能はクラスタ全体を止めてしまう為、
完全停止をしてしまうと、データが受け取れずDRの意図を満たしません。

一方で、止めなければよいので、
例えば、３Nodeクラスタで運用しておき、
DR発動時に拡張することで、本格展開をするなど、
DRサイトの小規模化というシーンには十分に活用可能です。

この際気になるのはコストですが、
AWSのコストエクスプローラーで翌日には利用状況を確認できますので、
使い過ぎてないかコスト管理をしながらDR環境を
運用していくことが可能です。


ということで、今回までNutanix Clustersについての
ご紹介を投稿しました。
より詳細な情報は正式リリースを待って、
改めてご紹介できればと思います。

今回の投稿は以上です。
可変長引数

個人的な勉強のためまとめました

##可変長引数

・引数の数を自由に変更できる引数
・**引数の型の直後**に**ピリオドを３つ**「**...**」つけて宣言
・理論上は引数をいくつでも渡しても呼び出すことができる
・渡された複数の値は、JVMによって配列に置き換えられる。そのため、値を使うときは配列と同じように「**[]**」を使う

###２つの注意点

①同じ型の数が可変な引数をまとめられるだけで、**異なる型はまとめられない**
②可変長引数以外の引数を受け取る必要がある場合、可変長引数は**最後**の引数にすること

①は、可変長引数が配列に置き換えられていることを考えれば当然
②は、例えば次のようなメソッドの宣言では、どこまでが第一引数で、どこからが第二引数かわからず、コンパイルエラーになる

例）可変長引数を最初に記述したメソッド(コンパイルエラー)

```sample.java
void sample(int... num,int value) {
	//do something
}
```

次のように順番を入れ替えるとコンパイルエラーが発生しない

例）可変長引数を最後に記述したメソッド

```sample.java
void sample(int value,int... num) {
	//do something
}
```
分散自律知性ネットワークを作ってみた

これは[SecHack365 修了生 Advent Calendar 2019](https://adventar.org/calendars/4046)の15日目の記事です。

# TL;DR
:o:分散
:o:自律
:question:知性
:o:ネットワーク

#動機
**人間、脳が死んだら死ぬのやばくないですか？**

[公正的戦闘規範](https://www.amazon.co.jp/dp/4150312907)の第二内戦の「ライブラ」とか、ネタバレになっちゃうけど[これ](https://www.amazon.co.jp/dp/B07GQTL3Y9)の敵とか、スタンド・アローン・コンプレックスみたいな、各ノードが分散して自律的に思考した結果全体として知性を持つように見えるやつ、かっこよくないですか？

植物みたいに各細胞が各々の役割を果たせば生きられる、コアのないネットワークこそ至高。
つまり、分散知性ネットワークの代表例である[植物が知性を持っている](https://www.amazon.co.jp/dp/4140816910/)ように、コアが無くても各ノードがそれぞれ演算をすればそのネットワークは知性を持つはずで、それをコンピュータ上に再現出来たらかっこよくないですか？

### 人間
最初に人間をdisってしまったけど、人間(動物)も脳の中は分散ネットワークになっていて（ref: [意識はいつ生まれるのか](https://www.amazon.co.jp/dp/4750514500)）、その結果複雑性が生まれて人間には知性（意識？）があるともいえるらしい。
でも人間の体は脳だけじゃ働かないので、その点マクロに見ると分散していないコア有システムだと思ふ。

# 実装
分散を再現するには並列で思考するノードがあれば良さそう[要出典]。並列と言えば…Go言語かな[要出典]。
ソースはこちら→https://github.com/sudnonk/collective_intelligence

ノードの持つ情報と、思考体系は下図の通りで、だいぶシンプルかつ各ノードで完結しています。
#### ノードとパスが持つ情報
![cell_info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71557/b754c7f1-57d6-d716-8f37-236fd4aa4230.png)
#### ノードの思考フロー
![cell_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71557/c62c4e79-e324-fc1c-b67b-4aab87fc4377.png)

#### パスの思考フロー
1. 道幅を超えた容量の資源が入ってきたら、広げて欲しさを増やす
2. 広げてもらえたら、広げて欲しさをリセットする


あとは

- すでにノードがある場所にノードは置けない`World.canPut()`
- ノード同士はある程度離れていけないといけない`config.MinDist`
- 新しいノードの場所はパスの間隔が開いているところ`Paths.GetWidest()`
- 新しいノードは生成元ノードの性格から±10%の範囲で変動した性格になる`Persona.calcMutation()`

とかの処理を書きましたが、端折ります。
場所はXY座標で保存し、ノードの場所の管理は世界のサイズ分の行列を`gonum/mat`で用意してそこにフラグを立てることで実現しました。

あとは、nステップの間各ノードの思考関数を`goroutine`で並列に実行すればやりたかったことができます。

## 可視化
時間ごとに円グラフが動く図を作れたらエモいなと思ったのでそうしました。
最初は[github.com/ajstarks/svgo](https://github.com/ajstarks/svgo)を使ってGo言語側で可視化処理をしていたのですが、マウスオーバーで各ノードの状態が見れた方がエモくない？って思ったのでJSONに吐き出してブラウザでJavaScriptで見られるようにすることにしました。

# 結果
というわけで、ブラウザ上でインタラクティブにブラウズできるようにしたので皆さんも見てください。
https://sudnonk.net/ci/

GIFアニメにしてみたのがこれです。（`![]()`を使うとnot foundになる…？のでimgurへのリンクです。）
ちゃんと自律的にノードを増殖させていることがわかります。
[gif @ imgur](https://imgur.com/a/U8kivYc)

# 結果2
でもなんか成長しきっちゃうと動きがなくてつまらないですね。適当にランダムでダメージを与えてみることにしました。
具体的には、ランダムに選んだ点から±5ぐらいの範囲にあるノードに最大体力の半分のダメージを与えます。

こちらもブラウザで見られます
https://sudnonk.net/ci2/

GIFアニメにしたのがこれです。黄色い範囲のノードにダメージが入ります。（GIFアニメの容量が大きいのでWifi環境推奨）
[gif @ imgur](https://imgur.com/yDStM8t)

ちゃんとダメージが入ったノードに資源が移動したり、新しいノードが作られたりしていて見ていて面白くなりました。
爆撃で空いた空間に周りのノードが一気に新しいノードを作っているので、一部密度がヤバいことになってますね。あるステップで生成されたノードの情報は次のステップにならないと共有されないので、ノード間の距離制約が機能してないっぽい。

# 今後
- 近くにノードがあればそことの間に道を作る関数を書いたのですが、動いてないっぽいので修正したい。
- 道を作るコストを定数じゃなくて長さと比例させたい。
- 爆撃の代わりに陣営を2つ作って、近くの対立陣営を攻撃する、みたいな動きも格好良さそうなので実装したい。
- 意識と知性は何が違うんだろう…

#結論
自分たちで勝手に動いてネットワーク形成してるの、かっこいい～～

でも知性ではないような気がする…どうやったら知性を持たせられるんだろう（神の領域）
遺伝的アルゴリズムとか強化学習とかでノードの思考フローも勝手に成長するようになれば知性があるのでしょうか。そこまでしなくても、最初にも紹介した[意識はいつ生まれるのか](https://www.amazon.co.jp/dp/4750514500) によると、意識があると複雑性が十分に大きいそうです（逆が成り立つとは言っていない）。もし逆が成り立って、とても複雑なネットワークを作ったとして、もしそこに意識が生じたら、それは外部から観測できるのでしょうか。
**あなたは私に知性があると思いますか？私はあなたの知性を確認できますか？**
Angular に Firebase を導入する時の、そもそもの基本的な共通設定のしかた

# 概要
[Firebase](https://firebase.google.com/?hl=ja) を利用すると、mBaas として認証機能やリアルタイムDBなど、様々なサービスを利用できるが、[Angular](https://angular.jp/) と Firebase を連携するときには、どのサービスを利用するにしろ、いずれも共通の設定を行う必要がある。
その際の設定方法についての備忘録。
（Web アプリ開発をするときの話。ネイティブアプリに導入する時の話ではない）

# 前提
- Google アカウントが作成済みであること
- Google アカウントで Firebase にプロジェクトを生成済みであること
- Angular を利用する環境構築が完了していること
- Angular で Web アプリケーションの生成が完了していること

# 手順

## 1. Firebase に Web アプリを登録する
Firebase の今回利用するプロジェクトを作成し、選択してプロジェクトページを表示する。
プロジェクトページの「アプリを追加」というボタンを押下し、表示されるアイコンの中から「`</>`」マークを押下する。

<img width="1440" alt="sample_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199602/5e75b023-de32-f9ac-1dc3-9ae69aac048f.png">

ウェブアプリの登録フローに入るので、画面の通りに進めていく。

#### ① 「アプリのニックネーム」を適当に決めて入力する （Firebase Hosting の設定はしなくて良い)
#### ② 「Firebase SDK の追加」が表示されたら、一旦そこで止めておく

<img width="1440" alt="sample03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199602/e26909d2-9946-ab29-2449-d5546ee9f6fc.png">


## 2. Angular の環境設定に Firebase のユーザ情報を転記

先ほどの 「Firebase SDK の追加」で表示されたスクリプトのうち、設定に関する JSON 形式の部分の `{` から `}` まで をコピーする。

<img width="516" alt="sample04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199602/a860115f-97a0-dde7-34a3-e249e48b90d9.png">

Angular の環境設定ファイル (`src/environments/environment.ts`) に、以下のようにペーストする。

<img width="567" alt="angular_firebase_setting_05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199602/b696651e-0cd8-276d-2edf-efffba5a4910.png">

Firebase プロジェクトが「開発用」「本番用」と別れている場合は、`environment.ts`, `environment.prod.ts` にそれぞれ分けて該当内容をコピペすれば良い。


最低限の基本設定は、以上で完了。

## 3. Firebase モジュール導入

Firebase 公式モジュールをインストール。

```bash
npm i firebase @angular/fire
```

ルートモジュールに Firebase のモジュールを導入する。

```ts:src/app/app.module.ts
：
// Firebase モジュール インポート
import { AngularFireModule } from '@angular/fire'; // 追加
import { AngularFireAuthModule } from '@angular/fire/auth'; // 追加例： Firebase Authentication を使う場合
import { AngularFirestoreModule } from '@angular/fire/firestore'; // 追加例： FireStore を使う場合
：

@NgModule({
  ：
  imports: [
    ：
    AngularFireModule.initializeApp(environment.firebase), // 追加
    AngularFireAuthModule, // 追加例： Firebase Authentication を使う場合
    AngularFirestoreModule, // 追加例： FireStore を使う場合
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
```
Private Linkを経由したApp ServiceからSQL Serverへのアクセスについて

本記事は以下サイトにて記載しています。
恐れ入りますがリンクから移動してご参照ください。

**Private Linkを経由したApp ServiceからSQL Serverへのアクセスについて**
https://cloudsteady.jp/post/10704/

現在パーソルプロセス＆テクノロジーではAdvent Calendar 2019を開催中です。
https://qiita.com/advent-calendar/2019/ppt

こちらも興味ある記事あれば是非ご参照ください。