OmniAICreator/Qiita-1.07M huggingface dataset:
モンティ・ホール問題と今週のモツオ

## はじめに
今週のジャンプの『僕とロボ子』にて、「モンティ・ホール問題」がでてきました。が、おそらく間違っているのでまとめておきたいと思います。

:::note warn
Qiita(エンジニア)向けの記事かといわれると少し微妙かもしれません...。
:::

## 一般的なモンティ・ホール問題
これについては、たくさんの解説が世に溢れているので省略します。
wikipedeiaのリンクを張っておきます。[モンティ・ホール問題のwikipedia](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C)

## モツオのモンティ・ホール問題
「一般的なモンティ・ホール問題」（以下、「一般も」）と「モツオのモンティ・ホール問題」(以下、「モツも」)の違いとして重要なことは以下だと思います。
　**・司会者(ボンド)が当たりを把握していない**
　**・司会者(ボンド)が挑戦者(モツオ)の選択を把握していない** 
「モツも」では、ボンドが当たりを引いてしまったり、モツオと同じものを選択してしまうことがありうる。つまり、そもそもモツオに選択の機会が与えられないような、**'無効'になる場合が存在**します。たまたま「一般も」と(見た目上)似た状況になったということです。
細かい議論はなしにしても、2つ目の違い「・司会者(ボンド)が挑戦者(モツオ)の選択を把握していない」時点で、そもそもモツオの選択に「特別さ」がないので、確率はかわらないはずです。モツオが頭で念じるだけで確率がかわることになってしまう(量子力学の話しは置いておきましょう)。

## まとめ
簡単にまとめると以下のようになります。
右側の「モツオの状況」では、モツオの一回目の選択とボンドの選択が重なった場合はそもそも無効なので省略し、モツオの一回目の選択とボンドの選択が異なる場合についてかいています。真ん中の行はボンドが当たりを引いているのでこれも無効です。結局確率は1/2になります。

![IMG_0641.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900848/cb0feb5d-f5ae-4fe2-b8a0-780e575b3ecb.jpeg)

## おわりに
かなり簡単にささっと書きました、間違っていたら教えてください。
しかしモツオ、小学生でモンティ・ホール問題を知ってるなんてすごいです。
【Python】リストの要素を逆順位に並び替える


## そもそも論

Pythonのリストの要素を逆順に並べ替える方法はいくつあるのか？
基本的には **reverse**メソッドを使うぐらいかもしれない。
今回、プログラムを勉強するにあたっていくつあるのか？考えてみた。

## 1.オーソドックスな**reverse**メソッドを使う方法

```python

llist = [1,2,3,4,5]
result = llist.reverse()
print(result) #5,4,3,2,1

```
reserseメソッドはインプレースでリストの要素を並べ替え

## 2.revesed関数を使う方法

```python

llist = [1,2,3,4,5]
result = list(reversed(llist))
print(result) #5,4,3,2,1

```

reserved関数の戻り値がリストではなくイテレータであること

## 3.スライスを使う方法

```python
llist = [1,2,3,4,5]
result = llist[::-1]
print(result) #5,4,3,2,1

```
開始位置と終了位置を省略して、差分を-1にすることで逆順に並んだ要素を取得することを意味します。

## 4.内包表記を使う

```python
llist = [1,2,3,4,5]

result = [llist[-index] for index in range(1,len(llist) + 1)]
print(result) #5,4,3,2,1

```

len関数でリストの要素数を調べて、range関数で1始まりのインデクスを反復
そして、マイナスのインデックとして指定することで末尾から要素を取り出していく
forループ vs Map！検索を最適化する方法（辞書の基本問題）

Paizaの問題で学んだことをメモ。名前から財産を検索するだけのシンプルな問題だけど、「for ループと Map どっちが速い？」って考えたら、結構面白かった。

<br>📌 **問題概要**
n人の名前と財産を入力し、指定された人(S)の財産を出力する

入力例：
```
2　　　　　　　　//n
Kirishima 1
Kyoko 2
Kirishima　　　//S
```
出力例：
```
1
```
やること：
n 人の「名前＋財産」を受け取る
S（検索する名前）の財産を出力

<br><br>📝 forループで検索
```js
for (let count = 1; count <= N; count++){
    let pair = lines[count].split(" ");
    if(pair[0] === S){
        console.log(pair[1]); 
        break; // 見つけたら即終了！
    }
}
```
✅ シンプルで、少量データならOK
⚠️ O(N) なので、データが増えると遅くなる

<br><br>🚀 Map で最適化
```js
const dict = new Map();
for (let count = 1; count <= N; count++) {
    let [key, value] = lines[count].split(" ");
    dict.set(key, Number(value));
}
console.log(dict.get(S)); // O(1) で即検索！
```
✅ O(1) で高速検索
✅ ループ不要でシンプル

<br><br>🔍 **結論**
✅ 少量データなら for ループでOK
✅ 大量データなら Map で爆速検索！
適材適所でデータ構造を選ぶのが大事！
今回の問題のテーマが辞書の基本だったから、`map`の方で練習した方が良いかも。

[僕の失敗談と解決話！ 🚀](https://paizabeginner.wordpress.com/2025/03/12/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%e8%be%9e%e6%9b%b8%e3%81%ae%e5%9f%ba%e6%9c%ac%e5%95%8f%e9%a1%8c%ef%bc%81%e9%85%8d%e5%88%97%e6%a4%9c%e7%b4%a2-vs-map%e3%80%81/)
EF Coreでシーケンスを用いたId以外の列の自動採番を行う

# 前提・目的
- EF Coreを使った新規登録を行う。
- SQL Serverを利用。
- こんなテーブル
```sql
CREATE TABLE [dbo].[MyTableSample1](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[SubId] [nvarchar](10) NOT NULL,
	[Name] [nvarchar](50) NULL
)
```
- **`Id` 以外に`SubId`という`varchar(10)`の列があり、新規登録時にはシーケンスを参照して自動採番をしたい。**


# 手順
## SQL Server側の設定
### シーケンスの生成
```sql
CREATE SEQUENCE [dbo].[MyTable1SubId1_SEQ] 
 AS [int]
 START WITH 1
 INCREMENT BY 1
```

シーケンス名は適当に。

### SubIdにDEFAULT制約を指定し、シーケンスを参照させる
```sql
ALTER TABLE [dbo].[MyTableSample1] ADD  CONSTRAINT [DF_MyTableSample1_SubId]  
DEFAULT (NEXT VALUE FOR [MyTable1SubId1_SEQ]) FOR [SubId]
```

これによって、INSERT時に`SubId`が`null`なら自動的にシーケンスの`NEXT VALUE`を取ってきて設定してくれる。

## EF Core側の設定
### DbContextのOnModelCreatingに以下のように追記
`HasDefaultValueSql()`を`SubId`プロパティに対して設定する。
```diff_c_sharp
modelBuilder.Entity<MyTableSample1>(entity =>
{
    entity.HasKey(e => e.Id).HasName("PK_MyTableSample1");
    entity.ToTable("MyTableSample1");
    entity.Property(e => e.SubId)
        .IsRequired()
+       .HasDefaultValueSql();

    entity.Property(e => e.Name)
        .IsRequired()
        .HasMaxLength(50);
});
```

`HasDefaultValueSql()`を付けることでこのフィールドにDEFAULT制約があることを明示する。これによってEF CoreによるINSERT時にこのフィールドが`null`であっても例外を上げなくなる。

この`HasDefaultValueSql()`は、そのまま空の引数でもよいが、できれば実際のDEFAULT制約の指定値を設定しておく方が良い。

```csharp
        .HasDefaultValueSql("(NEXT VALUE FOR [MyTable1SubId1_SEQ])");
```

こうすることで、Code FirstによるDB生成時に自動的にDEFAULT制約を付与してくれる。
先にDB側でこのDEFAULT制約を設定してからDbContextをスキャッフォルドしなおせば、自動的に上記のコードが付加されるものと思われる。

勘違いしやすいが、上記のようにC#側で `HasDefaultValueSql("(NEXT VALUE FOR シーケンス名)")` を指定すれば、INSERT時に自動的に規定値が設定されるわけではない。この点は最初勘違いしてドはまりした。ネット上にも勘違いしていると思われる記事が見られ、Copilotも嘘情報を教えてくる。この引数にはあくまでもCode First時の参照情報としての役割しかないようで、例えば`"test"`のような適当な値を設定してもINSERT時にｈ何もエラーは起きない。

## 新規登録コードのサンプル
```csharp
var entitiy = new MyTableSample1
{
    Name = "テスト",
};
db.Add(entitiy);
await db.SaveChangesAsync();
// SaveChanges後、EF Coreによってentity.Id と entity.SubId には新しい値が設定される
```

上記のコメントにもあるように、`SaveChanges()`の後、`entity.Id`と`entity.SubId`には自動的に採番された値が設定される。

これはEF Core内部ではSQLのOUTPUT句を用いて実現されている。
さすがEF Core、便利なことこの上ない。
```sql:EF Coreが発行するINSERT文
  SET NOCOUNT ON;
  INSERT INTO [MyTableSample1] ([Name])
  OUTPUT INSERTED.[Id], INSERTED.[SubId] -- この行によってIdとSubIdが返される
  VALUES (@p0);

```

# あとがき
`SubId`の型が`varchar(10)`なのはわざとで、`int`にしない場合どうなるのかなと思ったが問題なく文字列として数値が設定された。

記事中にも書いたが、最初`HasDefaultValueSql`を指定することでINSERT時にデフォルト値が適用されるようになるよ、というような事をCopilotが言い出して、ホンマかと思ってやってみたら普通に「null非許容フィールドにnullを設定しようとしました」みたいなエラーが出て「なんでや！？」と思って公式サイトを見に行くも、確かにそのような話が書かれており…。

しかしここで「これひょっとしてCode First前提なのでは」と思い当たり、そこから調べた結果、どうやらそうらしいということで、同じ事でハマってる人の救いになればと記事に残しておきます。


# 参考
https://learn.microsoft.com/ja-jp/ef/core/modeling/sequences

https://learn.microsoft.com/ja-jp/sql/t-sql/functions/next-value-for-transact-sql?view=sql-server-ver16
【Next.js × TypeScript】Next.jsでQiita＆microCMSの記事を表示してテックブログを作成

# はじめに
今回は`Next.js`を使用したアプリの制作を行いました。これまでは`React`と`Vite`を使用してアプリを制作することが多く、今回が初めての`Next.js`での制作になります。

# アプリについて
## 使用技術
```
- 環境
Next.js: 15.1.7

- 言語
typescript: 5.2.2

- ライブラリ
react: 18.2.0

- CSS
tailwindcss: 4.0.9
daisyui: 5.0.0-beta.8

- Test
testing-library/dom: 10.4.0
testing-library/jest-dom: 6.6.3
testing-library/react: 16.2.0
types/jest: 29.5.14
types/node: 20.8.10
types/react: 18.2.33
types/react-dom: 18.2.14

- デプロイ
Vercel

```

## 実装機能
### TOP画面
`Qiita`に投稿された記事と`microCMS`で管理しているブログ記事を`API`で取得し、4記事をピックアップして表示しています。

![画面収録 2025-03-09 12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/46ac2ecf-b166-4894-977c-bdf46a794159.gif)

### Qiita記事画面
`Qiita`の記事一覧を16記事 表示し、いいね数と閲覧数をカード上に表示 しています。
クリックすると、`Qiita`の実際の記事ページへ遷移します。

![画面収録 2025-03-09 13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/885699f8-306f-4a8e-b194-d0afe3a78b01.gif)

### ブログ画面
`microCMS`で投稿したブログ記事を12記事表示しています。
`Qiita`と同様に、クリックすると 記事の詳細ページ へ遷移できます。

![画面収録 2025-03-09 13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/7a56f6a4-503e-4942-9cd8-7492dade9db2.gif)


## 工夫したところ
+ ***ディレクトリ構成***

以下の記事を参考にしながら、見やすく管理しやすいディレクトリ構成 を採用しました。

```
src
|
+-- app
|
+-- api   
|
+-- components 
|
+-- features   
|
+-- libs    
|
+-- public  
|
+-- utils     
|
+-- tests     
```

https://techblog.technology-doctor.com/entry/2024/09/12/172551
+ ***いいね数と閲覧数を表示***

`Qiita`の記事のいいね数と閲覧数が一目でわかるようにしました。

![スクリーンショット 2025-03-10 20.43.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/6bfe81d5-d179-49e2-943e-e04024ac238f.png)

## 難しかったところ
今回一番苦労したのは、***クライアントコンポーネントとサーバーコンポーネントの使い分け***です。

+ ***最初の実装（失敗例）***
はじめはすべてクライアントコンポーネント（`CSR`） で作成していました。
`Qiita`と`microCMS`の`API`をクライアント側で毎回取得 していたため、ページ遷移やリロードのたびにデータを再取得してしまい、表示が遅くなる問題 が発生しました。

+ ***修正後（成功例）***
`Next.js`のサーバーコンポーネント（`SSR`） を利用し、記事データをサーバーで取得し、ページ遷移時の負荷を軽減 しました。この修正により、***ページ表示の速度が向上******不要なAPIリクエストが減り、通信コストを削減***できました！

## 成長を感じたところ
以前は`useState`を使うときに 「use client をつければOK」 という認識しか持っていませんでした。しかし今回の実装を通して、`CSR・SSR・SSG・ISR`などのレンダリング手法の違い を理解できました。

またページのパフォーマンスを意識する視点 が身についたのも大きな成長ポイントです。最初に`CSR`で実装したときは、記事が4つ並んでいるだけなのに毎回データを取得していたため、表示速度が遅くなってしまいました。`SSR`に切り替えたことで、不要なリクエストを減らし、スムーズなUXを実現できました。

# 終わりに
今回の`Next.js`を使った実装では、クライアントコンポーネントとサーバーコンポーネントの違いを意識することの重要性 を学びました。特に`API`のデータ取得とレンダリング手法の最適化 は、今後の開発でも活かせる知見になりました！

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
ECRへのpushで少し詰まった

awsのスイッチロール先のecrにpushする際に詰まったので備忘録として記録します。

### ECRレポジトリを作成
まずecrにレポジトリを作成する。
次にawsのセキュリティ認証でアクセスキーを作成する
この時、アクセスキーとシークレットアクセスキーをコピーしてcsvをダウンロードする。

### ローカルのcredentialとconfig
次に `vi ~/.aws/credentials` でアクセスキーとシークレットアクセスキーを記入
```:例
[hoge-deploy]
aws_access_key_id = ........
aws_secret_access_key = ........
```
次に `vi ~/.aws/config` でprofileを記入

```:例
[profile hoge-deploy]
region = ap-northeast-1
output = json
```

### ECRにpush
そのあとはログインしてpushする。
アクセスキーが複数ある場合は、ログインの際に—profile [profile名]をつけるのを忘れずに。
つけなかったらdefaultが優先される
```:例
$aws ecr get-login-password --region ap-northeast-1 --profile hoge-deploy | docker login --username AWS --password-stdin xxxx.dkr.ecr.xxxx.amazonaws.com
$docker tag hoge:latest xxxx.dkr.ecr.xxxx.amazonaws.com/hoge:latest
$docker push xxxx.dkr.ecr.xxxx.amazonaws.com/hoge:latest
```

ec2がecrからpullしたい時には、ec2にロールを付与しないといけない。
今回はpullのみ必要だったので　`AmazonEC2ContainerRegistryReadOnly` を付与しました。
EC2のコンテナ → アクション → セキュリティ → IAMロールを変更 → AmazonEC2ContainerRegistryReadOnly を選択して、変更をクリック
「だから言ったでしょ」を積み重ねる

「リスクの可視化」はQAの重要な仕事1つです。
でも正直なところ、リスクって実際に起こらないとその指摘のありがたみってわからないですよね。

「いくら言っても聞いてもらえない…」
QA担当者なら、一度はそんな経験をしたことがあるのではないでしょうか？

とはいえ、指摘し続けることは必要だと思います。
もっと言うと、指摘したリスクが現実になった時に「だから言ったでしょ（※）」
と言える状態にしておくことこそが重要なのではないでしょうか。
（※）実際にそんな言い方したら角が立つのでオススメしませんｗ

QAの仕事は、健康やインフラと似ていて、
普段は当たり前のように存在しているけれど、なくなって初めてそのありがたみが分かる。
リスクが顕在化するという異常事態が発生して初めて、
「あの時QAが言っていたことは正しかったんだ」と理解してもらえる。
だからこそ「こういうリスクがあるけど、大丈夫ですか？」
というコミュニケーションが不可欠な訳です。

ただ、だからといって闇雲に伝えればいいという訳でもありません。
「この人の言うことって、結局何も起きないよね」なんて思われてしまったら、
本当に重要な指摘も聞き入れてもらえなくなり、逆効果になってしまいます。
大切なのは、現実的に起こる可能性の高いリスクを見極める「選球眼」を持つこと。
（初手は、その選球眼を養うために片っ端から指摘していくのもありだと思います。）

そうやって「だから言ったでしょ（※）」を積み重ねていくことが、
QAの信頼性を高め、価値を理解してもらうために効果的な方法の1つだと思います。
（※）再：実際にそんな言い方したら角が立つのでオススメしませんｗ
アプリの独自分類：GET型、POST型など

アプリ開発をするようになってもう何年も経っている。
自分で作れる範囲のアプリはなるだけ作ってきたので、その感覚によってアプリを分類してみようと思う。
アプリは大まかに分けると以下のように分類できる。

* GET型
* POST型

さらにこれらの2つは以下のように細分化できる。

* 非会員GET型
* 会員GET型
* 非会員POST型
* 会員POST型

POST型については以下のように細分化できる。

* POST型（自由書式）
* POST型（限定書式）

つまり全ての分類を行うと以下のようになる。

* GET型
  - 非会員GET型
  - 会員GET型
* POST型
  - 非会員POST型
     - 非会員POST型（自由書式）
     - 非会員POST型（限定書式）
  - 会員POST型
     - 会員POST型（自由書式）
     - 会員POST型（限定書式）

## アプリの難易度

アプリは一般的に自由度が高いほど管理が難しくなる。
つまり難易度は GET型 < POST型であり、さらに 会員POST型 < 非会員POST型 であり、限定書式 < 自由書式 であると言える。

* 管理の難易度
  - GET型 < POST型
  - 会員POST型 < 非会員POST型
  - 限定書式 < 自由書式

一番管理が楽なのは非会員GET型である。
一番管理が難しいのは非会員POST型（自由書式）であると言える。


## GET型

GET型はHTTPメソッドにおけるGETによって駆動するアプリである。
つまりサーバーはデータの返却だけを行う。

具体例としてはメールフォームや掲示板などが付属していない個人サイトがあげられる。
つまりテキストだけコンテンツとして配信しているアプリである。
これはGET型である。

### 非会員GET型

GET型の内、非会員サイトがこの型になる。
先ほどの例で挙げた個人サイトが会員制サイトでなければGET型である。

この型のアプリはもっとも管理が楽であると言える。
配置するコンテンツにさえ気を付けて、FTPアカウントなどを適切に管理すれば「ほぼ」放置で管理できる。

もっとも改ざんチェックなどはたまに行わないといけないので、管理が0になるわけではない。

### 会員GET型

この型は会員制サイトでかつコンテンツがGET型であるアプリである。
ログインは必要だが、そのほかのコンテンツはすべてGETで取得できるものがこれに当たる。

会員型の特徴としてユーザーの会員情報を管理しなければいけないことが挙げられる。
よって、GET型といえど会員型は難易度がそれなりに高いと言える。

## POST型

HTTPメソッドの内POSTを使うアプリがこの型になる。
つまりGETによるデータの取得だけでなく、データの投稿を行えるアプリがそうである。

データの投稿を行えるようにすると、XSSやCSRFなどのセキュリティに気を使う必要が出てくる。
そのためGET型に比べて開発と管理が難しくなると言える。

### 非会員POST型

この型はPOSTできるが非会員、つまり半分匿名で利用できるアプリである。
匿名掲示板などがこれに当たる。

匿名と言ってもサーバーのログにはIPアドレスが残るので完全に匿名になるわけではない。
もっともプロキシやVPNなどを使えば匿名性を高めることはできし、それらに対応する必要も出てくる。

データが匿名で投稿される特徴があるため、管理難易度は高いと言える。

#### 非会員POST型（自由書式）

非会員POST型の内、投稿データが自由書式（フリーフォーマット）であるのがこの型である。
具体例を挙げると「2ちゃんねる」などがこれに当たる。

投稿データが自由書式になっていることから、データの合法性を確認することがほぼ不可能になる。
NGワードによる投稿データの拒絶なども万能ではなく、規約に違反する行為を事前に防ぐのはほぼ不可能と言っていいだろう。

また非会員制なので、データを投稿するユーザーが匿名ユーザーであることが多い。
プロキシやVPNなどを事前に弾いておかないと、匿名ユーザーによる投稿を許すことになるため、実装の難易度も高い。
管理コストが高く、個人的に「初心者には管理は無理」であると言える。

#### 非会員POST型（限定書式）

非会員POST型の内、投稿データが限定書式になっているのがこの型である。
データの形が制限されており、自由書式と比べて自由度が少ないのが特徴である。

非会員POST型は管理が難しいのが特徴だが、投稿データを適切に制限すれば難易度が下がると言える。
たとえば入力を自由テキストではなく、ラジオボタン（真偽値）にするなどの工夫を行う。

データが無害であることが設計の段階で確保されるため、管理コストを下げることが可能。

### 会員POST型

POST型の内、会員制のアプリがこの型である。
会員情報と投稿データの両方の管理が必要であるため、難易度は高いと言える。

だが非会員型に比べると、ユーザーがメールアドレスと紐づくため、匿名性が低くなるのが特徴。
最近のWebアプリはたいていこの型である。

#### 会員POST型（自由書式）

会員POST型の内、投稿データが自由書式であるアプリがこの型に当たる。
具体例を挙げるとQiitaなどがそうである。

投稿データが会員データと紐づくのが特徴であり、匿名性は低い設計であると言える。
規約に違反する投稿をするユーザーは会員データによって弾くことができるため、管理が比較的に楽になる。

#### 会員POST型（限定書式）

会員POST型の内、投稿データが限定書式であるアプリがこの型に当たる。
あまりこの型のアプリは見かけたことがない。
たいていみんなフリーフォーマットである。

## おわりに

今回はアプリの独自分類をしてみた。
初心者はアプリの設計をするときにこの記事を眺めるといいかもしれない。
おわり
【MongoDB】データ取得のタイミングが曖昧だったのできちんとまとめてみた



業務でmongoDBを使用しているのですがデータが取得されるタイミングが曖昧のまま実行処理をおまじないのように書くだけだったので、部下に説明するタイミングできちんと理解しようと思った今日。
```ruby:おまじないコード
# 複数データを取得するときのおまじない 【.to_a rescue []】
items = item.where(category: "food").to_a rescue []
# 1件データを取得するときのおまじない 【.first rescue nil】
items = item.where(category: "food").first rescue nil
```
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
```ruby:ruby
items = item.where(category: "food").paginate(per_page: 2, page: 1)
```
`.where()`や`.pagination()`メソッドはクエリオブジェクト（検索条件）を組み立てるだけで
DBに対する実際のクエリは実行されていない。
なので↑の状態だとデータを取得する対象のDBと検索条件が変数`items`に格納されているだけ。

**`.class`で型を確認すると`Array`ではなく`WillPaginate::Collection`と出力される。**
```ruby:ruby
items = item.where(category: "food").paginate(per_page: 2, page: 1).to_a rescue []
```
実際にデータを取得するためにはクエリを実行`(.to_a, .first, .each() .countなど)`する必要がある。

### クエリオブジェクトが格納された変数を展開するとデータが表示される理由

```ruby:ruby
items = item.where(category: "food").paginate(per_page: 2, page: 1)
```
```html:html
<!--- 確認用 --->
<div>#{items}</div>
```
式展開すると`.to_s`が走るのでそのタイミングでクエリが実行されてデータが表示される。
実際は`items`にデータが格納されているわけではない。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

自分の中では前よりも理解できたし、
これで調べる前よりかは理解できる説明できるかなー…
UiPathからPythonへ！副業エンジニアが挑むAI革命の物語

## はじめに
副業エンジニアとして様々な案件に挑戦している私に、ある日突然「UiPathからPython」という案件が舞い込んできました。正直なところ、UiPathにはこれまで１ミリも触れたことがなかったので、内心は「え、急に何これ？」という驚きと戸惑いでいっぱいでした。

## UiPathとPythonの架け橋に挑む
Pythonは日常的に使いこなしているものの、UiPathは全くの未知の領域。しかし、エンジニアとして新たな技術に挑むワクワク感は捨てがたく、さっそくUiPathのダウンロードからスタート。顧客から送られてきたRPA（Robotic Process Automation）のファイルを開いてみると、そこに待ち受けていたのは…複雑なフロー図の入れ子構造でした。

## 複雑すぎるフロー図の謎解き
UiPathのGUIを眺めながら、「これ、一体どうなっているんだ！」と頭を抱えました。各プロセスがどんどん入れ子になっており、全体像を掴むのはまるで迷路に迷い込んだかのよう。そんな中、さらに調査を進めるとUiPathには「Excel出力」という機能があることに気付きました。この機能を使えば、フロー図をExcel形式で出力できるというのです。

## 1700行オーバーのCSVとの壮絶バトル
期待を胸に出力したファイルを確認すると、なんと1700行を超える膨大なデータが！正直、これを人力で読み解くのは無理があると思いつつも、「ここはどうにかなるはず…」と挑戦心が燃え上がりました。しかし、実際のところ膨大な行数に圧倒され、読解作業に頭を抱える結果に。

## AIの助っ人、Cursor君の登場
そんな時、2025年の世は、まさに大AI時代！！。頼もしい相棒として、私は「Cursor君」を召喚することにしました。ダウンロードしたExcelを「Cursor君」が少しでも読みやすいようにCSVに変換してからCSVが格納されたフォルダをCursor君に渡し、次のようなプロンプトを投げかけました。

> **プロンプト内容**  
> 「uipath_flow.csvはUIPathからフロー図をExcel出力したものです。これを参考にしてMermaidでフロー図を作ってください。  
> この時、特殊文字関連のエラーが出ないように注意し、行数や処理が多い場合は適切なサイズで出力してください。また、文字コードはUTF-8で統一してください。」

Cursor君の力を借りることで、膨大なCSVデータからMermaidを用いた視覚的に理解しやすいフロー図の作成が現実味を帯びてきました。実際、いくつかの試行錯誤を重ねる中で、「プロンプトを微調整すれば、ソコソコうまく出力できそう」という希望の光が見えてきました。

## プロンプト微調整の試行錯誤とその成果
今回のプロンプト作成では、エラーを防ぐための特殊文字の扱いや、出力サイズの制御、そして文字コードの統一といった細部にわたる工夫が求められました。最初は行数が多すぎて処理が止まってしまう場面もありましたが、Cursor君とともに試行錯誤を続けた結果、徐々に安定した出力が得られるようになりました。  
「フロー図さえ完成してしまえば、後はあとは細かい部分の調整だけ！」という実感が湧いてきた瞬間は、まさに技術者ならではの達成感でした。

## まとめと今後の展望
今回の案件は、未知の技術に挑むことの大変さと同時に、新たな可能性を感じさせるものでした。UiPathという新たなツールとの出会い、そしてAIであるCursor君との協力によって、複雑なフロー図の解読と可視化という課題をクリアできる見通しが立ちました。  
現在も作成途中ではありますが、これからさらにプロンプトの改良や出力の最適化を進め、最終的な完成を目指して邁進する所存です。  
技術は日々進化し、私たちエンジニアに新たな挑戦を突きつけてきます。これからもその波に乗り遅れないよう、常に学び続け、挑戦を楽しんでいきたいと思います。

## 追記
プロンプトを更新

UIPathからCSVに出力されたフロー図を参考にして、Mermaidでフロー図を作成してください。

- **エラー対策:** 特殊文字によるエラーが発生しないように注意してください。
- **サイズ調整:** 処理の行数やステップが多い場合は、適切なサイズで出力してください。
- **文字コード:** UTF-8を使用してください。
- **日本語の扱い:** 日本語の表示は維持しつつ、ノードIDなどの内部表現は英語に変換してください。
- **ノードラベル**：フロー図内のノードラベルで「メッセージをログ」の場合は実際のログ内容に変更
- **メッセージをログのラベルの表示ルール**：メッセージをログ：ログの内容を表示

入力されたCSVの内容を解析し、適切なMermaidのコードを生成してください。

---

この記事が、同じように新たな技術に挑戦する皆さんへのエールとなれば幸いです。  
次回のアップデートにもご期待ください！
.gitignore が反映されないときの対処法

## 概要

```text:.gitignore
assets/
images/
```
など、.gitignore内でディレクトリを指定したときに、

```bash:bash
git add .gitignore
git status
```
などで確認しても、反映されないことがあったので解決方法を共有します。

## 結論
このコマンドを実行すると出来ます。
```bash:bash
git rm -r --cached {pass}
```

## 解説
なんらかの理由でGitがディレクトリの追跡(track)をしてしまっている可能性があるので、
Gitのキャッシュから指定ディレクトリを削除し、追跡を解除することで解決できます。

## 確認
キャッシュを削除したら、再度確認してみましょう。
```bash:bash
git add .gitignore
git status
```

.gitignoreで指定したディレクトリが表示されてなかったら成功です。
archlinuxでpico2をLチカさせる

# はじめに
自分がちょこっと躓いたので忘備録として
順番は適当

# 環境構築
※まだpico2は刺さなくても良い


必要なものを入れる
```
sudo pacman -Sy arm-none-eabi-gcc arm-none-eabi-newlib
```


適当なディレクトリを作成して移動する or ディレクトリをターミナルで開く
```
git clone https://github.com/raspberrypi/pico-sdk.git
```


クローンが完了したら環境変数を設定
※.bashrcは環境によって違う場合があるかも
```
cd 
sudo nano .bashrc
```



ダウンロードしたディレクトリのパスを入力
```
# for raspberrypi pico2  
export PICO_SDK_PATH="/hogehoge/pico-sdk/"
```


変更を適用
```
source .zshrc
```


pico-sdkのサブモジュールをアップデート
```
cd /hogehoge/piko-sdk
git submodule update --init
```


pico-exampleをクローンして移動
```
git clone -b master https://github.com/raspberrypi/pico-examples.git
cd pico-examples
```


pico-exampleをビルド
```
mkdir build
cd build
cmake -DPICO_PLATFORM=rp2350 ..
```


blinkをビルド
```
cd blink
make
```

書き込み作業
pico2のbootselボタンを押しながらPCに接続
RP2350というデバイスが表示されるので
```
/hogehoge/pico-examples/build/blink/
```
を開いてblink.uf2という名前のファイルをコピーしてあげる
すると自動的にアンマウントされてLEDが点滅し始める

# おわりに
初めてqiitaを書くのでミスがあったら教えてください

# 参考
[「Raspberry Pi Pico 2」の開発環境を構築してLチカするまでの手順まとめ](https://gigazine.net/news/20240901-raspberry-pi-pico-2-lchika-blink/)
[ArchLinuxでRaspberry Pi Picoの開発環境構築](https://qiita.com/Prokuma/items/44042649ce4f1405b239)
[Arch LinuxでRaspberry Pi Picoに繋いでLチカするまで](https://masawada.hatenablog.jp/entry/2022/10/21/210839)
Kamal 2でwordpressをVPSにデプロイ

VPSにKamalでWordpressをデプロイしました。
その設定ファイルです。
ヘルスチェックを解決しないといけないので、Dockerfileでヘルスチェック用のPHPをアップしています。

```Dockerfile:Dockerfile
FROM wordpress:latest
COPY up.php /var/www/html/up.php
EXPOSE 80
```

```yml:deploy.yml
service: xxxxxx_com_wp
 
image: xxxxxx/xxxxxx_com_wp
registry:
  username: xxxxxx
  password:
    - KAMAL_REGISTRY_PASSWORD
servers:
  web:
    hosts:
      - {IP}
proxy:
  ssl: true
  app_port: 80
  host: {ホスト}
  healthcheck:
    path: /up.php

builder:
  arch: amd64    
env:
  clear:
    WORDPRESS_DB_HOST: xxxxxx_com_wp-db # サービス名-アクセサリ名
    WORDPRESS_DB_NAME: wordpress
    WORDPRESS_DB_USER: example
    WORDPRESS_DB_PASSWORD: examplepassword
# volumes:
#   - "wordpress:/var/www/html"
accessories:
  db:
    image: mysql:8.4
    host: {IP}
    env:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: example
      MYSQL_PASSWORD: examplepassword
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    directories:
      - data:/var/lib/mysql
```

```php:up.php
<?php
header('Content-Type: application/json');
http_response_code(200);
echo json_encode(['healthy' => true]);
exit;
```

ハマったのはさくらVPSだとなぜかdbに接続できない…設定の問題なんだろうけれど…
今更考えるABC過去問 ~ABC369 C問題~

# 問題

https://atcoder.jp/contests/abc369/tasks/abc369_c

# 解答案

```cpp
#include <bits/stdc++.h>
using namespace std;

#define MX 1e+15

using ll = long long;

int main() {
    int N;
    cin >> N;

    ll A[200009];
    for (int i=1; i<=N; i++) cin >> A[i];

    A[0] = MX;
    A[N+1] = MX;

    int L = 1;
    ll ans = 0;
    for (int R=1; R<=N; R++) {
        ans += R - L + 1;
        if (A[R+1] - A[R] != A[R] - A[R-1]) L = R;
    }

    cout << ans << endl;
}
```

ある等差数列の始まりを変数に記憶することで、ある値に対して幾つの等差数列が作れるかを計算する。ある等差数列の終わりは次の等差数列の始まりとなる。その合計値が答えである。
2025年のIPA情報処理技術者試験を受験する前にするべきこと

## 【結論】
ＩＰＡから発表された **情報セキュリティ10大脅威 2025** は必見！

https://www.ipa.go.jp/security/10threats/10threats2025.html


## 【試験対策に役立つ可能性大】
毎年度、出題範囲の”試験要綱・シラバス”が更新されていますが、範囲が広すぎて何をどこまで勉強すればよいか困っている方は多いと思います。
むろん私もその１人で、昨年の応用情報技術者試験を受験しましたが、うまく対策ができず合格に至らずでした。
参考書や学習サイトで学習するものの、その大半は「過去出題」の対策で、新しい問題の対策ではありません。
ＩＰＡが発行元であること、かつ「情報セキュリティ10大脅威 2025」解説書もあり、”新しい問題対策”の参考書して役立つと考えます。

## 【どのくらい効果はあるか】
昨年の試験ではこの対策をしていなかったので、２０２５年４月の応用情報技術者試験の対策で実施します。
結果は試験後にご報告いたしますのでお待ちください。

## 【補足：試験と資格について】
情報処理技術者試験とは、と思われた方もいるかもしれませんので、念のため補足です。

ＩＰＡ　独立行政法人　情報処理推進機構が実施する情報処理技術者試験のことで、
「情報処理の促進に関する法律」に基づき経済産業省が、情報処理技術者としての「知識・技能」が一定以上の水準であることを認定している国家試験です。
「国家試験」とある通り知名度も高く、資格取得者は業界内でも優遇を受けるほどの影響力があり、最近では小中学生で受験する方が増えたりと業種や年齢問わず幅広く注目されています。

基本情報技術者試験（FE）と情報セキュリティマネジメント試験（SG）では、
2023年4月に8歳の小学3年生が合格﻿したとのことです。（すごい）

## 【あとがき】
ＩＰＡのサイトには様々な”試験のヒント”となるニュースが掲載されています。
新しい試験問題の対策として是非ご注目ください。
https://www.ipa.go.jp/
Power Automate DesktopからGoogle Driveの任意のファイルを更新する

# 紹介する内容

Power Automate Desktopを使用したGoogle Driveへ任意のファイルを上書く形でアップロードする方法を紹介します。

# 経緯
Power Automate Desktopでローカル環境から任意のファイルを定期的にGoogle Driveへアップロードすることになり、ブラウザを開きキーの送信等を駆使して操作で賄おうとしていたのですが、可用性面でも手法としてもスマートじゃないなと思い、結果として資産ライブラリに辿り着きましたので本記事で紹介します。


## 事前準備
:::note warn

弊環境はPower Automate有料版を使用しています

:::
アップロードするファイルをバイナリデータに変換しておく必要があります。

![スクリーンショット 2025-03-12 145459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839201/fa5734c5-c10b-478e-af93-89e49d2ed0bf.png)

変換するファイルのフルパスを指定します。

![スクリーンショット 2025-03-12 161341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839201/9c13e40f-34ec-432f-8954-e30d7b4465b9.png)



## 資産ライブラリの適用



フロー作成画面の右上の本のアイコンを選択します。


![スクリーンショット 2025-03-12 142054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839201/6560c583-c3b7-43af-a57f-b1c6c5c0c22e.png)

すると資産ライブラリの画面が開き、拡張機能のような項目の一覧が表示されます。
あまりにも項目が多いので、右上の検索ボックスから"google"等で絞り込むとよさそうです。

![スクリーンショット 2025-03-12 135155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839201/8035eb15-2eca-437c-aa13-2585d851032b.png)

フローに追加されると、以下のような表示になります。

![スクリーンショット 2025-03-12 135204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839201/a62712b2-c5dd-4319-b786-67316b06b3e2.png)

:::note warn

この手順を経て追加したとき、Google Driveの資産ライブラリはこのフローにのみ適用されるのであり、他のフローに自動的には適用されません。
適用させたい場合は、それぞれ同じ手順を踏んで追加する必要があります。

:::

適切に追加されていると、アクションにGoogle Driveが追加されています。

![スクリーンショット 2025-03-12 135218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839201/755ca48a-4b14-4c83-8fd1-5e52f35a09ec.png)

## フロー作成

前述したファイルをバイナリに変換した後、Google Driveの ”ファイルを更新します” をフローに割り当てます。このとき、 "接続参照" からgoogleアカウントと紐付けします。


![スクリーンショット 2025-03-12 135238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839201/d99280dc-d133-4874-9fba-a6f1354ee231.png)

![スクリーンショット 2025-03-12 135245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839201/377c49fd-b83b-42ed-a9a8-90b9cab550f6.png)

ファイルコンテンツはバイナリに変換したファイルを格納している変数を指定します。

一連のフローが完成したら実行し、ファイルが更新されているか確認してください。

###### まとめ
Google Driveの他に、google sheetやkintoneなどの資産ライブラリもありましたので、連携させたりして有効活用したらかなり幅が広がりそうです。おもすれ～
今更考えるABC過去問 ~ABC395 C問題~

# 問題

https://atcoder.jp/contests/abc395/tasks/abc395_c

# 解答案

```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;

    vector<int> B(1000009, -1);
    int A;
    int ans = N + 1;
    
    for (int i=1; i<=N; i++) {
        cin >> A;
        if (B[A] != -1) {
            ans = min(ans, i - B[A] + 1);
        }
        B[A] = i;
    }

    if (ans == N + 1) cout << -1 << endl;
    else cout << ans << endl;
}
```

ある値が出現した位置を配列に記憶し、再び現れたときに位置の差分を取ることで距離が求められる。その最小値が答えとなる。記憶する位置は直前のものだけで良い。
AI時代に難読化コードは意味があるの？GAPIの難読化コードをAIに解除させてみた！

こんにちは、@majoLibraryです。

最近はChatGPTなどのAIが話題になっていますが、コードの「難読化」は今後も有効なのでしょうか？そこで、Googleが提供するGAPIの難読化コードをAIに元に戻してもらいました。

## 難読化されたコード

GAPIの実際のコード例はこんな感じです。
```js
(function(){var aa=typeof Object.defineProperties=="function"?Object.defineProperty:function(a,b,c)...(略)...}).call(this);
```

これでは簡単に読むことはできません。

## AIで難読化解除（要点のみ抜粋）

AIに依頼すると、すぐに読みやすく再構成されました。

``` js
// グローバル環境を取得
const getGlobalObject = () => { ... };
const globalObj = getGlobalObject();

// Polyfillの設定
polyfill("String.prototype.endsWith", ...);
polyfill("Array.prototype.includes", ...);

// gapi.load関数の再定義
window.gapi.load = function(apiName, options) { ... };

// スクリプトの非同期読み込み
const injectScriptAsync = (src) => { ... };
```

## 文字列の暗号化・制御フローの難読化はどうか？

上記で示した難読化は主に名称変更（リネーム）だけでしたが、より高度な難読化手法として以下のようなものがあります。

### 文字列の暗号化（String Encryption）

文字列を実行時にしか復号できないようにすると、AIによる解析はかなり困難になります。

``` js
// 難読化前
const apiEndpoint = "https://api.example.com";

// 暗号化後
const apiEndpoint = decrypt("U2FsdGVkX1..."); // 実行時に復号
```

### 制御フローの難読化（Control Flow Obfuscation）

条件分岐やループを意図的に複雑化することで、コードの動きを把握するのが難しくなります。

``` js
// 元のコード
function add(a, b) { return a + b; }

// 制御フロー難読化後（例）
function confusing(a,b){
  let x=0;
  switch(true){
    case (!!a && !!b):
      x=(a|0)+(b|0); break;
    default: x=0;
  }
  return x;
}
```

これらが導入されると、AIでも意味を読み取るのは難しくなり、一定の保護効果が期待できます。

## 今後の対策

今後は、単純な難読化に頼るのではなく、より高度な難読化手法や、実行時暗号化、サーバーサイド処理の強化など、多層的な防御策を組み合わせることが重要です。ただし、過度な複雑化はパフォーマンスやメンテナンス性に悪影響を及ぼすため、適切なバランスを考える必要があります。

## まとめ

AIの進化により「難読化」だけに頼るのは不十分です。

文字列の暗号化や制御フローの複雑化など、高度な難読化手法を組み合わせつつ、コード自体の価値を高めることが重要になります。
Fujitsu Server PRIMERGY TX1320 M5 Tips

# 外観

![IMG_20250312_162204.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ed44e478-5600-4e3c-997b-2b905bdfb8c4.jpeg)

# 中身
![IMG_20250312_162356.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2b8aa7e4-69b0-4da6-8fb3-54b9d97c15e4.jpeg)



# Ubuntu での動作

TX1330M2 で動かしていた Ubuntu22.04 の入った HDD を移植したらそのまま動作した。
Ethernet も 画面も そのまま動作。



```

$ lspci
00:00.0 Host bridge: Intel Corporation Device 4c63 (rev 01)
00:14.0 USB controller: Intel Corporation Tiger Lake-H USB 3.2 Gen 2x1 xHCI Host Controller (rev 11)
00:14.2 RAM memory: Intel Corporation Tiger Lake-H Shared SRAM (rev 11)
00:15.0 Serial bus controller: Intel Corporation Tiger Lake-H Serial IO I2C Controller #0 (rev 11)
00:15.1 Serial bus controller: Intel Corporation Device 43e9 (rev 11)
00:16.0 Communication controller: Intel Corporation Tiger Lake-H Management Engine Interface (rev 11)
00:16.1 Communication controller: Intel Corporation Device 43e1 (rev 11)
00:16.4 Communication controller: Intel Corporation Device 43e4 (rev 11)
00:17.0 SATA controller: Intel Corporation Device 43d2 (rev 11)
00:1c.0 PCI bridge: Intel Corporation Device 43b8 (rev 11)
00:1c.1 PCI bridge: Intel Corporation Device 43b9 (rev 11)
00:1c.2 PCI bridge: Intel Corporation Device 43ba (rev 11)
00:1d.0 PCI bridge: Intel Corporation Tiger Lake-H PCI Express Root Port #9 (rev 11)
00:1d.5 PCI bridge: Intel Corporation Device 43b5 (rev 11)
00:1f.0 ISA bridge: Intel Corporation Device 438d (rev 11)
00:1f.4 SMBus: Intel Corporation Tiger Lake-H SMBus Controller (rev 11)
00:1f.5 Serial bus controller: Intel Corporation Tiger Lake-H SPI Controller (rev 11)
02:00.0 Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03)
03:00.0 Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03)
05:00.0 PCI bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge (rev 06)
06:00.0 VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 52)
06:01.0 Co-processor: ASPEED Technology, Inc. Device 2402






```
# CSS コンポーネントのエラー表示の解除


![IMG_20250312_160134.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5a5c9202-b11f-4554-a819-df9caa4d7da2.jpeg)

今回はファンコネクタ外れ。

![IMG_20250312_145624.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/17bdc39f-99a5-4f44-89dc-812d6a4a1ec8.jpeg)

IDボタンを長押しして解除。


# ストレージブート

UEFI デバイスでないとブートオプションに現れない


![IMG_20250312_150338.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a0f08dfd-8417-45f0-8f89-69d8cc104928.jpeg)
Githubで過去アーティファクトを削除をJob

# 事象
githubの無料プランを使っていますが、Storageを消費しきれると、Jobが実行できなくなります。
そのため、過去のアーティファクトを削除するジョブを追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/5ddcf5c3-a72a-4ac9-bfeb-20831bf0ccb9.png)


# やり方
以下のソースを.github/worlflows配下に配置し、githubにプッシュすれば、ジョブが定期的に自動実行されます。

```
name: Remove all artifacts manually

on:
  schedule:
    - cron: '0 0 * * *'  # 毎日午前0時に実行
  workflow_dispatch:  # 手動で実行できるようにする

jobs:
  remove-old-artifacts:
    runs-on: ubuntu-latest

    steps:
      - name: Remove all artifacts
        uses: c-hive/gha-remove-artifacts@v1
        with:
          age: '1 days' 
```
日本語のオープンデータをAutonomous Databaseに取り込んでみる

# はじめに
この記事では、東京都が公開しているJSONデータ(https://api.data.metro.tokyo.lg.jp/v1/SportsFacility) をAutonomous Database内に格納する手順をご紹介します。
このデータには東京都のスポーツ施設一覧が格納されています。

# オープンデータをDBに格納する
## オープンデータに対するアクセスを許可
*  Autonomous DatabaseにADMINユーザーとして接続します。
*  今回は日本語のデータを扱うので、接続前にNLS_LANGの変更を行います。
    ```
    export NLS_LANG=Japanese_Japan.AL32UTF8
    ```
*  接続をしたら、オープンデータに対するアクセスを許可します。
    ```
    BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => 'api.data.metro.tokyo.lg.jp',
        ace  => xs$ace_type(
            privilege_list => xs$name_list('http'),
            principal_name => 'ADMIN',  
            principal_type => xs_acl.ptype_db
        )
    );
    END;
    /
    ```
## 表の作成
* JSONデータを格納する表を作成します。
    ```
    CREATE TABLE sports_facilities (
        id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
        json_data CLOB CHECK (json_data IS JSON)  -- JSON データを格納
    );

    ```
## オープンデータからJSONデータを取得をして表に格納
* JSONデータを取得して、表に格納します。
    ```
    SET SERVEROUTPUT ON
    DECLARE
      v_req     UTL_HTTP.req;
      v_resp    UTL_HTTP.resp;
      v_buffer  VARCHAR2(32767);
      v_clob    CLOB := '';
    BEGIN
      -- リクエスト作成
      v_req := UTL_HTTP.begin_request('https://api.data.metro.tokyo.lg.jp/v1/SportsFacility', 'GET');
    
      -- charsetをUTF-8として明示
      UTL_HTTP.set_body_charset(v_req, 'UTF-8');
    
      -- ヘッダー指定
      UTL_HTTP.set_header(v_req, 'User-Agent', 'Mozilla/5.0');
    
      -- レスポンス取得
      v_resp := UTL_HTTP.get_response(v_req);
    
      -- UTF-8として読み込み
      BEGIN
        LOOP
          UTL_HTTP.read_text(v_resp, v_buffer, 32767);
          v_clob := v_clob || v_buffer;
        END LOOP;
      EXCEPTION
        WHEN UTL_HTTP.end_of_body THEN
          NULL;
      END;
    
      -- レスポンス終了
      UTL_HTTP.end_response(v_resp);
    
      -- DBへ保存
      INSERT INTO sports_facilities (json_data) VALUES (v_clob);
      COMMIT;
    
      -- デバッグ表示
      DBMS_OUTPUT.PUT_LINE(SUBSTR(v_clob, 1, 4000));
    END;
    /
    ```
* 本データは日本語で格納されているので、データを取得する段階でcharsetをUTF-8として明示すると、文字化けを防ぐことができます。
* これでオープンデータを取得し、DBに格納することができました。
## 表形式で分かりやすく表示
* JSON形式で格納されているので、JSON_TABLE関数を使って表形式で表示してみます。
* このJSONデータはのトップレベル構造が二重配列になっています。このような二重配列構造の場合、JSON_TABLE関数を使用する際には '$[0][*]' と指定して二重配列の中の各施設データを1件ずつ展開する必要があります。
    ```
    SELECT 
      jt.施設名,
      jt.住所,
      jt.電話番号,
      jt.緯度,
      jt.経度,
      jt.管理者名,
      jt.アクセス備考,
      jt.ウェブサイト
    FROM sports_facilities,
    JSON_TABLE(
      json_data FORMAT JSON, '$[0][*]'
      COLUMNS (
        施設名       VARCHAR2(100) PATH '$."名称"."表記"',
        住所         VARCHAR2(200) PATH '$."住所"."表記"',
        電話番号     VARCHAR2(30)  PATH '$."連絡先"."電話番号"',
        緯度         VARCHAR2(30)  PATH '$."地理座標"."緯度"',
        経度         VARCHAR2(30)  PATH '$."地理座標"."経度"',
        管理者名     VARCHAR2(100) PATH '$."管理者"."表記"',
        アクセス備考 VARCHAR2(200) PATH '$."アクセス"."備考"',
        ウェブサイト VARCHAR2(200) PATH '$."連絡先"."Webサイト"'
      )
    ) jt;
    ```

* 下記のようなイメージで結果が出力されます。
        ![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/4da4fe83-d35c-4755-a5ba-a2668bd9dfac.png)
jlreq で柱を左右に出す方法


jlreq で headings を設定すると，柱が中央に出力されます．

```tex
\pagestyle{headings}
```

そこで以下のように，ModifyPageStyle を使って headings を書き換えることで柱を左右に出すことができます．

```tex
\ModifyPageStyle{headings}{
    nombre_position=bottom-right,
    running_head_position=top-right
}
\pagestyle{headings}
```

もしj(s)bookみたいにしたいなら，

```tex
\ModifyPageStyle{headings}{
    odd_head_format={\underline{\makebox[\jlreqyokoheadlength]{#1}}},
    even_head_format={\underline{\makebox[\jlreqyokoheadlength]{#1}}},
    nombre_position=top-right,
    running_head_position=top-left
}
\pagestyle{headings}
```

とするといいでしょう．
【Tableau】人口ピラミッドの作り方

# 完成イメージ
目的：ある組織の年齢別男女構成を見たい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/1a825822-2887-4527-a8b9-1fac84ea4e83.png)


# 使用データ
データの持ち方はこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/9f414027-a51d-45ee-9495-90a0694d198f.png)
 *（氏名や社員番号等は適当）*

# 作り方
### ①年齢データの項目で"ビン"を作成
[満年齢]で右クリックし **「作成」＞「ビン…」** を開く。

![スクリーンショット 2025-03-12 143916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/30214888-e6a8-4c1c-8cde-27d2b3439e60.png)

### ②ビンの設定をする
一歳ごとに見たいので「ビンのサイズ」を「１」にする。
（十歳ごとに見たいなら「10」にする）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/85beee72-ca63-4d00-9265-ab2723047b7b.png)

→テーブルに新たな項目が生まれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/fd6ed0c4-675d-4897-9e66-563cf3e817ec.png)

### ③以下の通りデータをドロップ
[＃満年齢] を列に、
[.IlI.満年齢(ビン)] を行に、
[Abc性別] を色に入れる。

→するとこのようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/541b3f06-94d7-4dc0-8bd9-d937e375ff34.png)

### ④男女の軸を左右にのばす方法
人口ピラミッド特有の両広がりにするために。
上部メニューから **「分析(A)」＞「計算フィールドの作成(C)…」** を開く。
タイトルはデフォルトで「計算1」となっているが「男女別人数計算」とリネームした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/38c7c6a0-6cf6-428f-ba35-fe60290b07d7.png)
```
IIF([性別]="男",-1,1)
```
→新しい項目が生まれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/036d22bd-6a31-4186-8cb8-f06d8dd2fab1.png)

新たに生まれた[=＃男女別人数計算] を列に入れ、「合計(満年齢)」の方は捨てる。

### ⑤横軸の最大値を揃える方法
横軸を右クリックし **「軸の編集…」** を開く。
「範囲」を「カスタム」に変え、開始値と終了値を同じにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/13aa6930-546c-422a-bbd6-554a043a7d9b.png)

### ⑥横軸の男側のマイナスをなくす方法
横軸を右クリックし **「書式設定…」** を開く。
「スケール」の「数値」のプルダウンから「カスタム」を選ぶ。
書式設定(F)に以下を入力。
```
#,##0;#,##0
```

### ⑦縦軸の年齢に単位「歳」を付ける方法
縦軸を右クリックし **「書式設定…」** を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/a77930bc-ae36-424a-9271-f64beba4577b.png)

「既定」の「数値」のプルダウンから「数値（カスタム）」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/a2a89bc8-f410-4465-ad07-4c8b542e15bb.png)
サフィックスに「歳」と入れる。
（ついでに、小数点の桁数設定が自動で２になってしまうので０に戻しておく）

----
以上。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512654/1a825822-2887-4527-a8b9-1fac84ea4e83.png)

参考記事

https://qiita.com/mn1982/items/c957b8ec3438f42f4b24

https://qiita.com/tesshin_data/items/f2cd0b6731b258db88f3
[備忘録] リバースポートフォワードをサービス化

## これは
とある環境で, 安定したトンネルを掘っておきたいと考えて結構安定していたRポートフォワードの手順の備忘録です

## 前提環境
### ネットワーク側
- ホスト側のLAN内プライベートIPは固定IPでなく定期的に(大体2週間程度)DHCPから払い出される
- WAN自体は固定IP
- 不安定なネットワークで定期的にPingが通らなくなる(謎)
- 22番は空いていない(というか, 443しか空いてない)
- 透過型のプロキシがある

### その他
- ホストマシンはUbuntu 24
- 外部に固定IPを持つUbuntuマシンを配置(さくらVPS)

## 手順
### 透過型プロキシのIPを調べる
```bash
$ tcptraceroute 8.8.8.8
$ traceroute 8.8.8.8
```
こんな感じでダメもとで調べてみる. 通信にちょくちょく挟まってくる謎のIPがあるので，その場合が高い.

### 外部サーバのSSHDの設定
この辺はいつも通り．トンネル用のサーバでnginxとかを立ち上げていることはほぼないし，公開サーバでそんなことをやるのは何となく気持ち悪い．したがって，そんな設定をする人はいないと思うが，プロトコルによってサービスに割り当ているには`sslh`というソフトウェアが便利．

ともかく443番ポート(もしくは任意のポート)と外部サーバへ秘密鍵でsshログインできるようにする．

### プロキシを抜ける
Ubuntu / macの場合は, `corkscrew`というソフトウェアを使う．apt / brewではいる.

```config
Host jump-server
    HostName {外部サーバのIP}
    User {ssh ログインユーザ}
    Port {443 / もしくは任意のポート}
    Proxycommand corkscrew {プロキシサーバのIP} {443 / もしくはプロキシのポート} %h %p
    IdentityFile {外部サーバにログインするための秘密鍵へのパス}
```

これで`$ ssh jump-server`でログインできれば設定完了.

### ホストマシンのSSHDの設定
これもいつも通り．気休め程度に22番以外へ変更．パスワード認証も心許ないので，公開鍵認証に変更しておく．

### リバースポートフォワードする
不安定なネットワークでは，`autossh`が便利．自動で繋ぎ直してくれる．

```bash
autossh -N jump-server -R {Rポートフォワード用ポート(何でもいい)}:{ホストマシンのプライベートIP}:{ホストマシンへのSSHポート番号}
```

上記のコマンドをホストマシンで実行する．そうすると, 外部サーバでRポートフォワードのポートにlocalhostで繋ぎに来たものがホストマシンへ転送される．

試すには外部サーバにログインした状態で,
```bash
ssh {ホストマシンのsshログインユーザ}@localhost -p {Rポートフォワード用ポート} 
```
とする．

### デーモン化する
このままでもいいが，やっぱり電源つけたら勝手にRポートフォワードして欲しいし，間違って`reboot`なんて叩いても動くようになって欲しい．デーモン化する．

#### IP変わって自動でいい感じになるスクリプト
ローカルIP変わってもいいように以下のスクリプトを用意する

```bash:r-port-foward.sh
HOST_IP=`ip -f inet -o addr show {NIC名} | cut -d\   -f 7 | cut -d /  -f 1`
echo "Host IP Addr : "${HOST_IP}

autossh -N jump-server -R {Rポートフォワード用ポート}:${HOST_IP}:{ホストマシンへのSSHポート}
```

これに`chmod +x`して，実行権限与えてから，いい感じの場所に置く．`/home/{自分のユーザ名}/bin`とかでいいかもね．

#### サービスファイルかく
妥当な場所に置く．
`/user/{name}/.config/systemd/user/reverse-port-foward.service`みたいな感じ．多分．

```ini
[Unit]
Description=Reverse Port Forward Service 
After=network-online.target sshd.service sshd.service

[Service]
Type=simple
ExecStart=/bin/bash /home/{自分のユーザ名}/bin/r-port-foward.sh
Restart=always
RestartSec=3
TimeoutStopSec=10

[Install]
WantedBy=default.target
```

`After`のとこが超重要．ネットワークとか`ssh`関連のサービスが開始してからでないと起動できないので，これがないと動かない．

あとはこれを`systemctl`なりで登録・有効化して, `start`後に`active`になっていれば完了．
pkg-configのインストール

## コマンド
``C:\``に移動し管理者権限で以下のコマンドを実行する。
```.bat
mkdir pkg-config
cd pkg-config
curl -L -O https://download.gnome.org/binaries/win64/glib/2.26/glib_2.26.1-1_win64.zip
curl -L -O https://download.gnome.org/binaries/win64/dependencies/gettext-runtime_0.18.1.1-2_win64.zip
curl -L -O https://download.gnome.org/binaries/win64/dependencies/pkg-config_0.23-2_win64.zip
powershell -command "Expand-Archive -Path glib_2.26.1-1_win64.zip ."
powershell -command "Expand-Archive -Path gettext-runtime_0.18.1.1-2_win64.zip ."
powershell -command "Expand-Archive -Path pkg-config_0.23-2_win64.zip ."
```
## 環境変数
「<strong>PATH</strong>」に``C:\pkg-config\bin``を設定する。
```.bat
setx PATH "%PATH%;C:\pkg-config\bin"
```
以上、お疲れ様でしたー
my GitHub flow

# 私のgithub flow
- 基本1人、たまに2人で開発している
- 今のところ特に問題なく運用できている

## 開発スタイル
- vscode or gitpod or github codebaseを使用して開発
- バッグエンドJava,フロントエンドhtml+javascript+cssで開発
- バックエンドとフロントエンドを同一Githubリポジトリで開発

## ブランチは3種類
1. main
1. release
1. 作業

### mainブランチ
mainは作業ブランチをマージするブランチです。

### releaseブランチ
リリースするときにmainブランチをマージするブランチです。github actionなどでリリースモジュールを作ったりもします。
- 利点、pull requestを作成すると、前回リリースからの差分を確認できる

- DBの変更がある場合は、pull requestにSQLを記載する
- 設定ファイルの変更がある場合は、pull requestに設定内容を記載する

  - 利点、リリース作業をpull requestで進められる
  - 欠点、リリース前にpull requestがcloseしてしまう

### 作業ブランチ
自分のgithubアカウントID/issue番号
という名前を付けます。
例えば、
```hoge/3```など
バグとかマージミスの場合など、同一issue番号の修正をする場合は、
```
hoge/3a
hoge/3b
hoge/3c
```
というふうにアルファベットを変えていきます。
a-zで26文字しかないけど、そんなに発生しない。

- 利点、自分のIDが含まれるので衝突しない。ブランチ名を考えなくても開発がスタートできる。issue内容が変更になってもブランチ名を変更する必要はない


pull requset作成後にdevelopmentでissueを紐づける
pull requestをmainリポジトリにマージしたら作業ブランチを削除する

# pull requestのコメント
```- #123```などとハイフンをつける。
と、Github上ではissueタイトルにリンクが付いた状態で表示される
- 利点、ぱっと見でわかりやすい

# bugが発生したらどうするの？
issueチケットを作成するので、
通常の開発と同じくmainブランチから作業ブランチを作成する。

# デプロイはどうするの？
他社のgithubリポジトリや他社サーバへのリリースの場合は、Releaseページからダウンロードして、配置する。
自分のgithubリポジトリで、自社サーバへのリリースの場合は、tokenを発行してgithubから配置先サーバに直接ダウンロードする。
- 利点、通信量を節約できる
Work with Apps + iTerm2で検証してみた

# 概要
- 試した内容から手順書や記事を起こすのが結構めんどい（残っていればいいんだけど残っていない場合がめんどい。残せよって話なんだけど）
- ChatGPTのWork with Apps on macOSの機能について、iTerm2と連携させたら捗るのでは？と思いました
- ただ、僕の場合複数のタブが開いている状況で連携すると、どのタブの内容を参照するのかな？って疑問に思ったので、ちょっと実験してみましたメモ

https://help.openai.com/en/articles/10119604-work-with-apps-on-macos

# 調査内容
- タブを複数立ち上げておく（1 ~ 10ぐらい）
- 1で `ls` を実行する → 連携したChatGPTのスレッド（？）で「僕は今何を実行していますか」と聞いてみる※①とする
- もう一度1で `pwd` を実行してみて、3をアクティブにする。そのあとに「次はどうでしょうか」を聞いてみる※②とする


それぞれのタブでやっていることを記す

1は、なんらかプロジェクトのディレクトリで `ls` と実行している
3は、OpenHandsを試していたディレクトリで　`docker pull` した結果が残ってる

# 調査結果

## ①について
```
現在、あなたはiTerm2のターミナル上で、ローカルのRailsプロジェクトと思われるディレクトリの内容をlsコマンドで確認しています。

具体的には、~/Desktop/${ディレクトリ名} の main ブランチで作業中のようです。

プロジェクトの内容から、Ruby on Railsまたは関連するWebアプリケーションの開発環境構築を進めているのではないかと推測できます。
```

おー！

## ②について

```
今は、ローカル環境でDockerイメージのダウンロードが完了したところです。

具体的には、
	•	Dockerイメージ docker.all-hands.dev/all-hands-ai/runtime:0.27-nikolaik を最新の状態にアップデート（docker pull）しました。
	•	現在はプロジェクト xxx のルートディレクトリにいて、ブランチは main に切り替わっています。

おそらく次に、このDockerイメージを使った開発環境の構築や、テストなどの作業に進むのかなと思います。
```

直前に1で実行した `pwd` には触れずに、3でやってたことを述べました。なるほど


# 結果

アクティブになっているタブを参照している。でした。複数タブを参照してまとめて返す。みたいなことはなさそうです（今のところ）

ヘルプページも参照すると、制限もありそうでした

>* When working with terminals: Terminal, iTerm, Warp, Prompt
>    * ChatGPT includes the last 200 lines of open panes.
>    * If you select text in a pane, ChatGPT focuses on the selection and includes neighboring text up to a truncation limit.


というか、書いてあるじゃんｗ

>open panes.


:innocent:

# 雑感

- ドキュメント（？）はちゃんと読もう
- 便利。捗りそう
- ただ鍵情報とか参照されそうなので、取り扱いには注意したい（Opt outしているとはいえ）


- また、200行限定なので、結局やりたいことは達成されなさそうなので、パネルの結果を出力してマスクしてアップロードする仕組みを別途考える
- これは多分ChatGPTに結果をコピペするのが面倒な人用
ゲーム開発に役立つかも⁈∼おすすめ講義集∼

みなさん、こんにちは！韓国在住のsanaです^^


昨年からVR/ARはエンターテイメントやゲーム産業で盛り上がり、教育や企業トレーニングにも一部で利用が進んでいますよね。2025年にはさらにVR/AR技術が発展し、遠隔作業やバーチャル会議、製造業など今まで以上に私たちの社会に浸透していくのではないかと予想しています:thinking:


今日は初心者・入門者も始めやすいゲーム開発講義を３つほど紹介します！
その中でも２つ目の講義は韓国の国立大学である釜山大学の教授による講義講座なので、コーディングを勉強中の大学生にもおすすめです！:point_up_tone1:


(1)JaveScript入門コーディング講座（webゲーム）https://u.inf.run/43E1hUL
(2)Cospacesを使ったブロックコーディング　https://u.inf.run/41WpLr8
(3)AR SDKとUnityを使った拡張現実アプリの開設　https://u.inf.run/3DLJws9


明日のおすすめ講座もお楽しみに～！　
興味のあるトピックや話題があれば気軽にコメントください　ファイティン!!
専用サーバーとマネージド専用サーバーの違いとは

専用サーバーとマネージド専用サーバーの違いは、主に管理の負担や運用の自由度にあります。両者の特徴やメリット・デメリットを詳しく解説し、それぞれがどのような用途に向いているのかを見ていきましょう。

1. 専用サーバーとは

専用サーバー（Dedicated Server）は、特定のユーザーが単独で利用できる物理サーバーのことを指します。共用サーバーとは異なり、リソース（CPU、メモリ、ストレージなど）を独占できるため、パフォーマンスの安定性が高いのが特徴です。

専用サーバーの特徴
	•高性能・高自由度：リソースをすべて自由に使用できるため、大規模なウェブサイトやアプリケーションに適しています。
	•管理は利用者側の責任：OSのインストール、セキュリティ対策、バックアップ、障害対応など、すべての管理作業を利用者が行う必要があります。
	•コストが比較的低め：マネージド専用サーバーに比べると、管理コストがかからないため運用費用は安くなります。

専用サーバーのメリット
	•自由度が高い：ソフトウェアのインストールや設定を完全にカスタマイズ可能。
	•コストパフォーマンスが良い：クラウド環境と比較して、長期運用ではコスト削減が期待できる。

専用サーバーのデメリット
	•管理負担が大きい：サーバーの設定・運用・保守をすべて自分で行う必要がある。
	•専門知識が必要：LinuxやWindows Serverの知識、セキュリティ対策のスキルが求められる。


2. マネージド専用サーバーとは

マネージド専用サーバー（Managed Dedicated Server）は、専用サーバーの運用・管理をホスティング業者が代行してくれるサービスです。通常の専用サーバーに比べ、ユーザーは運用負担を軽減できるのが大きなメリットです。

マネージド専用サーバーの特徴
	•運用管理をプロが担当：サーバーのセットアップ、ソフトウェアのインストール、パッチ適用、セキュリティ対策、バックアップなどをホスティング業者が行います。
	•トラブル時のサポートが充実：サーバーの障害やトラブルが発生した際に、専門スタッフが対応してくれるため、迅速な復旧が可能。
	•運用コストが高め：管理を代行してもらうため、通常の専用サーバーよりコストが高くなる。

マネージド専用サーバーのメリット
	•専門知識が不要：初心者やIT担当者が少ない企業でも利用しやすい。
	•安定した運用が可能：プロの管理のもとで最適な状態が維持される。
	•セキュリティ対策が充実：最新のセキュリティパッチ適用や監視体制が整っている。

マネージド専用サーバーのデメリット
	•コストが高い：専用サーバー単体よりも管理費用が上乗せされるため、月額料金が高くなる。
	•自由度が低い場合がある：業者が管理するため、一部の設定変更やソフトウェアの導入に制約があることも。



3. どちらを選ぶべきか？

専用サーバーとマネージド専用サーバーの選択は、以下のような基準で考えるとよいでしょう。

専用サーバーが向いているケース
	•サーバー管理のスキルがあり、自由に設定したい人・企業
	•コストを抑えつつ、高性能な環境を求める場合
	•セキュリティやパフォーマンスの最適化を自社で行いたい場合

マネージド専用サーバーが向いているケース
	•IT部門が少なく、サーバー運用を専門業者に任せたい企業
	•セキュリティ対策や障害対応を自社で管理するのが難しい場合
	•24時間365日の監視・サポートを必要とする業務用途



結論

専用サーバーとマネージド専用サーバーは、それぞれメリット・デメリットがあり、用途や運用体制に応じて適したものを選ぶ必要があります。自由度を重視するなら専用サーバー、管理負担を軽減したいならマネージド専用サーバーが適しています。企業のリソースや運用方針を踏まえて、最適な選択をしましょう。


参考情報
https://www.xserver.ne.jp/bizhp/dedicated-server/
https://www.kagoya.jp/howto/it-glossary/server/ownv/
https://www.idcf.jp/rentalserver/user-support/knowledge/server/type.html
https://www.forcard.info/column/managed-recommendation/
laravel/pintを使ってスタイルルールをカスタムしてチェックする

laravel/pintのルールはデフォルトが
いちばんいいのですが
自分好みに合わせたいならどうするのだろうと思って
試してみました

# 環境
macOS Sonoma v14.5
docker desktop for mac v4.37.2

# 前提
sailを利用してプロジェクトが作成済みであること
プロジェクト作成についてはこちらを参考にしました
https://laravel.com/docs/11.x/installation#sail-on-macos

https://laravel.com/docs/11.x/installation#sail-on-macos

# 初期状態
composer.jsonを確認して、`laravel/pint` があれば有効化できています

# laravel/pintが見つからない場合
インストールが必要です
```
sail composer require laravel/pint --dev
```

# スタイルチェックしてみる
コンテナを起動後、スタイルチェックを実行してみます
```sh
# コンテナを起動
> sail up -d
# スタイルチェック
> sail pint

  ..........................

  ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Laravel  
    PASS   .................................................................................................................................. 26 files 
```

一応通りました
デフォルトとなっているスタイルルールはこちらのようです

https://github.com/laravel/pint/blob/fecb30642b760a15bc65b37f884a5c8542e73473/resources/presets/laravel.php

## スタイルルールをカスタムする
#### 1. プロジェクトフォルダ直下にpint.jsonを作成
```json:pint.json
{
    // デフォルトで読み込み
    "preset": "laravel",
    // カスタムルール
    "rules": {
      // ルールをオブジェクトごとに書いていく
    }
}
```

#### 2. ルールを拡張する
デフォルトで定義されているルールが上書きされます

- 半角スペース設定
例えば以下のように`=>`を縦そろえしようと
`id`のあと半角スペースを2つ以上書いて調整するとスタイルエラーが表示されます、
半角スペース1つであることをルールとしているためです
  ```php
  $value = [
    'id'    => 1,
    'value' => 'dummy',
  ];
  ```
  `=>` が含まれる行はインデントを無視するように変更します
  ```json:pint.json
  {
      "preset": "laravel",
      "rules": {
          "binary_operator_spaces": {
              "default": "single_space",
              "operators": {
                  "=>": null
              }
          },
      }
  }
  ```
上記のほかにも`operators`に設定した任意の文字列が含まれる行の半角スペース設定を無視できます

- phpunitのテスト関数名
テスト関数名をキャメルケースで書くか、スネークケースで書くか指定ができます
```json:pint.json
{
    "preset": "laravel",
    "rules": {
        "php_unit_method_casing": {
            "case": "camel_case"
        },
    }
}
```
なにも指定しない場合、どちら(キャメルケース/スネークケース)で書いてもチェックは無視されます
```json:pint.json
{
    "preset": "laravel",
    "rules": {
        "php_unit_method_casing": false
    }
}
```

参考
https://laravel.com/docs/11.x/pint

https://laravel.com/docs/11.x/pint


## 感想
ルールが厳しすぎると思うことがあれば
カスタムしたほうが(精神的に)いいかもしれません
OpenAI エージェント構築ツールの料金を計算してみた

## はじめに
OpenAIは、開発者や企業がより効率的にエージェント（ユーザーの代わりにタスクを実行するシステム）を構築できるよう、Responses APIや各種組み込みツールを発表しました。
詳細はこちら
https://openai.com/index/new-tools-for-building-agents/

個人開発者としては、その価格が気になるところ。
記事から価格に関して抽出してみました。

(1ドル=150円として計算)

## Web検索ツールの料金
Responses APIに組み込まれたWeb検索ツールは、開発者がリアルタイムの情報を簡単に取得できるよう設計されています。
- GPT-4o
    30ドル / 1000クエリ   =  0.03ドル / 1クエリ = 4.5円 / 1 クエリ
- GPT-4o-mini
    25ドル / 1000クエリ   =  0.025ドル / 1クエリ = 3.75円 / 1 クエリ

## ファイル検索ツールの料金
ファイル検索ツールは、大量のドキュメントやデータセットから必要な情報を効率的に抽出するために設計されています。
- クエリ料金
2.5ドル / 1000クエリ = 0.0025ドル / 1クエリ = 0.375円 / 1 クエリ
- ファイルストレージ料金
0.1ドル / GB / 日 = 3ドル / GB / 月 = 450円 / GB / 月
(ただし１GBまでは無料)

## Computor useの料金
Computor useは、エージェント(LLM)がブラウザを操作する機能です。
- input:
3ドル / メガトークン = 450円 / メガトークン
- output:
12ドル / メガトークン = 1800円 / メガトークン

## 感想
どのツールも非常に魅力的な機能なのですが、本格的に運用すると結構なお値段になる気配を感じます。
特に Computor useは、どれくらいのトークンを消費するのか、現時点ではよくわからないので怖くて手を出せない気がします。(あくまでも個人の感想です)
Web検索ツールも、チャットボットで使うと、簡単に数十回のクエリが出ると思うので、１クエリで4.5円だとすると、ちょっと使って数百円消費する感じですかね。
貧乏人な私は、今まで通りに自前で実装すると思います。
vscodeでのPython仮想環境の作成

# 目次
- Pythonのインストール
    - インストール
    - 環境設定
- VSCodeのインストール
    - インストール
    - 基本的な設定
- 仮想環境の作成

## Pythonのインストール
1.https://www.python.org/ へアクセス
2.Downloadsから最新のversionをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953318/07839d72-f4ae-48db-980e-31d214f7a99e.png)
3.ダウンロードしたインストーラー（.exe）を実行
4.

## VSCodeのインストール
1.https://code.visualstudio.com/ へアクセス
2.Download for Windowsからダウンロード
3.ダウンロードしたインストーラー（.exe）を実行

## 仮想環境の作成
1.作業で使用するフォルダを作成、VSCodeで開く
2.ターミナルでコマンドを実行
```
python -m venv venv01
```
###### ターミナルの開き方
Terminal→New Terminalで開ける
###### 実行コマンド
実行コマンドの「venv01」の箇所は自由に変更して問題ない
3.VScode上で自分の作成した仮想環境が反映されているか確認
赤線部に自分で作成した名前のものが含まれていれば問題ない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953318/1a7f30a2-34cb-445d-b6fa-321c90e97712.png)
※反映されていなさそうな場合
View→Command Palette...→Python: Select Interpreter
以下の画面が表示されるので、自分の作成した仮想環境を探し、選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953318/e201ddc3-0c50-4614-bf08-70d3c4116cca.png)