OmniAICreator/Qiita-1.07M huggingface dataset:
Eloquent ORMの基本：RailsのActive Recordとの共通点と違い

### はじめに
プログラミングを始めたばかりの方にとって、フレームワークの選択は大切な決断です。この記事では、PHPフレームワークである Laravel の Eloquent ORM と、Ruby on Rails の Active Record について、共通点と違いを比較しながら解説します。どちらもORM（Object Relational Mapping）として広く使われており、データベースとのやり取りを簡潔かつ直感的に記述できるツールです。

### ORMとは？
**ORM**は、オブジェクト指向プログラミングとリレーショナルデータベースの間の橋渡しをするツールです。SQLを直接記述せず、オブジェクトを操作する感覚でデータベースにアクセスできるため、コードの可読性と保守性が向上します。

## Eloquent ORMとActive Recordの共通点
### 1.データベーステーブルとの対応

両者とも、データベースのテーブルと1対1で対応するモデルクラスを用意します。
例: `users` テーブルに対応する `User` モデル。
### 2.直感的なメソッドチェーン

データの取得やフィルタリングが簡単に行えます。
Eloquent: `User::where('active', 1)->get();`
Active Record: `User.where(active: true)`

### 3.リレーションのサポート

データベースのリレーションをコードで表現可能です（例: `hasOne`, `belongsTo`, `hasMany`）。

### 4.マイグレーション

データベーススキーマの変更をコードで管理する仕組みが提供されています。

## Eloquent ORMとActive Recordの違い

### 1. クエリの記述方法
Eloquentでは、SQLに近い感覚で記述するのに対し、Active RecordはRubyのシンボルや構文を活用します。

| 操作          | Eloquent                              | Active Record                               |
|---------------------|--------------------------------------|--------------------------------------|
| レコード取得              | `User::find(1); `                                | `User.find(1)`                                |
| 条件検索    | `User::where('name', 'John')->get();`            | `User.where(name: 'John')`                          |

### 2. リレーションの宣言方法
Eloquentはメソッドを利用し、Active Recordはマクロを用います。

**Eloquent:**

```php:php
class Post extends Model {
    public function user() {
        return $this->belongsTo(User::class);
    }
}
```

**Active Record:**

```ruby:ruby
class Post < ApplicationRecord
  belongs_to :user
end
```

### 3. スコープの実装
Eloquentではスコープはscopeメソッドを活用しますが、Active Recordはクラスメソッドで定義します。

**Eloquent:**

```php:php
class User extends Model {
    public function scopeActive($query) {
        return $query->where('active', 1);
    }
}
```

**Active Record:**

```ruby:ruby
class User < ApplicationRecord
  scope :active, -> { where(active: true) }
end
```

### 4. モデルの生成
Eloquentでは、createメソッドを直接使用してデータを挿入します。一方、Active Recordではnewでインスタンスを作成後、saveします。

**Eloquent:**

```php:php
User::create(['name' => 'John', 'email' => 'john@example.com']);
```

**Active Record:**

```ruby:ruby
user = User.new(name: 'John', email: 'john@example.com')
user.save
```

### 実際に使ってみる
以下は、簡単なToDoアプリケーションの例です。
RailsとLaravelで同じ機能を実現するコードを比較します。

#### タスク一覧を取得する:

**Laravel (Eloquent):**

```php:php
$tasks = Task::where('status', 'pending')->get();
```

**Rails (Active Record):**

```ruby:ruby
tasks = Task.where(status: 'pending')
```

#### 新しいタスクを作成する:

**Laravel (Eloquent):**

```php:php
Task::create(['title' => 'New Task', 'status' => 'pending']);
```

**Rails (Active Record):**

```ruby:ruby
Task.create(title: 'New Task', status: 'pending')
```

## まとめ
Eloquent ORMとActive Recordは、それぞれのフレームワークに最適化されたORMであり、基本的な概念は共通しています。しかし、記述方法や設計思想には違いがあるため、フレームワークの特徴やプロジェクトの要件に応じて使い分けることが重要です。

公式ドキュメントの参照
[Laravel Eloquent Official Documentation](https://laravel.com/docs/11.x/eloquent)
[Rails Active Record Official Guide](https://railsguides.jp/active_record_basics.html)

どちらを選ぶにしても、公式ドキュメントを常に参照しながら進めることで、より理解が深まるでしょう！
Ubuntu 24.04にDockerをインストールする方法

# Ubuntu 24.04 に Docker をインストールする手順

家の余ったデスクトップPCがWindows10だったのですが11へのアップグレード対象外で来年サポートが切れるし、
正直Win端末不要なのでUbuntuでサーバ運用する為にOSを入れ替えました。

今まではサーバーにアプリを入れて運用していましたが、コンテナの方がメンテナンス性が高いと感じていたのと、何度かDockerで挫折していたので、勉強の為に導入しました。

## 💻 環境
- OS: Ubuntu 24.04
- Docker: 20.10.17

## 1. 古いバージョンの削除
もし以前に Docker をインストールしている場合は、古いバージョンを削除しておきましょう。

```bash
sudo apt-get remove docker docker-engine docker.io containerd runc
```

## 2. Docker リポジトリの設定

### 必要なパッケージのインストール
Docker のインストールに必要な基礎パッケージをインストールします。

```bash
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release
```

### Docker の公式 GPG キーを取得
リポジトリのセキュリティを確保するため、Docker の公式 GPG キーを追加します。

```bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```

### Docker リポジトリの登録
Docker のリポジトリをシステムに登録します。

```bash
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

## 3. Docker のインストール
リポジトリの設定が完了したら、Docker をインストールします。

```bash
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

## 4. インストール後の確認
Docker のバージョンを確認します。

```bash
sudo docker -v
# 出力例: Docker version 20.10.17, build 100c701
```



## 💡 バージョンを指定して Docker をインストールする場合

### 利用可能なバージョンの確認

```bash
sudo apt update
apt-cache madison docker-ce
```

### バージョンを指定してインストール（例: 20.10.13）

```bash
sudo apt-get install docker-ce=5:20.10.13~3-0~ubuntu-jammy \
  docker-ce-cli=5:20.10.13~3-0~ubuntu-jammy \
  containerd.io docker-compose-plugin
```

### バージョンの確認
```bash
docker -v
# 出力例: Docker version 20.10.13, build a224086
```

---

## 5. 動作確認
簡単なコンテナの実行で確認します。

```bash
sudo docker run hello-world
```

---

## 🧑‍💻 一般ユーザで Docker を実行できるようにする

### Docker グループを確認
```bash
getent group | grep docker
```

### 現在のユーザを Docker グループに追加
```bash
sudo usermod -aG docker $USER
```

---

## 6. Docker Compose の確認
```bash
docker compose version
# 出力例: Docker Compose version v2.6.0
```

---

## 🎉 まとめ
以上で、Ubuntu 24.04 に Docker をインストールし、基本的な動作確認までを完了しました。この手順を参考に、さらに Docker の利用を広げてください！


## 📎 参考リンク
- [Docker公式インストールガイド](https://docs.docker.com/engine/install/ubuntu/)
Javaを基礎から学ぶその6　Enumをもっと知る

この記事は、[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の6日目の記事です
理解するのに結構苦労しました。忘れると面倒なのでわかりやすく書いたつもりです。
# Enum
配列やlistなんかとは似て非なるもののようです。リュックサックのよう感じで、Enumの中に必要なものを入れて、取り出したいときにEnumの中に入っているものだけ取り出せる感じです。入っていないものは取り出せません。
また、入っているものひとつひとつに番号を振ったり、別の文字を紐づけることもできるそうです。
# 使い方
```
public class Rucksack {
    public static void main(String[] args)  {
       Nakami Toridasu=Nakami.Nomimono;
       System.out.println(Toridasu);
    }
    
    enum Nakami{
        Nomimono,
        Saihu,
        Cellphone;
    }
}
```
いま、リュックサック(Enum)の中に飲み物、財布、携帯電話が入っているのがわかると思います。
ここから飲み物を取り出しました。
## 解説
始めのほうから解説します。
### Nakami Toridasu=Nakami.Nomimono;
```
Nakami Toridasu=Nakami.Nomimono;
```
一番混乱するのはここだと思っています。イコールの左側でNakami Toridasuと書いてありますが、NakamiがまるでintやStringといった型のように扱われています。でも、そういうものです。

### enum Nakami
```
 enum Nakami{
        Nomimono,
        Saihu,
        Cellphone;
    }
```
配列やListではvoid mainの中に書いていましたが、enumはmainの外に書くようです。中に書くとエラーが出ます。
# 別の文字をくっつける
enumでは別の文字を紐づけることができます。例えばアイテムの選択画面を作るときに、アイテム名にアイテムの説明をくっつけて簡単に管理できます。
全文はこちら
```
public class Rucksack {
    public static void main(String[] args)  {
       Nakami Toridasu=Nakami.Nomimono;
       System.out.println(Toridasu.getKanrenyougo());
    }
    enum Nakami{
        Nomimono("drink"),
        Saihu("money"),
        Cellphone("denwa");
        private String Nakanomoji;
        private Nakami(String Nakanomoji){
            this.Nakanomoji=Nakanomoji;
        }
        public String getKanrenyougo(){

            return Nakanomoji;
        }
    }
   
    
}
```
さっきとの違いを見ていきます。
### 解説
```
  Nomimono("drink"),
        Saihu("money"),
        Cellphone("denwa");
```
関連する文字は()でくっつきます。
```
 private String Nakanomoji;
```
これは、後で関連付けた文字を入れていろいろ使うためのものです。
```
private Nakami(String Nakanomoji){
            this.Nakanomoji=Nakanomoji;
        }
```
ないとエラーになります。中がnullのthis.Nakanomojiに、中身が入ったNakanomojiを代入しています。
```
 public String getKanrenyougo(){

            return Nakanomoji;
        }
```
これが呼ばれると、呼んだ文字(例えばsaifu)に対応した文字(この例ではSaifuに対応している"Money")が返されます。
その結果、必要な文字をを返してくれる機能ができます。

# 番号を振る
文字を紐づける時と大体同じです。違いは、stringがintなどになるくらいです。うまく使えば、敵を倒した時の経験値を付与する部分とかが作れそうです。
ちなみに、さっきの分のEnumの文字を数字に変えて、Stringをintに変換したものがこちら↓
```
public class Rucksack {
    public static void main(String[] args)  {
       Nakami Toridasu=Nakami.Nomimono;
       System.out.println(Toridasu.getKanrenyougo());
    }
    enum Nakami{
        Nomimono(1),
        Saihu(2),
        Cellphone(3);
        private int Nakanomoji;
        private Nakami(int Nakanomoji){
            
            this.Nakanomoji=Nakanomoji;
            
        }
        public int getKanrenyougo(){

            return Nakanomoji;
        }
    }
   
    
}
```
これで、文字に対応した数字を出すことができます。

# まとめ
Enumは使い方によっては結構使えそうな感じです。文字に数字や別の文字をくっつけられるので使い勝手がいいと思います。まだ使ってないならぜひ使ってみてください。

# 参考文献

https://www.bold.ne.jp/engineer-club/java-enum

https://www.sejuku.net/blog/14779

https://www.akkodis.co.jp/candidate/insight/column_128

https://ugo.tokyo/java-enumeration/
[Delphi] 矢印描いたことある？

# 矢印描いたことありますか？
そこそこ長くプログラマをやってるんですけどプログラムで矢印描く事がなくて、ついこないだ初めて矢印描いたんですよね。仕事で。

そうしたら思いのほかキレイな式になったよというお話しです。

# 最初の考え方

最初、こういう風に考えたんですよね。
矢印の

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/7f35ec39-83e7-0f92-e44d-8571399cc54d.png)

矢頭の部分、そのまま伸ばして角度を求めればいけそう、と。
それが下の図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/3484b5fe-dc87-7093-25e8-a5a3dc526fcb.png)

それぞれの角度を求めると↓こう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/95d8031a-1aa8-e53a-1db2-44c54b64f5de.png)

```
線 A の角度：θ - τ
線 B の角度：θ + τ
```

式がめっちゃキレイに纏まりました！

# 考え方を変える

それで、導出された式を見ていてアレ？これもっと簡単に考えられたんじゃね？ってなりました。

↓のように角θからτ分を引けば A の角度になるし、足せば B の角度になるんです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/22b9c4cb-5005-64bc-3178-d2b208025e76.png)

こんなに単純に考えられたなんて！
出てくる結論は同じなんですけど、考え方で求め方の簡単さが違うんだなあ。みつを。

# 矢印を描くコントロール

導出された式を使って矢印を描く TArrowLine というコントロールを作りました。
下記、ソース全文です。
Paint メソッドの中で左下から右上に向かって矢印を描います。

```delphi
unit PK.Graphic.ArrowLine;

interface

uses
  System.SysUtils
  , System.Types
  , FMX.Controls
  , FMX.Graphics
  , FMX.Objects
  ;

type
  TArrowLine = class(TShape)
  public
    procedure Paint; override;
  end;

implementation

uses
  System.Math;

{ TArrowLine }

procedure TArrowLine.Paint;
const
  // 矢印の部分の長さ
  ARROW_SIZE = 8; 
  // 矢印の角度
  ARROW_HEAD_TAU = Pi / 6;
begin
  var C := Canvas;
  C.Stroke.Assign(Stroke);
  C.Fill.Assign(Fill);

  // 本体の線の描画
  var X1 := 0.0;
  var Y1 := Height;

  var X2 := Width;
  var Y2 := 0.0;

  C.DrawLine(PointF(X1, Y1), PointF(X2, Y2), 1);

  // 角度・座標の計算
  var Theta := ArcTan2(Y2 - Y1, X2 - X1);

  var TauA := Theta - ARROW_HEAD_TAU;
  var XA := X2 - ARROW_SIZE * Cos(TauA);
  var YA := Y2 - ARROW_SIZE * Sin(TauA);

  var TauB := Theta + ARROW_HEAD_TAU;
  var XB := X2 - ARROW_SIZE * Cos(TauB);
  var YB := Y2 - ARROW_SIZE * Sin(TauB);

  // 矢印部分を塗りつぶす
  C.FillPolygon([PointF(XA, YA), PointF(X2, Y2), PointF(XB, YB)], 1);
end;

end.
```

コントロールをもっとちゃんと作る場合は左下から右上だけの線じゃなく [TLine.LineType](https://docwiki.embarcadero.com/Libraries/ja/FMX.Objects.TLine.LineType) のように、線をどう引くかをプロパティで指定できた方がいいですね。

# 描画結果
描画するとこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/40ae22c2-10bb-557b-cb73-ee0d53a54c9a.png)

```delphi:描画例
procedure TForm1.FormCreate(Sender: TObject);
begin
  var AL := TArrowLine.Create(Self);
  AL.Align := TAlignLayout.Client;

  // 赤に設定
  AL.Stroke.Color := TAlphaColors.Red;
  AL.Fill.Color := TAlphaColors.Red;

  AL.Parent := Panel1;
end;
```

# 最後に
式がキレイに纏まるとすごく気持ちがいいですね！
GitHub、はじめてみました (Part 1)

GitHubアカウントは作成済みで、レポジトリもあることを想定
※ 本記事ではMacbook上の説明をしていますが、基本的にWindows WSL2でも使えます

## GitHubのSSH認証を設定
```zsh:zsh
ls -al ~/.ssh # 既存のSSHキーがあるか確認します
```
何も表示されなければSSHキーが存在しないので、以下のコードで新規作成しましょう
```zsh:zsh
ssh-keygen -t ed25519 -C "GitHubに登録したメールアドレス"
```
1.	保存先の指定: そのままEnterを押すと ~/.ssh/id_ed25519 に保存されます
2.	パスフレーズ: オプションですが、セキュリティを強化したい場合は設定しておきましょう

## SSHエージェントを起動
SSHキーを現在のセッションで使用可能とします
```zsh:zsh
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
```
SSHキー（id_ed25519.pub）の内容をコピーしておきます
```zsh:zsh
pbcopy < ~/.ssh/id_ed25519.pub
```
1.	GitHubのSSHキー設定ページを開く（settings > SSH and GPG keys）
2.	新しいSSHキーを追加
•	「New SSH key」をクリック。
•	タイトルを任意で入力（例: “MacBook SSH Key”）。
•	コピーした公開鍵を「Key」フィールドにペースト。
3.	「Add SSH key」をクリックして保存。

## GitHubにSSHでアクセスできるか確認
```zsh:zsh
ssh -T git@github.com
```
初回は「Are you sure you want to continue connecting?」にyesと入力。
成功すると、以下のメッセージが表示される
```zsh:zsh
git remote set-url origin git@github.com:<GitHubユーザー名>/<レポジトリ名>.git
```
すべて完了したら、GitHubリポジトリからデータを取得してみてください。
初回：clone
更新：pull

```zsh:zsh
# リモートリポジトリをローカルにクローン
git clone git@github.com:<GitHubユーザー名>/<レポジトリ名>.git <レポジトリ保存先へのパス>
```
- [x] リポジトリのCloneとは？
ローカルに新しいフォルダが作成され、リモートリポジトリの内容がコピーされる
保存先を指定しておくとよい（例えば~/GitHub_repos/<レポジトリ名>）

```zsh:zsh
# 現在のブランチをリモートリポジトリの最新状態に更新
git pull origin main
```
- [x] リポジトリのPullとは？
ローカルに既にClone済みのリポジトリを更新する

# 最後に
基本的なのに知らなかった内容
- [x] SSH形式：git@github.com:<GitHubユーザー名>/<レポジトリ名>.git
- [ ] HTTP形式：https://github.com/<GitHubユーザー名>/<レポジトリ名>.git

:::note info
**この時点で知っておくべきTipsや基本的内容があればぜひコメントください！**
:::
これでもう誤爆しない〜Google Chatの改行設定編〜

## はじめに
はじめまして。リンクラフト株式会社でエンジニアとして働いている酒井です。
アドベントカレンダーの13日目を担当させて頂きます。
よかったら見ていってください。よろしくお願いします。


## Google Chatの改行どうにかならない？
早速ですが、皆さんは Google Chatを使ったことがありますか？
Googleが提供しているチャットアプリでとても便利なので、使ったことがある方も多いかもしれません。
そんな便利なGoogle Chatですが、一つ大きな問題点があります。
それは ```Enter``` で改行をしようとして、誤爆（誤送信）してしまう人が後を経たないことです。

*「上司にメンションだけつけてチャットを送ってしまった！」*
*「文章の途中でチャットを飛ばしてしまった！」*

こんな感じで気まずい思いをした方も多くいるのではないでしょうか？

このような事故が起きるのは、Google Chatのデフォルトの改行方法が ```Shift+Enter``` となっていることが原因です。
そこで今回は、これ以上改行事故を増やさないために、Google Chatの改行方法の変更手順を紹介しようと思います。

## 変更方法
変更方法は、至ってシンプルで、

**”Googleの拡張機能を用いて、設定そのものを変更する”**

たったこれだけです！
このままだとちょっと尺が短すぎるので、実際に拡張機能を導入して設定を変更してみようと思いますw

## 実際にやってみる
ということで、実際に導入して設定までしていきます。
今回導入する拡張機能は、「[Google Chat 改行キー設定](https://chromewebstore.google.com/detail/google-chat-%E6%94%B9%E8%A1%8C%E3%82%AD%E3%83%BC%E8%A8%AD%E5%AE%9A/mfnigpcpfllpnmaobnojkhbhkefnemhk?hl=ja&pli=1)」です。

では、改行方法を変更していきます。

**Step1)** こちらの拡張機能をChromeに追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615491/dc70b327-f9c8-41d9-c8f5-3e415b00f7cf.png)

**Step2)** 拡張機能のポップアップから設定を行います。
　　　※```default```以外を選択すれば、OKです。

![スクリーンショット 2024-12-05 18.50.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615491/6da943c2-2d2a-1849-037b-013035d15611.png)

**Step3)** 最後に、Google Chatでページを更新すれば設定完了です。


## 最後に
これだけしておけばGoogle Chatで誤爆し、気まずい思いをすることもなくなりますので、ぜひやってみてください。
この後もアドベントカレンダーは続きますので、他の記事も読んでもらえると嬉しいです。
最後まで読んでいただきありがとうございました。

***
**一緒に働く仲間を募集中です！**

リンクラフト株式会社では、組織拡大に伴い積極的な採用活動を行っています。
少しでも興味がある方はぜひご連絡ください。

▽会社ホームページ
https://lincraft.co.jp/
▽Instagram
https://www.instagram.com/lincraft.inc/
▽ご応募はこちらより
https://lincraft.co.jp/recruit

※カジュアル面談も受付中です。ご希望の方はHPのお問い合わせフォームよりご連絡ください。
***
SANストレージ入門：IP-SANとFC-SANの違いから構築まで



今回は、SANについて興味を持ったのでまとめてみました。「IP-SAN」と「FC-SAN」の選び方から、実際の構築手順まで、実践的な内容でお届けします。

## はじめに：SANって何？

SANは「Storage Area Network」の略で、サーバーとストレージを専用のネットワークで接続する仕組みです。

例えるなら、SANは「ストレージ専用の高速道路」のようなものです：
- 通常のネットワーク → 一般道（様々なデータが混在）
- SAN → 高速道路（ストレージデータ専用）

## IP-SANとFC-SANの違い

まずは表で比較してみましょう：

| 項目 | IP-SAN | FC-SAN |
|------|---------|---------|
| 特徴 | 既存のIPネットワークが使える | 専用の高速ネットワークを構築 |
| 速度 | 1-10Gbps | 16-64Gbps |
| コスト | 💰 | 💰💰💰 |
| 運用難度 | 😊 | 😣 |
| おすすめ用途 | 開発環境、部門サーバー | 基幹システム、大規模DB |

### どっちを選べばいい？

✅ IP-SANを選ぶケース
- 予算を抑えたい
- 既存のネットワークを活用したい
- 運用担当者のスキルレベルが様々

✅ FC-SANを選ぶケース
- 超高速な転送が必要
- 予算より性能を重視
- 専門の運用チームがいる

## 実践：IP-SANの構築手順

### 1. サーバー側の設定（Linux）

```bash
# まずはiSCSIのインストール
sudo apt-get install open-iscsi

# サービスの起動
sudo systemctl enable iscsid
sudo systemctl start iscsid

# ストレージの検出（IPアドレスは環境に合わせて変更してください）
sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.100
```

> 💡 **Point**
> - `open-iscsi`はLinuxでiSCSIを使うためのパッケージです
> - `192.168.1.100`は接続したいストレージのIPアドレス

### 2. ストレージ側の設定

```bash
# ターゲットの設定ツールをインストール
sudo apt-get install targetcli-fb

# ストレージの作成（/dev/sdbを使う例）
sudo targetcli /backstores/block create name=disk1 dev=/dev/sdb

# iSCSIターゲットの作成
sudo targetcli /iscsi create iqn.2024-03.com.example:storage
```

## 実践：FC-SANの構築手順

### 1. 基本構成

FCスイッチを使った基本的な構成はこんな感じです：

```
[サーバー1] ─┐          ┌─ [ストレージA]
[サーバー2] ──[FCスイッチ]── [ストレージB]
[サーバー3] ─┘          └─ [ストレージC]
```

### 2. ゾーニング設定

```bash
# ゾーンの作成（サーバーとストレージを関連付け）
zoneCreate "zone_srv1", "10:00:00:00:c9:2b:6a:3c"
cfgAdd "PROD_CONFIG", "zone_srv1"
cfgEnable "PROD_CONFIG"
```

## トラブルシューティング

### よくあるトラブルと対処法

1. 接続できない
```bash
# まずはPingで疎通確認（IP-SANの場合）
ping ストレージのIP

# iSCSIセッションの確認
iscsiadm -m session
```

2. 性能が出ない
```bash
# I/Oの状態を確認
iostat -x 1
```

## まとめ

SANの選択は、以下の3つがキーポイントです：

1. **予算**
   - IP-SAN：数十万円～
   - FC-SAN：数百万円～

2. **必要な性能**
   - IP-SAN：一般的な業務システム向け
   - FC-SAN：高性能が必要なシステム向け

3. **運用体制**
   - IP-SAN：一般的なネットワーク知識があれば運用可能
   - FC-SAN：専門知識を持った運用体制が必要

## よくある質問
 Q. IP-SANでも基幹システムは運用できる？
 A. 適切な設計と十分な帯域があれば可能です。要件に応じて検討が必要です。 
 
 Q. FC-SANの学習にはどのくらい時間がかかる？
 A. 環境や個人の経験により大きく異なります。基本的な運用を理解するまでの期間は、関連する技術の経験や学習環境によって変動します。
 
※本ガイドの内容は一般的な説明です。実際の導入に際しては、使用する製品のマニュアルや専門家の助言を参考にしてください。

## 参考リンク
- [iSCSI公式ドキュメント](https://www.open-iscsi.com/)
- [FC-SAN設計ガイド](https://example.com/fc-san-guide)
【LINQ】クエリ構文とは

## はじめに
メソッド構文ばかり使っている中、突如プロジェクト内に現れたクエリ構文...
クエリ構文に馴染みがなく読み取るのに時間が掛かったので、これを機にある程度読めるようなりたい
## クエリ構文とは
LINQを書く上での1つの書き方
クエリ構文とメソッド構文の2種類の書き方が存在する

## クエリ構文はこんな感じ
馴染みのない人からしたらすごい違和感です。
使っている人は多いらしいが、SQLっぽいのが理由なんですかね。

書いた内容はscores内の複数のデータで80以上のものだけをscoreQueryに代入するというもの
```c#:クエリ構文
var scoreQuery =
    from score in scores
    where score > 80
    select score;
```

```c#:メソッド構文
var scoreQuery = scores.Where(a => a.score > 80);
```

## よく使う構文をクエリ構文で書いてみる

```c#:Where
var scoreQuery =
    from score in scores
    where score > 80 or score < 100  // ここ||ではなくor
    select score;
```
```c#:OrderBy
var scoreQuery =
    from staff in staffs
    where staff.Age > 80
    orderby staff.Age
    select staff;
```
```c#:GroupBy
var scoreQuery =
    from staff in staffs
    where staff.Age > 80
    group staff by staff.Id //groupbyの書き方もすこし違いますね。
    select staff;
```
Joinあまり使ったことないですが、直感的で使いやすそうなので取り上げました。
```c#:Join
var scoreQuery =
    from staff in productStaffs
    where staff != null
    join product in products on staff.CategoryId equals product.CategoryId
    select new
    {
        StaffId = staff.StaffId
        Category = product.Name,
        Name = product.Name
    };
```

## さいごに
* 唯一のデメリット:クエリ構文の記事が少ない！
「LINQ クエリ構文 Join」　みたいな検索しないと出てこない＆記事少ないのは致命的

書きづらい印象は余計強くなりましたが、単調なクエリ構文は覚えておくべきと自分に言い聞かせました。
中括弧やラムダ式を書かなくてよいので本当にあるべき文だけが書かれていると感じスタイリッシュです。
ちなみに、クエリ構文・メソッド構文でできることは変わらないです。


こういう良さがあるよ！があればコメントにてご教示いただけると幸いです。
Advent of code 2015 Day 24 Part 1 & Part 2 を Livebook で楽しむ

## はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 24 の Part 1 と Part 2 を解きます

問題文はこちら

https://adventofcode.com/2015/day/24

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day24_part1.livemd

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day24_part2.livemd

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 24 の入力を取得します

![スクリーンショット 2024-12-05 21.08.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c00f9954-1fe2-8f33-9c33-c59153c076fd.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

### Part 1

<details><summary>回答</summary>

入力例を使って解いてみましょう

```elixir
packages = Enum.to_list(1..5) ++ Enum.to_list(7..11)
```

実行結果

```elixir
[1, 2, 3, 4, 5, 7, 8, 9, 10, 11]
```

3 つのコンテナに分けて同じ重量になるので、一つのコンテナの重量は全重量の 1/3 です

```elixir
target_weight = packages |> Enum.sum() |> div(3)
```

実行結果

```elixir
20
```

コンテナ内の荷物数を最小にするため、とりあえず二つだとして、全ての組み合わせのうち、合計が目標の重量になるものを抽出します

量子もつれは重量の総積で、そのうちの最小値を求めます

```elixir
for num_a <- packages,
    num_b <- packages,
    num_a < num_b,
    num_a + num_b == target_weight do
  [num_a, num_b]
end
|> Enum.uniq()
|> Enum.filter(&(&1 != []))
|> Enum.map(&Enum.product(&1))
|> Enum.min()
```

実行結果

```elixir
99
```

実際の入力を取得します

```elixir
packages =
  puzzle_input
  |> String.split("\n")
  |> Enum.map(&String.to_integer(&1))
```

実行結果

```elixir
[1, 3, 5, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113]
```

目標重量を求めます

```elixir
target_weight = packages |> Enum.sum() |> div(3)
```

実行結果

```elixir
508
```

入力例と同じことを行えば良いのですが、実際には最小の荷物数が何個なのか分かりません

そのため、 [Day 21](https://qiita.com/RyoWakabayashi/items/788a3e084cc1c65243e2) で使ったのと同じ、組み合わせ生成モジュールを使用し、目標重量ができるまで徐々に増やしていきます

```elixir
defmodule Combinations do
  def all(_, 0), do: [[]]
  def all([], _), do: []
  def all(list, n) when length(list) == n, do: [list]

  def all([head | tail], n) do
    with_head = for combo <- all(tail, n - 1), do: [head | combo]
    without_head = all(tail, n)
    with_head ++ without_head
  end
end
```

```elixir
1..length(packages)
|> Enum.reduce_while(nil, fn size, _ ->
  packages
  |> Combinations.all(size)
  |> Enum.filter(fn combo ->
    Enum.sum(combo) == target_weight
  end)
  |> case do
    [] ->
      {:cont, []}

    valid_combinations ->
      {:halt, valid_combinations}
  end
end)
|> Enum.map(&Enum.product(&1))
|> Enum.min()
```

</details>

### Part 2

<details><summary>回答</summary>

コンテナが 4 つになるので、目標重量の計算が変わります

以上です

```elixir
target_weight = packages |> Enum.sum() |> div(4)
```

</details>

## まとめ

問題文から ChatGPT に画像を生成してもらいました

![aoc2015_day24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/7f616aeb-2d9f-4507-ec96-fa1c487781cd.png)

全てのコンテナを考える必要はない、ということに気づけば簡単な問題でした

あと 1 日で AOC 2015 はコンプリートです！
OkCancelとYesNoの使い分け

# はじめに
メッセージボックスで表示されるボタンには「OkCancel」と「YesNo」がありますが、なんとなくで使い分けていませんか？
これらはユーザーインターフェース設計において意図が異なるので、適切に使い分ける必要があります。

# OkCancel: システムの動作に対する確認
OkCancelは、主体がシステムであり、システムが特定の動作を実行していいかどうかをユーザーに __確認__ するときに使われます。許可・拒否を示したり、単純な動作確認に使用します。
例:「このファイルを削除してもよいですか？」
(システムがファイルを削除する動作を行ってもよいかを確認。)

# YesNo: ユーザーの意思決定を問う
YesNoは、ユーザー自身が行動を実行するかどうか、 __選択__ や意思決定が必要な場合に使用します。
例:「この変更を保存しますか？」
(システムが「保存するかどうか」をユーザーに決めさせている)

# 間違った使い方をすると
もしOkCancelとYesNoを間違って使ってしまうと、ユーザーは聞かれた内容を拒否したい場合、「聞かれた操作のみの中止」か「操作全体中止」か曖昧で迷うことになります。

# 終わりに
誤った使い方をすると、ユーザーが混乱して誤操作を招く可能性が高まります。適切な使い分けを意識し、UI/UXを改善しましょう！
RAGを使って手元のpdfから情報を抽出する

# 生成AIでRAGを使ってpdfから情報を抽出する
いまさらではあるが、RAGを使ったコードを書いてみた。
生成AIでRAGを使えば手元のpdf中の情報など、生成AIが持っていない知識を使って生成AIと対話することができる。

# RAGとは
生成AIを使えば、一般的な知識を元にQ&Aに答えたり文章の要約や翻訳を行うことができる。
しかし、生成AIの持っていない特定領域の知識や自分だけが持っている情報などは回答することができない。
そこで、[RAG](https://huggingface.co/docs/transformers/model_doc/rag)を使うことで、手元のpdfやテキストファイル、データベースの情報から特定領域や自分だけが持っている情報を検索してその結果を踏まえた回答を行うことが可能である。

# コード
早速RAGを使ったコードをColaboratoryで書いた。

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

生成AIモデルは「rinna/gemma-2-baku-2b-it」を使用している。
特定領域の知識として、試しに厚生労働省が出している「薬の知識」についてのpdfを使用した。

https://www.mhlw.go.jp/content/11120000/000666014.pdf

このpdfから、「海外の薬を輸入して使うときの注意点は何ですか？」という質問に対してpdf中の内容を元に回答することがわかる。

# まとめ
今回はpdfからテキストを抽出したが、Wordファイルやデータベースからでもテキストを検索して抽出する仕組みがあればそれらからも知識を取得して生成AIが回答できることを確認できた。
偏差値40くらいで2年目のマナビDXクエスト2024

そもそも
アドベントカレンダーの書き方すらわからんのよ

知ってる人たちが
参加してるから

去年はヒヨった
アドベントカレンダーに参加してみました

ポチっと押せるかどうかが大事よね

カラオケで誰も聞いてないだろうに下手なのを気にしたり
誰も読まないであろうブログにビビッてても仕方ない

取り急ぎ、経験値を１積みに来ました。

ねぇ
みんな
いつ、どこで
ブログのマークダウン方式ってやつ覚えたの？

マナビDXクエストについても
頑張っている人は
初年度でもぐんぐんデキる子になってゆく

私は客観的に見て
偏差値40くらいやな

何回勉強してもPythonわかんねー

すごい先輩たちが
その辺の有料の授業より分かりやすく教えてくれるけど

一人になったらできやしないのよ
ツライ・・・

＝＝＝＝＝＝＝
マナビDXクエストで得たもの

2023では、仲間や先生ができました。主に人的な部分が大きかったです。
2024でも、仲間や先生ができました。2023よりは俄然少ないです。

2回しか参加してませんが
仕組みが変わると、活動の仕方も変わるのだなと
思っています。

あくまで、受け身な人間の話であって
自ら率先して行動する人は環境関係なく

仲間、知識、技術を習得されている
と思っています。

具体的なことは
書き足して行けたらなと思いますが

もう一つ強く伝えたいことは

学べる環境

会社に居ると、全員が学ぶ姿勢を持っている会社って難しいと思います

でも
マナビDXは、会話の機会がある人は学ぶ姿勢を持つ同志ばかりです。

他の方も共感できると思いますが
マナビDXのメンバーで会社やったらきっと楽しいだろうなって思います。

まぁあくまで学べる環境なので
学ぶかどうかは自分次第

かくいうワタシも、ショボいほう

でも一年生に抜かれても
素直にスゲーって言ってられるのも

居心地いいんですよね

マジお勧めなんよね
RAG: Retrieval Augmented Generation

LLM(Large Language Model)  Calendar 2024
https://qiita.com/advent-calendar/2024/llm
Day 6 投稿記事です。

投稿予定の方は、購読ボタンを押してください。よろしくお願いします。
記事をお読みになられたら、Calendarにあってもいいかなって記事には、いいね💚　をお願いします。

# RAG
RAGとは？
https://qiita.com/zumi0/items/33030ac6309e5a4330d5

RAG（Retrieval-Augmented Generation）入門
https://qiita.com/en2enzo2/items/ae7ac793199c85356055

RAG（検索拡張生成）とは | 生成AIとの関係性や仕組み、活用事例を紹介
https://qiita.com/skillup_ai/items/e4494f5c2409fd8b7bb4

RAGを０から理解する
https://qiita.com/kgtakm/items/277c9e23a0d60db46f50

RAGをはじめるならここから（仕組みを図解、超入門）
https://qiita.com/Kahiro/items/56545a93bb99d8bdd8e3

RAGの概要まとめ、今後
https://qiita.com/applego/items/29546ed50d65bc9a8d56

いまさら基本的なRAGを構築する
https://qiita.com/mrsd/items/2269caf36bb5531ba25a

RAG精度向上のための6つのポイント
https://qiita.com/hmkc1220/items/01efb6a669ba262ee514

RAG入門: 精度改善のための手法28選
https://qiita.com/FukuharaYohei/items/0949aaac17f7b0a4c807

RAG の実践的な資料
https://qiita.com/7shi/items/26131d290741a53abc07

Self-RAGについて
https://qiita.com/ippeiSuzuki2024/items/499d7e4b332e70e0b51c

最近話題になっている「Self-RAG」について説明します
https://qiita.com/xxyc/items/3228d9e428cad44342b4

あなたのRAGは、回答型？それとも検索型？
https://qiita.com/shyamagu/items/98fe60f6f81b744b97b1

従来RAGを超える！エンティティ知識グラフで質問応答を革新するGraph RAG
https://qiita.com/kernelian/items/d13747b78e97ae8fc0da

RAGBuilder覚書
https://qiita.com/yoshiyuki_kono/items/dcfe915c1b57db363518

【サーベイ論文まとめ】RAG(Retrieval-Augmented Generation)
https://qiita.com/LiberalArts/items/121a846cc59098812c77

>『Retrieval-Augmented Generation for Large Language Models: A Survey
https://arxiv.org/abs/2312.10997v5

Agentic RAG: Integrating Intelligence into Retrieval-Augmented Generation
https://qiita.com/jhonsnow/items/079e3cba8967f8621c1d

>Agentic RAG Explained: What You Need to Know
https://markovate.com/agentic-rag/

langchainとDatabricksで(私が)学ぶRAG : シリーズ一覧 & 準備編
https://qiita.com/isanakamishiro2/items/66411e1443cf78a2c1e8

Databricks生成AIクックブック - 1. RAGの概要
https://qiita.com/taka_yayoi/items/ad36e09639a95b6eae69

Databricks生成AIクックブック - 3. RAG品質のノブ
https://qiita.com/taka_yayoi/items/c5d63ebe767ec9833464

Dataikuを利用したRAGシステム開発について、知っておいた方が良い情報
https://qiita.com/TsuyoshiK7/items/f8703d2398ba1dbed806

ファインチューニングとRAGの違いについて
https://qiita.com/shirochan/items/e34a9705b8c20e76f46b

FlowiseAIを使って、複数のRAGからAgentを使ってよしなにデータを取り出す
https://qiita.com/oggata/items/11132831136d40127498

RAG評価ツール「RAGAS」とは？
https://qiita.com/ist-i-j/items/13496a07e14a92e898fe

Amazon BedrockにCohere Command R と Command R+ が来たよ！RAGがすげーよ！
https://qiita.com/moritalous/items/16797ea9d82295f40b5e

langchainでRAGやってみた
https://qiita.com/t-hashiguchi/items/21ad182d448c3b5dff75
株式会社うるるの新卒エンジニア研修を紹介します！

# うるるの新卒エンジニア研修を紹介します！

こんにちは！うるるで技術戦略を担当している部古賀です。  
今回は、Qiitaアドベントカレンダーの企画として、今年実施した新卒エンジニア研修の内容についてご紹介したいと思います。

 ~~ついでに面接の「新卒研修ってどんなことやってるんですか？」を「ここ見といて」にしちゃおうという作戦ではない~~

## うるるの研修の特徴

### 1. 常に改善を続ける質の高いプログラム

うるるでは、「エンジニアが働きがいを感じ、成長できる環境」を大切にしています。  
その一環として、新卒エンジニア研修には特に力を入れ、「自ら学び、成長するエンジニア」を育成することを目的とした質の高いプログラムを提供しています。

この研修プログラムは、毎年研修会社様と二人三脚でカリキュラムを見直し、継続的な改善を行っています。  
今年は、昨年から導入したLaravel/Vue.js研修をさらにブラッシュアップし、新たにテストコードを記述する演習を盛り込みました。

また、研修中のコミュニケーション活性化策として、
育成担当との1on1だけでなく、さまざまなメンバーとの1on1の機会を設けています。  
多様な視点からフィードバックを得ることで、新卒エンジニアの成長を促しています。

さらに、研修終了後も9月末まで技術戦略部がフォローアップを担当し、
継続的な成長支援を行う体制を整えています。  
毎年改善を重ねることは運営側にとって骨の折れる作業ですが、新卒エンジニアがより早く活躍できるよう、日々プログラムを磨き上げています。

### 2. 個別サポートによる成長促進 - 1on1と多様な交流

新卒エンジニアたちは、これまでの経験やスキルレベルが人によって大きく異なります。  
そのため、うるるでは一律同じ内容とやる大学講義のような内容ではなく、
新卒たちの状況に応じてフォロー体制を作り、
スムーズな業務ジョインをサポートしています。

研修期間中は、毎日育成担当の先輩との1on1を実施。  
業務の進捗確認や技術的な課題はもちろん、
キャリアプランや日々の悩みまで、何でも相談できる場を用意しています。

先輩からの温かい励ましやアドバイスは、
不安や悩みを和らげ、前向きな姿勢で研修に取り組む大きな支えとなっています。

このような密なコミュニケーションを通じて、
新卒エンジニアには「安心して成長できる！」と感じてもらえる環境づくりを目指しています。

## 各月の研修内容

### 4月：ビジネスマナー研修

4月は、社会人としての基本的なマナーや心構えを学ぶ期間です。  
社内の多様なメンバーとの交流や同期との関係構築を通して、会社全体への理解を深めます。

### 5月：エンジニア研修（バックエンド編） - Laravel習得

5月からはPHP/Laravelを中心としたバックエンド研修がスタート。  
Webアプリケーション開発の基礎を学び、実践を通してプログラミングスキルを身につけていきます。

また、AWS JumpStartにも参加し、クラウド技術に触れる機会も設けました。

研修は、質の高い指導で定評のある研修会社様のご協力のもと、ソースコードレビューや座学を交えながら進行します。  
これにより、新卒エンジニアは着実に成長していきます。

弊社ではバックエンドエンジニアからのキャリアスタートがスタンダードではあるため、
バックエンド研修の期間を比較的長く取っていますが、
フロントエンドスタートの新卒もいるので、そこはご安心ください！

### 6月：エンジニア研修（フロントエンド編） - Vue.js習得 & ハッカソン

6月は、Vue.jsを用いたフロントエンド開発を学び、5月に学んだバックエンドをAPIとして活用しながら、フロントとの連携によるアプリケーション開発に取り組みます。

そして今年は、研修の集大成としてハッカソンを開催。  
これまで培った知識・スキルを総動員し、自由なテーマでWebアプリケーションを開発します。

チームで課題を解決し、アイデアを形にするプロセスを通じて、実践的な開発能力を一段と磨きました。  
発表の場では、上長やマネージャー陣から厳しくも愛情あるレビューを受け、さらなる成長のきっかけとしています。

### 7月：配属

7月からは、いよいよ各部署へ配属となります。  
研修で培った知識や経験を踏まえ、
それぞれの新卒エンジニアが自分の持ち場で活躍してくれることを期待し、
送り出しています。

## 終わりに

うるるの新卒エンジニア研修は、技術的なスキル習得だけでなく、社会人としての基礎力、コミュニケーション能力、問題解決力など、さまざまな能力を育むことを目指しています。

今後も新卒エンジニア一人ひとりの成長を支え、未来を担うエンジニアを育てるために、研修プログラムの改善を続けていきます。  
引き続き、うるるの取り組みにご期待ください！
OSを含んだデータ移行にご注意あれ！

## はじめに
　今回はOSを含んだデータ移行を対象に話したいと思います。私の失敗談も踏まえて話したいと思います。お付き合いください。

## データ量を意識しましょう
　皆さん、余裕のあるデータ容量を確保することは心がけていますか？特にCドライブの容量は最初に意識する必要があります。昨今、各アプリケーションが進化する中でデータ量が増加傾向です。そして今後も増加するでしょう。そこで私たち開発者も開発するときのデータが増えていくことが予測されます。様々な研究でデータをどう扱い少なくするのか、多いデータを処理するか議論されているみたい。

## SSDやHDDを買うときの基準
　PC構成でWIndowsの方であればC driveストレージ容量を一番気を付けましょう！！
私の肌感覚であれば3割ほど余白を作ることが重要だと考えます。（半分以上っていう人もいるけど）
ex) 1TBなら300GBを余裕

*この思考は一番重要です。YoutubeやXなどでPC性能・ベンチマークしますがストレージいっぱいだと性能を十分に発揮されません。（ぜひ、平日に近くの電化製品の店員に質問してみたら楽しいと思います。)

### ストレージ構成（参考に)
![2023-12-24 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2934464/aff34d49-2d5a-59af-99c9-5118c7168c28.png)


## ストレージ移行
　2023年,私は当初1TBのストレージ構成でした。しかし、研究/開発/ゲームを行う中で3Dモデリング開発環境を整えると900GBになってしまいました。結果、PCの挙動がおかしくなりました。(画面が急に点滅したりなど)
そこでC Drive/OSを含んだストレージを移行することにしました。以下手順を説明してます。

## 移行する手順

　C Driveのストレージを移行する際には、以下の手順に従って進めることができます。この手順は、Windowsの標準的な方法に基づいていますが、異なる状況によっては適用できないこともあります。重要なデータが含まれる場合は、事前にバックアップを作成することをお勧めしますね。

**注意: これらの手順は慎重に行う必要があり、誤った操作がデータ損失を引き起こす可能性があるため注意してくださいね。**

1. **バックアップの作成:**
   - C Dirveに格納されている重要なデータをバックアップします。外部ドライブやクラウドストレージなど、安全な場所にバックアップを作成する。

2. **新しいストレージデバイスを用意:**
   - 移行先となる新しいストレージデバイスを用意します。これは新しいハードドライブ、SSD、または外部ストレージなどです。

3. **Windowsのバックアップと復元ツールを使用:**
   - Windowsには「バックアップと復元」ツールが組み込まれています。これを使用して、システムイメージやファイルのバックアップを作成します。
   - 「コントロールパネル」から「システムとセキュリティ」を選択し、「バックアップと復元」をクリックします。
   -  復元ツールを月額で払いました。(EaseUSなど有名で選択すればOK)
 
 https://jp.easeus.com/partition-manager-software/professional.html

 
4. **新しいドライブの設定:**
   - 新しいドライブをパソコンに接続します。これは内部または外部ドライブのどちらでも構いません。
   - Windowsが新しいドライブを認識したら、「ディスクの管理」に移動して新しいドライブに割り当てるドライブレターを設定します。

5. **データの移行:**
   - バックアップからデータを復元するか、手動でデータを新しいドライブに移動します。
   - すべてのデータが新しいドライブに移行されたことを確認してください。

6. **ブート情報の更新:**
   - 新しいドライブに OS が正しくインストールされている場合、ブート情報を更新する必要があります。これには、Windowsの修復ツールやサードパーティのブートマネージャツールを使用できます。

7. **テスト:**
   - パソコンを再起動して、新しいドライブが正しく動作しているか確認します。必要に応じて、BIOSまたはUEFI設定でブートデバイスの順序を調整します。

これらの手順を慎重に実行することで、C ドライブのストレージを新しいデバイスに移行することができます。ただし、データのバックアップと手順の正確な実行は非常に重要です。

### 失敗談 ### 
   - 私は1TBから2TBに拡張する形なので、Cloneする構成を変更せず自動Cloneを行ってしまいました。結果、2TBに拡大したのに1TB分が未割り当てになってしまいました。2TBストレージを購入した意味がなくなってしまいました。

![スクリーンショット 2023-12-19 121809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2934464/70a49c16-3cc0-7575-9170-51a1a8a3d5c6.png)

   - 次に、OSを含んだストレージが2つあるため、次起動させる際はどちらかのストレージを外して起動させなければいけないのですが、何度も起動させてしまいました。(3度起動させた）結果、1TBに入ったデータ(元々のデータ）は読み込み不可能になってしまいました。
　 - 最後の選択として、ストレージの割り当てを分けて使い続けるか、初期化するかの２択に絞られました。（初期化して環境構築し直しました。）

## 移行失敗してよかった
  - 今まで環境構築してきたのに、水の泡になった経験は一生忘れることはありません。(今まで頑張ってきた環境構築が水の泡だなと思って初期化した記憶など）
  - OSについて客観的に調査できた。各ストレージでの役割を勉強できた。回復パーティションやNTFSなど形式について調べた一生の思い出です。
  - SSDの付け替えを何度も行ったことによってF1自動車のタイヤ交換並みの速度上達。(何度も挙動チェックを行いました。）

 ## さいごに
  - こうやって自分はOS自作/CPU自作へと沼に走っていくのであった。（容量って気にしたことない自分にとって一つのきっかけになりました）
VSCode の Emacs-like キーバインディング

こんにちは。
VSCode を、Emacs-like キーバインディングへより近づける方法を調べました。macOS の標準にも近づくと思います[^1]。

* ```control + option + F/B``` の設定：カーソルを1単語分右左へ移動
* [Better Kill Ring](https://marketplace.visualstudio.com/items?itemName=wdawson.better-kill-ring) の導入： Kill-Ring からの貼り付け（```control + Y```）なども可能となります。

[^1]: 参考：[macOS のキーバインディング（ショートカット）](https://qiita.com/kkdd/items/58047859ad4305181539)
CSS詳細度とは

## CSSのどの値が適用されるか
CSSでは、CSSルール[^1]によって、条件に該当する要素にスタイルをあてることができます。
```css
p {
  color: red
}

.p-class {
  color: blue
}
```
要素によっては、CSSルールの複数の条件に該当する場合があります。
例えば、上の例では`<p>`タグが`p-class`というクラスに属しているときには2つの条件`p`と`.p-class`に該当することになります。
```html
<p class="p-class">text</p>
```

複数の条件が該当する場合には、必ずしも後から書かれたルールで上書きされるわけではなく、適用されるCSSルールの優先度によってどのルールが適用されるかが決定されます。

## 詳細度
CSS詳細度は、競合するルールのうち、どのCSSルールが適用されるかを決めるアルゴリズムです。

詳細度はCSSルールの条件に設定されているセレクタの種類とその個数によって決まります。

セレクタの種類は`ID`, `CLASS`, `TYPE`に分類されます。
### `ID`
`ID`の分類にはIDセレクターが含まれます。
IDセレクターは`#id`というように記述されます。

### `CLASS`
`CLASS`の分類には、クラスセレクタ（例：`.p-class{...}`）や属性セレクタ、擬似クラスセレクタ（`:hover{...}`など）が属します。

属性セレクタは、`a[title]{...}`のように指定することで要素の属性を条件に設定することができます。
`a[title]`の場合は、`<a>`タグのうち`title`属性をもつものが該当します。

### `TYPE`
`TYPE`の分類には要素型セレクタ（`p{...}`）や擬似要素セレクタ(`::before{...}`)が属します。

### 詳細度の計算
詳細度は`ID`,`CLASS`,`TYPE`の個数によって`<IDの個数>-<CLASSの個数>-<TYPEの個数>`のように表されます。
例えば、`ID`,`CLASS`,`TYPE`に分類されるセレクタがそれぞれ2,1,3個設定されているCSSルールの場合、その詳細度は`2-1-3`となります。

2つのCSSルールのうち、以下をみたす方が優先して適用されます。
- `ID`の個数が多いルール
- `ID`の個数が同じときには、`CLASS`の個数が多い方
- `ID`,`CLASS`の個数が同じときには、`TYPE`の個数が多い方

例として、以下のようなCSSルールを考えてみます。
```css
p.p-class { /* 0-1-1 */
    color: cyan;
}

p { /* 0-0-1 */
  color: red;
}

.p-class { /* 0-1-0 */
  color: blue;
}

#pid { /* 1-0-0 */
    color: yellow;
}
```
```html
<p id="pid" class="p-class">text</p>
```
この例では、`#pid{...}`(`1-0-0`),`p.p-class`(`0-1-1`),`.p-class`(`0-1-0`),`p`(`0-0-1`)の優先順でルールが適用されます。

また、詳細度が同じ場合には、後に書かれているCSSルールが優先して適用されます。


## インラインスタイルによる上書き
HTML要素のstyle属性によってルールを指定することもできます。
このインラインスタイルは詳細度に関わらず、優先して適用されます。

```html
<p id="pid" class="p-class" style="color: skyblue;">text</p>
```
この例では詳細度によらず、textの色が`skyblue`となります。

## `!important`
CSSルールの値に`!important`をつけることで、詳細度の高いルールやインラインスタイルの指定を上書きすることもできます。
```css
p{
  color: blue !important;
}
```
詳細度が`0-0-1`のCSSルールでも、特定のプロパティのみ上書きすることが可能です。

## さいごに
あとから書いたCSSルールで必ずしもスタイルの上書きができないのは、CSS詳細度によって適用するCSSルールが決まっているためです。
うまくスタイルを上書きできないときには、CSS詳細度を確認してみると原因が見つかるかもしれません。

https://developer.mozilla.org/ja/docs/Web/CSS/Specificity

[^1]: セレクターのグループと宣言ブロックの組は[CSSルール](https://developer.mozilla.org/ja/docs/Web/CSS/Syntax#css_%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB%E3%82%BB%E3%83%83%E3%83%88)と呼ばれます。
SQLにおいてnullは明確に不明なんだ。

## いきなりですが問題です
### Q1
```sql
SELECT * FROM users WHERE nickname = NULL;
```
nicknameがNULLのユーザーは取れますか？

---
### Q2
```sql
SELECT * FROM users WHERE nickname != 'nori';
```
nicknameがNULLのユーザーは取れますか？

---
### Q3
```sql
SELECT * FROM users WHERE 1 = 1;
```
上記のSQLは1 = 1がtrueになるため、全てのレコードが取得されます。
```sql
SELECT * FROM users WHERE NULL = NULL;
```
上記の場合、全レコードが取得できますか？

---
### Q4
```sql
SELECT GREATEST(30, 50, NULL);
```
GREATESTは引数の中の最大値を返す関数です。今回の場合どのような値が取得できますか？

## テーブルを作るなら
実際にSQLでやってみたいという人は以下のSQLを使うとそれっぽいことができます
```sql
CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(100),
  age INT,
  nickname VARCHAR(100)
);

INSERT INTO users VALUES (1, 'John', 30, 'manjiro');
INSERT INTO users VALUES (2, 'Pine', 50, 'piko');
INSERT INTO users VALUES (3, 'Mike', NULL, NULL);

```
実行環境もほしいよという欲張りさんは[SQL Playground](https://sqlplayground.app/)を使うといいんじゃないかな

## 答え合わせ
さて、答え合わせをしていきましょう。
### Q1
```sql
SELECT * FROM users WHERE nickname = NULL;
```
nicknameがNULLのユーザーは取得できますか？

**→できません**

---
### Q2
```sql
SELECT * FROM users WHERE nickname != 'nori';
```
nicknameがNULLのユーザーは取得できますか？

**→できません**

---
### Q3
```sql
SELECT * FROM users WHERE 1 = 1;
```
上記のSQLは1 = 1がtrueになるため、全てのレコードが取得されます。
```sql
SELECT * FROM users WHERE NULL = NULL;
```
上記の場合、全レコードが取得できますか？

**→できません**

---
### Q4
```sql
SELECT GREATEST(30, 50, NULL);
```
GREATESTは引数の中の最大値を返す関数です。今回の場合どのような値が取得できますか？

**→NULL**
※ちなみにPostgreSQLだけは他のRDBMSと違う動きをしており、50が取得されます

## さて…
全問納得の結果でしたか？
もしそうならこの記事から学べることはないので、有意義な時間を過ごすためにも今すぐPCを閉じて筋肉を鍛えましょう。

もし間違えたり、合ってたけど腑に落ちないところがある方は、後ろの内容を読むと有益な情報を得られるかもしれません。

## SQLにおいてNULLとは？
いきなり愚痴っぽくなるんですけどNULLって絶妙に理解しにくいですよね。
なんとなく「ない」とか「未定」とか「適用不能」とか「空」とか「不明」とか、ちょっと存在怪しげなニュアンスなのはわかるけど、ちゃんと言語化しようと思ったら曖昧になりがちな概念だと思います。

しかし、SQLにおけるNULLには明確な意味があるんです…

**それは「不明」という意味です**

つまるところ明確に不明というわけなんです！

あ、帰らないでください。

### 真偽値の3値理論
3値理論の前に2値理論から見てみましょう。
一般的なプログラミング言語は2値理論を採用しています。
ある命題について真か偽かで表すやつです。
要は普通のBooleanですね。

一方SQLで採用されている3値理論というのは、真偽に加えて不明という値を加えたもののことをいいます。

そしてNULLに不明がアサインされています。

このNULLが不明であるという気持ちを持ったまま、さっきの問題を見ると全てが腑に落ちます。

### Q1
```sql
SELECT * FROM users WHERE nickname = NULL;
```
=は等しいかどうかをチェックする演算子ですが、nicknameの文字が不明と等しいかどうかはわかりません。
そのため、その比較結果がTRUEにならずレコードを取得できません。

NULLの値を検索する場合、IS NULLというキーワードを使いますが、これはその値が不明であるかどうかをチェックするキーワードだから、NULLが見つかります。
値が不明と同じかはわからないけど、不明であることはわかるということです。

### Q2
```sql
SELECT * FROM users WHERE nickname != 'nori';
```
これもQ1と同様ですが、不明な値なので、noriという文字列と一致していないかどうかは不明なのです。
その結果、TRUEと判定できず、レコードが取得できません。
ちなみにこれは大名著「SQLアンチパターン」のフィアオブジアンノウンの章で紹介されています。

### Q3
```sql
SELECT * FROM users WHERE NULL = NULL;
```
不明と不明のものを比較しても同じかどうかは判定できないですね。
例えるなら中身が見えない箱を2つ出されて、これの中身は同じですか？と聞かれているようなものです。
なので、この場合もレコードは取得できません。

### Q4
```sql
SELECT GREATEST(30, 50, NULL);
```
30と50と不明、どれが一番大きいですか？
50か不明なのはわかりますが、確信は持てないですね。
なので結果も不明を表すNULLになります。

NULLに対して「何もない」みたいな認識を持ってしまうと50が取れそうな雰囲気を感じ取ってしまいますね。

ちなみにこのときNULLを0みたいに扱いたければ、COALESCE関数を使って以下のように書いてあげるといい感じに動いてくれます。
```sql
SELECT GREATEST(30, 50, COALESCE(NULL, 0));
```
## 結論
**SQLにおいてNULLはトリッキーな動きをするが、NULLは不明という意識を持っておくとだいたい腑に落ちる**

ということで3値理論を肝に命じて楽しいSQLライフを送りましょう。

もし、この内容が参考になった方はいいねしてもらえると今後のアウトプットの活力になりますので何卒よろしくお願いしますm(_ _)m
Google Cloud Pub/Sub を起点としたアプリケーションのメンテナンスを安全に行なった話

## はじめに
Pub/Sub において、push 型のサブスクリプションを利用すると、サブスクリプションと紐づいたアプリケーションにPub/Subからデータが送信されます。

そのアプリケーションでダウンタイムが発生するメンテナンスを行う場合、push 型のままだと以下のようなリスクが考えられます。
- 配信の再試行数が上限に達した場合、メッセージが失われる
- 再試行が繰り返されることによる処理の重複が発生

このリスクを回避するために Pub/Sub サブスクリプションの設定を一時的に pull 型に切り替え、Pub/Sub とアプリケーションの連携を一時停止する方法を採用しました。

この方法により、Pub/Sub トピックから供給されるメッセージを失うことなくメンテナンスを安全に進めることができました。

本記事ではその具体的な手順を紹介します。


## 対象
- Pub/Sub の push サブスクリプションを利用してアプリケーションにデータを配信するシステムを運用しているエンジニア
- メンテナンス中にメッセージのロストや重複処理を防ぎたい方


## 手順
### サブスクリプションの設定を push から pull に変更する
まず、Pub/Sub サブスクリプションの設定を pull 型に変更して Pub/Sub とアプリケーションの連携を一時的に停止させます。

サブスクリプションの編集画面から対象のサブスクリプションを選び、配信タイプを pull に変更したら「更新」ボタンを押して設定を反映させます。

後で設定を戻すので、エンドポイント URL やサービスアカウント等の設定情報をメモしておくとよいです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924190/931224e6-2c55-e666-82f9-ef961c1706e7.png", width="400">

### サブスクリプションの設定を pull に設定後、メッセージがキューに溜まっていることを確認
配信タイプを pull にすると、サブスクライバー側からのリクエストがない間は、サブスクリプションに供給されたメッセージはキューに溜まっていきます。

サブスクリプションの詳細画面を開いて ACK 処理されていないメッセージ数が増加していることを確認します（後述の画像参照）。


### メンテナンスを行う
この間、Pub/Sub からの push 配信が停止しておりメッセージが配信されないため、安全にメンテナンスを行うことができます。

メンテナンスが完了したら次の手順に進みます。

### サブスクリプションの設定を push に戻す
サブスクライバー側のメンテナンスが終わったら、再びサブスクリプションの編集画面を開いて変更した設定を元に戻します。

元に戻した設定が間違っていないか確認できたら「更新」ボタンを押して設定を反映させます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924190/cf5f754d-6cfa-1c3c-c87d-3a71be2259c8.png", width="400">


### 未処理のメッセージが正常に送信されているか確認
サブスクリプションの設定を push 型に戻したら、キューに溜まっているメッセージが全て処理され、以下の画像のようにサブスクリプションの指標から、全てのメッセージが ACK 処理されていることを確認します。

![ackChart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924190/cc65826f-03ce-d4b3-f604-6167af0801aa.png)


### キューに溜まっているメッセージが送られているか確認
全てのメッセージが処理されていることが確認出来たら、サブスクライバー側のログを確認してメッセージのロストが発生していないか確認します。


## まとめ
Pub/Sub サブスクリプションの配信を一時的に pull 型にしてサブスクライバー側のメンテナンスを行う方法について解説しました。

pull 型にすることでメッセージが一時的にキューに溜まるため、メッセージを保持しながら安全にサブスクライバーのメンテナンスを行うことが可能なのでぜひ参考にしてみてください。

最後まで読んでくださってありがとうございました。

## appendix
https://cloud.google.com/pubsub/docs/subscription-overview?hl=ja#push_pull
初めてアジャイルをやってみた

# はじめに
本記事は[NSSOL Advent Calendar 2024](https://qiita.com/advent-calendar/2024/nssol)の6日目の記事です。
私は5年目のSEです。最近アジャイル案件に初めて入ったのでこの記事に所感を記します。
# 前置き。やりたいことがあることが積極性なのか？
新入社員時代、配属面談で答えたことがやけに記憶に残っている。人事の方から入りたい事業部や、やりたい分野について聞かれた。私は、「配属にあたって私の興味関心のようなものが考慮されるべきではないと思うし、事業部に優劣がないのであれば、どこでもいいです」みたいなことを答えた。

正直、当時はこう答えたことについて少し不本意だった。明確にやりたいことや担当したい業界のある人がかっこよく見えたし、それが積極性だと思っていた。「どこでもいいです」が消極的な態度に思え、そう評価されていたら嫌だなとも思っていた。

配属されて数年後にアジャイルをやってみたいと思えたときは、自分にもやりたいことができたと嬉しく感じた。その時から仕事の進め方やユーザーとの接し方に興味を持ち、今も継続している。今でもどういう分野や業界の仕事をしたいかはどうでもいいけれど。積極的な人事へのアピールが功を奏し、アジャイル案件の実行やアジャイル人材の育成をしている部署に異動することができた。そのころは資格を取ってみたり本を読んでみたり、研修に参加したり、社内のコミュニティでドキドキの中初めて発信してみたりと、ある種、衝動だった。

ところが最近、できること（CAN）、しなければならないこと（MUST）を無視して自分のやりたいこと（WILL）を押し通すような人に対して警鐘を鳴らすような議論を見かけた。
過去の、会社から期待されたMUSTを重視した自分が報われた気持ちになったと同時に、ようやっと手にした積極性は誤っていたのかとも考えるようになった。そこら辺は、まぁアジャイルをやっていくことは会社としても求めていることでしょ、と私のWILLとMUSTはニアリーイコールだろうと思い込みむことで片づけた。この考えで合っているといいなと思いながらここに残している。

（余談）また、最近は仕事なんて楽しくも、やりたくもある必要ないなと思い始めている。楽しかったりやりたいことを仕事にしても、どうしても絶対楽しくなく、やりたくない仕事は発生する。それでもやらなければならない。お金を貰ってやっている仕事だから。楽しくなくてやりたくない仕事をやらないようになってしまうくらいなら、最初から楽しくなくていいなと思えてきた。もちろん、今の仕事は楽しくてずっとやりたいくらいだけど、それらを優先することの危険性も見えてきた。楽しくはないし、積極的にやりたいとは思えないけど、決してつまらなくはないし、やりたくないわけでもない仕事をあえてしてみるのもありだな。

# アジャイル初めてみた
## きっかけ
入社から3年半はWFの案件に参画していた。大きい声では言えないが、正解のWFをやっているとは思えなかった。下流工程に入っても度々発生する仕様変更に、これはWFを正しくできていないのか、WFという手法の限界なのか、と頭を巡らせていた。仮に限界的なことであれば、他の手法ならどうなるのだろうと、選択肢を増やす意味で別の手法に興味を持った。実態として製作中も頻繁にユーザーと会話をして仕様を決めて（変更して）いたのだが、これはWFとして正しくないだろう、それであれば正しく柔軟に変更を受け入れる手法を取りたい、といった次第だ。
## やってみてどうだったか
一口にアジャイルと言っても様々な手法がある。そもそもアジャイルはマインドであって具体的な開発手法ではないのだが。私は今スクラムを適用（適用という言葉がふさわしいかは疑問。使用？）した案件に開発者として参画している。
使用する技術要素から担当するシステムの内容から、進め方から何もかもが今までと異なるため、1年目に戻った気持ちで仕事をしている。今までと異なることはたくさんあるが、いくつか絞って紹介する。割と月並みな内容になってしまった気がする。
### 振り返りがとても重要である
やはりアジャイルの醍醐味というか特徴の一つはフィードバックループにより改善をし続けることだろう。今まではめったに振り返りなんてしていなかった。個人単位の振り返りは半年に一度上司とだけだし、チーム単位の振り返りはやった覚えがない。
スクラムでは毎スプリント末にスプリントレトロスペクティブで今回のスプリントがどのように進んだかを検査し、⾃分たちの効果を改善するために最も役⽴つ変更を特定する。
要は振り返りによる改善なわけだが、定期的な振り返りをやる効果は絶大だと感じている。振り返りをしなければ問題の把握ができないため、改善に至ることができない。また、問題を何かしらのタイミングで認識できたとしても、チームとしての問題と受け止められない可能性が高い。以前の案件でもチーム開発はしていたが、フェーズによる分業が前提の開発だと個人の問題として捉えられていた気がする。
### ユーザーからのフィードバックを受け柔軟に変更ができる
スクラムでは毎スプリント末にスプリントレビューを実施する。ここではスプリントでの作業の結果をユーザーに提示する。ユーザーからのフィードバックをもとに、バックログを調整することも多々ある。
前述のとおり、以前のアジャイルではない開発でも実態としてユーザーと頻繁に会話をしてある意味"柔軟な変更"はしていたが、正しい姿ではなかったし、そのほとんどができたプロダクトを介したものではなかったので空中戦だった。改めて記憶を呼び起こすとこれは単純に要件定義が遅れただけで、プロトタイプを見せることでイメージアップができたという利点すらなかった。（完全に余談。私は解像度が上がる、イメージしやすくなるの意でも「イメージアップ」を使うのですが、これは正しい日本語なのでしょうか）
### 求められるスキルはとても高い
スクラムの開発者に求められるスキルとして、機能横断と自己管理がある。
どちらも文字通りだが、機能横断は特定スキルに偏らず必要なスキルなら何でも身に着けること。自己管理はプロジェクトマネージャーや上位者に管理されるのではなく、自分自身で管理をすることである。
機能横断の観点でいうと、今の私は全く機能横断的であるとは言えない。インフラ周りの知識は全くなく、分かる人がやれば30分で終わる作業に1日費やしていた。以前はアプリとインフラで分業がなされていたため、あまり意識していなかったためでもある。従来のアプリの範囲でも、今ままで私が使用してきた技術とは一部異なるのでキャッチアップはかなり大変だった。ここはあまりアジャイル関係ないところではある。
自己管理については以前も誰かに管理されていた気がしないので問題はないと思っている。いや、今までに入った案件のほとんどが納期に遅れてごにょごにょしていたので管理が機能していなかったという話かもしれない。そうであるならば、いまも自己管理は効いてないかも。

# おわりに
もっと書けることはありそうだけど、時間的にここまでにする。思いついたら追記します。
来年はアドベントカレンダーに書くネタを探しながら生きる一年にしたい。
ファイル拡張子の世界：ファイルを深く理解するための拡張子と多彩な「Hello, World!」

## はじめに
普段、さまざまなファイルを作成する際に、多種多様な拡張子を使っています。

フロントエンド開発では、HTMLファイルやCSS、JavaScriptなどが一般的であり、バックエンドではPythonやJavaなどの形式がよく使われます。

また、インフラ系の設定ではYAMLやJSON形式も頻繁に登場します。

:::note
**今回は、そんな「拡張子」について簡単にまとめ、それぞれの拡張子でハローワールドを実行してみました。**
:::

## そもそも拡張子とは？
拡張子とは、ファイル名の末尾に付けられた「.html」や「.css」などの文字列のことです。

これにより、そのファイルの種類が示され、コンピュータやアプリケーションがそのファイルをどのように扱うべきかを判断する手がかりとなります。

![スクリーンショット 2024-12-05 20.06.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/29a43d22-f9d7-bc40-a149-1ce1dc13ec18.png)
引用画像：https://www.pckids.info/lectureship/lectureship_detail3.html

***例えば、拡張子が「.txt」であればテキストファイル、「.py」であればPythonスクリプト、「.json」であればJSON形式のデータファイルを示します。***

それでは、実際にいくつかの拡張子を使ってハローワールドを出力してみる簡単な検証を行ってみます！

## 各拡張子でハローワールドしてみた

### 1. HTML（.html）
HTMLは、Webページを構成する基本的なマークアップ言語です。

```test.html
<!DOCTYPE html>
<html>
<head>
    <title>Hello World</title>
</head>
<body>
    <h1>Hello, World!</h1>
</body>
</html>
```

### 2. JavaScript（.js）
JavaScriptは、Webページに動的な機能を追加するためのスクリプト言語です。

```test.js
console.log('Hello, World!');
```

### 3. Python（.py）
Pythonは、汎用性が高く学びやすいプログラミング言語です。

```test.py
print("Hello, World!")
```

### 4. YAML（.yaml）
YAMLは、設定ファイルやデータ定義によく使われる、人間が読みやすいフォーマットです。

```test.yaml
greeting: "Hello, World!"
```

YAMLについては、過去の記事で詳しくまとめていますので、興味のある方は参考にしてみてください。

https://qiita.com/free-honda/items/4d9c66ebbc12dbfe1d4e

### 5. JSON（.json）
JSONは、データ交換フォーマットとして広く利用されています。

```test.json
{
    "greeting": "Hello, World!"
}
```

JSONについても過去の記事で詳しく紹介しているので、興味のある方はぜひ参考にしてみてください。

https://qiita.com/free-honda/items/fd0bc9fa7ed840ac812e

### 6. Bashスクリプト（.sh）
Bashスクリプトは、LinuxやMacOSでシェル操作を自動化するためのスクリプトです。

```test.sh
echo "Hello, World!"
```
過去にもシェルスクリプトを使ったログ管理とメール通知機能付きの簡単なおみくじアプリを作成したので、興味がある方はぜひ読んでみてください！

https://qiita.com/free-honda/items/b40f98bd14d15c59eac1

## まとめ
今回、さまざまな拡張子を使ってハローワールドを試してみました。改めて拡張子について整理することで、それぞれの特徴や用途を理解する良い機会となりました。

:::note
***普段あまり使わない拡張子についても触れることができ、とても有意義でした！！***
:::

このブログ記事が、誰かの技術的な参考や助けになれば幸いです！

## おまけ：実務でハマった `.pac` と `.dat` について

ここでは、実務で悩まされたことのある拡張子についてご紹介します。

プロキシ設定を制御する `.pac` ファイルや、データ格納に使用される `.dat` ファイルに関する技術検証を行っていた際、この2つのファイル形式の違いに混乱した経験があります。

![拡張子の違い](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/86cd3a92-322c-6ca9-6722-a4bc2d274485.png)

***ここで少しだけ、これらの違いについて簡単に整理してみます。***

### `.pac` ファイル

:::note
- **役割**: プロキシ自動設定 (Proxy Auto-Configuration) に使用されるスクリプトファイル。
- **主な用途**: ネットワーク環境に応じて動的にプロキシを設定する。
- **内容**: JavaScriptで記述され、URLやIPアドレスに応じたプロキシ設定を指定可能。
- **実務例**: 複数のネットワークを利用する際、プロキシ設定を自動化するために使用。
:::

`.pac` ファイルについては、自宅で技術検証を行ったことがあるので、興味のある方はぜひ読んでみてください！

https://qiita.com/free-honda/items/abaf49ad8ce065dc59f1

### `.dat` ファイル

:::note
- **役割**: 汎用的なデータ格納形式。
- **主な用途**: 様々なアプリケーションで使用され、特定のプログラムがデータを読み込むためのフォーマット。
- **内容**: テキストまたはバイナリデータとして保存される。
- **実務例**: アプリケーションの設定やログの保存、データベースの一時ファイルなど。
:::

これらの拡張子をきちんと理解することで、トラブルを未然に防ぐことができるかもしれません。今回の整理が、どなたかの参考になれば幸いです！

## 関連記事

https://www.mouse-jp.co.jp/mouselabo/entry/2024/04/17/100064

https://allabout.co.jp/gm/gc/471588/
blooplinter開発よもやま話

LIGHTzに入社して早や4年。
始めてアドベントカレンダーに参加してみたり。

で、何書こうかなーと思ったんですが、やってることが小難しくてなかなか言語化が難しい・・・

ということで、今LIGHTzの推しである[blooplinter](https://pr.blooplinter.com/)の開発初期の頃の話を思い出して、昔語りなんてしてみようかなと思います。

## プロトタイプ編
遡ること2年前・・・
当時の上司（今も上司ですが）から「来年度新しいプロダクト作るんで、今から年度末に向けてMさんとNさんと一緒に3人でプロトタイプ作って♪」というお達しがありました。

”このメンツ、フロントエンドいないんですが、、、”なんて思っていたら、デザインは別の人がやってくれるってんで事なきを得たんですが、別の問題が・・・

### Pythonなにそれ？おいしいの？？

MさんはPythonはできるんだけど、Nさんと私はPython初級者なんですw
もちろん、私もNさんも他の言語でコードは書いていたので大丈夫ではあるんですが、、、
もうね、Mさんには手とり足取り教えていただきました、ハイ。

今の私は「テストコードは先に書くんだぜ」なんて偉そうに言ってますが、それは偏にMさんにちゃんと教えてもらったからなんです、ハイ。

だからね、”自分には今スキルがないなー”なんてもし悩んでいる人がいたら、安心してください。
2年前はテストコードすら書いていなかった四十路のエンジニアもいるんです！
大丈夫、みんな若いから伸びしろしかないよ！

おっと、脱線してスミマセン。

なお、何を隠そうワタクシ、このblooplinterプロト開発で人生初のフロントエンド-APIの開発体験でした。（というか、まともに開発でコードを書いたのも6-7年ぶりw）

### 気付いた！時間ない！！
で、「3ヶ月しかないねー」「やること洗い出さなきゃねー」なんて会話して実際にやることを洗い出したら、「あれ？これ3人であーだこーだやってたら時間足りなくない？」ということに気づき、Mさん＋Nさんでバックエンド、私は3Dモデルビューアーの調査と手分けをして進めていくことになります。

この3Dモデルビューアーがまたクセモノでして・・・
いや、私のスキルが足りないだけなんですが（w
過去のLIGHTzの開発でも使っていたので実績はあるのですが、いかんせんノウハウを尋ねる人がいない（実際はいるけどPJで多忙）ので過去の成果物をハックしてアレコレ調べるわけです。

Javascriptなんて10年ぶりだよって感じでブツブツ言いながら・・・

そんなこんなでblooplinterプロトタイプは年度末に向けて少しずつ形になっていきました。

当時はまだ解析機能がついてなくて、ビューアーのモデルははめ込みのモックだったなぁ（遠い目

・・・

・・・・・・

・・・・・・・・・

・・・・・・・・・・・・

今日だけで全部書こうと思ったけど長くなりそうので今日はここまで！

次回はまた金曜日かな？

バイバイッ
RSpec Coreの基本

```rb
RSpec.describe Account do
  it "has a balance of zero when first opened" do
    # example code goes here - for more on the
    # code inside the examples, see rspec-expectations
    # and rspec-mocks
  end
end
```
>example code goes here - for more on the code inside the examples, see rspec-expectations and rspec-mocks

https://rspec.info/features/3-13/rspec-core/

#### for more on someone's story
>（人）の話をもっと［より詳しく］知りたければ［知るためには］

https://eow.alc.co.jp/search?q=for+more+on+someone%27s+story#:~:text=%E6%84%8F%E5%91%B3%E3%83%BB%E4%BD%BF%E3%81%84%E6%96%B9%E3%83%BB%E8%AA%AD%E3%81%BF%E6%96%B9-,for%20more%20on%20someone%27s%20story,%E8%A9%B3%E3%81%97%E3%81%8F%EF%BC%BD%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%91%E3%82%8C%E3%81%B0%EF%BC%BB%E7%9F%A5%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%81%AF%EF%BC%BD,-ADVERTISEMENT

####  goes here
>アプリケーション固有の情報をここに記述する
Specific info. about applications goes here

https://context.reverso.net/%E7%BF%BB%E8%A8%B3/%E8%8B%B1%E8%AA%9E-%E6%97%A5%E6%9C%AC%E8%AA%9E/goes+here#:~:text=%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%9B%BA%E6%9C%89%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E3%81%93%E3%81%93%E3%81%AB%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B

# 会話のような表現ができる
>RSpec is a DSL for creating executable examples of how code is expected to behave, organized in groups. It uses the words “describe” and “it” so we can express concepts like a conversation:
```
"Describe an account when it is first opened."
  "It has a balance of zero."
```
# `describe`,`context`,`it`メソッド,特定のメソッドなどを使って記述する
>The describe method creates an example group. Within the block passed to describe you can declare nested groups using the describe or context methods, or you can declare examples using the it or specify methods.

# ブロックの中のものが評価される
>Under the hood,an example group is a class in which the block passed to `describe` or `context` is evaluated. The blocks passed to it are evaluated in the `context` of an instance of that class.

# describeに渡されたブロックが評価される
```rb
RSpec.describe "something" do
  context "in one context" do
    it "does one thing" do
    end
  end

  context "in another context" do
    it "does another thing" do
    end
  end
end
```

### 会話のような表現
```
something
  in one context
    does one thing
  in another context
    does another thing
```

https://rspec.info/features/3-13/rspec-core/example-groups/basic-structure/

### 感想
会話のようにかける。
まだDLSに対する理解もないようだ。