OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeにSpringBootの環境を構築しよう！！

#環境
* windows
* JDK11
* Maven3.8

# step1:必要な拡張機能のインストールをしよう
下記をインストールしよう！
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/9c7a64d6-49a5-0934-5e21-67167a778ca8.png)
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/0b575c69-183f-1546-7c8a-fc8d795dbbbb.png)
![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/96f79f8d-88fa-46e5-9b57-357a24dd7851.png)

# step2:VSCodeにJavaとMavenの設定をしよう
1. vscodeの設定を開き、Java.homeとJava.configuration.runtimesとmaven.terminal.favoritesを設定しよう。<br/>
下記のサイトが詳しくJava環境を構築するため、詳しく乗っています。

>(vscode公式Java-tutorial)
>https://code.visualstudio.com/docs/java/java-tutorial

# step3:Spring Bootのプロジェクトを作成しよう
1.ctl + shift + pを押して、**Spring Initializr: Create a Maven Project**を選択しよう。
![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/f8dc76a1-75f0-b4ef-21dd-d82c368aa427.png)
2. spring bootのversionを選択しよう。
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/e3e2fb76-4e0d-a288-a3f6-1dc181d87a2f.png)
3. Javaを選択しよう。
![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/65030aa5-90e2-e10e-1648-cc33d73df49f.png)
4. MavenのGroupIdを設定しよう。(そのままで大丈夫です。)
![スクリーンショット (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/922f7d6a-eb4e-6e42-c88f-63c202ff4093.png)
5. MavenのArtifactIdの設定をしよう。(そのままで大丈夫です。)
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/ca33a9ac-6607-90ab-e8a5-b03e1b7f4128.png)
6. MavenのPackageコマンドの際にまとめる拡張子を決めよう。(jarで大丈夫です。)
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/31d4af0b-79a1-be8d-3a3e-ccf2963e69c9.png)
7. Javaのversionを設定しよう(自分は、11でやりました。)
![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/d6ff06b5-083c-1657-3783-0bca147aab0c.png)
8. 赤枠の依存関係をMavenに登録しよう。(選択すれば、自動的に登録をしてくれます。)
![スクリーンショット (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/344b8630-bae4-40e2-d1c3-122233f9b346.png)
9. この画面になっていたら大丈夫です。(SPRING BOOT DASHBOARDの表示には時間がかかることもあります。)
![スクリーンショット (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/95c065c1-b03e-77a1-0411-6b35889f7665.png)
10. Spring BOOT DASHBOARDの**右矢印**を押したら、実行及びデバックができます。

#簡単なSampleを実行してみよう
1. src/main/java/example/demoの下に、controllerフォルダーを作成してみましょう。
2. その下に、HelloController.javaを作成しよう。
2. 下記のようにコードを書きましょう。
![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893794/a9cb1e6f-450a-83a7-dc1d-aa1722072280.png)
3. 下記をクリックしよう。<br/>
http://localhost:8080/hello<br/>

**Hello Spring Boot**と表示されていればOKです。


#参考書
> * Javaビルドツール入門 Maven/Gradle/SBT/Bazel対応 (掌田津耶乃)
> * https://wings.msn.to/index.php/-/A-03/WGS-JVF-001/
>(速習Spring Boot 山田祥寛)
SQL を使って新型コロナのオープンデータを処理 その2

(夏休み企画 9/20)

先に

「SQL を使って新型コロナのオープンデータを処理」
https://qiita.com/nanbuwks/items/3f7a9ab616803c8211e1
において、足立区のオープンデータを使った10歳未満の感染状況の集計をした記事を書きました。

更に発展させて、こういうの作ってみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fe0800cc-1df1-f60d-066d-40bc05408829.png)

(「新型コロナウイルス感染症の国内発生動向（速報値）（令和３年８月11日18時時点）」
https://www.mhlw.go.jp/content/10906000/000818427.pdf
4ページより抜粋)


このためには、以下のようなデータを作ることが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6c50872b-5d6f-501f-8430-608333a69748.png)

こういったものを SQL で作るにはどうしたらいいでしょうか？

# 環境

- Ubuntu 20.04 LTS Desktop
- MariaDB 10.3.31-MariaDB-0ubuntu0.20.04.1
- phpMyAdmin 4.9.5deb2
- 足立区感染状況のオープンデータ (2021/8/14朝取得)
- LibreOffice 6.4.7.2 Calc


# SUM 構文を使って集計する


先の記事中で、簡単な集計として全体から10歳未満を数えるSQLが以下のようにありました

```

SELECT COUNT("") from コロナ WHERE 年代="10歳未満"
```


これはSUM構文を使って以下のように書くことができます。


```

SELECT SUM(年代="10歳未満") from コロナ
```

とすると、440が出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2f05d34a-e5bb-e569-7d98-452cf8ad4ee0.png)

ちょっと見栄えを良くしましょう。
```

SELECT SUM(年代="10歳未満") AS 10歳未満 from コロナ
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/541872a9-3974-fbba-bb56-504a0991978e.png)

見出しが見やすくなりました。


また、先に

```

SELECT DATE_FORMAT(診断日, "%Y年%m月") as 診断月,COUNT("") AS 人数 FROM `コロナ` WHERE 年代="10歳未満" GROUP BY 診断月 ORDER BY 診断月
```

として月ごとの集計を出しました。これを書き直して

```

SELECT DATE_FORMAT(診断日, "%Y年%m月") as 診断月,SUM(年代="10歳未満") as 10歳未満 from コロナ GROUP BY 診断月 ORDER BY 診断月
```

とすることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d1733740-e01b-874b-ba86-0a6038c4ac3c.png)

# SQL を見やすく書こう

さて、SQLは見やすく以下のようにもできます。

```

SELECT 
  DATE_FORMAT(診断日, "%Y年%m月") as 診断月,
  SUM(年代="10歳未満") as 10歳未満
from コロナ
GROUP BY 診断月
ORDER BY 診断月
```
# 年齢別に横にデータを並べてクロス集計

更に、以下のようにしてみましょう。

```

SELECT 
  DATE_FORMAT(診断日, "%Y年%m月") as 診断月,
  SUM(年代="0歳") as 0歳,
  SUM(年代="10歳未満") as 10歳未満,
  SUM(年代="10代") as 10代,
  SUM(年代="20代") as 20代,
  SUM(年代="30代") as 30代,
  SUM(年代="40代") as 40代,
  SUM(年代="50代") as 50代,
  SUM(年代="60代") as 60代,
  SUM(年代="70代") as 70代,
  SUM(年代="80代") as 80代,
  SUM(年代="90代") as 90代,
  SUM(年代="100代") as 100代
from コロナ
GROUP BY 診断月
ORDER BY 診断月
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f5042900-6ad7-46c6-f199-08bee6938021.png)


# 積み上げグラフの作成

先のデータを、「クリップボードにコピー」してLibreOffice Calcに持っていきます。


LibreOffice Calc上で積み上げバーグラフを作ると、以下ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/73242ca4-7888-1b95-a0e7-16c12d0fbf0e.png)

これを見ると、足立区でも10歳未満が増えてきています。
また、20代以下を合計するとほぼ50%ぐらい。感染のリスクは若年層が大きいことがわかります。

# やってみよう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/740db5de-626f-b7b2-fd1a-3b70688086d7.png)

- こっちのグラフを作るにはどうしたらいいかな？
- 無症状の人はどれだけいるか集計できるかな？
- 年齢別の死亡率を出すにはどうしたらいいかな？
Stringが使えるメソッド(今日使用した４つ)

#今回の内容
* 今日、使用したStringが使用できるメソッドについて

# コードと簡単解説

* まずは、メソッドを使うために変数(String型)を宣言しておきます。

```Swift:
    var uppercasedString = "abcdefg"
    var lowercasedString = "ABCDEFG"
    var containString = "0123456789"
    var replacingOccurrencesString = "1111111"
```

## 小文字の値を大文字に変換

```Swift:
    print(uppercasedString.uppercased())
```
```Swift:Print結果
    ABCDEFG
```

##大文字の値を小文字に変換

```Swift:
    print(lowercasedString.lowercased())
```
```Swift:Print結果
    abcdefg
```

##特定の値が含まれてるかを判定する

* Bool値で結果を判定します

```Swift:
    print(containString.contains("0"))
```
```Swift:Print結果
    true
```

##特定の値を希望の値に変更

* `.replacingOccurrences(of: "1", with: "2")`は、1の値を全て2に変更しています。

```Swift:
    print(replacingOccurrencesString.replacingOccurrences(of: "1", with: "2"))
```

```Swift:Print結果
    2222222
```

#終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
RDS環境において RD ライセンス サーバーを構築しないとどうなる？

今回はRDS環境において RD ライセンス サーバーを構築しないとどうなるかについて記事にまとめます。

なおライセンスが絡む話なので正確なとろころは Microsoft にご確認いただくのがよいと思いますが
今回は検証ベースではなく公開されてている情報をもとに、過去に経験をしたものを補足としてまとめているので大きく読み違えていることはないと思います。

# 結論
身も蓋もないですが下記のMicrosoftの社員の方が書かれているblogのフローチャートがすべてといえます。

[RD セッション ホスト サーバー とRD ライセンス サーバーの内部動作を知る](https://social.technet.microsoft.com/Forums/office/ja-JP/c9ff23cb-ab5b-4674-992b-968017c337be/rd-1247512483124711251912531-125071247312488?forum=Wcsupportja)

ちょっと画像のリンクが不親切なので画像への[直リン](https://social.technet.microsoft.com/Forums/getfile/1410110)も貼っときます。

で大きく分けて

* ライセンス サーバーの指定をしているか
* ライセンス サーバーのモードでなにが指定されているのか（どの種類の CAL を利用する設定になっているか）

の2点がポイントとなります。

##  RD ライセンス サーバーが指定されてない場合

上述のフローチャートの最初の分岐で [NO] となりますので猶予期間が切れるまでに指定をしないと接続ができなくなります。
猶予期間に関しては[Windows server のリモート デスクトップ環境の猶予期間について](https://qiita.com/valpasucucci43/items/35647d4be6eff6fb8029)にて記事にしてますので参考にしていただければと。

なのでちゃんと RD ライセンス サーバーは指定しましょう。
指定の仕方は
[RD ライセンス サーバーを追加しCALをインストールする方法](https://qiita.com/valpasucucci43/items/735f23a7e24d2440fba1)
[オフライン環境のRD ライセンス サーバーのアクティベーション並びに CAL のインストールを行う方法 （別端末のWebブラウザを利用）](https://qiita.com/valpasucucci43/items/b010e7cc64e4e526ff29)
を参照してください。

後述するモードの違いが発生するのもRD ライセンス サーバーの指定がされていることが前提となります。
もしライセンスがらみの問題が発生している場合にはまず RD ライセンス サーバーの指定がされていることを確認するようにしましょう。


## ライセンス モードの指定による違い

ライセンス モード によって変わってきます。

### 接続ユーザー数 モードを指定している場合

接続モードの分岐で接続ユーザー数モードに進みます。
以降は見ていただければわかる通りいずれの分岐をたどっても[接続を許可]にたどり着きます。

その為ライセンス モードが [接続ユーザー数] モードで指定されている場合においては接続ができない状態にはなりません。

### 接続デバイス数 モードを指定している場合

接続デバイスモードの場合下記のいずれかの場合接続ができなくなります。

* 恒久 CAL の有効期限ぎれの場合
* 一時 CAL の有効期限ぎれの場合
* RD ライセンス サーバーに接続ができない場合
* ユーザー認証ができない場合

なお[一時 CAL の有効期限ぎれの場合]というのはライセンス数に余力がなく、恒久 CAL が発行できない場合とおもっていただけるとよいかと思います。

その為 [接続デバイス数] モードで利用している場合はきっちり RD ライセンスサーバーを構築されてないとある日突然リモート デスクトップ接続ができなくなるということが発生しえます。

ということで接続できない障害の発生確率を少しでも下げるという観点だと[接続ユーザー数]モードを選択しておいたほうがいいですね。
とはいえこの点はどういう環境で利用するかによって選択するというか、購入する CAL が決まってきますので自由に選べるってことにはならないですが・・・
# 補足
フローチャートではあくまでモードが [接続ユーザ数] なのか [接続デバイス] なのかで分岐しておりインストールされている CAL の種類については言及されていない点に注意をしてください。
SourcetreeのGitHub パスワードをパーソナルアクセストークンに変更する方法

# 現象
Githubにpushできない

以下、エラー内容

```
Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: unable to access 'https://github.com/<ユーザ名>/<リポジトリ名>.git/': The requested URL returned error: 403
```

エラー原因については以下の記事を参照

https://github.blog/changelog/2021-08-12-git-password-authentication-is-shutting-down/


# 解決策

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/4f5bfa2e-dca3-70ec-0ff1-3eb5b33294ad.png)
1.GitHub で `Settings` → `Developer settings` → `Personal access tokens` → `Generate new token` を開く

https://github.com/settings/tokens

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/61a29054-e1e6-7555-7e3b-b12d760c0fe1.png)
2.必要な権限にチェックを入れ、 `Generate token` をクリック（迷ったらすべてチェックしてOK）
<font color="red">※ 再確認できないためtokenはメモ必須</font>
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/5efd8b6f-788c-e866-7334-663549bde908.png)
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/b6703a5f-0906-4cb9-8c80-cd2f00e096da.png)
3.`コントロール パネル` → `ユーザー アカウント` → `資格情報マネージャー` → `Windows資格情報` を開く
4.汎用資格情報の `github.com` または `Sourcetree` が付いてるものを削除
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/51c471fa-0f45-cef6-c266-ea68612943cb.png)
5.`C:\Users\ユーザ名\AppData\Local\Atlassian\SourceTree` 内の下記ファイルを削除

- bookmarks.xml
- opentabs.xml
- passwd
- userhosts

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/2dedfc2e-4d09-91c6-b006-f017dcc662df.png)
6.`C:\Users\ryome\AppData\Local\Atlassian\SourceTree.exe<ランダム文字列>/<version>/` 内の下記ファイルを削除

- user.config

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/3a9a5fb5-932d-03eb-e300-458681a91b59.png)
7.`Sourcetree` を起動し、 `Add` からローカルリポジトリを選択する
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/c6e49c3f-1d97-3074-2c94-966499d4f08d.png)
8.プッシュ時に `ユーザー名` と `2で取得したtoken` を入力する
9.プッシュが成功すれば解決
Oculus Quest2で実機テスト

## 背景
- 開発していて実機テストするとき、毎回ビルドしていては時間がかかる。
- UnityのPlaymodeで即時実機テストしたい。

## 解決法
1. Build SettingsのPlatformを選択し、Target PlatformをWindowsにする。
2. Project Settingsを開き、XR Plug-in ManagementでWindowsタブのOculusにチェックを入れる。
3. XR Plug-in Managementの下のOculusを選び、Stereo Rendering ModeをMulti Passにする。
顧客企業のニュースリリースが更新されたらTeamsに通知がくるようにした

顧客企業のニュースリリースは営業のために必ずチェックするようにしています。
頻繫に更新される企業であれば毎日HPを見に行けばいいのですが、
あまり更新されない企業だとついついチェックするのが遅れてしまいます。

PowerAutomateDesktopを使って、HPのニュースリリースが更新されたら
Teamsに通知が来るようにフローを作ってみました。

#PowerAutomateDesktop全体像
![Teamsへメッセージ配信 _ Power Automate Desktop 2021_08_15 1_38_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/f4c1c43c-b74c-84c8-e566-74b992ccd27f.png)

一日一回実行されるようなフローになっていて、
ニュースリリースが更新されている時のみTeamsの指定のチャネルに通知が飛びます。

Teamsへのメッセージの飛ばし方はこの記事を参考にしました。

https://qiita.com/maekawawawa/items/76cc0e7754fdcdf8bd7c

本当はWebhookで繋げられるほうがよかったのですが、
TeamsのチャネルのURL取得がうまくいがず、Outlookのメールで送信する方法で繋げました。

Teamsに送られたメッセージがこちら。
<img width="700" alt="一般 (プロトアウト) _ Microsoft Teams 2021_08_15 2_56_07 (2)_LI" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/9a705093-a2db-7f3d-0f63-da8bd26dd527.jpeg">
ニュースの中身やHPへのURLも付けれるようにしたかったです。

#色々試してみたい
普段の業務ではOffice365を使っているので
PowerAutomateDesktopで単純なPC作業やちょっとしためんどくさい作業を自動化できそうです。
PowerAutomateのほうがもっと色々できそうなので、ぜひ使ってみたいです。
[SQL] INSERT文の基本構文

##はじめに
前回に引き続き今回は四大命令のINSERT文を記事にしたいと思います。
よろしくお願いします。

##INSERT文
INSERT文はテーブルに新しいデータを追加したいときに使います。

基本構文は下記のとおりです。

```sql
INSERT INTO テーブル名
            (列名1, 列名2, 列名3)
     VALUES (値1, 値2, 値3)
```

他の四大命令とは違い、INSERTに続いてINTOを記述し、テーブル名を指定します。
そのつぎに新しく作りたいデータの列名を指定し、VALUEでその中身を記述します。
2行目の列名の指定は省略できます。省略した場合列名を全選択したことと同義になります。

そしてVALUEはテーブルの列名の順番通りに、並べます。
例えば下記のような家計簿テーブルがあったとして2行目の列名指定をしなかった場合

| 日付 | 費目 | メモ | 入金額 | 出金額 |
| --- | --- | ---- | ----- | ---- |
| 2021-08-02 | 食費 | パンを購入 | 0 | 300 | 
| 2021-08-03 | 食費 | 晩ご飯材料 | 0 | 1000 |
| 2021-08-08 | 交通費 | 電車代 | 0 | 520 |
| 2021-08-13 | 給料 | 7月分給料 | 250,000 | 0 |
| 2021-08-13 | 食費 | 外食 | 0 | 7000 |


下記のように日付、費目、メモ、入金額、出金額の順にVALUEの中身を記述します。

```sql
INSERT INTO 家計簿
     VALUES ('2021-08-14', '交通費', 'バス代', 0, 280)
```

| 日付 | 費目 | メモ | 入金額 | 出金額 |
| --- | --- | ---- | ----- | ---- |
| 2021-08-02 | 食費 | パンを購入 | 0 | 300 | 
| 2021-08-03 | 食費 | 晩ご飯材料 | 0 | 1000 |
| 2021-08-08 | 交通費 | 電車代 | 0 | 520 |
| 2021-08-13 | 給料 | 7月分給料 | 250,000 | 0 |
| 2021-08-13 | 食費 | 外食 | 0 | 7000 |
| 2021-08-14 | 交通費 | バス代 | 0| 280|

2行目で列名(カラム名)を指定したら、VALUEはその順番通りに書きます。
例えば、上記のテーブルに、列名を指定して、さらにデータを追加します。



```sql
INSERT INTO 家計簿
            (日付, 費目, 出金額)
     VALUES ('2021-08-15', '携帯代', 5800)
```


| 日付 | 費目 | メモ | 入金額 | 出金額 |
| --- | --- | ---- | ----- | ---- |
| 2021-08-02 | 食費 | パンを購入 | 0 | 300 | 
| 2021-08-03 | 食費 | 晩ご飯材料 | 0 | 1000 |
| 2021-08-08 | 交通費 | 電車代 | 0 | 520 |
| 2021-08-13 | 給料 | 7月分給料 | 250,000 | 0 |
| 2021-08-13 | 食費 | 外食 | 0 | 7000 |
| 2021-08-14 | 交通費 | バス代 | 0| 280|
| 2021-08-15 | 携帯代|   |  |  5800 |

となります。

もし列名を下記のような順番で書くと、VALUEの中身もそれに対応させて、同じ順番にします。

```sql
INSERT INTO 家計簿
            (費目, 出金額, 日付)
      VALUE ('携帯代', 5800, '2021-08-15')
```


参考: スッキリわかるSQL入門
LambdaのProvisioned Concurrency とは

## 勉強前イメージ

並列数を上げる？

## 調査

### Provisioned Concurrency とは

2019年に発表された機能で、
初期化処理が完了したlambdaの環境をプロビジョニングしておくことが出来ます。
要するにすぐに使えるようなlambdaの環境を用意しておくことができる、ということです。
lambdaのコールドスタート(HWが初期化された状態の再起動)対策として他にも方法が取られていましたが、
この機能で簡単に対策を行うことが出来ます。

lambdaでリクエストが大量に来たとき、
同時実行数に関わらず、バースト制限までしか最初の段階は増えないのです。
例えば同時実行数が3000で、バースト制限が1000だとしたら
一気にアクセス来た際は1000までしか最初は増えないということです。
その後の同時実行数はすぐには増えず1分間に500ずつ増えていきます。
その際の一定量環境を用意しておくという対策が、Provisioned Concurrencyになります。

### 費用

Provisioned Concurrency には費用がかかり、
東京リージョンの場合には以下になります。

- Provisioned Concurrencyの有効時間
	- 1GBの環境で、1秒あたり 0.0000053835USD
- リクエスト
	- 100万件あたり 0.20USD
- 実行時間
	- 1GBの環境で、1秒あたり 0.0000125615USD


例で計算してみると
1GBの環境でProvisioned Concurrencyを2時間有効にし、
用意した同時実行数は1000とする。
リクエストを100万回実行し、1リクエスト1秒間の稼働するとする。

- Provisioned Concurrencyの有効時間
	- 1GBの環境で、1秒あたり 0.0000053835USD
	- 2時間→7200秒
	- 同時実行の合計容量(GB/s) : 1000(同時実行数)*7200(秒) = 7200000GB/s
	- 7200000(GB/s) * 0.0000053835(USD) = 38.7612(USD)
- リクエスト
	- リクエスト量 : 100万回
	- 100万件あたり 0.20USD
	- 0.20(USD)
- 実行時間
	- 1GBの環境で、1秒あたり 0.0000125615USD
	- 実行時間の合計 1000000(リクエスト) * 1(1リクエストの稼働時間) = 1000000秒
	- 1000000(秒) * 0.0000125615(USD) = 12.5615(USD)
- 合計
	- 38.7612(USD) + 0.20(USD) + 12.5615(USD) = 51.5227(USD)
	- 1ドル110円だとすると、 51.5227(USD) * 110 = 5,667.497(円)
	- 約5670円ほどになる

## 勉強後イメージ

バーストのリクエストの際は、それに応じるのが時間かかるから
ある程度環境を準備しておくってことか・・・

## 参考

- [AWS Lambda の Provisioned Concurrency について調べてみた](https://blog.serverworks.co.jp/tech/2020/03/03/provisioned-concurrency/)
- [AWS Lambdaが提供するProvisioned Concurrencyという機能を簡単に説明してみる](https://www.keisuke69.net/entry/2020/07/21/193701)
Vue.jsでchart.jsが入らない


##内容

chart.jsが入らない。なぜ？


```
WARNING in ./node_modules/vue-chartjs/es/BaseCharts.js 62:32-37
"export 'default' (imported as 'Chart') was not found in 'chart.js'
 @ ./node_modules/vue-chartjs/es/index.js
 @ ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Chart.vue?vue&type=script&lang=js&
 @ ./resources/js/components/Chart.vue?vue&type=script&lang=js&
 @ ./resources/js/components/Chart.vue
 @ ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/pages/Dashboard.vue?vue&type=script&lang=js&
 @ ./resources/js/pages/Dashboard.vue?vue&type=script&lang=js&
 @ ./resources/js/pages/Dashboard.vue
 @ ./resources/js/router.js
 @ ./resources/js/app.js
 @ multi ./resources/js/app.js ./resources/sass/app.scss
```


実行コマンドはこちら

```
npm install vue-chartjs chart.js
```

ちゃんとchartはimportしてる。
![スクリーンショット 2021-08-15 23.20.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244070/eacb2b54-19a5-80e0-7479-dd8e09a977a4.png)




バージョンが違うらしいので入れ直してみる

```
$ npm uninstall vue-chartjs
$ npm uninstall chart.js
$ npm install chart.js@2.8
$ npm install vue-chartjs@3.4.2
```

今度はコンパイル成功した！

![スクリーンショット 2021-08-15 23.19.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244070/aee56746-1b88-a149-795c-53ce17506630.png)


##参考
https://www.sky-limit-future.com/entry/error_vue_chartjs_version_1
dockerでローカルの環境設定

##はじめに
docker-composeでPHP7.2 + Apache + MySQL + phpMyAdmin環境を
Dockerに構築したので、自分が詰まった点などを含めて備忘録として書いています。

##ディレクトリ構造
```
portfolio
|-docker-compose.yml
|-html
   └──index.php
|-Dockerfile
|-php.ini
|-mysql
|-phpmyadmin
```

##docker-compose.yml

こちらの記事のdocker-compose.ymlを参考にコンテナの起動まで出来ました。
[参考：docker-compose で PHP7.2 + Apache + MySQL + phpMyAdmin 環境を構築](https://qiita.com/naente_dev/items/d259ea84c172deeff7d8)

##発生したエラー①
上記の記事を参考にほぼ出来たのですがサイトを作り始めたところ

```
could not find driver
```
というエラーに遭遇しました。
ですのでDockerfileを別に作成しエラーを解決しました。

①まずはdocker-compose.ymlの

```
image: php:7.2-apache
```
の部分を下記のようにに変更してください。

```
build: .
```

```ccp:docker-compose.yml
version: '3'

services:
  php:
    build: .
    volumes:
      - ./php.ini:/usr/local/etc/php/php.ini
      - ./html:/var/www/html
    ports:
      - 8080:80
  
```
②Dockerfileを作成して下記を記述します

```ccp:Dockerfile
FROM php:7.2-apache
RUN docker-php-ext-install pdo_mysql
```
③コンテナを停止させ、再起動する。

[参考：開発環境をDockerにしたら、PDOでcould not find driverが出た](https://qiita.com/tarch710/items/1236a23f7ffde4c512f2)
##発生したエラー②
画像のアップロードをする際にexif_imagetype関数を使いバリテーションをしたかったのですが、エラーが出ました。
こちらも解決するためにDockerfileに追加で記述していきます。

```ccp:Dockerfile
FROM php:7.2-apache
RUN apt-get update \
&& apt-get install -y \
		libfreetype6-dev \
		libjpeg62-turbo-dev \
		libpng-dev \
        && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
	&& docker-php-ext-install -j$(nproc) gd  exif 

RUN docker-php-ext-install pdo_mysql
```
再度コンテナを停止させ、再起動します。

[参考：ソフラボの技術ブログ](https://shinsuke789.hatenablog.jp/entry/2020/06/15/100000)

##まとめ
最初はDockerfileを使用するのは難しいと思いdocker-compose.ymlで環境構築しました。
ですがエラーが発生したことによりDockerfileを使用してみて
よりdockerの理解を深めることができました。
ActiveRecord(アクティブレコード)について

##ActiveRecordとは##
DBには様々な種類があり、MySQL、PostgreSQL、SQLite、SQL Server、Oracleなどが良く使われています。
DBによって記述のルールが違うため、それに伴って学習コストが高くなる可能性があります。
ActiveRecordを用いるとRuby言語でDBの操作が可能になり、SQL等よりも短いコードでDBを呼び出す（追加）ことが可能です。

##命名規則について##
ActiveRecordはクラス名に関する命名規約があります
例えば、クラス名がBookの場合、booksというテーブルで対応します。
Railsでは、開発者が名付けたモデルクラス名を複数形にしDBのテーブルを探してくれます。

##ActiveRecordメソッド##
まずは下準備として、Railsアプリ(blog_app)を作成

```
rails new blog_app -d postgresql
rails db:create
rails db:migrate
rails c　
 ```

**メソッド一覧**
createメソッド(レコードの新規作成)

```rb
Blog.create(title: 'タイトルA', content: '内容A'))
```

newメソッド(モデルオブジェクトをインスタンス化)

```rb
@blog = Blog.new(title: 'タイトルB', content: '内容B')
```

findメソッド(idを引数にし、そのレコードをオブジェクトとして取得）

```rb
Blog.find(3)
```

updateメソッド(レコードを更新)

```rb
@blog = Blog.find(2)
@blog.update(title: 'タイトルBB')
```

destroyメソッド(レコードを削除)

```rb
@blog = Blog.find(1)
@blog.destroy
```

allメソッド(テーブル内の全レコードを取得)

```rb
Blog.all
```

firstメソッド(テーブルの最初のレコードを取得)

```rb
Blog.first
```

lastメソッド(テーブルの最後のレコードを取得)

```rb
Blog.last
```

whereメソッド(引数に条件を指定し、それに合ったレコードを取得）

```rb
Blog.where(title: 'タイトルD')
```

find_byメソッド(引数に指定した条件に最初に一致するレコードを取得)

```rb
Blog.find_by(title: 'タイトルD')
```

orderメソッド(レコードを並び替えを行う)

```
Blog.order(content: :desc)
```

where.notメソッド(whereメソッドの後ろに.notをつけることで引数に指定した条件に合致しないレコードを取得)

```rb
Blog.where.not(title: 'タイトルD')
```

orメソッド(2つのOR条件でレコードを取得したいときに使用する)

```rb
Blog.where(title: "タイトルA").or(Blog.where(title: "タイトルE"))
```

selectメソッド(引数にカラム名を指定することで特定のカラムのみの情報を取り出すことができる)

```rb
Blog.select("id", "title")
```

limitメソッド(取得するレコード数を制限)

```rb
Blog.limit(3)
```

offsetメソッド(limitメソッドと合わせて使用し、引数に指定した数のレコード分をスキップしてその次のレコードから取得できます。以下の例では、7レコード目から4レコード分取得）

```rb
Blog.limit(4).offset(6)
```

##メソッドチェイン##

whereメソッドやorderメソッドは下記のようにメソッドチェインを構成できます。
以下の例ではtitleがタイトルAのレコードを作成日が新しい順で5レコード取得しています。

```rb
Blog.where(title: 'タイトルB').order(created_at: :desc).limit(5)
```

groupメソッド(引数で指定したカラムの値が同一のものをグループ化)

```rb
Blog.group(:title).count
```

havingメソッド(groupメソッドでグループ化された対象に条件を付与できます。
以下の例では、レコード数が5より多いタイトルのレコード数のみを出力)

```rb
Blog.group(:title).having('COUNT(*) > 5').count
```

##ActiveRecordのメソッド公式##

https://railsguides.jp/active_record_querying.html
仮想通貨の自動売買チュートリアル。環境構築

この記事では以下のチュートリアル実行に必要な環境構築を行います。

https://qiita.com/richmanbtc/items/05916384bf9d2b1e2f35

初心者向けの記事です。
上級者ならこの記事を読まなくても環境構築できると思います。

## 前提知識

- プログラミングの基礎知識
- コマンドラインを使える
- gitを少し知っている
- dockerを少し知っている
- 英語 (または自動翻訳、または日本語の情報を探せる)

## 開発環境の用意

### OS

OSはWindows, Mac, Linuxどれでも開発できます。
MacかLinuxだとコマンドラインが使いやすいです。
私はMacで開発しています。

### エディタの用意

ソースコードを編集するためにエディタが必要です。
OSに標準でついているエディタでも一応できますが、効率が悪いです。

私はIntelliJ IDEAを買って使ってます。
Visual Studio CodeやSublimeなどは無料で使えるらしいです。
https://smartlife-weblog.com/programing/recommend-visual-studio-code.html

### コマンドライン環境の用意

gitやdockerを使うためにコマンドライン環境が必要です。
MacとLinuxは元から使えます。

Windowsはいくつか方法があるみたいです。
ぐぐってみてください。

でも、Macを買うのが早いと思います。
オープンソース系のツールはほとんどLinuxを想定して作られていて、
Macはギリギリ動く、Windowsはほとんど想定されていないような気がします。
なのでWindowsを使うとマイナーなツールを使ったときにトラブルに巻き込まれやすいです。
中古のMacは10万円(0.02BTC)以下で買えるみたいです。
https://www.pc-koubou.jp/pc/used_mac_book_pro.php

最近のMacはIntelのCPUではないMacがあるみたいです。
IntelのCPUでないと互換性のトラブルがあるかもしれません(例: https://fixel.co.jp/blog/docker-m1mac/)。
私はIntelのものを使っています。

## ローカル環境構築

ローカル環境は自分のパソコンのことです。
本番でボットを動かすためのサーバーなどと区別するためにそう呼びます。

### gitのインストール

gitはバージョン管理ツールです。
プログラミングをやるなら必須のツールです。
この記事ではチュートリアルのソースコードをダウンロードするために使います。

ローカル環境にgitをインストールします。
[gitのインストール方法](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

色々なインストール方法がありますが、
私はMacで以下のコマンドでインストールしました。

```bash
brew install git
```

brewは色々なものをかんたんにインストールできるコマンドです。
brewは以下でインストールできます。
https://brew.sh/index_ja

### dockerのインストール

dockerはかんたんにアプリを動かすためのツールです。
この記事ではJupyter(ブラウザ上でpythonソースコードを編集したり実行したりできるツール)を動かすために使います。

ローカル環境にdockerをインストールします。
[dockerのインストール方法](https://docs.docker.com/get-docker/)

私はMacで以下の方法でインストールしました。
[Install Docker Desktop on Mac](https://docs.docker.com/docker-for-mac/install/)

### docker-composeのインストール

docker-composeはdockerが使いやすくなるツールです。

ローカル環境にdocker-composeをインストールします。
[docker-composeのインストール方法](https://docs.docker.jp/compose/install.html)

Macの場合、Docker Desktop for Macをインストールしたら自動でインストールされていました。

### チュートリアルリポジトリのクローン

以下のチュートリアルリポジトリをgit clone(ダウンロード)します。
https://github.com/richmanbtc/mlbot_tutorial

以下のコマンドでクローンできます。

```bash
git clone https://github.com/richmanbtc/mlbot_tutorial.git
```

実行すると、
コマンドを実行したディレクトリにmlbot_tutorialというディレクトリが作られて、中にリポジトリの内容がダウンロードされます。

### Jupyterの起動

Jupyterはブラウザ上でpythonをインタラクティブに実行できるツールです。
ソースコードを少しずつ編集しながら試行錯誤できるので、
bot研究に向いています。

mlbot_tutorialディレクトリへ移動後、以下のコマンドでJupyterを起動できます。

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

ブラウザで
http://localhost:8888 を開くとJupyterが開きます。
これでbot研究の環境が整いました。

Jupyterが起動する仕組みはmlbot_tutorial内の[Dockerfile](https://github.com/richmanbtc/mlbot_tutorial/blob/master/docker_images/jupyter/Dockerfile)と[docker-compose.yml](https://github.com/richmanbtc/mlbot_tutorial/blob/master/docker-compose.yml)を見てください。

## チュートリアルを開く

Jupyter上でworkディレクトリ内のtutorial.ipynbを開いてください。

以下のリンクでも開けます。
http://localhost:8888/lab/tree/work/tutorial.ipynb

ここからボット研究をします。
OCRを使って手書き申請書をデータ化する手間を省きたい

毎月数十枚の手書き申請書が送られてきます。
社内処理のために申請書内容の一部をExcelに手入力しるいるのですが
どれだけダブルチェックしていても毎月数件はエラーが出てしまいます。

入力作業を減らして、確認作業のほうに時間をあてたほうが効率的ではないかと思い
Google Cloud Visionを使って手書き申請書をデータ化してみました。

#使用したツール
###Integromat
シナリオの全体像。テンプレートを使用しました。
![Detect text within new Google Drive images using Google Cloud Vision (OCR) and save it to Google Drive as a new file _ Integromat - Google Chrome 2021_08_15 2_27_36 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/d11d7663-3136-32e6-4d64-494bbba02622.png)

###Google Forms
Google Formsから手書きの申請書の画像をアップし、テキスト化しました。
![Detect text within new Google Drive images using Google Cloud Vision (OCR) and save it to Google Drive as a new file _ Integromat - Google Chrome 2021_08_15 2_29_42 (2)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/466f6fb8-918c-fed7-2b33-989e2990e6f1.jpeg)

###Google Sheets
テキスト化したデータをスプレッドシートに書き込みました。
文字認識の精度はあまり高くないのでまだまだ改良が必要です。
本当はExcelに繋げたり、Excelへのエクスポートも自動化したいです。
![Detect text within new Google Drive images using Google Cloud Vision (OCR) and save it to Google Drive as a new file _ Integromat - Google Chrome 2021_08_15 2_36_32 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/7f383dab-3529-3914-08ab-47f963eb7755.png)

#作ってみて思ったこと
Googleって色々なツールと簡単に繋げることができて使い勝手がいいですね。
普段の業務でも使いたいです…。

あと、実際に色々なツールを試してみることで
今後RPAを本格的に導入していく時の参考にできるので
自分で作ってみることの大切さを感じています。
基本情報技術者試験勉強0715

本日の積み上げ結果
基本情報処理技術者試験勉強
　平成17年春過去問
　平成17年秋過去問
　間違えた問題の復習

リスク分析　洗い出されたリスクが顕在化する可能性と、損害を受ける情報資産の重要度などから各リスクの大きさ（危険度）を評価します。

VPN インターネットネットワークに参加する資格のある個々人を識別する能力はない。

割込み(Interrupt) すぐに対処しなくてはならない問題などがシステムに生じたときに 、実行中のプログラムの処理をいったん停止し、別のプログラムの実行に切り替えることをいいます。

リピータ　物理層で接続し、データ伝送中に弱くなった電気信号を増幅することでデータの伝送可能距離を延長する装置です。

レグレッションテスト　退行テスト／回帰テストとも呼ばれ、システムに変更作業を実施した場合に、それによって以前まで正常に機能していた部分に不具合や影響が出ていないかを検証するためのテストです。

分散システム　データベースなどの共通資源のために，集中型システムと同様に専門の管理者を置く。

ガントチャート　日程について予定と実績を対比することができる。


システムの性能評価　実際の利用条件や環境と同じような状況下で行うことで精度の高いデータが得られます。もし環境が用意できなければ、用途に合わせた典型的なベンチマークプログラムを実行することで客観的な評価が得られます

ソフトウェアライフサイクルプロセス(SLCP)   共通フレームとも呼ばれソフトウェア取引において取得者と供給者、双方の目安とするためにソフトウェアのライフサイクルを可視化し「共通の物差し」を規定したものです。

OSにおけるシェルの役割　利用者が入力したコマンドを解釈し，対応する機能を実行するようにOSに指示する。

カーソル操作　アプリケーションプログラムからデータベースへの問合せによって得られた導入表を、表データを直接扱えない手続き型プログラム言語に渡す機能を実現するものです。SQLではカーソル宣言に"DECLARE CURSOR"、カーソル位置のデータ取得および次データへの移動に"FETCH"文を使います。

メモリインタリーブ　物理上ひとつの主記憶を同時アクセス可能な複数の論理的な領域(バンク)に分け、これに並列アクセスすることで見かけ上のアクセス時間を短縮することができるメモリアクセス高速化のための技法です。

情報落ち　浮動小数点演算において，絶対値の大きな数と絶対値の小さな数の加減算を行ったとき，絶対値の小さな数の有効けたの一部又は全部が結果に反映されない誤差

関係データベースで用いられる用語であるドメイン(定義域)の説明　属性が取り得る値の集合

シソーラス(Thesaurus) 類語辞典の一種で、単語の上位/下位関係、部分/全体関係、同義関係、類義関係などによって単語を分類したものです。

クロスコンパイラ　コンパイラが動作している以外のプラットフォーム向けに実行ファイルを生成する機能を持つコンパイラです。主に組み込みシステム向けのコンパイラとして使われたり、マルチプラットフォーム対応のコンパイルに使われます。

共通フレーム　日本のソフトウェア産業界においての"共通の枠組み"、"共通の物差し"となることを目的として作成された規格です。取得者と供給者双方または、システム開発に関わる全ての人が、ソフトウェアを中心としたシステムの企画, 要件定義，開発，運用，保守の作業内容を共通に参照できるよう詳細に表現したり、ソフトウェア取引を明確化するための基準が記述されています。


オーバレイ　データ量が大きく主記憶に格納しきれないプログラムを、いくつかのブロックに分解し、主記憶にはその時点で必要となる部分だけをロードする実記憶の管理方式。

ページング　主記憶上に存在するプログラムやデータと、補助記憶装置上にある必要なプログラムやデータの入替えを、ページと呼ばれる固定長の単位で行う仮想記憶方式。

スワッピング　プログラムやデータの優先度に応じて主記憶の内容と補助記憶装置の内容を入れ替えながら処理を行う実記憶の管理方式。

2相コミット　トランザクションを、他のサイトに更新可能かどうかを確認する第1フェーズと、更新を確定する第2フェーズに分け、各サイトのトランザクションをコミットもロールバックも可能な中間状態(セキュア状態)にした後、全サイトがコミットできる場合だけトランザクションをコミットするという方法で分散データベース環境でのトランザクションの原子性・一貫性を保証する手法です。

トレーサ　プログラムを命令単位で実行し、その直後のメモリやレジスタの内容などの履歴情報を時系列に出力するツールです。プログラムのステップごとに誤りがないかどうかを検証するときに有効です

マイクロカーネル　OSが提供する機能を最小限のメモリ管理やプロセス管理などに限定し，ファイルシステムなど他のOS機能はサーバプロセスとして実現されているもの

シーケンス図　オブジェクト間のメッセージのやり取りなどのオブジェクトの振る舞いを時系列に表す図です。

プロキシサーバ　内部ネットワークからインターネットへのアクセスを代理して中継する装置またはそれを実現するソフトウェアです。内部ネットワークの特定端末だけにインターネット接続を許可したり、外部ネットワークからのアクセスを制限するなど、ネットワークの境目で、ネットワーク間のアクセスを一元管理します。
Webページアクセスはクライアントでなくプロキシサーバが代理して行うので、ネットワーク内部を秘匿にできセキュリティの確保が期待できます。

線形リスト　データ部と次のデータの格納先を指すポインタ部から構成されるデータ構造である。

ECC(Error Check and Correct)  誤り訂正符号としてハミング符号や垂直水平パリティを用いることで、記録内容に発生した誤りを検知・自動訂正できる誤り制御方式です。また、この機能を搭載したメモリをECCメモリといいます。

FIFO 置き換え対象の中に最も古くから存在するページを追い出す"先入れ先出し"のアルゴリズムです。

外部割込み　内部割込み以外の原因で起こる割込みタイマ割込み、入力装置の操作などによって発生する入出力割込み、ハードウェアに障害が発生したときの機械チェック割込みなどがある。

ジョブスケジューリング　対話型処理とバッチ処理が混在するシステムでは，対話型処理の優先度を高くすることによって，対話型処理の応答性能の向上が期待できる。
git pushで「Support for password authentication was removed on August 13, 2021」と表示された場合の対処法

2021/8/13から、Https経由でgithubのリモートリポジトリにpushする際の認証で、パスワードが使えなくなったらしい。

パスワードの代わりにgithub上で「personal access token」を発行すれば解決できる。

公式に発行する方法が載っていて、その通りに設定したら解決。

personal access tokenの発行方法

https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token

personal access tokenは発行す際、有効期限の設定をすることができる。

期限無しも可能だが、念の為90日で作成してみた。

90日経過後、再度tokenを発行して同じ手順を行う必要がある。


ちなみに、既にキーチェンアクセスにgithubのログイン・パスワードが保存されている場合は、削除してpersonal access tokenで認証し直す必要がある。

https://docs.github.com/en/get-started/getting-started-with-git/updating-credentials-from-the-macos-keychain

上記の手順を試した後、pushを実行してみるとUsernameとPasswordを聞かれるので、発行したpersonal access tokenをコピペすればOK。

```
Username for 'https://github.com': XXXXX
Password for 'https://XXXXX@github.com':（personal access tokenをコピペ） 
```

以上。
Javaについて、基本だけど意外と知らないこと(Java Silver 「データ型の操作」)

本年度中に、Java Silver及びJava Goldの資格取得を目指しています。
現在エンジニア3年目にも拘らず、今までの経験言語がJavaだったりC#だったりしてふらふらしていたので、ここらで一発、言語について基本的な知識を持っておこうと思ったのがきっかけです。

2年目までは言語知識を深く知らなくても、先輩の作った基盤の上でなんとなくプログラミングできていたように思えます。そのせいか、恥ずかしながら3年目になって（試験勉強を始めて）Javaの理解が進んだ点がいくつかあるので、備忘程度に記載します。

##出典
Java SE 8 Silver試験「Javaのデータ型の操作」単元より

###インスタンスとガベージコレクション

```Java

Object a = new Object(); //【I】Objectインスタンスを生成し、Object型の変数aの参照先とする
Object b = new Object(); //【Ⅱ】Objectインスタンスを生成し、Object型の変数bの参照先とする
Object c = a; //【Ⅲ】Object型の変数cの参照先を、変数aの参照先インスタンスとする
a = null; //【Ⅳ】変数aが何もインスタンスを参照しないよう設定
b = null; //【Ⅴ】変数bが何もインスタンスを参照しないよう設定
 
```

#####図示してみると

1,2行目でObject型変数a,bに対して、それぞれの参照先となるObjectインスタンスが生成される。↓

![GC_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552268/378cdf0a-0d79-3ebf-9625-503caf703b16.png)

3行目で変数cが生成される。参照先はaが参照しているインスタンスと同じ。↓

![GC_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552268/77a78aee-6f2a-b401-97d4-1992ffd7e4b8.png)

4,5行目で変数a,bがどのインスタンスも参照しないよう設定(=null)されている。もともとaが参照していたインスタンスは引き続き変数cに参照されるのに対し、bが参照していたインスタンスは参照元を失う。bが参照していたインスタンスは今後使用予定がないので、JVMのガベージコレクションの対象となる。↓
![GC_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552268/4416d9d4-2313-e332-d67c-56e13158dfa8.png)

ガベージコレクションについては

[JVM・ガベージコレクションに関してまとめてみた](https://qiita.com/kinshotomoya/items/089ab8ddd732a3f74ce8)

[JavaのGCの仕組みを整理する](https://qiita.com/e_tyubo/items/48398391a8ef0f24c1be)

###○○進数を指定したint型の初期化 

```Java
int a = 111; //よく使うやつ
int a = 0x10B; //冒頭に「0x」を付けると12進数 10進数では1*12*12+12*0+1*11 = 155 
int b = 0b100001011; //冒頭に「0b」を付けると2進数 10進数では267
int c = 0727; //冒頭に「0」を付けると8進数 10進数では7*8*8+2*8+7*1 471
```

###整数リテラルの書き方
※リテラル=「代入するときの等号の右側の値」

```Java
int a = 123_456_789; //OK 間にアンスコ書いてもOK 値としては123456789
int b = _123_456; //NG アンスコから始めるのはNG コンパイルエラー
int c = 123_456_; //NG アンスコで終わるのもNG コンパイルエラー
int d = 123_.45; //NG アンスコの横に記号が来るとNG コンパイルエラー
long e = 123.45_L; //NGアンスコの横に記号が来るとNG コンパイルエラー
float f = 123.4_5F; //OK アンスコの横に記号泣ければOK 値としては123.45（float)
```

参考 => [【Java】数値リテラル内のアンダースコア](https://qiita.com/takahirocook/items/8ed7d762625e88ae4f68)

###char(文字型)に入ってもいい値

```Java
char a = 'a'; //OK シングルクウォーテーションで囲むのが習わし
char b = '\u30A2'; //OK Unicode値を代入できる
char b = 89; //OK　Unicode値の10進数値を代入できる
char c = null; //NG char(というかプリミティブ型変数)はnullを持てない。初期値は'\u0000'
 
```

###識別子の命名規則
識別子...変数やメソッド、クラスなどの名前のこと。

```Java
int $a = 100; //OK $は変数名に使える
int _b_ = 100; //OK _は変数名に使える
int ${a} = 100; //NG 変数名に使える記号は$と_のみ コンパイルエラー
int g.a = 100; //NG 変数名に使える記号は$と_のみ コンパイルエラー
 
```
郵送で到着した手紙のテキスト化（OCRの活用）とメール送信を簡易化したい！を考えました

#手作業を減らしたい
私の職場ではお客さまから手紙が週3～4通ほど到着します。この手紙に記載されている内容を”顧客管理システム”へ手入力する作業があります。また手紙が到着したことを管理者グループへメールする作業も発生します。
この手作業やメール送信作業は地味に負担がかかります。入力時には誤入力、メール送信審忘れや宛先間違いや漏れのリスクがあります。

#作業者からチェック者へ
手作業にはミスがあります。どんなに注意していてもミスは起こり得ます。ミスを防ぐためにチェック作業というものがあります。つまり手作業が発生することはチェック作業も発生することになります。
手作業を見直せば、作業者がチェックすることが出来ますので簡易化と負担軽減が実現します。

#簡易化にする前に必要性をまとめてみた
簡易化を検討するにあたり、この作業について7W2Hで考えてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/3428fe82-b1c2-3326-8339-e23ba265020f.png)
OCRによるテキスト化とメールの自動送信が実現出来れば負担軽減が実現します。

#イメージを形にしてみる
現状の業務内容を整理してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/024f070b-1cbd-7205-fd47-30b3e109cafe.png)
テキスト化とメール送信の部分について**integromatを利用**します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/3ec6e9f8-c131-d54b-23df-406456968a1d.png)

#integromatを使う
今回は画像データをテキスト化するシナリオを基に作成しました。
なんと予めシナリオが組まれています。

https://www.integromat.com/en/integration/2178-detect-text-within-new-google-drive-images-using-google-cloud-vision-ocr-and-save-it-to-google-drive-as-a-new-file

予め組まれているシナリオに”Gmailへ送信”モジュールを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/c2d896ca-c745-739b-12c4-b8d28cf55f20.png)

#意外と精度が高かった”OCR機能”
会社の情報セキュリティ上、本番環境での使用には申請等の手続きが必要な為、今回は私用PCでテストを行いました。
画像データをOCR機能でテキスト化された内容を並べてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/302d1315-cd05-9583-7bc5-bcf2985af01e.png)
思った以上にテキスト化が出来ています。

メール送信テストの結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/76cf93d3-0320-8543-6a9c-382d8bb7de1e.png)

メール機能は使えそうです！

テキスト化とメール送信の簡易化の実現が可能であることを証明できました。
実装に向け、会社に提案します。

#次はRPAを組み込む
"画像データをGoogleドライブへ格納する"をRPA化すれば更に手作業を減らすことが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/6045ed5e-3695-c920-7104-08cf29e97af3.png)
小さなことでも積み重ねていけば大きな負担軽減が実現します。
ちょっとした**面倒くさい**に目を向けて、手作業の削減に取り組んでいきます。

最後まで読んで頂き、誠にありがとうございました。
CSVデータ結合作業のRPA化を考えました

#地味に面倒な作業、CSVデータの結合
今回は私が週１回、実施しているコマンドプロンプトでCSVデータを結合している作業のRPA化を紹介します。


```コマンド
cd 【保存先フォルダー】
copy *.csv 【ファイル名】.csv
```

#作業をするのには訳がある
私の部署の業務に手紙発送対象の住所をExcelシートに入力するというものがあります。
かつては住所情報を事務担当者が手入力で行っていました。1週間に1回の作業ですが200件近く入力する為、誤入力などが発生していました。
幸い”顧客管理システム”から住所情報はCSVデータで出力することが可能でした。予めExcelシートに住所情報CSVデータを貼付しておき、VLOOKUP関数を用いれば手入力は不要となります。それは楽になりました。
しかし、このCSVデータはカテゴリ毎にしか出力されないという残念な仕様となっています。手紙発送対象者はカテゴリに関係なく全顧客を対象としている為、**CSVデータを結合**してExcelシートへ貼付しています。
#RPA化にする前に必要性をまとめてみた
RPAは業務手順を見直す良い機会だと思っています。RPAを作成する前にこの作業について7W2Hで考えてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/ac1d9d81-0ff3-0169-bff1-da30c5ab6e6d.png)
結果、必要と判断したのでRPAを作ります。

#RPA化の方針は”手作業を再現”
今回、使用するRPAツールは**PowerAutomateDesktop**です。
手作業で実施していた作業をそのまま再現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/5f71c6ef-8b73-a277-eceb-ac93e13cf905.png)
**PowerAutomateDesktopのフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/eaa213cd-f7ed-78f5-e396-3a07bc02b3b7.png)




#コマンドプロンプトの操作方法
コマンドプロンプトの設定方法に苦労しました。
アクションの"CMDセッション"を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/7e86a254-4737-0efa-3f15-a41d3cc9d25e.png)
手入力しているコマンドをRPA化すると下記の様になります。

```コマンド
cd 【保存先フォルダー】
copy *.csv 【ファイル名】.csv
exit
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/b02afe88-621d-cbac-28b1-2889a9e501d4.png)



セッションを開いてファイルがあるフォルダーを指定する設定

```コマンド
cd 【保存先フォルダー】
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/db0fa409-3788-3811-e806-0e34627ac62e.png)

CSVデータを結合して新たなファイルを作成する設定

```コマンド
copy *.csv 【ファイル名】.csv
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/4de9f514-4927-7304-6179-9b778812856d.png)
#これでCSVデータ結合作業から解放されるハズ
残念ながら会社のセキュリティ上、実装には至りませんでしたが私用PCで環境を再現した結果、見事に手作業を再現出来ました。
月60分の作業時間短縮、地味ではありますが”チリも積もれば山となる”。会社へ実装を提案していきます。

#次は“顧客管理システムからCSVデータを出力する”をRPA化する
今回は”顧客管理システム”から出力された段階からのRPA化でした。”顧客管理システム”側からCSVデータを出力する操作をRPAすることができればより**楽になる**と考えています。

最後まで読んで頂き、誠にありがとうございました。
Mysql2::Error: MySQL client is not connectedというエラーについて

# はじめに
本記事は、`Mysql2::Error: MySQL client is not connected`というエラーが起こり、
それを解決するための対策を記述しています。

# Mysql2::Error: MySQL client is not connected
テストを実行するのに、`負荷`がかかったことが原因でした。

小さい処理だった場合でも、
mysqlの接続スピードよりテストの処理が実行されるスピードの方が早いためエラーが起きています。
（自宅のWi-Fiがちょっと...というやつでした。）

# 結論

```order_form_spec.rb
RSpec.describe OrderForm, type: :model do
  before do
    user = FactoryBot.create(:user)
    item = FactoryBot.create(:item)
    @order_form = FactoryBot.build(:order_form, user_id: user.id, item_id: item.id)
    sleep 0.1
  end
# 以下省略
```

```
# これを入力してください。
sleep 0.1
```

`処理の途中`で`0.1秒とめる`というイメージです。

# 当時の状況

テストの記述が終わりましたので、
`bundle exec rspec spec/models/order_form_spec.rb`しましたところ

```
ActiveRecord::StatementInvalid:
Mysql2::Error: MySQL client is not connected
```
というエラーが発生しました。
下行には、

```
Finished in 0.29523 seconds (files took 1.3 seconds to load)
13 examples, 9 failures
```

なるほど。
と念の為、もう一度テストコマンド入力すると、

```
13 examples, 4 failures
```
!?
たまにエラーが０の時があり、テスト成功します。

```
13 examples, 0 failures
```
マリオパーティーしている感覚でした。


#　終わりに
テスト完璧！と思っていたため、かなり焦りました。
テストができていないと、アプリケーションとしても不十分であることの可能性が`大`ですからね。
あと、Wi-Fi変えようかな・・・。

他にも、テストに関する記事を投稿しているので参考にしてください。
[[テスト]FactoryBotにimageを記述する](https://qiita.com/mkato1013/items/9b80d5961a41a57f2973)


今回の参考記事です。
[RSpecのテスト中にMySQL client is not connected](https://qiita.com/shun915a/items/e18f538be6221f929876)

明日から週はじめ！
頑張っていきましょう！！
[TypeORM] jsconfig.jsonエラー

## はじめに
VSCodeでTypeORM使ってコード実装してるときに、jsonconfig.jsでエラーが発生したのでメモ📝

## エラー内容

##### File '/home/filename/node_modules/source-map/source-map/'not found.The file is in the program because: Root file specified for complication

not foundって怒られてるけど、/home/filename/node_modules/source-map/source-map/にファイルはある。



## 対処方法

VSCodeを再起動したら直った
機械学習、Pythonに関する個人的Tips

(yyyy.mm.dd追記)

---

# はじめに

機械学習絡みでPythonのことでよく検索することを個人的な備忘録がてら残します。
「前に検索したなこれ・・・」と思ったものは逐一追加していきます。

## Pandas関連

### 表示行、列を変えたい


```python
import pandas as pd

# 現在の最大表示列数
pd.get_option("display.max_columns")

# 最大表示列数を１０列に指定
pd.set_option('display.max_columns', 10)

# 最大表示列数を無制限に
pd.set_option('display.max_columns', None)


# 現在の最大表示行数
pd.get_option("display.max_rows")

# 最大表示行数を10行に指定
pd.set_option('display.max_rows', 10)

# 最大表示行数を無制限に
pd.set_option('display.max_rows', None)
```


## その他
CodeV レンズファイルフォーマットのメモ

## 背景

CodeV は持っていないが, Edmund optics のサイトなどにある CodeV のレンズデータを自作レンズシミュレータや他の光学ソフトなどで読み込みたい.


## 参考情報

OpTaliX マニュアル
http://optenso.com/download/download.html

用語やコマンド名などは CodeV(+ Zemax とも?)と似ているのが多いので役に立つ.


python ray-optics
https://ray-optics.readthedocs.io/en/latest/
(いくらか .seq のパーサーがある)

## コマンド

基本行単位. 上から読んでいく.
最後に `&` がついているのは bash でいう `\` みたいなもの(つまり次の行を連結する)


主要なもの

* `DIM` : 単位. `M` = `[mm]`, `C` = `[cm]`, `I` = インチ
* `WL` : 波長リスト
* `REF` : reference wavelength
* `WTW` : 各波長への重み
* `XAN` : paraxial? での角度での field X リスト
* `YAN` : paraxial? での角度での field Y リスト(=> image height(像高)のリスト)
* `YIM` : real(?) image height 
* `WTF` : 各 field の重み
* `SO` : Object 面
  * `SO curvature thickness` : 通常 curvature 0.0, thickness は大きめ(遠方)の値  
* `S` : サーフェスの定義
  * `S curvature thickness [glass]`. glass が抜けている場合は air とみなす. 
  * `CIR` : aperture radius
  * `CCY` : ?
  * `THC` : Thickness?
  * `EDG` : Edge aperture  
  * `STO` : stop surface(aperture)である
* `SI` : Image 面
  * `SI curvature thickness`. PIM が有効な場合は thickness がマイナス(=Defocus)となることもある. 最後の `S` に `SI` の thickness を足したものが最終的な image 面への距離となる.
  * その他: OpTaliX マニュアル 8.3 Surface Parameters を参照.
* `PIM [YES|NO]` paraxial image solve
* `GO` : レンズ定義の終了

## 非球面レンズ

`ASP` で定義

* `K` : conic
* `A` ~ `J` : 4, 6, 8, ... 20 次までの非球面係数(EVEN18). 通常は `H`(18 次まで) 
  
## 注意点

`S` でも thickness がマイナスになるときがある.
たとえば最初に stop surface が定義されているが, その次のレンズ面が stop 面より前(object 側)にあるときなど.

## ガラスの定義

`F5_SCHOTT` など

Schott(ショット光学)の `F5`.

https://opticalglass.readthedocs.io/en/latest/

https://refractiveindex.info/

やガラスメーカーのサイトなど探せば, メジャーなガラスの屈折率などの情報を得られる.


### Private glass

カスタムの IOR を持つガラス.

seq では波長 + IOR 値のペアで定義する.

rayoptics のサンプルデータから.

```
PRV
  PWL 1600.0 1500.0 1400.0 1300.0 1200.0 1100.0 1000.0 900.0 800.0 700.0 650.0&
   600.0 587.6 546.1 486.1 480.0 460.0 440.0 404.7 400.0
  'E48' 1.5184 1.5188 1.5192 1.5197 1.5201 1.5219 1.5231 1.5247 1.5257 1.527&
   1.5286 1.5306 1.53116 1.5334 1.5378 1.5384 1.5404 1.5427 1.5476 1.5484
END
```

`'E48'` がガラス名となる.

これを利用するときは, データを Sellmeier 式でフィッティングとかではなくて, 各点を通る曲線として扱うっぽい.
rayoptics では `scipy.interpolate.interp1d` で cubic 補間をしている.

## fields, object points

OpTaliX マニュアル 7.3.1 参照.

field :  イメージ(センサー)面での位置(高さ). CG とかで使われるフィールドとは意味が異るので注意.
object points : シーン側での物体位置


* `XAN`, `YAN` : 角度
* `XIM`, `YIM` : paraxial image height. `height = EFL * tan(theta)` 式で求まるもの. EFL = effective focal length.
* `XRI`, `YRI` : real image height. 実像高?. これに対応する入射角は, aperture の中心を通り, 指定した像高位置へ入射する chief ray を求める(ニュートン法あたりで収束計算)必要がある
* `XOB`, `YOB` : 物体側の高さ.
Web制作の学習で使用したサイト・サービス

##はじめに

Web制作の学習で使用した無料サイト・サービスの自分用メモ
随時更新☺


##フロントエンド
[Progate](https://prog-8.com/)
言わずとしれたサービス

[jsFiddle](https://jsfiddle.net/)
ブラウザ上でHTML/CSS/JavaScriptのコード実装と動作チェックができる
JavaScrip実装時に、()の付け忘れとかあるとエラー出してくれるから超便利◎
VSCodeの代わりに使える!(^^)!

[仕事ですぐに使えるTypeScript](https://github.com/future-architect/typescript-guide)
フューチャー株式会社（Future Corporation）が公開してるドキュメント

##サーバーサイド・API
[Talend API Tester - Free Edition]( https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=ja)
Chromeブラウザの拡張機能で、簡単にAPIのGET/POSTリクエストが送信できる。

[JSON Server](https://www.npmjs.com/package/json-server)
JSONを返すだけのサーバー
API作成前にサクっとJSONレスポンス～画面に表示するところを作りたいときに使った


##DB
[Airtable](https://www.airtable.com/)
Googleスプレッドシートっぽく使える簡易データベース
DBにデータ登録できるフォームやAPIがデフォルトで準備されていて超便利◎


##参考サイト
● [Next.js で Airtable を簡易データベースとして使ってみるよ](https://dev.classmethod.jp/articles/next-js-and-airtable/)
【PHP7.4.x】XAMPPにimagickをインストールしてWordPressの「1つ以上の推奨モジュールが存在しません」を解決する

XAMPPにWordPressをインストールすると、サイトヘルスに「オプションのモジュール imagick がインストールされていないか、無効化されています。」という表示がされます。

![2021-08-15_12h06_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183668/898a458e-57bd-f97c-3381-5cba3cb58780.png)

「imagick」は画像処理ライブラリ「ImageMagick」のAPIを使用した、WordPressではおなじみのサムネイル生成などに使われているPHPの拡張モジュールです。

通常、WordPressはPHPに同封されている[GDライブラリ](https://www.php.net/manual/ja/book.image.php)で画像処理を行っているため、imagickがインストールされていなくても上記のような処理を実行できます。

なので、**imagickの導入は必須ではない**のですが、管理画面にずっと表示されたままなのはやはり気になります。

## ImageMagickのダウンロード

ImageMagickをダウンロードします。

https://windows.php.net/downloads/pecl/deps/

XAMPPのApacheを起動した状態で以下のURLにアクセスするとphpinfoを見ることができます。

http://localhost/dashboard/phpinfo.php

Compilerの欄を確認し、バージョンに合ったものをダウンロードしてください。
こちらの環境ではVisual C++ 2017でしたので、最新の「ImageMagick-7.0.7-11-vc15-x64.zip」をダウンロードしました。

![2021-08-15_20h21_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183668/0ec9ccbd-10de-22be-7397-e3f37344b490.png)

## ImageMagickをXAMPPフォルダ内に配置

C:\xampp直下に『ImageMagick』という名前のフォルダを作ります。

ダウンロードしたImageMagickを解凍し、binフォルダの中身を全て『ImageMagick』に移動させます。

## Pathの設定

システム環境変数の編集を開きます。

![2021-08-15_21h15_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183668/ba9c1a83-03e8-3b5d-11a9-ca87a22a8372.png)

詳細設定 → 環境変数 と進みます。

![2021-08-15_21h18_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183668/fd19e2a7-ea89-d26b-8874-d2ec19610b4e.png)

Pathを選択して編集を押します。

![2021-08-15_21h20_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183668/14a34547-20e6-be7e-a9ca-32c2ef5e00bf.png)

新規を押し、C:\xampp\ImageMagickを新しいPathに登録します。

![2021-08-15_21h23_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183668/e5f87ebf-cabb-4df1-3659-bf760cb5562c.png)

## imagicのダウンロード

次に、imagicをダウンロードします。

https://windows.php.net/downloads/pecl/releases/imagick/3.5.1/

こちらの環境ではPHP 7.4.22なので「php_imagick-3.5.1-7.4-ts-vc15-x64.zip」をダウンロードしました。

![2021-08-15_16h56_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183668/0da3194a-9fee-da16-2860-350650e556bf.png)

同じくこちらも解凍し、php_imagick.dllをC:\xampp\php\ext\へコピーします。

上で作った『ImageMagick』フォルダにCORE_RLと付いたファイルを全てコピーします。

C:\xampp\php\php.iniをエディタで開き、「Dynamic Extensions」で文字検索。
;extension=shmopの下にextension=php_imagick.dllを追加します。（こちら環境では937行目でした。）

![2021-08-15_21h31_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183668/07ce63b5-ae8f-46b2-078f-ede47a088452.png)

ここで一度PCを再起動します。

冒頭のphpinfoを開き、「imagick」で文字検索。
組み込まれていれば成功です。

![2021-08-15_21h37_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183668/aaf591a3-04c1-42e8-938c-db49192885ec.png)


サイトヘルスでも表示が消えています。

![2021-08-15_21h36_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183668/950a3264-73b3-e3bc-747d-89c8a137db62.png)
【Ruby クイズ】スペルミスで SyntaxError が出るか？

Ruby についてのクイズです。
ある正しいプログラムの一箇所をスペルミスして SyntaxError が発生することはあるでしょうか。
ここで「スペルミス」とは，英単語の綴りの中のアルファベットを別のアルファベットに間違えること，とします。

なお，`eval` などの「文字列をスクリプトとして実行する」系のメソッドを使うと簡単に作れてしまうので，その手のメソッドは使わないという制約を設けます。

答えはスクロールで
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬
⏬

こんなコードで SyntaxError が起きます。

```rb
def refined?(mod, hoge)
  # 定義は省略
end

p defined?(String, :gsub)
```

`refined?` は，あるモジュールのあるメソッドが refinements で置き換えられているかどうかを判定するメソッドのつもりです。そういうメソッドは原理的に可能ですが，中身は略します。

さて，最終行でそのメソッドを使おうとしたのですが，「R」のキーを押すつもりで斜め下の「D」を押してしまい，`refined?` が `defined?` になってしまいました。

メソッド名をスペルミスすると，NameError か NoMethodError のどちらかが出るはずですよね[^err]。なぜ SyntaxError になるのでしょうか？

[^err]: 復習しておくと，ローカル変数の参照とも解釈しうる名前なら NameError になり，そう解釈しえないメソッド呼び出しなら NoMethodError になる。

述語メソッドのような見た目の [defined?](https://docs.ruby-lang.org/ja/3.0.0/doc/spec=2fdef.html#defined) は，実は演算子なのです。

そりゃ，こいつがもしメソッドだったら辻褄が合わないでしょ。
`defnined?` は，与えられた式がローカル変数なのか定数なのか代入式なのか（等々），はたまた未定義のものなのか，といった「種別」を返すものです。
もしメソッドだったら，`defined?` の呼び出しに際して，まずは与えられた式を「評価」しなくちゃなりません。評価しちゃうとオブジェクトになっちゃいますよね。それに，未定義だったら呼び出しが起こる前にエラーが出ちゃいます。


話を元に戻しましょう。

```rb
defined?(String, :gsub)
```

の `defined?` は，`refined?` をタイポしちゃったためにメソッドではなく演算子になっちゃいました。
`defined?` に与える式は `( )` で囲っても構わないのですが，二つの式をカンマで区切って併記することを認めていません。だから構文エラー（SyntaxError）になる，というわけです。
医療情報技師3

#レンタルとリースについて

基本的にはどちらも物を借りるという点は変わらない。

詳しくは下の画像を参考にして下さい。

![0C5D7514-7FE6-4A10-BFC8-CF3AAD0F0F7A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960912/1ab7bd2e-9e77-f9fe-1610-d945f48fa6b0.jpeg)
「XAI（説明可能なAI）」を読みました

どうも、Panamixkedaです。Qiita2回目の投稿です。

転職きっかけでQiita1回目を書いた後、2回目は何を書こうかな？と割と迷っていたところ、Kindleで「[XAI（説明可能なAI）](https://www.amazon.co.jp/XAI-%E8%AA%AC%E6%98%8E%E5%8F%AF%E8%83%BD%E3%81%AAAI-%E5%A4%A7%E5%9D%AA%E7%9B%B4%E6%A8%B9-ebook/dp/B098W4L6DL/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1629030178&sr=8-1)」というものオススメ、いやレコメンドされ、
読んでみるとこれがドストライク。

前回『コンサルに使うならXGBoostあたりまでかな。DNNは説明可能性的に基本難しい。』という冷めたスタンスで、業務改善コンサルのためだけの、一連のデータ可視化・分析手法を書きました。が、これを読んでまあ簡単にあきらめるものではないな、という感じになりましたね。

eXplainable AI、つまり人工知能の説明可能性を高める試みについての本です。色々な手法について書かれております。~~まあ全手法近似なのですが。~~
まだまだ発展途上の領域ではありますが、これを読んでAIを説明できる気になりましょう！大丈夫、近似手法だろうが条件付きだろうが、そもそもAIで出した値は全て仮説です。『近似です・仮説です、そしてそうであることはこういった場合にこういう確率でこんなリスクです』を説明すれば、クライアントも提案したモデルを採用してくれる、こともあるでしょう。

では以下手法のご紹介。

##LIME
特徴量の重要度を推定する手法。
まず、少なくともうまくデータを選べば、インプットがそんなに変わらなければアウトプットもあまり変わらない、という仮定を対象のモデルにいたします。（この仮定を忘れてはならない）
適当に教師データを１つとってきます。もとのデータ（x）をちょっとだけいじる作業を繰り返してデータ群を作成、それら摂動データ（z）をモデル（f）にくわせ出てきたデータを近傍データf(z)とします。線形関数gでも設定しまして、コスト関数を適当にf(z)とg(z)間の二乗誤差的な形にでも（※）設定します。
コスト最小化した結果のg(z)の各特徴量に関する傾きが、特徴量の（局所的な）重要度です。
　　　　


以下少し横道。
ものすごく言葉で書いてますが、これは関数を書くのがめんどいから、という理由だけではなく、機械学習という領域では、
**ここに入るのはこういう作用がある関数であると最低限言える必要はあるが、その詳細な形の最適解はとりあえず試してみないとわからん**
というマインドが重要だと思っているからです。わかりにくいだろうので※を例にすれば、とりあえずf(z)とg(z)の間の“距離（離れ具合）”と言える数なら、二乗誤差でなくても誤差の3乗でも何でもここに入りうると思っている方がいい、ということです。（この場合で3乗はセンス悪そうですけど）
自然現象を忠実に再現する必要のある自然科学とは違い、色んな関数形を試してみて最も精度が出たり早かったりするものが生き残ればいいというのが、機械学習の研究だと思っています。まあボトムアップに機械学習の理論的側面を構築していく研究もあり、そういった領域の方にはそぐわないマインドかもしれませんが。


##SHAP
ゲーム理論での“シャープレイ値”がもとになってできた手法らしい。大局的な特徴量重要度を推定する手法。
ゲームで言うプレイヤーを特徴量と考え、ある特徴量が推定に“参加”したときとそうでないときの予測値の変化を調べ、それを特徴量の重要度と考えます。ある特徴量が推定に参加しないことを、その特徴量をある固定値にすることで表現します。
加法性がある値であり、複数モデルのアンサンブル（線形）をした時も使用できます。


##その他
他手法、超絶簡単にお伝えいたします。
・Permutaion importance：ある特徴量について、全データでランダムシャッフルしたときの予測値の変化を特徴量の重要度と考えます。
・Partial Dependence Plot：ある特徴量の値を変えていき、予測値（複数データの平均でも取って）の変化をみてグラフ化します。１つの特徴量の中でも、小さい時のグラフの傾きの方が大きい、などが見れる。
・Tree Surrogate：決定木の代理モデルを考えます。同じインプットなら似ているアウトプットを出してくれるほどいい代理モデル、という最終出力しかみない雑さがある。代理モデルでの特徴量重要度と真の特徴量重要度が類似してると仮定する、ということ。もちろん木以外の代理モデルもある。
・Grad-CAM：CNNで使われる。出力に与えるその前のConv層の各セルからの影響の大きさは、出力を各Conv重みで偏微分したもの（誤差逆伝播で出す値）だという発想。特徴量マップのどこが重要かの可視化ができる。
・Integrated Gradients：NNで使われる。まず任意の固定値x'をとり、実データxをとってきたときのモデルの出力値をF(x)とする。パラメタa(0≦a≦1)を用いてx'とxを結ぶ直線をx'＋a(x'-x)と表し、F(x)の特徴量xiに対する偏微分値（誤差逆伝播でだす値）をこの積分経路で積分したものを、xiの重要度とする。(※投稿時点での理解。)
・Attention Map：Attenntion層で使われる。Attention層ですごい発火してるということはAttentionに値する領域だろうというトートロジー的発想（だと思っている）。これは今のところ“経験的に”正しい。




##各手法についての注意事項

かなり簡単にですが、分かった雰囲気を感じてもらえるよう説明しました。理解を深めるため、例えば以下のようなことが各手法ではどうなっているということか、まず自分で推理してみてから書籍の方など読んでいただけると、学習効率がいいかもしれません。
・特徴量同士の相互作用は考慮されているか？
・計算量は現実的か？
・1回計算するだけで安心な値か？（偶然大きくなりすぎたり小さくなりすぎる可能性がある値でないか？）

などなど。
　　
　　
AIの説明可能性については発展途上な研究領域ですが、ここでキーワードが出てきた手法はすでにライブラリ化もされたり、実務でも気軽につかるようになっているようです。（つまりちょっとだけ古い）
個人的に説明可能性は学問的にも興味がある領域なので、もう少し最新の論文解説などもまたさせていただくかもしれません。

ではまた、よろしくお願いいたします。