OmniAICreator/Qiita-1.07M huggingface dataset:
「アクティブ」アカウントのみを表示する検索フィルターがありますが、「非アクティブ」も表示され、「非アクティブ」アカウントを選択して保存できます。 

+ [Lookup Field Filter Question](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Peo8y)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/091e20ad-46eb-057b-afaf-8540e0dd0c3e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c8114438-4258-58bf-de68-8b7a85ba818a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/11fc6eaa-5ab6-db8b-99f4-091cee69db86.png)

ルックアップ フィルターを使用してのみ「アクティブ」アカウントを表示します。


画面の右上隅にある歯車アイコンをクリックして、「セットアップ」メニューに移動します。[ビルド] で [オブジェクト マネージャー] をクリックし、ルックアップ フィルターを作成するオブジェクト (この場合はアカウント オブジェクト) を選択します。[フィールドとリレーションシップ] で、フィルターを追加するルックアップ フィールド (たとえば、[親アカウント] フィールド) をクリックします。[ルックアップ フィルター] セクションまで下にスクロールし、[編集] をクリックします。フィルター条件で、「アクティブ」フィールド (またはアカウントがアクティブかどうかを示すフィールド) を選択し、演算子を「equals」に、値を「True」に設定します。フィルターを保存してアクティブにします。


ルックアップ フィルターが適用されると、ルックアップ フィールドにはアクティブなアカウントのみが表示されます。非アクティブなアカウントは除外され、オプションとして表示されません。
ruby/rails/nodebrew バージョン管理コマンド

# rubyのバージョン変更方法
利用中のrubyバージョン確認
```ruby -v```

インストール可能なrubyバージョン確認
`rbenv install --list`

目的のバージョンをインストール
`rbenv install 2.6.3`

利用するバージョンを変更
`rbenv global/local 2.6.3`

現在コンソール上で利用しているRubyバージョン確認
```rbenv versions```

# railsのバージョン変更方法
現在インストールされていて、使用できるRailsの確認
```gem list rails```

Railsの使用したいバージョンをインストール（使用したいバージョンが無かった場合）
```gem install rails -v 6.0.3```

バージョンを指定してプロジェクトを立ち上げる
```rails _6.0.6_ new sample_app```

# nodebrew
インストールできるバージョン一覧
```nodebrew ls-remote```

インストール
```nodebrew install-binary v0.10.38```

安定版インストール
```nodebrew install-binary stable```

最新版インストール
```nodebrew install-binary latest  ```

インストール済みのリスト
```nodebrew list ```

使用するバージョンの指定
```nodebrew use v0.8.28```

アンストール
```nodebrew uninstall <version>```

削除
```nodebrew clean <version>```
Git フェッチとプル

# テスト用環境の作成
最初に以下のコマンドでリポジトリをコピーし、自分のリポジトリにプッシュしてください。
```terminal
$ git clone https://github.com/Kasumin0123/git_test.git
$ cd git_test
$ git remote add myrepo <URL>
$ git push -u myrepo master
```

# リモートリポジトリを追加する
リモートリポジトリは複数登録することができる。
```terminal
$ git remote add <リモート名> <URL>
```

# リモートを確認する
```terminal
$ git remote
# リモート名のみが表示される

$ git remote -v
# リモート名と対応するURLが表示される
```

# リモートから情報を取得する
リモートから情報を取得するには
<ul>
    <li>fetch</li>
    <li>pull</li>
</ul>

の2種類の方法がある。
## fetch
```terminal
$ git fetch <リモート名>
```
試しに、`origin`にファイルを追加しよう。GitHubのサイトからリポジトリ（myrepo）を開いて、Add file > Create new fileを選択してファイルを作成する。ファイルには以下のように記述する。
```terminal:home.html
<p>home</p>
```
ファイルを作成したら、フェッチしよう。
```terminal
$ git fetch myrepo
```

フェッチが完了したら、以下のコマンドを打ち込んでみよう。
```terminal
$ git branch -a
* master
  remotes/myrepo/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/main
  remotes/origin/master
```
`remotes/myrepo/master`というブランチ（リモートブランチという）に、フェッチした内容が入っている。実際にファイルの中身を確認するため、以下のコマンドを入力してみよう。
```terminal
$ git checkout myrepo/master
Note: checking out 'remotes/myrepo/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 6419fe6 Create home.index
# ワークツリーが変更されたのでlsコマンドで確認する
$ ls
home.html  index.html
# home.htmlが追加されている。catコマンドで中身を見る。
$ cat home.html
<p>home</p>
```
\
では、元の状態に戻そう。
```terminal
$ git checkout master
Previous HEAD position was 6419fe6 Create home.index
Switched to branch 'master'
Your branch is behind 'myrepo/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)
```

最後に、取得してきたリモートリポジトリの情報をワークツリーに取り込んで終了しよう。
```terminal
$ git merge myrepo/master
Updating 2d5ae52..6419fe6
Fast-forward
 home.index | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 home.index
$ ls
home.html  index.html
# ファイルが追加されていることが分かる
```

## pull
```terminal
$ git pull <リモート名> <ブランチ名>

# これは下記コマンドと同じ
$ git fetch <リモート名>
$ git merge <リモート名>/<ブランチ名>

$ git pull origin master
# は、以下のように省略できる
# git pull
```

## fetchとpullの使い分け
pullは楽だが、プルしたブランチは今いるブランチに強制的にマージされるのでワークツリーがぐちゃぐちゃになる可能性がある。慣れるまではfetchしてからmergeするという手順を踏んだ方がいい。

# リモートの詳細情報を表示する
```terminal
$ git remote show <リモート名>
```

# リモート名の変更・削除
リモート名を変更するには以下のコマンドを使う。
```terminal
$ git remote rename <旧リモート名> <新リモート名>
```

リモートを削除するときには以下のコマンドを使う。
```terminal
$ git remote rm <リモート名>
```
AWS System Manager経由でWinSCPを利用するバッチ（MFA認証あり・Windows）

MFA認証ありの環境で、SSM (AWS System Manager)経由でWinSCPを使いたいという要望があり、試行錯誤してバッチ化できたのでメモ。

## 前提となる知識

https://dev.classmethod.jp/articles/how-to-use-winscp-with-ssm-session-manager/

https://dev.classmethod.jp/articles/temp-credentials-request-against-iam-user/

## 設定
セッショントークンを取得するためのIAM認証情報をcredentialsに記載する

```~/.aws/credentials
[my_account]
aws_access_key_id = xxx
aws_secret_access_key = xxx
```

接続ロールのIAM設定をconfigに記載する
```~/.aws/config
[profile my_role]
region = xxxxxxxxxxxxx
role_arn = arn:aws:iam::xxxxxxxxxxxx:role/xxx
source_profile = my_session
```


## バッチ
基本はJSONの取り回しをしやすいpowershellで作成し、AWS CLI実行時のみbatを呼び出す。（もっとスマートな方法があるかもしれません。）

### 本体powershell
```powershell:my_dir/save-session-token.ps1
$mfaSerialNumber = Get-Content var/mfa-serial.txt
"[MFAシリアル]$mfaSerialNumber"

$sessionTokenObj = 0

while (!$sessionTokenObj) {
    $mfaToken = 0
    while(!$mfaToken){
        $mfaToken =(Read-Host MFAトークンを入力してください)
    }
    Start-Process get-session-token.bat -ArgumentList "$mfaSerialNumber $mfaToken" -NoNewWindow -Wait -RedirectStandardError var/standard-error-get-session-token.txt -RedirectStandardOutput var/standard-output-get-session-token.txt
    $error = Get-Content var/standard-error-get-session-token.txt
    if (!$error) {
        $sessionTokenObj = Get-Content var/standard-output-get-session-token.txt | ConvertFrom-Json
        Copy-Item var/standard-output-get-session-token.txt var/session-token.json
        Start-Process set-aws-credential.bat -NoNewWindow -ArgumentList "aws_access_key_id $($sessionTokenObj.Credentials.AccessKeyId)"
        Start-Process set-aws-credential.bat -NoNewWindow -ArgumentList "aws_secret_access_key $($sessionTokenObj.Credentials.SecretAccessKey)"
        Start-Process set-aws-credential.bat -NoNewWindow -ArgumentList "aws_session_token $($sessionTokenObj.Credentials.SessionToken)"
        Start-Sleep -Seconds 3
        "新しいセッショントークンをcredentialsに設定しました"
    } else {
        $error
    }
}

"10秒後に自動でウィンドウを閉じます"
Start-Sleep -Seconds 10
exit
```

### MFA用シリアル設定

```my_dir/var/mfa-serial.txt
arn:aws:iam::xxxxxxxxxxxx:mfa/Xxxxxxxxx
```

### AWSコマンド実行bat

```my_dir/set-aws-credential.bat
aws configure --profile my_session set %1 %2
```

```my_dir/get-session-token.bat
@echo off
aws sts get-session-token --profile my_account --serial-number %1 --token-code %2 --duration-seconds 86400
```

オプションで有効期限を24時間(86400秒)としていますが、15分～36時間の間で指定できます。デフォルトは12時間。
```
 --duration-seconds 86400
```

### WinSCP設定
プロキシコマンドでmy_roleのプロファイルを指定します。
my_roleで接続するときに一時的な認証情報であるセッショントークンを使用します。
```
aws ssm start-session --target %host --document-name AWS-StartSSHSession --parameters "portNumber=%port" --profile "my_role"
```

## 接続
本体powershellを起動するとMFA認証コードを聞かれるので入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20427/b888f4bb-c97d-4b8b-26ee-a14a867029fe.png)

セッショントークン取得に成功したらcredentialsに登録されます。
```~/.aws/credentials
[my_account]
aws_access_key_id = xxx
aws_secret_access_key = xxx
[my_session]
aws_access_key_id = get-session-tokenで取得した値
aws_secret_access_key = get-session-tokenで取得した値
aws_session_token = get-session-tokenで取得した値
```

これでWinSCPで接続できます。
【ServiceNow】Utahリリース　あるアクションを使用しているフローを一覧表示する（Flow Designer）

Utahへのバージョンアップで新規追加された機能についてまとめます。

Flow Designerで実装したアクションを使用しているフローを一覧表示できるようになりました。
これにより、バグ調査や機能改修をしたい場合の影響範囲調査が楽になります。

https://docs.servicenow.com/bundle/utah-build-workflows/page/administer/flow-designer/task/see-related-flows-for-action.html


## 事前準備
プラグインのインストール等の事前準備は不要です。
flow_designer または adminロールが付与されているユーザで利用可能です。

## 操作手順
1.対象のアクションを開き、画面右上のボタンをクリック、「関連フローを表示」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/1276aed4-ccff-7dd2-f3ef-e960dd8aa835.png)

2.関連フローとしてアクションを使用しているフローとサブフローがリストに表示されます。
アクティブ化されているフローはリストの右側に「アクティブ」がついています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/e0959dd8-4d1c-573e-b2ec-4df784e43ea4.png)

## 終わりに
以前投稿したフローのサブフロー化の機能に加えて便利な機能が追加されました。

https://qiita.com/sakuma-iho/items/4912aa30a94117f3a567

作成したアクションを複数のフローやサブフローで使用することは往々にしてあることと思います。
バグ調査や機能改修をしたい場合の影響度調査に役立つこと間違いなしですね。
インデックスの考え方の違和感

この記事はお気持ち表明です。

# 取り上げたいこと

文字列内の文字や配列の要素を指定するために使用する「インデックス」を、「文字（要素）の位置」と考えるのをやめたらどうか、という話。

## 単一要素を示す場合のインデックスの考え方

一般的には、以下のように「インデックス」は「文字（要素）の位置」と説明される。
### 文字列
```java
String str = "にわとりがにわ";
```
|インデックス|0|1|2|3|4|5|6|
|-|-|-|-|-|-|-|-|
|文字|に|わ|と|り|が|に|わ|

### 配列
```java
String[] ary = {"オレンジ", "りんご", "いちご"};
```
|インデックス|0|1|2|
|-|-|-|-|
|要素|オレンジ|りんご|いちご|

単一の文字（要素）を示す場合、この考え方で難なく理解できる。
まったくおかしなところはない。

## 範囲を説明する場合のインデックス（開始・終了位置）の考え方

これは、APIの設計指針に関する内容となる。

範囲を指定させるAPIの場合、以下の2つのパターンをよく見る
1. 開始位置と終了位置を指定する
    * JavaのString.substringやPythonなどのsliceなど
1. 開始位置と要素数を指定する
    * C#のString.IndexOfなど 

特に前者「開始位置と終了位置を指定する」において、指定されたインデックス（が指す要素）を含むのか含まないのか、開始位置と終了位置とで異なる。
たいていは、開始位置は含み終了位置は含まない。
しかし、両方「含む」とするAPIもある（あったと思う）。
そのため、範囲を示す場合には、「インデックス＝要素」という考え方だと、「含む含まない」も考えなければいけないので、若干わかりづらいと思う。

### 開始位置と終了位置を指定する
たとえばJavaのString#substring
開始位置は、含む。
終了位置は、含まない。
[Javadoc](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#substring-int-int-)にもわざわざそう書いてある。

```java
String str = "にわとりがにわ";
System.out.println(str.substring(1, 4)); // わとり
```
|インデックス|0|1|2|3|4|5|6|
|-|-|-|-|-|-|-|-|
|文字|に|**わ**|**と**|**り**|が|に|わ|

### 開始位置と要素数を指定する
たとえば C#のStirng#IndexOf
開始位置は、含む。
文字数は、含む含まないは関係ない。
（含む含まないで悩む必要がないので、開始位置と終了位置を指定するよりも、わかりやすいと思っている）

```C#
// String.IndexOf(string value, int startIndex, int count)
var str = "にわとりがにわ";
Console.WriteLine(str.IndexOf("にわ", 1, 3)); // -1
```
|インデックス|0|1|2|3|4|5|6|
|-|-|-|-|-|-|-|-|
|文字|に|**わ**|**と**|**り**|が|に|わ|
|文字数||1|2|3||||

## 持論: 「インデックス＝要素の隙間」
```java
// 再掲
String str = "にわとりがにわ";
System.out.println(str.substring(1, 4)); // わとり
```
|インデックス|0||1||2||3||4||5||6||
|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
|文字||に||**わ**||**と**||**り**||が||に||わ|

インデックスとは、要素の位置を示すのではなく、要素の隙間（開始位置）を示すと考える。
インデックスをこのように捉えていると、substring に指定する「1から4」とは、1～4の間の要素（わとり）となり、含む含まないを考慮しなくてよくなり、スッキリ。
と常々思っているのだけど、こういう説明をあまり見たことがない。

要素1つを指す場合（array[0]）は、便宜上、終了位置が省略されているのであり、開始位置から1つ分の内容を指していると考えられるので矛盾はない。

## 余談
記事を書くに至った動機は、C#のString.LastIndexOf
これは、持論では説明できず、「要素位置＝インデックス」でないと解釈できないAPI。

```C#
// String.LastIndexOf(string value, int startIndex, int count)
// value: 見つけたい語
// startIndex: 開始位置
// count: 文字数

var str = "にわとりがにわ";
Console.WriteLine(str.LastIndexOf("にわ", 5, 5)); // -1
```
LastIndexOfは「開始位置」の文字を含んで、先頭方向に「文字数」分を検索対象にする。
位置5の「に」を含みつつ5文字戻って位置2の「わ」まで（わとりがに）が検索範囲となり、「にわ」は存在しないことになる。
|インデックス|0|1|2|3|4|5|6|
|-|-|-|-|-|-|-|-|
|文字|に|**わ**|**と**|**り**|**が**|**に**|わ|


開始位置は「含まれる」のが一般的な考え方なので全然おかしくはないのだが、
↓のような挙動を期待していて、つまづいた。
|インデックス|0||1||2||3||4||5||6||
|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
|文字||**に**||**わ**||**と**||**り**||**が**||に||わ|
ClamAV起動時に出るLibClamAV Warning: Don't know how to create filter for: Win.Downloader.LNKAgent-10001628-0について

ClamAVはサーバー上でも使えるオープンソースのウィルスチェックソフトです。
ClamAVをアップデート後に起動した時、Warningがでるようになったため調べました。
誰かの参考になれば嬉しいです。

# 結論

今後のアップデートで解消する見込み。
ClamAV 1.1.1、1.2.0 で警告を削除されるようです。

# エラーメッセージ

```
service clamd.scan start

clamd.scan を起動中: LibClamAV Warning: Don't know how to create filter for: Win.Downloader.LNKAgent-10001628-0
LibClamAV Warning: cli_ac_addpatt: cannot use filter for trie
[  OK  ]
```

# 公式メーリングリスト

https://www.mail-archive.com/clamav-users@lists.clamav.net/msg52685.html
> It appears that this warning was added by accident while fixing a bug shortly 
before release and no one noticed in review.  We'll remove the warning in 1.1.1 
and 1.2.0.
> 
> Sorry for the confusion!

(翻訳)
この警告は、間もなくバグを修正する際に誤って追加されたようです
発売前なのにレビューでは誰も気づかなかった。 1.1.1 では警告を削除します。
そして1.2.0。

混乱させて申し訳ありません！
Node.jsでSHA-256でハッシュ化した文字列をPHPでチェックする

# 概要

- jsで文字列「foobar」をSHA-256アルゴリズムを用いてハッシュ化し、PHPでハッシュ化された文字列と文字列「foobar」が一致するか確認する方法をまとめる。

# ユースケース

- lambda関数からPHP/Laravelで作られたエンドポイントにリクエストを送る際に文字列「foobar」をリクエストヘッダで送りたい。
- 文字列「foobar」はlambda関数のjsでSHA-256でハッシュ化され、axiosでリクエストヘッダに格納されリクエストが投げられる。
- PHP/Laravelでは平文の文字列「foobar」を.envなどで保持する。受け取ったリクエストのリクエストヘッダからハッシュ化されたAPIキーを受け取り、文字列「foobar」と比較し一致していたら「valid!」と、一致しなかったら「invalid!」とechoする。

# この記事でやること

- ランタイムNode.js18のlambda関数で文字列「foobar」をcryptoモジュールでSHA-256でハッシュ化する。
- ハッシュ化した文字列をconsole.logで出力する。
- 出力されたハッシュ化された文字列を手動でコピーする。
- PHPがブラウザで動作する下記サービスを使って、確認用コードを記載し、ハッシュ化した文字列と平文の「foobar」が一致することを確認する。

https://paiza.io/ja/projects/new

# 方法

1. ランタイムNode.js18のlambda関数を作成する。
1. cryptoモジュールをlambdaレイヤーに登録し、作成した関数に紐付ける。
    1. 任意のモジュールをlambdaレイヤーに登録する方法はこちら → [lambda レイヤーを作成しよう（Node.js18）](https://qiita.com/miriwo/items/e1b6cdb8fd765e46f6c4)
1. lambda関数に下記の内容を記載し、保存 → Deployする。

    ```index.mjs
    import crypto from "crypto";
    
    const hash = crypto.createHash('sha256');
    hash.update('foobar');
    const hashedData = hash.digest('hex');
    
    console.log(hashedData);
    
    export const handler = async(event) => {
        // TODO implement
        const response = {
            statusCode: 200,
            body: JSON.stringify('Hello from Lambda!'),
        };
        return response;
    };
    ```

1. lambdaのHello-Worldテストを定義する。
1. lambda関数をHello-Worldテストを実行して動かす。
1. 「Execution results」のタブに「foobar」をSHA-256アルゴリズムでハッシュ化した文字列が出力されていることを確認する。

    ![crypt_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9b526af3-9181-abfe-ae86-d9a3d696f3c1.png)

1. 下記を開く
    1. [paiza.IO](https://paiza.io/ja/projects/new)
1. PHPを開き、下記のコードを記載する。（SHA-256でハッシュ化された値は`password_verify()`メソッドなどではチェックする事ができない。そのため、PHP側でもハッシュ元の文字列をSHA-256でハッシュ化し、`===`を用いた厳密比較で整合性をチェックする）

    ```PHP
    <?php
    
    $str = 'foobar';
    $hash = 'jsでfoobarをSHA-256でハッシュ化した文字列';
    
    $calculatedHash = hash('sha256', $str);
    
    if ($calculatedHash === $hash) {
        echo 'valid!';
    } else {
        echo 'invalid!';
    }
    
    ?>
    ```

1. 「jsでfoobarをSHA-256でハッシュ化した文字列」の部分にlambdaの「Execution results」のタブに「foobar」をSHA-256アルゴリズムでハッシュ化した文字列が出力されているのでコピーして貼り付ける。

    ![crypt_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d75f906a-e333-dc0a-5d2f-67250306a24c.png)

1. 筆者の場合貼り付けた後のPHPのコードは下記のようになる。

    ```php
    <?php
    
    $str = 'foobar';
    $hash = 'c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2';
    
    $calculatedHash = hash('sha256', $str);
    
    if ($calculatedHash === $hash) {
        echo 'valid!';
    } else {
        echo 'invalid!';
    }
    
    ?>
    ```

1. 上記を実行すると「valid!」と出力されたのでチェックが通ったことになる。
lambda レイヤーを作成しよう（Node.js18）

# 概要

- AWS lambda（Node.js）のレイヤーを追加する方法を簡単にまとめる。

# 前提

- ローカルPCでnpmコマンドが実行できること。
- lambdaのレイヤーを新規作成する権限を持ったAWSアカウントをもっていること。

# 方法

- ローカルPCの任意の階層に「nodejs」というディレクトリを作成する。
- 「nodejs」ディレクトリに移動する。
- `$ npm init -y`を実行する。
- `$ npm install モジュール名`を実行して、レイヤーに登録したいモジュールをインストールする。
- 「nodejs」ディレクトリの1階層上のディレクトリに移動する。
- 下記コマンドを実行して「nodejs」ディレクトリをzip化する。

    ```shell
    zip -r nodejs.zip nodejs
    ```

- lambdaのレイヤーの画面に移動する。
- 「レイヤーの作成」をクリックする。
- 任意の名前を記載する。（筆者はわかりやすく「ランタイム名」 + 「モジュール名」などにしている。例： Node.js18でaxiosモジュールを使うときは「nodejs18_axios」）
- アップロード種別は「.zipファイルをアップロード」を選択する。
- 「アップロード」をクリックし、先にzip化した「nodejs.zip」をアップロードする。
- 互換性のあるアーキテクチャは「x86_64」にチェックを入れる。
- 互換性のあるランタイムオプションは「Node.js 18.x」を選択する。
- 「作成」をクリックする。
- レイヤーの作成終わり。
rex0220 算式自動採番プラグイン 年度別採番

[rex0220 算式自動採番プラグイン](https://qiita.com/rex0220/items/2e40a57d2d08023affde)で、年度別に自動採番する例です。
４月始まりや月途中始まりなどの採番方法に対応できます。

# 概要

[rex0220 算式自動採番プラグイン](https://qiita.com/rex0220/items/2e40a57d2d08023affde)：　計算式で番号を組み立てる自動採番プラグインです。

- ４月始まりの年度別に自動採番例
![2023-05-16_15h12_58.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8e91799d-66c2-13f7-b847-fddce03ba4de.gif)
![2023-05-15_17h32_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/afaa3b74-5de3-6e70-cbbe-eab08573cafe.png)
![2023-05-15_18h04_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0e7ecd14-2593-94fd-09fd-079aca8c41a8.png)

- 月途中始まりの年度別自動採番； 6月10日から採番の例
![2023-05-16_14h44_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d2a27be2-8620-d1e3-07df-bd6684305243.png)
![2023-05-15_18h06_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0ef6859e-9860-5634-5cb9-883c3eea0ae2.png)


# ４月始まりの年度別に自動採番例

## フォーム設定
区分・日付・番号の他に、算式自動採番プラグインで使用する採番キー・連番を配置します。
※採番キー・連番は、連番の最終レコードを抽出するために使用します。
　kintone REST API のレコード検索では、単語検索になるため、A001, B001, A002, B002 のレコードから「A で始まる最終番号」の指定が出来ない

![2023-05-16_14h45_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5b52cba7-349a-7a39-30bb-d475888f0871.png)

## プラグイン設定

- 採番項目：　番号
- 採番　計算式： 区分&DATE_ADD(日付,-3,"month","YYYY")&"-@@@@@"
    - 年度：日付から３ヶ月前の年を算出
- 採番キー項目：　採番キー
- 連番項目：　連番
- 連番初期値：　1

![2023-05-16_14h46_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b6b74e6c-32d4-4afc-0ae1-5203bee9d61e.png)

## 採番後のレコード

- 2022年度：１～３月は、３ヶ月前の年計算で、2022 年度になる
![2023-05-17_08h55_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b8104830-90d7-0915-d97d-57db4ba72cfe.png)

- 2023年度： ４～１２月は、３か月前の年計算でも、2023 年度
![2023-05-17_08h52_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/36d3715c-f98a-42c4-12bf-bb4a0db9a51b.png)

# 月途中始まりの年度別自動採番； 6月10日から採番

## フォーム設定
４月始まりの年度別に自動採番例と同じ
![2023-05-17_09h25_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/98029c6f-c3b1-75fb-82b2-328b0b205bb6.png)

## プラグイン設定

- 採番項目：　番号
- 採番　計算式： 
    - 区分&DATE_ADD(日付,
IF(DATE_FORMAT(日付,"MMDD")<"0610",-1,0),
"year","YYYY")&"-@@@@@"
    - 年度："0610" の前は、-1 年。以降はそのまま
- 採番キー項目：　採番キー
- 連番項目：　連番
- 連番初期値：　1

![2023-05-17_09h27_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d69e36f3-f239-50b8-3062-2b70930ca988.png)

## 採番後のレコード

- 2022年度：６月９日までは、-1 年計算で、2022 年度になる
![2023-05-17_09h30_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/71797ff7-cf26-f895-f5de-63332ae60109.png)

- 2023年度：６月１０日以降は、2023 年度になる
![2023-05-17_09h30_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7d662238-ce15-d32c-b2ca-e758eec74d22.png)
【Github Actions】 PullRequestトリガー時にdiffのファイルリスト見て何かしたい

作業メモですが情報がなかったので備忘録

# 課題感

- PR作成時にPRのFile Changedタブに表示されるファイルリストがほしい
    - headで触ったファイルのみにdiffがでる
    - headにbaseブランチをマージしてもdiffがでない
        - コンフリクト解消を除く
    - baseブランチにコミットが追加されてもdiffが増えない
- Githubのcheckoutは基本 shallow clone（depth=1でとってくる）で、cloneに時間のかかるツリーを使った比較はしたくない
    - 3点ドット（ `git diff branchA…branchB`）を使うとツリー上の2ブランチの共通の親コミットまで遡って`branchB`とのdiffをだしてくれるが、2ブランチが互いの共通コミットまで深くfetchする必要がある（baseブランチの共通コミットまでの深さは追えない）
    - つまり2点のコミット間の比較にしたい

https://yakst.com/ja/posts/4116

        

### このメモでの言葉の使い方
- baseブランチ: PRの向き先
- headブランチ: PRの指定ブランチ

# ほぼやりたいこと

全体方針は良いがやりたい要件には少し合わなかった

https://qiita.com/osakiy/items/0e18eee444446307b970

## 必要なこと

- PR作成後、baseブランチに変更が入るとdiffにどんどん追加されていく
    - `github.event.pull_request.base.sha` か `github.sha`のどちらかが片方しか更新されてない

# 参照できる変数

説明はみれるが具体的にどのタイミングの何を指してるかがわかりづらい

https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#pull_request

## 検証した結果
### `github.sha`

Githubが作成するPRのマージブランチ（baseブランチの最新にheadブランチをマージしたブランチ）の最新コミット。参照するごとに更新されていて常にbaseの最新を向いてる

- `refs/remotes/pr/*/merge` ブランチのHEAD

### `github.event.pull_request.base.sha`

**PR作成時のbaseブランチの最新コミット**（用途がわからん、バグ？）

参照ごとに更新されるわけでも、baseブランチとheadブランチの共通の親コミットでもないので今回のユースケースに利用すべきではない

### `github.event.pull_request.head.sha`

baseブランチの最新コミット、常に更新される

- `refs/remotes/pr/*/head`ブランチのHEAD

# 解決策

`github.sha`とbaseブランチ（ `github.event.pull_request.base.ref`からdepth: 1でとってくる）の２点を比較する

- `github.sha`のマージブランチへのマージコミットの前後を比較する
    

# 実際のワークフロー

```yaml
steps:
  # baseブランチの最新のコミットの取得
  # 公式のaction使った方が早いらしい
  # https://qiita.com/osakiy/items/0e18eee444446307b970
  - name: Fetch Base Branch Latest Commit
    uses: actions/checkout@v3
    with:
      ref: ${{ github.event.pull_request.base.ref }}
      fetch-depth: 1

  # マージブランチのチェックアウト（デフォはgithub.shaに向いてる）
  - name: Checkout Pull Request
    uses: actions/checkout@v3

  - name: Notice diff files
    id: skip-test
    run: |-
      diff=$(git diff --name-only origin/${{ github.event.pull_request.base.ref }}..${{ github.sha }})
      echo "::notice diff: $diff"
```
【良いコード悪いコードで学ぶ設計入門】5章メモ　

現在、設計やリファクタリングの勉強のためにミノ駆動本([良いコード悪いコードで学ぶ設計入門](https://gihyo.jp/book/2022/978-4-297-12783-1))を読んでいます。

各章、セクションのなかで特に気になった部分を中心にQiitaへアウトプットしていきたいと思います。

## 5.5　多すぎる引数

1つのメソッドに与える引数が多すぎるコード
→処理させたい内容が膨らむ
→ロジックが複雑化する、重複コードが増える可能性が増える

(例)
```java

class RecoverMagicPointMethod {

  int recoverMagicPoint(int currentMagicPoint, int originalMaxMagicPoint, List<Integer> maxMagicPointIncrements, int recoveryAmount) {
    int currentMaxMagicPoint = originalMaxMagicPoint;
    for (int each : maxMagicPointIncrements) {
      currentMaxMagicPoint += each;
    }
    return Math.min(currentMagicPoint + recoveryAmount, currentMaxMagicPoint);
  }
}


```

### プリミティブ型執着

プリミティブ型執着とは、boolean,int,float,double,Stringのような
プログラミング言語が標準で用意しているプリミティブ型だけで
構成されるコードのこと

#### (Before)

```java

class Common {
  int discountedPrice(int regularPrice, float discountRate) {
    if (regularPrice < 0) {
      throw new IllegalArgumentException();
    }
    if (discountRate < 0.0f) {
      throw new IllegalArgumentException();
    }
    return 0;
  }
}

```

### 改善案

プリミティブではなくクラスの型を渡す
Beforeと異なり、引数もクラスになっている
各クラスに関連の高いロジックが凝集する

#### (After)

```java

class DiscountedPrice {
  final int amount;
  DiscountedPrice(final RegularPrice regularPrice, final DiscountRate discountRate) {
    // regularPriceとdiscountRateを使った計算
    amount = 0;
  }
}

```

### 意味のある単位ごとにクラス化する

引数の増加を防ぐために、概念的に意味のあるクラスを作成することを意識する。
以下は、魔法力に関するクラス。

```java
/** 魔法力 */
class MagicPoint {
  private int currentAmount;
  private int originalMaxAmount;
  private final List<Integer> maxIncrements;
}
```

魔法力に関するロジックもカプセル化してここに定義してみる。
インスタンス変数はprivate化しておく（他のクラスから余計なことをさせないように）

```java
/** 魔法力 */
class MagicPoint {
  private int currentAmount;
  private int originalMaxAmount;
  private final List<Integer> maxIncrements;

  // 省略

  MagicPoint() {
    originalMaxAmount = 100;
    maxIncrements = new ArrayList<>();
  }

  /** @return 現在の魔法力残量 */
  int current() {
    return currentAmount;
  }

  /** @return 魔法力の最大量 */
  int max() {
    int amount = originalMaxAmount;
    for (int each : maxIncrements) {
      amount += each;
    }
    return amount;
  }

  /**
   * 魔法力を回復する
   * @param recoveryAmount 回復量
   */
  void recover(final int recoveryAmount) {
    currentAmount = Math.min(currentAmount + recoveryAmount, max());
  }

  /**
   * 魔法力を消費する
   * @param consumeAmount 消費量
   */
  void consume(final int consumeAmount) {
    // 省略
  }
}

```

#### クラス図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373975/e740b56b-033e-fce0-0bd0-60da3cf2c65f.png)




## まとめ

・引数が多い場合は、データを引数として扱うのではなく、データをインスタンス変数と
して扱う設計を意識する

・プリミティブ型はなるべく使わずにクラスの型を渡すようにする


## 参考文献
良いコード悪いコードで学ぶ設計入門
https://gihyo.jp/book/2022/978-4-297-12783-1
モデルに新規データを当てはめて予測（スコアリング）する(SPSS Modeler データ加工逆引き9-16)

# モデルに新規データを当てはめて予測する（スコアリング）

![スクリーンショット 2023-05-01 15.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3f22122e-3803-cb70-0a24-34d5b3667b87.png)


## 1.想定される利用目的

・作成した予測モデルに新しいデータを適用する

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/scoring_new.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2023-05-01 15.16.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/54b5fa61-1911-8de7-23aa-f79cd897e8e2.png)

### 予測モデルを作成する

a.モデル学習用データは以下の通りです。自動車のスペックデータです。

![スクリーンショット 2023-05-01 15.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1107a9d8-1861-b18e-d79f-c076c7cceee4.png)

b.[データ型]ノードを編集します。馬力を[対象]にして予測します。
![スクリーンショット 2023-05-01 15.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f3f07ea5-10e0-da74-cd52-702fa5cbcfc3.png)

c.[ニューラルネット]ノードを実行します。

d.[ニューラルネット]モデルナゲットが作成されました。
![スクリーンショット 2023-05-01 15.36.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/70e05581-1b23-5f67-04f4-b502ac8be798.png)

e.[テーブル]ノードを表示します。学習データに馬力を予測するフィールドが追加されました。

![スクリーンショット 2023-05-01 15.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d942c0db-9924-fbc2-132f-b444bf0ca003.png)

### 予測モデルを新規データに適用する

f.新規データは以下の通りです。馬力以外の入力フィールドを保有しています。

![スクリーンショット 2023-05-01 15.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2fa614e2-f6a8-05db-552b-f46c221fe9c6.png)

[テーブル]を実行します。
![スクリーンショット 2023-05-01 15.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4f5f3d99-a714-bc87-adc1-2d84c36a664e.png)

#### 注意事項

モデルを作成するのに使用した特徴量は全てインプットにする必要があります。

大規模データへのスコアリングにはモデルナゲットでSQLオプションを利用します。

![スクリーンショット 2023-05-01 15.11.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/377e8c69-50f5-64d3-ca95-f01903f92fd6.png)

## 4.参考情報

#### CADSを用いたスコアリングについて説明する記事

https://qiita.com/kawada2017/items/22373a49cbf7c3da9f38

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
AWS User Notifications を試してみた

# AWS User Notifications とは何か？
通知を一元設定で出来るサービスのようです。(文面だけではよく分からないですね)
https://docs.aws.amazon.com/ja_jp/notifications/latest/userguide/what-is-service.html
![2023-05-17_083318.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/9843a7a9-eddc-b0dd-65d2-3fbb7c3a217e.jpeg)

# AWS User Notifications の料金は？
無料のように読み取れます。
https://aws.amazon.com/jp/about-aws/whats-new/2023/05/aws-user-notifications-available/
![2023-05-17_083607.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/a578ce9e-5eb4-3800-c735-bc20e4fc4099.jpeg)

# AWS User Notifications の設定画面
今回は AmazonGuardDuty の重要度 高(High) を検知した場合の通知を実装してみます。
1. 細かい所は省略していますが、AmazonEventBridge で設定するようなイベントルールを設定します。
![aws1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/ee946b21-1a7c-c8d2-c606-85ade241fdf6.jpeg)

2. 次は宛先を設定します。今回はメールを指定してみました。
![aws2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/85726499-1dff-594a-fe09-f943707ac6ff.jpeg)

# AWS User Notifications のメール文面
AmazonGuardDuty のテストアラートを発生させて受信したメール文面です。
必要最低限の内容で分かりづらいという印象ですね。
![mail1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/2020f773-ad54-58b5-8027-60aa2b5cbfcc.jpeg)

# AWS User Notifications のメール文面のカスタマイズ
メールの件名や文面の変更は、現時点では出来ないようです。
https://aws.amazon.com/jp/notifications/faqs/
![2023-05-17_085331.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/12c5c2a4-5fda-b614-097b-8bb9c5a993a2.jpeg)

# AWS User Notifications 実装後の各AWSサービス
今回やっている内容は AmazonEventBridge のルール設定、AmazonSNS の宛先設定なのでは？と思い各サービスを確認してみました。
AmazonEventBridgeでは想定通り、設定したルールが自動反映で作成されていました。
AmazonSNSでは想定と異なりトピックやサブスクリプションは作成されていませんでした。
![2023-05-17_085525.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/63429bd5-52fe-9d41-e948-b702ede0f560.jpeg)

# AWS User Notifications での表示画面
メール通知で届いたような簡易な内容が表示されました。
画像3枚めの右上にある「詳細を表示」を選択すると、AmazonGuardDuty の画面に遷移しました。
![画面1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/f8745d86-aa4d-5e0f-6570-6e7a07d6a113.jpeg)
![画面2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/06669a49-6647-bac9-8ddb-dfaa5f3a4d77.jpeg)
![画面3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/5b17a011-e48e-b119-a40d-dfd1bce0c362.jpeg)

# 所感
本来同じことをやりたい場合、AmazonEventBridgeでのルール設定、AmazonSNSの宛先が必要になります。
その場合、設定者以外の方は各サービスの繋がりが分かりづらいというデメリットがありました。
AWS User Notifications では1つの画面で全て完結できるので、慣れていない方には非常に簡単に設定もでき管理もしやすいツールなんじゃないかと思いました。
通知内容の自由度がないので、AWSに慣れている方は使わないんじゃないかと思いましたが、通知内容もカスタマイズ出来るようになったら是非利用したいサービスです。
Pythonのexceptで丁寧にtracebackを表示する

ちゃお…†
まいおり…†

Pythonで例外をcatchした際に`except`節で例外の詳細を表示したいときってありますよね？そんなときは以下のコードをコピペしてください！

```python
import traceback
import re
import sys

try:
    pass  # ここに何か処理を書く
except Exception as e:
    error_class = type(e)
    error_description = str(e)
    err_msg = '%s: %s' % (error_class, error_description)
    print(err_msg)
    tb = traceback.extract_tb(sys.exc_info()[2])
    trace = traceback.format_list(tb)
    print('---- traceback ----')
    for line in trace:
        if '~^~' in line:
            print(line.rstrip())
        else:
            text = re.sub(r'\n\s*', ' ', line.rstrip())
            print(text)
    print('-------------------')
```

以下は`try`節に `a = 1 / 0` と書いて実行した時の標準出力です。
```python
<class 'ZeroDivisionError'>: division by zero
---- traceback ----
  File "/private/tmp/example.py", line 6, in <module>
    a = 1 / 0
        ~~^~~
-------------------
```
これでゼロ除算が起きてるのがファイルの6行目だとわかりますね。

もちろん`print`関数じゃなくてloggerに出力させたりお好みにカスタマイズしてお使いください！

みんな終電大丈夫？
pythonでAzure MonitorのLog Analyticsにクエリを実行してログを取得するサンプル

# 概要
- pythonでAzure MonitorのLog Analyticsにクエリを実行してログを取得する
- 参考資料
https://learn.microsoft.com/ja-jp/python/api/overview/azure/monitor-query-readme?view=azure-python

# 環境
pipenv を使った python3.11 で確認

# 事前準備
- 取得する Log Analytics ワークスペースの `ワークスペースID` を控えておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/f1c84cd5-5f37-3cde-aca5-8d964bee0a93.png)

# ライブラリ
```
[packages]
azure-loganalytics = "*"
azure-monitor-query = "*"
azure-identity = "*"
pandas = "*"
```
- pip などでインストール 

# サンプルコード
コメント部分を修正して実行する
```python
import pandas as pd
from datetime import datetime, timezone
from azure.monitor.query import LogsQueryClient, LogsQueryStatus
from azure.identity import DefaultAzureCredential
from azure.identity import AzureCliCredential
from azure.core.exceptions import HttpResponseError

# Azure CLI で az login した認証情報を使う
credential = AzureCliCredential()  # DefaultAzureCredential()
client = LogsQueryClient(credential)

# 発行するクエリを指定
query = "AppServiceConsoleLogs | where _ResourceId contains 'xxxxxxx'"

# ワークスペースID を指定
LOG_WORKSPACE_ID = "xxxx-xx-xx-xxx-x"

# 取得期間を指定
start_time = datetime(2023, 4, 1, tzinfo=timezone.utc)
end_time = datetime(2023, 10, 1, tzinfo=timezone.utc)

try:
    response = client.query_workspace(
        workspace_id=LOG_WORKSPACE_ID, query=query, timespan=(start_time, end_time)
    )
    if response.status == LogsQueryStatus.PARTIAL:
        error = response.partial_error
        data = response.partial_data
        print(error)
    elif response.status == LogsQueryStatus.SUCCESS:
        data = response.tables
    for table in data:
        df = pd.DataFrame(data=table.rows, columns=table.columns)
        # 取得内容をとりあえず出力
        print(df)
except HttpResponseError as err:
    print("something fatal happened")
    print(err)
```

# 未確認・今後の課題
- 大量のデータ担った場合、そもそも取得できるか?
    - 処理速度はどれくらいか?
【学習】Ruby on Rails チュートリアル 第7版 - 第6章 ユーザーのモデルを作成する

5/17 8:20開始


rails console --sandbox
→サンドボックスモード：セッションで行ったデータベースへの変更をコンソールの終了時にすべて “ロールバック”する。

valid?メソッド
→オブジェクトが有効かtrue/falseで評価する。
※invalid?メソッドはその逆

6.1まで終了

5/17 9:00 終了


5/18 8:15 開始

・modelのテスト
*model作成時に↓にテストファイルが作成される。
test/models/user_test.rb

*setupメソッド
setupメソッド内に書かれた処理は、各テストが走る直前に実行される。

インスタンス変数でも、setupメソッド内で宣言しておけば、
すべてのテスト内でそのインスタンス変数が使えるようになる。

*正規表現
Rubular↓で対話的に正規表現を試せる。
https://railstutorial.jp/chapters/modeling_users?version=7.0#code-better_email_regex

6.2.4まで終了

5/18 9:10 終了


5/18 18:30 開始

*dup:同じ属性を持つデータを複製するためのメソッド。

*一意性のテスト
メールなど大文字と小文字を区別しないでテストしたい場合...
↓とすることで実現できる。
app/models/user.rb
uniqueness: { case_sensitive: false }

*データベースのレベルで一意性を保証
データベース上の一意性を保証したいカラムにインデックス（index）を追加し、
そのインデックスが一意であるようにする。

具体的には...
マイグレーションでインデックスを追加する。

$ rails g migration add_index_to_users_email
↓のマイグレーションファイルが作成される。
db/migrate/[timestamp]_add_index_to_users_email.rb

add_indexメソッドを使用し、インデックスを追加する。
(usersテーブルのemailカラムにインデックスを追加。オプションでunique: trueで一意にする。)
class AddIndexToUsersEmail < ActiveRecord::Migration[7.0]
  def change
    add_index :users, :email, unique: true
  end
end


6.2まで終了


5/18 19:15終了


5/19 8:15 開始

・セキュアなパスワード
→ハッシュ化したものをデータベースに保存する。
ハッシュ化：ハッシュ関数を使って、入力されたデータを不可逆データ（復元不可能なデータ）に変換する処理を指す。

ログイン時は、「ハッシュ化して保存されたパスワード」と「入力したパスワードをハッシュ化した値」を比較する。
→ハッシュ化されたパスワード同士を比較することで、生のパスワードをデータベースに保存するという危険なことを回避する。

具体的には....

model内にhas_secure_passwordメソッドを追加する。

*セキュアにハッシュ化したパスワードを、データベース内のpassword_digest属性に保存できる。

*2つの仮想的な属性（passwordとpassword_confirmation）が使えるようになる。また、存在性と値が一致するかどうかのバリデーションも追加される。

*authenticateメソッドが使えるようになる（引数の文字列がパスワードと一致するとUserオブジェクトを返し、一致しない場合はfalseを返すメソッド）。

※↑を使えるようにするためには...
 モデル内にpassword_digest属性が含まれていること
 bcryptライブラリをGemfileに追加する

6章終了!

5/19 9:10 終了
[自分用]Next.jsのcss modules

## なぜcss modulesを使うのか
css modulesを使用するとcssの管理が容易になる。
例えば、大規模アプリ開発をするときにクラスの命名被りを無くすことができる。

そして何より、Next.jsを使用していると特別な設定が不要でcss modulesを使用することができる。

## globals.css
コンポーネントではなく全体的に指定したい場合は、globals.cssに記述をする。
そして_app.js（アンストアップ）で呼び出す必要がある。
フローを使って連番を取得する

[Flowに関するまとめページに戻る](https://qiita.com/Keiji_otsubo/items/55ebc9c634a3216f3990)

--------------

以下の質問用に私の練習としてフローを作ってみました。

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000QKUErSAP


# 全体のイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/97786c9c-5c09-8801-0de0-2636121c20e6.png)

# 数式　varMax2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/aa04f45a-b910-afee-094d-c298fe5ef334.png)

```
IF( ISBLANK({!getRecord.serialNumberForFlow__c}) ,0, {!getRecord.serialNumberForFlow__c})
```

# 数式　setMax

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a260d50f-1939-5952-5710-27a474b32400.png)

```
{!varMax2} + 1
```

# 数式 setCategoryNumber

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a22d8233-393d-60e6-496b-170383a084dc.png)

```
TEXT({!$Record.category__c}) & "-" & LPAD(TEXT({!setMax}), 4, "0")
```



# レコードトリガーフロー　開始

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a07ec25f-4eaf-a7ff-8b27-41b99b4390d5.png)

# カテゴリーが同じ管理用連番の最大値を取得

ポイントは管理用のフローの数値がNull以外を検索すること。これがないとこのレコード自体を検索している感じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/79abe34e-755f-2211-19e2-f4b11ac973a2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8c6b0ab6-52b6-6803-4b59-bb0a610c7399.png)
【React】setCount(count + 1)みたいな書き方が良くないよーってお話

## はじめに

よく技術記事でuseStateが説明されていたり、reactの全般的なもので
```.jsx
  const countUp = () => {
    setCount(count + 1)
  };
```
みたいな書き方をされているものはありませんか?

自分も以前は恥ずかしながら上記の書き方をしていました。
サンプルコードでは問題がない場合が多いですが以下の不具合が含まれる可能性があります。

## どうすればいいの?

**結論!!**

```jsx
  const countUp = () => {
    setCount((prev) => prev + 1)
  };
```

と記述してください。
`setCount(count + 1)`でも動くじゃん！と思うかもしれません。
これから理由について説明していきます。

## バグが起きるユースケース
```jsx
import { useState } from 'react'
import './App.css'

function App() {
  const [count,setCount] = useState(0) 

  const handleClick = () => {
    setCount(count + 1)
    setCount(count + 1)
  }

  return (
  <>
    <h1>useState</h1>
    <button onClick={handleClick}>count is {count}</button>
  </>
  )
}

export default App

```

実際に環境構築したい方は下の記事参考に作ってください

https://qiita.com/kim_t0814/items/0b27cd5c507a21c95e45#usecontext


上記のコードぱっと見countボタンを押せば `count` が 2ずつ増えるように思えるかもしれません。
しかし実際の挙動は以下のようになります。

![download.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636995/c0c94233-73ea-edef-6a6a-7a3763a666fc.gif)

countが1ずつしか増えませんよね...
なぜこうなるのか解説していきます。

### `setCount`は再レンダリングされる直前に実行され、`count`は定数

実際に出力してみると分かりやすいかもしれません

```jsx
  const handleClick = () => {
    setCount(count + 1)
    console.log(count)
  }
```

とすると、実際に出力されるのは初期値が0だとしても`0+1`で１と思うかもしれませんが0が出力されます。
更新関数`setCount`はstateの次のレンダリングの値とするという指示をするだけで、現時点では初期に設定した0という値が参照されます。

実際に書き出すとこんな感じですね。

```jsx
import { useState } from 'react'
import './App.css'

function App() {
  const [count,setCount] = useState(0) 

  const handleClick = () => {
    setCount(0 + 1)
    setCount(0 + 1)
  }

  return (
  <>
    <h1>useState</h1>
    <button onClick={handleClick}>count is {count}</button>
  </>
  )
}

export default App

```

上記を見れば一目瞭然かなと思います！

## まとめ
`setCount`のような更新関数は即座に実行されるのではなく、再レンダリング前に予約される処理ということ。
`count`はあくまで定数ということを意識すれば頭にスッと入るかなと思います。
~~正しく動いてたとはいえ前記事で`setCount(count + 1)`と書いてたのはすいません~~


[【2023年最新】React(v18)完全入門ガイド｜Hooks、Next.js、Redux、TypeScript](https://www.udemy.com/course/react-complete-guide/)

本記事は上記のセクション5を参考に作成しました！
Reactを体系的学べてかつ、仕組み自体も図を用いて解説されていて分かりやすいです💪

最後まで読んで頂きありがとうございました！
統計学とPython: データの正規性検定と可視化

本記事では、データ分析において重要な役割を果たす正規性検定について説明し、Pythonを用いた具体的な実装方法を紹介します。具体的には、ヒストグラムとQ-Qプロットの作成、そして正規性検定（ダゴスティーノの歪度/尖度検定、オムニバス検定、コルモゴロフ=スミルノフ検定、シャピロ=ウィルク検定）を取り上げます。

# ヒストグラムの描画
ヒストグラムは、データの分布を可視化するためのツールです。Pythonでは、matplotlibのhist関数を使って簡単に描画できます。

```
import matplotlib.pyplot as plt
import numpy as np

# データ生成
data = np.random.normal(0, 1, 1000)

# ヒストグラムの描画
plt.hist(data, bins=30)
plt.show()
```

# Q-Qプロットの描画
Q-Qプロットは、データの分布が特定の理論分布（ここでは正規分布）に従っているかを視覚的に判断するためのツールです。Pythonでは、scipyのprobplot関数を使って描画できます。

```
import scipy.stats as stats

# Q-Qプロットの描画
stats.probplot(data, dist="norm", plot=plt)
plt.show()
```

# 正規性の検定
## ダゴスティーノの歪度/尖度検定
歪度と尖度はデータの形状を特徴付ける指標です。ダゴスティーノの歪度/尖度検定は、これらを基にデータが正規分布からどれほどずれているかを検定します。scipyのskewtestおよびkurtosistest関数を用います。
```
### 歪度の検定
skewness, skew_p_value = stats.skewtest(data)
print(f'Skewness test statistic: {skewness}, p-value: {skew_p_value}')

### 尖度の検定
kurtosis, kurt_p_value = stats.kurtosistest(data)
print(f'Kurtosis test statistic: {kurtosis}, p-value: {kurt_p_value}')
```

### オムニバス検定
オムニバス検定は、歪度と尖度の両方を考慮して正規性を検定します。scipyのnormaltest関数を使います。
以下のコードでは、正規分布からランダムに生成した1000個のデータをテストしています。検定統計量とp値が出力されます。p値が一定の閾値（一般的には0.05）以下であれば、そのデータが正規分布に従っていないと判断します。
```
from scipy import stats

# データ生成
data = stats.norm.rvs(size=1000)

# オムニバス検定の実行
k2, omnibus_p_value = stats.normaltest(data)
print(f'Omnibus test statistic: {k2}, p-value: {omnibus_p_value}')
```

### コルモゴロフ=スミルノフ検定
コルモゴロフ=スミルノフ検定は、サンプル分布と理論分布が同じかを検定します。scipyの`kstest`関数を使います。
```
ks_statistic, ks_p_value = stats.kstest(data, 'norm')
print(f'K-S test statistic: {ks_statistic}, p-value: {ks_p_value}')
```

### シャピロ=ウィルク検定
シャピロ=ウィルク検定は、データが正規分布に従っているかを検定します。scipyのshapiro関数を使います。
```
W, shapiro_p_value = stats.shapiro(data)
print(f'Shapiro-Wilk test statistic: {W}, p-value: {shapiro_p_value}')
```

# 有用なデータ分析の場面
正規性検定はデータ分析の様々な場面で活用されます。例えば、A/Bテストにおける結果の分析、統計的仮説検定、回帰分析など、多くの統計的手法はデータの正規性を前提としています。また、データの特性を理解するためにも、その分布の形状を確認することは有用です。
[自分用]Next.jsのコンポーネントとpropsについての豆知識

## コンポーネント作成
コンポーネントを作成するときは、まず「components(名前は任意)」ディレクトリを作成する。
ちなみにコンポーネントファイルはjsx拡張子で作成すると、これコンポーネントか！とすぐわかる。

コンポーネントを作成したら
関数名、エクスポート方法(default等)をチェック。

ちなみにjsxで記述するときは親タグが一つだけでないとエラーが出てしまうが、一番親タグに指定するのは
`<></>`ではなく`<div></div>`を推奨する。
理由は、`<></>`でインポートすると親タグが何個もインポートされてしまうので、スタイリングに影響が出てしまうことがある。しかし`<div></div>`なら親タグは一つしかないため、それを加味したスタイリングをすることができる。

## psopsを使いたいとき
propsを使いたいときは、「コンポーネント化したいけど、少し受け取る文が違うんだよな〜」というときに使える。
従来のJavaScriptの引数のようなもの。

（propsの詳細は別投稿に記載しています。）

```jsx
export default function Headline({title}) {
  return (
      <p>{title}.js</p>
  )
}
```
上記のように分割代入を使用する場合は、`Headline({title})`の　{}を忘れないように気をつける。

### propsの継承
※また、propsをpropsとして渡すことができる。
↓
①index.jsのmainコンポーネントに、それぞれ適したpropsを渡す。
②mainコンポーネントのheadlineコンポーネントにpropsをそのまま渡す。
③mainコンポーネントに指定したpropsをheadlineでも使うことができる。

といった感じです。
【AWS-SAA】ソリューションアーキテクト合格体験記

# 試験までのスケジュール

試験日は5月13日でした。申し込みをしたのは3月下旬くらいだった記憶です。
仕事が忙しくて、全然勉強できていない期間もあったので、ガッツリ勉強に時間を当てられたのは1ヶ月くらいですかね。

# ワイのスペック

4月でエンジニア3年目になりました。AWSの経験は、別チームからの依頼で少し触る程度で、ガッツリ構築した経験はなかったです。

# やったこと

### 書籍でインプット

くろかわさんの[ソリューションアーキテクトアソシエイトの教科書](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC-%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%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%90%88%E6%A0%BC%E3%81%B8%E5%B0%8E%E3%81%8F%E8%99%8E%E3%81%AE%E5%B7%BB-CloudTech%E6%9B%B8%E7%B1%8D%E4%BD%9C%E6%88%90%E5%A7%94%E5%93%A1%E4%BC%9A-ebook/dp/B0BCPNZ9GJ/ref=sr_1_7?qid=1684275507&refinements=p_27%3A%E3%81%8F%E3%82%8D%E3%81%8B%E3%82%8F+%E3%81%93%E3%81%86%E3%81%B8%E3%81%84&s=books&sr=1-7)を購入して、ざっくり概要を学びました。

無料で購入できるので本当にありがたいです。

### Udemyでインプットとアウトプット

ネットで評判の良かったUdemyの[【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/share/101WKk3@LvznvdKijlsjaoijhoW2Ta0wygxNsEzR79l343kDvJXsED3LEvWNyOKOEYnCfS8zTA==/)を受講しました。

ハンズオンを一通り実施して、講座の最後のセクションについている模擬試験3回分をそれぞれ3周ずつくらい解きました。

とにかくコスパ最強ですね。ハンズオンがある上に、模擬試験までついていて2000円くらいだったのは破格すぎます。

### Youtube

知識の確認という意味では、Youtubeで出るところをわかりやすくまとめてくれた動画があったので、試験前に試聴しました。

https://youtu.be/fsz6G45A4H4

# 結果

合格ラインが720点で、結果は736点でした。。結構ギリギリww

今回勉強する中で、実務で扱われているインフラの仕組みを少しは理解できた気がするので、やって良かったなと思いました！
少なくとも、何を言っているのかわからんというのが実務ではなくなりましたね。

しっかり対策すれば合格できるので、頑張ってください！！
Pythonにおける浮動小数点数の変換と無限大への丸めについて

こんにちは、Pythonのデータ処理についてよく使用される技術について解説します。今回は以下のトピックについて解説します。

- 整数を浮動小数点数に変換する方法
- 正の無限大への丸めと負の無限大への丸めについて
- NumPyのndarrayにおける小数点以下の切り上げと切り捨て


これらの技術は、データ分析やデータサイエンスのフィールドで頻繁に用いられます。特に、データの前処理や変換、モデルの入力を調整する際などに使われます。

# 整数を浮動小数点数に変換する

Pythonでは、整数を浮動小数点数に変換することは非常に簡単です。次のようにfloat()関数を使用します。

```python
x = 5
x_float = float(x)
print(x_float)  # prints 5.0
```

この方法は、数値データが整数であるが、精度を必要とする数値計算を行う場合に便利です。

# 正の無限大への丸めと負の無限大への丸め
Pythonでは、正の無限大への丸め（切り上げ）はmath.ceil()関数を用いて、負の無限大への丸め（切り捨て）はmath.floor()関数を用いて行うことができます。

```
import math

x = 5.2

print(math.ceil(x))  # prints 6
print(math.floor(x))  # prints 5
```

math.ceil()は与えられた数値以上の最小の整数を返し、math.floor()は与えられた数値以下の最大の整数を返します。

# NumPyのndarrayにおける小数点以下の切り上げと切り捨て
NumPyにもceil()とfloor()関数が存在し、これらは配列全体に対して操作を適用できます。

```
import numpy as np

x = np.array([1.2, 2.3, 3.4, 4.5, 5.6])

print(np.ceil(x))  # prints [2. 3. 4. 5. 6.]
print(np.floor(x))  # prints [1. 2. 3. 4. 5.]
```

これらの関数は、特にデータの前処理やモデルの入力を調整する際に役立ちます。

上記のnp.ceil()やnp.floor()は、実際のデータ分析の場面でよく利用されます。例えば、年齢のようなデータを扱っているとき、厳密な浮動小数点数での表現は必要ない場合が多く、最も近い整数値に丸めることが求められます。このような場合に、np.ceil()やnp.floor()を利用することでデータを適切に処理できます。

また、これらの関数は、機械学習モデルの入力や出力を処理する際にも有用です。例えば、確率の出力を持つモデルがある場合、ある閾値以上の値を1（真）、それ以外を0（偽）に変換したい場合があります。このような場合にも、np.ceil()やnp.floor()を用いることができます。

以上がPythonにおける浮動小数点数の変換と無限大への丸めについての解説です。これらの機能はPythonのデータ処理で頻繁に用いられるため、ぜひ覚えておきましょう。
【Nextjs13】OOO cannot be used as a JSX component.

# 環境

```
  "dependencies": {
    "@types/node": "20.1.4",
    "autoprefixer": "10.4.14",
    "eslint": "8.40.0",
    "eslint-config-next": "13.4.2",
    "next": "13.4.2",
    "postcss": "8.4.23",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "tailwindcss": "3.3.2",
    "typescript": "5.0.4"
  },
```

# コード

```
import UsersList from './UsersList';
import Counter from './Counter';
import { Suspense } from 'react';
const Test = () => {
  return (
    <>
      <h1 className="text-x1 font-bold">Testページ</h1>
      <Counter />
      <Suspense fallback={<p className="mt-4">ユーザデータ Loading...</p>}>
        <UsersList />
      </Suspense>
    </>
  );
};

export default Test;
```

# エラー

UserListにエラーが起きる。

```
import UsersList from './UsersList';
import Counter from './Counter';
import { Suspense } from 'react';
const Test = () => {
  return (
    <>
      <h1 className="text-x1 font-bold">Testページ</h1>
      <Counter />
      <Suspense fallback={<p className="mt-4">ユーザデータ Loading...</p>}>
        <UsersList />
      </Suspense>
    </>
  );
};

export default Test;
```

# 原因
既知のバグ

https://nextjs.org/docs/app/building-your-application/configuring/typescript#async-server-component-typescript-error

# 対処法

`{/* @ts-expect-error Async Server Component */}`を加える。

```typescript
import UsersList from './UsersList';
import Counter from './Counter';
import { Suspense } from 'react';
const Test = () => {
  return (
    <>
      <h1 className="text-x1 font-bold">Testページ</h1>
      <Counter />
      <Suspense fallback={<p className="mt-4">ユーザデータ Loading...</p>}>
        {/* @ts-expect-error Async Server Component */}
        <UsersList />
      </Suspense>
    </>
  );
};

export default Test;
```
APIGateway + Lambdaでの同期・非同期API作成(CDK)

# はじめに

GETは同期API、それ以外のメソッドは非同期APIとして実装したいなと思い、CDKを用いて同期APIと非同期APIをそれぞれ実装してみました

AWSコンソールでの作成方法の記事はよくあるのですが、CDKを用いた構築方法はあまり無いように思ったため今回記事にしました

# 同期APIの作成

## AWSコンソールからの設定方法

- 以下の記事が分かり易いです
    - [https://qiita.com/miyuki_samitani/items/f01f1bd49334f97fe84c](https://qiita.com/miyuki_samitani/items/f01f1bd49334f97fe84c)

## CDKを用いた方法

```python
sync_lambda = lambda_.Function(
    self, 'sync-lambda',
    runtime=lambda_.Runtime.PYTHON_3_9,
    handler='[handlerを指定]',
    code=lambda_.Code.from_asset('[デプロイ対象のディレクトリを指定]'),
    function_name='[Lambda Function名を指定]',
    timeout=Duration.minutes(15),
    memory_size=1024,
    environment={
        'TZ': 'Asia/Tokyo',
    },
	# 他必要に応じて、Lambdaの設定を追加
)

apilambda_integration = apigw.LambdaIntegration(
    sync_lambda,
)

api_resource = api.root.add_resource('[リソース名を指定]')
api_resource.add_method('GET', apilambda_integration, api_key_required=True)
```

同期処理の場合は、Lambdaプロキシ統合を使用できるため、比較的シンプルな方法で実装可能です

# 非同期APIの作成

## AWSコンソールからの設定方法

- 以下の記事が分かり易いです
    - [https://qiita.com/so_komiya/items/4d7128a3856d581dbbc8](https://qiita.com/so_komiya/items/4d7128a3856d581dbbc8)

## CDKを用いた方法

```python
async_lambda = lambda_.Function(
    self, 'sync-lambda',
    runtime=lambda_.Runtime.PYTHON_3_9,
    handler='[handlerを指定]',
    code=lambda_.Code.from_asset('[デプロイ対象のディレクトリを指定]'),
    function_name='[Lambda Function名を指定]',
    timeout=Duration.minutes(15),
    memory_size=1024,
    environment={
        'TZ': 'Asia/Tokyo',
    },
	# 他必要に応じて、Lambdaの設定を追加
)

request_templates = """
#set($allParams = $input.params())
{
"body" : $input.json('$'),
"resource": "$context.resourcePath",
"httpMethod": "$context.httpMethod",
"pathParameters": {
    #set($path_params = $allParams.get("path"))
    #foreach($paramName in $path_params.keySet())
    "$paramName" : "$util.escapeJavaScript($path_params.get($paramName))"
        #if($foreach.hasNext),#end
    #end
    },
"queryStringParameters": {
    #set($query_params = $allParams.get("querystring"))
    #foreach($paramName in $query_params.keySet())
    "$paramName" : "$util.escapeJavaScript($query_params.get($paramName))"
        #if($foreach.hasNext),#end
    #end
    }
}
"""

async_integration = apigw.LambdaIntegration(
    async_lambda,
    proxy=False,
    request_templates={'application/json': request_templates},
    request_parameters={
        'integration.request.header.X-Amz-Invocation-Type': "'Event'"
    }
)
```

非同期処理の場合は、少し複雑な記載になっているため`apigw.LambdaIntegration()`の引数に関して解説をつけます

- proxy：
    - プロキシ設定をしないためにFalseを指定する必要があります
- request_templates：
    - APIGatewayが受け取ったリクエスト情報をLambdaを渡す際にどのような値にマッピングするかを定義します
    - 今回の定義では、Lambdaプロキシ統合を用いた場合と同様の形式でLambdaが受け取れるようにマッピングルールを設けています
        
        ※Lambdaプロキシ統合ではbodyは文字列となりますが、この書き方では文字列にならずdictで届きます。。
        
- request_parameters：
    - `X-Amz-Invocation-Type`に'Event'を指定することで非同期でLambdaが動作します
    - ちなみに’RequestResponse’を設定すると同期処理になります

# 最後に

やはりCDKはめっちゃ便利。。

CDKを利用するときは、まずAWSコンソールで作ってみて、それぞれの設定がCDKでどのように表現するのかを確認しながら行うとやりやすく感じました！

また、他にもいろいろな機能を作りたいと思うので、CDKの知識もつけていきたいと思います！
command Line　Git

## ファイルの作成

ファイルを作成するには、touchコマンドを使います。**touch　ファイル名**と入力して実行するとからのファイルを作成できます。

`
touch ファイル名
`

## ファイルの中身を表示
コマンドでファイルの中身を表示するには

`cat ファイル名`

と入力します

## ディレクトリの作成

ディレクトリを作成するには、mkdirコマンドを使います

`mkdir ディレクトリ名`

と入力します。

## ディレクトリの移動

ディレクトリを移動するには、cdコマンドを使います

`cd ディレクトリ名`

と入力します。

cdコマンドでは、ディレクトリを指定せずに「cd」のみで実行すると、ホームディレクトリと呼ばれるディレクトリに移動できます。


## カレントディレクトリの確認

作業中のディレクトリを確認できるpwdコマンドを使います。

`pwd`

pwdコマンドを実行すると、ルートディレクトリからカレントディレクトリまでの階層が全て表示されます

## ディレクトリの中身を確認

ディレクトリの中身を確認するには、ls（エルエス）コマンドを使います

`ls`

lsコマンドで確認できるディレクトリとファイルは、基本的には1つ子の階層だけです

## 1つ親のディレクトリ
1つ親のディレクトリに移動したい場合のコマンドは

` cd..`

と入力します。

## ファイルを移動させる
ファイルを移動させるには、mvコマンドを使います。

`mv ファイル名 ディレクトリ名`

とすることで、指定したディレクトリにファイルを移動させることができます

---
また、ファイル一つずつではなく、ディレクトリごと移動させることもできる

`mv ディレクトリ名 移動先のディレクトリ名`

そのディレクトリ以下のファイルやディレクトリも一緒に移動します

---
さらに、

`mv ファイル名 新しいファイル名`

とすることで、ファイル名も変更できます。

## ファイルのコピー
ファイルをコピーするにはcpコマンドを使います

`cp コピーするファイル名 新しいファイル名`

さらに、cpコマンドでは「-r」を付けることで、ファイルだけでなくディレクトリもコピーすることができます

`cp -r コピーするディレクトリ名 新しいディレクトリ名`

## ファイルの削除
ファイルを削除するにはrmコマンドを使います

`rm ファイル名`

また、cpコマンドの時と同じように、rmコマンドは「-r」を付けることでディレクトリも削除することができる。

`rm -r ディレクトリ名`