OmniAICreator/Qiita-1.07M huggingface dataset:
【Snowflake】シェア・クローン・レプリケーションできるもの

Snowflakeの認定資格Snowpro Coreでよく問われるシェア・クローン・レプリケーションができるオブジェクトについてまとめてみました。

試験勉強や実務にご活用ください。

# シェアできるもの
Snowflakeでは共有したいものをカプセル化したシェアオブジェクトを使うことで、異なるアカウント間でデータを共有します。
ここではそのシェアオブジェクトに追加できるものが、シェア可能なものという扱いになります。

- データベース
  - スキーマ (データベースについてくる。単体では不可。)
- テーブル 
- 動的テーブル
- 外部テーブル
- Apache Icebergテーブル
- セキュアビュー
- セキュアマテリアライズドビュー
- セキュアユーザー定義関数
- コードなしモデル

ノーマルビューなどのセキュアでないオブジェクトは`SECURE_OBJECTS_ONLY=FALSE`を指定することでシェア可能。

### 参考資料
 - [Secure Data Sharingについて](https://docs.snowflake.com/ja/user-guide/data-sharing-intro?utm_source=chatgpt.com)
 - [保護されていないビューでデータを共有する](https://docs.snowflake.com/ja/user-guide/data-sharing-views)

# クローンできるもの
Snowflake上のオブジェクトを瞬時にコピーできるのがクローン機能です。
クローンされただけではストレージを消費せず、スナップショットとして簡単に保持できるのが特徴です。

- データベース
- スキーマ
- テーブル（仮テーブルを除く）
    - マイクロパーティション（テーブルのクローンについてくる。単体では不可。）
- 外部ステージ
- 内部ステージ（名前付きでないもの）

### 参考資料
- [クローニングに関する考慮事項](https://docs.snowflake.com/ja/user-guide/object-clone)


# レプリケーション（複製）できるもの
レプリケーション機能はデータベースやアカウント全体を別のリージョンやアカウントにコピーする機能です。

レプリケーションはデータの複製を目的としたときはデータベース単位、ユーザーやロールなどのオブジェクトの複製を目的としたときはアカウント単位で行います


- データベース
- テーブル（自動クラスタリング含む）
    - 永続テーブル
    - 一時テーブル（Transient Table）
    - [動的テーブル](https://docs.snowflake.com/ja/user-guide/account-replication-considerations#label-replication-and-dynamic-tables:~:text=%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,%E8%A4%87%E8%A3%BD%E3%81%A8%E5%8B%95%E7%9A%84%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB,-%C2%B6)
- シーケンス
- ビュー
    - 通常ビュー
    - マテリアライズドビュー
    - セキュアビュー
- ファイル形式
- ステージ
- パイプ
- ストアドプロシージャ
- ストリーム
- タスク
- データメトリック
- ポリシー
    - 集計ポリシー
    - 認証ポリシー
    - 列レベルマスキングポリシー
    - パスワードポリシー
    - プライバシーポリシー
    - 投影ポリシー
    - 行アクセスポリシー
    - セッションポリシー
    - タグベースのマスキングポリシー
- タグ
- アラート
- シークレット
- ネットワークルール
- クラスインスタンス
- パッケージポリシー
- シェアオブジェクト
    - 自分がプロバイダーとして作成したもののみ（シェアされたものは不可）

#### 以下はBusiness Critical Edition以上でできるもの
- [統合](https://docs.snowflake.com/ja/user-guide/account-replication-intro#integration-replication:~:text=%E5%8F%82%E7%85%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,%E7%B5%B1%E5%90%88%E8%A4%87%E8%A3%BD,-%C2%B6)
- ネットワークポリシー
- アカウントに紐づいたパラメータ
- リソースモニター
- ロール
    - ロールに付与された権限も一緒にレプリケーションされる
    - ORGADMINも可能
- ユーザー
    - ユーザーに付与されたロールも一緒にレプリケーションされる
    - パスワードなどの認証設定も一緒に複製される
- ウェアハウス


### 参考資料
- [複製に関する考慮事項](https://docs.snowflake.com/ja/user-guide/account-replication-considerations)
- [複数のアカウント間にわたる複製とフェールオーバーの概要](https://docs.snowflake.com/ja/user-guide/account-replication-intro)
Webサイトをpdfにし、pdfから前株と後ろ株の会社名検索、検索dataをCSVに保存



<h3>いるもん</h3>


<h3>code</h3>

```ruby:☺️
import pdfplumber
import pandas as pd
import re

# PDFファイルからテキストを抽出
def extract_text_from_pdf(pdf_path):
    text = ""
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            text += page.extract_text()  # ページからテキストを抽出
    return text


# 「株式会社」を含む会社名を抽出
def extract_companies(text):
    pattern = r"株式会社[\w一-龯々〆〤]+|[\w一-龯々〆〤]+株式会社"  
    # 前株と後かぶ を取得
    companies = re.findall(pattern, text)
    return list(set(companies))

# 使いたいPDF
pdf_paths = [
    "/Users/chomechomesuke/Desktop/indeed.pdf",
    "/Users/chomechomesuke/Desktop/indeed2.pdf",
]

results = []

# PDFから抽出したデータをcsvに保存
for pdf_path in pdf_paths:
    text = extract_text_from_pdf(pdf_path)
    if not text:
        print(f" No text  {pdf_path}")
    else:
        print(f" {text[:300]}...")  
        # 最初の300文字を表示

    companies = extract_companies(text)
    print(f"Data: {companies}")

    for company in companies:
        results.append({"company_name": company})

# 結果をCSVに保存
if results:
    output_file = "search_results.csv"
    df = pd.DataFrame(results)
    df.to_csv(output_file, index=False, encoding="utf-8")
    print(f"保存成功")
else:
    print("めよら")

# CSVから読み込む
df = pd.read_csv(output_file)

# 部分一致の抽出（正規表現も使用可能）
partial_match = df[df['company_name'].str.contains('検索したいキーワード', na=False)]

print(partial_match)

```

<h3>解説</h3>
<h4>1️⃣ PDFからテキスト取り出す  
<br>def extract_text_from_pdf関数 定義</h4>

```ruby:最初に、から配列用意
text = ""
```

```ruby:PDFファイル開けて
with pdfplumber.open(pdf_path) as pdf:
```

```ruby:PDFから、テキスト取り出す
for page in pdf.pages:
    text += page.extract_text()
return text
```

<br>
<h4> 2️⃣ PDFから、前株と後かぶ 取得 
<br>def extract_companies関数 定義 </h4>

```ruby:PDFから、テキスト取り出す
    # 前株と後かぶ を取得
    pattern = r"株式会社[\w一-龯々〆〤]+|[\w一-龯々〆〤]+株式会社"  
    
    companies = re.findall(pattern, text)
    
    return list(set(companies))
```
<br>

<h4> 3️⃣ 定義した変数を呼び出し、データを出力 & CSV保存
<br>pdf_path in pdf_paths:関数</h4>

```ruby:定義した変数呼び出し、指定条件でデータ出力
    text = extract_text_from_pdf(pdf_path)

    companies = extract_companies(text)

    for company in companies:
        results.append({"company_name": company})
```

```ruby:pandaでcsv　保存
    output_file = "search_results.csv"
    
    df = pd.DataFrame(results)
    
    df.to_csv(output_file, index=False, encoding="utf-8")
```

<br>
<h3> デバッグ</h3>
<h4>1️⃣データcsv保存⭕️ :  "成功"、<br> 保存❌ : "めよら"と表示</h4>

```ruby:
if results:
    output_file = "search_results.csv"
    df = pd.DataFrame(results)
    df.to_csv(output_file, index=False, encoding="utf-8")
    print(f"成功")
else:
    print("めよら")
```
<br>
<h4>2️⃣データPDFから取り出し⭕️ :  結果表示 <br> 保存❌ : "めよら"と表示</h4>

```ruby:
text = extract_text_from_pdf(pdf_path)
    if not text:
        print(f" めよら  {pdf_path}")
    else:
        print(f" {text[:300]}...") 
```

<br>
<h4> 3️⃣ 前株と後ろ株のデータ取得できてるか、変数の中身確認 </h4>

```ruby:
companies = extract_companies(text)
    print(f"Data: {companies}")
```
【図解】AWS VPCの基礎からマルチAZ構成まで - Webアプリケーションのアクセスフローで理解するVPC

# 🏡 VPC（Virtual Private Cloud）とは？

AWS の中に専用のネットワークを構築できる機能です！
Webアプリの構築の際に基本的な使われ方としては、
Webサーバーやデータベースを配置してインターネットアクセスを通してサービスを提供したり、
逆にインターネットを使用せずに社内向けの業務アプリを配置することもできます。

# VPCの基本的な構成

Webアプリを配置するための基本的なVPCの構成を見ていきたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671845/3a7ee4c6-95f4-4cb9-afb9-c53d899154b5.png)




### 1. リージョン（Region）
AWSが用意する地理的な拠点。
例：東京（ap-northeast-1）、オレゴン（us-west-2）、バージニア北部（us-east-1） など

### 2. VPC（Virtual Private Cloud）

リージョンのなかに作る専用の仮想ネットワーク空間。
VPCを作成するときには、まず`10.0.0.0/16`というように「このVPC内で使えるIPアドレスの範囲」を定義します。

IPアドレスやCIDRについてはこちらの記事でまとめています！

https://qiita.com/gaky1201/items/efa4974671ff0d74a486

### 3. アベイラビリティゾーン（AZ）

リージョン内にあるデータセンター。

例えば東京リージョンの中には

- ap-northeast-1a
- ap-northeast-1c
- ap-northeast-1d

というように複数のデータセンターが存在します。
サービスを複数のAZに配置することで災害に対応してシステムの可用性（安定して使える状態を保つこと）を高めることができます。

### 4.サブネット

VPCというネットワークの中に配置する小分けのエリアになります。
VPCの中で「IPアドレスの範囲」を小分けにしたネットワークのこと。
また、サブネットは２種類存在します。

- **パブリックサブネット**(インターネットと接続する)
  - Webサーバーを配置
- **プライベートサブネット**(インターネットと接続しない)
  - DBサーバーを配置

## その他VPC内で構成されるもの

### パブリックIP

インターネットからアクセス可能なIPアドレスです。パブリックサブネットに配置されたリソースに割り当てて使用します。

#### Elastic IPアドレス

固定のパブリックIPアドレス。
通常のパブリックIPはインスタンスの起動/停止で変更されますが、
Elastic IPアドレスは変更されません。
DNSの設定やSSL証明書（HTTPSで通信を暗号化するためのもの）発行時に使用します。

### プライベートIP

VPC内でのみ有効なIPアドレスで、パブリック・プライベートサブネットに関係なくVPC内のすべてのリソースにCIDR範囲内で割り当てられます。VPC内の他のリソースと接続する際に使用します。

### ルートテーブル

VPC内の通信において、各サブネットごと、送信先、通信経路を定義するものになります。ルートテーブルに従って、送信先ごとに指定したターゲットへデータを転送することを「ルーティング」といいます。

# インターネットからのアクセスフロー

実際にWebアプリを構築してリクエストが入った場合の流れを確認してみます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671845/ad3b870e-8783-4948-bfae-cdd2a10b46ac.png)


### 1. **インターネットからのアクセス開始**
ユーザーがブラウザで`example.com`と入力しリクエストが入る
Route 53（DNSサービス）がドメイン名をALBのDNS名に**名前解決**が行われる。


- 例：`example.com` → `alb-xxxx.ap-northeast-1.elb.amazonaws.com`

### 2. **VPC外部からVPC内部への入り口**

VPCとインターネットを繋ぐ「玄関口」であるインターネットゲートウェイ（IGW）を使用することでインターネットがVPC内へのリソースへアクセスが可能となります。

### 3. **ロードバランサー（ALB）による振り分け**

インターネットアクセスを複数AZに配置されているEC2に負荷分散を行います。
ALBは定期的にヘルスチェックを行い、正常なEC2にのみ振り分けを行います。

※ 図ではwebサーバーを負荷分散、災害対策としてマルチAZ構成としています。

:::note info
ヘルスチェックとは？
サーバーがちゃんと動いてるかを、ALBが自動で見に行ってくれる仕組みです。
調子の悪いサーバーは、自動で振り分け対象から外してくれます。
これでユーザーは壊れたサーバーに当たらず、安心して使えます！
:::

### 4. **パブリックサブネット層**
EC2インスタンス（Webサーバー）がリクエストを処理を行います。
必要に応じてPrimary RDSにアクセスを行います。

### 5. **プライベートサブネット層**
Primary RDSがデータを処理を行います。
ここでも障害に備えてRDSのマルチAZ構成としています。

:::note info
マルチAZ構成とは？
データベースを2つの拠点（AZ）に分けて配置して、
もし片方に障害が発生した場合、もう片方にフェイルオーバー（自動で予備のDBに切り替わる仕組み）することでサービスを止めずに運用できる仕組みです。

:::
google colabをローカルでやりたい(in brave)

colabのローカルをbraveでやるには、アドブロッカーの無効化が必要

設定>シールド>トラッカーと広告をブロック、を無効にする必要がある

ローカルランタイムへの接続については以下の記事の通りです。

https://qiita.com/Radley/items/e5d6da8cea17b0baa46a

手順としては、
以下のコードでjupyter notebookを起動
```
jupyter notebook --NotebookApp.allow_origin='https://colab.research.google.com' --port=8888 --NotebookApp.port_retries=0 --NotebookApp.iopub_data_rate_limit 10000000
```
その後、ターミナルに表示された以下のリンクをコピーする
```
http://localhost:8888/tree?token=****
```
その後、google colabの接続の部分をクリックし、ローカルランタイムに接続、先ほどコピーしたリンクを貼ることで、ローカルランタイムに接続できる。
windows11で、sketchup6 その31

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
add_curveを使え。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a278c71a-40ce-41f7-ba02-697207404b7d.png)

# サンプルコード

```
def curve1
	xya = 1
	zza = xya * 8
	xys = 42
	zzs = 22
	cxy = 0
	czz = 0
	p = []
	while cxy < 360
		x = Math.cos(cxy * Math::PI / 180) * xys
		y = Math.sin(cxy * Math::PI / 180) * xys
		z = Math.sin(czz * Math::PI / 180) * zzs
		p[p.length] = [x, y, z]
		cxy += xya
		czz += zza
		if (czz >= 360)
			czz = 0
		end
	end
	p[p.length] = p[0]
	model = Sketchup.active_model
	entities = model.active_entities
	entities.add_curve(p)
end



```

以上。
スクラムマスターの役割について

## 概要

スクラムマスターは、スクラム開発において重要な役割を担う存在です。チームがスクラムの原則を正しく実践し、効率的に機能するようサポートする「サーバントリーダー」としての役割を果たします。本記事ではスクラムマスターの具体的な役割や責任について解説します。

## スクラムマスターの役割と責任

スクラムマスターは下記の主要な役割、責任を通じて、チームの自己管理能力を高め、価値あるプロダクトを継続的に提供できる環境づくりに貢献します。

### 基本的な責任
- **ファシリテーション**: スプリント計画、デイリースクラム、スプリントレビューなどの各種ミーティングを効果的に進行し、チームのコラボレーションを促進します。
- **障害物の排除**: チームの進捗を妨げる技術的・組織的な問題を特定し、解決に向けて積極的に行動します。
- **アジャイル文化の促進**: チーム内にアジャイルの価値観や原則を浸透させ、自己組織化と自律性を高めます。
- **プロダクトオーナーとの連携**: プロダクトバックログの管理や優先順位付けをサポートし、プロダクトオーナーとチーム間の調整役を務めます。
- **継続的改善の推進**: レトロスペクティブを通じてチームのプロセスを定期的に見直し、改善を促進します。

### 複数チーム対応とスケーリング
- **チーム間調整とコミュニケーション**: 複数チームが協働する環境では、依存関係の管理や情報共有を促進し、円滑なコラボレーションを実現します。
- **イベント管理と優先順位付け**: 複数チームのスクラムイベントを効率的に調整し、リソースの競合を避けながら各チームの目標達成をサポートします。
- **スケーリングフレームワークの活用**: Scrum@Scale、LeSS（Large Scale Scrum）などのフレームワークを導入し、複数チームの協働を効果的に構造化します。

### 状況に応じた柔軟な対応
- **チームの成熟度に合わせたアプローチ**: 経験豊富なチームには最小限のサポートを提供し、新しいチームにはより手厚いコーチングを行うなど、状況に応じて対応方法を調整します。
- **適応力の発揮**: 組織やプロジェクトの変化に柔軟に対応し、チームが最適なパフォーマンスを発揮できるよう支援します。

## スクラムマスターだけで考えるべきではないこと

スクラムマスターの真の成功は、チームが自律的に機能し、各メンバーが自分の責任を理解して主体的に行動できるようになることにあります。そのため、適切な権限委譲とチーム全体での責任共有が重要です。以下はスクラムマスターが単独で抱え込むべきではない事項です.

### 開発プロセスに関する共有責任
- **タスクの詳細な計画**: スプリントバックログの作成やタスクの分解は開発チーム全体で行うべきであり、スクラムマスターが一人で計画するものではありません。
- **技術的な意思決定**: コード設計、アーキテクチャ、技術スタックの選定などは開発チームの専門知識を活かして決定すべき領域です。

### 目標設定とビジョン
- **プロジェクト全体の目標設定**: プロダクトの方向性や目標はプロダクトオーナーと開発チームが協力して設定すべきものです。

### チームの自律性を尊重すべき領域
- **すべてのイベントへの主導的参加**: デイリースクラムなど一部のイベントは開発チーム主導で行われるべきで、スクラムマスターは必要に応じて参加しながらも過度な介入は避けるべきです。
- **全ての障害物への直接対応**: チームメンバー自身の問題解決能力を育むため、スクラムマスターは支援役として働きつつも、全ての問題を自ら解決しようとすべきではありません。

## **スクラムマスターに求められるスキル**

- **コミュニケーション能力**: チーム内外で適切な情報共有と調整を行う。
- **問題解決能力**: 障害物や対立に迅速かつ効果的に対応する。
- **コーチングスキル**: チームメンバーが成長できるよう支援する。
- **柔軟性**: 状況に応じて適切な対応策を講じる。

## **複数スクラム環境で成功するためのポイント**

複数のスクラムチームが同時に活動している場合、スクラムマスターの役割はより複雑になります。一人のスクラムマスターが複数チームを担当する場合や、複数のスクラムマスターが存在する場合、それぞれの役割を明確にし、チーム間の調整を円滑に行うことが重要です。
- **明確な役割分担**: 各スクラムマスター間で責任範囲を明確化し、重複や対立を避けます。
- **共通フレームワーク導入**: LeSS（Large Scale Scrum）などのスケーリングフレームワークで効率的な連携を図ります。
- **定期的な振り返り**: 複数チーム間で定期的に振り返り（レトロスペクティブ）を行い、改善点を共有します。
- **優先順位付け**: タスクやイベント管理で優先順位付けを徹底し、リソース配分を最適化します。

## **まとめ**

スクラムマスターは、チーム全体が効率的かつ効果的に働ける環境作りを担う重要な存在です。しかし、その役割はあくまで「支援者」であり、すべての課題や意思決定を独占するものではありません。チーム全体で協力しながら目標達成に向けて進むことこそが、スクラム開発成功の鍵と言えます。
また複数スクラム環境では、一人一人のスクラムマスターが個々のチームだけでなく全体最適化にも貢献する必要があります。その際、「何でも自分だけで解決しようとしない」姿勢も重要です。プロダクトオーナーや開発チームと協力しながら柔軟に対応することで、プロジェクト全体として高い成果を上げることが可能になります。

## **参考記事**

- **[アジャイルスクラムの失敗パターンと対策](https://shiftasia.com/ja/column/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%AE%E5%A4%B1%E6%95%97%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%A8%E5%AF%BE%E7%AD%96/)**  

- **[複数チームのスクラムマスター](https://www.ryuzee.com/faq/0021/)**  

- **[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf)**  

- **[スクラムマスターの役割と注意点](https://qiita.com/gold-kou/items/90ba982a14ca79d843c9)**
[csv加工]csvファイルの空白スペースを削除し、カンマを追加

<h3>変数 考え方</h3>

```ruby: ✅ 
csvデータのカンマ、空白を入れる配列を用意 : cleaned_data = []

カンマつける変数 : formatted_row

空きスペースを消す変数 : cleaned_row

加工前データ : row

加工後データ : formatted_row
```


<h3>code</h3>

```ruby: ✅ 
import csv
import re
from openpyxl import load_workbook

def clean_and_format_csv(file_path):
    cleaned_data = []

    with open(file_path, 'r', encoding='utf-8') as infile:
        reader = csv.reader(infile)
        for row in reader:
            # 1. 各セルの中で全角スペースを半角スペースに変換
            cleaned_row = [re.sub(r'\s+', ' ', cell.replace("\u3000", " ")).strip() for cell in row]

            # 2. 各セル内のスペースをカンマに変換
            formatted_row = ",".join([cell.replace(" ", ",") for cell in cleaned_row])

            print(f'Before: {row} -> After: {formatted_row}')  # デバッグ表示
            cleaned_data.append(formatted_row)

    # 3. 新しいCSVファイルに書き込み
    with open(file_path, 'w', encoding='utf-8', newline='') as outfile:
        for line in cleaned_data:
            outfile.write(line + "\n")  # 各行の末尾に改行をつけて書き込む

# 使用例
csv_file = 'meisai.csv'  # 処理するCSVファイル
clean_and_format_csv(csv_file)
print(f'成功 {csv_file}')
```

<br>
<h3>解説</h3>

```ruby: ファイルを開け、csv読み込み
with open(file_path, 'r', encoding='utf-8') as infile:
        reader = csv.reader(infile)
```

```ruby: から配列　用意
   cleaned_data = []
```

```ruby: 半角スペースにしたデータをカンマにする
",".join([cell.replace(" ", ",")for cell in つけたい変数名])
```
```ruby: カンマつけたデータを配列に加える
cleaned_data.append(formatted_row)
```

```ruby: csv保存
with open(file_path, 'w', encoding='utf-8', newline='') as outfile:
```

```ruby: データを改行し、csvに書き込む
for line in cleaned_data:
            outfile.write(line + "\n") 
```

```ruby: 保存したいcsvを読み込み、カンマとスペースを消す処理実行
csv_file = 'meisai.csv'  # 処理するCSVファイル
clean_and_format_csv(csv_file)           
```

```ruby: 加工前データrowと、加工後データfoematted_row　確認
:print(f'Before: {row} -> After: {formatted_row}') 
```


<h3>CSVファイル　入出力がうまくできない原因</h3>
<ul>
<li>csvの先頭にタイトル ❌</li>
<li>カンマがついてない</li>
<li>全角・半角の空きスペースが消せてない</li>
</ul>

<br>
<h3>openpyxl codeが動かない原因</h3>
<ul>
<li>ヘッダースキップできてない</li>
<li>列(日付)と名前を指定している</li>
<ul>
uvの環境変数のインストール先の変更とXDG準拠


# この記事について
私は、Dockerで`uv`を使用してPython環境を構築しようとした際に発生した環境変数についての問題を記事にしたものです。

# `uv`とは
Rust で書かれた、非常に高速な Python パッケージおよびプロジェクト マネージャーです。
Rustで使用されているパッケージ管理システムであるCargoをPythonに導入したもので、`pip`準拠なより高速なインストールを可能としています。

# `uv`のインストール先の変更
以下のような過去の記事を参考にDockerfileを作成し、`uv`を使用したPython環境を構築しました。
```Dockerfile
FROM python:3.12-slim-bookworm

# The installer requires curl (and certificates) to download the release archive
RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates

# Download the latest installer
ADD https://astral.sh/uv/install.sh /uv-installer.sh

# Run the installer then remove it
RUN sh /uv-installer.sh && rm /uv-installer.sh

# Ensure the installed binary is on the `PATH`
ENV PATH="/root/.cargo/env/:$PATH"

COPY --from=ghcr.io/astral-sh/uv:0.6.10 /uv /uvx /bin/
```

今回このコンテナをビルドすると
```
$ docker compose up --build

 => ERROR [app 6/6] RUN . $HOME/.bashrc && uv sync                                                                                0.2s
------                                                                                                                                 
 > [app 6/6] RUN . $HOME/.bashrc && uv sync:
0.121 /bin/sh: 21: .: cannot open /root/.cargo/env: No such file
------
failed to solve: process "/bin/sh -c . $HOME/.bashrc && uv sync" did not complete successfully: exit code: 2
```
となりました。

以前のリポジトリでは問題なく使用できていることから、`uv`のインストール先について何かしらの変更が加えられている可能性がありました。

するとこのようなPRが見つかりました。

https://github.com/astral-sh/uv/pull/8420

このIssueは、`uv`のインストール先を`.cargo/env`から`.local/bin`に変更されたということが書かれています。これは、`uv`がRustで使用されていた背景があり、インストール先も`.cargo/env`配下になっていました。しかしこのPRではXDGに準拠するためにインストール先を変更したと記述されています。では、このXDGとはなんでしょうか？

# 解決策
この問題を解決するには、以下のようにDockerfileを修正してください。

```Dockerfile
# 修正後のDockerfile
FROM python:3.12-slim-bookworm

RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates

ADD https://astral.sh/uv/install.sh /uv-installer.sh

RUN sh /uv-installer.sh && rm /uv-installer.sh

# PATHに.local/binを追加
ENV PATH="/root/.local/bin:$PATH"

COPY --from=ghcr.io/astral-sh/uv:0.6.10 /uv /uvx /bin/
```

# XDGとは
> Various specifications specify files and file formats. This specification defines where these files should be looked for by defining one or more base directories relative to which files should be located.

*XDG Base Directory Specification ~Introduction~[^1]*

XDGは、様々な仕様でファイルやファイル形式が指定されている中で、ファイルの配置場所の基準として定義されたものです。`dotfile`など、設定ファイルとかデータなどの保存場所がアプリケーション毎にバラバラだと、`$home`などディレクトリが汚染されてしまいます。今回の環境変数については、このXDGに準拠するために変更されたものです。

https://github.com/astral-sh/uv/pull/2236#issue-2171078128

この話のきっかけとしては、ユーザがRustを使用していないために`.cargo`ではない別の空間に保存する必要があるということで始まりました。使用しているマシンによって異なるディレクトリを指定すると混乱を生じさせるため、変更が行われました。


# まとめ
以上より、`uv`における環境変数のインストール先の変更が行われました。`uv`がCargoを起源としているからこその今回の問題の発生原因だったのかなと思います。

[^1]:[XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/#introduction)
情報セキュリティマネジメント試験受験体験記

## はじめに
この度、昨年12月に受験したIPA主催の「情報セキュリティマネジメント試験」に合格することができました🎉
受験情報やナレッジを共有したいと思い、本記事を執筆しました。
今後、同試験を受験される方の参考になれば嬉しいです。

※以下記事は2024年12月に受験した際の情報となりますので、受験する際はIPA公式の最新情報を参照してください。
## 受験の動機
業務の中でZAPというテストツールを用いたセキュリティテストを実施しました。
しかし、セキュリティやネットワークの知識が乏しかったためにZAPを使いこなせず、テストを適切に実施できているかどうかが分からない状態になり苦労しました。
そのため、セキュリティに関する技術的知識を増やしたいと考え、情報セキュリティマネジメント試験を受験しました。
## 試験の概要
簡単にまとめるとIPA主催「情報処理技術者試験」のセキュリティ分野の基礎的内容に特化した試験です。
エンジニアに限らず経営・マネジメント部門の方にも推奨されている試験です。
試験の位置づけは下図のようになっています。
難易度は、私の感覚では基本情報技術者試験より少し簡単だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043396/2ae43c56-aa16-4456-9a1f-67eac4010d7a.png)

## 試験準備
大体１カ月半前くらいから試験準備をスタートしました。
教材は以下の参考書を使用しました。
>「情報処理教科書 出るとこだけ！情報セキュリティマネジメント テキスト＆問題集［科目A］［科目B］2024年版」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043396/f7ce431f-321b-40a2-a998-132ffb55d821.png)


同試験の参考書の中で一番売れている書籍のようです。
頻出問題を解くための背景知識が十分に網羅されており、これで十分だと思います。
最も推せるのが過去問のwebアプリを利用することが出来る点で、わざわざ他の過去問題集を購入したり、IPAのHPから過去問をダウンロードする必要がありません。
## 試験対策のポイント
科目Aと科目Bがありますが、どちらも多肢選択式なのでそれぞれ別の対策が必要という訳ではないと思いました。
学習の目標としては、基準点600点以上（1000点満点）が合格基準のため、全体の得点率が70%以上になるように学習を進めていくと無理が無くちょうど良いと思います。

試験範囲を大きなカテゴリーで分類すると以下の３つになると思います。

１．セキュリティの技術的知識（サイバー攻撃手法、暗号と認証など）
２．セキュリティの運用知識（セキュリティ管理・対策、関連法規など）
３．セキュリティ以外の基本的技術知識

3のようにセキュリティ以外も試験範囲に含まれますが、これは比較的問題が簡単です。
>例）ドメイン名をもとに通信相手のIPアドレスを問いあわせる仕組みはどれか。　（答）DNS

そのため、3の範囲は試験準備の最初か最後にまとめて学習して、1,2の学習に重点を置くと良いと思います。
### 1.セキュリティの技術的知識（サイバー攻撃手法、暗号と認証など）について
「サイバー攻撃手法」は単純な１対１対応の知識が問われやすいため、サイバー攻撃手法の名称と対応する説明を暗記することで得点源にすることができます。

「暗号と認証」は明らかに試験範囲の中で最も理解に時間が掛かる分野です。
共通鍵暗号方式と公開鍵暗号方式の違い、デジタル署名、PKIの仕組みの理解が問われるため、時間を掛けて学習する必要があります。
>例）暗号化と複合で同じ鍵を使用する暗号方式はどれか　（答）AES

逆にいえば、ここの問題が解ければ合格できると思います。
### 2.セキュリティの運用知識（セキュリティ管理・対策、関連法規など）について
「セキュリティ管理」は学習内容が想像しにくいのですが、セキュリティの質を担保するための決まり事を覚えるイメージだと思います。
あまり面白くないかもしれませんが、単純な暗記で得点源になりえます。
>例）JIS Q 31000:2019(リスクマネジメント-指針）におけるリスクアセスメントを校正するプロセスの組み合わせはどれか。（答）リスク特定、リスク分析、リスク評価

「セキュリティ対策」、「関連法規」についても1対1対応の知識が問われやすいため、単純な暗記で対応が可能です。
>例）ウイルス検出におけるビヘイビア法に分類されるものはどれか。（答）検査対象をメモリ上の仮想環境で実行して、その挙動を監視する。

## 受験の手ごたえと結果
試験はCBT形式のため事前に指定した試験会場に行き、PCで受験をします。
実際の試験は過去問よりも難しいと感じました。
恐らく最新の技術的知識が問題に盛り込まれており、知らない用語なども問題文の中にありました。
そのため、本番で焦らないように頻出問題を確実に正解するための問題演習は必須です。
最終結果としては、総合評価点710点で合格に至りました。
## 総括
試験対策で学んだ内容が試験だけでなく、実務の中では特に環境構築に役立ちました。
学んだ知識をすぐに実務に活かせたことで自分の成長を実感でき、非常に嬉しかったです。
読者の方には、本記事を参考にされて無難に合格して頂ければ幸いです。
【初投稿】アウトプットの習慣を身につけるためにQiitaに挑戦

## はじめに

4月からエンジニアとして働き始めます。
これまでの学習はインプットが中心でしたが、学んだことを言語化することで理解を深めたいと考えています。
そのため、Qiitaを活用してアウトプットの習慣を身につけることにしました。
今回は決意を込めて、初投稿に踏み切りました！

## やりたいこと

以下のような内容を中心に発信していこうと考えています。
- 学んだことを自分なりの言葉で噛み砕いて説明する
- 自学習中に詰まったポイントを共有する
- エラーの解決方法をまとめる

## 最後に
毎週末の投稿を習慣化することを目標にしています。
最初は備忘録的な内容が中心になるかもしれませんが、いずれは「この記事が役に立った！」と言ってもらえるような情報を発信できるように頑張ります！
Cursorを使ってOSSのドキュメントを効率よく翻訳する方法

## はじめに

OSSのドキュメントや技術記事を日本語に翻訳する作業は、意義のある活動である一方、時間と労力がかかります。  
私は現在、[Web Almanac](https://almanac.httparchive.org/ja/)の翻訳に参加していますが、その中で出会った最強の翻訳効率化ツールが「[Cursor](https://www.cursor.sh/)」です。

この記事では、Cursorを活用して英語から日本語へ効率的に翻訳を進める方法を紹介します。  
OSSの翻訳をよりスムーズにしたい方の参考になれば嬉しいです。

---

## 対象読者

- OSSプロジェクトの翻訳をしている、またはこれから関わりたいと思っている方  
- 英文ドキュメントの翻訳効率を上げたい方  
- Cursorを使ってみたいが、使い方にピンときていない方  

---

## Cursorとは？

> Cursorは、AIを活用してコーディング支援やドキュメント作成ができる、開発者向けのエディタです。  
> ChatGPTの力を使って、驚くほど自然な翻訳や提案が可能です。

---

## Cursorで翻訳する流れ

Cursorを使って翻訳する際の具体的な手順は以下の通りです。

### 1. Editモードにしておく

まず、Cursorを**Editモード**に設定します。これにより、AIとのインタラクションが編集対象のコードや文章に対して直接行えるようになります。

### 2. 翻訳用のNotepadを指定しておく

CursorにはAIとのやりとりを管理する「Notepad」機能があります。翻訳用に専用のNotepadを作っておくと、作業がスムーズに進みます。

<details><summary>私が使ってるWebAlmanac用Notepad</summary>

```text
# 翻訳プロジェクトルール 📝

## 基本ルール 🎯
- MarkdownとHTMLはそのまま表示
- "Web Almanac"と"HTTP Archive"はそのまま表示
- 斜体はアンダーバー2つ（例：[_Push API_]）

## 翻訳作業ルール 📋
1. 選択箇所の翻訳を行う
2. 翻訳結果を提示する
3. 翻訳前後で行数が変わっていないことを確認
4. 確認を待つ

※ 最初の指示は、作業が完了するまで覚えておく
※ 翻訳結果は必ず編集ツールを使用して反映する
※ 翻訳結果の提示は、編集ツールの出力結果を表示する

## 日本語表現ルール 🇯🇵
- 数字は漢数字ではなく算用数字を使用（1つ、2つ）
- 以下の表現を統一：
  - "することができます" → "できます"
  - "最も" → "もっとも"
  - "例えば" → "たとえば"
  - "従って" → "したがって"
  - "特に" → "とくに"
  - "お勧め" → "オススメ"
- 1文（句点で終わる）の読点は3つまで

## リンクルール 🔗
- リンク先が存在するか確認
- セクションへのリンクは翻訳が必要
- mozilla, wikipediaは日本語ページがあればURLを変更

## 品質管理 🔍
- lintエラーがないことを確認
- 翻訳前後で行数が変わっていないことを確認
```
</details>

### 3. 翻訳したい箇所を選択

MarkdownやHTMLなどの翻訳したい英文を**範囲選択**します。

### 4. Cmd + i でAIペインに移動

翻訳したい箇所を選択した状態で `Cmd + i` を押すと、AIペインに移動します。

そして、「選択箇所を翻訳、修正して」と入力。
※Raycastにスニペットを登録してます。動画では"! +t"をスニペット登録してる

※参考
<iframe width="560" height="315" src="https://www.youtube.com/embed/EcILOfcpLMQ?si=nLE2uJ1iFUIYvtnu" 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>


---

## 実際にやっていること：Web Almanacの翻訳

現在、私はWeb Almanacの翻訳に取り組んでおり、以下のような方を募集中です：

- 一緒に翻訳してみたい方  
- 技術ドキュメント翻訳に興味がある方  
- 英語に自信はないけど翻訳スキルを伸ばしたい方

誰でも参加歓迎です。気軽にコメントや連絡ください！

---

## おわりに

翻訳作業は根気が必要ですが、Cursorのようなツールを使えば、時間短縮や品質向上につながります。  
OSSの世界をもっと日本語でわかりやすくしていく仲間が増えたら嬉しいです！
AITRIOS Console Developer Editionでの推論結果をPCに表示するプログラム


## 0. はじめに
このプログラムは、AITRIOS Console Developer Editionに接続されているデバイスからの推論結果を取得したり、推論の開始と停止をしたり、推論の結果をビジュアルに表示する機能を提供します。

AITRIOS Console Developer Editionでも操作できる機能ばかりですが、日常作業するには、画面遷移が多く色々と煩わしく感じることも多いので、よく使う機能に絞り、視認性と操作性重視で作ってみましたので、共有いたします。

このプログラムは、Macで開発していますが、WindowsでもRaspberry Piでも動作するように意識して作りましたので、多くの方にお使いいただけると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314541/4f516ed8-8333-469a-b3c2-9f0249766f99.png)

下記のOSで稼働確認していますが、システムにより見た目が多少異なります。
MacOS(Sequoia) Python 3.13.2
Raspberry Pi OS (Bookworm) Python 3.11.2
Windows 11 Python 3.13.2

AITRIOS Console APIを使用していますので、Projectの管理者からClient_IDとSecretを入手しておいてください。

GitHubからコードを入手していただけますので、Git Cloneできる環境設定をあらかじめお願いします。"gitのインストール"などで検索すると、Gitのインストール方法などが出てきますので、使えるようにしておいてください。

## 1. セットアップの手順
セットアップは至って簡単で、下記の通りです。不慣れな方の参考になればと思いますのでOS毎の手順の詳細も書いておきます。

1. リポジトリーをCloneする
2. Pythonの仮想環境をセットアップする
3. 必要なライブラリーをインストールする
4. 実行する

### 1-1. MacOS, Raspberry Piの場合

#### 1-1-1. ターミナルを開き、インストールしたいディレクトリーに移動しておき、次のコマンドで、コード一式をダウンロードする
`git clone https://github.com/TechMind428/KumaDT.git`

#### 1-1-2. 成功すると、KumaDTというディレクトリーができるので、そこへ移動し、pythonの仮想環境を構築して、仮想環境に入る
`cd KumaDT`
`python3 -m venv myenv`    
`. myenv/bin/activate`
#### 1-1-3. 実行に必要なライブラリーをインストールする
`pip install -r requirements.txt`
#### 1-1-4. 実行する
`python3 main.py`

### 1-2. Windowsの場合

#### 1-2-1. Poweshellを開き、インストールしたいディレクトリーに移動しておき、次のコマンドで、コード一式をダウンロードする
`git clone https://github.com/TechMind428/KumaDT.git`
#### 1-2-2. 成功すると、KumaDTというディレクトリーができるので、そこへ移動し、pythonの仮想環境を構築して、仮想環境に入る
`cd KumaDT`
`python -m venv myenv`    
`myenv/Scripts/activate`
#### 1-2-3. 実行に必要なライブラリーをインストールする
`pip install -r requirements.txt`
#### 1-2-4. 実行する
`python main.py`

## 2. 画面と使用手順について
画面は、OSによって若干レイアウトが変わってしまいますが、概ね同じように表示されます。またシンプルな作りになっていますので、迷うところはないかと思います。

### 2-1. 初期画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314541/0169b111-ca94-48a1-81b6-8f0a9493ba68.png)

最初に起動すると、デバイスIDやクライアントIDなどが正しくないため、設定タブへ移動して設定を行いましょう。

### 2-2. 設定タブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314541/7d8665f0-4983-4466-b389-b82071a3b466.png)

デバイスIDは、カメラ本体の裏側に記載されています。クライアントIDとシークレットは、プロジェクトの管理者から入手してください。

### 2-3. コマンドパラメーター設定タブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314541/6858c84e-edd7-4be9-8c8d-a43ff113ea0b.png)

この画面の設定では、デバイスにBindされているコマンドパラメーターを直接編集してしまいます。同じコマンドパラメーターファイルを共用しているデバイスのここでの変更によって影響されますので、あらかじめデバイス専用のコマンドパラメーターファルにして、Bindしておくようにしてください。（その作業は砂場のConsoleでしていただく必要があります）

### 2-4. メイン画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314541/2c0ec82a-3153-4f02-a49b-589a56fa02d3.png)

以上となります。皆さんのAITRIOS関連アクティビティーのご参考になれば幸いです。
Laravelで環境ごとに遷移先URLを切り替える方法

Laravelアプリケーションでは、本番環境とそれ以外の環境で異なる遷移先URLを設定したい場合があります。この記事では、env() を変更せずに、config/app.php に設定を追加し、環境に応じたURLを切り替える方法を紹介します。

## 遷移先URLを環境ごとに設定する方法
まず、config/app.php に遷移先URLを設定します。APP_ENV をチェックして、環境に応じて異なるURLを指定します。

config/app.php に次のコードを追加します

```app.php

return [
    // その他の設定

    'admin_url' => env('APP_ENV') === 'production'
        ? "https://production/adm" //本番環境用のURL
        : "https://develop/adm",　　//検証環境用のURL
];
```

このコードでは、`.env`ファイルの`APP_ENV` が `production` の場合に本番用のURLを設定し、それ以外の環境では開発用のURLを設定しています。

`env()` を使うことで、`APP_ENV` が `production` かどうかを判定しています。

## Bladeテンプレートでの使用方法

`config/app.php` で設定した遷移先URLは、Bladeテンプレートで簡単に利用できます。以下のコードで、遷移先URLをリンクに使用できます。

``` blade.php
<a href="{{ config('app.admin_url') }}">管理画面へ</a>
```

これにより、`APP_ENV` の設定に応じて、以下のURLに遷移するリンクが作成されます。

本番環境: `https://production/adm`

開発環境: `https://develop/adm`

## まとめ
 Laravelでは、`config/app.php` に環境ごとの設定を追加することで、環境に応じた遷移先URLを簡単に切り替えることができます。
XServer に React + TypeScript プロジェクトを公開する際の注意点

# はじめに

React（+ TypeScript）で構築した Web アプリを XServer 上に公開しようとした際、いくつかの制限や注意点に直面しました。

この記事では、実際のデプロイ経験をもとに「XServer 環境で React アプリを公開する際の注意点」と「その対処方法」についてまとめています。

# 想定構成

- フロントエンド：React + TypeScript
- フレームワーク：Next.js（App Router + `output: 'export'` による静的エクスポート）
- ホスティング：XServer（スタンダードプラン）
- デプロイ方法：ビルド済み HTML ファイルを FTP でアップロード

# XServer特有の注意点・落とし穴

### 1. 動的ルーティングが利用できない

```
/XXXXX/[id] → /XXXXX/123 → 404 エラー
```

XServer はサーバー側でのルーティング処理に対応していないため、ビルド時に生成されていない URL にアクセスすると 404 になります。

### 解決策

- Next.js の `generateStaticParams()` を利用して、必要なルートをすべて静的に生成する
- ビルド後に `/XXXXX/id/index.html` のような構成に変換するスクリプトを実行する

## 2. 投稿データの変更が即時反映されない

ヘッドレス CMS（例：WordPress）から取得しているデータが更新されても、`out/` 以下の HTML は自動で更新されません。

### 解決策

- 投稿のたびに再ビルドを行い、`out/` ディレクトリを再アップロードする
- Webhook + GitHub Actions を利用し、自動でビルド・デプロイを行う仕組みを構築する

## 3. URL 末尾のスラッシュによる表示エラー

URL の末尾にスラッシュがあると、ページが正しく表示されない場合があります。

### 解決策

- `next.config.js` に `trailingSlash: true` を設定する
- もしくは、ビルド後にファイル名を `index.html` に変換するスクリプトを使用する

## 4. HTTPS リダイレクトが効かない

XServerのデフォルト設定では、HTTP アクセスを HTTPS に自動リダイレクトしてくれない場合があります。
そのため、ユーザーが http:// でアクセスすると、セキュリティ上問題があるページとして表示されることがあります。

### 解決策

`.htaccess` に以下のリダイレクト設定を追加することで、HTTP アクセスを HTTPS に強制できます。

```apache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
```

## さいごに

XServerは低コストかつ信頼性の高い共有レンタルサーバーですが、サーバーサイドでの動的処理が行えないため、React や Next.js といったモダンな構成を運用するには注意が必要です。

しかし、以下のような工夫を取り入れることで、十分に安定した運用が可能です。

- 動的ルーティングへの対応（事前ビルド・ルート変換）
- 投稿更新に対応する自動ビルド・自動デプロイの仕組み作り
- HTTPS 対応や URL 最適化のための `.htaccess` 設定

これから XServer 上で React / Next.js を運用しようと考えている方の参考になれば幸いです。
【初心者向け】タイピング能力を向上させるために何をすればいいのか？

## はじめに
今年の4月からエンジニアとして就職することになったのですが，タイピング速度が遅すぎると感じました．トレーニングを実施する前のタイピング速度としては，日本語のタイピングサイトとして一番有名ともいえるe-Typingで280くらいでした．特段早くも遅くもないスコアだと思いますが，なにせコードを書くのが遅い！と感じていました．自分の周りの学生で「すごいな～」と感じる人は，もれなくコードを書く速度がめちゃ早いです．「タイピング練習よりもやることがあるだろ！」と感じる方も多いと思いますが，何か一つでも彼らに追いつきたいと感じ，タイピングスキルを磨くことを思い立ちました．

## 方法
以下の2つの記事を参考に，「typing.io」と「UnTyping」というエンジニア向けタイピングサイトを毎日行うようにしました．

https://sitest.jp/blog/?p=2332

https://qiita.com/renesisu727/items/2eddd4f0eec80e3d5815

## 一度目のチャレンジ
上記の2つのサイトを一度試してみました．その結果，typing.ioでは「34」，UnTypingでは「3950」という結果でした．この結果を受けて，1か月後のスコア目標を以下に設定しました．自分がギリギリ達成できそうなラインで，少し厳しめに設定しました．また，言語としてはJavaを選択しました．
- typing.io(Java)：50
- UnTyping(Java)：6000

## 最終結果
最終日の結果は以下の通りです．
- typing.io(Java)：56
![スクリーンショット 2025-02-19 001008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972978/8b0a98aa-f216-45b8-8469-2c73c0eebda4.png)

見事，目標をクリアしました．最後の方は，自分でもかなり速くタイピングできていることに自覚し，「タイピング楽しすぎる！！」となっていました．

- UnTyping(Java)：5870
![スクリーンショット 2025-03-30 161754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972978/2bf9d13c-72cf-41b4-a100-f23e6f0cb3c1.png)

こちらはギリギリ目標を達成できませんでした．一行ずつコードが出てくる点・全体だけでなく一行タイピングにも制限時間がある点で焦りを感じてしまい，途中から点数が伸び悩んでしまいました．

## 最後に
まずは，1か月間タイピングし続けたことに自信がつきました．立てた目標は一部達成という形でしたが，明らかに最初に比べてタイピング速度が向上したことは嬉しいです．ただ，正直，日常生活で自分のタイピングが早くなっている気はあまりしません．なので，もっと上達する必要があるとは思いますが，エンジニアとして働く上で最低限のタイピングスキルを身に付けられたのではないかと思っています．働いていく上では，こういったスキルの上達の積み重ねの先に自分の理想像があるのだと感じました．
LaravelでEnumの多言語対応を実現する方法

Laravel では、翻訳機能を使って多言語対応が可能です。
`Trait/EnumDescription.php` を使うことで、Enum の値に応じた翻訳を簡単に取得できるようになります。
さらに、引数を指定することで、言語の切り替えも可能になります。

### 環境の準備（Laravel の言語設定）
```config/app.php
'locale' => 'ja', // デフォルトの言語
```

`Enum Discription`トレイトでは、言語が指定されていない場合はこの設定を使用 します。

### `Trait/EnumDescription.php`の作成
翻訳を取得するためのトレイトを作成します。

```Trait/EnumDescription.php
<?php

declare(strict_types=1);

namespace App\Trait;

trait EnumDescription
{
    public function description(): string
    {
        return __(sprintf('enums.%s.%s', self::class, $this->name));
    }
}
```

また、英語表記にしたいEnum用のファイル UseEngEnum 用のトレイトも作成します。

```Trait/UseEngEnumDescription.php
<?php

declare(strict_types=1);

namespace App\Trait;

trait UseEngEnumDescription
{
    public function description(string $lang): string
    {
        return __(sprintf('enums.%s.%s', self::class, $this->name), [], $lang);
    }
}
```

### 翻訳ファイルの作成

次に、Enum の翻訳を定義します。
`lang/ja/enums.php`（日本語）
```lang/ja/enums.php
<?php

return [
    \App\Enums\Fruit::class => [
        'Apple' => 'りんご',
        'Banana' => 'バナナ',
        'Orange' => 'オレンジ',
    ],
];
```

`lang/en/enums.php`（英語）
```lang/en/enums.php
<?php

return [
    \App\Enums\Fruit::class => [
        'Apple' => 'apple',
        'Banana' => 'banana',
        'Orange' => 'orange',
    ],
];
```

### Enum に EnumDescription を適用
```app/Enums/Fruit.php

<?php

declare(strict_types=1);

namespace App\Enums;

use App\Trait\UseEngEnumDescription; //英語用のEnumDescription を適用

enum Fruit: int
{
    use UseEngEnumDescription; //英語用のEnumDescription を適用

    case Apple = 10;
    case Banana = 20;
    case Orange = 30;
}
```

### 言語切り替えの使用例
```php

// デフォルト言語（config/app.php の locale に基づく）
echo Fruit::Apple->description(); // 例: 'りんご'

// 明示的に英語を指定
echo Fruit::Apple->description('en'); // 'apple'

// 明示的に日本語を指定
echo Fruit::Apple->description('ja'); // 'りんご'
```
引数を指定することで、言語を切り替えることができます

### まとめ
- EnumDescription を使えば、Enum の翻訳を簡単に管理 できる
- config/app.php の locale をデフォルト言語として使用
- lang/ja/enums.php / lang/en/enums.php に翻訳を定義
- description('en') で英語、description('ja') で日本語を取得可能
【vercel】Next.jsのデプロイがうまくいかなかった時の話(Error: Cannot find module '/vercel/path0/node_modules/.pnpm/bcrypt)

## エラー内容
Next.jsの公式チュートリアルの第6章のデプロイ時にエラーが起きました
```
[Error: Cannot find module '/vercel/path0/node_modules/.pnpm/bcrypt@5.1.1/node_modules/bcrypt/lib/binding/napi-v3/bcrypt_lib.node'
> Build error occurred
[Error: Failed to collect page data for /seed] { type: 'Error' }
 ELIFECYCLE  Command failed with exit code 1.
Error: Command "pnpm run build" exited with 1
```

## 原因
bcryptと現在の環境の互換性がなかったため

## 修正内容
### app/seed/route.tsの修正
```diff:app/seed/route.ts
- import bcrypt from 'bcrypt';
+ import bcrypt from 'bcryptjs';
```

### package.jsonの修正
```diff:package.json
- "bcrypt": "^5.1.1",
+ "bcryptjs": "^3.0.2",
```

### pnpm-lock.yamlの更新
```
pnpm i --lockfile-only
```

## まとめ
bcryptと現在の環境の互換性がなかったため、bcryptjsに変更しました。`package.json`の依存関係を更新し、`pnpm-lock.yaml`を再生成することで問題を解決しました。
ABC399の振り返り

AJL2024winterアルゴ部門対象最後のコンテストでした
## [A問題](https://atcoder.jp/contests/abc399/tasks/abc399_a)(diff:9) ##
やるだけ
$S$ と $T$ で一致しないところを数えれば良いです。
計算量は $O(N)$ です。
ACコード(pypy57ms,C++1ms)
```python
N, S, T = int(input()), input(), input()
cnt = 0
for i in range(N):
  if S[i] != T[i]:
    cnt += 1
print(cnt)
```
AC時間:1:19
## [B問題](https://atcoder.jp/contests/abc399/tasks/abc399_b)(diff:41) ##
シュミレーションでゴリ押し
降順ソート→順位を1から順につけていく→出力という感じです。
計算量はソートがボトルネックになり $O(NlogN)$ です。
ACコード(1ms)
```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  int N;
  cin >> N;
  vector<pair<int, int>> P(N);
  for(int i = 0; i < N; i++) {
    cin >> P[i].first;
    P[i].second = i;
  }
  sort(P.begin(), P.end(), [](pair<int, int> a, pair<int, int> b) { return a > b; });
  vector<int> ans(N, 0);
  int cnt = 1, rank = 0, now = 0;
  for(int i = 0; i < N; i++) {
    while(P[i].first == now && i < N) {
      ans[P[i].second] = rank, i++;
      cnt++;
    }
    if(i == N) {
      break;
    }
    now = P[i].first, rank += cnt, cnt = 1, ans[P[i].second] = rank;
  }
  for(int i = 0; i < N; i++) {
    cout << ans[i] << endl;
  }
}
```
AC時間:17:27
## [C問題](https://atcoder.jp/contests/abc399/tasks/abc399_c)(diff:321) ##
DSUで殴る!
ある連結な2点を結ぶ辺を追加した時、閉路ができます。
なので、辺を順に見ていき、端点同士が連結であれば辺を追加しない(辺を削除する)ことにします。
計算量は辺を順に見ていくので $O(M \alpha(N))$ となります。
ACコード(順に75ms,73ms)
```c++
//自作UnionFind
#include <bits/stdc++.h>
using namespace std;
struct UnionFind {
  vector<int> par;
  
  UnionFind(int N) {
    par.assign(N + 1, 0);
  }
  
  int root(int x) {
    if(par[x] == 0) {
      return x;
    }
    return par[x] = root(par[x]);
  }
  
  int unite(int x, int y) {
    int rx = root(x), ry = root(y);
    if(rx != ry) {
      par[rx] = ry;
    }
    return ry;
  }
  
  bool same(int x, int y) {
    return root(x) == root(y);
  }
};
//library end

int main() {
  int N, M, ans = 0;
  cin >> N >> M;
  UnionFind G(N);
  for(int i = 0; i < M; i++) {
    int u, v;
    cin >> u >> v;
    if(G.same(u, v)) {
      ans++;
    }
    else {
      G.unite(u, v);
    }
  }
  cout << ans << endl;
}
```
```c++
//ACL
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
//library end

int main() {
  int N, M, ans = 0;
  cin >> N >> M;
  atcoder::dsu G(N);
  for(int i = 0; i < M; i++) {
    int u, v;
    cin >> u >> v, u--, v--;
    if(G.same(u, v)) {
      ans++;
    }
    else {
      G.merge(u, v);
    }
  }
  cout << ans << endl;
}
```
AC時間:25:06
## [D問題](https://atcoder.jp/contests/abc399/tasks/abc399_d)(diff:964) ##
色々考えすぎてACできませんでした
数え上げは上界一応考えておくと良いと思います。
## 感想 ##
ちょっとレートが下がりました(パフォ619,レート687)
来週からはAJLsummerが始まるので頑張りたいです。
【備忘録】線形回帰の基本について

# 1. はじめに
　データ分析、機械学習の領域において、最も基本的でありながら強力な手法の一つが「線形回帰」です。ビジネスの現場から研究開発まで、幅広い分野で活用されていますよね。今回は線形回帰の基本的な概念から、その背後にある数学的原理、そして実際の実装方法までをまとめてみようと思います。

 # 2. そもそも線形回帰とは何か？
　線形回帰とは、一つまたは複数の説明変数（特徴量）と、一つの目的変数（予測したい値）の間に存在する線形の関係性をモデル化する手法です。簡単に言えば、「入力（X）が変わると、出力（Y）が比例してどのように変化するか」を数式で表現しようとするものです。
例えば、
・家の広さ（説明変数）と 家の価格（目的変数）の関係
・広告の出稿量（説明変数）と 商品の売上（目的変数）の関係
・気温（説明変数）と アイスクリームの売上（目的変数）の関係
などを線形回帰で分析することができます。

# 3. 線形回帰のモデル
 最もシンプルな単回帰モデルは、以下の式で表されます。
```math
y=ax+b
```
ここで、
・y: 目的変数
・x: 説明変数
・a: 回帰係数（傾き）：説明変数が1単位変化したときの目的変数の変化量
・b: 切片：説明変数が0のときの目的変数の値

複数の説明変数がある場合は、重回帰モデルとなり、以下のようになります。
```math
y=a1​x1​+a2​x2​+⋯+an​xn​+b
```
ここで、x1​,x2​,…,xn​ は説明変数、a1​,a2​,…,an​ はそれぞれの回帰係数です。

# 4. 線形回帰のアルゴリズムの考え方
　線形回帰の目的は、与えられたデータ（説明変数と目的変数の組）に基づいて、最もデータに適合する線形モデル（上記の数式における a や b）を見つけることです。この「最も適合する」という基準を求めるにはいくつか方法がありますが、一般的に用いられているのが「最小二乗法」です。

 ### ・最小二乗法について
　最小二乗法は、実際の目的変数の値と、線形モデルによって予測された値との差（残差）の二乗和を最小にするように、回帰係数と切片を決定する方法です。残差を二乗することで、正の誤差と負の誤差を同等に扱うことができます。
 
数式で表すと、以下の残差二乗和 S を最小化する a と b を求めます。
```math
S = \sum_{i=1}^{n} (y_i - (ax_i + b))^2
```

具体的にaとbは以下の式で求めます。
```math
a =  \frac{σ_{xy}}{σ_{xx}^2}=\frac{\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^{n} (x_i - \bar{x})^2} 
```

```math
b = \bar{y} - a\bar{x}
```
ここで$\mathrm{σ_{xy}}$はxとｙの共分散、$\mathrm{σ_{xx}}$はxの分散です。

# 5. 単回帰分析のプログラム
実際にPythonを使用して、単回帰分析の処理を実装して動かしてみます。
 
```python
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータ
data_x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
data_y = np.array([2, 3.5, 5, 6, 5, 7, 6.5, 8, 7.5, 8])

# 単回帰分析処理
def linear_regression(x, y):
    x_mean = np.mean(x)
    y_mean = np.mean(y)

    numerator = np.sum((x - x_mean) * (y - y_mean))
    denominator = np.sum((x - x_mean) ** 2)

    a = numerator / denominator
    b = y_mean - a * x_mean

    return a, b

# 回帰係数と切片の計算
a, b = linear_regression(data_x, data_y)

# サンプルデータと回帰直線をグラフへ描写
x = np.arange(0, 11, 1)
y = a * x + b

print(f"a = {a},b={b}")
fig = plt.figure()
ax = fig.subplots()

ax.set_title('Linear Regression')
ax.set_xlabel('x')
ax.set_ylabel('y')

ax.scatter(data_x, data_y, label='Sample Data')
ax.plot(x, y, label='Regression line', color='red')
ax.legend()
plt.show()
```

以下のような出力結果となります。
青い点がサンプルデータ
赤い線はそのサンプルデータから導き出した回帰直線です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734018/8dd065ce-2127-4cf4-87d0-a12b73646879.png)

# 6. まとめ
　線形回帰は、データ分析の基礎であり、多くの応用を持つ重要な手法です。今回は基本的な理論の説明と実際のアルゴリズムについてまとめました。scikit-learn などのライブラリを利用すれば、比較的容易に実装できるため、ぜひ試してみてください。最後までお読みいただきありがとうございました。
Qiita始めました!

Qiita始めました!
．始めたきっかけ
自分は、子供の頃から、ホームページを趣味で作っています。
パソコンで、ノーコードサービス(wix)なので、作っていましたが、カスタマイズできなかったのが、悔しかったので
カスタマイズできるサービスに移転し、心機一転頑張りました!
しかし、HTMLが大変難しく
悩んでいました!
そして、cssやJavascriptのこともテキストを買ったりしました。
しかし、昨日、qiitaというサービスがあることを、人伝で聞き、便利なサービスは使うしかないよねと想いました。
そして、今日始めました!
．頑張りたいこと
役立つ情報を投稿する。

これから、qiitaを頑張ります!
さようなら
個人開発用の設計管理アプリを作ってみた！（ポエム）

# 個人開発用の設計管理アプリの開発（ポエム）

タイトルにある通り、自身の設計などを管理するアプリを作ってみました！

## 発端
最近、知識が増えて色々なアプリが作れるようになってきました。Rust・線形代数などを勉強し始めたこともあり知識の幅が広がった気がします。
そこで、さまざまな技術を組み合わせたアプリケーションを開発する時に、何のコードをどこに書くか・この処理はどこでするかなど、コードを書きながら考えているせいで、開発効率が下がっている気がします。
ほとんどのプロジェクトでは「設計」なんていうものをしていらっしゃるようなので、そこのところを学び開発効率の向上に繋げたいと思いました。


ただ、私はコードを書こうと思っても設計をしようとはあまり思いませんでした。
そこでモチベ向上も狙ってカッコいい設計管理ツールを作って行こうと思います。

## 何をしたいか
「自分の取り組んでいるプロジェクト(アプリ作成など)の要件・設計などを、まとめて、スマホのブラウザでもさっとそれを見て編集することができる。」

## 技術選定
Next.jsを使います。ちょっとメジャーすぎて面白くない気もしますが、何回か使ったことがあるのでこれで行きます。
cssフレームワークはtailwind cssを使います。
自分で書いた設計などの文章はGit管理にします。

## 大体の構成
Next.jsのAPI作成機能でGitHubのREST APIをラップし、それにアクセスするフロントエンドアプリケーション。

## 完成
できました。
Vercelを使ってデプロイし、独自ドメインで公開しています。

https://dev.aoristos.net

ちなみに一番大変だったのは、Tailwindを使ったダークモードの実装です。

## おまけ
GitHubのレポジトリに設計などを貯めておくのは、結構いいですよ。（唐突）
今はWeb版のVScodeで編集・commitしていますが、このアプリで編集もできるようにしたいです。

GitHub直接見ればいいじゃないかとは言わないでください。
[GitHub]GitHubの初回Pushまでの手順

# GitHubの初回Push
なんとなくでしていたGitHub操作について、今回改めて初回Pushまでの流れを記述します。

## リポジトリ作成から初回 push までの手順
### 1️⃣GitHub 上でリポジトリを作成する
GitHub にログインし、リポジトリタブの「New」を選択
1. Repository name にプロジェクト名を入力
1. Descriptionはそのリポジトリの用途説明
1. PublicかPrivateかで公開・非公開を設定

問題なければCreate repositoryをタップしてリポジトリの作成が完了

![Create a new repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789173/4ea7002a-d292-4bce-b7aa-85c26977679b.png)

### 2️⃣ターミナルでローカルプロジェクトの初期化
cdで対象ディレクトリに移動
ターミナルでプロジェクトのディレクトリに移動し、cdファイルパスを実行。

```bash
cd <対象ディレクトリ>
```

Gitを初期化

```bash
git init
```

GitHub のリモートリポジトリを登録

```bash
git remote add origin <URLアドレス>
```

SSHは作成したリポジトリ画面に入り、Codeをタップすると表示されますのでコピペで実行します

![スクリーンショット 2025-03-30 15.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1789173/c78173e6-4143-478c-9853-63867c8d6021.png)

登録された内容を確認
```bash
 $ git remote -v
```
※originはレポジトリの名前でデフォルトとのこと

### 3️⃣ ファイルをステージングしてコミット
ステージング (すべてのファイルを追加)
```bash
git add .
```

初回コミット
```bash
git commit -m "コミットメッセージ"
```

### 4️⃣ リモートリポジトリにプッシュ
ブランチ名を変えたい場合の処理
ここは開発PJによってmainやmasterなど命名が異なると思うので、都度変更して対応する。

```bash
# デフォルトで"main" になっていることが多いが、異なる場合は変更
git branch -M "変更するブランチ名"
```

初回 push

```bash
# 初回だけ-uをつけて、次回以降は`git push`だけでOK
git push -u origin "ブランチ名"
```


### 5️⃣ 状態確認 (安全確認)
現在のローカルとリモートのブランチとコミット履歴を確認する。ここで問題なければ完了

ローカルブランチを確認
```bash
git branch
```

リモートブランチを確認
```bash
git branch -r
```

コミット履歴確認
```bash
git log
```

# まとめ
GitHubに初回Pushするまでの手順でした。
よく利用するGitコマンドも纏めていきたいです。
プログラミングで楽しいことしたい！！

私はJavaに挫折したことがあります。
でもJava自体に負けたんじゃなくて
その時は心理的要因によるものが原因で
ほんとは勉強続けたかったけど続けられなかった。
学習のテンポ早くて大変だったけど楽しかったけどあることがきっかけで続けられなくなってしまって安定してから他の仕事に就いた。
製造業だったけどそれも続かなくて3年で辞めた。で、C言語の独学を始めた。
Cをマスターすれば他言語の習得が楽になるって聞いたから。半年間頑張った。
環境構築もなんか説明しろって言われたらできないけどできたし、変数から配列から簡単なポインタまで出来たけど赤黒木やB木でポインタなついてけなくなった。
GUIアプリ作りたくてWindows APIの実装もやってみたけど訳わかんなくなっちゃって、一から学び直すことにした。
そしたら、Cは難しいからやめといた方がいいと言われた。
最初はムキになって無視していたけど3,4回言われたので潔く聞いた。

Rubyをえらんだ。理由は特にない。
ただCは諦めてないし、C使って楽しいことしたい。
Javaも諦めてない。Java使って楽しいこともしたい。でも今はRubyに手を出したから、Rubyで楽しいことをしたい！！！

でもどんな楽しいことができるかまだわからないので調べます☺️
SQLとJavaScriptとRustでメールによる認証を自力で実装してみた ①

# SQLとJavaScriptとRustでメールによる認証を自力で実装してみた ①

自由につかえるSQLを手に入れたので、ログイン機能を練習を兼ねて作ってみました。
最終的には認証機能を利用してチャットアプリを作成しようと思っています。
4部構成になっているので最後までお読みいただけると嬉しいです。

目次：
① 認証の流れを確認　←いまココ！
② [DB開発]()　→執筆中
③ [バックエンド開発]() →執筆中
④ [フロントエンド開発]() →執筆中

### 使用技術
- Solid.js　（軽量WebUIフレームワーク・GitHub Pagesにホスティング）
- actix-web （Rust製Webフレームワーク・shuttleでデプロイ）
- MariaDB　（データベース・Xserverでデプロイ）

### どんな仕様か？

Webサイト丸ごとについて認証を必要とするのではなく、（ブラウザが最初に行うGETリクエスト自体には制限は設けない）APIへのアクセスに認証を必要とします。

Solid.jsによるフロントエンドアプリケーションのロジックは全て公開することになるので、もしかしたらNext.jsなどでページ丸ごと認証を必要にした方がセキュリティーは上がるかもしれません。

認証はメールアドレスを用いて行います。

### データベースの構造

実際に使用したSQL文です。

```sql
/* 登録済みのユーザー */
CREATE TABLE users(
    name  CHAR(15) NOT NULL,  /* 名前 */
    id    CHAR(10) NOT NULL,  /* ユニークなID */
    token CHAR(30) NOT NULL,  /* 今ログインに使用できるトークン */
    pass  CHAR(30) NOT NULL,  /* パスワードのSHA256ハッシュ */
    
    last_login      DATE NOT NULL, /* 最後にログインした日時 */
    created_date    DATE NOT NULL, /* アカウント作成日時 */
    registered_date DATE NOT NULL, /* 登録日時 */
    updated_date    DATE NOT NULL, /* 更新日時 */
);

CREATE TABLE unregistered_users(
    name  CHAR(15) NOT NULL,  /* 名前 */
    id    CHAR(10) NOT NULL,  /* ユニークなID */
    pass  CHAR(30) NOT NULL,  /* パスワードのSHA256ハッシュ */
    temporary_token CHAR(30) NOT NULL, /* 一時トークン */
    
    created_date DATE NOT NULL, /* アカウント作成日時 */
)
```

:::note
ここでは、
最初に情報を入力することをアカウント作成
メールアドレスの認証が済んだことを登録と呼んでいます。
:::

### 作成・登録・ログイン・ログアウト・認証の流れ

#### 1、作成

クライアントサイド
1. ユーザーがメールアドレスと、自ら決めたパスワード・名前・IDを入力
2. クライアントサイドでパスワードのSHA256ハッシュを生成する
3. メールアドレス・パスワードのハッシュ・名前・IDをサーバーに送信
4. サーバーから一時トークンを受け取り、cookieに保存しておく
5. 指定のメールアドレスにワンタイムパスワードを含む認証メールを送ったこと、またはエラー情報を表示


サーバーサイド
1. クライアントサイドから情報を受け取る・情報が正しいことを確認
2. Gmail APIを用いてメールを送信
3. unregistered_usersに情報を保存し待機

#### 2、登録
クライアントサイド
1. ワンタイムパスワードを入力させる
2. cookieに保存されている一時トークンとワンタイムパスを合わせてサーバーサイドに送信する
3. 登録に成功したことを表示するまたは、エラー情報を表示する

サーバーサイド
1. 一時トークン・ワンタイムパスワードの一致・作成から24時間以内であることを確認する
2. unregistered_usersから項目を消去し、usersに項目を追加する

#### 3、ログイン
クライアントサイド
1. パスワード・メールアドレス（またはID）を入力
2. パスワードのSHA256ハッシュをとる
3. ハッシュとメールアドレス（またはID）をサーバーサイドに送信
4. トークンを受け取りcookieに保存

サーバーサイド
1. ハッシュとメールアドレス（またはID）を取得し、整合性をチェック
2. トークンを新しく生成し、DBに保存し・クライアントへ返す
3. last_loginを更新

#### 3、ログアウト
クライアントサイド
1. cookieを削除

#### 4、認証
クライアントサイド
1. APIへのリクエストと共にトークン・IDを送信する
2. APIのレスポンスを受け取る

サーバーサイド
1. 整合性をチェックしてレスポンスを返す


:::note
クライアントサイドは、今自分がどのフェーズであるのかを認識するため、localStrageにそれを保存します。
:::

:::note warn
レインボーリスト攻撃対策のために個別にソルトもしくはペッパーを用いるのが標準であると思いますが、そのように実装をすると複雑になるかと思ったので、実装していません。
SHA256のみの単純な認証の実装は、安全性が低く業務レベルでは用いるべきではありません。
cookieにはSecure属性・SameSite属性を付与し、各種攻撃を防ぎます。
:::
AWS CDKを使用したOIDCベースのIAMロール設定

AWS CDKを使用してGitHub Actionsなどの外部システムがAWSのロールを引き受けるために、OIDC (OpenID Connect) を使用する設定方法について、整理した内容です

## OIDCプロバイダの作成
まず、OpenID Connect (OIDC) プロバイダを作成し、外部認証システム（例：GitHub、Googleなど）とAWS間の認証を接続します。

例えば、GitHub Actionsを使用する場合、GitHubのOIDCプロバイダのURLを使用してAWSでプロバイダを設定します。

GitHubのOIDCプロバイダURLは https://token.actions.githubusercontent.com です。

## IAMロールの作成
IAMロールを作成し、そのロールに信頼ポリシーを設定して、外部認証システムがそのロールを引き受けることができるようにします。

信頼ポリシーには sts:AssumeRoleWithWebIdentity 権限が必要です。

外部システムで作成された Web Identity Token を使用してロールを引き受けることができます。

信頼ポリシー例（GitHub Actions用）
以下はGitHub Actionsで使用するOIDC信頼ポリシーの例です：

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::****:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:your-username/your-repository-name/*:*"
                }
            }
        }
    ]
}
```
arn:aws:iam::****:oidc-provider/token.actions.githubusercontent.com: GitHub Actions OIDCプロバイダのARNです。

StringLike 条件を使用して、特定のGitHubリポジトリの sub 値を確認します。

## ロールにポリシーを付与
作成したロールに必要な権限を付与します。例えば、AdministratorAccess ロールを付与することができます。

- ロールに AdministratorAccess ポリシーを付与して、そのロールを引き受けたシステムがAWSリソースを制御できるようにします。
N-Prolog TCLTKライブラリ　最初の一歩

# とっかかり
N-PrologのC埋め込み機能を利用して多くのC言語用ライブラリをN-Prologで使えるようにしよう、というプロジェクトを進めています。手始めに以前、手掛けたことがあるTCLTKのライブラリを開発しています。基本部分ができました。


# 埋め込みコード
下記のコードをごらんください。N-Prologの埋め込み機能を使っています。cdeclare/1 clibrary/1 cinline/1が埋め込みのための拡張述語です。

```prolog
% tcl/tk library
clibrary($-ltcl -ltk$).
cdeclare($#ifdef __linux__
          #include <tcl/tcl.h>
          #else
          #include <tcl.h>
          #endif$).
cdeclare($#include <stdio.h>$).

cdeclare($#define BUFFSIZE 1024
         Tcl_Interp *interp;
         char buff[BUFFSIZE];$).

tk_interp(Str) :-
    cinline($strcpy(buff,Jgetname(Jderef(varStr,th)));
             Tcl_Eval(interp,buff);
             return(Jexec_all(rest,Jget_sp(th),th));$).


tk_init :-
    cinline($interp = Tcl_CreateInterp();
             Tcl_Init(interp);               
             Tk_Init(interp);
             return(Jexec_all(rest,Jget_sp(th),th));$).

tk_exit :-
    cinline($Tcl_DeleteInterp(interp);
             return(Jexec_all(rest,Jget_sp(th),th));$).
            

```


これらは基本部分です。tk_init/0でインタプリタを初期化します。tk_interp/1は文字列を受け取りこれをTCLTKのインタープリタに送ります。tk_exitはインタプリタの終了させます。


# テスト
適当な文字列をインタープリタに送って動作テストをしてみましょう。通例にしたがって「ハローワールド」をやってみます。

![bandicam 2025-03-30 11-55-37-813.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/fda90eea-aac5-4dcc-85f1-5a07d371b8f7.jpeg)


上手くいきました。これが動作すればあとは簡単です。様々なTCLTKの機能を述語で表現するとともに、それらを文字列に変換してTCLTKのインタプリタに渡せばいいのです。残りの作業はひたすらにこの変換述語を準備するだけです。完成が見えてきました。

https://github.com/sasagawa888/nprolog
Laravel Breeze の Blade コンポーネント <x-app-layout> の意味と使い方を丁寧に解説

# はじめに

Laravel Breeze を使ってプロジェクトを生成すると、Bladeファイル内に次のようなタグが出てきます。

```blade
<x-app-layout>
    <x-slot name="header">
        <h2>ダッシュボード</h2>
    </x-slot>

    <div class="py-12">
        コンテンツがここに表示されます。
    </div>
</x-app-layout>
```

この <x-app-layout> って何？どこに定義されているの？
最初は戸惑うかもしれませんが、これは Laravelの **Blade コンポーネント機能**を使ったレイアウトコンポーネントです。

# ① x-app-layoutは何者？
これは Laravel の Blade コンポーネントです。
Breeze や Jetstream をインストールすると、自動的に以下のファイルが作成されます：
```
resources/views/components/app-layout.blade.php
```
このファイルが <x-app-layout> の実体です。

# ②中身
```blade
<!-- resources/views/components/app-layout.blade.php -->

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <title>{{ config('app.name', 'Laravel') }}</title>
    <!-- CSSやJSの読み込みなど -->
</head>
<body>
    <div class="min-h-screen bg-gray-100">
        @include('layouts.navigation') <!-- ナビゲーションバー -->

        <!-- ヘッダーの表示 -->
        @if (isset($header))
            <header class="bg-white shadow">
                <div class="max-w-7xl mx-auto py-6 px-4">
                    {{ $header }}
                </div>
            </header>
        @endif

        <!-- メインコンテンツ -->
        <main>
            {{ $slot }}
        </main>
    </div>
</body>
</html>
```

**注目ポイント:**
- {{ $slot }} → コンポーネント内に書いたメインの中身がここに挿入される
- {{ $header }} → <x-slot name="header"> によって渡された内容がここに表示される

# ③x-slot name="header" とは？
Blade コンポーネントに　**名前付きの領域（スロット）** を渡すための機能です。

**使い方:**
```blade
<x-app-layout>
    <x-slot name="header">
        <h2>マイページ</h2>
    </x-slot>

    <div>
        本文コンテンツ
    </div>
</x-app-layout>
```
この場合、<h2>マイページ</h2> が $header に渡されて、レイアウト内の {{ $header }} の位置に表示されます。

# ④どんな時に使える？
- **レイアウトを統一したいとき**
- 複数ページで同じヘッダー／ナビゲーションを使いまわしたいとき
- 冗長なHTMLを**共通部品として切り出したいとき**

Laravel Breeze は最初からこの構成を取り入れているので、**自然と「コンポーネント志向の開発」が身に付きます。**

# ⑤カスタマイズも簡単です
レイアウトにヘッダーやフッターを追加したいときは、
resources/views/components/app-layout.blade.php を編集するだけ。
```blade
<!-- フッターを追加 -->
<footer class="text-center py-4 text-gray-500 text-sm">
    &copy; 2025 MyApp
</footer>
```

# ⑥まとめ

![IMG_7740.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/51dd911b-1d7b-42e2-ba6e-45d4a00f2670.jpeg)

Blade コンポーネントを活用すれば、**ビューの再利用性が格段にアップします。**
Laravel Breeze を通して、この便利な仕組みをどんどん活用していきましょう！