OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptで日付をフォーマットする

### 1. やること

- JavaScript(TypeScript)でDateをフォーマットした文字列を取得する

### 2. バージョンなど

- "typescript": "^4.4.4",

### 3. やったこと

#### 3.1. Intl.DateTimeFormatを使った

- [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat)
- サンプルコードは以下
  - `Intl.DateTimeFormat().resolvedOptions().locale`でロケールを取得できる
  - `Intl.DateTimeFormat().resolvedOptions().timeZone`でタイムゾーンを取得できる
  - `formatToParts`でパーツごとのフォーマット値が取得できるので、それを利用してフォーマットできる

```
format(date: Date): string {
    const locale = Intl.DateTimeFormat().resolvedOptions().locale;
    const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
    const formatter = new Intl.DateTimeFormat(
        locale,
        {
            timeZone: timeZone,
            year: 'numeric',
            month: '2-digit',
            day: '2-digit',
            hour: '2-digit',
            minute: '2-digit',
            second: '2-digit',
            hour12: false
        }
    );

    const parts = formatter.formatToParts(date.getTime())
        .reduce((map, entry) => {
            map[entry.type] = entry.value;
            return map;
        }, {} as {[k: string]: string});

        return `${parts.year}/${parts.month}/${parts.day} ${parts.hour}:${parts.minute}:${parts.second}`;
}
```

#### 3.2. テストコード

##### 3.2.1. デフォルトのタイムゾーンの場合

- ここでは、デフォルトのタイムゾーンは`Asia/Tokyo`とする
- サンプルコードは以下

```
test("get correct formatted value", () => {
    const date = new Date(Date.UTC(2022, 0, 30, 0, 10, 20));

    const actual = DateTimeDemo.format(date);

    expect(actual).toEqual("2022/01/30 09:10:20");
})

```

##### 3.2.2. テスト実行時のタイムゾーンを固定する場合

- `jest.config.js`で`process.env.TZ`を設定して固定する
- `jest.config.js`の記述例は以下

```
process.env.TZ = 'Asia/Tokyo';

module.exports = {
  moduleFileExtensions: ['js', 'ts', 'tsx'],
  transform: {
    '^.+\\.(ts|tsx)$': 'ts-jest',
  },
  globals: {
    'ts-jest': {
      tsconfig: 'tsconfig.json',
    },
  },
}
```

##### 3.2.3. 他のタイムゾーンを検証したい場合

- `Intl.DateTimeFormat().resolvedOptions().timeZone`をモックする
- モックの記載例は以下

```
describe("another timezone(America/New_York)", () => {
    // UTC offset = −05:00

    beforeAll(() => {
        const DateTimeFormat = Intl.DateTimeFormat;
        jest.spyOn(Intl, 'DateTimeFormat')
            .mockImplementation((locale, options) => {
                return new DateTimeFormat(
                    locale,
                    {
                        ...options,
                        timeZone: "America/New_York"
                    }
                )
            })
    })
    afterAll(() => {
        jest.restoreAllMocks();
    })

    test("get correct formatted value", () => {
        const date = new Date(Date.UTC(2022, 0, 30, 0, 10, 20));

        const actual = DateTimeDemo.format(date);

        expect(actual).toEqual("2022/01/29 19:10:20");
    })
})
```

おわり。
【TP転職市場PJ日記その10】肝心のゲームが延期されて利用者が少なくなってしまったのでサービスクローズする話。 

#お久しぶりです。
ウイイレ転職市場サービスを開始していざこれからという時にこんな記事が…

https://www.konami.com/efootball/ja/page/update_announcement

※以下上記サイトの本文より引用

```
本作「eFootball™ 2022」は、基本プレー無料で配信し、
段階的、継続的なアップデートを実施していきながら、より多くのお客様に楽しんでいただくコンテンツにすべく、
制作を進めてまいりました。
2021年11月11日には、自分だけのオリジナルチームを強化して遊ぶ新モードの搭載や、
モバイル端末の対応を含んだアップデートを配信するため、スタッフ一同鋭意制作に取り組んでまいりましたが、
様々な部分において、お客様のご期待にお応えできるクオリティでお届けするためには、
更なるお時間をいただく必要があるとの判断に至り、この度、配信を延期させていただくことといたしました。
```

という事で、正式版リリースが延期になったと正式アナウンスがありました。
TP関連の動きがあればと思い少し様子をみておりましたが特に動きはない模様。

#そしてTPサービスは…
管理人が本業が忙しくなりずっと放置しておりました。はい。すみません。
まぁ片手間だったから許してほしい。
動きがないし、ユーザーも大半は別ゲームに流れてしまうという事でTPサービスも
誰にも使われないサービスに…

#という事で
サービスをクローズします。復帰はゲームの盛り上がり具合と管理人の時間ができたら復活させるかもしれません。
この記事は最終的なユーザー数や振り返りの記事として書いていこうと思います。

#クローズに向けて（その1）最終ユーザー数
![user.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570502/bdbf6a84-9157-1355-c69e-e323eb858da7.png)
64名のアカウント作成がありました。（うち1人は管理人なので実質ユーザー数は63名！）

#クローズに向けて（その2）最終ユーザーが作成された日
![user_created.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570502/5bc60779-819b-a163-21da-6fca389f661e.png)
efootballがダウンロードできたあたりですかね。そこからパタりと登録者数はなくなりました。
なんか分かる。

#クローズに向けて（その3)募集系の書き込み件数
![recruting.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570502/3db9beb4-c0e0-a1d0-e340-e2d2a6114ac0.png)
11件も書き込んでくれてました。このあたり使い方とかイメージできないけど
ゲーム自体も雲行き怪しいからなんとも言えないという事にしておく。

#振り返り
もともと、とあるユーザーのツイートから発展させてみたサービスだが肝心のゲームが問題になってしまうと
この手のサービスはほぼ利用価値がなくなってしまった。
しかし、管理人が初めて作ってみたwebサービスで利用者数が1~10名程度の小規模のサービスで終わるかと思いましたが
想像以上にはるかに超える利用者数でそこそこのニーズはあったと思われました。

###よかった点
・開発スピードはそれなりにできた。
（管理人の時間が捻出しやすい状況もあったがサクッと出来るような形でリリースが出来た）
・twitterを使って告知ができかつ周囲のフォロワー等の拡散等もあり、早い段階でユーザーを確保できた。告知なども最小限の告知はできた。
・ユーザーからのFBはなるべく早く対応できる部分は対応した。（全てではない）

###反省点
・UI等も考慮したつもりではいたが利用方法についてもう少しわかりやすい動画や資料を用意する事ができればよかった。
・他にも使えるようなサービスを設計しておけば、今回のようなゲーム自体が延期になった場合に転用がしやすかった。

###全体的に振り返って
ユーザーの声を必要なサービスなどに見える化する難易度は高かった。形にしてみたつもりだったが
管理人視点で使いそうだけど実際には使わない（アカウント登録しない）ユーザーもいたりなどユーザー数の獲得の難しさも
それとなく勉強になったと思う。
逆に応援してくれる人もいたりし終始開発のモチベは高くできた。一通りwebサービスの構築の経験はできたと思うので
これは、他のお仕事にでも活かそうと思う。

#さいごに
本サービスを登録していただいたユーザーの方々。ありがとうございました。
応援して頂いた方々。ありがとうございました。
サービスとしては一度クローズしてしまいますが、再び復活した際には告知させてもらいますので
その時は宜しくお願いします。
ネイティブアプリ とは

## 勉強前イメージ

フレームワーク使わずに書いたアプリ的な？

## 調査

### ネイティブアプリ とは

ネイティブアプリとは、OSにアプリケーションストア経由でインストールし使用するアプリのことを指します。
アプリケーションストアとは、AppleStore や GooglePlay のことです。
大きく、インストールするのが `ネイティブアプリ` 。
webブラウザで起動するのが `webアプリ` と言われます。

### ネイティブアプリ・webアプリのメリデメ

- ネイティブアプリ

基本、スマホ向けのアプリはネイティブアプリになります。

メリットとしては、インストールするためオフラインでも動き、動作が比較的早いです。
また、プッシュ通知や位置情報を使った機能が簡単に搭載できます。

デメリットとしては、ゼロから開発すると開発コストや時間がかかってしまい
アプリケーションストア経由でダウンロードしてもらうためにはある程度のハードルがあります。
また、対象機種やOS以外では動作しないため使用できる人がが限られる可能性があります。

- webアプリ

ブラウザで上で使用することのできるアプリになります。
インターネットが使える環境で使用することが前提と考えられています。

メリットとしては、アプリケーションストアを経由せずにアクセスするだけで利用できるため
アプリケーションストアへ手数料を支払う必要がないです。

デメリットとしては、webアプリは機能が少なくなりがちであり
プッシュ通知などが現在は利用できないという問題があります。

## 勉強後イメージ

インストールするのがネイティブアプリというのか・・・・
ただ単にアプリだと思ってた。。

## 参考

- [Webアプリとネイティブアプリの違いとは](https://yapp.li/magazine/2093/)
【C#】Visual Studioで「参照されていないアセンブリに定義されています」のエラーが出た

エラーの対処法を、個人の備忘録的に記事にいたします。

# 環境
- Windows10
- C# 7.3
- Visual Studio Community 2022

# エラー内容
```
CS0012 型 'DataTable' は、参照されていないアセンブリに定義されています。
アセンブリ 'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 
に参照を追加する必要があります。
```

# 解決方法
ソリューションエクスプローラー > 参照 > 参照の追加

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/6ea279f4-f90e-1e2e-efd8-251d93bee600.png)

追加してと言われている項目を追加。

今回だと`System.Data` を探してチェック。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/d88db6f1-d664-c86b-55fe-9efe3b45c0ed.png)

最後に「OK」をクリック。

以上となります。
Viewを突き出して表示させたい

#初めに
Viewを突き出して表示したい
Viewを他のViewと重ねて表示したい
そんな時のためにやり方を残しておきます


#コードでxmlに書いていく

  

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
        
     <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="50dp"
        android:background="@color/teal_200">

        <FrameLayout
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:layout_gravity="center_horizontal"
            android:background="@color/purple_200" />
      </FrameLayout>
    </FrameLayout>

![スクリーンショット 2022-01-30 23.07.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/68b271a2-5807-b4f7-0beb-bfa36a417555.png)

この様なLayoutを作っておきました
わかりやすい様に　突き出したい子ビューにパープルのカラー、親Viewに水色のカラーを付けておきました

このパープルの子Viewを上方向に突き出すために android:margin_top をマイナス方向に指定します

,,,

    <FrameLayout
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="-20dp"
            android:background="@color/purple_200" />

![スクリーンショット 2022-01-30 23.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/a2d3c575-c863-5b33-6609-620e5bddf676.png)

子Viewが上方向に半分食い込みました！w
でもこれではまだはみ出したViewが見切れていて困ってしまいますね

なので、はみ出した部分を表示させるために、親Viewの　更に親View（パープルの子Viewからみた祖父母View）に
 android:clipChildren="false"
    android:clipToPadding="false"
を加えます




    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false"
    android:clipToPadding="false"
    tools:context=".MainActivity">

![スクリーンショット 2022-01-30 23.37.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/1b043ee4-48ea-ca0d-5f02-18cf3ecaed2d.png)


はみ出して表示させることができました！


#最後に
今回はFrameLayoutを使って行いましたが、他の方法もあるみたいですので、機会があったら別の方法での記事も書いていきたいと思います
CocoaPodsの公式ページを読みながら初期設定をまとめる

タイトルの通りios開発時には使い方やエラーは調べてることがほとんどで、
そもそもCocoaPodsとはというものは調べたことが無かったため
公式ページを調べてまとめてみようという記事です。

基本的には下記の公式ページを翻訳などしてみていこうと思います。
https://cocoapods.org/

##そもそもCocoaPodsとは
- とりあえずの認識<br>
Xcodeのプロジェクトでライブラリの追加、バージョン管理ができるもの<br>
- 公式ページを翻訳
![about.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636051/b4da4b4f-b174-3ed8-f73a-5ee612abe16b.png)
<br>
機械翻訳するとやっぱりニュアンスが怪しいが大体は認識通りそう<br>
というかもしかして他に説明が見当たらない？<br>
<br>
とりあえず次に初期設定を見てみる
<br>

##Podsを使うための初期設定
- macのターミナルからCocosPodsをインストールする<br>
※PodsのインストールにはRubyGemsというものを使用するが、今回RubyGemsに関しては既に設定している前提です。<br>
<code>$ sudo gem install cocoapods</code> <br>
sudoの管理権限を付与しない設定もあるみたいですが、<br>
下手にPATHや.bash_profileをいじらなければ問題ない気がするのでこれも割愛<br>
なおPodsの更新はインストールと同じコマンドで良いもよう

##Podsファイルの作成
- プロジェクト(.xcodeproj)と同じところにPodfileという名前のファイルを作成し、<br>
公式ページある下記のように導入したいライブラリと指定が必要な場合はバージョンも記載する<br>
<pre><code>target 'MyApp' do <br>
  pod 'AFNetworking', '~> 3.0' <br>
  pod 'FBSDKCoreKit', '~> 4.9' <br>
end</code></pre>

##Podsファイルに記載したライブラリのインストール
<code>$ pod install</code>
ターミナルでPodfileを作成したところまでcdコマンドで移動し上記を実行すると
記載したライブラリをネットからDLが開始される。
エラーが表示された場合はエラー内容を確認して
改善後にPods.loclファイルとPodsディレクトリを削除し再度インストールを実行する。

##Podsファイルに記載したライブラリの更新
- Podfileに記載しているバージョンを変更し下記を実行<br>
<code>$ pod update</code><br>
※バージョンの記載をしていない場合は最新のバージョンがDLされる

## 最後に
公式に仕様とかいろいろあると思って調べてみたけどあまり書いてなかったため、よくありそうな記載方法のとりまとめになってしまった。<br>
いつも忘れた頃に作業が入るので備忘録的なものとして残しておこうと思います。
【2022年1月版】RedashをDocker Desktopで使ってみる

# はじめに
業務でRedashを使っているのですが、すでに用意されていたRedash＆ゲスト権限なため、Redash自体についてあまり理解できてない状態でした。

そこで理解を深めるため、自分でRedashをDocker Desktopで構築してみました。

本記事は、その手順的なものを備忘録的にまとめたものとなります。

:::note info
基本的には、下記の公式ドキュメント通りに実行しただけとなります。
:::

https://redash.io/help/open-source/dev-guide/docker

## 環境
- macOS Big Sur 11.6
- 執筆時の `master` のHEAD → [12c475068483ba1cc2525e73ecd20843bf435922](https://github.com/getredash/redash/commit/12c475068483ba1cc2525e73ecd20843bf435922)

# 1. Docker Desktopをインストール
まずはDocker Desktopをインストールしておきます。

https://www.docker.com/products/docker-desktop

# 2. Redashをclone
適当なところにRedashのリポジトリをクローンします。

```bash
$ git clone https://github.com/getredash/redash.git
```

# 3. REDASH_COOKIE_SECRETを設定
`REDASH_COOKIE_SECRET` という環境変数を定義する必要があるようです。
今回はローカルのPCに構築するだけなので、 `.env` ファイルを作成し、そこに記述しておきます。

詳しくは、下記ページが参考になりそうです。
https://redash.io/help/open-source/admin-guide/secrets

```bash:.env
REDASH_COOKIE_SECRET=hogehoge
```

# 4. Dockerをセットアップ
コンテナを作成します。

```bash
$ docker-compose up -d
```

成功すると、Docker Desktopに「redash」が表示されます。

![スクリーンショット 2022-01-30 10.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/23b0644c-720b-9a42-91fc-2ad1488126a3.png)


# 5. Nodeのパッケージをインストール
フロントエンド周りで必要になるようなので、Nodeのパッケージをインストールします。

```bash
$ yarn --frozen-lockfile
```

※ 上記コードを実行した際に、下記のようなエラーが発生しました。
内容的には `node` のバージョンが合ってないというものだったので、**[nvm](https://github.com/nvm-sh/nvm)** で `node` のバージョンを `14.16.1` に指定してあげることで解決しました。

```
error redash-client@11.0.0-dev: The engine "node" is incompatible with this module. Expected version "^14.16.1". Got "17.3.0"
error Commands cannot run with an incompatible environment.
```

# 6. データベース作成
データベースの作成を行います。

```bash
$ docker-compose run --rm server create_db
```

ここまで問題なく進んでいれば、http://localhost:5000 でRedashのページを読み込むことができるかと思います。

# 7. フロントエンドのコードをビルド
フロントエンドのUI構築のため、ビルドを行います。

```bash
$ yarn build
```

ちなみに、ビルドしなくてもページ自体は見れますが、デザインが当たってなかったです。

ビルド前|ビルド後
-|-
![r_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/2953fcee-e931-beaf-3002-198c1cb94505.png)|![r_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/fdd53893-43b3-4a4a-c298-b1b8fd84e715.png)

# 8. Adminユーザーを作成
最初にAdminユーザーを作成するページが表示されるので、そこで適当にユーザー名・メールアドレス・パスワード、組織名を入力します。

![スクリーンショット_2022-01-30_23_17_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/e6747d6a-1a58-5dee-b21c-42f5ac34e7a9.png)

# 9. 完了 :rocket: 
以上の工程で、Redashの構築が完了しました。
![スクリーンショット 2022-01-30 23.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/a671847d-fbd2-4533-d456-20cddaad5f89.png)

あとはデータソースを追加して、自分だけのRedashを自由にイジイジすることができますね:relaxed:

# まとめ
- ちょっとはまったところはありつつも、簡単にRedashをDocker Desktopで構築できた
- Redashの理解は深まってはいない
process.env を AWS Amplifyのconsole にて ビルド時の環境変数で差し替える

Node.js の env `process.env.XXX`を Amplify console においてフロントエンドのビルド時に環境変数を使って埋め込む

## フロントエンド側

### ファイル `{プロジェクトのルート}/.env.local` を作成
ファイル内は、以下とする

```
XXX=abc
```

XXXは、create-reacta-app で作成している場合は、`REACT_APP` を先頭に付与する。`REACT_APP_MAX_XXXX=1000` のように。


### ローカル環境で
- process.env.local で参照できることを確認する

```tsx
const key: string = process.env.XXX || '';
```

|| で結合しているのは、nullにならないようにしたいための策


- `{プロジェクトのルート}/.gitignore` は以下のような記載を想定

```
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
```

## Amplif console での設定

1. AWS AMplfiy →　アプリの設定にある「環境変数」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/2f154db7-c58f-bbf5-429f-d2f8b7b7c91e.png" width="300" />

2. 「変数の管理」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/3d055bed-5d48-8e78-1e63-5e51def8d474.png" width="600" />

3. 「変数を追加する」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/c76d7749-b205-6224-dc13-09231510ef57.png)
入力欄表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/c21da288-7894-d121-cd08-4f13f985f691.png)
変数と値を入力し、「保存」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/201ebe33-79ad-884a-1c11-a6e60cbf8409.png)

4. 変数の管理に保存した内容が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/749a1e2e-d6b9-e7c6-e3c0-6aac00636d77.png)


5. アプリの設定にある「ビルドの設定」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/246dd125-b969-1609-66f9-8724ffa08e7e.png)

6. 編集を押して、変更する。echo の行が編集内容

```yml
version: 1.0
backend:
  phases:
    build:
      commands:
        - '# Execute Amplify CLI with the helper script'
        - amplifyPush --simple
frontend:
  phases:
    preBuild:
      commands:
        - npm install
    build:
      commands:
        - npm run build
        - echo "XXX" >> .env
  artifacts:
    baseDirectory: build
    files:
      - '**/*'
  cache:
    paths:
      - node_modules/**/*
```

以上で、 Amplify console でビルドされたフロントエンド側は、`process.env.XXX` で参照されるようになる

ライセンス情報を埋め込むために上記を利用しました。
【備忘録】フィッシャーの3原則とは？なぜ重要なのか？

##フィッシャーの3原則とは
フィッシャーの3原則とは、英国の統計学者フィッシャーが提唱した実験計画における重要な考え方のこと。
下記の3つ。
####1, 反復（繰り返し）
####2, 無作為抽出（ランダムサンプリング）
####3, 局所管理

##フィッシャーの3原則の前に
誤差には2種類ある
偶然誤差・・偶然生じる誤差
系統誤差・・実験環境・実験条件によって生じる誤差。
実験においては「系統誤差」をコントロールし、結果が「偶然誤差」なのか「要因による差」なのかを調べることが重要。

##1, 反復（繰り返し）
同一条件で複数回試行すること。
これにより偶然誤差の散らばり度合（分散）を知ることが可能になる。

##2, 無作為抽出（ランダムサンプリング）
標本抽出する、もしくは標本の群分けをする際に、ランダムに行うというもの。
系統誤差が生じないようにするために行う。

##3, 局所管理
系統誤差も実験の目的として取り入れて実験計画を立てること。
つまり、系統誤差を除去する。（誤差ではなく要因にする）
例えば、実験を行う環境ごとに群分けを行うなど。ただし、個々の群内におい無作為化する必要がある。
【Rubocop】W: Lint/ShadowingOuterLocalVariable: Shadowing outer local variableについて

#状況
Rubocopを実行すると以下のエラーを吐かれた。

```
spec/rails_helper.rb:65:23: W: Lint/ShadowingOuterLocalVariable: Shadowing outer local variable - config.
  RSpec.configure do |config|
                      ^^^^^^

108 files inspected, 1 offense detected

Exited with code exit status 1
```

#原因
FactoryBotのcreateメソッドを有効にするためにspec/rails_helperにいくつかコードを追記したが、よく見たらconfigというブロック変数の中にさらにconfigというブロック変数を追記していた。
（これはこれで見てて面白いのでここに残しておきます。）

```ruby:rails_helper.rb
RSpec.configure do |config| 
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
  RSpec.configure do |config|
    config.include FactoryBot::Syntax::Methods
  end
end
```

#参考
https://stackoverflow.com/questions/33737692/what-is-shadowing-outer-local-variable-in-rubocop-and-how-do-i-fix-this
RubyでGoogleSpreadSheetのハイパーリンクの値を取る

セルの値は割と簡単にとれるし、公式でもコードが例示されているのでやりやすい。
ただ、セルの情報を取ろう（例えばハイパーリンク）とするとそのままだとダメだった。

### よくある例（というか公式）
https://developers.google.com/sheets/api/quickstart/ruby

だいたい`service.get_spreadsheet_values spreadsheet_id, range`で値を取る例が多い。
これだと拡張属性取れない。

### pythonだと…
https://stackoverflow.com/questions/46879715/get-hyperlink-from-a-cell-in-google-sheet-api-v4
こんなのが見つかったので、rubyでどう書くか調べる。

### rubydoc
https://googleapis.dev/ruby/google-api-client/latest/Google/Apis/SheetsV4/SheetsService.html#get_spreadsheet-instance_method
これが対応するメソッドのようだ。
（メソッド名だけだとセル取るのかわからないが…）

https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/get
ちなみにAPIのほうはこれ。Rubyのサンプル適当かよ…

### 最終的に
`response = service.get_spreadsheet(SPREAD_SHEET_ID, fields: "sheets/data/rowData/values/hyperlink", ranges: "A1:B2")`
みたいになる。
Code as Creative Mediumを読んで、クリエイティブコーディングの独学について思うこと

かれこれProcessing授業歴15年の私ですが、[BNNの「Code as Creative Medium」](http://www.bnn.co.jp/books/11411/)を読みました。教える立場として非常に参考になる本です。まずは、著者をはじめ日本語版の出版にご尽力いただいた関係者の方々に深く御礼申し上げます。

この記事ではこれを独学でやろうと思っている方に向けて、私が本書を読んで感じた、ちょっとしたアドバイスをいくつかのポイントに分けて書いてみたいと思います。

# 学ぶペースについて

第１部の課題はとても刺激的ですが、１日１つやるとかそういうペースじゃなくて全然いいと思います。１つにつき少なくとも３週間くらいはじっくり味わう感じです。1ヶ月かけてもいい。私だったらこの中から３つ選んで15週の授業を組み立てるかな。

対して第２部のエクササイズは一つをサクサクこなしていく感じで力がつくと思います。さすがモチベーションが刺激されるように練られている印象です。何人かで集まってもくもく会をする時のお題にも良さそうです。

# どの段階で読むべきか

イントロダクションにも書いてある通り、基本的に教育者向けの本なので、独学しようと思う場合には何らかの言語でグラフィクカルなプログラミングの基礎がないと、そもそもこの本から学びを得ることが難しいと思います。

ひとつの目安として、例えば田所淳さんの

[Processing クリエイティブ・コーディング入門―コードが生み出す創造表現](https://gihyo.jp/book/2017/978-4-7741-8867-6)

の第３章（欲を言えば第5章）くらいまでは学習してみてからこの本に向き合うのがおすすめかと思います。

# 用語について

唐突に難しい単語が出てくる箇所が散見されます。

例えば、第一部の最初の課題で特に注釈もなく「デカルト座標系」とか「カプセル化」といった入門者向けではない用語が出てきます。しかし、これもやはり教員向けに書かれているためだと思います。

知らない用語が出てきても凹まず、良い機会だと思って調べてみてもいいと思いますし、それでモチベーションが下がるくらいならその課題をパスして後に回してもいいと思います。

# 全体の感想

コンセプトに掲げられている通り、非常に長く読まれる本になるように思いました。噛めば噛むほど味が出る「スルメ」のような本という印象です。

私の経験として、独学でクリエイティブコーディングを学んで基礎を終えた方からの相談としてよくあるのが

- 「Processingの入門本に書いてあることは理解できたけれど、その先をどう発想してして良いかわからない」
- 「やりたいことのイメージがあるのだけど、実現するためにどういう要素に分解したら良いのか知りたい」
- 「やりたいことが漠然としていて、どういうキーワードで検索すればいいかわからない」

といった内容です。	

こういったお悩みは、クリエイティブコーディングの入門から中級に上がるあたりの独学できるちょうど良い書籍がなかったことが要因の一つでしょう。

[サンプルコード](https://github.com/CodeAsCreativeMedium/exercises)や[サポートサイトのリファレンス](http://www.bnn.co.jp/specially/cacm-jp/)がとても充実していることも本書の特筆すべきポイントです。
これまで大学教育の中だけでしか体験できなかったクリエイティブコーディングの学びを、独学できる可能性を開く本だと感じました。
MacをMontereyにアップデートしたらAlfredTweetが動かなくなった

# 環境

- Mac: Monterey
- Alfred3

# 解決策

1. Alfred4.6にバージョンアップする
1. phpをInstallして動かす

## 1.Alfred4.6にバージョンアップする

公式の解決策はこれ。
PowerPack使ってるから買い直さないといけないので却下したので、試していません。

>If you install PHP (eg via homebrew ), most PHP-based workflows will continue to work without an issue, as the workflow script objects in Alfred 4.6 have been updated to be aware of alternative bin paths.

PHPをインストールした場合（たとえば、homebrewを介して）、Alfred 4.6のワークフロースクリプトオブジェクトが代替のbinパスを認識するように更新されているため、ほとんどのPHPベースのワークフローは問題なく機能し続けます。

https://www.alfredapp.com/blog/releases/alfred-4-6-ready-for-macos-monterey/


## 2. phpをInstallして動かす
参考ページ：　

https://www.jianshu.com/p/c18f1dc2f44b

内容としては

1.　HomebrewからphpをInstallする
2.　Workflowの変更とスクリプト化

### HomebrewからphpをInstallする

```
$ brew install php ## /usr/local/bin/phpにインストールされる
```

### Workflowの変更とスクリプト化
Alfred3はWorkflowの中で`/usr/bin/php`を直接参照しているため、シンボリックリンクを作れば良いと思ったが、MacはSIP([System Integrity Protection](https://support.apple.com/ja-jp/HT204899))というものがあるため、`/usr/bin/php`を操作することはできない。

```
$ ln -s /usr/local/bin/php /usr/bin/php
ln: /usr/bin/php: Read-only file system
```

そのため、以下が必要

- **Language:bash**からphpをKickしている部分を　`/usr/local/bin/php`に変更
![スクリーンショット 2022-01-30 22.39.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48314/8d60eb88-3129-bcd6-2cf7-5288dcb1cff2.png)
- **Langugage:/usr/bin/php**としてKickしているScriptを同じディレクトリ内にスクリプトファイルとして保存して、bash or zshから実行
    - 変更前
    ![スクリーンショット 2022-01-30 22.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48314/61b28a83-be68-4276-5d2c-34896163d48f.png)
    - 変更後
    ![スクリーンショット 2022-01-30 22.49.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48314/a6208146-e366-8de5-28cc-34b17a8fa21b.png)

#### phpを書いたことない人への注意点

1. phpをスクリプトファイルとして保存するときは`<?php`と`?>`でかこむ必要がある

```
<?php
  some script 
?>
```
2. phpスクリプトに`{query}`のような引数があったときは変更する必要がある。

```
$text = $argv[1];  // $text = "{query}";
```

# 感想
今まで全くやらなかったphpを知れた。
async await multiple 自分の使う言語まとめ

コンパイラの言うがままにasync awaitして結局同期的じゃんと言うコードを死ぬほどみてきた。
いいかげんそこそこ使いこなせる程度には知っておきたいね。

# JavaScript
https://qiita.com/im36-123/items/c0678a46ee0f8e44e150
`await Promise.all`使う

```javascript
function get(url) {
  return fetch(url);
}

async function fn() {
  const results = [];
  const urls = ['https://hoge/api', 'https://fuga/api'];
  for (const url of urls) {
    results.push(get(url));
  }
  console.log(await Promise.all(results));
}
```

# Kotlin
https://stackoverflow.com/a/62966043/5598088
`awaitAll`使う

```kotlin
viewModelScope.launch {
    val a = async { firstUseCase.execute() }
    val b = async { secondUseCase.execute() }

    val (resA, resB) = awaitAll(a, b)

    //Use results 'resA' and 'resB' here
}
```

# Python 
`asyncio.gather`使う
https://stackoverflow.com/questions/34377319/combine-awaitables-like-promise-all

# Dart
https://stackoverflow.com/questions/55502528/flutter-multiple-async-methods-for-parrallel-execution

```dart
  final results = await Future.wait([
    task2(),
    task2(),
    task2(),
    task2(),
  ]);
  print(results);

Future<String> task2() async {
  String result;
  Duration sec3 = Duration(seconds: 3);
  await Future.delayed(sec3, () {
    result = 'task 2 data';
    print('Task 2 complete');
  });
  return result;
}

[task 2 data, task 2 data, task 2 data, task 2 data]
```
スケール因子を変更したカイ自乗分布の期待値と分散

## はじめに
とある事情からカイ自乗分布の自由度とスケール因子を当てはめた際の期待値と分散を知りたくなったので書きました．
一般的に自由度 $k$ ，スケール因子を $s=1$ としたときのカイ自乗分布について，
期待値と分散を求めている記事は見かけましたが，スケール因子が $s=1$ 以外の時に求める方法があまりなかったので備忘録がてら残しておきます．

## 期待値と分散
自由度 $k$ ・スケール因子 $s$ のときの期待値と分散
$$E[\chi^2(k ,s)]=ks\text{：期待値}$$
$$V[\chi^2(k ,s)]=2ks^2\text{：分散}$$

## 求め方
カイ自乗分布とガンマ分布の関係性を利用します．
カイ自乗分布はガンマ分布の特別な形のため，カイ自乗分布の自由度を$k$，スケール因子を$s$とすると，
$\alpha=k/2$ および $\beta=2s$のガンマ分布と等しくなります．
$$ Ga(\alpha=\frac{k}{2},\beta=2s)=\chi^2(k,s) $$
ここでガンマ分布の期待値と分散は
$$E[Ga(\alpha,\beta)]=\alpha \beta\text{：期待値}$$
$$V[Ga(\alpha,\beta)]=\alpha \beta^2\text{：分散}$$
となるため $\alpha=k/2$ および $\beta=2s$を代入すると
$$E[\chi^2(k ,s)]= \alpha \beta = k/2\times2s=ks\text{：期待値}$$
$$V[\chi^2(k ,s)]=\alpha \beta^2=k/2\times4s^2=2ks^2\text{：分散}$$
となり求めることができます．

## 例示
1. 自由度 $k=5$ ・スケール因子 $s=0.1$ のときの期待値と分散
$$E[\chi^2(k=5,s=0.1)]=5\times0.1=0.5\text{：期待値}$$
$$V[\chi^2(k=5,s=0.1)]=2\times5\times(0.1)^2=0.1\text{：分散}$$

```python
# Python
from scipy.stats import chi2
chi2.stats(5,scale=0.1,moments="mv")
```


2. 自由度 $k=6$ ・スケール因子 $s=10$ のときの期待値と分散
$$E[\chi^2(k=6,s=10)]=6\times10=60\text{：期待値}$$
$$V[\chi^2(k=6,s=10)]=2\times6\times(10)^2=1200\text{：分散}$$

```python
# Python
from scipy.stats import chi2
chi2.stats(6,scale=10,moments="mv")
```

## おわりに
初めは確率密度関数から導こうとしましたが，自分ではあまりにも大変だったのでガンマ分布経由で求めました．
証明になってなさそうな気もしますが温かい目で見てもらえると嬉しいです．

## 参考
[データ化学便覧，ガンマ分布](https://data-science.gr.jp/theory/tpd_gamma_distribution.html)
[AVILEN AI Trend，ガンマ分布の期待値と分散を密度関数から導出する](https://ai-trend.jp/basic-study/gamma-distribution/g-parameter-derivation/)
[AVILEN AI Trend，カイ二乗分布のわかりやすいまとめ](https://ai-trend.jp/basic-study/chi-squared-distribution/chi-squared-distribution/)
並行処理時のFileAlreadyExistsException

テスト中、起こらないはずが時たまエラーになって確認したもの

参照したサイト：
- how to resolve : https://stackoverflow.com/questions/16179102/files-createdirectory-filealreadyexistsexception
- java doc https://docs.oracle.com/javase/jp/7/api/java/nio/file/Files.html#createDirectory(java.nio.file.Path,%20java.nio.file.attribute.FileAttribute...)

## 問題になるコード
```java
if(!directory.exsits()){
 Files.createDirectory(dir);
}
```
## FileAlreadyExistsException原因→並行処理による
パスの存否によってパスを作成するように対応したはずなのに。。。！

あ。。並行処理を見逃した。
たとえば、処理A、Bがあれば
A：check to path exist -> nope -> so go next step
B：also check to path exist -> nope( have not made by A)
A：make dir
B：also make dir ☆ throw FileAlreadyExistsException
( ﾉД`)ｼｸｼｸ…つまり、並行処理をやめるか、フォルダが存在しても作ったら問題がように修正が必要だった。

### 開発方法
あ。。。簡単すぎるが

```JAVA
//修正前
Files.createDirectory(dir);
//修正後
Files.createDirectories(dir);
```

createDirectoriesに修正したら問題はなくなった。
元々このメソッドは dir = a/b/c/d の場合、 aからdまで一通り作ってくれるメソッドでちょっと。。。？違くない。。？とするけど、やりたいものはフォルダがなければ作るのはあったので採用！

※存在しないすべての親ディレクトリをまず作成することで、ディレクトリを作成します。createDirectory メソッドとは異なり、ディレクトリがすでに存在しているために作成できなかった場合でも例外はスローされません。

### 退屈で調査したもの 심심해서 뜯어본 코드
```java
 public static Path createDirectory(Path dir, FileAttribute<?>... attrs)
        throws IOException
    {
        provider(dir).createDirectory(dir, attrs);
        return dir;
    }
```
내부적으로 IOException이 나타나면 그냥 예외로 에러를 내게끔 되어있다. 
[IOException_FileAlreadyExistsException]:https://docs.oracle.com/javase/jp/7/api/java/nio/file/FileAlreadyExistsException.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/6dd3f368-205c-b5ad-054d-a24397858ea9.png)

```java
 public static Path createDirectory(Path dir, FileAttribute<?>... attrs)
        throws IOException
    {
        provider(dir).createDirectory(dir, attrs);
        return dir;
    }
```
attrs? 속성은 뭔가 바꿀 수 있는 건가...

```java
public static Path createDirectories(Path dir, FileAttribute<?>... attrs)
        throws IOException
    {
        // attempt to create the directory
        try {
            createAndCheckIsDirectory(dir, attrs);
            return dir;
        } catch (FileAlreadyExistsException x) {
            // file exists and is not a directory
            throw x;
        } catch (IOException x) {
            // parent may not exist or other reason
        }

~~省略~~
```

and おまけ
https://stackoverflow.com/questions/49235657/mkdirs-vs-files-createdirectoryies ふむふむ

The difference seems to come down to error handling and what you want to do with the code. For example, mkdir throws an exception only if you don't have permission to create the folders, while createDirectory will throw other exceptions, including if a file exists with the same name as the directory you're trying to create. mkdir is also not atomic, so if it fails to create a folder, it might leave behind all the folders it did create up to that point, while createDirectory would leave no folders if it failed


https://www.baeldung.com/java-path-vs-file
1. java.io.File java1からあったpacakge<-legacy
2. java.nio.file.Path version7からあった
AWS の EC2 上にJenkinsをインストールする

初投稿となりますので、つたない部分はご容赦ください。
以下タイトルを実現するまでの手順です。

#EC2インスタンスの作成
* EC2インスタンスを作成します。私は以下のパラメータで設定しました。
 * リージョン：東京
 * AMI：Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type - ami-03d79d440297083e3 (64 ビット x86) / ami-0feb52c8d51bafff6 (64 ビット Arm)
 * インスタンスタイプ：t2.micro
 * セキュリティグループ（インバウンドルール）：ssh22番、カスタムTCP8080を指定

#JDK8のインストール
1. 以下のコマンドを実行
<pre>$ sudo yum install java-1.8.0-openjdk-devel.x86_64</pre>

2. 以下のコマンドでインストールが成功したか確認
<pre>$ java -version</pre>

#Jenkinsのインストール
1. yum のリポジトリを追加
<pre>$ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
$ sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key</pre>
 
2. 接続先のbaseurlがhttpだとinstallでコケるのでhttpsに変更
　※編集方法は→の記事に記載 https://qiita.com/tk_dev_vr_unity/items/c343117b3fad572994aa
<pre>$ sudo vi /etc/yum.repos.d/jenkins.repo
[jenkins]
name=Jenkins
baseurl=https://pkg.jenkins.io/redhat
gpgcheck=1
</pre>

3. Jenkinsをインストール
    <pre>$ sudo yum install jenkins</pre>

4. 以下のコマンドでJenkinsがインストールできたか確認
<pre>$ rpm -qa | grep jenkins
jenkins-2.332-1.1.noarch</pre>

   * 3で次のエラーがでる場合は
   　![InkedEC2_JenkinsError_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519339/d02c31d0-6e75-eee5-c8c7-c207b23bc872.jpeg)

       * 以下のコマンドを実施することで解消される
     <pre>$ sudo amazon-linux-extras install epel -y 
     $ sudo yum update -y 
     $ sudo yum install jenkins java-1.8.0-openjdk-devel 
     </pre>



#参考記事
https://qiita.com/thirota/items/dc1dc558e5439fb0b0b6

#終わりに
LINUX使うのが初めてだったので結構苦戦しました。
参考記事に載せさせていただいた記事にはとても助けられました。その中で個人的に詰まった部分を追記する形で書いています。誰かのお役に立てれば幸いです。
PostgreSQLでシーケンスをリセットする方法2選

# はじめに
シーケンスのリセットし忘れでテストデータ作成時にシーケンスの重複エラーがあり、リセットの方法を調査する機会がありましたのでそのときのメモを残しています。方法としては調査した限りだと、2通りあるのかなと思います。

* TRUNCATEによるシーケンスをリセット
* シーケンス関数（setval）によるリセット

# 方法1　TRUNCATEによるシーケンスをリセット
```
TRUNCATE TABLE <table_name> RESTART IDENTITY;
```

# 方法2　シーケンス関数（setval）によるシーケンスをリセット
```
SELECT SETVAL ('テーブル名_カラム名_seq', 1, false);
```
※第3引数をtrueにすると2番目のパラメータで指定した数値の次の値からシーケンスが振られます。
(上記の例だと、シーケンスは2が振られます）

# おまけ　シーケンスの値を確認
```
SELECT * FROM テーブル名_カラム名_seq;
```

#参考
* [Postgresにてシーケンスをリセットする方法](https://www.t-webu.net/postgres/postgres%E3%81%AB%E3%81%A6%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9%E3%82%92%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.html)
* [https://salumarine.com/how-to-reset-sequence-by-truncate-table-in-postgresql/](PostgreSQL : truncate tableでシーケンスをリセットする方法)
Linuxファイルの編集・保存・終了方法

#手順

1. 「i」と入力してインサートモードに変更
2. 編集
3. ESCキーを押してインサートモードを終了
4. 「:w」と入力して保存
5. 「:q」と入力して終了

「:w」「:q」をまとめて「:wq」とすることも可能。
Storagegateway用のEC2にSSHログインできない意外な見落とし


Stogtagegateway作成の際にEC2インスタンスを作成するケースがしばしばあります。
その際にEC2インスタンスでは以下のAMIで作成します
AMI ID: aws-storage-gateway-1637946823
このAMIでEC2を作成してSSHログインしてみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/616c646b-74e1-7c52-28d6-c9e851d38c59.png)

あれれ・・・認証に失敗した・・・
疎通はしているし、EC2の秘密鍵は正しいし・・・あ・・・ユーザー名がおかしい・・・？

ということでドキュメントを確認してみると・・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/4e691650-8f49-55ee-8562-9bb980d909c7.png)

ユーザーがadminじゃないですかああああ！！！！

https://docs.aws.amazon.com/ja_jp/storagegateway/latest/userguide/troubleshooting-EC2-gateway-issues.html

ということでユーザーをadminに設定しなおしてログインすると・・・
無事ログインできました
ちなみに、AWS Storage Gatewayのところはただ例のAMIを設定してEC2作成するとAWS Appliance Activationと表示されます




        AWS Storage Gateway - Configuration

        #######################################################################
        ##  Currently connected network adapters:
        ##
        ##  eth0: 123.456.789.0
        #######################################################################

        1: HTTP/SOCKS Proxy Configuration
        2: Network Configuration
        3: Test Network Connectivity
        4: View System Resource Check (0 Errors)
        5: License Information
        6: Command Prompt

        0: Get activation key

        Press "x" to exit session

        Enter command:
lambdaとは

##目的
めも。labmdaを名前しか知らなかったので軽く調べた。

##lambdaとは

* サーバーレスでプログラムを実行できるAWSのクラウドサービス。
* あるイベントが発生したら、プログラムを実行するなどの関数（=lambda関数）を
定義しておくことで、自動でプログラムを実行してくれる。

* 使用状況は、関数に対するリクエスト数とコードの実行時間に基づいて決まる、従量課金制。
無駄なコストがかからない。

##そもそも”サーバーレス”とは
Webサービスの開発に必要なサーバーの構築や保守をしなくても、サーバー上でプログラムを実行できること。

"レス"と言っているが、サーバーが必要ないわけではなく、管理が必要ないことを指す。
サーバーレスにも種類があってその中の一つがFaaS(Function as a Service)と呼ばれるサービスである。

lambdaもFaaSである。


##FaaSの特徴

* イベントドリブン式
  * イベントごとに実行されるコードを書く
* 開発費用を抑えられる
  * イベントが発生すると処理が動くので、動いた分だけ払えばOK 


##lambda使用例

* S3(AWSのストレージサービス)にデータがアップロードされたら（イベント）、データを圧縮する。



##参考

[AWS Lambdaってなに？なにができるの？](https://www.stylez.co.jp/columns/what_is_aws_lambda/)
[「FaaSとは？」　SaaS連携の専門家が分かりやすく解説！](https://www.strategit.jp/column/about-faas-1/)
[AWS Lambdaとは？できることを分かりやすく解説！](https://and-engineer.com/articles/YHfIoBMAACUAI_R6)
AWS未経験でも１ヵ月でSAAに合格する方法

# はじめに
この記事はこんな方におすすめです。

- AWSの基礎的な知識を身につけたい
- AWS認定資格を短期間で取得したい
- AWSを仕事で活かしたい
- 少しでも周りに差をつけたい

そんなあなたへエンジニア歴６ヵ月、AWSも未経験だった私が１ヵ月でSAAに受かった方法を伝授します！


## まずは結論
短期間で合格するには、「全体像を掴んでからとにかく問題を解く」がなにより近道です。

ゼロベースから問題だけ解きまくっても一番大事な全体像が見えず迷走してしまいます。AWSサービスが解決する課題はどういうものなのか、またそれをどうやって解決しているのか、おおざっぱでいいので全体像を掴んでみてください。そこから問題に取り掛かることではるかに効率的な勉強ができます。

## 全体像の把握
先も述べましたが、全体像の把握は効率的な勉強をする上でとても大事になります。
２週間もあれば１冊は確実に読めると思いますので、頑張って読んでみてください。

以下の本が個人的にはおすすめです。これ一冊読めばSAAは問題ないので安心してください。
[(模擬問題付き)改訂新版 徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書[SAA-C02]対応](https://www.amazon.co.jp/%E6%A8%A1%E6%93%AC%E5%95%8F%E9%A1%8C%E4%BB%98%E3%81%8D-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8-SAA-C02/dp/4295010650/ref=sr_1_1_sspa?adgrpid=109806388931&gclid=Cj0KCQiAi9mPBhCJARIsAHchl1yAkx8AmN0u1-U2Yu0PpcICz4m3wV9sPLOIZLTz84CS--pblTeAqpQaApnJEALw_wcB&hvadid=553962877112&hvdev=c&hvlocphy=1009343&hvnetw=g&hvqmt=e&hvrand=13077495389496071606&hvtargid=kwd-723632987677&hydadcr=4074_13159886&jp-ad-ap=0&keywords=aws+%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88+%E6%9C%AC&qid=1643542116&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEySzNKNUlFR0E5NklXJmVuY3J5cHRlZElkPUEwNzk5NDU4MU5JOEZFOFRLWTZURiZlbmNyeXB0ZWRBZElkPUFLOVJPMFlHMDNWSjcmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)
Well-Architectedに沿った分かりやすい章構成で記憶に定着しやすい章末問題もついていますので効果ばつぐんです。
内容も約250ページと読みやすい量になっているので、読書が苦手な方にもおすすめです。
（ちなみに私も読書は苦手です…。）

## とにかく問題を解く
本を読み終わったらとにかく問題を解いていきましょう。

おすすめはUdemyの問題集です。かなり難易度が高く、これを解くことができるようになればほぼ間違いなく合格できます。
[【2022年版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
これも２週間もあれば全６回分を２周くらいできると思いますので、平均９０点以上になるまで頑張ってみてください。

## 最後に
この記事が資格合格への一助になれれば幸いです。
私事ですが近々SAPへ挑戦する予定ですので、またまとめていきたいと思います。
最後まで読んでいただきありがとうございました。

### 余談
アメリカのSAA認定資格保有者の年収は約1500万円らしいですよ…。
[「15 Top-Paying IT Certifications for 2021」, Global Knowledge Training](https://www.globalknowledge.com/us-en/resources/resource-library/articles/top-paying-certifications/)
オブジェクト権限の付与と表示（SQLServer）


業務でたまにしか使わず忘れがちなので、備忘としてメモさせて頂きます。
~~※保守では知らぬ間に権限が変更されていることが。。~~

##オブジェクトに読み取り権限を付与する
```sql:GRANT 
GRANT SELECT ON オブジェクト名TO ユーザー名またはロール名
```
 
##オブジェクトのインサート権限を剥奪する
```sql:REVOKE 
REVOKE INSERT ON オブジェクト名TO ユーザー名またはロール名
```
 
##指定したオブジェクトの権限一覧を表示する
```sql:OBJECT 
SELECT
OBJECT_NAME(major_id) AS オブジェクト
,USER_NAME(grantee_principal_id) AS ユーザー
,permission_name as 権限名
,state_desc as 権限の状態
FROM sys.database_permissions
WHERE major_id = OBJECT_ID('オブジェクト名')
```

##指定したユーザー（ロール）の権限一覧を表示する
```sql:USER
SELECT
USER_NAME(grantee_principal_id) AS ユーザー
,OBJECT_NAME(major_id) AS オブジェクト
,permission_name as 権限名
,state_desc as 権限の状態
,USER_NAME(grantor_principal_id) 
FROM sys.database_permissions
WHERE grantee_principal_id = USER_ID('ユーザー名またはロール名')
```

##オブジェクトの権限一覧を表示する
```sql:LIST
SELECT
OBJECT_NAME(major_id) AS オブジェクト
,USER_NAME(grantee_principal_id) AS ユーザー
,permission_name as 権限名
,state_desc as 権限の状態
FROM sys.database_permissions
where USER_NAME(grantee_principal_id)  <> 'public'
and OBJECT_NAME(major_id) is not null
```

最後のSQLをよく使います。
間違いがありましたらご指摘ください。。
shift(Ruby)は配列の最初の要素を取り除き、その値を返す

Ruby 3.1<a href= "https://docs.ruby-lang.org/ja/latest/method/Array/i/shift.html"> Arrayクラスshift </a>

- shiftは配列の最初の要素を取り除き、その値を返します

```ruby
a = [0,1,2,3,4]
print a.shift
#=> 0
print a
#=> [1,2,3,4]
```
fast-csvでjsonをcsvに変換する

# はじめに
表題のとおり。サーバーサイドでjsonをcsvに変換します。
クライアントサイドで同じことをするためには[別の方法](https://github.com/exceljs/exceljs)が必要です。

# 実装
```index.ts
import * as fs from 'fs';
import * as path from 'path';
import { format } from '@fast-csv/format';

const createCsv = async () => {
  const fileName = 'test.csv';
  const filePath = path.resolve(__dirname, 'csv');
  fs.access(filePath, (error) => {
    if (error) {
      fs.mkdirSync(filePath);
    }
  });

  const jsonData = [{id: 1, name: 'hoge'}, {id: 2, name: 'fuga'}];
  const ws = fs.createWriteStream(path.resolve(__dirname, 'temp', fileName));
  const stream = format({ headers: true});
  stream.pipe(ws).on('finish', () => {
    console.log(`#### ${fileName} has been successfully created! ####`);
  });
  await Promise.all(jsonData.map((row) => stream.write(row)));
};

createCsv().catch((e) => console.error(e));
```

```
$ ts-node index.ts
```

# 

# 参考
- https://www.bezkoder.com/node-js-export-mysql-csv-file/
- https://c2fo.github.io/fast-csv/docs/formatting/getting-started
- https://dev.classmethod.jp/articles/implement-data-export-in-excel-or-csv-format-in-react-app/
温湿度マップを作った

部屋の温度とか、湿度とかを直感的に把握できる、温湿度マップを作りました！
これ、なかなかいい表示方法だと思いませんか？

![温湿度マップ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/e86954ab-4fb0-8f66-107d-970bdb77cf0d.png)

* 室内7か所&屋外の温湿度の遷移を湿度(横軸) vs 温度(縦軸)で表示
    * 横軸が湿度(20%-100%)、縦軸が温度(-2~40℃)のグラフ
    * 室内7か所&屋外の温湿度を表示
    * 現在、10分前、20分前、30分前、40分前、50分前、60分前、90分前、120分前、150分前、180分前のデータをプロットし折れ線グラフを表示
    * ● は現在の湿度&温度の状態
* 背景は絶対湿度と熱中症指数の値により色分け
    * 絶対湿度: 7-11が緑、5-7が黄色、5以下が赤（黒字）
    * 熱中症指数: 25-28が緑、28-31が黄色、31以上が赤（ピンク字）

計測して見れるようにしていたんですが、どうしても数字が書いてあるだけでは直感的に理解できにくかったので、マップにしてみました。

これで見ると、どのくらいでよくない状態から抜け出せそうか(黄色や赤から緑の状態になるか、白に近づくか)一目瞭然にわかります。

#### 作り方

* google spreadsheetへswitchbot温湿度計データをraspberry pi経由で取得します（詳細は以下ページ）

https://qiita.com/tosshie/items/0b6a93a8e351cd801321

* openweathermapから屋外の温湿度データを取得してgoogle spreadsheetへ取得します(私はswitchbot温湿度計と同じシートに屋外データも書いています)

https://qiita.com/tosshie/items/08a2c740e19c4154daf7

* ↑の室内、屋外の温湿度データから"現在、10分前、20分前、30分前、40分前、50分前、60分前、90分前、120分前、150分前、180分前"のデータだけを自動でコピーするシートを作成
    * A列: 5分おきに↑のデータを取得しているので、以下のような関数で現在時刻や10分前の時刻をデータとして取り出す
        * 現在: `=indirect("test1!A"&counta(test1!$A:$A))`
            * もとのデータが入っているシートの名前を"test1"にしています
        * 10分前: `=indirect("test1!A"&counta(test1!$A:$A)-2)`
    * A列のデータをkeyにvlookupでそれぞれのデータを取得
        * B3: `=vlookup($A3,test1!$A:$Z,2)`
            * たまに取得できていないときは空白になります
            
![温湿度マップ用データ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/63eb4a81-0bd3-a4ec-cbd5-7c82fccb5cba.png)


* 背景となる湿度 vs 温度の画像をgoogle spreadsheetへimport
    * はっておきます
    
![温度湿度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/9f1785d4-47a4-e3ef-87cb-517ce5d649de.png)

* この画像のうえにグラフを背景を透明にしてひたすら乗せます
    * 1個目: 1か所目(1F_1)の温度 vs 湿度グラフ
    * 2個目: 2か所目(1F_2)の温度 vs 湿度グラフ
    * ....
    * 9個目: 1か所目(1F_1)の現在(1データ(2セル分のデータ))の温度 vs 湿度の散布図
    * 10個目: 2か所目(1F_2)の現在(1データ(2セル分のデータ))の温度 vs 湿度の散布図
    * ...
N予備プログラミング　〜冬コンテスト作品制作過程を晒してみる⑤〜

みなさんこんばんわ

やたらとかたいカビゴン、もとい”18.【サービス開発3】データモデルの実装とユーザーの保存”の手順をなんとか攻略したところで、残り納期日数の半分使っちゃった(泣)
DB設計と定義でかなり日数使うだろうなと予想はしてたけど、これほどとは。。
やっぱりDB作るところでビビっちまったなー（作業負荷というより精神的負荷に。）とほほ。

実際にコード書く作業して、冬アプリ制作のポイントだと実感した事を下記にメモ。
◎意外と大活躍！！つくって良かったアプリ設計書👍
　　⇒コードで迷うたびマジで何度も見直す。特に短時間で実装するには無いとムリかも。
◎よく使うリンク（自分のやつ）のブックマークボタンを作っておく！（これは。。マジ必須！！）
　　⇒調子に乗ってテキスト通り写経してると、テキスト通りリンク踏んじゃってあ"-ってなる
　　⇒『not found 404だって！うぎゃー。』とパニック気味にコード見直し。
　　　　⇒我に返って『違うリンク、踏んでんじゃん。。』とハッと気付く。何回もやった。。
　　⇒こりてブックマークバーの右側の２つを作ってからは超快適に。早く作れば良かった。。

![スクリーンショット 2022-01-30 0.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345137/a67e1b01-3c11-8c33-af4c-e1e0089742de.png)


最大の山場を抜けたからには、あとはコピペ＆写経で４−２４まで一気にいけるはず！（もう時間ないけど）
やると宣言した以上、いちおう最後までやってみる！
『引かぬ、、媚びぬ、省みぬ！！みず・かくとうポケモンに逃走はないのだ〜』（つづく）
【Unity】PlayerPrefs の使い方やメリット/デメリットなどをまとめてみた

# PlayerPrefs とは？

- UnityEngine が提供しているゲームデータのセーブ・ロードを行う機能
- ゲームが終了しても保持しておきたいデータを保存することができる
- - キー・バリュー形式で端末内に保存する
    - 個人設定（コンフィグの設定等）のような外部に保存する必要がないデータや通信できないときに一時保存するときに使える

# データをセーブする

- 対応している型は…
    - `float`
    - `int`
    - `string`
- 同じキー名でセーブしたら、値は上書きされる


```c#:使用例
// Health というキー名に float 型で 50.0f という値を保存
PlayerPrefs.SetFloat("Health", 50.0F);

// Score というキー名に int 型で 20 という値を保存
PlayerPrefs.SetInt("Score", 20);

// Player Name というキー名に string 型で Foobar という値を保存
PlayerPrefs.SetString("Player Name", "Foobar");
```

# データをロードする

- キー名を指定してデータをロードする
    - キー名に対応するデータがなかった場合は `defaultValue` の値を返す
        - `defaultValue` の指定がなかったら `GetFloat`, `GetInt` の場合は0, `GetString` の場合は空文字を返す

```c#
public static float GetFloat (string key);
public static float GetFloat (string key, float defaultValue);
public static int GetInt (string key);
public static int GetInt (string key, int defaultValue);
public static string GetString (string key);
public static string GetString (string key, string defaultValue);
```

```c#:使用例
// Health というキー名のデータをロード.キーが存在しなかったら 50.0f を返す.
var health = PlayerPrefs.GetFloat("Health", 50.0f);

// Score というキー名のデータをロード.キーが存在しなかったら 20 を返す.
var score = PlayerPrefs.GetInt("Score", 20);

// Player Name というキー名のデータをロード.キーが存在しなかったら Foobar を返す.
var playerName = PlayerPrefs.GetString("Player Name", "Foobar");
```

# データを削除する

- キー名を指定してキーとデータを削除
- 全てのキーとデータを削除

```c#:使用例
// 全てのキーとデータを削除
PlayerPrefs.DeleteAll();

// Health というキーとデータを削除
PlayerPrefs.DeleteKey("Health");
```

- PlayerPrefs で値を保存する実装ができる
- PlayerPrefs でどこに値が保存されてるか（どの程度セキュアか）理解している
- PlayerPrefs 以外で値を保存する手法について理解している


# データが保存される場所

| 端末 | 場所 |
| :-- | :-- |
| **macOS** | `~/Library/Preferences` フォルダー内の `unity.[会社名].[製品名].plist` というファイル |
| **Windows** | レジストリの `HKCU\Software\[company name]\[product name]` に保存される| 
| **Linux** | `~/.config unity3d[CompanyName]/[ProductName]` に保存される |
| **Windows Store Apps** | `%userprofile%\AppData\Local\Packages\[ProductPackageId]>\LocalState\playerprefs.dat` に保存される |
| **Android** | SharedPreferencesに保存<br>`/data/data/pkg-name/shared_prefs/pkg-name.xml`に保存<br>C#/JavaScript, Android Java, ネイティブコードは全てアクセス可能 |
| **iOS** |  UserDefaults に保存<br>`/Library/Preferences/[bundle identifier].plist` に格納される |

# メリット/デメリット

#### メリット
- 端末がオフライン状態でも使用できる
- 端末内に保存するのでサーバやDBが不要
 
#### デメリット
- 保存できるデータ型が限られている
    - 大容量のデータ保存に向かない
- 端末内に保存されるのでユーザーもアクセスが容易
- 複数のデータを一括で保存できない

# 代替案

- 外部アセットを使用（EasySaveなど）
    - 簡単にセーブ＆ロード&暗号化が実装できる
    - int や string だけでなく、List や Vector3 などの型も保存可能
        - PlayerPrefs より多機能
- 外部ファイルとして保存（CSV, JSON, XML）
    - 大量のデータを保存するときに PlayerPrefs よりおすすめ
- サーバに保存
    - ユーザーが変更できないようにサーバ上にデータを保管する = セキュリティ対策


# 参考文献

https://docs.unity3d.com/ja/current/ScriptReference/PlayerPrefs.html

https://blog.unity.com/ja/technology/persistent-data-how-to-save-your-game-states-and-settings

https://kan-kikuchi.hatenablog.com/entry/EasySave
shell script　課題復習

### 背景
異業種からIT業界へ転職して１ヶ月。初歩技術研修の１０日間が終了。
ハードウェアやネットワーク、OSとは、と言ったところから
実際にLinuxをインストールし、ファイルシステムの作成やサーバ構築を行った。

先日shell scriptの練習問題を実施したが、時間が掛かってしまったため、
自分用として残しておくために記事を書いた。

###shell script課題
ママからお使いを頼まれたため、スーパーへ買い物に出掛けた。
ママからは以下ミッションを頼まれた。
1.　しらたきを買ってきてね
2.　もし、しらたきが無かったら糸こんにゃくを買ってね
3.　余ったお金でどら焼き(120円)を買えるだけ買ってね

###プログラムの条件
+ 糸こんにゃくはかならず在庫がある
+ しらたきと糸こんにゃくの価格は変動するが、５００円を超えることはない
+ 引数で条件を与えてもOK
+ ユーザに条件入力を促してもOK
+ 最後に買い物結果（それぞれの買った個数と残金）を表示する必要あり

```
#/bin/bash

money=500
#個数
shirataki=0
itokon=0
dorayaki=0
shirataki_quantity=$1
#値段
shira_price=$2
itokon_price=$3
dorayaki_price=120

if [ $shirataki_quantity -eq 1 ]; then
        shirataki=1
        balance=`expr $money - $shira_price`
else
        itokon=1
        balance=`expr $money - $itokon_price`
fi

while [ $balance -ge $dorayaki_price ]
do
        dorayaki=`expr $dorayaki + 1`
        balance=`expr $balance - $dorayaki_price`
done

echo "しらたき購入数:$shirataki個"
echo "糸こんにゃく購入数:$itokon個"
echo "どら焼き購入数：$dorayaki個"
echo "残金：$balance円"
```

###躓いた原因

+ そもそも引用符の使い方がよく分かっていなかった
+ 変数での計算方法が曖昧だった

###引用符について簡単に復習
使用できる引用符は以下３種類あり、使用される引用符によって処理が異なる。

① ’’（シングルクォート）
＄も文字列として認識されるため、変数は展開されない

```
XX:~ $ ABC=hello
XX:~ $ echo '$ABC'
$ABC
```

② ””（ダブルクォート）
＄付きの変数は展開された文字列になる

```
XX:~ $ echo "$ABC"
hello
```

③　``(バッククォート)
バッククォートで囲まれた文字列はコマンドとして認識され、$付きの変数があれば、展開した上でコマンドが実行される

```
XX:~ $ ABC=`date`
XX:~ $ echo "$ABC"
Sun Jan 30 11:07:23 UTC 2022
```



###変数の計算方法

#####exprコマンドについて
整数の四則演算が可能とあるが、どういう意味のコマンドなのか？
manコマンドで確認してみたところ、NAME: evaluate expressionsとある。
「式を評価する」というコマンドのようだ。書式は、「expr 式」となる。

```
man expr

NAME
       expr - evaluate expressions

SYNOPSIS
       expr EXPRESSION
       expr OPTION
```
whichコマンドを実行したところ、/var/bin/exprと表示されたことから
bash内部のコマンドではなく、外部コマンドらしい。

```
XX:~ $ which expr
/usr/bin/expr
```

###参考サイト
https://atmarkit.itmedia.co.jp/ait/articles/1810/03/news001_2.html
EC2起動時に、自身を監視するCW Alarmを、EC2がTerminateされる際に一緒に削除する

## 始めに

以前、以下の記事で書いたように、EC2起動時に自信を監視するCW AlarmをUserdata使用で作成しました。
https://qiita.com/namely_/items/bbe02769c4fbe6114655

今回は、それの延長で、EC2が終了される前にCW Alarmも一緒に削除する仕組みを作りました。
起動時にはUserdataで仕込むことができますが、終了時にはそういったオプションはないと思うので、Systemdを活用しました。

## Shell

```sh
# Service 作成
sudo vi dele.service

-------
[Unit]
## 説明
Description=delete
## shutdownされる前に実行
Before=shutdown.target

[Service]
## シングルジョブを行い終了する
Type=oneshot
## systemd はプロセスが終了した後もサービスがアクティブだとみなす。 
## この設定が今回必要だったかは不明
RemainAfterExit=true
## 終了時のシェル
ExecStop=/home/xx/shutdownScript.sh

[Install]
## shutdown時に動かすサービスなのだから、shutdown.targetでは？
## と思ったが、なぜか通らなかったので、multi-user.targetに。
WantedBy=multi-user.target
-------

sudo mv dele.service /etc/systemd/system/dele.service
sudo mkdir /home/xx/

# スクリプト作成
sudo vi shutdownScript.sh

-----------
#!/bin/bash
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_DEFAULT_REGION=
aws cloudwatch delete-alarms --alarm-names ec2-$InstanceId-cpu-alarm
-----------

sudo mv shutdownScript.sh /home/xx/
sudo chmod u+x /home/xx/shutdownScript.sh

sudo systemctl daemon-reload
sudo systemctl start dele --now
sudo systemctl enable dele
Created symlink /etc/systemd/system/multi-user.target.wants/dele.service → /etc/systemd/system/dele.service.
```

テストとして、EC2をterminateさせると、作成したAlarmが消えていると思います。

## 参考

```
https://qiita.com/comwing65/items/3386a061aeb3d2f81b81
https://kernhack.hatenablog.com/entry/2014/12/08/000708
```

参考にさせていただきました。ありがとうございます。

## 備考
Linux、本当に難しいのと、かなり奥が深いことを実感しました。
何か間違っている記載ありましたら教えていただけると嬉しいです。
(備忘録) flutter_gen が検知されない時の解決方法

flutter で他言語に対応するために flutter_localizations の設定をしてたら下記のようなエラーが出た。
[リファレンス](https://docs.flutter.dev/development/accessibility-and-localization/internationalization) にある手順を踏んでいて発生するエラーだった。

## 発生したエラー

```

Target of URI doesn't exist: 'package:flutter_gen/gen_l10n/app_localizations.dart'.
Try creating the file referenced by the URI, or Try using a URI for a file that does exist.

```

## 解決策

[こちらの記事](https://stackoverflow.com/questions/67789828/error-setting-up-flutter-localizations-package-target-of-uri-doesnt-exist-pa?noredirect=1&lq=1)を参考に一度VSCodeを終了して再度プロジェクトを開いたら解消した。
どうやらVSCodeのバグやキャッシュなど影響している模様。
コマンドラインからpytorchでgpuが使えるかどうか確認する

コマンドラインからpytorchでgpuが使えるかどうか確認するには以下を実行すればOK

> https://note.nkmk.me/python-pytorch-cuda-is-available-device-count

```
$ python -c "import torch; print(torch.cuda.is_available())"
False
```

deviceの数を数えるには以下を実行すればOK

```
$ python -c "import torch; print(torch.cuda.device_count())"
```

# 参考

https://note.nkmk.me/python-pytorch-cuda-is-available-device-count
【Coursera】AI for Medical Diagnosis -Week2 Evaluation of Diagnostic Models

全体の俯瞰記事は以下の記事をご覧ください
[【Coursera】AI for Medical Diagnosisレビュー](https://qiita.com/makki_maki04/items/876b31c62cca2a07313d)

# Week2: Evaluation of Diagnostic Models
全体の印象として、評価メトリックの座学がメインで簡単な病理学的ケースを通して考え方を学びました。Week1と違ってコードベースのチュートリアルはありません。課題の時のみ、コードベースの解答を行います。二値分類の慣れが少ない人にとってはとても有益なトレーニングになると感じます。
以下、小セクションごとにまとめていきます。
## Key evaluation metrics
診断結果データを扱いますから、2値分類問題のようになることは容易に想像できます。ここでは`Sensitivty`, `Specificity`, `Prevalence`を用いて`Accuracy`を表すことが出来ることを導出し、これが実はWeek1で学んだような重み付き平均と解釈されることへ話が進みます。

（※正確に言うと、Week1で扱っていた話題はweighted lossであり平均値ともまた違うものですがそういう文脈です）

## How does varying the threshold affect evaluation metrics?
ROC curveを交えた疾病診断メトリックの話です。非常に一般的な話で、閾値の選び方を扱うにとどまります。`Sensitivity`, `Specificity`の両者をバランスよく保つための閾値選択方法でした。

## Interpreting conficence intervals correctly
大規模な患者数に対して、診断のaccuracy(population accuracyと呼ぶ)を知りたい要望があっても実際には規模が大きすぎることによってその値が得られないのが現実です。
よって、小規模データで作成したモデルを大規模患者数に適用したときにどれくらいのパフォーマンスが得られそうかを感覚で知りたい要望が生まれます。この際にあ、信頼区間(`confidence interval`)による評価が必要になるという文脈です。

- 信頼区間の具体的な計算方法は”範囲外”ということでコース中では取り扱われません
- 信頼区間の解釈については詳しく解説あり
    * 「95％の信頼区間」とよく聞く言い回しが、母集団とサンプル集団とどう紐づいているのかがわかる
    * 真の値は分からずとも信頼区間を使う事の意義について理解する

## 課題
### クイズ
評価メトリックの具体的計算問題、ROC曲線のケースごとの定性的出題などがありました。

### コーディング課題
Week2全体で学んできた評価メトリックについて、実装しながらテーブルデータを埋めていく課題でした。

### 感想
混同行列に基づいた実践的な計算と、その定性的考察のトレーニングにはさいてきでした。また、コーディング課題ではsklearnの`calibration_curve`も用いてモデルの妥当性についてより深く考察していました。二値分類問題を俯瞰する目的にはとてもお勧めできる内容です。自分もとても勉強になりました。

以上
Power Virtual Agentsにsharepointリストで検索した結果を返す

# はじめに
Power Virtual Agentsのために作成するフロー(power automate)の最後のアクション(Return value(s) to Power Virtual Agents)は、ループ処理する(apply to eachの中に入れる)ことができない。
入れようとすると、以下のようなエラーが出る。
> 選択した出力はコレクション内にあるため、アクセスするにはループする必要があります。このアクションは、foreach内には指定できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/4885c294-0136-cc3d-b909-a4d6615aaf04.png)

したがって、以下のような機能を実装したい場合に、以下に記載する対処法が必要である。
> チャットボットで入力したキーワードで、sharepointリストを検索し、一致した行のデータをチャットボットに返す

# 対処法
チャットボットに返したいデータを文字列変数に格納し、文字列変数をチャットボットに返す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/ef9171b8-218a-8ffb-b219-f26b1c535b35.png)


# 参考にしたページ
https://powerusers.microsoft.com/t5/Calling-Actions-from-PVA/How-to-return-a-list-value-to-PVA/td-p/889809