OmniAICreator/Qiita-1.07M huggingface dataset:
新卒でエンジニアになって大事だと思ったこと

この記事は [WESEEK Advent Calendar 2020](https://qiita.com/advent-calendar/2020/weseek) 10日目の記事です。

# エンジニアとして働く上で大事なポイントまとめてみた

株式会社 WESEEK で新卒エンジニアとして働いている itizawa です。
エンジニアとして働く上で大事なポイントをまとめてみました。

今回あげたポイントは個人的な意見です。
もちろん会社の文化に強く影響は受けていますが...!

## 他人のレビューを見て盗め
コードレビューは多くのことを学べます。
コーディングに関することだけでなく、そのプロジェクトの文化や向いている方向。

コードレビューの回数が多ければ多いほどズレを修正できます。
その回数を増やすために、他人が受けたレビューをみています。

実装を追いかけるのは大変ですが、追いかけるのが大変なコードということは理解度が低いということ。
逆に成長の機会だと思い積極的に追いかけています。

また、コンテキストに適応することができるので、一緒に悩むことができます。
エンジニアは団体戦です。自分の力が 10 から 7 に落ちたとしても全体のパワーを高めることができればそれは価値のある行動だと思います。

## 公式ドキュメントで読めは大体正しい
有名ですが、これは本当に大事でした。

ググると答えが見つかります。しかし、今後もググり続けなければいけません。
ドキュメントには答えはありません。しかし、原因解決のために何を考えれば良いのかが学べます。

そんな感じ

最近だとドキュメントを読んでもわからない問題に当たることがあります。
それは現場の開発チームも最前線で戦っている問題だったりします。
そんな時、issue や release note をみると、答えがあったり最悪迂回策が提案されていたりします。

つまり、一次情報を信頼しておけば良いということだと思っています。

ちなみに、初心者をドキュメントで殴ってはいけません。
https://qiita.com/hiraike32/items/32840b11536fa1b78621

## 垂れ流しは大事だが捕球率を高くするにはコツがいる
弊社では垂れ流しの文化があります。
取り組んでいるものを、 slack に流していくことで誰かがアドバイスくれたり、苦戦しているものの答えをくれる。

ですが闇雲に垂れ流しをしているだけでは答えてくれないこともあったりします。

メンションを送って明確に助けを求めるのか、なるべく答えやすい質問で投げるのか  
捕球率をあげる方法は人それぞれ...

人と人とのコミュニケーションに正解はないと思いますが、常に模索することが大切です。

## できることを増やして、できる人を増やす
仕事が多くて成果が出せない時、それは難しい仕事が多くで時間を取られているわけではなかったりします。

細かい仕事に追われすぎて大きな仕事を考える暇がなくなる。
そんな時に、別の誰かにお願いする。

その人ができなくても一度手間がかかっても教えることで2回目以降には楽できます。
同時に、余った時間を活用してできることを増やして行きます。
それが自分の成長にもチームの成長にも繋がります。

サイクルを繰り返すことが大事です。

## 開発以外の仕事はサブクエスト
エンジニアとて開発以外の仕事も降ってきます。
楽しいことだけをやっていれば良いわけではないのです。

そんな時、サブクエストだと思って取り組むようにしています。

仕事のイメージを持ってしまうと後回しになりがち。
しかも何か細かいカイゼンを見つけた時、「仕事が増えるから黙っとこ...」となってしまう。
これを他者貢献のためだと思ってやると、褒められなくなった時にやらなくなってしまう。

そこで内なる実績トロフィーの獲得のためにやるようにする。
なんか楽しくなる。

くだらないけど大事だと思います。

## 誰かが梯子をかけ先導することで人はついてくる

実はこの Advent Calendar は私が提案して実現したことになります。

提案したのは 11月末とかなり直前でしたが、自分から１日目・5日目を埋めて、記事を書くと何人かが後に続いてくれました。
結果として現在 Calendar にはほとんど埋まっています。感謝です。

この経験から 「誰かがやってくれれば後に続くのになぁ」 という考えは捨てて、自分がその道を作ることが大事だと学びました。


※この記事は [WESEEK Tips wiki](https://tips.weseek.co.jp/) に 2020/12/10 に投稿された記事の転載です。
Tips wiki では、IT企業の技術的な情報やプロジェクトの情報を公開可能な範囲で公開してます。
denseとかembeddingとかの違い

DeepLearningを学んでいる。

ネットワークの中間層で、DENSEとかEMBEDDINGとか、いったい何が違うのか？
っていう話。

元ネタ
https://medium.com/logivan/neural-network-embedding-and-dense-layers-whats-the-difference-fa177c6d0304


#語源
 そもそも何の意味やねん？　　

* DENSE　　　　《物理》高密度の　

* EMBEDDING　　埋め込み、包埋　


#違い
EMBEDDING　　変数にカテゴリカルを埋め込むときに使う

* 入力サイズの縮小と計算の複雑さの軽減 →　学習時間の短縮
* 重みWは、単純なルックアップテーブル
* 欠点はバイアス、活性化関数のパラメータが不足
* one-hot encodingのみに使用
* 単語の埋め込みで広く利用　→　Word2vec

DENSE

* 計算量が多いマトリクスの処理　→　処理が重たい
* 重みWは、重み行列として考慮する

#まとめ

要するに自然言語処理のONE HOTを受けるときに、
最初に使われるネットワークだということ
PHPの配列について

##PHPの配列について


配列は特定の数のカンマで区切られた**キー** =>  **値**の引数をarray()で作成することができる。
サンプルコードは以下の通り。

```
<?php
$array = array(
    1    => "東京都",
    2    => "大阪府",
    3    => "京都府",
    4    => "北海道",
);
var_dump($array);
?>

```
左側の1~4の数字を**キー**、右側を**値**と呼ぶ。特定の値を取り出す場合にはキーで呼び出すようにする。

※**var_dump**は変数や戻り値を詳細に出力できる関数。値が文字列であればstring,数値であればintegerとなる。<br><br><br>

例えば、var_dump($array[2]);とするとキーが２のところの値を取り出すことができる。

```
<?php
$array = array(
    1    => "東京都",
    2    => "大阪府",
    3    => "京都府",
    4    => "北海道",
);
var_dump($array[2]);
?>
```

**出力結果**

```
string(9) "大阪府"
```

stringは文字列のデータ型


ここでvar_dumpをprintに変えると値だけが表示される(var_dumpとの対比)

```
<?php
$array = array(
    1    => "東京都",
    2    => "大阪府",
    3    => "京都府",
    4    => "北海道",
);
print($array[2]);
?>
```
<br>

###キーを省略して配列を記載

また、キーはオプションとなるため、キーを省略して、以下のように配列を表すことも可能。

```
<?php
$location = array('東京都', '大阪府', '京都府', '北海道');
                    [0]      [1]      [2]      [3]
var_dump($location);
?>
```

特定の文字列を取り出すときは以下のように記述する(先頭が[0]で始まることに注意する)

```
var_dump($location[0]);
```

出力結果 

```
string(9) "東京都"
```
【Android】アクティビティのライフサイクルイベントについて

#プログラミング勉強日記
2020年12月9日
Androidアプリを作るにあたって理解しとくべきアクティビティのライフサイクルについて簡単にまとめる。

#基本的なライフサイクル
　以下の図は、基本的なActivityのライフサイクルを示して、ライフサイクルが変化するタイミングで呼び出されるActivityのメソッドを示している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/21767b28-4464-2f2a-2766-be49120c5737.png)
参考文献：[Activity Lifecycle](https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle)

　ライフサイクルは直接アプリが制御していない。メモリがいっぱい過ぎる時、システムが勝手にアプリを止めることができる。アクティビティのライフサイクルにおけるステージ間を移動するために、Activity クラスには onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy() の 6 つのコールバックのコアセットがある。アクティビティが新しい状態になると、これらの各コールバックが呼び出されるようになっている。

##onCreate()とは
　onCreate()は、Activityがある間はずっと必要な処理の初期化を行う。Activityのライフサイクルのすべての期間の中で1回のみ実行する必要がある基本的なアプリの起動を実行する。

##onStart()とは
　onStart()はActivityが表示される前に呼び出されるライフサイクルイベントである。アプリが操作可能な状態にする準備を行うと、onStart()の呼び出しによってActivityがユーザに表示される。

##onResume()とは
　Activityが再開状態になるときにonResume()コールバックを呼び出す。ユーザはそこで操作を行うことができるので、実行状態とも呼ばれる。

##onPause()とは
　ユーザがActivityを離れることを最初に示すために、システムはonPause()を呼び出す。Activityがフォアグラウンドにいないことを示す。

##onStop()とは
　ユーザに表示されなくなったActivityは停止状態になって、onStop()を呼び出す。onStop()はActivityが非表示になったら呼び出されるライフサイクルイベントである。

##onDestroy()とは
　Activityが破棄される前にonDestroy()を呼び出す。アクティビティが終了するか、デバイスの向きの変更やマルチウィンドウモードといった構成の変更に伴ってActivityが一時的に破棄される状態のときに呼び出される。


#参考文献
[アクティビティのライフサイクルについて](https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja)
[知らずに作って大丈夫？Androidの基本的なライフサイクルイベント31選 (2/4)](https://www.atmarkit.co.jp/ait/articles/1604/04/news011_2.html#:~:text=onCreate()%E3%81%AF%E3%80%81Activity%E3%81%8C,BroadcastReceiver%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AA%E3%81%A9%E3%81%A7%E3%81%99%E3%80%82)
MIMEマルチパート形式を使用してshell-scriptとcloud-configをuser-dataに指定する

## 概要
- クラウド環境へのインスタンス構築でuserdataを指定する際に、通常ではshell-scriptとcloud-configの両方を指定することができない。
- MIMEマルチパート形式のファイルを作成すればそれをuserdataに指定することでshellとcloud-configの両方がcloud-initで実行可能となる。

## command

- commandフォーマット

```
write-mime-multipart --output=<アウトプットファイル名称> <インプットcloud-configファイルパス>:text/cloud-config <インプットshell-scriptファイルパス>:text/x-shellscript
```
- command例

```
write-mime-multipart --output=hybrid-userdata ./cloudconfig.yml:text/cloud-config ./shellscript.sh:text/x-shellscript
```

## 文字コードの変換が必要な場合

- マルチパート形式のファイルを作成する際、作成元のファイルの文字コードがutf-8の場合に正常に変換できなかった。`write-mime-multipart`のオプションで自動で変換する方法が見当たらなかったためiconvで変換してからファイル作成した。

```
iconv -c -f UTF-8 -t US-ASCII shellscript.sh -o shellscript.sh
```
【ShaderGraph】トゥーンっぽい炎の演出をShaderGraphで作ってみる

本記事は「[サムザップ #2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/sumzap2)」の12/10の記事です。
昨日の記事は @ozaki_shinya さんの「[ScriptableObjectでシステム系クラスを実装する](https://qiita.com/ozaki_shinya/items/04db1b4bfbf6bb1435c2)」でした。

# はじめに
[サムザップ #2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/sumzap2)、2つ目の記事になります。
前回と同様にShaderGraph周りで書いていこうと思います。
今回はトゥーンっぽい炎の演出をShaderGraph使って表現してみようかなと思って作ってみました。

# 準備
「Universal Render Pipeline（以下、Universal RP）」と「Shader Graph」の導入から行います。

## 使用したバージョン
今回、使用した環境のバージョン情報は下記になります。

|項目|バージョン|
|:---|---:|
|Unity|Unity2019.4.10f1|
|Universal RP|7.3.1|
|Shader Graph|7.3.1|

※Universal RPの設定周りの説明は省略します（今回の設定周りは下記記事と一緒です）
[【ShaderGraph】Quadで擬似的な3D空間を表現したサンプルを紹介](https://qiita.com/kida_hironari/items/7e9255745ff74c1b66f3)

# 作成したShaderGraphの紹介
作成したShaderGraphの全体像がこちらになります。
![Fire_ShaderGraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209889/1b9df25d-99b1-05a1-0f4e-eb5d97943d42.png)
量が多いので、番号振った順に紹介していこうと思います。
![Fire_ShaderGraph_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209889/d0ad174a-d795-c8be-e102-0cd96c20ac17.png)


## 1.UV Sample Texture
TimeでNoiseTextureがUVスクロールするように計算します。
![UV Sample Texture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209889/b0f0ba84-39dc-644b-010c-7eb261f88e3b.png)

## 2.Calculate UV
1の結果を使用して、UV周りの計算をします。
![Calculate UV.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209889/2fd87ecb-b41c-943d-4037-d673319e7a84.png)

## 3.mask sample
Mask画像を元にFire側とFire Alpha側のマスクテクスチャ周りの計算をします。
![mask sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209889/54ff848b-c766-b16d-569e-dc98f75142e0.png)

## 4.Calucrate fire
2,3の計算結果を使って、炎演出の内側部分の表現を計算して、その結果をUnlit MasterのColorに流します。
![Calucrate fire.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209889/5e8958d1-81b9-4ed1-edbf-fd23f6edf9b7.png)

ここまでで、炎演出の内側部分は完成です。残りはAlphaの計算をするだけです。

## 5.Calculate Alpha
2,3の計算結果を使って、炎演出の外側のゆらめき表現させるための計算して、その結果をUnlit MasterのAlphaに流します。
![Calculate Alpha.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209889/0a0f017d-f58a-5609-1ef4-b930bc725f72.png)
ここでVoronoiTextureを態々用意していますが、Shaderだけで完結できそうなので、これは改修の余地ありです…

# 今回作成したもの
今回作ったものはこちらになります。
Quadにマテリアル割り当てるとこんな感じです。
![demo_fire_quad.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209889/d534ead4-448d-f3b5-6d9f-c282d2122c45.gif)
で、適当に用意したパーティクルで再生すると…
![fire_particle_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209889/cac5c635-e8d5-5d49-8bba-7883adb350ed.gif)
炎の呼吸 弐ノ型 昇り炎天っ！ってことで、ShaderGraphで炎を出すことができました。
 ← 流行りに乗っかってやりたかっただけ…w
（タイトルも「ShaderGraph使って炎の呼吸を習得してみる」にしようと思ったけど辞めました…笑）

上にも記載しましたが、VoronoiTextureを態々用意しているのを辞められそうなので、時間があるときに修正してみようかなと思います。

# 最後に
明日は @mikami_akihisa さんです。
macOS(BigSur)でVSCodeがカクカクする問題

MacOS BigSur でVScodeがカクカクする、ラグいなどの問題が発生したのでその対応方法。

## TL;DR

ターミナルで以下を実行。以上。

```bash
codesign --remove-signature /Applications/Visual\ Studio\ Code.app/Contents/Frameworks/Code\ Helper\ \(Renderer\).app
```

## 該当のissue

[Integrated Terminal Lags Intermittently #105446](https://github.com/microsoft/vscode/issues/105446)
Microsoft 365 Business Basicを始める

# 概要

個人的にMicrosoft365を使って色々検証したいので、Microsoft365を契約することにした。
会社でも契約しているものがあるが、会社の資産だし、好き勝手できるものではないため、勉強がてら。

興味があって使ってみたいな〜と思っているのが、SharePointやPowerApps/PowerAutomateあたり。

# Microsoft365のどのプランを利用するか

まず、Microsoft365って色んなプランがあって、どれを選んだらいいのか非常に悩ましい。
今回私が選んだプランは`Microsoft 365 Business Basic`ですが、どうしてそれを選択したのかについて軽く触れておきます。

選ぶ際のポイント

- 個人的にパッケージ版のOfficeを所持しているため、WordやExcelをクライアント端末にインストールできる必要はない
- SharePointやPowerAppsなどが利用できた方がいい（というかそれを検証するために契約する）

で、まず最初に見つけたのがプラン別の価格情報
https://www.microsoft.com/ja-jp/microsoft-365/business

ここでわかるのは以下3つのプランがあるということ。

- Microsoft 365 Business Basic
    - デスクトップ版のインストールライセンス（５台）が付いていないのでOffice製品をクライアントPC上やスマホ／タブレットで利用したい場合はNG
- Microsoft 365 Business Standard
    - デスクトップ版のインストールライセンスが付いている
- Microsoft 365 Business Premium
    - なんかプレミアムなことがさらにできる

この情報だけでは、PowerAppsやPowerAutomateが利用できるのか？SharePointは？という情報が載っていないので、さらに情報を探す。

見つけたのがこちら
[Microsoft 365 および Office 365 プラットフォーム サービスの説明](https://docs.microsoft.com/ja-jp/office365/servicedescriptions/office-365-platform-service-description/office-365-platform-service-description)

ここにはさらに色々なプランについて、利用可能な機能の比較ができる情報が載っていた。
このサイトの情報を確認すると、一番安い`Microsoft 365 Business Basic`でも、SharePointやPowerAutomate，PowerAppsが利用できることがわかった。

そのため、Microsoft 365 Business Basicをこれから始めようと思う。

# １ヶ月無料で試すを申し込む

Microsoft 365は１ヶ月間無料で試すことができるようで、継続してりようすることはわかっていますが、
せっかく無料で利用できるのなら、無料で使ってから有料ユーザーに切り替わろうかなと思います。

まずは利用しているメールアドレスを指定して、Microsoft 365 Business Basicへの申し込みを開始します。

![スクリーンショット 2020-12-09 19.04.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/1b1c8f62-7b89-964d-9ae9-7567193fad54.png)

利用者情報の入力には、会社名や会社の規模なども入れるようになっていましたが、
個人名を設定し、会社の規模も1名という選択があるので、1名にしました。

![スクリーンショット 2020-12-09 19.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/c070d5c1-e1ec-eb68-6962-a3a48c30945d.png)

利用者を特定するため、最近よくみかけるSMS認証などが求められます。
SMSで取得された番号を画面に入力し、認証を通します。

![スクリーンショット 2020-12-09 19.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/978b965b-5430-f25e-3c7a-6d7818af2953.png)

`onmicrosoft.com`のドメインに対してサブドメインを設定するようです。
適当なサブドメインをつけて次へ進みます。
※契約してしまうと、このサブドメインの変更はできないっぽいので、本当にいい加減な名前にしてしまうと後悔するかもしれません。ご注意を。

![スクリーンショット 2020-12-09 19.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/34e663fb-f51e-38f9-2a02-4ac6105ad65d.png)

利用するユーザー数を指定し

![スクリーンショット 2020-12-09 19.02.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/3d15745b-17e6-b483-f285-267091a96f93.png)

クレジットカードの支払い情報を入力すると契約申し込みは完了です。

![スクリーンショット 2020-12-09 19.03.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/9bbd9336-64a1-6085-71bb-cd597b0a00ad.png)

このあと、`****.onmicrosoft.com`ではなく、企業で持っているドメインを設定するか？
追加するユーザーはいるか？などの設定をMicrosoft365管理センターで実施していく。
完了すると以下のような感じになる。

![スクリーンショット 2020-12-09 19.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/2e37d95f-2c8b-8e73-340f-8d3e4d423a3c.png)

とりあえず、SharePointはちゃんと使えそうですね。

![スクリーンショット 2020-12-09 19.22.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/f953df80-c589-dade-4087-23e3af62e1db.png)
Laravelで419エラーが出る時のチエックリスト on AWS 

## はじめに
最近AWS特にCloudFrontを使った環境でLaravelを構築したらログインできないことがあったのでそのメモ

## 本記事の対象者
AWS環境でLaravel動かそうとしたんだけどなぜか419エラーが出た人向け

## チェックリスト
### AWS以前に
- [ ] bladeにCSRF対策はしているか？ (@csrfは入っているか？)

### CloudFront使ってる場合
- [ ] Allowed HTTP Methodsの項目でPOSTは許可されていますか？
- [ ] Forward CookiesがNoneになっていませんか？
- [ ] Query String Forwarding and CachingがNoneになっていませんか？(Sosialiteなどの外部認証機能を使っている場合)

参考にさせていただいた記事
https://qiita.com/aminevsky/items/04cdf17686e28c9847c4
https://qiita.com/apricotcomic/items/3a791da964403183fcfe
UdemyでDocker入門してみた

初めまして。「あなたの学びをシェア！2020年までにUdemyで学んだこと03【PR】Udemy Advent Calendar 2020」の9日目を担当させていただきます。

今回は、私がDocker入門として購入した、「[米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/course/aidocker/)」について記事を書きたいと思います。

## 自分の経験
RailsでWebサービスの開発インターンを1年弱経験。Dockerは使用経験なし。
Linuxやgitは使用経験ありといった経験値です。

## この講座について
### レベル
初級〜上級

「Dockerとは」といった初球の内容から、CICDパイプラインの構築といった実用的な範囲まで網羅的に学ぶことができます。

### 学べること
- Dockerfileを書き、実際にコンテナを立ち上げることができるようになる
- Docker-composeを使って、複数のコンテナで構成されるWebアプリケーションの開発環境を整えることができる
- Dockerを使ったCICDパイプラインの構築
- Linuxの基礎コマンドなど，プログラミング学習に必要な知識の習得

### ボリューム
土日で一通り学ぶことが可能です

## 実際に作成したDockerfileとdocker-composeファイル
講座ではデータベースは`postgres`を使っていたのですが、`mysql`で構築してみました。また、講座ではruby2.5のDocker Imageを使用しているのですが、ruby2.6でrails6の環境構築を行いました。

rails6ではwebpackerがデフォルトのJavascriptコンパイラになっている影響で、node.jsのインストール関連で躓いたのが印象に残っています。

Dockerfile

```Dockerfile
FROM ruby:2.6
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install -y \
    build-essential\
    libpq-dev\
    nodejs\
    yarn
WORKDIR /work_dir
COPY Gemfile /work_dir/Gemfile
COPY Gemfile.lock /work_dir/Gemfile.lock
RUN bundle install
COPY . /work_dir

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]
```

docker-compose.yml

```docker-compose.yml
version: "3"

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: <%= ENV.fetch("DATABASE_PASSWORD") %>
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/work_dir
    environment:
      - "DATABASE_PASSWORD=password"
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
volumes:
  mysql-data:
    driver: local
```

## 受講してよかった点・感想
Dockerという今や当たり前の技術を学べて、満足度は星5つです。

ボリューミーな内容なので、2周することをお勧めします。
「なぜDockerが必要なのか」、といったWhyの部分と、「docker-composeとは」、といったWhatの部分が両方あったのですんなりと理解がしやすい講義内容だと思います。

また、ShellやKarnelといったOS周りの知識もこの講座を通じて少し身につけることができました。
【数学】similarity(類似度)を計算する時、Inner Product(内積)を使う理由

<h1>Deep Learningで使われるSimilarityについて考える</h1>
DeepLearningの論文を読んでるとSimilarityを計算するのにInner Productが使われている場面を多々見かけます。

Stereo Depth　EstimationにはCorrelation(相関性)という言葉で表されています。

私が思うに相関性を見るのに2つ方法があり、
1. 左右の特徴量を引き算の絶対値が0に近いとSimilarityが高い
2. Inner Productを使い値が大きいとSimilarityが高い

<h1>実験</h1>
subtract(引き算)のabsolute(絶対値)の場合
abs(0-0) = 0 / abs(0-1) = 1 / abs(1-0) = 1

Inner Product(内積)の場合
0x0 = 0 / 0x1 = 0 / 1x0 = 0

<h1>考察</h1>
Inner Productの場合、1方がとある特徴がなく、もう1方はとある特徴がある場合に相関関係が0になる事が見てわかります。
よってInner Productを使う事で特徴が似ている場合にのみ相関関係があると判断する事が出来ます


<h1>感想</h1>
最初は「引き算して絶対値が近ければSimilarity高いでしょ！」と思っていたのですが、
気づけば当たり前の事だったのですが、掛け算したほうが相関関係が分かるという事に気づきました。

高校で勉強したのですが、実践になって改めて理解出来ました。
「ConoHaカード 10万円ぶん」を買って、2年が経ちました。

# はじめに

この記事は、「ConoHa Advent Calendar 2020」10日目の記事です。 
https://qiita.com/advent-calendar/2020/conoha

```
「妻がオオアリクイに殺されて1年が経ちました」ネタをもってきたつもりでしたが、
さすがにこれ以上ネタに走るとセルリアンに食べられてしまいそうなので、
この辺にしておきます（）
```

# 今日のVPS占いランキング！
## 2020年 12月 10日（大安）
ラッキーネームサーバは「djbdns」！
ラッキー市外局番は「0990」！
ラッキーアプライアンスは「Cobalt RaQ 4」！
今日も一日HappyHacking！！


# ConoHaカード 10万円ぶんを買った

2年ほど前、「ConoHaカード大量購入サービス」にて、ConoHaカード 10万円分を購入しました。 
https://www.conoha.jp/conohacard/tairyo/

その当時のスライドは、こちら。
https://www.slideshare.net/kmikage/10-107817549

そして、2020-07-06、すべてのカードをアカウントに登録しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/65affbe8-fe0a-dc11-5d46-b0f9ddfd7709.png)

最終的に、**1,567円ぶん** が期限切れとなりました。 
もくろみ通り、2年でいい感じに消化していました。 


# 10万円で、何やってたの？？

基本、検証系の作業や、開発作業と、若干のお遊び程度なのですが、、、

- Windows Server 2019上で、OBSでの配信作業の実験
- 踏み台にして、リモートのルーター設定したり、リモートのルーター設定したり
- 生成したデータをAWS S3に叩き込むゲートウェイにしてみたり
- Ubuntu Server 18.04LTS(Beta)上でのDockerのテストと称し、512Mインスタンス上で100コンテナ起動したり
- 北海道の震災の関係で使ったり
- COVID-19関係のデータを集めたり、計算させたり
- とある電話系アプリの開発したり
- Adventカレンダーのネタ作ったり

いろいろお役に立ってくれました。はい。

個人的には、「Windows Server 2019上でOBSを回した」というのが割と楽しかったのですが、NVENC使えないぶん、CPUいっぱい使ってて・・・という感じでした。（苦笑
詳しくは、このあたりにテキトーに纏めてあります。
http://blog.mikalab.info/archives/29605767.html

```
昨今は、GPGPUインスタンスでNVENC回す方が効率的ですし、
自分もGTX 1050TiでNVENC回すように変わったので、
もはやffmpegくらいでしかCPUエンコーディングはしないのですが・・・
```

あとは、[「InterQ 東京APを復活してみた」](https://youtu.be/-VV3YIovhL0)とか。
この時は、Asterisk + YAMAHA RT58i + NEC IX2105 + SoftEther + ConoHaとかいう構成で、自宅のアナログモデムから、自宅のアナログモデムにPPPしてた気がします。（遠い目）

併せて、自宅から物理サーバを全てConoHa上に引っ越していて、ConoHa上でブロードバンドルーターの自作とかもしておりました。

・・・ヒマだったんだな、あのときの自分。（遠い目）

# おわりに

今年(2020年)の1月に、新成人のお兄さんと都内某所で飲んでいて、こんな会話をしておりました。

爺「このは先生が～～」
兄「このはって、サーバーの？」
爺「うん、あそこのキャラクター居るって、知らない？」
兄「知らなかった・・・」

他、何人か技術系の友人（18～22歳くらい）に聞いてみても、 *「美雲このはを知らない」* という方が多く・・・
（このは先生の活動が、技術系から離れて行ってる事も、一因かもしれませんが、、、）

なんだかんだ、僕も歳をとったなー、と思います。はい。
ConoHaとも、気づいたら6-7年のお付き合いになるのか・・・

最近は、IT系に関わらなくなり、昨今はConoHa2上で、20GB世代の512Mインスタンス 1個が動いている状態です。
bashとかも、あまり触らなくなりました。（笑

最近、足腰弱くなってきたし、白髪も増えてきて。
今年はついに、いつものネタ枠の方々も今年は見かけないようなので、自分もそろそろ引退かなー・・・と。。。

```
当面は、双葉杏（推し）を見習って、思いっきりダラける所存です。

- 我々は絶対に働かない
- 自由こそが素晴らしい
- 週休8日を希望する！
- なんでもいいから、飴なめたい！！
```

お後がよろしいようで。

# あしたのおはなし
明日は、reasonsetさんが、何かを思い出して書かれるそうです。 
どうぞ、お楽しみに。 
https://qiita.com/advent-calendar/2020/conoha

---
## 追伸
カレンダーは開封頂いてOKですので、サイン入りでおねがいしますっ ＞ このは先生
（ダメなら、ひろのぶ先生が、データセンタまでサイン貰いに来てくれる、はずｗ）

## 追伸2
自分みたいなダメ人間を、長い間どうにかして頂き、本当にありがとうございました。。。（涙） ＞ N尾さん・ひろのぶ先生・あんずママ etc...

## おまけ
データ探してたら、こんなん出てきた。
「友人構築」が、確かOSC14Tkでのネタだったので、それ以降に作った、ハズ。（）

![クラウドサーバー「ConoHa」とは_-_YouTube.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/20d9e298-3c6f-75be-127d-0b602117fd14.png)
[ServiceNow]クライアントメールを使用可能にする

4か目にして、もはやネタに困っています。
でも頑張ります。

#概要
 Formの右側のメニューから、メール送付ができるようになっているが、
 デフォルトでメール送信できるようになっている画面とできない画面がある。
 デフォルトでメール送信出来ない画面で、出来るようにする設定方法を記載する。

[Incident]
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/236abb32-3f42-1cef-7fae-5a2e11abadf3.png)

[Problem]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/f543db68-dd62-3f27-0dd2-50734142258f.png)


#設定方法
 ProblemでMail使えるようにしてみる。

 system Definition > Dictionaryを開き、Table名(Problem)で検索する。
 一覧に出てきたものから、Typeが「Collection」となっているものを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/1cd3a2ea-a02f-403a-920b-e605f43fe16c.png)

 Attributeに「Email Client」を設定するだけ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/1958bc3e-7f59-4a5f-400d-c40fa02dcd00.png)

すると、Problemの画面で、メールクライアントが使用可能となる(・ω・)/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922262/7d5d8670-04ab-d527-e0c8-3eebaaadc8ba.png)
【Rails】ActiveHachで作成したmodelの中身を一覧表示したい!!と思ったので実装してみた

# 挑戦すること
ActiveHashで作成したmodelの中身を一覧表示します。

## 前提
**投稿テーブルに紐づいたActiveHashで作成したカテゴリーテーブルを一覧表示したい！**

ちなみにActiveHashとはこんな感じです。
idで取得してnameで表示するといった実装方法かと。

今回は、こちらのnameをそれぞれ一覧表示していきます。


```models/category.rb
class Category < ActiveHash::Base
  self.data = [
    { id: 1, name: 'hoge' },
    { id: 2, name: 'huga' },
    { id: 3, name: 'hogehoge' },
    { id: 4, name: 'hugahuga' },
  ]

  include ActiveHash::Associations
  has_many :posts
end
```

# 実装方法
1. routeを定義
2. コントローラーを設定
3. ビューファイルを作成
4. リンクを作成

手順は上記の通りです。
順に解説していきますね。

## 1.Routingを定義する

カテゴリー一覧ページに必要なルートを定義します。

```ruby
get '/posts/category/:id' => 'posts#category'
```

## 2.コントローラーを編集

カテゴリーページに必要な変数を定義します。

```ruby
def category
 @posts = Post.where(category_id: params[:id]).order("created_at DESC") #追記
 @post = Post.find_by(category_id: params[:id]) #追記
end
```

## 3. ビューファイルを作成

カテゴリー一覧表示の見た目を作ります。
フロントはお任せいたします。

```categories/index.html.erb
# カテゴリー名を表示
<%= "#{@post.category.name}の一覧ページ" %>

# カテゴリーの中身を表示
@posts.each do |post|
 #省略
end
```

## 4.リンク作成

カテゴリーページに遷移するためのリンクを作成します。
今回の場合であれば投稿一覧ページとかに追記するのが一般的かと思われます。

```posts/index.html.erb
<%= link_to "カテゴリー名", '/posts/category/1' %>
<%= link_to "カテゴリー名", '/posts/category/2' %>
<%= link_to "カテゴリー名", '/posts/category/3' %>
<%= link_to "カテゴリー名", '/posts/category/4' %>
```

実装は以上になります。
皆様うまく実装できたでしょうか？

個人的にActiveHashを用いたカテゴリー一覧ページを実装したかったので、今回投稿させていただきました！

また、何か相違点などございましたらコメントしていただけると幸いです。
よろしくお願いいたします。
キーボードの表示をPickerViewにする方法


キーボードのデフォルト表示をinputViewを使って表示してみましょう！

コードはこんな感じです！

```Swift:sampleViewController.swift
import UIKit

class sampleViewController: UIViewController {
    
    @IBOutlet weak var PickerTextFiled: UITextField!
    let PickerView = UIPickerView()
    let PickerList = ["りんご", "ばなな", "ぶどう", "すいか",  "かき",  "なし"]
    override func viewDidLoad() {
        super.viewDidLoad()
        setupProjectPickerView()
    }
    
    
    
    func setupProjectPickerView() {
           PickerView.dataSource = self
           PickerView.delegate = self
           PickerView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: PickerView.bounds.size.height)
           let PickerV = UIView(frame: PickerView.bounds)
           PickerV.backgroundColor = UIColor.white
           PickerV.addSubview(PickerView)
           
           // キーボードをpickerViewに!!
           PickerTextFiled.inputView = PickerV
       }
  
}

extension sampleViewController: UIPickerViewDelegate, UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return PickerList.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return PickerList[row]
    }
    
    
}

```

`PickerTextFiled.inputView = PickerV`
これで設定が可能です！

![スクリーンショット 2020-12-09 18.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684645/0dac49d0-f731-065e-0d91-25c9359d63b4.png)


こんなふうにデフォルトで表示することができましたね！
[GCP]GCS+LB構成の静的サイトに対してIP制限をかけたかったけど諦めた話

GCS+LB構成の静的サイトに対してIP制限をかけるために、Cloud Armor使ってハマった時の忘備録。
結論諦めました。何かいい方法知ってる人いたら教えてください。

## やりたいこと

**GCS+ロードバランサ構成**の静的サイトに対して、**IP制限**を行いたい。

[Cloud ArmorでGoogle Cloud Load Balancerへのアクセス元IPアドレスを制限する - 本日も乙](https://blog.jicoman.info/2018/10/restrict-ip-addr-google-cloud-load-balancer-in-cloud-armor/)
ふむふむ、どうやらこの記事を見るとロードバランサに対するIP制限は**Google Cloud Armor**というサービスを使えばできるみたい。

ちなみに

- GCS自体にIP制限はできない
- ファイアウォールはロードバランサに設定できない(GCEに対してのみできる)

さて、Cloud Armorで設定しよう！

## つまったこと
[Google Cloud Platform](https://console.cloud.google.com/net-security)を開き、ポリシー作成画面を開く。

名前を入力して・・・ん？
![スクリーンショット 2020-12-09 15.33.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/8e111698-b29e-1bb5-b28a-edad1a173472.png)
あれ、ターゲットが指定できない・・・？
作成しているはずのロードバランサが入力欄に出てこない。

## 原因
**バックエンドサービスとバックエンドバケットは別物**

この一文が忌まわしい・・・
![スクリーンショット 2020-12-09 15.33.00 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/2040236f-a0ec-8911-ab85-e934f468968e.png)

それぞれの違いを確かめる。

**[バックエンドサービス](https://cloud.google.com/load-balancing/docs/backend-service)**・・・GCEインスタンスグループまたはNEGから構成されるもの
**[バックエンドバケット](https://cloud.google.com/load-balancing/docs/https/ext-load-balancer-backend-buckets)**・・・GCSから構成されるもの

紛らわしい！泣

バックエンドバケットは指定できないのか・・・しょんぼり。

SDKコマンドも確認したけど、バックエンドサービスに比べてバックエンドバケットは設定できるオプションが少ないみたい。

[gcloud compute backend-buckets update  |  Cloud SDK のドキュメント](https://cloud.google.com/sdk/gcloud/reference/compute/backend-buckets/update)
[gcloud compute backend-services update  |  Cloud SDK のドキュメント](https://cloud.google.com/sdk/gcloud/reference/compute/backend-services/update)

（今回だと [--security-policy=SECURITY_POLICY] のオプション指定）

## その他ためしたこと
IPじゃなくてバケットの権限で登録したユーザだけ閲覧できるようにしようかなと試したけど、
オブジェクト同士の読み取りができないせいでcss等が当たらずレイアウトがひどい感じに・・・

## 解決策
多分VPCとかこの辺りの記事見たらできるのかも。（投げやり）
[専用線経由でお手軽にGCSを使ってみる! | apps-gcp.com](https://www.apps-gcp.com/gcs-via-deedicated/)

自分はもうAWSに浮気します。ごめんなさい。

おしまい。
【git rm】 git管理下から余計なファイルを取り除く！


## 概要
gitの管理下に置きたくないファイル。皆さんもありませんか？
先日、vendorディレクトリ以下を管理から外したいと思った時、苦戦してしまいました。
今後も使うため、その時に使用したコマンド・資料を記録したいと思います


## 対象
**gitの管理下に入っているファイルを、管理下から外したい方**
例）
- 自動に作られるファイル
- APIキーなどの拡散してはいけない情報


##コマンドと流れ
#### ①.gitignoreの管理下から削除
```terminal:ターミナル 
 git rm --cached [ファイル名]
 git rm -rf --cached [フォルダ名]
```
これで管理下から削除されます

#### ②.gitignoreに記述
```terminal:ターミナル 
 #ファイルを除外する場合、ファイル名を記入
 index.html.erb

 #ディレクトリ以下を除外する場合は、ディレクトリ名/
 dir/
```

```terminal:今回
/.bundle
/vendor/bundle
```
この記述を忘れないようにしたいです。
詳しい記述のリンクを貼っておきます。
[.gitignore の書き方](https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff)

####③.gitignoreの管理下にあるか確認

```terminal:ターミナル 
git status --ignored
```

## rmが反映されない時に試して欲しいこと
後日 **git rm -rf --cached [フォルダ名]** を使用した時、反映されませんでした。


```terminal:ターミナル 
#そんなファイルありません！
❯ git rm -rf --cached vendor/
fatal: pathspec 'vendor/' did not match any files
```

その場合は、**git add** を実行してから、再度実行してください。
ステージに上げないと、そもそも記録されていないので、消せないという現象かと思います。
空白では送信されないようにする

#inputタグなどで記入したデータを送信する際に空白では送信されないようにする。


if(input.value != "") { 　　 //空白でなければ実行
    new item(input.value);　  //itemクラスの実行
    input.value = "";  　　　//空白では表示されない
  }
【Rails】ソート機能実装と意外な落とし穴

一覧表示画面にソート機能を実装した際、陥った内容を備忘録として残しています。
## 前提
### テーブル
stockモデルを作成し、こんな感じのテーブルにします。

```ruby:create_stocks.rb
class CreateStocks < ActiveRecord::Migration[6.0]
    def change
      create_table :articles do |t|
        t.string :name, comment:'商品名'
        t.string :status, comment:'ステータス'
    
        t.timestamps
      end
    end
end
```
### コントローラー
お次はコントローラー

```ruby:create_stocks.rb
class StocksController < ApplicationController
  helper_method :sort_column, :sort_direction

  def index
    @stocks = Stock.order("#{sort_column} #{sort_direction}")
  end


  private

  def sort_direction
    %w[asc desc].include?(params[:direction]) ? params[:direction] : 'asc'
  end

  def sort_column
    Stock.column_names.include?(params[:sort]) ? params[:sort] : 'id'
  end

end
```
- ソートキーを返すsort_directionを作っておきます。初期値は、idです。
- 順序の方向（ascか desc）を返すsort_columnを作っておきます。初期値はasc(昇順)です。
- sort_directionとsort_columnはviewからも使えるようにするためにhelper_methodに追加しておきます。

### ヘルパーメソッド
ヘッダーにソート機能を追加するためのHelperメソッドを作ります。

```ruby:stocks_helper.rb
module StocksHelper
  def sort_order(column, title)
    direction = (column == sort_column && sort_direction == 'asc') ? 'desc' : 'asc'
    link_to title, { sort: column, direction: direction }
  end
end
```
- link_toには、次にクリックされるときのソートの方向をパラメータに設定したリンクを作りたいので、今とは逆のdirectionにしています。

### ビュー

```ruby:index.html.erb
<table>
   <thead>
     <tr>
       <th><%= sort_order "name", "商品名" %></th>
       <th><%= sort_order "status", "ステータス" %></th>
     </tr>
   </thead>
   <tbody>
     <% @stocks.find_each do |stock| %>
     <tr>
       <td><%= stock.name %></td>
       <td><%= stock.status %></td>
     </tr>
     <% end %>
   </tbody>
</table>
```
Helperで作成したsort_orderを<th>に追加しています。
やった！出来た！と思ったのですが・・・ソートしてくれないのですよね。コレ。
何が悪いのだろう・・・。

## 「find_each」
答えは「find_each」を使っているせいでした。

```ruby:index.html.erb
<table>
   <thead>
     <tr>
       <th><%= sort_order "name", "商品名" %></th>
       <th><%= sort_order "status", "ステータス" %></th>
     </tr>
   </thead>
   <tbody>
     <% @stocks.each do |stock| %>
     <tr>
       <td><%= stock.name %></td>
       <td><%= stock.status %></td>
     </tr>
     <% end %>
   </tbody>
</table>
```
こちらに記述変更するとちゃんと動いてくれました！
でも何でなのだろう・・・。ターミナルで確認してみると

```ruby
  Stock Load (3.1ms)  SELECT `stocks`.* FROM `stocks` WHERE (`stocks`) ORDER BY `stocks`.`id` ASC LIMIT 1000
```
う〜んよくわかりませんが、どのカラムで試しても同じ回答なので
どうやら、find_eachを使うと、必ずモデルのidの昇順でソートを行う様です。
メモリ対策としてfind_eachを使いましたが、こう言う落とし穴があるとは・・・。
「find_each」ご利用の際はご注意くださいませ。
## 参考にさせて頂いたサイト様
https://note.com/marikooota/n/n147691118c21
感謝！
ただ、件数(行数)が増えたときほどソート機能は便利だと思うのですが、対応策とかないのかな？？
素直に検索機能付けたほうがいいのかな？進展ありましたら記述します。
grepとsedでファイル名一括変換

個人的備忘録
あほなのでImageMagickでHEIC画像をPNG画像に変換したときに拡張子が変についてしまったので削除したかったやつ

### やること
`.heic.png`という拡張子がついているファイル名を`.png`に直す（データそのものはPNG画像なのでファイル名だけ）
`\1`でキャプチャが取れるの初めて知りました。

```bash
ls | grep -i ".heic.png" | sed 's/\(.*\).HEIC.png$/mv & \1.png/g'
mv IMG_8283.HEIC.png IMG_8283.png
mv IMG_8284.HEIC.png IMG_8284.png
mv IMG_8285.HEIC.png IMG_8285.png
mv IMG_8286.HEIC.png IMG_8286.png
mv IMG_8302.HEIC.png IMG_8302.png
mv IMG_8303.HEIC.png IMG_8303.png
mv IMG_8925.HEIC.png IMG_8925.png
mv IMG_8930.HEIC.png IMG_8930.png
mv IMG_8937.HEIC.png IMG_8937.png
```

`mv`コマンドが作れたので`bash`に渡して完了

```bash
ls | grep -i ".heic.png" | sed 's/\(.*\).HEIC.png$/mv & \1.png/g' | bash
```

### 参考
[[Linux]大量のファイル名のリネームをコマンド一発で実行するヒント](http://pixelbeat.jp/rename-bunch-of-files-with-oneline-command/)
Python3: POP3 でメールの受信

次の記事を参考にしました。
[Pythonでメール受信; poplibのサンプルコード](https://qiita.com/takey/items/a7e843255da8052c64b8)

```py:get_pop3.py
#! /usr/bin/python
#
#	get_pop3.py
#
#						Dec/09/2020
#
# --------------------------------------------------------------------
import os
import sys
import base64
import email
import poplib
import ssl
from email.header import decode_header, make_header
from dotenv import load_dotenv

# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
dotenv_path = '.env'
load_dotenv(dotenv_path)
#
server= os.environ.get("SERVER")
usr= os.environ.get("USR")
password= os.environ.get("PASSWORD")

port = 995

context = ssl.create_default_context()
popclient = poplib.POP3_SSL(server, port, timeout=10, context=context)
popclient.set_debuglevel(0)


auth_method = "user"

popclient.user(usr)
popclient.pass_(password)


download_num = 1
msg_list = []
msg_num = popclient.stat()[0]
sys.stderr.write("msg_num = %d\n" % msg_num)

if msg_num <= download_num:
	 download_num = msg_num
for i in range(download_num):
	 msg_bytes = b""
	 for line in popclient.retr(download_num)[1]:
		  msg_bytes += line + b"\n"
	 msg_list.append(email.message_from_bytes(msg_bytes))
popclient.quit()


for msg in msg_list:
	from_addr = str(make_header(decode_header(msg["From"])))
	subject = str(make_header(decode_header(msg["Subject"])))
	print("From:{}".format(from_addr))
	print("Subject:{}".format(subject))
	print()

	if msg.is_multipart() is False:
		payload = msg.get_payload(decode=True)
		charset = msg.get_content_charset()
		if charset is not None:
			payload = payload.decode(charset, "ignore")
		print(payload)
		print()
	else:
		for part in msg.walk():
			payload = part.get_payload(decode=True)
			if payload is None:
				continue
			charset = part.get_content_charset()
			if charset is not None:
				payload = payload.decode(charset, "ignore")
				print(payload)
				print()
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

```text:.env
SERVER = 'mail.example.com'
USR = '*****@example.com'
PASSWORD = '*********'
```

実行方法

```bash
./get_pop3.py
```

次の環境で動作を確認しました。

```text
$ uname -a
Linux iwata 5.8.0-31-generic #33-Ubuntu SMP Mon Nov 23 18:44:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ python --version
Python 3.8.6
```

imap で受信する方法はこちら
[python でメールの受信](https://qiita.com/ekzemplaro/items/a35e15865d57372f1d2b)
ESP32のセキュアなプロトタイピング環境を作成した(通信プロトコル検討編)

#はじめに#
独学しているIoTセキュリティについて、集大成の意味合いを込めて現在理想と考えるセキュアなプロトタイピング環境を構築しました。
デバイス、サーバー、クライアントアプリの要素技術の勉強を含めて備忘録として分散して記していきます。
[前回](https://qiita.com/kmitsu76/items/831380bfd83bd0e7f8c6)、このプロジェクトにrainbowtypeと名前を付けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/b7bbd10f-0e39-95d9-4fa0-1379633198ce.png)

構成は上記となり、今回はサーバー側の実装を検討してみます。


#rainbowtype serverの実装#

rainbowtype bootloaderとの接続はwebsocketを採用した。
デバイスとの通信でMQTTは使ったことがあったが、websocketではどのようにするのか検討してみる。

MQTTの場合の構成イメージ：
今回の要件をMQTTで実現する場合、下記のイメージとなりそうだ。


MQTTブローカーに対して、複数のrainbowtype bootloader、およびrainbowtype clientがサブスクライブする。
それぞれがステータスをパブリッシュし共有する。
ブローカーはメッセージのルーティングなどは行わず、そのままを流すので、接続端末側でメッセージの中で自身に関係ないものはドロップするような処理が必要になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/b54e07fb-26b6-d299-d9e4-ee5d8c9e0e32.png)

一方websocketはもっと低レイヤーな実装になる。
MQTT over websocketという実装もあったり、よくあるチャットアプリの実装例のように、ブラウザとサーバー間のリアルタイム通信に使う例が多い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/a6221e7f-961e-1bd4-007e-c9a234fec206.png)

websocketは1対1の通信のみを取り扱うため、ルーティングは別途実装する必要がある。
そこでwebsocket serverに提示されるデバイス証明書のコモンネームを使って接続元識別を行い、インスタンス（接続毎の実体）の配列を作成し、メッセージ内に書かれた宛先情報と配列内に保存しておいたコモンネームが一致するインスタンスを見つけ、そのインスタンスのsendメソッドを使ってメッセージ送信を行う方法を構築した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/520a57fd-7f44-ac9f-8028-3bc143843f1a.png)

余計な相手に情報を送らなくてもいい点はセキュリティ強化によいだろう。
調査しきれていないが、Socket.io、Crossbar.ioなどがルーティングを合わせて提供する
Web Application Messaging Protocol(WAMP)という実装を実現しているようだ。
マイコンレベルまで対応クライアントが出てくれば使いやすいかもしれない。
ESP32のセキュアなプロトタイピング環境を作成した(デバイスプログラム実装編)

#はじめに#
独学しているIoTセキュリティについて、集大成の意味合いを込めて現在理想と考えるセキュアなプロトタイピング環境を構築しました。
デバイス、サーバー、クライアントアプリの要素技術の勉強を含めて備忘録として分散して記していきます。
[前回](https://qiita.com/kmitsu76/items/831380bfd83bd0e7f8c6)、このプロジェクトにrainbowtypeと名前を付けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/74fac3d9-5d21-b2e7-d515-32679aaf8d3f.png)

構成は上記となり、今回はデバイス側の実装を検討してみます。


#rainbowtype bootloaderの実装#

rainbowtype bootloaderには下記の機能を実装した。
①ステータスの設定:
★オフラインブート：rainbowtype bootloaderが起動したのち、Wifiに接続できない、rainbowtype serverに接続できない場合でも、すでに書き込まれたAppパーティションからのアプリの起動を許可する。
★オンラインブート：rainbowtype serverとの疎通が取れたら、すでに書き込まれたAppパーティションからのアプリの起動を許可する。
★強制ファームウェアダウンロードモード：rainbowtype serverとの疎通を取り、そこに置かれているファームウェアを毎回ダウンロードして起動させる。
★ブート禁止モード：OTAを実行せず、Appパーティションからの起動を禁止する。

②アクション設定：
★デバイス証明書更新：rainbowtype bootloaderを介してATECC608Aのもう1つのスロットに保存されている公開鍵を読み取り、rainbowtype clientで署名をして更新することができ、セキュリティ強度を維持する。
★OTA：rainbowtype clientで指定し、署名されたファームウェアが、rainbowtype serverへ配置され、そのファームウェアを読み出す設定を行う。
★URL設定:ATECC608A内のメモリ256バイトの空間へ、ユーザーアプリで使用するクラウド接続先のURL等を保存する機能。
	
③Wifi設定：
アクセスポイントモードを起動し、rainbowtype bootloader内のWEBサーバーへアクセスし、現環境のwifi　SSIDを表示させ、接続するパスワードの入力を受け付けwifiの接続を設定できる。
Wifi SSID、パスワードはATECC608A内に暗号化保存され、フラッシュ上への保存を不要とする。

まず、これらを設定するためのrainbowtype serverとのステータスの交換をwebsocketを使って行うことにした。
ステータスとアクションを設定するJSON、証明書、公開鍵の転送であればMQTTが最適だったが、ファームウェアの転送を行うためにバイナリ通信が必要となり、rainbowtype全体の通信プロトコルをwebsocketで統一した。

動作のフローチャートを作成してみた。
GPIO4の押し下げでデバイスステータスとWifi 接続情報(SSID,passの認証情報)をATECC608Aから読み出してrainbowtype serverへ接続するルーチンと、wifi設定を行ってATECC608AへSSID,パスワードを保存するルーチンと分けている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/43adeb79-19af-d950-c290-171824407ae8.png)
 
①ステータスの設定、②アクション設定はrainbowtype serverとのJSONのやり取りで設定していく。

③Wifi設定については、
[ESP32-wifi-manager](https://github.com/tonyp7/esp32-wifi-manager)を使わせていただき、これを組み込んで実現する。
組み込んだのは古いバージョンのもので、jqueryライブラリベースのjavascriptで実装されていたが、最新版では、依存がなくなっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/39902123-261c-061a-a2a2-cf9f5194e77c.png)
 
上記のようにSSIDをリスト化、選択して接続設定を行えるようにした。

②アクション設定のOTAについてはhttp接続を利用するが、ATECC608Aでの認証を利用したTLS接続をwebsocket時と同様に利用する。
暗号化されていないファームウェアをOTAすることになるが、その経路はハードウェアルートオブトラストの認証で守ることができる。
esp-tlsという中間スタック内のmbedtlsにATECC608Aを組み込むことで実現できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/c957e838-0e18-8fa6-97e7-9aadd8e1c4bb.png)

ソースコードは[rainbowtype-bootloader]( https://github.com/kmwebnet/rainbowtype-bootloader)に配置した。
【Rails】全ページに設置するサイドメニュー用のコントローラを作りオブジェクト指向っぽく書いてみる

#### はじめに
プログラミング初心者です！オブジェクト指向について学習中です！
自作webサービスの「サイドバー」の部分のコントローラ view間の実装においてオブジェクト指向の「名前付けのい概念」を意識してコードを書き直してみました！

####サイドバーの中に貼りたい要素
* ユーザーが執筆登録した小説のタイトル
* その小説の執筆するページへのリンク

これを実現するにはコントローラから、
**“現在ログイン中のユーザーの登録した小説のタイトル”と“id”のカラム値
をインスタンス変数で取得する必要がある。**

##サイドバーを設置するページ

```
1.執筆一覧ページ 
writings_controller.rb

2.タイトル/あらすじページ
novels_controller.rb）

3.プロットページ
plots_controller.rb

4.登場人物ページ
characters_controller.rb）

5.パスワード変更ページ
passwordresets_controller.rb
```

##流れ

①これらのページに対応した各コントローラでidとtitleカラムをインスタンス変数で取得

②コントローラで取得したインスタンス変数を使い、サイドバーのビューに
　"ユーザーが執筆登録した小説のタイトル”と"その小説の執筆するページへのリンク”
　に描画

③そのビューをパーシャル化して全ページビューに貼ります




##良い例・悪い例
今回のアプリのテーブルにはユーザーに該当するauthorsテーブル（current_user）とそのユーザーが登録する小説に該当するnovelsテーブルがあります。
この場合、目的である「ユーザーが登録した小説のタイトル」と「その小説の執筆するページへのリンク」をサイドバーに設置するにはcurrent_user.novelsのnovels（子テーブルの）id、titleカラムが必要になります。
つまり上記5つのコントローラでこのテーブル情報の取得をし、サイドバーのビューにインスタンス変数で渡してあげる必要となりますが、この書き方において、オブジェクト指向に則った良い書き方と悪い書き方を比べてみたいと思います！

**悪い例**

```ruby:controller
def index
・
・
 @novels_id = current_user.novels.order(created_at: :desc).pluck(:id)
 @novels_title = current_user.novels.order(created_at: :desc).pluck(:title)
end
```


```ruby:view
<% @novels_id.zip(@novels_title) do |novels_id, novels_title| %>
 <%= link_to "/novels/#{novels_id}/writings/new" do %>
 <%= novels_title %>
 <% end %>
<% end %>
```

ユーザーが登録している小説のタイトルとその小説の執筆作成リンク生成のためのidを取得するため明示的に情報取得し、このままビューで扱ういうオブジェクト指向を無視した書き方になります！
この場合、上記５つのコントローラの全アクションで同じ記述が必要になってしまいます>_<
　


##「ログイン中のユーザーが登録した小説」というオブジェクトを扱ったCurrentUsersNovelsコントローラを生成
```ruby:controller
class CurrentUsersNovelsController < ApplicationController
before_action :set_all_self_novels

 def set_all_self_novels
  @novels = current_user.novels.order(created_at: :desc)
 end
end
```
この様にbefore_actionでデフォルト取得させてあげれば、このクラスを継承した下位の全クラス
でこのインスタンス変数が使えます！

なので、この記述をして、、

```ruby:controller
class HogeController < CurrentUsersNovelsController 

end
```
このように該当する５つのコントローラにCurrentUsersNovelsControllerを継承させれば
@novels = current_user.novels.order(created_at: :desc)
がそのコントローラで扱える様になり、下記の様に記述も非常に簡潔にまとまります！


**良い例**

```ruby:controller
def index
#その他コード略
end
```


```ruby:view
<% @novels.each do |novel|  %>
 <%=  link_to "/novels/#{novel.id}/writings/new" do %>
 <%= novel.title %><br>
 <% end %>
<% end %>
</li>
```
以上です！
中学生でもできるMariaDB入門　#1

##あいさつ
初めての人は初めまして！知っている人はこんにちは！
中学生バックエンドPGのAtieです！
今回は「MariaDB入門」ということでMariaDBの入門の記事を書いていきます
MariaDB入門は3回に分けて記事を投稿していきます
では！

##データベースとは？
皆さんは「データベース」という言葉を聞いたことがあるでしょうか？
聞いたことのない人が大半だと思いますが聞いたことのある人でも「詳しく説明してよ！」といわれると
「うっ」と言葉を詰まらせてしまうのではないでしょうか
そんなデータベースの超基礎からしていきます

データベースとは「データをためておくことができる場所」と考えてください
例えばTwitterでツイートしたときのデータをためておく必要があります
その時に登場するのが**データベース**(以下DB)です
DBを使うことでツイートの内容の管理だけではなくいいね数やリプの数なども保存することができます
そしてためたデータを使いたいときに使いたい形で取り出すことができます
DBではExcelなどの表形式でデータを保存しています
これがDBなのです

##DBの用語
ではさっそく勉強！
の前に理解しておく用語があるので先にそちらを抑えてから学習に入ります
「なんで？」と思った方DBには専門用語があり前提知識なしだと学習が難しいですし用語が出てきたところでいちいち解説するのもめんどくさいのでスムーズに理解しながら学習を進めるために今ここでDBの用語を学んでいきます

###テーブル
DBでは一つ一つの表のことを**テーブル**と呼びます

###レコード
テーブルの一つ一つの行を**レコード**といいますといいます

###カラム
テーブルの列のことを**カラム**といいます

用語といってもこの三つだけを最初は覚えていれば大丈夫だと思います

##テーブルの作成
ではテーブルの作成をしていきます
デーブルを作成するには

```main.sql
CREATE TABLE テーブル名 (カラム名 型);
```
このようにして作ります
テーブルを作成するときは同時にカラムとカラムの型を指定する必要があります
カラムが複数ある場合は,で区切っていきます
では実際に作っていきます
今回はTwitterのようにツイートの内容といいね数を保存したいのでテーブル名はtweetsにします

テーブルはデータを複数保存するのでよく複数形で作成されます

```main.sql
CREATE TABLE tweets (tweet VARCHAR(140),likes INT);
```
これでテーブルの作成ができました

VARCHARの(140)というのは140文字までという意味です

sqlでは改行やインデントもできます

```main.sql
CREATE TABLE tweets (
    tweet VARCHAR(140),
    likes INT
);
```
のように書くこともできます
今回はカラムが複数あるので,で区切ってテーブルを作成しました

テーブルの構造を確認するには

```main.sql
DESC テーブル名;
```
とすることでテーブルの構造が確認することができます

```main.sql
SHOW TABLES;
```
とすることでテーブル一覧を見ることができます

しかしテーブルを一度作った状態でもう一度作ろうとするとエラーになり動きませんなので
コードを実行するたびにテーブルを削除していくようにします

```main.js
DROP TABLE IF EXISTS tweets;
```
DROP TABLE テーブル名で削除できるのですがテーブルがないとエラーになるのでif文でテーブルがあったら消すようにしています

##レコードの挿入
次にレコードの挿入をしていきます
レコードを挿入するには

```main.sql
INSERT INTO テーブル名 (カラム名) VALUES
    (挿入したいレコード);
```
でレコードを挿入することができます
ではtweetsとlikesにレコードを挿入していきます

```main.sql
INSERT INTO tweets (message, likes) VALUES
    ('Hello!', 5),
    ('Good!', 8);
```
これでレコードを挿入できました

文字列はシングルクォーテーションかダブルクォーテーションのどちらかで囲む必要があります

挿入したレコードを確認するには

```main.sql
SELECT * FROM テーブル名;
```
とすることで挿入したれーコードを確認できます

##データ型
つぎはデータ型を見ていきます
データ型は**データの形式**だと思ってください

###整数
**TINYINT** -128 ~ +127
**INT** -21億 ~ +21億
**BIGINT** -922京 ~ +922京

マイナスを使わない場合はUNSIGNEDキーワードを使ってマイナスを使わないようにしてあげることで扱える数が増えます

###実数
**DECIMAL** 固定小数点
**FLOAT** 浮動小数点
**DOUBLE** 浮動小数点(高精度)
「浮動小数点とはなんぞや」となるとデータサイエンスの基礎から話すことになるのでここでは触れません

###文字列
**CHAR** 0 ~ 255文字
**VARCHAR** 0 ~ 65535文字
**TEXT** それ以上

**ENUM** 特定の文字列から一つ
**SET** 特定の文字列から複数

###真偽値
**BOOL** TRUE/FALSE

真偽値はTRUEかFALSEの値しか持たず内部的には1か0でTRUEかFALSEかを判断しているのでTINYINT一桁と同じ型だったりします

###日付
**DATE** 日付
**TIME** 時間
**DATETIME** 日付と時間

まだまだ扱えるデータ型はありますがとりあえずこれだけで十分でしょう

##さいごに
バックエンドの技術の一つであるDB
しっかりコツコツと基礎から勉強していきましょう！！
Twitterしています→[AtieのTwitter](https://twitter.com/Atie_BackendPG)
ではまた次回の記事で！
PHPで標準入力を受け取る

メモ用。

```php:input.php
<?php

$stdins = array();
while(true) {
    $stdin = trim(fgets(STDIN));
    if ($stdin === '') {
        break;
    }
    $stdins[] = $stdin;
}
var_dump($stdins);

?>
```

以下、使用例。

```
$ php input.php
aaa
bbb
ccc ddd

array(3) {
  [0]=>
  string(3) "aaa"
  [1]=>
  string(3) "bbb"
  [2]=>
  string(7) "ccc ddd"
}
```
参考：https://qiita.com/kiimiiis/items/89ac68e5f7451bf64d1a
$.ajax() オプション備忘録

個人的に何度も忘れてドキュメントサイトで確認することが多いオプションを書いています。

## contentType / string
データの***送信形式***（リクエスト）
サーバへ送信するデータの[MIMEタイプ](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types)を設定する。
例） 'application/json', 'text/plain'
初期値は'application/x-www-form-urlencoded'

## dataType / string
データの***受信形式***（レスポンス）
※$.ajax()独自に指定された形式のみ指定可能、
（"text", "html", "xml", "script", "json", "jsonp" のいずれか）
例）'text'や'html', 'json'などを指定する
SharePoint リストのコメント機能をAPIから触ってみた！

Office 365 Advent Calendar 2020 9日の記事です。
> https://adventar.org/calendars/5362

先日、やっとウチのテナントの SharePoint Online にもリストアイテムへのコメント機能が展開されました。
どんな風に使えそうか、触ってみた感じと、APIから触ったりできるのか調べてみました。

# まずは基本的な使い方

リストアイテムを作ってコメントアイコンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/ef234442-7b59-eac5-ae2f-d0c463c8565d.png)

コメント入力画面が表示されるので、コメントの登録。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/652380fd-8baf-b955-3fd0-56b0921c16b0.png)

コメントできた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/35742875-6731-4c13-e644-d1922f293811.png)

コメントは履歴含めて表示できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/169be279-d36c-6e67-3eff-23dbf7724cb5.png)

アクティビティを含めたビューもできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312282/55a8ff14-550c-beff-ad28-1edfbb95ab87.png)

# APIで操作してみる

指定のリストアイテムのコメントを取得する($expand以降はいらないかも)

``` url:GET
https://{hostname}/sites/{sitename}/_api/web/lists/getbytitle('{listname}')/items({id})/GetComments()?$expand=replies&$filter=NumReplies eq 10
``` 
単一コメントを取得する

``` url:GET
https://{hostname}/sites/{sitename}/_api/web/lists/getbytitle('{listname}')/items({id})/Comments({commentid})
``` 

コメントを追加する

``` url:POST
https://{hostname}/sites/{sitename}/_api/web/lists/getbytitle('{listname}')/items({id})/Comments()
``` 

``` url:POSTデータ
{text : "{comment}"}
``` 


指定のリストアイテムのアクティビティを取得する($expand以降はいらないかも)
アクティビティの一覧を作るときは、上記のコメントの取得も同時に行い、くっつけて一覧作ってる様子

``` url:GET

https://{hostname}/_api/v2.0/sites/{hostname}:/sites/{sitename}:/lists/{listname}/items/{id}/activities?$expand=listItem($select=id,name,webUrl)

``` 

# まとめ
無事APIから操作することができました。SPFx や Graph API と組み合わせていろいろできそうです。
コメント機能といえば、SharePoint Server 2013 のディスカッション掲示板で似たようなものがありましたが、あれはビューからコメントしたアイテムを閲覧することができましたが、これは同じようには確認することはできあませんでした。
そういったものとは違うようです。
【Swift】繰り返し文における実行文の中断

#実行文の中断 とは
**break文**や**continue文**を用いることで、実行文を中断することができます。

break文は、繰り返し文全体を終了させます。
continue文は、現在の処理のみを中断し、後続の処理を継続します。

**また、break文やcontinue文は、
switch文と同様にラベルを使用することで制御対象を指定できます。**

##break文
break文は実行文を中断すると同時に、繰り返し文全体も終了させます。

break文を使うタイミングとしては、
**これ以上繰り返しを行う必要がなくなったタイミングです。**

例えば、配列の中に「３」が含まれているか検査するプログラミングがあったとします。
３が見つかった時点で繰り返し処理を中断するという機能になっています。

```swift

let array = [1, 2, 3, 4, 5]

for item in array {
    if item == 3 {
        print("3を検知しました。")
        break
    }
    print(item)
}

実行結果
1
2
3を検知しました。
```

結果を見るとわかるように、
３を検知した後にbreakが実行されそれ以降の繰り返し処理が行われていません。

##continue文

continue文は、実行文を中断した後、後続の繰り返しを継続します。
使い道としては、**特定の場合にだけ処理をスキップする場合などに使えます。**

例として、偶数の値は配列に格納し、奇数の値は出力するコードを書いてみました。

```swift

let array = [1, 2, 3, 4, 5]
var arrayEven: [Int] = []

for item in array {
    if item % 2 == 0 {
        arrayEven.append(item)
        continue
    }
    print("奇数値 \(item) は格納しません。")
}

print(arrayEven)

実行結果
奇数値 1 は格納しません。
奇数値 3 は格納しません。
奇数値 5 は格納しません。
[2, 4]
```

break文とはことなり、continue後も後続の繰り返し処理は実行されております。

continue文が実行された場合は、それ以降の実行文が実行されないため、
print()関数は実行されません。

ラベルに関してはswitch文のラベルと同じなので説明は省きます。
気になる方はswitch文の記事をご覧ください！

以上、最後までご覧いただきありがとうございました。
[JavaScript] すごく初歩のJavaScript (比較演算子)

#JavaScript (比較演算子)

JavaScript 自分用の覚え書きです。

比較演算子

```javaScript:script.js
const age = 25;

// 「age >= 20」 → true と表示される
console.log(age >= 20);

// 「age < 20」 → false と表示される
console.log(age < 20);

// ageの値が20以上の場合、実行される
if (age >= 20) {
  console.log("私は20歳以上です");
}
```

比較演算子 (値が等しいかどうか)

```javaScript:script.js
const password = "qiitapasspass";

// passwordの値が"qiitapasspass"の場合
if (password === "qiitapasspass") {
  console.log("ログインしました");
}

// passwordの値が"qiitapasspass"でない場合
if (password !== "qiitapasspass") {
  console.log("ログインできません");
}
```
Viewのフォントを変えたい！！！（初級者の叫び）

# 動機
9月からAndroid開発を始めてすっかりドはまり中のLaOです。

アプリ作成中にデフォルトのフォントだと、あんまし作りたいアプリの趣旨に合わないなぁと思い、フォントを変えようと思い立った。(まぁ、これでもそんなに問題はないのだが）

![2020-12-09 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/cf2a23ca-7056-e997-279d-b242f6ca3a60.png)


フォント変更について、曲がりなりにも調べるとどうやらフォントカスタムなるものをダウンロードして、resフォルダ内のfontディレクトリを作り、その中に格納するらしいのだが一向に上手くいかない。

フォントを変更するには、xmlファイルでfontfamily属性を用いるのだが、@font…と打ち込んでも候補にそいつらが出てこないのだ。（こっちの解決策は誰か教えてください　|| いつか解決させる）

ほんで、暫くググりに没頭していると簡単に解決できたのでそれを綴っていこうと思います。

![2020-12-09 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/51f71acd-9579-3f09-dc4d-f2fcf2705426.png)


#解決策
①フォントを変えたいViewをタップし注目。右側のAttibutesタブを開き、Declared Attributesの右横の＋を押してfontfamilyを追加する。▽をタップし一番下のMore Fonts…を選択。
![2020-12-09 (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/dc937a49-10c8-6f7d-2bf8-53efb9f514b9.png)
②開いたらさぁ、この中から好きなフォントを探そう！筆者は、鉛筆で書いたようなフォントにしたかったので「Casual」を選択。
![2020-12-09 (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/f6a19fc0-cb28-9950-be4e-312a82c3a205.png)
一つが完成しました。あとは、同じように繰り返していくだけ。
![2020-12-09 (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/e704c433-19c6-8f50-b370-5b98b014a884.png)






#完成
![2020-12-09 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/7adef38e-a429-e10b-6721-70ebe1dc0f92.png)
IBMCloud  ISO/SOC等ガイドライン 小ネタ

##小ネタ
IBMCloudでは、国際的に認められた幅広いガイドラインに準拠している。
一体何に準拠しているのかは、下記にまとめられている。
https://www.ibm.com/cloud/compliance/global

更に細かいプロダクト/サービス単位での準拠リストはこちらに記載がある。
[ISO 27001 / 27017 / 27018 - IBM Enterprise & Technology Security (PaaS and SaaS) certified product listing](https://www.ibm.com/downloads/cas/OELMNOND)