OmniAICreator/Qiita-1.07M huggingface dataset:
Goで学ぶコンテキストと同期プリミティブの活用方法

## はじめに 
Go言語では、並行処理を制御するためのツールとして、**コンテキスト（context）**と**同期プリミティブ**が提供されています。本記事では、これらの活用方法を基礎から解説し、実践的な例を紹介します。

## コンテキスト（context）とは？
**コンテキスト**（context）は、Goの標準ライブラリで提供される機能で、並行処理における「キャンセル」「タイムアウト」「値の伝播」を管理するために使用されます。

典型的なシナリオ：
- HTTPリクエストがキャンセルされたときに、関連するgoroutineを停止させる。
- 一定時間内に処理を完了させるタイムアウト制御。


### コンテキストの基本操作

```go
package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	// タイムアウト付きのコンテキストを作成
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
	defer cancel() // 必ずキャンセル関数を呼ぶ

	// goroutineで処理を実行
	go func(ctx context.Context) {
		for {
			select {
			case <-ctx.Done(): // タイムアウト時の処理
				fmt.Println("Context canceled:", ctx.Err())
				return
			default:
				fmt.Println("Working...")
				time.Sleep(500 * time.Millisecond)
			}
		}
	}(ctx)

	// メイン関数で待機
	time.Sleep(3 * time.Second)
	fmt.Println("Main function finished")
}
```

このコードでは、2秒後にタイムアウトが発生し、goroutineが終了します。`context.WithTimeout`を利用することで、簡単にタイムアウト制御が可能です。

### コンテキストのキャンセル操作
手動でキャンセルを実行する場合には、`context.WithCancel`を使用します。

```go
package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	// キャンセル可能なコンテキストを作成
	ctx, cancel := context.WithCancel(context.Background())

	// goroutineを起動
	go func(ctx context.Context) {
		for {
			select {
			case <-ctx.Done():
				fmt.Println("Canceled")
				return
			default:
				fmt.Println("Running...")
				time.Sleep(500 * time.Millisecond)
			}
		}
	}(ctx)

	// 2秒後にキャンセル
	time.Sleep(2 * time.Second)
	cancel()
	time.Sleep(1 * time.Second)
}
```

## 同期プリミティブとは？
Goの**同期プリミティブ**は、複数のgoroutine間でデータを安全に共有するために使用されます。主な同期プリミティブには以下があります：
- `sync.Mutex`（ミューテックス）
- `sync.WaitGroup`（ウェイトグループ）
- `sync.Once`（一度だけ実行）
- `sync.Cond`（条件変数）

---

### Mutex（ミューテックス）の使い方
`sync.Mutex`は、共有データへの同時アクセスを防ぐために使用します。

```go
package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var mu sync.Mutex
	counter := 0

	increment := func() {
		mu.Lock() // ロック
		defer mu.Unlock() // 処理終了後にアンロック
		counter++
		fmt.Println("Counter:", counter)
	}

	// 複数のgoroutineで実行
	for i := 0; i < 5; i++ {
		go increment()
	}

	time.Sleep(1 * time.Second)
}
```

この例では、`mu.Lock`と`mu.Unlock`で保護することで、`counter`に安全にアクセスできます。


### WaitGroup（ウェイトグループ）の使い方
`sync.WaitGroup`は、複数のgoroutineが終了するのを待機するために使用されます。

```go
package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup

	worker := func(id int) {
		defer wg.Done() // 作業終了を通知
		fmt.Printf("Worker %d starting\n", id)
		time.Sleep(time.Second) // 処理に1秒
		fmt.Printf("Worker %d done\n", id)
	}

	// 3つのgoroutineを起動
	for i := 1; i <= 3; i++ {
		wg.Add(1) // goroutineを追加
		go worker(i)
	}

	wg.Wait() // すべてのgoroutineが終了するのを待つ
	fmt.Println("All workers finished")
}
```

### Once（一度だけ実行）の使い方
`sync.Once`を使うと、処理を一度だけ実行することを保証できます。

```go
package main

import (
	"fmt"
	"sync"
)

func main() {
	var once sync.Once

	init := func() {
		fmt.Println("Initialization")
	}

	for i := 0; i < 3; i++ {
		go func() {
			once.Do(init) // 一度だけ実行
		}()
	}

	fmt.Scanln() // 終了を防ぐ
}
```

## まとめ
Go言語の**コンテキスト（context）**と**同期プリミティブ**を活用することで、複雑な並行処理をシンプルに実現できます。

- コンテキストはタイムアウトやキャンセル処理に便利。
- 同期プリミティブはデータの安全な共有やgoroutineの調整に役立つ。
OpenModelicaによるアナログフィルタ（RCローパス）

# OpenModelicaを使ってみよう
**ArduinoやRaspberryPiを用いた電子工作をする時，信号の高周波振動を低減するために，ブレッドボードなどを使って抵抗ＲとコンデンサＣを利用したローパスフィルタ（アナログ回路）を検討することが多いと思います．**

**そんな時，適切な抵抗値・コンデンサ値を決めるために，無償のシミュレータOpenModelicaを使って，任意のRCローパスフィルタの挙動を確認する簡単な例を示します．**

# OMEditを用いたRC回路モデル
**▢　Electricalから，Alanlog/Basic内に抵抗やコンデンサブロックを使用**
**▢　Sources内のパルス電圧ブロックを使用**

![Electricブロック.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/5a326306-0803-40b0-03e9-54eb34a94588.jpeg)

**注意事項として，プロットしたい電圧にセンサブロックを配置するのを忘れないこと．**

![RCフィルタモデル.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/947b4218-43e8-1a4c-704f-602e7970a9d5.jpeg)

# RCフィルタによる出力電圧の挙動を確認
**青色：パルス入力電圧**
**赤色：RCフィルタ後の出力電圧**

![RCフィルタ電圧.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/d093db42-fa97-824c-60be-da719e889f36.jpeg)

```RC_filter.mo
model RC_filter
  Modelica.Electrical.Analog.Basic.Ground ground annotation(
    Placement(visible = true, transformation(origin = {0, -40}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Analog.Basic.Capacitor capacitor(C = 10e-6)  annotation(
    Placement(visible = true, transformation(origin = {0, 6}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
  Modelica.Electrical.Analog.Basic.Resistor resistor(R = 10000)  annotation(
    Placement(visible = true, transformation(origin = {-28, 42}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Electrical.Analog.Sources.PulseVoltage pulseVoltage(V = 5, period = 2, width = 50)  annotation(
    Placement(visible = true, transformation(origin = {-62, 2}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
  Modelica.Electrical.Analog.Sensors.VoltageSensor voltageSensor annotation(
    Placement(visible = true, transformation(origin = {34, 32}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
equation
  connect(pulseVoltage.p, resistor.p) annotation(
    Line(points = {{-62, 12}, {-62, 42}, {-38, 42}}, color = {0, 0, 255}));
  connect(resistor.n, capacitor.p) annotation(
    Line(points = {{-18, 42}, {0, 42}, {0, 16}}, color = {0, 0, 255}));
  connect(pulseVoltage.n, ground.p) annotation(
    Line(points = {{-62, -8}, {-62, -24}, {0, -24}, {0, -30}}, color = {0, 0, 255}));
  connect(capacitor.n, ground.p) annotation(
    Line(points = {{0, -4}, {0, -30}}, color = {0, 0, 255}));
  connect(voltageSensor.p, resistor.n) annotation(
    Line(points = {{34, 42}, {-18, 42}, {-18, 42}, {-18, 42}}, color = {0, 0, 255}));
  connect(voltageSensor.n, ground.p) annotation(
    Line(points = {{34, 22}, {34, -24}, {0, -24}, {0, -30}}, color = {0, 0, 255}));

annotation(
    uses(Modelica(version = "3.2.3")));
end RC_filter;
```
［ServiceNow］EDIとは

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。
# EDI（Electronic Data Interchange）
- EDI（電子データ交換） とは、企業間での商取引データや業務情報を、標準化された電子フォーマットで交換する仕組みを指す
- 紙の書類を使用せず、デジタルデータとして取引情報を直接やり取りすることで、業務の効率化や正確性を向上させる

# 特徴
- 自動化
    - 手作業を減らし、システム間でデータを自動的にやり取りする
- 標準化
    - 取引情報のフォーマットが国際標準（例: UN/EDIFACT、ANSI X12）や業界標準に従う
        - UN/EDIFACT（United Nations/Electronic Data Interchange for Administration, Commerce and Transport）
            - 国連が定めたEDIの国際標準フォーマット
            - 請求書、注文書、出荷通知などの取引情報を標準化された形式で交換
        - ANSI（American National Standards Institute） X12
            - アメリカのANSIが定めたEDIの国内標準フォーマット
            - 医療、製造、小売、物流などの分野で注文書や請求書データをやり取り
- リアルタイム性
    - データが即時に交換され、迅速な対応が可能

# EDIの仕組み
EDIは、企業間でデータを送受信する際に以下の手順で行わる
- データの生成
    - 発信企業のシステムが注文情報や請求書データを生成
- フォーマット変換
    - データをEDI標準フォーマット（例: EDIFACT、XML）に変換
- 通信プロトコルを利用して送信
    - VAN（Value Added Network）やAS2（Applicability Statement 2）などを利用して、安全にデータを送信
- 受信側でデータを復元
    - データを受信した企業は、自社システムで利用可能な形式に変換し業務に反映

# ServiceNowにおけるEDI
- ServiceNowを使って業務プロセスの自動化や外部システムとの統合を実現する際に、EDIの考え方や技術が活用される場面がある
- ServiceNowのEDIサポート
    - データ交換の標準化
        - ServiceNow IntegrationHub
            - 他システムとの連携を自動化するためのツール
            - EDIデータを標準フォーマット（XML、JSONなど）に変換して処理可能
        - REST API / SOAP API
            - ServiceNowのAPIを使用してEDIデータをやり取りできます
    - ワークフローの自動化
        - ServiceNowのワークフローエンジンを使用して、受信したEDIデータを解析・処理し、インシデントや変更要求などのプロセスをトリガーします
    - 外部システムとの統合
        - VAN（Value Added Network）との接続
            - VANを介してEDIデータを送受信し、ServiceNowのテーブルにマッピング可能
    - ERPやサプライチェーン管理システムと統合
        - SAPやOracleといったシステムと連携し、EDIを使ったデータ交換をサポート
【思考法・考え方】思考力の地図 論理とひらめきを使いこなせる頭のつくり方

【思考法・考え方】思考力の地図 論理とひらめきを使いこなせる頭のつくり方
<iframe width="560" height="315" src="https://www.youtube.com/embed/CMTeo8-3LOo?si=rQybq-iibkwI2BLH" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
［ServiceNow］sys_idとは

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# sys_id とは
- ServiceNowのデータを一意に識別するための一意の識別子（ユニークID）
- 各レコード（テーブル内の行）に自動的に割り当てられる文字列で、システム全体でユニークです

# 特徴
- 32文字の英数字で構成される（例: 46d44bc0dbf223002768c44b0b961949）
- テーブルを超えてユニークであり、ServiceNow全体で一意にレコードを特定可能
- テーブル内の各レコードを識別し、参照や操作に使用される

# 用途
- レコードの識別
    - 各レコードを一意に特定するために使用
    - 例: インシデント、変更要求、ユーザー情報など
- 参照フィールド
    - あるレコードが他のテーブルのレコードを参照する際に、sys_idを用いる
    - 例: インシデントの「担当者」がsys_userテーブルのレコードを参照
- APIやスクリプトでの使用
    - REST APIやスクリプト（Business Rules、Script Includesなど）で、特定のレコードを操作するために使用される

# まとめ
ServiceNowのsys_idは、各レコードを一意に特定するための識別子であり、システム全体のデータ管理や操作において重要な役割を果たす
AWS クラウドプラクティショナー（AWS CLF）合格方法

<h1>はじめに

今回はAWS クラウドプラクティショナー（AWS CLF）を1月19日に合格したので勉強方法と取ろうと思った経緯を書き込みます

# 資格取得を目指した理由・経緯

- AWS12冠を目指しているから  
- インフラの知識が乏しいから  
- 趣味


# 勉強方法・使ったリソース

1. **Udemy教材を活用**
    - テックキャンプでAWSに触れる機会はあったものの、十分に理解できていなかったため、講義動画を活用して基礎から学習しました。

    - 模擬試験を繰り返し解き、弱点を見つけ出して克服。すべての模擬試験で90％を超えるまで徹底的に取り組みました。


2. **スケジュール**
    - 平日は2時間、休日は5時間ほど勉強しました。
    - 試験1週間前は、毎日模擬問題を3回分解き、集中的に復習しました。





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980913/cdfdb9a6-ba60-fecd-64fa-379f79a7f10e.png)

https://www.udemy.com/course/aws-4260/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980913/e29a3738-32dc-72f0-4f43-ad13be5de3a3.png)


https://www.udemy.com/course/ok-aws-e/

# 試験対策のコツやポイント

- 似たような機能が多いので、それぞれの違いをしっかり理解することが重要。  
- 試験問題を何回も繰り返し解いて、内容を完全に覚えるまで復習する。



# 実際に試験を受けたときの感想

- 日本語の表現に違和感があり、問題文を英語表記に変換した方が理解しやすかった。  
- 試験中、まったく知らない機能が出題された（おそらくSAAの範囲と思われる）。  
- 試験時間に余裕があり、何回も見直しが可能だった（私は4回見直しを行いました）。
- 
# 資格取得後の感想や今後の目標

- 意外とインフラの知識は思うように深められなかった。  
- AWSの各機能についての説明が理解できるようになった。  
- 今後はSAA（ソリューションアーキテクトアソシエイト）のために、フレームワークをもう少し深く理解する必要があると感じた。  
- 読解力がまだ乏しいと感じたため、そこを強化したい。  
- 5月にSAAの試験を受験する予定なので、全力で頑張りたい！
OCI Cloud Free Tier をもぎ取れ その19

# 概要
OCI Cloud Free Tierを取得してみた。
ubuntuに wordpressをインストールした。
画像を投稿してみた。

# エラーが発生
画像のアップロード中にエラーが発生しました。

# 対処
```
$ sudo chown -R www-data /var/www/html

```

# 成果物

http://ohisama.f5.si/index.php/2025/01/28/test5/

以上。
依頼人『変化があればすぐに報告せよ』ChatGTP『かしこまりました』

こんにちは。私は某小売店のデリカ部門で働いています。お店で販売する惣菜を作って売るだけではなく、ネット注文を受けた商品も製造・販売しています。
今回はネット注文がテーマです。

# 今回作成したもの
データに変化があれば自動でメールで通知してくれるものを作りました。
![DX1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961319/42813125-f2bc-b179-2a4d-3eda90723232.png)
修正欄の下の枠に『売価　398円に変更』と入力すると・・・
![キャプチャ8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961319/da8d120e-4f16-f365-e37e-9ba296a68d43.png)

と通知がメールで来るというものを作りました。
# なぜこのようなものを作ったか
私の会社のネット販売の商品は、お客様の端末の画面に商品が表示され、お客様自身が買いたいものを選ぶ形式です。
実際に表示される商品の選定は月末くらいに翌月分に掲載する商品の案が本部から送られて、店はそれを基に実際に掲載するかしないかを決める形です。
毎日の仕事をしていると月に一回のことなので、つい確認を忘れてしまったり、緊急性が低い仕事だったりするため、後回しになりがちです。取り扱っているアイテムの数も多いので、小さな変化にはなかなか気づきにくかったりもするため、データに少しでも変化があれば通知してくれるものを作りました。
とはいえ、プログラミングのコードとか全然わからんので、ChatGPTに聞きながら進めました。
# 使用したツール
今回は **ChatGPT** と **Googleスプレッドシート** と **Google Apps Script（以下ＧＡＳ）** を使用しました。
# 作成手順
## １．ChatGPTにＧＡＳに入力するスクリプトを教えてもらう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961319/cf36bf4d-bf62-729a-5878-f4f888eb20f8.png)

このように質問したら、
![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961319/3d6cef88-fc45-ce83-8612-515893230d18.png)
というようなコードが返ってきました。
一瞬で返ってきたので便利ですね！

## ２．ＧＡＳにスクリプトを入力
先ほどのChatGPTの回答をＧＡＳに入力し、実行！
## ３．しかしエラー・・・

実行はしたものの、エラーが出てしまいました。
エラーを修正すべく、ChatGPTにエラーの直し方も聞きました。
## ４．エラー修正のためChatGPTに質問
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961319/2bf2bf69-829f-928c-f3e7-cd6822cd2ceb.png)
## ５．１～４を繰り返す
![IMG_2036.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961319/957205b8-9981-0dc0-b323-803b8d12247a.jpeg)

↑　エラーの質問や、その他操作の不明な点も聞きました。
何度か繰り返すことで、エラーを直し、少しずつ形にしていきます。
## ６．完成
![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961319/ab5b6552-788c-13dc-9179-873263bcb5d2.png)

試行錯誤を繰り返し、ようやく上手くいきました！！
# まとめ
今回、データに変化があればメールでお知らせしてくれるものを作りまして、データをチェックする時間が大きく減りました。以前はどこが変化したのか探していたため、時間を要していましたが、どこが変化したのかも教えてくれるため、ピンポイントで教えてくれて助かります。
時間を短縮したことで、商品を製造する時間や、何を売るのかを考える時間が増えたと感じています。
読んでいただきありがとうございました。
πの近似値の分数を計算する【C言語】

```pai.c
#include <stdio.h>
#include <stdlib.h>

int  main(int argc, char* argv[]) 
{
	const float pp = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679f;
	float p = pp ;
	long n=4 ;
	if(argc > 1 )
	{
		n=atol( argv[1] ) ;		
	}

	printf("TIMES=%ld\n",n);

	//----
	int  i;
	int seis[n];
	for(i=0; i<n ; i++)
	{
		seis [i] =(int)( p ); //あんま良くないけど
		p -= (float)seis[i] ;
		p = 1.0f / p ;	
//	printf("%d\n",seis[i]);
	}

	long long  bnc = 1.0f ;
	long long  bnb =(long)p ;
	long long  t ;
	printf("bnc=%f\n",p);
	for(i=n-1 ; i >=0 ; i--)
	{	t = bnc ;
		bnc = bnb ;
		bnb = t;
		bnc += seis[i] * bnb  ;
		p = 1.0f / p ;
	}

	printf("%ld / %ld -> %.10f \n",bnc , bnb , (float)(1.0F *bnc/bnb) );
	printf("gosa = %.10f\n",(float)(1.0f*bnc/bnb)-pp);

	return 0;
}
```

約分プログラムは後で計算する
Hugoで構築するブログに"おすすめの記事"機能を実装する

## はじめに
ブログを構築していると、特定の記事をピックアップしてユーザーに読んでほしい事よくありますよね。Hugoを使ってると静的なサイトのため中々実装が面倒くさいのですが、色々こねくり回したうえでブログを構築する際に「おすすめの記事」機能を実装する方法**を共有します。

今回の実装ではHugoの記事のFront Matterに設定したパラメータをテンプレートで活用し、表示を切り替える方法で実装していきます。**「favorite」というカスタムパラメータ**を利用して、“おすすめの記事”として表示したい記事を任意で設定できるようにします。

## 実装のポイント

- 記事のFront Matterに `favorite: true` を付与すると、その記事が“おすすめの記事”扱いになるようにする。再利用可能な`partials`を作成する
- もし「favorite指定の記事が3つ未満」だった場合、不足分を通常の記事の中から選んで補う。
- セクション（ディレクトリに一覧で表示しているページ）か、それ以外のページ(indexページ)かで取り出す記事の範囲を変える。
- セクションページの場合は、同じディレクトリ配下の記事を対象にする。  
- それ以外のページ（個別記事など）では、サイト全体の“おすすめ記事”を対象にする。  

## 実装（コード全文）
以下実装です。今回は`partials`に入れて、再利用して利用するためそのためのロジックが面倒臭いです。セクション一覧ページ（`.Kind "section"`）と、それ以外のページを判定し、同じディレクトリ配下の記事 or グローバルの“おすすめの記事”を表示しています。

```html
{{ $isListPage := eq .Kind "section" }}
{{ if $isListPage }}
  <!-- list.html の処理（同じディレクトリ配下のみ）-->
  {{ with .File }}
    {{ $currentDir := .Dir }}
    {{ $favPages := first 3 (where (where $.Site.RegularPages "File.Dir" $currentDir) "Params.favorite" true) }}
    {{ $favCount := len $favPages }}
    {{ if lt $favCount 3 }}
      {{ $remain := sub 3 $favCount }}
      {{ $otherPages := first $remain (where (where $.Site.RegularPages "File.Dir" $currentDir) "Params.favorite" "!=" true) }}
      {{ $favPages = union $favPages $otherPages }}
    {{ end }}
    {{ if gt (len $favPages) 0 }}
      <div>
        <h2 class="mb-4 text-xl font-bold text-primary custom-break">
          おすすめの記事
        </h2>
        <ul class="space-y-2">
          {{ range $favPages }}
            <li>
              <a
                href="{{ .RelPermalink }}"
                class="text-secondary hover:underline">
                {{ .Title }}
              </a>
            </li>
          {{ end }}
        </ul>
      </div>
    {{ end }}
  {{ end }}
{{ else }}
  <!-- グローバルのお気に入り記事を取得 -->
  {{ $favPages := first 3 (where $.Site.RegularPages "Params.favorite" true) }}
  {{ $favCount := len $favPages }}
  {{ if lt $favCount 3 }}
    {{ $remain := sub 3 $favCount }}
    {{ $otherPages := first $remain (where $.Site.RegularPages "Params.favorite" "!=" true) }}
    {{ $favPages = union $favPages $otherPages }}
  {{ end }}
  {{ if gt (len $favPages) 0 }}
    <div>
      <h2 class="mb-4 text-xl font-bold text-primary custom-break">おすすめの記事</h2>
      <ul class="space-y-2">
        {{ range $favPages }}
          <li>
            <a
              href="{{ .RelPermalink }}"
              class="text-secondary hover:underline">
              {{ .Title }}
            </a>
          </li>
        {{ end }}
      </ul>
    </div>
  {{ end }}
{{ end }}
```
このコードを、対応するテンプレート (例: layouts/partials/popular-articles.html など)に書いて、それを`{{ partial "sidebar/popular-articles.html" . }}`などで呼び出すことで人気の記事機能を実装しています。

### 実際に使うFront Matter例

```markdown
---
title: ブログのタイトル
date: 2025-01-24T00:25:00.000Z
favorite: true
---
## サイトの中身
(本文)
```

上記ができたら、記事ファイルの`Front Matter`で`favorite: true`としておくと、この記事が「おすすめ記事」としてリストアップされます。3つ以上の記事に favorite: true を指定すると、そのうち最新順や表示順序の異なる記事をどう並び替えるかは、この実装例では first 3 としているため、先頭から3つが自動的に選ばれます。

（並び順をカスタマイズしたい場合は、別途 sort や last などを組み合わせて調整してください。）
今日の天気予報を好きなキャラで私の Slack 宛に送りつける

材料さえあれば比較的簡単に自分好みのキャラで毎日天気予報を送り付けることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/b3958309-a022-aede-1bc6-4a6fcb592bca.png)


## 材料
- Slack
- Azure OpenAI
- Azure Logic Apps

## 詳細


### Slack

無料の範囲内で使っています。投稿用なので、Slack でなくとも Line Bot などでも良いです。

### Azure OpenAI
自分用のデプロイをひとつ用意しております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/ebe42db7-edf5-54c5-7bdb-6ecebeaeb1a0.png)

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/reference#chat-completions

`POST https://{endpoint}/openai/deployments/{deployment-id}/chat/completions?api-version=2024-10-21` 

ここでは以下を用いています。

`https://noyopenai.openai.azure.com/openai/deployments/noydeploy/chat/completions?api-version=2024-08-01-preview`


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/cf1fdd8a-c17e-d2db-15dc-9daa40453c6a.png)


### Azure Logic Apps


#### マネージド ID
先に、当該 Logic Apps のシステム割り当てマネージド ID を有効にしておきましょう。Azure ロールの割り当てには Cognitive Services OpenAI User を指定しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/092f21e0-4500-54d8-426c-bd50da589874.png)


#### トリガー

ワークフローを作成していきます。日次実行とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/294f0013-90c6-fc17-c18e-66bd7022248c.png)

#### 今日の予報を取得する

場所は東京。ほか特に何もしていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/05a1bcc5-429c-69c1-23d7-c10a1458647f.png)

#### HTTP リクエスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/947bf42e-ba82-21f4-2477-a9a6de7f5abe.png)

先ほど確認したエンドポイントへ POST を送ります。

本文は以下。

```json:JSON
{
  "messages": [
    {
      "content": "今日の天気は@{body('今日の予報を取得する')}です。これをふなっしーのようにおしえてください。ふなっしーは「大人になるってのは成長なっしー」などとすべての語尾に なっしー を付けてしゃべります",
      "role": "user"
    }
  ]
}
```

#### メッセージの投稿_(V2)

メッセージの投稿結果が以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/db304b6c-6bb2-916c-397b-697b3082973f.png)

そのため `body('HTTP')?['choices'][0]['message']?['content']` という形で内容を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/68d340c1-bf55-c4f4-e6e9-a292e7569ce1.png)

投稿できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/9b179408-690f-084e-04f9-15c391ec8e16.png)



## 完成

自分メモ用 Slack に今日の天気を雨ニモマケズ風に毎日配信させています。サウイフモノニワタシハナリタイ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/329669d1-a492-289c-31c2-62df080688fa.png)
個人的な備忘録：React Routerが分からなかったので、Reactとの違いを比較しながら記事としてアウトプットしてみた

## はじめに
React Routerは、Reactアプリケーションでルーティングを管理するためのライブラリです。

:::note warn
**React自体は単体でルーティング機能を持たないため、React Routerを使用してページ間の移動やURL管理を実現します。**
:::

今回の記事では、ReactとReact Routerの違いを整理しながら解説していきます。

## 書こうと思ったきっかけ
Reactを使ったアプリケーション開発を進める中で、ルーティングの仕組みが必要になりました。

:::note info
***しかし、ReactとReact Routerの違いを明確に理解できていなかったため、調べながら学んだ内容をまとめることにしました。***
:::

なお、本記事は個人的な備忘録としてまとめたものです。***その点をご理解いただければ幸いです。***

## Qiitaでスクラップしてみた

**タイトル：React Routerのルーティング実装**

> React単体にはルーティング機能はないので、いい感じにルーティングを作ってくれるものという認識で最初は大丈夫。

https://zenn.dev/takaya39/articles/4669c3fd1c7f04

**タイトル：2022年中にreact-router-domの理解を深めたい**

> Reactで作成したSPAに、UIとURLを紐づけるためのものです。

> http://localhost:3000/top にアクセス -> Topコンポーネントを返す
> http://localhost:3000/todo にアクセス -> Todoコンポーネントを返すといった事ができます。

https://qiita.com/TMDM/items/0939ff52ab5b459303d7

**タイトル：【図解解説/初心者OK】Next.js不要？進化したReact Routerで技術記事アプリを作るチュートリアル【TypeScript/TailwindCSS】**

> Reactでサーバーでの処理ができるとなると「React + React Router」と「React + Remix + React Router」で実現できることの差がなくなりました。

https://qiita.com/Sicut_study/items/7dc1b0cdcc1bee210f05

## 自分なりに体系的にまとめてみた

### React

- **概要**  
  React は、ユーザーインターフェース (UI) を構築するためのライブラリです。コンポーネントをベースにしており、再利用可能で効率的な UI 開発を可能にします。

- **特徴**  
  - 宣言的なコードスタイルで、UI の状態を管理しやすい。  
  - 状態（state）やプロパティ（props）を活用して、動的に UI を更新。  
  - シングルページアプリケーション（SPA）の基盤を提供。  
  - ルーティング機能は含まれていない（ルーティングは他のライブラリを使用する必要がある）。  

- **用途**  
  - コンポーネントを使って UI を構築し、動的なデータや状態を管理する。  

### React Router

- **概要**  
  React Router は、React アプリケーションにルーティング（ページの遷移や URL の管理）機能を追加するためのライブラリです。React を拡張して、シングルページアプリケーションでページ遷移のような動作を実現します。

- **特徴**  
  - 動的ルーティングをサポート。  
  - URL パラメーター、クエリ文字列、履歴（history）管理が可能。  
  - ネストされたルートやレイアウトの定義が簡単。  
  - 宣言的にルーティング設定を記述できる。  

- **用途**  
  - ページ遷移の管理（URL に応じたコンポーネントの切り替え）。  
  - SPA で異なるビューを実現する。  
  - ブラウザの「戻る」「進む」ボタンのサポート。  

### React と React Router の違い

| 項目                     | React                                | React Router                          |
|--------------------------|--------------------------------------|---------------------------------------|
| **役割**                 | ユーザーインターフェース (UI) の構築  | ルーティング機能の提供                 |
| **主な機能**             | コンポーネント、状態管理             | URL 管理、ページ遷移                  |
| **内蔵のルーティング機能**| なし                                 | あり                                  |
| **主な用途**             | ユーザーインターフェースの構築       | ページ遷移やビューの切り替え           |
| **宣言的な書き方**       | UI レイアウトとロジックの記述         | ルートとコンポーネントのマッピング     |


### React と React Router の使い分け

- **React のみを使う場合**  
  - 単一ページのシンプルなアプリケーションや、ルーティングが不要な場合に使用。  
  - 例: 単純なフォーム、動的なデータ表示を伴わない UI、モバイルアプリの一部のコンポーネント。

- **React + React Router を使う場合**  
  - 複数のページやビューを持つアプリケーション（例えば、ホームページ、詳細ページなど）が必要な場合に使用。  
  - React Router を使うことで、React アプリケーションに複雑なナビゲーション機能を簡単に追加できます。  
  - 例: Eコマースサイト、ブログ、ダッシュボード付きのウェブアプリ。

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

:::note info
**今回は基礎的な内容ではありますが、React と React Router の違いについて自分なりに整理し、言語化することで理解を深めることができました。**
:::

***これからも、このような基本的な内容を丁寧にまとめ、知識を定着させていきたいと思います。***
2025/1/28主にITとかセキュリティの記事

米国 NIST IR 8374 Rev.1（初期公開ドラフト）ランサムウェアのリスクマネジメント： サイバーセキュリティフレームワーク2.0コミュニティ (2025.01.13)(1/26)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/01/post-c033e3.html

ICMPとは？PingやTracerouteの裏側で動くプロトコルの仕組みを解説(1/26)
https://nikkeimatome.com/?p=51550

PHP Composer入門ガイド — Windows・Linuxでのインストールと基本操作について(1/26)
https://nikkeimatome.com/?p=51574

サーバではなくWindows 11で「Hyper-Vによる仮想化」ができる方法(1/26)
https://techtarget.itmedia.co.jp/tt/news/2501/26/news01.html

WhatsUp Gold2024年アップデート概要：カスタマイズ機能強化とセキュリティアップデート(1/26)
https://nikkeimatome.com/?p=51523

[レポート]AWSのCISOと各社リーダーの語るイノベーションのためのセキュリティと最新情報(1/26)
https://dev.classmethod.jp/articles/reinvent2024_sec203_report/

英国 AI機会行動計画 (2025.01.13)(1/26)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/01/post-ac2376.html

PHP-FPMとは？Nginxとバツグンの相性！高負荷のウェブサイトで威力を発揮するFastCGI実装(1/26)
https://nikkeimatome.com/?p=51554

海外間の通信は半年かけ監視　政府、能動的サイバー防御(1/26)
https://www.nikkei.com/article/DGXZQOUA2615O0W5A120C2000000/

能動的サイバー法案の全容判明、情報漏えいなら新たな独立機関「監理委」が懲戒要求(1/26)
https://www.yomiuri.co.jp/politics/20250126-OYT1T50000/

カスペルスキー: 企業の88%がネットワークハッキングに直面しています(1/26)
https://voi.id/ja/teknologi/454929

初心者向けJWT講座：JSON Web Tokenを使った認証の仕組み(1/25)
https://zenn.dev/collabostyle/articles/b08c7f29a2e94c

サイバー企業はサイバー世界詐欺を避けるためのヒントを共有する(1/26)
https://voi.id/ja/teknologi/454940

テレワークをやめて「週5出社」を強いる“リスク”の怖さ(1/26)
https://news.yahoo.co.jp/articles/305600ad7a929b6a18f1ccc97991d2c637de5672

Web3が経済学では解けない難題に挑む(1/26)
https://forbesjapan.com/articles/detail/76576

米国務省による台湾への軍事支援停止決定、中国による台湾侵攻を助長するリスク：習近平国家主席に急接近するトランプ大統領の外交姿勢にも大きな懸念(1/26)
https://nikkeimatome.com/?p=51562
⚙ Vercelでサンプルアプリ作ってGoogle認証入れようとしたらハマったのでメモ

# 概要
1. Googleログイン設定する際にOAuth2.0 クライアントの作成を行うと思うが、新しい管理画面ですよーという通知を受けてGoogle API Platform経由に切り替えた
2. 承認済みドメインの設定で通らずエラーメッセージも出なくてハマりかけた

# 結論
- **古いとされる「APIとサービス」のみ承認済みドメインを簡単に登録できる仕様**のため、そっちでやり直した方が簡単
    - ただし新しい管理画面（=Google Auth Platform）に切り替えて一週間以内に設定する必要あり
    - あとローカルキャッシュか何かで「APIとサービス」の設定画面が「Auth Platform」の設定画面にさし変わる現象もあったので、設定項目が変わらない場合はブラウザキャッシュをクリアした方がいいかも
- API Platform経由でやる場合はGoogle Serch Consoleからドメインの承認手順を踏むよう案内されるが、Vercelのデフォルトドメイン（`.vercel.app`）だとVercel側の仕様上ドメインでの承認は不可能で、[URLプレフィックスプロパティなら多分承認できるはず](https://gedem-blog.vercel.app/blog/vercel-nextjs-google-search-console/)（自分は未検証）

# 説明
Next.jsの練習をするかということでVercelにてサンプルアプリ（認証アリのCRUDアプリ）を作ろうとしました。Vercelで`●●●.vercel.app`を貰い、無事デプロイ成功。
そこから、認証が必要ということで今回はFirebase Authenticationを噛まさず、Googleログインを直で導入しようと考え、OAuth2.0クライアントの設定をやろうとしたら、上部に新しい管理画面に移行してくださいという案内が出て切り替えたところ、ドハマりしました。

APIとサービスとGoogle Auth Platfromで設定項目はほとんど同じなのですが、承認済みドメイン絡みのところだけUIが違っていて、別途承認を受けた後に設定しないといけないようになっています。
大昔Google Analytics仕込んだ時にやったなぁと思い出しつつ、Vercelの管理画面からドメイン設定画面見たら……**DNSレコード弄れそうな項目が、ない**😨

そこで調べ倒して上記結論に至りました。よく見たらAPIとサービスの設定画面には「下で追加するURIのドメインは～」って書いてあって、この機能の有無がポイントなんですよね。

![スクリーンショット 2025-01-28 034812.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307259/edf886b4-8769-2d88-ee2f-f179e6c8edd7.png)
フルスタックデータサイエンティストになるぞ

chatGPTとキャッチボールして、今のところ最終形態のデータサイエンティストになるための計画ができた。あとは遂行するだけ()

計画を通して身につくスキルと開くキャリアパスを教えてもらった↓

「この計画を遂行することで、以下のスキルを習得し、幅広いキャリアオプションを開くことが期待されます。

計画で身につくスキル

計画には基礎から応用までのスキル習得が含まれており、以下の主要なスキルセットが形成されます。

1. 統計と数学の基礎
	•	統計スキル: 確率、推定、検定、回帰分析など、データ分析に必要な統計手法を深く理解。
	•	数学スキル: 線形代数（行列計算、固有値など）、微積分（勾配、最適化）をデータサイエンスの応用に活用。

2. プログラミングスキル
	•	Python: データ処理、機械学習、深層学習、可視化の実装スキル。
	•	SQL: データベース操作、データクエリの基礎から応用。

3. データ分析と機械学習
	•	機械学習スキル: scikit-learnを使用した基礎的なアルゴリズム（線形回帰、決定木、SVMなど）の理解。
	•	深層学習スキル: TensorFlow、PyTorchを使った画像認識や自然言語処理の実装。
	•	データ可視化: Pandas、Matplotlib、Seabornを活用したデータの可視化。

4. 応用スキル
	•	データパイプライン構築: Spark、Airflowなどを用いた大規模データ処理スキル。
	•	MLOps: モデルのデプロイ、監視、スケーリングの知識とスキル（Docker、Kubernetesなど）。
	•	クラウドスキル: AWS、Google Cloudを活用したスケーラブルなデータ基盤の構築。

5. プロジェクト経験
	•	Kaggleコンペで実践的なデータ分析能力を獲得。
	•	個人プロジェクトを通じて、データ分析・機械学習モデルの設計から実装までを経験。
	•	インターンシップでの実務経験（チーム開発やビジネス課題解決）。

6. 最新技術の応用
	•	自然言語処理（NLP）: Hugging Faceを使ったBERTやGPTモデルの応用。
	•	強化学習（RL）: OpenAI Gymを活用したシミュレーションや意思決定問題の実装。

計画遂行後に目指せる職種

計画を達成した場合、以下のような職種に応募する準備が整います。

1. 初級～中級データサイエンティスト
	•	業務内容: データの前処理、モデリング、予測分析、ビジネス課題の解決。
	•	求められるスキル: Python、機械学習、SQL、データ可視化。

2. 機械学習エンジニア
	•	業務内容: 機械学習モデルの設計・実装・デプロイ。
	•	求められるスキル: 深層学習フレームワーク（TensorFlow、PyTorch）、MLOpsスキル。

3. データエンジニア
	•	業務内容: データパイプラインの設計・運用、分散処理システムの構築。
	•	求められるスキル: Spark、Airflow、AWSなどのクラウド技術。

4. AIエンジニア
	•	業務内容: AIモデルの設計、実装、運用（例: NLPや画像認識のプロジェクト）。
	•	求められるスキル: 最新のAI技術（NLP、RL）、クラウド環境でのデプロイ。

5. データアナリスト
	•	業務内容: データの探索的分析（EDA）、可視化、経営層へのレポート作成。
	•	求められるスキル: Python、SQL、Tableauなどのツール。

6. フルスタックデータサイエンティスト
	•	業務内容: データの取得・処理からモデルのデプロイまでを一貫して担当。
	•	求められるスキル: データサイエンス全般、MLOps、ソフトウェアエンジニアリング。

7. プロダクトデータサイエンティスト
	•	業務内容: プロダクト改善のためのデータ分析やA/Bテストの設計。
	•	求められるスキル: データ分析、ビジネススキル。

キャリアに向けた補足アドバイス
	•	インターンや実務経験を重視
実際のプロジェクトやチーム開発経験が評価されやすいため、インターン期間を最大限活用してください。
	•	ポートフォリオの充実
Kaggleコンペや個人プロジェクトの成果をGitHubやウェブサイトで公開することで、採用担当者にスキルを証明できます。
	•	ネットワーキング
オンラインコミュニティ（Kaggle、GitHub、LinkedInなど）やハッカソンに参加し、キャリアを広げるきっかけを作ることも重要です。

この計画を遂行すれば、データサイエンス関連のキャリアを目指す上で十分な準備が整います。さらに具体的なサポートが必要であれば、いつでも相談してください！」

データサイエンスロールがAIに代わられませんように🙏
CursorのComposerというAIエージェントが凄すぎて9割ノーコードで音楽共有SNSが完成した話

# CursorのComposerというAIエージェントが凄すぎて9割ノーコードで音楽共有SNSアプリが完成した話

## 制作物紹介
好きな音楽を紹介したり、プレイリストを作成して共有することをメインにしたSNS「Harmony」を作成しました。

**実際のホーム画面**
![スクリーンショット 2025-01-28 12.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948675/2a0dcc10-7462-37bc-2508-7a15d74cc34e.png)


使用言語は**Python**、フレームワークは**Django**になります。  
SpotifyのAPIを使用しているので、実際に共有された音楽をその場で聴くことができます。  
プロフィールに好きなアーティストを設定できるのも特徴です。

**好きなアーティストの設定**
![スクリーンショット 2025-01-28 12.35.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948675/d6898eaa-4e9c-11a9-81f6-c8d07037fc6d.png)


今後、他のユーザーと共同でプレイリストを作成できる機能や、ルームを作成してリアルタイムで音楽について語り合える
機能など、満足感のある機能をどんどん追加していく予定です。

**プレイリストを作成して共有できます**
![スクリーンショット 2025-01-28 12.38.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948675/a88b996d-5a8c-afbf-6e34-0b0ac086ea42.png)


アプリはこちらからアクセスできます: [Harmony](https://harmony-sns-a8158d6a0a2f.herokuapp.com/)  


---

## AIの進化により、もはや9割ノーコードでもアプリが作成できてしまう

最近話題の**AIエージェント**、知っていますでしょうか？  
AIエージェントとはコードを生成するだけでなく、その反映や実行、エラー確認までもAIが自動で行ってくれる機能のことです。  

私は**Cursor**のProアカウントを利用しているため**Composer**をよく使用しますが、**Cline**などがかなり有名になってきているのではないかと思います。  
このAIエージェントがあれば、非エンジニアでもアプリ開発が出来てしまうのではないかと危惧してしまうほどの実力だと私は感じています。  

アプリ制作中に実際に私が行ったことはシンプルです。とにかく作成したい機能を細かく指示することを繰り返しました。  
つまり、「これを作りたい」「次はこれを作りたい」「ここエラー出てるから確認して」と繰り返すだけでアプリが完成したのです。  

実はこの記事を書いている最中にもAIエージェントに指示を送っていて、実行が完了する合間に記事を書いています。効率が凄まじいです、、  

実際の指示内容画像(コラボ申請の承諾、拒否機能についての指示)
![スクリーンショット 2025-01-28 3.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948675/04fd167d-80cb-e002-d382-ae19af5e3459.png)

これを書いているときは**コラボプレイリスト作成機能**をつくらせているのですが、100%自立して作成してくれているので、あまり確認しなくてもかなり正確に実装してくれています。（本当は確認すべきですが個人開発なので、、）

---
## まとめ
個人的には個人開発がかなり捗って、就活用のポートフォリオ作成が容易になって嬉しいところもありますが、実際に力がついているとは言えないので、しっかりと知識を蓄えて**AIに飲み込まれないエンジニア**にならないといけないなと強く感じています。  

やはり**インフラに強いエンジニア**はまだまだ呑まれなさそうなので、インフラ中心に勉強していくのもいいのかなと感じてきております。  

またAIエージェントを用いてアプリを作成した際に記事にしたいと思っておりますので、ぜひ本アプリの方1度使用してみて欲しいです。  

ありがとうございました。
Javaで「テキストフィールドに対してクリップボードを経由でコピーやペーストをプログラムから行う」の動作を確認してみた。

# 概要

Javaで「テキストフィールドに対してクリップボードを経由でコピーやペーストをプログラムから行う」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/tutorial/jtextfield/index13.html

# 実装

以下のファイルを作成しました。

```JSample13_1.java
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

class JSample13_1 extends JFrame implements ActionListener{
  JTextField text1;
  JTextField text2;

  public static void main(String args[]){
    JSample13_1 frame = new JSample13_1("MyTitle");
    frame.setVisible(true);
  }

  JSample13_1(String title){
    setTitle(title);
    setBounds(100, 100, 600, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    text1 = new JTextField("APPLE", 40);

    JButton button1_1 = new JButton("Copy");
    button1_1.addActionListener(this);
    button1_1.setActionCommand("Text1_Copy");
    JButton button1_2 = new JButton("Cut");
    button1_2.addActionListener(this);
    button1_2.setActionCommand("Text1_Cut");
    JButton button1_3 = new JButton("Paste");
    button1_3.addActionListener(this);
    button1_3.setActionCommand("Text1_Paste");

    JPanel button_panel_1 = new JPanel();
    button_panel_1.add(button1_1);
    button_panel_1.add(button1_2);
    button_panel_1.add(button1_3);

    text2 = new JTextField("orange", 40);

    JButton button2_1 = new JButton("Copy");
    button2_1.addActionListener(this);
    button2_1.setActionCommand("Text2_Copy");
    JButton button2_2 = new JButton("Cut");
    button2_2.addActionListener(this);
    button2_2.setActionCommand("Text2_Cut");
    JButton button2_3 = new JButton("Paste");
    button2_3.addActionListener(this);
    button2_3.setActionCommand("Text2_Paste");

    JPanel button_panel_2 = new JPanel();
    button_panel_2.add(button2_1);
    button_panel_2.add(button2_2);
    button_panel_2.add(button2_3);

    JPanel p = new JPanel();
    p.add(text1);
    p.add(button_panel_1);
    p.add(text2);
    p.add(button_panel_2);

    Container contentPane = getContentPane();
    contentPane.add(p, BorderLayout.CENTER);
  }

  public void actionPerformed(ActionEvent e){
    String cmd = e.getActionCommand();

    if (cmd.equals("Text1_Copy")){
      text1.copy();
    }else if (cmd.equals("Text1_Cut")){
      text1.cut();
    }else if (cmd.equals("Text1_Paste")){
      text1.paste();
    }else if (cmd.equals("Text2_Copy")){
      text2.copy();
    }else if (cmd.equals("Text2_Cut")){
      text2.cut();
    }else if (cmd.equals("Text2_Paste")){
      text2.paste();
    }
  }
}
```

以下のコマンドを実行しました。

```
$ javac JSample13_1.java 
$ java JSample13_1
```

実行結果は以下の通りでした。

![Screenshot from 2025-01-28 03-15-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/3eb1fd4b-dd8c-a6ed-b2ac-f699562aa6bb.png)

# まとめ

何かの役に立てばと。
Interface とは規格

# 背景
かつて私はプログラミングにおける Interface の概念の理解に苦戦していましたが、**Interface は規格**だと考えるようになってから理解が捗ったので、同様に苦悩している人に向けて記事を書きました。
この記事が Interface 理解の一助になれば幸いです。

# 説明
[「インターフェイス pc」で画像検索](https://www.google.com/search?udm=2&q=%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9+pc)すると様々な端子や挿し込み口（プラグ）が表示されますが、それがまさに Interface です。
クラス定義に Interface が列挙されている様子はドッキングステーションに似ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/4d4a879c-a462-686e-60a3-61450c807382.png)
![31464822_s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/a1d6ab99-ee13-fbcb-3b12-ed824b57ddff.png)

## 規格のメリット
例えば友人の家に置かれた謎の機械。そこに HDMI IN と書かれたプラグがあるとします。
謎の機械だとしてもHDMIプラグによって、あらゆるHDMIケーブルが使え、あらゆるHDMI出力端末の映像を受け取れると分かります。
またHDMIは映像の伝達用なので、入力側も出力側もデータを奪われるなどの心配は無用になります。[^1]
規格のおかげで**役割と互換性と信頼性を素早く把握できる**のです。

[^1]: 規格違反した悪質な機械もあるので注意が必要です
コンソールウィンドウのハンドル番号を見てみる

最近ヒマさえあればChatGPTとおしゃべりしてます、ズモモです。
この記事もそうなんだけど、こうやってChatGPTと話した内容をqiitaの記事としてメモするの結構良いかもしれないな。意識的にやっていきたい。

。。。。
本題に入ります。
C言語入門本でDXライブラリを使おうとしてでてきたHINSTANCEのHってなーあに？っていうところから、そもそもハンドルって何なのか、実際に動いているプロセスのハンドル番号を確認してみよう！という流れになりました。

というわけで、コンソールウィンドウのハンドル番号を取得して表示するプログラムを(ChatGPTが)作ったぞい！
```ConsoleHandleViewer.cpp
#include <windows.h>
#include <stdio.h>

int main() {
    HWND hwnd = GetConsoleWindow();  // コンソールウィンドウのハンドルを取得
    if (hwnd != NULL) {
        printf("Console Window Handle: %p\n", hwnd);
    }
    else {
        printf("Failed to get handle\n");
    }

    getchar();  // exe実行時画面がすぐに閉じないようにするため

    return 0;
}
```
- GetConsoleWindow() は、今動いてるプログラムのコンソールウィンドウのハンドルを取得してくれる
- ハンドルはポインタ型みたいに見えるけど、中身は単なる番号やID
- printfで値を出すと、「これがハンドルのIDね」ってのが表示される

```実行結果.
Console Window Handle: 00000000002609F4
```

ハンドル(上の実行例だと`00000000002609F4`)は8バイトの16進数(64bit環境)。
うーん、やっぱぱっと見ポインタっぽい？
ハンドル見れた～(だから何)！？ですでに満足してはいるけど、以下ChatGPT君の詳しい説明です。

Windowsのハンドルってどーいう形式？
----
>**俺**：そもそもWindowsのウィンドウハンドルって16進数の8バイトで管理されてるの？
>
>**ChatGPT君**：
>おお、そこに目をつけるのは鋭いな！じゃあ、ちょっと詳しく説明していくね。
>
>### Windowsのウィンドウハンドル (HWND) のサイズ
>Windowsのウィンドウハンドル（HWND）は、内部的には 「ポインタ」 として扱われているんだけど、実際の仕様としては ハンドル型 (HANDLE) という独自の型で管理されているんだ。これが16進数で表示されるのは、値がメモリ上のアドレスのような振る舞いをしているから。
>
>さて、「何バイトで管理されているか」 の話だけど、これは システムのアーキテクチャ によって決まるんだ。
>
>32ビットOS：ハンドルは 4バイト（32ビット）
>64ビットOS：ハンドルは 8バイト（64ビット）
>つまり、質問に対する答えは：
>
>**はい、64ビットOSではウィンドウハンドルは16進数の8バイトで管理されている。**
>### ハンドルの実体
>ただし、ハンドルの値そのものは、常にメモリアドレスを直接指しているわけではない。Windowsの内部で、ハンドルは カーネルが管理するオブジェクトの「ID」または「インデックス」 のようなものとして扱われていて、実際のメモリアドレスではなく、間接的な参照に使われることもあるんだ。
>
>この設計により、ハンドルを外部に公開しつつも、Windowsの内部構造を直接触らせないような仕組みになっている。
>
>なぜ16進数で表示されるのか
>00000000002609F4 のような16進数で表示される理由は、ハンドルの値がメモリアドレスっぽい振る舞いをするからだ。16進数で表現するとメモリの内容を人間が直感的に理解しやすくなるので、デバッグなどではこの形式が一般的に採用されている。
>
>こんな感じで、64ビット環境ではハンドルは確かに 8バイトの16進数 で管理されている。納得できたかな？
----

:::note warn
そもそもポインタも全然わからねえ。
とりあえずハンドルっていう番号でウィンドウを管理してるってのはわかった。
:::

### (おまけ)ハンドルとポインタの違い

|特徴|ハンドル|ポインタ|
|---|---|---|
|用途|リソースを指し示す「管理番号」|メモリ上の「データの住所」|
|管理者|OSやシステムが管理|プログラマが直接操作|
|安全性|システムが管理してるから安全|メモリ操作をミスるとクラッシュの可能性あり|
|確認方法|デバッグやAPIで値を見る|直接操作・デリファレンス可能|

カンケーないけどポインタ操作してどこまでメモリをぶっ壊せるのか(そしてだからといってどうなるのか)、ちょっと試してみたいわね。ってポインタという概念を知ってからずっと思っているのでそのうちやってみたいです。パソコン壊れない程度に。

## (おまけ2)WindowsアプリのインスタンスとJavaとかオブジェクト指向で出てくるクラスのインスタンスの違い
インスタンスってJavaとかC++とかオブジェクト指向で出てくる言葉のイメージだったので、C言語の型にインスタンスって出てきたときは「おっ」と思いました。違いを表にまとめてみます。

|比較項目|Java / C++ の インスタンス|Windows の インスタンス|
|---|---|---|
|定義|クラス（オブジェクト指向）のインスタンス。|クラスから生成された具体的なオブジェクト。|アプリケーションがメモリ上に実行されている一回の実行単位。|
|作成方法|newキーワードを使ってオブジェクトを生成する。|アプリケーションが起動したときにOSが作成。|
|管理|メモリ上のオブジェクトとして管理され、ガベージコレクションやポインタで管理される。|OSやウィンドウマネージャが管理。|
|関連する用語|オブジェクト、ポインタ、クラス、メソッド。|プロセス、ウィンドウ、タスクマネージャ。|
|役割|クラス定義に基づいて状態や振る舞いを持つ。|アプリケーションが実行されている状態を指す。|
|例|Person p = new Person();で作ったオブジェクト。|同じアプリを2回起動するときの2つ目の実行インスタンス。|
|ライフサイクル|プログラムがオブジェクトを作成し、必要がなくなるとGC（ガベージコレクション）で解放される。|OSが終了するまでプロセスとして実行され続ける。|
Macでかな入力のスペースを常に半角にするには Google 日本語入力を使うべし

Macを使っていると、日本語入力でスペースが全角になってしまい「常に半角にしたい！」と思ったことはありませんか？  
この記事では、Google日本語入力で設定を変更して、スペースを常に半角で入力する方法をご紹介します。
Google日本語入力は、少々クセがあるので見落とさないように設定しましょう。

## インストールから設定変更までの手順

### 1. **Google日本語入力をインストール**
まだGoogle日本語入力をインストールしていない場合は、以下の手順でインストールしてください：

1. Googleの公式サイトからGoogle日本語入力をダウンロードします。  
   👉 [Google日本語入力公式ページ](https://www.google.co.jp/ime/)  

1. ダウンロードしたインストーラーを実行してインストールを完了します。

1. macOS を再起動します。再起動しないと入力ソースに現れません。

1. インストール後、**システム環境設定 > キーボード > 入力ソース** から「ひらがな (Google)」を追加します。

---

### 2. **スペースを常に半角に設定する方法**

1. **Google日本語入力の環境設定を開く**
   - 画面右上のメニューバーにある、ひらがな (Google)のアイコン（`あ`と表示されている部分）をクリックします。`A` では環境設定が表示されません。
   - メニューが表示されるので、`環境設定`を選択します。

2. **入力モードを「ひらがな」に設定**
   - 環境設定が見当たらない場合、一度「ひらがな（`あ`）」に切り替えてから再度メニューを開いてください。

3. **「スペースの入力」を半角に変更**
   - 環境設定ウィンドウが開いたら、「一般」タブを選択します。
   - 「スペースの入力」という項目を見つけ、`半角` を選択します。

4. **設定を保存して完了**
   - 最後に「OK」または「適用」をクリックして設定を保存します。

## 設定が完了したら？

これで、かな入力のスペースは常に半角で入力されるようになります。  
`Shift + Space`を押して切り替える手間から解放され、快適なタイピングが実現します！
ちなみに、`Shift + Space`で全角スペースが入力できます。
駄足、最近のUSB充電に追加！！

最近のUSBはどっちも無いのはない！！

![IMG_6296.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949630/207bb934-2331-974c-7f01-c8e18277ebef.jpeg)
![uploading...0]()
セッションスコープの活用

## セッションスコープについての備忘録
（個人的な気付きをまとめたものです。読みにくかったりするかもしれませんが、ご了承ください。）

 ### 基本的な使用方法
 セッションスコープはユーザーごとに割り当てられたHttpSessionクラスのインスタンスです。
request.getSession()を使用したタイミングでインスタンスが作られると同時に、各ユーザーにIDが自動的に割り振られる。
以後アプリケーションサーバーはそのIDに対応するインスタンスに対し、setAttribute("a",a)で保管した情報をgetAttribute("a")で返すことができる。

なお、サーバー側からはユーザーがブラウザを使用しているか確認できないため、
HttpSessionインスタンスが使用されないままある一定の時間が経過すると、
セッションタイムアウトという機能が実行され、消去されます。
ですがそれでも長時間保持することとなるので、removeAttribute("a")を使用して
積極的に消去した方が良いらしい。
またinvalidate()を使用してセッションスコープごと消す方法もあるらしいが、
これはユーザーがログアウトした際などに使用されるようです。

また、HttpSessionインスタンスはサーバー停止中も直列化（バイト列に変換すること。バイト列とは人間の読めない、0と1が並んだものである）されファイルに保管される。
この時直列化されても大丈夫なように、HttpSessionインスタンスに保管するインスタンスは直列化可能、つまりjava.io.Serializableインターフェースを実装している必要がある。

### 気を付けるべきこと
今回僕がこれを書こうと思ったきっかけでもある、setAttribute()とgetAttribute()の属性名について書いておく。
この属性名とは、自分で決めることができる。ぼくはてっきりクラス名だと考えていたので、青天の霹靂のように感じた。属性名って書いてるんやから、早い段階で疑いを持てればよかった、、、

属性名とはクラス名のことだと考えていたので、スネークケースで名前を書いていましたが、可読性も悪く、保守の面でよくないと考え、今後は気を付けようと思います。

### 振り返り
今回初めて記事にして反省したが、頭の中が整理されて知識の定着にも良い気がする。
現在は大学を中退してプログラミングを学んでいるわけだが、これが就職に結びつくように努力したいと思う。
結論！セッションスコープは難しいけどサーバーのためにも積極的に管理するべし！
DeepSeekを使用してWebサイトを要約してみてください：CheckNumber.AI

最近、DeepSeek から DeepSeek-R1 という大型モデルが発売されたので、これを使って Web サイトの要約をオンライン上で行ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962293/eb219e6b-190d-4626-647c-7a5f9482be0c.png)
まず、チャットボックスに「[CheckNumber.AI](https://CheckNumber.AI)」と入力し（矢印1）、次に「検索」ボタン（矢印2）をクリックし、送信ボタン（矢印3）をクリックします。


以下は、ユーザーのメッセージに関連する検索結果に基づく詳細な情報です。

---

### **CheckNumber.AIの主な機能**
1. **WhatsApp番号確認**:
   - このプラットフォームは、電話番号がWhatsAppに登録されているかどうかを確認するためのツールを提供します。リアルタイムで確認を行い、番号がアクティブなWhatsAppアカウントを持っているかどうかやそのステータスを表示します。
   - 複数の電話番号を含むCSVファイルをアップロードして一括確認を行うことも可能です。これは、大規模な連絡先データベースを管理するビジネスにとって特に便利です。

2. **グローバル対応**:
   - このサービスは国際的な電話番号形式をサポートしており、世界中のすべての国のWhatsApp番号をカバーしています。これにより、番号の出身国に関係なく正確な確認が可能です。

3. **効率的で高速な処理**:
   - プラットフォームは高度な検証技術を使用しており、個々の番号に対して数秒以内に正確な結果を提供します。一括処理の時間はデータセットのサイズに依存しますが、速度が最適化されています。

4. **エクスポートと履歴機能**:
   - ユーザーは確認結果をCSV形式でエクスポートでき、成功または失敗のステータスごとに分類されます。これはさらなる分析や記録管理に最適です。
   - 包括的な履歴機能により、過去の確認結果を追跡および確認できるため、記録の管理や監査が容易になります。

5. **API統合**:
   - CheckNumber.AIは、**WhatsApp番号確認API**を提供しており、開発者がアプリケーションやシステムに一括WhatsApp番号確認機能を統合できるようにしています。このAPIは、スケーラブルで自動化されたソリューションを必要とするビジネス向けに設計されています。

---

### **CheckNumber.AIの使用方法**
- **個別確認**:
   - ユーザーは番号のリストを直接プラットフォームに貼り付けるか、CSVファイルをアップロードできます。システムは番号を処理し、即座に確認結果を返します。
- **一括確認**:
   - 大規模なデータセットの場合、ユーザーは電話番号を含むCSVファイルをアップロードできます。システムは自動的にファイルを処理し、構造化された形式で結果を提供します。

---

### **追加ツールとリソース**
- **Chrome拡張機能**:
   - CheckNumber.AIは、ブラウザから直接WhatsApp番号のステータスを確認するためのChrome拡張機能「**WA Number Checker**」を提供しています。
- **ドキュメントとサポート**:
   - プラットフォームは、ツールやAPIの使用方法に関する詳細なドキュメントと記事を提供しています。ユーザーはサポートにメールまたは電話で問い合わせることもできます。

---

### **使用例**
- **ビジネスアプリケーション**:
   - マーケティングチーム、カスタマーサポート部門、またはeコマースプラットフォームなど、大規模な連絡先リストを確認する必要があるビジネスに最適です。
- **個人利用**:
   - 個人は、特定の番号がWhatsAppに登録されているかどうかを確認してから連絡を開始するためにこのツールを使用できます。

---

### **技術的な洞察**
- このプラットフォームは比較的新しく、最近の更新や分析によって示されています。例えば、Semaltによるウェブサイトの分析では、まだ初期段階であり、いくつかのSEOメトリクスが評価されていることが示されました。
- サイトはGoogle Analytics（GA）を統合してユーザーアクティビティを追跡していますが、GAの読み込みに関する技術的な問題が報告され、解決されました。

---

### **結論**
CheckNumber.AIは、WhatsApp番号確認のための多機能で効率的なツールであり、個人とビジネスの両方のニーズに対応しています。そのグローバルな対応、一括処理能力、API統合により、連絡先データベースの管理と確認に貴重なリソースとなっています。詳細については、公式ウェブサイトをご覧ください: [https://checknumber.ai](https://checknumber.ai) 。

---

もし具体的な質問やさらなるサポートが必要な場合は、お気軽にお問い合わせください！
【リーダブルコード】初心者エンジニアが読み解く「シンプルなコード」を目指すコツ - 第11章

こんばんは！マル太です。

前回は、リーダブルコードの第10章「無関係の下位問題を抽出する」についてまとめました。

今回は、第11章「一度にひとつのこと」について、自分なりにまとめていきます。


# なぜ「一度にひとつのこと」が大切なの？
プログラムを書くとき、つい一つの関数にたくさんの処理を詰め込んでしまいがちですよね。

でも、これは実は良くないことだと著者は述べています。
なぜなら、、、

**■コードが分かりにくくなる**
一つの関数にたくさんの処理が詰め込まれていると、その関数が一体何をやっているのか、パッと見て理解することが難しくなります。

**■バグを見つけにくくなる**
もしバグがあった場合、どこが原因なのかを特定するのが大変になります。

**■コードを修正するのが難しくなる**
ある部分を修正したいときに、他の部分にも影響を与えてしまう可能性があります。

といった悪影響出てきてしまうためです。



<br>

# 「一度にひとつのこと」を実現するための具体的な手法

**1. 関数の粒度を細かくする**
・関数の役割を明確にする
・各関数は、できる限り一つの処理に特化させましょう。

例:
ユーザー認証処理を、
1.ログイン認証
2.権限チェック
3.セッション管理
といった複数の関数に分割する。
<br>

**2. オブジェクトから値を抽出する際には、一つのメソッドで一つの値を返す**

・オブジェクトの責務を明確にする
・オブジェクトは、特定のデータと、そのデータに対する操作をカプセル化します。

例:
ユーザーを表すオブジェクトから、
1.ユーザー名を取得するメソッド
2.メールアドレスを取得するメソッド
などを用意する。
<br>

**3. その他のテクニック**
・ガード節
　条件によって処理を分岐させる場合、条件が合わない場合は早期に処理を終了させるガード節を活用しましょう。

・フラグ変数の使用を避ける
　フラグ変数を使用すると、コードの意図が分かりにくくなるため、できるだけ避けるようにしましょう。

・コメント
　関数の意図や処理内容を分かりやすく説明するコメントを記述しましょう。
 
# より大きな例で考える
実際のコードを例に、どのように「一度にひとつのこと」の原則を適用していくのかを、コード例を使って説明します。


例：Pythonを使ったユーザー登録処理

```ruby:Python

def register_user(username, password, email):
    # ユーザー名、パスワード、メールアドレスの入力チェック
    if not username or not password or not email:
        return "入力エラー"

    # データベースにユーザー情報を登録
    # ... (データベース接続、SQL実行など)

    # 歓迎メールを送信
    # ... (メール送信処理)

    return "登録完了"
```
上記のコードは、ユーザー登録の処理を一つの関数にまとめています。
しかし、この場合、

・どの部分が何をしているのか分かりにくい
・バグがあった場合、原因を特定するのが難しい
・機能を追加したい場合、既存のコードを大幅に修正する必要がある
といった問題があります。
<br>

そこで、リファクタリングを活用してコードを読みやすくしてみましょう。

※リファクタリングとは？
リファクタリングとは、コードの外部から見た機能を変えずに、内部の構造を改善することです。
例えば、古い建物を取り壊さずに、内部の配線をやり替えたり、間取りを変えたりするようなイメージです。
<br>

例：Pythonを使ったユーザー登録処理（リファクタリング後）

```ruby:Python

def validate_user_data(username, password, email):
    # 入力チェックの処理
    # ...

def save_user_to_database(user_data):
    # データベースへの登録処理
    # ...

def send_welcome_email(email):
    # メール送信処理
    # ...

def register_user(username, password, email):
    if validate_user_data(username, password, email):
        user_data = {'username': username, 'password': password, 'email': email}
        save_user_to_database(user_data)
        send_welcome_email(email)
        return "登録完了"
    else:
        return "入力エラー"
```
改善後では、

・入力チェック
・データベースへの登録
・メール送信
といった処理をそれぞれ別の関数に分けています。

これにより、
・各関数の役割が明確になり、コードが読みやすくなった
・バグが発生した場合、原因を特定しやすくなった
・新しい機能を追加したい場合、影響範囲が限定される

といったメリットがあります。
<br>

**改善前後の比較**
| 項目 | 改善前 | 改善後 | 
|:----|------:|:-----:|
|可読性|	低い |	高い|
|保守性|	低い |	高い|
|再利用性|	低い|	高い|
|テストのしやすさ|	低い|	高い|


# まとめ
「一度にひとつのこと」という原則は、プログラミングの基礎となる考え方です。

この原則を守ることで、よりシンプルで、分かりやすく、そして保守しやすいコードを作成することができそうですね！

次回は、第12章「コードに思いを込める」についてまとめます。
DockerコンテナでPlaywright(Python)を利用するときの依存関係解決方法 覚え書き

## 問題
DockerでPlaywrightをインストールするときに依存関係でエラーが起こる。
関係する全てのパッケージを手動で`apt-get`に記載して解決する手法が多いが、元にするイメージによっては途方もない量のパッケージが必要となっていた。

## 解決策
`playwright install-deps`を利用する。
以下のように依存関係をインストールするコマンドをDockerfileに追記するだけで良い感じに解決してくれる。

```dockerfile
FROM python:3.11-slim

WORKDIR /app

RUN apt-get update && apt-get install -y libffi-dev
COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

RUN playwright install
RUN playwright install-deps #依存関係のインストール 
```
USB充電器、最近増えてて種類アップ！！

最近USB充電器増えてて、沢山あり！！
どんなのから、！！と思うものを考えた、ボツ
どれ？!

![IMG_1522.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949630/285a69cd-d2c2-2387-1bc0-9da4b0a21a4a.jpeg)

2.4Aと1.0Aどっち！！？
音源から人の声とそれ以外とへ分離する仕組みを調査

こんにちは
音源から人の声(vocal)とそれ以外(music)とへ分離し、片方を抽出できる仕組みを調査し、下記が見つかりました。

https://vocalremover.org/

* Vocal Remover - Musiclab by EaseUS Software


これを試し、人の声を抑制した方の結果を聴いてみると、概ね抑制されていると感じました。
実行時アクティブ防御の価値

# Intro

Automotive World 2025の初日、東京ビッグサイトで開催されたPwn2Own Automotive 2025が勢いよく幕を開けました。世界最大級のゼロデイ脆弱性発見コンテストで名を刻むことを目指し、世界中から集結したトップレベルのサイバーセキュリティ研究者たちが、トレンドマイクロのZero Day Initiative（ZDI）と共同主催するVicOneのコンテストに大きな期待を寄せる中、会場全体が熱気に包まれていました。

![signal-2025-01-27-233420_002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973392/d983fa05-7584-9ea0-2d5b-21138c817b5b.jpeg)


初日には、前日のランダム抽選により、合計18回のセキュリティチャレンジがスケジュールされました。その中には、オートモーティブワールドの閉会後に行われる「Pwn2Own After Dark」として、時間外に実施される3回の試行も含まれています。

Pwn2Own Automotiveの初代「Master of Pwn」に輝いたSynacktivチームのリサーチャーは、電気自動車（EV）充電器カテゴリのターゲットの一つであるChargePoint Home Flex（モデルCPH50）において、スタックベースのバッファオーバーフローバグを発見し、最初の試行を成功させました。さらに、Open Charge Point Protocol（OCPP）の既知の脆弱性を利用し、充電器コネクタを介して信号を改ざんするデモンストレーションも行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973392/919b6817-3e39-6625-cce1-f0e684eee967.png)


また、今年のコンテストには、招集チームのSina Kheirkhah氏も参加しました。彼はUbiquiti Connect EV Station充電器におけるハードコードされた暗号化キーの脆弱性を発見し、画面にイギリスの歌手リック・アストリーのダンス動画を表示させることに成功しました。昨年、同じUbiquiti充電器で「リックロール」を披露した彼は、今回もユーモアを交えた見事なエクスプロイトを披露し、この充電器に対する興味を失っていないことを証明しました。今年も期待を裏切らない素晴らしいパフォーマンスを見せてくれました。

おなじみの顔ぶれに加えて、今年はGMOサイバーセキュリティ株式会社（株式会社イエラエ）などの新しいチームもPwn2Own Automotiveに初参加しました。このチームは、ケンウッドの車載インフォテインメント（IVI）システム「DMX958XR」に対して、スタックベースのバッファオーバーフローをわずか数秒で発現させることに成功しました。その見事なパフォーマンスは、昨年デトロイトで開催されたAutomotive CTFでの鮮烈なデビューを思い起こさせ、驚くことではありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973392/d3ddab5f-6fa1-c18f-eb0b-e835e7551ce6.png)


この日の最後のセキュリティチャレンジでは、新顔と馴染み深い存在が交じり合い、どこか既視感のある展開となりました。STEALIEN社のBongeun Koo氏は、Alpine iLX-507 IVIシステムの脆弱性を活用しましたが、そのバグは昨年すでに発見されていたものです。ISO/SAE 21434の規定により、ベンダーはこの脆弱性を「リスクの共有」として分類し、残存リスクを受け入れることを決定してパッチをリリースしない方針を取っていました。しかし、STEALIENのリサーチャーは、このデバイス上に象徴的なキャラクターである「ニャン・キャット」を表示させ、そのスタイリッシュなアプローチで大きな注目を集めました。

# ゼロデイ脆弱性 - サイバーセキュリティにおける永続的な課題

では、これらのハッカーたちはどのような魔法を使って、数十億円をかけて開発されたスマートカーを制御したのでしょうか？一部の人々は、手順を守り、システムを更新し、物理的に隔離すれば、ハッキングの心配はないと考えています。

どんなコンピュータシステムでも、ゼロデイ脆弱性のリスクは避けられません。どれだけ対策を講じても、未発見の脆弱性が潜んでいる可能性があり、それが発見・修正されるまでのわずかな時間差で、攻撃者に悪用されてルートキットを仕込まれてしまう危険性があります。そうなってしまえば、後から修正やセキュリティを強化しても、手遅れです。システムを再起動する以外に方法はありません。

これが、まだ誰も知らない脆弱性、いわゆるゼロデイと呼ばれるものです。では、このような未知の脅威、ゼロデイに対して、どのような対策が有効なのでしょうか？その有効な対策の一つが、ランタイムアプリケーション自己保護（RASP）です。

ランタイムアプリケーション自己保護（RASP）は、OSに対する一種の予防接種のような働きをします。OSの中核部分であるカーネルに、あらかじめ防御の仕組みを組み込んでおくことで、未知の脆弱性に対する防御力を高め、パッチが提供される前でも、ハッカーの侵入をある程度阻止することが可能になります。

OSのワクチンについては、こちらをご参照ください。

[GNU/Linuxカーネルのランタイム保護概要](https://qiita.com/RoyMu/items/b62473793c4b52990bcf)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973392/e142ee47-555c-96f3-9420-5ac54e4cb720.png)   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973392/900abe78-a663-ad74-e852-a13eba606a2c.png)