OmniAICreator/Qiita-1.07M huggingface dataset:
CUDOS構築記 番外編②: CUDOSの運用費用


これまでCUDOSについての記事を書いてきましたが、今回は番外編としてCUDOSの運用費用について説明します。

過去の記事はこちらをご覧ください。

- [CUDOS構築記 Vol.1: CUDOSの概要と構築方法の検討](https://qiita.com/masatomasato1224/items/311e890ade9b48700cbe)
- [CUDOS構築記 Vol.2: CURの集約先を作成する](https://qiita.com/masatomasato1224/items/015b4c9f5bdeaeeb5cf2)
- [CUDOS構築記 Vol.3: CURの出力と集約先へのレプリケーション設定をする](https://qiita.com/masatomasato1224/items/998e89859aeed4db8c66)
- [CUDOS構築記 Vol.4: データソース、およびダッシュボードを作成する](https://qiita.com/masatomasato1224/items/cce0ec2a3e8aa039981d)
- [CUDOS構築記 番外編: アカウント名を表示する](https://qiita.com/masatomasato1224/items/40a16048d1c35eeede04)

## 大体いくらかかるのか

ざっくりとした金額ですが、CUDOSの運用費用は1ヶ月あたり100-200ドル程度になります。

以下は[公式サイト](https://catalog.workshops.aws/awscid/en-US/faqs#pricing)のFAQsからの引用です。

> ･ Total: $100-$200 monthly

ただ、これには色々と条件があり実際の金額は環境によって異なります。
もう少し掘り下げていきます。

## 費用の要素

まず、CUDOSの費用は次の要素によって決まります。

- QuickSightのユーザ数
- 連携するCURのデータサイズ

そして、CUDOSの費用は5つに分けられます。

- QuickSight
  - ユーザ費用
  - SPICE費用
- S3費用
- Athena費用
- Glue費用

関係を図示すると次のようになります。

![2025-02-07-18-27-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444225/1ca83e2e-5b9a-0f2f-cb25-bce30e6357dc.png)

## 費用にもっとも影響する要素はなにか

月々のAWS費用が10万ドル程度までであれば、QuickSightのユーザ費用がもっとも費用に影響します。
※ CURのデータ量はリソース数の影響を大きく受けます、金額はあくまで目安です。
以下は弊社の実績ですが、QuickSightのユーザ費用が大部分を締めていることがわかります。

![2025-02-07-17-51-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444225/bf791d76-6f7e-5d3b-54b1-fa8d8b6062c5.png)
![2025-02-07-17-52-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444225/9470680f-70aa-7a9d-ca14-aefb04dcb0e9.png)

## どうやって見積もるのか

ここまでを踏まえ得て、ざっくりとした見積もり方法を説明します。

### 月々のAWS費用が10万ドル程度

- QuickSightのユーザ費用 + 10〜20ドル（S3, Athena, Glue費用 ※ バッファ込）

### 月々のAWS費用が10万ドルを大きく超える場合

- ①もっとも高額なアカウントのCURを出力して、データサイズを確認する
- ②データサイズを元にS3, Athena, Glue, SPICEの費用を見積もる → 基準値
  - ※ 弊社の実績値では、s3の費用と比較したAthena、Glue、SPICEの費用は次のようになっています
    - Athena: s3費用の約19%
    - Glue: s3費用の約53%
    - SPICE: s3費用の約95%
- ③基準値を元にその他アカウントのデータサイズと費用を算出する
- ②と③にQuickSightのユーザ費用を加える

## おまけ（やらかした話）

QuickサイトにはAmazon Qを利用できるProユーザがあります。
Proユーザが1人でもいると、250 USD/月のAmazon Qの有効化料金が別途発生します。

私はユーザを追加する際に誤ってProユーザを追加してしまい、有効化料金が発生させてしまったことがあります。幸いにも月末が近かったので全額請求されることはありませんでしたが、請求書を見てびっくりしました。ユーザ追加の際は、必ずProユーザでないことを確認しましょう。
GitHub Copilotのエージェントモードを使ってみた

# はじめに
GitHub Copilotのエージェントモードは、AIを活用して開発者の作業効率を飛躍的に向上させるための新機能です。
[リンク](https://github.blog/jp/2025-02-07-github-copilot-the-agent-awakens/)
エージェントモードを利用することで、単一のコマンドから複数のファイルにわたるコード生成、リファクタリング、デプロイを実行できるとのこと。
Cline等でGithub Copilotを利用したAIエージェントは既に存在していましたが、やっと本家からエージェントモードが提供されたので、試してみました。

# エージェントモードの有効化方法

## 前提条件
- Visual Studio Code Insiders版が必要です
  - [VS Code Insiders](https://code.visualstudio.com/insiders/)から最新版をダウンロードしてインストールしてください
  - エージェントモードは現在、通常版のVS Codeではサポートされていません

## 有効化手順
1. **GitHub Copilotの設定を開く**
   - VS Code Insidersの設定画面で「GitHub Copilot」を検索します
   - 「GitHub Copilot: Enable Agent」のチェックボックスをオンにします

2. **コマンドパレットからの有効化**
   - `Ctrl+Shift+P`（macOSの場合は`Cmd+Shift+P`）でコマンドパレットを開きます
   - `GitHub Copilot: Toggle Agent Mode` を実行します

3. **サイドバーからの操作**
   - VS Code Insidersのサイドバーで「GitHub Copilot」アイコンをクリックします
   - エージェントモードの切り替えスイッチをオンにします

有効化後は、コードエディタ上でエージェントモードの機能が利用可能になります。

# エージェントモードの使用感
今回はエージェントモードを利用して、Pythonのコードを生成してみました。
内容としては[planio](https://plan.io/ja/)のAPIを利用して、チケットを登録できるようなコードを生成してみました。
環境構築はpipenvを利用、.envファイルで環境変数を管理するように依頼しました。
(利用したのはclaude-3.5-sonnet(gpt-4oは英語での返答が多いため))

上記の内容をエージェントモードに依頼すると、初期化、.envファイルの作成、Pythonファイルの作成まで行ってくれました。
![instruction_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/d5d4102b-3e7e-3996-ada8-069ecf08eab7.png)


その後、.envファイルの設定を説明してくれて、コマンドの実行を待ってくれたので、
.envファイルの設定を行い、コマンドを実行すると、結果を確認、内容をサマってくれました
![instruction_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/48ce4db3-e588-617c-1740-11eae8a8c0e5.png)


最後に、使い方等をまとめたREADME.mdを生成するように依頼すると、README.mdの内容を生成してくれました。
![instruction_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/7d41771d-57fa-900c-0e8d-bfdd20c9e53c.png)


ただ、外部URLを読んでもらおうとすると、読み込めない旨のメッセージを返されたので、この辺できるようになってくれるといいなと思いました。
![instruction_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/38810c3e-c05e-e496-e5b7-e880157b422c.png)


また、現在のWorkspace以外のファイルを編集するように依頼すると、それもできない旨のメッセージを返されたので、この辺も改善されるといいなと思いました。

# 最後に
- エージェントモードは、Github本家から提供されたAIエージェント
- VS Code Insidersを使用すれば、すぐに利用を開始できます
- 外部URLの参照やWorkspace外のファイル編集など、まだ制限はありますが今後の改善に期待できます

# その他のリソース
- [「The agent awakens」 - GitHub公式ブログ](https://github.blog/jp/2025-02-07-github-copilot-the-agent-awakens/)
- [Visual Studio Code Insiders](https://code.visualstudio.com/insiders/)
- [GitHub Copilot - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot)
Terraform Snowflake provider v1.0.3 環境変数設定

バージョン上がったら、また環境変数の設定方法が変わってたのでメモ。
Snowflake へ、terraform用key-pair認証ユーザで接続する時の場合です。

```
export SNOWFLAKE_ORGANIZATION_NAME="<organization_name(XXXXXXX)>"
export SNOWFLAKE_ACCOUNT_NAME="<account_name>"
export SNOWFLAKE_USER="<user_name>"
export SNOWFLAKE_AUTHENTICATOR=SNOWFLAKE_JWT
export SNOWFLAKE_PRIVATE_KEY=$(cat ~/.ssh/snowflake_tf_snow_key.p8)
```

- organization_name、account_name の取得方法
```sql
SELECT
    current_organization_name(),
    current_account_name(),
;
```

- v0.90.0からの変更点
    - SNOWFLAKE_ORGANIZATION_NAME
        -> 増えた
    - SNOWFLAKE_AUTHENTICATOR
        -> JWTから SNOWFLAKE_JWT へ変更になってた
    - SNOWFLAKE_ACCOUNT_NAME
        -> SNOWFLAKE_ACCOUNT="XX99999.ap-northeast-1.aws" のスタイルからKEY名も中身も変更になってた

- export KEY設定を間違えたときの挙動
    - terraform plan とかしたときに、
    "Error: Plugin did not respond"
    が返ってくる。
    参考（私がはまって質問したログ）：
    https://github.com/Snowflake-Labs/terraform-provider-snowflake/issues/3384
数字の途中での改行は困ります。

　最近、ときどき、当家への誤配があります。

　当マンションの住人の多くは、誤配物や 落としものの配達物 を見つけると、それを近くの掲示板に画鋲で貼り付けて、最大限の善行ができたと満足しているようです。しかし、ダイレクトメール類ならともかく、私信の場合には個人情報がさらし者にされて好ましくありません。

　このようなとき、親切を旨とする当家では、わざわざマンションの玄関の外側まで出て、正しいポストに入れ直し、また鍵を開けて帰ってくるので手間がかかって困ります。

　この記事は、このような誤配に繋がる原因をなくすためのお願いです。

　本題はここからです。

　正しくは、例えば、
　　福岡県 長崎市 熊本町 ８‐９‐１２３５
とすべき住所が、配達用のラベルでは、数字の途中で折り返され、
　　福岡県 長崎市 熊本町 ８‐９‐１
　　２３５
となっているため、１２３５号室に配達されるべき物が２３５号室の当家に配達されてしまうのです。

　あて名の印刷に使う自分用の住所録では、文字列が長い住所は、改行位置を明確にして、複数行のデータとして登録しています。

　しかし、一般の住所登録のフォームは、一行だけで長々と記述させるものが多くあります。それを単純に文字列としてデータ化し、印刷時に適当なところで改行するので、誤配のもとになっています。

　このような帳票印刷プログラムを作る方は、少なくとも、数字の途中では改行されないような配慮をお願いします。

　最近ではクレジットカードの配送も、簡易書留から普通郵便に変わっているようです。誤配にならないような心遣いがますます大切になります。
なぜソフトウェア開発の見積もりはいつもズレるのか？その理由と対策

# はじめに

ソフトウェア開発において、見積もりはプロジェクトの成功に欠かせない重要なステップです。しかし、多くの開発者やプロジェクトマネージャーが直面するように、見積もりは非常に難しい作業です。本記事では、なぜ開発の見積もりが難しいのか、その理由と対策について解説します。

## 開発見積もりが難しい理由

### 1. 不確実性と複雑性
ソフトウェア開発は多くの不確実な要素を含んでいます。**やったことがないことはどれくらい時間がかかるか分からない**ため、正確な見積もりが困難です。例えば、新しいAPIの統合や未経験のプラットフォームでの開発は、予想以上に時間を要する可能性があります。さらに、**予想外のタスクが発生する可能性**も高く、仕様に含まれていなかった細かい作業や追加対応が必要になることもあります。また、使用する**フレームワークや新しい技術の習得にどれくらい時間がかかるか**予測するのも難しく、学習コストが見積もりを超えることもしばしばです。

### 2. 技術的な障害
開発中には、**ハマりポイント**に直面することが少なくありません。たとえば、特定のライブラリが期待通りに動作しない場合や、デバッグに多くの時間を費やすことが考えられます。これらの問題は事前に予測することが難しく、**一見簡単に見えるタスクでも思わぬ障害に直面すること**があります。さらに、**バグが発生した場合、その発見と修正にどれくらい時間がかかるか**も見積もりに大きな影響を与えます。バグの再現手順を特定するのに時間がかかる場合や、修正が他の部分に影響を与える可能性も考慮する必要があります。

### 3. 要件の変動
クライアントの要望や市場の変化により、開発中に要件が変更されることがあります。これにより、当初の見積もりが無効になることも少なくありません。特にアジャイル開発のように柔軟な対応が求められるプロジェクトでは、変更の頻度が高くなり、そのたびに再見積もりが必要となります。

### 4. ヒューマンファクター
チーム開発では、**他のメンバーの開発速度が分からない**ことが大きな不確実要素となります。例えば、新しく参加したメンバーのスキルレベルが予想と異なる場合や、作業の進捗が計画より遅れる場合もあります。さらに、**自分がどのタスクを担当するか不明確**な場合、見積もりの根拠が曖昧になります。また、コミュニケーションの齟齬や認識のズレが生じると、修正や再作業が必要となり、結果的に工数が増加します。

## 見積もり精度を上げるための対策

### 1. 過去のデータを活用する
過去のプロジェクトデータを参考にすることで、より現実的な見積もりが可能になります。特に同様のプロジェクトやタスクがある場合、その実績データは貴重な情報源です。過去の失敗例や成功例を分析することで、どの部分に時間がかかりやすいのかを把握し、見積もりの精度を高めることができます。

### 2. 小さなタスクに分解する
大きなタスクを小さな単位に分解することで、それぞれの見積もりがしやすくなります。タスクを細分化することで、各ステップの進捗が見えやすくなり、問題が発生した際の対応も迅速に行えます。また、進捗管理もしやすくなるため、全体の見積もり精度も向上します。

### 3. バッファを設ける
予期せぬ問題に備えて、余裕を持ったバッファを見積もりに含めることが重要です。一般的には、全体の見積もりに対して10〜20％のバッファを追加することで、突発的な問題が発生しても対応しやすくなります。特に新技術を扱う場合や複雑なシステムとの統合がある場合には、バッファの比率を高めに設定するのが効果的です。

### 4. チーム全員で見積もりを行う
チーム全員で見積もりを行うことで、多角的な視点からの意見を取り入れることができます。これにより、見落としを防ぎ、より正確な見積もりが可能になります。また、メンバー間での役割分担を明確にすることで、個々の担当範囲に基づいた現実的な見積もりが可能になります。さらに、プランニングポーカーなどの見積もり手法を活用することで、意見の偏りを防ぎ、合意形成をスムーズに進めることができます。

## まとめ
ソフトウェア開発の見積もりは、多くの不確実性や変動要素が絡むため難しい作業です。しかし、過去のデータの活用やタスクの分解、バッファの設置、チーム全体での見積もりなどの対策を講じることで、見積もりの精度を向上させることが可能です。正確な見積もりを行うことで、プロジェクトの成功率を高め、クライアントとの信頼関係も築くことができるでしょう。見積もりは単なる数値ではなく、プロジェクト全体の計画と進行管理の基盤となる重要なプロセスです。
【React】【JavaScript】論理積(`&&`)をマスターするための問題集 #1

## Reactでもよく使う記法を問題を通して理解しよう！

Reactでよく使う記法なのですが、ifの条件式にはもちろん
あるstateの状態に合わせてコンポーネントや要素をレンダリングしたいときに
論理積は便利です。（以下の感じ）

```react
const isLoggedIn = true;

return (
  <div>
    {isLoggedIn && <p>ようこそ、ユーザーさん！</p>}
  </div>
);
```

JavaScriptの論理積（`&&`）は、左側の値が`false`（falsy）ならその値を返し、そうでなければ右側の値を返します。  
この性質を利用して、しっかりと使いこなすために`&&`の挙動を理解するための問題を解いてみましょう！

▼参考までに

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_AND

https://qiita.com/arunbababa/items/cd6812caf93acc59453e

---

### 基礎編（簡単な例題）

#### **問題1**
次のコードを実行すると、`console.log`には何が出力されるでしょうか？

```javascript
console.log(true && "Hello");
```

<details>
<summary>答えを見る</summary>

`"Hello"`

`true && "Hello"` の場合、左側が`true`なので右側の値が返されます。
</details>

---

#### **問題2**
次のコードを実行すると、`console.log`には何が出力されるでしょうか？

```javascript
console.log(false && "World");
```

<details>
<summary>答えを見る</summary>

`false`

`false && "World"` の場合、左側が`false`なのでそのまま`false`が返されます。
</details>

---

#### **問題3**
次のコードを実行すると、`console.log`には何が出力されるでしょうか？

```javascript
console.log(0 && "JavaScript");
```

<details>
<summary>答えを見る</summary>

`0`

`0`は`falsy`な値なので、その時点で評価が終わり`0`が返されます。
</details>

---

### 応用編（ちょっと難しい問題）

#### **問題4**
次のコードを実行すると、`console.log`には何が出力されるでしょうか？

```javascript
console.log("" && "Truthy");
```

<details>
<summary>答えを見る</summary>

`""`（空文字）

空文字（`""`）は`falsy`な値なので、`&&`の評価は左側で終わり、その値がそのまま返されます。
</details>

---

#### **問題5**
次のコードを実行すると、`console.log`には何が出力されるでしょうか？

```javascript
console.log("Hello" && undefined && "World");
```

<details>
<summary>答えを見る</summary>

`undefined`

評価の順番：
1. `"Hello"` は`truthy`なので次に進む
2. `undefined` は`falsy`なので評価が止まり、そのまま`undefined`が返される
3. `"World"` には到達しない

</details>

---

### まとめ
JavaScriptの論理積（`&&`）は、左側の値が`falsy`であればそこで評価が終わり、その値が返されます。  
逆に左側が`truthy`なら、右側の値がそのまま返されます。  
この挙動を理解すると、短絡評価（short-circuit evaluation）を活用して、`if`文を減らしたり、より簡潔なコードを書くことができます。

---
MARAとMARM

MARA:一般品目データ
MARM:品目数量単位
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/6e3daf0a-ec87-860e-08c2-f50735836c91.png)

MARA中有基本数量单位
MARM的追加data中有SNP
SNP取第二行的数据，且判断一下非基本数量单位。


在sap中具体的对应位置如下：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/26e14561-9bc4-4fa2-b49c-2d39febc0620.png)
MM02->品目コード->基本データ1->追加データ->数量単位
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/ea882117-cd04-4895-b447-c8e12354f43e.png)
Accessvbaでのsqlを使用したsingle,doubleを対象とした四捨五入処理(chatgpt産)

' ※ このコードを標準モジュールに貼り付けます
' 参照設定：Microsoft ActiveX Data Objects Library と Microsoft DAO 3.6 (またはそれ以降) が必要

Public Sub RoundDecimalFields(ByRef adoConn As ADODB.Connection)
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field
    Dim sql As String
    Dim tblName As String
    Dim fldName As String
    
    ' 現在のデータベースを取得
    Set db = CurrentDb
    
    ' DAO.TableDefs をループしてシステムテーブル以外（＝ローカル／リンクテーブル）を対象にする
    For Each tdf In db.TableDefs
        ' ※ システムテーブルは属性で除外
        If (tdf.Attributes And dbSystemObject) = 0 Then
            tblName = tdf.Name
            ' 各テーブルのフィールドをループ
            For Each fld In tdf.Fields
                ' ※ フィールドの型が Single 型または Double 型の場合
                If fld.Type = dbSingle Or fld.Type = dbDouble Then
                    fldName = fld.Name
                    ' UPDATE クエリ作成（NULL は対象外）
                    sql = "UPDATE [" & tblName & "] " & _
                          "SET [" & fldName & "] = Round([" & fldName & "], 4) " & _
                          "WHERE [" & fldName & "] IS NOT NULL;"
                    
                    ' エラー発生時はメッセージ出力して次のフィールドへ
                    On Error Resume Next
                    adoConn.Execute sql
                    If Err.Number <> 0 Then
                        Debug.Print "更新エラー (テーブル：" & tblName & " フィールド：" & fldName & "): " & Err.Description
                        Err.Clear
                    End If
                    On Error GoTo 0
                End If
            Next fld
        End If
    Next tdf
    
    ' オブジェクトの解放
    Set fld = Nothing
    Set tdf = Nothing
    Set db = Nothing
    
    MsgBox "四捨五入処理が完了しました。", vbInformation
End Sub
PluralithのM4Macでの使い方を調べてみた

## PluralithのM4Macでの使い方を調べてみた

terraformで作成したインフラを可視化したいと思って調べてみた

### まずはここ公式
https://github.com/Pluralith/pluralith-cli/releases

おや・・・ armのバイナリがない。

https://github.com/Pluralith/pluralith-cli/issues/106

気になるissue発見！

未サポートだった！！

誰か作ってください！！
boto3でbucket-owner-full-controlを使うには

## はじめに
クロスアカウントでs3にファイルをアップロードする際に、boto3で`bucket-owner-full-control`を付ける方法について、記載していきます。

:::note 
**bucket-owner-full-control**とは
これを指定することで、アカウントをまたいでS3にオブジェクトをアップロードする際、所有者をアップロード**先**のアカウントにすることができる。

デフォルトは、アップロード**元**のアカウントが、オブジェクトの所有者になっている。

参考：[どうやってbucket-owner-full-control ACL を Amazon S3 内のオブジェクトに追加するんですか?](https://repost.aws/ja/knowledge-center/s3-bucket-owner-full-control-acl)
:::
## コード
`ExtraArgs`として、`{"ACL": "bucket-owner-full-control"}`を指定することで、所有者として、アップロード先のアカウントを指定できます。

``` Python:s3.py
import boto3
import logging
from botocore.exceptions import ClientError

class S3Client:
    """
    s3 utility client that currently has the following features:
        Upload to s3
    """

    def __init__(self, aws_account=None, aws_access_key_id=None, aws_secret_access_key=None):
        if aws_account == 'OurAccount':
            self.client = boto3.client(
                's3',
                aws_access_key_id = aws_access_key_id,
                aws_secret_access_key = aws_secret_access_key
            )
        self.client = boto3.client('s3')
    
    def upload_file(self, file_name, bucket, object_path):
        ExtraArgs =  {"ACL": "bucket-owner-full-control"}
        try:
            self.client.upload_file(file_name, bucket, object_path, ExtraArgs=ExtraArgs)
        except ClientError as e:
            logging.error(e)
            return False
        return True
```

この修正を行うことで、今までS3のファイルを取得する際に出ていた以下のエラーが解消されました :clap: 

```
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
```


## 参考にした公式ドキュメント

`ALLOWED_UPLOAD_ARGS`の中にACLが含まれていたので、`ExtraArgs`として指定できました。

- [upload_fileリファレンス](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/upload_file.html)

- [ExtraArgsで許可されているもの一覧](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/customizations/s3.html#boto3.s3.transfer.S3Transfer.ALLOWED_UPLOAD_ARGS)


## 終わりに

同じようなことに悩んでいる方の解決に役立ったら幸いです:blush:
[paiza]コードゴルフ的なアレ

# スピーチとコードは短いほうがいい（博多華丸風）
元ネタは博多華丸大吉で「スピーチとスカートは短いほうがいい」らしいですが、
令和な世界だとセクハラだの何だので叩かれるらしいです（市長に辞職勧告決議案出されるレベル

元ネタを知ってればパクってるんだなぁHA HA HAで笑い飛ばせる話も、
世間的に偉くなったり・責任を伴う人が言おうもんなら、これ見よがしにぶっ叩いて潰し合う、
なんだか心に余裕のない糞つまらない世の中になったもんだなぁと（昭和脳

# 答えは書かないよ（対象外問題のため
https://paiza.jp/entry/denno2088_qiita

上記のpaizaのプログラミングゲーム企画にて、「ネオン街のクラブ」と言うステージにてコードゴルフ的なランキング問題が有るようで、それを解くに当たってJavaでコードゴルフ解くときのちょっとした小技的なモノを紹介

## クラス宣言を辞める
Java8からinterfaceにmainメソッドが書けるため、いままでダラダラと書いていた`public static`が消せるね
```java:入門書でありがちなお手本のようなmainメソッド
import java.util.*;

public class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String line1 = scanner.nextLine();
    String line2 = scanner.nextLine();
    // 何か処理
  }
}
```

```java:ゴルフ用
import java.util.*;

interface Main {
  void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String line1 = scanner.nextLine();
    String line2 = scanner.nextLine();
    // 何か処理
  }
}
```

## 変数名を短く
実務でコレやったらブッコロですが、ゴルフなのでダイジョブダイジョブ
```java:ゴルフ用
import java.util.*;

interface Main {
  void main(String[] a) { // argsとか4文字も使ってるやんけ
    Scanner b = new Scanner(System.in); // メソッド引数がaだから、次はbでええやろ
    String c = b.nextLine();
    String d = b.nextLine();
    // 何か処理
  }
}
```

## 型推論を使う
どんな型で受け取るかなんて分かってるんだから、イチイチ書かなくてもいいよね
```java:ゴルフ用
import java.util.*;

interface Main {
  void main(String[] a) {
    var b = new Scanner(System.in); // Scanner型って分かってんだからvarで良くね？
    var c = b.nextLine();
    var d = b.nextLine();
    // 何か処理
  }
}
```

## 1回しか出てこないのにimportって邪魔だよね
`Scanner`（コンソールとかの入力値をいい感じにスキャンしてくれるアレ）が、
コード内に1回しか出てこないのに、それだけのためにimport文書くとか無駄だよね
※2回以上出てきた場合はimportのほうが短くなる可能性もあるけど、そこら辺は実際に書いてみてって感じですね
```java:ゴルフ用
interface Main {
  void main(String[] a) {
    var b = new java.util.Scanner(System.in); // importしないで、フルパス指定
    var c = b.nextLine();
    var d = b.nextLine();
    // 何か処理
  }
}
```

## 改行・スペースを削る
この作業は最後にやった方が良いかと（動作確認できてから
削る所としては`{}`の前後、`=`の前後、配列型宣言と変数名の間になります。
要は空白を消してもビルドエラーが出ない箇所
```java:ゴルフ用
interface Main{void main(String[]a){var b = new java.util.Scanner(System.in);var c=b.nextLine();var d=b.nextLine();/*何か処理*/}}
```

だいたいこんな感じで、如何にコードを短く読みづらく書くかというのを競うのがコードゴルフになります。
こんなに削ったとしても、ランキング的に上位10位（2025/02/06時点）に入るのがやっとなので、
1位の人とかどんだけ削ってるんだろうと。。。
勉強がてらにコード見せていただきたいところですね。
Reactのprops.children

**props.childrenは、Reactコンポーネントにおける特別なプロパティの一つです。コンポーネントの子要素を参照する際に使われ、特定のコンポーネント内に配置された要素（テキストや他のコンポーネントなど）を表すことができます。これによって、再利用性が高く拡張性に優れたコンポーネントを作成することが可能となります**。

例

以下はprops.childrenを用いたシンプルな例です。
```Typescript
const MyWrapper = (props) => {
  return (
    <div className="p-4 border rounded-xl">
      {props.children}
    </div>
  );
};

function App() {
  return (
    <MyWrapper>
      <h1>Hello World</h1>
      <p>This content will be rendered inside MyWrapper!</p>
    </MyWrapper>
  );
}

export default App;
```

**MyWrapperコンポーネント**

props.childrenをdiv要素の中に挿入。

**Appコンポーネント**

<MyWrapper>内に要素を配置している。

このとき、コンポーネントMyWrapper内では、以下のように実際の要素がレンダリングされます。

```Typescript
<div class="p-4 border rounded-xl">
  <h1>Hello World</h1>
  <p>This content will be rendered inside MyWrapper!</p>
</div>
```

MyWrapperのタグで囲んだ部分はprops.childrenとして読み込まれるため、Wrapperコンポーネント側で柔軟に扱うことができます。もしprops.childrenを使わずにコンポーネントをラップしようとすると、内部に配置される要素を明示的に指定する必要があるため、再利用性が低下してしまいます。

**props.childrenのメリット**

柔軟性: コンポーネント内に配置する要素を自由に変更できるため、多様なケースに対応可能です。

抽象化: コンポーネントに必要最低限の実装だけ行い、実際にレンダリングする要素は利用側に任せることができます。

再利用性向上: 同じWrapperコンポーネントでも、中身を差し替えるだけで全く別の見た目や構造を持つUIを作成可能になります。

childrenの型

実はprops.childrenは単一要素だけではなく、配列として複数の要素が渡されることもあります。ですので、子要素が単一の場合と複数の場合を考慮した実装を行うことが大切です。

例：

function MyWrapper({ children }) {
  // childrenが複数要素の場合は配列になる
  // childrenが単一要素の場合はその要素自体になる
```Typescript
  return (
    <div className="p-4 border rounded-xl">
      {/* 配列の場合も要素単体の場合も同様にレンダーされる */}
      {children}
    </div>
  );
}
```
型定義の例

TypeScriptで型定義を行う場合は、以下のように書くことが多いです。
```Typescript
import React, { ReactNode } from 'react';

type MyWrapperProps = {
  children: ReactNode;
};

const MyWrapper: React.FC<MyWrapperProps> = ({ children }) => {
  return (
    <div className="p-4 border rounded-xl">
      {children}
    </div>
  );
};

export default MyWrapper;
```

ReactNodeは文字列や要素、配列など、Reactがレンダリング可能なあらゆる型を包括しており、props.childrenを使う際には非常に便利な型です。

**props.childrenの注意点**

コンポーネントが子要素を必要としない場合

もしラップコンポーネントが子要素を必要としない場合は、childrenを使わない実装でも良いでしょう。むしろ不必要な場合は受け取らない方が意図が明確になります。

要素の数の制御

ユーザーが任意に子要素を渡せるため、想定より多くの子要素が渡される場合があります。必要に応じて要素の数を制限したり、要件に合わない場合にエラーを出す設計も検討しましょう。

コンポーネントの責務分離

props.childrenを用いたラップコンポーネントは、コンポーネント同士の責務を明確に分離する助けにもなります。デザインやレイアウトなどの見た目に関わる部分を一つのコンポーネントにまとめることで、ロジック（処理）を行うコンポーネントと明確に区別できるようになります。

**まとめ**

Reactで開発を行う上で、props.childrenはコンポーネントの再利用性と柔軟性を高める重要な仕組みです。Wrapperコンポーネントなどで活用して、使いやすくメンテナンスしやすいUIを設計することにこころがけていきたいと思います。
C#でIoTプログラミング on ESP32 #4 - RGBLED2

今回のプログラムはオンボード上のRGBLED(NeoPixel)でレインボーカラーを表示します。
#2のサンプルではカラーネームを指定して色を変更していましたが、今回のプログラムではRed,Green,Blueの各色の明るさを変化させてレインボーカラーを表現します。

## ハードウェア
・Freenove ESP32-S3-WROOM Board
　（他のボードでも動作するかもしれませんが、LEDの型番が違う場合コードの一部を修正する必要があります。）

## 導入するパッケージ
・nanoFramework.iot.Device.Ws28xx.Esp32

## プログラミング

・新規プロジェクトを作成します。プロジェクト名は「ESP32S3_RGBLED_Rainbow」としました。

・コードを入力する前にパッケージは導入してください。

・コードは次のようになります。
```C#:Program.cs
using Iot.Device.Ws28xx.Esp32;
using System.Threading;

namespace ESP32S3_RGBLED_Rainbow
{
    public class Program
    {
        public static void Main()
        {
            const int count = 1;    //LEDの数　オンボードLEDが対象なので１
            const int ledPin = 48;  //LEDを接続しているGPIO番号

            int red, green, blue;

            Ws28xx led = new Ws2812c(ledPin, count);

            BitmapImage img = led.Image;

            while (true)
            {
                for(int i = 0; i < 255; i++)
                {
                    //色相の位置
                    int pos = i % 255;

                    //赤>（黄）>緑と変化する
                    if (pos < 85)
                    {
                        red = 255 - pos * 3;
                        green = pos * 3;
                        blue = 0;
                    }
                    //緑>（水色）>青と変化する
                    else if(pos>=85 && pos < 170)
                    {
                        pos -= 85;
                        red = 0;
                        green = 255 - pos * 3;
                        blue = pos * 3;
                    }
                    //青>（紫）>赤と変化する
                    else
                    {
                        pos -= 170;
                        red = pos * 3;
                        green = 0;
                        blue = 255 - pos * 3;
                    }

                    //色の指定はバイト型なので(byte)でキャストします。
                    img.SetPixel(0, 0, (byte)red, (byte)green, (byte)blue);
                    led.Update();
                    //20ms毎に変化
                    Thread.Sleep(20);
                }
            }
            
        }
    }
}
```

・色相グラフ見ると0～255の間で0の位置で赤色、85の位置で緑色、170の位置で青色、255の位置で再び赤色に戻ります。色相の位置によって各色の明るさを決めると滑らかに色を変化させることができます。

![色相.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62606/ee48096f-bf3c-c830-2b0a-d4334d43c784.png)

数値で色を表現できるのでランダムな値を設定して複雑なパターンの光も出すことができます。
Swift勉強：１日目

忘れないように学んだことの備忘録として書いています！

## 変数と定数の宣言と値の代入
- 変数と定数
    - 値を入れる箱のようなもの

- 変数
    - 入れた値を後で変更できる（再代入）

- 定数
    - 入れた値は後で変更できない
    - 封がされた箱のようなもの
    - 絶対に変更されたくない値を入れるのに使うのか？

- 名前の付け方
    - Lowe camel case「userName」（ひとこぶラクダ）
    - Upper camel case「UserName」（ふたこぶラクダ）
【忘備録】iTunesとかで読み込んだアルバムのファイル名の頭にトラックナンバーを入れるスクリプト

## はじめに
妻から、「以前itunesとかで読み込んだアルバムのファイル名にトラックナンバー入れたいんだけどいい方法ない？」と聞かれたので５分位で書いたスクリプト
マジで忘備録かつ自分の好みを反映しているのでツッコミはなしで。
## 下準備
exiftoolが動くように。
## 実行
以下のスクリプトをアルバムが入ってるディレクトリから実行（スクリプトは別のディレクトリでも大丈夫だけど、実行は必ずそのディレクトリで。）
実行後、入れたいトラックナンバーの桁数（２〜３がおすすめ）を入力求められます。
```TrackNumber.sh
#!/bin/bash

#ディレクトリ内の曲データ等の取得
ls | grep -v .txt > musictemp.txt

#トラックナンバーの桁数指定
echo 桁数は？
read D
DIG=%0"$D"d

#取得した曲データのリストごとにファイル名書き換えを繰り返し実施
while read MNAME
do
#トラックナンバーを取得して指定桁数に変換
TNUMBER=$(printf "$DIG" $(exiftool "$MNAME" | grep Track\ Number | awk -F " " '{print $4}'))
#ファイル名を書き換え：トラックナンバー_もとのファイル名
mv "$MNAME" "$TNUMBER"_"$MNAME"
done < musictemp.txt

#ファイル名を取得したファイルの削除
rm -f  musictemp.txt
```
幅優先探索（BFS）で解く「電脳少女プログラミング2088」のA問題：効率的な探索アルゴリズムの実装（Python3）

## はじめに

https://ppg.paiza.jp/denno2088

こんにちは。今回は「電脳少女プログラミング2088 ─壊レタ君を再構築─」の[新都心のハイウェイ問題（Aランク相当）](https://ppg.paiza.jp/denno2088/challenges/denno2088_c_a_01)に挑戦しました。この記事では、問題の解法と実装についてお話しします。

## 問題概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004767/9692a7b7-3d79-62a8-e953-20e2b0cf25cb.png)

問題の設定は以下の通りです：

- 縦H×横Wのグリッド状ハイウェイ
- 2つの車両AとB（Aが主人公）
- 道マスと壁マス
- AがBを発見するための最小移動回数を求める

## 解法のポイント

1. 幅優先探索（BFS）の活用  
2. Pythonの`deque`を使用した効率的なキュー管理  
3. 視界判定関数の実装  

## コード実装

```python
from collections import deque

def find_shortest_path(H, W, grid):
    # A と B の位置を見つける
    A, B = None, None
    for i in range(H):
        for j in range(W):
            if grid[i][j] == 'A':
                A = (i, j)
            elif grid[i][j] == 'B':
                B = (i, j)
    
    # 移動方向（上、下、左、右）
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
    
    # BFSのためのキュー
    queue = deque([(A[0], A[1], 0)])  # (x, y, 距離)
    visited = set([A])
    
    while queue:
        x, y, dist = queue.popleft()
        
        # B が見つかったかチェック
        if can_see(x, y, B[0], B[1], grid):
            return dist
        
        # 隣接するマスを探索
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if 0 <= nx < H and 0 <= ny < W and grid[nx][ny] != '#' and (nx, ny) not in visited:
                queue.append((nx, ny, dist + 1))
                visited.add((nx, ny))
    
    return -1  # B を見つけられない場合

def can_see(x1, y1, x2, y2, grid):
    # 同じ行にいる場合
    if x1 == x2:
        start, end = min(y1, y2), max(y1, y2)
        return all(grid[x1][i] != '#' for i in range(start + 1, end))
    # 同じ列にいる場合
    elif y1 == y2:
        start, end = min(x1, x2), max(x1, x2)
        return all(grid[i][y1] != '#' for i in range(start + 1, end))
    return False
```

### 関数の解説

#### `find_shortest_path`関数

BFSを用いて最短経路を探索します。この関数では、最初にグリッドを走査してAとBの位置を特定しています。その後、`deque`を用いて効率的なキュー操作を実現し、最短経路を探索します。

#### `can_see`関数

AがBを視認できるかを判定します。同じ行または列にいる場合のみ、間に壁がないかチェックします。`all`関数を用いて、指定範囲に壁が存在しないかを効率的に判定します。


## フィードバック

コード提出後、予想外のフィードバックをいただきました：

![スクリーンショット 2025-02-07 165107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4004767/5c85c710-ce41-aa2d-a0a2-0bcba365a81d.png)

> 「ウケる〜！このコード、マジイケてんじゃん！爆速で動いてる感じ、超ヤバくない？(✧ω✧)」

ありがとうございます！このような評価をいただけるとは思っていませんでした。また、別の性格では関西弁のものもあり、面白かったです。

## まとめ

- 幅優先探索（BFS）は最短経路探索に有効
- データ構造（`deque`）を適切に使うことで処理効率が向上
- 視界を判定する関数を実装することで探索処理を効率化

## 今後の展望

1. AIとの友情を深める
2. 関西弁の習得

## おわりに

今回の挑戦では、効率的なアルゴリズム設計だけでなく、AIとの新しい交流も楽しむことができました。「電脳少女プログラミング2088」は単なるプログラミング問題集ではなく、新しい学びや発見につながる場だと感じました。

みなさんもぜひ挑戦してみてください！どんなフィードバックが返ってくるか楽しみですね。
AIで表情認識LBエモーショナル編集！感情に合わせた映像加工技術とは？

はじめに
映像制作において、視聴者の感情を引き込む編集は非常に重要です。
従来は編集者の経験や感覚に頼って行われていましたが、近年はAIによる表情認識技術が進化し、映像の雰囲気を自動で最適化できるようになりました。
本記事では、**AIが感情を分析し、それに応じた映像加工を自動で行う「エモーショナル編集」**の仕組みと活用方法を詳しく解説します。

AIの表情認識技術とは？映像編集への応用
AIによる表情認識の仕組み
表情認識AIは、映像の中に映る人物の顔の動きや微細な表情の変化を分析し、感情を自動判定する技術です。
一般的なAI表情認識では、以下のような感情を識別できます。
喜び（Happy）
悲しみ（Sad）
怒り（Angry）
驚き（Surprised）
恐れ（Fear）
無表情（Neutral）
映像編集において、この技術を活用することで、特定の感情に合わせた映像効果を自動適用することが可能になります。

映像編集での活用方法
表情認識AIを映像編集に活用すると、以下のような編集が自動化できます。
1.感情に応じたBGMや効果音の適用
例えば、笑顔のシーンでは明るく軽快な音楽を、悲しいシーンでは静かで落ち着いたBGMを自動選択し、映像の雰囲気を最適化できます。
2.色彩補正（カラーグレーディング）
また、感情に合わせて映像の色味を調整することで、視覚的にも感情が伝わりやすくなります。
怒りのシーン → コントラストを強め、赤みを加える
楽しいシーン → 鮮やかで明るい色調に調整
悲しいシーン → 青みがかったトーンで落ち着いた印象に

3. 自動ハイライト編集
ほかにも、視聴者の感情を最も引きつけるシーンをAIが自動抽出し、短時間で魅力的なハイライト動画を生成できます。
エモーショナル編集の具体的な活用例は、具体的には、動画広告・マーケティングへの活用が挙げられます。
視聴者の感情を動かす動画広告を作る際に、AIを活用したエモーショナル編集を取り入れると、ブランドのメッセージがより強く伝わる映像を作成できます。
例えば、商品の魅力を伝える際に、登場人物の表情が変化する瞬間を強調し、適切なエフェクトやBGMを適用することで、視聴者の共感を引き出せます。
また、YouTube・SNS動画の最適化も挙げられます。
SNSやYouTubeでは、短時間で視聴者の興味を引くことが重要です。
AIによる表情認識を活用することで、感情が大きく動いた瞬間を自動的に切り取り、効果的なサムネイルや短尺動画を作成することができます。

AIを活用したおすすめの映像編集ツール
1.Adobe Sensei
AdobeのAI技術「Sensei」は、表情認識を活用した映像編集機能を提供しており、感情に応じたカラーグレーディングやBGM調整を自動化できます。
2.Magisto
Magistoは、AIが動画の雰囲気を分析し、感情に基づいた最適な編集を自動で適用されます。
特にSNS動画向けのショートクリップ作成に強みがあります。
3.Runway ML
感情分析を活かした映像編集が可能なAIツールです。
初心者でも簡単に使えるインターフェースが特徴的といえます。

今後の展望
今後、AI技術の発展により、表情認識とエモーショナル編集はさらに高度化すると考えられます。
具体的には、音声の感情解析との組み合わせや、視聴者のリアルタイム感情データに基づいた動画編集、VR・メタバース環境での感情ベース映像制作が挙げられます。
特に、リアルタイムでの感情解析を活用した動画編集が普及すれば、個々の視聴者に最適化された映像体験が提供可能になるでしょう。

まとめ
AIによる表情認識とエモーショナル編集を活用することで、感情に寄り添った映像を短時間で作成可能になりました。
従来の編集作業を効率化しながら、視聴者に響く映像を作れる点が大きなメリットです。
動画制作に関わる方は、今後ますます進化するAI技術（手ぶれ補正やノイズ除去）を活用し、視聴者の心を動かす映像作りに挑戦してみてはいかがでしょうか？
塗装職人からエンジニアに？できらぁ！（Java-１）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3999146/8c71b84d-0de0-eadc-ad92-6eea4863949f.png)


## はじめに
はじめまして、Teyo3Mです。
エンジニアを目指し、現在会社に所属しながら勉強を続けています。
本記事では、学習を始めてからの1か月を振り返り、感じたことや躓いた点を記録としてまとめます。


## 簡単な自己紹介
名前：Teyo3M
職歴：家庭教師のバイト、塗装職人
趣味：スキューバダイビング


## 実施したこと
・参考書の読了
使用させていただいている参考書（敬称略）
タイトル：やさしいJava第7版
著者：高橋　麻奈
・初心者向けのハンズオン
[初心者がJavaでTodo管理システムを作ってみるガイド！](https://qiita.com/Hemmy7/items/64c2e8e70e6b835628bf)

## 学習の記録
1週目

まずは環境構築から始めました。
今の会社に入社する前に一度自宅で環境を構築したことがあったため、同じ手順を再現することでスムーズに進めることができました。
その後、四則演算、if文、配列までは順調に学習が進みました。

2週目

以前、自宅学習で多次元配列につまずいていましたが、実はそれほど頻繁に使われるものではないと知り、衝撃を受けました。
それまで「学習の順序通りにすべてを理解しなければならない」と思い込んでいましたが、一旦飛ばすという選択肢があることを学びました。
この発想の転換により、学習の進捗が停滞していた状況から抜け出すことができました。

3週目

クラスやメソッドの基本的な考え方、オーバーロードについて学習しました。
部署の勉強会で何度か触れた内容だったため、概念の理解はスムーズでしたが、いざ説明しようとすると難しく感じました。
これは単なる理解不足ではなく、「何を理解していて、何が理解できていないのか」を把握する指標になると考え、積極的に周囲と会話することの重要性を実感しました。

4週目

冒頭で紹介したハンズオンに挑戦しました。
正直、簡単だと思っていましたが、想像以上に難しかったです。
特に、優先度を決める（enum） でつまずきました。
コンストラクタやインスタンスの概念を中途半端に理解していたため、先入観や思い込みから「これはバグのはずだ」と決めつけてしまい、試行錯誤に時間を要しました。

## エラーと仲良くなる
「英語が全く分からない私でも、何度も同じエラーを見ているうちに意味がわかるようになった」
というくらい、エラーメッセージと向き合うことができました。
特に、他のファイルで定義した内容をメインのファイルに適用する際、フィールドの作成を忘れるミスが頻発しました。
また、static修飾子の理解が曖昧だったため、「newしなくても呼び出せる」という知識だけでコードを書き、エラーに悩まされることも多かったです。
根本理解のためにも何度も根気強く付き合ってくれたVSコード君とChatGPT君には感謝せずにはいられません。

## AIネイティブなのかもしれない
様々なエラーをAIにも相談しました。自分で考えて、修正して、エラーの個数が増えて...どうしても解決できない時にAIに質問してみました。
エラーの内容と該当箇所のコードを入力し、「答えを言わずに考え方を教えて」と打つと、かなり高い精度で考え方を教えてくれました。また、解説でわからない箇所があれば、その場で質問できるのも魅力でした。
そんな中、思いつきで「今までの質問から自分に足りない箇所を教えてほしい」としたことがありました。
するとAIは詳細に答えてくれました。

実際に言われたこと
```
✅ 今回しっかり理解できていること
Javaの基本文法（if文、switch文、ループ、例外処理）
クラスとメソッドの役割（TodoAppやTodoの設計）
列挙型（enum）の利用（Priorityを使った優先度管理）
ユーザー入力のバリデーション（scannerや正規表現の活用）
🚀 今後の学習でおすすめポイント
1️⃣ クラス設計（オブジェクト指向の考え方）
ポイント: クラスを分けるときの「責務（役割）」の考え方
理由: SelectPriority の作成時に、メソッドの呼び出し方で少し迷いがありましたね。
おすすめ:
SOLID原則のうち、特に「単一責任の原則（SRP）」を調べてみると、コードの整理がもっと楽しくなります！
public、private、static の違いも深掘りするといいですよ。
2️⃣ メソッドのスコープと呼び出し方
ポイント: static メソッドの使い方とインスタンスメソッドの違い
理由: electer() → selecter() 呼び出しエラーの際、static との関係で少し混乱があったため。
おすすめ:
static を付ける意味、インスタンスを作る場合の違いを整理してみよう！
例として「ユーティリティクラス」と「インスタンスクラス」の違いを学ぶと理解が深まります。
3️⃣ 例外処理とエラーハンドリングの応用
ポイント: 例外を活用して、より安全なアプリにする方法
理由: NumberFormatException での基本的な例外処理はバッチリですが、カスタム例外なども学ぶとワンランク上に！
おすすめ:
try-catch の応用、throw で独自のエラーを作る方法などを少しずつ取り入れてみましょう。
```

AIってすごいなって思いました。

## AIを勉強に取り入れるときに意識していること
AIを勉強に取り入れる際に周囲の人に言われて意識している点は2つです。
1　なんでもすぐにAIに聞くのではなく、まずは自分で調べること
2　AIも100％正しいとは限らないので、動作テストや追加調査を行い正確性を確かめること
当たり前といえば当たり前かもしれませんが、実際に現場に出たことのない人間に真摯に向き合ってくれる会社の上司には感謝しかありません。

## 最後に
Todoリストの課題をAIをもちいて勉強し、先人の知識の深さは「調査の上手さ」も理由の一つだと思いました。
自分が調査やアウトプットに不安やコンプレックスを抱えているのを自覚しているので、今後の課題として「調査をする力」を身に着け、エンジニアになれるよう精進していこうと思います。
ClineでAzure OpenAI Serviceを利用する方法

自分用にメモします。

### 1. Azure OpenAI Serviceのリソースを作成

Azure Portalにログインし、Azure OpenAIを検索します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/b5217ff9-4e9f-897e-b6fc-859812d6f4d6.png)

Azure OpenAIリソースを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/2ae45d7a-7ccd-1ea2-93de-0a235a402a8b.png)

これだけでは何もできないので、Azure AI Foundry portalにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/210468ea-1f79-e5fe-a528-8df32280cfe6.png)

モデルカタログにアクセスします。好きなモデルを選択します。今回はgpt-4oを選択してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/8bcffff1-98ab-7a24-c28b-c57c7cefd039.png)

このエンドポイントが大事です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/8c592e9f-77fd-3b4f-630f-6e6782cd5b75.png)

### 2. Clineに設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147841/24ae93de-d8f2-a3b4-f9ab-80593fd4f346.png)

上から説明していきます。

- API Provider
    - OpenAI Compatibleを選びます
- Base URL
    - Azure OpenAI Serviceで作成したモデルのエンドポイントをそのままコピペします
- API Key
    - Azure OpenAI Serviceで作成したモデルのAPI Keyをそのままコピペします
- Model ID
    - Base URLの文字列中にModel ID(今回であればgpt-4o)があるので、それを入力します。

以上でClineでAzure OpenAI Serviceが動作します。
【ぼくの備忘録】Macのショートカット活用術

## はじめに

Macにはさまざまなショートカットがありますが、普段の操作を効率化する上で特に便利だと感じたものをまとめました。
特に、行や文字単位での移動をスムーズに行えるショートカットを知ることで、作業の手間が減り、快適になります。

以下は、Apple公式のサポートページ（[参考URL](https://support.apple.com/ja-jp/102650)）から学んだショートカットの中で、特に日常のMac操作に役立つと感じたものです。

## Mac操作で便利なショートカット

### 行単位の移動

- `Control + A`：行または段落の先頭に移動
- `Control + E`：行または段落の末尾に移動

ホームページからコピーするときに、マウスで文の先頭に選択範囲を持っていく際、誤ってページ全体を選択してしまうことはありませんか？
このショートカットを使えば、一瞬で行の先頭や末尾にカーソルを移動できるので、不要な選択を防げます。

### 文字単位の移動

- `Control + F`：1文字分進む
- `Control + B`：1文字分戻る

矢印キーを使わずに移動できるので、手をホームポジションから大きく動かさずに済みます。

### 行の移動

- `Control + P`：1行上に移動
- `Control + N`：1行下に移動

上下の移動も矢印キーを使わずに行えるので、作業がスムーズになります。

### 編集のサポート

- `Control + O`：挿入ポイントの後に1行挿入
- `Control + T`：挿入ポイントの右側の文字と左側の文字を入れ替え

誤入力を修正するときに、特に `Control + T` は便利です。打ち間違えた際に削除して打ち直すのではなく、簡単に文字を入れ替えることができます。

## まとめ

これらのショートカットを覚えることで、Macの操作がスムーズになり、作業効率が向上します。

特に、`Control + A` や `Control + E` は行単位での移動がスムーズになり、`Control + F` や `Control + B` は細かい修正がしやすくなります。

普段のMac操作にぜひ取り入れてみてください。

ちなみに、コーディングに関してはVimが良いのでは？と思い、少しずつ勉強を始めています。Macのショートカットと合わせて、より快適な作業環境を目指していきたいです。

[参考URL](https://support.apple.com/ja-jp/102650)
ESP32 + PlatformIO (備忘録)


# 初めに
ここではESP32+VSC+PlatformIOで書き込んだりしたりする際の作業手順を記載します。
時々この作業を行うのですが「よく忘れてしまう」ことがあるので、この際記録しておこうというのが目的です。

# バージョンなど
VSC
![SnapCrab_Visual Studio Code_2025-2-7_16-41-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998154/4e274a6c-3e8f-88c3-3c4a-8278c91e4f5f.png)

PlatformIO
![SnapCrab_NoName_2025-2-7_16-42-56_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998154/6ea69ac6-7606-c1eb-cdac-36f3aa4a997c.png)

# CP210 (USB-UARTブリッジ)
ドライバはここ

https://jp.silabs.com/interface/usb-bridges/usbxpress/device.cp2102n-gqfn20?tab=softwareandtools

# 再書き込み手順
　1\. VSCを立ち上げ、目的のプロジェクトを読み込んだら左ペインのPlatformIOのアイコンをクリック
　2\. (必要であれば)Build → Upload → しばらくすると書き込み完了する
![SnapCrab_NoName_2025-2-7_16-49-0_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3998154/0d82f5a5-d727-a983-9fa7-4fd448ce5935.png)
　3\. 終わり！

# 気づき事項
- すでに作ってあるプロジェクトをオープンするときは、あらかじめターゲットの電源をONしてwindowsに認識させておくこと。
ONしていない場合、起動が中途半端になる。
- 安定化電源装置のCCは適切な値にしておくこと。
エンジニアリングマネージャーって何やるの？

# はじめに

エンジニアリングマネージャー（EM）という役職を耳にすることが増えていますが、具体的にどのような仕事をしているのかイメージしづらい方も多いのではないでしょうか？この記事では、エンジニアリングマネージャーの役割や日々の業務内容について、より詳細に紹介します。

---

## エンジニアリングマネージャーとは？

エンジニアリングマネージャーは、エンジニアチームを率いるリーダーとして、技術的な側面と人材マネジメントの両方を担う役職です。プロジェクトの成功とチームメンバーの成長を同時にサポートすることが求められます。

### 主な役割
1. **チームビルディングとマネジメント**  
   - **採用活動**: チームに適した人材を見つけ、面接や選考を行います。
   - **オンボーディング**: 新しいメンバーがスムーズに業務に適応できるよう支援します。
   - **メンバーの育成**: 1on1ミーティングを通じて、個々のキャリア開発やスキル向上をサポートします。
   - **パフォーマンス評価とフィードバック**: 定期的な評価を行い、建設的なフィードバックを提供します。

2. **プロジェクトマネジメント**  
   - **プロジェクトの計画**: 目標設定、スケジュール作成、リソース配分を行います。
   - **進捗管理**: タスクの進行状況を追跡し、遅延や問題が発生した場合に対策を講じます。
   - **リスク管理**: 潜在的なリスクを特定し、予防策を立てます。
   - **ステークホルダーとの調整**: 他部署やクライアントと連携し、期待値を調整します。

3. **技術的リーダーシップ**  
   - **技術選定**: プロジェクトに最適な技術スタックを選定します。
   - **アーキテクチャ設計**: システムの構造や設計方針を策定します。
   - **コードレビュー**: コードの品質を保つためにレビューを行い、ベストプラクティスを推進します。
   - **技術的な問題解決**: 複雑な技術課題に対して解決策を提供します。

---

## 具体的な1日の業務内容

エンジニアリングマネージャーの1日は多岐にわたる業務で構成されています。以下は典型的な1日の流れです。

1. **朝のスタンドアップミーティング（9:00 AM）**  
   チームの進捗状況を確認し、各メンバーが直面している課題や障害を共有します。これにより、迅速な問題解決とチーム内の透明性が保たれます。

2. **1on1ミーティング（10:00 AM - 12:00 PM）**  
   各メンバーと個別に話し合い、キャリアパスや現在の業務に関する課題を深掘りします。メンバーのモチベーション維持や成長支援のための重要な時間です。

3. **プロジェクトの進捗確認と調整（1:00 PM）**  
   プロジェクト管理ツール（例: Jira, Trello）を使ってタスクの進捗を確認し、遅延が発生している場合は原因を特定します。必要に応じてタスクの優先順位を変更し、リソースの再配分を行います。

4. **技術的なディスカッションやレビュー（2:00 PM）**  
   チームのシニアエンジニアと技術課題についてディスカッションを行い、解決策を模索します。また、コードレビューに参加して、コードの品質向上とベストプラクティスの共有を行います。

5. **ステークホルダーとの打ち合わせ（4:00 PM）**  
   プロダクトマネージャーや他部門のリーダーと会議を行い、プロジェクトの進捗状況や次のステップについて調整します。ビジネス側の要求と技術側の実現可能性をバランスよく調整することが求められます。

6. **自己学習と戦略立案（5:00 PM以降）**  
   業務終了後には、最新技術のトレンドを学び、チームやプロジェクトの長期的な戦略を考える時間を取ります。

---

## 必要なスキルと資質

エンジニアリングマネージャーとして成功するためには、以下のようなスキルと資質が求められます。

1. **コミュニケーション能力**  
   チーム内外で効果的に情報を伝え、問題解決に向けた調整を行う力。特に、技術的な内容を非技術者にもわかりやすく説明するスキルが重要です。

2. **リーダーシップ**  
   チームを鼓舞し、個々のメンバーが最大限のパフォーマンスを発揮できるようサポートする能力。困難な状況でも冷静に対応し、前向きな雰囲気を作ることが求められます。

3. **技術的知識**  
   深い技術理解と問題解決能力。全ての技術領域に精通している必要はありませんが、チームの技術課題を理解し、適切なアドバイスができるレベルの知識が必要です。

4. **プロジェクト管理能力**  
   スケジュール管理、リスク管理、リソース配分のスキル。複数のプロジェクトを並行して管理する能力も重要です。

5. **適応力と柔軟性**  
   変化するビジネスニーズや技術トレンドに迅速に対応できる柔軟性。新しいチャレンジにも前向きに取り組む姿勢が求められます。

---

## まとめ

エンジニアリングマネージャーは、技術力だけでなく、チームのマネジメントやプロジェクトの推進力も必要とされる重要な役職です。技術と人の両方に情熱を持つ方にとって、やりがいのあるポジションと言えるでしょう。

エンジニアリングマネージャーを目指す方は、まずは自身のコミュニケーションスキルやリーダーシップ能力を磨きつつ、実際のプロジェクト管理やチームマネジメントの経験を積むことが重要です。最終的には、技術的な視点と人間的な視点をバランスよく活用し、チームとプロジェクトの両方を成功に導くことが求められます。

---

この記事がエンジニアリングマネージャーという役職の理解を深める一助となれば幸いです。質問やフィードバックがあれば、ぜひコメントでお知らせください！
GitLabでプッシュが上手くいかない時

# 競合が起きてプッシュ出来ない時の強引な解決方法
保護されたブランチに設定されていると、
ローカルのブランチをリモートに強制プッシュするコマンドが使えないので、
GitLabのリポジトリの設定から保護の設定を解除しｙ

![スクリーンショット 2025-02-06 18.46.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/8f1bdafc-955b-c4bf-7942-88d4b4731df9.png)

### ローカルのブランチをリモートに強制プッシュするコマンド
```
git push origin main --force
```
テストデータを作成する際に注意したいこと

- 対象のモデルのバリデーションを確実に把握する
- テストデータを作る際だけバリデーションを無視できる設定がされている可能性がある
    - 例えば以下のように書くと、rsepcでテストデータを作成する場合、ルールが無視される
    - `validate :name, unless: -> { validation_context == :fixture }`
- travel_to, let!, before などの記述順を正しく把握する事
- 実運用でSQLからデータを登録していたとしても、アプリケーションから操作する際は、モデルのバリデーションを通るので、真っ先にモデルのバリデーションを調べにいくこと

# tips

- 要件によっては、updateで更新するだけじゃなくて、destroy!で消しちゃう手もある
    - 既存のデータを使い回す際に、データをdisabledにしなくて、消しちゃっても問題ないケースもある
- 複数のデータの場合はどうなるのか？の観点は大事。単数と複数で大丈夫か確認した方が良い
- デバッカーは色んな場所に仕込めるので工夫すると良い
    - 例えば、expectの前に仕込んで、subjectを実行する前と後を調べる
    - その処理の中で呼ばれるメソッドの中で仕込んで、途中のデータがどうなっているか調べる

など
C#のURLエンコード: EscapeDataStringとEscapeUriStringの違い


C#でURLのエンコードを行う際に、`Uri.EscapeDataString`と`Uri.EscapeUriString`のどちらを使うべきか迷ったことはありませんか？

最近、リンクをエンコードする処理を実装する際に、`Uri.EscapeDataString`ではうまくエンコードできず、`Uri.EscapeUriString`を使用したところ期待どおりの結果が得られた、という経験をしました。

本記事では、その詳細と、なぜこのような違いが発生するのかを解説します。

---

### 1. `EscapeDataString`と`EscapeUriString`の基本的な違い

`Uri.EscapeDataString`と`Uri.EscapeUriString`は、どちらもURLエンコードを行うメソッドですが、それぞれの用途とエンコードの挙動が異なります。

#### **1.1 `Uri.EscapeDataString`**
- クエリパラメータやデータの一部をエンコードするのに適している
- 予約文字（`:/?#[]@!$&'()*+,;=`）をエンコードする
- `+` や `/` もエンコードされるため、URL全体のエンコードには不向き

```csharp
string encoded = Uri.EscapeDataString("https://example.com/search?q=C# .NET");
Console.WriteLine(encoded);
```
**出力:**
```
https%3A%2F%2Fexample.com%2Fsearch%3Fq%3DC%23%20.NET
```

#### **1.2 `Uri.EscapeUriString`**
- URI全体をエンコードするのに適している
- 予約文字の一部（`:/?#[]@!$&'()*+,;=`）はそのまま維持される
- `/` や `:` などの区切り文字はエンコードされない

```csharp
string encoded = Uri.EscapeUriString("https://example.com/search?q=C# .NET");
Console.WriteLine(encoded);
```
**出力:**
```
https://example.com/search?q=C#%20.NET
```

---

### 2. なぜ`EscapeDataString`だとうまくエンコードできなかったのか？

今回のケースでは、リンクをエンコードする処理で `Uri.EscapeDataString` を使用しました。
しかし、エンコード結果が期待どおりにならず、意図しないURLになってしまいました。

#### **2.1 `EscapeDataString`の問題点**
- URL全体をエンコードしてしまうため、`:` や `/` などの区切り文字もエンコードされる
- その結果、ブラウザなどで適切に解釈されなくなる

例えば、以下のようなケースです。

```csharp
string url = "https://example.com/search?q=C# .NET";
string encoded = Uri.EscapeDataString(url);
Console.WriteLine(encoded);
```
**出力:**
```
https%3A%2F%2Fexample.com%2Fsearch%3Fq%3DC%23%20.NET
```

このように、スラッシュ（`/`）やコロン（`:`）までエンコードされてしまい、リンクとして適切に機能しませんでした。

---

### 3. 解決策: `EscapeUriString`を使用する

URL全体をエンコードする場合は、`Uri.EscapeUriString`を使用することで、
適切にエンコードされたURLを得ることができます。

```csharp
string url = "https://example.com/search?q=C# .NET";
string encoded = Uri.EscapeUriString(url);
Console.WriteLine(encoded);
```
**出力:**
```
https://example.com/search?q=C#%20.NET
```

この方法を使用することで、
- `/` や `:` などの区切り文字が保持される
- クエリパラメータのスペースや特殊文字のみエンコードされる

結果として、正しいURLが生成されるようになりました。

---

### 4. まとめ

- **`Uri.EscapeDataString`** は、データ部分のエンコード向き。URL全体のエンコードには不向き。
- **`Uri.EscapeUriString`** は、URL全体をエンコードする場合に適している。
- URLエンコードを行う際は、用途に応じて適切なメソッドを選ぶことが重要。

今回のケースでは、リンクをエンコードする用途において、`EscapeUriString`の方が適していました。

URLのエンコード処理で同じような問題に遭遇した方の参考になれば幸いです！
【Git】gitコマンドで特定のスタッシュを削除する

## 状況
普段はSourceTree使いなのですが、でかい差分のスタッシュを削除しようとしたメモリが足らずにSourceTreeがフリーズしてしまいました。
そんなわけで仕方なくコマンドでスタッシュを削除することにしました。

## やり方
### まずはリスト確認
```
git stash list
```
を実行すると
```
stash@{0}: On ブランチ名: スタッシュ名
stash@{1}: ...
stash@{2}: ...
...
```
このように一覧を確認できます。

### いよいよ削除（ご安全に）
続いて
```
git stash drop 'stash@{1}'
```
を実行すると番号1が振られたスタッシュが削除されます。

## 補足
ネットで調べると`git stash drop stash@{1}`が出てくるんですけど、これだと`error: unknown switch 'e'`が出てダメでした。シングルクオーテーションで囲むと通ります。
Xcodeアプリのアイコン作成方法と、アプリ名の変更方法

# アイコンの作成方法

[参考にしたURL](https://cacoo.com/ja/blog/how-to-create-app-icons-easily-with-cacoo/#i-3 "参考にしたURL")

[アイコン作成してくれるWebページのリンク](https://appiconmaker.co/ "アイコン作成ページ")

最後はAssets開いて、AppIconに画像サイズの合う画像をドロップ

![アイコン設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/aa064e2c-a6ea-640d-aa89-2233553a03f0.png)



### ※アイコンにする画像は https://appiconmaker.co/ にドラッグする前にサイズが幅と高さ等しくないといけないので注意

# アプリ名の変更方法
[参考URL](https://qiita.com/temoki/items/fc3b62bc088f96184f8f "参考URL")
プロジェクトをクリックして表示されるプロジェクト設定画面で、TARGETSを選択

![アプリ名の変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957418/da783af7-df29-5cbc-464f-54e519da13ee.png)
[Ruby] 波ダッシュ・全角チルダについてのメモ

## この記事は？

- 波ダッシュ (Wave Dash) と全角チルダ (Fullwidth Tilde) について調べた際のメモ書きです。
- 調査用のコードは Ruby で文字について調査する時に役立つかもしれません。

## 波ダッシュと全角チルダ

| 文字 | 名前 | Unicode<br>コードポイント | UTF-8 | Shift_JIS | CP932<br>(Windows-31J) | 
|--|--|--|--|--|--|
| 〜 | Wave Dash | [U+301C](https://www.compart.com/en/unicode/U+301C) | 0xE3 0x80 0x9C | 0x81 0x60 | - | 
| ～ | Fullwidth Tilde | [U+FF5E](https://www.compart.com/en/unicode/U+FF5E) | 0xEF 0xBD 0x9E | - | 0x81 0x60 |

- 僕の macOS の環境では、キーボードの日本語入力で "〜" キーを打って入力できるのは Wave Dash の方。
- [JIS X 0208](https://ja.wikipedia.org/wiki/JIS_X_0208) 1 区 33 点 ([JIS X 0213](https://ja.wikipedia.org/wiki/JIS_X_0213) 1 面 1 区 33 点) にある文字 "〜" を Unicode に変換する際に U+301C になる場合と U+FF5E になる場合があることに起因するのが、いわゆる「波ダッシュ・全角チルダ問題」。 

## 調査用コード

### U+301C という形式の文字列を、そのコードポイントに該当する文字に変換する

```rb
def codepoint_to_char(codepoint) = codepoint.delete_prefix('U+').to_i(16).chr(Encoding::UTF_8)

wave_dash = codepoint_to_char('U+301C')
#=> "〜"
fullwidth_tilde = codepoint_to_char('U+FF5E')
#=> "～"
```

### 文字を U+301C という形式の文字列に変換する

```rb
def char_to_codepoint(char) = 'U+%04X' % char.ord

wave_dash = '〜'
char_to_codepoint(wave_dash)
#=> "U+301C"

fullwidth_tilde = '～'
char_to_codepoint(fullwidth_tilde)
#=> "U+FF5E"
```

### 文字を任意の文字コードに変換し、さらに 0xE3 0x80 0x9C という形式のバイト列を表す文字列に変換する

```rb
def str_to_byte_sequence(str) = str.unpack('C*').map { '0x%02X' % it }.join(' ')

# Encoding::SJIS は Encoding::CP932, Encoding::Windows_31J と等価。
Encoding::SJIS == Encoding::SHIFT_JIS
#=> false
Encoding::SJIS == Encoding::CP932
#=> true
Encoding::SJIS == Encoding::Windows_31J
#=> true

# Wave Dash は Shift_JIS には変換できるが CP932 には変換できない。
wave_dash = '〜'
str_to_byte_sequence(wave_dash)
#=> "0xE3 0x80 0x9C"
str_to_byte_sequence(wave_dash.encode(Encoding::Shift_JIS))
#=> "0x81 0x60"
str_to_byte_sequence(wave_dash.encode(Encoding::SJIS))
# 'String#encode': U+301C from UTF-8 to Windows-31J (Encoding::UndefinedConversionError)

# Fullwidth Tilde は CP932 には変換できるが Shift_JIS には変換できない。
fullwidth_tilde = '～'
str_to_byte_sequence(fullwidth_tilde)
#=> "0xEF 0xBD 0x9E"
str_to_byte_sequence(fullwidth_tilde.encode(Encoding::Shift_JIS))
# 'String#encode': U+FF5E from UTF-8 to Shift_JIS (Encoding::UndefinedConversionError)
str_to_byte_sequence(fullwidth_tilde.encode(Encoding::SJIS))
#=> "0x81 0x60"
```

- UFT-8 から Shift_JIS や CP932 に変換する際は、変換可能な文字に置換することで変換エラーを避ける。例えば、Wave Dash を含む文字列を CP932 に変換する際は、事前に Wave Dash を Fullwidth Tilde に置換しておく。

| 文字 (名前) | Unicode<br>コードポイント | UTF-8 → Shift_JIS | UTF-8 → CP932 | 
|--|--|--|--|
| 〜 (Wave Dash) | U+301C | ◯ | ✕ | 
| ～ (Fullwidth Tilde) | U+FF5E | ✕ | ◯ |

## 参考

- [波ダッシュ・全角チルダ問題 - とほほのWWW入門](https://www.tohoho-web.com/ex/dash-tilde.html)
- [いまさら聞けない！波ダッシュと全角チルダ問題についてまとめてみた - Secret Garden(Instrumental)](https://secret-garden.hatenablog.com/entry/2022/05/11/212649)
- [[Ruby][Python] 任意の文字を Unicode コードポイント (U+1234 という形式) に変換する #Python - Qiita](https://qiita.com/QUANON/items/53b9558038ad368eee62)
AIの検索結果を統合してレポートを自動生成するツール：Ithy

最近、中国のSNSで「Ithy」という非常に便利なAIツールがシェアされているのを見かけました。
公式サイトはこちら： 

https://ithy.com/

使い方はとても簡単で、ログイン後に質問を投げるだけ。すると複数のAIが同時に検索と回答生成を行ってくれます。たとえば「what is the biggest breakthrouhg of deepseek r1（Deepseek R1の最大のブレイクスルーは何か）」という質問をしてみたところ、下記のように4つのモデル（Google AI Search、DeepseekR1、Claude3.5、o3-mini）—いずれも現時点で非常に強力な有料モデル—がそれぞれ回答を生成してくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/53a8e1f9-e6bc-d8fb-5271-ea9e28c26cd9.png)

これらのモデルが回答を生成し終わると、Ithyは自動的に各回答を集約・レビューし、最終的に一つのレポートとしてまとめます。下の図は、この“内部統合”の際の処理イメージです。簡単的に説明すると、各モデルがそれぞれ回答を生成し、その後お互いの回答を見比べてレビューし、最後にサマリーを作るという手順になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/f40cd0cf-9480-9ffd-8d64-cf34e1b6d285.png)

実際に出来上がった記事が⇩です。タイトルだけ見ても、Deepseek R1が今回最も注目されるポイント—<strong>「大規模モデルに強化学習をうまく適用し、大規模トレーニングに成功した」</strong>という点—を的確に捉えています。過去には強化学習を大規模モデルに実装して本格的にトレーニングしたケースはほとんどなかったので、これは大きなブレイクスルーだと考えられますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/8d24d661-8db0-9006-b869-567b4c42ebb4.png)

さらにOpenAIの「OpenAI-o1」との比較も、以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/daf565be-0d9a-d29e-13b9-dc99f7b312ba.png)

調査レポートとしては既に十分な完成度だと思います。細かい部分の修正は必要かもしれませんが、初期出力としては非常に高いクオリティです。

レポートの詳細は以下で確認できます（生成したレポートはURLをシェアできるのも便利なポイントです）：

https://ithy.com/article/deepseek-r1-breakthrough-8ncpugs7

そして生成結果の精度に関しては、Mediumでも説明する記事もあります。Googleが公開したLLMの精度を評価するベンチマーク（GPQA）を用いてテストしたところ、複数LLMの回答を統合したIthyの正解率は、単独のLLMを使用した場合よりも高く、さらには人間の博士レベルの回答をも上回るという結果が得られたそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/00dfddd6-b348-6bfb-7fe1-490458cb1484.png)


興味ある方:

https://medium.com/@winson.luk/what-happens-when-you-combine-deepseek-r1-with-openai-o1-6a89a315ab43
.gitignore にとりあえずこれ入れとけ

適当だがとりあえずこの辺入れておけばOKなのでは
随時チームの方針やPJ要件に合わせて好きに変えてください

```gitignore
# ---- 基本的なPython関連 ----
# Pythonが生成するキャッシュや一時ファイル
__pycache__/
*.pyc
*.pyo
*.pyd

# pipでインストールされるパッケージ
venv/
env/
.venv/

# Jupyter Notebookのチェックポイント
.ipynb_checkpoints/

# ---- Web開発特有の設定 ----
# 環境変数や秘密情報
.env
.env.local
config.json  # 設定ファイル（必要なら手動管理）

# ログファイル
logs/
*.log
*.out

# ---- フレームワークごとの設定 ----
# FlaskやDjangoのマイグレーションファイル（DBの変更管理）
*.sqlite3
db.sqlite3
migrations/
instance/

# Djangoのメディアや静的ファイル
staticfiles/
media/

# ---- ビルド & デプロイ関連 ----
# Pythonパッケージ化時のビルドファイル
dist/
build/
*.egg-info/

# ---- IDE & エディタの設定 ----
# VS Code
.vscode/

# JetBrains系（PyCharm, IntelliJ）
.idea/

# OS依存ファイル
.DS_Store
Thumbs.db
```



## **ざっくり解説**
1. **Python関連**
   - `__pycache__/` や `*.pyc` などの**不要なキャッシュファイル**はリポジトリに含めない。
   - `venv/` や `.venv/` などの**仮想環境フォルダ**もGitに入れない（`requirements.txt` や `Pipfile` で管理）。

2. **Web開発関連**
   - `.env` は**環境変数（APIキーなど）** を含むのでGitに含めない。
   - `config.json` など設定ファイルも**手動で管理**する場合は `.gitignore` しておく。

3. **Django / Flask**
   - `migrations/` や `db.sqlite3` などの**ローカルDBはGitに含めない**。
   - `staticfiles/` や `media/` は **ローカル開発中の一時的な静的ファイル** なので不要。

4. **ビルド & デプロイ**
   - `dist/` や `build/` は**ビルド成果物**なので無視する。

5. **エディタ & OS関連**
   - `*.DS_Store`（macOS）や `Thumbs.db`（Windows）は不要なので除外。
   - `.vscode/` や `.idea/`（PyCharmなどの設定）は**個人の開発環境による**ので、含めない方がいい。

---

### とりあえずこれでOK！？
この `.gitignore` を入れておけば、（特にPythonでWeb開発するには）**余計なファイルをGitに含めず、管理がスッキリする**。
実際のプロジェクトごとにカスタマイズするべきだが、とりあえずこれを入れておけば困らないはず。

ご意見あればご教授ください