OmniAICreator/Qiita-1.07M huggingface dataset:
JuliaのPlotsでインセットのある図を描画する

プロットの中にプロット領域を作るような、インセット(inset)のある図を載せる方法が、日本語ではあまり検索に引っかからないため、こちらに備忘録として載せておきます。

# インセットでプロットする方法
[こちらのドキュメント](https://docs.juliaplots.org/latest/layouts/)を参考に、順番に図を交えて書いていきます。
すべてをまとめたサンプルコードは[こちら](#サンプルコード)です。

1. `using Plots`でPlotsを扱えるようにします。
    ```julia
    using Plots
    ```
2. メインとなるプロットを`main_plot`と名前を付けて、作成＆描画します(今回は正弦波にしました)。
    ```julia
    main_plot = plot(sin)
    ```
    ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/ac521c2a-4dbc-11a8-d6a5-5544dba322f6.png)

3. インセットの描画領域を作成し、`inset_plot`という名前を付けておきます。 ここで、`bbox(x, y, width, height)`でインセットの位置と大きさを指定してあげます。
    ```julia
    inset_plot = plot!(main_plot,inset=bbox(0.3,0.3,0.4,0.4))
    ```
    ![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/077fb69b-93f0-4d79-6af8-450bf71688b1.png)

4. インセットにデータを描画します（今回は余弦波にしました）。
    ```julia
    plot!(inset_plot, cos, subplot=2)
    ```
    ![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/00927790-79b3-039b-42a1-c96c4eb3a76f.png)

# サンプルコード
以上の手続きをまとめて、少し成形したサンプルコードを載せておきます。
```julia
using Plots

default(
  fontfamily="serif-roman",
  guidefontsize=25,
  tickfontsize=10,
  legendfontsize=15,
  margin=5Plots.mm,
)

# メインプロット（sinカーブ）
main_plot = plot(
  sin,
  label="sin(x)",
  title="Sin Curve with Cos Inset",
  xlabel="x",
  ylabel="y",
  legend=:bottomleft,
  bg_inside = :azure2,
  )

# インセットの追加
inset_plot = plot!(main_plot, cos, 
      inset = bbox(0.37, 0.15, 0.2, 0.2), 
      subplot = 2, 
      legend = false,
      bg_inside = :azure,
      )
plot!(inset_plot, sin, 
      subplot = 2, 
      legend = false,
      )
```

## 出力結果
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269455/07b6b903-ca47-5e1c-0933-cdbd4e4a82e4.png)
【AWS】cloudFront経由でS3コンテンツをアクセスする

S3のパブリックアクセスブロックを有効にしたい時、S3コンテンツのアクセスはCloudFront経由でアクセスする必要があります。ここではその設定方法をまとめてみます。


# 概要
完成図は下記のイメージです。
![s3-cloudFront.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/4ddf2121-c2e3-20b3-4c2e-7b9e8f1667fa.png)

# 前提
Route 53のドメインが作成されていること。

# 手順
1. S3バケット作成
1. ディストリビューションの作成
    1. オリジン
    1. キャッシュビヘイビア
    1. 設定

## S3バケット作成
パブリックアクセスブロックのS3バケットを作成
![スクリーンショット 2024-11-19 14.49.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/fb5cd809-5495-af4c-055c-2cd0b9f2da9d.png)

## ディストリビューションの作成
### オリジン
1. Origin domainは先ほど作ったAmazon S3バケットから選ぶ
1. オリジンアクセスを「Lagacy access identities」にして、バケットポリシーを自動更新にする
![スクリーンショット 2024-11-19 15.36.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/1aff5481-e17f-5c98-4d16-4046c79f8513.png)
オリジンアクセスアイデンティティがなければ、「新しいOAIを作成」で作る、それでS3バケットのバケットポリシーが更新される
```json
{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity AAAAAAAAAAA"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::sample/*"
        }
    ]
}
```

### キャッシュビヘイビア
ビューワープロトコルポリシーを設定
![スクリーンショット 2024-11-19 17.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/4304169b-d908-aecc-1260-fe21f9fa14ff.png)
キャッシュキーとオリジンリクエスト
![スクリーンショット 2024-11-19 17.57.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/12fcc487-21ea-3ac1-31d3-938f943fc90d.png)

S3バケットのCORSの設定も必要です。
```json
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]
```


### 設定
カスタムドメインでアクセスしたい場合、SSL証明書の設定が必要です。
※Route 53 のレコード追加も必要です。
![スクリーンショット 2024-11-19 17.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/fdce607e-2d12-d6df-3d13-213589f11691.png)
privateメソッドを呼び出し、オーバーライドする

# スーパークラスのprivateメソッドはサブクラスでも呼び出せる
```rb
irb(main):001* class Product
irb(main):002*   private
irb(main):003*
irb(main):004*   def name
irb(main):005*     'A great movie'
irb(main):006*   end
irb(main):007> end
=> :name
irb(main):008* class DVD <Product
irb(main):009*   def to_s
irb(main):010*     "name:#{name}"
irb(main):011*   end
irb(main):012> end
=> :to_s
irb(main):013> dvd = DVD.new
=> #<DVD:0x000000010bdc8168>
irb(main):014> dvd.to_s
=> "name:A great movie"
```

# privateメソッドはオーバーライドできる
```rb
irb(main):001* class Product
irb(main):002*   def to_s
irb(main):003*     "name:#{name}"
irb(main):004*   end
irb(main):005*
irb(main):006*   private
irb(main):007*
irb(main):008*   def name
irb(main):009*     "A great movie"
irb(main):010*   end
irb(main):011> end
=> :name
irb(main):012* class DVD < Product
irb(main):013*   private
irb(main):014*
irb(main):015*   def name
irb(main):016*     "An awesome film"
irb(main):017*   end
irb(main):018> end
=> :name
irb(main):019> pruoduct = Product.new
=> #<Product:0x000000010f344c10>

irb(main):021> pruoduct.to_s
=> "name:A great movie"
irb(main):022> dvd = DVD.new
=> #<DVD:0x000000010f37f108>
irb(main):023> dvd.to_s
=> "name:An awesome film"
```
MySQLでPartitionテーブルを作成する方法

# MySQLでPartitionテーブルを作成する方法

MySQLのPartitioning機能を使用すると、大規模なテーブルを複数の小さな部分（パーティション）に分割して管理できる。これにより、クエリのパフォーマンスが向上したり、データの管理が簡単になったりすることがある。ただし、すべてのシナリオで有効というわけではなく、メリットとデメリットをよく理解する必要がある。

## Partitionテーブルを作成する方法

Partitionテーブルを作成するには、`CREATE TABLE`文で`PARTITION BY`句を使用する。主に`RANGE`、`LIST`、`HASH`、`KEY`の4種類のパーティション方式がある。

### 1. RANGE Partitioning

特定の範囲に基づいてデータを分割する。

```sql
CREATE TABLE sales (
    id INT NOT NULL,
    sale_date DATE NOT NULL,
    amount DECIMAL(10, 2),
    PRIMARY KEY (id, sale_date)
) PARTITION BY RANGE (YEAR(sale_date)) (
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION pmax VALUES LESS THAN MAXVALUE
);
```

- **説明**: `sale_date`の年に基づいてデータを分割する。`p2021`には2021年までのデータが、`p2022`には2022年までのデータが格納される。

### 2. LIST Partitioning

特定の値のリストに基づいてデータを分割する。

```sql
CREATE TABLE employees (
    id INT NOT NULL,
    name VARCHAR(50),
    department_id INT,
    PRIMARY KEY (id, department_id)
) PARTITION BY LIST (department_id) (
    PARTITION p1 VALUES IN (1, 2, 3),
    PARTITION p2 VALUES IN (4, 5, 6),
    PARTITION p3 VALUES IN (7, 8, 9)
);
```

- **説明**: `department_id`の値に基づいてデータを分割する。`p1`には1、2、3の値を持つデータが格納される。

### 3. HASH Partitioning

ハッシュ関数を使用してデータを均等に分散する。

```sql
CREATE TABLE logs (
    id INT NOT NULL,
    log_date DATE,
    message TEXT,
    PRIMARY KEY (id)
) PARTITION BY HASH (YEAR(log_date)) PARTITIONS 4;
```

- **説明**: `log_date`の年に基づいてデータを4つのパーティションに分散する。

### 4. KEY Partitioning

MySQLの内部ハッシュ関数を使用してデータを分散する。

```sql
CREATE TABLE user_activity (
    user_id INT NOT NULL,
    activity_date DATE,
    details TEXT,
    PRIMARY KEY (user_id, activity_date)
) PARTITION BY KEY(user_id) PARTITIONS 3;
```

- **説明**: `user_id`を使用してデータを3つのパーティションに分散する。

## Partitionテーブルのメリット

1. **パフォーマンス向上**:
   - クエリの実行速度が向上することがある。特に、大量のデータがある場合に有効で、クエリが特定のパーティションのみをスキャンするため、検索範囲が限定される。
2. **効率的なデータ管理**:
   - 古いデータを簡単に削除したり、新しいデータを追加したりするのが簡単。特定のパーティションをDROPやTRUNCATEすることで、素早くデータを管理できる。
3. **データのアーカイブ**:
   - 定期的なデータのアーカイブやローテーションが容易になる。

## Partitionテーブルのデメリット

1. **複雑な設計**:
   - パーティションの設計が複雑になることがある。間違った設計をすると、パフォーマンスが逆に悪化する場合もある。
2. **インデックスの制限**:
   - 一部のインデックス機能が制限される場合がある。たとえば、パーティションキーは主キーや一意キーの一部でなければならない。
3. **バックアップと復元の複雑さ**:
   - パーティションテーブルのバックアップや復元が非パーティションテーブルに比べて複雑になることがある。
4. **レコードの均等な分散が難しい**:
   - `RANGE`や`LIST`パーティションでは、データが均等に分散しない場合がある。その場合、特定のパーティションにデータが集中してしまう可能性がある。

## まとめ

Partitionテーブルは、大量のデータを効率的に管理したり、クエリパフォーマンスを向上させるのに役立つ。ただし、すべてのユースケースに適しているわけではなく、設計時にメリットとデメリットを十分に検討する必要がある。データの特性に合わせて、適切なパーティション方式を選択する必要がある。
AWS GuardDutyメモ

**AWS GuardDuty**は、Amazon Web Services (AWS) が提供する**脅威検出サービス**です。リアルタイムでAWS環境内の悪意のあるアクティビティや不正アクセスを検出し、通知することができます。主に、クラウドインフラのセキュリティを強化し、潜在的な脅威から保護するために利用されます。

### **主な機能**
1. **脅威の検出**  
   AWS GuardDutyは、AWS環境内で発生した異常な動きや悪意のあるアクティビティをリアルタイムで検出します。これには、不正なAPI呼び出し、異常なネットワーク接続、未知のIPアドレスからのアクセス、ポートスキャンなどが含まれます。

2. **データソースの監視**  
   GuardDutyは、次のデータソースから脅威を監視します:
   - **VPCフローログ**（ネットワークトラフィックのデータ）
   - **AWS CloudTrailイベントログ**（APIアクティビティ）
   - **DNSクエリログ**（DNSリクエストのデータ）

3. **異常検出**  
   GuardDutyは、AIや機械学習を使用して、通常のパターンを学習し、異常な行動を検出します。例えば、突然大量のデータが転送されたり、許可されていないIPからアクセスがあった場合にアラートを発行します。

4. **通知とアラート**  
   GuardDutyは、脅威を検出すると、**Amazon SNS**を使って通知を送信できます。また、AWS Lambdaなどと連携して、検出後に自動的に対応措置を取ることも可能です。

5. **インテグレーション**  
   AWS CloudWatch、AWS Security Hub、AWS Lambdaなどと統合して、検出結果に基づいてアクションを実行したり、セキュリティインシデントを管理することができます。

### **利用方法**
- **有効化**: GuardDutyは、AWSコンソールから簡単に有効化できます。特別なハードウェアや複雑な設定は不要で、わずか数分でセットアップが完了します。
- **リージョン対応**: GuardDutyは、複数のAWSリージョンにわたって動作し、異なるリージョンのリソースを横断的に監視できます。

### **メリット**
- **リアルタイム監視**: AWS環境内で発生する疑わしいアクティビティを即座に検出。
- **機械学習ベースの脅威検出**: より精度の高い異常検出を実現。
- **自動化**: 検出された脅威に対して、事前に定義したアクションを自動で実行できます。
- **コスト効率**: 使用した分だけ課金され、運用コストを抑えることができます。

### **例**
- **異常なAPI呼び出し**: 通常とは異なるIPアドレスや時間帯からのAPIアクセスを検出。
- **VPCフローログによる検出**: 通常は発生しないポートスキャンや不正なトラフィックの流れを発見。
- **不正アクセスの検出**: DNSリクエストやアクセスログを監視して、不正なユーザーアクセスを検出。

### **活用シーン**
- **セキュリティインシデントの早期発見**: GuardDutyを使用することで、サイバー攻撃や不正アクセスの兆候を早期に発見できます。
- **コンプライアンスの強化**: 脅威の検出と通知機能を利用することで、セキュリティ体制の強化とコンプライアンスの遵守を支援します。

### **まとめ**
AWS GuardDutyは、AWSクラウドインフラのセキュリティを高めるために重要なツールです。リアルタイムで脅威を検出し、早期に対応することで、リスクを最小限に抑えることができます。
【自分用】Next.jsのSEOを意識したHTMLタグ集

[main：文章の主体(一回のみ使用可能)](#main)
[div：グルーピング全般](#div)
[span：特定テキストグループ化・スタイル適用](#span)
[h1-h6：見出し](#h1-h6)
[title：タイトル](#title)
[nav：サイトリンクやページ移動](#main)
[ariticle：ブログ・ニュース・掲示板投稿などの独立したコンテンツに使用](#div)
[aside：主要コンテンツを補足](#span)
[section：文章や節をグループ化。内部にh1-h6の記述すること](#h1-h6)
[strong：テキストを強調](#strong)
[em：テキストを傾斜で強調](#em)
[blockquote：テキスト引用](#blockquote)
[a：ハイパーリンク](#a)
[ul：箇条書き（円形マーク表示）](#ul)
[ol：箇条書き（番号表示）](#ol)
[li：リスト項目を表現（ulやolの内部に記述）](#li)
[table：テーブル全体を表現](#table)
[tr：テーブルの行を表現](#tr)
[td：テーブルのデータセルを表現](#td)
[th：テーブルのヘッダーセルを表現](#th)
[rel="canonical：重複ページの正規ページを記述](#rel="canonical)
プログラミング言語ってどうやって作ってるの？

JavaでプログラムをしているしがないITエンジニアです。

Javaは「Write Once、Run Anywhere」が謳い文句のプログラミング言語です。
先日ふと、Java自身が何でできているんだろうかと気になったんです。
「Javaを作っているのは Java」と聞いたことがありましたが、これって矛盾しているなと感じたんです。
鶏が先か、卵が先か論争ってありますよね。卵がから鶏が生まれるから、卵が先なのか。その卵を産むのは鶏だから〜ってやつ。

Javaを作っているのはJava だとすると、じゃあそのJavaは誰につくられたん？って話です。（開発者ってことではなくって）

Javaはコンパイル言語なので、コンパイラーがあります。javacってやつ。
コンパイラは人が作ったコードを、機械が読めるように変換してくれるものです。各言語に存在しています。
コンパイルを行うことで、コンピュータが認識できる（正確にはJVMが認識できる）ようになり、初めてコンピュータが操作してくれるのですが、
このコンパイラ自体がJavaで作られたって言うんです。ハテナになりません？

コンパイラもプログラムです。誰かがコンピュータに命令して動いているはずなんです。Javaが作られる前に、Javaで命令するってどういうこと？神がもたらした？

調べました。
プログラミング言語を作るいっちばん初めに、違う言語でコンパイラを作るんですって。
「ブートストラップ技法」とかいうらしいんですが、
違う言語でコンパイラを作って、Javaのコンパイラをコンパイルするんだそうです。
その後、コンパイルされ、コンピュータ上で動くようになったJavaのコンパイラに、
Javaのコンパイラをもう一度コンパイルすれば、Javaで書かれて、Javaでコンパイルされたコンパイラができるという仕組みなんです。

ここでまた疑問がひとつ。
Javaのコンパイラははじめに何の言語で作られたのか。です。
調べてみると、「C++」でした。へーですね。
つまり、C++がJavaの生みの親とも言えるのかも。
じゃあC++は？
C言語だそうです。
じゃあC言語は？
アセンブリ言語だそう。アセンブリ言語は機械語（コンピュータが読める唯一の言葉で、０と１の組み合わせで描かれる）と1:1になっており、
人が機械語を書くのが大変で作ったそうです。
そして、アセンブリ言語のコンパイラは、人が機械語（０と１の並び）を書いて作ったそうです。（かれこれ70年以上前）

といった感じで殴り書きのように書いてしまいましたが、
プログラミング言語といえどシステムなので、他の何かに作られていて、その歴史は深く、連綿と受け継がれてきたということでした。
また少しだけ、プログラミングの奥深さ（闇深さ？）を知ることができてよかったです。
gradle buildしたらGradle could not start your build.と言われた話

業務で初めてjavaを触る機会があり、buildでハマったので備忘録として残します。

# 環境

- Java:17.0.13
- gradle:8.10.2
    - sdkmanでインストール
- Spring boot:3.3.5

# エラー

`gradle`を[この手順](https://rx21.exblog.jp/242062156/)でインストールした後に`gradle build`を実行したら下記エラーが出ました。

```
FAILURE: Build failed with an exception.

* What went wrong:
Gradle could not start your build.
> Could not create service of type BuildLifecycleController using ServicesProvider.createBuildLifecycleController().
... 以下略 ...
```

# 結論

プロジェクトフォルダ配下の`.gradle` `build`フォルダを削除してから再度`gradle build`を実行

# エラー後にやったこと

### バージョンの確認

```
$ gradle -v

------------------------------------------------------------
Gradle 8.10.2
------------------------------------------------------------
```

### `.gradle`を削除

一度uninstallを試すため、プロジェクトフォルダに存在している`.gradle`フォルダを確認したところ、
`8.7`というフォルダが作成されていました。

`which`コマンドで確認してみると、本体は別のところにいたようです。
```
$ which gradle
/home/shin-gee/.sdkman/candidates/gradle/current/bin/gradle
```

プロジェクトフォルダにある`.gradle`を削除した後に、`gradle build`をすると変化がありました。

```
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
... 中略 ...

Failed to delete some children. This might happen because a process has files open or has its working directory set in the target directory.

... 以下略 ...
```

エラーが変わりましたが、
`8.7`となっていたディレクトリが`8.10.2`に変わった状態で、`.gradle`が作成されていました。
※一つ前進

### `build`を削除

調べていると、`build`ファルダを削除すると上手くいったという[記事](https://stackoverflow.com/a/70913675)を見つけたので試したところ、解消しました。

`.gradle`と同じディレクトリにあるので、root権限で削除してから再度buildしました。

```
$ gradle build

... 中略 ...

BUILD SUCCESSFUL in 24s
```

# 参考記事

- [WSL上のLinux(Debian)に新しめのGradleをインストールする](https://rx21.exblog.jp/242062156/)
- [Completely uninstall Gradle](https://discuss.gradle.org/t/completely-uninstall-gradle/43774)
- [Failed to delete some children. This might happen because a process has files open or has its working directory set in the target directory](https://stackoverflow.com/a/70913675)
PythonでExcelをHTMLに変換する

ExcelファイルをHTMLファイルに変換することは、特に表データをWebページに公開したり、他のアプリケーションと共有したりする必要がある場合に、非常に便利な機能です。この記事では、Pythonを使ってExcelのワークブックやワークシートをHTMLファイルに変換する方法を説明します。
* [PythonでExcelワークブックをHTMLに変換する](#pythonでexcelワークブックをhtmlに変換する)
* [PythonでExcelワークシートを画像を埋め込んだHTMLに変換する](#pythonでexcelワークシートを画像を埋め込んだhtmlに変換する)

## ExcelからHTMLへの変換のためのPythonライブラリ
この記事で使用しているメソッドは、Excelファイルの作成、編集、読み込み、変換のためのプロフェッショナルなPythonライブラリである[**Spire.XLS for Python**](https://www.e-iceblue.com/Introduce/xls-for-python.html)を必要とします。
[公式ウェブサイト](https://www.e-iceblue.com/Download/Spire-XLS-Python.html)から入手するか、以下のpipコマンドで直接インストールできます：
> pip install Spire.XLS


## PythonでExcelワークブックをHTMLに変換する
**`Workbook.SaveToHtml()`** メソッドは、ワークブック全体を直接 HTML ファイルに変換します。手順は以下のとおりです：
1. `Workbook` オブジェクトを作成します。
1. `LoadFromFile()` メソッドを使用して Excel ファイルをロードします。
1. **`SaveToHtml()`** メソッドを使用して、Excel ファイルを HTML ファイルに変換します。
```python
from spire.xls import *
from spire.xls.common import *

# Excelファイルを読み込む
wb = Workbook()
wb.LoadFromFile("食費.xlsx")

# ワークブックをHTMLファイルに変換する
wb.SaveToHtml("HTML/ExcelToHTML.html")
wb.Dispose()
```
![ExcelToHTML.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/5f063024-d6d0-d4e6-2f26-dc98a0d2082b.png)


## PythonでExcelワークシートを画像を埋め込んだHTMLに変換する
**`Worksheet.SaveToHtml()`** メソッドは、ワークシートを HTML ファイルに変換します。変換処理中に、Excelワークシート内の画像をHTMLファイルに埋め込むように設定することもできます。手順は以下の通りです：
1. `Workbook`オブジェクトを作成します。
1. `LoadFromFile()`メソッドを使用してExcelファイルを読み込みます。
1. `Workbook.Worksheets.get_Item()`メソッドを使用して、指定されたワークシートを取得します。
1. **`HTMLOptions`** オブジェクトを作成します。
1. **`HTMLOptions.ImageEmbedded`** を`True`に設定して、HTMLファイルに画像を埋め込みます。
1. **`Worksheet.SaveToHtml()`** メソッドを使用して、ワークシートを HTML ファイルに変換します。

```python
from spire.xls import *
from spire.xls.common import *

# Excelファイルを読み込む
wb = Workbook()
wb.LoadFromFile("价目表.xlsx")

# 指定したワークシートを取得する
sheet = wb.Worksheets.get_Item(0)

# 変換オプションを設定する
options = HTMLOptions()
# 画像を埋め込む
options.ImageEmbedded = True

# ワークシートをHTMLファイルに変換する
sheet.SaveToHtml("HTML/WorksheetToHTML.html", options)
wb.Dispose()
```

*  * *
-- PythonによるExcel変換やその他の機能については、こちらを参照してください：

https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Spire.XLS-for-Python-Program-Guide-Content.html

-- 評価メッセージを削除するには

https://www.e-iceblue.com/TemLicense.html
オープン語彙検出モデルを使って物体検出画像のアノテーション作業を自動化したい

# オープン語彙検出モデルとは
以下の画像のようにテキストベースの入力から，物体検出を行うニューラルネットワークモデルのことです．  
本来はデータを収集して，アノテーションをして，検証をして，使えるモデルの完成！！のような流れですが，オープン語彙検出モデルを使うことで，一番時間がかかるといっても良いアノテーションの作業を自動化させようと考えました．
今回はUltralyticsが公開している"yolov8x-worldv2"を使ってみました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3406134/1004f9f3-01eb-2b1b-5f74-a19c28d9728e.png)

# 検出を試す
## やること
アノテーションをしたい対象の画像から，検出対象をYOLO-WorldにアノテーションをしてもらいYOLO形式のアノテーション結果を出力させる．

## 準備(必要なライブラリのインストール)
```bash
$ conda create -n yolo_venv python=3.11(必要に応じて仮想環境を作る)
$ conda activate yolo_venv(必要に応じて仮想環境を作る)

$ pip install ultralytics
```


## アノテーション対象の画像
セブンイレブンの弁当やコールスローなどのサラダなどが写っている画像が手元にありましたので，こちらを使用します．
![bentonado.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3406134/22199e58-5aa2-ee9a-1cf8-58593169aa14.png)

## 検出と結果の出力
弁当とサラダスティックとコールスローを検出してみます．
それぞれプロンプトを["lunch_box", "plastic cup", "salad bag"]としてみます．
```python
from ultralytics import YOLO

model_path = "model/yolov8x-worldv2.pt"
detect_classes = ["lunch_box", "plastic cup", "salad bag"]
img_path = "data/bento.png"

model = YOLO(model_path)
model.set_classes(detect_classes)
results = model(img_path, save_txt=True)
results[0].show()
```

モデル自体はultralyticsのライブラリが自動でダウンロードしてくれるので，画像のパスと検出対象の変数だけ変更してください．

## 結果
- 検出結果の画像出力
このような結果になりました．弁当は検出できています．
コールスローとサラダスティックが検出できていません．プロンプトもいろいろ変えてみたのですが，検出できなかったのでそもそも学習データに近い物体がなかったと考えられます．
あと画像全体がlunch_boxになっちゃってますね．また，confidenceも高いので，修正が難しそうです．．これはあまりいい結果とは言えません．
追加でtrainingを行うことで，検出できるかもしれませんが，それだと本末転倒です．(泣)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3406134/5d6036c3-fa58-7096-8a39-6c0aee975d99.png)

- テキストファイルの出力
出力結果はカレントディレクトリの`runs\detect\predict`に保存されます．

# 効果的な使い方
正直，今回用いたデータでは，うまく機能しなかったためあまり必要性を感じませんでした．ただ，推論時間が画像1枚あたり100msもかからない程度だったので，Ultralyticsのサイトでも記述されている通りリアルタイム検出として用いるべきなのかもしれません．

また，簡単に調べてみたところ，"tallest man"だったり，"white dog"など色や特徴などを記述する使い方をされている方が多かったです．十分なデータセットがない場合でもこのモデルを使うことで，異常検知・検出のようなモデルを作成できそうだなと感じました．

# 簡単に試したい場合
hugging faceでYOLO-Worldを検索すると，簡単に検出のデモをできるアプリケーションが公開されています．
手元に環境が用意できなければ，そちらから試してみると良いかもしれません．
curl の --fail-with-body オプションを使うことで、400以上のステータスのとき、異常終了して、さらにResponseBodyを出力することができる。

# 目的
`--fail-with-body`を知る。

# 結論
- `curl` を使うとき、`--fail`もしくは`--fail-with-body`オプションをつけないと、400以上のステータスでも、正常終了してしまう。
- `--fail` オプションを使うことで、400以上のステータスのとき、異常終了することができる。しかし、Response Body は出力されない。
- `--fail-with-body`オプションを使うことで、400以上のステータスのとき、異常終了して、さらに、Response Body は出力することができる。

# 検証

``` bbb_1.sh
#!/bin/bash

set -euo pipefail

curl --fail -w "%{http_code}" -X GET \
     "https://jsonplaceholder.typicode.com/todos/123456789"

echo "Done"
```

``` bbb_2.sh
#!/bin/bash

set -euo pipefail

curl --fail-with-body -w "%{http_code}" -X GET \
     "https://jsonplaceholder.typicode.com/todos/123456789"

echo "Done"
```

``` bbb_3.sh
#!/bin/bash

set -euo pipefail

curl -w "%{http_code}" -X GET \
     "https://jsonplaceholder.typicode.com/todos/123456789"

echo "Done"
``` 

``` ccc.sh
#!/bin/bash

set -euo pipefail

curl -w "%{http_code}" -X GET \
     "https://jsonplaceholder.typicode.com/todos/3"

echo "Done"
```

```
# curl で異常終了しているが、Response Body({})は表示されない。
$ ./bbb_1.sh
curl: (22) The requested URL returned error: 404
404$

# curl で異常終了して、Response Body({})は表示される。
$ ./bbb_2.sh
curl: (22) The requested URL returned error: 404
{}404$ 

# curl で正常終了している。
$ ./bbb_3.sh
{}404Done

# curl で正常終了している。
$ ./ccc.sh
{
  "userId": 1,
  "id": 3,
  "title": "fugiat veniam minus",
  "completed": false
}200Done
```

# 参考

https://jsonplaceholder.typicode.com/

https://daniel.haxx.se/blog/2021/02/11/curl-fail-with-body/
Blazor.Extensions.Canvasを使ったお絵かきソフト

Blazor WASMで簡単なお絵かきするソフトです。

CanvasをラッピングしたBlazozrの[ライブラリ](https://github.com/BlazorExtensions/Canvas)を利用しています。

動作するソースは[こちら](https://github.com/kyamamoto03/BlazorDraw)
大きくないのでするっと理解できると思います。

# 実装
絵を描画する領域はBECanvasをrazorに置きます。
```html
    <BECanvas Width="@CanvasWidth" Height="@CanvasHeight" @ref="_canvasReference"></BECanvas>
```

インスタンスを取得するため
```c#
    protected BECanvas _canvasReference = default!;
    int CanvasWidth { get; } = 400;
    int CanvasHeight { get; } = 400;
```

インスタンスからCanvas2DContextを取得します

```c#
   var context = await _canvasReference.CreateCanvas2DAsync();
```

Canvas2DContextに対して描画メソッドを呼びます
```c#
   await context.FillRectAsync(x1, y1, 10, 10);
```


# サンプルソース
サンプルでは四角を使った点の描画と線の描画を行っています

```html
<div class="drawArea" @onmousedown="MouseDown" @onmouseup="MouseUp" @onmousemove="MouseMove" style="@($"width: {CanvasWidth}px;height:{CanvasHeight}px")">
    <BECanvas Width="@CanvasWidth" Height="@CanvasHeight" @ref="_canvasReference"></BECanvas>
</div>
```

MouseのDown,Move,Upのイベントを取得し描画を行っています。

# 参考ページ
図形の書き方が乗っています(https://super-string37.com/entry/2023/01/02/130012)
QoSルーティング

# ルーターの容量を見てルーティングを決める
>`リソースの予約はパケットが通過するルート上の全てのルーターで行われなければならない`。経路上でリソースが予約されていない`ルーターが一つでも存在する場合には、そのルーターで輻輳が起こり、補償したQoSを実現できなくなる可能性がある`。多くのルーティング・アルゴリズムは送信元とあて先の間で最良の経路を一つだけ見つけ、全てのトラフィックをその経路を通して転送する。選択することによって十分な容量が残されていない場合は、フローの確率が拒否されることもあるが、`別の経路を選択することによって十分な容量を確保`し、`新たなフローに対するQoSを保証できる`場合もある。これは`QoSルーティング`と呼ばれる

* QoSに応えられるようにルーティングを決めるのがQoSルーティング

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
GitHub Copilotを使ってみて

# GitHub Copilotを使ってみて

最近、Github Copilotをつかってプログラムの勉強をしてます。
対話式で、こういう動作をするプログラムを書いてもらってそれを読んで理解するという手順で勉強してます。

とりあえず動くコードをAIが記述してくれるので、それを読んで仕組みを理解して進めていくのはとなりに先生がいるようで心強くもありますね。

何か気になったり備忘録として取っておきたくなったらここに書き込んでいこうと思う。
【AmazonCognito】ユーザプールにアクセスユーザを追加したい

![AWS-Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/edef3a5e-9104-473e-c89c-f61540b6fa16.png)



## 本記事で実現できること
ユーザプールにアクセスユーザを追加する

## 前提
- AWSマネコンはログイン済み
- 2024.11.18 時点でのコンソールのUIになります

## 簡単な解説
全部で6フェーズ

①ホーム画面で、画面上部検索欄に[**Amazon Cognito**]と入力。
　出てくるサービスの中から[**Amazon Cognito**]をクリック




②対象のユーザプールをクリックする。


③[**ユーザー**]タブが選択されていることを確認し、[**ユーザーを作成**]をクリックする。

![「ユーザー」タブが選択されていることを確認し、「ユーザーを作成」をクリックする。.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/2a55dc31-298c-3c44-640f-351c7e225e48.png)



④以下を行い、[**ユーザーを作成**]ボタンをクリックする。
-招待メッセージは[**招待を送信しない**]を選択。(Eメールを送るかどうかで任意で選択)
-[**Eメールアドレス**]欄に作成対象者のEメールアドレスを入力する。
-[**Eメールアドレスを検証済みとしてマークする**]にチェックを入れる。
-仮パスワードは[**パスワードの設定**]を選択する。
-パスワードに任意のパスワードを入力する。

![ユーザーを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/92eda1c9-efbd-8cc3-32b0-078063854806.png)


⑤ユーザーが正常に登録されていることを確認する。

![ユーザーが正常に登録されていることを確認する。.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754524/308b5ca6-8dcd-0d2c-da89-08cd5defc2c2.png)



⑥申請者(追加したユーザ)へ初期パスワードを連絡する。


## まとめ
本稿が、ユーザプールにアクセスユーザを追加したい方の参考になれば嬉しいです。

ITエンジニア向け、AWS資格取得を目指す方向けに個人ブログで記事も投稿していますので、
合わせて読んでもらえると嬉しいです。
[ことなの学校(個人ブログ)](https://kotona-school.com)

更によりレベル感の高そうなAWS関連の発信はZennの方で行います。
こちらももしよければフォロー、ご確認いただけると嬉しいです。
[Zenn個人アカウント](https://zenn.dev/tomo_itbizblog)

Twitterでも役立つ情報を発信しますのでフォローしてもらえると嬉しいです 
→ [@tomo_ITBizBlog](https://twitter.com/tomo_ITBizBlog)
仕様書のないプロダクトに対するテストアプローチ

経緯や理由はともかく、現物（コード、ビルド成果物）しか存在しないプロダクトが商品ラインナップに並んでおり、いろいろありすぎて、とにかくテストをしよう、という状況になること、悲しいがある
ないものはないので、あるものでどう戦うかを考えるしかない

# 本題に入る前の愚痴と前提

「とにかくテストをしよう」という心は尊いが、心のままに行動を起こしては（本来は）いけない
（本当は）テストの前に、プロダクトが目指すべき品質目標の定義が必要だ
品質保証はテストしてはい終わり、ではない
「テスト」が品質保証活動にとってどういう役割なのか定義が（実際は）必要だ
この文書はそういった大前提を無視して、テストの役割もふわふわさせたまま「とりあえずテスト」に取り掛かるための準備について述べる

# テスト計画を立てるための材料を探す

テスト計画には最低限以下の項目が欲しい
- 品質目標
- テスト実施計画（日程）
- 実施するテストの内容

これらの項目は独立して策定できるものではない
品質目標を立てる前に、結局いつまでにどんなテストができそうなのかの目安はほしいし、品質目標がないとどんなテストをどこまでやればいいのかわからない。どんなテストをやればいいのかわからない状態で日程は決まらない。
これらに手を付ける前に、まずありったけの情報を収集・確認する
- 仕様書がなければ、当時の議事録やメモが残っていないか調べる
- gitでコードを管理していたら、遡れる限りのコミットログやレビューコメントを確認する
- 当時の関係者が残っていたらインタビューする
- ソースコードを読む

こんなことする余裕はないから、結局今まで通り、積み上げたパズルを更に積み重ねるような修正と、半ば神頼みのコードレビューと動作確認に落ち着いてしまうのかもしれない
ここで踏ん張れるかどうかが分岐点になる

集めた情報の読み込みや整理・分類についてはAIが広がっている現代であれば、実はどうとでもできる
しかし、どんな優秀なAIでもローカルな組織の中にさまざまな形態で潜んでいる情報をいい感じに収集することはできない
ここでは頭の良さやスキルセットよりも、図太さと上っ面の愛想の良さが効く
結局、一番面倒で泥臭くて労力が必要な部分は人力で解決するしかない

非常に大変だが、ここまで経験済という諸兄は少なくないはずだ
ソースコードこそが最も信頼のおける仕様なのだ

# ソースコードが正しいとは限らない

前項をひっくり返すが、ソースコードが正しいとは限らない
ソースコードの挙動とユーザーに説明していた仕様が異なっている、ソースコードのアウトプットが業界で定められている規格と異なっている、など、いわゆる不具合が大量に埋め込まれている場合、ソースコードへの信頼性は揺らぐ（１→０）

単純な不具合なら良いが、リリース当時は正しいが、経過により状況が変わったが適切にアップデートされず、結果的に不具合になってしまったり、過去に特別に行った対応がなぜか標準になってしまい、仕様の整合性が取れなくなってしまったり、不具合判定すら単純に下せなくなる場合もある

ソースコードを正とできない
情報も断片的にしか残っていない
正解が定義できないのにテスト設計などできるわけがない

# 権威に頼る

- 砂浜から砂粒をより分ける覚悟でいちから仕様を起こす
- プロダクトに関連する、外部のガイドライン・規格・規約・仕様・要件に頼る

この文書では、後者のアプローチを勧める

例えば、UIならばUI設計ガイドラインを参考にする
- Apple HIG https://developer.apple.com/design/human-interface-guidelines/
- Material Design https://m3.material.io/
- Fluent UI https://developer.microsoft.com/en-us/fluentui#/
- Carbon https://carbondesignsystem.com/

現在のソースコードからテスト対象のページを洗い出しつつ、ガイドラインを参考に、テスト観点のフレームワークを作成する（テンプレート的なものでも良い）
基本はガイドラインの内容を正として、プロダクトのユースケースや要求や実装から読み取れる元々の「やりたかったこと」とすり合わせを行う
そこまでやれば、品質目標の落としどころが見えてくる

やってみてそぐわなければ、直せばいい
そう、**直せる状態になるのだ**（０→１）

組織内でプロダクトのあるべき姿を見失っている場合、その組織内で新たに正解を定義しようとすることは困難だ
しかし、仮置きでも良いので「正解」を置くことで、その「正解」を評価することは難しくない

「＊＊がこう言ってるんだから、でたらめではないだろう」
ある程度信頼できる組織が定めているという「権威」は、混沌する状況において救いになる

# さいごに

ここで記載した内容は、途方にくれてしまった場合のひとつの道しるべになるかもしれない
こういうことに頭を抱えて唸っていると、テストエンジニアはテストすることだけが仕事ではないのだな、と痛感する
Sparkにおけるファイルエンコーディングの検知

SparkのデフォルトエンコーディングはUTF-8です。これ以外のエンコーディングのファイルをそのまま読み込むと文字化けします。

PySparkでCSVを読み込む際には、オプション`encoding`を指定します。

https://spark.apache.org/docs/3.5.1/sql-data-sources-csv.html

こちらでも、エンコーディングの指定に関する記事が書かれています。

https://qiita.com/manabian/items/8fca43858c6aac88f27a

自分でも試してみます。ボリュームにそれぞれのエンコーディングでファイルを保存します。

![Screenshot 2024-11-19 at 16.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9faac024-9d6f-0809-795e-251c971f7508.png)

```py
file_to_read = "/Volumes/users/takaaki_yayoi/encoding/utf8.csv"

# 検出された文字セットでファイルをSpark DataFrameに読み込む
df = spark.read.option("header", True).csv(file_to_read)

# DataFrameを表示
display(df)
```

UTF-8は問題なく読み込めます。

![Screenshot 2024-11-19 at 16.36.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/deaabd7f-5edb-bebe-1734-bbee99fbef28.png)

```py
file_to_read = "/Volumes/users/takaaki_yayoi/encoding/euc.csv"

df = spark.read.option("header", True).csv(file_to_read)

# DataFrameを表示
display(df)
```

EUCは文字化けします。

![Screenshot 2024-11-19 at 16.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/47ceacb6-66f0-63e7-4176-968edfbe3e97.png)

エンコーディング`EUC-JP`を指定します。

```py
file_to_read = "/Volumes/users/takaaki_yayoi/encoding/euc.csv"

df = spark.read.option("header", True).option("encoding", "EUC-JP").csv(file_to_read)

# DataFrameを表示
display(df)
```

文字化けが解消されました。

![Screenshot 2024-11-19 at 16.38.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ad7923d7-d6c8-5cd5-5414-d159f41b93d7.png)

毎回指定するのも大変なので、[chardet](https://pypi.org/project/chardet/)を使った検知の機構を組み込みます。

```py
import chardet

file_to_read = "/Volumes/users/takaaki_yayoi/encoding/euc.csv"

# 文字セットを検出
with open(file_to_read, "rb") as f:
    rawdata = f.read()
    result = chardet.detect(rawdata)
    charset = result['encoding']

# 検出された文字セットでファイルをSpark DataFrameに読み込む
df = spark.read.option("encoding", charset).option("header", True).csv(file_to_read)

# DataFrameを表示
display(df)
```

エンコーディングが検知され、それを用いてCSVファイルが読み込まれまるようになりました。

![Screenshot 2024-11-19 at 16.40.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/109726c6-175b-9bd9-3b46-ea3863b07c4e.png)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
この書類はOK？再提出？AIにチェックを頼んでみた！

## 書類の記入漏れを簡単に確認したい！ ##

こんにちは、やまな。です。
これまでさまざまなツールを駆使して、仕事を楽にするために色々なものを作ってきました。

前回は出勤場所を確認できるアプリを作ったので、よかったら読んでみてください。

https://qiita.com/yama-na/items/03e4d12cc8e65b72a15e


さて、今回は提出された書類に不備がないか確認するために、AIを使ってみたいと思い挑戦しました。

現在、入社や退職、契約更新に必要な書類は、すべて本人が記入したものを人の目で確認をし、不備がないことを念入りに確認しています。
しかし、人の目だけでは限界もあり、さらに細かい項目が多い書類では、記入漏れを見逃してしまうこともあります。

そして何より、**チェックする時間を短縮させたい！**

そこで、最近覚えたＡＩの力を借りて、どうにか作業を軽減できないかと考え、作成を決意しました。






## 使用したツール ##
[TeachableMachine](https://teachablemachine.withgoogle.com/)
[codepen](https://codepen.io/)
[ChatGPT](https://chatgpt.com/)

## 作ったもの ##

CodePen
![スクリーンショット (146).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888131/784e47f5-80e0-bdc0-ba68-80e3fcf0acb0.png)



![OK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888131/a64fa665-cc8e-feb7-dd71-0528600db84c.png)
![性別チェック漏れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888131/e8effee3-89a4-f543-0fc8-4759faebc46d.png)
![雇用保険証番号記入漏れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888131/f95fd781-bfde-99a8-9a2a-799959002eec.png)
![基礎年金番号記入漏れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888131/69cae833-b965-8da5-0b8c-188581e13fe3.png)



※ここで使用している書類はすべてサンプルです。





## 作成手順 ##

### 1\.TeachableMachineで機械学習！

まずは、AIに不備ありかなしか、また、どんな不備があるのかを覚えさせます。

TeachableMachineを開き、使ってみるをクリックします。
次に、今回は画像を使用するので、一番左の画像プロジェクトを選択し、標準のモデルをクリックします。



![スクリーンショット (148).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888131/a368aa30-5c52-2002-bd0b-bb9294450772.png)

ここで精度を高めるために注意すること！


:::note warn

・サンプルは最低でも100枚は用意する！
・色々な角度のサンプルが必要
・動かしすぎるとぶれて内容がうまく映らないので、
静止画も用意するといいかも


:::

トレーニングをしたら、プレビューでどのくらい正しく判断してくれるか試します。
それぞれの項目の隣のバーが動いて100％になれば成功です。

ここでもしうまくいかなくても大丈夫！
サンプルの画像が鮮明ではなく判断されていない可能性が高いので、
それぞれまたサンプルを追加していきます。
サンプルは多ければ多いほど良いので、追加しながらトレーニングを重ねてください。

完成したら、モデルを保存します。

![スクリーンショット (150).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888131/f4989943-824a-c344-a735-a61d3ec6adb5.png)

プレビューの横にある`モデルをエクスポートする`を押します。
`モデルをアップロード`をクリックすると、リンクが作成されます。


:::note info
今後これを編集する予定がある場合は、Googleドライブに保存することをお勧めします。

:::

実際に使ってみてもう少し追加したいことがあったり、精度を高めたいと思ったときに編集できるようになります。




### 2\.CodePenでWebアプリ化する！

次に、CodePenでアプリ化します。
私はまだまだ初心者なので、コードを自分で書くことができません。
そこで登場するのが、最近とても仲良しになった、**ChatGPT**です！
質問すればなんでも答えてくれて、どんなときにも力になってくれる味方です。

今回も簡単な質問をしてコードを書いてもらいました！

![スクリーンショット (153).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888131/36204bac-89d3-7da1-ea4a-49a2b6903bae.png)

質問の内容に迷ったので、保存したモデルのURLをそのまま貼り付けて質問したら、しっかり答えてくれました。

しかし、やっぱり一度で上手くいくことはほとんどないので、調整が必要です。
今回私が行ったのは、Webカメラを使用するというコードが抜けていたため、その追加と、タイトルやURLの入力箇所の確認などです。
質問の方法によっても、返ってくる答えが違うので、上手にお話してみてください。






## 今後の課題 ##
今回、画像認識でAIに機械学習をしてもらい、書類の不備を見つけるために挑戦しました。
実際に使ってみると、どうしても100％不備がある・なしを判断することは難しかったです。

細かい部分、特に性別の欄のような〇の付け忘れは画像をうまく認識させないと不備なしだと判断されてしまうことがありました。
今回サンプルで用意した書類は、すべてPCで入力したものですが、実際は手書きの書類も読み取る可能性があるので、
そのあたりも精度を上げる必要がありそうです。

:::note warn
・細かい記入箇所の読み取り方法の強化
・手書きでも判別できるように精度を上げる
・100％の精度にするには？

:::

今後このような観点から、TeachableMachineでさらにパワーアップを目指すのか、他により適したものがあるのか調べながら実用化に向けて考えていこうと思います。
架空のファミレスを作って商品を無限に注文したい！

みなさまこんにちは！ アクピリンと申します！

私は趣味でプログラミングや3Dモデリングでいろいろな作品を作っている学生です！

今回は私が作った作品の一つである『Restaurant-ACT』の紹介をしていきたいと思います！

## 『目次』
・作品紹介
・製作時の環境
・まとめ
・振り返り
・最後に

## 『作品紹介』
まずは一度、完成品であるこちらで遊んでみてください！

https://akupilin.github.io/Restaurant/restaurant-act.html

いかがでしょうか？

自分で言うのも恥ずかしいですが、それっぽくないですか？

いやーそれっぽくないと困りますよ本当に

ファミレスっぽさの研究のために何度有名チェーン店のHPを見たことか......

そんなことは置いておいて

この『Restaurant-ACT』は「ZEN Study 動くWebページコンテスト2024 夏」への応募を目的として制作しました。

実は今まで私は、プログラミングで本格的に作品を作ったことがなかったんですよね。

自分のHPなどいろいろなモノを作ってたりはするんですけど、なかなか完成しなかったり、アイデア止まりの作品も多かったりします。

なので、今回の企画の参加にあたっては優秀賞を狙うだけでなく、自分が作りたいものをちゃんと作りきろうと考えました。

全部とは言いませんが、次の「製作時の環境」にてその作り方について少し書いていきたいと思います。


## 『製作時の環境』
・Restaurant-ACTはHTML、JavaScript、CSSのみで制作しています。
・作品の制作には、バージョン1.93.1にインストールした VS code を使用しています。
・作品の公開には、バージョン18.0.1にインストールした GitHub を使用しています。

![Restaurant-ACT-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908048/655b3d6a-15f4-f2f7-0f69-7d05551db63d.png)

この『Restaurant-ACT』はHTML、JavaScript、CSSの3を使って制作していますが、

主にHTMLしか使っておりません。

画像のやボタンの並びなどはすべてHTMLで設定しており、

Javascriptはラジオボタンの設定、CSSは色だけとかなりシンプルな内容になっています。

商品画像に関してはいらすとやさんのイラストを使用しています。

↓さらに詳しく知りたい方はこちらから↓
https://github.com/AkuPilin/Restaurant


## 『まとめ』
・本格的にサイトを作ること
・プログラミングコンテストに参加・応募すること
・Qiitaで記事を書くこと
・アドベントカレンダーへの参加

その全てが初めての経験だったのですが、全て非常に楽しかったですし、とても勉強になるいい経験になりました！

## 『振り返り』
・パソコンで見たときに、画面が真ん中にこない
・選択取り消しができない
・効果音が鳴らない

※ ここからは言い訳です。

上記以外にも、本当はラジオボタン以外のスイッチを使ったり、商品画像を押して選択できるようにしたり、効果音を鳴らしたりなどもう少し凝りたいところもあったんですけど、時間がなくてできませんでした...。

私自身が、いまだにJavaScriptを使いこなせていないため、作りたくても作ることができない部分も多かったです。

しかし、時間がないながらもかなり理想通りのサイトを制作できたため、個人的には非常に満足しています！

いつか改良版を作る予定ですので、完成するそのときまでしばしお待ちください！


## 『最後に』

いかがでしたでしょうか？

最後に、この記事を閲覧いただいたうえで、もう一度『Restaurant-ACT』で遊んでいただきたいです。

https://akupilin.github.io/Restaurant/restaurant-act.html

いかがですかね？

よいと思った部分や改善点、感想等があればSlackなどで教えてください！
　
　
また、この『Restaurant-ACT』のほとんどはZEN Studyで学んだ知識だけで制作しています。

初心者でも上級者でも、プログラミングを楽しく学べるZEN Studyをみんさんも使いましょう！

※ 宣伝や案件ではありません。本当にオススメです。

私はQiitaで記事を書くのが初めてなので、読みずらい部分も多かったと思います！

なので、文章や構成について何かアドバイス等ありましたらぜひ教えてください！

また、コードなどに関しても何かアドバイスがありましたら教えてください！

それでは、最後までご閲覧いただきありがとうございました！
重み付き公平キューイング

https://qiita.com/masatom86650860/items/f258cf480af978d11416

>上記のアルゴリズムの欠点はの一つは、`すべてのホストに同じ優先度が与えられている`ことである。
例えば、`ファイル・サーバーよりもビデオ・サーバーの方により大きい帯域が与えられることが望ましい`。これは、ビデオ・サーバーからのパケットを位置ラウンドあたり２バイト以上送り出せるようにすることで、容易に実装可能である。この改良アルゴリズムは`WFQ(Weighted Fair Queueing :重みつき公平キューイング）`と呼ばれている。

# 重み付き公平キューイングで利用するアルゴリズム
>WFQでは、パケットを送信完了時刻でソートしてキューに入れる必要であるが、N本のフローのソートには、`最良でもパケットごとにO(logN)`の操作を要する。`大量のフローを処理する高速ルーターでこの処理を実行することは難しい`。ShredherとVargheseはパケットごとに`O(1)`の操作で済む非常に効率的な`不足ラウンド・ロビン`と呼ばれる近似アルゴリズムを提案している。

* こういうところにもオーダが出てくるのか
* 一回で済ませるのは早くなるからいいな

# 感想
さまざまなアプリケーションのQoSに対する対策が優先度によって解決される
New Relic アップデート(2024年8~10月)

2024年8月から10月までのNew Relic のアップデートをまとめて紹介です！計画的なシステム停止時のアラート発生を抑止できるようになったり、アラートのSlack連携における通知方法が改善されています！

## [Alert] 計画的なシステム停止時の大量アラート発報を抑制
システムの停止を伴う計画メンテンスなどで意図的にアラートのインシデントを発生させない設定ができるようになりました。これにより、計画的なシステム停止により大量のインシデントが通知されるのを抑制できます。

![update202408-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/1f979ffa-218c-aeac-5f88-835c1096fb7f.png)

## [Alert] アラートのSlack連携における通知方法を改善
アラートのSlack連携における通知方法が改善され、インシデントの更新をスレッドだけでなく、チャンネル全体に投稿することができるようになり、インシデントの情報更新の可視性が向上しました。また、インシデントの更新時に最初の通知を変更するオプションが追加され、インシデント発生から解決までの状態変化の視認性が高くなりました。

![update202409-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/e2a16f80-b965-3339-db42-bbae99890c12.png)

## [Pathpoint] ビジネス意思決定に役立つオブザーバビリティの実現
ビジネス上の重要な指標をリアルタイムに可視化し、ビジネスプロセスと対応するシステムを関連付け、ビジネスの健全性とビジネス影響の原因となるシステムの問題をこれまで以上に迅速に特定できるようになりました。

![update202410-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/0a629630-8df0-fbd9-adbe-9576a6a3a601.png)

Pathpointについては以下記事で紹介していますので是非ご確認ください。

https://qiita.com/ktst79/items/f89d1df7744b288e943d

他のアップデートもまとめてブログでご確認ください。
↓↓↓↓↓↓

https://newrelic.com/jp/blog/nerdlog/new-relic-update-202408

https://newrelic.com/jp/blog/nerdlog/new-relic-update-202409

https://newrelic.com/jp/blog/nerdlog/new-relic-update-202410

- **2024年8月アップデート**
  - Alert: 計画的なシステム停止時の大量アラート発報を抑制
- **2024年9月アップデート**
  - Infrastructure: プロセス監視対象の除外設定が可能に
  - Infrastructure: Amazon CloudWatch Internet Monitorと統合可能に
- **2024年10月アップデート**
  - Mobile App: モバイルアプリでパフォーマンスやエラーの分析が簡単に
  - Data Management: メトリクスのカーディナリティを簡単に管理
Julia における引数の指定法

Juliaでは，関数の実引数（呼び出し時の引数）と仮引数（関数定義時の引数）にはいくつかの指定方法がある。以下に主な種類とその使い方を説明する。

## 1. 位置引数

位置によって値を渡す方法で，一番基本的な指定方法である。

```Julia
function greet(name, age)
    println("Hello, $name! You are $age years old.")
end

greet("Alice", 30)  # 実引数は位置で対応する：name = "Alice", age = 30
```

## 2. デフォルト引数

仮引数にデフォルト値を設定できる。実引数を渡さなかった場合，デフォルト値が使用される。

```Julia
function greet(name, age=20)
    println("Hello, $name! You are $age years old.")
end

greet("Bob")          # 実引数を1つだけ渡す：name = "Bob", age = 20（デフォルト値）
greet("Charlie", 25)  # 実引数を2つ渡す：name = "Charlie", age = 25
```

## 3. キーワード引数

名前で引数を渡す方法である。関数定義時に ; を使って定義する。

```Julia
function greet(; name="Anonymous", age=0)
    println("Hello, $name! You are $age years old.")
end

greet()                     # name = "Anonymous", age = 0（デフォルト値）
greet(name="Diana")         # name = "Diana", age = 0（部分的に指定）
greet(name="Eve", age=35)   # name = "Eve", age = 35（すべて指定）
```

キーワード引数を必須にしたい場合はデフォルト値を設定しない。

```Julia
function required_args(; name, age)
    println("Name: $name, Age: $age")
end

required_args(name="Frank", age=40)  # すべて必須
```

## 4. 可変長引数

仮引数に ... を付けることで，任意の個数の引数を受け取れる。

以下の例では numbers はタプルとして扱われる。
```Julia
function sum_all(numbers...)
    return sum(numbers)
end

println(sum_all(1, 2, 3))         # 出力：6
println(sum_all(10, 20, 30, 40))  # 出力：100
```

## 5. 混合引数

位置引数、デフォルト引数，キーワード引数を組み合わせて使うことができる。ただし，ルールがある。

-	位置引数 → デフォルト引数 → キーワード引数 の順に定義する
-	キーワード引数は関数呼び出し時に名前で指定する

```Julia
function greet(name, age=20; greeting="Hello")
    println("$greeting, $name! You are $age years old.")
end

greet("Grace")                        # 出力：Hello, Grace! You are 20 years old.
greet("Hank", 25)                     # 出力：Hello, Hank! You are 25 years old.
greet("Ivy", 30; greeting="Hi there") # 出力：Hi there, Ivy! You are 30 years old.
```

## 6. 無名関数（ラムダ式）の引数

簡易的に書ける無名関数でも引数を指定できる。

```Julia
f = x -> x^2  # 引数が1個のとき
println(f(4)) # 出力：16

g = (x, y) -> x + y  # 引数が2個のとき
println(g(2, 3))     # 出力：5
```

## まとめ

-	位置引数：シンプルでよく使う
-	デフォルト引数：一部を省略可能
-	キーワード引数：柔軟な指定が必要な場合に便利
-	可変長引数：引数の数が不定の場合に使う
-	無名関数：簡単な関数に使う
リーダーシップと組織開発：エンジニアリングマネージャーが考えるべきこと

### はじめに
エンジニアリングマネージャーやプロジェクトリーダーとして、チームをまとめて組織全体の成長に貢献することは、とても大切です。特に、技術力だけでなく、メンバーの力を引き出し、チーム全体で成果を出せるようにすることが求められます。本記事では、リーダーシップと組織開発の視点から、どうやって組織を強化し、成功するチームを作り上げるかについて、私の経験を基にお話しします。

### リーダーシップとは
リーダーシップは、単に指示を出すことではありません。むしろ、メンバーが自発的に行動し、自らの成長と成果に責任を持てるようサポートすることです。そのためには、次の3つの要素が大切です。

1. 信頼の構築
   リーダーとしてまず大切なのは、チームメンバーからの信頼を得ることです。信頼は一朝一夕には得られませんが、オープンで誠実なコミュニケーションを続け、メンバーの意見に耳を傾けることが重要です。特に、失敗を許容する文化を築くことで、メンバーは安心して挑戦し、学び、成長することができます。例えば、失敗を学びに変える「振り返りミーティング」を定期的に行うことで、失敗から学び、それを次に繋げる姿勢を全員で共有できます。

2. ビジョンの共有
   チームが一丸となるためには、共通の目標やビジョンを持つことが重要です。リーダーは、そのビジョンを具体的に伝え、日々の業務がビジョンにどう繋がっているかを示すことが必要です。例えば、プロジェクトのゴールだけでなく、それぞれのタスクが全体にどう影響するのか、具体例を使って伝えることが効果的です。ビジョンを共有することで、メンバーは自分の仕事の価値を理解し、より積極的にプロジェクトに取り組む原動力となります。

3. 個々の成長のサポート
   組織の成長は、メンバー一人ひとりの成長に支えられています。リーダーは、メンバーの強みを理解し、それを伸ばす機会を提供することが大切です。キャリアについて定期的に話し合い、個々の目標と組織の目標をリンクさせることで、チーム全体のモチベーションを高めることができます。また、メンバーが興味を持っている新しい技術やスキルの習得を支援し、学びの機会を作ることで、彼らの成長意欲を引き出すことが可能です。

### 組織開発の重要性
リーダーとしてメンバーをサポートすることと同時に、組織全体の成長にも力を入れる必要があります。特にエンジニアリング組織では、プロセス改善やコミュニケーションの活性化が非常に重要です。

- プロセスの改善
  チームが効果的に動くためには、無駄なプロセスを取り除き、効率的なワークフローを作ることが重要です。スクラムやカンバンといったアジャイル手法を取り入れることで、チームの進捗を可視化し、継続的にプロセスを改善できます。また、定期的に「プロセス改善ワークショップ」を行い、メンバー全員が改善のアイデアを出し合える場を作ることで、全員がプロセス改善に関与する環境を整えることが重要です。

- 心理的安全性の確保
  メンバーが自由にアイデアを出し、新しいことに挑戦できる環境を整えることも組織開発には欠かせません。心理的安全性が高い環境では、メンバーが互いにサポートし合い、失敗から学ぶ文化が育ちます。具体的には、「誰でも発言しやすい雰囲気を作ること」「提案を否定せずまず受け入れること」を心がけると良いでしょう。また、リーダー自身がオープンに自分の弱点を認める姿勢を見せることで、メンバーも自分の課題を共有しやすくなります。

- 文化の醸成
  チームの文化を形成することも組織開発の一部です。価値観や行動基準を共有することで、メンバーは自分の行動がチーム全体にどう影響するかを理解し、より良い意思決定ができるようになります。例えば、「チームハンドブック」として行動規範をまとめ、定期的に見直すことで、全員が一貫した行動を取れるようになります。また、成功事例を共有し、その背景にある行動や価値観を振り返ることで、文化の醸成に繋がります。

### まとめ
リーダーシップと組織開発は、エンジニアリングチームの成功において不可欠な要素です。信頼の構築、ビジョンの共有、メンバーの成長支援といったリーダーシップの要素と、プロセス改善や心理的安全性の確保などの組織開発の要素を組み合わせることで、強いチームを作ることができます。

あなたのチームが成長し、成果を出すために、この記事が少しでも参考になれば幸いです。まずは小さな一歩から、組織を次のレベルに引き上げるための挑戦を始めてみてください。
【Ruby】正規表現の入門

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
正規表現について勉強していますが、覚えることが多く、自分の中でも整理しようとこの記事を作成しました。

この記事では、正規表現の基本構文から実際の利用例までを分かりやすく解説します。正規表現初心者の方に役立つ内容を目指しました！

# 正規表現とは？
正規表現（Regular Expression）は、文字列のパターンを指定して検索や置換を行うための便利な記法です。
例えば以下のような用途に利用できます

* 特定形式のデータ検出（メールアドレス、電話番号など）
* パターンマッチングによるデータフィルタリング
* 文字列の置換

Rubyでは、正規表現リテラルはスラッシュ / で囲んで表現します。例えば
```Ruby
puts "hello" =~ /hello/  # => 0（文字列"hello"に一致）
```
# 正規表現の基本記号

### `.（任意の1文字）`
`.`は改行以外の任意の1文字に一致します。
```ruby
puts "cat" =~ /c.t/  # => 0（c と t の間に任意の文字がある）
puts "ct" =~ /c.t/   # => nil（cとtの間に改行以外の任意の文字がない）
```

### `*（直前の文字が0回以上繰り返し）`
`*` は直前の部分式が0回以上繰り返される部分に一致します。
なお、
```ruby
puts "aaa" =~ /a*/ # => 0（a が0回以上繰り返される）
puts "bbb" =~ /a*/ # => 0（a が0回でも良いのでマッチ）
```
### `+（直前の文字が1回以上繰り返し）`
`+` は直前の部分式が1回以上繰り返される部分に一致します。
```ruby
puts "aaa" =~ /a+/ # => 0（a が1回以上繰り返される）
puts "bbb" =~ /a+/ # => nil（a が1回以上ないのでマッチしない）
```

### `?（直前の文字が0回または1回）`
`?` は直前の部分式が0回または1回に一致します。
```ruby
puts "ab" =~ /ac?/  # => 0
puts "abc" =~ /ac?/ # => 0
puts "abcc" =~ /ac?/ # => 0
```

### `[]（文字クラス）`
`[]` を使うと、指定した文字のいずれか1つに一致します。
```ruby
puts "apple" =~ /[aeiou]/ # => 0（母音にマッチ）
puts "sky" =~ /[aeiou]/   # => nil（母音がない）
```
範囲指定も可能です。
```ruby
puts "5" =~ /[0-9]/ # => 0（数字にマッチ）
puts "A" =~ /[A-Z]/ # => 0（大文字にマッチ）
```
### `()（グループ化）`
`()` を使うと、部分パターンをグループ化して扱えます。
また、キャプチャ（抽出）として利用できます。
```
/(a+b)/ =~ "aaab"
puts $1  # => "aaab"（キャプチャされた部分）
```
ここで、`(a+b)`は足し算ではなく`a`を1回以上繰り返すという意味なので注意しましょう。

### `アンカー（^ と $）`
`^` は行頭を示し、`$` は行末および文末を示します。
`$`の挙動については、以下の記事で書いてあるのでそちらも併せてみていただくと理解度が深まると思います

https://qiita.com/scivola/items/132200d5dbe52ff33c9f

### エスケープ文字
特別な意味を持つ記号（例：`+, ., *`）を通常の文字として扱う場合、\ を使ってエスケープします。

```ruby
puts "1+1=2" =~ /\+/ # => 1（+ にマッチ）
puts "a.b" =~ /\./   # => 1（. にマッチ）
```


# 実際の利用例 
いくつか正規表現を見てきましたが、具体例を挙げてみようと思います。

日本の電話番号に一致する例です。
以下のコードは3-4-4の電話番号のみに対応したコードになりますので実装する際は注意ください。
```ruby
phone = "090-1234-5678"
puts phone =~ /\A\d{3}-\d{4}-\d{4}\z/ # => 0（マッチ）
```
* `\A`
文字列の先頭を示します。この場合のちに数字を表す`\d`が来るので、先頭は数字である必要があります。
* `\d{3}`
数字（\d）が3文字続く部分に一致します。これは電話番号の市外局番（例: 090）に対応します。
* `-`
ハイフンそのものに一致します。
`\d{4}`
数字が4文字続く部分に一致します。これは電話番号の中央部分（例: 1234）に対応します。
* `\d{4}`（最後の部分）
数字が4文字続く部分に一致します。これは電話番号の末尾部分（例: 5678）に対応します。
* `\z`
文字列の末尾を示します。
つまり文字列の最後が数字が4文字になるという意味になります。

# まとめ
いくつか上記で正規表現を紹介しました。
正規表現は最初は慣れない(わたしも現在進行形で勉強中)ので覚えるというよりパターンに慣れたほうが早く使いこなせそうです。
ruby以外でも正規表現は使うようなので、しっかりマスターしていきたいと思います。
今回のまとめの記事が正規表現初心者の方の参考になっていただければ幸いです。
公平キューイング

# FIFOは高いQoSを提供できない
>複数のフローを競合する環境で、一つのフローが簡単に他のフローに影響を与えてしまう。例えば、一つ目のフローが大きなバースト・パケットを送信した場合、そのパケットは`ルーターのキューの大部分を埋める`ことになる。この時到着順でパケットを処理するアルゴリズムでは、`大量のパケットを送信する送信者がルータのリソースを独り占め`することになり、`他のフローのQoSを低下`させてしまう。さらに、`他のフローのパケットはバースト・パケットの後ろで待たされる`ことになるため、通信の遅延が大きくなる可能性がある。

# フローを分離して公平に出力するアルゴリズム
>多くのパケット・スケジューリング・アルゴリズムは、`フローを分離`して扱い、`フロー間の干渉を発生させない`ことを目標に考案されている。初期のスケジューリング・アルゴリズムの一つにNagleによって考案された公平キューイングアルゴリズムがある。
...
リンクがアイドル状態になった時に、ルーターは、ラウンド・ロビン方式で`キューを走査し、キューの先頭のパケットを取り出して送信`する。この方法では、競合状態にあるn個のホストのパケットが`nパケットごとに一回ずつ送信権を得る`ことになる。これは、`すべてのフローが同じ転送レートでパケットを送信できる`という意味で公平である。

* フローごとに分け、偏ったリソースを独占を防ぐことでQoSが落ちないようにしている

# バイト単位のラウンドロビンで性能向上
>小さなパケットを使うホストよりも大きなパケットを使うホストにより大きい待機を与えてしまうという結果がある。パケット単位のラウンド・ロビン方式の代わりにバイト単位のラウンド・ロビン方式を使うことで性能が向上することがDemers他のシミュレーションによって示されている。
....
公平キューイングはバイト単位のラウンドロビン式を近似したアルゴリズムに過ぎないが、その性能は理想的な方式とほぼ同等である。

* パケットごとよりももっと小さくしてバイトごとにすることで大きい帯域を与えないようになる

# 感想
公平キューイングアルゴリズムを行うことでルーターのリソースの独占を防止するため均等にパケットをバイトごとにして送信する

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
【AWS】AWS CLI編　１

## 目次
・AWS CLIの設定ファイル
・MFA認証設定
・aws s3コマンド

## 前提
　今回の投稿では、AWS CLIのインストールや必要なIAMロールの設定について省略しています。

## AWS CLIの設定ファイル
ローカルPC内の/Users/ユーザ/.aws (隠しディレクトリ)の配下にあるconfigとcredentialsファイルのこと。

・config内：設定ファイルの形式(json or text)及びregionの設定

・credentials内：アクセスキー及びシークレットアクセスキーの設定


下記のコマンドにて手動にて設定を実施する。
```
aws configure  --profile ユーザ名
```

・access keyの設定
・secret access keyの設定
・設定ファイル形式（json or text）
・regionの設定(ap-northeast-1など)

*access keyとsecret access keyは、IAMユーザの操作により作成ができる。（今回は省略）

試しにVPC情報が表示されるかコマンドを打ってみる。
```
aws ec2 describe-vpcs --profile ユーザ名
```

現在作成されているVPCの情報が表示される。
（どこのregionのVPCなのかは、~/.aws/configファイル内のregionに従う。）

```
aws ec2 describe-vpcs --profile ユーザ名 --query Vpcs[].VpcId
```
現在作成されているVPCのVPCIDのみ表示される。
*Vpcs[]の[]内には0から始まる数字を入れることで、何番目のVPC情報を表示するか選択可能

## MFA認証設定
```
vi ~/.aws/config
```

該当するユーザの最下行に以下を入力
```
source_profile = ユーザ名
role_arn = IAMロール名
mfa_serial = 仮想MFAデバイス名
```

## aws s3コマンド
```
aws s3 mb s3://バケット名
```
S3バケットの作成
 
```
aws s3 cp ローカルファイル名 s3://バケット名
```
S3バケット内へローカルファイルのアップロード

```
aws s3 cp s3://バケット名/ファイル名 .
```
S3バケット内のファイルをローカル環境にダウンロード

```
aws s3 cp コピー元ディレクトリ　コピー先　--recursive
```
コピー元ディレクトリ内のファイルを全てコピー先へアップロード

```
aws s3 mv ファイル１　ファイル２
```
ファイル１をファイルにへ名称変更

```
aws s3 rm 削除するファイル
```
ファイルの削除

```
aws s3 rm バケット名 --recursive
```
バケット名配下のファイルを全削除

```
aws s3 rb バケット名
```
対象のバケット内が空の場合、バケット削除

## やってみた感想
　AWS CLI設定ファイルの設定やMFA認証の手順に関して、新たに学ぶことだったので、実際に手を動かすことで理解が深まりました。
 S3コマンドに関しては、Linuxコマンドとほとんど変わらないので、オンプレの知識だけでもすぐに理解できると思います。

AWS CLIについては、次の記事で他のコマンドについても投稿していきたいと思います。
30年記念誌の作成(その1)

![kinenshi_oyama.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d1d8c93d-d152-eda6-7498-2dd3d462f2c5.jpeg)

　あるグループで、30年記念誌を作成しようという話が持ち上がっています。
このグループは、小山市内の小中学校で、お話を語るという活動をしています。このグループは、1997年に発足し、10周年、20周年に記念誌を発行しています。
　内容は、どんな話を、どの学校のどの学年に、いつ、誰が語ったです。これを、エクセルを駆使して、作成してきました。大変だから、30周年は、やめようという意見も大きくなっています。しかし、10年の間に、IT の進歩はめざましいので、効率よく制作できる可能性があります。どのようにしたら良いかを書いてみます。

 ## リモートの活用
 　20周年の編集後記に、「約2年間の間に 30回近く集まりました。」とあります。これは、メッセージの交換に置き換えます。具体的には、メーリングリスト(Google Groups) を活用します。
  会のメンバーが直接合う機会は、お話会、勉強会と沢山あるので、リモートオンリーにはなりません。リモートとすることで、決められた時間、決められた場所に行くのが困難も、メンバーとして活躍ができます。

## Google Spread Sheet の活用
　共有する情報は、Google Spread Sheet に置きます。そうすることに、よりメンバーの全員が最新情報を確認することができます。
 　もちろん、個人の作業は、Excel なり、LibreOffice で行って構いません。アウトプットは、Google Spread Sheet にします。

## 電子書籍
　印刷物は作成しません。Epub 形式の電子書籍にします。途中段階では、Web 表示をつかいます。

## プロトタイピング
　いきなり、全ての学校のデータを集めるのでなく、最初は、数校のデータを集めて、プロとを作成します。

## 学校編集担当
　学校単位に、編集担当を一人おきます。担当は、その学校のお話会ごとのデータを、Google Spread Sheet にアップロードしあます。年に6回のお話会がある学校だと、10年分、60個のデータをアップロードします。各データで、コラムの順番が同じであることを確認します。

 ## プログラムの活用
　シートのマージ、タイトルによるソートはプログラムで行います。

 　1) プログラムは、各学校のデータをマージして、ひとつの学校データを作成します。
  　60個のデータがあれば、それをマージして、1個にします。
   1学年2クラスだと、お話会のデータは、20行程なので、マージして、1200 行程にまります。

   2) 学校データをマージして、ひとつのデータにします。
   　アウトプットは、データベースを想定しています。

　3) データベースで、タイトルでソート

　4) Web で表示
      データに問題がないかの確認を行います。

　5) Epub 　に変換
 　Epub 形式で出力します。

## 関連
[30年記念誌の作成 (その2)](https://qiita.com/ekzemplaro/items/4d5ff79705c1fb067497)
【Laravel11】number_format以外で金額を表現する方法

## 概要
今まで日本円の金額を表現する時に
```php
echo '¥'.number_format(5000);
//"¥5,000"
```
と書いてたんですが、Number::currency()というヘルパーでも表現できます


```php
echo Number::currency(5000, in: 'JPY');
//"¥5,000" 
```

`app/Providers/AppServiceProvider.php`のbootメソッドで
```php
//日本円に固定
Number::useCurrency('JPY');
```
こう書くとデフォルトの通貨を上書きできるので
引数の'JPY'が不要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/a85056ce-4645-3c5d-0a23-9c81c2bcdc84.png)



## 参考

https://readouble.com/laravel/10.x/ja/helpers.html#method-number-currency

https://readouble.com/laravel/11.x/ja/helpers.html#method-number-use-currency
TypeScript階層構造

# 階層構造

いまいち階層構造について理解していない部分があったのでAI先生の意見を踏まえメモです。

:::note info
import "../globals.css";のような記述は、モジュールやファイルを相対パスでインポートする際の方法です。この仕組みについて解説します。
:::

## 1. 階層構造の理解
JavaScriptやTypeScriptでのファイルインポート時、ファイルの階層を指定する方法は、現在のファイルがどのディレクトリに存在するかに基づきます。

### ../ の意味
../ は現在のディレクトリから 1つ上の階層 を示します。
例えば、以下のディレクトリ構造があるとします。
```
project/
├── app/
│   ├── layout.tsx
│   ├── page.tsx
├── components/
│   ├── Header.tsx
├── globals.css
```

ここで、app/layout.tsxからglobals.cssをインポートする場合、../globals.cssと記述します。

### ../	意味
..	現在のファイルから1つ上のディレクトリに移動する。
/	次にどのファイルやフォルダを指定するかを表す。
したがって、../globals.cssは「appディレクトリから1つ上の階層（project/）に戻り、globals.cssを参照する」という意味になります。

## 2. パスの種類
インポート時に使われるパスには以下の2種類があります。

### 相対パス
現在のファイルの場所に基づいて、目的のファイルを指定します。
. は現在のディレクトリ。
.. は1つ上のディレクトリ。
例
```
./file.js: 同じディレクトリ内のfile.jsをインポート。
```
```
../file.js: 1つ上の階層にあるfile.jsをインポート。
```
```
../../file.js: 2つ上の階層にあるfile.jsをインポート。
```
### 絶対パス
プロジェクトのルート（src/やapp/）からの相対位置を記述します。
Next.jsではjsconfig.jsonやtsconfig.jsonを設定して、絶対パスインポートを有効にできます。
設定方法
jsconfig.jsonまたはtsconfig.jsonに以下を追加します。
```
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/components/*": ["components/*"],
      "@/styles/*": ["styles/*"]
    }
  }
}
```
この設定により、以下のように簡潔な記述が可能になります。

例
```
相対パス：import Header from "../components/Header";
```
```
絶対パス：import Header from "@/components/Header";
```
## 3. よくある間違いと解決策
間違い例
パスが間違っている：
```
import "../css/globals.css"; // globals.cssが実際には`project/`に存在している。
```
解決策：
```
import "../globals.css"; // 正しいパスを指定する。
```
ファイル名や拡張子が違う：
```
import "../Globals.css"; // 実際にはファイル名が`globals.css`。
```
解決策：
```
import "../globals.css"; // ファイル名を正確に記述する。
```
絶対パスが無効になっている：
```
import "@/styles/globals.css"; // tsconfig.jsonで`baseUrl`が設定されていない場合。
```
解決策：
```
// tsconfig.jsonにbaseUrlとpathsを設定する。
```
```
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/styles/*": ["styles/*"]
    }
  }
}
```
## 4. 練習問題
次のディレクトリ構造をもとに、各ファイルへの正しいインポートパスを考えてみましょう。
```
project/
├── app/
│   ├── pages/
│   │   ├── index.tsx
│   │   ├── about.tsx
│   ├── layout.tsx
├── components/
│   ├── Header.tsx
│   ├── Footer.tsx
├── styles/
│   ├── globals.css
```

index.tsxからglobals.cssをインポート。
```
答え：../../styles/globals.css
```
layout.tsxからHeader.tsxをインポート。
```
答え：../components/Header
```
about.tsxからFooter.tsxをインポート。
```
答え：../../components/Footer
```

## 最後に
AI先生は何でも教えてくれるのですごい・・・