OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルシステム構築について、学んだことをはきだす。

LPICレベル1試験対策
※書籍や動画をみて学んだことのはきだしです。動作保証はしません。あしからず。
結構見づらいかも。ごめん。


# 目的
Linux環境下において、ハードディスクを追加して使えるようにするにはどうしたらいいか



# 全体の流れ
コマンドの流れ
　[1-ハードディスク追加](##1-ハードディスク追加)
　[2-分割(パーティション)](##2-分割(パーティション))
　[3-ファイルシステム構築](##3-ファイルシステム構築)
　[4-マウント](##4-マウント)
　[補足資料](##補足資料)
その他
　[感想](##感想)

# コマンド

##1-ハードディスク追加
1　ハードディスク追加

```
ls -l /dev/sd*
↓
CnetOSなどでハードディスク増設
↓
ls -l /dev/sd*
```
ls-lは、現在のハードディスク状況を確認している。
CentOSで増設した後、きちんと認識されているかを確認。


##2-分割(パーティション)

```
fdisk /dev/sdc
 コマンド:p　・・・※1

fdisk /dev/sdc
　コマンド:n　・・・※2
　コマンドアクション:p　・・・※2
　パーティション番号(1-4):1　・・・※3
　シリンダ(1-783):1　
　Lastシリンダ・サイズ:+1024M　・・・※4
　コマンド:t　・・・※5
　パーティション番号(1-4):1
　16進数コード:83　・・・※6
　コマンド:w　・・・※7
```

※1　/dev/sdcの現在のパーティションの状態を確認
※2　/dev/sdcのパーティションを作る
※3　ハードディスクは基本領域のみの場合、4つに分割できる。5つ以上に分割したいときは、基本領域のひとつを「拡張領域」とし、その中に論理領域を作る。
拡張領域としたい場合は、※2のコマンドアクションでeを入力する
※4　サイズの指定
※5　作成した領域にシステムIDを付ける、または変更する
※6　83はデータ領域
※7　設定を保存する。これを入力しないと、ここまでの設定は消える。
（※1,2,5,6,7についてはページ下部に補足資料あり）



##3-ファイルシステム構築

```
df -h　・・・※8
mkfs -t ext3 -c /dev/sdc1　・・・※9
```

※8　現在のマウント状況を確認。-hなしでも実行できるが、ブロック単位で表示され、見づらい。-hをつけることで、K,M,Gなどの単位となり、見やすくなる
※9　-tでファイルシステムの指定、-cで破損個所を検出、利用しないようにする。/dev/sdc1にファイルシステムを構築する

##4-マウント
ファイルシステムとディレクトリを紐づける

```
mount -t ext3 -o defaults /dev/sdc1 /opt
```

-t　ファイルシステムの指定
-o　読み込み書き込みの権限の指定。デフォルトとするとrw、suid、dev、exec、auto、nouser、asyncを含む。
/dev/sdc1と/optを紐づける。つまり、CLIで/optに保存するとハードディスク上の/dev/sdc1に保存されるようになる。



以上！！！！


##補足資料

fdiskコマンドのコマンド動作一覧(※1,2,5,7)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628630/22a7f54e-c672-d3aa-728d-225a0264e0e5.png)

システムIDの種類(※6)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628630/9b99991f-9dfb-7b9b-e3b7-e8ba9bfe6174.png)

##参考資料
Linux標準教科書(Ver.3.0.2)


##感想
つかれたよパトラッシュ・・・
見やすいQiitaの書き方は、これから勉強していきたい。
文字リテラルと文字列リテラル

文字列リテラル　”で文字列を囲ったもの。ポインタを返す
文字リテラル　　’で文字を囲ったもの。文字そのものの文字コードを返す。

文字列リテラルは、アドレスなので、＊をつけるとその先頭文字の文字コードを返す。
*"ABC"+1 はBの値（文字コード66を返す）
UniversalRPでスクリプトから画面をキャプチャする一番簡単な方法

UIなどにプレイ中の画面を載せるために画面をキャプチャしたかったのですが、
「自分でRendererFeature作ってキャプチャ用のPass作って…」としようとした所、
もっと簡単にキャプチャすることが出来たので記事にしておきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/11dd6cc3-f13b-a46e-d090-4df6e20f4dcf.png" width=50%>

* Unity2021.2.1f1
* UniversalRP 12.1

# キャプチャ用クラスを作る

何と、面倒な手続きを踏まなくても、こちらのクラスが有ればキャプチャできます

```cs:CaptureObject.cs
using UnityEngine;
using UnityEngine.Rendering;

namespace ScreenPocket
{
    /// <summary>
    /// カメラの描画後のキャプチャを取る
    /// カメラがスタックされている場合スタックの最後まで描画された後でキャプチャする
    /// </summary>
    public sealed class CaptureObject : MonoBehaviour
    {
        /// <summary>
        /// キャプチャしたいBaseカメラ
        /// </summary>
        [SerializeField]
        private Camera _target;

        /// <summary>
        /// キャプチャ用RenderTexture
        /// </summary>
        private RenderTexture _captureBuffer;

        private void Start()
        {
            //↓サイズ、名前などは自由に設定しましょう
            _captureBuffer = new RenderTexture(256, 512, 0, RenderTextureFormat.Default);
            _captureBuffer.name = "_CaptureBuffer";
            //キャプチャ用Action登録
            CameraCaptureBridge.AddCaptureAction(_target, Capture);
        }

        private void Capture( RenderTargetIdentifier ri, CommandBuffer cmd )
        {
            cmd.Blit(ri, _captureBuffer);
        }

        private void OnDestroy()
        {
            //キャプチャ用Action片付け
            CameraCaptureBridge.RemoveCaptureAction(_target, Capture);
        }
    }
}
```

という事で以上です。

#今回の記事のポイント

「思ったより簡単じゃないじゃないか」とお𠮟りを受けそうですが、
今回の記事で一番のポイントが

```cs
CameraCaptureBridge.AddCaptureAction(_target, Capture);
```

を使えば、 **UniversalRP標準のUniversalRendererのCapturePassが作動する** という事なのです。
つまり、自分で他にキャプチャ用のRenderTextureを管理している＆キャプチャしたいカメラを握っている場合は、

* CameraCaptureBridge.AddCaptureAction()
* キャプチャ用関数（上記クラスで言うCapture()）
* 用が済んだ時のCameraCaptureBridge.RemoveCaptureAction()

さえあればキャプチャが可能となるわけです。**最少、3行追加するだけ！**なので簡単！

#注意点

UniversalRPのCapturePassのRenderPassEventがRenderPassEvent.AfterRenderingとなっている都合上、
**スタックされたカメラの描画が全て終わった後でキャプチャしてしまう**点だけご注意ですね。

つまり **「UIカメラをスタックしている時に、UIだけはキャプチャ対象外にしたい！」** という場合などは、
やはり自分でオレオレCapturePassを準備してRenderPassEventを調整できるようにした方が良さそうです

---

にしてもこんな使いやすい仕組み(CameraCaptureBridge)が何処からも参照されていない事が不思議ですが、
もしかするとUnityRecorderなどで使用されているのかもしれませんね（未確認）
Cloud functionsをつかってリダイレクト処理を実行したら、遷移先で「Your client does not have permission to get URL /  from this server.」とでる。

# 問題
cloud functionsをつかってOGP画像を設定したリンクをふむと、リダイレクトするようにして設定したのだが、なぜかリダイレクトページがあらわれず、Googleアカウントの認証を求められたり、「Your client does not have permission to get URL /  from this server.」とかかれたページがあらわれたりする。

以下のリンクのように、Google Cloud Consoleで権限を付与しても駄目だった。
https://qiita.com/toshiaki_takase/items/ce65cd5582a80917b52f



<a id="#解決策"></a>
# 解決策
公式ドキュメントによると「Firebase Hosting に接続されている関数は us-central1 に配置する必要があります。」とのこと。
どうやらindex.jsのファイル中のhttp関数でregion('asia-northeast1')を設定しているのがいけないらしい。



```index.js
exports.f = functions.regions('asia-northeast1').https.onRequest(async (req, res) => {
    const doc_id = req.path.split('/')[2];

```

だから、以下のようにregionsを抜いてあげて、デフォルトの「us-central1 」に変更すればよい。

```index.js
exports.f = functions.https.onRequest(async (req, res) => {
    const doc_id = req.path.split('/')[2];
```

無事リダイレクトできるようになった！


<a id="#reference"></a>
# 参考文献
- [Cloud Functions のロケーション ](https://firebase.google.com/docs/functions/locations#http_and_client-callable_functions)
ABC227 D - Project Planning

https://atcoder.jp/contests/abc227/tasks/abc227_d

C問題までが15分で終わって1時間以上あったのに解けなかった。

# 愚直法

「人数が多い順に部署をソートし、1番目からK番目の部署から1人ずつ連れてきて1チーム作る。これをK番目に多い部署の人数が0になるまで繰り返す。」

O(N^2 logN max(A))なのでACはとれない。加速する必要がある。

# 貪欲法 → ×

「人数が多い順に部署をソートし、K番目に多い部署の人数をnとする。1番目からK番目の部署からn人ずつ連れてきてnチーム作る。これをK番目に多い部署の人数が0になるまで繰り返す」

これでサンプルは通るが嘘解法。
例えば部署の人数がa:4, b:4, c:4で2人で1チームを作るとき、嘘解放だとab×4を作ったところで停止するが、実際にはab×2, ac×2, bc×2の計6チーム作れる。
また、ソートのたびにO(N logN)の時間計算量を要するので、全部でO(N^2 logN)でTLEでもある。

# 最大フロー??

例えば部署の人数がa:4, b:4, c:4で2人で1チームを作るとき、まずabを4チーム作っておいて、そのうち2チームを解散してca×2とcb×2を作れば6チームできる。最大フローっぽい手順であり、ACの人数が異様に少ないのもあり、もしやこれでは??と迷ったが、K人で1チームを作るグラフは出来そうにない。(K=2なら最大フロー問題には出来そうだが張る辺がN^2オーダーになる)

# 逆問題
ところで、この問題はO(N logN)くらいでないと間に合わない。O(N)のアルゴリズムをlogN回繰り返すものの代表格といえば、やはり二分探索法であろう。何とか解きやすい逆問題を設定できないか。
元の問題が「最大でいくつ作れますか？」なのでこちらを固定する。
Mチーム作ることにする。チーム分けの表を用意する。5チームに分けるなら以下のようになる。

| 1 | 2 | 3 | 4 | 5 |
|:-:|:-:|:-:|:-:|:-:|
|□|□|□|□|□|
|□|□|□|□|□|
|□|□|□|□|□|
|…|…|…|…|…|

これにa:4, b:4, c:4を順に並べてみる↓

| 1 | 2 | 3 | 4 | 5 |
|:-:|:-:|:-:|:-:|:-:|
|a|a|a|a|b|
|b|b|b|c|c|
|c|c|□|□|□|
|…|…|…|…|…|

これ↑が何を意味するかというと、「5チーム作るなら1チーム2人以下なら可能」ということ。
チームの人数を4人にしてみる↓

| 1 | 2 | 3 | 4 |
|:-:|:-:|:-:|:-:|
|a|a|a|a|
|b|b|b|b|
|c|c|c|c|
|…|…|…|…|

↑「4チーム作るなら1チーム3人以下なら可能」
チームの人数を3人にしてみる↓

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|a|a|a|
|**a**|b|b|
|b|**b**|c|
|c|c|**c**|
|…|…|…|

…「3チーム作るなら1チーム4人以下なら可能」かというとそうではない。部署の人数がチームの数を超えたために2週目に入ってしまい、1チームに同じ部署から複数人が含まれる事態になった。これを避けるには「1部署あたりの参加人数」を「チームの数」以下に制限する必要がある。今なら３人以下。

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|a|a|a|
|b|b|b|
|c|c|c|
|…|…|…|

↑「3チーム作るなら1チーム3人以下なら可能」

---

チーム数をMとしたときの参加人数は全部で $\Sigma_{i=1}^N min(A_i, M)$ なので、

1チームあたりの人数は$\Sigma_{i=1}^N min(A_i, M) / M$以下なら可能ということになる。これはO(N)で計算できる。

あとはチーム数Mを色々変えて、1チームあたりの人数がK人以上とすることが可能なMの上限値を求めればよい。

# AC解法

```rust:ABC227-d.rs
use proconio::input;

fn main() {
    input!{
        n: usize, k: i64,
        a: [i64; n],
    }
    let mut l = 0;
    let mut r = 200_000 * 1_000_000_000_000 + 1;
    while r-l > 1 {
        let m = (l+r) / 2;
        let sum: i64 = a.iter().map(|x| x.min(&m)).sum();
        if sum / m >= k {
            l = m;
        } else {
            r = m;
        }
    }
    let ans = l;
    println!("{}", ans);
}
```

分かってしまえば呆気ない。本番中に解けたかった。
Pythonで学び直す高校数学

Pythonで学び直す高校数学では、Jupyter Notebookをつかってましたが、Google Colabでやってみます。
https://colab.research.google.com

まずは準備。y=x^2+2x+1のグラフを描いてみます。

```
>>>from sympy import *
>>>(x,y)=symbols('x y')
>>>y = x**2 + x*2 + 1
>>>plot(y,(x,-10,10),ylabel='y',ylim=(-10,10))
```

べき乗。

```
>>>10 ** 3
1000
>>>10 ** 0
1
>>>10 ** -2
0.01
```

2/16進数。

```
>>>bin(10)
'0b1010'
>>>bin(-10)
'-0b1010'
>>>bin(-10 & 0xFF)
'0b11110110'
>>>hex(10)
'0xa'
>>>hex(-10 & 0xFF)
'0xf6'
```

実数/商/余。

```
>>>10 / 3
3.3333333333333335
>>>10 // 3
3
>>>10 % 3
1
```
C#：配列、foreach、列挙型

## 配列
- 多くの値をまとめて管理する
    - インデックスと呼ばれる通し番号がついている。// 0から始まる
- 配列を使用する際の流れ
    1. 配列の変数を宣言する
    2. newかリテラルを代入して初期化をする。// 1と2は一緒に行っても良い。
    3. 実際に配列が使える。
- 配列の注意点
    - 値は全て同じタイプの値しか保管できない
    - 初期化前は使えない
    - 後で要素は増やせない //初期化の段階で部屋の数が決まっている。
    - 基本的にインデックス番号は固定

## 配列の宣言と使い方　タイプ名　string,intなど
- 配列リテラル
    - {値1, 値2,.....}
- 配列宣言
    - タイプ名[] 変数名;
- 初期化１
    - 変数名 = new タイプ名[保管する値の数];
- 初期化２
    - 変数名 = { 値1, 値2, .....};
- 宣言と初期化１
    - タイプ名[] 変数名 = new タイプ名[保管する値の数];
- 宣言と初期化２
    - タイプ名[] 変数名 = { 値1, 値2, .....}
- 値の取得
    - 変数 = 配列[ 番号 ];
- 値の設定
    - 配列[番号] = 値;

```c#:配列.cs

string[] arr = { "Hello", "Welcome", "Bye" };　//変数宣言と初期化を同時に行う
string s = arr[0] + "," + arr[1] + "," + arr[2];
Debug.Log(s); //Hello Welcome, Byeの順に表示される。


```

##foreach構文
- 配列に保管している1つ1つの値について処理を行うもの
    - foreach ( 変数 in 配列など) { 処理内容 }
    - inの前に変数、後ろに配列を指定する


```c#:foreach.cs
int[] data = { 98, 72, 63, 89, 56 };
int total = 0;

foreach(int n in data)
{
    total += n; //dataの値が一つずつnに代入されている。
}

int ave = total / 5;
Message("合計：" + total + "　平均：" + ave); //total:378 ave:75

```

##列挙型

- 決まったものの中から選ぶ
- 型そのものを自分で作れる
- enum 型名 { 値1, 値2, ..... } //値を入れるときは文字列型ではなくそのまま記入 ○ A  × "A"
- enumを宣言する場所はメゾット内では記述出来ないため、あらかじめ記載する。

```c#:列挙型.cs
public class script : MonoBehaviour
{
    enum Helo { Hello, Welcome, Chao}; //Heloが型
    
    void Start()
    {
       Helo h = Helo.Chao; 
        switch (h)
        {
            case Helo.Hello:
                Debug.Log("ハロー");
                break;
            case Helo.Welcome:
                Debug.Log("ようこそ！");
                break;
            case Helo.Chao:
                Debug.Log("チャオ。");
                break;
        } 
    }
}
```
初学者に教えたい、MicrosoftがGitHubで公開している教材が最高だった！

## はじめに

エンジニアやデータサイエンティストの人材育成のためのオープンソースな教材を探していたらMicrosoftがGitHubでかなり質の高い教材をweb開発、データサイエンティスト、機械学習、IoTの四項目を対象に提供してるのを発見したため共有したいと思う。

正直、マイクロソフトと聞くとGoogleやらFacebookに比べていけてないイメージを持っていたけど、実際にMicrosoftのGitHubレポジトリを見て、彼らはここ数年で大きく変わったように思える。特に人材育成や学習教材に関しては世界一かもしれないなんて思っています。本記事では筆者が自信を持っておすすめするMicrosoftのオープン教材を紹介するのでぜひ自身の勉強や人材育成に生かしてもらえれば本記事を執筆した甲斐があります。（もちろん僕がお勧めしているだけでなくてGitHubのスター数も多く世界的に認められています！）

ここ数ヶ月色々な教材を比較してみてMicrosoftの教材のPoint（利点）は3つあることに気が付きました。まず、必要な知識を０から体系的に学べること。二つ目に教材の質の高さと動画や画像など教材がかなりリッチなこと。そして最後に非常に実践的で最新の情報や流行をしっかりと盛り込んでいること。
学生が学ぶにはもちろん十分な教材だと思うし、社会人の人が新しいキャリアを築く上で参考にしてもいいと思う。（私はIoTに興味があったのでIoTの教材で勉強中です！）
基本英語ですが、一部日本語訳されているものもある様子。より多くの日本人に使ってもらえるよう、現在自分も絶賛翻訳中です。

本記事で紹介する教材は[Microsoftクラウドアドボケートチーム](https://developer.microsoft.com/en-us/advocates/)により提供されています。なので、もちろんCloud（Azure）を勉強したい人にも最適です。Azureは質の高い公式ドキュメントや学習教材がMicrosoftから提供されており、Cloud初心者の人にとてもおすすめ。特に[Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/)ではAzureを体系的に学習でき、最終的には資格を獲得に十分な知識が身につくように設計されているため、ぜひ使ってみて欲しい！ GCPもQuick labという同じような学習サービスがあり有料ですが、Microsoft Learnは無料です！自分はAzure初心者でしたが、今年Microsoft LearnとAzureの無料期間を利用してでAzureの資格を2つ取得することができました。こちらもぜひご自身のキャリア、スキルアップにお役立てください！

## 1. Web Development For Beginners
Web開発を学びたい方への教材。Programming初心者のレベルの人でもHTML,CSS、JavaScriptなんかを実際にWebアプリケーションを作成しながら学ぶことができる。
ブラウザを用いたデバック方法からProgrammingのデータ構造の話までエンジニアに必要な要素が盛り込まれているのでProgramming自体初心者の人には本当にお勧め。

https://github.com/microsoft/Web-Dev-For-Beginners

## 2. Data Science For Beginners
データサイエンティスト向けの教材。今風のMLとかDeep learningを実践すると言うよりかは、データを可視化し、そのデータからどのようなことがわかるのか、というデータサイエンスのコアな部分の基礎をしっかり叩き込んでくれる。
機械学習やってます！と言う人でデータサイエンスの基礎がない人が多い最近なので機械学習をすでに学んでいる方もぜひ押さえてほしい。

https://github.com/microsoft/Data-Science-For-Beginners

## 3. ML　For　Beginners
機械学習について自然言語処理からComputer visionまで幅広く学べる。実際に自分で学習させたMLモデルをWebアプリケーションとしてデプロイすることろまでサポートされていて、実践的なところが好印象。これを使って勉強する人は絶対タメになるのでData Science For Beginnersと両方受けて欲しい。

https://github.com/microsoft/ML-For-Beginners

## 4. IoT For Beginners
IoTの教材ってなかなかないのでかなり貴重だと思います。実際に自分もこれを使って勉強している最中です。
IoTの基本からCloudとの連携までサポートされているのでIoT周りの基礎的な部分はこれである程度補えそうな感じ。
Edgeデバイスでの機械学習なんかも教材に組み込まれていて、難易度はそこそこ高めだけど個人的にはお勧め。

https://github.com/microsoft/IoT-For-Beginners

## その他Microsoftにより公開されている学習教材
おまけですが、無料なのが素晴らしいと思うMicrosoft社のそのほかの学習リソースを紹介します。

[Microsoft Learn](https://docs.microsoft.com/en-us/learn/): AzureなどMicrosoft社のサービスを通して使い方やドメイン基礎知識を体系的に学習可能。個人的にAzure学習の鉄板！
[Microsoft Code Sample](https://docs.microsoft.com/en-us/samples/browse/): Microsoftのサービズ関連のサンプルコードが一元管理されてる。私はAzureで実装したいソリューション実装の参考にしたりしてます。

## 終わりに

今回はMicrosoftがGitHub上で公開している初心者向けの学習教材に絞って紹介しました。どれも質が高く本当にお勧めなのでぜひご活用ください。
インフラエンジニア学習1113 Linux

・ディレクトリ＝ファイル

Linuxコマンド

・sudo su　管理者の権限にコマンドを切り替える。

・:wq　ファイルに変更内容を保存して終了する。

・＄　一般ユーザーの意味。

・pwd 現在いる場所を示すコマンド。

・/　検索コマンド。

・shiftボタン＋G 下の行に行く。

・dボタンを２回打つと、一行削除。
AWS Certified Developer - Associate 合格体験記

2020/8/9 に DVA 受かりました。
![AWS-Certified-Developer-Associate-pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/faebaa8b-da59-56c9-c41d-78161e76fa12.png)

## 対策

Udemy を使って受験対策しました。

**[Ultimate AWS Certified Developer Associate](https://www.udemy.com/course/aws-certified-developer-associate-dva-c01/)**

動画を見ながらハンズオンしようと思ったのですが、あまりにも時間がかかってしまうので、動画のみをみて各サービスのイメージを掴むようにしました。

**[AWS 認定デベロッパー アソシエイト模擬試験問題集（5回分325問）](https://www.udemy.com/course/aws-31955/)**

SAA を受けたときに Udemy の問題集を使用したので、今回も Udemy の問題集を使いました。DVA 本試験を受けるまでに、5 回分すべて正答率 100% になるまで問題を繰り返し解きました。

Udemy の問題集だと、問題セット 65 問を解いた後に正答と解説が表示されるので、1 問解くごとに正答と解説を確認したい場合は[WEB 問題集](https://aws.koiwaclub.com/exam/dva/)を使ってみてはいかがでしょうか。
「R」の時間処理パッケージ「lubridate」：「dmy」でDate型へ

**「R」**言語は便利、と思ったのでメモをしておきます。

以前、「Power BI Desktop」で時系列グラフを作る際、x軸を「日付（Date）型」に変換するのに手こずりました。

https://qiita.com/text_owleyes/items/834025a44d4ef6228be8

文字列型で「dd/mm/yyyy」形式で収録されている値を日付型にサクッと変換する方法がわからず、「year」「month」「day」列を結合して「yyyy/mm/dd」スタイルにしました。

「R」には**「lubridate」**はという、時間処理用のパッケージがあります。
先ほどの「dd/mm/yyyy」の場合、「lubridate」の**「dmy」**を使います。

```R
> dmy("20/10/2021")
[1] "2021-10-20"
> dmy("20/10/2021") %>% class()
[1] "Date"
```

色んなバリエーションに対応でき、便利さを実感しました。

```R
> ymd("2021-10-20")
[1] "2021-10-20"
> myd("10202120")
[1] "2021-10-20"
> mdy("Oct202021")
[1] "2021-10-20"
```

**了**
PythonでTensorflowを動かすメモ

# 概要
メモ書き.環境はWindows10．2021年．
# 環境設定
GPU使うかどうかで変わる．安易にPythonの最新版を使わないこと．
公式のページを確認して対応バージョンを入れること

https://www.tensorflow.org/install/source_windows?hl=ja#tested_build_configurations

*コンパイラとビルドツールは自前でコンパイルする人のためだから基本必要ない．
*GPUの場合はグラフィックボードのドライバとしてcuDNNとCUDAが必要．NVIDEAに要登録．面倒くさい．

バージョン決まったらダウンロードとインストール．Googleに直接名前とバージョン入れるとページが出る．
おすすめはpython v3.8.10 tensorflow v2.3.0 cuDNN v7.6 CUDA v10.1
※追記：最新のGPUでは上記環境だと読み込みが遅くなったりしたので適度に変えてみたりしてください

https://www.python.org/downloads/release/python-3810/

tensorflowのダウンロード．コマンドプロンプトで

```python
pip install tensorflow==2.3.0 
```
tensorflow-gpuはtensorflowに統合されているらしいのでinstallはtensorflowだけでよいです．
CUDAとcuDNNはバージョンがたくさんあるため，間違いやすいcuDNN v7.6でもCUDA v10.2用やv10.1用があるので何回も確認すること．
pathの追加は必要．

https://nw.tsuda.ac.jp/lec/cuda/install_11-win/

GPUの認識の確認は簡単にできる．

https://thr3a.hatenablog.com/entry/20180113/1515820265

# プログラミング
環境が整ったらプログラミング．公式リファレンスを見よう．
## APIリファレンス

https://www.tensorflow.org/api_docs/python/tf/keras/Model

## 実践チュートリアル

https://www.tensorflow.org/model_optimization/guide/pruning/pruning_with_keras?hl=ja

横のメニューを順番にやってみたり，気になるところを中心にやるとよいと思います．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/33009b5f-5406-48ed-5ab7-8dc151ba2880.png)


## EfficientNetV2の転移学習
2021年最も優秀らしいEfficientNetV2も最速で試す．

https://qiita.com/omiita/items/1d96eae2b15e49235110

https://qiita.com/wakame1367/items/d90fa56bd9d11c4db50e

https://tfhub.dev/google/collections/efficientnet_v2/1

```python
import tensorflow as tf
import tensorflow_hub as hub

# tensorflow hub からのコピペ，EfficientNetV2の転移学習
m = tf.keras.Sequential([
    hub.KerasLayer("https://tfhub.dev/google/imagenet/efficientnet_v2_imagenet1k_s/feature_vector/2",
                   trainable=False),  # Can be True, see below.
    tf.keras.layers.Dense(num_classes, activation='softmax') #学習される全結合層
])
m.build([None, 384, 384, 3])  # Batch input shape.

```
socketなんとかのエラーはWindowsのファイヤウォールに通信を止められているため．


## だいたい先人がやっている

https://tfhub.dev/

モデルをダウンロード即実装，すごいね!


# あとがき
現在はLinuxに取り組んでいます．OSSにも貢献していければいいな．
Direct Connectを理解する

# 背景・目的
- Direct Connectは、ハンズオンをする機会がないので理解しづらい。
- Black Beltを見ながら知識を整理する。

# 内容
## Direct Connect（Dx）とは？ 
- キャリアから調達した専用線の片端とAWS をDirect Connctionロケーションで接続するサービスを指す。
- 構成要素の整理
    - AWS Cloud（AWS）
    - Data Center（以降、DC）
    - Direct Connect ロケーション（Dxロケーション）


## Direct Connectionロケーションでの接続
- ユーザ/パートナーラックとAWSのラックがあり、それぞれ分かれている。（ようだ。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8c10d7ac-f882-ddfe-4cfd-f4d6d2c0d465.png)

[出典:20210209 AWS Black Belt Online Seminar AWS Direct Connect](https://www.slideshare.net/AmazonWebServicesJapan/20210209-aws-black-belt-online-seminar-aws-direct-connect)

## 接続パターン
- ３つある

|接続パターン| DC - Dxロケーション間の回線 |
|:--|:--|
|Dxロケーションとユーザ機器が同じロケーション| WAN回線|
|Dxロケーションからパートナー専用線で接続| 専用線 |
|パートナー閉域網経由で接続| 閉域網 |

## Dxロケーション内の接続

- ユーザとパートナー機器とDx Connectデバイス間の接続を1Gbpsと10Gbpsのコネクションを集約して、1つの論理インターフェイスとして提供している。（Link Aggregation Group(LAG)）
    - 同じ速度のコネクションを集約して、各コネクションにトラフィックを分散する。（最大4つまで）

## 信頼性を高める構成（ベストプラクティス）

|概要| SLA |Dxロケーション|接続数|AWSのAZ数|諸条件|
|:--|:--|:--|:--|:--|:--|:--|
| 高い回復性 | 99.9% |2箇所|2|2|エンタープライズサポート|
| 最大回復性 | 99.99% |2箇所|4|2|エンタープライズサポート<BR>SAによるWell-Architectレビューの実施|

## 仮想インターフェイス
- Connectionは、物理的な接続を指す。（1Gbps or 10Gbps）
- Virtual Interface(VIF)を指す。
    - Connectionを通してAWSリソースにアクセスするための論理インターフェイスのこと。
        - AWSとユーザ間でBGPピアリングを確立し、経路校っっっっっっ関するために必要
        - VLAN IDを持つ
- Connection1つに対して、VIFが複数ある。
- VIFには、以下の種類がある
    - プライベートVIF
    - パブリックVIF
    - トランジットVIF

### 接続方法とVIFの整理

|接続方法|AWSの終端|概要|VIFの種類|ユーザの終端|備考|
|:--|:--|:--|:--|:--|:--|
|プライベート|DXGW|VPCに接続するために使用|プライベートVIF |BGP、MD5認証,IEEE802.1q VLANのサポートが必要|推奨<BR>複数のVPCを接続するために、複数のプライベートVIFを用意|
||VGW|CloudHub構成が必要なときに利用する|プライベートVIF|同上|単一のVPC接続のみ|
|パブリック接続|DXGW|KinesisやDDBなど、パブリックサービスを利用するために使用|パブリックVIF|同上|中国を除く全リージョンのパブリックサービスへアクセス可能。|
|トランジットGW接続|DXGW/TGW|VPC間の接続と、オンプレミスの接続を行うために使用|トランジットVIF|同上||

### トランジットVIF
- Dxの1Gbps以上の接続でのみ作成可能
- パートナーを通して提供される共有型接続では利用できない。
- 同一リージョンで数千のアタッチが可能
- マルチアカウントにも対応可能
    - 接続とトランジットVIFは、別のAWSアカウントで管理できる
    - ただし、トランジットVIFとDXGWは同一アカウントが所有していること

## Direct Connect GW
- DXGWは、1つのプライベートVIFを用いたプライベート接続で、全リージョん（中国除く）の複数VPCに閉域で接続可能
- 無料
- オンプレミス間、VPCを間の折返し通信はできない。
    - リージョン内ならPrivateLink接続
    - リージョンをまたぐ場合は、VPCピアリングが必要
    - または、Transit GW接続


# 考察
- やはり実際に手を動かさないとイメージが付きづらい。

# 参考
[20210209 AWS Black Belt Online Seminar AWS Direct Connect](https://www.slideshare.net/AmazonWebServicesJapan/20210209-aws-black-belt-online-seminar-aws-direct-connect)
[Symbol] 今更ながらSymbolブロックチェーンとは

# 概要
- 会社の技術共有会でSymbolをテーマに発表しました
- せっかくなので世に公開しておきます

# 発表資料
<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vTjd_8J2d9MLrgHgOhHSsm3nfTd3kK7LVrIZGb4ily4CnRTeXqOi2NkO42nVarR4i4UAo-ERLwKPe_l/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
過去のコードを参考にしたい？！このコードはなんで書かれたの？！

## はじめに

開発をしている時に以下のように思う事がありませんか。

* 過去のコードが何のために書かれているのか知りたい
* 似た機能を作るから過去のコードを参考にしたい

そんな時に役立つ技を紹介します。

## 概要

Git blameを使い、コミットのハッシュ値を調べ、プルリクを調べ、何のために開発したのか、他にどんなコードを書いたのかを知るという手順です。

## 変更時のコミットを調べる

git blameコマンドを使うことで、特定のコードが最終変更されたコミットを調べる事ができます。

```
git blame [ファイルのパス]
```

コマンドを使うと、以下のように表示されます。
調べたいコードの行までいきます。
先頭の8桁のものを使ってプルリクエストを探していきます。

```
a774a46e (test 2021-08-11 10:18:04 +0900  1) import Image from "next/image";
a134a5dc (test 2021-07-20 23:13:52 +0900  2) import { Title } from "src/components/shared/Title";
a134a5dc (test 2021-07-20 23:13:52 +0900  3) 
90605cb8 (test 2021-08-11 10:44:14 +0900  4) type Props = {
90605cb8 (test 2021-08-11 10:44:14 +0900  5)   title: string;
```
## 変更時のプルリクを見つける

GitHubを開き、左上の検索欄に先ほど調べたコミットのハッシュ値を入力します

![スクリーンショット 2021-11-13 22.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/9724b019-b1f1-c5c0-8db0-a16aba0800ca.png)

今回は、対象のリポジトリを開いて検索をしているので、出てきた一番上をクリックします。

![スクリーンショット 2021-11-13 22.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/4d036daf-80c7-c84c-cd35-51aaa85d0bfc.png)

プルリクエストを見つける事ができました。

![スクリーンショット 2021-11-13 22.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506867/e2ec67a0-2488-f8c9-f187-cbe45f0ab8ee.png)

プルリクエストを開けば、以下のような事がわかりますね。

* このコードを何の機能のために追加したのか
* このコードは他にどんなコードと一緒に編集されたのか

既存の機能と類似する機能を追加するときに変更すべき箇所はどこなのかなどは大体把握する事ができたりします。
これで、過去のコードを参考にしたり、コードの意図を調べる事ができました！！

## おわりに

自分も最近知って、よく使っています。
結構便利なので、是非使ってみてください。

この知識を使って少しでも開発が捗って、誰かの役に立てたら嬉しいです。
ArduinoUNOでシフト命令とBitマスクで遊ぶ



目的
ビット演算の理解を深める
Aは、0100 0001である。


![o_con99.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a7b86650-45a3-d1d7-7e82-ede269171b96.jpeg)




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4e1a228a-d4bf-4385-a615-07bee3ba5a26.png)



```c++


#include <Arduino.h>

//一文字送信する
void seg1(int v,int rs)
{
  for(int jj=0;jj<8;jj++){
    if( (v<<jj) & 0x80 ){      
      Serial.print(1); //ビットが1
    } else {
      Serial.print(0); //ビットが0
    }//endif
  }//for  
}//seg1


//初期化
void setup() {

  Serial.begin(9600); // 9600bpsでポートを開く

  Serial.println(' ');
  Serial.println("START");

  seg1( 'A' , 0 ); //0100 0001

  Serial.println(' ');

}//setup

//無限ループ
void loop() {}




```
railsチュートリアル第１２章 パスワードを再設定する

##パスワードを再設定する
次はPasswordResetsコントローラのeditアクションの実装を進めていきましょう。
統合テストを使ってうまく動作しているかのテストも行っていきます。
###editアクションで再設定
今回はこのメールアドレスを保持するため、隠しフィールドとしてページ内に保存する手法を使い作成
####パスワード再設定のフォーム
app/views/password_resets/edit.html.erb

```html
<% provide(:title, 'Reset password') %>
<h1>Reset password</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(model: @user, url: password_reset_path(params[:id]),
                  local: true) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= hidden_field_tag :email, @user.email %>
      <!--隠しフィールドとしてページ内に保存する手法をとります。-->
      <!--フォームを送信した後使用するメアドが消えてしまうので
      　　ここに保存させる。-->

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit "Update password", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
```
####パスワード再設定のeditアクション
app/controllers/password_resets_controller.rb

```rb
class PasswordResetsController < ApplicationController
  before_action :get_user,   only: [:edit, :update]
  before_action :valid_user, only: [:edit, :update]
  # その前に行う
  
  def new
  end

  def create
    @user = User.find_by(email: params[:password_reset][:email].downcase)
    # メールアドレスをキーとしてユーザーをデータベースから見つける
    if @user
      @user.create_reset_digest
      # パスワード再設定用トークンと
      #   送信時のタイムスタンプでデータベースの属性を更新
      @user.send_password_reset_email
      flash[:info] = "Email sent with password reset instructions"
      redirect_to root_url
    else
      flash.now[:danger] = "Email address not found"
      render 'new'
    end
  end

  def edit
  end
  
  private

    def get_user
      @user = User.find_by(email: params[:email])
      # 見つける
    end

    # 正しいユーザーかどうか確認する
    def valid_user
      unless (@user && @user.activated? &&
              @user.authenticated?(:reset, params[:id]))
      # 存在する、有効化、認証済み、出なければ
        redirect_to root_url
        # ホーム画面に移動
      end
    end
end
```

###演習
1.
12.2.1.1で示した手順に従って、Railsサーバーのログから送信メールを探し出し、そこに記されているリンクを見つけてください。そのリンクをブラウザから表示してみて、図 12.11のように表示されるか確かめてみましょう。

確認

2.
先ほど表示したページから、実際に新しいパスワードを送信してみましょう。どのような結果になるでしょうか?

しなかった。
railsチュートリアル第１２章 送信メールのテスト

###送信メールのテスト

####パスワード再設定用メイラーメソッドのテストを追加する
test/mailers/user_mailer_test.rb

```rb
require 'test_helper'

class UserMailerTest < ActionMailer::TestCase
  test "account_activation" do
    user = users(:michael)
    user.activation_token = User.new_token
    mail = UserMailer.account_activation(user)
    assert_equal "Account activation", mail.subject
    assert_equal [user.email], mail.to
    assert_equal ["noreply@example.com"], mail.from
    assert_match user.name,               mail.body.encoded
    assert_match user.activation_token, mail.body.encoded
    assert_match CGI.escape(user.email),  mail.body.encoded
    # 上のメソッドを使うとテスト用のユーザーのメールアドレスをエスケープすることもできます
    # エスケープ済みメールアドレスをテスト
    # assert_matchという非常に強力なメソッドが使われています。
    #   これを使えば、正規表現で文字列をテスト
    # fixtureユーザーに有効化トークンを追加している。
    #   追加しない場合は空白になります。
    # このテストがパスするには、テストファイル内のドメイン名を
    #   正しく設定する必要があります
  end
  
  test "password_reset" do
    user = users(:michael)
    # テストユーザー
    user.reset_token = User.new_token
    # 新しくトークンを作成
    mail = UserMailer.password_reset(user)
    # mail 　わからない。
    assert_equal "Password reset", mail.subject
    # メールのタイトルがあっているか？
    assert_equal [user.email], mail.to
    # 宛先はユーザーアドレスはあっているか？
    assert_equal ["noreply@example.com"], mail.from
    # 送り元はあっているか？
    assert_match user.reset_token,        mail.body.encoded
    # 第一引数の正規表現の値と第二引数の値がマッチすれば
    #    成功になるメソッドです。
    # メールの本文を（US-ASCIIに）エンコードで、テストの前に
    #    テストファイル内のドメイン名を正しく設定する
    assert_match CGI.escape(user.email),  mail.body.encoded
    # 与えられた文字列を URL エンコードした文字列を新しく作成し返します。
    # それと一致するか？
  end
end
```
###演習
1.
メイラーのテストだけを実行してみてください。このテストは green になっているでしょうか?

```
ubuntu:~/environment/sample_app (password-reset) $ rails test:mailers
Started with run options --seed 62955

  2/2: [==============================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.23588s
2 tests, 16 assertions, 0 failures, 0 errors, 0 skips
```

2.
リスト 12.12にある２つ目のCGI.escapeを削除すると、テストが red になることを確認してみましょう。

```
 assert_match mail.body.encoded
```

これでいいのかな？
とりあえずエラーになった。
railsチュートリアル第１２章 パスワード再設定のメール送信

##パスワード再設定のメール送信
createアクションがほぼ動作するところまで持っていきました。
残すところは、パスワード再設定に関するメールを送信する部分です。

###パスワード再設定のメールとテンプレート

####パスワード再設定のリンクをメール送信する
app/mailers/user_mailer.rb

```rb
class UserMailer < ApplicationMailer

  def account_activation(user)
    @user = user
    mail to: user.email, subject: "Account activation"
    # mailにsubjectキーを引数として渡しています。
    # この値は、メールの件名にあたります
  end

  def password_reset
    @user = user
    mail to: user.email, subject: "Password reset"
  end
end
```

####パスワード再設定のテンプレート（テキスト）
app/views/user_mailer/password_reset.text.erb

```
To reset your password click the link below:

<%= edit_password_reset_url(@user.reset_token, email: @user.email) %>

This link will expire in two hours.

If you did not request your password to be reset, please ignore this email and
your password will stay as it is.
```

####パスワード再設定のテンプレート（HTML）
app/views/user_mailer/password_reset.html.erb

```html
<h1>Password reset</h1>

<p>To reset your password click the link below:</p>

<%= link_to "Reset password", edit_password_reset_url(@user.reset_token,
                                                      email: @user.email) %>

<p>This link will expire in two hours.</p>

<p>
If you did not request your password to be reset, please ignore this email and
your password will stay as it is.
</p>
```

####パスワード再設定のプレビューメソッド（完成)
test/mailers/previews/user_mailer_preview.rb

```rb
# Preview all emails at http://localhost:3000/rails/mailers/user_mailer
class UserMailerPreview < ActionMailer::Preview

  # Preview this email at http://rails/mailers/user_mailer/account_activation
  def account_activation
  # http://localhost:3000/rails/mailers/user_mailer/account_activation
    user = User.first
    user.activation_token = User.new_token
    # activation_tokenは仮の属性でしかない
    UserMailer.account_activation(user)
  end

  # Preview this email at http://localhost:3000/rails/mailers/user_mailer/password_reset
  def password_reset
  # http://localhost:3000/rails/mailers/user_mailer/password_reset
    user = User.first
    user.reset_token = User.new_token
    UserMailer.password_reset(user)
  end

end
```

###演習
1.
ブラウザから、送信メールのプレビューをしてみましょう。「Date」の欄にはどんな情報が表示されているでしょうか?
時日が表示されている

2.
パスワード再設定フォームから有効なメールアドレスを送信してみましょう。また、Railsサーバーのログを見て、生成された送信メールの内容を確認してみてください。

確認

3.
コンソールに移り、先ほどの演習課題でパスワード再設定をしたUserオブジェクトを探してください。オブジェクトを見つけたら、そのオブジェクトが持つreset_digestとreset_sent_atの値を確認してみましょう。

```
>> User.find_by(email: "example@railstutorial.org")
  User Load (0.8ms)  SELECT "users".* FROM "users" WHERE "users"."email" = ? LIMIT ?  [["email", "example@railstutorial.org"], ["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2021-10-17 05:28:48", updated_at: "2021-10-20 04:46:59", password_digest: [FILTERED], remember_digest: nil, admin: true, activation_digest: "$2a$12$x4xVHmtrDFjVPFFWav31UebLY8r9sdT8ImzSXGSrnqt...", activated: true, activated_at: "2021-10-17 05:28:48", reset_digest: "$2a$12$cG8jnT1WjbiqtKZ9ZNgMlOLDZ72VzrIZ2DdB0Nbs2kb...", reset_sent_at: "2021-10-20 04:46:59">
```
``` reset_digest: "$2a$12$cG8jnT1WjbiqtKZ9ZNgMlOLDZ72VzrIZ2DdB0Nbs2kb...",```
```reset_sent_at: "2021-10-20 04:46:59```
オライリー本読み放題(ACM特典)で何冊くらい日本語書籍があるのか調べてみた

## TLDR
- オライリー学習サイト「[learning.oreilly.com](https://learning.oreilly.com/)」で日本語書籍が何冊くらい読めるのかを調べてみました
- 結論
   - 日本語本少ない＆古いの多い😑
   - 英語本多すぎ＆新しのもめっちゃある😲


## ACM(Association for Computing Machinery)会員とオライリー読み放題特典について
[いろんな記事](https://zenn.dev/miwarin/articles/a618f2ee9234b0)で既に紹介されているので詳細は省きますが、ザックリ言うと米国の超メジャーなコンピューター科学学会(ACM)に年$99で入ると特典でオライリーの本(Web版電子書籍)が読み放題になるというものです。

## ACM入会方法
[こちらの記事](https://blog.orz.at/2021/04/08/acm-student/)が参考になるかと思います

# オライリー本読み放題（learning.oreilly.com）の冊数＆新しさ調査
ACM特典でlearning.oreilly.com上のオライリー本が読み放題になるのはいいのですが、実際のところ何冊位あるのでしょうか？最新刊は含まれるのでしょうか？
また、少し前から[日本語の書籍も含まれる](https://qiita.com/moomooya/items/d2d697958a99250ba726#%E6%97%A5%E6%9C%AC%E8%AA%9E%E6%9B%B8%E7%B1%8D%E3%82%82%E5%8F%8E%E9%8C%B2%E3%81%95%E3%82%8C%E5%A7%8B%E3%82%81%E3%81%9F)ようになっていますが、こちらも同様に気になる所。
そこで、今回はサイト内のキーワード書籍検索結果から英語書籍と日本語書籍の冊数や新しさについて調査してみました。
(本文検索結果も含まれるので適切なワードを選べばほぼ全冊子が含まれるはずです)
― 検索実施日：2021/11/10

## 冊数チェック 
### 日本語書籍の冊数
全書籍が含むであろう検索ワード「の」で検索してみると **112冊** がヒットしました。
少なくはないですが、古い書籍も含まれると考えると少し物足りない気がします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/e962ffe1-bd20-fb30-20f9-32ffaf9feed6.png)

### 英語書籍(+日本語書籍)の冊数
一方英語の書籍ですがこちらは「a」で検索すると **44893冊** ❕❕ も見つかります。
桁違いすぎます。これを無視する手はないでしょう。
（ちなみに、検索ワードが「a」だと日本語書籍もほとんど含まれると思いますが、冊数が違いすぎるのでほぼ誤差の範囲でしょう）
（追記： @moomooya  さんからコメントいだだきまいたが、検索欄は空白にしても全件検索できるみたいです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/79dbc760-abe8-361c-63c8-3d035c83095c.png)

## 最新刊の有無チェック 
次は、どの程度新しい書籍が含まれるかも調べていきます。
書籍検索には「Last 2 year」というフィルタがあります。これは「ここ2年の間に刊行された本」という意味だと思われます。こちらのフィルタリング結果の冊数を確認しましょう。

### 直近2年の日本語書籍の冊数
5冊。。。😭
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/a18c0d6b-2a27-f3ef-fdd1-2c7eab430fb4.png)


### 直近2年の英語語書籍の冊数
**3859冊❕** すごいですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/de06e508-f791-b4c4-1cbb-7c4f0968926b.png)


### 発売前の本
ここまでで十二分にすごいのですが、書籍検索では「Early Release」という絞り込みを行うことができます（今回の検索では121冊ありました（下図参照））。
これは発売前の草稿段階の書籍が読めるというものです。
最新のトピックをいち早くチェックできるという


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406339/02644f80-475a-194a-dd10-7d93330558b5.png)


# まとめ
英語の書籍の圧倒的な物量に驚かされました。
日本語書籍は正直おまけといった印象ですね。

これから日本語の書籍が増えることを期待するよりは
英語の書籍を快適に読める環境を整備した方が良さそうな気がしますね。

最近はChromeのページ翻訳なども精度が上がってきてますので、
工夫すれば英語書籍でも日本語の書籍とほぼ同じ感覚で読み進めることができます。
私も英語は得意ではないですが、1か月ほど使っていてかなり快適に読めています。

**優れた内容の最新の技術書が読み放題**できるサービスというのは他に類を見ないです。
ずっといろんな本を読んでいたくなります。

英語が苦手と思っている方も是非購読してみてほしいですね。
【Vue.js】修飾子の種類

#はじめに
こんにちは！
今回は【Vue.js】修飾子の種類についてアウトプットしていきます！

#修飾子とは
@clickなどのイベントに付くドット(.) でつなげた修飾子。プラスで何か機能をつけたいときに使うイメージ。

#書き方・解説

##.lazy
`.lazy`はバインドのタイミングを遅延させることができる。

```HTML:HTML
  <input type="text" v-model.lazy="message">
  <p>
  {{ message }}
  </p>
```
```Vue.js
   data: {
     message: ''
   }
```

![スクリーンショット 2021-10-29 6.37.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/a5750809-6265-5826-65ec-44bbc1640984.png)

上記のように`.lazy`を付けるとテキストに文字を入力しただけでは`{{ message }}`の文字は表示されません。
タブキーもしくはenterキーを押して初めて、

![スクリーンショット 2021-10-29 6.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/f9487b7c-b114-c8a2-dd80-b0843cd944f4.png)

このように表示されます。入力文字を確認してから表示させたい場合などに使用すると良いと思われます。



##.trim
`.trim`は入力値から前後の空白を削除してからデータ代入することができる。

```HTML:HTML
  <p>
    <input type="text" v-model.trim="message">
  </p>
    <p>
    <input type="text" v-model="message">
  </p>
  <pre>
    {{ $data }}
  </pre>
```
```Vue.js
   data: {
     message: ''
   }
```

通常の場合だと、文字を入力する前にspace（空白）を入れたら、

![スクリーンショット 2021-10-29 6.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/1ddbeceb-66e1-b1d2-451c-dc47bf0c7fa8.png)

このようにそのまんま表示されます。
しかし、`.trim`を入れると、

![スクリーンショット 2021-10-29 6.44.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/0d62f149-9972-40b5-cf66-98aea8978b7c.png)

空白を入れても削除されて出力されます。空白があっても良いケースではないときに使用されます。



##.number
`.number`は入力値を数値型に型変換してからデータに代入することができる。

```HTML:HTML
  <p>
    <input type="number" v-model.number="age">
  </p>
  <p>
  {{ age + 10 }}
  </p>
```
```Vue.js
   data: {
     age: 0
   }
```

通常の場合は`{{ age + 10 }}`でテキストに10を入力すると、

![スクリーンショット 2021-10-29 6.50.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/16cbe195-3dea-6ece-1174-15b09ee95fb6.png)

このように10と10を並べるような形になってしまいます。
`.number`をつけてあげると、

![スクリーンショット 2021-10-29 6.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/557026f6-7a3e-351b-2e85-bb11d5177237.png)

入力値が数値型に型変換されてから表示されるので、このように足し算された形で表示されるようになりました。


#まとめ
・`.lazy`はバインドのタイミングを遅延させることができる。
・`.trim`は入力値から前後の空白を削除してからデータ代入することができる。
・`.number`は入力値を数値型に型変換してからデータに代入することができる。

#最後に
今回は３種類の修飾子についてアウトプットしました。
修飾子は他にも色々あるので少しずつ活用していきます。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
AtCoder ABC227 挑戦！(Python)

ABC227、コンテスト9回目の挑戦です。
Keyenceの名にびびったのか、A問題で35分もかかる失態。
B問題は、15分くらいでいけたが、C問題が全く解けずTLE。

```ruby:ABC227A
N, K, A=map(int, input().split())

#K枚のカードをA番目の人から配っていく
#Nで割ったKのあまり分、何周もする場合があるため
mod_K=K%(N)

#最後のカードの人
if N==1:
    print(N)
else:
    if A+mod_K-1 <=N:
        print(A+mod_K-1)
    else:
        print(A+mod_K-1-N)
```
なんか似たような問題を、B問題で解いたような気がした。
何周もする場合があるので、modで余りを計算してから、if文で解いた。
が、N=1のときだけ、例外で処理しないとどうしてもうまくいかなかったので、それであれこれやってたら、35分もA問題にかけてしまった。
どうやったらスマートだったんだろうか。絶対あると思うから、勉強しよう。

```ruby:ABC227B
N=int(input())

S_list=list(map(int, input().split()))
# print(N, S_list)

#面積
S_ab=0
#正の整数abによって可能な面積
S_ab_list=[]

for a in range(1,1000):
    for b in range(1,1000):
        #abのときの面積
        S_ab=4*a*b+3*a+3*b
        #面積制限
        if S_ab<=1000:
            S_ab_list.append(S_ab)
        else:
            pass
# print(S_ab_list)
# S_ab_list=set(S_ab_list)

#それぞれの人の面積が実現可能かどうかを判定
count=0 #確実に間違っている人の数
for i in S_list:
    if i not in S_ab_list:
        count+=1
    else:
        pass
print(count)
```
B問題は、正の整数abでありうる面積のリストを作っておいて、それがあるかどうかを判定した。
本当は、rangeの範囲もちゃんと考えた方がいいんだろうけど、両方1000で回した。無事AC。

C問題は、問題文が簡単そうに見えて難しかった。
当然のように、3重for文では、TLEするので、工夫する必要がある。
Cの値によって、B, Aの範囲が狭められそうというのは思ったのだが、Cの範囲によって、B, Aの回す範囲を変えていくのがどうやって書けばいいのかがわからず、ジエンド。
公式解説を見てみると、考えた方が逆で、A→B→Cの順で狭めていけばよかった。
実装は、for文で回しておいて、if文でbreakすればよかった。たしかにそうだ。。。

最後は順位表眺めて、何位くらいかなーというのを見てた。
なんか最近こういうの多いな。惨敗です。

お疲れさまでした。
Button Style before iOS 15.0 warning

備忘録

![スクリーンショット 2021-11-13 22.49.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/bcdb82cd-b80e-2d93-1bc2-2c15799a8e86.png)

ButtonのStyleをPlainからDefaultに変更
MacOSにDockerをインストールする

新卒クラウドエンジニア１年目のわたなべです！
世の中のエンジニアの技術力の高さをみて巨人に支配されていた恐怖を思い出した私が、一流の調査兵団（エンジニア）になるべく休日も心臓を捧げる過程を記事にしていきます！

記念すべき初回はMac OSにDockerをインストールしようと思います！

はじめに 〜 Dockerってなに？ 〜
--------------------------

Dockerとはコンテナのサービスの一つです。
仮想マシンは物理マシン上に複数のOSをデプロイ（展開）するのに対し、**コンテナはOSの上にアプリケーションなどの実行環境を仮想的に作ることができる**技術です。
例えば自分のPCにコンテナをデプロイすると、全く別の環境がPC上に存在しているようにでき、その環境にアプリケーションなどをデプロイすることが可能です。

Dockerはコンテナサービスの中で最も有名で、最も使用されているものです。

以下参考サイト

https://it.impress.co.jp/articles/-/15748

https://aws.amazon.com/jp/builders-flash/202104/chat-container-specialist/

Dockerのインストール方法
----------------

さっそくDockerをMacにインストールしていきましょう！
 
###私の環境
    - macOS Monterey バージョン12.0.1
    - チップ : Apple M1
    - メモリ : 16GB
    - ストレージ : 500GB
 
###Dockerのダウンロード
以下のサイトから自分のMacのチップに合わせてDockerをダウンロードします。

https://docs.docker.com/desktop/mac/install/


Apple製のチップを使っている方は、以下のコマンドをターミナルに打ち込んでください。

```
softwareupdate --install-rosetta
```

###Dockerをアプリケーションに追加
それでは、ダウンロードしたファイルを開きます。
ファイルを開くと以下の画面が出てくるので、そちらからDockerをドラックアンドドロップで追加してください。

![スクリーンショット 2021-11-13 21.39.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609580/6fa0e1d6-4ee7-434a-db1e-34cb558ffdc3.png)

###Dockerを起動、初期設定
LaunchpadからDockerを起動をします。
指示に従って初期設定しましょう。
下の画像までくればインストール完了です！
![スクリーンショット 2021-11-13 22.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609580/fafc04bf-df03-a6f4-5fd9-df63050a03d7.png)

まとめ
=====

本記事はMacOSにDockerをインストールする手順をまとめてみましたが、いかがだったでしょうか？
ご質問や間違っていることなどがあればコメントしてくださると助かります！

参考資料
======

https://it.impress.co.jp/articles/-/15748

https://aws.amazon.com/jp/builders-flash/202104/chat-container-specialist/

https://docs.docker.com/desktop/mac/install/
【Swift】Closureをasync / await に対応させる

Xcode13でSwiftがasync/awaitが追加され、既存のプロジェクトをasync/await対応する機会があると思います。
その上で、Closureで書かれている処理をasync/await対応する必要があったのでその方法をメモしておきます。

今回はFirebaseのTwitterAuthで使用する`getCredentialWith`がasync/await対応されていないかったので、自前で対応しようと思います。
参考:[iOS で Twitter を使用して認証する](https://firebase.google.cn/docs/auth/ios/twitter-login?hl=ja)

#元のClosure関数

twitterのProviderを指定して、Credential情報を取得するClosure関数です。

```swift
let twitterProvider = OAuthProvider(providerID: "twitter.com")

func getTwitterCredential(completion: ((Result<AuthCredential, Error>) -> Void)? = nil) {
    twitterProvider.getCredentialWith(nil) { credential, error in
        if let error = error {
            log.error("Twitter Auth error: \(error)")
            completion?(.failure(error))
        }
        completion?(.success(credential))
    }
}
```

# async / await化する

Closureをasync / await化するには[withCheckedThrowingContinuation](https://developer.apple.com/documentation/swift/3814989-withcheckedthrowingcontinuation)
または、[withCheckedContinuation](https://developer.apple.com/documentation/swift/3814988-withcheckedcontinuation)関数を使用します。

今回はエラーをthrowするので、`withCheckedThrowingContinuation`を使用してClosure関数をラップします。
処理が終了したら`CheckedContinuation`の`resume()`を呼んでそれらを返します。

```swift
func getTwitterCredential() async throws -> AuthCredential {
    return try await withCheckedThrowingContinuation { continuation in
        twitterProvider.getCredentialWith(nil) { credential, error in
            if let error = error {
                log.error("Twitter Auth error: \(error)")
                continuation.resume(throwing: error)　// 
            } else if let credential = credential {
                continuation.resume(returning: credential)
            }
        }
    }
}
```

# 作成したasync関数を呼び出す

```swift
do {
    let credential = try await self.getTwitterCredential()
} catch {
    log.error(error)
}
```

# 参考
https://zenn.dev/treastrain/articles/484564cf15a8a1
https://zenn.dev/treastrain/articles/e8099976ec845b
https://developer.apple.com/videos/play/wwdc2021/10132/
https://developer.apple.com/documentation/swift/3814988-withcheckedcontinuation
https://developer.apple.com/documentation/swift/3814989-withcheckedthrowingcontinuation
MacのFinderからサイドバーが消えた時の解決方法

## 結論
自分の場合は下記の2つを削除してからFinderを再起動したら直りました。
（正確にはmvで名前変更して復活した後削除しました）
ただカスタマイズしてたのとかはぱっと見初期状態に戻ってました。

~/Library/SyncedPreferences/com.apple.finder.plist
~/Library/Preferences/com.apple.finder.plist

## 状況
ある日突然サイドバーが消え、アプリのメニューからも「サイドバーを表示」がグレーアウトし、ショートカットも効かず（cmd + opt + s）、色々な方法でFinderを強制終了・再起動してもゾンビのようにサイドバーの無いFinderが復活してきました。

色々探す中で`com.apple.finder.plist`を削除する方法を見つけたため、
最初は`~/Library/Preferences/com.apple.finder.plist`を削除し、
それで解決しなかったので`~/Library/SyncedPreferences/com.apple.finder.plist`も削除したら直りました。

## 備考
この辺りあまり情報が出てこないのでもしより良い方法を知っている方がいましたらぜひご指摘くださいm(_ _)m
ナスは本当にナス色なのか調べてみた

##はじめに
Qiita Advent Calendar 2021 の「色　いろいろ」というテーマに参加しました。
色にまつわる話題ならなんでもOKと書いてあったので、興味を持ちました。
(何でもいいと言われると初心者でもいけるんじゃないかという謎の自信が湧いてくる)

日本には植物や動物から取られた色の名前があるけど、本当にその物の色を表しているか気になった。ぱっと思いついたのが茄子紺🍆
本当にナスの色か気になったので、画像処理から確認してみた。

##茄子紺について
https://www.color-site.com/names/432

色の確認は上記のサイトで実施した。RGBはR:69 G:31 B:73とのこと。「紺」とついているのでブルーがもっと強いのかなと思っていたけど、案外レッドも同じぐらい含まれている様子。

##比較するナス画像
https://food-foto.jp/

https://www.irasutoya.com/

上記のサイトから得られたナス画像を使うことにした。
![fd400156.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/31644f7e-b47f-1b68-834c-d6b22717a433.jpeg)
![nasu_eggplant2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/0cf91261-2d5d-5a0c-3246-bf77c133fbe4.png)


大体赤枠で囲った部分を切り出して、この領域のRGBを調べることにした。前者をナス1、後者をナス2とでもしておこう。

##検証
```python
#モジュールインポート
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#画像読み込み
nasu1 = cv2.imread('/content/ナス.jpg') 
nasu2 = cv2.imread('/content/ナス2.jpg') 

#画像の高さと幅を取得(今回は64*64で実施)
hight = nasu1.shape[0]
width = nasu2.shape[1]

# RGB平均値を出力
# flattenで一次元化しmeanで平均を取得 
b1 = nasu1.T[0].flatten().mean()
g1 = nasu1.T[1].flatten().mean()
r1 = nasu1.T[2].flatten().mean()

b2 = nasu2.T[0].flatten().mean()
g2 = nasu2.T[1].flatten().mean()
r2 = nasu2.T[2].flatten().mean()

# 小数点切り捨て
import math
b1 = math.floor(b1)
g1 = math.floor(g1)
r1 = math.floor(r1)

b2 = math.floor(b2)
g2 = math.floor(g2)
r2 = math.floor(r2)

print('R:{}  G:{}  B:{}' .format(r1,g1,b1)) #ナス1
print('R:{}  G:{}  B:{}' .format(r2,g2,b2)) #ナス2
```
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313235393935312f353037663.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/870b968f-461e-6e93-1829-28395f790ee7.png)

１つずつピクセルのRGBを出すのは大変なので、平均値で算出した。茄子紺として定義されているRGBと比べるとナス1は暗め、ナス2は明るめになっている。
算出されたRGBに何か固有の色名が付けられているか調べたけど、特に名前はついてないようだった。

##まとめ
RGBの結果からナス≠ナス色と結論付けた。
これはあくまでも今回の結果からなので、本当に茄子紺色のナスもあるかもしれない。
茄子紺色のナス、見てみたいな。

##参考
コードは下記のサイトから。
https://buto-dev-null.hatenablog.com/entry/2019/12/01/000000
単回帰，相関分析，分散分析は結果的には同じだよ

# 重回帰分析

なぜ，重回帰分析についての記事が何回も何回も掲載されるのか。それも，重回帰分析すらでなくて単回帰（直線回帰）分析。しかも，不十分な記事が。<br>

重回帰分析の導出なんて，誰が何回やっても同じなんだから，それを個別に何回も何回も記述しても，意味ないじゃん。数式を一杯書いたらすごそうに見える？

その割には，注意すべき点についてちゃんと記述できている記事も少ないし。

単回帰分析は重回帰分析のもっとも単純な場合なので，以下のように。

プラットフォームはいろいろあるが，R なら，


```R
options(digits=16)
x = c(2,1,3,4,5,5,4)
y = c(2,3,4,2,2,3,1)
lm.1 = lm(y ~ x)
lm.2 = summary(lm.1)
```


```R
# 直線回帰の結果の表示
# Coefficients の x の行の最終欄　Pr(>|t|) が，偏回帰係数（slope) H0: slope ≡ 0 の有意性検定
# 最終行の F-statistic の行の p-value が，回帰の分散分析の F 値に対する p 値
# 2つの p 値は同じである
print(lm.2)
```

    
    Call:
    lm(formula = y ~ x)
    
    Residuals:
                   1                2                3                4 
    -0.6666666666667  0.1666666666667  1.5000000000000 -0.3333333333333 
                   5                6                7 
    -0.1666666666667  0.8333333333333 -1.3333333333333 
    
    Coefficients:
                        Estimate       Std. Error  t value Pr(>|t|)  
    (Intercept)  3.0000000000000  1.0327955589886  2.90474 0.033605 *
    x           -0.1666666666667  0.2788866755114 -0.59761 0.576132  
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error: 1.032795558989 on 5 degrees of freedom
    Multiple R-squared:  0.06666666666667,	Adjusted R-squared:           -0.12 
    F-statistic: 0.3571428571429 on 1 and 5 DF,  p-value: 0.5761317257177
    



```R
# Multiple R-squared 重相関係数は，従属変数と独立変数の間の相関係数の 2 乗だ（直線回帰の場合，Adjusted R-squared はほとんど意味がない）
cor(x, y)^2
```

    0.0666666666666667



```R
# 直線回帰の場合の slope の有意性検定の p 値は以下の通り
cat("AGAIN: partial regression coefficient for x\n")
print(lm.2$coefficients[2,4])
```

    AGAIN: partial regression coefficient for x
    [1] 0.5761317257177403



```R
# 従属変数と独立変数の相関分析 は cor.test で行う
# 両者が無相関であるかの検定は p-value の横に示されているもの
# 偏回帰係数の検定 と 分散分析 の p 値と同じである
cor.test(x, y)
```


    
    	Pearson's product-moment correlation
    
    data:  x and y
    t = -0.5976143046672, df = 5, p-value = 0.5761317257177
    alternative hypothesis: true correlation is not equal to 0
    95 percent confidence interval:
     -0.8466377904121403  0.6143036678155451
    sample estimates:
                    cor 
    -0.2581988897471611 




```R
# 回帰分析の結果の所にもあるが，個別に検定することもできる
# 回帰の分散分析である
# Pr(>F) の下に書かれている p 値は，既に書いてきた 3 個の p 値と全く同じである
anova(lm.1)
```


<table class="dataframe">
<caption>A anova: 2 × 5</caption>
<thead>
	<tr><th></th><th scope=col>Df</th><th scope=col>Sum Sq</th><th scope=col>Mean Sq</th><th scope=col>F value</th><th scope=col>Pr(&gt;F)</th></tr>
	<tr><th></th><th scope=col>&lt;int&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th></tr>
</thead>
<tbody>
	<tr><th scope=row>x</th><td>1</td><td>0.3809524</td><td>0.3809524</td><td>0.3571429</td><td>0.5761317</td></tr>
	<tr><th scope=row>Residuals</th><td>5</td><td>5.3333333</td><td>1.0666667</td><td>       NA</td><td>       NA</td></tr>
</tbody>
</table>
Power Automate Desktop: ポップアップウィンドウの操作の仕方

# 背景
ポップアップウィンドウの操作でちょっと躓いたので記録

# 概要
色々なやり方があるみたいだけど、自分にとって簡単なのは以下

- ポップアップウィンドウをアタッチして操作

# 具体的な操作
[新しい Edge を起動する](https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/webautomation#launch-new-edge) で、ポップアップウィンドウに接続するってだけ。<br> ![2021-11-13_22h07_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/4b9ff30e-1874-6f6f-ef11-85f343e6a777.png)
## 対象を探す方法は以下三点
- タイトル
- URL
- 前面に出てる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b4e5808c-776a-f332-b002-38efbb83e0ce.png)

:::note
部分一致なんで冗長にならないように
:::

# 実際の動作例
Power Apps の [接続の修正](https://make.powerapps.com/environments/Default-7f8d27e7-be70-4bed-83d5-97be9ab7e711/connections) での例

- [接続の修正](https://make.powerapps.com/environments/Default-7f8d27e7-be70-4bed-83d5-97be9ab7e711/connections) を押すと、サインインウィンドウが起動します。（下図）
![2021-11-13_22h03_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f988c17f-247d-4c67-2855-b5974fcc82a8.png)

## 動作動画
![PopUpControl.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/2e9fe893-42df-39a9-4fdb-65d0494da050.gif)

# PAD のドキュメント
https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/introduction

# keyword
how to control popup window
PHP関数を変数に代入してみましょう！

#無名関数
<br>
関数を値として扱う為に変数に代入します！

以下の関数があったとします。
<br>

```php:index.php

<?php

function sum($a, $b, $c) {
     return $a + $b + $c;
}

```

<br>
変数 $sum に上の処理を代入します。

値だけ代入したいので関数名のsumは消して、

} の後に ; をつけます。 

<br>

```php:index.php

<?php

$sum = function ($a, $b, $c) {    //関数名のsumは消します
  return $a + $b + $c;
};
```


<br>
ではこの変数を使ってみましょう！

変数$sumに(1, 2, 3)の引数を渡します。
<br>

 ```php:index.php

$sum = function ($a, $b, $c) {
  return $a + $b + $c;
};
echo $sum(1, 2, 3) . PHP_EOL;

```

<br>
ターミナルに以下を実行します。
<br>

```
~$ php index.php
```

<br>
計算結果が出力されました！
<br>


```
~ $ php main.php
6
~ $ 
```

<br>
無名関数は、他の関数の引数として使う事もできます　☆
<br>
AWS Certified Machine Learning - Specialty に合格しました

2021/11/13 に MLS に受かりました。MLS 合格のためにしてきたことを書き記しておきます。
![AWS-Certified-Machine-Learning-Specialty-pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/c04cfaef-2e1e-f21b-8edf-e1bc3aa620a9.png)

## 対策

機械学習についての知識がゼロだったので、[G 検定の参考書](https://www.amazon.co.jp/%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E5%85%AC%E5%BC%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88/dp/4798165948/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=g%E6%A4%9C%E5%AE%9A&qid=1636803973&sr=8-5)を買って機械学習の基礎について勉強しました。4・5・6 章あたりを抑えておけば MLS の試験に対応できます。ディープラーニングの基礎なら、ヨビノリの「[高校数学からはじめる深層学習入門](https://www.youtube.com/watch?v=xzzTYL90M8s)」がおすすめです。段階をおって丁寧に説明（かつ、説明がとてもわかりやすい！）してくれているので、用語の理解、数学的にどのようなことが行われているのかが理解できるようになります。

AWS サービスについては、SageMaker は [Blackbelt](https://d1.awsstatic.com/webinars/jp/pdf/services/20190206_AWS_BlackBelt_SageMaker_part1.pdf) を確認しました。その他のサービスは、すでに DAS 資格を持っていましたので特に対策はしませんでした。 MLS で問われる AWS サービスは、DAS で問われる AWS サービスと被っているものが多いので、MLS を受験する前に DAS 試験を受けておくといいのではないでしょうか。

練習問題は、[WEB 問題集](https://aws.koiwaclub.com/exam/mls/)を利用しました。これだけで足りるか不安でしたが、試験範囲はほぼほぼカバーしていました。機械学習モデルで使用するアルゴリズムについては、WEB 問題集だけだと若干足りないかもしれないので、そこは各自で対策したほうがいいと思います（例えば、k-means 法を使うとどういったことができるのか、どういったユースケースで使用されるのか、など）。

## 終わりに

機械学習を活用すると何ができるのかを、 MLS 受験きっかけで勉強する機会を得れてよかったです。