OmniAICreator/Qiita-1.07M huggingface dataset:
Application ComposerでCfnテンプレートを表示してみた

AWS の CloudFormation コンソールに Application Composer が組み込まれたので、既存のテンプレートを表示してみました。
テンプレートの詳細は記載しませんが、およそ以下のようなことを行っています。

1. EventBridgeのScheduleRuleを使用して、定期的にCodeBuildのプロジェクトを起動する
2. CodeBuildのプロジェクトでは、以下をおこなう
2.1. Gitのリポジトリからソースコードを取得する
2.2. 静的ウェブサイトを生成する
2.3. S3にアップする

S3では静的ウェブサイトをホストしていて、バケットポリシーに接続元として許可するIPアドレスを記載することで、社内ドキュメントとして参照しています。

## Application ComposerとCfnデザイナーで表示したところ

Application Composerの画面
![application_composer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19245/000e1334-ff3a-0fbc-8831-9b29ea80afbc.png)

CloudFormationのデザイナーの画面
![cfn_designer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19245/9d8cf96e-9a47-8f87-859b-667c12c8108e.png)

Application Composerの方がすっきりレイアウトされていて、CodeBuildのプロジェクトで一緒に使用するロールがまとめて表示されています。
CodeBuildのアイコンにStandard Componentと書いてあるので、一般的に一緒に作られるリソースをまとめた定型アイコンかもしれません。

一方、表示されているリソースという面では、ScheduleRuleではCodeBuildのビルドを開始するためにロールを作成していますし、IPアドレス制限をするためにバケットポリシーを作成しています。

Designerでは作成されたリソースが一つ一つアイコンで表示されていますが、 Application Composerにはバケットポリシーがなかったり、ScheduleRuleで使用するロールがなかったりと、いくつか抜け落ちているのに気づきます。CodeBuildみたいにうまく一緒に表示してほしいものが、いくつか表示されていないのではないか? という感じです。

まとめとしては、全体を把握する上ではApplication Composerの表示はわかりやすいな。と思いました。
特にCodeBuildのアイコンはよいです。
Standard Componentが私が想像しているように、一般的に一緒に作られるリソースをまとめた定型アイコンということであれば、ということにはなりますが、ヴィジュアルに把握できる部分が増えて理解しやすくなりそうな気がします。

テンプレートはCDKやCloudFormationのYAMLで書いて、gitでコード管理しているので、表示が綺麗になったからといって、Application Composerで書くか? と言われると書かないとおもいます。

それでもデザイナーの表示では細かすぎる、ドローツールで書くには細かすぎるに対してちょうどよい感じの表示方法ですごくいいなと思いました。CDKやAWS CLIでこの画像をつくるコマンドがほしいなと思います。
Power Apps Patch 関数でSharepointリストに添付ファイルを追加する

## Power AppsでForm ではなくPatch関数でSharePointリストを更新したいが、添付ファイルのコントロールが無い

* 一旦 フォームの部品を追加する
    * フォームの添付ファイルの部品だけ残す
*Patch関数の{} の後に, を追加して追加したFormの Updatesを指定

 Patch(
        リスト名,
        Defaults(リスト名),
        {
            Title:"XXXXX"
            ,Type:radio1.Selected.Value
        },
        Form1.Updates
);
PyFileSystem2 のリスト系メソッドまとめ

# 概要

[PyFileSystem2](https://github.com/PyFilesystem/pyfilesystem2) のリスト系のメソッドの使い分けに毎回混乱するのでメモしておく。

# 結論

| 階層辿るか | メソッド                       | 型                                                  |
|-------|----------------------------|----------------------------------------------------|
| -     | `listdir('.')`             | `list[ベース名]`                                   |
| -     | `scandir('.')`             | `Generator[Info]`                                  |
| -     | `glob('*')`                | `Generator[GlobMatch(path: フルパス, info: Info)]` |
| 階層辿る  | `glob('**/*')`             | `Generator[GlobMatch(path: フルパス, info: Info)]` |
| 階層辿る  | `walk.files()`             | `Generator[フルパス(fileのみ)]`                              |
| 階層辿る  | `walk.dirs()`             | `Generator[フルパス(dirのみ)]`                              |
| 階層辿る  | `walk.files(filter=['*'])` | `Generator[フルパス(fileのみ)]`                      |
| 階層辿る  | `walk.dirs(filter=['*'])`  | `Generator[フルパス(dirのみ)]`                       |
| 階層辿る  | `walk.info(filter=['*'])`  | `Generator[tuple[フルパス(両方), Info]]`             |

- `Info` : `file` or `dir` のオブジェクト
  ```py:Infoのクラスイメージ
  @dataclass
  class Info:
      name: str  # ファイル or ディレクトリ の ベース名
      is_file: bool
      is_dir: bool
  ```
脅威検知・防御サービスAWS Shield、AWS WAF、GuardDuty、Inspector、Macie の違い

### なぜこの記事を書いたのか？
AWS が提供する脅威検知・防御サービスにおいて、AWS Shield、AWS WAF、GuardDuty、Inspector、Macie の名前とサービス内容が一致しないので、AWS-SAA の問題文に書かれている要件に対する正解がわかりませんでした。これらをはっきりと区別するために書きました。

#### 脅威検知・防御サービス比較表

| サービス | 主な機能 | 保護対象 | 脅威の種類 | 検知方法 | 対応方法 |
|:-:|:-:|:-:|:-:|:-:|:-:|
|AWS Shield|DDoS 攻撃に対する防御|インターネットに接続された AWS リソース|ボリューム型 DDoS 攻撃、アプリケーション層攻撃|ネットワークトラフィックの監視、異常検知|自動的な攻撃軽減|
|AWS WAF|Web アプリケーションに対する攻撃防御|AWS 上の Web アプリケーション|SQL インジェクション、クロスサイトスクリプティング、リモートコード実行|事前定義されたルールとカスタムルールに基づくリクエストの検査|自動的なリクエストブロック、手動によるチャレンジ|
|GuardDuty|脅威の検知と対応|AWS リソース|マルウェア、ネットワーク攻撃、アカウントの不正利用|ログとイベントの監視、異常検知|脅威インジケーターの提供、自動的な対応アクションの実行|
|Inspector|コンピューティング環境の脆弱性検知|EC2 インスタンス|ソフトウェアの脆弱性、設定の誤り|エージェントによるインスタンスの脆弱性スキャン|脆弱性レポートの作成、修復推奨事項の提供|
|Macie|機密情報の検出と保護|S3 バケット、EBS ボリューム、RDS インスタンス|個人情報、医療情報、知的財産情報|機密情報パターンマッチング、機械学習による異常検知|データの暗号化、アクセス制御の強化|

#### 消去法の考え方

- AWS Shield はDDoS攻撃に対する防御です。大規模なDDoS 攻撃が予測される場合、AWS Shield とAmazon CloudFront を組み合わせてウェブサービスを保護するときに有用です
- AWS Shield とAWS WAF の使い分け
    - DDoS 攻撃全般から保護したい場合は AWS Shield を使用する
    - Web アプリケーション固有の攻撃から保護したい場合は AWS WAF を使用する
    - より強固な防御体制を構築したい場合は、AWS Shield と AWS WAF を組み合わせます
- GuardDuty はAWS のログなどから脅威を検出するサービスです。検出した脅威に対してCloudWatch Events へイベントを通知して、SNS への通知やLambda を呼び出すことができます。 GuardDuty 自体に攻撃や脅威からAWS のリソースを守る力がないので、問題文の要件に明確な攻撃や脅威に対処が必要なときは不正解の可能性が高いですが、CryptoCurrency 攻撃からの防御は可能です
- Amazon Inspector は、Amazon EC2 インスタンス、コンテナ、Lambda 関数などに使われる脆弱性検出サービスです。要件で「脆弱性の検出」などとあればAmazon Inspector のことを思い出します
- Macie は機密情報を検出して保護する、機械学習を使った異常検知サービスです。個人情報(PII) の検出についての問題で、Lambda の他にMacie があれば、こちらの方が管理工数を削減しやすいです
【Python】型アノテーションを知ってますか？



## はじめに
型アノテーションに関しての備忘録。

## 🦁<INS>**結論**</INS>🦁
引数と戻り値の型を指定することで、関数の動作がより明確になる。他の言語では絶対に必要の言語も多々ある。


:::note info
押さえておくべき点
* 関数の引数の型、returnの型をメモしておけるイメージ。
* 型が違くてもエラーにはならない。
* 複数の型も指定できる型がある
* 辞書、リスト、タプルなどの型もある。
* mypyを使うことで型のチェックができる
:::  

:::note alert
注意点
*  型アノテーションは変換などをするわけではないのでエラーはでない。
* 過度に複雑な型アノテーションは可読性を下げる可能性があるため、適切なバランスが重要。
:::  

## <INS>**一覧**</INS>

## <INS>**	1.	int - 整数型**</INS>
「年齢を表す数字」のように、カウントできるものや数えるものに使う
```py
def get_age(age: int) -> int:
    return 30
```


## <INS>**	2.	float - 浮動小数点型**</INS>
「お金の額」や「重さ」のように、小数点を含む数字
```py
def get_weight(weight: float) -> float:
    return 65.5
```


## <INS>**	3.	str - 文字列型**</INS>
文字列が入るもの全て。pathなども。
```py
def get_name(name: str) -> str:
    return "Taro"
```

## <INS>**	4.	bool - 真偽値型**</INS>
TrueかFalseのどちらかの値を持つもの
```py
def is_adult(age: int) -> bool:
    return age >= 18
```


## <INS>**	5.	List[T] - リスト型**</INS>
並んでるものなどの集まり。
Tはリストの中に入るものの型。
```py
def get_favorite_foods() -> list[str]:
    return ["Apple", "Banana", "Orange"]
```


## <INS>**	6.	Dict[K, V] - 辞書型**</INS>
キーと値のペアで情報を持った型。
jsonファイルも辞書型。
```py
def get_ages() -> dict[str, int]:
    return {"Alice": 30, "Bob": 25}
```


## <INS>**	7.	Set[T] - セット型**</INS>
重複を許さない一意のものの集まり
```py
def get_pets() -> set[str]:
    return {"dog", "cat"}
```


## <INS>**	8.	Tuple[T, ...] - タプル型**</INS>
複数の異なる型の値を一つにまとめて扱う。
```py
def get_address() -> tuple[str, int]:
    return ("Tokyo", 100-1)
```


## <INS>**	9.	Optional[T] - オプショナル型**</INS>
Noneか、またはT型の値を持つ
```py
from typing import Optional

def get_nickname() -> Optional[str]:
    return None  # ニックネームがない場合
```


## まとめ✍️
型アノテーションを知って引数が格段に見やすくなる。すぐに取り入れていく。
sudoersの設定について

## 環境
Ubuntu20.4

## はじめに

Rubyで作成したスクリプトファイルをroot権限で実行しているのだが、毎回、rootのパスワードが聞かれてきます。毎回、パスワードを入力するのが面倒なため、**sudoersファイル**を編集してパスワードが聞いてこられないようにしました。

## sudoersの設定

sudoersはsudoをつけてroot権限でコマンドを実行するときに参照される設定ファイルです。sudoersで設定されていなユーザーは、sudoをつけてコマンドを実行することはできません。

sudoersのデフォルトはつぎの設定になっています。

```/etc/visudo
# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
```

デフォルトの設定のままであれば、adminグループとsudoグループに含まれるユーザーは、すべてのコマンドに対してsudoをつけて実行することができます。デフォルトの設定に一般ユーザーは１つも登録されていません。

新規ユーザーを登録して、そのユーザーでsudoをつけてコマンドを実行したい場合、新規ユーザーを、既存のadminグループ、もしくは、sudoグループに含めると、sudoersファイルを汚さずに実行することができます。

新規ユーザーをadminグループ、sudoグループに含めない場合は、新規ユーザー用の設定をsudoersファイルに単独で記述することになります。

sudoersファイルは編集すれば即有効になります。何かのサービスを再起動しないと有効にならないとか、OSを再起動しないと有効にならないといったことはありません。

## sudoersの設定例

下記の設定は、user1ユーザーがsudoをつけてcpコマンドを実行するときは、rootのパスワードを聞いてこなくする設定です。設定個所の(root)の記述は、(ALL)にしても、(ALL:ALL)にしてもいいでしょう。あまりこだわる個所ではありません。

```/etc/sudoers
user1 ALL=(root)   NOPASSWD: /bin/cp
```

user1ユーザーがhogeユーザーとして実行するときに限り、rootのパスワードを聞いてこなくする場合は、(hoge)の記述にします。このような使い方はよほど特殊な使い方だとは思います。

```/etc/sudoers
user1 ALL=(hoge)   NOPASSWD: /bin/cp
```

user1ユーザーがデフォルトで設定されている、sudoグループの中に含まれていても、上記の設定は有効になります。cpコマンドだけがパスワードフリートとなり、cpコマンド以外のコマンドの場合はパスワードを聞いてきいてこられます。
stm32 PWM

使用するピンはPA0
TIM2_CH1
Clock Source Internal Clock
Channel 1 PWM Generation CH1
Parameter Settings -> Counter Setting ---> Prescaler 900
                                       L-> Counter Period 1000
Clock Configuration Input frequency 8 -> HSE -> PLLCLK -> HCLK 180MHz
-> APB1 Prescaler 1/8 --> 2x -> 45
                      L-> PCLK1 22.5
```
main(void){
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
    while(1){
        htim2.Instance->CCR1 = 25;
		HAL_Delay(2000);
        htim2.Instance->CCR1 = 75;
		HAL_Delay(2000);
    }
}
```
cscの作法 その483

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
datatableを、検索してindexを求めよ。


# サンプルコード

```

using System;
using System.Data;
using System.Linq;

namespace App
{
	class Program {
		static void Main(string[] args) {
			DataTable dt = new DataTable();
			dt.Columns.Add("id", typeof(int));
			dt.Columns.Add("Name", typeof(string));
			dt.Columns.Add("Age", typeof(int));
			dt.Rows.Add(1, "太郎", 20);
			dt.Rows.Add(2, "次郎", 15);
			dt.Rows.Add(3, "三郎", 10);
			for (int i = 0; i < dt.Rows.Count; i++)
			{
				DataRow row = dt.Rows[i];
				if (Convert.ToInt32(row["id"]) == 2)
					Console.WriteLine("index: {0}", i);
			}
		}
	}
}




```

# 実行結果

```
index: 1
```

以上。
接続アプリケーションの信頼済み IP 範囲へのアクセス制限


-------------------
+ [yoomを使ってSalesforceのSandboxと連携してみる](https://qiita.com/Keiji_otsubo/items/243bca4a1fa5450d74e1)
+ [DevOps Center リリース環境をプロジェクトに接続できません](https://qiita.com/Keiji_otsubo/items/f04130b79bcf12e0a5ac)
+ [APIレスポンスで「Session expired or invalid」エラーが発生](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MYodh)

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

+ [【Help】接続アプリケーションの信頼済み IP 範囲へのアクセス制限](https://help.salesforce.com/s/articleView?id=sf.connected_app_edit_ip_ranges.htm&type=5)

接続アプリケーションを作成した後、ユーザーがログインできる信頼済み IP 範囲を指定できます。また、OAuth と SAML を使用してシングルサインオンを行うアプリケーションを含め、すべての OAuth クライアントアプリケーションに IP 制限の緩和を適用できます。

以下の投稿を日本語訳しておきます。

+ [Getting Connected App IP restrictions working](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000077irM5SAI)

組織の設定はすべてのリクエストに対して IP 制限を強制することであり、アプリは IP 制限を強制するように指定されています。

ただし、テストでは、トークンなどを取得するために IP 範囲外からアプリにアクセスできることが示されています。

強制を有効にして信頼できる IP 範囲を設定すると、その範囲内からの接続以外は接続が行われないことを期待していました。

:::note
これについては、Salesforce サポートとのディスカッションからさらに最新情報を入手できます。

接続されたアプリについて話す場合、ここには IP 範囲の 2 つの場所、プロファイルとアプリがあります。

私たちが行ったことは、アプリ レベルで IP 範囲を設定することであり、これは実際にアクセスを制限するために何かを行うと思われるかもしれません。


Salesforce の提案に従って、定義された接続されたフロー ユーザーのプロファイルに IP 範囲を適用しましたが、結果はブロックされました。


ここで問題となるのは、接続できる IP アドレスを制限していない場合、管理対象アプリの信頼できる IP 範囲は実際に何をするのかということです。

記事: https://help.salesforce.com/s/articleView?id=sf.connected_app_edit_ip_ranges.htm&type=5

「接続アプリケーションを作成した後、ユーザーがログインできる信頼できる IP 範囲を指定できます。」

また、信頼できる IP 範囲を入力する手順も説明します。

ただし、この例で示されているように、実際には IP 範囲は制御されません。これは非常に混乱を招くものであり、徹底的に調査、テスト、質問をしていない顧客にとっては、ロックダウンされていると考えて制限を実装している可能性があります。また、非常に危険です。さらに危険なのは、実際にはプロファイルのみを利用するため、プロファイルが変更されたり、他の目的で拡張されたりした場合、API アクセスも拡張されることです。これが完全な部分として理解されていない場合、顧客の構成によっては、気付かないうちにデータが公開される可能性があります。

 

私は、信頼できる IP 範囲が実際に何をするのか (もしあれば) について詳しく尋ねました。これにより、API をロックダウンするために、私たちが何をしているのか、より適切に実装する必要があるのか​​を理解できるようになります。
:::

結論としてはIPアドレスの範囲指定はプロファイルでの設定が必要みたいです。

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

+ [IP制限を維持しつつ、同時にプロファイルや権限セットでGoogle SpreadsheetのSalesforce Connectorを利用できるユーザーを自由に設定する方法はあるでしょうか？](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifofB)

:::note
1. 接続アプリケーション「Salesforce Connector」のOAuthポリシーで「許可されているユーザー」を「管理者が承認したユーザーは事前承認済み」に変更する
2. 変更すると、接続アプリケーション「Salesforce Connector」の詳細ページに「プロファイル」や「権限セット」のセクションが表示されるので、そこにプロファイルや権限セットを追加する


と設定すると、追加したプロファイルや権限セットを割り当てされたユーザーだけが、「Salesforce Connector」にアクセスできるようになります。

ご参考資料：https://help.salesforce.com/s/articleView?id=sf.connected_app_manage_oauth.htm&type=5

（引用）

"管理者が承認したユーザーは事前承認済み — 関連付けられたプロファイルまたは権限セットを持つユーザーのみがアプリケーションにアクセスできます。このユーザーは最初にアプリケーションを承認する必要はありません。このオプションを選択した後、各プロファイルの [接続アプリケーションへのアクセス] リストを編集して、アプリケーションのプロファイルを管理します。または、各権限セットの [割り当てられた接続アプリケーション] リストを編集して、アプリケーションの権限セットを管理します。"
:::
JVM - Adaptive Sizing

Java仮想マシン（JVM）は、Javaアプリケーションが実行される環境を提供し、メモリ管理に関して高度な機能を数多く備えています。その中でも「Adaptive Sizing」という機能は、JVMがアプリケーションの実行状況に応じてヒープメモリのサイズを動的に調整することで、性能の最適化とリソースの効率的な利用を図るものです。

Adaptive Sizingのメカニズムと、それがHeap Committedとどのように関係するかを説明します。

## Adaptive Sizingとは

Adaptive Sizingは、Javaのガーベージコレクション（GC）フレームワークの一部であり、JVMが実行時にヒープメモリのサイズやGCのパラメーターを自動調整する機能です。Adaptive Sizingの目的は、アプリケーションの性能を最適化しながら、メモリ使用量を効率的に管理することにあります。
JVMはアプリケーションが起動する際、ヒープメモリの初期サイズ（-Xms）と最大サイズ（-Xmx）を設定します。Adaptive Sizingはこのヒープメモリの範囲内で、実行中のアプリケーションのメモリ使用パターンを監視し、必要に応じてヒープサイズを動的に調整します。

この調整は、以下の目標の優先順位を基に行われます。
1. 最大一時停止時間目標
1. スループット目標
1. 最少フットプリント目標

詳細に関しては、以下のJavaドキュメントに記載されています。
https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/parallel.html

## Heap Committedとの関係

「Heap Committed」とは、JVMが物理メモリから確保し、アプリケーションが使用可能としているヒープメモリの量を指します。つまり、JVMによって「確約された」ヒープメモリの量であり、アプリケーションが実際に消費しているメモリ量とは異なります。

Adaptive SizingとHeap Committedの関係は密接です。Adaptive Sizingによるヒープサイズの調整は、Heap Committedの量を変更することに直結します。JVMがヒープサイズを増やす決定をした場合、Heap Committedの量も同時に増加します。逆に、JVMがメモリ使用量を削減できると判断した場合、Heap Committedの量は減少することになります。

この動的な調整により、アプリケーションは必要以上にメモリを消費することなく、また必要に応じて迅速にメモリリソースを確保することが可能になります。

## 参考情報

* https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/parallel.html
* [Difference in Used, Committed, and Max Heap Memory](https://www.baeldung.com/java-heap-used-committed-max)
* [Parallel Collector Adaptive Size Policy](https://www.herongyang.com/Java-GC/Parallel-Collector-Adaptive-Size-Policy.html)
【Mac】ControlPlaneを使ってプロキシ設定を自動で切り替え

## はじめに

会社や学校でのネットワークはプロキシが必要な場合が多く、切り替えは少し面倒ですよね。自動化しましょう。

**環境**
- Mac OS Sonoma
- Apple silicon系 Mac

## 事前準備

### 必要なアプリケーション
ControlPlaneというアプリケーションをインストールしましょう。

```zsh
brew install --cask controlplane
```

### ネットワーク環境を作成
設定アプリからプロキシ設定を適用したネットワーク環境を作成しておきましょう。

![スクリーンショット 2024-04-09 9.11.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683021/ed4e8bc7-1b70-3ed0-52a5-10067a4a7e5e.png)

## 設定
### 1. ControlPlaneを起動
![スクリーンショット 2024-04-09 9.13.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683021/135cbf71-7346-e145-42b5-544b0405297e.png)

Generalは、「Enable automatic switching」はチェックを入れ、それ以外の項目は任意に設定してOKです。

### 2. コンテキストを追加
Contextタブへ移動します。

+ボタンを押してコンテキストを追加できます。名前はなんでもいいですが、ネットワーク環境の名前と同じだとわかりやすいです。

### 3. エビデンスソースを設定
Evidence Sourcesタブへ移動します。
「Nearby WiFi Network」へチェックを入れます。

### 4. ルールを設定
まずはじめに、プロキシ設定を適用したいネットワークへ接続しましょう。※接続していないとネットワーク名の一覧に出てこないため

Rulesタブへ移動します。
+ボタン→「Add 'Nearby WiFi Network' Rule...」→ 「WiFi SSID」を選択します。

![スクリーンショット 2024-04-09 9.24.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683021/3240cc68-5c64-ddbe-181b-528040011ce6.png)

「**A WiFi access point with an SSID of**」にはプロキシを適用したいSSID
「**Context**」には先ほど作成したContextを選択します。

### 5. アクションを設定
Actionsタブへ移動します。
+ボタンから「Networking actions」→「Network Location」を選択します。

![スクリーンショット 2024-04-09 9.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683021/dba97d2c-e9df-57c2-4d22-78ba5e0cc442.png)


- Changing network location to
    ここにネットワーク環境の一覧が出ると思います。プロキシを適用したネットワーク環境を選択しましょう。

- at context
    ここでコンテキストを選択します。
    - On arrivel
        コンテキストで指定したSSIDへ接続した時

    - On departure
        コンテキストで指定したSSIDから切断された時

以上で完了です。
おすすめの設定は下記の画像のようにarrivalとdepartureをセットで使い、学校のWiFiに接続したらIchinosekiを適用、学校のWiFiから切断したらAutomaticへ戻す。

![スクリーンショット 2024-04-09 9.37.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683021/db7fed89-23ef-0d8e-6400-b0390a883450.png)


## おわりに
今回ネットワーク環境について自動きりかえを紹介しました。Automatorを使ってアプリを作成することでVPN切り替えなど多くのことができるようになります。活用してみてください。:person_with_blond_hair_tone2:
【React】制御コンポーネントvs非制御コンポーネント

制御コンポーネントと非制御コンポーネントの違いについてまとめます。

# 制御コンポーネント

制御コンポーネントとは、Reactが状態を管理するコンポーネントのこと。

# 非制御コンポーネント

非制御コンポーネントとは、DOMが状態を管理するコンポーネントのこと。
bottom navigation

以下の手順に従って、Bottom Navigationの実装を行います。1. Navigation Graphの作成:まず、Navigation Graphを作成します。これは、アプリ内の各画面やタブに対応する目的地を定義します。Android StudioのProjectウィンドウで、res フォルダーを右クリックし、New → Android Resource File を選択します。ファイル名を nav_graph.xml とし、Resource type を Navigation に設定し、OK をクリックします。Navigation Editorが開き、各画面やタブに対応するDestinationを追加します。各Destinationは、FragmentやActivityと関連付けられます。2. Menu Resourceの作成:次に、Bottom Navigationの各タブに表示されるアイコンとテキストを含むMenu Resourceを作成します。Android StudioのProjectウィンドウで、res フォルダーを右クリックし、New → Android Resource File を選択します。ファイル名を bottom_nav_menu.xml とし、Resource type を Menu に設定し、OK をクリックします。bottom_nav_menu.xmlを開き、各タブに対応するメニューアイテムを追加します。各アイテムには、アイコンとオプションでテキストを指定します。3. Activityの準備:次に、Bottom Navigationを含むActivityを作成し、Navigation GraphとMenu Resourceを関連付けます。MainActivity.ktを作成し、Navigation Graphをセットアップします。import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.ui.setupWithNavController
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navController = findNavController(R.id.nav_host_fragment)
        bottom_navigation.setupWithNavController(navController)
    }
}
activity_main.xmlでBottomNavigationViewを配置します。<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    app:menu="@menu/bottom_nav_menu" />
これで、Bottom Navigationの基本的な実装が完了しました。必要に応じて、各Destinationに対応するFragmentやActivityを実装し、Navigation GraphとMenu Resourceを調整してください。


Navigation GraphやMenu Resourceの作成に関しては、コードを提供することはできません。これらのファイルは通常、Android Studioのビジュアルエディタを使用して作成されます。ただし、次の手順をフォローして作成することができます。Navigation Graphの作成手順:res フォルダーで右クリックして、New → Android Resource File を選択します。ファイル名を nav_graph.xml とし、Resource type を Navigation に設定し、OK をクリックします。Navigation Editorが開き、必要なDestinationを追加します。Menu Resourceの作成手順:res フォルダーで右クリックして、New → Android Resource File を選択します。ファイル名を bottom_nav_menu.xml とし、Resource type を Menu に設定し、OK をクリックします。bottom_nav_menu.xmlを開き、各タブに対応するメニューアイテムを追加します。Navigation GraphとMenu Resourceを作成した後は、次の手順に従ってActivityを準備します。提供されたコード例では、これらのファイルが既に作成されていることを前提としています。


Android StudioのKotlinでBottom Navigationのアイテム数が4つ以上になると、デフォルトの設定では各アイテムのタイトルが常に表示されなくなります。代わりに、アイテムを選択したときだけタイトルが表示されます。これはスペースの節約やデザインの簡潔さのために行われる一般的なアプローチです。ただし、タイトルを常に表示するようにカスタマイズすることも可能です。以下はその方法です：<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_navigation_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:menu="@menu/bottom_navigation_menu"
    app:labelVisibilityMode="labeled" />
app:labelVisibilityMode="labeled" を使用すると、タイトルが常に表示されるようになります。この方法を使用すると、Bottom Navigationのアイテム数が4つ以上でも、常にタイトルが表示されます。
WorkatoでLookuptableを他プロジェクトからアクセスされないようにする方法

# はじめに
2024年3月現在、Lookuptableにプロジェクト単位でアクセス権限を付与することができるようになったため、他のプロジェクトからアクセスされないような仕組みを実現することができるようになりました！

今までは、Lookuptableにはアクセス権限を付与することができず、ワークスペース全体から参照されたり、データの編集をされたりすることが可能でした。そのため、同じワークスペース内で、複数のプロジェクトが進行している時、「いつのまにかLookuptableのレコードが削除されてしまっていた！」ということが起こりえる状態でした。
![lookuptable_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/e1c42b82-134c-c212-fe65-752a6395217c.png)


# Lookuptableの設定
「Available in "プロジェクト名"」にアクセスを許可したいプロジェクトを設定することで、設定したプロジェクトのレシピのみからアクセスが可能となります。今回は例として「TestTable」に「TestProject」を設定します。
![lookuptable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/e83f95f6-b61b-2903-17f4-6e8effc5fb67.png)

# Lookuptableへのアクセス確認(参照可能)
「TestProject」のプロジェクトで作成したレシピからLookuptableを呼び出すことができます。
![testRecipe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/71647c7d-dad8-47e7-000e-e19564ce8043.png)

![sansyo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/d572592e-4a32-3295-9a08-d0e8cd36cdfd.png)

# Lookuptableへのアクセス確認(参照不可能)
「TestProject__」のプロジェクトで作成したレシピからLookuptableを呼び出すことができません。
![testRecipe2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/dd3828c3-0714-d9e0-307d-393a4f3a4ad7.png)

![sansyo2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/7a9a8328-1984-210e-4e1d-2e6506d89432.png)

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

* Lookuptableで参照できるプロジェクトを指定できるようになった

# おわりに
いかかでしょうか？ Lookuptableを利用する機会は多いかと思いますが、他のプロジェクトから参照されなくなることで、誤操作する可能性が低くなりWorkatoを快適に利用することができるようになりました。

Workatoの導入・導入後の活用などでお困りの場合、Workatoリセラーにご相談する方法もございます。お困りごとがございましたら、認定リセラーの[日立ソリューションズ](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=6c900accbd0f2b880b1d)へ是非ご相談ください。


# 参考リンク

* 株式会社 日立ソリューションズ
    * [Workato ご紹介サイト](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=6c900accbd0f2b880b1d)
* Workato 公式サイト
    * [Assign lookup tables to specific projects](https://docs.workato.com/features/lookup-tables.html#assign-to-project)
【Rails】メモ書きしたコメントを一括で見る機能

## はじめに

アプリケーションコード内のコメントにtodoを書くことがあるのですが、実装途中に一覧で確認したい時があり、探したところ見つかりました！！

:::note warn
ご覧いただきありがとうございます!
この記事の投稿者は主にRuby on Railsを学習している初学者です。
理解不足な点や内容に誤りがございましたらご指摘いただけますと幸いです。
:::

## 問題
コメントに記入したtodoの内容は把握できているはずだが、見落としがないか一覧表示で確認したい。


## 解決方法
コメントをアノテーション(注釈)として残しておく機能がRailsにありましたので、そちらを使っていきます。

使用方法は簡単です、コメントの記述方法を少しだけ追加します。
```ruby:example_controller.rb
def example_action
  # TODO: 後でちゃんと実装してくださいね
  puts "hoge"
end
```
コマンドラインで下記コマンドを入力します、すると・・・
```
bin/rails notes
```
このような形で表示させることができます！
(カッコ内の数字は記述されている行番号です)
```
app/controllers/example_controller.rb:
  * [38] [TODO] 後でちゃんと実装してくださいね
```
アノテーションの種類ごとに絞り込むこともできるそうです。
上記のサンプルコードは`TODO`の例となります。
(実際に使用する際はそれぞれにきちんと用途があるため、確認した上で使用なさってください。)
```
bin/rails notes --annotation TODO
bin/rails notes --annotation FIXME
bin/rails notes --annotation OPTIMIZE
```
## 終わりに
パッと確認する機能はないかなと思っていたところで見つかりました。
さすが`Rails`なんでもあるのか😳

実はこの記述、Railsガイドの`rails routes`コマンドの記述のすぐ近くにありました📓
こういった幅のある発見ができるのはドキュメント特有なのかなと感じます💡

オプションがたくさんある便利機能のようですが、実はポートフォリオ作成で余裕がなく見られていません😅
興味のある方はぜひご覧になってみてください。

最後までお読みいただき、ありがとうございました🙇
## 参考

https://railsguides.jp/command_line.html#bin-rails-notes
Oracle Analytics Cloud：移動平均 PeriodRollingとMAvg

# はじめに
別の記事で、Oracle Analytics Cloud（**OAC**）に用意されているPeriondRolling関数で移動平均を求める方法を紹介しました。
そもそも、OACには移動平均を計算するためにMavg関数が用意されています。
PeriodRolling関数を使用した移動平均と、Mavg関数の挙動の違いを紹介します。

# PeriodRolling関数
こちらの記事で紹介したように、検索に含まれる時間レベルを自動的に判定した上で、指定した開始期間から終了期間までを集計する関数です。

- [Oracle Analytics Cloud：時系列関数で前期間のデータを検索する](https://qiita.com/tyo38/items/b630761e75d7db7f3e74)

この関数は時間列（または時間階層）を必要とします。
PeriodRolling関数を使用して移動平均を求めることができます。
```sql
PERIODROLLING(Sales, -2, 0)/3
```

この例では、Salesメジャーを -2期間前から現在期間（つまり0）まで集計し、3で割り算しています。
期間の単位は、検索に含まれる時間レベルの最小単位を自動的に判定します。
「年」のみ含まれていれば、期間の単位も年となります。
現在年（現在行）が2024年だとすると、2024が0期間、2023が-1期間、2022が-2期間ということで、3年分となります。
なので、上記例では3で割っています。

検索に「年」と「四半期」が含まれていれば、四半期の方が時間レベルとしては詳細なので、期間の単位は四半期になります。
この場合は、現在行の四半期が2024年Q2だとすると、2024\/Q2が0期間、2024\/Q1が-1期間、2023\/Q4が-2期間を表します。

# MAvg関数
移動平均を求めるための関数です。
引数は、集計する列と整数値です。
現在行から整数値の行だけ遡った値の平均を計算します。
時間列は必要ありません。

```sql
MAVG(Sales, 3)
```

現在行を含め3行遡った分だけ集計します。

# 違いを見てみる
表で並べて表示してみると、最初の2行の値が違います。
3行目以降は同じ値になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a3a6dcf0-65e0-c0a4-bd75-19fac6fb8f2d.png)

最初の2行に着目します。
|Order Date (年)|Order Date (四半期)|Sales|Sales移動平均 (3期間)|MAVGによる移動平均|
|:-|:-|:-|:-|:-|
|2013|四半期1 2013|407,535.70|135,845.23|407,535.70|
|2013|四半期2 2013|361,638.70|256,391.47|384,587.20|

PERIODROLLING関数を使用して計算した最初の行は、135845.23 となっています。
これは、-2期間前と-1期間前の値がないため、現在期間である407,535.70を3で割った値です。
一方、MAVG関数で計算した最初の行は 407,535.70となっており、現在期間の値と同一です。
これは、前2期間の値がないので現在値をそのまま表示しています。

2行目を見てみます。
PERIODROLLING関数を使用した式では、-2期間前のデータは無いので-1期間前と0期間（すなわち現在期間）の集計をして3で割っています。
MAVG関数は、-2期間前のデータは無いので-1期間前と0期間（すなわち現在期間）の集計をして、期間数である2で割っています。

というわけで、3行目以降は同じ値になります。
jsonをPythonで扱う方法

<h1>jsonとは</h1>
jsonとは、javascriptのデータフォーマットをもとにしたデータの持ち方のこと<br>
jsonは{}と[]でデータを表している<br>

<h1>jsonのまま表示させる</h1>

~~~py
obj = {"item":"りんご","price":120}
#jsonのデータを作成している
json_text = json.dumps(obj,ensure_ascii=False)
#dumpsを使うことでjson形式へ変換
#ensure_ascii=Falseで「りんご」を日本語表記にできる
json_text
~~~

<h1>jsonをリスト化させる</h1>

~~~py
text ='{"id":123,"is_student":true}'
#textの中へjson形式のデータを格納
obj = json.loads(text)
#loadを使うことでデータを辞書型として取り出せる
print(obj)
~~~

参考）https://www.youtube.com/watch?v=WsenyJ18ykU
ベベルが使えるパターンと使えないパターン

blenderのベベルの仕様にハマったので備忘録

現象
ベベルができなくなった。

結論
ベベルには面が必要。

背景
面を取り除いた円柱に対してベベルを行おうとしたところ適切にベベルがかからなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/6581f873-7d04-d4c8-7d1a-d94a889cc7fe.png)

面を付けた状態では問題なくベベルが行えた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/4df78539-15f2-9385-2ef7-478d9e15f1c2.png)

公式ドキュメントによると
>ジオメトリに面取りや丸みを帯びた角を作成することができます。

となっており面に対する行動に対して利用可能なようである。
https://docs.blender.org/manual/ja/3.1/modeling/meshes/editing/edge/bevel.html
ガイダンスのまとめ

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

+ [In-App Guidance](https://qiita.com/Keiji_otsubo/items/1abf4b3a573d5c8eba8d)

# トレイルヘッド

+ [Learn Admin Essentials in Lightning Experience > User Engagement > Create In-App Prompts](https://qiita.com/Keiji_otsubo/items/413004fd2739fe633eaf)


# 成功ガイダンス

+ [成功のガイダンスが非表示になっているのですが、表示状態をデフォルトにすることは可能なのでしょうか？](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aiVCS)
2024/4/09主にITとかセキュリティの記事

WordPress人気プラグイン「LayerSlider」に緊急の脆弱性、100万サイトに影響(4/7)
https://news.mynavi.jp/techplus/article/20240407-2921064/

Bing検索から偽広告、NordVPNを装ったマルウェアに注意(4/7)
https://news.mynavi.jp/techplus/article/20240407-2921778/

従業員のコミュニケーション、ＡＩで監視？　米企業(4/7)
https://www.cnn.co.jp/business/35216302.html

HOYAのシステム障害の影響が長期化の懸念(4/7)
https://zuuonline.com/archives/281412

HOYAがサイバー攻撃で3度目の被害、「犯人」はダークウェブで犯行を公表(4/7)
https://news.yahoo.co.jp/articles/fd9fe8cc08756fc3a3c8368f9e44192d5e0d302a

交通事故に見せかけたフィッシングメールに注意、生成AI悪用で巧妙な説得力(4/7)
https://news.mynavi.jp/techplus/article/20240407-2921783/

【生成AI×マーケティング】CVR爆上がり、マーケター特化の活用術(4/6)
https://weel.co.jp/media/gen-ai-marketing/

CCSP合格したので勉強法など（CISSP保持者向け）(4/7)
https://qiita.com/kau/items/0cd96894c3914ea2e708

あらゆるリスクを考え事前に議論を！ 今、世界で注目の「脳埋め込みデバイス」(4/6)
https://news.nifty.com/article/entame/showbizd/12270-2940915/

パートナーとの信頼関係を改善する3つの方法(4/7)
https://forbesjapan.com/articles/detail/70083

台湾有事シミュレーション…中国大敗喫するも日米に甚大な被害(4/7)
https://www.epochtimes.jp/2024/04/215944.html
NetBSD/arm 10.0

2024/3/28にNetBSDの10.0がリリースされました。

自分がいじっているターゲットの状況です。

* STR91xx(ARMv4 V4 core)

これは@rshさんがポートされたコードで本家にはマージされてないコードで、ときどきブートローダーでカーネルのchecksumのエラーがでるのですが、カーネルのコンフィグレーションをちょっと変えるとエラーが出なくなる事があり、普通に起動して使えます。カーネルはフラッシュ(CFI)に、rootfsはumassに置いています。

* OPENRDBASE(ARM9E-S V5TE core)

これは、本家のコードでビルドしたカーネルを使っています。クロックが1G以上なので結構早いです。USBにワンセグチューナがたくさんぶら下がったターゲットを使っているのですが、認識されてません。NetBSDのUSBドライバーは特定デバイスと相性が悪いような感じがあります。U-bootがESATAのFATを認識するので、カーネルも、rootfsもumassに置いています。

* IXP

PCIにぶら下がったUSBが動かないので試してません。

* M83XXX(ARM11J V6J core)

これも本家にはない、カーネルソースで独自にビルドしたものです。このSOCはHardFloatが無い(non-hf)のですが、そのためかarmv6のユーザランド(base)を使うとおかしなことがおきるのでarmv5のユーザランドをインストールしています。カーネル内のBareSSLのチェックでかなりの頻度でエラーになってpanicしますが、エラーが出なければ問題なくブートします。カーネルはフラッシュ(CFI)に、rootfsはumassに置いています。このモジュールでirssiを動かして、常用しています。

* BCM5301X(Cortex V7A core)

これは本家にあったコードを直したカーネルコードです。ifのドライバーを書き直してかなりいい感じです。このsocもnon-hfです。ユーザランドはv6をインストールしています。発熱が大きいのと、マルチCPUが使えません。M86XXXはマルチCPUで動いていて、どうもNetBSDのmpのコードはブートのL2の処理に依存しているのではないかとにらんでいます。カーネルはフラッシュ(NAND)に、rootfsはumassに置いています。

* GENERIC pcDuino(Cortex V7A core)

これは公式のイメージをSDに焼いてブートしてみました。FDT対応のカーネルです。ifが使えません。NetBSDでネットワークが使えないのは致命的です。

* M86XXX(Cortex V7A core)

これも本家には無いカーネルコードになります。ifがいまいち調子がよくありません。カーネルはフラッシュ(CFI)に、rootfsはumassに置いています。

ブートログはNYC*BUGにあげています。

https://dmesgd.nycbug.org/index.cgi
Pythonで「pathlibモジュールを使ったファイルの読み書き」の動作を確認してみた

# 概要

Pythonで「pathlibモジュールを使ったファイルの読み書き」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/file/index12.html

# 実装
以下のファイルを作成しました。
```sample.py
import pathlib

p = pathlib.Path('./test/name.txt')
data = p.read_text()

print(data.split('\n'))
```
```test/name.txt
Yamada
Andou
Takahashi
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
['Yamada', 'Andou', 'Takahashi', '']
```

# まとめ

何かの役に立てばと。
工学視点の身近な医学

# 「はじめに」
## この記事は
ソフトウェア、ハードウェアを問わず、医用工学に携わるエンジニアの皆さんが、内科の疾病について理解を深め業務において医学の知識を生かすことができるような知識を提供するために書いたものです。

## 対象者
医用工学に携わるエンジニアの皆さん全般

## ねらい
業務には直接関係しない知識でも、疾病を知ることによってより能動的に製品に新しい機能や、新規開発のヒントを提供することを目的とします。

1.[腎不全](https://qiita.com/tsukuba3/items/59e3aa38ebfb462ed43b)
医用工学のための医学参考

# 「はじめに」
## この記事は
ソフトウェア、ハードウェアを問わず、医用工学に携わるエンジニアの皆さんが、内科の疾病について理解を深め業務において医学の知識を生かすことができるような知識を提供するために書いたものです。

## 対象者
医用工学に携わるエンジニアの皆さん全般

## ねらい
業務には直接関係しない知識でも、疾病を知ることによってより能動的に製品に新しい機能や、新規開発のヒントを提供することを目的とします。

# 本論
### 腎不全とは・・・
腎臓の機能が低下して正常に働くなった状態を腎不全といいます。腎不全の指標となるのは、血液検査で調べられる血清クレアチニン値や推算糸球体濾過値です。
    血清クレアチニン値
        正常値 1.0mg/dl
        腎機能50% 2.0mg/dl
        透析 8.0mg/dl

腎不全の主な原因は、遺伝子の異常で起こる病気や、腎臓に炎症が起きる糸球体腎炎などです。心臓から贈られる血液の約20％を受け入れている腎臓は欠陥が豊富な臓器であり、生活習慣病などの動脈硬化をきたす病気は腎臓に悪影響を与えます。

### 症状と経過
腎不全を発症すると、尿を作る機能が低下して尿の出が悪くなったり、ミネラルバランスの異常を起こしやすくなったりします。

### 検査方法

主に、血液検査と尿検査を行います。
血液検査では、血清クレアチニンやeGFRを中心に調べます。

画像検査や、腎生検を行うこともあります。

・血清クレアチニン値
クレアチニン(Cr)はクレアチンリン酸という筋肉が運動するための重要なエネルギー源 物質が代謝されたあとにできる老廃物です。クレアチニンは腎臓でろ過されて尿として排出されるため、血中のクレアチニンの濃度が 上昇していることは腎臓の機能が低下していることを意味します。
・eGFR
推算糸球体濾過量（eGFR）です。
これは、腎臓にどれくらい老廃物を尿へ排泄する能力があるかを示しており、この値が低いほど腎臓の働きが悪いということになります。

いづれにしても、腎臓の機能を計るベンチマークとして有用なのは、腎臓でろ過できず尿として排泄できずに、血中にとどまっている不純物を測定することで、腎臓の活動量を測定するといった方法が用いられているようです。
何らかの手法を用いて、血中の血清クレアチニン値やeGFR値を測定できれば、慢性腎不全をチェックできるようです。
検査キットは販売されているようですが、妊娠検査キットほどの手軽さではないようで、高価です。

# 参考にしたページ：
[腎不全とはどんな病気？ 原因、症状、検査方法](https://medicalnote.jp/contents/210527-002-ZU)
[血清クレアチニン値とは](https://www.dock-tokyo.jp/results/kidney/creatinine.html)
[eGFRとは](https://www.kyowakirin.co.jp/ckd/check/check.html)
[検査キット](https://www.funakoshi.co.jp/contents/5001)

# 「おわりに」
macのターミナルでpdfをテキストに変換する

ここではpopplerのコマンドを使ってpdfをテキストに変換します。

## popplerのインストール
```ruby:qiita.rb
puts brew install poppler
```
## デスクトップにパスを通す
```ruby:qiita.rb
puts cd ~/Desktop
```
## pdttotextコマンドを使用
```ruby:qiita.rb
puts pdftotext -layout ファイル名 output_with_layout.txt
```
今回はレイアウトの保持のため`-layout`オプションを追加しました
上ではpass.pdfというファイルを変換しているコードになります。

上記を実行すればoutput_with_layout.txtという名前のテキストファイルがデスクトップ上に生成され、PDFの内容がテキスト形式で保存されます。
海外に行くときに用意する荷物とか

# はじめに
- 私は海外出張に稀に行かないといけない
- 荷物に何を持っていくか毎回悩むので、自分用にまとめておこうかと思った
- 結構治安が悪いところに行く前提で書いてあるので、状況に応じて適宜選択してください。。

# 持っていくもの
### 普段持ち歩いているもの
- [ ] リュック
- [ ] 財布（海外に行くときは中身最小限にしたほうがいいかも）
- [ ] スマホ
- [ ] PC
- [ ] 充電ケーブル（スマホ、PC）
- [ ] 折り畳み傘
- [ ] 名刺

### 国内/国外出張共通で用意するもの
- [ ] スーツケース
- [ ] 社員証など職業証明用のもの
- [ ] 衣服、衣服の圧縮袋
- [ ] 歯磨きセット、爪切り、髭剃り、デオドラント用品など
- [ ] ソープ、洗顔料、化粧水、乳液、整髪料など
- [ ] モバイルバッテリー

### 国内/国外出張共通、あると状況によってうれしいもの
- [ ] 電源タップ
- [ ] ドライヤー
- [ ] PCのHDMI-TypeCの変換用端子とか（← PC繋いでプレゼンとかする人だけかな？）

### 国外出張特有で用意するもの
- [ ] 現地の現金
- [ ] クレジットカード（海外利用の制限解除済みのもの、タッチ決済可が望ましい）
- [ ] パスポート
- [ ] VISA
- [ ] 海外保険（もしくはこれを付帯するクレカ）
- [ ] ウエストバッグ＆財布セット（普段簡易的に使うやつ）
- [ ] ウエストバッグ＆財布セット（セキュリティポーチ、犯罪対策のやつ）
- [ ] 印刷、コピーした紙
    - [ ] パスポートのコピー（大使館に最悪逃げ込むとき用）
    - [ ] 航空券（入国審査とかでも使うときある、紙が速い）
    - [ ] ホテル住所（入国審査とかでも使うときある、紙が速い）
- [ ] 携帯ストラップ（スリ対策）
- [ ] 海外用コンセント変換端子
- [ ] 海外用SIMカード / モバイルwifi

### 国外出張特有で、あると状況によってうれしいもの
- [ ] 虫よけ対策（特にマラリア被害ある地域とか）
- [ ] 胃腸薬、下痢止め、酔い止め（私は普段使わないのでココに書いた）
- [ ] トイレットペーパー
- [ ] 除菌シート
- [ ] カップ麺（※税関注意）

# おわりに
これで次回から楽できるだろう。次回いつ行くかわからないけど。。
Next.js×TypeScriptでモダンなWebアプリを作る[ルーティング編]

# 1. はじめに
前回の記事では、Nextプロジェクトを立ち上げるための環境構築を行いました。

https://qiita.com/neko_punch888/items/b76163ea40bfcc79c8d1

今回は、実際にコードを書いて画面遷移できるようにルーティングしたいと思います。
参考：https://nextjs.org/docs/app/building-your-application/routing

# 2. App Router
Next.jsのルーティングのベースとなる機能が**App Rouoter**です。
`src/app/`配下のディレクトリおよびファイルがルーティング対象となります。
```:ディレクトリ階層(login)
└─app
    │  page.tsx
    │
    └─login
           page.tsx
```


```react:src/app/page.tsx
import Link from "next/link";
import styles from "./page.module.scss";

export default function Home() {
  return (
    <main className={styles.main}>
      <h1>ブログ投稿アプリ</h1>
      <Link href='/login/'><input type="button" value="会員ログイン" /></Link>
    </main>
  );
}
```

```react:src/app/login/page.tsx
import styles from "./page.module.scss";

export default function Login() {
  return (
    <main className={styles.main}>
      <h1>会員ログイン</h1>
    </main>
  );
}
```

例えば、上のような構成にしてサーバーを立ち上げてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633708/40c09efb-a74f-87c3-9127-af4aed4798b5.png)



ここで、会員ログインボタンを押すとログイン画面に遷移することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633708/6851467a-7094-9f3d-393e-aa4a997558e0.png)
簡単ですね。
他に画面を追加する必要があれば、ディレクトリを追加するだけでルーティングを行うことができます。

# 3. Dynamic Routes
Next.jsにおいて、動的データからルートを作成する機能が**Dynamic Routes**です。
例えば、ブログのIDがhogeのときは`/blog/hoge/`、ブログのIDがfugaのときは`/blog/fuga/`となるようにルートを切り替えたい場合、
```:ディレクトリ階層(blog)
└─app
    │  page.tsx
    │
    └─blog
       └─[id]
               page.tsx
```
のように、ディレクトリ名を[ ]で囲むことにより実現することができます。

```react:src/app/blog/[id]/page.tsx
import styles from "./page.module.scss";

export default function Blog({ params }: { params: { id: string } }) {
  return (
    <main className={styles.main}>
      <h1>ブログ</h1>
      <h4>ブログのIDは、{params.id}です。</h4>
    </main>
  );
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633708/2618a140-ddcc-9f59-a6ce-30e74f5c3d22.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633708/12c59e8a-d09e-585a-fdec-ee40dd8c8f80.png)

`params.id`をもとにAPIを叩いたり、SQLクエリを実行したりすることで、ブログのIDに応じてHTMLの中身を変えることになりそうです。

その他、Dynamic Routesの使い方は[公式ドキュメント](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)をご確認ください。

# 4. おわりに
今回はNext.jsのApp Routerを用いてルーティングしてみました。
次回はNextAuth.jsを用いてログイン画面に機能を実装してみようと思います。
Windows11でStable diffusion webuiをインストールしようとするとバッチがすぐ終了してしまう

stable-diffusion-webuiをインストールしようとGithubからgit cloneし、
よし、`webui-user.bat`を実行しよう！と思って実行してみると、
スッとターミナル画面が表示され消える。。

？あれなんかpythonのパス通しミスった？
でもpython単体で動くしなぁ。。

先に結論：
batファイル内で%python%呼び出している箇所をcallで呼び出すとうまくいくよ

こんな感じ
```
call %python% -c "***...
```

pythonが別ターミナルで実行してプロセス終了してたみたい
てかみんなどうしているの？
別ターミナル呼出し後の挙動変えることできたっけ？

久々のwindowsでわからん。
cscの作法 その482

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
datatableに、LINQの呪文を当てよ。

# サンプルコード

```

using System;
using System.Data;
using System.Linq;

namespace App
{
	class Program {
		static void Main(string[] args) {
			DataTable dt = new DataTable();
			dt.Columns.Add("No", typeof(int));
			dt.Columns.Add("Name", typeof(string));
			dt.Columns.Add("Age", typeof(int));
			dt.Rows.Add(1, "太郎", 20);
			dt.Rows.Add(2, "次郎", 15);
			dt.Rows.Add(3, "三郎", 10);
			DataRow[] rows = dt.AsEnumerable().Where(x => (int) x["Age"] > 10).ToArray();
			foreach (DataRow row in rows)
				Console.WriteLine("No:{0},Name:{1},Age:{2}", row["No"], row["Name"], row["Age"]);
			for (int i = 0; i < dt.Rows.Count; i++)
			{
				DataRow row = dt.Rows[i];
				if (Convert.ToInt32(row["Age"]) > 10)
					Console.WriteLine("No:{0},Name:{1},Age:{2}", row["No"], row["Name"], row["Age"]);
			}
		}
	}
}




```

# 実行結果

```
>dt1
No:1,Name:太郎,Age:20
No:2,Name:次郎,Age:15
No:1,Name:太郎,Age:20
No:2,Name:次郎,Age:15


```


以上。
【Next.js】App Router、Page Routerって？

# はじめに

こんにちは、エンジニアのkeitaMaxです。

App RouterとPage Routerについてよく理解していないで困ったことがあったので、調べたことについてまとめます。

# App Router、Page Routerって何？

>バージョン 13 では、Next.jsにReact Server Components上に構築された新しいApp Routerが導入されました。これは、共有レイアウト、ネストされたルーティング、状態の読み込み、エラー処理などをサポートします。
(引用：https://nextjs.org/docs/app/building-your-application/routing#the-app-router)

Next.jsのルータのやり方のことで、v13でApp Routerが追加されたようです。

# App Router、Page Routerの違い

https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration#migrating-from-pages-to-app

上記URLにPage RouterからApp Routerへの移行手順が記載されていたので、これに沿ってみていこうと思います。

### ディレクトリが違う

まずは、各Routerで使用するディレクトリが違います。

Page Routerは`pages`ディレクトリを使用し、App Routerは`app`ディレクトリを使用しています。

### 使用するファイルとディレクトリの命名規則が違う

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/3b4ede5a-6168-b2a9-c405-8047db6a26dd.png)
>(引用：https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration#step-4-migrating-pages)

Page Routerでは、`/`でアクセスしたときに表示したい場合、`pages`ディレクトリ配下に`index.tsx`を置いていましたが、App Routerでは`page.tsx`を置かなくてはいけないです。

また`/about`の時は、Page Routerでは`pages`ディレクトリ配下に`about.tsx`を置いていればよかったですが、App Routerでは`about`ディレクトをし作成してその配下に`page.tsx`を置かなくてはいけないです。

### デフォルトのコンポーネント

https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration#server-side-rendering-getserversideprops

Page Routerは、デフォルトでクライアントコンポーネントでしたが、
App Router では、デフォルトでサーバーコンポーネントになります。


# 感想

公式ではApp Routerが推奨されているらしいので、今後はApp Routerをしようする機会が多くなるのかなと思っています。

移行するときは、デフォルトでサーバーコンポーネントになるということをしっかり理解しないとつまりそうだなと感じました。

# おわりに


この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考
https://qiita.com/newbee1939/items/7ce919f9a1a7153582b8
【Rust Crypto】RustでSHA256ハッシュ値を得る方法

# RustCrypto: SHA-2
Pure Rust and NO stdで書かれたクレートです。
creates

https://crates.io/crates/sha2
## 使い方
コマンドラインでクレート追加します
```bash
cargo add sha2
```

こんな感じで結構シンプルに使えます
```rust
use sha2::{Digest, Sha256};

fn main() {
    let data = b"hello world";
    let hash = Sha256::digest(data);
    println!("{:x}", hash);
}

```
```bash
hash: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
```



今回紹介したsha256の他に
* SHA-224
* SHA-256 
* SHA-384
* SHA-512

があります。


Rustのsha256のハッシュ値求めるやり方の記事が見当たらなかったので書いてみました。
UnityのプロジェクトのバージョンアップはProjectVersion.txtの更新を忘れずに

## 概要
Unityのバージョンを
2021.3.17f1 → 2022.3.17f1
にアップデートしようとした時に「Open Project: Initialize Asset Database」でフリーズして起動できない問題が発生したので対処法を記載します！
(ここでフリーズして動かなくなる現象です)
![スクリーンショット 2024-04-09 2.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708786/20d7e7d3-b575-719a-9224-da508d83fea7.png)

筆者はポンコツなのでこの問題を3ヶ月ぐらい悩んでやっと原因がわかったので誰かの約に立てればなと思います！

## まずは結論
`{プロジェクトのフォルダ}/ProjectSettings/ProjectVersion.txt`
上記のファイルの文字列を下記のように変更するだけでした！

```
m_EditorVersion: 2021.3.17f1
m_EditorVersionWithRevision: 2021.3.17f1 (3e8111cac19d)
```
↓
```
m_EditorVersion: 2022.3.17f1
m_EditorVersionWithRevision: 2022.3.17f1 (4fc78088f837)
```

## 試してみたこと
#### 1. Libraryフォルダの中身を全部消してみる
まず調べると「Library」フォルダの中身を全部消してみよ！という記事が見つかりましたので早速削除！
よし！これでリトライだ！
→結果変わらず

#### 2. UnityEditorを再インストールしてみる
え、もう記事があんまりない？え、わからない、、
とりあえずUnityEditorをどちらのバージョンも再インストールしてみよう
→結果変わらず

#### 3. URPが原因なのでは？と思ってBuilt in RPで試してみる
前までは普通にバージョンを上げるだけで良かったのに、と思いつつ、
今回変えた点といえばURPのプロジェクトにしたこと、
アセット部分で失敗していることもあってURP周りなのかなと思って
昔ながらのRPのプロジェクトを作ってアップデートしてみる
→結果やっぱり起動しない
(つまりURPは関係ないことが分かりました)

#### 4. ProjectVersion.txtのバージョン記載を変える
もう無理、ふて寝します。
ということでふて寝して3ヶ月放置していて、もう一度原因を調べようと頑張っていたら、
Xにて「ProjectVersion.txtのバージョンを変えたらいけた」というポストを発見！
なにいい！そんなファイルがあるの？
ということで早速ファイルのバージョン記載を変えてみると
→起動できた！

やりました！Xありがとう！
起動後にURPのアップデートもしましたがこれは特に問題なくできました！

## 学んだこと
#### 1. Xも調べると意外と解決策あるかも
今回の解決策は自分の調べ方が悪かったのか、「ProjectVersion.txt」に触れている記事を見つけきれず、悩んでしまって、Xで同じ悩みの人いないのかなと思い立って検索したら同じ境遇の方のスレッドを見つけて解決できました！

#### 2. ハマったことは何でも記事に書いたほうが良いのかも
コーディングをしていて、「なんでこんなことにハマってたんだ、、」みたいなことって結構起きると思うのですが、今回の件ももはや基本的過ぎることだからたまたま記事が少なくて見つけきれなかった、なんてこともあるのかなと、
（筆者の検索能力が低いだけです←）
以降も少しのことでも記事にしていけたらなと思います！
アルゴリズム　忘備録①

# はじめに
最近、recursionというプログラミングサービスでコンピューターサイエンスの基礎を学習中でスライディングウィンドウが良く使われるアルゴリズムなので忘備録として書いてみました。

# スライディングウィンドウアルゴリズムとは
![window-slider-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538192/bce331ef-7122-a658-e206-e77ed215bd6b.png)
例えば、サイズ4の連続する部分配列の最大値を求めるような問題で連続する部分配列があるとする、その部分配列の中で値をひとつづつ比較し最大値を求める方法だと計算量がo(n*k)と膨大になってしまいます。これをデキューを使うことによって計算量をo(n)に抑えることができるやり方です。

具体的には、デキューを用いて部分配列をひとつ前に進めてます。最初に部分配列に含まれていない値をポップし、新しく入ってきた値と既存のデキューの値を比べて新しく入ってきた値の方が大きいかデキューが空になるまでポップし続けるというものでそうすることでデキューの一番左にある値がその部分配列の中で最大であることが保証できます。
![window-slider-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538192/a81421bd-e329-5020-d5b4-6c41d301797f.png)


# 実際のコード(pythonでの実装)

```maxWindowArrK.py
from collections import deque

def maxWindowArrK(intArr,k):
    # arrの要素がkより少ない場合、空のリストを返す
    if k > len(intArr): return []

    # 最大値を保持するためのリスト
    result = []
    # 値のインデックスを保持するデキュー
    deque_arr = deque()
    # デキューの初期化
    for i, num in enumerate(intArr[:k]):
        # デキューの末尾から比較し、新しい値(num)より小さいまたは等しい値をデキューから削除する。
        # これにより、デキューの末尾は新しい値よりも大きい値が保証されます。
        while len(deque_arr) > 0 and intArr[deque_arr[-1]] <= num:
            deque_arr.pop()
            
        # 現在のインデックス(i)をデキューの末尾に追加
        deque_arr.append(i)

    # ウィンドウをスライドさせていく
    for i, num in enumerate(intArr[k:], k):
        # デキューの先頭にあるインデックスの値は現在のウィンドウでの最大値
        result.append(intArr[deque_arr[0]])
        # ウィンドウから出た要素のインデックスがデキューの先頭にある場合、それを削除する
        while len(deque_arr) > 0 and deque_arr[0] <= i-k:
            deque_arr.popleft()
            
        # デキューの末尾から比較し、現在の値(num)より小さいまたは等しい値をデキューから削除する
        while len(deque_arr) > 0 and intArr[deque_arr[-1]] <= num:
            deque_arr.pop()

        # 現在のインデックス(i)をデキューの末尾に追加
        deque_arr.append(i)

    # 最後のウィンドウの最大値を追加
    result.append(intArr[deque_arr[0]])
    
    return result

# [64, 64, 64, 34, 14, 353, 353, 353, 353, 63]
print(maxWindowArrK([34,35,64,34,10,2,14,5,353,23,35,63,23], 4))
DBeaverからRedshiftのエンドポイントを利用して接続してみた

#### 前提

ローカルにあるDBeaverから、踏み台サーバーを介してRedshiftのプライベートアドレスに接続するのは便利ですが、最近「再配置」という機能を利用し始めたため、少し困っています。再配置を行うと、パブリックアドレスとプライベートアドレスの両方が変更されます。
しかし、AWSの公式サイトを確認したところ、リロケーションをしてもエンドポイントは変わらないことがわかりました。

#### エンドポイント配置
準備物：
Redshiftのエンドポイント（Redshiftクラスターの詳細画面ですぐ見付けます）
踏み台サーバのホスト・ポート・キーペアなどの情報
すでにインストールしたDBeaver

＃１　エンドポイント接続の配置
DBeaverを開いて、ツールバーではデータベースというタグをクリックして、新しい接続を選びます。サーチバーで「redshift」を検索して選びます。
![截屏2024-04-09 0.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/88140248-91ae-dc34-21f0-4f73f111c0af.png)

Main画面は以下のように、取得したRedshiftの情報を入れときます。
！注意： Redshiftコンソール画面でコピーしてもらったエンドポイントはそのままで入力してはいけないで、最後数桁の　:dev:5439  みたいな内容を削除する必要があります。

![截屏2024-04-09 0.25.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/4e83eba1-aec8-21c9-891e-5b40c7202be2.png)

次はSSH画面、踏み台サーバの情報を入力するだけでOK〜
![截屏2024-04-09 0.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/54a6ddcb-edb4-9d37-17d0-8fdd14630042.png)


テストコネクションボタンをクリックして接続ができました。
![截屏2024-04-09 0.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/c9fe26a1-77a6-d2f9-b175-6dce529f13b1.png)

#### AZ1
現時点のIPアドレスを確認しましょう：
![截屏2024-04-09 0.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/200e9168-884c-69c6-42a6-cf7e3ddcd6a4.png)

そして、 Redshiftの再配置を手動的に動かします！
![截屏2024-04-09 0.26.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/d9f82460-0e00-1e40-7ec9-ac3cc24e647d.png)

![截屏2024-04-09 0.26.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/d1792785-c715-42b9-cb99-2dc7be457363.png)

数分待ってから、もう一度IPアドレスを確認します。
#### AZ2
![截屏2024-04-09 0.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/2aa733ac-520f-6866-8b91-13b0ca4c2131.png)
かなり変わりました。
IPアドレスが変わっても、DBeaverの接続は正常に維持できます。
![截屏2024-04-09 0.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/4c1bce98-0e43-f11f-395f-316763baac7b.png)

全然影響なしです。
最後、AZ１に戻しても、IPアドレスが戻れないです。
#### AZ1
![截屏2024-04-09 0.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/3687edc8-0569-76e5-8162-d02b10e6b9a5.png)

ですけど
IPアドレスが何回変わっても、DBeaverの接続がずっと元気です。
![截屏2024-04-09 0.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668444/3fd34f9b-8116-6b60-dbbd-ca24afa3cec2.png)
GoのbufconnでモックしたgRPCサーバーを使ってテストをするとUnavailableになる

# TL;DR
grpc v1.63.0でDialContext関数がdeprecatedになったため、NewClient関数に置き換えたことが原因。
targetに与えるURLのスキームとしてpassthroughを明示的に与えることで解決する。
```go
//v1.63.0以前
conn, err := grpc.DialContext(
    context.Background(),
    "bufnet",
    grpc.WithContextDialer(dial),
    grpc.WithTransportCredentials(insecure.NewCredentials()),
)
//v1.63.0以降
conn, err := grpc.NewClient(
    "passthrough://bufnet",
    grpc.WithContextDialer(dial),
    grpc.WithTransportCredentials(insecure.NewCredentials()),
)
```

# 経緯
Goで書いたgRPCサーバーのインターセプターのテストを行うため、bufconnを用いてサーバーのモックを行っている。grpcライブラリをv1.63.0にアップデートすると、クライアント部分の`DialContext()`がdeprecatedになっていたため,ドキュメントの指示通り`NewClient()`に置き換えた。この変更をした後テストが通らなくなったため調べたところ、リクエスト結果がUnavailableになっていることが分かった。
``` go
client := pb.NewTestServiceClient(conn)
_, err = client.EmptyCall(context.Background(), &pb.Empty{})
slog.Error(err.Error())
//->rpc error: code = Unavailable desc = name resolver error: produced zero addresses
```

# DialContextとNewClientの違い
二つの関数の違いを知るため、[ドキュメント](https://pkg.go.dev/google.golang.org/grpc#DialContext)を参照した。これによると
>One subtle difference between NewClient and Dial and DialContext is that the former uses "dns" as the default name resolver, while the latter use "passthrough" for backward compatibility. This distinction should not matter to most users, but could matter to legacy users that specify a custom dialer and expect it to receive the target string directly.

つまり、bufconnを利用する場合ネームリゾルバがpassthroughである必要があり、`NewClient()`ではデフォルトのネームリゾルバがdnsとなっているため正常に通信できなくなっている可能性が高い。
次に、ソースコードを見てみると
```go
func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error) {
	// At the end of this method, we kick the channel out of idle, rather than
	// waiting for the first rpc.
	opts = append([]DialOption{withDefaultScheme("passthrough")}, opts...)
    cc, err := NewClient(target, opts...)
    //略
```
このように、`DialContext()`も内部では`NewClient()`を呼び出しており、その呼び出しの前に`withDefaultScheme("passthrough")`でpassthroughを設定していることがわかる。`withDefaultScheme()`はプライベートであるためpassthroughを指定する方法を他に捜したところ、URLを`passthrough://address`のようにすることでリゾルバを設定できることが分かった。
# 参考
https://github.com/grpc/grpc-go/blob/master/clientconn.go
https://github.com/grpc/grpc-go/blob/master/clientconn_parsed_target_test.go
@sidebase/nuxt-auth + @next-auth/prisma-adapter で getUserByAccount is not a function エラー

### 環境
- prisma 5.12.0
- @sidebase/nuxt-auth 0.7.0
- @next-auth/prisma-adapter 0.4.4-canary.81

### エラー

https://next-auth.js.org/v3/adapters/prisma

上記サイトに従ってPrismaAdapterを設定後、ログイン時にこのエラーが発生した

### 解決
上記サイトで指定のあるカナリアリリース`@next-auth/prisma-adapter@canary`はバージョンが古かった。
`@next-auth/prisma-adapter@latest`でインストールし直したところ、1.0.7で問題が解決した。

### 関連する記事
https://qiita.com/M_inagaki/items/5e4882d8bcbfa7f02f36

### 参考
- [nextauthjs issue#7578](https://github.com/nextauthjs/next-auth/issues/7578)
Railsの動的プルダウンリストで`include_blank: true`を削除した際のJavaScriptの不具合とその解決法

## はじめに
Railsアプリケーションで動的なプルダウンリストを扱う際、初期状態を空白にすることがあります。このオプションは一般的に`include_blank: true`で実装しますが、この記述を削除すると、JavaScriptが正常に作動しなくなり、動的に選択肢を取得することができなくなる場合があります。特に、選択肢が一つしかなくユーザーがそれを変更できない場合、JavaScriptのイベントが発火せず、結果として動的に選択肢を更新できなくなる問題が生じます。この記事では、その問題の原因と解決策を一つのケーススタディとして紹介します。

## 問題の詳細

例えば、以下のコードは予約システムで使用されるフォームの一部で、ユーザーはスタッフを選択し、その選択に基づいて利用可能な時間帯のプルダウンリストが動的に更新されます。`include_blank: true`を使用して、初期選択肢として空白を提供しています。

```erb
<%= form_with url: time_tables_path, method: :post, local: true, data: { controller: "staff-selector" } do |form| %>
  <% @reservation_services.each_with_index do |reservation_service, index| %>
    <%= form.label "reservation_services_attributes[#{index}][staff_id]", 'スタッフ選択' %>
    <%= form.collection_select "reservation_services_attributes[#{index}][staff_id]", @working_staffs.select { |staff| staff.services.exists?(id: reservation_service.service_id) }, :id, :name, { include_blank: true }, { id: "staff_select_#{index}", data: { staff_selector_target: "staff", action: "change->staff-selector#updateSlots", slots_target_id: "time_slots_select_#{index}" } } %>
    <!-- その他のフォーム要素 -->
  <% end %>
  <%= form.submit "予定を確認" %>
<% end %>
```

この設定でフォームを提供すると、ユーザーは初期状態で「何も選択しない」ことができ、それが選択の一部として正当に扱われます。しかし、この状態でフォームを送信した場合、コントローラのアクションで何らかの制御をしないとDB上には`空白の文字列`として登録しようとしてしまいます。
それが不都合な場合は`include_blank: true`を削除することが一つの対策です。ただし、プルダウンリストの初期状態に選択肢の一部が強制され、ユーザーが明示的に選択肢を変更しない限り、JavaScriptによる動的な更新がトリガーされません（特に選択肢が一つしかない場合は選択肢を変えてJavaScriptによる動的な更新がトリガーすることができません）。

## 解決策

この問題に対する解決策は、`prompt`オプションを利用することです。`prompt`オプションを使用すると、選択リストの最初に「選択してください」などのプロンプトが表示され、ユーザーが選択を促されます。これにより、フォームの初期状態で選択肢が一つしかない場合でも、ユーザーがプロンプトを選択してから別の選択肢に変更することでJavaScriptイベントが発火し、期待通りに動的な更新が行われるようになります。

```erb
<%= form.collection_select "reservation_services_attributes[#{index}][staff_id]", @working_staffs.select

 { |staff| staff.services.exists?(id: reservation_service.service_id) }, :id, :name, { prompt: '選択してください' }, { id: "staff_select_#{index}", data: { staff_selector_target: "staff", action: "change->staff-selector#updateSlots", slots_target_id: "time_slots_select_#{index}" } } %>
```

このアプローチにより、ユーザーは明示的に選択を行うことが求められ、JavaScriptのイベントハンドラーが正しく動作するようになります。結果として、`include_blank: true`を削除した場合の問題を解決し、動的なプルダウンリストを効果的に管理できるようになります。

### まとめ

Railsで動的なプルダウンリストを扱う際に`include_blank: true`を削除することで生じるJavaScriptの不具合は、`prompt`オプションを適切に使用することで解決可能です。この方法を取り入れることで、ユーザーにより良いフォームの操作性を提供し、動的な内容の更新をスムーズに行えるようになります。