OmniAICreator/Qiita-1.07M huggingface dataset:
GEAR.indigo βを使ってみた感想

## はじめに

GEAR.indigo β（[https://gearindigo.app](https://gearindigo.app)）を利用して感じたことをまとめました。
このツールはAIを活用してウォーターフォール開発やリバースエンジニアリングをサポートするサービスです。
利用してみて感じたことをつらつらと書き綴りました。

---

## GEAR.indigo βの特徴

GEAR.indigo βは以下のような特徴を持つツールです：

- **ウォーターフォール開発を重視した構成**
  - 要件定義や基本設計、詳細設計など、ウォーターフォール型の開発プロセスを支援。
- **リバースエンジニアリング機能**
  - 既存のコードベースから設計資料やドキュメントを自動生成。
- **AIを活用した効率化**
  - 資料作成のベースを数分で生成。
- **柔軟な生成機能**
  - リバースエンジニアリングにおいて、One ShotやFew Shotモードで用途に応じた資料生成が可能。

これにより、特にウォーターフォール型の開発プロセスを採用しているチームや、アジャイル開発で不足しがちなドキュメント生成の効率化を目指す開発者にとって有用なツールです。

---

## 使用感

### プロダクト作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944848/6a6c7abd-344c-0557-b06d-1fd064754698.png)

- ウォーターフォール開発に寄り添った機能構成。
- ソースコード生成よりも資料作成に注力している印象。
- 簡単な要件を入力するだけでウォーターフォール開発に必要な資料のたたき台が作成される。
  - 既存のウォーターフォール開発の資料作成に役立てそう。
- アジャイル開発ではプロジェクトを作り直す必要があるため、運用に工夫が必要。
- 1プロジェクトの自動生成（ソースコード除く）に20クレジット前後を消費。
- 機能に対する説明不足を感じる。
  - 全体の自動生成がどこまで行われるのか不明瞭。
  - 詳細画面でしか生成されない機能がある。
- ダッシュボード画面から全て自動生成されると思ったが、一部詳細画面まで移動する必要あり。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944848/ec3cb9cd-4d52-35f6-a7ad-774abdc79351.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944848/249ffc8a-c9c5-87d8-aa4d-bd74a4f2305e.png)
  - 画面UIの部分は詳細画面の「ReGenerate」を押さないといけませんでした。
- 右上の「Save」ボタンに気づきにくい。
- ソースコード生成が失敗しやすく、原因が分かりにくい。
  - 「基本設計」と「詳細設計」を再構築することで成功する場合がある。
  - 自分の場合は「ソースコード生成が成功するように再構築して」と打ちました。
- ソースコードはひな形作成が主で、Supabase設定などは手動対応が必要。
- UIデモ用のキャンバスの使い方が不明瞭。
  - 作成したUIから資料作成ができるみたい。結構便利かも
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944848/77a1eb91-2bea-ec20-f97a-887f4267206f.png)

### リバースエンジニアリング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944848/dad4523a-b150-35b1-e369-0413e8e2b433.png)

#### 共通

- GitHub連携済みの場合、名前やリポジトリ名を選択形式にしてほしい。
  - 現状は入力形式で手間がかかる。
- ブランチ指定の可否が不明。

#### One Shot Generation

- ファイルごとの説明が自動生成される点が高評価。
- システム情報をほぼ一括で作成できるため、資料作りに有用。
- AI駆動ではドキュメントが軽視されがちな課題に対して、
  - システム作成 → ドキュメント生成 → 清書 という流れで活用可能。
- Supabase連携では、ER図やテーブル定義がきれいに表示される。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944848/c60f29f4-01c6-10c1-0228-65c1317dc1f9.png)

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944848/8de5bced-edf5-845c-755e-8571fada882e.png)

- アジャイル開発で不足しがちなドキュメント作成を補える。

#### Few Shot Generation

- One Shot の機能を「ファイル説明」「基本設計」「詳細設計」に分けて生成可能。
  - 「ファイル説明」だけ生成したいときなどに便利。
- 基本設計生成時に「システム概要」が生成されないケースあり。

---

## まとめ

- **ウォーターフォール開発の資料作成に特化したAI生成ツール。**
- 要件定義などの資料作成を数分で完了できるため、ドキュメント作成の工数を大幅に削減可能。
- デザイン作成画面を商談のUI構想に利用し、そのまま資料作成まで行える。
  - これにより要件や仕様のずれが軽減される。
- **リバースエンジニアリング機能が特に好印象。**
  - エンジニアが疎かにしがちなドキュメント作成を補える。
  - ファイル単位の詳細説明からシステム概要～詳細設計まで生成可能。
  - アジャイルアプリのドキュメント作成に有用。

### 利用コスト

- 月額約15ドルで100クレジット。
- 要件定義～ソースコード作成の途中で何度か中間を作り直して約50クレジット消費。
- リバースエンジニアリング2回で約20クレジット消費。
- クレジット消費が手軽に行えるため、実行時には注意が必要。

### 改善点

- **再生成時に差分の要約が表示されると便利だなと思う**
- **ユーザーガイドやヘルプが不足。**
  - 動作が分かりづらい部分がある。

---

gear.indigo の活用で、ドキュメント作成の効率を大幅に向上させることが期待できます。ウォーターフォール開発に重きを置いたプロジェクトや、アジャイル開発で不足しがちなドキュメントを補完する用途で特に有用な印象でした。
インターネットについてざっくり

https://qiita.com/pikapi/items/0ef7a47ef414ebff2e1e

↑の記事ではインターネットに接続されるまでの流れと、要素を説明しました。
今回は、インターネットはどうやって成り立っているのかについてアウトプットします。

## インターネットとは
インターネットとはズバリ、

**世界規模で相互に接続されているLANの集合体**です！！
下記のイラストでは、世界中に存在するLANとそれが接続されている様子が描かれています。

![スクリーンショット 2025-01-22 1.05.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736733/3ab9830e-17d6-124f-473e-9b1521582f91.png)

## 言い切りすぎでは?
その通りです。かなり抽象度の高い説明をしている自覚はあります。
この仕組みを維持するために、世界の人々が様々な角度のアプローチを行っています。
このセクションでは、アプローチ方法の一部を粒度大きめのキーワードで列挙しておきます。

1. インフラストラクチャ
    - 物理的回線
    - ネットワーク機器
    - データセンター
2. 通信プロトコル
    - TCP/IP
1. プロバイダー(ISP)
    - インターネットバックボーン
    - 一次ISP
    - N次ISP

ここからの内容は知見が深まったら随時追記していきます
関連付けたファクトリはエラーが起きる可能性がある

# 関連付けされたファクトリーでエラーが起きる可能性がある
`spring`または`zeus`のようなrailsプレリーダーでrspecを実行している時、以下のような関連付けされたファクトリーを作成する場合は、`ActiveRecord::AssociationTypeMismatch`エラーが発生する可能性がある。
>When running RSpec with a Rails preloader such as spring or zeus, it's possible to encounter an ActiveRecord::AssociationTypeMismatch error when creating a factory with associations, as below:
```rb
FactoryBot.define do
  factory :united_states, class: "Location" do
    name { 'United States' }
    association :location_group, factory: :north_america # associationで関連付けする、関連付けされたファクトリーも指定する
  end

  factory :north_america, class: "LocationGroup" do
    name { 'North America' }
  end
end
```
# 上のエラーの解決法
二つの可能な解決策はプレローダーなしのスイートのどちらか一方を実行させることまたは次のようにrspec.cofugurationに`FactoryBot.reload`を追加することです。
>The two possible solutions are to either run the suite without the preloader, or to add FactoryBot.reload to the RSpec configuration, like so:
```rb
RSpec.configure do |config|
  config.before(:suite) { FactoryBot.reload }
end
```

https://thoughtbot.github.io/factory_bot/rails-preloaders-and-rspec/summary.html
'factory_bot'をrequireする

# gemでインストールしたらrequreする
`Bundler`を使わなかった場合、必ずインストールされたgem持ち、呼び出して下さい：
>If you're not using Bundler, be sure to have the gem installed and call:
```rb
require 'factory_bot'
```
# 自動で読み込まれるパスを変更する
必要に応じて、`spec/factories`または`test/factories`のディレクトリ構成を持っていることを仮定している。あとは実行するだけだ。
>Once required, assuming you have a directory structure of spec/factories or test/factories, all you'll need to do is run:
```rb
FactoryBot.find_definitions
```
ファトリーに対して別のディレクトリ構造を使うならば、定義を見るようとする前に定義ファイルのパスを変更できます。
>If you're using a separate directory structure for your factories, you can change the definition file paths before trying to find definitions:
```rb
FactoryBot.definition_file_paths = %w(custom_factories_directory)
FactoryBot.find_definitions
```
### 前にも書いていた
https://qiita.com/masatom86650860/items/55c08aa896e7f4ac9abf#:~:text=config/application.rb,%E3%82%82%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99

別のファイル構成を持っていなくて、インラインで定義したい場合、それも可能です
>If you don't have a separate directory of factories and would like to define them inline, that's possible as well:

```rb
require 'factory_bot'

FactoryBot.define do
  factory :user do
    name { 'John Doe' }
    date_of_birth { 21.years.ago }
  end
end
```
よく使うLinuxコマンド・viエディタの使い方まとめ

## 基本コマンド
### ディレクトリ・ファイル操作
| コマンド名 | 動作 |
| --- | --- |
| `pwd` | カレントディレクトリの表示 |
| `cd` | ディレクトリの移動 |
| `ls` | カレントディレクトリのファイル一覧の出力 |
| `mkdir` | 新しいディレクトリの作成 |
| `touch` | ファイルの新規作成 |
| `cp` | ファイルのコピー |
| `file` | ファイルの種別を表示 |
| `mv` | ファイルの移動 |
| `rm` | ファイルの消去 |
| `cat` | テキストファイルの中身を表示 |
| `cp` | ファイルのコピー |
| `wc` | ファイルの行数・単語数・文字数を出力 |
| `head` | ファイルの先頭数行の出力、5行だけ見る場合は`-n5`オプションをつける |
| `tail` | ファイルの後ろから数行の出力、5行だけ見る場合は`-n5`オプションをつける |
| `find ./ -name file_name` | カレントディレクトリ以下(`./`)でファイルを検索 |


### その他よく使うコマンド
| コマンド名 | 動作 |
| --- | --- |
| `chmod` | ファイルの権限の変更、WSLやDockerを使う際などに使用 |
| `history` | これまでに実行したコマンドの表示 |
| `echo "hello" \| tee file1.txt` | 標準出力を`file1.txt`に保存 |
| `tar` | 複数ファイルを一つにまとめる |
| `scp` | サーバ間でのファイルの送受信を行う |
| `cat file1 file2 > new_file` | ファイルの連結 |


## viエディタ
### カーソル移動
| コマンド名 | 動作 |
| --- | --- |
| `h` | 左に移動 |
| `j` | 下に移動 |
| `k` | 上に移動 |
| `l` | 右に移動 |
| `k` | 上に移動 |
| `W` | スペース単位で右に移動 |
| `B` | スペース単位で左に移動 |
| `H` | 画面の先頭行に移動 |
| `M` | 画面の中央行に移動 |
| `L` | 画面の最後の行に移動 |
| Ctrl-`F` | 1画面先のページを表示 |
| Ctrl-`B` | 1画面前のページを表示 |


### 文字と行の挿入
| コマンド名 | 動作 |
| --- | --- |
| `A` | 行の末尾にテキストを追加 |
| `i` | カーソルの左にテキストを追加 |
| `I` | 行の先頭にテキストを追加 |


### テキストの削除
| コマンド名 | 動作 |
| --- | --- |
| `x` | カーソルの文字を削除 |
| `dd` | 行を削除 |
| :2,10 d | 2行目から10行目までを削除 |


### 行番号の表示
| コマンド名 | 動作 |
| --- | --- |
| `:set nu` + Return | 行番号の表示 |


### カーソルのジャンプ
| コマンド名 | 動作 |
| --- | --- |
| `G` | ファイルの最終行にジャンプ |
| 1G | ファイルの先頭行(1行目)にジャンプ |
| 10G | 10行目にジャンプ |


### 検索と置換
| コマンド名 | 動作 |
| --- | --- |
| /xx | xxを検索 |
| /^xx | xxで始まる行を検索 |
| `n` | 検索方向の前方にある文字列を検索 |
| `N` | 検索方向の後方にある文字列を検索 |
| `:%s/text1/text2/g` | `text1`を`text2`に置換 |

`^ $ . * [ ] / ~ \`を含む文字列の検索・置換を行う場合は`\`をつけて`\$`のようにエスケープしなければならないことに注意が必要です。


### 保存と終了
| コマンド名 | 動作 |
| --- | --- |
| `:wq` + Return | 変更を保存して終了 |
| `ZZ` | 変更を保存して終了 |
| `:q!` + Return | 変更を保存しないで終了 |
支払明細書での「品番」は仕入先の品目コード

支払明細書上の品番は購買情報（一般データ）の仕入先品目コードから取得(EINA-IDNLF)

なぜ？？？请求供应商付款，为了让对方更容易看懂支付明细所以用供应商的品目号。
表名：EINA
字段：IDNLF
此字段表示供应商的物料编号（仕入先品目コード）。
EINA 表是用于存储采购信息记录的通用数据（Purchasing Info Record - General Data）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/16df50c8-f7ba-9e08-56c2-e08cd468f7c0.png)
EKPO里的两个品目的区别



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/2ad8cad1-e4f0-92dd-4384-9bf5c65653c1.png)

1.MATNR
名称： 物料编号（Material Number）
含义： 企业内部使用的物料编号，用于标识物料主数据。
用途：
SAP 系统内部的标准物料编号。
用于库存管理、采购等模块。

2. EMATN
名称： 客户物料编号（Customer Material Number）
含义： 客户提供的物料编号，与企业内部的物料编号对应。
用途：
当客户在采购订单或沟通中使用自己的物料编号时，这个字段用来存储客户物料编号，便于对应和识别。
主要用于销售订单、发货单等与客户相关的场景。
Databricksノートブックのコメントでメンションできるようになりました！

地味かもしれませんが、こういう痒い所に手が届くエンハンス大好きです。これは間違いなくコメントの地位向上につながります。

![Screenshot 2025-01-22 at 16.44.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5d668f42-b9b6-1633-d969-ebebd4d424ec.png)

**コメントで@によるメンションとメール通知がサポートされました**

> "@"のあとにユーザー名をタイピングすることで、コメントで直接ユーザーにメンションできるようになりました。メールを通じて適切なコメントのアクティビティがユーザーに通知されます。

これまでは別の手段でコメントをしたことを連絡する必要がありましたが、コメントだけでコミュニケーションを完結できるようになります。すごい。

試してみます。適当なノートブックを作成して、コードを記述します。コードの任意の箇所を選択すると、アシスタントとコメントのショートカットが表示されます。コメントをクリックします。

![Screenshot 2025-01-22 at 16.45.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a309dcda-e2eb-9831-8a06-f72378b9295d.png)

説明文もあります。

![Screenshot 2025-01-22 at 16.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/447324ec-24b7-7000-a76f-580969f63f54.png)

`@`をタイプするとユーザー名一覧が表示されるので、対象のユーザーを選択します。今回はデモなので自分を選びます。

![Screenshot 2025-01-22 at 16.45.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9fabb104-d7af-e106-ccb5-2be566588c77.png)

するとメールが届きます。おおー。**View in Databricks**をクリックすると直接コメントされた場所にアクセスできます

![Screenshot 2025-01-22 at 16.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ad5d6e48-720c-4c27-0a0f-1ef8cafdf79c.png)

オンラインでのコラボレーションがますます捗ります。ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
SECCON Beginners 2024 を紹介されたのでやってみた Wooorker

# これはなに？

https://www.seccon.jp/13/seccon_beginners/content.html

会社の方に教えていただいて、面白そうだったのでイベントは終わってますが、挑戦してみようと思います。

# ローカル環境で実行

コードをDockerで実行します。

http://localhost:34466/ にアクセスして以下のような画面が表示されました

![cap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/9942fbca-cbac-6175-0fa0-e46ad736060b.png)

## コードを読んでみる

`process.env.FLAG`が参照されている箇所は１箇所

```javascript
const FLAG = process.env.FLAG;
```

使われているのは app/server.js:39 あたり

```javascript
app.get('/flag', (req, res) => {
  const token = req.headers.authorization?.split(' ')[1];
  if (!token) {
    return res.status(401).json({ error: 'No token provided' });
  }
  
  try {
    const decoded = jwt.verify(token, jwtSecret);
    if (decoded.isAdmin) {
      const flag = FLAG;
      res.status(200).json({ flag });
    } else {
      res.status(403).json({ error: 'Access denied' });
    }
  } catch (error) {
    res.status(401).json({ error: 'Invalid token' });
  }
});
```
オープン・クローズドの原則（Clean Architecture 達人に学ぶソフトウェアの構造と設計）

こんにちは。粘着系エンジニアのbamboo-houseです。
今回は、読書中の技術書「Clean Architecture 達人に学ぶソフトウェアの構造と設計」の中でオープン・クローズドの原則が出てきたので、この法則についてまとめてみました！
クラス、アーキテクチャの設計をしている人はぜひご参考ください！


# オープン・クローズドの原則
### *ソフトウェアの構成要素は拡張に対しては開いていて、修正に対して閉じていなければならない*
### 
この原則の目的
- ソフトウェアの振る舞いを、既存の成果物を変更せず拡張できるようにする


## 例
![XOz12i9034NtFKLFq1E852m5TqL1r-du5mFJfAGfRZoyK2dKqD7jl3T9NZqPgSr3Ae8Cep3OoZOoSOYKBXX5xIHiAYb1DyurAC2TOWBR5-aqiks1E_fRn7EhDgrxSQlFR50A9hhdD6JKquIYo5vS7bvLvO_ze_i2z_lZh36BwzYQbLzJLiSVgLcoZD_fhy6FUKXl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345535/094c08c0-7cba-6ecf-0d99-74506ded906b.png)



最も重要なこととして押さえるべきは「あるコンポーネントは他のコンポーネントに依存すればするほど、変更しにくくなる」ということだ。
つまり、コンポーネントAがコンポーネントBの変更から保護されるべきならば、コンポーネントBからコンポーネントAに依存すべきである。


ここでは、**Presenter**を変更した時に、**Controller**を変更する必要をなくしている。**Views**を変更した時に、**Presente**rを変更する必要をなくしている。**他のすべて**を変更した時に、**Intferactor**を変更する必要をなくしている。（矢印が依存の方向を示している）

オープン・クローズドの原則（OCP）に最も適しているのは、**Interactor**である。**Database**、**Controller**、**Presenter**、**View**を変更しても、**Interactor**には何の影響も及ぼさない。

なぜ**Interactor**がそんなにも特権的な位置付けになるのだろう？それは、ビジネスルールを含んでいるからだ。**Interactor**は、アプリケーションの最上位レベルの方針を含んでいる。その他のコンポーネントは、周辺にある関心ごとを処理している。**Interactor**は、その中心となる関心ごとを処理している。

これにより、**Interactor**の振る舞いを、既存の成果物を変更せずに拡張できる。
つまり、**Interactor**の変更容易性の向上につながる。


コードでは下のように実現する。DI（依存性注入）を行うことで依存の方向を作っている。

```ts
  const interactor = new Interactor()
  const controller = new Controller(interactor)
  const presenter = new Presenter(controller)
  const view = new View(presenter)
```




## この章を読んでの感想
私自身、SOLID原則は今まで何回も学習を繰り返してきた。今回の章を読んでSOLID原則の解像度がさらに上がった。今まではコードレベル、クラスレベル観点のSOLID原則の学習が多かった。しかし、本書ではコンポーネントレベル、アーキテクチャレベルの説明が中心なので、より抽象的に理解できた。また、具体的な事例を想像しながら読めたことで、抽象的なことを容易に理解できた。抽象的に理解できたことで、今後はアーキテクチャレベルにおいてSOLID原則を意識した設計をしていきたい。
CMLでCat9kvのSystem Serial Numberを変更してみる

# はじめに
今回はCMLでCat9kvのSerial変更みました。CMLでCat9kvを起動すると同じSerialで起動してしまいます。そのため、Catalyst Center に登録すると同じSerialになってしまい登録ができないのです。
思ったよりも簡単にできます！
CML2の構築方法についてはいくつか記載しておりますのでそちらを参照くださいませ。

# 環境
 ・CML2.7、CML2.8
 ・Cat 9000v UADP 17.15.01
 ・Cat 9000v Q200 17.15.01
 ・Cat 9000v UADP 17.12.01
 ・Cat 9000v Q200 17.12.01
注：CML2.6については本機能が提供されておりませんので、本方法でSerialの変更はできません。
また以下のVersionでは設定をしても反映されませんのでご注意ください。
 ・Cat 9000v UADP 17.10.01
 ・Cat 9000v Q200 17.10.01

# 設定方法
LabにCat9kvを配置します。
起動させる前に設定を行います。

* Image Definition
SETTING　->　Image Definitionより起動させるVersionを選択します。 　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629197/94fcf527-e813-c1b8-e5b2-11816b04cbc8.png)

* Config
CONFIG　->　Configuration file　->　config/vswitch.txt
変更するファイルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629197/d392f8df-5415-afbb-36f2-b6e7f5df2226.png)

*config/vswitch.txt*内の次の項目を変更、保存することでSerialの変更ができます。
ただ、12桁以上は反映されませんので、デフォルトで記載されている文字の後ろに追加してもダメなようです。
```conf/vswitch.xml
<prod_serial_number>CML12345Q200</prod_serial_number>
```
* 起動
設定変更後は通常通り起動させます。
Serialの変更後の結果は以下のようになりました。抜粋してUADPだけ並べてみました。
冒頭で記載しましたように17.10.01ではSerialの変更されませんでしたが、他の２つについては指定した通りの結果となりました。

![スクリーンショット 2025-01-22 155110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629197/195b9569-d4ba-8a55-9bf9-bd1207a4cf72.png)


なんととても簡単！！

# おわりに
今回はCat9kvのSerialを変更する方法を記載しました。
この後はCatalyst Center に登録してみようかなと考えてますのでそのあたりも投稿できたらいいです。

# 関連ページ
[CML2で外部ネットワークに接続したい！(External Connector)](https://qiita.com/kannishi/items/92ebce89dffc7eeeea05)
[ProxmoxにCML2.7を構築してみる](https://qiita.com/kannishi/items/080c85e22ebecb43e9a4)
[ProxmoxでOVAファイルから構築してみる](https://qiita.com/kannishi/items/3027198d63320745ce8e)
[CML2.8 FreeをWindowsPCへ構築してみた](https://qiita.com/kannishi/items/825a48fd6fe00331bbcb)
話題のDeepseek R1をローカルで構築してOpen WebUIでチャットしてみよう

# 概要

注目のDeepSeek R1がリリースされました。
o1と同等の能力を持つと噂ですが、ローカルでも実用的な軽さで動かせるとのことで試してみます。


## 前提条件

- Dockerがインストールされていること
- Docker Composeがインストールされていること


## 1. Ollamaのダウンロード・インストールと実行

https://ollama.com/download/mac

からollamaをダウンロードしインストールをしてください。

- macOS
- Linux
- Windows

OSに合わせて選んでください

![スクリーンショット 2025-01-22 15.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/33e52fff-c721-f299-e6d6-1355a93c5024.png)


インストール完了後、以下のコマンドを実行してください
```console
ollama run deepseek-r1:8b
```

実行後以下のようなログが出るのでしばらく待ちましょう

![スクリーンショット 2025-01-22 15.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/6301c2cf-3ba9-0a20-8f01-26d4e438cfa0.png)


実行エラーが発生する場合は
```console
ollama serve
```
を実行して、ollamaを起動してから、`ollama run deepseek-r1:8b`を実行しましょう。

だいぶ待たされると思いますが、
実行ができる状態になりましたら、
`>>> Send a message`と表示されるので、会話してみましょう。

ちっす
とメッセージを送ってみました。

![スクリーンショット 2025-01-22 15.51.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/2b565c0d-78f3-becc-03ba-a060a3f41a75.png)

回答が来ましたね。
ちょっと日本語が怪しいですが、そのまま進めてください。

## 2. Docker Composeファイルの作成

Open WebUIを立ち上げるための設定ファイルを作成します。
`docker-compose.yml`ファイルを作成し、以下の内容を記述します。

```docker-compose.yml
version: '3.8'

services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    ports:
      - "127.0.0.1:3000:8080"
    volumes:
      - open-webui:/app/backend/data
    extra_hosts:
      - "host.docker.internal:host-gateway"

volumes:
  open-webui:
```

## 3. Docker Composeでコンテナを起動

つづいて先ほど`docker-compose.yml`ファイルを作成した場所で以下のコマンドを実行し、Open WebUIのコンテナを起動します。

```
docker compose up
```
起動したら下記のログが出ます。

![スクリーンショット 2025-01-22 15.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/b511a913-61c3-be8b-91dd-a717755600d6.png)


## 4. Open WebUIを開く

`docker compose up`コマンドを実行してコンテナが正常に起動したら、ブラウザで以下のURLにアクセスしてOpen WebUIを開いてください。

http://localhost:3000/

初回アクセス時にはAdminの

- ユーザー名
- メールアドレス
- パスワード

の入力が求められますが、任意の文字を入力して問題ありません。ローカル環境ですので。

- ユーザー名
- メールアドレス
- パスワード

の入力が完了したら、すぐにDeepseek R1とのチャットが開始できます。

![スクリーンショット 2025-01-22 16.00.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/3cc31542-d7e7-5bf5-b971-36df6c978096.png)


もっさり感が気になりますが、あとはローカル環境ですので好き放題できます。

![スクリーンショット 2025-01-22 16.06.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/af57e3c3-033d-99f2-4ed9-251a48a8c7ba.png)


### 参考

- https://github.com/open-webui/open-webui
- https://github.com/ollama/ollama
プロンプトをGitコミットメッセージにして、AI生成コードの経緯を見やすくする

近ごろ、生成AIにコードを書いてもらう機会が増えてきました。私自身も「○○したい」「△△を実装してほしい」といった要望をAIに投げかけるだけで、お任せでコーディングできるようになり、作業効率が格段に向上しています。

しかし、AIを活用すればするほど問題になるのが「どのプロンプトでどんなコードが生成されたのか？」という記録の管理です。修正を積み重ねるうちに、どの変更がどのプロンプトによるものだったかを忘れてしまういわゆる“デジタル健忘症”に陥りがちです。

そこで一案として、**生成AIに投げたプロンプトをそのままGitのコミットメッセージにしてしまおう**というアイデアを考えました。ちょっとした工夫ですが、得られるメリットが多いので、この記事で紹介します。



## 生成AIのプロンプトをコミットメッセージにするメリット

### 1. 「○○したければ、この部分をこう変えればいい」がわかりやすい

コミットメッセージにプロンプトを残しておくと、過去の履歴を振り返ったときに  
「**ここは ‘コンポーネントをリファクタしたい’ というプロンプトで変更が入ったんだ**」  
と即座に把握できます。  
修正の目的や理由（＝プロンプト）がコミットに紐づけられているため、後からコードを見返す際に「なんでこうなったんだっけ…？」と頭を抱える手間が大幅に減ります。

### 2. 「このプロンプトで課題が解決できた」事実を記録できる

AIから得た解決策が、どのようなプロンプトによって導き出されたのかがコミットメッセージで明白になります。  
「どうやってこの問題を解決したのか」をチーム全体で共有しやすくなるだけでなく、今後類似の課題に直面したときにも、適切なキーワードで検索すれば再利用が簡単です。

### 3. 生成AIのチャット履歴を検索しやすくなる

コミットメッセージにプロンプトをそのまま書いておけば、リポジトリ上の検索だけで過去のAIやり取りを思い出せます。  
「この関数は ‘バッチ処理を高速化したい’ というプロンプトで生成されたな」とわかれば、生成AIとのチャット履歴を探すキーワードも明確になり、必要な会話をすぐに見つけられます。


## 運用例

1. **AIにお願い**: 「Reactコンポーネントの複雑な状態をリファクタしたい」と投げかける  
2. **生成されたコードをテスト**: 「うまく動いた！ でも少し修正が必要だ」  
3. **コードを手動で微調整**し、コミットするときに、**コミットメッセージをプロンプトそのまま**にする  
   ```
   git commit -m "Reactコンポーネントの複雑な状態をリファクタしたい"
   ```
4. 後日リポジトリを振り返った際、コミットログに「…リファクタしたい」という文字列が残っているため、パッと見てどんな変更だったかを把握できる


## デジタル健忘症を防ぐために

「生成AIに任せているから、自分で覚えなくてもいいや…」と油断していると、**どのようにコードが書かれているのか**、**なぜその書き方になったのか** がまったくわからなくなってしまう危険性があります。いわゆる“デジタル健忘症”に陥りがちです。

しかし、AIとコミュニケーションした履歴をコミットメッセージとして残しておけば、  
- プロンプト（=問題設定や開発者の狙い）  
- 実際のコード変更内容  
- 結果として起きた挙動・バグ修正  
などが全てリポジトリに集約され、**自分やチームが「忘れない」ためのドキュメント**として機能します。

Qiita記事の形にまとめるのも同様で、**過去のやり取りを記事化しておけば、いつでも検索・参照が可能**です。こうした仕組みを整えておくことで、デジタル健忘症を防ぎ、スムーズな開発を続けることができます。



## まとめ

- **生成AIに書かせたコードがどのプロンプト由来なのか**を明確にするために、プロンプトをそのままコミットメッセージにしてみる  
- コミットを見返すだけで「なぜ・どうやって」コードが変更されたのかを把握しやすい  
- AIチャット履歴を検索しやすくなり、同様の課題に直面した際にも再利用がスムーズ  
- デジタル健忘症を防ぐ意味でも、コミットメッセージやQiita記事として知識を形にしておくと効果的

生成AIを使うほど、私たち開発者は「どうやって解決したんだっけ？」の記憶が曖昧になりやすいもの。細かい工夫で、コード変更の記録をわかりやすく残しておきましょう。
簡単AWS S3を活用した静的ウェブサイトのホスティングとHTTPS対応の完全ガイド

## 概要
AWS S3を使った静的ウェブサイトホスティングは、簡単かつ低コストで実現可能なウェブサイト構築手法です。本記事では、CloudFrontやRoute 53を組み合わせてHTTPS化および独自ドメイン設定を行う具体的な手順を徹底解説します。また、運用上の注意点やトラブルシューティング方法も網羅しています。

### 1.AWS S3静的ウェブサイトホスティングとは
AWS S3の静的ウェブサイトホスティング機能は、HTML、CSS、JavaScriptなどの静的ファイルを配信するためのコスト効率に優れたソリューションです。

利用する理由：
* 簡単な設定でグローバル配信が可能
* サーバーレスで運用：サーバー管理不要
* 自動スケーリングに対応し、アクセス量に応じて適切なパフォーマンスを提供

### 2. 手順詳細
#### Step 1: S3バケットの作成
1. AWSコンソールでS3サービスにアクセス
2. 「バケットの作成」をクリック
名前：example-website（一意の名前）
地域：任意
3. 「パブリックアクセスをすべてブロック」のチェックを外す

バケットポリシー設定例：
```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::example-website/*"
    }
  ]
}
```
4.「静的ウェブサイトホスティング」を有効にし、以下を入力：
インデックス文書：index.html
エラードキュメント：error.html

#### Step 2: CloudFrontの設定（HTTPS対応）
1. CloudFrontディストリビューションの作成
1.1 オリジン：
1.1.1 オリジンタイプ：S3バケット
1.1.2 「オリジンパス」：空白のまま
1.2 キャッシュ動作：
1.2.1 GET と HEAD メソッドを有効にする。
1.2.2 キャッシュポリシー：「CachingOptimized」を選択。
2. SSL/TLS設定
デフォルト証明書を使用する場合：「CloudFrontが提供する証明書」を選択。
独自ドメインを使う場合：「ACMで証明書を発行」を選択。
3. ディストリビューションの作成


#### Step 3: Route 53で独自ドメインを設定
1. ドメインを購入するか、既存のドメインを使用
2. ホストゾーンでAレコードを追加
レコード名：wwwまたは@
タイプ：A - IPv4アドレス
エイリアスターゲット：CloudFrontディストリビューションを指定

#### Step 4: HTMLファイルのアップロード
S3 CLIを使用してHTMLファイルをアップロード：
```bash
aws s3 cp ./index.html s3://example-website --acl public-read
```

静的サイトのアクセス確認：
```bash
http://example-website.s3-website-<リージョン>.amazonaws.com
```

CloudFrontのURLをHTTPSで確認：
```bash
https://<CloudFrontのドメイン名>
```

### 3. 注意点
1. パブリック設定
S3バケットはプライバシーやセキュリティリスクを考慮し、意図的に公開しない限り安全なままにしておく。
デフォルトのパブリックブロックは慎重に外す。

2. CloudFrontキャッシュの削除 ファイルを更新後、以下のコマンドでキャッシュをクリア：
```bash
aws cloudfront create-invalidation --distribution-id <ディストリビューションID> --paths "/*"
```
3. HTTPS対応 SSL証明書をACMで発行し、CloudFrontに適用

### 4. トラブルシューティング
1. 403 Forbidden
原因：S3バケットポリシーが適切でない。
解決：s3:GetObjectの権限を確認。
2. ドメインが解決しない
原因：Route 53の設定が未完了、またはDNS伝播が遅延。
解決：設定を再確認し、最大72時間待機。

### 最後
AWS S3の静的ホスティングは、設定が簡単で非常に実用的です。特にCloudFrontやRoute 53と連携することで、セキュアでスケーラブルなWebサイトを構築可能です。本記事を参考にして、ぜひAWSの力を活用してください！

初心者ですので、誤りがございましたら、ご指摘をお願いいたします。
pyinstallerで画像フォルダを含める

Pythonで画像フォルダなどが存在する場合Pyinstallerでexe化するのに少し手こずったので備忘録として残します。

Pyinstaller時は以下コマンドを使用してimgフォルダ内のすべてを含める
```
pyinstaller --onefile --add-data "img/*;img" main.py
```

Pyinstallerでexe化するときに画像ファイルなどを呼びだすときに一時ファイルとして書き出されるのでその場所を特定するためのpythonコードを追加する
```python
def resourcePath(filename):
  if hasattr(sys, "_MEIPASS"):
      return os.path.join(sys._MEIPASS, filename)
  return os.path.join(filename)
```

使用する際は以下の様な感じで書く
```python
resourcePath("img/test.png")
```
Linuxで利用しているDNSサーバのIPアドレスの確認方法

Linux環境でDNSサーバのIPアドレスを確認したいときがあります。

今回は一発でDNSサーバを確認する方法をご紹介します。

:::note
この記事は[こちら](https://manacra.com/dns-ip-address/)でもご紹介しています。
:::

## DNSサーバのIPアドレスを確認する方法

`systemd-resolved`を利用してDNSサーバのIPアドレスを調べます。

```
$ resolvectl status
```

結果は次のように表示されます。

```
Global
         Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
  resolv.conf mode: stub

Link 2 (ens3)
    Current Scopes: DNS
         Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 172.25.252.8
       DNS Servers: 172.25.252.9 172.25.252.8
        DNS Domain: openstacklocal
```

`DNS Servers` にあるのが、設定されているDNSサーバのIPアドレスです。

次のようにGlobalで設定されている場合もあります。

```
Global
           Protocols: -LLMNR -mDNS +DNSOverTLS DNSSEC=yes/supported
    resolv.conf mode: stub
  Current DNS Server: 1.1.1.1
         DNS Servers: 1.1.1.1 1.0.0.1
Fallback DNS Servers: 8.8.8.8 8.8.4.4

Link 2 (ens3)
    Current Scopes: DNS
         Protocols: +DefaultRoute -LLMNR -mDNS +DNSOverTLS DNSSEC=yes/supported
Current DNS Server: 172.25.252.9
       DNS Servers: 172.25.252.9 172.25.252.8
        DNS Domain: openstacklocal
```

DNS関係は設定ファイルが複数あって複雑です。

Ubuntuだと確認した限りでも

- `resolvconf`: `/etc/resolve.conf`
- `netplan`: `/etc/netplan/50-cloud-init.yaml`（同ディレクトリのYamlファイル全て）
- `systemd-resolved`: `/etc/systemd/resolved.conf`

でDNSを設定可能です。

今回の`resolvectl`コマンドを使えば全ての設定を参照してくれるので、一発でわかります。
OutlookやChromeで快適に作業するためのおすすめ設定

新人向けです。
プロジェクト参画前にこれだけ設定しておけば、凡ミスはなくなると思います。

## 1. Outlook メールの自動フォルダ振り分け

大切なメールを見逃さないために、差出人やキーワードに応じて自動的にフォルダに振り分ける設定を行いましょう。

### 例: Aプロジェクト用のフォルダ振り分け
- **振り分け条件**  
  - PM「骨川さん」やお客さん「剛田さん」、協力会社「源さん」からのメール  
  - 件名や本文に「ノビ」というキーワードを含むメール
- **フォルダ名**  
  - 「Aプロジェクト」などでわかりやすい名前を付ける

これにより、Aプロジェクト関連のメールが一箇所にまとまり、重要メールを見逃すリスクが減ります。



## 2. Outlook カレンダーでタグのカテゴリ分け

カレンダー上の予定を色分けする「カテゴリ分け」を活用すると、スケジュールを一目で把握できます。

- **メリット**  
  - 「チーム会議」や「個人作業」など、内容に応じて色分けすることで、時間の使い方がひと目でわかる  
  - 予定が重複しやすい場合でも、色を変えると視覚的に区別しやすくなる



## 3. Outlook お気に入りの登録

フォルダが多いと探すのに手間がかかります。よく使うフォルダだけ「お気に入り」に登録しましょう。

- **対策**  
  - 「迷惑メールフォルダ」や「再通知設定」など不要なフォルダは表示させない  
  - 本当に必要なフォルダだけをお気に入りに追加することで、見逃しや誤クリックを減らす



## 4. 【Chromeブラウザ】動作が遅くなる場合の改善

Chrome のタブを大量に開いていると動作が重くなることがあります。Google 公式のメモリセーバー機能でメモリを解放できます。

- **参考:**  

https://support.google.com/chrome/answer/12929150?visit_id=638560799123413365-620958060&p=chrome_memory_saver&rd=1#memory_saver&zippy=%2C%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%BB%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E3%82%AA%E3%83%B3%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%AA%E3%83%95%E3%81%AB%E3%81%99%E3%82%8B

この機能をオンにすると、あまり使用していないタブのメモリ消費が抑えられ、動作が軽くなることがあります。


## 5. OneNote のスペルチェック（赤波線）を消す

英単語や専門用語が多いメモだと、赤波線が煩わしい場合があります。チェックをオフにする設定方法があります。

- **参考:**  

https://support.microsoft.com/ja-jp/topic/onenote-for-mac%E3%81%A7%E3%81%AE%E3%82%B9%E3%83%9A%E3%83%AB-%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF-891f71d2-89ec-4023-8735-4a357206723c

必要に応じてオン・オフを切り替え、記述に集中できる環境を作りましょう。



## 6. シェアポで「昨日」「１日前」などの表記を年月日表記に変更

SharePoint（シェアポ）での変更例。「昨日」「1日前」などの相対的な日付表記を、年月日形式に変更すると、一目で正確な日時がわかりやすくなります。

- **参考:**  

https://jp.linkedin.com/learning/microsoft-teams-tips-and-tricks-2023/4403115



## 7. ターミナルの色を変える

macOS のターミナルで配色を変更すると、コマンドやディレクトリが視覚的に区別しやすくなります。

- **参考:**  

https://original-game.com/how-to-customize-terminal-on-mac/

色やフォントを自分好みに調整して作業効率をアップしましょう。



## 8. スタックを使用する

デスクトップを整頓する macOS の「スタック」機能。ファイルを種類ごとにグループ化し、見やすくまとめられます。

- **参考:**  

https://www.pc-koubou.jp/magazine/78050

## 9. Boxの並び順
>Boxは、デフォルトではなぜか、必ず「更新日」の新しい順にソート (並び替え) されてしまいます。私は「名前」でソートすることが多いので、いったん「名前」でソートし直しても、次のフォルダに移動すると、ご丁寧に「更新日」の新しい順に強制的に戻されてしまう…。いやぁ、使いにくい。

と思ったあなたへ


- **参考:**  

https://note.com/hidekazu0329/n/n28925900eeba

### まとめ

- **Outlook**: メールの振り分けやカレンダーのタグ分けで見落としを防ぎ、生産性を向上。  
- **Chrome**: メモリセーバーでブラウザを軽くする。  
- **OneNote**: スペルチェックをオフにしてノートに集中。  
- **シェアポ**: 日付表示を調整して日時を正確に把握。  
- **ターミナル**: カスタマイズで快適さアップ。  
- **スタック機能**: デスクトップをすっきり整理。

どの設定もすぐに取り入れられるものばかりです。日々の作業効率を少しでも高めるために、ぜひ試してみてください。他にこれはやっておけってのがあればコメントください！
UE5 TileVIew,Inventoryの作成メモ その②

# TIleViewの準備はこちらから
https://qiita.com/mintiatian/items/3e241fc8d15e26ce0e1d

↑から
Inventoryについて記載する予定

# WBP_DragSlotを作成
これはDragされたときに表示させるUIです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/c2830ec1-3888-97e5-098f-ed6a20d47c4b.png)

UIの中身はWBP_Slotと同じでOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/92e7fb9a-f8c9-5168-196f-0517838766b2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/b9006495-4f70-0c12-43f1-752f610f22f9.png)

Graphの方もInventoryStructを所持しImageをBindさせておきます。

# WBP_SlotにDragとDropの処理を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/83ff68b1-0421-5d34-bac0-990f987be4af.png)

OverrideからOn Mouse Button Down、On Drag Detected、On Dropを追加します。

## On Mouse Button Down

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/6b8f6111-0c39-ef4c-c9bf-b33c9e291887.png)

Detect Drag if Pressed を追加します。

## On Drag Detected

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/2f02c561-2a52-43e9-d9f9-0b1668ee9c00.png)

↑で作成したWBP_DragSlotをCreateしDataをセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/dfa622fd-1b63-5eda-b693-bee45bbf5245.png)

Create Drag Drop Operationを追加します。

PeyloadにSelfでWBP_Slotをセット
Default Drag Visualに作成したWBP_DragSlotをセットします。

注意
ここでSelfでWBP_SlotセットしてもDragはきちんと動作します。
ですが、DragするときにバグがありドロップできるSlotと
ドロップができないスロットができてしまうので注意です。

## On Drop

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/b0cd55c7-83ff-d343-2583-56787a6392f3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/5decca5e-0a4d-75ce-9404-188de8bec1e2.png)

SwapでDataの中身を入れ替えてください。

結果はこちらです
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/521ff557-2a24-9b4d-18bb-a5f3b9ebc586.gif)
VirtualBox の共有フォルダで発生した Python の os.mkfifo エラー「PermissionError: [Errno 1] Operation not permitted」の解決

# 発生状況
VirtualBox 上で Python を使ってパイプ通信を試みた際、エラーが発生しました。

# 解決方法
あまりにも単純なことだったため、結論を先に書きます。
**os.mkfifo() に渡す第一引数** をホスト環境の Vagrantfile に設定していた **ゲスト環境との共有フォルダ以外の場所** に変更することでエラーが解決しました。

以下は、補足情報になります。

## 実行環境
- **ホスト環境**

  - Let's note CF-SZ6
  - OS: Windows 11 Pro 22H2
  - CPU: Core i5-7300U
  - GPU: Intel HD Graphics 620
  - RAM: 8GB

- **ゲスト環境**

  - VirtualBox 6.1
  - Ubuntu 20.04.6 LTS
  - Python 3.8.10


## 発生したエラー


```python:fifotest.py

import os
os.mkfifo("pipe", 0o600)

```

```terminal:ターミナル

vagrant@ubuntu-focal:~/workspace/$ python3 fifotest.py
Traceback (most recent call last):
  File "fifotest.py", line 2, in <module>
    os.mkfifo("pipe", 0o600)
PermissionError: [Errno 1] Operation not permitted

```

## 試したこと

ファイルやディレクトリの権限を確認しましたが、特に問題は見つかりませんでした。エラーの原因として気になったのは、コードを実行していたディレクトリが Windows との共有フォルダ (~/workspace/) であったことです。


## 参考にした情報
- [Operation not permitted in VirtualBox shared folder (Stack Overflow)](https://stackoverflow.com/questions/64140409/operation-not-permitted-virtualenv)
- [Python Permission Error に関する解説 (af-e.net)](https://af-e.net/python-permission-error/)
【備忘録】WPFにおけるRelativeSourceについて


## はじめに
こんにちは、入社1年目の吉原です。最近久々に本格的にバスケットボールを再開し、先日公式戦にも出場し、充実した毎日を過ごしています。  
一方業務でもWPFのスキルレベル向上のために日々励んでおります。そこで今回はWPFを学習していてここは記事にして理解を促進した方が良いと思ったRelativeSourceについてまとめました。
## RelativeSourceとは
データバインディングにおいてバインディングソースを相対的な位置で指定するために使用されるクラスです。簡単にいうと、バインディングソースを自分自身や近くにモノから探して適用するものです。コントロールがどこに配置されても、相対的な関係を使えば特定の親や自分自身をデータソースに指定できるため、柔軟で一貫性を持ったコードを作成できます。 

以下にRelativeSourceで用意されている使い方を示します。
### RelativeSourceのモード

- Self：バインディング対象の要素自身をソースに指定
- TemplateParent：テンプレートの親コントロールをソースに指定
- FindAncestor：指定した型またはレベルの親要素をソースに指定
  - AncestorType：特定の型の親要素を指定するためのプロパティ
  - AncestorLevel：指定した型の親要素の階層レベルを指定するためのプロパティ 

今回は、この中で、私が理解に苦戦したTemplateParentについてさらに詳しく説明します。

## TemplateParentの実装例
```
　　<Window.Resources>
        <!--ボタンのテンプレート-->
        <ControlTemplate x:Key="CustomButtonTemplate" TargetType="Button">
            <Grid>
                <Rectangle Fill="{TemplateBinding Background}" RadiusX="5" RadiusY="5" />
                <!--ボタンに表示するTextをTemplateParentを用いて定義-->
                <TextBlock Text="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" 
                           HorizontalAlignment="Center" VerticalAlignment="Center" 
                           Foreground="White" />
            </Grid>
        </ControlTemplate>
    </Window.Resources>
    
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button Content="Click Me!" Width="100" Height="50" 
                Background="Blue" Template="{StaticResource CustomButtonTemplate}" />
    </StackPanel>
```
上記コードのようにボタンのControlTemplate内で  
`Text="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}`  
のように書くことでTextBlockのTextプロパティがテンプレートの親（Buttonコントロール）のContentプロパティにバインドされます。ButtonのContentプロパティには"Click Me!"が設定されているため、これがTextBlockに表示されます。  
このように仕組み自体は簡単です。しかしここでふと私が思ったのは、ほぼ同じことがTemplateBindingでもできるではないかと思い、混乱しました。  
そのため、次はTemplateBindingとの違いを見てみます。

### TemplateBindingとの比較
まず、TemplateBindingとは、テンプレート内のコントロールに関連するプロパティを参照するための簡単な方法です。「テンプレート内の要素から親コントロール（テンプレートを適用したコントロール）のプロパティを参照する」という点ではRelativeSourceのTemplateParentに似ています。  
結論から言うと、TemplateBindingは、依存関係プロパティに特化しているのに対してTemplateParentは、依存関係プロパティに限定することなく、より複雑なプロパティにも適用出来ます。  
具体的に複雑なプロパティとは、プロパティがUIによって動的に変化する場合やコンバーターを使って計算した結果を反映させたプロパティ等です。それらを、ControlTemplateによって定義したい場合は、TemplateParentを使うことになります。  
ただし、なんでもTemplateParentを使えば良いわけではなく、TemplateBindingで事足りる場合はTemplate Bindingを使用した方が内部的な効率的に実装することができパフォーマンスの向上につながります。  


## 終わりに
今回はRelativeSourceの理解から、その中のモードであるTemplateParentに着目し、それに似たTemplateBindingとの違いを比較しました。  
今回の記事作成を通してRelativeSourceの理解がより一層深まりました。今後も学んだことをどんどんアウトプットしていき理解をより確かなものにしていけるように励んでいきたいと思います。
Parallels Desktop を使うなら押さえておきたい設定

# Parallels Desktop を使うならやっておきたい設定

Mac 上で Windows を動かす仮想化ソフト「Parallels Desktop」を利用する際に、ぜひ行っておきたい設定やトラブルシューティング方法をまとめました。今後も Parallels を使う機会があれば追記していく予定です。  
（※ 本記事の内容は、使用している PC や Parallels のバージョンによって手順が異なる場合があります。）

## 1. マウスポインタを大きくする

Windows 側でマウスポインタが小さく見にくい場合は、以下の手順でカーソルサイズを変更できます。私の環境では、初期状態が非常に小さく見づらかったため、この設定を行いました。

- **参考:** [富士通 Q&A](https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=3511-3297)

### 主な手順例（Windows 10 / 11）

1. 「スタート」→「設定」→「デバイス」を開く。  
2. 「マウス」または「マウスカーソルのサイズを変更する」などの項目を選択。  
3. カーソルの大きさや色を好みに合わせて変更。

## 2. Mac と同じように「かな ⇄ 英」を切り替える

Windows 側でも、Mac と同様に「かな ⇄ 英」への切り替えをスムーズに行いたい場合は、キーボードのカスタマイズがおすすめです。

- **参考:** [Parallels + Mac キーボード設定](https://apple-teach.com/parallels16_keyboard_win_mac/)

### 主な設定ポイント

1. Parallels Desktop の仮想マシン設定から「ハードウェア」→「キーボードとマウス」を選択。  
2. キーマッピングを編集して、Mac でおなじみの `⌘ + スペース` などに合った操作を登録。  
3. Windows でも同様のショートカットで日本語・英語入力を切り替えられるようにする。

## 3. 時間のずれによるエラーへの対処法

Windows 上の時刻がずれていると、ブラウザやネットワーク関連でエラーが起きることがあります。私の場合、Azure へのログインや昨日まで動作していたプログラムが突然エラーになるなどの不具合がありました。  
このような場合、Parallels Desktop から OS をリセットして時刻の同期を試すと解決するケースが多いです。

### リセット手順

1. Mac のメニューバーで「Parallels Desktop」を選択。  
2. メニューから「処理」→「リセット」を実行。  
3. Windows が再起動され、Mac の時刻情報が同期される。

## まとめ

- **マウスポインタのサイズ調整** で見やすさアップ  
- **キーボードのカスタマイズ** で「かな ⇄ 英」切り替えを快適に  
- **時間のずれ** は Parallels からリセットして同期  

これらのポイントを押さえるだけでも、Parallels Desktop を利用する上での不便が大幅に減ります。設定を見直す際の参考にしてみてください。


## 現在困っていること

1. **Parallels でコピーしたものを Mac 側にペーストできない**  
   - いくつか対処法を試してみましたが、うまくいきませんでした。解決策をご存じの方がいらっしゃれば教えていただきたいです。

2. **Parallels を他のディスプレイに移して 2 画面で作業したい**  
   - こちらもいくつかの方法を試しましたが、うまくいかずほぼ諦めています。もし何らかの解決策をご存じの方がいれば、ぜひアドバイスをお願いいたします。

以上、Parallels Desktop を使う上で個人的に役立ったポイントと、現在の悩みごとでした。もし他にも便利な設定やトラブルシューティング方法がありましたら、コメントなどで共有いただけると幸いです。
map, each, inject, each_with_objectの使い分け

### 1. map - 配列の変換に特化
mapメソッドは、配列の各要素を新しい値に変換して、新しい配列を生成。元の配列は変更されず、変換後の新しい配列が返される。

```ruby
numbers = [1, 2, 3]
doubled = numbers.map { |n| n * 2 }
# => [2, 4, 6]

names = ['john', 'jane', 'bob']
uppercased = names.map(&:upcase)
# => ['JOHN', 'JANE', 'BOB']
```
#### 使用すべき場面：

・配列の各要素に同じ処理を適用して変換したい
・元の配列と同じ長さの新しい配列が必要

### 2.each - シンプルな繰り返し処理
eachは最もシンプルな繰り返し処理を行うメソッド。各要素に対して処理を実行、戻り値は元の配列。


```ruby
numbers = [1, 2, 3]
numbers.each { |n| puts n }
# 出力:
# 1
# 2
# 3
# => [1, 2, 3]  # 戻り値は元の配列

users = ['John', 'Jane']
users.each do |user|
  puts "Hello, #{user}!"
end
```

#### 使用すべき場面：
・各要素に対して単純な処理を行いたい
・表示やログ出力など、副作用のある処理を実行したい
・戻り値が不要な処理を行う


### 3. inject - 値の集約
injectは、要素を順番に処理して1つの値にまとめる。累積的な計算や要素の集約に適している。

```ruby
# 合計値の計算
numbers = [1, 2, 3, 4]
sum = numbers.inject(0) { |result, n| result + n }
# => 10

# 文字列の連結
words = ['Hello', 'World']
message = words.inject('') { |result, word| result + word + ' ' }
# => "Hello World "

# 最大値の検索
numbers = [3, 7, 2, 9, 4]
max = numbers.inject { |max, n| max > n ? max : n }
# => 9
```

#### 使用すべき場面：

・配列の要素を1つの値に集約したい
・合計、積算、最大値/最小値の計算
・要素を順番に処理して結果を蓄積する



### 4. each_with_object - オブジェクトの構築
each_with_objectは、繰り返し処理をしながら任意のオブジェクトを構築できる。特にハッシュの作成や複雑なデータ構造の構築に便利。

```ruby
numbers = [1, 2, 3]
result = numbers.each_with_object({}) do |num, hash|
  hash[num] = num * 2
end
# => {1=>2, 2=>4, 3=>6}
```

#### 使用すべき場面：
・ハッシュなど、配列以外のオブジェクトを作成したい
・データの集計や分類が必要
・複雑なデータ構造を構築する
クラスインスタンス変数と特異メソッドについて

### 通常のインスタンス変数

```ruby
class Person
  def initialize(name)
    @name = name  # 通常のインスタンス変数
  end
end

person1 = Person.new("Alice")
person2 = Person.new("Bob")
# person1 と person2 は別々の @name を持つ
```
各インスタンスごとに独立した値を持つ
インスタンスメソッド内でアクセスできる

### クラスインスタンス変数

```ruby
class Person
  @count = 0
  
  def self.count
    @count
  end
end

puts Person.count  # => 0
p1 = Person.new    # 新しいインスタンスを作成
puts Person.count  # => 0（変化なし）
```

クラス自体に紐づく変数
クラスメソッド内でのみアクセスできる


### クラス変数との違い

```ruby
class Person
  @@total = 0  # クラス変数
  
  def self.total
    @@total
  end
  
  def initialize
    @@total += 1
  end
end

puts Person.total    # => 0 （初期値）

person1 = Person.new # インスタンス作成
puts Person.total    # => 1 （1つ目のインスタンス作成で +1）
```

クラス変数（@@）は継承されたすべてのクラスで共有
クラスインスタンス変数（@）は該当クラスのみに属す


### 使用例
```ruby
# クラスインスタンス変数
class Parent
  @value = "parent"
  
  def self.value
    @value
  end
end

class Child < Parent
  @value = "child"
  
  def self.value
    @value
  end
end

puts Parent.value  # => "parent"
puts Child.value   # => "child"
# クラスインスタンス変数は継承されず、各クラスで独立

# 対してクラス変数の場合：
class Parent
  @@value = "parent"
  def self.value
    @@value
  end
end

class Child < Parent
  @@value = "child"
end

puts Parent.value  # => "child"
puts Child.value   # => "child"
# クラス変数は継承階層で共有されてしまう
```

### クラスインスタンス変数へのアクセス方法

```ruby
class Person
  def self.count
    @count
  end
  
  def self.count=(value)
    @count = value
  end
end

```
### 特異メソッドで上記を書き換えた場合

```ruby
class Person
  # class << self による特異メソッド定義
  class << self
    def count
      @count
    end
    
    def count=(value)
      @count = value
    end
  end
end
```



また、以下のようにattr_accessorもクラスインスタンス変数に対しても使える
クラス変数に関してはattr_accessorは使用できない
```ruby
class Person
  class << self
    attr_accessor :count  # count と count= の両方を一度に定義
  end
end
```
FreeBSD jail 小ネタ 20250122

# jail の区別がつかないよう！
ansible で FreeBSD-jail を管理しようと悪戦苦闘しています。

# FreeBSD-jailの問題。

発展途上のトコロがあって、厳密にコンテナのIDとかで管理する方法がない感じです。
いま問題になるのは、同名のJAILを別のホストで作って、ホスト間移動させるときですね。

- HOSTA/mail
- HOSTB/mail 

上記を全てHOSTAに持っていくときは、JAILにつけた仮想ホスト名がキーになっていたりするので、HOSTBで一旦JAILの名前を付け替えてやってから export するみたいな手順をふまないと、大抵は弾かれます。

bastilleBSD では、コンテナを一個のファイルに落とせるので、クローン化が簡単なのが利点ですが、肝心のFreeBSD自体には jail そのものを区別しようとする試みがなかった模様です。

## なんで困ってしまうのか。→IDがないから。
docker以来、コンテナを扱う一般世界の常識としての container-ID は必須だと思われます。インスタンスとテンプレート別にIDがあるのは無論ですが、FreeBSD-jailにはどうもその概念が余りはっきりありません。

何を証拠に？　と申しますと、 /etc/hostid や /etc/machine-id は 非jail つまり 物理サーバのFreeBSDには最近普通に存在する(　FreeBSD 13.2RELから）んですが、jail を作るとそれがないんです。なぜでしょう？

## jail で /etc/machine-id を作る。

以下二点で、多分「ユニークなコンテナ」を区別する手がかりができます。

* /etc/rc.d/hostid を使う。　← IDは表示できた。machine-id は保管はされない（なぜ？）
* /etc/rc.d/hostid_save を使う。　←　このコマンドしないと保管されない。

## /etc/amchine-id は どこで使われる？
まず、ansibleで拾える ansible_facts.ansible_machine_id 変数で集めることができます。
稼働しているホスト・JAILを区別なくidで管理しようとしたら、jail だけ得られなくて？？状態でしたが
まあとりあえずこれで一つ進みました。

## ansibleでサーバ情報を集めて一覧したい。
ちょっと企んでいるんでそのうち出来たら〜
Windows カスタムプロトコルの定義

# 定義サンプル

`explorer://`プロトコルを定義してエクスプローラで開く設定を追加する例

```reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\explorer]
@="URL:Custom Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\explorer\shell]

[HKEY_CLASSES_ROOT\explorer\shell\open]

[HKEY_CLASSES_ROOT\explorer\shell\open\command]
@="powershell.exe -Command \"[System.Uri]::UnescapeDataString(\\\"%1\\\") | foreach-object { Start-Process -FilePath C:\\Windows\\explorer.exe -ArgumentList $_.TrimStart(\\\"explorer://\\\").TrimEnd(\\\"/\\\") }\""


```

## メモ

- commandに対するパラメータは`%1`で取得可能
- パラメータにはプロトコル名を含んだ文字列が格納されている
    - cmd.exeを使った文字列置換はややこしかったのでPowerShellを利用してプロトコル名を除去するようにした
Go初心者必見！go list -f '{{.Target}}'でインストール先を簡単確認する方法

## はじめに
Go言語で開発を進めていると、「このプログラムをインストールしたとき、どこに実行ファイルが配置されるの？」と気になることがあります。そんな疑問を解決するのが、`go list -f '{{.Target}}'` コマンドです。本記事では、このコマンドが何をしているのか、どのように役立つのかを詳しく解説します！

## `go list` コマンドとは？

`go list` は、Goモジュール内のパッケージ情報を取得するためのコマンドです。このコマンドを使うことで、以下のような情報を確認できます。

- パッケージ名
- ソースコードの場所
- 依存関係
- ビルドターゲット など

これらの情報をカスタマイズして取得するために、`-f` オプションでテンプレートを指定できます。

## `go list -f '{{.Target}}'` の意味

このコマンドは、以下の動作を行います。

1. **`-f` オプション**  
   出力フォーマットを指定するためのオプションです。
   
2. **`{{.Target}}`**  
   テンプレートの中で、ビルドまたはインストールした場合に生成される実行ファイルの保存先を表します。


## 実行例

例えば、以下のディレクトリ構成のプロジェクトがあるとします。

hello/
- go.mod
- greetings/
  - greetings.go
- main.go

このプロジェクトのルートディレクトリ（`hello/`）で次のコマンドを実行します。
```bash
go list -f '{{.Target}}'
```

すると、以下のような結果が出力されます。
```
/home/user/go/bin/hello
```

## 出力結果の解釈

上記の例では、`/home/user/go/bin/hello` が表示されました。これは、このプロジェクトを `go install` コマンドでインストールした場合に、`hello` 実行ファイルが配置される場所を示しています。

このディレクトリは通常、以下の要素によって決まります：

- Goのデフォルトのインストール先ディレクトリ（`$GOPATH/bin` や `$HOME/go/bin`）
- 環境変数 `GOBIN` で指定したカスタムインストール先

---

## `go list -f '{{.Target}}'` が役立つ場面

1. **インストール先の確認**  
   実行ファイルがどこに配置されるのかを事前に確認できます。

2. **PATH設定のための参考情報**  
   出力結果を使って、システムの環境変数（`PATH`）にインストール先ディレクトリを追加できます。

3. **カスタマイズしたいとき**  
   Goのデフォルト設定ではなく、独自のインストール先を指定したい場合にも役立ちます。

## 他に使えるフィールド例

`go list` では他にも便利なフィールドが利用可能です。以下はその一部です：

- **`.ImportPath`**: パッケージのインポートパス  
- **`.Dir`**: ソースコードのディレクトリパス  
- **`.GoFiles`**: パッケージに含まれるGoソースファイル一覧  
- **`.Deps`**: 依存している他のパッケージ一覧  

詳細は公式ドキュメントで確認できます！

https://pkg.go.dev/cmd/go/internal/list



## まとめ

`go list -f '{{.Target}}'` は、Goプログラムのインストール先ディレクトリを確認できる便利なコマンドです。このコマンドを活用すれば、ビルドやインストールに関する作業がスムーズになり、より効率的に開発を進められるようになります。

Go開発初心者の方も、ぜひ一度試してみてください！
PnP PowerShellでSharePointリストの参照列に値を登録する

# やりたいこと
タイトル通りです。備忘録として記事に残します。

# 事前準備
ClientリストとProductリストを用意しておきます。Productリストの「RefClientName」列を参照列として、Clientリストの「ClientName」列でリレーションシップを設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/afd57a74-2528-bdc7-a6b7-c698a18374bd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/8aa4098a-84a3-7f54-0f10-71f68b487055.png)

# PowerShellの実行コマンド
結論、実行コマンドは以下です。
```powershell
# SharePointサイトに接続
$siteUrl = "https://{tenant_name}.sharepoint.com/sites/{site_name}"
Connect-PnPOnline -Url $siteUrl -UseWebLogin

# Productリストにアイテムを追加
$clientName = "テスト株式会社"
$productName = "テスト製品"
$listName = "Product"
$lookupListItems = Get-PnPListItem -List "Client"
$lookupItem = $lookupListItems | Where-Object { $_["ClientName"] -eq $clientName }
Add-PnPListItem -List $listName -Values @{"ProductName" = $productName; "RefClientName" = $lookupItem["ID"] }
```

注意点としては、参照値ではなく、参照IDを使用して値を登録する必要があります。
```powershell:実行エラー
Add-PnPListItem -List $listName -Values @{"ProductName" = $productName; "RefClientName" = "テスト株式会社"}
```

```powershell:正常実行
Add-PnPListItem -List $listName -Values @{"ProductName" = $productName; "RefClientName" = "1"}
```
IT系に関する最新情報の収集方法

# 概要
IT系の最新情報をキャッチアップできる方法を記載しました。
記載しているもののほかにも色々とサイトや方法はありますが、自分がよく利用している方法やサイト等をまとめました。

# IT系の情報サイトをみる
PCやスマホから隙間時間ですぐに確認できる、IT系の情報を発信しているサイトをまとめました。隙間時間に確認できるので、IT系の情報サイトのチェックは一番よく活用しています。

### [ITmadia](https://www.itmedia.co.jp/)
アイティメディア株式会社が運営しているIT系ニュースサイトです。

### [@IT](https://atmarkit.itmedia.co.jp/) 
ITmadiaと同じく、アイティメディア株式会社が運営しているサイトです。

### [Impress Watch](https://www.watch.impress.co.jp/)
IT系ニュースのほか、それ以外のニュースも発信しているサイトです。

##### IT系カテゴリ
- [テック](https://www.watch.impress.co.jp/category/tech/)

### [GIGAZINE](https://gigazine.net/)
株式会社OSAが運営しているニュースサイトです。
GIGAZINEは「ギガバイト級のオンラインマガジン」という意味から作成した造語です。

##### IT系カテゴリ
- [ウェブアプリ](https://gigazine.net/news/C37/)
- [ネットサービス](https://gigazine.net/news/C5/)
- [ソフトウェア](https://gigazine.net/news/C4/)
- [ハードウェア](https://gigazine.net/news/C6/) 
- [セキュリティ](https://gigazine.net/news/C14/)

### [ASCII.jp](https://ascii.jp/)
アスキー・メディアワークスが運営しているニュースサイトです。
カテゴリのひとつに「アキバ」とあるように、少しマニアックな情報も掲載されています。

##### IT系カテゴリ
- [TECH](https://ascii.jp/tech/)
- [Web Pro](https://ascii.jp/web/)
- [デジタル](https://ascii.jp/digital/)
- [プログラミング+](https://ascii.jp/programming/)

### [ガジェット通信](https://getnews.jp/)
東京産業新聞者が運営しているニュースサイトです。
##### IT系カテゴリ
- [デジタル・IT](https://getnews.jp/cat/digital)

# PodCastを聴く

### ひまじんプログラマーの週末エンジニアリングレッスン
色々な技術情報を発信しているラジオです。
エンジニアのスキルアップのための既存の技術の紹介や、新しい技術の発信等、様々なことを発信されています。外出時の移動中によく聴いています。

- [Apple podcast](https://podcasts.apple.com/jp/podcast/%E3%81%B2%E3%81%BE%E3%81%98%E3%82%93%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E9%80%B1%E6%9C%AB%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%AC%E3%83%83%E3%82%B9%E3%83%B3/id1601084785)
- [spotify](https://open.spotify.com/show/2uv9mONog0nr9q5YJJsvIt)

## その他
### プログラム言語の最新情報について
プログラム言語のバージョンアップに伴う最新情報は、ある程度有名な言語ならまとめられているサイトをみつけやすいので、Web検索で「言語名 新機能」などで調べて確認するとよいと思います。
例えば公式サイトだと、C#は[こちら](https://learn.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-12)、javaだと[こちら](https://blogs.oracle.com/oracle4engineer/post/the-arrival-of-java-23-ja)のような形でまとめられていますし、このほか様々な方がかみ砕いて分かりやすく解説してくれているサイトもあります。
また、バージョンアップ時期がある程度決まっている言語については、バージョンアップされる時期を把握しておいて、その時期がきたら調べるという形も良いと思います。
例えばJavaは、最近は毎年3月と9月ごろにバージョンアップされるので、その時期がきたら調べるもの良さそうです。

# 終わりに
他にもコミュニティに参加する等色々な方法があると思います。また自分が経験していいなと思ったキャッチアップ方法があれば記載していこうと思います。
SadServersで障害復旧を体験してみた #6

# はじめに

シナリオ5は問題ではなく自由にサーバーを使っていいというものだったので飛ばしてます。
アウトプット習慣とlinuxコマンドになれるためシナリオ6に挑戦。

# #6シナリオやってみた

###### 説明
今回の問題はスコアの平均点を求める。
scores.txtの中に二つの数値があり一つ目がカウンターで二つめはテストのスコアだと思ってください。
番目の列の数字の平均 (より正確には、算術平均: 数字の合計を数字の数で割ったもの) を見つけます (平均スコアを見つけます)

小数点の右側には正確に 2 つの数字を使用します。つまり、丸めずに正確に 2 つの「小数点」を使用します。例: 平均 = 21.349 の場合、解は 21.34 です。平均 = 33.1 の場合、解は 33.10 です。　

回答は/home/admin/solutionファイルに書き込む。

回答の仕方に少し条件があることに気を付ける

# 平均値を計算できるLinuxコマンドを調べた。

#2で使用したawkコマンドで合計や平均が出せるみたいなので、使用していく

``` bash
#                   ２行目の合計する書式  最後に合計の平均値を出力する書式
cat scores.txt | awk '{sum+=$2} END {print sum/NR}'
```
これで平均値を出力することができたので回答する

```
echo (平均値) >~/solution
```

![スクリーンショット 2025-01-22 14.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535626/005c7a60-643d-92f0-1f37-3eac28e7d2d8.png)

これで回答を確認するとクリアできた。

# まとめ

`awk`で何ができるのか用途と書き方を知っていたら簡単に解ける問題だなと思った。
awkは結構色々できるのでオプションと書式を覚えて調べずに書けるようになりたいと思った。
Blackmagic Design DeckLink Quad 2のコネクタ

　Blackmagic Design DeckLink Quad 2は、業務用映像信号3G SDIを入出力することができるPCIe x8のPCIカードです。入出力のいずれかに使用できるコネクターが8個あり、設定にクセがあるのでメモを残します。

## コネクター番号
　DIN端子が9ポートあります。PCIeスロット(マザーボード)に一番近いコネクターはリファレンス入力です。
PCIeスロットに近い方から数えて、2つめがコネクター1です。一つ目は入出力できません。

## コネクターの設定

　Blackmagic DesignのDeckLinkドライバー、Desktop VideoをインストールするとコントロールパネルにDesktop Video Setupが現れ、コネクターごとの入出力を設定できます。

 　DeckLink Quad 2は装置としては一つですが、仮想的に8個のDeckLinkデバイスを用意しています。
 仮想DeckLinkデバイスの1番から4番までは、一つの仮想デバイスに二つのコネクターを占有し、SDI入力とSDI出力を持つことができます。一つのコネクターを占有し、入力もしくは出力に使うことができます。5番から8番までは、一つのコネクターを占有するか、まったくコネクターを持たない設定を選択できます。
 
　仮想デバイス1が2つのコネクターを占有する際、コネクター1とコネクター2を使用します。
　仮想デバイス1が1つのコネクターを占有する際、コネクター1のみを使用します。
　仮想デバイス2が2つのコネクターを占有する際、コネクター3とコネクター4を使用します。
　仮想デバイス2が1つのコネクターを占有する際、コネクター3のみを使用します。

　仮想デバイス1から仮想デバイス4まで、すべての仮想デバイスで1つのコネクターを設定すると、デバイスごとのコネクター番号は以下になります。

| デバイス | コネクター |
|----|----|
|仮想デバイス1|コネクター1|
|仮想デバイス2|コネクター3|
|仮想デバイス3|コネクター5|
|仮想デバイス4|コネクター7|

　仮想デバイス1から4が一つのコネクターをもつとき、仮想デバイス5から仮想デバイス8までも、同じように1つのコネクターを持つことができます。この際、仮想デバイス5から仮想デバイス8までのコネクター番号は以下になります。

| デバイス | コネクター |
|----|----|
|仮想デバイス5|コネクター2|
|仮想デバイス6|コネクター4|
|仮想デバイス7|コネクター6|
|仮想デバイス8|コネクター8|

　このようなややこしい番号になるのは、仮想デバイス1から仮想デバイス4までに2つのコネクターを占有させることと、2つのコネクターを占有する仮想デバイスの影響でコネクターが使えなくなるデバイスのつじつまを合わせるためです。例えば仮想デバイス2に2つのコネクターを持たせる設定を行うと、コネクター3と4を占有するため、仮想デバイス6はコネクターを持たなくなり、入出力できなくなります。

　2つのコネクターを占有させることと影響する仮想デバイスを少なくするため、すべての仮想デバイスにコネクターを1つずつ持たせると対応は以下になります。

| デバイス | コネクター |
|----|----|
|仮想デバイス1|コネクター1|
|仮想デバイス2|コネクター3|
|仮想デバイス3|コネクター5|
|仮想デバイス4|コネクター7|
|仮想デバイス5|コネクター2|
|仮想デバイス6|コネクター4|
|仮想デバイス7|コネクター6|
|仮想デバイス8|コネクター8|

　ボードのコネクターの番号の順序も含めて、公式の情報がないため、半日試行錯誤して上記の仕様を把握すことを6年ごとにくりかえしているので記録に残します。

　なお、1つのコネクターは入力にも出力にもなるのに、なぜ仮想デバイスは、2つのコネクターを持つこともできる仕様なのかというと、Blackmagic Designの他の入出力装置で、入力と出力を1つずつもつものがあるため、そのような装置に合わせたアプリケーションをそのまま使えるように設定するためかと推測します。
MS932はShift-JISと同じ？

## 背景
送信先の都合上、システムから出力するファイルを「MS932（Windows-31J）」で出力する必要があった。
ファイルをエンコードするためにEncord.GetEncording()メソッドを利用する。
パラメータに"Shift-JIS"を指定したけど、これってMS932なの？ってなったので備忘録

## 結論
::: note info
Microsoftにおいては一緒。
**Shift-JIS = MS932 = Windows-31J = CP932(※)**
:::


ちなみに、こういう経緯らしい
|年|事象|
|-|-|
|1982年|Microsoftが旧Shift-JISであるCP932を開発|
|1983年|IBMがCP932に独自の拡張を加えたものを開発|
|〃|NECもCP932に独自の拡張を加えたものを開発|
|1993年|MicrosoftがIBM/NECの拡張分を含めた新Shift-JISであるCP932を開発|

じゃあCP932とMS932は何が違うんだ、という話だがこれは同じものを指す。
1982年版のCP932と区別した呼称としてMS932が使われているそう。

## ※補足
コメントにてご指摘いただきましたので追記します。

Microsoftのライブラリを使用した開発においてShift-JISはMS932（IANAに”Windows-31J”として登録された文字集合）として扱われますが、一般的にShift-JISとされている文字コードは前述の旧Shift-JIS（IANAに”Shift-JIS”として登録された文字集合）を指します。これはHTTPヘッダのContent-Typeなどで文字エンコーディングとして使用されているものです。
**同じShift-JISでもMS932とは別の文字集合として扱う場合もあることに留意してください。**

## 参考
https://learn.microsoft.com/ja-jp/dotnet/api/system.text.encoding.getencoding?view=net-8.0

https://learn.microsoft.com/ja-jp/dotnet/fundamentals/runtime-libraries/system-text-encoding

https://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932