OmniAICreator/Qiita-1.07M huggingface dataset:
Direct Connectのステータスや通信状態の色々な監視方法

# 内容

Direct ConnectのステータスやAWS～オンプレミス間の監視方法についていくつかのパターンを記載します。環境はホスト接続でTransit VIFを払い出してTransit Gatewayに接続したパターンを想定して記載します。なお、通信監視についてはオンプレミス側や回線側で提供されるサービスも使用可能であるため全てをAWS側から実施する必要はない場合がありますが、AWS側からどのようなことが出来るかといった観点で記載をします。

![DX01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/5e08b020-6bac-47ed-accd-4e8b072ce86c.png)

# CloudWatchのメトリクスを使用

https://docs.aws.amazon.com/ja_jp/directconnect/latest/UserGuide/monitoring-cloudwatch.html

CloudWatchでDirect Connectに関するメトリクスがいくつか提供されており、ConnectionStateメトリクスを使用することで接続の状態を取得することが可能です。しかし接続状態については中継ルータとAWSルータ間の物理的なステータスとなるため、オンプレミス側のルータがダウンした状態でもConnectionStateは1(アップ)となります。

![DX02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/c165a479-a90e-45bb-8489-55e7cf7a35e7.png)

# VIFのステータス取得

上記CloudWatchメトリクスではVIFのステータスを取得するメトリクスは提供されていませんが、AWS CLIのdescribe-virtual-interfacesでVIFステータスを取得することは可能です。LambdaからAWS CLIのコマンドを実行し取得結果をCloudWatchのカスタムメトリクスに取得。カスタムメトリクスにCloudWatchアラームを設定することで監視が可能です。

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/directconnect/describe-virtual-interfaces.html

# Network Synthetic Monitorを使用した外形監視

上記でVIFのステータスは取得出来ますが、AWS～オンプレミス間が実際に通信可能であるかの確認までは行うことが出来ません。この間の通信はNetwork Synthetic Monitorを使用することで通信状態を監視することが可能です。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/what-is-network-monitor.html

どのような仕組みかというと、まずネットワークモニターというものを作成します。作成の際、ネットワークモニターを設置するサブネットと監視先対象のIPアドレス（この図だとオンプレミスのルータのIPアドレス）を指定します。すると、指定したサブネットに内部的にネットワークモニター（監視サーバの様なコンポーネント）が作成され、ネットワークモニターから指定したオンプレミスのルータに対して監視を行ってくれます。

![DX03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/e3a2f836-6a9a-4ce9-b5cf-9e711b9ca023.png)

下記の様にパケット損失やTTLなどの値が取得されます。この値はCloudWatchメトリクスからも参照可能なため、パケット損失のメトリクスにCloudwatchアラームを設定すれば通信状態の監視が可能です。マネージドサービスのためお手軽に導入は可能ですが、少し料金が高めです。

![DX04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/772e88ab-241d-4487-a906-91fb051531e7.png)

# EC2を使用した監視

オンプレミス環境と疎通可能なEC2がある場合、低コストで利用出来る方法です。仕組みはpingなどを利用した疎通確認用のスクリプトを作成してEC2からcronなどで定期的に実行。取得した値をVPCエンドポイント経由でCloudWatchのカスタムメトリクスに送信。カスタムメトリクスにCloudWatchアラームを設定するといった方法です。元々あるEC2とVPCエンドポイントを利用すれば、ほとんど料金の追加なく導入が可能です。

![DX05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/c95167c1-6bb0-43e8-845d-1edb6142a4ca.png)
Laravel 12 で Schema::setConnection() は使えなくなりました

# `Schema::setConnection()` とは

Laravel 11.31 で、config で設定したデータベース以外でも簡単に使える、dynamic builder が追加されました(参照 [Dynamic Cache, Database, and Mail Builders in Laravel 11.31 - Laravel News](https://laravel-news.com/laravel-11-31-0))。

``` php
$db = DB::build([
    'driver' => 'sqlite',
    'database' => データベースファイルへのパス,
    'prefix' => '',
    'foreign_key_constraints' => true,
]);
```

これを利用して、新しいテーブルを作成したい場合などは例えば次のようなコードが書けました。

``` php
$schema = Schema::setConnection($db); // <-----ここで setConnection() 使う

if (!$schema->hasTable('table_hoge')) {
    $schema->create("table_hoge", function ($table) {
      $table->string('hoge_id');
      $table->json('hoge_meta');
      :
      :
});
```

しかし、Laravel 12 ではこの `setConnection()` メソッドは削除されましたので、上記コードはエラーとなります。

Laravel 12 では 11 からの破壊的変更はほぼないと謳われていますが、「全くない」といっているわけではないので注意が必要ということです。

# 修正方法

次のように修正します。

``` php
$schema = $db->getSchemaBuilder(); // <-----ここで setConnection() 使っていたのを修正

if (!$schema->hasTable('table_hoge')) {
    $schema->create("table_hoge", function ($table) {
      $table->string('hoge_id');
      $table->json('hoge_meta');
      :
      :
});
```

簡単ですね。
個人アプリ備忘録：AWS上に労務管理システムを移行する方法を勝手に模索してみた

## はじめに
まず、大前提として、ここから先は現在キャッチアップしている構想などを思い描きながら、さまざまな記事を自分用に書いていきます。

:::note alert
**※補足事項**
***そのため、内容は完全に自分向けとなっています。***
:::

また、このブログ投稿サイトのプラットフォームについても、自分自身の備忘録としてメモを残す場として活用していきたいと考えています。***このプラットフォーム上に記録を積み重ねていく予定です。***

あらかじめ、その点をご理解いただければ幸いです。

## こんなイメージを想定しています

勤怠管理システムのログイン時に、LDAP (Active Directory) を使った認証を行うフローの備忘録となります。

```
[1] ユーザーが勤怠管理システムにアクセス  
    ↓  
[2] ログイン画面でユーザー名・パスワードを入力  
    ↓  
[3] システムがLDAPサーバー (Active Directory) に認証リクエストを送信  
    ↓  
[4] ADが認証情報を照合し、結果をシステムに返す  
    ├── OKなら → [5] セッションを作成し、ユーザーをダッシュボードにリダイレクト  
    │           ↓  
    │   [6] システムがユーザーの権限情報を取得 (例: 従業員 or 管理者)  
    │           ↓  
    │   [7] ユーザー権限に応じた機能・データが表示  
    │           ├── **従業員** → 勤怠打刻、勤務時間確認、有給申請  
    │           └── **管理者** → 従業員の勤怠データ管理、シフト作成、承認作業  
    ↓  
    └── NGなら → [エラーメッセージ表示: IDまたはパスワードが違います]  
```    

## 1. 現行プロセスの流れ

1. ユーザーが労務管理システムにログイン
2. ログイン画面でユーザー名・パスワードを入力
3. システムがLDAPサーバー (Active Directory) に認証リクエストを送信
4. ADが認証情報を照合し、結果をシステムに返す
   - **OKなら** ログイン成功
   - **NGなら** エラーメッセージ表示
5. ログイン成功時、セッションを作成しダッシュボードへリダイレクト
6. ユーザー権限に応じた機能・データを表示
   - **従業員** → 労務打刻、労務時間確認、有給申請
   - **統括者** → 従業員の労務データ管理、シフト作成、承認作業

---

## 2. AWSでの移行構成
AWS上で労務管理システムを構築するにあたり、以下のようなサービス構成を推奨します。

| 項目 | AWSサービス |
|---|---|
| アプリケーションサーバー | Amazon ECS (Fargate) / Amazon EC2 / AWS Lambda |
| Webサーバー | Amazon ALB + Amazon Route 53 |
| データベース | Amazon RDS (MySQL/PostgreSQL) / Amazon DynamoDB |
| 認証 | AWS Managed Microsoft AD + AWS IAM / AWS Cognito |
| ストレージ | Amazon S3 (ログ/バックアップ) |
| ログ監視 | Amazon CloudWatch + AWS CloudTrail |

---

## 3. AWSでの移行手順

### **(1) 認証基盤のAWS移行**
- **AWS Managed Microsoft AD** を利用し、LDAP認証基盤を移行
- 「AWS IAM + Cognito」を利用し、SAML/OAuth2.0 のSSO連携も可能

### **(2) アプリケーションのAWSデプロイ**
- **Amazon ECS (Fargate) または AWS Lambda** でサーバーを動かす
- ALBと組み合わせ、HTTPS認証リクエストを処理

### **(3) データベースの移行**
- Amazon RDS (従条MySQL/PostgreSQL) へ移行
- Amazon DMS で移行をサポート

### **(4) ログインセッション管理**
- **ElastiCache (Redis) でセッション情報を管理**

### **(5) ログ・監視システム構築**
- CloudWatchでログを取得、CloudTrailでAWSアクセス記録を監視
- AWS WAF + Shield でDDoS対策

---

## まとめ  

本記事は、自身の備忘録として、**LDAP (Active Directory) を活用した勤怠管理システムの認証フロー** と、  
その **AWS 環境への移行構成** について記録したものです。  

- **現行プロセス**：勤怠管理システムにおける **LDAP 認証の流れを整理**  
- **AWS 移行構成**：Amazon ECS、ALB、RDS、Managed Microsoft AD などを活用した **移行案を提案**  
- **移行手順**：認証基盤の **AWS 移行、アプリケーションデプロイ、データベース移行、セッション管理、ログ監視** までの流れを解説  

本構成を採用することで、**安全かつスムーズに AWS 環境へ移行** できる見込みです。
Contact Intelligence View


+ [【ヘルプ】Contact Intelligence View](https://help.salesforce.com/s/articleView?id=sales.contacts_intelligence_view.htm&type=5)



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

#### 解答例

+ [Spun up a new environment to perform Add Data to a Prompt Template to Quickly Draft Emails and there are no Contact records to perform the "Test Your Work" section.  ](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PY2QU)

# Intelligence View

+ [Intelligence View](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007FSjGs)

:::note
Winter ’24 プレリリースの無料トライアルにサインアップし、コンタクト インテリジェンス ビューとリード インテリジェンス ビューを確認できました。

I signed up for a Winter ’24 Pre-Release free trial and I was able to see the Contact Intelligence View and Lead Intelligence View.

Sign up for free trial here: https://www.salesforce.com/form/signup/prerelease-winter24/
:::

更新

:::note
SF とのチケットをクローズしました。ライセンスの更新が役立つという話をいくつか聞きました。リードと連絡先のインテリジェンス ビューに必要なすべての仕様を確認したつもりでしたが、Service Cloud ではなく Sales Cloud で利用できることがわかりました。組織の会社情報でこれを探せたはずなのに、恥ずかしい思いをしました。これがあなたに当てはまるかどうかはわかりませんが、これが私たちの組織の状況であることをお知らせしたいと思いました。

I just closed a ticket with SF. I've heard some references with people stating that a License refresh would help. I thought I saw the all the specs required for Lead and Contacts Intelligence view, but found out that it's available on Sales Cloud NOT service cloud. I was embarrassed as I could have looked for this in our org company info. I don't know if this applies to you but just wanted to let you know that this was our Org situation. 
:::

# トレイルヘッド

# リストビュー

+ [I can't 'clone' my lead list.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J86md)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/eda559ae-37c1-b21d-5d27-2f38619c83d9.png)

:::note
Please switch the list view as follows

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0cc67a0c-d4a8-1fce-7404-f7593f25bc07.png)
:::

+ [Customize a contact record page](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KfyWo)
+ [Cant find import wizard option in my playground](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KELaM)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8477116b-83d8-441b-87e9-c3fecce6ec22.png)
Bulk API V2 の設定例


# python header

+ [Help with Bulk V2 API Wrong content-type](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PVtAC)

```
headers2 = { 
        "Authorization": f"Bearer {access_token}", 
        "Content-Type": "text/csv", 
    } 
    response = requests.put(upload_url, data=csv_data, headers=headers2)
```
[UIToolKit] 複数のVisualTreeAssetをスライドさせたい！

## 概要
ゲームのチュートリアル等を作成する際に、説明を記した複数のVisualTreeAssetをスライドして表示したく、作成しました。

## 特徴
- 左右の矢印ボタンをクリックで左右にスライド
- 右上の閉じるボタンをクリックでスライドを非表示
- スライドの上で左クリック押下→マウスを動かすことでもスライド可
- スマホのようなタッチ対応
- Swipe()関数で任意のスライド位置に移動
- 任意の時間でスライドアニメーション
- スライド表示・非表示・スワイプ時にEventで任意の関数を実行

![Qiita - GameScene - Web - Unity 6 (6000.0.31f1) _DX11_ 2025-03-03 06-54-00 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021403/3f4c7191-37c9-4e28-97cc-0bb9966219d2.gif)

## バージョン
Unity 6 (6000.0.31f1)

## ソースコード
https://github.com/sMontake369/CustomUIElement

## 使い方
このカスタムUIElementはDOTWeenを使用しているため、インポートをお願いします。

https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676?locale=ja-JP&srsltid=AfmBOooMTKJ7_iYta7133XoA_3txns_Eyz1f65fKg0w2DpGUBudhFOat

1. githubより、Swiper.cs,SwiperData.csをプロジェクト内にインポート
2. プロジェクト内で右クリック→作成→CustomUIElements→SwiperDataを選択
3. 作成されたSwiperDataのSlideListにスライドさせたいVisualTreeAssetを代入

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021403/52cce420-5bb8-4166-95e2-a8a28b003faf.png)

4\. 新規UIDocumentを作成し、LibraryのProjectにあるSwiperを選択
5. 作成したSwiperを選択し、インスペクター上のAttributes欄で必要なデータを代入

- SlideData - 先ほど作成したSwiperData
- TransitionTime - スライドにかかる時間
- Rightarrowtexture - 右へスライドさせるボタンのテクスチャ
- Leftarrowtexture - 左へスライドさせるボタンのテクスチャ
- Closetexture - Swiperを非表示にするボタンのテクスチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021403/738c3a7e-18c6-46ee-8e2e-41de9efee181.png)

※UIBuilder上では、Previewを押してもスライドされません。ゲームビューで確認してください。

左右の矢印をクリックすることで、隣のスライドへ移動します。
また、スライドをクリックしながら、マウスを移動させる事でもスライドすることができます。
コード上でスライドさせたい場合は、Swipe関数で任意の位置にスライドできます。
Show関数、Hide関数でスライドを表示、非表示にできます。

```C#
// 任意の位置へスライド
Swipe(1)

// 要素を表示
Show()

//  要素を非表示
Hide()

```

## SwiperData.csの存在意義

SwiperData.cはスライドしたいVisualTreeAssetのリストを保存するScriptableObjectです。
なぜこれを作成するかというと、Swiper.csで直接List<VisualTreeAsset>とすると、保存や、Unityの再起動を行ったタイミングで参照が外れてしまうことが頻繁に発生したため、ScriptableObjectとして参照し、参照外れを防いでいます。
PHPで「条件式が偽の時の処理(if..else)」の動作を確認してみた。

# 概要

PHPで「条件式が偽の時の処理(if..else)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/php/if/index5.html

# 実装

```sample.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
<?php
$old = 18;

print '年齢:'.$old.'<br />';
if ($old >= 20){
  print '年齢は20才以上です<br />';
}else{
  print '年齢は20才未満です<br />';
}

$old = 45;

print '年齢:'.$old.'<br />';
if ($old >= 20){
  print '年齢は20才以上です';
}else{
  print '年齢は20才未満です';
}
?>
</p>

</body>
</html>
```

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

```
$ php sample.php 
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
年齢:18<br />年齢は20才未満です<br />年齢:45<br />年齢は20才以上です</p>

</body>
</html>
```

# まとめ

何かの役に立てばと。
スマホ上のObsidian git でコンフリクトが起きちゃったときの対応

## 概要

ObsidianでGitプラグインを使用してPCとスマホでメモの共有を行っているときに、コンフリクトが発生した。PC上であれば差分を見てコンフリクト解消するか、強制的にプルするかで簡単に解決できるが、Obsidianモバイルのプラグインでは対応できないっぽい

参考記事：[[Bug]: Merge Conflicts not supported on mobile?](https://github.com/Vinzent03/obsidian-git/issues/340)

以下、Androidスマホ上のTermuxを使ってGitコマンドを実行し、コンフリクトを解決する手順をご紹介

## 前提条件

- Androidスマホ
- Obsidianアプリとリポジトリが設定済み
- GitHubなどのリモートリポジトリと連携済み

## 詳細手順

### 1. Termuxのインストールと初期設定

1. **Termuxのインストール**
   - いろいろインストール方法あるらしいですが、Googleplayからのダウンロードは非推奨らしい。F-Droidまたはgithubからのインストールが推奨らしい

2. **初回起動時の更新**
```bash
pkg update
pkg upgrade
```

### 2. ストレージへのアクセス許可設定

```bash
# ストレージへのアクセス権限を要求
termux-setup-storage
```

このコマンドを実行すると、アクセス権限関連の設定画面開くのでtermuxアプリ選択して許可しましょう

### 3. Obsidianのvaultフォルダへ移動

```bash
# Obsidianのvaultがある場所まで移動（例）
cd <vault作ったパス>
```

アプリの保管庫を管理の画面行くとパスを確認できます。

### 4. Gitのインストール

```bash
# Gitをインストール
pkg install git
```

### 5. Git認証まわりの設定

```bash
# 認証情報を保存する設定
git config --global credential.helper store

# リモート操作時に認証を求められたら
# ユーザー名: GitHubのユーザー名
# パスワード: 生成したPAT（クラシックタイプを使用）

# GitHubのPAT生成手順:
# 1. GitHub > Settings > Developer settings > Personal access tokens > Tokens (classic)
# 2. 「Generate new token (classic)」をクリック
# 3. リポジトリへのアクセス権限（repo）を付与
# 4. トークンを生成してコピー（表示は一度きり）
```

### 6. リポジトリの状態確認

```bash
# リポジトリの状態を確認
git status

# リモートリポジトリの情報を確認
git remote -v
```

### 7. コンフリクト解決方法

#### 方法1: 強制的にリモートの内容を取得（ローカルの変更を破棄）

```bash
# リモートの変更を取得
git fetch origin

# ローカルの変更を強制的に破棄してリモートの状態に合わせる
git reset --hard origin/main
```

#### 方法2: コンフリクトを手動で解決

```bash
# プルしてコンフリクトを表示
git pull

# コンフリクトしているファイルを確認
git status

# コンフリクトしているファイルを編集
vi コンフリクトしているファイル.md

# 編集後、変更をステージングして確定
git add .
git commit -m "コンフリクトを解決"
git push
```

### 8. Obsidianに戻って確認

コンフリクトが解消されてpushやpullがちゃんとできるか確認

## 終わりに
最初に載せていたURLの対応方法のやり方がよくわからなかったのでいろいろ手探りで試してました。
今後もコンフリクトチラホラ起きそうなので備忘録として残しておきます。
その内obsidianのgitプラグインでもこの辺うまいことできるようになるといいなぁ。
競プロ日記#25/03/07

# アルゴ式-[お菓子 (2)](https://algo-method.com/tasks/364)
- 最短で求めるにあたって以下の様に考えてしまっていたが、３倍を有効活用するためにあえて+1をするパターンがあることに気づくまで時間がかかってしまった。
1. 最初の1日は1個お菓子を作る
2. そこからはNを超えない範囲で常に3倍
3. ３倍するとNを超える値になったらひたすら１日１個のお菓子を作る

- そこから以下の様に考え直した
1. もしNが３の倍数ならば3で割る。そうでなければ-1をする。
2. これをNが0になるまで繰り返す。
これによって最短のX日目にちょうどN個になるまでを逆算で求めていけば最も効率的な経路をたどることに気づいた。

```
while(countOkashi > 0){
    if (countOkashi % 3 == 0){
        countOkashi /= 3;
    } else {
        countOkashi--;
    }
    count++;
}
```


### この解法に至るまで時間がかかったことについて
- 「１日目から順に考える」「Nを超えるまでは３倍して最後は+1連打するのが最も最短」という考えに頭が支配されて問題がおかしいのではないかと疑うくらい凝り固まってしまった。
- 正直なんで逆算する解法をひらめいたかもよくわからないが、当問題は確認問題のため公式の模範解答や解説もなく20分ほど悩んでしまった。この程度で２０分くらい悩んでしまった挙句問題を疑いだすという自分の愚かさ、センスのなさにかなり傷ついた。先が思いやられる。
Macのターミナルでライセンス同意がされていないエラーが出た時の対処方法

## Macのターミナルでライセンス同意がされていないエラーが出た時の対処方法

GitのVersionを確認するために,Gitコマンド
```
$ git --version
```
を実行したところ,下記のエラーが発生しました．
```
You have not agreed to the Xcode and Apple SDKs license. You must agree to the license below in order to use Xcode.
Press enter to display the license:
```

## 環境
・macOS Sequoia 15.3.1

## 解決方法
ターミナルで以下のコマンドを入力します.
```
sudo xcodebuild -license accept
```
このコマンドを実行すると,管理者パスワードの入力が求められます.
パスワードを入力してください（セキュリティ上の理由から、入力中の文字は表示されません）．
そしてEnterキーを押します.

再度Gitコマンドを実行します．問題が解消されているはずです．
【トラブルシューティング】Cloud Run×suno-apiで環境変数が渡らない問題を解決した話



## 背景
[suno-api](https://github.com/gcui-art/suno-api) をCloud Run上でビルド・デプロイしたところ、一部のAPIが500エラーを返す事象に遭遇。

調べてみると、**環境変数で渡している `SUNO_COOKIE` がうまく渡っていない**ことが原因らしい。でも、**Cloud Run側の環境変数としては設定済み**。  
「あれ？おかしいぞ？」ってなったので、Dockerfileをチェックしてみたら、発見しました。

```Dockerfile
ARG SUNO_COOKIE
```

こいつかーーー！！！（犯人確定）  
Cloud Runの環境変数は**ランタイムでしか見えない**ので、**ビルド時には見えてない**のが原因でした。

## ゴール
- `SUNO_COOKIE`を**安全に**Docker Build時に渡す
- Gitに載せない
- なるべくGCP標準機能（Cloud Buildのsubstitutions）で解決する



## そもそもCloud Buildで環境変数を渡すには？
| 方法 | 説明 | Gitに秘密は載る？ |
|----|----|----|
| ① cloudbuild.yamlのsubstitutions | ビルド時にGUIから変数注入 | 乗らない✨ |
| ② Dockerfileに直書き | Dockerfileに直接ベタ書き | 乗る💀 |

**迷わず①を採用**。Cloud BuildのGUIから「代入変数（substitutions）」を定義して、毎回注入する形に。


## cloudbuild.yaml での設定例
以下のように`--build-arg`を仕込んで、GUI側のsubstitutionsと連携します。

### cloudbuild.yaml
```yaml
steps:
  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - '--no-cache'
      - '-t'
      - >-
        $_AR_HOSTNAME/$_AR_PROJECT_ID/$_AR_REPOSITORY/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA
      - '-f'
      - Dockerfile
      - '--build-arg'
      - 'SUNO_COOKIE=$_SUNO_COOKIE' # ここで代入変数を取得
      - .
    id: Build
```

### substitutions
```yaml
substitutions:
  _AR_PROJECT_ID: xxxxx
  _TRIGGER_ID: xxxxx
  _PLATFORM: managed
  _SERVICE_NAME: xxxxx
  _DEPLOY_REGION: xxxx
  _AR_HOSTNAME: xxxx
  _AR_REPOSITORY: xxxxx
  _SUNO_COOKIE: 'dummy' # GUI上から取得した代入変数が毎回セットされる。
```

---

## 実際のビルドログ
**Before（渡せてない）**
```
 ---> 6bbde929d339
Step 12/19 : RUN if [ -z "$SUNO_COOKIE" ]; then echo "Warning: SUNO_COOKIE is not set. You will have to set the cookies in the Cookie header of your requests."; fi
 ---> Running in e14c5e9401c6
Warning: SUNO_COOKIE is not set. You will have to set the cookies in the Cookie header of your requests.
Removing intermediate container e14c5e9401c6
```

**After（substitutionsで渡せた）**
```
 ---> 529fb246c51c
Step 12/19 : RUN if [ -z "$SUNO_COOKIE" ]; then echo "Warning: SUNO_COOKIE is not set. You will have to set the cookies in the Cookie header of your requests."; fi
 ---> Running in 5019523db1b0
Removing intermediate container 5019523db1b0
```


## 学びポイント
- **Cloud Runの環境変数はランタイムの話**。ビルド時には渡らない。
- **Cloud Buildのsubstitutions**を活用すれば、Gitに秘密を載せずに安全に渡せる。
- `cloudbuild.yaml`は、GCPのCloud Buildでデフォルト生成されるので、それをちょっと編集すればOK。
- **Dockerfileで`ARG`受けして、`ENV`に流し込む**のもポイント。


## まとめ
本家のIssueでも議論されてたけど、なかなかスッキリした答えがなかったので、**ビルド時とデプロイ後の環境変数の違いを理解して一発解決**できたのは大きな学びでした。

Cloud Build＆Cloud Runの連携で環境変数ハマったら、まずは「**ビルド時のsubstitutions**」をチェック！これだけでだいぶ事故防げるのでオススメです。
2025年のトップ6 iPhoneエミュレーター

iPhoneエミュレーターは、iPhoneのハードウェアを再現するプログラムであり、iOSアプリを他のオペレーティングシステム上で実行できるようにします。アプリ開発者は、WindowsやMac上でiPhone向けのソフトウェアをテストするために、エミュレーターをよく利用します。

AppleのApp Storeから直接アプリを実行することはできませんが、これらのiPhoneエミュレーターは、iPhoneの基本的な機能を忠実に再現します。iPhoneエミュレーターには、2つの重要な役割があることを強調する必要があります。

本記事では、モバイルアプリのテストを効率的に行うための主要なiPhoneエミュレーターを紹介します。

## iPhoneエミュレーターとは？

エミュレーターとは、特定のデバイスの機能をコンピューター上で正確に再現するソフトウェアツールです。これは、対象デバイス（この場合、iPhone）の命令セットアーキテクチャ（ISA）をコンピューターのアーキテクチャに変換することで実現します。この機能により、物理デバイスを用意することなく、デバイスのテストや実験を行うことができます。

## iPhone/iOSエミュレーターを使用する理由

エミュレーターは、物理デバイスのみを使用する場合と比較して、実用的かつコスト効率の良いiPhone/iOSテストソリューションを提供します。デバイスラボを構築・維持するのはコストがかかるため、特に予算が限られている小規模な企業にとって、エミュレーターは魅力的な選択肢となります。

無料で利用できるエミュレーターも多数存在し、例えばXcode、Xamarin TestFlight、Appetize.ioなどが挙げられます。こうしたiPhoneエミュレーターを活用することで、複数のデバイスを購入したり頻繁にアップグレードする必要がなくなり、予算を有効活用しながら効果的なテストが可能となります。

では、無料で使えるiPhoneエミュレーターを紹介する前に、誰がこのエミュレーターを最も活用できるのかを見ていきましょう。

## トップiPhoneエミュレーター

数多くのiPhoneエミュレーターが存在しますが、以下に特に優れたものを紹介し、それぞれの主な特徴を説明します。

### LambdaTest

[LambdaTest](https://lambdatest.com/?utm_source=qiita&utm_medium=organic&utm_campaign=mar_06&utm_term=iphone-emulators&utm_content=blog)は、AIネイティブのテスト実行プラットフォームであり、手動および自動テストを大規模に実行できます。5,000以上のモバイルデバイス、ブラウザ、OSの組み合わせを提供し、開発者やテスター向けの仮想デバイスクラウドとして機能します。

**LambdaTestの特徴：**

- 豊富なエミュレーター：単なるエミュレーターにとどまらず、多様なモバイル・Webアプリテスト機能を提供。

- ワンクリックアップロード：.apkや.app.zipファイルを簡単にアップロードし、スムーズにテスト可能。

- 充実したエミュレーターとシミュレーター：リアルデバイスを使ったテストが可能。

- レスポンシブテスト：異なる画面サイズや解像度に適応するかをテスト可能。

- グ- ローバルジオロケーションテスト：GPSやIPジオロケーションをシミュレートして、地域別の動作確認が可能。

### RetroArch

RetroArchは、エミュレーター、ゲームエンジン、メディアプレーヤーのフロントエンドです。使いやすいインターフェースを備え、さまざまなコンピューターやコンソールでクラシックゲームを楽しむことができます。

**RetroArchの特徴：**

- 幅広いプラットフォーム対応：Windows、macOS、Linux、PlayStation、Xboxなど、多様な環境で動作。

- 大規模なコミュニティ：アクティブなユーザーコミュニティが問題解決をサポート。

- ディスクサポート：オリジナルのCDを使用してゲームをプレイ可能。

- 高度なシェーダー：映像処理を向上させるためのシェーダーを搭載。

- AI翻訳：機械翻訳を活用したテキスト翻訳機能。

### Eclipse

Eclipseは、iOSアプリの取り消しに関係なく動作するWebベースのエミュレーターです。インターネットなしでもローカルファイルを使用してゲームをプレイできます。

**Eclipseの特徴：**

- ライブラリ機能：お気に入りのゲームを保存し、オフラインでもアクセス可能。

- ブラウザベース：アプリのインストール不要で簡単に使用可能。

- ゲーム追加対応：Google DriveやDropboxからゲームをインポート可能。

### Dolphin

Dolphinは、20年以上の歴史を持つ無料エミュレーターで、WindowsやmacOSにも対応しています。

**Dolphinの特徴：**

- オープンソース＆無料：開発者による継続的な改善が可能。

- 地域制限なし：どの地域からでも自由にアクセス可能。

- 実際のコントローラー対応：USBやBluetoothでWiiリモコンを接続可能。

- マルチプレイヤーサポート：ローカルおよびオンラインでのマルチプレイが可能。

### Smartface

Smartfaceは、単なるエミュレーターではなく、IDE（統合開発環境）として動作し、テストに特化しています。

**Smartfaceの特徴：**

- 高速パフォーマンス：迅速なテスト実行が可能。

- クロスプラットフォーム対応：WindowsおよびmacOSで動作。

- 強力なデバッグツール：リアルタイムコード検証やブレークポイント設定が可能。

### Xamarin TestFlight

Xamarin TestFlightは、Apple公式のエミュレーターであり、iOSアプリのベータテストに適しています。

**Xamarin TestFlightの特徴：**

- 大規模テスト対応：最大1万人のテスターを招待可能。

- フィードバック収集：アプリ内で直接フィードバックを提供可能。

- App Storeとの連携：アプリのダウンロードとテストがスムーズ。

## まとめ

多くの業種の人々が、仕事のためにリアルなiPhoneデバイスを必要とします。しかし、物理デバイスを購入するのはコストがかかり、シミュレーターでは正確な結果が得られません。その解決策として、エミュレーターが登場しました。

本記事で紹介したエミュレーターは、それぞれの特性を活かして、ユーザーのニーズに最適な選択肢となるでしょう。開発者やテスターは、最新技術を活用しながら、より効率的にプロジェクトを進めることができます。
RealSense L515 を使ってみる

# はじめに
色々あってRealSense L515を入手できたので、今更ですが使ってみようと思います。ということでまずは情報を集めてみると
* ​Intel RealSense L515は、2020年に発売されたソリッドステート型LiDAR深度カメラで、独自のMEMSミラースキャン技術を採用し、0.25mから9mまでの高精度な深度測定が可能
*  Intelは2021年8月にRealSense事業の縮小を発表し、L515を含む一部製品の生産終了を決定しました。 ​その結果、L515の製造と販売は2022年2月に終了し、後継製品は提供されていません。
*  L515のSDK開発も停止されており、SDKバージョン2.54.2以降ではL515のサポートが削除されています。 ​

これはなかなか手間取りそうですね、、、(´･ω･｀)

# 開発環境
* RealSense L515
* Ubuntu 22.04

# 最新のSDKのインストール
まずは最新のSDKをダウンロード[公式サイト](https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md)を参照してrealsense-viewerを起動してみます。が、**接続されません**でした。「rs-fw-update -l」も同様に「There are no connected devices」と表示されたのでlibrealsense APIも使用できないと思われます。

# 古いバージョンのSDKのインストール
仕方がないので古いバージョンのSDKをインストールしてみます。[公式サイト](https://github.com/IntelRealSense/librealsense/releases/tag/v2.56.3)によると、v2.50.0まで動作確認されているようなのでこちらを使ってみましょう。
## 既存の librealsense 関連パッケージを削除
まずは先程最新版をインストールしてしまったので削除します。
```
dpkg -l | grep "realsense" | cut -d " " -f 3 | xargs sudo dpkg --purge
```
## リポジトリのクローン
任意の作業ディレクトリに移動し、リポジトリをクローンします。
```
git clone https://github.com/IntelRealSense/librealsense.git
```
## 特定バージョンのチェックアウト
バージョン2.50にはQS版（おそらく品質向上パッチ）がありますが、ビルドが通らなかったのでバージョン2.50.0を使用します。引用符がスマートクォートになってるというエラーだったので文字コードやコンパイラによっては成功するかもしれません。
```
cd librealsense
git checkout v2.50.0
```
## ビルドディレクトリの作成とCMakeによる構成
```
mkdir build && cd build
cmake ..
```
## ビルドとインストール
```
make -j4
sudo make install
```
## realsense-viewerの起動
```
realsense-viewer
```
すると、今度は正しく認識されました

# ファームウェアアップデート
realsense-viewerを開きファームウェアをアップデートしようとしたところタイムアウトとなってしまいました。どうやら手動で更新する必要があるようです。[公式サイト](https://dev.intelrealsense.com/docs/firmware-releases-l500)から最新のファームウェアをダウンロードし、[Firmware Update Tool](https://dev.intelrealsense.com/docs/firmware-update-tool)に書かれている手順通りにアップデートします。**管理者権限(sudo)がないとアップデートできない**ようです。

# おわりに
　RealSense L515は、コンパクトで高精度なLiDARカメラとしてとても魅力的なデバイスでした。特に、精度の高さやコンパクトなサイズ感は、他のRealSenseシリーズとはまた違った面白さがありました。
　ただ、残念なことに、もう生産も終わっていて、公式のSDKサポートも事実上終了している状態。そんなわけで、新規プロジェクトや今後の開発には、L515は正直おすすめしづらいです。代わりに、まだまだサポートが続いているRealSenseのステレオカメラ（Dシリーズ）なんかを検討するほうが、後々安心だと思います。
GitHub Copilot の「Prompt files／Reusable Prompt Files」に関する情報のメモ（カスタムインストラクション関連）

## はじめに

以下の記事で見かけた、GitHub Copilot の「[カスタムインストラクション（Custom instructions）](https://code.visualstudio.com/docs/copilot/copilot-customization)」関連の話題です。

●カスタムインストラクションの一歩先！GitHub Copilot への指示を分割管理しよう
 https://zenn.dev/microsoft/articles/ghcp-reusable-prompt-files

### 公式情報

具体的には、ちょっと前に実験的機能としてリリースされたっぽい「Prompt files／Reusable Prompt Files」についての話です。

「[Prompt files／Reusable Prompt Files](https://code.visualstudio.com/docs/copilot/copilot-customization#_reusable-prompt-files-experimental)」に関して、公式ページでは以下に記載があるようです。

![2025-03-07_00-44-32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/04636afa-e785-47eb-89d4-e52eb6471d47.jpeg)

（ドキュメントの項目名が Reusable Prompt Files で、Prompt files が機能になる感じでしょうか？）

## 機能について
「Prompt files／Reusable Prompt Files」の機能について見ていきます。

その前に、冒頭で名前を出した「カスタムインストラクション」の話を見ていきます。

### Custom instructions
カスタムインストラクション は以前からパブリックプレビューで提供されていた機能で、VS Code の [February 2025 (version 1.98)](https://code.visualstudio.com/updates/v1_98) で GA になった機能です。

https://x.com/youtoy/status/1897677047616708897

これを使うことで、以下の記事や公式ページに書かれているように、GitHub Copilot に特定の指示や情報を与えることができます（※ GitHub Copilot利用時のプロンプトに含めるのではなく、それを書いたものを用意して自動で読み込ませる形です）。

●GitHub Copilotにカスタムインストラクションで最新技術や独自ルールを教え込む
 https://zenn.dev/microsoft/articles/github-copilot-custom-instructions

![2025-03-07_01-00-40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b4175bba-045f-4ab2-b687-04c6f9a28678.jpeg)

●Use settings
 https://code.visualstudio.com/docs/copilot/copilot-customization#_use-settings

![2025-03-07_01-01-56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6976a3f7-3c0f-4cda-8ff1-7dc4f5aed716.jpeg)

### Prompt files／Reusable Prompt Files

Prompt files も、GitHub Copilot に特定の指示や情報を与えることができます。その点ではカスタムインストラクションと同じですが、その指示などを記載したファイルを柔軟に扱えるようです（現在は実験的な機能として提供）。

例えば、以下の公式の例のように「react-form.prompt.md」とか「security-api.prompt.md」といったようなファイルを特定のフォルダに用意しておいて、VS Code上でこれらを指定して読み込む使い方になるようです。

![2025-03-07_01-06-25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/99da2a27-aeb3-41c8-9311-b408fa54d5a6.jpeg)

その「○○○.prompt.md」というファイル内の記載で、以下の部分のように、別ファイルの内容を読み込むこともできるようです。

![2025-03-07_01-06-25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/51ad9ed3-a5b9-4aeb-89f4-cc6f7ecf9c06.jpeg)

別ファイルからの読み込みを行う場合の書式は、以下が使えるようです。

![2025-03-07_01-19-55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ff9deb70-1f26-4af4-8a0d-aa66f44661a8.jpeg)

## 必要な設定など

この機能を利用するには、設定が必要です。
また用意したファイルの使い方などを含め、[冒頭に掲載した記事](https://zenn.dev/microsoft/articles/ghcp-reusable-prompt-files#1.-prompt-files-%E3%81%AE%E6%A9%9F%E8%83%BD%E3%82%92%E6%9C%89%E5%8A%B9%E5%8C%96)や[公式の情報](https://code.visualstudio.com/docs/copilot/copilot-customization#_usage)をご確認ください。

## おわりに

別途、この機能は試していければと思います。
NocoBaseを使ってみたら、業務アプリ開発が驚くほど簡単だった話

## はじめに
皆さん、**NocoBase**をご存じでしょうか？  
私はつい先日、このツールと出会いました。正直なところ、「もっと早く知りたかった…！」と思うほどの便利さでした。  

## 予算の壁
もともと私はWeb系の業務アプリを開発する会社で働いていましたが、現在は製造業の社内SEをしています。  

「社内向けに簡単な業務アプリを作りたい」  

そんな場面はよくあるのですが、問題は**予算**です。  
kintoneやSalesforceは講習も受けてますし使えるのですが、利用料がかかるため気軽には導入できません。  

「**OSS（オープンソース）で無料のものはないか？**」  

そうしてたどり着いたのが **NocoBase** でした。  

## NocoBaseを使ってみたら、業務アプリが20分でできた
業務アプリの基本といえば、以下のようなCRUD機能です。

- リスト表示
- 詳細表示
- 登録
- 更新
- 削除

これらが、**NocoBaseでは簡単にできます。**

1. **テーブル設計**
2. **リスト画面作成**
3. **登録・更新・削除の実装**
4. **詳細画面の作成**
5. **テーブル間の結合や演算の設定**

これらすべてを**マウス操作だけで20分**で完了。
最初は半信半疑でしたが、触ってみるとあまりの手軽さに驚きました。

![nocobase.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1160967/399354d3-df66-45a2-b139-fb4f2aa174fe.gif)
（こちらの画像は本家様からお借りしております）

## ただし注意！NocoBaseは一発勝負
NocoBaseには、**「レビュー」や「ステージング環境」** がありません。  
そのため、一度設定を変更すると即座に反映されます。  

とはいえ、  
- **社内で完結する**  
- **とりあえずすぐ動けばいい**  

こういったシンプルな業務アプリには最適です。  

## まとめ
無料で使えて、業務アプリを爆速で開発できる **NocoBase**。  
業務効率化のためにアプリを作りたいけれど、コーディングの手間を減らしたい…そんな方にはぴったりのツールです。  

ぜひ試してみてください！  

👉 [NocoBase公式サイト](https://www.nocobase.com/ja)  

期待が高まったところで今日はここまで。
**次回は、NocoBaseのインストール編です！**
Terraform で EC2 に Next.js をデプロイする構成をやってみた

## Terraform
### Install
https://developer.hashicorp.com/terraform/install

### Tutorials
https://developer.hashicorp.com/terraform/tutorials/aws-get-started

年間で、5, 6 回程度 AWS を構築したり触る機会のあるエンジニアが Terraform を触ってみた。
たまたま、この様な構成を扱ったので、初めて IaC をやってみた。
機会を作ってゆっくり、Tutorials をやってみたい。

### Sample Github 
https://github.com/abehironao/next-ec2-sample-app/tree/feature/iac-terraform-ec2
WebサイトとWebアプリケーションの違い

# はじめに
インターネットが普及した現代では、「Webサイト」「Webアプリケーション」という言葉をよく耳にします。しかし、これらの違いを明確に説明できる人は少なく、混同されることも多いです。本記事では、両者の特徴や違いについて詳しく解説し、それぞれがどのような場面で適しているかを考察します。

# Webサイトとは
### 特徴

Webサイトは、主に情報提供を目的とした静的または動的なWebページの集合体です。以下がその主な特徴です:

- **情報発信が主目的**:企業や個人が製品やサービス、ブランドの情報を提供するために利用
- **静的コンテンツ**:更新頻度が少なく、手動で変更されるまで内容が変わらないことが一般的
- **ユーザー体験**:訪問者は主な情報を閲覧する受動的な体験

### 例

- 企業の公式ホームページ
- ブログ
- オンラインパンフレット

# Webアプリケーションとは
### 特徴

Webアプリケーション(Webアプリ)は、特定のタスクを実行するために設計されたソフトウェアプログラムで、ブラウザ経由でアクセスされます。以下がその主な特徴です:

- **双方向性**:ユーザーとのインタラクションが可能で、データ入力やリアルタイムでの操作が可能
- **動的コンテンツ**:ユーザーのアクションやリアルタイム情報に基づいて内容が更新
- **機能性**:複雑なタスク(例:オンラインショッピング、データ管理)を実行可能

### 例
- Gmail(メール管理)
- Google Drive(クライドストレージ)
- Netflix(動画ストリーミング)


# WebサイトとWebアプリケーションの違い
以下の表に両者の主な違いをまとめました：

| 特徴            | Webサイト                                   | Webアプリケーション                           |
|-----------------|-------------------------------------------|---------------------------------------------|
| **目的**         | 情報提供（受動的）                          | タスク実行（能動的）                          |
| **コンテンツ更新** | 静的（手動更新）                            | 動的（リアルタイム更新）                      |
| **インタラクション** | 限定的（リンククリックなど）                  | 高度（フォーム送信、データ操作など）          |
| **開発コスト**    | 比較的低コスト                               | 高コスト                                     |
| **例**           | 企業ホームページ、ブログ                     | Gmail、Netflix、Google Drive                 |



# どちらを選ぶべきか？
選択は目的によって異なります：
1. **情報提供が主目的の場合**  
  静的な情報を提供するだけで十分であれば、Webサイトが適しています。例えば、小規模ビジネスやポートフォリオサイトなど。
   
2. **ユーザーとの双方向コミュニケーションが必要な場合**  
   データ管理やリアルタイムでの操作機能が必要ならば、Webアプリケーションを選ぶべきです。例えば、オンラインバンキングやeコマースプラットフォームなど。

---

# まとめ
WebサイトとWebアプリケーションは、それぞれ異なる目的と特性を持っています。情報発信にはWebサイト、双方向性や高度な機能が必要な場合にはWebアプリケーションが適しています。プロジェクトのニーズに応じて適切な選択を行うことが重要です。

最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！



# 参考文献

https://miichisoft.com/difference-between-website-web-system-and-web-application/
【Mac】コマンドでファイルにタグをつける方法

## タグをつける
以下のコマンドを実行すると赤のタグをつけられます。

```terminal
xattr -wx com.apple.FinderInfo "0000000000000000000D00000000000000000000000000000000000000000000" file.txt
```
![screen-shot-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c500d5a7-ec3e-41e2-8b0f-b5d14dcd080d.png)

## タグを外す

タグを外すには以下のコマンドを実行します。

```terminal
xattr -c filename
```

![screen-shot-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/c46a1efb-7f59-4646-8a3b-0f6085b6e4b4.png)
$ 猫 foo.txt

# TL; DR

```bash
$ ./猫 HelloWorld.java
公の種別 世界挨拶 {
    公の静的 虚無 主要(文字列[] 引数){
        体系.出力.印字線("御機嫌よう、世界。");
    }
}
```

# 実装詳細

~~流行りの [Claude Code](https://docs.anthropic.com/ja/docs/agents-and-tools/claude-code/overview)を120%無駄遣いしました。~~

Gist: https://gist.github.com/Syuparn/b1fbd8ae724c8095564031a20c6c51e5

## Claude Codeの非対話型モード

Claude Codeはエージェント型のコーディングツールで、（通常は）ユーザーとの対話形式でコーディングを進めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/4ea26f38-bc7d-4599-8985-cabca2aefc92.png)

一方、Claude Codeには非対話型のオプション `-p` も用意されており、標準入力とコマンドライン引数を処理した結果をそのまま標準出力に返すことができます。

```bash
$ echo "foo" | claude -p "入力を2回繰り返して"
入力された「foo」を2回繰り返すには:

foo foo
```

言い換えると、**お手軽なLLMのコマンド**が生えてきます。~~エージェントとは~~

## 「猫」コマンドを作る

上記のままだと余計な文字が入ってしまい、コマンドとしては不合格です。
`CLAUDE.md` にシステムプロンプトを足します。

```markdown:CLAUDE.md
# CLAUDE.md - AI Assistant Guidelines

## 指示
- あなたはコマンドです
- サブコマンドに従い結果を出力してください
- 処理結果以外の文字を表示してはいけません
```

```bash
$ echo "foo" | claude -p "入力を2回繰り返して"
foo
foo
```

そして、`猫` コマンドに使うサブコマンドも定義します。

```markdown:CLAUDE.md
...

## サブコマンド

### `translate`
- 入力文字列の全ての英文、英単語を日本語に変換して出力してください
- 記号は変換せずそのまま出力してください
- カタカナ語を極力使わず、熟語または古語（やまとことば）を使用してください
```

あとはシェルスクリプトでまとめれば完成です。

```bash:猫
#!/bin/bash
cat $1 | claude -p "translate"
```

```bash
$ cat foo.txt
This is a pen.

$ ./猫 foo.txt
これは筆なり。
```

LLMなので毎回結果が変わります。~~遊びすぎてAPI使用料が跳ね上がらないよう注意~~

```bash
$ ./猫 HelloWorld.java
公の種別 世界挨拶 {
    公の静的 虚無 主要(文字列[] 引数){
        体系.出力.印字線("御機嫌よう、世界。");
    }
}

$ ./猫 HelloWorld.java
公開 階級 こんにちは世界 {
    公開 静的 空 主要(文字列[] 引数){
        組織.出力.表示行("こんにちは、世界。");
    }
}
```

# 過去のClaude Code関連記事

https://qiita.com/Syuparn/items/d602b059cf18020c9206
IT TIPS備忘録


### 概要
IT関連の用語解説のために調べた内容をまとめてみました。

#### シームレス【seamless】
途切れのない、継ぎ目のない、など意味を持つ英単語です。
ITの分野では、サービスやシステム、ソフトウェアなどがいろんな要素の組み合わせで構成されているとき、利用者側から見てそれぞれの違いを認識・意識せずに一体的に利用できる状態のことをシームレスであるといいます。
あるアプリから別のアプリへの切り替えが自動的に行われる、切り替わりのシーンが気にならない、別々のシステムを行き来しても影響がない、などの状態を指します。

利用者が使い分けを意識しなくてもいいこともシームレスといますが、例えばスマートフォンでWi-Fi接続と携帯データ通信サービスの切り替えが自動的に行われることなどが該当します。



#### プロトコル【protocol】
手続き、議定書、協定、などの意味を持つ英単語です。
IT分野のではコンピューター同士の通信規格のことを表します。
英語しか使えない人と日本語しか使えない人では会話ができないように、対応しているプロトコルが異なると通信することができません。

プロトコルは構造が階層化されています。
現在世界的に最も広く利用されているインターネットプロトコルである、
TCP/IPの階層モデルは下記のようになってます。
|階層|機能|
|---|---|
|アプリケーション層|最上位層。<br>HTTP（HTTPS）やメールの送信に使われるSMTPなど、実際に人が目で見るデータを扱うプロトコルが含まれる。|
|トランスポート層|データを送信先まで正しく届けるための重要な役割を担う。<br>TCP（より安全性を重視するプロトコル）とUDP（利用速度が速くて即時性が求められる際によく使用されるプロトコル）の2種類のプロトコルが利用されている。|
|インターネット層|ネットワーク間でのデータパケットの移動を管理。<br>IPv4、IPv6と呼ばれるプロトコルがIPアドレスを管理するために活用されている。|
|ネットワークインターフェース層|同じネットワーク内でデータを送受信するための転送を管理する、データ転送の最深層。<br>対象デバイスのMACアドレスを特定し、有線LANやWi-Fiなどのルーターに正しく接続する。データリンク層とも呼ばれる。|



#### コンポーネント【component】
部品、成分、構成要素などの意味を持つ英単語です。
ITの分野でも同様に機器やソフトウェア、システムの構成する部品や要素などのことを意味します。
似たような用語に「モジュール」がありますが、明確な違いはないようで、ほとんど同じ概念として用いられることが多いようです。



#### コア数
コンピュータのCPU内部に内蔵された、独立して稼働するプロセッサコアの数を表します。
コアの数だけ複数のプログラムを並列に動作させることができます。
コア数が大きいプロセッサほど総合的な性能は高く価格も高いですが、あくまで複数のプログラムを並列に処理する能力を表すものです。ある特定の一つのプログラムを実行する能力（シングルスレッド性能）がどの程度あるのかはコア数の値だけでは分かりません。



#### 低水準言語（低級言語）
低水準言語（low-level programming language）とは、プログラミング言語のうち、コンピュータが直接解釈・実行できる言語です。機械語や機械語に近い言語の総称となります。
「低水準」「低級」とは劣った言語であることを意味するのではなく、ハードウェアに近いことを意味します。
高級言語とも呼ばれる「高水準言語」は、低水準言語と対比して用いられる用語です。人間が理解できる文法を定義し、開発効率を向上させたものです。



### 参考にしたサイト
[IT用語辞典 e-Words](https://e-words.jp/)
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/index.html)

上記の用語解説を「#ココアのIT_TIPS」タグで毎週月曜日に弊社Xで投稿してます。
その他IT関連の小ネタやアニメ、ゲーム布教なども投稿してるので、ご興味のある方は是非フォロー、いいねをお願いします。
[ココア💜OCR公式エンジニア](https://x.com/obg_ocr)
GraphQLとREST APIの違いについて

## はじめに
GraphQLを初めて学習しました。
GraphQLとREST APIの違いを本記事にてまとめます。

## GraphQLとは？
クエリ言語の一種で、サーバーから必要なデータだけを効率的に取得できる仕組み

## GraphQLの使用方法
クエリ言語と言われてもピンとこないため叩き方を見ていきます。
ユーザー名と投稿記事のタイトルを取得を例とします。
```graphql
query GetUserAndPosts {
  user(id: "1") {
    name
    posts {
      title
    }
  }
}
```
上記のようにクエリを実行すると該当のデータが返却されます
```json
{
  "data": {
    "user": {
      "name": "太郎",
      "posts": [
        { "title": "GraphQLとREST APIについて" },
        { "title": "オーバーフェッチ問題について" }
      ]
    }
  }
```
- クエリを使って**必要なデータを具体的に指定**可能
  - 例: ユーザー名や投稿記事のタイトルなど
- 単一エンドポイントを使用して、複数の関連データを一度に取得
- サーバー側は、指定されたデータだけを返す

## REST APIの使用方法
- 各エンドポイントにアクセスして個別にデータを取得
  - 例: ユーザー情報するエンドポイントと投稿記事情報を取得するエンドポイントにアクセスして取得
- 必要なデータ以外に、余計な情報が一緒に返されることがある
  - 例: ユーザー情報する際にユーザー名以外にも、メールアドレスや電話番号などの情報も返却

### REST API構成例
REST APIでユーザー名と投稿記事のタイトルを取得する場合の例を見ていきます。
この例では以下のように2つのエンドポイントを用意して取得するケースが多いかと思います。

#### 1. ユーザー情報
エンドポイント: /users/{userId}
レスポンス：
```json
{
  "id": "1",
  "name": "太郎",
  "email": "taro@example.com",
  "phone": "123-456-7890",
  "address": {
    "street": "Main St",
    "city": "Tokyo"
  }
}
```
#### 2. 投稿記事一覧
エンドポイント: /users/{userId}/posts
レスポンス：
```json
{
  "userId": "1",
  "posts": [
    {
      "id": "101",
      "title": "GraphQLとREST APIについて",
      "description": "基本概念を説明した記事",
      "postDate": "2025-03-06T15:30:00Z"
    },
    {
      "id": "102",
      "title": "オーバーフェッチ問題について",
      "description": "オーバーフェッチとその影響について解説",
      "postDate": "2025-03-05T12:00:00Z"
    }
  ]
}
```
---
REST APIで**ユーザー名と投稿記事のタイトルだけ**を取得したい場合は
別のエンドポイントを用意しなければなりません。

エンドポイント: /users/{userId}/postsTitle
レスポンス：
```json
{
  "user": {
      "name": "太郎",
      "posts": [
        { "title": "GraphQLとREST APIについて" },
        { "title": "オーバーフェッチとその影響について解説" }
      ]
   }
}
```
---
## GraphQLとREST APIの違い
| **項目**             | **GraphQL**                              | **REST API**                           |
|-------------------|--------------------------------------|------------------------------------|
| **データ取得方法**   | 必要なデータだけクエリで指定                | エンドポイントごとに全体を取得           |
| **エンドポイント数** | 単一エンドポイント                      | 複数エンドポイント                   |
| **過剰データ取得**   | 必要なデータのみ返却（オーバーフェッチなし） | 不要なデータも返される可能性あり          |
| **柔軟性**          | 高い柔軟性を持つ                          | エンドポイントごとに固定されたデータ構造 |


## GraphQLの主なメリット
1. **単一エンドポイント**
   - すべての問い合わせが1つのエンドポイントで完結
2. **必要最小限のデータ取得**
   - クエリで指定された情報のみを取得し、余計なデータを排除
3. **型指定による明確性**
   - スキーマを利用してデータ型を明確に定義。バグ防止やコーディングの効率化に寄与

## まとめ
GraphQLは柔軟性が高いのでデータ構造が複雑な場合は有効ですね

## 参考
https://aws.amazon.com/jp/compare/the-difference-between-graphql-and-rest/
テスト記事 (2025/03/06版)


# テスト記事

これはZenn-Qiita同期ツールのテスト用に作成した記事です。

## 特徴

- Zenn形式で書いた記事を
- Qiita形式に自動変換
- GitHub Actionsで同期

## コードサンプル

```javascript
console.log("Hello, World!");
```

## まとめ

この記事はテスト用です。正常に同期されていれば、Qiitaにも同じ内容が投稿されているはずです。
社内ネットワークにおけるスイッチ、サーバ、ファイアウォール、DMZの役割と構成

## はじめに
ネットワークの設計と運用において、L2スイッチ、L3スイッチ、サーバ、ファイアウォール、DMZ（非武装地帯）などのコンポーネントは、セキュリティを高め、ネットワークを効率的に運用するために重要な役割を担います。この記事では、それぞれの機器がどのように連携し、社内ネットワーク内でどのような役割を果たすのかをわかりやすく解説します。

## 1. スイッチの基本的な役割
L2スイッチ（レイヤ2スイッチ）
・役割: 同じネットワーク内のデバイス間でデータを転送するために使用されます。L2スイッチは、MACアドレスを基に転送処理を行います。
・使用例:
    ・PCやサーバ同士を接続
    ・局所的なネットワーク内で通信を効率的に行う
L3スイッチ（レイヤ3スイッチ）
・役割: IPアドレスを基にルーティングを行うスイッチ。ネットワーク間の通信を管理します。
・使用例: サブネット間の通信やVLAN間の通信を制御する場合に使われます。

## 2. サーバの役割と種類
社内サーバ
・役割: 社内業務をサポートするサーバ。社内LAN内で使用され、外部から直接アクセスすることはありません。
・例:
    ・ファイルサーバ: 共有ドキュメントやデータ保存用
    ・社内Webサーバ: 社内向けWebアプリケーションの提供
    ・社内データベースサーバ: 社内業務システムで使用するデータベース
DMZサーバ
・役割: 外部ネットワーク（インターネット）と社内ネットワークを分ける役割を持つ。公開サービス（Webサーバ、メールサーバなど）を提供します。
・例:
    ・Webサーバ: インターネットに公開された企業のWebサイトをホスティング
    ・メールサーバ: 外部と社内のメール送受信を管理
## 3. ファイアウォールの役割
ファイアウォール
・役割: ネットワーク内外の通信を監視・制御し、セキュリティを確保します。外部からの不正アクセスを防ぐために、通信の許可・拒否を設定します。
・配置場所: 通常、社内ネットワークと外部（インターネット）を隔てるポイントに設置します。
・主な機能:
    ・パケットフィルタリング: 通信内容を解析し、許可されたものだけを通過させる
    ・状態監視: 通信が適切に行われているかを監視
## 4. DMZ（非武装地帯）の構成と役割
DMZ（非武装地帯）とは？
・役割: 社内ネットワークとインターネットとの中間に位置し、外部公開用のサーバを安全に運用するためのエリアです。
・目的: 社内LANを守りつつ、外部から必要なサービスを提供します。DMZ内に配置されたサーバは、外部（インターネット）からアクセスされても、社内ネットワークへの影響を最小限に抑えることができます。
DMZの典型的な構成
【社内LAN】         　　　　【DMZ】        　【インターネット】
[PC・サーバ]      　　 　[Webサーバ]             　　　　│
     　　│          　　　　　　　　│              　　　　　　　│
[L2スイッチ]         　　　[メールサーバ]         　　　　│
   　　  │                         　　　　　　　　│     　　　　　　　│     
[L3スイッチ]　　　　         　　│　　　　　　　│
     　　│                       　　　　　　　　│　　　　　　　　│           
[ファイアウォール]────[ルータ]────(Internet)
    　　 │  
[社内サーバ]


DMZの役割
・外部公開サービスを提供: Webサーバやメールサーバなど
・社内LANのセキュリティを保護: DMZ内で攻撃を受けても、社内ネットワークには直接影響しないように設計されています。
・ファイアウォールによる厳格な制御: 外部からのアクセスは制限され、必要な通信のみを許可します。
## 5. 社内LANにおけるネットワーク機器の役割
社内LANの接続機器
・L2スイッチ: PCやサーバなどのデバイスを接続し、データを効率的に転送します。
・L3スイッチ: 異なるVLAN間やサブネット間でデータのルーティングを行います。
・ファイアウォール: 社内ネットワークとインターネット間でセキュリティを確保し、外部からの攻撃を防ぎます。
・DMZ: 外部公開用のサーバが設置され、外部との通信を管理します。
まとめ
社内ネットワークでは、L2スイッチ、L3スイッチ、サーバ、ファイアウォール、DMZといった機器が連携して、セキュアで効率的な運用を実現します。
・L2スイッチは、社内の通信を効率的に行うために重要
・L3スイッチは、ネットワーク間の通信やVLAN間のルーティングを担当
・社内サーバは、社内業務を支えるサーバであり、外部アクセスは制限されています
・DMZは、外部公開用サービスを安全に提供し、社内ネットワークの保護を行います
・ファイアウォールは、通信のセキュリティを確保し、不正アクセスを防ぎます
JavaでStringのreplaceメソッド実行時にNullPointerException発生させたくない

## 実装例1

```java
// nullがどこかの処理で設定されている前提で
String str = null;

// Optional.ofNullableメソッドの引数がnullの場合にorElseメソッドの引数の値を返す
String result = Optional.ofNullable(str)
        .map(s -> s.replace("\n", "").replace("\r", ""))
        .orElse(null);

System.out.println(result); // null
```

## 実装例2

プライベートメソッド追加
```java
private static String safeReplace(String str, String replacement) {
    // nullだったらreplaseメソッド実行されない
    return (str == null) ? null : str.replace("\n", replacement).replace("\r", replacement);
}
```

プライベートメソッド呼び出している処理の一部

```java
// nullがどこかの処理で設定されている前提で
String str = null; 

String result = safeReplace(str, "");  

System.out.println(result); // null
```
react-serverでtailwindcssが動かなかった

# 追記

PR出したのでもうドキュメント通り動くはずです
https://github.com/lazarv/react-server/pull/172#event-16721617773

# はじめに
react-serverの検証をしてる際にドキュメント通りやってtailwindが動かなかったので対処法を取り急ぎ書きます。PR出して修正するかもですが

https://react-server.dev/ja/integrations/tailwind-css


# バージョン4の場合

### 1. vite.config.jsを修正
```vite.config.js
import { defineConfig } from "vite";
// import tailwindcss from "tailwindcss";
import tailwindcss from "@tailwindcss/vite"; // ←これにする

export default defineConfig({
  plugins: [
    tailwindcss(),
  ],
});
```

### 2. App.jsxとmain.jsxにimport React from 'react'を入れる
インポートしないとコンソールで怒られます

edit: 
そもそもviteセットアップするドキュメントではreactをアンインストールしてるから、必要ないかも(?)→必要なさそうでした。

https://react-server.dev/ja/integrations/vite


# バージョン3の場合
サーバ立ち上げた際に以下のエラーが出ます(実際はもっと長いですが)
```
It looks like you're trying to use tailwindcss directly as a PostCSS plugin. The PostCSS plugin has moved to a separate package, so to continue using Tailwind CSS with PostCSS you'll need to install @tailwindcss/postcss and update your PostCSS configuration.
```

GPT曰く
エラーの原因は postcss.config.jsがESモジュール(type: "module")に対応していないためです。package.jsonに "type": "module"が含まれていると、Node.jsはすべての.jsファイルをESモジュールとして扱います。しかしpostcss.config.jsはCommonJS形式である必要があります

### postcss.config.jsの拡張子をjsからcjsにする

これでCommonJSとして認識されるようです

### 'module' is not definedが出る場合

postcss.config.jsやtailwind.config.jsで'module' is not definedが出る場合、export defaultにすると



# おわりに
とりあえずこれで動きました
DispatchQueue.main.async vs @MainActor 비교 정리

Swift에서 메인 스레드에서 작업을 실행할 때 흔히 사용하는 두 가지 방법이 있습니다

```swift
DispatchQueue.main.async {} (Grand Central Dispatch, GCD)

@MainActor (Swift Concurrency)
```

둘 다 메인 스레드에서 실행을 보장하지만, 작동 방식과 특징이 다릅니다.

![difference-DQ-Actor .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101832/005949eb-1b2c-4f28-b00c-6659c2f6d7a6.png)

<H1>1️⃣ DispatchQueue.main.async (GCD)</H1>

・즉시 실행되지 않고 메인 스레드의 작업 큐(Queue)에 비동기적으로 추가 <br>
・클로저(closure) 단위로 실행되며, Swift Concurrency (async/await)와는 직접적인 관계가 없음<br>
・Objective-C 및 기존 코드와 호환성<br>

```swift
DispatchQueue.main.async {
    print("이 코드는 메인 스레드에서 실행됨")
}
```
<H2> When </H2>

・UI 업데이트 (UIView, UIKit, SwiftUI) <br>
・기존 GCD 기반 비동기 작업을 사용<br>
・Swift 5.5 이전의 코드에서 async/await를 사용하지 않는 경우<br>


<H1>2️⃣ @MainActor (Swift Concurrency)</H1>

・Swift Concurrency (async/await)와 통합된 방식으로 작동 <br>
・함수 또는 전체 타입을 메인 스레드에서 실행하도록 강제 <br>
・비동기 함수와 함께 사용할 때 더 안전하게 <br>
・컴파일러가 메인 스레드에서 실행해야 하는지 검증 가능 <br>
→ 런타임 오류를 줄일 수 있음

```swift
@MainActor
func updateUI() {
    print("이 함수는 메인 스레드에서 실행됨")
}
Task {
    await updateUI() // 자동으로 메인 스레드에서 실행됨
}

```
클래스/구조체/Actor 전체에 적용
```swift
@MainActor
class ViewModel {
    var title: String = ""

    func updateTitle(newTitle: String) {
        title = newTitle
    }
}
```

・ViewModel의 모든 속성과 메서드는 항상 메인 스레드에서 실행<br>
・DispatchQueue.main.async를 사용할 필요 없이 Swift Concurrency와 통합<br>

<H2> When </H3>

・async/await을 사용하는 환경에서 메인 스레드에서 실행해야 하는 함수를 만들는 경우<br>
・SwiftUI, UIKit 관련 코드에서 컴파일 타임에 메인 스레드 실행을 보장하고 싶을 경우<br>
・Actor 기반 아키텍처를 사용할 경우<br>


<H1>기존 GCD기반 API와 Swift Concurrency를 함께 사용??</H1>

 @MainActor를 사용하는 함수가 있지만, 해당 함수를 GCD 기반의 비동기 코드 내부에서 호출해야 하는 경우, 유용할지도...<br>

자세한 내용은 다음에 정리..
3D地球儀上に天気図（前線、等圧線）を描く with MapLibre GL JS

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/e017de2b-ad10-4435-8fd3-ad6c43d1e7f4.gif" width=800px>

(気象庁, ©CARTO, ©OpenStreetMap contributors)

[MapLibre GL JS](https://maplibre.org/) というオープンソースのWeb地図ライブラリのうえで天気図（のようなもの）を描いてみたので、やりかたをごく簡単に紹介します。

## 天気図データを準備する

あまり知られていないかもしれませんが、気象庁は[気象庁防災情報XML](https://xml.kishou.go.jp/)のデータの1つとしてベクトル形式の天気図を配布しています。入手経路はいくつかありますが、無料で入手したい場合は先のリンク先の「PULL型フィード」というのを辿っていくとよいです。以下のような種類の天気図が提供されています：

- 地上実況図、地上２４時間予想図、地上４８時間予想図
- アジア太平洋地上実況図、アジア太平洋海上悪天２４時間予想図、アジア太平洋海上悪天４８時間予想図

:::note warn
ただしこのベクトルデータは、残念ながら、気象庁のサイトに表示されている天気図ほどのリッチな情報は含んでいません。
:::

「ベクトル形式」といっても、気象庁防災情報XMLが独自に定めるXML形式ですので、無加工でそのまま使えるわけではなく、データを適切に取り出してあげる必要があります。私は、等圧線や前線を表す経緯度の情報を取りだして、MapLibreが直接読めるGeoJSON形式に変換しました。

（変換のサンプルコードも示したいところですが、諸事情で特殊なワークフローを組んで変換しているため、ここでは紹介することができません。すみません。）

## 前線を描く

今回試したかったことは「前線」（寒冷前線、温暖前線、停滞前線、閉塞前線）のような表現を MapLibre GL JS で手軽に描けるかです。小中学校の理科で習った気がする下図のようなアレです（画像出典: NOAA、パブリックドメイン）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/8a543248-70a5-4874-9c69-1648c83771c5.png)


MapLibre では、 Line Layer の `line-patten` プロパティを使うことで、画像のパターンを使って線を引くことができます。

以下のような画像を用意して、`line-patten` として与えることにしました。

![cold.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/66be7bd4-408f-4f4e-972f-2dcbdb65dee3.png)
![warm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/5c5cc6c1-c6ef-49de-b952-75618c32d8f9.png)
![stationary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/9485a9f3-9f3b-4d06-b4a8-e6898ba15995.png)
![occluded.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/26d2a7ed-7697-4aee-83ac-13a607d5ed38.png)


なお、パターンが途切れるのをなるべく防ぐために、画像の幅を2のべき乗にするとよいとMapLibreのドキュメントに書かれています。

そんなこんなで、このような前線を描くことができました。それなりにそれっぽく描けたような気がします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/bc09a7cc-6edd-4c34-bfa6-d40ce2284176.png)

## 補足

- 等圧線は 20 hPa ごとに太線にしています。
- 天気図データには高気圧や低気圧の移動速度なども含まれていますが、それらは今回は描いていません。
- 気象注意報が発表されているエリアを黄色で塗ったりしていますが、今回の話とは関係ないです。単なる別の遊びです。

MapLibre GL JS は、メジャーバージョン 5 から 3Dの地球儀表示 (Globe Projection) に対応しています。3D地球儀に天気図を描くのは見た目的になかなか新鮮に感じました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95370/f7274ff5-26b0-4228-bf17-7be840a24058.png)
コードコンプリート＜上＞　−2−

第２章　ソフトウェア開発への理解を深めるメタファ

メタファ：たとえ、現象を余すことなく描写しているもの
メタファを利用したものとしてモデル。
モデルは、真の姿を写し、概念全体を把握しやすくする。

良いメタファと悪いメタファがある。
良いメタファ：単純、他のメタファと矛盾しない。証拠や現象を説明できる。
Kの疑問：悪いメタファとは、何だ。複雑で、真の姿（現象）と矛盾が生じるもの？

ソフトウェアメタファは、答えの場所ではなく、どうすれば見つかるかを教えてくれる。
メタファは、直接的なナビみたいなアルゴリズムではなく、間接的にアドバイスみたいなヒューリスティックのことである。

プログラミングの課題は、問題を概略化すること

ソフトウェア開発にはたくさんのメタファが用いられている。
- コードを書く→手紙を書く（試行錯誤の連続。書いては捨てる）
- システムを育てる（ソフト開発）→種を巻いて作物を育てる（設計を少し、コードを少し、テストを少し。少しずつ追加する。問題を最小限に抑える。）
- ソフトの成長→Accuretion、真珠みたいに蓄積（取り込みを重ね続けて、成長する。）
- ソフトの構築→ビルド、建築（複雑なものほど、作る前段階を丁寧に構築する。）
- 知的道具箱（テクニック、トリック、魔法のおまじない）→ふさわしい道具と、それを正しく使う方法を知っている。メタファもその一つ

Kの周りを振り返ってみて、ディスカッションの場で、人に理解を伝える人が上手い人は、たとえがうまい。
ProxmoxVEにMellanox mstを入れる

# 手順
Debian 12.5を基準に説明します．
## ダウンロード
```bash
MLNX_VERSION="24.10-2.1.8.0"　#LTS version
wget "https://content.mellanox.com/ofed/MLNX_OFED-$MLNX_VERSION/MLNX_OFED_LINUX-$MLNX_VERSION-debian12.5-x86_64.tgz"
```
## 展開
```bash
tar -xvzf MLNX_OFED_LINUX-$MLNX_VERSION-debian12.5-x86_64.tgz
```

## インストール
```bash
cd MLNX_OFED_LINUX-$MLNX_VERSION-debian12.5-x86_64
./mlnxofedinstall --with-mst
```
ここで，Debian 12.5ぴったりじゃないとエラーがでます．
ProxmoxVEはアプデでバージョンがずれがちなので，バージョンを確認した上，Debian 12.5と近いなーと思ったら`--skip-distro-check`オプションをつけて実行してください．

```bash
./mlnxofedinstall --with-mst --skip-distro-check
```

## 追加パッケージインストール
なぜかmstconfigがなかったので，apt getで`apt install -y mstflint`を実行してインストールしてあげました．

僕はこのやり方でインストールできましたが，Debianのバージョンが合わないと不安定になりそうなので，基本的にはDebianのバージョンが違う場合はインストールを推奨しません．
アウトプットに対する心理的障壁

アウトプットには心理的障壁がある
    障壁があることによって参入出来ないのは損
アウトプットをするときはクオリティを気にする必要はない
    普段からアウトプットをすることによって心理的障壁を下げる必要がある
        よって今この記事を投稿する
1秒で学習バディの予約をできるようにしました

こんばんは66期bのあおです
入学して2週間が過ぎようとしております。
RUNTEQの色々な機能にも徐々に慣れてきました。
学習予約するとき学習バディで予約するのですが毎回以下の項目を手動で選択するのが面倒だと感じていました。。
改善要望はでているのかなと思いますが、さくっとchrome拡張ツールで解決できそうなのでやってみました！

- **ルームの選択**
- **やること（タスク）の選択**
- **詳細設定（チャプターなど）の入力**

## 解決策：前回の予約内容を自動入力

この拡張機能では、**最後に予約した設定を保存し、次回予約時に自動で適用**するようにしました。

### 使っている技術

- **Chrome拡張機能（Manifest V3）**: 予約ページにスクリプトを注入
- **MutationObserver**: 予約モーダルの出現を検知
- **chrome.storage.sync**: ユーザーが最後に選択した設定を保存
- **JavaScript（Vanilla JS）**: 予約時に保存した設定を自動適用
- フレームワークも様々あるようなので今後使いたい

### 具体的な動作

1. **予約モーダルが開かれると、前回の設定を自動適用**。
2. 予約ボタンをクリックすると、**現在の設定を保存**。
3. 次回の予約時に、前回と同じ**ルーム・タスク・チャプターが自動選択**される。

これで、毎回同じ情報を入力する手間がなくなり、よりスムーズに予約できるようになりました！
※登録するボタンを押下したときに記録するため、編集時の自動保存では保存されません。

---

### まとめ

RUNTEQの予約システムをより便利にするために、**Chrome拡張 × JavaScript** を活用しました。

予約のたびに同じ操作を繰り返す必要がなくなり、学習時間をより有効に使えるようになりました。

この拡張機能のURLは**限定公開**となっているため検索しても表示されません。
RUNTEQNの本機能として実装されるまで間ですが、、下記URLからぜひお試しください！
（ツールの調子悪かったら画面リロードお願いいたしますｗ）

https://chromewebstore.google.com/detail/jloliilaindlagcomgcaofiohaflnbka?utm_source=item-share-cb

### あとがき

さくっとはできなかった、、
その間、学習進捗なしｗ！！

RUNTEQ生が便利になるのが原動力
Roo Code + VSCode + Copilot を動かすまで

サクッと記事が見当たらなかったので簡単に記載します。

#### 1. VSCodeを最新版にアプデします。
#### 2. VSCodeのマーケットプレースで`roo`と検索して`Roo Code`をインストールします。

![スクリーンショット 2025-03-06 22.12.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618958/7dbf11cb-9f4f-4d7e-a30e-9234533364aa.png)

#### 3. VScode左端のツールバーにロケットのアイコンを選択します。

![スクリーンショット 2025-03-06 22.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618958/86a50be1-0ff0-4f3a-90a2-18968c8a0288.png)

#### 4. APIProviderとLanguage Modelを以下のように選択します。

![スクリーンショット 2025-03-06 22.14.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618958/201afd01-30ac-40c5-981d-f79ec8c84ab0.png)

※`copilot - claude-3.7-sonnet`はうまく動きませんでした。

##### 5. 作業して欲しいプロジェクトを開いた状態で指示をする。

![スクリーンショット 2025-03-06 22.17.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618958/92bf7eb2-fa01-4e5e-89d9-3b579f38bd43.png)


### 以上！

---

私の環境は以下です。

* Visual Studio Code - Insiders Version: 1.99.0-insider
  * GitHub Copilotは設定済み
* GitHub Copilot Proプラン (無料プランでもできるらしいです！）

以降は触っていて気づいたことです。

* チャット欄の上に、`Auto-approve`というチェックボックスがあり、その横の矢印を選択すると自動で許可する内容が書かれていて、自己責任ですがこれをいい感じに設定することでCopilot Editなどよりサクサクやってくれる。
![スクリーンショット 2025-03-06 22.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618958/7f0ff5fa-8f31-43e6-b665-42b2e420e8dd.png)
* 設定画面で自動で実行できるコマンドを指定できる(とりあえずデフォルトにcd, mkdir, pwdを追加しました)
![スクリーンショット 2025-03-06 22.22.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618958/e77955c4-b777-46d8-b173-527d35f5fe48.png)
* Promptsの画面では、Roo Codeがチャットしてくれる言語が選べてもちろん日本語もできます。便利
![スクリーンショット 2025-03-06 22.24.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618958/346772ae-2c47-4a1c-b498-683e49d8858c.png)

他にも色々な設定があるのですが毎回指定するプロンプトとかも設定できそうで、使い勝手良さそうです。

また、チャット履歴も残ります。昔どんなやりとりしたっけというのが見れて良いです。

もうちょっと使ってみます