OmniAICreator/Qiita-1.07M huggingface dataset:
BigQueryのMerge関数の使用方法について

## 概要
BigQueryのMerge関数の使用方法について解説します

## 前提
- データセットを作成済み
    - [データセットを作成する](https://cloud.google.com/bigquery/docs/datasets?hl=ja)

## 実装
今回はわかりやすい例として
- クーポンの使用履歴テーブル
- クーポン使用済み履歴テーブル

の2テーブルを例にMerge関数を使います
クーポンの使用済み履歴テーブルと使用履歴テーブルを比較してすでに使用しているデータがあれば使用済み履歴テーブルにInsertする処理を書きます

### 必要なテーブルとデータの作成
以下がクーポンの使用履歴テーブルです

```sql
CREATE OR REPLACE TABLE practice_dataset.coupon_usage (
    user_id INT64,
    coupon_code INT64,
    is_used BOOL,
    used_at TIMESTAMP
);
```

以下がクーポンの使用済み履歴テーブルです
```sql
CREATE OR REPLACE TABLE practice_dataset.used_coupons (
    user_id INT64,
    coupon_code INT64,
    used_at TIMESTAMP,
    migrated_at TIMESTAMP
);
```

それぞれのテーブルにデータをInsertしていきます
```sql
INSERT INTO practice_dataset.coupon_usage (user_id, coupon_code, is_used, used_at)
VALUES
    (1, 1, true, TIMESTAMP '2025-03-08 10:00:00'),
    (2, 2, true, TIMESTAMP '2025-03-08 11:00:00'),
    (3, 3, false, NULL),
    (1, 2, false, NULL);
```

```sql
INSERT INTO practice_dataset.used_coupons (user_id, coupon_code, used_at, migrated_at)
VALUES
    (1, 1, TIMESTAMP '2025-03-08 10:00:00', TIMESTAMP '2025-03-08 10:00:00')
```

クーポン使用履歴テーブルの中身は以下のとおりです

![スクリーンショット 2025-03-08 14.17.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/f29f5511-a5fd-4668-bb5d-ac703cf1db69.png)

クーポン使用済み履歴テーブルの中身は以下のとおりです

![スクリーンショット 2025-03-08 14.18.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/230ee9ec-72a8-4f27-9b80-59541a96b199.png)

### Mergeクエリの作成
coupon_usage内で使用済みのもの(is_used)のみ抽出し、used_couponsにmatchしなければInsertします
その際にWHEN NOT MACHED THENを使います

```sql
MERGE INTO practice_dataset.used_coupons AS target
USING (
    SELECT user_id, coupon_code, used_at
    FROM practice_dataset.coupon_usage
    WHERE is_used = TRUE
) AS source
ON target.user_id = source.user_id AND target.coupon_code = source.coupon_code
WHEN NOT MATCHED THEN
    INSERT (user_id, coupon_code, used_at, migrated_at)
    VALUES (source.user_id, source.coupon_code, source.used_at, CURRENT_TIMESTAMP());

```

### 実行結果
以下のように使用済みの履歴がused_couponsにInsertされていたら成功です

![スクリーンショット 2025-03-08 14.31.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/efaeef01-e3bc-4165-894f-bc05e820e872.png)



## トラブルシューティング
```
Not found: Dataset practice_dataset.user_01 was not found in location US 
```

データセット名が間違っているので確認しましょう

## 参考
https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#merge_statement

https://cloud.google.com/bigquery/docs/tables?hl=ja

https://sql.info/d/bigquery-error-not-found-dataset-xyz-was-not-found-in-location-us
VSCodeの下のターミナルで、conda環境を動かす方法

# はじめに
VSCodeの下の、コマンドを入力するエリアで、conda環境を使う方法をご紹介します。Cursorでも一緒です。

VSCodeの一番下で、conda環境を選べそうな感じではありますが、conda環境の下のpython.exeを直接実行するだけで、少なくとも私の環境ではライブラリの参照がうまくいかなかったので、今回の方法となっています。それでうまくいく人はそれがいいと思う。

ちなみにその部分（"パネル"という名前のようです）の表示ON/OFFは、２つのやり方があります。どちらでもいいです。
1. タイトルバーの右端にあるアイコンでON/OFF（おすすめ）
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/c610fa4b-96ed-4006-b9a5-5fef5b1fa076.png)
1. メニューの`表示＞外観＞パネル`で表示ON/OFF


パネルの「＋」ボタンで、"Power Shell"とか"Git Bash"とかあるんですが、そこにconda環境を追加したいと思って調べたのが今回の記事です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/08d4e25d-83d1-4960-837f-479038530ca7.png)
👆追加前
👇追加後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/15c4fe2f-2ecb-4a88-8357-ae260849aee4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/dcdbb61f-60cb-41cc-a3aa-904a74eaef1f.png)




# 設定方法
## 1. ユーザー設定のjson（settings.json）を開く
（毎日使うわけではないショートカットは、覚えられないので、UIで開きます😆）

1. メニューから、**ファイル＞ユーザー設定＞設定**
2. 設定画面の右上にある、"**設定(JSON)を開く**"
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/f229a8ce-20ba-469f-ab0d-5f2e12fbc45a.png)

## 2. 環境設定を書く
settings.jsonの一番外の 中かっこの内側に、下記を追加。
argsの配列の最後の`myname`(２か所)は、ご自分のOSのログイン名に変えてください。
```json:settings.jsonの一部
    "terminal.integrated.profiles.windows": {
        "PowerShell (Conda)": {
            "path": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
            "args": [
                "-ExecutionPolicy",
                "ByPass",
                "-NoExit",
                "-Command",
                "& 'C:\\Users\\myname\\anaconda3\\shell\\condabin\\conda-hook.ps1' ; conda activate 'C:\\Users\\myname\\anaconda3'"
            ]
        }
    }
```

この細かなコマンド引数は、スタートメニューにあるAnacondaの起動ショートカットのプロパティを見ると得られます。**上のをコピってもうまくいかねーなという方は、ご自分の環境を参考になさってください。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/3cd6974e-8006-4234-b00c-275779bca259.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/c935cd6e-ee1b-466d-b104-9e3681a2ec66.png)

結局、このショートカットをVSCodeで起動しているというだけです😊


## 3. 起動する
成功すると、「＋」に`PowerShell (Conda)`が追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/15c4fe2f-2ecb-4a88-8357-ae260849aee4.png)

クリックすると、`(base)`から始まるいつものcondaの画面が出てきます。いつもどおり、`conda info -e`、`conda activate ～`からconda環境を選んで使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/dcdbb61f-60cb-41cc-a3aa-904a74eaef1f.png)
`pip install`も普通にできます。

# おわりに
大した事ではありませんが、一度やっておけば、プロンプトと行き来する手間が省けて楽。
以前は、ウィンドウの一番下の選択でできてた気がするなぁ...。🤔

ではよきcondaライフを！
PHPで「switch文」の動作を確認してみた。

# 概要

PHPで「switch文」の動作を確認してみました。
以下のページを参考にしました。

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

# 実装

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

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

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

<p>
<?php
$domain = 'cn';

print 'ドメイン:'.$domain.'<br />';

switch ($domain){
case 'in':
  print 'インドのトップレベルドメイン';
  break;
case 'cn':
  print '中国のトップレベルドメイン';
  break;
case 'jp':
  print '日本のトップレベルドメイン';
  break;
default:
  print '不明です';
}
?>
</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>
ドメイン:cn<br />中国のトップレベルドメイン</p>

</body>
</html>
```

# まとめ

何かの役に立てばと。
[C言語] argument type 'void' is incomplete

# 間違い

```sample.c
#include <stdio.h>

int main(void)
{
    int a = 70;

    void *addr = (void *)&a;
    printf("変数addrのアドレスは「%p」です\n", addr);
    printf("p番値の値は「%d」です", *addr);

    return 0;
}
```

```
$ gcc sample.c -o sample && ./sample
error: argument type 'void' is incomplete
    printf("p番値の値は「%d」です", *addr);
                                    ^
1 error generated.
```

# 正解

```sample.c
#include <stdio.h>

int main(void)
{
    int a = 70;

    void *addr = (void *)&a;
    printf("変数addrのアドレスは「%p」です\n", addr);
    //printf("p番値の値は「%d」です", *addr);
    printf("p番値の値は「%d」です", *(int *)addr);

    return 0;
}
```

```
$ gcc sample.c -o sample && ./sample
変数addrのアドレスは「0x12345678」です
p番値の値は「70」です%   
```
SNIとSANs比較メモ

SNIとSANsがごっちゃになるので備忘録

# 名称
- SNI :Server Name Indication
- SANs: Subject Alternative Names

# 適用分野
- SNIはTLSに関するクライアント側の技術
(とはいえ、サーバ側でもSNIを受け付け可にしておく必要はある）
- SANsは証明書に関するサーバ側の技術

# で、結局何者なの？

### SNI
- TLNネゴシエーションする際にClient Helloに含まれるextensionでドメイン名が含まれる
- TLS規格に追加された属性(extension)の仕様
- なんで必要なんだっけ？
    - 暗号化しないhttp通信では、どのドメイン宛ての通信か判断する手段としてhttpヘッダの`Host属性`で判断が可能だが、暗号化されるhttps通信の場合はhttpヘッダが暗号化されているため`Host属性`の内容をサーバで判断できない。
    　このため暗号化前のサーバとクライアントのやりとりであるTLSハンドシェイクの`Client Hello`パケットにドメイン名をextension属性としてつけることでサーバがドメイン名を判断できるようにした。
    - サーバにある証明書が一つだけなら、どのリクエストに対しても持っている一つの証明書で通信すれば良いが、サーバによっては1台のサーバで複数の証明書を保持している場合がある。
    この場合、サーバはClient Helloに含まれるドメイン名から適切な証明書を選択することが可能になる。

### SANs
- 一つの証明書で複数のドメインをカバーする
- X509規格に追加された拡張フィールド
- なんで必要なんだっけ？
    - なくてもクライアントの人たちは何も困らない、これまで通りhttpsアクセスすれば良い。
    - でもサーバ管理者はサーバ証明書の数が増えると、管理がとっても大変になるので、管理の負担を減らす技術。
    仮に12個の証明書を保持していて、有効期限が1年で発行日が全部異なる場合、サーバ管理者は毎月証明書更新作業が必要になる。万が一更新を忘れて有効期限が過ぎるとそのサイトにはアクセス不可になる、というおまけつき。
    だったら複数の証明書をまとめて登録できるようにしよう、そうだワイルドカード付きの`*.abc.com`みたいなフォーマットも許可しちゃえ、的な感じで生まれた。（妄想も入ってます）
    ブラウザからGoogleの証明書見ても、CN(CommonName)は`*.google.com`となっているが、`証明書のサブジェクトの代替え名`という名称でSANsフィールドがあるが、そこには数十個のドメイン名が定義されていて、有効期間が３ヶ月。こんな数のドメインを一つずつの証明書で管理できないな。
- Chromeではすでに証明書のドメインチェックにCN（CommonName）でなくSANsフィールドを見ているとのこと。なのでCNあってもSANsがないとエラーになる。

# まとめると
複数のドメインを管理する場合、SANsを利用することでサーバ管理者は管理する証明書の数が減り管理の負担が減る。もし1台のサーバで複数のドメインを管理する場合になっても、SNIでClient Helloがドメイン名を付与してアクセスしてくるので、（SNI対応済みのサーバが）どのドメイン宛てのリクエストか判断できる、めでたしめでたし。
実務でASP.NET coreを半年ほど触り、勉強になった資料の紹介

## はじめに
元々フロントエンジニアとしてバックエンドにはあまり触れずに過ごしてきたが、半年ほど前からアサインしている業務でASP.NET coreのバックエンドでWeb API部分の開発にも携わることとなった。

本記事では、私自身が実務でつまずいたポイントや、理解を深めるのに助けられた書籍・記事を中心にまとめる。ASP.NET coreに挑戦する方にとって、スムーズなキャッチアップの一助になればと思います。

## 筆者の背景
- 基本フロントエンドの開発メインで、SPAを作成するのにAPI設計書を確認・添削したり、バックエンドのコードを確認して多少修正する位で、0から作ることはしてこなかった
- Unityを使ったゲーム開発をしていた時期があり、C#自体はそこそこ使える
- DBやインフラ周りの知識は乏しい

## 記事の対象読者
- フロントエンドエンジニアで、業務で初めてASP.NET Coreを触ることになった人
- C#は多少書いたことがあるが、本格的なバックエンド開発は未経験の人
- ASP.NET Coreの公式ドキュメントを読んでみたが、難しく感じた人
- MVCやWeb APIの基本的な実装方法を知りたい人

## 独習ASP.NET Core

C#の文法に触れず、純粋にASP.NET Coreフレームワークの解説に特化した書籍。

MVCの基礎から、Scaffolding機能、ビューエンジンであるRazorの利用、LINQを使ったモデル開発、モデルバインドやフィルターを活用したコントローラー開発といった基本的な内容までを丁寧に解説。さらに、ミドルウェアやサブフレームワークの活用といった実践的・発展的な内容にも踏み込んでいる。

C# 自体はある程度触ったことがあったが、バックエンドの経験が浅いため、「このフレームワークでxxをしたいときは、こうする」といった勘所をつかむのに非常に役立った。

正直、ASP.NET Coreの公式ドキュメントは読みづらく感じたので、フレームワーク全体を学ぶならこの書籍を読み込む方がが良いと感じた。

https://www.shoeisha.co.jp/book/detail/9784798180557

## WEB API 開発のチュートリアル動画
Web API をゼロから作成するチュートリアル動画。

プロジェクトの作成、モデルの設置、コントローラーの実装、EF Core を使ったデータベースへの書き込みなどを段階的に進めていく。さらに、途中でリファクタリングを挟むため、開発の流れを実践的に学べるのも良かった。

完全に英語だが、GitHub にコードが公開されており、動画内のコードもシンプルなので、動画を見ているだけで Web API を作れるようになる。

https://www.youtube.com/playlist?list=PL82C6-O4XrHfrGOCPmKmwTO7M0avXyQKc

## SQLの学習
案件ではO/RマッパーとしてEntity Framework Coreを使用しているが、それでもSQLをまったく使わないわけではない。

実際にデータベースを直接確認し、WHEREで条件を絞り込んだり、特定の値が存在するかをチェックしたりする機会はある。頻繁には使わなくても、業務で普通に必要になるレベルの知識は求められる。

最初はSQLに苦手意識があったが、使っているうちに「取っつきにくいだけで、実際はシンプルで扱いやすい」と感じるようになった。個人的にはSQLは「勉強する」というより、「書いて慣れる」だけで十分対応できるようになると思う。

ガンガン書いてSQLに慣れるためには、実際にコードをブラウザ上で書いて即実行できる「SQL 道場」がおすすめ。

https://sql-dojo.com/

## 実戦で役立つ c#プログラミングのイディオム

LINQ、Entity Framework、非同期処理、日付操作など、C#のより実践的なテクニックを網羅した逆引きリファレンスとして非常に優れた一冊。具体的なコード例とともに、現場で直面しやすい課題を効率的に解決する方法が解説されています。

この本に掲載されているイディオムを理解し、実践できるようになれば、C# のコードをより簡潔かつ効率的に書けるようになり、中級者としてのスキルを確実に磨けるはず。

https://gihyo.jp/book/2024/978-4-297-14307-7

## まとめ
バックエンドを半年ほど触って思ったのは、フロントよりも素直ということでした。

大変だったのはフロント側ではあまり意識に上らない、入力値のバリデーションや、DBへのデータ取得や登録部分、共通処理をまとめるミドルウェア、適切なログ出力方法などで、色々勉強するところは多かった。

ただし、値を受け取って返すという点で、フロントよりも分かりやすく感じました。今更ですがプログラミングを学ぶならバックエンドから入った方が、理解がスムーズに進みそうです。

初心者でもスムーズに学べる参考資料を活用しつつ、実際に手を動かしながら経験を積んでいくのが重要だと感じました。
【ネットワーク】DNSサーバへの登録方法と検索方法

# はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
現在インターネットについて勉強していますが、そこで出てきたDNSサーバーへの情報の登録方法や検索方法についての記述があったので忘れないように記述しようと思いました
DNSサーバーはドメイン名を渡せばIPアドレスが返ってくる仕組みについて解説します


## DNSサーバへの登録方法

### ドメインの階層構造

DNSは階層的に管理されており、最上位には ルートドメイン (`.`) が存在します。ルートドメインの下には、例えば `com`, `net`, `org`, `jp` などのトップレベルドメイン(TLD)が続き、さらにその下位に独自ドメイン (例: `example.com`) が配置されるという構成です。

例えば`www.example.com` というドメインがあった場合、最上位にはルートドメイン(`.`)、次に`com`、`example`、`www` の順番で登録していきます。

### DNSサーバーのDBに登録されている情報

DNSサーバーにドメインを渡すと、DNSサーバー上のDBの中から探すのですが、以下のようなデータが保持されています。

1. **名前 (Name)**
   - Webサーバーもしくはメールサーバーのドメイン名が書いてあります。
2. **クラス (Class)**
   - ここではインターネットを表す `IN` が書かれています。
3. **タイプ (Type)**
   - IPアドレスを問い合わせる時は `A`(IPv4) や `AAAA`(IPv6)、メールサーバーの場合は `MX` など、さまざまな種類が指定されます。

このようなレコードをまとめたゾーンファイルを、権威DNSサーバーが保持し、正しいDNS情報を提供します。

### DNSサーバーからIPアドレスを探す方法

`www.example.com` というドメインアドレスを探す例を考えてみましょう。

1. **ルートドメインのDNSサーバーを問い合わせて、`com` のDNSサーバーを調べる**

   - ルートDNSサーバーは、各トップレベルドメイン(TLD)のDNSサーバー情報を持っています。

2. **`com`のDNSサーバーを問い合わせて、`example.com` のDNSサーバーを調べる**

   - ルートDNSサーバーの情報をもとに、TLDである `com` のDNSサーバーへ問い合わせます。
   - そこで `example.com` を管理している権威DNSサーバー (NSレコード) の情報と、必要に応じて glue レコードを受け取ります。

3. **`example.com` のDNSサーバーを問い合わせて、`www.example.com` のAレコードを取得する**

   - `com` のDNSサーバーから得た権威DNSサーバーの情報をもとに、`example.com` のゾーンを管理するDNSサーバーへ問い合わせます。
   - `www.example.com` に対応する Aレコード (IPv4アドレス) や AAAAレコード (IPv6アドレス) などが登録されていれば、これを取得できます。

4. **最終的にクライアントへ返却**

   - クライアント (PCやスマホ) は、この取得した IPアドレスをもとに実際の通信を開始します。もしキャッシュがあれば次回からはより高速に応答できるようになります。

---

## 補足解説

### 再帰的問い合わせと反復問い合わせ

多くの場合、ユーザーが利用するDNSリゾルバ(プロバイダのDNSやOS内のDNSキャッシュなど)は **再帰的問い合わせ** を行います。これは、最終的な回答(IPアドレスなど)を得るために、ルートDNSサーバー、TLDのDNSサーバー、権威DNSサーバーを自動的にたどっていき、取得した結果をクライアントに一括して返す方式です。

一方で **反復問い合わせ** は、DNSリゾルバがまずルートサーバーに問い合わせ、その応答をもとに次に問い合わせる先をクライアント自身が逐次判断していく方法を指します。実際には、OSやアプリケーションが細かく問い合わせ先を追いかけることは少なく、多くは再帰的問い合わせをDNSサーバーに任せています。

---

## まとめ

1. **DNSの階層構造:** ルートドメイン(`.`)から始まり、TLD(`com`など)を経由して、最終的に特定のドメイン(`example.com`)へとたどり着く仕組みになっています。

2. **ゾーンと権威DNSサーバー:** 各ドメインには権威DNSサーバーが存在し、ゾーンファイルによって管理するレコード(AやMXなど)が登録されています。上位ドメインは下位ドメインの権威DNSサーバーを登録(委任)する形で接続されています。

3. **問い合わせの流れ:** ルート -> TLD -> サブドメインという具合に段階的に下位ドメインを探し、最終的にIPアドレスなどの情報(Aレコードなど)を取得する再帰的問い合わせを行います。
Snowflake：COPYコマンドで使用するオプション理解（ユースケース込み）

# 1.COPYコマンドとは
ステージングされたファイルから既存のテーブルにテーブルをロードするもの。
ファイルは、次のいずれかの場所にすでにステージングされている必要がある。

・内部ステージ
・外部ステージ

ここからはCOPYコマンドの際に使用するオプションの解説理解を記載しています。

## FILES
ロードする１つ以上のファイル名のリストを指定するもの。
指定されたいずれのファイルも見つからない場合、COPYステートメントで別の
```ON_ERROR```オプションが明示的に設定されていない限り、デフォルトの動作
```ON_ERROR = ABORT_STATEMENT```はロード操作を中止します。

このように、明示的にロードしたいデータが決まっている場合は、FILESコマンドを使用してロードします。

```sql
// FILESオプションでファイルを指定してロード
copy into <table> from <stage名>
file_format = CSV
files = ('/data_2013_0_0_0.csv.gz', '/data_2013_0_1_0.csv.gz);
```


## PETTERN

正規表現で、あるステージにあるファイルを選択することができます。

:::note info
注釈
ステージングの設計にも繋がりますが、基本的にPETTERNはFILESよりも処理が遅いとされています。
そのため、やむを得ず、正規表現を使わないといけない場合以外は
PETTERNを使わないようにステージングを設計するのが良いです。
:::


```sql
COPY INTO your_table
FROM @your_stage
PATTERN = '.*customer_txn.*\.csv'
-- FILE_FORMAT = (TYPE = 'CSV' FIELD_OPTIONALLY_ENCLOSED_BY='"' SKIP_HEADER=1);
```

:::note warn
注釈
FILES と PATTERN オプションを一緒に使うと、 FILES オプションで指定したパスだけが読み込まれます。この2つのオプションは併用しないことをお勧めします。
:::

## copyOptions

### ON_ERROR

#### CONTINUE
エラーが見つかった場合は、ファイルのロードを続行します。COPY ステートメントは、データファイルごとに見つかった最大1つのエラーのエラーメッセージを返します。

ROWS_PARSED 列の値と ROWS_LOADED 列の値の差は、検出されたエラーを含む行の数を表します。
ただし、これらの各行には複数のエラーが含まれる可能性があります。データファイルのすべてのエラーを表示するには、 VALIDATION_MODE パラメーターを使用するか、 VALIDATE 関数をクエリします。

#### SKIP_FILE
エラーが見つかった場合は、スキップする

:::note alert
注釈
エラーが見つかったどうかに関係なく、ファイル全体をバッファーするため
```CONTINUE```や```ABORT_STATEMENT```よりも低速です。
:::

そのほかにもあまり使う機会が少ないですが
```SKIP_FILE_<num>```である数がエラーが起きた場合は、ファイルをスキップしたり
```SKIP_FILE_<num>%```でエラー行の割合が指定された割合を超えた場合に、ファイルをスキップしたりします。

### SIZE_LIMIT

特定のCOPYステートメントに対してロードされるデータの最大サイズを指定する数値です。
通常、複数のCOPYステートメントを使用してファイルの共通グループをロードするために使用されます。

例えば、ステージパスの一連のファイルサイズがそれぞれ１０MBであり
複数のCOPYステートメントがそれぞれ２５MBで設定した場合、それぞれが３ファイルをロードした際、閾値を超えるため、エラーが起きます。

:::note warn
ロードする場合を除き、SIZE_LIMITに指定された値に関係なく、少なくとも１つのファイルはロードされます。
:::

### PURGE

データが正常にロードされた後、ステージからデータファイルを自動的に削除するかどうかを指定するブール値です。

### RETURN_FAILED_ONLY

ステートメント結果でロードに失敗したファイルのみを返すかどうかを指定する

### FORCE
以前にロードされたかどうか、ロード後に変更があったかどうかに関係なく、全てのファイルをロードするように指定するブール値。

:::note info
TRUEにした場合、ファイルを再ロードし、テーブル内のデータを複製する可能性があります
:::

データの変換ミスがあった場合に、再度ロードしたい場合などに有効です

### ENFORCE_LENGTH
ターゲット列の長さを超えるテキスト文字列を切り捨てるかどうかを指定するブール値
デフォルトは```TRUE```のため、ステートメントはエラーを生成することになります。

```FALSE```にした場合は、ターゲットの長さに自動で切り捨てられます。

### MATCH_BY_COLUMN_NAME

半構造化データをロードする際に、
ターゲットとのカラム名の順序が異なる場合に使用します。

例えば以下のようなテーブルとファイルがあるとします。
```sql
CREATE OR REPLACE TABLE employees (
    id INT,
    name STRING,
    department STRING
);

```
CSVデータ
```bash
name,department,id
Alice,HR,1
Bob,IT,2
Charlie,Finance,3
```

カラム名の順番が一致していないことがわかります。
このようなケースにこのオプションを使用します。

大文字や小文字を判別させたい場合は
```MATCH_BY_COLUMN_NAME = CASE_SENSITIVE;```


判別させなくても問題ない場合は
```MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;```
Azure試験合格記（AZ-104）

## はじめに
構築などはすることはないのですが、業務でAzureリソース（CosmosDBや関数アプリなど）を使用することが多くあります。
使用していないリソースに関しても知識をつけたいと思い、Azureの中級資格にあたるAZ-104を受験しました。
### 筆者について
- 社会人3年目文系卒SE
- 普段はWebアプリケーションのクライアント開発（TypeScript、React）
- 過去取得資格
  - Azure(AZ-900,AI-900,DP-900)
  - AWS(CDF,SAA)
  - GCP(CDL)
  - 基本情報技術者試験、セキュリティマネジメント試験、ITIL4、salesforce初級、SAFeSM 
  
## 受験記録
1回目の受験は余裕の不合格、再受験で合格しました。
### 1回目　600点台前半/1000（合格ライン700） 
- 所感
    - 試験中もMS Leanのドキュメントを参照できるため、1問目から分からない用語や確認したいリソースがあれば検索していました。結果、時間が押してきてしまい後半は注意深く解くことができなかったです
    - 予想外だったのが、最初にあると思っていたケーススタディが（おそらく）1問もなかったことです。正直今でも謎、飛ばした記憶もないです
 ### 2回目　700点台中盤/1000
 初回受験から17日後に受験
 -  所感
     -  初回受験の反省から45分ほどで全体の問題をさらい、余った時間でドキュメントを参照するようにしました。時間が足りなくなることはもちろんなく少し余裕をもって終了しました。
     -  今回はケーススタディも出題され、問題数は変わらず51問
## 学習記録
2回の受験の学習をまとめて記録
- 学習期間
    - 主に休日にまとめて時間を取り、25hほど
    - 初級資格の知識も忘れてしまっていたため、学習には時間がかかった印象
- 使用教材（Udemy中心）
  - [【AZ-104合格講座】動画での解説とポイントを通じ、AZ-104合格に必要な知識を効率的に身につけよう](https://www.udemy.com/course/azure-az104-learn/?couponCode=NVD20PMUS&utm_source=adwords&utm_medium=udemyads&utm_campaign=Search_DSA_GammaCatchall_NonP_la.JA_cc.JP&campaigntype=Search&portfolio=Japan&language=JA&product=Course&test=&audience=DSA&topic=&priority=Gamma&utm_content=deal4584&utm_term=_._ag_167497670358_._ad_711539479846_._kw__._de_c_._dm__._pl__._ti_dsa-1456167871416_._li_9197965_._pd__._&matchtype=&gad_source=1&gclid=Cj0KCQiA8q--BhDiARIsAP9tKI2Y7o9g3tgLmmu2h6Jbyls1ig_COrsE61OWTdEFpkEReqZFGJPuy3oaAljhEALw_wcB)
    - どのように問題を解いていくか、ポイントが分かりやすくまとめられています。特に、AZ-900の範囲から思い出したい自分にとっては有益な講座でした
    - テンポよく講座が進むので学習しやすい
  - [受講生30万講師のAZ-104: Microsoft Azure Administrator模擬試験問題集（400問）](https://www.udemy.com/course/30az-104-microsoft-azure-administrator240/?utm_source=adwords&utm_medium=udemyads&utm_campaign=Search_DSA_Beta_Prof_la.JA_cc.JP&campaigntype=Search&portfolio=Japan&language=JA&product=Course&test=&audience=DSA&topic=&priority=Beta&utm_content=deal4584&utm_term=_._ag_167497668958_._ad_711539479624_._kw__._de_c_._dm__._pl__._ti_dsa-2344929249803_._li_1009329_._pd__._&matchtype=&gad_source=1&gclid=Cj0KCQiA8q--BhDiARIsAP9tKI02OhW4NBkO7p7CgGiWpM4abpsJbRxoJ9pLGUAXdIIPqJbHJ7byP_YaArH2EALw_wcB&couponCode=V2JPLETSLEARN)  
    -  演習テストが5回分ありますが、4回までを時間の許す限り解きました
    -  どの演習テストも正答率は初回50％くらいで2回目は60％～70％くらい
  - [最短で合格！Azure Administrator Associate AZ-104 試験対策問題集](https://www.udemy.com/course/microsoft-azure-az104-exam/?srsltid=AfmBOooad_BzmgF4_mTJ8mn8yCsIlPnzJWolggW3M8zTPTho-aMwVM1F)
    - こちらも演習テスト。4回分ありますが、私は2回分までを解き正答率60％前後
    - 繰り返しは解く時間はありませんでした

Udemyの演習テストは使うとしてもどちらか一方でよいと思います。
本番で似た問題もありましたが、多くはない印象。
私は飽き性なので次から次へと教材を変更してしまうのですが、良くないと思っています。
自己紹介

# はじめに
初投稿です。
現在、デイトラというオンラインスクールでJavaコースを受講中のキリアスと申します。
日々の学習内容をアウトプットしていきたいと思っております。

## 現在の仕事
約6年ほどSES業界でエンジニアとして働いております。
あまり、開発経験を積めていないと感じ、現在、デイトラを受講しております。

## 現在の学習している内容について
・Java
デイトラのJavaコースを学んでおり、MineCraftのプラグイン開発を行っております。

https://www.daily-trial.com/

学習にて学んだ知識やハマったエラーの解消方法についてアウトプットしていく予定です。


## やりたいこと
Javaの技術力を高めて、市場価値の高いエンジニアを目指してきたいです。
WEBアプリケーションの設計・開発エンジニアになれるよう学習を続けていきます。

## まとめ
今後、学んだことのアウトプットとしてQiitaを使っていきたいと考えております。
至らぬ点もあるかと思いますが、よろしくお願いいたします。
GPTsについて調べてみた

# はじめに

エンジニアのみなさま、日々の学習お疲れ様です。
また本記事まで足を運んでいただき本当に感謝です。



#  GPTsとは

https://openai.com/index/introducing-gpts/

GPTsとは、自然言語を入力するだけでオリジナルのチャットボットを作れるサービスです。
特徴としては以下の3つになります。

### 1. ノーコードでオリジナルのGPTを作成できる
プログラミングの知識がなくても、簡単な操作でオリジナルのGPTを作成できるプラットフォームです。用途に応じたカスタマイズが可能で、指示の調整や独自の知識を追加することで、業務支援や趣味のプロジェクトに最適なAIを構築できます。テンプレートや直感的なインターフェースを備えており、初心者でも短時間で自分専用のGPTを作成できます。

### 2. 開発したGPTを公開・収益化できる
ChatGPTsで作成したオリジナルGPTは、一般公開して他のユーザーに利用してもらうことが可能です。さらに、GPTの利用を有料設定することで、収益化も実現できます。専門知識を活かしたカスタムGPTを作成し、個人や企業に提供することで、新たなビジネスチャンスを生み出せます。AI技術を活用したコンテンツやサービスの展開を、手軽に始められるのが魅力です。

### 3. 外部サービスとAPI連携できる
ChatGPTsは、API連携に対応しており、外部のサービスやアプリと接続することができます。これにより、業務システムやカスタマーサポート、自動化ツールなどにAIを組み込み、より高度な活用が可能になります。例えば、SlackやNotion、CRMツールと統合し、業務の効率化を図ることができます。カスタムGPTをビジネスや開発に柔軟に組み込めるのが大きな強みです。

# 使い方

### 1. サイドバー「GPT」を探すをクリックする

![スクリーンショット 2025-03-09 9.11.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/627105b4-5f6f-4354-b2dc-1c4ed96e2d9e.png)

### 2. 使いたいGPTsを検索する

添付画像の赤枠① ~ ③の順番で軽く解説します。

![スクリーンショット 2025-03-09 9.18.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/0a5bf7d4-73aa-45c1-937f-fb290d71dbfe.png)

#### ①関連するワードを入力してGPTsを検索する

試しに『プログラミング』と入力してみると以下の結果が表示されました。

![スクリーンショット 2025-03-09 9.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/d71f9beb-fc00-48aa-8fa9-96cab44c205e.png)

思わずクリックしてみたくなるGPTsがずらり。
ネーミングってめちゃ大事ですね。
プログラミングお師匠さんをクリックします。

![スクリーンショット 2025-03-09 11.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/0cd84647-041a-4d46-bd73-27a5dc8f21ca.png)

このGPTsの内容が書かれています。
画面下部の『チャットを開始する』をクリックすると使えるようになります。

![スクリーンショット 2025-03-09 11.10.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/bb5ee9bf-91ad-43c6-9df6-c168b1c19aa5.png)


#### ②タブでカテゴリー分けしたGPTsを選択する
初めはここで公開されているGTPsを使ってみるのも良さそうですね。

#### ③GTPsを自作する

ここでは自分オリジナルのGPTを作成できます。
自分好みにカスタマイズして、使い勝手良くしちゃってください。
以下のステップを踏めば簡単に作成できます。
良いGTPであれば収益化もできるとの事です。

#### 1. GPT Builderを立ち上げる
OpenAIのGPT Builderにアクセスし、新しいGPTの作成を開始します。

#### 2. 作りたいGPTの概要を伝える
どのような用途で使用するか、大まかな目的や特徴を記入します。

#### 3. GPTの内容を具体的に設定する
役割やトーン、応答スタイルなど、具体的な動作を細かく調整します。

#### 4. タイトルを決定する
GPTの目的に合った分かりやすく、興味を引くタイトルを設定します。

#### 5. プロフィール画像を決定する
用途に合った適切な画像をアップロードまたは選択します。

#### 6. 細かい設定をする
初期プロンプト、応答制限、アクセス制御などの詳細を調整します。

#### 7. 試しにプロンプトを入力する
実際に動作を確認し、意図した応答が得られるかテストします。

#### 7. 公開範囲を設定する
一般公開・限定公開などのアクセス範囲を選択し、必要なら共有します。

# さいごに

GTPsを使うきっかけになりそうです。
仕事内容や趣味に即したGTPsに出会えれば嬉しいですね！

生成AIに関連する記事をいくつか投稿しているため、もし興味があれば合わせて読んでもらえると嬉しいです。

https://qiita.com/ho_na/items/63eb8039420b9572b269

https://qiita.com/ho_na/items/759102166e3e06b92aaa

https://qiita.com/ho_na/items/79495ee3ed55f6016998

------

弊社の紹介もさせてください！

### 「日本で一番エンジニアが成長できる会社を創る」

https://prum.jp/

弊社メンバーは日々学習した内容をアウトプットしております！
少しでもご興味を持たれた方は求人を見てみてください！
ご応募もお待ちしております！

### 最後までご覧いただき、ありがとうございました！
初投稿

# はじめに
Qiita初投稿です！

先日、大学の同期でエンジニアとして働いている友人と飲みに行きました。
その友人がエンジニアはアウトプットすることが大切！的なことを言っていました。ということで私もアウトプットをすることにします。とりあえず行動に移そうと思い、帰りの電車でアカウント作成しました！

・・・というのも、最近まで転職活動をしていました。技術力を上げたい（本音は年収を上げたいだけ）という理由で、面接を受けていく中で、自分に足らないことは自己研鑽ということに気づきました。
いいきかっけと思い、手始めにQiitaを始めてみました。

日々、思ったことや悩んでいることなども発信できたらいいなと思います。

# 自己紹介
2896と申します。
都内でエンジニアとして働いています。社会人2年目(2025年現在)です。
この名前は、東京ヤクルトスワローズのマスコットキャラクターつば九郎からとりました。
（ヤクルトファンの車のナンバーは2896にしたりとか、知ってる人が見ればピンとくる数字です。）
趣味は名前の通り野球観戦です。
オフシーズンである今の時期は進んで残業しますが、シーズン中ともなれば一刻早く退勤し野球中継を見たいです。。
会社から明治神宮球場までは近いため、勤務後にそのまま向うこともあります。

普段は、Webアプリケーション開発を行っていて、現在はjava、Reactをメインに扱っています。
正直、プログラミングやITの知識については自信がなく、日々わからないことだらけです。
間違ったことや見当違いなこともあると思いますが、頑張って発信していこうと思います。
よろしくお願いします！

# 目標
・野球のデータ（選手の成績など）集めて、検索できるようなシステム作ってみる（自己満だけどやってみる、その過程を発信できたらいいなと思います）
・JavaSilverの資格をとる！
・基本情報とる！
・いい会社に転職したい～
・車を購入してナンバーを2896にする

# 最後に
こんな感じの記事でいいのかはわからないですが、なにかアドバイス等ございましたらコメントいただけると嬉しいです。できるだけ継続して発信できたらいいなと思います。（稚拙な文章を垂れ流すだけかもしれませんが。。）
【C#】拡張メソッド入門

# 拡張メソッドとは？
前回の[【.NET】リフレクション入門](https://qiita.com/sebayashi-tomoya/items/acfb5b454460361f5266)同様、C#(.NET)の基本的な機能の入門です。

今回は「拡張メソッド」編
例のごとくとりあえず公式ドキュメントを見てみましょう。
> 拡張メソッドを使用すると、新規の派生型の作成、再コンパイル、または元の型の変更を行うことなく既存の型にメソッドを "追加" できます。 拡張メソッドは静的メソッドですが、拡張された型のインスタンス メソッドのように呼び出します。 C#、F#、Visual Basic で作成されたクライアント コードの場合は、拡張メソッドの呼び出しと、型で定義されているメソッドの呼び出しに明確な違いはありません。

https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

なるほど。

既存のクラス（型）に再コンパイルや継承、変更を加えることなく新しいメソッドを追加できるということですね🤔

拡張メソッドの代表的な例が、リストの操作でよく使うLINQ。
静的メソッドをあたかもインスタンスメソッドかのように呼び出すことができるわけです。

# メリット
では、拡張メソッドを使うことによって得られるメリットはどのようなものか？

- 既存コードに変更を加えることなく機能追加が可能
- メソッドチェーン利用による可読性の向上
- 汎用的な型の拡張メソッドは複数のプロジェクトで利用可能
- インターフェースに拡張メソッドを定義できるため、柔軟な設計が可能
- 利用者側からは静的クラスの実装を気にする必要がない

自身実装のクラスというよりは、本来メソッドが追加できないクラスやインターフェースに利用されることが多いようですね。（フレームワークに既存のクラス、サードパーティ製のクラス、列挙型など）

# デメリット
もちろんデメリットや使用上の注意点もあります。
- 使いすぎると本来のクラスとのメソッドと見分けが困難になり、コードが複雑になる
- 本来のクラスに同名のメソッドが存在する場合、拡張メソッドが呼び出されなくなる（インスタンスメソッドの呼び出しが優先される）
- 拡張メソッドは継承不可のため、派生クラスでのオーバライドができない
- 本来のクラスの内部実装に依存する拡張メソッドはカプセル化を損なう可能性がある

# 実装例
何はともあれ、とりあえず使ってみよう！
ということで、適当に思いついたものを実装してみました。

拡張メソッドを実装する場合は、静的クラスの静的メソッドとして定義します。
最初の引数に拡張したいクラスを`this`修飾子を使って指定すればOK👌

**【要件】**
コンソールアプリを開いた時点の時間によって出力する文字列を以下のパターンで変える。
- 05:00 ~ 09:59 →　"早起きですね！朝活でもしちゃう？"
- 10:00 ~ 14:59 →　"何時まで寝てるの!?"
- 15:00 ~ 20:59 →　"休日を無駄にしたね…"
- 21:00 ~ 04:59 →　"夜行性？"

**【実装】**
```Main.cs
public class Main
{
    public Main()
    {
        GetUp(DateTime.Now.TimeOfDay);
    }

    private static void GetUp(TimeSpan wakeUpTime)
    {
        if (wakeUpTime.IsEarly())
        {
            Console.WriteLine("早起きですね！朝活でもしちゃう？");
        }
        else if (wakeUpTime.IsLate())
        {
            Console.WriteLine("何時まで寝てるの!?");
        }
        else if (wakeUpTime.IsWaste())
        {
            Console.WriteLine("休日を無駄にしたね…");
        }
        else
        {
            Console.WriteLine("夜行性?");
        }
    }
}
```

```TimeSpanExtensions.cs
/// <summary>
/// TimeSpan型の拡張メソッド群
/// </summary>
public static class TimeSpanExtensions
{
    /// <summary> 05:00~09:59ならtrue </summary>
    public static bool IsEarly(this TimeSpan time)
    {
        return IsWithinRange(
            time,
            new TimeSpan(5, 0, 0),
            new TimeSpan(9, 59, 0));
    }

    /// <summary> 10:00~14:59ならtrue </summary>
    public static bool IsLate(this TimeSpan time)
    {
        return IsWithinRange(
            time,
            new TimeSpan(10, 0, 0),
            new TimeSpan(14, 59, 0));
    }

    /// <summary> 15:00~20:59ならtrue </summary>
    public static bool IsWaste(this TimeSpan time)
    {
        return IsWithinRange(
            time,
            new TimeSpan(15, 0, 0),
            new TimeSpan(20, 59, 0));
    }

    /// <summary> 対象の時刻が上限下限の範囲内が否か </summary>
    private static bool IsWithinRange(TimeSpan target, TimeSpan min, TimeSpan max)
    {
        return
            target >= min &&
            target <= max;
    }
}
```


# 参考
https://qiita.com/wolfmagnate/items/84ba30fb9970e01b1d2d
【ChatGPT】新時代が幕開けていた事を最近知ってしまった。

# 1.はじめに

嫌な事があって転職を考えた時、別の言語に挑戦しようとした時。
そんな時にはいつも、ロト6関連のプログラムを作って、このQiitaに投稿していた。
__ロト6の高額当選しないのは、勉強する機会を与えてもらっているのかも、と思っていた。（馬鹿）__

ある日、「ChatGPTでプログラミングを学ぼう」という主旨の本を見つけた。
その本には、「テキストファイルをexcelに変換」や「webアプリを作ってください」という日本語でChatGPTに入力するだけで、
短時間で実行結果を返してくれるというものだった。

### それってあなたの感想ですよね。
という言葉をパクりたかった。
二番煎じならぬ1億番煎じでも構わない。
ひ〇ゆきの言葉を使う必要がある。

# 2.実際に質問してみた（プログラミング編）

ChatGPTのPC版に、アカウント登録をしてみた。
そして下記の日本語で質問してみた。
__どうだ？？？？？__

:::note info
__loto7を3本とloto6を2本購入するプログラムをC#で書いてください。__
:::

### 結論：5秒ほどで下記ソースコードが表示された

```c#
using System;
using System.Linq;

class Program
{
 static void Main()
 {
  GenerateLotoTickets(37, 7, 3, "Loto7");
  GenerateLotoTickets(43, 6, 2, "Loto6");
 }

 static void GenerateLotoTickets(int totalNumbers, int pickCount, int ticketCount, string lotoName)
 {
  Random random = new Random();
  
  for (int i = 0; i < ticketCount; i++)
  {
   int[] ticket = Enumerable.Range(1, totalNumbers)
           .OrderBy(x => random.Next())
           .Take(pickCount)
           .OrderBy(x => x)
           .ToArray();
   
   Console.WriteLine($"{lotoName} Ticket {i + 1}: {string.Join(", ", ticket)}");
  }
 }
}
```

__ヤバい！！ヤバすぎる！！！これがAIに仕事が取られるということか。私の書くダサいコードが必要がないのか。
`日本語を理解している。
そして物凄い情報量から回答を作成している。
新時代が幕開けてしまっていた。`
もうこれだけで、息が止まりそうだ。__

#### 「ただ、このコードが筆者より洗練されていることがわかる事も、コードから学ぶことが出来るのもIT業界にいるからだ」と考えることもできる

# 3.別の毛色の質問をした（ホラー小説編）

:::note info
ITエンジニアの怖い話を150字以内で書いてください
:::

下記の回答である
```
深夜、システムのログを確認していると、見覚えのないユーザーIDがアクセスしていた。
IPを追跡すると、自分が今使っている端末からの接続だった。
慌てて確認したが、誰も近くにいない。
気づくと、画面に「次はお前だ」とメッセージが表示されていた。
```
凄い。怖い話のテンプレだ。

下記は私の友人が体験した怖い話だ。

:::note info
クライアントの幹部社員が隣の席の先輩に詰め寄る。
彼は生気のないガラス玉のような目で画面を見つめている。
響き渡る怒号。
彼はあるファイル削除のコマンド入力したはずだ。
だがパスを大幅に省略したらしい。
実際に入力したコマンドはrm -rf /
:::

# 4.抽象的な質問をしてみる

:::note warn
私って痩せていますか？
:::

```回答
あなたが痩せているかどうかを判断するためには、身長や体重、体脂肪率などの情報が必要です。
もし心配なことがあれば、専門の医師や栄養士に相談するのが一番です。
自分の体に自信を持つことが大切ですが、無理なく健康的な体型を保つことが重要ですよ！
```
__「身長や体重、体脂肪率などの情報が必要」__
__⇒個人情報の流出の危機ですな！！！__
~~闇バイトなどに利用されないように個人情報の提供はしてはなりません~~

:::note info
良いと思える回答例
痩せているかが重要ではないと思います。
貴女は「世界で一つの花(姫)」という存在なのでしょう。
:::

### 「データとかあるんすか」という直球の回答が良いわけではない。
__現時点で、まだ人間が勝っている？__

# 5.さいごに
+ 条件に応じたプログラムを作成してくれるので、開発工数を削減できるが、コードを理解する能力は必要になる。
+ 抽象的な質問に対しては「データとかあるんすか」と理詰められる事もある。
+ 何かを学びたい時、話し相手がほしい時、暇つぶしをしたい時に最適。

そして、「それってあなたの感想ですよね。」という言葉が言えないことがわかった。
【Rails】replace_htmlが使えない

## はじめに
Rails では、かつて `replace_html` を使用して部分的なビューの更新を行っていました。しかし、Rails 3 以降では `replace_html` は非推奨となり、最新のバージョンでは使用できません。本記事では、`replace_html` の代替方法についてまとめます。

## `replace_html` とは？

`replace_html` は、Prototype.js を利用した `update` RJS ヘルパーの一部で、指定した要素の内容を置き換えるために使用されていました。

#### 使用例（Rails 2.x の RJS）
```ruby
page.replace_html 'target', "<p>新しい内容</p>"
```

しかし、Rails 3 以降では Prototype.js のサポートが削除され、`replace_html` は廃止されました。

## 対応方法
### jQuery + `html()` を使用する

jQuery を使用して部分更新する場合、`html()` メソッドを利用します。

#### JavaScript（jQuery）を使った更新
```javascript
$('#target').html('<p>新しい内容</p>');
```

#### Rails コントローラーとビュー
```ruby
# app/controllers/example_controller.rb
respond_to do |format|
  format.js
end
```

```erb
# app/views/example/update.js.erb
$('#target').html('<%= j render partial: "new_content" %>');
```
条件付きでシャッフル

条件付きで配列を入れ替える方法です。

```kotlin
val fruitList:MutableList<String> = mutableListOf("りんご", "もも", "さくらんぼ", "栗", "みかん")
val shuffleList = fruitList.shuffled()
println(shuffleList) // [みかん, りんご, 栗, もも, さくらんぼ]
```
shuffled()を使用します。

```kotlin
val fruitList: MutableList<String> = mutableListOf("りんご", "もも", "さくらんぼ", "栗", "みかん") 
var shuffleResults: List<String>?

do {
    val shuffleList = fruitList.shuffled()
    shuffleResults = shuffleList
} while (fruitList.indices.any { fruitList[it] == shuffleList[it] })
    
println(shuffleResults) // [もも, さくらんぼ, 栗, みかん, りんご]
```

while文を使用して、条件が合わなくなるまでシャッフルを行います。配列の位置に同じ果物がある場合、再度シャッフルを行うコードです。



```kotlin
val previousResults = listOf("もも", "さくらんぼ", "栗", "みかん", "りんご")
val fruitList = mutableListOf("りんご", "もも", "さくらんぼ", "栗", "みかん")
var shuffleResults: List<String>?

do {
    val shuffleList = fruitList.shuffled()
    shuffleResults = shuffleList
} while (fruitList.indices.any { shuffleList[it] == previousResults[it] })

println(shuffleResults) // [りんご, みかん, もも, さくらんぼ, 栗]
```
上記コードを少し変えて、前回の結果と同じにならないようにするコードです。`previousResults`はメモリに保存しておいた前回のコードを想定しています。



#### 参考

https://qiita.com/kiririnyo/items/aee905225902d096f7c0
なぜ日本でウォーターフォール開発は機能するのか？



Xのシステム開発界隈で、ウォーターフォールモデルとアジャイル型開発のどちらが効率的かという議論がたびたび交わされています。

**ウォーターフォールモデルとは？**

ウォーターフォールモデルとは、「要求定義・設計・開発・テスト」という工程順に開発を進める手法です。各工程では直前の行程から引き渡された成果物をもとに作業するため、一貫性が保障されるという利点があります。一方で、原則として工程の後戻りができないという欠点があります。

**アジャイル型開発とは？**

アジャイル型開発とは、短い期間単位で「計画・実行・評価」を繰り返すことで開発を進める手法です。この反復を繰り返すことで、ユーザーが利用可能な機能を段階的にリリースしていきます。

**日本のシステム開発とハイコンテキスト文化**

私は地方でウォーターフォールでの開発に7年間携わりましたが、ウォーターフォールモデルは日本の文脈を読むハイコンテキスト文化だからこそ機能する手法だと考えています。

ハイコンテキスト文化とは、言葉にしなくてもお互いの意図を理解し合える文化のことです。日本では、相手の気持ちを察したり、場の空気を読んだりすることが重視されます。

先ほどウォーターフォールでは工程の後戻りが出来ないと説明しましたが、日本ではこれは建前でテスト段階になっても設計の変更は当たり前のように発生します。しかも無料ですることも多々あります。これは開発会社（ベンダー）と顧客が文脈をお互いに汲み取るからではないでしょうか。

想像するに、そのような文脈はローコンテキスト文化の海外では通じません。ベンダーは設計で書いたこと以外を顧客に要求されても対応しないでしょう。**書いていないから。**

**海外の事例分析**

具体的な例を2つ紹介します。

1.  **江崎グリコの事例**
    * 2024年4月、デロイト トーマツ コンサルティングによるシステム刷新で江崎グリコはプッチンプリンを出荷停止としました。([https://diamond.jp/articles/-/342762](https://diamond.jp/articles/-/342762))
    * その影響で江崎グリコは2024年12月期の純利益が43%減となりましたが、江崎グリコがデロイトを訴えるような情報はありません。
    * デロイト側としては要求されたことは達成しており、その結果出荷停止が起こったのだからこちらに非はないという流れになったのではないでしょうか。
2.  **NHKの事例**
    * 2025年2月、NHKがシステム開発中止でIBMを提訴、約55億円を請求しました。これに対して日本IBMは「提案時に取得した要求書では把握できない、長年の利用の中で複雑に作り込まれた構造となっていることが判明した」と声明を出しました。([https://xtech.nikkei.com/atcl/nxt/news/24/02151/](https://xtech.nikkei.com/atcl/nxt/news/24/02151/))
    * 日本IBMはNHK側の要求書に書いていない要求があったため、当初予定していた2027年3月までの移行を困難と報告しました。

「書面で要求されていないので開発しない」、これは至極当たり前のことですが、これを前提にするならウォーターフォールは危ない開発手法と言えます。設計段階が終わった後に発覚した漏れは修正できないからです。

**日本のシステム開発の未来**

日本のシステム開発は、今後ローコンテキスト文化に対応すべきだと思います。なぜなら、システム開発におけるハイコンテキスト文化は、会社内の働き方にも悪影響を及ぼすからです。

例えば、今月の開発目標が達成していないため、チームメンバー全員が連日深夜まで残業し、休日も出勤している。しかし、残業時間や追加作業に対する適切な申請や報酬は行われていないという状況があります。このような働き方は、要求書にない要求を無料で引き受ける受託文化に大きく影響を受けていると私は考えています。

日本の受託開発はハイコンテキスト文化と結びつき、サービス残業や無償での仕様変更につながっているのではないでしょうか？
ハイコンテキスト文化に頼るのではなく、要求を明確化し、文書化する仕事が重要だと思います。

コメント欄であなたの意見を教えてください。
HTTPとはなんぞや　（LPI-Japan様の動画を参考に）

# なぜ調べようと思ったか
railsを学んでいて実際のデータのやり取りがどうなっているか気になったため　

# HTTPとは
ざっくりいうとネットをするときに使ってるルール
Hyper Text Transfer Protocolの略
Hyper Text等を伝えたいとき(transfer)に使うProtocol、ルール

##  Hyper Textとは
テキストを超えたもの
### どう超えたのよ
なんとテキスト同士を繋げられる例えばウィキペディアとか
## HTML（Hyper Text Markup Language）との関連ある？
ある
Hyper Textの機能の一部を使って、マークアップ言語で書かれたものがHTML
## マークアップとは
テキストにマークつまりタグ、<>をつけてコンピューターにテキストの形と中身を認識させる言語

# Hyper Text等とはどういうこと？
HTMLだけでなく、CSS、JavaScriptもやり取りできるため　

## HTTPの単語の意味はわかったが実際はどうやってネットしてるのか
ざっくりいうと相手にデータよこせといって相手がデータを返してくれてそれを表示している。
1. xxx/xxx/index.htmlにある情報をください！
1. htmlあげます！
1. index.htmlのファイルに書いてあったCSSください！
1. cssあげます
1. JavaScriptもください！
1. jsあげます

### あげます、くださいってなに😕？
HTTPというプロトコルの中の一部であるリクエスト
HTTPというプロトコルの中の一部であるリスポンス
のこと
### わからない、もっと詳しく　
例えばWebページを閲覧したいときつまりHTTPというプロトコルの中のrequestが持っているGETメソッドを使う。
メソッドとは呪文、特技、スキルのようなもの。
今回でいえばHTTPリクエストというルールの中で使える固有の呪文を使う。

### 他にどんな呪文があるの？
俺のデータを入れて　POST メソッド　
データを消して　DELETE メソッド

##  HTTPリクエストの中には何が入っていいるのか？
1. 使うメソッドはGETです
1. 欲しい情報はxxx/xxx/index.htmlです
1. スマホからアクセスしてません
1. クロームからアクセスしています
1. 日本語使ってます

## HTTPリスポンスの中には何が入っているのか？
1. ステータスコード。相手の状態を教えてくれる。見覚えがあるものだと、404 not found、リンク切れ。後は200 OK、後述。
1. 中身。例えばgetメソッドでhtmlをくれと良い、200 okが返ってくるとその本文にお目当てのhtmlがある。postメソッドを送り200 okが返ってきた場合は詳細な結果報告が入っている。




https://developer.mozilla.org/ja/docs/Web/HTTP/Status/200
https://www.youtube.com/watch?v=xPBoRzSwq0w
GitHub Copilotのプルリクレビューを試してみた


# はじめに
本記事はGitHubでプルリクを作成した際にCopilotがレビューしてくれるようになったので、とりあえず試してみた感想を記載した記事です

また、初歩的ですが躓いた箇所がありましたので、その備忘と共有も兼ねたいと思います

# 前提
現在(2025/03/08)、「GitHub Copilotのプルリクレビュー」は以下の状態です
- パブリック プレビュー
- 日本語未対応
- freeプランは対象外

その他の前提事項は下記の公式アナウンスを参照してください

https://docs.github.com/ja/copilot/using-github-copilot/code-review/using-copilot-code-review

> organization の所有者が organization のポリシーで [Copilot in GitHub.com] > [Opt in to preview features] を有効にしている場合のみです。

などもあります

# 躓いた箇所
## プルリクを作成してもReviewersにCopilotが表示されない
単純に下記を見落としており、「プレビューに参加していないだけ」でした
※「個人プラン」は対象外なのかと勘違いし、調査で数時間無駄にしました
![](https://raw.githubusercontent.com/yuhara-4113-ai/tech-blog/5-re-submit-article/images/used-copilot-to-review-pull-request/important-point.png)

### 対策
下記の「Join the preview」をクリックで、GitHubから「権限付与メール」が届けばOKです
※私の場合は数分で届きました

https://github.com/github-copilot/code-review-preview

権限付与メール
![](https://raw.githubusercontent.com/yuhara-4113-ai/tech-blog/5-re-submit-article/images/used-copilot-to-review-pull-request/granted-access-GitHub-Copilot-code-review.png)

# プルリク作成時に自動でレビューしてもらう方法
デフォルトでは手動でReviewersに「Copilot」をアサインする必要があります
ただしリポジトリの設定でプルリク作成時に自動でレビューしてもらうことができます
※たかが数秒の違いですが、最初に設定してしまえば自動でやってくれるので、自動化をオススメします

私は下記の記事を参考にして設定しました

https://zenn.dev/ncdc/articles/7807f5b6e3ee88


# Copilotのコードレビュー結果
![](https://raw.githubusercontent.com/yuhara-4113-ai/tech-blog/5-re-submit-article/images/used-copilot-to-review-pull-request/Copilot-code-review-1.png)
![](https://raw.githubusercontent.com/yuhara-4113-ai/tech-blog/5-re-submit-article/images/used-copilot-to-review-pull-request/Copilot-code-review-2.png)
上記のような結果でした
基本的に下記構成でコメントしてくれるようです
- PR Overview
  - プルリクの概要
- Reviewed Changes
  - 「レビューした差分ファイル」と「差分の内容」のマトリクス
- 指摘があればコメントがある

# 使ってみた感想
設定してしまえば、プルリクを作成したらレビューしてくれるのは大変よろしいです

ただし、現状は「日本語に未対応」なところが難点です
翻訳すれば済む話ですが、それがただただめんどくさい...

でも今まではリポジトリごとに「ChatGPT CodeReview」を導入してたので、それよりかはマシかなと思いました

こちらはプロンプトで指摘内容を日本語にできますが、「コード差分をChatGPTのAPIに投げてる」ので「料金が発生」します
軽量モデルであれば「1回のプルリクでも数円〜数十円」で済みますが、無料であればそれに越したことはないです

## ChatGPT CodeReviewの導入
私は下記参照してやってました

https://qiita.com/sauna1137/items/b0890684d45d30777072

# 最後に
日本語対応していないものの、設定は簡単ですし、嬉しい機能が開放されました
多分2ヶ月後くらいには対応してくれるのではないでしょうか？
それだけしてもらえれば、私は大満足です!!
AIエージェントデザインパターン実践：議論ベースの協調

## AIエージェントのデザインパターンを実装する

AIエージェントをLanggraphで実装する「LangChainとLangGraphによるRAG・AIエージェント［実践］入門」を読み、AIエージェントのデザインパターンを実際のユースケースに当てはめてColaboratory上で実装してみる。

https://gihyo.jp/book/2024/978-4-297-14530-9

他のデザインパターンについての記事は以下にまとめている。
- [プロンプト・レスポンス最適化](https://qiita.com/k5o/items/f24ae8b8583c0f355e89)
- [リフレクション](https://qiita.com/k5o/items/8ae34e4d45d261bddad1)
- [パッシブゴールクリエイター、プロアクティブゴールクリエイター](https://qiita.com/k5o/items/b7bd1c96f3602749352a)
- [シングルパスプランジェネレータ](https://qiita.com/k5o/items/5b5db14f6203b5e7f75d)
- [投票ベースの協調](https://qiita.com/k5o/items/c0ad3c0bc34881c44bdb)

今回は「議論ベースの協調」を実装してみる。議論ベースの協調は、それぞれのLLMが賛成、反対、まとめなどの立場となって議論を行うデザインパターンである。

## 議論ベースの協調

実装では以下のフローチャートのように「ルーター」と呼ばれるノードを作成して、議論中で次の発言を行う役割を指定する構成とした。初期化ノードで、「司会→賛成者→反対者→司会→賛成者→反対者」という発言の順番を設定してこの順番で各ノードに発言を割り振る。
各ノードの役割としては、
- 司会: 今までの議論があればそれらを要約する役割
- 賛成者: 議論に賛成の立場からこれまでの議論を踏まえた賛成意見を展開する
- 反対者: 議論に反対の立場からこれまでの議論を踏まえた反対意見を展開する
とした。
今回は議論の発言順は初期化ノードで設定されたものから変更していないが、議論の流れを見て司会ノードで適宜発言順を変更したり追加することで、より柔軟な議論ができると考える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517503/bfa0ae4d-7dbc-4fc4-91f1-2645f52fad53.png)

https://colab.research.google.com/drive/1oL7Li_PCc0bcVoRyMGxEr0cv3MwmpFWa?usp=sharing

議題例としては、「先進国はより他国の政治や経済に干渉すべきだ。」という議題でそれぞれ賛成意見、反対意見を展開した。
#0067（2024/03/09)セグメンテーションにおけるラベル数と精度の関係

# セグメンテーションにおけるラベル数と精度の関係

セグメンテーションモデルの学習において、ラベルの種類が精度に与える影響は大きいです。本記事では、「物体Aのみをラベル付けした場合、IoUがゼロだったが、物体Aと物体Bをラベル付けするとIoUが80%で飽和した」という現象について考察します。

---

## 1. 背景の扱いが改善された

物体Aのみをラベル付けした場合、学習データは「物体A」か「背景」の2クラスになります。このとき、

- 背景の多様性が十分に学習されない
- 背景と物体Aを誤分類する可能性が高くなる

といった問題が生じます。

一方、物体Aと物体Bをラベル付けすると、ネットワークは「物体A」「物体B」「背景」の3クラスを学習することになり、背景をより明確に識別する必要が生じるため、学習が進みやすくなります。

---

## 2. データのバランスが改善された

物体Aのみのラベル付けでは、学習データのクラス分布が偏る可能性があります。  
例えば、物体Aの面積が画像全体の10%しかない場合、90%が背景クラスとなり、「背景 vs 物体A」の分類が極端に不均衡になり、学習が進みにくくなります。

物体Bを追加することで、

- クラス間のバランスが改善し、ネットワークが学習しやすくなる
- 物体Aと物体Bの共通特徴や違いを学習することで、精度が向上する

といった効果が期待できます。

---

## 3. 特徴学習の多様性が増した

物体Aのみを学習した場合、ネットワークは物体Aの特徴しか学習できず、次のような問題が発生します。

- 物体Aに似た背景部分を誤分類しやすくなる
- ネットワークの表現力が限定される

物体Bを追加することで、ネットワークはより多様な特徴を学習する必要が生じ、以下の効果が得られます。

- 物体Aの識別能力が向上する
- 類似した特徴を持つ背景との違いを学習できる

---

## 4. 損失関数の最適化がしやすくなった

セグメンテーションモデルの学習では、損失関数の勾配が適切に流れることが重要です。

- 物体Aのみを学習すると、勾配の流れが偏り、学習が停滞する可能性がある
- 物体Bを追加すると、異なるクラス間の境界を学習する機会が増え、損失関数が適切に最適化されやすくなる

これにより、物体AのIoU向上にもつながる可能性があります。

---

## 5. ネットワークの活性化が適切になった

1つのクラスのみを学習すると、ネットワークの一部のフィルタしか活性化されず、以下の問題が生じます。

- 表現力が制限され、学習が進まない

物体Bを追加することで、より多くのフィルタが活性化し、ネットワークの表現力が向上するため、結果的に物体Aの認識性能も自然に向上する可能性があります。

---

## まとめ

ラベルの種類を増やすことで、以下の要因が組み合わさり、物体AのIoUが向上したと考えられます。

- 背景の識別能力が向上し、誤分類が減少する
- クラスバランスが改善され、学習が進みやすくなる
- 多様な特徴を学習することで、モデルの識別能力が向上する
- 損失関数の最適化がしやすくなり、学習の進行がスムーズになる
- ネットワークの活性化が適切に行われ、表現力が向上する

セグメンテーションの学習においては、ラベルの設定がモデルの性能に大きく影響を与えるため、データアノテーションの戦略も重要な要素となります。
StabilityMatrixを用いてStable Diffusion環境構築時のGitエラー備忘録(Windows)

## 結論
**Data格納Pathに日本語を含ませるな**

## Stable Diffusion環境構築
筆者は美術の成績が万年3で、3年の最終学期に内心のためおまけで4をもらった程度の画力であるため自身でイラストを描くことができない。
そのため画像生成AIに頼ろうと思い、Stable Diffusionの環境構築を始めた。  
現役エンジニアであるため従来のGitやPythonを駆使したやり方で導入するのも可能ではあると思うが、面倒くさいのでStabilityMatrixに頼ることにした。

## StabilityMatrix
StabilityMatrixの導入方法については[GitHubのページ](https://github.com/LykosAI/StabilityMatrix?tab=readme-ov-file)から自身のOSに合うものをダウンロードして解凍後、実行ファイルを叩くだけ。  
<INS>*この実行ファイルを配置するPathが重要*</INS>
## エラー発生時の対応
1. Desktop配下にGitHubからダウンロードしたzipを配置して解凍 
2. そのままStabilityMatrix.exeを実行してPortableモードを使用にチェックをして続行
3. Stable Diffusion Web UIのパッケージをダウンロード
4. エラー発生

```
Could not install stable-diffusion-webui (StabilityMatrix.Core.Exceptions.ProcessException: Process git exited with code 128. {StdOut = , StdErr = Cloning into 'C:\Users\文字化け箇所\Desktop\AI\Data\Packages\Stable Diffusion WebUI'...
fatal: failed to load library 'libcurl-4.dll'
```

Gitでエラーが起こっている。
ググると以下のQiitaの記事を発見。
[【Git】エラー「failed to load library 'libcurl-4.dll'」について (Windows環境)](https://qiita.com/Ryo-0131/items/e7ed680e60837dbf41e7)

この記事よりエラーの原因が自身のユーザ名が日本語のせいでDesktopの親ディレクトリが日本語となり、<INS>GitがPathを上手く解釈できなくて発生</INS>したようだった。

## エラー解決
StabilityMatrix.exeの実行Pathを以下に変更して、Portableモードで続行後にパッケージをダウンロードすると上手くいった。
`C:/AI/StabilityMatrix/StabilityMatrix.exe`

```
略
Stable Diffusion WebUI installed successfully
```

## まとめ
最初に結論で述べている通り、Dataの格納Pathに日本語を含ませると文字コードの問題？かGitでエラーが発生するため、**Data格納Pathは全て英語の箇所にするべき**。
PortableモードにチェックをつけるとStabilityMatrix.exeの実行Path直下のDataまでが勝手に指定されるため
**StabilityMatrix.exeの配置先Pathに日本語を含ませてはならない**。

この記事が誰かの役に立てれば幸いです。
家計簿アプリを作る＃１１

![スクリーンショット 2025-03-09 093942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/68821992-5233-406f-9c26-13a9d5d23f6a.png)
MUIアイコンを使用するために、こちらもコピーします。

![スクリーンショット 2025-03-09 094109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/7ad0c65b-8e77-4624-a6d1-1be43dd95ddb.png)
ターミナルに貼り付けて、ダウンロードします。
こうすることによって、MUIのアイコンが使用できるようになります。

![スクリーンショット 2025-03-09 094243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/e8cf01e9-ec01-4c1e-9b1b-8718ba29c75f.png)
続いて、検索バーで、”Drawer”と検索し、

![スクリーンショット 2025-03-09 094349.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/b23f7fcc-89da-4d87-acc2-111b84843f8d.png)
こちらに行きます。

![スクリーンショット 2025-03-09 094432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/89c9ad19-a910-4966-b909-c7e1d3f3e359.png)
その中の、Responsive Drawerを使用します。

![スクリーンショット 2025-03-09 094543.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/09bb16a2-2174-4325-ae80-f53fdaf9b9db.png)
show codeを選択し、

![スクリーンショット 2025-03-09 094616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/23dc76cd-f2ab-44ce-9168-7597b4038228.png)
コードをコピーします。

![スクリーンショット 2025-03-09 094659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/5a13cd3a-0c6b-4a84-9d3b-0f39acd21f97.png)
AppLayout.tsxの中身をすべて消して、貼り付けます。
Macでカーソル行の1行を削除するショートカットは  Ctrl+A -> Ctrl+K

- Ctrl+A : 文章の先頭に移動
- Ctrl+K: カーソル行より右を削除

この二つを組み合わせることで、1行を削除できる


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura




# 参考

https://support.apple.com/ja-jp/102650
AWSを始めてからCommunity Builderになるまでのアウトプット履歴

# AWSをスタート

元々はインフラエンジニアをやっていましたが、2021年の4月頃からAWSの学習を開始しました。

2021年04月～：AWSの学習・検証開始、社内での研究開発など
2021年12月～：AWS設計・構築案件の実施

上記開始当時の取り組みなどをまとめたスライドが下記になります。JAWS-UG 初心者支部 #45(2022/02/16)で初めて外部登壇の機会を頂きました。初回の登壇ということもあり、緊張していてほとんど話せておりませんが、同じ会にみのるんさんもおられました。

https://speakerdeck.com/toru_kubota/create-movie-sharing-site-using-aws-serverless

それ以降～現在まで主にオンラインの勉強会での登壇、ブログ記事の投稿（Qiita）を行っております。

# LT発表
AWS関連の勉強会での登壇履歴は下記になります。途中の[インフラ技術基礎勉強会](https://infra365.connpass.com/)は自分で主催したもので、AWS・インフラの基礎を勉強することを目的としています。登壇内容も[Transit Gatewayの基礎](https://qiita.com/infra365/items/3ddcaac82a55c6e6fbbc)、[Security Hubのセキュリティスコアはどうやって計算されるか](https://qiita.com/infra365/items/050fe084fcbc4f2c3753)など基礎的な内容がほとんどです。

|日付|勉強会 |
|---|---|
|2022/02/16|[JAWS-UG 初心者支部 #45](https://jawsug-bgnr.connpass.com/event/237621/)|
|2022/07/22|[#クラウドなんでもLT会 #6](https://ncdc-dev.connpass.com/event/251073/)|
|2022/10/06|[JAWS-UG朝会 #38](https://jawsug-asa.connpass.com/event/251171/)|
|2022/12/08|[JAWS-UG朝会 #40](https://jawsug-asa.connpass.com/event/255875/)|
|2023/01/18|[JAWS-UG初心者支部 #53](https://jawsug-bgnr.connpass.com/event/270825/)|
|2023/02/23|[インフラ技術基礎勉強会 #1](https://infra365.connpass.com/event/272976/)|
|2023/04/29|[インフラ技術基礎勉強会 #2](https://infra365.connpass.com/event/276315/)|
|2023/06/24|[インフラ技術基礎勉強会 #3](https://infra365.connpass.com/event/277147/)|
|2024/04/12|[インフラ技術基礎勉強会 #5](https://infra365.connpass.com/event/312035/)|
|2024/05/15|[インフラ技術基礎勉強会 #6](https://infra365.connpass.com/event/313272/)|
|2024/07/19|[JAWS-UG朝会 #59](https://jawsug-asa.connpass.com/event/291919/)|
|2024/08/21|[みのるんのゲリラ勉強会＆インフラ技術基礎勉強会コラボ](https://infra365.connpass.com/event/323497/)|

## ブログ（Qiita）
AWS関連のブログ記事の投稿件数になります。

|期間|投稿件数 |
|---|---|
|～2022/03/31|8件|
|2022/04/01～2023/03/31|20件|
|2023/04/01～2024/03/31|1件|
|2024/04/01～2024/03/09|31件|

その時期の投稿を見返してみると当時、自分が何をやっていたか振り返ることが出来ますね。2022年の初投稿は[既存ファイルサーバ名を引き継いでFSx for Windows File Serverを使用する](https://qiita.com/infra365/items/c802215565ca7488c8f9)です。この時期、オンプレミスファイルサーバの移行プロジェクトをやっていたのでしょう。その後の2022年の記事はkubernetes/EKS関連の記事が多いため、コンテナの勉強をしていたのでしょう。2023年は技術系の記事が少なく、[資格を60個以上取得してみて。 中長期的に役にたった場面](https://qiita.com/infra365/items/5985241d9c5d981751e0)の様な資格関連や情報処理試験のプロジェクトマネージャーの試験に関するものが多いため、プロジェクトマネジメントのスキルが求められていたのでしょう。2024年はガバメントクラウドで使用するサービスの記事が多いため、ガバメントクラウド関連のプロジェクトをやっているのでしょう。

# アウトプットについて
今年度はAWS Community Builders（Cloud Operations）に選出頂きました。今後も引き続き、無理せず自分が関連している分野のアウトプットが出来ればと考えております。また、これまでオフラインでの勉強会参加がほとんどでJAWS-UGもオンラインで参加したことが無いため、今年は多くのイベントに参加したいと思っております。
Rails 8.0.1のrails newで生成される本番環境用Dockerfileについて

https://github.com/rails/rails/blob/v8.0.1/railties/lib/rails/generators/rails/app/templates/Dockerfile.tt

上記のDockerfileはRailsアプリケーションを本番環境用にコンテナ化するために設計されています。主な特徴と実装内容を解説します。

## Dockerfileの主な構造と機能

### マルチステージビルド

このDockerfileは「マルチステージビルド」パターンを採用しています：

1. **base**ステージ：基本的な実行環境
2. **build**ステージ：依存関係のインストールとアセットのコンパイル
3. **Finalステージ**：実行に必要な成果物のみを含む軽量なイメージ

### 主な処理内容

#### 1. 基本環境のセットアップ
- Rubyの公式イメージ（slim版）をベースに使用
- 必要最小限のシステムパッケージをインストール
- 本番環境向けの環境変数設定

#### 2. ビルドステージでの依存関係インストール
- Gemのインストールに必要なパッケージを追加
- Bundlerを使用してGemをインストール
- 必要に応じてNode.js、Yarn、またはBunをインストール
- フロントエンドの依存関係をインストール

#### 3. アプリケーションコードの処理
- コード全体をコンテナにコピー
- Bootsnap最適化（設定されている場合）
- アセットのプリコンパイル

#### 4. セキュリティ対策
- 非rootユーザー（UID:1000, GID:1000）でアプリケーションを実行
- 必要なディレクトリのみに適切な権限を設定
- 不要なビルド依存関係を最終イメージから除外

#### 5. アプリケーション起動設定
- データベース準備のためのEntrypoint
- Thrusterを使用したサーバー起動（設定されている場合）

## セキュリティ面の評価

### 良い点

1. **非rootユーザーの使用**: アプリケーションが専用の非特権ユーザー（UID:1000）で実行され、コンテナが侵害された場合のリスクを低減

2. **マルチステージビルド**: 最終イメージには実行に必要なファイルのみが含まれるため、攻撃対象領域が減少

3. **最小限のベースイメージ**: slim版のRubyイメージを使用し、不要なパッケージを含まない

4. **キャッシュクリーンアップ**: `apt-get`のキャッシュを削除し、イメージサイズを最小化

5. **secret不要のビルド**: アセットプリコンパイル時にダミーのSECRET_KEY_BASEを使用

### 検討すべき点

1. **依存関係の固定**: 特定のバージョンを指定していますが、セキュリティアップデートが必要な場合は手動更新が必要

2. **パッケージの明示的な指定**: 実際のDockerfileではインストールするパッケージが明示的に列挙されますが、これらを最小限に保つ必要がある

3. **Dockerfileのメンテナンス**: セキュリティ問題が発見された場合にタイムリーに更新する体制が必要

## まとめ

Rails 8.0.1で生成されるDockerfileは、本番環境向けに最適化された構成を提供しており、セキュリティのベストプラクティスの多くが適用されています。非rootユーザーの使用、マルチステージビルド、最小限の依存関係などの手法により、セキュリティリスクを低減しつつ効率的なコンテナイメージを実現しています。

ただし、継続的なセキュリティ対策として、依存関係の定期的な更新、脆弱性スキャンの導入、本番環境での適切な設定（シークレット管理など）を検討することをお勧めします。
個人的備忘録：PowerShell・GUI・Linux コマンドで簡単に確認する LDAP 認証の技術検証をまとめてみた

## はじめに

LDAP 認証を確認する際、できるだけ簡単に素早くチェックできる方法を知っておくと便利です。

この記事では PowerShell、GUI（ldp.exe）、Linux（ldapsearch）を使った LDAP 認証の確認方法を解説します。

---

## 方法 1: PowerShell を使って LDAP 認証を確認
PowerShell のワンライナーコマンドで LDAP 認証をすばやく確認できます。

### コマンド
```powershell
(New-Object DirectoryServices.DirectoryEntry("LDAP://ad.honda.com", "honda-admin@honda.com", "honda")).Name
```

#### 成功時の出力
```ini
CN=Honda Admin
```
LDAP 認証が成功し、ユーザー情報が取得できています。

#### 失敗時の出力
```pgsql
Exception calling ".ctor" with "3" argument(s): "The user name or password is incorrect."
```
➡ ユーザー名やパスワードが間違っている可能性があるので確認してください。

---

## 方法 2: ldp.exe を使う（GUI で確認）
PowerShell に慣れていない場合は、Windows に標準搭載されている ldp.exe を使用できます。

### 手順
1. 「Windowsキー + R」を押して `ldp.exe` と入力 → Enter
2. 「Connection」→「Connect」を選択
   - Server: `ad.honda.com`
   - Port: `389`（LDAPS を使う場合は `636`）
   - Use SSL → チェックなし (`636` を使う場合はチェック)
3. 「Connection」→「Bind」を選択
   - User: `honda-admin@honda.com`
   - Password: `honda`
4. 「OK」をクリックして認証を試す

#### 成功時
`Authenticated as DN` のメッセージが表示

#### 失敗時
`Invalid credentials` エラーが表示

---

## 方法 3: ldapsearch を使う（Linux / WSL）
Linux や Windows の WSL (Ubuntu) を使用している場合、`ldap-utils` をインストールすれば、`ldapsearch` コマンドで LDAP 認証を確認できます。

### コマンド
```sh
ldapsearch -x -H ldap://ad.honda.com -D "honda-admin@honda.com" -w "honda" -b "DC=honda,DC=com"
```

#### 成功時の出力
```makefile
# honda-admin, Users, honda.com
dn: CN=Honda Admin,CN=Users,DC=honda,DC=com
objectClass: user
sAMAccountName: honda-admin
```

#### 失敗時の出力
```java
ldap_bind: Invalid credentials (49)
```
➡ パスワードが間違っているか、LDAP サーバーのアクセス制限がある可能性があります。

---

## まとめ
| 方法 | コマンド | 成功時の表示 |
|------|---------|-------------|
| PowerShell (ワンライナー) | `(New-Object DirectoryServices.DirectoryEntry("LDAP://ad.honda.com", "honda-admin@honda.com", "honda")).Name` | `CN=Honda Admin` |
| GUI (ldp.exe) | `ldp.exe → 「Bind」` | `Authenticated as DN` |
| Linux / WSL (ldapsearch) | `ldapsearch -x -H ldap://ad.honda.com -D "honda-admin@honda.com" -w "honda" -b "DC=honda,DC=com"` | `dn: CN=Honda Admin, CN=Users, DC=honda, DC=com` |

---

## おまけ：追加情報の取得
LDAP 認証が成功したら、ユーザー情報の詳細を取得できます。

### ① 完全な DN (Distinguished Name) を取得
```powershell
(New-Object DirectoryServices.DirectoryEntry("LDAP://ad.honda.com", "honda-admin@honda.com", "honda")).Properties["distinguishedName"].Value
```

### ② sAMAccountName (ログインID) を取得
```powershell
(New-Object DirectoryServices.DirectoryEntry("LDAP://ad.honda.com", "honda-admin@honda.com", "honda")).Properties["sAMAccountName"].Value
```

### ③ すべての属性を一覧表示
```powershell
$ldapUser = New-Object DirectoryServices.DirectoryEntry("LDAP://ad.honda.com", "honda-admin@honda.com", "honda")
$ldapUser.Properties.PropertyNames | ForEach-Object { "$_ : " + $ldapUser.Properties[$_] }
```