OmniAICreator/Qiita-1.07M huggingface dataset:
ABC398の振り返り

一応レート下げはしませんでした、それだけでも嬉しい
あと、投稿遅れてすみませんでした
## [A問題](https://atcoder.jp/contests/abc398/tasks/abc398_a)(diff:10) ##
面倒(c++では)
<code>-</code> $\lfloor \frac{N - 1}{2} \rfloor$ 個、<code>=</code> $2 - (Nmod2)$ 個、<code>-</code> $\lfloor \frac{N - 1}{2} \rfloor$ 個をこの順に連結して出力すれば良いです。
計算量は $O(N)$ です。
ACコード(pypy56ms,c++1ms)
```python
N = int(input())
print('-' * ((N - 1) // 2) + '=' * (2 - N % 2) + '-' * ((N - 1) // 2))
```
AC時間:3:37
## [B問題](https://atcoder.jp/contests/abc398/tasks/abc398_b)(diff:46) ##
バケットを使うというだけで250点なるの何
それぞれの数の枚数カウントを管理して、違う2つの数の枚数が $3$ 以上、$2$ 以上という感じになってたらその場で <code>Yes</code>、全部探してもなかったら<code>No</code>です。
計算量は $O(1)$ です。範囲for文使うと滅びるので気を付けてください
ACコード(1ms)
```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  vector<int> cnt(14, 0);
  for(int i = 0; i < 7; i++) {
    int A;
    cin >> A, cnt[A]++;
  }
  for(int i = 1; i < 14; i++) {
    for(int j = 1; j < 14; j++) {
      if(i != j && cnt[i] >= 3 && cnt[j] >= 2) {
        cout << "Yes" << endl;
        return 0;
      }
    }
  }
  cout << "No" << endl;
}
```
AC時間:6:48
## [C問題](https://atcoder.jp/contests/abc398/tasks/abc398_c)(diff:124) ##
BはCに勝り、CはBに劣る
<code>std::map</code>や<code>std::set</code>などを使ってインデックスを管理し、ある数においてそのインデックスの個数が1個なら答えを更新していく、という感じです。
計算量は $O(NlogN)$ です。
ACコード(398ms)
```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  int N;
  cin >> N;
  map<int, vector<int>> A;
  set<int> num;
  for(int i = 1; i <= N; i++) {
    int a;
    cin >> a, num.insert(a), A[a].push_back(i);
  }
  int ans = -1;
  for(int o : num) {
    if((int)A[o].size() == 1) {
      ans = A[o][0];
    }
  }
  cout << ans << endl;
}
```
AC時間:3:43
## [D問題](https://atcoder.jp/contests/abc398/tasks/abc398_d)(diff:746) ##
閃きがあれば400点
煙を一斉に動かすと時間がかかるので、イベントごとに不変なものを考えましょう。
もともとの問題では、焚き火と高橋君の位置が不変でした。では、煙の位置を固定し、焚き火と高橋くんを動かすというのはどうでしょうか。この場合、移動に関して前者 $O(N^2)$ 後者 $O(N)$ となり高速に処理できます。
最初に $(0, 0)$ に煙を生成し、その後 $S$ の左から順に焚き火と高橋くんを逆方向に動かし、その度焚き火の座標に煙を生成します。高橋くんのところに煙があるかは<code>std::set</code>で高速に判定できます。
計算量は $O(NlogN)$ です。
ACコード(65ms)
```c++
#include <bits/stdc++.h>
using namespace std;
using p = pair<int, int>;
//library end

p vec(char c) {
  if(c == 'N') {
    return make_pair(1, 0);
  }
  if(c == 'S') {
    return make_pair(-1, 0);
  }
  if(c == 'W') {
    return make_pair(0, 1);
  }
  return make_pair(0, -1);
}

int main() {
  int N, R, C;
  string S;
  cin >> N >> R >> C >> S;
  p fire = make_pair(0, 0), taka = make_pair(R, C);
  set<p> kemu;
  kemu.insert(make_pair(0, 0));
  for(int i = 0; i < N; i++) {
    p a = vec(S[i]);
    fire.first += a.first, fire.second += a.second, taka.first += a.first, taka.second += a.second, kemu.insert(fire);
    cout << (kemu.count(taka));
  }
  cout << endl;
}
```
AC時間:22:28
## [E問題](https://atcoder.jp/contests/abc398/tasks/abc398_e)(diff:1238) ##
インタラクティブという点もあり、整理ができませんでした。
## [F問題](https://atcoder.jp/contests/abc398/tasks/abc398_f)(diff:1033) ##
Manacherのアルゴリズムを学びたいと思います。
## 感想 ##
瓦取り返せそうです。(パフォ927、レート694)
緑に早く行きたい
とある駆け出しFlutter開発者のpubspec.yaml

現時点でFlutter開発にて使っているpubspec.yamlを記録しておく。
基本的に必要なものは揃っていると思う、、、たぶん。

```

name: user_registration_app
description: "A new Flutter project."
version: 1.0.0+1

environment:
  sdk: '>=3.2.3 <4.0.0'
  flutter: ">=3.16.5"

# 環境変数の設定
# 使用方法:
# - 開発環境: flutter run --dart-define-from-file=config/dev.json
# - 本番環境: flutter run --dart-define-from-file=config/prod.json
scripts:
  run_dev: flutter run --dart-define-from-file=config/dev.json
  run_dev_web: flutter run -d chrome --dart-define-from-file=config/dev.json
  run_prod: flutter run --dart-define-from-file=config/prod.json
  run_prod_web: flutter run -d chrome --dart-define-from-file=config/prod.json
  build_web_dev: flutter build web --dart-define-from-file=config/dev.json
  build_web_prod: flutter build web --dart-define-from-file=config/prod.json
  build_apk_dev: flutter build apk --dart-define-from-file=config/dev.json
  build_apk_prod: flutter build apk --dart-define-from-file=config/prod.json
  build_ios_dev: flutter build ios --dart-define-from-file=config/dev.json
  build_ios_prod: flutter build ios --dart-define-from-file=config/prod.json

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  url_launcher_web: ^2.0.10
  cupertino_icons: ^1.0.8
  firebase_core: ^2.32.0
  firebase_auth: ^4.20.0
  cloud_firestore: ^4.17.5
  flutter_riverpod: ^2.4.10
  riverpod_annotation: ^2.6.1
  shared_preferences: ^2.2.2
  http: ^1.2.0
  flutter_secure_storage: ^9.2.4
  intl: ^0.19.0
  image_picker: ^1.1.2
  path_provider: ^2.1.5
  uuid: ^4.5.1
  google_fonts: ^6.2.1
  
  # 新しく追加するパッケージ
  # 画像キャッシュ管理 - ネットワーク画像を効率的に読み込み、キャッシュする
  cached_network_image: ^3.3.1
  
  # SVGサポート - ベクター画像の表示
  flutter_svg: ^2.0.9
  
  # アプリ分析とクラッシュレポート
  sentry_flutter: ^7.17.0
  
  # フォーム管理と検証
  flutter_form_builder: ^9.2.1
  form_builder_validators: ^11.1.2
  
  # ローカル通知
  flutter_local_notifications: ^16.3.2
  
  # ロギング - デバッグ用の構造化されたログ出力
  logger: ^2.0.2+1
  
  # 接続状態の監視
  connectivity_plus: ^5.0.2
  
  # データベース - 軽量かつ高速なNoSQLデータベース（オフラインキャッシュ用）
  hive: ^2.2.3
  hive_flutter: ^1.1.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^3.0.2
  build_runner: ^2.4.14
  riverpod_generator: ^2.6.5
  mockito: ^5.4.5
  
  # 新しく追加する開発用パッケージ
  # Hive用のコード生成
  # 注意: hive_generatorはmockitoと競合しているため一時的に除外
  # 将来的には適切なバージョンの組み合わせで再導入可能
  # hive_generator: ^1.1.3
  
  # アイコン生成
  flutter_launcher_icons: ^0.13.1
  
  # スプラッシュスクリーン生成
  flutter_native_splash: ^2.3.10

flutter:
  assets:
    - assets/images/****_logo.png
    - assets/images/****_logo_子.png
    - assets/images/****手書き_logo.png
    - assets/images/****_icon.png
    - assets/images/****_icon.png
    - assets/images/****mail_icon.png
    - assets/images/feature1.png
    - assets/images/feature2.png

```

ここからも増えるかも。
【ローコードのSKE】多種類DB対応の手順

SKEはPostgreSQL、SQLServer、Oracle、MySQL（MariaDB）をサポートします。SKEを利用して、多種類DB対応のパッケージを作る場合の注意点を説明します。

### テーブル名と項目名の日本語文字利用
テーブル名または項目名に日本語文字または英語大文字小文字混在の場合、二重引用符を付けてください。MySQLはANSIモードの設定により、二重引用符を認識するようにしています。もし、テーブルは、専用スキーマ内のものであれば、スキーマ名を付けるようにしてください。

```SQL
"Myテーブル"."My項目"
myschema."Myテーブル"."My項目"
```
大文字小文字を区別せず全部ローマ字のみにすれば、設定しやすいかもしれませんが、リポジトリ定義の分かり易さのため、日本語名称の利用は否定しません。

## DDLとANSIのデータ型
リポジトリ定義に関わるテーブルを自動作成したい場合、テーブルDDLを登録します。１種類DB対応だったら、そのDBのデータ型の記載方法に従えば大丈夫です。多種類DBに対応したい場合、ANSIに満たすデータ型の記載がほしいです。SKEのDDLに記載する場合、下表のDDL記載列をご参照ください。

|データ型|既定名称|DDL記載|
|-|-|-|
|**１、数型**|
|**１－１、真数型**|
|狭範囲整数|SMALLINT|`@SMALLINT`|
|典型的整数|INTEGER|`@INTEGER`|
|広範囲整数|BIGINT|`@BIGINT`|
|固定小数点数（可変長）|DECIMAL(p, s)<br>NUMERIC(p, s)|`@NUMERIC` `@DECIMAL`|
|**１－２、概数型**||
|単精度的小数|REAL|`@REAL`|
|倍精度的小数|DOUBLE PRECISION|`@DOUBLE_PRECISION`|
|浮動小数点数|FLOAT \| FLOAT(n)|`@FLOAT`|
|**２、文字列型**||
|固定長文字列|CHARACTER(n)|`@CHARACTER`|
|可変長文字列|CHARACTER VARYING(n)|`@CHARACTER_VARYING`|
|**３、ブール型**||
|ブール値|BOOLEAN|`@BOOLEAN`|
|**４、日時型**||
|日付|DATE|`@DATE`|
|時刻|TIME|`@TIME`|
|日時|TIMESTAMP|`@TIMESTAMP`|

DDL文には一つのテーブルのCREATE文にしてください。そのテーブルの存在有無の記載は不要です。

## 初期化SQL
テーブル作成後、初期ユーザとか、マスタデータとか、insertのSQLを望まれます。この場合、初期化SQLをご利用ください。

定数をinsertのSQLに記載するため、Oracleの場合 `DUAL`のダミーテーブルを記載しますが、ほかのDBはこのような記載は不要です。記載統一のため、以下の記載方法をご利用ください。
```sql
    insert into "myTable"
    ・・・
    @FROM_DUAL
```

## 注意点
### 「;」の記載不要
Oracleにとって「;」がある場合、JDBC経由のSQL実行はエラーが発生します。ほかのDBはこの制限がありません。
### SQL文に複数SQLの記載禁止
OracleにとってJDBC経由のSQL実行は１回１つSQLしか実行できません。ほかのDBはこの制限がありません。
### ANSI標準関数
個別DBの専用関数を利用しないでください。集計類と日付類のANSI関数のご利用ください。

|関数|説明|
|-|-|
|<b>１、集計類</b>|
|COUNT(<値式>)|<値式>が指定されるならば，集約される行の個数|
|SUM(<値式>)|集約される各行に対して評価される<値式>の合計|
|AVG(<値式>)|集約される各行に対して評価される<値式>の平均|
|MAX(<値式>)|集約される各行に対して評価される<値式>の最大値|
|MIN(<値式>)|集約される各行に対して評価される<値式>の最小値|
|<b>２、日付類</b>|
|CURRENT_DATE|現在日付|
|CURRENT_TIME|現在時間|
|CURRENT_TIMESTAMP|現在タイムスタンプ|

https://github.com/efwGrp/ske
treeを実行してディレクトリ構成が見たい【Mac】


# 動機
記事を書くようになって、ディレクトリ構成を共有したい場面が増えた。
手書きだと面倒なのでコマンドで出力できないかと考えた。

# 結論
Homebrew をインストールして `tree` を実行するだけ

# 実行環境
- macOS Ventura 13.6
- シェル：zsh
- tree バージョン：2.2.1

# やり方
## Homebrew のインストール
Homebrew の[公式ページ](https://brew.sh/ja/)にアクセスする。

「インストール」下の `/bin/bash -c "$(curl ...` コマンドをコピーして、自身のターミナルに貼り付けて実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661290/618e2108-ca29-464b-bc30-08895862c10d.png)

パスワードを聞かれるので、Mac のログインパスワードを入力する
```
==> Checking for `sudo` access (which may request your password)...
Password:
```

`==> This script will install: ...` のように出て、最後に `==> Next steps: ...` のように出る（場合がある）

```
==> Next steps:
- Run these commands in your terminal to add Homebrew to your PATH:
    echo >> /Users/user_name/.zprofile
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/user_name/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh
```
指示通り `echo >> /Users/user_name...` 以下３行を実行する


✅ 完了！

## tree のインストール

以下を実行

```bash
brew install tree
```

### 実行
Node.js プロジェクト下で実行してみる

```bash
tree
```

実行結果
※ node_modules以下は省略

```
.
├── node_modules/ // 省略
├── package-lock.json
├── package.json
├── postcss.config.mjs
├── public
│   ├── file.svg
│   ├── globe.svg
│   ├── next.svg
│   ├── vercel.svg
│   └── window.svg
├── src
│   └── app
│       ├── favicon.ico
│       ├── globals.css
│       ├── layout.tsx
│       └── page.tsx
└── tsconfig.jso
```

### 実行してテキストファイルに出力

以下を実行すると `.txt` で出力できる

```
tree > output.txt
```

## 感想

これで、README作成 や 記事作成がちょっと楽になる！と歓喜。
開発はリモートのみで、Homebrew を使ったことがなかったのでこの機に調べられて良かった。
[感想]Next.js+Vercel v0で効率的なUIプロトタイプ作成

# はじめに
最近、Vercel v0というチャット入力からNext.jsコードを生成してくれるAIを試しました。

## Vercel v0の自動生成のプロセス
チャットで簡単な指示を入力するだけで、Next.jsのコードを自動生成してくれます。
生成したコードはPreviewで動作確認ができるため、作成したUIの動作をすぐに確認することができます。

## 結論
簡単な指示を入力するだけでNext.jsのコードを自動生成してくれるため、非常に便利でした。
実際のアプリケーションにこの生成されたコードを適用する際には、人の手を加える必要がありそうですが、環境構築のベース作りやプロトタイプ作成においては、非常に有用だと感じました。

アイデアを素早く形にできるため、デザインやUI/UXの検討をスムーズに進める手助けになるのではないかと思います。


# Vercel v0を試す

## 簡単な命令でアプリケーション作成
```title:prompt
社内基幹システムを作りたいです。 
営業→見積もり→受注→生産→品質管理→売上 の業務フローです。
このフローの通りに仕事ができる画面を作ってください
```

### 生成されたコード
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/00f9f48b-ed1c-4723-8266-b83f3ac3081b.png" width="1000" />

### Preview
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/bcc0763c-eeed-45b9-97cc-847764da3f84.png" width="1000" />

一覧表示画面だけでなく、CRUD機能など細かい機能も実装されていて、システム全体の操作感を確認することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/9933709b-0007-4900-adc3-62abde4d9abb.png" width="500" />


## 他に試したこと

### モックデータ作成
特に指示をしないと`page.tsx`に画面表示用のデータを定義するため、モックデータを使用するように改造してみました。

```title:prompt
APIサーバーが別であるものとして、
開発環境ではモックサーバーを起動してAPIから取得したデータを画面表示させてください。
環境ごとにAPI URLを設定できるといいです。
```

#### promptの回答
この指示でREST APIを構築できるツール`json-server`の導入までしてくれました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/3991a5e7-310e-4fed-b04f-0dcc0ae27277.png" width="300" />

使用方法まで教えてくれます！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/cb0880a4-5213-420f-9b39-97a6dc134244.png" width="300" />

#### 生成されたコード
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/fe8a5b35-1a8c-4802-bbf8-a64550de9bdd.png" width="150" />

#### 難しかったこと
何度かチャットを繰り返すうちに、APIの実装に関しては安定しない部分が見受けられました。
具体的には、データをコードに直接埋め込むなどの問題が発生し、またPreview環境でAPIを起動することができませんでした。

### ガントチャートなど複雑なUIを作成
何度も修正指示を出しましたが、ヘッダー行列を固定し、表示期間の切り替えや休日の色変更などの細かい設定を入れたガントチャートを作ることができました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/07fb3158-199a-42ce-af83-678285bf13c6.png" width="500" />


### 細かいコンポーネントだけ作る

```title:prompt
ローディングコンポーネントを作りたいです。 
プログレスバーもつけてくれますか？？ 
ローディング中は画面全てを操作できないようにしたいのでモーダルで作ってください！
どの画面からも呼び出せるように部品化してほしいです
```
#### 生成されたコード
呼び出し部分
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/b453aef9-8a19-4d71-a32f-8799104ecba7.png" width="500" />

Providerも設定してくれました
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/5e0f9f6b-fafe-491a-af58-bdb7cf353de9.png" width="500" />

### Preview
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/ef495545-3eb2-462f-b42b-f890c0082970.png" width="500" />


# 感想
UI作成の補助やプロトタイプ作成など幅広い用途で活用できるため、v0を使用することで要件定義のすり合わせや開発が格段に効率化されると感じました。
実際に画面操作ができるため、クライアントへのデモンストレーションも容易です。また、デザイナーの方々にもプロトタイプ作成を依頼しやすくなることを期待しています。

何よりペアプログラミングをしているようでとても楽しかったです！
RDKit が NumPy 2.0 で動かない問題、rdkit-pypi が原因でした

# **user**:

こないだね、[「RDKitが NumPy 2.x で動かない？「_ARRAY_API not found」エラーの対処法」](https://qiita.com/maskot1977/items/cf442ea2968263c83998) っていう記事を書いたじゃないですか、そのときはお世話になりました。

# **assistant**:

おお、あの記事を書かれたんですね！お役に立てたなら何よりです。RDKitとNumPy 2.xの互換性問題、結構ハマる人がいそうな内容でしたね。公開後の反響とかありました？

# **user**:

「2024_09_01以降、numpy2.0に対応してるはずでは？」というコメントがありました。

# **assistant**:

なるほど、そのコメントも一理ありますね。NumPy 2.0 は 2024年9月1日以降にリリース予定で、それ以降のRDKitのアップデートで対応される可能性が高い、という話ですね。  

ただ、**「リリース予定」と「実際に対応されているか」は別問題** なので、現時点でのRDKitの最新バージョンが本当にNumPy 2.0に対応しているかどうかを確認する必要がありますね。試しに、RDKitの公式リリースノートやGitHubのIssueをチェックしてみましょうか？

# **user**:

いえ、その後、分かったことがあるんですよ。

```
!pip install rdkit-pypi
```

というコマンドを私は使っていて、こういう結果になるんです。

```
Collecting rdkit-pypi
  Downloading rdkit_pypi-2022.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.9 kB)
Requirement already satisfied: numpy in /usr/local/lib/python3.11/dist-packages (from rdkit-pypi) (2.0.2)
Requirement already satisfied: Pillow in /usr/local/lib/python3.11/dist-packages (from rdkit-pypi) (11.1.0)
Downloading rdkit_pypi-2022.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (29.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 29.4/29.4 MB 21.5 MB/s eta 0:00:00
Installing collected packages: rdkit-pypi
Successfully installed rdkit-pypi-2022.9.5
```

ところが、現在は

```
!pip install rdkit
```

という方法が良いらしくて

```
Collecting rdkit
  Downloading rdkit-2024.9.6-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (4.0 kB)
Requirement already satisfied: numpy in /usr/local/lib/python3.11/dist-packages (from rdkit) (2.0.2)
Requirement already satisfied: Pillow in /usr/local/lib/python3.11/dist-packages (from rdkit) (11.1.0)
Downloading rdkit-2024.9.6-cp311-cp311-manylinux_2_28_x86_64.whl (34.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 34.3/34.3 MB 44.6 MB/s eta 0:00:00
Installing collected packages: rdkit
Successfully installed rdkit-2024.9.6
```

これで RDKit をインストールすると、あとは何の問題も起こらなかったんですよね。

# **assistant**:

なるほど、それは大事な発見ですね！  

要するに、  
✅ `rdkit-pypi`（バージョン 2022.9.5）は NumPy 2.0 との互換性がないが、  
✅ `rdkit`（バージョン 2024.9.6）は NumPy 2.0 に対応している、  
ということですね。  

以前は `rdkit-pypi` を使うのが一般的だったけど、今は `rdkit` の方が正式なパッケージになっていて、そちらを使うべきという話ですね。これはかなり有益な情報なので、記事をアップデートする価値がありそうですね！  

そのコメントをくれた人も、おそらく「RDKitは NumPy 2.0 に対応しているはず」と言いたかったんでしょうね。ただ、問題は「どの RDKit を使っているか」だったというオチですね。

# **user**:

はい、そういうオチでした。というわけで、この内容をブログにしたいんですが、タイトル候補を考えてくれませんか？

# **assistant**:

いいですね！では、いくつかタイトル案を考えてみました。  

### シンプルで分かりやすい系  
1. **RDKit のインストール方法、いまは `rdkit` を使うのが正解！**  
2. **RDKit が NumPy 2.0 で動かない？それ、`rdkit-pypi` が原因かも**  
3. **RDKit の `rdkit-pypi` はもう古い？新しい `rdkit` で解決！**  

### ちょっとキャッチーな系  
4. **RDKit の NumPy 2.0 問題、じつはインストール方法がカギだった！**  
5. **「RDKit が動かない！」その原因、`rdkit-pypi` かもしれません**  
6. **RDKit のインストールでハマった話──そして解決へ**  

### テクニカルっぽい系  
7. **RDKit + NumPy 2.0 の互換性問題：`rdkit-pypi` vs `rdkit`**  
8. **RDKit の正しいインストール方法 2025年版：`rdkit-pypi` はもう不要？**  

このあたりどうでしょう？何か気に入ったものがあれば、調整もできますよ！

# **user**:

「RDKit が NumPy 2.0 で動かない問題、rdkit-pypi が原因でした」で行きましょうかね。ありがとうございます。

# **assistant**:

いいですね！問題提起と原因が一目で分かる、バランスの取れたタイトルだと思います。記事を書いたら、またどんな反響があったか教えてくださいね！🚀
HP作成備忘録：シンプルで使いやすいナビゲーションのHTML構造について整理してみた

## はじめに

Webサイトにおけるナビゲーションは、ユーザーにとって最も重要な導線のひとつです。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

今回は、基本的なHTMLだけで実装できる、シンプルかつスマートなナビゲーションメニューの構造について紹介します。

## 書こうと思ったきっかけ

Web制作の中で、「とりあえずリンクは並べてみたけど、構造的に正しいのか分からない」「クラスの付け方やIDの使い方に迷っている」と感じたことがありました。

**そこで、実際に使ったナビゲーションの構造を備忘録としてまとめておこうと思いました。**

## 内容の説明（ナビゲーションの構成）

以下は、実際に使用したナビゲーションのHTML構造です。

```html
<!-- ナビゲーション -->
<nav class="nav-menu" id="nav-menu">
  <a href="index.html">HOME</a>
  <a href="office.html">事務所案内</a>
  <a href="services.html">サービス案内</a>
  <a href="contact.html">お問い合わせ</a>
  <a href="support-a.html">就労支援A型</a>
</nav>
```

### 解説
- `<nav>` タグは、ナビゲーションの意味を持つHTML5のセマンティックタグ。スクリーンリーダーなどにも認識されやすく、構造的に正しいマークアップができる。
- `class="nav-menu"` はCSSでスタイリングするためのクラス名。
- `id="nav-menu"` はJavaScript等で制御する際に使う識別子。
- 各 `<a>` タグはリンク先のページを示し、ユーザーの目的地を案内する。

このように、見た目はシンプルでも、IDやクラスを設定することでCSSやJavaScriptと連携しやすくなり、機能面でも拡張性があります。

## まとめ

ナビゲーションは、サイト構造の明快さとユーザーの移動のしやすさを支える大事な要素です。

:::note warn
**今回紹介したように、基本的なHTML構造であっても、適切にクラスやIDを設定することで、後からのスタイリングや動作追加がしやすくなります。**
:::

初学者でも扱いやすい構成なので、ぜひ自分のWebサイト制作に取り入れてみてください！
AWS Load Balancer Controller v2.12.0でリリースされたTargetGroupBindingsのMultiCluster flag機能と考えられるリスクについて

AWS Load Balancer Controllerのv2.12.0リリースでは、**複数のTargetGroupBindingsから同一のTargetGroupを参照できる**という画期的な変更が導入されました。今回のアップデートにより、複数のリソースが同一のターゲットグループを共有できるため、運用面での柔軟性が向上します。（詳細は [こちら](https://github.com/kubernetes-sigs/aws-load-balancer-controller/pull/4021) をご覧ください。）

## 背景

従来、AWS Load Balancer Controllerは1つのTargetGroupに対して1つのTargetGroupBindingが基本となっており、設計上の制約がありました。しかしながら、複数のk8sクラスタを動かしているようなマルチクラスタ環境において、同一のTargetGroupに同じPodを登録する場合に取れる選択肢が増えたため、今回の機能追加はより柔軟な運用と構成の可能性を広げる重要なアップデートとなりました。

## 新機能の概要

v2.12.0からは、以下のような変更が行われています。

- **複数のTargetGroupBindingsが同一のTargetGroupを参照可能に**
これにより、異なるサービスやワークロードが同一のターゲットグループに対してアクセス可能となり、リソースの再利用や管理の効率化が図れます。

## 発生しうるリスク

新機能の利便性の裏側には、以下のようなリスクが存在します。

- **無効なIPアドレスの残存**
もしTargetGroupに紐づくIPアドレスが、すでに無効になっているにもかかわらず、複数のTargetGroupBindingsによって参照され続けた場合、誰からも管理されない「孤児IP」がターゲットグループ内に残る可能性があります。これにより、システム全体の健全性やリソース管理に悪影響が及ぶリスクが考えられます。

## リスクに対する対策

このリスクに対して、以下のような対策が有効です。

1. **ヘルスチェックの実装**
    
    TargetGroupに対して定期的なヘルスチェックを実施することで、どのIPアドレスが現時点で有効かを検知することが可能です。これにより、無効なIPアドレスを早期に発見し、適切な対応を取ることができます。
    
2. **定期的なGC（ガベージコレクション）仕組みの導入**
    
    ヘルスチェックだけでは、無効なIPが残る期間が短縮されるとはいえ、完全な解決策とは言い切れません。そこで、一定期間以上有効でないIPアドレスを自動的に検知し、削除するGC的な仕組みを導入することで、ターゲットグループ内のIPアドレス管理をより堅牢なものにできます。
    

## まとめ

AWS Load Balancer Controller v2.12.0による新機能は、複数のTargetGroupBindingsで同一のTargetGroupを共有するという大きなメリットを提供します。しかし、同時に無効なIPアドレスが残存するリスクも内包しています。ヘルスチェックの実装と定期的なGCの仕組みを組み合わせることで、これらのリスクを効果的に低減できると考えられます。今後のシステム設計や運用において、この新機能とそのリスク・対策を十分に理解し、最適な運用方法を模索することが重要です。
コンパイラーのデザインツール

コンパイラーのデザインを支援するツールは多岐に渡り、目的やフェーズによって使い分けられます。以下に主要なツールとその概要をまとめます。

**1. 字句解析器ジェネレータ (Lexical Analyzer Generators)**

*   **概要:** 正規表現に基づいて字句解析器 (レキサ) を自動生成するツールです。ソースコードをトークンに分割する処理を効率的に行えます。
*   **代表的なツール:**
    *   **Lex (Lexical Analyzer):**  UNIX由来の伝統的なレキサジェネレータ。
    *   **Flex (Fast Lexical Analyzer):** Lex の後継として開発された、より高速で機能豊富なレキサジェネレータ。
    *   **ANTLR (ANother Tool for Language Recognition):**  レキサとパーサの両方を生成できる強力なツール。
*   **使い方:**  トークンのパターンを正規表現で記述したファイル (例: `.l` ファイル) を入力として、レキサのソースコード (通常は C) を生成します。

**2. 構文解析器ジェネレータ (Parser Generators)**

*   **概要:**  文法規則に基づいて構文解析器 (パーサ) を自動生成するツールです。トークンストリームを構文木 (AST) に変換し、文法的な構造を検証します。
*   **代表的なツール:**
    *   **Yacc (Yet Another Compiler Compiler):** UNIX由来の伝統的なパーサジェネレータ。LALR(1) 文法を扱えます。
    *   **Bison (GNU Bison):** Yacc の GNU 版。より多くの機能と改善が加えられています。
    *   **ANTLR (ANother Tool for Language Recognition):**  LL(*) 文法をサポートし、より複雑な文法を扱えます。視覚的なデバッグツールも提供します。
    *   **PLY (Python Lex-Yacc):** Python で実装されたレキサ/パーサジェネレータ。
*   **使い方:**  文法規則を記述したファイル (例: `.y` ファイル) を入力として、パーサのソースコード (通常は C) を生成します。

**3. コンパイラフレームワーク (Compiler Frameworks)**

*   **概要:** コンパイラの開発を支援する、再利用可能なコンポーネントやライブラリを提供するフレームワークです。
*   **代表的なフレームワーク:**
    *   **LLVM (Low Level Virtual Machine):** 中間表現 (IR) の最適化、コード生成、JIT コンパイルなど、コンパイラの様々なフェーズで使用できるモジュール群を提供します。幅広いターゲットアーキテクチャをサポートします。
    *   **GNU Compiler Collection (GCC):** C, C++, Fortran, Ada など、複数の言語をサポートするコンパイラコレクション。フロントエンド (言語依存部) とバックエンド (ターゲット依存部) を分離した設計で、移植性に優れています。
    *   **GraalVM:**  Java VM 上で動作する多言語VM。言語実装フレームワーク (Truffle) を提供し、新しい言語のコンパイラやインタプリタを効率的に開発できます。

**4. 抽象構文木 (AST) 関連ツール**

*   **概要:** 抽象構文木 (AST) の構築、操作、可視化を支援するツールです。
*   **代表的なツール:**
    *   **AST Explorer:**  Webブラウザ上で、様々な言語のASTを表示できるツール。構文解析器の動作確認や、言語構造の理解に役立ちます。
    *   **Code Generation Libraries (例: Jinja2, Mako):**  テンプレートエンジンを使用して、ASTからコードを生成する際に役立ちます。

**5. デバッガ (Debuggers)**

*   **概要:** コンパイラのデバッグを支援するツールです。実行中のコンパイラの動作をトレースしたり、変数の値を調べたりできます。
*   **代表的なツール:**
    *   **GDB (GNU Debugger):** C, C++ などのプログラムをデバッグするための標準的なデバッガ。
    *   **IDE (Integrated Development Environment):** Visual Studio, Eclipse, IntelliJ IDEA などの統合開発環境には、デバッガが組み込まれています。

**6. プロファイラ (Profilers)**

*   **概要:** コンパイラのパフォーマンスを分析し、ボトルネックを特定するためのツールです。
*   **代表的なツール:**
    *   **gprof:** UNIX 系システムで利用できるプロファイラ。
    *   **perf:** Linux で利用できるパフォーマンス分析ツール。

**ツール選択のポイント**

*   **開発言語:**  コンパイラを実装する言語 (C, C++, Java, Python など) に対応したツールを選択します。
*   **文法:**  ターゲット言語の文法の複雑さに応じて、適切なパーサジェネレータを選択します (例: より複雑な文法には ANTLR が適しています)。
*   **ターゲットアーキテクチャ:**  コード生成のターゲットとなるアーキテクチャをサポートするコンパイラフレームワークを選択します (例: LLVM は幅広いアーキテクチャをサポートします)。
*   **学習コスト:** 各ツールの学習コストを考慮し、自分のスキルレベルに合ったツールを選択します。
*   **ライセンス:** ツールのライセンスを確認し、商用利用が可能かどうかを確認します。

**補足:**

*   これらのツールは、単独で使用するだけでなく、組み合わせて使用することも一般的です。
*   コンパイラの設計は非常に複雑なため、これらのツールを効果的に活用することが重要です。

これらのツールを活用して、効率的なコンパイラ開発を目指しましょう。
checkovのseverityの判断基準(備忘録)

## これは何？
checkovのseverityの判断基準と、それに基づいたフィルター方法について調査した結果をまとめた備忘録になります。
## 詳細
### severityの判断基準
調べた限りでは基準の記載はないが、恐らくPrisma Cloudと同様の基準を採用していると思われる。
Prisma Cloudの判断基準は以下の通り。
※checkovはLOW, MEDIUM, HIGH, CRITICALの４つが重要度として割り振られているため、Informationalは本記載から省略
| Severity     | Description                                                                                                                                                                                                 |
|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Critical     | 攻撃者が悪用して、完全な侵害や損害を引き起こす可能性のある脆弱性または誤った構成。重大度が「重大」のアラートは、通常、即時の対応が必要であり、できるだけ早く修正する必要があります。                                             |
| High         | 攻撃者が悪用して重大な損害や侵害を引き起こす可能性のある脆弱性または誤った構成。重大度の高いアラートは、できるだけ早く修正する必要があります。                                                                                     |
| Medium       | 直接悪用できない (悪用するにはある程度の労力が必要) 脆弱性または構成ミス、または影響が限定的な脆弱性または構成ミス。中程度の重大度のアラートは適時に対処する必要がありますが、すぐに対処する必要はない場合があります。                       |
| Low          | 直接悪用できない (悪用するには多大な労力が必要) 脆弱性または構成ミスであり、影響は最小限です。重大度が低いアラートは、定期的なメンテナンス サイクルの一環として対処できるため、すぐに対処する必要はありません。                         |

※以下ドキュメント参照
https://knowledgebase.paloaltonetworks.com/KCSArticleDetail?id=kA14u000000scJiCAI&lang=en_US
### フィルター方法に関して
ドキュメント上だとオプション「--skip-check <除外したいレベル>」で特定のレベルを除外する事が可能
```
checkov -d /hoge/codecommit/xxx --skip-check LOW,INFO
```
但し、level情報はAPIkeyがないと取得できないため、実質的に本オプションは使用できない
※APIkeyを取得するためにはPrisma Cloud有償プランに加入する必要がある
https://docs.prismacloud.io/en/enterprise-edition/content-collections/application-security/get-started/connect-code-and-build-providers/ci-cd-runs/add-checkov

そのため、以下のように除外したいCKVを指定することで対応するのがベストかと思われる
```
checkov -d /hoge/codecommit/xxx --skip-check CKV_AWS_252
```
excel

没有收起来的yang
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/c0fd69f7-f788-40d2-8f95-3dfa74ae56db.png)
如何收起来
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/31dc6da4-2bc7-4434-97a0-7c3be38d6307.png)
AWS WorkSpacesではWSL2が使えないよという話(備忘録)

## これは何？
現在(2025/03/01)の時点でAWS WorkSpacesのWindows環境にてWSL2を利用できるか否かを確認したため、その結果をまとめたものです。

## 結論だけ知りたい方へ
AWS WorkSpacesにてWSL2を利用することはできません。
※WSL1であれば利用可能
## 詳細
AWSの公式ドキュメントを確認すると、Windows Server 2019 based では、WSL2 が利用できないことが確認できる[1]。
※ページ下部にリンクあり
>Windows subsystem for Linux
With the launch of Windows Server 2019 as the underlying operating system for Amazon WorkSpaces, customers have been eager to implement Windows Subsystem for Linux (WSL), specifically WSL2. Because WSL2 invokes a virtual machine (Hyper-V) in order to perform its functions, it cannot run on Amazon WorkSpaces, which are managed by AWS hypervisors.
Customers should know that only WSL1 will be available for this reason, and understand the differences between WSL1 and WSL2.

※日本語訳
>Amazon WorkSpaces の基盤となるオペレーティング・システムとして Windows Server 2019 が発表されたことで、顧客は Windows Subsystem for Linux（WSL）、特に WSL2 の実装を熱望している。WSL2 はその機能を実行するために仮想マシン（Hyper-V）を呼び出すため、AWS ハイパーバイザーによって管理されている Amazon WorkSpaces 上で実行することはできません。
このため、顧客は WSL1 のみが利用可能であることを知り、WSL1 と WSL2 の違いを理解する必要がある。


それ以外のwindowsOS(Windows Server 2022 basedなど)でも利用できるか念のためAWSへ確認したところ以下公式ドキュメントと同様の回答を頂きました。
>「WSL2 を使用するためには Hyper-V を呼び出す必要があるが、WorkSpaces は AWS ハイパーバイザーによって管理されているため、Windows Server 2022 based の場合でも WSL2 をご利用いただくことができません」

## 最後に
今回、開発環境を用意するためにworkspacesを利用しwindows環境でWSL2を利用できるか確認しましたが、利用できませんでした。
windows環境でWSLを利用する場合は**WSL1を利用**するか、そもそもwindows環境ではなく**Linux環境を利用することを検討する**ことが必要となるといった状態ｎため、頭の片隅に置いてもらえると幸いです。

### 参考資料
[1] Containers and Windows subsystem for Linux on Amazon WorkSpaces - Best Practices for Deploying WorkSpaces - https://docs.aws.amazon.com/whitepapers/latest/best-practices-deploying-amazon-workspaces/containers-and-windows-subsystem-for-linux-on-amazon-workspaces.html

[2] how to enable wsl ubuntu in workspaces? | AWS re:Post - https://repost.aws/questions/QUtd5l9K3xRXaZ1NRPPosUrw/how-to-enable-wsl-ubuntu-in-workspaces

[3] WSL2 now available on Windows Server 2022 - https://techcommunity.microsoft.com/blog/itopstalkblog/wsl2-now-available-on-windows-server-2022/3447570

[4] Bundles and images for WorkSpaces Personal - Amazon WorkSpaces - https://docs.aws.amazon.com/workspaces/latest/adminguide/amazon-workspaces-bundles.html
Unity - 我想在檢視器中顯示變數！~ 關於 public 和 [SerializeField] ~

### 在檢視器中顯示變數的神奇語法

什麼？你想讓變數顯示在檢視器中？我完全懂！變數真的超級好用呢！  
讓我來介紹讓變數可以顯示在檢視器中的語法。

**簡單來說，就是 `public`。**  
以下用範例來說明。

### ＠加上 `public` 真的很方便

```c#:Test.cs
using System;
using System.Collections.Generic;
using UnityEngine;

public class TestScript : MonoBehaviour
{
    public int Int;
    public float Float;
    public double Double;
    public bool Bool;
    public char Char;
    public string String;
    public List<int> list;
    public int[] Array = new int[] {1, 2};
}
```

:::note warn
**注意**  
使用 List 類型變數或陣列型變數（如上面範例中的 `int[]`），一定要加上：
```c#
using System;
using System.Collections.Generic;
```
如果漏掉這行，會發生錯誤，導致無法正常執行。
:::

假設你寫了以上程式碼，執行後—變數顯示出來—結果如下：

![Screenshot 2025-03-22 191300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4042593/dbd62cc5-4894-4531-94d7-699dbedcdb18.png)

雖然 `int[]` 沒有顯示出來，但執行結果大概就像這樣。（List 是在檢視器中手動添加的。）

其中的秘密，正如之前提到的，就是 `public`。  
這段程式碼不僅可以讓變數對其他類別公開，還能顯示在檢視器中，真的是一大優點。

### `public` 和 `[SerializeField]` 有何不同？

在類似的功能中，還有 `[SerializeField]`。  
它的用法很簡單，只需要將 `public` 換成 `[SerializeField]`。

`[SerializeField]` 的使用情境如下：
- 想讓資訊顯示在檢視器中。
- 不希望其他腳本意外修改這些值。

在多人合作開發時，這個功能特別有用。例如：

>A 和 B 正在合作開發一個專案。  
>但 A 和 B 各自負責不同的腳本。  
>A 想在檢視器中顯示一些資訊，於是寫了以下程式碼：
>```c#
>public float Object_Hearth;
>```  
>實際上，A 並不想公開變數 `Object_Hearth`，但 B 認為「`Object_Hearth` 很有用」，於是將它整合到自己負責的腳本中。  
>結果，專案出了問題。

為了避免這種遺憾的情況，`[SerializeField]` 就派上用場了。 [^1] 
順帶一提，A 知道這件事後，將程式碼修改如下：

```c#
[SerializeField] private float Object_Hearth;
//使用 `private` 表明不希望該物件被使用或存取。
```

### 總結

今天，我們討論了 `public` 和 `[SerializeField]`。

- **`public`** 適合在檢視器中顯示變數，同時讓變數可以被其他腳本使用。  
- **`[SerializeField]`** 適合在檢視器中顯示變數，但不希望變數被其他腳本使用。  

---

有任何問題，隨時歡迎提問！我會盡力解答。
Translated with Bing AI

[^1]: 參考網站：[【初心者Unity】[SerializeField]ってなに？ | TECH PROjin](https://tech.pjin.jp/blog/2021/12/23/unity-serializefield "【Unity 初學者】[SerializeField] 是什麼？ | TECH PROjin")
ネイマン・フィッシャー分解定理の直感的理解

本記事では、統計検定などを勉強している中で出現する、あのよくわかりにくい **ネイマン・フィッシャーの分解定理** を、直感的に理解する方法を記載します。

よくテキストで見かける、抽象的な数式

$$
f(x; \theta) = g(T(x), \theta) \cdot h(x)
$$

は、本質を抽出した **g** と、ノイズといえる **h** への分解と捉えることができます。

---

## 1. 十分統計量とは？

- **十分統計量** とは、元のデータ全体の情報のうち、パラメータ $\theta$ に関する **全ての情報を含む統計量** のことです。
- 十分統計量が存在すれば、その統計量だけでパラメータの推定や検定が可能となり、元の全データを見る必要がなくなります。

たとえば、コインを100回投げて51回表が出たとします。このとき、表が出る最尤値は 0.51 となります。  
この場合、**何回目に表が出たか** を一切気にせず、**表が出た回数のみ**を考えればよいという点に注目してください。  
これが十分統計量の基本的な考え方です。個々の結果の順序は無視でき、総和さえ把握すれば十分なのです。

---

## 2. ネイマン・フィッシャー分解定理

上記の直感的理解を、形式的な表現で示すと以下のようになります。  
ネイマン・フィッシャー分解定理は、確率密度関数（または確率質量関数） $f(x; \theta)$ が次の形に分解できる場合に、ある統計量 $T(x)$ が十分統計量であることを示しています。

$$
f(x; \theta) = g(T(x), \theta) \cdot h(x)
$$

ここで、

- **$g(T(x), \theta)$**  
  パラメータ $\theta$ と統計量 $T(x)$ にのみ依存する部分です。  
  つまり、パラメータに関する情報はこの部分に集約されます。

- **$h(x)$**  
  $\theta$ に依存せず、データ $x$ のみに依存する関数です。  
  この部分は、パラメータの推定には直接関係しない「雑音」と考えられます。

この分解が可能であれば、**$T(x)$ だけで $\theta$ に関する情報を十分に捉えられる**ということになります。  
たとえば、コインの例で言えば、$(x_1, x_2, \dots, x_{10}) = (1,0,1,0,0,0,0,1,1,0)$ という結果から、  
コインの表が出る確率（最尤値） 0.4 を求めるのに、$T(x) = x_1 + x_2 + \cdots + x_{10}$ のみを計算すればよく、個々の $x_i$ を考慮する必要はないということです。

---

## 3. まとめ

以下の数式自体に慣れることも、統計学習の上で非常に重要です。

$$
f(x; \theta) = g(T(x), \theta) \cdot h(x)
$$

また、サンプル問題として、以下の問題を確認してみてください。

- **問題例**  
  $X_1, \dots, X_n \overset{\text{i.i.d.}}{\sim} f(x \mid \Theta)$
  
  
 ただし $0 \le x \le 1$, $0 < \Theta$） 
  で、  
  $$
  f(x \mid \Theta) = \Theta x^{\Theta-1}
  $$  
  のとき、十分統計量を求めよ。

解答は、参考リンクの前半部に記載されていますので、ぜひ確認してみてください。
https://qiita.com/toukei/items/b285580184b1056e3c0e
electron-builder + macでproductNameに「プ」が含まれると起動時にクラッシュする

electron-builderで「マイアプリが予想しない理由で終了しました」と表示され、強制終了されていた。

原因はproductNameに「プ」が含まれていたこと。
「マイアプリ」→「マイアフリ」にすると発生しない。

macでは全角カナは避けた方が良さそう。


```.electron-builder.config.js
module.exports = {
  productName: `マイアプリ`
  ...
}
```

```問題の詳細情報
Thread 0 Crashed:: CrBrowserMain Dispatch queue: com.apple.main-thread
0   Electron Framework            	       0x999999999 v8::BackingStore::MaxByteLength() const + 12284
1   Electron Framework            	       0x999999999 v8::internal::compiler::CompilationDependencies::FieldTypeDependencyOffTheRecord(v8::internal::compiler::MapRef, v8::internal::compiler::MapRef, v8::internal::InternalIndex, v8::internal::compiler::ObjectRef) const + 8269100
...
```
AWS LambdaでMJMLを動かす

MJMLはHTMLメールを作成するためのテンプレート言語のようなものです。
メール送信する際にMJML形式で書かれたメールは最終的にHTMLに変換される必要がありますが、その変換部分をAWS Lambdaで実装します。

## 前提
- AWS CDK
- Lambda(Node.js)

## インストールするライブラリ
- mjml
- @types/mjml

## Lambda関数の作成
```typescript
new lambda_nodejs.NodejsFunction(this, 'SendEmailFunction', {
      functionName: 'SendEmailFunction',
      runtime: lambda.Runtime.NODEJS_22_X,
      entry: './send-email/index.ts',
      handler: 'handler',
      bundling: {
        nodeModules: ['uglify-js'],
      },
    })
```

ポイントは、bundlingに'uglify-js'を含めることです。
そうしないと実行時に`Error: Cannot find module '../lib/utils.js'`というエラーがでることになります。
詳細はIssueを参照してください。
https://github.com/mjmlio/mjml/issues/2132

MJMLのバージョン4.15.3でも解消されていませんでした。

## 実装
`import mjml2html from 'mjml'`というふうにインポートした関数を使ってMJML（文字列）をHTML（文字列）に変換することができます。

## 最後に
HTMLメールをお手軽に作成するツールは他にもあるのでしょうか？
古いOutlookへの対応などHTMLメールは歴史の分だけ奥が深いので、MJMLのようにそこを解消してくれるツールは非常に便利でした。
関数電卓の分数表示、意外な制約

## シャープ機の制約の方が若干緩い
Xでこのような投稿を見かけた。

https://x.com/nomuran66/status/1903993514696032666

カシオ機のfx-373ESで結果が分数表示にならないということだが、シャープ機はこの結果を分数形式で表示できる。

![elw506t_fraction1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/d6bae739-1cb3-46eb-a27c-ad7ab8c84d1e.png)

説明書を見てみよう。

カシオ機は「帯分数形式で表現したときに、整数、分数、分母、区切りマークの合計数が10桁を超えるような計算結果は、分数形式で表示されません」とある。

![fx-jp900cw_manual_fraction.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/4311d8f5-563f-4c30-95c6-2bc4247f2b59.jpeg)

$ \frac{82850}{471} $ を 帯分数で表すと $ 175\frac{425}{471} $ となり、区切りマークを含めると11桁になるため、カシオ機では分数形式で表示ができないということになる。
仮分数の表示のみ可という融通は効かない。

キヤノン機もカシオ機と同様である。

![f789sg_manual_fraction.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/bce2ef30-904b-434a-a351-0ed210fafbcd.png)


一方、シャープ機は「仮分数または真分数にて、数値の表示桁数が合計9桁を超えるときは、小数に変換して表示」とあり、仮分数の表示桁数の合計が9桁に収まっていれば分数表示ができるということになる。
もちろん帯分数の表示条件を満たさなければ帯分数への切り替えはできない（上記の例でも帯分数への切り替えは不可）。

![el-509t_manual_fraction.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/e70d3906-cea3-439a-bf28-bdaa16f74fb3.jpeg)

ということで、ほんのわずかな制約の違いであるが、カシオ機・キヤノン機だと分数表示できずシャープ機だと分数表示が可能なケースが若干存在するということがわかった。

目のつけどころがシャープです。
error:0A000152:SSL routines::unsafe legacy renegotiation disabled

WSL Ubuntu にて
古いサイトにcurl通信しようとした際に、opensslが警告する問題。

■ 現象
```
# Ubuntu 24.04.2 LTS
# OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)

curl "https://legacy.example.com"

curl: (35) error:0A000152:SSL routines::unsafe legacy renegotiation disabled
```

■ 修正内容
vi /etc/ssl/openssl.cnf
```
 [openssl_init]
+ssl_conf = ssl_sect
 providers = provider_sect

+[ssl_sect]
+system_default = system_default_sect
+
+[system_default_sect]
+Options = UnsafeLegacyServerConnect
```

■ メモ

本対応は 
> Options = UnsafeLegacyServerConnect

を記載すること…という記事が散見されるが、記事によって記載場所が crypto-policy や system_default_sect 等異なったり、記載場所がない時もある。

そんな時は、openssl_initの中で `ssl_conf` に刺さるように色々セクション含めて追記すると
動作するようになる。
ShogiDroidで振電3（その他エンジン）を動かす

# TL;DR

振電３なら，配布されているものの.exeファイルを以下の実行ファイルに変えることで動かせます．

https://drive.google.com/drive/folders/1riog5HwW0SrDyJ2lP-vHvCvdJKCDWK_i?usp=drive_link

Android上のフォルダ配置は以下です．
```
.
└── ShogiDroid/
    └── engine/
        ├── Shinden3/
        │   ├── eval/nn.bin
        │   ├── book/standard_book.db
        │   ├── Yane~
        │   └── Yane~
        └── Suisho5(例)/
            ├── eval/
            ├── book/
            ├── Yane~
            └── Yane~
```

**解凍したShinden3のフォルダを圧縮して「アプリからインストール」しようとすると失敗します！！** 必ず，上のようなフォルダ配置になるように手動で配置してください．

## 詳細

本家YaneuraOuをフォークした

https://github.com/keinoda/YaneuraOu/tree/android-build

を参照してください．Android用のビルドに用いるAndroid.mkファイルを書き換えて，事前定義されていないNNUEアーキテクチャ（e.g. 振電３，Suisho10beta，ポンタマンなど）のヘッダーを作成するショートカット コマンド`ndk-build make_nnue_header`を追加したものになっています．

ビルド環境に必要なもの，ビルドの仕方の基本については本家Wiki/ [やねうら王のビルド手順](https://github.com/yaneurao/YaneuraOu/wiki/%E3%82%84%E3%81%AD%E3%81%86%E3%82%89%E7%8E%8B%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E6%89%8B%E9%A0%86) に非常に詳しく書いてあります．また，各評価関数に必要なアーキテクチャについても，本家Wiki/ [やねうら王のインストール手順\#評価関数のタイプ一覧表](https://github.com/yaneurao/YaneuraOu/wiki/%E3%82%84%E3%81%AD%E3%81%86%E3%82%89%E7%8E%8B%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86#%E8%A9%95%E4%BE%A1%E9%96%A2%E6%95%B0%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%97%E4%B8%80%E8%A6%A7%E8%A1%A8) に記載されています．

本家やねうら王のビルド環境と，ndk-buildの使える環境を整えた上で，例えば

```shell
ndk-build make_nnue_header YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE_HALFKP_512X2_8_64
ndk-build YANEURAOU_EDITION=YANEURAOU_ENGINE_NNUE_HALFKP_512X2_8_64
```

とすることで，事前にヘッダの用意されていないアーキテクチャに対応するエンジンをビルドすることができます．

## 参考
- [M1Macへの導入方法の動画](https://youtu.be/BFWpWNzejt4?si=7107w1q-jXYj_CN8)
- ShogiDroidの作者様の作った，Android.mk（本家やねうら王に反映済み）

###### 蛇足
いまどきarm64-v8aでないShogiDroidを動かせるようなスマホがあるのか疑問なんですが，アプリ配布するわけでもないので，arm64-v8aだけにしてtournament版にも対応できた方が嬉しい気がする．しらんけど．
Airbnbのスムーズなチェックインプロセスの作成方法

Airbnbのホストとして、ゲストの最初の印象を良くするためには、スムーズなチェックインプロセスが重要です。ゲストがスムーズに宿泊を開始できるように、効率的で分かりやすいチェックイン方法を準備しましょう。本記事では、効果的なチェックインプロセスの作成方法について詳しく解説します。

1. チェックイン方法の選択
チェックインの方法には、主に以下の3つのオプションがあります。

対面チェックイン：ホストまたは管理者が直接ゲストを迎え、鍵の受け渡しや施設の説明を行う。

セルフチェックイン：キーボックス、スマートロック、キーパッドなどを使用し、ゲストが自分でチェックインできるようにする。

デジタルチェックイン：アプリやウェブを活用して、顔認証やQRコードで鍵を開ける方法。

おすすめはセルフチェックインです。特に海外からのゲストや深夜到着のゲストにとって、自由にチェックインできる方法は大きな利便性となります。

2. 詳細なチェックイン手順を提供
ゲストが迷わないように、わかりやすいチェックインガイドを作成しましょう。

メッセージの送信：宿泊前日に、チェックイン方法、住所、アクセス方法を含めた詳細を送る。

写真や動画の活用：鍵の受け取り場所、建物の入口、エレベーターの使い方などを写真や動画で説明する。

多言語対応：英語、日本語、中国語など、多くのゲストが理解できる言語で案内を用意する。

3. スマートロックの導入
スマートロックを導入すると、鍵の受け渡しの手間を省けるだけでなく、安全性も向上します。以下のようなメリットがあります。

ゲストごとに異なる暗証番号を設定できる。

遠隔操作で鍵を開閉できるため、トラブル時も対応しやすい。

鍵を紛失する心配がない。

代表的なスマートロックとして、August Smart Lock や Nuki Smart Lock などがあります。

4. 緊急時の対応を準備
万が一、ゲストがチェックインできない場合に備えて、以下の対応策を用意しましょう。

予備の鍵の保管：近隣のキーボックスや管理人に予備の鍵を預ける。

サポート連絡先の共有：ホストの連絡先、緊急時のサポートスタッフの情報を提供する。

トラブルシューティングガイド：「鍵が開かない」「部屋の場所がわからない」などのFAQを事前に送る。

5. ゲスト体験を向上させる工夫
チェックインをスムーズにするだけでなく、ゲストの満足度を上げる工夫も重要です。

ウェルカムメッセージの送信：「ようこそ！ご滞在を楽しんでください」といった歓迎メッセージを送る。

地元情報の提供：近くのコンビニやおすすめのレストランのリストを用意する。

宿泊ガイドブックの設置：Wi-Fiパスワード、ゴミの出し方、家電の使い方などをまとめた冊子を作成する。

まとめ
スムーズなチェックインプロセスは、ゲストの満足度向上と高評価の獲得につながります。対面・セルフ・デジタルチェックインの方法を比較し、最適な方法を選びましょう。また、詳細なガイドを提供し、トラブルを未然に防ぐ工夫をすることが重要です。

Airbnb管理をよりスムーズにするために、ぜひチェックインプロセスを最適化してみてください！

Airbnb管理について詳しく知りたい方は、こちらをご覧ください：

For more details visit https://www.bnbmanagementsunshinecoast.com.au/
UdonSharp クイックスタートガイド ～UdonSharpを始めよう～

# UdonSharpを始めよう

## UdonSharpってナニモノ？
UdonSharpはC#をVRChat向けに改良したものです。
C#経験者、プログラミング経験者であればコツはつかみやすいと思います。

筆者はPythonがメインで、C#はからっきしでしたが
少々癖はあるものの古き良きって感じで嫌いではないという印象です。

## 前置き
「UdonSharp」で検索すると「VCC+UDON SDKが必要です」など記述のある記事が上位にヒットしますが、これは古い情報です。

VCCでワールドのプロジェクトを立ち上げる際のスクリーンショットを見ると「UdonSharp」を選択する項目があるものもあり、混乱してしまいます。

しかし、現在はワールドのプロジェクトを立ち上げると初めからUdon関連が導入されており、すぐに始めることができます。本記事ではワールドプロジェクトの立ち上げから「Hello World」までを解説します。

## 1. ワールドプロジェクトの立ち上げ
- VCCでプロジェクトを作成、「World2022」を選択。
- ワールド名は「My First Udon Sharp」に命名。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/03f7059b-6456-45bd-b53a-7d2c80fc7fe2.png)

- パッケージを選ぶ画面から「VRWorld Toolkit」の横の＋ボタンを押して導入してからプロジェクトを立ち上げ 

## 2. UdonSharpを適用するゲームオブジェクトの作成
- ヒエラルキーの左上の「＋」ボタンから `3D > Cube` を選択。

![bandicam 2025-03-24 12-09-35-770.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/61d6df2b-542b-495f-8068-9d7740a7aa2d.jpeg)


- 今回は「UdonCube」に命名します。

## 3. CubeにUdonSharpを適用
- `Add Component` から `Udon Behaviour` を追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/a9c9c0b0-a1fe-4cd2-b5a8-d87bf6372d4a.png)



- `New Program` を選択。

![bandicam 2025-03-24 12-04-59-761.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/733b9e04-2921-46b9-b7ec-6cb23ef3f9f4.jpeg)

- `Create Script` を選択し、スクリプトに名前を付ける。
![bandicam 2025-03-24 12-11-12-315.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/63d24b9c-b027-44f9-a5ae-04d655660e30.jpeg)
  - ゲームオブジェクトと同じ名前にしてもよいし、オリジナルの名前を付けてもよいです。
  - **ただし、同時に生成される緑の `Program Asset` の名前は変更しないこと。**

この時、コンソールログでエラーが出なければ問題ありません。




## 4. プログラムを編集（Hello World）
- 白いアイコンのスクリプトファイルをダブルクリックすると、Visual Studio が立ち上がります。
  - 初めて起動する場合は、インストール等が入る場合があります。

### 初期状態のコード
スクリプトには、以下のようなコードが記述されています。

```csharp
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class UdonCube : UdonSharpBehaviour
{
    void Start()
    {

    }
}
```  

ここにコンソールログに文字列を出力ためのプログラムを追記します

```csharp
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class UdonCube : UdonSharpBehaviour
{
    void Start()
    {
        Debug.Log("Hello World!");
    }
}
```  
### 解説
- `Start()` はプログラムが実行されて最初の1回だけ動作します。

### 実行手順
- Unityに戻ると、コンパイル（プログラムの検証）が走ります。
- 問題がなければ、画面上部の再生ボタン▶からゲームモードに切り替えます。
- コンソールログに `Hello World` が出力されれば成功！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/835cf42b-b61a-4449-a5dd-e6a9c739050b.png)


## もしエラーがでたとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533083/7b46e6bc-2986-4ed9-9078-183c892c26ef.png)
- 例えば、画像は(11,34)の部分から、11行目に；がないことを指摘しています。
- ググってもいいし、ChatGPTにエラー文をコピーしてそのまま投げても大丈夫です。この赤字を解決しきらないとプログラムはが動きません。

## 5. まとめ
これｄHello Worldを表示する手順が完了です。お疲れ様でした！
【イベントレポート】KAGのLT会 #4 〜エンジニア、デザイナー、スクラムマスターの知見を共有したい！〜

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回は2025.03.24（月）に開催した**KAGのLT会 #4 〜エンジニア、デザイナー、スクラムマスターの知見を共有したい！〜**へ参加しましたのでアウトプットとしてイベントレポートを執筆しました。

初見の方でもサクッと読めるように平易な表現で執筆しておりますので、お気軽に読んでいただければ幸いです。

#### イベントページ

https://kddi-agile.connpass.com/event/348744/

# 目次
- LT① E2Eテストを再設計してコストを削減した話
- LT② KAG中途入社エンジニアのリアル 〜身の回りの変化と新しい景色〜
- LT③ 初フルマラソン完走！プロダクトオーナーリードの仕事で培った力が活きた話
- ゲストLT 怪しいネットアイドルのAWS奮闘日記
- まとめ

## LT① E2Eテストを再設計してコストを削減した話

#### 参考サイト

https://qiita.com/akid3020/items/b92d09a81e7671f37ddd

https://t.co/nsGxAKDShe

- 自己紹介
    - KAG所属のソフトウェアエンジニアの方
    - 普段はスマホアプリの開発を行っている
    - QA業務に興味関心があり社内勉強会を行っている
- E2Eテスト自動化したが
    - E2Eテストを自動化したが何回も実行しないと失敗する
    - 自動テストのメンテナンス工数もかかってしまう
    - E2Eテストを実行するにもコストがかかる
        - （個人的考察）ユースケースに基づくからコストはかかりますよね
    - 理想的なテストはピラミッド型（E2Eテストは最小限）
- E2Eテストを再設計してみた
    - E2Eテストでやりたいことを決めておく（テスト目的など）
        - リスクの高い機能のみをテストするのがベター
    - リスクレベルの定義を決める
        - 松竹梅といった形でレベルに分けて分類していった
        - プロダクトオーナー含めコミュニケーションを行っていった
- やってみた結果
    - 自動テストの実行時間を大幅にダウンできた
    - メンテナンス工数も大幅に削減することができた
- まとめ
    - 今回取った手段としてE2Eテストの縮小
    - テストピラミッドを考えるとユニットテスト・リグレッションテストの品質向上を行っていく
    - （個人的考察）テストは奥深いなぁ
    - （個人的考察）統一基準をステークホルダーが理解しているのは良すぎる

## LT② KAG中途入社エンジニアのリアル 〜身の回りの変化と新しい景色〜
- 自己紹介
    - KAG所属のエンジニアの方
    - 今年3月にKAGに転職された方
    - JAWS-UG名古屋 運営の方
- 入社してみて
    - 毎日が楽しい生活
- 現在行っていること
    - 法人向けWebサービスの開発担当
    - フルスタックエンジニアとしてアプリケーションからインフラまで担当
        - Nust・TypeScriptなどを利用している
    - ワークライフバランスも考えた生活習慣を行えている
    - リモートだけでなく名古屋オフィスでも働いている
- 見えてきた景色
    - チームごとによって違いがある
        - チームの体制・扱っている技術・作っているプロダクトが違う
        - ドメイン・技術領域によらずチャレンジできる
    - ディスカッションが活発な会社
        - リモートワークが主流なのでSlackで交流している
    - Working Agreement（全社ルール）の存在
        - 毎週チームで確認しながらブラッシュアップしている
- 今後
    - 変わらず何事も楽しく行っていく

## LT③ 初フルマラソン完走！プロダクトオーナーリードの仕事で培った力が活きた話
- 自己紹介
    - 2024年にKAGに入社されたPOリードの方
    - 仙台オフィス所属の方
    - 直近フルマラソンを完走された
- フルマラソンの理由
    - 仙台拠点の立ち上げ時にフルマラソンイベントが告知されていた
    - **今の自分を超えていく**といった目的達成のためのチャレンジ
    - そのうえで最長でも14キロしか走れない
        - 逆算思考でフルマラソン戦略を構築していった
    - フルマラソンに向け専門家からの情報収集を行ってみた
        - 青山学院の駅伝メンバー・大塚製薬など
    - スタート前に同僚と集合写真撮影を行いモチベーション向上
    - 30KM地点でくじけそうになったが**掲げていた目的**を振り返っていった
- フルマラソンの経験と業務
    - POリードとしての業務でも目的設定・逆算思考・情報収集が役立った
    - マラソンもプロダクト開発も小さな成功体験から大きな成長につながる
    - チャレンジを行っていくことが大切

## ゲストLT 怪しいネットアイドルのAWS奮闘日記
- 自己紹介
    - NECソリューションイノベータ所属の方
    - コミュニティ活動を通じて情報収集を行っている
    - ロールとしてWeb開発エンジニアの方
        - AWSは趣味でキャッチアップしている
- 怪しいネットアイドルとは
    - きっかけはJAWS DAYSでの活動から
    - ジャスミン茶パーカーがXでバズりネットアイドルとして有名に
- AWS学習方法
    - 当初はSAP試験学習から
    - 社外の有識者から教えてもらいながら教わった
    - みのるん課題は何とかクリアしていった
- 今後の抱負
    - 手を差し伸べていく存在になっていく

## まとめ

どのLTも学びがある内容で、私のキャッチアップ活動に役立てていきたいと思いました！
そのうえで、ジャスミン茶さんの情報感度の高さがすごすぎるので見習っていきたいと思いました！！

最後まで、記事をお読みいただきありがとうございます！
プロキシを経由してClientVPNエンドポイントに接続ができないときのチェックポイント

# はじめに
閲覧ありがとうございます、NTTデータ先端技術の@S-takahashi1129です。
ClientVPNエンドポイントにプロキシサーバ経由で接続しようとした際、自分が詰まってしまった部分について、書き留めておきます。

なお、環境によっては必ずしも今回記載した設定が必要とは限りませんのでご了承ください。

# クライアントソフトとしてAWS VPN Clientの利用はしない
クライアント側がClientVPNエンドポイントにアクセスする際の選択肢はいくつかありますが、AWS公式が提供している**AWS VPN Client**はプロキシを経由する際は避けるのが無難です。プロキシ用の設定をした際に設定ファイルがエラーで弾かれる場合があります。

公式ドキュメントでも案内されている、OpenVPNのクライアントアプリを利用することをオススメします。



# easy-rsaによる証明書発行はFQDNを指定する
[AWSの公式ドキュメント](https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/client-auth-mutual-enable.html)や、ネット上のClientVPNの利用方法を解説している記事の通りに手順を進めると、認証局を作成したあとにサーバー証明書及びクライアント証明書を作成するのが一般的かと思います。

```:CA(認証局)の作成
$ ./easyrsa build-ca nopass
```
```:サーバー証明書とクライアント証明書の作成
./easyrsa build-server-full server nopass

./easyrsa build-client-full client1.domain.tld nopass
```
しかし、このように証明書を作成しACMに登録した場合、ClientVPNエンドポイント作成の際にACMから証明書を選択するドロップダウンに、作成した証明書が表示されないこと場合があります。

その際は、証明書を発行する際に、FQDNを指定することで解決する可能性があります。
```:FQDNを指定したサーバー証明書とクライアント証明書の作成
./easyrsa build-server-full vpn.example.com nopass

./easyrsa build-client-full client.example.com nopass
```

# ClientVPNエンドポイントのプロトコルをTCPにする
プロキシを利用する際は、ClientVPNエンドポイントを作成する際のトランスポートプロトコルの設定で、**TCP**を設定する必要があります。
こちらの設定はエンドポイント作成後の変更ができないため、ご注意ください。
![トランスポートプロトコル.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528603/64cf7399-1f78-4f89-9a0c-7ec6f5d629b2.png)


# 設定ファイルにプロキシの設定を追記する
ClientVPNのコンソール画面からダウンロードしたクライアント設定ファイルは、プロキシ経由でVPN接続する場合追記を行う必要があります。

ダウンロードした設定ファイルの冒頭に、次のようにプロキシの設定を追加します。

```:追記するプロキシ設定
http-proxy <Proxy-ip> <port> stdin basic
```
```:追記後
client
dev tun
proto TCP
http-proxy 123.123.123.123 555 stdin basic 
remote cvpn-endpoint-0011abcabcabcabc1.prod.clientvpn.eu-west-2.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
remote-cert-tls server
cipher AES-256-GCM
verb 3
```

# 設定ファイルでDNS名を変更し、名前解決のエラーを解決する
ClientVPNのコンソール画面からダウンロードしたクライアント設定ファイルは、デフォルトのまま使うと名前解決が成功しない場合があります。

DNS名を指定する行を以下のように修正します。

```:DNS指定(修正前)
remote cvpn-endpoint-0011abcabcabcabc1.prod.clientvpn.eu-west-2.amazonaws.com 443
```
DNS名の前に"asdfa."（ランダムな文字列）という文字列を追加します。

```:DNS指定(修正後)
remote asdfa.cvpn-endpoint-0011abcabcabcabc1.prod.clientvpn.eu-west-2.amazonaws.com 443
```

こちらは利用しているクライアントソフトによって対応要否が分かれます。
DNS名の解決ができない要因としては、ClientVPN設定ファイルには、DNS キャッシュを防止するためにクライアントがDNS名の前にランダム文字列を追加するよう強制するプロパティが存在しますが、一部のクライアントではこれが適用されず、必要なランダム文字列がDNS名の前に追加されないことで、結果的にDNS名の解決がエラーとなってしまうようです。
そこで、手動でランダムな文字列を追加することで名前解決可能にする必要があります。

公式ドキュメントの記載が参考になります。

[AWS公式ドキュメント(トラブルシューティング AWS Client VPN: クライアント VPN エンドポイント DNS 名を解決できません)](https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/resolve-host-name.html)

# おわりに
DNS名解決の部分は公式ドキュメントでもなかなか気づきにくい部分に記載がありますので特によく詰まるポイントになるかと思います。

以上、閲覧ありがとうございました。
HP作成備忘録：ハンバーガーメニューに動きをつけるJavaScriptの書き方について

## はじめに

スマートフォン対応のWebサイトでよく見かける「ハンバーガーメニュー」。

:::note warn
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

今回は、そのメニューをクリックしたときに開いたり閉じたりするためのJavaScriptの基本的な実装を紹介します。

## 書こうと思ったきっかけ

ハンバーガーメニューの見た目をCSSで整えたあと、「実際にクリックして開閉できるようにするにはどうすればいいか？」と悩んだことがきっかけです。

シンプルなコードながら、しっかり動かすにはJavaScriptの仕組みが必要なので、備忘録としてまとめました。

## 内容の説明（スクリプトの解説）

以下は、HTML内に直接書いたシンプルなスクリプトです。

```html
<!-- メニュー開閉スクリプト -->
<script>
  const hamburger = document.getElementById('hamburger');
  const navMenu = document.getElementById('nav-menu');

  hamburger.addEventListener('click', () => {
    hamburger.classList.toggle('open');
    navMenu.classList.toggle('active');
  });
</script>
```

### 解説
- `getElementById('hamburger')`：ハンバーガーアイコンの要素を取得
- `getElementById('nav-menu')`：ナビゲーションメニュー全体の要素を取得
- `addEventListener('click', ...)`：クリックされたときに関数を実行
- `classList.toggle('open')`：クリックのたびに open クラスを付けたり外したりする
- `classList.toggle('active')`：メニューの表示・非表示を切り替える

この仕組みによって、CSS側で `.open` や `.active` にスタイルを定義しておけば、クリックに応じてメニューが表示されたり、アイコンが変形したりするようになります。

## まとめ

このようなシンプルなJavaScriptの実装でも、ハンバーガーメニューの開閉を実現することができます。

:::note info
***クリック時に class を切り替えるだけという基本的な仕組みですが、CSSと連携させることで非常に効果的なUIが作れます。***
:::

今後は、外部クリックで閉じる処理やARIA属性の対応など、アクセシビリティにも配慮した拡張にもチャレンジしていきたいと思います！！
【コマンド】Winget

## 目次
- [コマンド](#コマンド)
    - [バージョンを確認する](#バージョンを確認する)
    - [パッケージをインストールする](#パッケージをインストールする)
    - [パッケージをアンインストールする](#パッケージをアンインストールする)
    - [パッケージを更新する](#パッケージを更新する)
    - [パッケージを検索する](#パッケージを検索する)
    - [インストールパッケージを確認する](#インストールパッケージを確認する)
    - [パッケージ情報を確認する](#パッケージ情報を確認する)
    - [インストールパッケージを書き出す](#インストールパッケージを書き出す)
    - [パッケージを一括インストールする](#パッケージを一括インストールする)

## コマンド

### バージョンを確認する

```powershell
winget -v
```

### パッケージをインストールする

```powershell
winget install "パッケージ名"
```

### パッケージをアンインストールする

```powershell
winget uninstall "パッケージ名"
```

### パッケージを更新する

更新可能なパッケージを表示する。
```powershell
winget upgrade
```

指定したパッケージを更新する。
```powershell
winget upgrade "パッケージ名"
```

全てのパッケージを更新する。
```powershell
winget upgrade --all
```

### パッケージを検索する

```powershell
winget search "パッケージ名"
```

### インストールパッケージを確認する

```powershell
winget list
```

### パッケージ情報を確認する

```powershell
winget show "パッケージ名"
```

### インストールパッケージを書き出す

```powershell
winget export "ファイル名".json
```

### パッケージを一括インストールする

```powershell
winget import "ファイル名".json
```
HP作成備忘録：CSSで親しみやすいUIを作ってみたので記事にまとめてみた

## はじめに

Web制作をしていると、デザインの細かい調整がユーザー体験に大きく影響することを実感します。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::


今回は、あるCSSコードを通じて、セクションや見出し、ナビゲーションをどのようにスタイリングしているのかを分かりやすく解説していきます。

## 書こうと思ったきっかけ

Webページを作っている中で「見た目がなんだか整わない」「ボタンが地味すぎる」などと感じることがありました。

:::note warn
***そんなとき、あるCSSのサンプルに出会い、「これ、すごく良い！」と思ったのがきっかけです。***
:::

https://coliss.com/articles/build-websites/operation/css/minimalist-css-framework-neatcss.html

コードを見るだけでは分かりづらい部分もあるので、何がどう設定されていて、どう見た目に反映されているのかを丁寧に整理してみようと思いました。

## 内容の説明（回答内容のまとめ）

### 1. section のスタイル
```css
section {
  margin-bottom: 40px;
  background-color: #fffdf9;
  padding: 30px 20px;
  border-radius: 8px;
  border: 1px solid #ffe0b2;
  box-shadow: 0 2px 4px rgba(0,0,0,0.05);
}
```
- セクションの下に余白を作り、コンテンツを区切りやすく。
- ごく薄いアイボリーの背景でやさしい印象。
- 内側の余白や丸みのある角、薄い枠線と影でカード風に仕上げています。

### 2. h2 のスタイル
```css
h2 {
  color: #000000;
  border-left: 6px solid #3d843d;
  padding-left: 12px;
  margin-top: 0;
  font-size: 20px;
}
```
- 見出しの左に緑色の太線をつけて視覚的に目立たせています。
- 黒い文字色、余白の調整、少し大きめのフォントサイズで読みやすく、整った印象。

### 3. nav と nav a のスタイル
```css
nav {
  margin-top: 10px;
}
```
- ナビゲーションブロックとその前の要素の間に余白を設定。

```css
nav a {
  margin: 0 10px;
  text-decoration: none;
  color: #ffffff;
  background-color: #3d843d;
  padding: 6px 12px;
  border-radius: 20px;
  font-size: 14px;
  display: inline-block;
  transition: background-color 0.3s;
}

nav a:hover {
  background-color: #ff9800;
}
```
- ボタン風のリンクを実現。
- 緑色の背景、白い文字、丸みのある形状で柔らかく親しみやすい印象。
- ホバー時にオレンジ色へ変化し、ユーザーのアクションを視覚的に示します。

## まとめ

このCSSスタイルは、読みやすさ・使いやすさ・見た目の美しさをしっかり押さえた構成になっており、親しみやすく整ったUIを簡単に実現できます。

ちょっとした余白や色、影の使い方で、ページの印象は大きく変わります。

**今回の解説が、あなたのWeb制作のヒントになれば嬉しいです！！**
【コマンド】p7zip

## 目次
- [コマンド](#コマンド)
    - [7zファイルに圧縮する](#7zファイルに圧縮する)
    - [7zファイルを解凍する](#7zファイルを解凍する)
    - [7zファイルの中身を確認する](#7zファイルの中身を確認する)
 
## コマンド

### 7zファイルに圧縮する

```zsh
7z a "ファイル名".7z "圧縮するファイル名"
```

### 7zファイルを解凍する

```zsh
7z x "ファイル名".7z
```

### 7zファイルの中身を確認する

```zsh
7z l "ファイル名".7z
```