OmniAICreator/Qiita-1.07M huggingface dataset:
価値観を探る質問力とは

##あなたの強みはなんですか？

面接で「あなたの強みはなんですか？体験談を交えてお話しください」と言われたことがあります。

「特に思いつかないですね。逆にそんなことを聞いて何の意味があるんですか？」と聞いたら気まずくなってその面接は直ぐに終わりました。※もちろん結果はお祈りです。

この違和感のある質問は、面接者が面接官に聞いてきて欲しくない質問の最上位に来る質問ではないでしょうか。その理由を論理的に説明しようと思います。

結論から言うと、この強み弱みの質問は、あなたを形成する膨大な変数の、一要素にしか過ぎないので「聞いても無駄な質問」だからです。

##なぜ聞いても無駄な質問か

ちょっと深い話になるのですが、人間の本質というのは「行動」「思考」「価値観」という層で区分けできると思います。

ピラミッドでいうと一番下が「価値観」、その上が「思考」、最上位が「行動」です。※行動は習慣という場合もあります。

人間は、ある行動する前に頭の中で何らかの思考をします。もちろん思考が深い浅いというのはありますが、何らかの思考をした後に行動に移します。

その人の思考はその人の価値観に沿って形成されるため、面接時に面接官が面接者の良し悪しを判断するためには、面接者がある思考をした時ににどのような価値観を持ってその考えに至ったかを確認しないと本質的に面接者を判断できません。

最初の質問に戻りますが、「強み弱み」というのは、あなたには数え切れないほどある変数であり、状況によっても変数が変わってくるし、そもそもそんなことをいちいち考えません。

その人の強み弱みを聞いてもその人の表面上の一要素しか見ることができないため、全く意味のない質問となってしまっているのです。

面接官はそんな表面的な質問をしないで、本質的でその面接者の行動や考えを形成する価値観の部分をちゃんとみてあげる必要があります。

##面接では面接者を判断できない？

面接で面談者を判断できないと言っている面接官がもし仮にいるとしたら、自分に質問力がない、具体と抽象化能力がないと言っているようなものだと感じます。

ある専門性を持ち合わせて、面談者の価値観をゆっくり確認していくステップを取れば面談者がどのような考えを持ち合わせている方なのか、おおよそ予想できます。

理由は、行動は思考に抽象化され、思考は価値観に抽象化されるからです。価値観をおおよそ把握することができれば、他のケースに転用でき、その価値観に沿った大体の思考パターンや行動パターンがわかります。

例えば、能力がない人は会社で内向きになり、上下関係に過剰に反応し、権力を持ちたがりますよね。そのような方は大体同じような価値観を持っていますので、思考パターンや行動パターンが手にとるようにわかります。それと同じことです。

もちろん面談者が面接のような即時性を求められる同期型コミュニケーションが苦手で言葉が出ないこともあるでしょう。

見込みがあるがそれで判断できないと思ったら、面接方法なんてなんでも良いので追加でテキストベースの会話することや、専門性を判断する何か良質な課題を提出することなどの非同期コミュニケーションの面接を後ほど行えば良いです。

##今に集中する

面接者の価値観を探る上で最も重要なことは、面接官は面接者の「今」を見て判断することです。

ありもしない過去や未来の話をしても手触り感の無い面接となってしまいます。

ファンタジーを制作するなら良いですが、実務を通して会社に貢献できる人材か判断するためには面接者の「今」を見るだけで全てが分かります。

過去の話とか未来の話とかは本質的には不要です。

未経験なら、なぜその業種や職種を選ぶのか、そのために今何をやっているのか、なぜその行動をしようと考えたのか、その考えに至った大切にしている価値観は何なのかを考えておくと良いと思います。※これは自分に向けてです笑

##まとめ

上記をまとめると、

まず１つ目が、強み弱みなどの膨大な変数の一要素を聞いても意味がない質問になるということ。

２つ目が、人間の本質というのは「行動」「思考」「価値観」という層で区分けができるのでより内在的なその人の「価値観」を見極めようということ。

３つ目は、面接官は具体と抽象を行き来できる能力を持つ人、且、面接者の価値観を探る質問をできる人でないと、面接者の判断をできないよねということ。

４つ目は、面接者は変な面接官に当たったらその会社には行かなくて良いということ。本当に見てくれる良質な面接官は「今」のことしか聞いてきません(もちろん経歴とか今後のキャリア形成とかは軽く聞いてくるかもしれませんが、基本的には「今」のことを聞いてくれます)。

5つめは、面接者は価値観の軸を把握しておこう！お金が大事なのかチャレンジが大好きなのか健康が大事なのか家族が大事なのか時間が大事なのか自分が自分であることが大事なのか。

##補足【私の価値観の軸】

私自身の価値観の軸は、「自分が自分であること」が土台にあり、「家族」「健康」「時間」「チャレンジ」とだんだん層が高くなっていきます。

「オレがオレであること」

これを無くしたら、生きているのに死んでいるようなものだと私は思っています。

権力やお金に縛られて自分の人生を生きていない方を何人も見てきました。

その方達はそれが幸せと感じていのであれば私は否定はしません。

私は私の価値観の軸で物事を判断し生きていきたいと思います。
化学科高専生(プログラミング超初心者)がクラウドAI開発講座 by Microsoft&高専キャリア に参加してみた！#0

# どんな記事？
プログラミング初心者高専生が、高専キャリアさんとMicrosoftさんが共催するクラウドAI開発講座に参加して
**「なにこれ楽しい！！！！」**となるまでの記録を残していきたい…！そんな~~挫折対策の~~記事です。

具体的には、講座の内容に触れつつ自分のやった作業や感じたことを記録していこうと思います。
これを読んでくれたプログラミング初心者の同志達が心強く思ってもらえたり、
はたまた、初学者向けの解説を作ろうと考えているような有志の方々にとって"初心者目線"の参考になれれば嬉しいです。

Qiitaに関わらず、ネット記事自体初執筆なので拙い文章になりそうですが読んでもらえると筆者が喜びます。
（アドバイスやコメントを頂けるとなお最高になります）

それでは、やっていきましょうか！

# クラウドAI開発講座とは？
ズバリ、**Azureを活用したTeams連携Botの開発**が今回のミッションとのことです。
現状ではそもそもAzureとはなんぞやという感じですね。

初日（7/4）はキックオフセクションとのことで、クラウドAI開発講座の内容や進み方の説明がありました。

ざっくり要約すると
**「毎週ペースでQiitaに進捗書いてフィードバックもらいつつ、8/29までに上記ミッションを完了させよう」**という話でした。
（詳しくは[こちらから](https://online.kosen-career.tech/ai)）

そしてミッションを達成させるためのコンテンツ４選が、講師のおーちょさん(@miokawa)から紹介されました。

- **de:code 2020にておーちょさんとちょまどさん(@chomado)の講座**
 
　https://www.microsoft.com/ja-jp/events/decode/2020session/detail.aspx?sid=Z01
　https://www.microsoft.com/ja-jp/events/decode/2020session/detail.aspx?sid=A02
　過去のMicrosoft公式Techイベントでのセッションとのこと！

- **Microsoft Learn for Students**

　https://docs.microsoft.com/ja-jp/learn/roles/student?WT.mc_id=BlendedCurriculum-MSLearn-nosuzuk
　これを使えば、学生なら誰でも無料でAzureを勉強できるみたいです！

- **Qiitaの解説記事**

　https://qiita.com/chomado/items/6bda10abde0551f25723
　https://qiita.com/miokawa/items/6f1a3e480580e1e29abc
　おーちょさんとちょまどさんが書いた解説記事です！

- **Azure for Students**

　https://azure.microsoft.com/ja-jp/free/students/?WT.mc_id=azureforstudents-docs-nosuzuk
　学生なら、学校のアドレスでアカウントを作ると＄100分のクレジットがもらえるらしいです！

# 7/4 キックオフセクションを終えて
**「さあ、今からやるか！」**と思える基盤を整えてもらえて嬉しい限りです。

僕の感想にはなるのですが、プログラミング初心者は作りたいものがあって独学でネットから学ぼうとしても
ネットから適切な情報の選び方すら分からず、専門用語や未知の仕組みに混乱したりと結局挫折祭りだと感じています。

そんな中、**"Botを作る"**という明確な目標が与えられて、おーちょさんこと、大川 水緒さん（東京高専卒、日本マイクロソフト）かねしろさんこと、兼城 駿一郎さん（沖縄高専卒、高専キャリアCTO）といったプロの方にオンラインでフィードバックをいただきながら学べる。そして周りには同じく学ぼうとする同士がいる。

何という素敵な環境でしょう…
この機会を生かして、是非プログラミングに愛が持てるようになりたいですね...！

### というわけで今回はこの辺で！
来週（7/11）からは、**進捗メインの記事**になると思います。また良かったら見てください！
（研究室のプランターで育てている夏野菜の管理に応用できないかな…👀）
初心者的プログラミング（HTML・CSS）感動ランキング

<h1>プログラミング初心者がびっくりしたこと！！！</h1>

<h2>はじめに</h2>
<p>初めまして、くるみと申します。<br>「プログラミングを勉強するぞ！！」とか言ってTwitterを始めた所謂『形から入る』系人類です。Qiitaで何かアウトプットしてみたいというこれまた『形から入ろう』と思って記事を書いてます。<br>ブログみたいな内容になっちゃいそうなので問題があったら消します:baby:</p>
<p>今回は自分がプログラミングを勉強し始めて「むずかし〜」とか「すご〜」と思ったことををメモがてらみなさまに共有したいです！<br><span color="gray">誰向きの記事なのかもはや分からないけど、初心者の方は共感してください:relaxed:<br>中・上級者の方は鼻で笑いながら自分の初心者時代を懐かしんでください！笑</span></p>

<h2>HTML＆CSSびっくり/むずかしポイントランキング</h2>
早速初心者の自分が感動・・・と云いますかびっくりしたことや難しかったことをランキングで紹介します！
<h3>第３位：そもそもプログラミング言語と違う</h3>

これTwitterとかでもよく見る言葉なんですけど、HTMLはマークアップ言語でCSSはスタイルシート言語。

マークアップ言語とは、文書の構造を指定する言語です。
スタイルシート言語とは、文章のスタイルを指定するための言語です。

要するにこれらは、表面を整えるためのものであって、コンピューターに命令を下すためのプログラミング言語とはまた違うんですね.
正直、自分としてはアルファベットでごちゃごちゃ書いてたら全部プログラミングと思っていたのでびっくりしました笑


<h3>第２位：インライン要素とブロック要素</h3>
みなさん「インライン要素」と「ブロック要素」について知っていますか？
HTMLで文章を作る時に、この分類によってどの要素の内側にどの要素を配置できるかなどのルールが定められているみたいです。
<h4>ブロック要素</h4>
見出し・段落・表など、文書を構成する基本となる要素がこのブロック要素です。
ブロック要素のタグで囲まれた部分は、１つのかたまりとして認識されるみたいです。だから、cssで指定等すると、全部に反映されちゃうんですね。
<p>
「でも文章の一部分だけにスタイルを反映させたい・・・」
そんな時に使えるのが、↓のインライン要素！
</p>
<h4>インライン要素</h4>
インライン要素は、ブロック要素の内容として用いられ、文章の一部として扱われます。
文章の中の一部だけに色をつけたり、強調するような場合に使われる要素なんですね。

ブロック要素の中には、ブロック要素やインライン要素を入れることはできますが、インライン要素の中にはインライン要素は入れられれも、ブロック要素は入れることができません。

初めてHTMLに触れた時、ブロック要素しか知らなかったもので、
全部にスタイルが反映されちゃうのなんだかイケてないなぁ・・・って思ってたんですけど、ちゃんと仕組みとして考えられているんですね。。。自分が無知なだけでした・・・！笑

<h3>第1位：「title」タグ</h3>
ブラウザのタブに、そのサイトの名前が表示されるじゃないですか。
それって、この「title」タグが仕事をしてくれてるようなのです！

初めてprogateをした時に、１番感動したのがここです笑

さらにタイトルタグは、ウェブサイトのタイトルを示すものであり、検索した時の結果画面で出てくるもののようです。だから、ブログとかHPのSEO対策とかを考える際にかなり重要になってくるということですね。

素人的には、webサイトのタイトルがどこに書かれているかなんて全く気にしてなかったんですけど、知ってみるとすごく納得でした。
自分が今まで何となく接していたものにきちんとしたルールがあるのに感動しました・・・本当に！！


<h3>終わりに</h3>

まとめると、プログラミンング・・・の世界に少し触れてみたことで、自分が今まで何となく接していたものにきちんとしたルールがあったことが一番の感動でした。
自分が知らないことを知るのは楽しいですね。
この調子で勉強していきたいです！
お絵かきできるSNSを作りたい！11

１つ前に戻す(日本語あってる？)を実装したのでついついやりたくなるCtrl+ZをWEBページに実装ます。
方法は簡単でページ全体に対してonkyedownイベントを付与するだけです。

```javascript:
document.onkeydown = function(e) { 
	var keycode,shift,ctrl,alt; 
	keycode = event.keyCode; 
	shift = event.shiftKey; 
	ctrl = event.ctrlKey; 
	alt = event.altKey; 
	event.cancelBubble = true; 
	keychar = String.fromCharCode(keycode).toUpperCase(); 
}
```
このサンプルでは、documentに対して付与しました。

あとで扱いやすいように以下の変数を宣言しています。
keycode→押された文字列を大文字にして格納
shift→Shiftを押されているかの判定用
ctrl→Ctrlを押されているかの判定用
alt→Altを押されているかの判定用

つまり、Ctrl+Zを押された場合は１つ前に戻す用のdoPrevCanvas関数を呼びたいのでこんな感じです。

```javascript:
document.onkeydown = function(e) { 
	var keycode,shift,ctrl,alt; 
	keycode = event.keyCode; 
	shift = event.shiftKey; 
	ctrl = event.ctrlKey; 
	alt = event.altKey; 
	event.cancelBubble = true; 
	keychar = String.fromCharCode(keycode).toUpperCase(); 
	if (ctrl) { 
		if (keychar == "Z") {
			doPrevCanvas();
		}
	}
}
```

これでCtrl+Zが出来ました。
どうせなのでもういくつかショートカットを作ろうと思います。

作ったショートカットは以下の通り。
Ctrl+Z→１つ前に戻す
Ctrl+上矢印キー→上レイヤー
Ctrl+下矢印キー→下レイヤー
Ctrl+左右矢印キー→線の太さ変更
Ctrl+スペースキー→線の色の変更
Shift+左右矢印キー→画像の左右反転
Shift+スペースキー→フルスクリーン（全体画面）
Shift+Sキー→画像保存

この後は画像をサーバーにアップロード出来るようにするか、WebSocketを使ってお絵かきチャットできるようにするか、画像をドラッグアンドドロップだけで下絵にできるトレース機能を作るか機能改善するかは未定です。

最初：[お絵かきできるSNSを作りたい！](https://qiita.com/cardcapt/items/d15fedf80d336f6b4bb9)
【私メモ１】GitとGitHub【必須の基本操作らしいのに概念が最高に初心者泣かせなgitを理解する】

#作業手順


<font color="CornflowerBlue">・ターミナルでの作業内容</font>

`mkdir newfile（フォルダの名前）`
ターミナルで現在いる場所に新しいディレクトリ作成

`touch hello.rb(ファイルの名前)`
ファイル作成（拡張子に注意）
<br>

<font color="CornflowerBlue">・VScode(コードエディタ)での作業内容</font>

`git init`
gitリポジトリを作成する


`git add .`
インデックスにファイルを登録
><font color="DeepPink">`add .`だと作業中のフォルダに入っている全てのファイルをインデックスに登録</font>
<font color="DeepPink">`add hello.rb`←特定のファイル（この場合だとhello.rb
）だけ登録することもできる！</font>


`git commit -m "ここにコメント"`
変更内容の保存
自分がした作業内容とかをコメントに残す

<br>


<font color="CornflowerBlue">・GitHubでの作業内容</font>

＊Google等からGitHubを開いて自分のページで`new repository`から
リモートリポジトリを作成する

＊出来たらurlをコピー

<br>

<font color="CornflowerBlue">・VScode(コートエディタ）に戻って行う作業内容</font>

`git remote add origin URL`
ローカルリポジトリとリモートリポジトリを関連付ける

originの部分は好きな名前でOK！


`git push origin master`
ファイルがプッシュされる
`origin master`の部分省略可能



<rb>
<font color="CornflowerBlue">・branchの使い方</font>

`git branch`
自分が今作業してるブランチを確認

`git checkout -b new_branch_name`
新しいブランチの作成
new_branch_nameのところが新しいブランチの名前になる
名前は_で繋ぐ


<br>

コードに変更加えたら
`git add`　→　`git commit -m "変更内容"` →　`git push`
この流れで新しく書き換わる！
MongoDBまとめ

MongoDBについて、自分用にまとめ

RDBと比較してメモしておく


マニュアルがしっかりしてるので、詳細はこちら見た方がよい。
https://www.mongodb.com/

## データベース
RDBのデータベースの単位と同じ

testデータベースを作成

```
use test
```
存在していればteseデータベースに切り替え

## コレクション
RDBでいうテーブルのような単位

テーブル作成→データ作成ってしなくても、insertと同時にコレクションが作成される

````
db.testCollection.insert( { x: 1 } )
```

テーブル定義のような概念はない。
keyとvalueの組み合わせでデータを格納していくだけの共通の箱みたいなものをイメージする。
「このフィールドにこの値を入れる、入っている事を保証する」のような定義はしない。

## ドキュメント
RDBでいうテーブルの行のような単位。

insertしてfind。1documentが作成されていることがわかる。

```
> db.testCollection.insert( { x: 1 } )
WriteResult({ "nInserted" : 1 })
> db.testCollection.find()
{ "_id" : ObjectId("5f01ec7f679c2ce2748b1c43"), "x" : 1 }
```


## RDBとの大きな違い
TBD

### リレーション
### トランザクション
### 検索
### データ構造
【bash】Markdown環境でパスワードを管理してるので…

# はじめに

Vivalidのメモ機能でパスワードを管理しています。パスワードは大小英数の20桁としていますが、ストック用として10個パスワードを作ります。
ここでは10個のパスワードを作るスクリプトを紹介します。

# 注意

大半のパスワードはVivalidのメモ機能で管理していますが、「他の環境で重複して管理しているパスワード」「Vivaldiのメモ機能では管理していないパスワード」「頭の中にだけあるパスワード」が少数あります。

# スクリプト
## 内容

```
#!/usr/bin/bash

PWD_NUM=21

readonly HOW_MANY_PWDS=10
readonly PWD_LEN=20

main()
{
        local pwd cnt num
        cnt=0

        while [ $cnt -lt $HOW_MANY_PWDS ]
        do
                num=`expr $PWD_NUM + $cnt`
                pwd=`makepasswd --chars $PWD_LEN`

                echo "| | $num | $pwd |"

                cnt=`expr $cnt + 1`
        done
        return 0
}

main
exit $?
``` 

## 実行結果

```
| | 21 | nuBBGNb6E42WxmFgx1pa |
| | 22 | u433M7wS95KeJFIUDsDN |
| | 23 | w4eR6j6otw3rx42vm6dj |
| | 24 | HNKTAKmpftaDK3eXpDMj |
| | 25 | xUTbuW4atrtRJnQPsr7i |
| | 26 | Fw3tz8QLaHAuITKwPgdc |
| | 27 | cPHwVUSfH1dtzWQojzzo |
| | 28 | Sgt7YP9HPL5DPpvcMEfd |
| | 29 | gVKhTvrnYNAshT7EqcyC |
| | 30 | UYtNuiLidGtCx85MhhBy |
```
PowerShell で出力ファイルに日時を自動で入力する際の注意点


例えば CSV に出力する時は、Export-Csv のcmdlet を使用する。

例：Teams のUser List をCSV にダウンロードする場合；

```PowerShell
$today = Get-Date -Format "yyyy-MMdd-HHmm"
Connect-MicrosoftTeams
Get-TeamUser -GroupId <グループID> Export-Csv "C:\<フォルダパス>\<ファイル名>_$today.csv" -Encoding UTF8
```

Format は 2020-0705-2215 の様な形式が好きなのでこうしたが、他のフォーマットにも出来る；
[参考：Microsoft Doc: カスタム日時形式文字列](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/custom-date-and-time-format-strings)

**注意点；**
1. \$today は変数なので、$ 移行は何でも良い
2. **<フォルダパス> に「スペース」が入っている場合PowwerShell ではデフォルトで ''（シングルクォーテーション）で囲まれるが、'' ではエラーになるので ""（ダブルクオーテーション）で囲む必要がある（例文参照）**← 今回ここでハマった。
3. この処理を定期的にやるのであれば、PowerShell のスクリプトとして保存しておけば二回目以降が楽になる
4. （この記事を書いていて）Qiita でマークダウンをエスケープするには \ (バックスラッシュ) を入れたら良い（e.g. \$today）
5. （この記事を書いていて）Qiita で構文例を書く時は ``` で囲めば良い。（最初のバッククオートx3 の後に言語名(e.g. PowerShell) を書くとシンタックスハイライトをすることが出来る）
Ubuntu Server(Raspberry Pi)のWifi設定〜リモート接続

# 1. Raspberry piにUbuntu Serverをインストールする。
割愛します。

#2. 通信設定ファイルを編集する。
"SSID名"にはWifiのSSID名を入れ、右側は何もいらないらしい。

```
# ディレクトリの移動
$ cd /etc/netplan/

# 編集する
$ sudo vim 50-cloud-init.yaml

#　以下ファイル内

# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
            eth0:
                    dhcp4: true
                    optional: true
    version: 2

# 自分の場合は以下を追加した
    wifis:
            wlan0:
                    optional: true
                    dhcp4: true
                    access-points:
                            "SSID名":
                                    password: "パスワード"　# "SSID名"からのインデントなので注意

```

#3. 通信設定のテスト／反映
下記がうまくいけば、特に何も出ない。

```
# こいつはエラーが出ても大丈夫
$ sudo netplan --debug try
# こいつにエラーがなければOK
$ sudo netplan --debug generate
$ sudo netplan --debug apply

# 念の為、再起動
$ sudo reboot
```

#4. Macからリモート接続してみる
inet ~~の部分のIPアドレスを使用する

```
# Raspberry piのターミナル
$ ip a
1: lo: ~~
2: eth0:~~
3: wlan0:~~
    inet XXX.XXX.XXX.XXX/XX brd ~~~~~~
    ~~
```

自分の場合ホスト名がubuntuなので、IPアドレスを合わせてssh接続する。
ホストが表示され接続されればOK。

```
# Macのターミナル 
# $ ssh raspberrypiのホスト名@IPアドレス
$ ssh ubuntu@XXX.XXX.XXX.XXX
```

色々と情報は落ちているものの、細かいところがわからなかった為少し時間がかかってしまったので
忘備録として。

#5. 参考URL
https://raspberrypi.stackexchange.com/questions/98598/how-to-setup-the-raspberry-pi-3-onboard-wifi-for-ubuntu-server-18-04-with-netpla

以上
LambdaをCanaryリリースするSAMテンプレートに自動ロールバックを組み込む

# はじめに
LambdaのCanaryリリースは非常に便利。自動でトラフィックコントロールをして様子を見ることができる。
しかし、クラウドネイティブなリリースの完成は、万が一の状況を検知した場合は自動でロールバックすることだ。
今回は、過去に作ったSAMテンプレートに自動ロールバックを組み込んで実際の動作を確認する。

# 前提条件
- SAMテンプレートでCanaryリリースの設定を書いたことがあり、ある程度内容を理解している。特に、```AutoPublishAlias```と```DeploymentPreference```の概要と、```LambdaPermission```を設定しなければいけない理由が分かっているのが望ましい ⇒ [過去の記事](https://qiita.com/neruneruo/items/73906cdc3c2aa699644f)でも紹介してるよ！
- CloudWatchアラームをなんとなく分かっている

# SAMテンプレートを書く前に
ロールバックの設定は、SAMテンプレートの```AWS::Serverless::Function```リソース内の```DeploymentPreference```のプロパティで設定する。これは標準のCloudFormationにはないSAM独自機能なので、[マニュアル](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-property-function-deploymentpreference.html)には目を通しておく。

このドキュメントの```Alarms```の説明には

> デプロイによって発生したエラーによってトリガーされる CloudWatch アラームのリスト。

と書かれていて「ごめんちょっとよく分からない」な感じではあるが、要はここで設定したCloudWatchアラームに引っかかるとトリガが引かれてロールバックが走る、ということだった。

なので、ここに指定するCloudWatchアラームを定義してあげればよい。指定するのはARNではなくて名前なので、TerraformとSAMを併用している場合でも、それほど困らずに使えるだろう。

# CloudWatchAlarmの定義
デプロイ中に発生する問題を予見するようなアラームなんて千差万別なので「これ」という答えはないが、今回はサンプルとして、「APIGatewayの特定APIの特定ステージで、5XXErrorの合計値が60秒以内に2回以上発生したら挙がるアラーム」を設定する。

あっさり書いたようだが、この辺のプロパティの説明は[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-cw-alarm.html#cfn-cloudwatch-alarms-dimension)の内容が破滅的に分かりにくいので、ほぼ手探りなのであった。NamespaceとDimensionsについては、[API Gateway側のドキュメント](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-metrics-and-dimensions.html)に書かれていたので拾えた。Namespaceに設定可能な他のサービスについても、[ここ](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html)でまとめられているので、今後の参考に使えるのではないか。

なお、Dimensionsではリソースとメソッドまで指定できるが、それを拾うメトリクスはカスタムメトリクスの作成が必要そうなので今回は割愛する。実際には、デプロイするアプリケーションの影響範囲に応じて監視範囲を絞るべきだろう。

```YAML
  # ------------------------------------------------------------#
  #  Cloud Watch Alarm
  # ------------------------------------------------------------#
  GoApigwTestAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties: 
      AlarmName: [好きなアラーム名]
      AlarmDescription: [適当な説明文]
      Namespace: AWS/ApiGateway
      Dimensions:
        - Name: ApiName
          Value: [APIGatewayのAPI名]
        - Name: Stage
          Value: Prod
      MetricName: 5XXError
      Statistic: Sum
      Period: 60
      ComparisonOperator: GreaterThanThreshold
      Threshold: 1
      EvaluationPeriods: 1
```

# 実際に試してみる
さて、上記のSAMテンプレートをリリースしたとしても、トランザクションを5XXエラーにできなければ意味がない。プロダクトのソースコードに

```Golang
		if id == "99999" {
			statusCode = 500
		}
```

な感じでテキトーに仕込んで、curlでid=99999を流し込もう。```DeploymentPreference```の```Type```の内容次第ではなかなかエラーにならないが、「1分以内に2回5XXエラー」という設定なのでテキトーに叩いていればそのうちにロールバックが発動する。

ロールバックが発動すると、

![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/42df24cd-3dae-fef6-2ef6-5a6670986d41.png)

こんな感じでトラフィックがオリジナル側にしか流れなくなり、ロールバックが完了する。
Dronecode - uORB Messaging

ドローンの自律飛行を実現するには、DronecodeとMAVSDKを試してみます。

# 目次
1. [PX4環境構築](https://qiita.com/k-koh/items/77af5422b3857e68ad9a)
2. [uORB Messaging](https://qiita.com/k-koh/items/c57c02df772785816c14)
3. [QGroundControlの使い方（ユーザーガイド）](https://qiita.com/k-koh/items/eedc303cb0b72d1272ee)
4. [MAVLinkの入門](https://qiita.com/k-koh/items/9e9c1694dbb5a2a4117a)
5. [QGroundControlのカスタマイズ開発](https://qiita.com/k-koh/items/36c34f0e3e18b2e055ac)


## 動作環境
- Ubuntu 18.04
- ROS Melodic

## uORB Messaging

uORBとは、スレッドとプロセス内通信で非同期な publish/subscribeのメッセージAPIです。

### 新しいTopicの追加

- `msg/`フォルダーに.msgファイルを追加
- `msg/CMakeLists.txt`にファイル名を追加
- Topicを使用には、headerファイルをinclude

```
#include <uORB/topics/topic_name.h>
```

### Topicのパブリッシュ

list all topics


```
ls /obj
```

listen to the content of one topic for 5 messages

```
listener sensor_accel 5
```

shows the publishing frequency of each topic in real-time

```
uorb top
```
Raspberry Pi3／JetsonNanoで使えるDC-DCコンバータを見てみよう

JetBotを製作する際に，USBバッテリーを選択するのに苦戦された方も居たと聞きます．
JetsonNanoは，使用電流が多く，ACアダプターの選定も難しいようです．
ただし，MicroUSBではなく，DCジャックから入力すると，問題が発生しにくいようです．
今回は，充電池から使えるDC-DCコンバータを見てみます．

##DC-DCコンバータとは？
DC-DCコンバータは，直流電源の電圧を変換するためのものでデコデコと略されます．
DC-DCコンバータには降圧と昇圧が存在し
今回は12V等の高い電圧を５Vにする降圧レギュレータになります．

##電圧降下の方法
電圧降下の手法にはいくつかの手法があります．
電圧を熱に変化させることで降圧させる方法や半導体により電圧を下げるものです．
前者は，熱エネルギーにするために，大きなヒートシンクが必要となったり，コイルなどを使う必要がありサイズが大きくなりがちです．
後者は，サイズが小さくできる反面ノイズが発生する場合があるなど設計が難しく，大電流の製品は少なかったです．
ただし，近年(ここ15年）で急速な技術革新が起き，大電流に対応した半導体レギュレータが増えてきています

##5Vを生成する理由
今回は，5Vを使う理由は，Raspberry PiやJetsonNanoが5Vである為です．
そして，どちらも2.5A以上必要です．

##入力電圧を決める
入力源は12V~18Vとしました
これは，一般的な充電池が12Vか電動工具の18Vが多いためです．
(最近の電動工具は36Vまであります）

##選定内容
入力電圧：9~26V
出力電圧：5V
出力電流：2.5A以上

##ケース入りモデル
![DSC_0184 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e33e3735-335e-4289-0365-4d19fe5e3dde.jpeg)
用意したDC-DCコンバータ　3種類
####（上）9~26V入力　5V　2.5A出力　MicroUSB接続　50円　ShigezoneAkiba
####（左）9~35V入力　5V　5A出力　550円 Aliexpress
####（右）10~40V入力　5V　6A出力 475円 Aliexpress

性能検査等はしていませんが，これらを使えば，JetsonNanoやRaspberry Pi3を充電池から使用することが可能でしょう．
(私も使用しています）

##基板タイプ
次は，基板タイプを見てみましょう
こちらは，MP1584ENというスイッチングレギュレータを使用しており，
可変抵抗を調整することで入力電圧4.5V～28Vを3.3V3Aまで降圧することが可能です．
12V等からシリアルサーボで使用する7vを生成することも可能です．

![DSC_0186 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a4becc5e-f6ab-4218-35c2-a647eae8571a.jpeg)

今回は，DC-DCコンバータを少し見てみました．
【Mac】aliasの設定方法(再起動しても消えない)

#概要

Macのターミナルにて、aliasの設定方法のメモ

#環境

・端末：MacOS Catalina ver.10.15.5
・ターミナル：iTerm2

#方法
1. ターミナルを開き、~/.zshrcファイルを編集する。

```
$ vim ~/.zshrc
```

2. 設定したいaliasのコマンドを設定する


```~/.zshrc
alias ll='ls -l'
alias lla='ls -la'
alias em='emacs'
```

3. ターミナルを再起動するか以下のコマンドを実行

```
$ source ~/.zshrc
```

これで、電源を入れ直してもaliasは消えず設定される


#参考
・[zshにaliasで設定したものが反映されない](https://teratail.com/questions/237459)
AWS SAA対策メモ（データ分析サービス編）

~~SAA対策の自分用のメモ。~~
7/13にSAA合格

SOA対策の自分用のメモ。
どんどん更新して加筆修正していく予定。


## Kinesis
大量の**ストリーミング**の収集処理を行う。IoTなどからのリアルタイムデータを分析。
**Kinesis Data Streams**
ストリーミングデータをリアルタイムで保存。EMRやLambdaで処理させる。
DBの負荷分散のため、大量のデータを**シャード**という単位で分割し、複数ノードで並列処理を行う。
シャードは時間あたりの処理数に制限あり。シャード数を増やすことでストリームデータの並列処理ができ、効率よくストリーミングできる。

**Kinesis Data Firehose**
データ蓄積に向けてデータ変換や別サービスへの配信を行う。ストリーミングデータをデータレイクやデータストア、分析ツールにロード。ストリーミングデータをキャプチャして変換し、Amazon S3、Amazon Redshift、Amazon Elasticsearch Service、Splunk にロードして、BIツールでほぼリアルタイムに分析可能

**Kinesis Data Analytics**
ストリーミングデータに対してSQLクエリを投げてリアルタイム分析が可能。DBにデータを移すことなく分析可能。

**Kinesis Video Streams**
ビデオストリームを取り込み、アプリによって動画を解析できるようにする。防犯カメラとか。

## EMR（Elastic MapReduce）
Hadoopのマネージドサービス。**Hadoop**とは、大量のデータを処理する分散処理フレームワーク。（非）構造データを変換する。

## Data Pipeline
DBからデータの**取り出し（Extract）、変換（Transform）、保存（Load）**の順次処理を行う。

## Glue
ETLとデータカタログのマネージドサービス。
**データカタログ**とは、メタデータを集中管理するもの。
データレイクであるS3に保存されたデータ構造をRedshift用に変換する。

## Athena
S3データにテーブルを作成し、直接SQLを投げる。

## QuickSight
BIツール。
RedshiftやAthena、S3などと接続。
【初心者でもわかる】グラデーションをつかって、コップに好きなジュースを注ぐ方法

# どうも、7noteです。今回はCSSグラデーションをつかってコップに好きなジュースを注いで飲みたいなと思います。
どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/gradation/
【Rails】O/Rマッピングまとめ

#O/Rマッピングとは？


O/Rは**Object/Relational**の略。

オブジェクト指向プログラミング言語からRDB(リレーショナルデータベース)にアクセスする際の架け橋となる**仕組み**のこと。

#O/Rマッパーとは

O/Rマッピングの考え方に基づいて実装された**ライブラリ**のこと。


#Railsで採用されているO/Rマッパーは？

Railsで採用されているO/Rマッパーで代表的なものが**ActiveRecord**である。

####※ActiveRecordが備えている主な機能
- SQLを書かなくても、データの検索・登録・更新・削除が可能
- RDBの関連付けをモデルクラスの関連付けとして実現できるようにする
- データの検証機能を提供

#Railsで使えるO/Rマッパーは他にどんなものがある？

- Mongoid
- Mongomapper
- activerecord-alt-mongo-adapter
VScodeにLaTeX Snippet

今回はレポートの雛型になるスニペットを作りました。

## 2020-7-12: 追記
VScodeのスニペットにはユーザースニペットとグローバルユーザースニペットがあります。内容は同じでも構いませんが動作に違いがあります。以下を参照してください。
→ [ VScodeの2種類のユーザースニペットの違い(ユーザースニペットとグローバルユーザースニペット) ](https://qiita.com/tatmius/items/7df9f2c65c20a3f1f0d8)

## 作り方
`ファイル(F) > ユーザー設定 > ユーザースニぺット`を選択し、出てきた入力欄に`latex`と入れると`latex.json`が生成されるのでそこに書いていきます。



```latex.json

{
	"texreport basic": {
		"prefix": "texreport",
		"body": [
			"\\documentclass[dvipdfmx]{jsarticle}",
			"\\begin{document}",
			"\\title{}",
			"\\author{}",
			"\\maketitle",

			"\\section{はじめに}",

			"\\begin{thebibliography}{}",
			"\\item",
			"\\end{thebibliography}",

			"\\end{document}",
		],
		"description": "basic report"
	}
}

```

VScodeのSnippetsはTextMate snippet syntaxに準拠しており、
`body`内にそのままTexを書いてしまうとうまくいかない(最初の一文字が\のせい)のでエスケープする必要があります。

これを保存すれば、任意のLaTeXファイルで`Ctrl+Space`をすることでSnippetを呼び出せます。

便利ですね。
クラウドAI開発講座開始！（高専キャリア×Microsoft）

ハム川です

この度、高専キャリアとMicrosoftのコラボによるAI開発講座に参加します。

#1. 目的
Azure上でTeams連携botを開発する

#2. 開発の流れ
1. 学習
    2. 記事やMicrosoftの学習コンテンツからAzureの使い方やbotにおけるAIの手法を学ぶ。
2. 開発
    3. 実装できそうなものをとりあえず試す
    4. 開発目標の設定とマイルストーン作成
    5. ひたすら開発!

#3. 進捗（学習段階）
- [x] Azure for students に登録
- [ ] de:code2020の以下コンテンツを視聴して学習する
- [ ] Microsoft Learn for Studentsで学習
- [ ] ちょまどさんとおーちょさんのレッスンを消化

#4. 来週に向けて
de:code2020[(1)](https://www.microsoft.com/ja-jp/events/decode/2020session/detail.aspx?sid=Z01) [(2)](https://www.microsoft.com/ja-jp/events/decode/2020session/detail.aspx?sid=A02)や[ちょまどさん](https://qiita.com/chomado/items/6bda10abde0551f25723)と[おーちょさん](https://qiita.com/miokawa/items/6f1a3e480580e1e29abc)の記事を読み雰囲気をつかむ。
AWS SAA対策メモ（構成管理 & メッセージ編）

~~SAA対策の自分用のメモ。~~
7/13にSAA合格

SOA対策の自分用のメモ。
どんどん更新して加筆修正していく予定。

# 構成管理系
## CloudFormation
**インフラリソースを自動でプロビジョニング**
テンプレート：プロビジョニングしたいコードを記述（JSON or YAML）
スタック：テンプレートによってプロビジョニングされるリソース
テキストエディタで書くか、CloudFormationデザイナーを使用する

## Elastic Beanstalk
**webアプリやサービスをデプロイし、実行環境の管理**も簡単にできる。

**ブルーグリーンデプロイメント**
ブルー（実稼働）からグリーン（準備環境）に切り替えるダウンタイムがないリリース方法。RDSをElastic Beanstalk環境外に指定することで可能。


## OpsWorks
**サーバーの構築の自動化**をする
**Chef**や**Puppet**が利用可能


# メッセージ系
## SNS
通知サービス

- **パブリッシャ**
メッセージ送信者

- **サブスクライバ**
メッセージ送信者

- **トピック**
アクセスポイント、通信チャンネル

パブリッシャが作成したトピックをサブスクライブすることで、サブスクライバはメッセージを送受信可能。サブスクライバにはHTTP(S), Email, SQS, Lambdaがある。トピックに対して、アプリ側からサブスクライバ宛にメッセージを送るのがパブリッシュ。Lambdaでは、その通知をトリガーに何らかの処理を走らせることができる。

## ☆SQS
メッセージキューイングサービス
バッチ処理など非同期で分散処理が可能
想定外の大量のトラフィックを一旦SQSのキューに受け入れ、後から処理していく時によく使われる。バッファリングすることで、DBの負荷を減らせる。また、オートスケールの運用負荷も下げることができる。

**ロングポーリング**
キューが空の場合、メッセージ取得までの待機時間を1~20秒で設定し、メッセージ取得要求の数を減らせる（コストダウン）
逆に、もしキューが空でも取得してしまう（ショートポーリング）と、コストだけかかって意味がない。

**可視性タイムアウト**
メッセージ取得を他の受信者に一定時間見せないようにする。処理の重複やリクエスト数を減らせる。

キュー種類

 - **標準キュー**
最大のスループットだが、配信順序はベストエフォートで配信回数は少なくとも１回
 - **FIFOキュー（First In, First Out）**
送信されている順番に配信され、１回で確実に処理する


SQSを利用して2つのSQSキューを使用して優先度を変更可能。優先的に処理されるキューとそうではないキューとに振り分ける。例えば有料会員とそうでない会員とか。（プライオリティキュー、セカンダリキュー）

## SES
メールの送信サービス

## Amazon MQ
オンプレから既存のアプリのメッセージング機能を移行できる

# その他
## CodeDeploy
アプリのデプロイの自動化。
**インプレイスアップグレード**に使える。
EC2インスタンスのライブでのアプリケーションの更新。

## CodeCommit
コーディングされた内容をGitリポジトリにホスト

## CodeBuild
ソースコードをコンパイルし、テストを実行し、デプロイ可能なソフトウェアパッケージを作成できる

## CodePipeline
アプリケーションのビルド、テスト、デプロイまでの処理手順を定義・実行

## SWF（Simple Workflow Service）
ひとかたまりの処理の状態管理とタスク間の流れの管理サービス。
分散している（非）同期タスクを一連のフローとし、高耐障害性↑↑
python OpenCV で画像編集

#OpenCVで文字の読み取り可能な画像へ編集する

```python:
import cv2
import numpy as np

from IPython.display import display, Image

def display_cv_image(image, format='.png'):
    decoded_bytes = cv2.imencode(format, image)[1].tobytes()
    display(Image(data=decoded_bytes))
    img = cv2.imread("{画像ファイルpath}")
    display_cv_image(img)
    # グレイスケール化
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    # 二値化
    ret,th1 = cv2.threshold(gray,200,255,cv2.THRESH_BINARY)
    display_cv_image(th1)
    contours, hierarchy = cv2.findContours(th1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    # 面積の大きいもののみ選別
    areas = []
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area > 10000:
            epsilon = 0.1*cv2.arcLength(cnt,True)
            approx = cv2.approxPolyDP(cnt,epsilon,True)
            areas.append(approx)

    cv2.drawContours(img,areas,-1,(0,255,0),3)
    display_cv_image(img)
    img = cv2.imread("{画像ファイルpath}")

    dst = []

    pts1 = np.float32(areas[0])
    pts2 = np.float32([[600,300],[600,0],[0,0],[0,300]])

    M = cv2.getPerspectiveTransform(pts1,pts2)
    dst = cv2.warpPerspective(img,M,(600,300))

    display_cv_image(dst)
```

[OCRドキュメント](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/index.html)
mkdocsのnav要素をサブフォルダで分けたい

mkdocsでちょっとハマったのでメモ。

# mkdocs.yml

で、こんなnav要素を書いたとします。

```
nav:
  - index.md
  - Tips:
    - tips/language.md
    - tips/command.md
    - tips/saveload.md
```

tipsフォルダを掘って、そこに記事を３っつ配置したつもりです。

自動更新されるローカルブラウザのこのURLでは問題なく見れます

```
http://127.0.0.1:8000/
```

ところがbuildした結果のHTMLをブラウザで確認すると
languageってフォルダを掘って、そこのindex.htmlを参照しようとして開けません。

nav要素の書き方を色々変えてみたけどやっぱり駄目で。
buildするときのデフォルトオプションがそうなのだと後で気づきました。

```
mkdocs build --no-directory-urls
```

これでいける！
その他のオプションは

```
mkdocs build -h
```

で確認できます。
【Rails】Mongoidで一部の列のみを指定して検索を行いたい場合

## 概要
RailsでMongoDBを使用する際、一部のキーのみ指定してmodelから指定したキーで検索する方法を記載します。

## 前提
* Mongoidを使用します。Mongoidについては[RailsでActiveRecordの代わりにMongoidを使う](https://qiita.com/ryohashimoto/items/3f27821229b079a7a4f5)を参照ください。
* 今回、以下のようなUserモデルを使用します。emailを検索条件にして、`_id`・`password_digest`・`status`のみを抽出します。

```user.rb
class User
  include Mongoid::Document
  include Mongoid::Timestamps
  include ActiveModel::SecurePassword

  field :_id, type: String, overwrite: true
  field :email, type: String
  field :name, type: String
  field :status, type: String
  field :role, type: String
  field :gender, type: String
  field :phone_number, type: String
end

```

## 実装サンプル
* where句にemailの条件を設定して、only句で列の絞り込みを行います。

```email_auth_controller.rb
class EmailAuthController < ApplicationController

  def email_auth
    #  レコードを抽出するクエリ
    find_by_email_user = User.where(email: email_auth_param[:email]).only(:_id, :password_digest, :status)
    if find_by_email_user.empty?
      render json: { message: "ユーザが見つからなかったよ" }
    else
      # 今回はemailで一意になる前提
      user = find_by_email_user[0]
      if user.status != "active"
        render json: { message: "ステータスが有効じゃないよ" }
      # authenticateメソッドも使える
      elsif !user.authenticate(email_auth[:password])
        render json: { message: "パスワードが違うよ" }
      else
        render json:  { message: "認証OK" }
      end
    end

  def email_auth_param
    params.require(:email_auth).permit(:email, :password)
  end

end
```
matplotlibでxticklabelsの色を個別に設定する

## 0.実現すること
![xticklabels_example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/4a8d0c38-6c43-4e53-eff4-45a67782bdde.png)
xticklabels(AmericaとかJapanの部分)の色を個別に設定する。

## 1.Code
```example.ipynb
import matplotlib.pyplot as plt

# 描画領域の設定
fig, ax = plt.subplots() 

# xticklabelsとyvalueの設定(list)
X = ["America", "Japan"]
Y = [3, 1]

# color 略記でもOK
X_label_colors = ['r', 'green']


plt.bar(X, Y, align="center")

# Xticklabelsとcolorを対応付ける(同数でなければならない)
[t.set_color(i) for (i, t) in zip(X_label_colors, ax.xaxis.get_ticklabels())]

plt.show()
```
## 2.メモ
いくつかあるラベルの中で、特に目立たせたいラベルがあるときに使えそう。

```example2.ipynb
fig, ax = plt.subplots()

X = ["C/C++", "Python", "JavaScript"]
X_label_colors = ['black', 'red', 'black']
Y = [136, 127,110]

plt.bar(X, Y, align="center")

[t.set_color(i) for (i, t) in zip(X_label_colors, ax.xaxis.get_ticklabels())]

plt.show()
```

![xticklabels_example2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/057b07f9-c840-7996-fad8-9560bb2a567c.png)
EC2インスタンスを起動してからgithub連携できる様になるまでの手順 

## はじめに
EC2インスタンスを起動してからgithubと連携できる様になるまでの手順を、自分が疑問に思ったことをQ and A形式で掲載します。
至らない点も多々あると思いますがよろしくお願いします！

## 対象者
- 初学者
- AWSを学習中の方
- シェル(ssh)でAWSのEC2インスタンスに接続できた方

## この記事で得られること
- AWSでgithubと連携するまでの手順
- パッケージマネジャ(yum)の概要

## 開発環境
- Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type
- ngnix
- ruby 2.7.1
- rails 6.3.1

## 前提
Q.なぜ連携(なぜssh認証する)必要があるのか？
A.githubでは自分のアカウントを使用してサーバーにユーザーとしての認証を行なっています。
同様に、EC2インスタンスという、githubから見て「誰なのか分からない・・・」という状態を「誰なのか分かる！」という状態にします。

また、git clone中にセキュリティ観念上、悪意あるデータを通信中に書き込まれる、という可能性がある。通信をssh通信で暗号化することにより、この様なことが防げるメリットがある。

## 手順(コードのみ)
1. ```[ec2-user@ElsticIPアドレス]$ sudo yum -y update```
 
2. ```[ec2-user@ElsticIPアドレス]$ sudo yum install git```

3. ```[ec2-user@ElsticIPアドレス]$ git version # gitがインストールされているか確認```

4. ```[ec2-user@ElsticIPアドレス .ssh]$ ssh-keygen -t rsa -b 4096```
※**.sshディレクトリで実行！！**
※**途中で鍵の名前など設定する入力箇所があるが、全て何も入力しないでenter(3回)を押せばOK。デフォルトの鍵の名前になる。**

5. ```[ec2-user@ElsticIPアドレス]$ cat ~/.ssh/id_rsa.pub # 表示された文字列を全てコピーする```

6. 以下のURLにアクセス
https://github.com/settings/keys

7. SSH Keys欄にて、公開鍵のタイトル（自由に入力してOK）と公開鍵の内容(5.でコピーした内容)をペーストする。

8. ```[ec2-user@ElsticIPアドレス]$ ssh -T git@github.com```
※以下の文言が表示されればOK。yesかno問われたら全てyes

> Hi <Githubユーザー名>! You've successfully authenticated, but GitHub does not provide shell access.

この工程が終わればOKとなります！git cloneができる様になります。

## 捕捉知識
Q.```sudo yum -y update```って何？　何でupdateするの？

A. yumはLinux向けのパッケージマネジャの1つです。
パッケージマネジャとは、様々なアプリケーションやソフトの管理を行うソフトです。
このパッケージマネジャではセキュリティ等に関するソフトも管理されており、抽象的な言い方をすれば「yumにソフト管理を委託している」ということになります。
定期的にupdateすることで、EC2インスタンス(Linux)のメンテナンスができます。

Q. ```[ec2-user@ElsticIPアドレス .ssh]$ ssh-keygen -t rsa -b 4096```で鍵名を設定しないのはなぜ？

A. 鍵名が「id_rsa.pub」で作成されるからです。それ以外の名前で鍵を作成すると```[ec2-user@ElsticIPアドレス]$ ssh -T git@github.com```を行うために、~/.ssh/configファイルで別途設定を行う必要があります。そのため、初学者向けの手法と言えるかもしれません。

Q. 公開鍵と秘密鍵の使い方がよく分からない
A. 私も詳細分からないのですが、ひとまず公開鍵⇨サーバー外でも公開して良い鍵、秘密鍵⇨サーバー外に出してはならない、と覚えておきましょう！
模写コーディング  FaceBook ログイン画面 その3

#模写コーディング

##模写するサイト
FaceBook ログイン画面
https://www.facebook.com/

##作成時間
その１：3時間
その２：5時間半(+2時間半）
その3 ： 5時間半
計：16時間半

##環境構築
・Google Chrome（ブラウザ）
・Visual Studio Code（コードエディター）

##模写する上でのルール
1.文字のコピペはOK
2.フォントの種類は何でもOK
3.少しのズレはOK
4.背景画像も入れる
5.角丸やフォントの大きさも近いものにする
6.レスポンシブデザインにも対応する

https://codelearn.jp/articles/mosya#1HTMLCSS

##進捗
<img width="1440" alt="スクリーンショット 2020-07-05 22.22.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662094/c3d38bd3-9f05-6a48-3107-b1ce535f4170.png">

モーダルウィンドウに使用するアカウント作成画面を作りました。


##次回
javascriptを記述して、モーダルウィンドウの表示/非表示機能を追加する。

必須入力事項のエラーの出し方と正規表現のインプットし、導入する。

font awesomeのアイコンを使用する。
（はてなマークとか）

レスポンシブデザインのインプット。
以上。
RDS CALについて

# はじめに


# 参考サイト
◆【WindowsOS】RDS CAL確認スクリプト【RD ライセンス】
　http://blog.livedoor.jp/harukisan7/archives/20036595.html
　　※このスクリプトと同等の機能を導入したい

◆RDS CAL のサーバー間移行手順について
　https://social.technet.microsoft.com/Forums/en-US/f16b765f-9449-40f5-aba1-20e09b73506c/rds-cal?forum=Wcsupportja
　　※移行時のコマンド関連

◆リモート デスクトップ サービス環境で使用するポートについて
　https://social.technet.microsoft.com/Forums/ja-JP/9d621fc7-45c6-476f-be36-98e47f35849d/12522125141254012488-124871247312463124881248312503?forum=Wcsupportja

◆RDS CALに関する個人的な理解
　https://zokibayashi.hatenablog.com/entry/2015/03/28/015759
　　※管理用のRDP（mstsc /admin）セッション知らなかった...

◆RDS運用のいろいろ
　http://ak-yomogi.info/windows/win2012_rds/

◆クライアント アクセス ライセンス (CAL) を使用して RDS 展開をライセンスする
　https://docs.microsoft.com/ja-jp/windows-server/remote/remote-desktop-services/rds-client-access-license

◆リモートデスクトップ（RD）ライセンスを インストールする
　https://www.projectgroup.info/documents/WindowsServer2012/W2012_0020.html
◆WindowsServer2016のRDS CALを設定した時のメモ
　https://qiita.com/2rwchan/items/5ab5ae6814a8bd33c203
　　※この辺はインストール手順系

◆CAL - マイクロソフト系技術情報 Wiki
　https://techinfoofmicrosofttech.osscons.jp/index.php?CAL

◆Windows CALの種類と計算方法
　https://oa.oreda.net/server/windows/cal.html

◆WindowsServerのライセンスが大きく変わりました
　https://www.denet.ad.jp/technology/2017/12/windows-server-license.html

◆Windows用の踏み台サーバーにSSH接続する！
　https://qiita.com/1Kano/items/ea018abaae7ce5edbf73

◆図解で、もう踏み台要らずAWS SSM経由Windowsサーバーにリモートデスクトップ接続
　https://qiita.com/1Kano/items/1496d58b1293ff70c5ec
[サーバーサイドAPIデバッグ術]ブラウザのリクエストを簡単にリトライしてサーバーの挙動を見る方法

APIの開発してますか？挙動の確認を見る時どうしてますか？
curlを手書きしている？パラメータがないリクエストなら手軽で良いですね。
Postmanのようなツールを使っている？素晴らしい！
ブラウザで実際に画面を表示している？うーん…それって繰り返したいとき大変なんじゃ……

とはいえ、ブラウザで実際に画面を表示すると、パラメータの組み立てが非常に楽というメリットがあります。
認証情報付きリクエストとか組み立てるの大変ですもんね。

ここで、ブラウザのリクエストをそのまま繰り返したり、ちょっとだけパラメータを組み替えられたら便利だと思いませんか？

今回はそんな方法を紹介します。


## cURLでコピーしてリトライする

Chromeの開発者ツール（Windows F12、Mac Cmd + Opt + I)を開いてネットワークタブを開いてください。
この状態で目的のページを開いてください。

<img width="538" alt="スクリーンショット_2020-07-05_22_30_52-5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122390/b65d9592-97c4-289f-f61c-4032d11e8c70.png">
Preserve Logのチェックが外れていれば、最後にブラウザをリロードしてから現在までのリクエストがここに上がってきます。
（逆に、チェックをつけると、リロードしてもリクエストのログが破棄されなくなります）

<img width="538" alt="スクリーンショット_2020-07-05_22_30_52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122390/86341268-125f-5bbb-4b18-a43d1eb6cba5.png">
フィルターをXHRにするとJavaScriptによる非同期通信に絞り込むことができます。
リストから目的のAPIを探してください。見つからないときはPreviewやHeadersタブを頼りに一個一個探していきましょう。


<img width="552" alt="スクリーンショット_2020-07-05_22_39_08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122390/41c12df6-440d-5108-5bcf-145b84bc2daa.png">

目的のAPIを見つけたら右クリックしてメニューを出してください。
この中のCopyから「Copy as cURL」を選択しましょう。

すると、クリップボードにcURL形式でコピーされます。
cURL形式であれば、Terminalから実行することができます。
この形式であれば他のエンジニアにも試してもらうということが簡単にできるでしょう。
（POSTリクエストではクッキー情報なども入ってくるので共有する内容には気をつけてください）

<img width="568" alt="スクリーンショット 2020-07-05 22.42.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122390/2dbf0591-abf8-7c55-1a0f-002752926eee.png">


## fetchとしてコピーしてリトライする
コピーのもう一つの方法として、「copy as fetch」も便利です。先程と同様に、リクエストを探して今度はcopy as fetchを選択してください。
 <img width="484" alt="スクリーンショット 2020-07-05 22.50.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122390/b644fc58-f9a3-7065-b383-e7cceb3f0ea5.png">

このように、開発者ツールのConsoleに入れて有効なfetchとしてコピーされています。
<img width="540" alt="スクリーンショット_2020-07-05_22_53_46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122390/68d45d6c-b514-8852-b1b8-e656a70412e4.png">

こちらのほうが、Request Bodyがエスケープされてなくて若干可読性が高く修正しやすいかもしれません。
好みですかね。

## ちょっとだけ改変してリクエストする
いずれもリクエスト情報が完全に文字列になっているので、リトライも容易であれば改変も容易です。
copy as cURLは --data オプションに続けたJSON文字列をエスケープしたもの、
copy as fetchは bodyパラメータはURLSearchParamsです。
URLSearchParamsを展開するには`[...new URLSearchParams("Bodyパラメータの中身").entries()]` とすると良いでしょう。
JSON.stringify()すればJSONにもなりますし、加工しやすいかと思います。
<img width="747" alt="スクリーンショット 2020-07-05 23.37.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122390/4218b064-53f7-3f5e-3d14-87cf1d4fec69.png">

## Copy all as ...
並列して存在する項目に「Copy all as cURL」や「Copy all as fetch」があります。
こちらの項目ですが、選択項目によらず、リストアップされているリクエストが全部クリップボードに放り込まれてしまいます。
場合によっては便利なのでしょうがうっかり押し間違えて貼り付けたらなにこれ？！みたいなことが多いので気をつけてください。


### まとめ
しれっと便利な機能がブラウザにはたくさんありますが、今回はその中で「Copy as ...」を紹介しました。


## その他のデバッグ術
- [\[JavaScriptデバッグテクニック\]メソッド実行中の変数の中とか見たくない？ \- Qiita](https://qiita.com/fruitriin/items/d0a1cd943233cd22ef30)
- [\[HTML/CSS高速コーディング\]ギリギリまでコードを書かないChrome DevToolsのリアルタイムレイアウト確認テクニック \- Qiita](https://qiita.com/fruitriin/items/1e01f57ecb750f3612d0)
PicoNeo2EyeのEyeTrackingを試してみる

#始めに
BtoB用VRHMDでスタンドアローン機の「PicoNeo2 Eye」を個人用で手に入れましたので、もし同じ様に個人開発しようと思う人向けの内容になります。
![IMG_0584.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62400/8fc46276-b504-cd0d-bb12-1edb20e6c3a8.jpeg)

# PicoNeo2 Eyeについて
この「PicoNeo2 Eye」はTobiiのアイトラッキングセンサーが入ったスタンドアローンアイトラッキング機能付きのVRHMDです。
大体の操作はOculusQuestに似てますが、コントローラーは光学式ではなく電磁式なので後頭部の方へ持っていっても操作できます。
ただ、Questのコントローラーと比べると若干ふわっとした感じがあります。

![IMG_0585.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62400/c8b2125c-7cf2-722c-87f0-d0609d97728e.jpeg)

![IMG_0628.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62400/ea1b405a-f42f-48e9-6951-2937c8ff438e.jpeg)

見えにくいですが、レンズの両サイドにTobiiのセンサーがあります
# デモ確認の環境
Untiy2019.4.1f
(デモプロジェクトは2019.2.20fで開発されています）

デモプロジェクト
https://github.com/picoxr/EyeTracking


プロジェクトをclone、またはDLして来たらUnityで起動してみましょう

初回起動時こちらのウインドウが出ますが
Applyを押してしばらく待ちます。
![pico01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62400/9e6db860-d5cb-3a3a-9c86-180d4df216dc.png)

ちなみに、最初からビルド対象をAndroidにしておくとこちらのウィンドウは出ません。


#ビルドする
最初から設定されてますが、ビルドシーンを番号で管理してるみたいなので番号変えると起動しなかったりします。

![pico02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62400/0dc328d8-1507-d66a-85df-b26402b866a6.png)

#自分の視線情報を登録する
デモを始める前にホーム画面にある専用アプリ「Tobii User Calibration」で自分の視線情報を登録する必要があります。

<img width="721" alt="7.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62400/559c0f10-b0b8-a9cb-d32d-7c3c8ad754e1.jpeg">

#デモを体験する
「PicoEyeTracking」とアプリがホーム画面に出るのでコントローラーで選択してください。
わかりやすい「Eye Tracking」から始めるといいです。
![1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62400/f023039f-5c6f-1299-57a9-9672448419b2.jpeg)


#自分でアプリを作る場合について
視線情報と瞼の開閉レベルならPvr_Unity_SDKだけで対応可能です。

![pico03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62400/d10a8544-e7d9-53d3-e105-6a494d76aa38.png)
EyeManagerの　EyeTrackingのチェックを入れれば動作します。
視線が向いてるところ以外の解像度を下げる「Foveated Rendering」もここで設定できます。

#TobiiのSDKを使う場合
細かい機能を使う場合はTobiiXR SDKが必要です。
こちらについては、後日簡単なデモの確認と動作まで書きたいと思います。
https://vr.tobii.com/sdk/develop/



今までBtoB向けであまり表に出てきてないPicoでしたが、G2はヨドバシでも買えるようになったり、G3がソフトバンクさんのイベントで出たりとしているのでNeo系も今後購入できるようになるので期待してます。
制限がそんなに多くないけど、自前で作らないと無いという状態なのでそういったデバイスをいじるのが好きな人にはおすすめのVRHMDです（ΦωΦ）
Python環境準備（venv初めて使う）

**自分用メモ２です**

Python環境づくり
会社で使っているPCはうまくいっていたAnacondaで
家のPCの環境作りをやろうとしたらうまく動かなかったので別の方法をトライ

Windows10 home

---

### python インストール

https://www.python.org/downloads/windows/

~Windows x86-64 executable installer
を落としてインストール

今日はVer.3.7.7にしてた

PATHは通し忘れたのでシステム環境変数のPATHに
C:～\Python\Python37
C:～\Python\Python37\Scripts
の2つを追加した

---
#### 仮想環境 venvを使う

PowerShellで作業した

参考URL様

> https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e
https://docs.python.org/ja/3/library/venv.html

保存したい先へ移動

```
cd 環境を作るフォルダ
```

名前を決めて環境作り→勝手に環境名のフォルダができる

```
python -m venv 環境名
```

---
#### アクティベート→ここで詰まる
```
.\環境名\Scripts\activate
```

「このシステムではスクリプトの実行が無効になっているため」
とかなんとかでアクティベートできない

参考URL様
> https://toypool.hatenablog.com/entry/2019/02/08/142824
https://qiita.com/ryu22e/items/520b35db6a444d8289da

上記にならって管理者権限でPowershellを起動しなおして

```
Set-ExecutionPolicy RemoteSigned
```
Yesで進める

再度アクティベートでうまいこと完了

```
.\環境名\Scripts\activate
```
---

Powershellの表示が
（環境名）　～
に変わったのでたぶんOK

あとはpip install ***で色々揃えればいいのかな？
Visual studio codeでは作った環境のPythonに選びなおしたらうまく動いた


---

##### 今日入れたモノ
numpy
opencv-python
pyrealsense2
open3d-python
pandas
matplotlib
seaborn
bokeh
AtCoder 生活　87日目

[前回]()

#87日目
今日は、ABC173に参加しました。

![スクリーンショット 2020-07-05 22.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606053/330b00aa-2334-71a9-5912-22bee524482f.png)


##[ABC173](https://atcoder.jp/contests/abc173)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n;
    cin >> n;
    n %= 1000;
    if(n == 0) cout << 0 << endl;
    else cout << 1000 - n << endl;
}

```

###B

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n;
    cin >> n;
    vector<int> c(4);
    vector<string> s(n);
    rep(i,n){
        cin >> s[i];
        if(s[i] == "AC") c[0]++;
        else if(s[i] == "WA") c[1]++;
        else if(s[i] == "TLE") c[2]++;
        else if(s[i] == "RE") c[3]++;
    }
    cout << "AC" << " x " << c[0] << endl;
    cout << "WA" << " x " << c[1] << endl;
    cout << "TLE" << " x " << c[2] << endl;
    cout << "RE" << " x " << c[3] << endl;
}

```


###最後に
C問題を最近解けないのが辛い
AWS SAA対策メモ（CloudWatch, CloudTrail & Config編）

~~SAA対策の自分用のメモ。~~
7/13にSAA合格

SOA対策の自分用のメモ。
どんどん更新して加筆修正していく予定。

## CloudWatch
**CloudWatch**
システムやリソース情報の収集・監視・可視化を行う
標準メトリクス　CPU使用率など
カスタムメトリクス　CloudWatchエージェントをサーバーにインストールして設定する

プラン

- 基本モニタリング　無料　１分間隔
- 詳細モニタリング　有料　５分間隔

**CloudWatch Events**
リソース監視を行い、あるイベントをトリガーにアクションを実行する。
例　スポットインスタンスが強制終了されたら、Lambdaを実行して新たなスポットインスタンスを起動
イベント　対象リソースの変化
ターゲット　実行する処理
ルール　定義したイベントのイベントリソースとターゲットのアクションの組み合わせ。

**CloudWatch Logs**
ログの収集と管理。
CloudWatch Logs Metric Filterでフィルタリングが可能。
Elasticsearch Serviceと連携し、Kibanaでビジュアル化可能。

## CloudTrail
誰がどういった操作をしたかのログを残し、意図しない操作がないかなどを確認できる
アクティビティログは標準で90日間保存
**証跡**を有効にすると、S3にログが保存される
CloudWatch Logsへの送信を有効にすると、ログをCloudWatch Logsに送れる
グローバルでもリージョンでも使用可能

## Config
管理されている構成変更の追跡サービス

**Configルール**
理想の構成 ＝ コンプライアンス準拠として定義し、現在のリソース構成が適合するかを評価する。
例　MFAの有無など

**Configアグリゲータ**
Configルールの評価結果を複数アカウントやリージョンであっても集約し、一元管理することができる。
スタイルを当てやすくする豆知識　padding/margin編　入門者向け

#padding/marginのリセット

```CSS:styles.css
* {
  padding: 0;
  margin : 0;
}
```

サイトの模写をしていると、なぜか意図しない余白が付けられて困ったときの対処法として、

上記のコードをCSSに記述することで、意図しない余白を消すことができる。


※　「*」
これは、全称セレクタと言って、全ての要素を対象にする。

参考サイト:http://www.htmq.com/tutorial/08_5.shtml

これを記述した途端に、思い通りのスタイルを当てることができるようになったので、共有します。


基本的な知識だけど、これからのコードを書く際の準備に付け加えていきます。
サクッとOracleにテストデータを投入する

# はじめに
テストデータを作り出すツールはいくつか存在しますが、性能試験などでとりあえずデータを投入したいだけであれば、ツールを使うまでもなく簡単にできます。とは言っても頻繁につかうものではないので、毎回忘れてしまいます。
そこで備忘録として書き留めておくことにします。

# 対象テーブルの構成
通常使うテーブルは、ほぼ以下の4種類の型で構成されています。

- 文字列（PK）
- 文字列
- 数値
- 日付＋時刻

※LOB型もあるかもしれませんが、今回は省略

# テストデータ生成方法

- 文字列（PK）
 - TO_CHAR()関数 + カウンタを利用（一意制約違反にならないようにします）
- 文字列
 - dbms_random.string()関数 or 固定文字列を利用
- 数値
 - カウンタ&MOD()関数 or 固定数値を利用
- 日付＋時刻
 - systimestampを利用 

# サンプル
コード見た方が早いですね。

### 対象テーブル
こんなテーブルがあったとします。

```sql
CREATE TABLE EMP
 (
 empno VARCHAR2(10),
 empname VARCHAR2(50),
 gender NUMBER(1,0),
 description VARCHAR2(100),
 update_time TIMESTAMP,
 CONSTRAINT pk1 PRIMARY KEY(empno)
 ) 
TABLESPACE XXX;
```

### テストデータ生成(PL/SQL)
```sql
begin
  for i in 0..10000 loop
    insert into EMP values(
        TO_CHAR( i, '000000000' ),
        dbms_random.string('x', 50 ),
        MOD( 3, i ),
        'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
        systimestamp 
    );
  end loop;
  commit;
end;
/
```
※最後の1回でcommitするようになっているので、件数が多い場合はcommit間隔を制御する必要があります。
Pythonのモジュールvenvについて

#Venvについて
pythonの仮想環境をパッケージ化するモジュール。

##例
プログラムAとB、ライブライXのversion1, versionが同じ環境動作している。
またプログラムAはversion1に、プログラムBはversion2に依存している場合を考える。
pythonでは一つの環境に同じライブラリの複数のバージョンを管理出来ない為、この時はプログラムA,Bのどちらか一方が正常に動作しなくなるはずです。
しかしVenvをモジュールを使用すれば、プログラムAの仮想環境にライブラリXのversion1、プログラムBの仮想環境にライブラリXのバージョン2を構築出来る。
上記のようにVenvを使えばプログラム毎に異なる仮想環境を構築できる。

##参考書籍
https://www.amazon.co.jp/Python%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0-%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0-%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88-%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%8E%E9%9B%86%E3%83%BB%E8%A7%A3%E6%9E%90%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%9F%E8%B7%B5%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89-%E5%8A%A0%E8%97%A4/dp/4297107384/ref=pd_lpo_14_t_0/358-0973601-8452038?_encoding=UTF8&pd_rd_i=4297107384&pd_rd_r=20b5729a-f361-4b0c-be73-21f0421bdb51&pd_rd_w=HPMiy&pd_rd_wg=gw5wF&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=KCCGEDE63C3C07JMZ3JR&psc=1&refRID=KCCGEDE63C3C07JMZ3JR
console.logで配列やオブジェクトが省略されてしまうときはconsole.dirを使おう

`console.dir`の第２引数にオブジェクト`{depth: null}`を渡すと深い階層も省略されずに全部見れます。

[Node.js console.dir](https://nodejs.org/docs/latest-v12.x/api/console.html#console_console_dir_obj_options)

```js
const menu = {
  main: {
    currey: 500,
    udon: 450,
    rice: 150
  },
  side: {
    soup: {
      misoshiru: {
        wakame: 250,
        asari: 250
      },
      potage: {
        corn: 250,
        potato: 250
      }
    },
    dessert: {
      icecream: {
        vanilla: 100,
        chocolate: 100
      }
    }
  }
}

console.log(menu)
/*
{
  main: { currey: 500, udon: 450, rice: 150 },
  side: {
    soup: { misoshiru: [Object], potage: [Object] },
    dessert: { icecream: [Object] }
  }
}
*/

console.dir(menu, {depth: null})
/*
{
  main: { currey: 500, udon: 450, rice: 150 },
  side: {
    soup: {
      misoshiru: { wakame: 250, asari: 250 },
      potage: { corn: 250, potato: 250 }
    },
    dessert: { icecream: { vanilla: 100, chocolate: 100 } }
  }
}
*/
JavaScriptのIE11対応まとめ(勝手によしなにしてくれるやつ)

コピペjsしか書けないよわよわコーダーのメモ書きです。



###まず確認。
[IE11 で使用できる・できない JavaScript の機能](https://knooto.info/javascript-ie11/)



###そして以下対応策①。

[polyfill.io](https://polyfill.io/v3/)
古いブラウザでサポートされていない機能を使えるようにしてくれるコードらしいです。
[polyfill.io が便利すぎた](https://qiita.com/moriyuu/items/061de38704687fef93b9)



###対応策②。
[Babel.io](https://babeljs.io/)
jsのバージョンES6をES5に変換してくれるみたいです。
[ES6の概要と、最新ブラウザに対応させる「Babel」の使い方](https://liginc.co.jp/260178)

Babelはプラグインみたいですがブラウザ上で変換出来るサービスもあります↓↓↓
[Babel Try it out](https://babeljs.io/repl/#?browsers=defaults%2C%20not%20ie%2011%2C%20not%20ie_mob%2011&build=&builtIns=false&spec=false&loose=false&code_lz=Q&debug=false&forceAllTransforms=false&shippedProposals=false&circleciRepo=&evaluate=false&fileSize=false&timeTravel=false&sourceType=module&lineWrap=true&presets=env%2Creact%2Cstage-2%2Cenv&prettier=false&targets=&version=7.10.4&externalPlugins=)


ただ、上記ではクラス式およびコンストラクタ？の対応が上手くいきませんでした。
今後の課題。ぬぬー
async/awaitとthen/catchを混合しない方がいいかもしれないという話

JavaScriptでこのようなコードを見ることがあります。

```javascript
const response = await request('https://...').catch((err) => {
  logger.fatal(err);
});
```

意図としてはこのようなものだと推測できます。

* 成功時はそのまま`response`を使いたい
* でも異常時はそのことをロギングしたい
* **`try catch`を書くのは面倒くさい**🤖

ですがこのコードは大きな問題を孕んでいます。

## 問題がない場合 : 成功時

成功時は問題がありません。`request()`で得られた結果はそのまま定数の`response`に代入されます。

## 大問題の場合 : 失敗時

`request()`が失敗したときは`promise.catch()`が呼び出されるのはお分かりいただけると思いますし、このコードを書いた人もそれを意図しているということも読み取れますが、このコードは異常終了する可能性がかなり高いです。

### なんでそんなに危険なんですか

危険な理由は`promise.catch()`を行った後の戻り値にあります。ただロギングをしている`promise.catch()`のコールバックの戻り値は`void`です。この戻り値は`response`に代入されるため`response`は`void(undefined)`となってしまいます。

もしもこの後に以下のようなコードがあった場合`undefined`に対するプロパティアクセスとして落ちてしまうでしょう。

```javascript
const response = await request('https://...').catch((err) => {
  logger.fatal(err);
});

return response.body;
```

## わかりにくいこと

### 正常時は`promise.catch()`は実行されずに`await`が行われると考えている

正常時も異常時も以下の順に処理が行われることを理解する必要があるでしょう。

1. `request()`
2. `promise.catch()`
3. `await`

`promise.catch()`も必ず実行されるというのがキモです。正常時もこのメソッドは呼ばれており、その結果何もしていないということを知っておく必要があります。

`promise.catch()`の内部的な実装はこのようになっており、単に`promise.then()`のaliasであると理解していただければわかりやすいでしょう。
(実際の`Promise`はクラスではなく、関数を使った記法であると思いますが、便宜的にクラスでの記法を採用します)

```javascript
class Promise {
  then(onfulfilled, onrejected) {
    // ...
  }

  catch(onrejected) {
    return this.then(null, onrejected);
  }
}
```

`promise.then()`はじつは引数が2個あり、第1引数は成功時、第2引数は失敗時の処理を意味しています。第1引数のみを書く場合がほとんどだと思いますが、第2引数に書けばその時点でのエラーハンドリングができます。

第2引数が書かれていない`promise.then()`は、その`Promise`が`rejected`になったときはエラーハンドリングを行わず次の`Promise`にそのまま処理を委譲します。これが最後の`promise.catch()`まで伝播した結果が`Promise`のチェインで最後に見ることができる`promise.catch()`です。

逆に、第1引数が書かれていない`promise.then()`は成功時はハンドリングを行わず、異常時にエラーハンドリングを行うことがおわかりいただけるかと思います。

## TypeScriptでは

TypeScriptは`promise.then(), promise.catch()`ともに以下のようなシグネチャを持っています。

```typescript
interface Promise<T> {
  then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;

  catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
}
```

どちらも注目していただきたいのは戻り値で、戻り値の`Promise`の中の値を示す`generic`が`Union types`になっていることがわかります。上記JavaScriptの例をTypeScriptで実装すると戻り値`response`の型は`Response | undefined`となることがすぐにわかります。
(`Response`はそのリクエストの戻り値だと思ってください)

## どうすればいいですか

`async/await`と`then/catch`を同時に使うとこの問題が起こりやすいでしょう。そのためどちらかに統一して書くようにします。オススメは`async/await`です。`then/catch`は同じ問題がこのメソッドの呼び出し側で起こりえます。

### `async/await`

```javascript
try {
  const response = await request('https://...');

  return response.body;
}
catch (err) {
  logger.fatal(err);
}
```

### `then/catch`

```javascript
return request('https://...')
  .then((response) => {
    return response.body;
  })
  .catch((err) => {
    logger.fatal(err);
  });
```

## 結論

TypeScriptを使うと考えあぐねることがない。