OmniAICreator/Qiita-1.07M huggingface dataset:
NotionのコンテンツをAPI経由で更新する

前回の[C#のEntityからER図作ってみた](https://qiita.com/htagu/items/b5c211ac51d22c6f968d)の続きです。
せっかくC#のコードをパースしてER図を作ったので、どうせなら全工程自動で公開したいと思いNotionAPIを調べてみました。
今回は出力したER図（Mermaid記法）をNotionにAPI経由で公開するための下調べです。

## Notion APIについて
https://developers.notion.com/

## 調査内容
* NotionAPIを扱うにはインテグレーション設定を追加しアクセストークンを取得する必要があり。
* NothionでER図を扱うにはページにコードブロックを追加しコードタイプをMermaidにする。
* ページやブロックには固有のIDがありどうやらAPIではこのIDを指定して色々操作が可能なよう。
* 今回はあらかじめ作成したブロックをAPIで更新する方針とする。

## 手順
1. Notionのインテグレーション追加を行い、アクセストークンを取得する。
※ここは色々なページで語られているので省略

1. ER図用のページを作成しMermaid用のコードブロックを追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666176/c0813700-ae54-e3e8-c460-b4a0e4489e13.png)

1. ER図用のブロックのIDを取得する。
※コードブロックを選択し右上のメニューから”ブロックへのリンク”をクリックします。
※#以降がidになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666176/035c0f64-3235-11b5-c398-b6cad5f8e444.png)

1. ページをAPIからアクセス可能にする。
※右上のページメニューからコネクトの追加を選択し１で追加したAPIを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666176/635edede-c7bf-eb9e-686d-0f34aae22f35.png)

1. Notion APIでER図を更新する。
※アクセストークンは手順1で取得した値
※ブロックIDは手順3で取得した値
※JsonのcontentがMermaid記法のMarkdown
※HTTPメソッドは更新なのでPATCH
    ```bash
    $ curl -X PATCH 'https://api.notion.com/v1/blocks/<ブロックID>' \
      -H 'Authorization: Bearer <アクセストークン>' \
      -H 'Content-Type: application/json' \
      -H 'Notion-Version: 2022-06-28' \
      --data '{
        "code": {
          "rich_text": [
            {
              "text": {
                "content": "erDiagram Company{int ID \"ID\" string Name \"名前\"}"
              }
            }   
          ]
        }
      }'
    ```
6. 更新を確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666176/037a1412-0741-b1b1-2dec-85b02dbacf9e.png)

# 最後に
コードブロックの更新は比較的簡単にできそうです。
次回は前回作成したプログラムを拡張してC#のプログラムからNotionの更新までやりたいと思います。
SIerさん、納品物の自動作成で楽しません？
（お仕事まってます！）
You do not have permission to execute that operation



+ [Unable to send list emails even with correct permissions](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HjtcC)

We are running into an error message: "You do not have permission to execute that operation"
We have checked that the user profile  has the following permissions enabled:

+ Access Activities: Access tasks, events, calendar, email
+ Allow sending of List Emails: Allow users to create, edit and send List Emails
+ Mass Email:  Send mass emails to contacts and leads

:::note
I gave access to the Contact record to whom the list email was being sent and the error was gone. This error pops up when we are sending list email using Campaign Member Related List 'Send Email' button. The user sending the mail should at least have read access to the contact

リスト電子メールの送信先の連絡先レコードへのアクセスを許可したところ、エラーは解消されました。このエラーは、キャンペーン メンバー関連リストの [メール送信] ボタンを使用してリストのメールを送信すると表示されます。メールを送信するユーザーには、少なくとも連絡先への読み取りアクセス権が必要です
:::


+ [Lightning Experience で活動を開くと「問題が発生しているようです」エラー](https://help.salesforce.com/s/articleView?id=000383030&type=1)
AWS、はじめました。（軽く会社と仕事の話）

こんにちは。もりかぷです。
普段あまり会社の話はしないのですが、なぜAWSに興味を持つようになったのか軽く背景を書きたくなったので投稿します。
いつも通りですが、あまり文章を書くのが得意ではないので読みづらい文章になってしまうかもしれませんが、アウトプットの練習もかねてお付き合いいただけますと幸いです。

※特に会社の宣伝とかではなく、個人的なことを書き連ねます。

# 初めてのAWS認定
仕事ではデータ連携などを行う某パッケージソフトウェアの開発・保守に携わっています。
一応AWSと連携する機能はあるのですが、結構機能自体が入社前から熟成されていたので高頻度で手を入れる、というわけではなく当時はあまりAWSを直接操作する、ということはしていませんでした。

ただ、「会社全体でクラウド系資格を取得していこう」というのがあり、じゃあ触りつつ認定資格取るか～ということで、初めて取得したのが基礎中の基礎となる「[AWS Certified Cloud Practitioner](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)」でした。

資格は取得したものの、当時、業務であまりAWSに触ることがなく割と満足してしまったのが当時の自分です。（今では後悔しています。）

※資格取得までの話は以下に書いておりますのでよろしければどうぞ。
https://qiita.com/tkapu/items/be9b4b5b5cd0bfdc3291

# AWS re:Invent 2022への現地参加
大きく変わったのはこのイベントへの参加でした。

AWS re:InventはAWSさんが毎年開催している大規模なカンファレンスです。（いつもアメリカ合衆国、ラスベガスで開催しています。）
新サービスや新機能をはじめとした基調講演や事例紹介、サービスを触ったり仕組みを作るワークショップなど様々な種類のセッションで構成されます。特にAWSという規模の大きいクラウド事業者が主催するため、最先端の技術を学んだり、技術に関わらずAWSの文化を学習する、世界中の開発者と交流できるといったメリットがあります。

たまたまご縁があり、出張として現地参加させていただけることになりました。
出張に行く前は前章で述べた「[AWS Certified Cloud Practitioner](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)」の取得から約半年ほど経っていたので、再度学習もかねてAWSマネジメントコンソールを操作しながら「[AWS Certified Developer - Associate 認定](https://aws.amazon.com/jp/certification/certified-developer-associate/)」の学習&取得をしました。

セッションは主に現地でしか体験できないワークショップやChalk Talk（AWS社員の方が最初に短時間だけ話して、セッション参加者とディスカッションする会）を中心に参加してきました。その他、現地ならではの熱さを感じるためにKeynote、交流を目的としてEXPOを回っていました。

細かい話をすると長くなってしまうので、今回は省略しますが、業務から離れて約1週間ほどAWS漬け、海外の開発者の交流、ワークショップなどを体験して大きく感じたのは「なぜこんな便利なもの、短時間でサービスを立ち上げることができる素敵なもの、外の世界に触れなかったのだろうか」といくつもの感銘を受けました。

と、同時にまだまだ自分の力不足（良く言えば、伸びしろがあると言えると思う）を感じたのがAWSをもっと学習したいと思う大きなキッカケでした。

# 社内のAWSエンジニア育成プロジェクトへの参加
社内にクラウドエンジニア育成プロジェクト（クラウドサービスへの理解を深めるサポートやサービスを実際に触れるようにサポートしてくれる）があり、せっかくなので参加しました。

活動内容としてはどちらかといえば自己学習とアウトプットの機会を与える場（こんな記事見つけました、こんなことやってみました、ブログに書いてみましたなど）ではありますが、「定期的に使ったことのないサービスを必ず一つ使ってToDoアプリを作る」といったお題を元にハッカソンなどをやっています。

自分自身、あまりブログを書いたりとアウトプットはしたことがないのと、個人的にシャイな性格だったりもして中々できなかったことも多かったのですが、サポートもあり、今、このようにひたすらアウトプットの練習をしております。

その他、無料枠があるとはいえ、結構ガチガチにやるとそれなりの料金が発生するAWS利用料も、社内の学習環境且つ派手にやりすぎないことを条件にプロジェクトとしてサポート頂けるのが、本当に助かっています。

（最近では個人契約で触っていたりもしていますが、その話はまた今度にします。）

# 終わりに
自分の短所として、割とやったら満足しやすい傾向にありましたが、様々なキッカケで常に勉強し続けたいと思えるのがAWSというものでした。

なかなかアウトプットに慣れておらず、結構雑な文章になってしまいがちですが、今後もインプットとアウトプットを繰り返して自身のスキルを磨いていけたらと思います。
また、雑な文章でも一人でも何らかのお役に立てれば幸いです。

# 本当の最後に
今度LT大会に登壇するので気になる方はぜひご参加ください。AWSを使って作っているものの話をします。
（社内のものを外向けにやってみよう、という練習的なものになります。）

https://saison-coloris.connpass.com/event/298589/
[23c SQL新機能] とうとうboolean型の列が作成可能に！

## 環境
・Oracle Database 23c
　※DBエディションやOSによって差異はなし

## やれること
23cより前までは、Oracleのテーブル作成では、boolean型の列が作成できませんでした。
そのため真偽値を扱いたいときは、CHAR型はNUMBER形で 1 や 0 に置き換えたりしていました。

23cでは、boolean型の列を作成できるようになりました。
NULLの扱いや、使えなかった時からの移行についてもみてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/a106be11-ad71-6e73-9cbf-12736f863468.png)


## 実行例

#### (1) BOOLEAN型のあるテーブル作成
テーブル作成とデータの挿入。
trueを入れたいときは、そのまま true、
falseを入れたいときは、そのまま false と書きます。
文字ではないため、シングルクォーテーションで囲わないように注意。
```
SQL> CREATE TABLE testbool ( id NUMBER , val BOOLEAN );

Table created.

SQL> INSERT INTO testbool values (1 , true);

1 row created.

SQL> INSERT INTO testbool values(2 , false);

1 row created.
```

#### (2) true/falseを検索してみる
trueの検索は、列名を書くだけ。
falseの検索は、not 列名。
```
SQL> SELECT * FROM testbool WHERE val;

        ID VAL
---------- -----------
         1 TRUE

SQL> SELECT * FROM testbool WHERE not val;

        ID VAL
---------- -----------
         2 FALSE
```

#### (3) nullの扱いを確認してみる
nullは trueでもfalseでもないため、trueの検索、falseの検索でも条件にあてはまりません。
他のデータ型と同じように is null , is not nullで nullに関する条件を指定します。
```
SQL> INSERT INTO testbool values (3 , null);

1 row created.

SQL> commit;

Commit complete.

SQL> SELECT * FROM testbool WHERE val;

        ID VAL
---------- -----------
         1 TRUE

SQL>  SELECT * FROM testbool WHERE not val;

        ID VAL
---------- -----------
         2 FALSE

SQL>  SELECT * FROM testbool WHERE val is null;

        ID VAL
---------- -----------
         3

SQL>  SELECT * FROM testbool WHERE val is not null;

        ID VAL
---------- -----------
         1 TRUE
         2 FALSE
```

#### (4) BOOLEAN型のデータ型変換
TO_BOOLEAN , TO_CHAR , TO_NUMBERでBoolean形とのデータ型変換が可能です。
デフォルトで true が 1 、 false が 0 として扱われます。
```
SQL> SELECT id , val , to_number(val) , to_char(val) FROM testbool;

        ID VAL         TO_NUMBER(VAL) TO_CHAR(VAL)
---------- ----------- -------------- -----
         1 TRUE                     1 TRUE
         2 FALSE                    0 FALSE
         3
```

#### (5) 過去のSQLを変更する必要があるか？
いままでboolean型が使えなかったため、CHAR型の列を使って、1と0でboolean型を再現していることが多々あるかと思います。

その時のSQL[select * from testbool where val = '1';]はそのまま使えるのでしょうか？

もちろん推奨されるのは明示的なデータ型変換ですが、暗黙的なデータ型変換が行われるため、いままでのSQLでも使用可能です。
```
SQL> select * from testbool where val = '1';

        ID VAL
---------- -----------
         1 TRUE
```

autotraceで実行計画をとってみましたが、 val = '1' が val = true に変換されているようです。
```
SQL> set autotrace on
SQL> select * from testbool where val = '1';

～省略～

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("VAL"=TRUE)

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
```
Locustで負荷テストを行った

# Locustで負荷テストを行った
postmanでは複数同時テストができないためLocustを使用した

# install
```
pip install locust
```

# App内にfileを設置
```
App/Web/views/locust.py
```

# locust.pyでテストコードを作成
毎秒の時間を出力するコード
```
from locust import HttpUser, TaskSet, task
import datetime

class Test(TaskSet):
    @task
    def load(self):
        print(datetime.datetime.now())

class Test2(HttpUser):
    tasks = {Test:1}
```

# 出力コマンド
App/Web/views/の階層まで移動し
```
＄locust
```
を叩くと出力されます。

こちらを流用し個々のテストの出力を行えます。
人数や何秒ごとかなどの詳細な設定も行えますので便利です。
スッキリわかるJava入門 実践編 第３版 まとめ -part11-単体テストとアサーション

# はじめ
こんにちは　◤●ㅅ●◥ﾉ

今回は品質を意識しながら効率的に開発を行う手法、機能、ツールについて学びました！

## 第１１章　単体テストとアサーション

### 1.不具合に対するアプローチ
開発の進み具合のこと　__進捗__　
開発すべき機能の範囲 __スコープ_

:star: 「完成」の基準
期待される「スコープ」と「品質」の両方を満たして、初めて完成
期待される「時間」内に完成して、初めて成功

品質のおおまかな段階
1.起動不能
2.強制終了
3.仕様非準拠
4.完成

何で品質を確認するか
→テストを行う

#### テストの種類
__単体テスト__
ある１つの部品について詳細なテストを行い、その部品単体では完成していることを検証する
１つのクラスのメソッドを呼び出し動作が正常であることを確認する
クラスの開発者が担当することも多く、ほとんどの不具合はこの段階で修正される

__結合テスト__
単体テストが完了している完成部品をいくつかつないで動作させ、
うまく連携して動作するかを確認する

__総合テスト（システムテスト）__
すべての部品を結合して行う最後のテスト
最終成果物がプログラムではなく、ハードウェアやネットワークも含めたシステム一式の場合
本番で使う機材上でテストを行うことが一般的
総合テストと同時あるいは別に受け入れテストや検収といった手続きもある

### 2.単体テストのやり方
単体テスト用にクラスを作り検証する

テストしたい対象のクラスを動かすためだけに作るクラス
→テストクラス（テストドライバ）

なぜテストクラスを使うのか
→クラスを作らずにmainメソッド内に書くことはできないのか？
1.１文字でも少ない稼働コードが理想
本番稼働に不要なものは本番稼働用のクラスの中に含めるべきではない
2.１文字でも修正したら再検証
mainに追加した後に消した場合でも再度検証する必要が出てくる

良いテストケースについて
少ないパターンでより多くの範囲のテストができるようにテストを考える
多様なテストケースを効率よく作っていく
作る時に便利なもの
正常系、異常系

正常系...正常に動作することを確認する
異常系...想定される異常時に、きちんとエラー処理がされるかを確認する

### 3.JUnitを用いたテスト
テスト作りのルールをある程度統一しておくと楽になる
→ __テスティングフレームワーク__　と総称されるツールがよく利用される
代表的なものとして「JUnit」が挙げられる

JUnitはオープンソースとして無償でダウンロードし、利用できる

### 4.アサーション
Javaには簡易なテストケースを稼働コードの中に直接記述できる __アサーション__　
という仕組みがある

:pencil2: アサーションの使い方
構文１：`assert 評価式;`
構文２：`assert 評価式 : エラーメッセージ;`

アサーションの注意点
1.アサーションのOFF時に問題となるコードを書かない
本来の動作ロジックに影響を与える指揮をassert文で利用すべきではない
2.単体テストに代わるものではない

## まとめ
開発期間の期限内に、スコープと品質の両方を満たさないといけない
大きなプログラムの場合
単体テスト
結合テスト
総合テスト
へと段階を踏んでテストを行なっていく
Javaでクラスの単体テストを行う場合、
JUnitをはじめとするテスティングフレームを利用するのが一般的
アサーションを用いるとソースコード中に簡易なテストを記述できる

今回もありがとうございました！
ではまた〜　◤●ㅅ●◥ﾉ"
スッキリわかるJava入門 実践編 第３版 まとめ -part10-基本的な開発ツール

# はじめに
こんにちは　◤●ㅅ●◥ﾉ

今回はJDKに標準で添付されているツールとそれに関連する機能について学びました！

## 第１０章　基本的な開発ツール

### 1.Javaが備える基本的なツール
実務...「限られた制約の中で、最高のソフトウェアを作る」
→実践的な開発で求められるのは開発効率

効率を上げるには３つの方法
1.個人の知識と技能を上げる
2.道具を使う
3.複数人で手分けをする

2,3を10章以降の所で学んでいく
１０章では道具を使い効率を上げる方法を学ぶ

### 2.JDK
リリースされたJava標準使用を元に、さまざまな企業がその仕様に沿って動作する
JVMやコンパイラ、APIクラスなどを開発する
→それらを詰め合わせた開発者向け提供パッケージのことをJDKと呼ぶ

開発用途のツールを除き、実行専用のツールのみを含んだものをJREという
※昔から存在するが、近年ではJDKのみの提供も増えている

### 3.javadoc-仕様書の自動生成
複数人が協力してプログラムを作る一般的なプロジェクトでは、
プログラムに関する設計情報などを記述した __仕様書__　を必ず作る
特に手間がかかるのはプログラム仕様書
→プログラムに含まれるすべてのクラスの一覧やそれぞれのクラスの中で利用されている
フィールドやメソッドの一覧およびその解説をすべて記述するため、膨大な量になる

JDKに付属している __Javadoc__ を使うと、作成済みのプログラムのソースコードから
簡単にプログラム仕様書を自動で生成することができる

Javadocの基本的な使い方
`javadoc [各種オプション]　ソースファイルなど`
※[]で囲んである部分については省略が可能

各種オプションについて
Javadocは特に指定しない限りprotected以上の
アクセス修飾がなされたメンバしか仕様書に出力しない

privateを含むすべてのメンバを出力するには-privateオプションを指定する
`javadoc -private *.java`

現在のフォルダではなく指定されたフォルダの中にプログラム仕様書が出力される
`javadoc -d c:¥work¥doc *.java`

### 4.javac-コンパイル
#### javacコマンドとは
javaコマンドと並列して頻繁に利用するツール
Java言語で記述されたソースコードをバイトコードを含むクラスファイルに変換するコンパイラ

javacコマンドの基本的な利用方法
`javac[各種オプション]ソースファイルなど`

コンパイラをするメリット
ソースコードからバイトコードへの変換に先立ち、
ソースコードの文法をチェックして、異常な記述や懸念がある部分を開発者に伝える

#### アノテーション
ソースコードのある部分について、警告は不要など開発者の意図をコンパイラに伝える
”@”から始まる記述で、javadocタグとそっくりだが、
コメント内ではなく対象となるクラスやメンバの直前にそのまま記述をする

あるクラス、メソッド、フィールドなどに対して、一定の種類の警告を行わないよう指示する
→ __@SuppressWarningsアノテーション__

メソッドが親クラスの同名メソッドをオーバーライドすることを明示的に宣言する
→ __@Overrideアノテーション__

クラス、フィールド、メソッドなどの宣言が非推奨であることをコンパイラに伝える
→ __@Deprecateedアノテーション__

### 5.jar-アーカイブの操作
__JAR__ コマンド
→別の開発者に渡すときにファイルの受け渡し漏れなどの事故が発生することがないよう
　それらのファイル一式を１つにまとめるアーカイブ形式として定められている

jarコマンドを使うことで、複数のクラスファイルやプロパティファイルを１つのJARファイルへ
逆にJARファイルを元に戻すことができる

jarコマンドで行うのは大体３つのパターン
1.アーカイブの作成
`jar -cvf JARファイル名　ファイルやフォルダ...`
2.アーカイブの展開
`jar -xvf JARファイル名`
3.アーカイブ内容の閲覧
`jar -tvf JARファイル名`

JARファイルにはアーカイブ内に含まれるさまざまなファイルに関する追加情報を記述した
__マニフェストファイル__　を含めることが一般的

マニフェストファイルには「~:~」という形式のエントリを記述することになっている

### 6.java-JVMの起動と実行
javaコマンドの心臓部にはJVMと呼ばれる機構が備わっている
クラスファイルに含まれるバイトコードをCPUが実行できるマシン語に逐次変換することでプログラムは実行される

javaコマンドの基本的な使い方は以下の通り
`java [各種オプション] メインクラスのEQCN`

JVMはOSから割り当ててもらったメモリ領域をやりくりしながらJavaプログラムを実行する
このメモリ領域は用途の違いにより、 __ヒープ__　と __スタック__　に分けてJVMが管理する

不要なインスタンスを解放し、残りの要領を回復させる
→ __ガベージコレクション__

### 7.ishell-Javaの対話的実行
Python,JavaScriptなどのプログラミング言語
→ __インタプリタ言語__
　→基本的にソースコードの命令が１行ずつ変換・実行される特徴がある
特徴を活かした __REPL__ ツールが付属している

java
→ __コンパイル言語__
　→ソースファイル全体を翻訳してから動作する
特徴を活かしたJShellが同梱される

### 8.統合開発環境
実際の開発現場ではJDKのツールを直接コマンドプロンプトで呼び出すのではなく、
エディタと開発に関連するツールが統合された __統合開発環境__　を使う

### 9.Ant
ソースコードに基づいて、実行可能プログラムなどの一連の最終成果物を生成する工程
→ビルド

 Ant...ビルド工程を自動化するためのツール

### 10.Maven
Antを使っていくと処理も長く複雑になっていく
→高度な自動化を実現するツールとしてMavenを利用される

## まとめ
本格的、実践的な開発では、開発効率を意識することも重要になってくる
JDKに標準添付されているさまざまなツールを使うことで最低限の開発効率を確保する
javadocは、javadocタグ、コメントを解釈してプログラム仕様書を自動的に生成する
javaコマンドはクラスファイルやプロパティファイルを１つのアーカイブファイルにまとめることができる
AntやMavenを利用することによって、効率的にビルド工程を自動化できる
[かんたんコミットメッセージ] Conventional Commits で使用可能な prefix の解釈

## Conventional Commits
https://www.conventionalcommits.org/ja/v1.0.0/#%e6%a6%82%e8%a6%81

## 使用可能な prefix (@commitlint/config-conventional)
1. `build`
2. `chore` &star;
3. `ci`
4. `docs` &star;
5. `feat` &star;
6. `fix` &star;
7. `perf` &star;
8. `refactor` &star;
9. `revert`
10. `style` &star;
11. `test` &star;

:::note info
Angular.js の採用する規約では、&star;のついた8つのプレフィックスを使用します。この場合、例えば`build`を`chore`に含めます。
:::

>chore: Changes to the build process or auxiliary tools and libraries such as documentation generation

https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type

>chore: ビルド、補助ツール、ライブラリ関連

https://qiita.com/konatsu_p/items/dfe199ebe3a7d2010b3e

## 解釈 (使用例)

1. **`build`**: ビルドシステムや外部依存関係の変更に使用します。例えば、ビルドスクリプトやパッケージマネージャの設定の変更などが含まれます。
    - e.g. ビルド設定ファイルの変更
    - e.g. 依存関係の更新 (npm / Yarn)

    ```
    build: 更新依存関係を追加
    ```

2. **`chore`**: おおむね雑用やタスクの変更に使用されます。特に意味がない単なる作業や、タスクランナーの設定の変更などが含まれます。
    - e.g. package.json ファイル内の scripts セクションへの変更
    - e.g. 新しくパッケージを追加 ($ yarn add react)

    ```
    chore: ドキュメントの整理
    ```

3. **`ci`**: CI（継続的インテグレーション）の設定やスクリプトの変更に使用されます。

    ```
    ci: テストスクリプトの修正
    ```

4. **`docs`**: ドキュメンテーションの変更に使用されます。
    - e.g. READMEの追加や変更
    - e.g. LICENSEの追加や変更

    ```
    docs: READMEの更新
    ```

5. **`feat`**: 新しい機能の追加に使用されます。

    ```
    feat: ユーザーログイン機能の追加
    ```

6. **`fix`**: バグ修正に使用されます。

    ```
    fix: ユーザーログイン時のエラー修正
    ```

7. **`perf`**: パフォーマンスの向上に対する変更に使用されます。

    ```
    perf: データベースクエリの最適化
    ```

8. **`refactor`**: コードのリファクタリングに使用されます。機能の変更はなく、単にコードの構造や可読性を向上させる目的です。
    - e.g. ファイル名の変更
    - e.g. プロジェクトのディレクトリ構造を変更

    ```
    refactor: メソッドの名前変更
    ```

9. **`revert`**: 以前のコミットを取り消す目的で使用されます。

    ```
    revert: 直前の変更を元に戻す
    ```

10. **`style`**: コードのスタイルやフォーマットの変更に使用されます。
    - e.g. CSSデザインの変更

    ```
    style: インデントの修正
    ```

11. **`test`**: テストコードの追加や修正に使用されます。

    ```
    test: ユーザーログインのテストケース追加
    ```
    
:::note warn
プロジェクトやチームのコミットメッセージの規約によっては、`chore`プレフィックスが広範な雑用やタスクに関連する変更に使用されることもあります（e.g. プロジェクトのディレクトリ構造を変更）。プロジェクト内での一貫性が重要です。
:::

---
>なにか間違い等ありましたら、コメントをいただけると幸いです！
AWS Cloud Practitioner 学習記録７

:::note info
AWS Skill Builder における下記コンテンツの学習記録（ポイントとメモ）です
AWS Cloud Practitioner Essentials (Japanese) (日本語実写版)
:::

# モジュール７：モニタリング
システムの運用、監視に利用するサービスの章


### Amazon CloudWatch
メトリクスとは、測定や基準、指標値になる数字や情報のこと
AWS リソースのシステムパフォーマンス（CPU 使用率、ストレージの空き容量や IOPS、ネットワークトラフィック流量など）を可視化する

##### Amazon CloudWatch
AWS リソースのメトリクスを一元的に管理でき、メトリクスのデータに基づいたアラームアクションを設定できるサービス

##### CloudWatch アラーム
メトリクスの値がしきい値を跨いだ時に、自動的に何らかのアクションを実行するアラームを作成できる
不要になった EC2 インスタンスが実行され続けてしまい無駄な料金が発生したりしないよう、CPU 使用率が一定時間しきい値を下回った場合に EC2 インスタンスを自動停止させたり、アラームの発生を Amazon SNS を通してEメールで通知してくれるようにできる

##### CloudWatch ダッシュボード
CloudWatch でメトリクスを一元的に管理するために利用できる、ダッシュボード機能
各リソースのパフォーマンス状態をカスタマイズしながら表示させることができる

### AWS CloudTrail
監査、セキュリティモニタリング、運用上のトラブルシューティングを可能にするサービス
アカウントに対するアクティビティ、API コールを記録し、S3 バケットに安全に保管する
モジュール３の学習で出てきたように、AWS ではすべてに API コールを利用する。これらAPI コールをログとして保存でき、ログファイル自体の整合性も検証可能な状態とされ、監査証跡として利用できるよう設計されている

##### CloudTrail イベント
CloudTrail ではイベント履歴として、APIコールイベントにおいて以下のような情報を保存している
+ **何が**おこったのか：新しい IAM ユーザ XXX の作成
+ **誰が**リクエストを行ったのか：IAM ユーザ YYY
+ **いつ**起こったのか：2023年10月13日 12:00
+ **どのように**リクエストが行われたのか：AWS マネジメントコンソールによるアクセス

##### CloudTrail Insights
CloudTrail Insights では AWS ユーザーが発生させた API コールや API エラー率などを継続的に分析することで、異常な（通常と異なる）アクティビティを特定することができる

### AWS Trusted Advisor
AWS 環境を検査して、ベストプラクティスに基づくレコメンデーションを提供するサポートサービス
５つのカテゴリ（後述）における調査結果をベストプラクティスと比較し、推奨されるアクションと追加リソースのリストを提供する
＃サポートプランによってアクセスできるチェックに差がある

##### AWS Trusted Advisor ダッシュボード
Trusted Advisor のダッシュボードでは、各カテゴリのチェック項目を確認できる
+ コスト最適化
    + 例：アイドル状態の RDS インスタンス、Lambda 関数の過剰なタイムアウト
+ パフォーマンス
    + 例：EBS スループット・レイテンシーの分析、EC2 インスタンスの使用量
+ セキュリティ
    + 例：セキュリティグループのアクセスリスク、不要な S3 バケットのアクセス許可
+ 耐障害性
    + 例：Auto Scaling グループ、無効化されたアベイラビリティゾーンや RDS バックアップ
+ サービス制限（クォータ）
    + アカウントに作成できるリソース最大数。クォータの80%に達すると通知される

#
この章は10～15分程度で短いですね
FourKeysの考え方を独自に考え直して測る仕組みを作ってみた

# Four Keysとは
Four Keysとは、GoogleのDevOps Research and Assessmentチームが提唱する、ソフトウェア開発チームのパフォーマンスを示す4つの指標のことで以下の通りです。

* デプロイの頻度 - 組織による正常な本番環境へのリリースの頻度
* 変更のリードタイム - commit から本番環境稼働までの所要時間
* 変更障害率 - デプロイが原因で本番環境で障害が発生する割合（%）
* サービス復元時間 - 組織が本番環境での障害から回復するのにかかる時間

上記を測ろうと思うとGitでのcommitやデプロイツールでのデプロイタイミングなどの情報を取得していくのだろうと思います。
ただ、私の仕事の場合、DevOpsだけでなくJiraSoftwareで課題管理をしている関係で、より広い視野で指標を再定義した方がいいと感じました。

そのため、JiraSoftwareに記録した情報をもとに以下の４つの指標を取ることにしました。

* リリース頻度 - 月ごとのJira上の課題完了件数
* 対応のリードタイム - 月ごとのJira上の課題ごとの対応時間の合計
* 障害率 - 月ごとのJira上のバグ課題の件数
* サービス復元時間 - 月ごとのJira上のバグ課題の対応時間の合計

# Jira softwareに項目を追加する
上記の４つを測るためにJiraの課題上で以下の情報を取得する必要があります。

* 課題対応開始日、終了日("Actual Start","Actual End"を利用)
* 課題がバグ対応かそれ以外か("課題タイプ"を利用)
* 実際に対応にかかった時間("時間管理"を利用)
* 課題対応が完了しているかどうか("ワークフロー"を利用)

Actual Start,Actual End、時間管理の項目はデフォルトでは表示されないので、項目追加の設定を行う必要があります。

![スクリーンショット 2023-10-13 11.47.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/c63f4b66-3c69-3a9c-53b7-e2bc493b18e1.png)

https://ja.confluence.atlassian.com/adminjiraserver/managing-system-fields-1047552725.html

# ワークフローが進んだ際に自動で日付を記録する
Jira Automationを利用することで、ワークフローが進んだ際にActual Start、Actual Endに日付を記録するように設定します。

![スクリーンショット 2023-10-13 11.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/45c4842d-fd4e-bb6e-f5f7-db7721bf7c45.png)

https://support.atlassian.com/ja/cloud-automation/docs/create-and-edit-jira-automation-rules/

マニュアルはわかりにくいですが、実際に設定してみると画面UIは使いやすいのであまり迷わず設定できると思います。

#Jira Softwareの課題一覧から必要な情報だけを抜き出す
Jira Softwareの「フィルタ」機能を使うと課題データから必要な項目だけを抜き出して一覧にすることができます。

作った一覧は「別名保存」で保存しておいてください。

# 課題一覧をGoogleSpreadSheetに流し込む
Jira Cloud for Sheetsというアプリが公開されています。
これをGoogleSpreadSheetに入れると、先ほど作成した課題一覧をGoogleSpreadSheetに流し込むことができます。結構便利です👍

https://support.atlassian.com/ja/jira-software-cloud/docs/use-jira-cloud-for-sheets/

# GoogleSpreadSheetのデータをLookerStudioでよみこんでレポート化する
あとはLookerStudioでGoogleSpreadSheetのデータをよみこんでレポート化するだけです。
無事、４つの指標をグラフ化できました🙌

![スクリーンショット 2023-10-13 12.01.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/ec33fb7d-5628-7fdd-2eb6-564ad937d072.png)
【 TypeScript 】"as"と"&"を使って詳しい型情報を提供する

次のようなコールバック関数を作成したとします。

```ts
const getMyPet = () =>
  document.documentElement.getAttribute('myPet')
// const getMyPet: () => string | null
```

関数の戻り値は`string | null`となっています。しかし引数で`myPet`を指定しているので、戻ってくる値は何かしらの具体的な文字列の可能性があります。

事前に次の型を作成していたとします

```ts
type MyPet = 'tama' | 'pochi'
```

`getMyPet()`の戻り値の型に`MyPet`も含める方法について考えます。

まず、`as` を使って戻り値の型を指定してみましょう。

```ts
const getMyPet = () =>
  document.documentElement.getAttribute('myPet') as MyPet
// const getMyPet: () => MyPet
```

`MyPet`型を指定することができました。しかし `null`型が失われているので補いましょう。

```ts
const getMyPet = () =>
  document.documentElement.getAttribute('myPet') as MyPet | null
// const getMyPet: () => MyPet | null
```

ただこのままでは、後で型情報を参照したとき`MyPet`型の具体的な中身である`'tama' | 'pochi'` が表示されません。そこで`Intersection型：&` を使ってTypescriptに詳細情報を表示させましょう。

```ts
const getMyPet2 = () =>
  document.documentElement.getAttribute('myPet') as (MyPet & {}) | null
// const getMyPet2: () => "tama" | "pochi" | null
```

`(MyPet & {})` の箇所は `(MyPet & string)` としても同じ型が得られます。

[Intersection型の詳細は公式ドキュメントを見てください。](https://www.typescriptlang.org/docs/handbook/2/objects.html#intersection-types)

このままでも十分な気もするのですが、`'tama','pochi'`以外の文字列も戻ってくる可能性も残しておきましょう。

```ts
const getMyPet3 = () =>
  document.documentElement.getAttribute('myPet') as (MyPet & {}) | null | (string & {})
// const getMyPet3: () => "tama" | "pochi" | (string & {}) | null
```

`(string & {})`を加えることで、`"tama" | "pochi"`以外の文字列だった場合の条件式を作成するヒントが得られます。

以上です。

今回の例は [TS playground](https://www.typescriptlang.org/play?#code/C4TwDgpgBAsiAKFhQLxQOTAIYFsvqgB8MwB7AYwAsBLdAKDvNIDsBnZAcyTkWTQAoAlKgB8dKFAAmFAK44IzYADpp5OQuABRADYR5ipV2ABBYMABO1AEYzgEfuhwIk6YVlaxnwOgHofUJjZObi8ALighUU9eBkD2KCMeJAAmVAjhFDEJVXUDHP0tXQLDJFMLa1t7Ry9XKHcIpOQAMigAbwBfYWJmGW1tX3844OBG5PDIzKgAImw8KaJpsipqee7e-rpQSGikAHVqYEoAOTkrCHM0zFx8BfQlmgJiAEYGLegAeWZtLyPcaDRGvtDiccGcLi0OgxGCx4okvABmNITLJSWTFfIaHR6DQlExmSw2OwOJy8Wr1fiNKAQzoLHp9Bb8diWZgcKltToDAIw4aNeHjDIiaazLCrRYUGiixnlFlsjpdKB0jZ0IA) で確認できます。
【ChatGPT無】子どもの名前を考えて。


　どうも、カーブミラーです。

　今回は、タイトルまんまです。赤ん坊が産まれたので、その名前をChatGPTに考えてもらいます。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　ちなみに、
　　私の子どもでは
　　　ありません。

　自分の子どもならば、
　　こんなに落ち着いて
　　　いられないでしょうねw

　というわけで、
　　まずは、Promptです。
```Text:子どもの名前を考えてPrompt
# 目的
子どもが産まれました。
彼女に名前を付ける必要があります。
考えてもらえますか？

# 条件
・英語圏の人名。
・上記に、漢字を充てた名前。
・日本語の漢字で、三文字以内で書ける。
・一文字ではダメ。

# フォーマット
日本語人名(英語人名)-説明

# 出力
箇条書きでたくさんお願いします
```

　なんか
　　やっているうちに
　　　大きくなってしまいましたw

　次に、
　　ChatGPTさんが
　　　出力してくれた内容です。
***
***ChatGPT***
もちろん、お手伝いします！以下はいくつかの候補です：

1. 美希(Miki)- 美しい希望を込めた名前。
2. 香織(Kaori) - 香り高い魅力を持つ名前。
3. 翔夢(ShoMu) - 夢に向かって飛翔する名前。
4. 音楽(OnaKa) - 音楽の響きを楽しむ名前。
5. 星奈(HoshiNa) - 星空のような輝きを持つ名前。
6. 結愛(YuiAi) - 愛と絆を意味する名前。
7. 愛理(Airi) - 愛情と理解を表す名前。
8. 夢子(YumeKo) - 夢と希望に満ちた名前。
9. 花菜(HanaNa) - 花のような美しさを持つ名前。
10. 陽介(YoSuke) - 陽光のような明るさを持つ名前。

これらの候補から気に入った名前があれば、お考えになってみてください。また、他にも何か特別な要望があれば教えていただければ幸いです。
***

　美希、香織、星奈、愛理、夢子は
　　いい感じ。

　翔夢は、発音がちょっとダメ。

　陽介は、男じゃんw

　お後がよろしいようで。

　今回は、ここまで。
Googleのアプリパスワード（App passwords）が見つからない時の対処法

TypeScriptのNodemailerモジュールを使ってGmailを送る処理を実装する際にGoogleアカウントのアプリパスワードなるものが必要になりました。

でも、一般的な方法（[ここ](https://dev.classmethod.jp/articles/nodemailer-gmail/)とかに書いてるやつ）ではできなかったので、今後再度必要になった時用のメモとして残します。

## 結論：直接リンクにアクセスする
以下のリンクからアプリパスワードページに飛べる
https://myaccount.google.com/apppasswords

## 確認事項
上記リンクに行く前に、**アカウントの２段階認証が有効化**されているかを確認しておきましょう。

アプリパスワードは、２段階認証が設定されているアカウントのみ使用できます。

## まとめ
直リンクで行けるのはありがたや。
ただ、リンク先を覚えておけないので、ここに記しておきます。

### 参照
https://support.google.com/mail/thread/4477145/no-app-passwords-under-security-signing-in-to-google-panel?hl=en
Python プログラムを介して Word 文書からテキストを抽出する方法

大型なWord文書のテキストを分析または処理する必要がある場合、特定のテキストを迅速に抽出することは手動でコピー＆ペーストするよりも簡単かもしれません。この要件を実現するために、適切なテキスト処理ツールやプログラミング言語のライブラリを使用することができます。この記事では、Pythonのライブラリ「[Spire.Doc for Python](https://www.e-iceblue.com/Introduce/word-for-net-introduce.html)」を使用して、Word文書から特定のテキストまたはすべてのテキストを抽出する方法について説明します。

## ツール
* Visual Studio Code
* [Spire.Doc for Python](https://www.e-iceblue.com/Introduce/word-for-net-introduce.html)

このプロフェッショナル ライブラリは、[Word ドキュメントの作成](https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Document-Operation/Python-Create-Read-or-Update-a-Word-Document.html)、[Word から PDF への変換](https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Conversion/Python-Convert-Word-to-PDF.html)など、Python プラットフォームでの Word ドキュメントの処理をサポートします。

## インストール方法
* まず、[Python](https://www.python.org/downloads/) をダウンロードしてインストールします。
* VS Code で「Extensions」をクリックし、「Python」を検索してインストールします。
* 「Explorer」-「NO FOLRDER OPENED」-「Open Folder」をクリックします。
* 既存のフォルダーをワークスペースとして選択するか、新しいフォルダーを作成することもできます。
* そのフォルダーに「.py」 ファイルを追加し、任意の名前を付けます。
* 「Terminal」-「New Terminal」をクリックします。
* 次のコマンドを入力して、[Spire.Doc for Python](https://www.e-iceblue.com/Introduce/word-for-net-introduce.html) と plum-dispatch v1.7.4 をインストールします。
```python
pip install Spire.Doc
```
## 指定した段落のテキストを抽出する
```python
from spire.doc import *
from spire.doc.common import *

#Documentオブジェクトを作成する
doc = Document()

#Wordドキュメントをロードする
doc.LoadFromFile("sample.docx")

#特定のセクションを取得する
section = doc.Sections[0]

#特定の段落を取得する
paragraph = section.Paragraphs[2]

#段落からテキストを取得する
str = paragraph.Text
print(str)
```
上記のコードでは、**Document.Sections[index]**  と **Section.Paragraphs[index]** プロパティを通じて、指定された段落を取得できます。 次に、**Paragraph.Text** プロパティを通じて段落内のテキストを抽出します。
![2023-10-13_102211.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/cb02c95c-9cc1-35b1-742d-d902e3cec07d.png)

## 文書全体からテキストを取得する
```python
from spire.doc import *
from spire.doc.common import *

#Documentオブジェクトを作成する
doc = Document()

#Wordをロードする
doc.LoadFromFile("sample.docx")

#文書全体からテキストを取得する
str = doc.GetText()
print(str)
```
文書内のすべてのテキストを抽出する場合は、**Document.GetText()** メソッドを直接使用することもできます。
![2023-10-13_102309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/90ee6b93-91b0-f0b4-0595-77b0c4cf76b1.png)
[JavaScript]イベントハンドラ

## イベントハンドラとは
JavaScriptでは、<font color="Red">**イベントハンドラ**</font>という、ウェブページ上でユーザーの操作やブラウザの動作、つまりは**イベント**に反応するために使用されるコードがあります。


・**イベント**: ウェブページ上で発生するユーザーの操作やブラウザの動作を指すトリガー
・<font color="Red">**イベントハンドラ**</font>: イベントが発生した際に実行する関数を紐付けるための**方法**


ユーザーがボタンをクリックしたとき、特定の要素にカーソルを合わせたとき、キーボードのキーを押したとき、フォームが送信されたときなど、さまざまなイベントが発生したとき、それらのイベントに対して、JavaScriptでイベントハンドラを作成することで特定のアクションや処理を実行できるようになります。

以下で、よく使われる**５つ**の**イベントハンドラ**を紹介していきます！


# 1. ボタンクリック時
<font color="Red">**ボタンがクリックされたとき**</font>に実行されるコードを定義する**イベントハンドラ**


```javascript
const button = document.getElementById('myButton');

button.addEventListener('click', function() {
    // ボタンがクリックされた時の処理
});
```

# 2. マウスオーバー時
<font color="Red">**カーソルが要素に乗ったとき**</font>に実行されるコードを定義する**イベントハンドラ**
```javascript
const element = document.getElementById('myElement');

element.addEventListener('mouseover', function() {
    // カーソルが要素に乗った時の処理
});
```
# 3. キープレス時
<font color="Red">**キーボードのキーが押されたとき**</font>に実行されるコードを定義する**イベントハンドラ**
```javascript
document.addEventListener('keypress', function(event) {
    // キーボードのキーが押された時の処理
    const key = event.key;
});
```

# 4. フォーム送信時
<font color="Red">**フォームが送信されたとき**</font>に実行されるコードを定義する**イベントハンドラ**
```javascript
const form = document.getElementById('myForm');

form.addEventListener('submit', function(event) {
    // フォームが送信された時の処理
    event.preventDefault(); // ページのリロードを防ぐ
});
```

# 5. ウィンドウのロード完了時
<font color="Red">**ページが完全に読み込まれた後**</font>に実行されるコードを定義する**イベントハンドラ**
```javascript
window.addEventListener('load', function() {
    // ページのロードが完了した後の処理
});
```


# まとめ
これらはJavaScriptでよく使用されるイベントハンドラの一部です。
他にも様々なイベントハンドラがあるので、調べてみてくださいね。
Python から C を呼び出して利用する方法

Cは高速で計算できて良いのだけども、なにかを少し変えるごとにいちいちコンパイルしなおしてというのがちょっと面倒に感じるとことがあります。

そこで定型の計算のモジュールをCで用意し、UIやSensor I/OをPythonで行ない、PythonからCのモジュールを呼び出して計算を行ない、UIやSensor I/Oの変更はPython上で柔軟に行なうということをやってみましたところ意外と簡単で便利そうなので投稿してみました。

以下が定型計算のCのソースです。引数はa,bの入力と戻り値用のポインタ retPointerで、戻り値はreturnからのtmp2とretPointerに入れこんだtmp1です。

```c:pyTest.c
#include <stdio.h>

double test(double a, double b, double *retPointer ){
    double tmp1 = a * b;
    double tmp2 = a / b;
    *retPointer = tmp1;
    return tmp2;
}
```
これをコンパイルするときに以下のように.so (shared object)を出力します。

```Linux: Linux
$ gcc -shared -o pyTest.so pyTest.c
```
そしてpython側はctypesというライブラリをimportしてpyTest.soに対して引数と戻り値をそれぞれ定義し、a,bの入力をinp1,inp2のfloat数からctypeのdoubleに変換し、また戻り値用のポインタをretで定義しています。

そうした上でretValue = libtest.test(inp1,inp2,ret)を実行することでinp1,inp2,retが引数として渡され戻り値(return)はretValueに代入され、またポインタ(ret)には別の戻り値が返されます。
注意点としてpythonのfloatはCではdoubleになります。

```python:cTest.py
import ctypes

libtest = ctypes.CDLL("./pyTest.so")
libtest.test.argtypes = [ctypes.c_double,ctypes.c_double\
                         ,ctypes.POINTER(ctypes.c_double)]
libtest.test.restype = ctypes.c_double
ret=ctypes.c_double()

a=input("a?: ")
b=input("b?: ")                         

inp1 = ctypes.c_double(float(a))
inp2 = ctypes.c_double(float(b))

retValue = libtest.test(inp1,inp2,ret)


print("a= ",a," b= ",b)
print("a * b = ",ret.value)
print("a / b = ",retValue)

```
以下が実行結果で 3 , 7 の入力に対して掛け算と割り算の結果が表示されてます。

```: Result
a?: 3
b?: 7

a=  3  b=  7
a * b =  21.0
a / b =  0.42857142857142855
```
今回はLinux(ubuntu)上でコンパイル・実行しました。Windows上でもDLLで同じような操作ができるということですが試していません。
もしWindows上でやってみた方がいればコメントいただければうれしいです。

以上
STM
Failed to parse time stringエラー

Laravel sailでテストコード書こうとしたらエラーが出た時のまとめ。

#### Failed to parse time string
タイムゾーンのエラーみたいです。

```
sail shell
date
```

で調べたらUCTでした。
コンテナはデフォルトでUCTらしいです。

```docker-compose.yml
（略）
environment:
      TZ: Asia/Tokyo
（略）
```
これでOK

　　
#### Base table or view not found: 1146 Table '×××' doesn't exist

テスト用にDBを分けていたんですが、設定をミスってました。

```env.testing
APP_ENV=testing
APP_KEY=

// 接続したいDBの情報を設定する
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test_database
DB_USERNAME=root
DB_PASSWORD=
```
keyを作る
```
sail artisan key:generate --env=testing
```

```phpunit.xml
<php>
    <env name="APP_ENV" value="testing"/>
    <env name="BCRYPT_ROUNDS" value="4"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="MAIL_MAILER" value="array"/>
    <env name="QUEUE_CONNECTION" value="sync"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="TELESCOPE_ENABLED" value="false"/>
</php>
```

テスト用のDBを作る。
作り直す時は:freshで
```
sail artisan migrate --env=testing  
```

これでOK






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

参考

https://qiita.com/HiMinmeg/items/f098151c32583cd19132


https://qiita.com/akkino_D-En/items/024661836b7570d78704
Django基本５～Templateのフォルダを特定の場所で管理する

今回はTemplateのフォルダ管理を考えてみました。
これは、前回の実行結果です。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/86054a1b-49c2-beb9-624b-a612d9fc0d71.jpeg)
これは、norizo_app3フォルダ配下のtemplates/index.htmlが表示されています。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/b2c411b2-b97d-e951-cbc4-598d84d02137.jpeg)

htmlの入っているライブラリを上位のフォルダに移すなどの管理が出来ます。
自分の開発の経験からすれば、本番リリースまでの間、仮登録のプログラムで動かす、、、なんて局面とか使えそうかと、、、



１．setting.pyを修正する
「BASE_DIR～」を記載されてるところがあります。←これはparent.parent(親のさらに親の）の一番上のディレクトリを定義していて、norizo_project3のpathを定義してます
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/1bd62ff6-b941-bafe-3c2b-be54d452e85f.jpeg)
ここに以下の修正を行います。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/8e498dd8-506c-5bff-a92a-e93eb8ca1fa2.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/7deae8a4-7259-ff65-724e-bed42c3d4d7e.jpeg)
このように修正します。これでpathと定義が紐づけられます。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/44132e11-b561-4fe5-4cd8-fced05766b52.jpeg)
２．プロジェクトフォルダ直下にTemplateフォルダを作成します。
（１）norizo_projectt3直下にtemplatesをフォルダ作成する。
（２）noriao_app3/templates/index.htmlを
      (1)で作成したnorizo_project3/templatesにコピーする
（３）内容を「どーもー」から「どうしたん？」に変更する
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/b04cbe1c-6e53-9a99-6b02-c0f25282da6c.jpeg)
(4)起動して結果を確認します。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/1752e9a1-489b-e470-31d1-85b60b607f96.jpeg)

上手くいきました。プロジェクトフォルダ直下のtemplates/index.htmlが読み込まれ、「どーもー」→「どうしたん？」に切り替わりました。

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/989cf02c-6ceb-a719-4a05-5d13c3cdf4a1.jpeg)
Reactで簡単にパスワード自動生成を行う



## 今回のゴール

パスワード生成ボタンをクリックするとランダムな文字列を生成し、inputタグのvalueに代入する。

## 実践

下記は最終的なコードです。(Aboutコンポーネントというものを使用していますが、気にしなしいでください。)

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

const About = () => {
  const [inputPassword, setInputPassword] = useState<string>('');

  function createPassword() {
    const material =
      'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+~`|}{[]:;?><,./-=';
    let password = '';
    const passwordLength = 16;
    for (let i = 0; i < passwordLength; i++) {
      const randomNumber = Math.floor(Math.random() * material.length);
      password += material.substring(randomNumber, randomNumber + 1);
    }
    setInputPassword(password);
  }
  return (
    <div>
      <h2>パスワード自動生成</h2>
      <input type="text" className="createPassword" value={inputPassword} />
      <button onClick={() => createPassword()}>パスワード生成</button>
    </div>
  );
};

export default About;
```

```css
.createPassword {
  width: 500px;
}
```

下記は箇条書きで概ねの関数の流れです。

- 使用する文字を定数`material`に格納。
- 後の文字列が入る変数`password`は空で初期化。
- 生成するパスワードの長さを定数`passwordLength`に格納(ここは各自自由な数値に変更可能)。
- for文で生成する記述をループ
- 定数`randomNumber`に使用する文字列の長さにランダムに生成した数値にかけて、整数値だけを格納。
- 変数`password`に使用する文字列を`substring`メソッドにより先ほど`randomNumber`で得た数値を元に取り出す
- 状態関数`setInputPassword`の引数に`password`を代入する。

そして、inputタグのvalue値に状態変数を代入することでランダムな文字列なパスワードを生成しました。

## 生成されたパスワード文字列
パスワード生成ボタンをクリックしてランダムに生成されたパスワード文字列がこちらです。
![スクリーンショット 2023-10-13 11.27.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669320/fa173fcf-9104-dcf9-a288-48e877f8a8aa.png)


## 参考記事
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/substring
.NET Frameworkの TLS 1.2対応

いまさら感があるのですが、古いシステムを並行稼働させている場合に、サーバ側を変更すると突然「繋がらない」事件が発生します。ということで、TLS対応についてメモです。

詳細というか詳しくは下記なのですがWindows対応が非常に複雑です。

https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/dotnet-framework-tls12/

## OS側

以下の３パターンがあり

- デフォルトで使えない
    - Windows Server 2008 SP2
- デフォルトがv1.0で明示しないと使えない
    - Windows Server 2008 R2 / Windows 7
- デフォルトでv1.1, 1.2が使える
    - Windows Server 2012 / Windows 8.1

## .NET　Framework　（開発時ターゲット）

- v1.2対応には更新プログラムが必須
    - .NET Framework 3.5
- 既定値はv1.0で明示が必要
    - .NET Framework 3.5（更新適用）
    - .NET Framework 4.5.2
- 既定値はv1.0~1.2
    - .NET Framework 4.6
- 既定値はOSデフォルト
    - .NET Framework 4.7.x
    - .NET Framework 4.8.x

確か明示すると非対応の場合にはサクッと落ちる問題有り。

## 対応方法

- 全部共通でに動かすには「TLS１.0」を明示する
    - TLS1.0, 1.1　廃止に対応できない...
- パッチ対応してv1.2を明示して動かす
    - Windows Sever ２００８ SP2がある場合要パッチ配布
    - .NET Framework 3.5を使っている場合要再ビルド
    - 配布めんどい。将来の上位以降はまた考える必要がある
- 依存をなくすためにgolangで同じようなものを作り直す
    - 古い機種の互換性のための新規開発の今更感

## ベストプラクティス

下記リンクはベストプラクティスだそうですが、基本はアプリは.Net Framework 4.7以降を使うようにアップデートして、OS(は新しいものを使いアップデートされているのは当然なので)にプロトコル選択は最適なものが選ばれるので任せるように...という事だとは思います。

ま、そりゃそうなんですけどね。

https://learn.microsoft.com/ja-jp/dotnet/framework/network-programming/tls

セキュリティ系の進化が早くアップデートなども随時かけていく方向性（雰囲気）にはなっていますが、スタンドアローンアプリをユーザー環境で長期間動かすのはなかなか難しいですね。
フォローする ボタン

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [Lightning ページの [レコードをフォロー] ボタンの非表示化または再表示](https://help.salesforce.com/s/articleView?id=000390149&type=1)
+ [レコードまたはリストビューで [フォローする] アイコンを使用できない](https://help.salesforce.com/s/articleView?id=000385704&type=1)

+ [ダッシュボードから「フォロー」ボタンを削除/非表示にする](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000FXZpVSAX)
+ [Napaliテンプレートのフォローボタンを削除することは可能ですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7fg5SAB)
+ [モバイル版では、タスクをクリックすると、[フォローアップ] ボタンが表示されます。 デスクトップビューにはそのオプションが表示されません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A94sYSAR)

+ [[フォローする]ボタンをモバイルで非表示にしたい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007MYxY0SAL)
[Flutter]Flutterでの依存関係図の自動生成が便利だった件について

![スクリーンショット 2023-10-13 10.56.20（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/80d78441-d690-3481-e349-13f38ef73321.png)


こんにちは。いせりゅーです😃

「視覚的に理解しやすく、効率的にコードの構造や流れを把握する」ということは開発においてとても助けになると思っています。特に複雑なアーキテクチャや多数のコンポーネントを持つフレームワーク、例えばFlutterのようなものを使用する場合、依存関係の把握は必須となりますが、把握をするのが難しかったり、時間がかかったりすると思います。

実際に、社会人になり研修課題をしている中で`riverpod_graph`を勉強し、それがとても便利だったので、アウトプットのために書いていこうと思いました。

# riverpod_graphとは、

https://github.com/rrousselGit/riverpod/tree/master/packages/riverpod_graph

<b>↑こちらから引用しています。</b>

:::note info
認識のミスがありましたら、コメントいただけると幸いです🙇
:::

- riverpodの作成者が作成したツール
- providerとwidget間の相互作用のグラフを生成し、可視化できるもの
- 手順を踏むとと自動生成ファイルが生成される（今回は、graph.mdに生成する）
- グラフは、[d2](https://d2lang.com/)か[Mermaid](https://mermaid.js.org/#/)のテキストからグラフへの構文を使用して生成できる。
  - d2とは、
    - 美しいダイアグラムを数分で作成できる。
    - カスタマイズが自由自在にできる。
  - Mermaidとは
    - JavaScriptベースの図作成およびグラフ作成ツール
    - Markdownにインスパイアされたテキスト定義をレンダリングし、ダイアグラムを動的に作成・変更する。

# 手順

１、プロジェクトに移動
```
cd <プロジェクト>
```

２、インストール（インストールしていない場合）
```
dart pub global activate -sgit https://github.com/rrousselGit/riverpod.git --git-path packages/riverpod_graph
```

３、生成する
```
dart pub global run riverpod_graph:riverpod_graph > graph.md
```

# 自動生成してみた

具体的にどんな依存関係図が作成されるかを見てみましょう。

自動生成された依存関係図は、現在、取り組んでいるゆめみの研修課題を参照することにしました。

```mermaid
flowchart TB
  subgraph Arrows
    direction LR
    start1[ ] -..->|read| stop1[ ]
    style start1 height:0px;
    style stop1 height:0px;
    start2[ ] --->|listen| stop2[ ]
    style start2 height:0px;
    style stop2 height:0px;
    start3[ ] ===>|watch| stop3[ ]
    style start3 height:0px;
    style stop3 height:0px;
  end
  subgraph Type
    direction TB
    ConsumerWidget((widget));
    Provider[[provider]];
  end

  weatherRepositoryProvider[["weatherRepositoryProvider"]];
  weatherDataSourceProvider[["weatherDataSourceProvider"]];
  weatherScreenViewModelProvider[["weatherScreenViewModelProvider"]];
  WeatherScreen((WeatherScreen));
  _WeatherBody((_WeatherBody));

  weatherScreenViewModelProvider ==> WeatherScreen;
  weatherScreenViewModelProvider -.-> _WeatherBody;
  weatherDataSourceProvider ==> weatherRepositoryProvider;

```

[リポジトリとしてはこちらとなります。](https://github.com/iseruuuuu/flutter_yumemi_training_app/blob/main/ARCHITECTURE.md#riverpod-%E3%81%AE-provider-%E3%81%AE%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E5%9B%B3)


# 最後に

このような視覚的なサポートツールは、コードの「読みやすさ」という点で非常に大きな貢献をしてくれると僕は思います。

最後に、この記事を読んで、少しでもFlutterの開発が楽しく、効率的になる手助けになれば幸いです。もし、他にも便利なツールやテクニックを知っている方がいれば、ぜひコメントやフィードバックをお寄せください。

これからももりもりとインプットとアウトプットを頑張っていきます🤗


# 参考文献

https://github.com/rrousselGit/riverpod/tree/master/packages/riverpod_graph

https://zenn.dev/noboru_i/articles/ea02828f33deaa

https://d2lang.com/

https://mermaid.js.org/#/
仕様を書くとき・読むときに注意すべき用語

仕様を書くとき・読むときに注意すべき用語に関する情報をまとめておく。

# 注意すべき用語

## 差別用語

https://www.itmedia.co.jp/news/articles/2104/26/news064.html

https://qiita.com/Daara_y/items/c7caf39dba0e6a61e7da

## 数字の区切り方、カンマ・コンマ

https://note.com/twonderfuldays/n/n6ae2c71a7cb0

https://coliss.com/articles/build-websites/operation/writing/53.html

## 以上、以下

https://note.com/stwtcpld/n/n77be3a9eb4c4

## カタカナ語

https://qiita.com/kaizen_nagoya/items/f1c0384a13dd13c5e7f1

https://dime.jp/genre/1578619/

https://www.bunka.go.jp/tokei_hakusho_shuppan/tokeichosa/kokugo_yoronchosa/h14/katakana_shiyo.html

# 関連記事

https://qiita.com/kazuo_reve/items/b15d99759d75f942b9f0
【言語検出】pycld3を使って文章の言語検出してみた

# はじめに
botの入力制限に特定の言語のみを受け取りたいという要望があったので、それを実現する手法の1つとしてpycld3というライブラリで検証してみようと思います。

**この記事でやること**

- 文章からpyclda3を用いて言語コードを取得する

# 実装
まずはライブラリのインストールから行います。
詳しくは[こちら](https://pypi.org/project/pycld3/)を確認してください。
pythonのバージョンは以下のように指定されているので今回は `python=3.8`の環境で実装しました。

```
Requires: Python >2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*
```
余談ですが、python3.- ~ 3.5ではpycld2という別のライブラリが使えるようでした。

```:インストール
pip install pycld3
```
このライブラリは`cld3`という名前でimportできます。
```py:main.py
import cld3
```

次に今回判別に使う仮データを用意します。
```py:main.py
samples = {
    '月が綺麗ですね' : 'ja', # 日本語
    'The moon is beautiful.' : 'en', # 英語
    'La lune est belle' : 'fr', # フランス語
    'La luna è bellissima' : 'it', # イタリア語
    '月が綺麗ですね The moon is beautiful' : 'ja + en',
    '月が綺麗ですね La lune est belle' : 'ja + fr',
    '月が綺麗ですね La lune è bellissima' : 'ja + it',
    '月が綺麗ですね The moon is beautiful La lune est belle La lune est belle La luna è bellissima' : 'mixed',
}

```
今回は日本語、英語、フランス語、イタリア語の４カ国議＋複数の言語の結合文字列で実験しました。

```py:main.py
for k, v in samples.items():
    lang = cld3.get_frequent_languages(k, num_langs = 1)[0][0]
    print(f'入力言語{v} : 検出された言語{lang}')
```
コードの全体像はこちらになります。
```py:main.py(全体)
import cld3

samples = {
    '月が綺麗ですね' : 'ja', # 日本語
    'The moon is beautiful.' : 'en', # 英語
    'La lune est belle' : 'fr', # フランス語
    'La luna è bellissima' : 'it', # イタリア語
    '月が綺麗ですね The moon is beautiful' : 'ja + en',
    '月が綺麗ですね La lune est belle' : 'ja + fr',
    '月が綺麗ですね La lune è bellissima' : 'ja + it',
    '月が綺麗ですね The moon is beautiful La lune est belle La lune est belle La luna è bellissima' : 'mixed',
}

for k, v in samples.items():
    lang = cld3.get_frequent_languages(k, num_langs = 1)[0][0]
    print(f'入力言語{v} : 検出された言語{lang}')

```

# 実行結果と考察
```:実行結果
入力言語ja : 検出された言語ja
入力言語en : 検出された言語en
入力言語fr : 検出された言語fr
入力言語it : 検出された言語co
入力言語ja + en : 検出された言語en
入力言語ja + fr : 検出された言語ja
入力言語ja + it : 検出された言語it
入力言語mixed : 検出された言語fy
```

表にまとめると以下のようになります。

| 入力言語 | 検出言語 | 正誤 |
| --- | --- | --- |
| 日本語 | 日本語 | O |
| 英語 | 英語 | O |
| フランス語 | フランス語 | O |
| イタリア語 | コルシカ語 | X |
| 日本語＋英語 | 英語 | - | 
| 日本語＋フランス語 | 日本語 | - | 
| 日本語＋イタリア語 | イタリア語 | - | 
| 全文章結合 | フリジア語	 | - | 

興味深い点としては、単一言語で検出ではコルシカ語と検出されたイタリア語が、日本語＋イタリア語の混合文章ではイタリア語として検出されているということかなともいました。

また、今回は短い文章に対して検出を行ったのでより長い文章にすることで各言語ごとの差がつき、より正しい検出になることができそうな気もしました。

# まとめ
完全な精度でないですが、単一の言語認識において英語かそうでないかを判別するという、大元の要件はこのライブラリで満たすことができそうなので、一定利用しやすいライブラリなのかと思います！
ぜひ、皆さんも使ってみてください！！！
VPC エンドポイントポリシーのプリンシパルを書く時の注意点

VPCエンドポイントポリシーを設計する際に、ゲートウェイ型のエンドポイントポリシーのPrincipalを定義したが、意図した動作にならないことに気づきました。
ゲートウェイエンドポイントでプリンシパルに定義する際には`aws:PrincipalArn`を利用する必要があります。

## AWS公式ドキュメントには

> ゲートウェイエンドポイントでは、aws:PrincipalArn 条件キーを使用してプリンシパルへのアクセスを許可する必要があります。次のいずれかの形式でプリンシパルを指定すると、アカウントのすべてのユーザーとロールではなく、AWS アカウントのルートユーザーのみにアクセスが許可されます。
> ```
> "AWS": "account_id"
> ```
> ```
> "AWS": "arn:aws:iam::account_id:root"
> ```
https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints-access.html#vpc-endpoint-policies

## インターフェイスエンドポイントの"AWS": "arn:aws:iam::account_id:root"プリンシパルの意味

インターフェイスエンドポイントでの意味はアカウントのすべてのユーザーとロールという意味になります。

```yaml
Version: '2012-10-17'
Statement:
  - Effect: Allow
    Principal: 'AWS: "arn:aws:iam::account_id:root'
    Action: '*'
    Resource: '*'
```

## ゲートウェイエンドポイントの"AWS": "arn:aws:iam::account_id:root"プリンシパルの意味

ゲートウェイエンドポイントの意味はAWS アカウントのルートユーザーという意味になります。

```yaml
Version: '2012-10-17'
Statement:
  - Effect: Allow
    Principal: 'AWS: "arn:aws:iam::account_id:root'
    Action: '*'
    Resource: '*'
```

## 対応方法: ゲートウェイエンドポイントでの aws:PrincipalArn 条件キーの使用

ゲートウェイエンドポイントでは、aws:PrincipalArn 条件キーを使用してプリンシパルへのアクセスを許可する必要があります。これにより、特定のプリンシパルに対してアクセスを制限できます。

### 例: 特定のプリンシパルに対するアクセス制限

以下は、特定の IAM ユーザー（ユーザーA）にのみアクセスを許可し、他のプリンシパルにはアクセスを拒否する VPC エンドポイントポリシーの例です。

```yaml
Version: '2012-10-17'
Statement:
  - Effect: Allow
    Principal: '*'
    Action: '*'
    Resource: '*'
    Condition:
      StringEquals:
        aws:PrincipalArn: arn:aws:iam::account_id:user/ユーザーA
```

このポリシーでは、ユーザーA に対してすべてのアクションとリソースへのアクセスを許可しています。同時に、aws:PrincipalArn 条件キーを使用して、ユーザーA 以外のプリンシパルに対するアクセスを制限しています。

この方法により、ゲートウェイエンドポイントを通じて特定のプリンシパルに対するアクセスを制限することができます。
ラズパイZeroのセットアップ後やっておくこと

# セットアップ後の設定１
swapファイルのサイズを変更しておく。
ラズパイZeroでX-Windowを入れて動かすと標準の設定ではメモリ不足気味にあってしまうため最初にswapファイルの大きさを大きめにしておきます。

## やり方
1.sudo bash でrootユーザーに切り替え
2./etc/dphys-swapfileをテキストエディターで開き
CONF_SWAPSIZE=100
を
CONF_SWAPSIZE=1000
に変更する
3.内容を保存してテキストエディタを閉じる
4.rebootでリブートする。

# セットアップ後設定２
ssh と VNC を有効にする。
モニターやキーボードをつなぐのが面倒なので上の２つを有効にしておいてリモートで使えるようにしておく！！
ssh はWindows10以降でWindowsのコマンドプロンプトから標準で使えるようになっているのでテラTERMなどを入れる必要はない。
vnc はRealVNCのサイトからクライアントをダウンロードすると接続できます。
VNCの設定はVNCを有効にしたあと設定の「ディスプレイ」タブでヘッドレス解像度を指定してくことをお忘れなく！！

## 意外と知られていないコマンド
昔あったランレベル設定がラズパイでは引き継がれています。
なのでラズパイでは、initコマンドがサポートされており 
init 3 でGUIモードからCUIモードに切り替えられる。
init 5 でGUIに戻せます。
ラズパイZeroではメモリが少ないのでX-Windowsを使わないようにすると余裕で動かせますのでこの切り替え方を覚えておくと便利です。
UbuntuでMySQL起動時にエラー

Ubuntu 20.04でMySQLを起動しようとしてエラーで詰まったときの解決方法を記録しておきます。

まずはMySQLをインストール。
```
$ sudo apt update
```
```
$ sudo apt install mysql-server
```

バージョン確認できました。
```
$ mysql --version
mysql  Ver 8.0.34-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
```

MySQLに接続、、っと。エラーが出ました。
```
$ sudo mysql -u root -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

そもそも起動していないからか。と思い起動を試みるも、コマンドが見つからんと。
インストールしたはずなのに、おかしい。

```
$ systemctl mysql start
Unknown operation mysql.
$ sudo mysql.server restart
sudo: mysql.server: command not found
```

調べていくと、以下の記述を見つけました。
https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04-ja
>MySQL 5.7（またそれ以降のバージョン）を実行しているUbuntuシステムでは、rootMySQLユーザーはデフォルトによりパスワードではなくauth_socketプラグインを使用して認証するように設定されています。ただしこのプラグインを使うには、MySQLクライアントを呼び出すオペレーティングシステムユーザー名と、コマンドで指定したMySQLユーザー名を一致させる必要があるため、root MySQLユーザーにアクセスできるようにするには sudo 権限でmysqlを呼び出す必要があります。
$ sudo mysql

なるほど？
とりあえずやってみました。

```
$ sudo mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.34-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
起動しました。
MySQLのバージョンは8だったので、今回はこれに当てはまったのではないかと思います。
さくらのクラウドのパケットフィルタ設定


さくらのクラウドにはパケットフィルタ（=ファイアウォール）が設定できます。
ちょい設定に苦戦したんでメモを残します。
参考になったら嬉しい。

# 前提

Linuxサーバ, web + DB を1台で運用を想定

# やること

プリセットから選択：不要ポートのフィルタ（Linux用）　を使って、不要な設定は消す。

# 詳細
## パケットフィルタの追加

さくらのクラウド（コントロールパネル） > ネットワーク > パケットフィルタ

* プリセットから選択：不要ポートのフィルタ（Linux用）
* SSH_Source_Network：（指定したIPのみ接続許可、127.0.0.1は例）
* NTP_Source_Network：（指定したIPのみ接続許可、127.0.0.1は例）
* 名前：（任意, testは例）
* 「作成」ボタン押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/ec64392c-6ce6-5f14-fad5-30d5ef1b8383.png)

## パケットフィルタの編集

パケットフィルタを再度開く > (作った名前) > ▼ > 詳細 > (タブ)ルール

### 変更前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/f513e2d5-46e6-bb48-361e-56822551a899.png)

### 変更後

* 削除
  * ポート：110 = POP3（電子メール受信サーバ）
  * ポート：25 = メール配達（SMTP）
  * ポート：123 = NTP
  * プロトコル：fragment = 大きいパケットをfragment(分割)した2パケット目以降にマッチ
* 追加
  * ポート：443 = https

#### 「反映」ボタン押下前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/5a1d198e-efa5-e905-9947-a09c04fdcc8e.png)

忘れずに「反映」ボタン押下　

#### 「反映」ボタン押下後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/a9698c49-3047-26ff-3ef9-e5c8125beda1.png)

作ったパケットフィルタはサーバのNICに割り当てて使用します。
以上です。

# 情報源

* [パケットフィルタ | さくらのクラウド ドキュメント](https://manual.sakura.ad.jp/cloud/network/packet-filter.html)
* [パケットフィルタを活用したサーバのセキュリティ対策 – 「さくらのクラウド入門」(9) | さくらのナレッジ](https://knowledge.sakura.ad.jp/7133/)

# 補足

## プロトコル

* TCP: 「安全性重視で会話のキャッチボールをしましょう」な方式
* UDP: 「スピード重視で会話のキャッチボールをしましょう」な方式
* ICMP: pingで使ってる
* fragment: fragment(分割)されたIPパケットの2パケット目以降にマッチします。
　1パケット目はTCPまたはUDPで指定したポート番号でのマッチが可能です。
* IP: ip指定
* 補足
  * [「TCP」と「UDP」の違い｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/diff61tcpudp.html)
  * [ICMPとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word13132.html)
  * [第10回　IPパケットの構造とIPフラグメンテーション：基礎から学ぶWindowsネットワーク（3/3 ページ） - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/0304/04/news001_3.html)


## ポート番号

* ポート (TCP)110 電子メール受信サーバがPOP3で電子メールクライアントに受信メールを配送するために用いる。
* ポート (TCP)25  メール配達（SMTP）
* ポート (UDP)68  DHCP
* ポート (UDP)123 NTP
* 補足
  * [68番ポートとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word19685.html)
    > DCHPのやり取りで使われる（クライアント側の）ポートだよ
  * [123番ポートとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word19756.html)
    > NTPのやり取りで使われるよ
【Unity】【小ネタ】Projectビュー内にショートカットを配置すると、以外と便利

# こんなんができます！
ショートカットをダブルクリックして、Asepriteを開いてます↓
![koneta_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/dbf8fb3e-ba17-4fb9-6a57-c3a3d929f4fd.gif)





# 作り方
1. Projectビュー上で右クリックして、"`Show in Explorer`"を選択してエクスプローラーでAssetsフォルダを表示する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/2acd3293-259e-4925-9930-590ecfd90c80.png)


1. そこに、"`新規作成`" → "`ショートカット`" でショートカットを作成
1. サイトのリンクとかアプリのパスを参照する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/35c55ca6-5cb5-8321-b5f4-9f0ad6ea838f.png)

1. こんな感じになってたらOK
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/9bc08eef-7694-839f-9add-9f6cb16831d1.png)




# 使い道
- **ローカル(Cドライブとか)のショートカットは、共同作業とかには向いてない**
- インターネットショートカットは、基本的に誰でもアクセスできる

### 個人向け
- アプリのショートカット

- PlayerPlefsなどのデータ保存場所へのショートカット

など


### 共同でも個人でも
- Twitterとかホームページの参照

- GoogleDriveのファイルの参照

- ヘルプ用サイトへの参照
    - 社内Wikiとか






# さいごに
以外と時間短縮できて便利！

また、Assetフォルダ内のフォルダへの参照もできますが、エクスプローラーで開かれちゃいます
ここら辺はエディタ拡張で補うしかなさそう…？



## 参考
https://baba-s.hatenablog.com/entry/2017/12/27/180400