OmniAICreator/Qiita-1.07M huggingface dataset:
AIコーディングで作業を効率化！自動化ツールの選び方と活用法

## 1. はじめに
AIコーディングは、プログラミングの作業を効率化するために人工知能を活用する技術です。近年、AI技術が進化する中で、コードの自動生成や修正をサポートするツールが多く登場しており、開発者にとっての重要な支援となっています。この記事では、AIコーディングの概要から、自動化の方法、ツール、おすすめの選択肢までを紹介します。

## 2. AIコーディング自動化
AI技術の進歩により、従来は専門知識が必要であったコーディング作業は自動化できるようになりました。
AIコーディングの自動化とは、AIがプログラムコードを生成したり、エラーを修正したりするプロセスです。この技術により、手動でのコーディング作業を減らし、開発スピードの向上が可能になります。自動化されたAIは、エラーの検出や、コードの補完、さらにはコードレビューの自動化など、開発者にとって非常に役立つ機能を提供します。

### 自動化のメリット
開発時間の短縮: 自動化ツールを使用することで、手動でのコーディングや修正作業を減らすことができ、より迅速に開発が進みます。
エラーの減少: コードを自動で生成するAIは、誤ったコードや効率的でないコードを修正してくれます。
学習コストの削減: AIがプログラミングの標準的なパターンを提案するため、初心者でも効率的にコーディングを学ぶことができます。
## 3. AIコーディングツール
AIを使ったコーディングツールにはさまざまなものがあります。代表的なものをいくつか紹介します。

1、GitHub Copilot
GitHub Copilotは、AIがコードを自動的に補完し、コードスニペットを提案するツールです。開発者は、コメントやコードの一部を入力するだけで、AIが最適なコードを提案してくれます。特に効率的なコーディングが可能となります。
「公式サイト」（https://azure.microsoft.com/ja-jp/products/github/copilot）

２、Tabnine
Tabnineは、機械学習を活用したコード補完ツールです。AIが過去のコードパターンを学習し、それに基づいてコード補完を提供します。コードを書く手助けをしてくれるだけでなく、エラーを未然に防ぐ提案もしてくれます。

３，Kite
Kiteは、AIによるコード補完と共に、PythonやJavaScript、Goなどさまざまなプログラミング言語に対応しています。リアルタイムでコードの提案を行い、プログラマーの生産性を向上させるツールです。

## 4. AIコーディングでHTMLを生成する
AIコーディングを使うと、HTMLのようなマークアップ言語も自動で生成できます。例えば、GitHub CopilotやTabnineを使うと、簡単なHTMLコードを生成したり、必要なタグを提案したりすることができます。これにより、HTMLの記述にかかる時間が大幅に削減され、効率的なWeb開発が可能になります。

実例: 簡単なHTMLコードをAIで生成
```html
复制
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>AI Generated Page</title>
</head>
<body>
  <h1>Welcome to the AI Generated Page</h1>
  <p>This page was generated with the help of AI tools like GitHub Copilot!</p>
</body>
</html>
```

## 5. AIコーディングの無料ツール
AIコーディングを活用するためのツールは、有料だけでなく無料でも利用できるものがあります。以下のツールは、無料で提供されており、試してみる価値があります。

１，Visual Studio Code + AI拡張機能
Visual Studio Code（VSCode）は無料で使える人気のコードエディタで、AI補完をサポートする拡張機能が豊富です。特に「Tabnine」や「Kite」をインストールすると、リアルタイムでコード補完の提案を受けることができます。

２，OpenAI GPT-3によるツール
OpenAIのGPT-3を使ったコード補完ツールも無料プランで提供されています。GitHub Copilotのように、コードの生成をサポートしてくれる便利なツールです。

## 6. AIコーディングツールのおすすめ

 AIコーディングツールを選ぶ際のポイントとしては、使用するプログラミング言語のサポート範囲、価格、ユーザビリティなどが挙げられます。初心者には、GitHub CopilotやTabnineが特におすすめです。これらは設定も簡単で、すぐにコーディング作業を効率化するために使えます。

 ## 7. AIコーディングツールの比較
| ツール | 対応言語 | 主な特徴 | 価格 |
|:-:|:-:|:-:|:-:|
| GitHub Copilot  | Python, JavaScript, TypeScript, Ruby, Go  |コード補完、関数提案、リアルタイム補助  | 月額約$10  |
| Tabnine  | Python, Java, JavaScript, Go, C++  |  コード補完、エラー予測、オフライン機能 | 無料（有料プランあり）  |
| Kite  | Python, JavaScript, Go, Ruby  |  コード補完、関数提案、エラー警告 | 無料（有料プランあり）  |



## 8. AIコーディングの未来
AIコーディングは今後さらに進化し、より高度な自動化が進むと予想されます。AIはコードの生成だけでなく、デバッグやリファクタリングなどの作業も支援するようになるでしょう。また、AIと人間の共同作業が進むことで、開発者は創造的な作業により多くの時間を割くことができるようになります。

##  9. まとめ
AIコーディングツールは、プログラマーにとって強力な味方となります。コードの生成を効率化し、エラーの検出や補完をサポートしてくれるこれらのツールは、今後の開発環境に欠かせない存在となるでしょう。初心者から経験者まで、幅広いユーザーにとって有益なツールを選ぶことが大切です。AIを駆使して、より早く、効率的に、そして高品質なコードを作成しましょう。


## おすすめなAIツール

https://ai.tencho-ex.com/
生成AIの歴史をまとめてみました。

生成AIの歴史をまとめてみました。

---

## 第一次AIブーム（1950年代後半～1960年代）

第一次AIブームは、人類が初めてコンピューターに「知性」を与えようと試みた時期です。この頃のAIは主に「記号処理」と呼ばれる方法で、人間の思考プロセスをコンピューター上で再現することを目指しました。

### 主な出来事
- **1956年：ダートマス会議**で初めて「人工知能（Artificial Intelligence、AI）」という言葉が登場。
- チェスや迷路の攻略プログラムが開発される。

しかし、この時代のAIは「推論」や「探索」を行うものの、現実世界の複雑さを処理できず、限界を迎えました。1960年代末にはAI研究は一時的に下火になりました。

---

## 第二次AIブーム（1980年代）

第二次AIブームは、1980年代にコンピューターの性能向上に伴い再び盛り上がりました。この時期は「エキスパートシステム」という専門知識をルールベースで記述する技術が中心でした。

### 主な特徴と応用例
- 人間の専門家の判断をルール化する（例：「もしAならばB」）。
- 医療診断システム、金融アドバイス、製造業などに実際に導入された。

しかし、ルールの数が増えるほど管理が複雑になり、ルール同士の衝突が起こり、メンテナンスが困難になりました。これにより、大規模なエキスパートシステムの実現が難しくなり、ブームは再び沈静化しました。

---

## 第三次AIブーム（2010年代）

2010年代に入り、大きな技術革新が起こりました。それが「機械学習（Machine Learning）」、特に「深層学習（Deep Learning）」の登場です。深層学習は人間の脳の神経細胞（ニューロン）の働きを模倣したニューラルネットワークを基盤としています。

### 深層学習の発展
- **2012年：画像認識コンテスト（ILSVRC）で深層学習が飛躍的な精度向上を実現。**
- 画像認識、音声認識、自然言語処理（翻訳・要約）で実用化が急速に進む。
- スマートフォンの音声アシスタント、自動運転技術などが普及。

また、この時代はインターネットやスマートフォンの普及に伴い、「ビッグデータ」と呼ばれる大量のデータが蓄積され、AIが学習するための環境が整ったことも特徴です。

---

## 第四次AIブーム（2020年代～現在）

現在の第四次AIブームは、「生成AI（Generative AI）」が主役です。生成AIは、自らコンテンツ（画像、文章、音楽、映像）を創造する能力を持ち、人間の創造性をサポートする革新的な技術です。

### 主な生成AIの技術
- **GPT（Generative Pre-trained Transformer）**：文章や会話を生成する大規模言語モデル（例：ChatGPT）。
- **Stable Diffusion、DALL·E**：与えられた文章からリアルな画像やイラストを生成。

生成AIの登場により、記事作成、デザイン、音楽制作などクリエイティブな領域が大きく進化しています。

### 課題と議論
- AIが生成する内容のファクトチェック（正確性の確認）。
- 著作権や倫理的な問題への対応。

社会的、法的な議論も活発化しており、技術的な進歩だけでなく、AIが社会に与える影響についても広く注目されています。

---

## AIの歴史のまとめと展望

AIの歴史は次の4つの段階を経て発展しています。

- **第一次ブーム**：「記号やルールを用いた推論・探索」
- **第二次ブーム**：「専門知識をルール化したエキスパートシステム」
- **第三次ブーム**：「深層学習によるデータ活用・パターン認識」
- **第四次ブーム**：「生成AIによる新しいコンテンツ創造」
40代事務職VPSを借りてWebサイト公開が大変だった話

レンタルサーバを借りてWebサイトを借りてPythonの簡単なサイトを公開したけど、MySQLを使いたいしPythonのFlaskやいろんなパッケージをインストールして使うにはVPSのほうが簡単だと思ったのでVPSをレンタルした
そしてWebサイトをレンタルサーバからVPSに移管して作り直した
めちゃくちゃめんどくさかった

## Linux全然使ったことないから本番環境で試せばいいのでは？
ボタンをポチポチするだけで、LinuxのインストールやWordpressなど目的のインストールしてくれるサービスがあったので特にそこは問題なかった

Ubuntuを入れた

PCで作ったPythonファイルをローカルの開発環境のLinuxでテストして動いても本番で動かないとストレスがたまるので、最初から本番環境でLinuxの設定すればいいじゃんと思ったんだ

Root権限利用不可とかファイアーウォールの設定とかパスワードログイン禁止などもろもろ基本的なことやったりした

## 調べるとDockercomposeでNginxとかDBなどの設定をやると楽らしいこれが罠だった
Dockerなんて使ったことないけど、使ったほうが楽ならいいじゃんって思ったこれが大失敗だった。うまくいかない全くうまくいかない。

結局VPSのLinuxを全部削除して最新ストールを20回ぐらいやった
Httpでは公開できたけどSSLがだめだった

確かに便利なんだよね Docker-compose すごいいいと思った。何度も何度もやったから使い方はわかったけど、結局最後のSSLができなかったから
あきらめた

## 普通にNginxとMySQLをインストールしてgunicornとpythonをvenvで構築してFlaskサイト公開
これがめっちゃ楽だった。1週間かからずサイトの公開ができた。

だれだよDocker-composeが楽だとか言ったやつは

いや実は複数のサイトを運営するにはDockerのほうが楽かなって思ったのだけど、nginxを設定すれば固定IPでも簡単に複数ドメイン公開できるんだね

 
## Ubuntuのバージョンをアップロードしたらサイトにアクセスできんなくなった
Ubuntuのバージョンアップ以外何もしてないのにサイトにアクセスできなくなった

まじかなんでよって思って、しょうがないから全部アンインストールしてまたLinuxを再インストールして何度も試すけどやっぱりだめだった

調べたらUbuntuの24からポートの開放方法が変わってた
マジかよ こういうのってどうやって見つけるの？
個人だから全部やり直しできるけど普通に企業サイトだったらできないじゃん。どうやってポートが閉じたって判別するの？だってUbuntuのバージョンアップ以外何もしてないんだよ

マジで詳しい人どうやって調べるか教えてほしい

## 最初からDocker-composeを使わなければ1週間でできてたと思う
いろいろ技術を使うと、どんどん複雑になっていくことが分かった。
個人的には最初は無理せず簡単にできることからやってあとから個別にいれてやればいいかなって思ったんだよね。
順番が真逆だったね あとからDockerを使ったほうが楽だったんだ

正直Docker-composeで作ろうとして2か月ぐらい使ったと思う。ひたすらLinuxを再インストールしていろんなエラー倒してそれで最終的にHTTPでは公開できたから。これもいい経験だ

逆に考えると、LinuxにMySQLとnginxインストールして、venvでPythonとflaskとgunicornがめちゃくちゃ楽に感じた。

たしかに簡単にはできたけど、すごい大変な思いをした2か月あきらめないでHttpでサイト公開できたのはうれしかった。初心者だし、誰かに迷惑かけないし、個人開発なので締め切りはないしいろんなツールを使ったり経験するのは無駄じゃなかったと思う

とりあえずLinuxでwebサーバ立てられるようになったのが感動した

あちなみにこちらが作ったサイトです

話題のテック 自動更新サイトです
https://wadainotech.com/

Webデザインには興味ないけどサーバサイドは面白い
サイトの負荷が増えている！カタカタターン！ふぅ落ちないように設定したぜってやりたい

サイトをDB化したからあとでデータ分析もできるしちょっと楽しみ

スキルアップしてクラウドワークスなどで簡単なお仕事をもらえるようになりたい
ご連絡お待ちしております

https://x.com/usagipycom
PHPからWindowsAPIを呼び出してみる

## はじめに

PHPからWindowsAPIを呼び出すことはできるのだろうか？と、たまたま気になったので調べてみると
[PHP FFI(Foreign Function Interface)](https://www.php.net/manual/ja/class.ffi.php)で呼び出せるそうです

FFIのマニュアルのサンプルを確認すると、
[Basic FFI usage](https://www.php.net/manual/ja/ffi.examples-basic.php)

* FFI::cdef()で、関数のプロトタイプ宣言(と、ライブラリファイル名)を渡す
* $ffiオブジェクト経由で、動的に関数を呼び出すことができる
という仕組みのようです

```php
$ffi = FFI::cdef(
    "int printf(const char *format, ...);", // this is a regular C declaration
    "libc.so.6");
// call C's printf()
$ffi->printf("Hello %s!\n", "world");
```
## FFIを有効にする
(PHP8.4.4で試しています)
php.iniでffiを読み込むように変更します

```diff_php
-;extension_dir = "ext"
+extension_dir = "ext"
```

```diff_php
;extension=bz2
;extension=curl
-;extension=ffi
+extension=ffi
```


## MessageBoxを表示するサンプル

WindowsAPIを呼び出すサンプルを作ってみました~~が、呼び出し規約(stdcall)を指定できませんでした
（WindowsでFFIを使うのは、厳しそう・・・）~~
64bitプロセスであれば呼び出し規約が一本化されているので、呼び出し規約は指定できなくても問題ありません

  * **2025/05追記：Windowsの64ビットプロセスは、`__stdcall`、`__cdecl`といった呼び出し規約が`Microsoft x64 呼び出し規約`に一本化されているため、下記コードで問題なく実行ができるようです**


* WindowsAPIは文字がUFT16。そのまま文字を渡せないので`$ffi->new("unsigned short[" . <文字列のながｓ> . "]");`で配列を作ってそこへセット
* ~~呼び出し規約の指定はできなかったので、多分`__cdecl`で呼び出しされている（実行はできるが、スタックポインタがずれてエラーになる可能性がある）~~


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276579/046f1fb5-ba01-4a1b-a6b6-b0efe2f8cf3c.png)


```php
<?php
/**
 * PHPからFFIでWindowsAPI(MessageBoxW)を呼び出すサンプル
 * ・WindowsAPIはstdcall呼び出し規約に従う必要があるが、FFIで指定できない(詳細不明)
 */

$stdcall = ""; //  "__stdcall"; // 呼び出し規約を指定するとエラーになる
// MessageBoxW APIの定義
$ffi = FFI::cdef("int $stdcall MessageBoxW(void* hWnd, unsigned short* lpText, unsigned short* lpCaption, unsigned int uType);", 'user32.dll');

$hWnd = null; // 親ウィンドウハンドル無し
// 文字列をUTF16に変換
$lpText = utf16("PHPからWindowsAPI(MessageBoxW)を呼び出しました！"); // メッセージ
$lpCaption = utf16("FFI Example"); // タイトルバー
$uType = 0; // MB_OK (OKボタンのみ)

// APIの呼び出し
$result = $ffi->MessageBoxW($hWnd, $lpText, $lpCaption, $uType);

if ($result == 1) { // IDOK (OKボタンが押された場合)
    echo "MessageBoxW が表示されました。\n";
} else {
    echo "MessageBoxW の表示に失敗しました。\n";
}


/**
 * UTF16の文字列に変換
 */
function utf16(string $string): ?FFI\CData
{
    $ffi = FFI::cdef();
    $utf16le_string = iconv("UTF-8", "UTF-16BE", $string);
    $hexed_string = bin2hex($utf16le_string);
    $buffer = $ffi->new("unsigned short[" . (strlen($string) + 1) . "]");
    for ($i = 0; $i < strlen($string); $i++) {
        $buffer[$i] = hexdec(substr($hexed_string, $i * 4, 4));
    }
    return $buffer;
}

```
ImicchをProxmoxのコンテナに作成するまで

# 筆者について

```
name → Koki Teramoto
age → 18
language → ja_JP, en_US
```

# 本編

これ実は前回の記事でPostgreSQLのサーバーを建てる以前にしていた内容だったりするのですが、今週何か記事を書かないと連続バッチがなくなってしまうので泣く泣く書くことにします（）

## LXCではなくVMで

これは完全に僕の勉強不足なのですが、LXCコンテナでやるとどうやらいろいろなことが不便になってしまうことが発覚しました。というものの、ネット上の記事を漁るとどうもポート解放やら色々がややこしいとのことで、まあ僕的には直接公開ではなくLAN内はダイレクトに、外はCloudflareで公開するので全くと言っていいほど関係はないのですが、これからの拡張性のことも考えて今回はVM状に作成することにします。

## 選ばれたのは、、、Arch！

僕が今回選んだのはArch LinuxにSnapでインストールする方法でした。というのも、最初実はAlma Linuxでやったのですが、ディスクの大きさの拡張方法がわからなずめっちゃメチャにして終わってしまったので、拡張性が高いArch Linuxにしました。本来はArch Linuxのようなものは安定したサーバー運用に向いてないので避けるべきですが、まあ自分にしか影響がないということで、Arch Linuxを選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/4ffaf370-951e-4bf6-99a3-4aeeba0561e4.png)

## 下準備

Arch LinuxのVMをたてます。以下を参考にしてください（宣伝）

https://qiita.com/0_terarin_0/items/f9ab601947e9ed980bdd

次にSnapのインストールをします。

https://snapcraft.io/docs/installing-snap-on-arch-linux

```zsh
git clone https://aur.archlinux.org/snapd.git
cd snapd
makepkg -si
sudo systemctl enable --now snapd.socket
```

よし、インストール完了あとは、SnapからImmichをインストールしましょう。

https://snapcraft.io/immich-distribution

```
sudo snap install immich-distribution
```

あとはIPにアクセスしてユーザーアカウントの設定をするだけで、使えるようにはなります。

# 最後に

今回はとりあえずImmichを使えるとこまでは作りました。あとはCloudflareで外部からのアクセスをできるようにするだけですね！こっから先の記事はまたどこかで書きたいと思います。それでは！
【Python】ブール型の短絡評価

#### ブール演算子
ブール演算子は、真偽値を組み合わせるための演算子です。

|演算子|説明|
|---|---|
|x **or** y|xの真偽値判定がTrueの場合はxを返す。それ以外はyを返す。|
|x **and** y|xの真偽値判定がFalseの場合はxを返す。それ以外はyを返す。|
|**not** x|xの真偽値判定がFalseの場合はTrueを返す。それ以外はFalseを返す。|

- **or**の場合、左項(x)の真偽値判定が**True**であれば、右項(y)は評価しない。
- **and**の場合、左項(x)の真偽値判定が**False**であれば、右項(y)は評価しない。

ブール演算 --- and, or, not：

https://docs.python.org/ja/3/library/stdtypes.html#truth

### 実装例
Print文の後、Trueを返す関数とFalseを返す関数を実装
```python:python
def ret_true():
    print("Trueを返します")
    return True

def ret_false():
    print("Falseを返します")
    return False
```
1 and演算子で左項がTrueであれば、右項の真偽判定が実行される。
```python:python
ret = True and ret_false()
print(ret)
```
- 実行結果
>Falseを返します
>False

2 and演算子で左項がFalseであれば、右項の真偽判定は実行されない。
```python:python
ret = False and ret_true()
print(ret)
```
- 実行結果
>False
3 or演算子で左項がTrueであれば、右項の真偽判定は実行されない。
```python:python
ret = True or ret_false()
print(ret)
```
- 実行結果
>True
4 or演算子で左項がFalseであれば、右項の真偽判定が実行される。
```python:python
ret = False or ret_true()
print(ret)
```
- 実行結果
>Trueを返します
>True
Next.jsのApp Routerでmswでモック化した時にハマったこと

# はじめに
最近、一人チャットアプリが欲しくてNextjsを使い始めました。
フロント：Next.js、バックエンド：Spring Boot で、一旦開発。

その後、デザインを集中して直したくて、バックエンドをモック化したいなーって思い。mswを利用する際に、ハマった点を残しておきます。

# 構成
next 15.1.7
react ^19.0.0
react-dom ^19.0.0
msw ^2.7.1

# 前提
モック化したかったのは、クライアント側からのリクエストをモック化。
※ サーバ側からのリクエストのモック化ではない。

# ハマったところ

https://mswjs.io/docs/getting-started

https://mswjs.io/docs/integrations/browser

の手順をベースに進めていましたが、以下を App Routerの場合、どこに書けばよいのか。

```react
enableMocking().then(() => {
  ReactDOM.render(<App />, rootElement)
})
```

色々な記事を見ていて、以下のQiitaのおまけに記載の

https://qiita.com/mr_noppo/items/5d01088689c95c86cb36


以下のPRに辿り着く。

https://github.com/mswjs/examples/pull/101/files

の examples/with-next/app/layout.tsx

```react
export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode
}>) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <MSWProvider>{children}</MSWProvider>
      </body>
    </html>
  )
}
```
で、発見！
無事にモック化できて、快適なモックライフをまんきつ中。

# お世話になった記事
https://qiita.com/mr_noppo/items/5d01088689c95c86cb36

https://zenn.dev/kattsuuya/articles/2795cc3fa80412

https://rightcode.co.jp/blogs/47766

https://creators.bengo4.com/entry/2024/10/10/083000
重たいExcelブックを軽量化する方法

Excelブックの容量が大きくなりすぎると、メールで送信できなかったり、開くのに時間がかかったりと、不便なことが増えてしまいます。今回は、Excelブックを軽量化する方法を紹介します。

### Excelブックを軽量化する方法

#### 1. 非表示シートの確認
Excelブックには、不要な非表示シートが含まれていることがあります。これらのシートがデータを保持していると、ブックの容量が増える原因になります。
**対処方法:**
- [Alt] + [F11] でVBAエディタを開く
- 「Ctrl」 + 「G」を押して「イミディエイトウィンドウ」を表示
- 以下のコードを実行し、非表示シートをリストアップ
```vba
Sub ShowAllSheets()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        ws.Visible = xlSheetVisible
    Next ws
End Sub
```
- 不要なシートがあれば削除する

#### 2. 隠れたオブジェクトの削除
Excelでは、シート上に見えないオブジェクト（画像や図形）が大量に存在すると、ブックが重くなることがあります。

**対処方法:**
- [Ctrl] + [G] で「ジャンプ」ダイアログを開く
- 「セル選択」→「オブジェクト」を選択し、[OK] を押す
- 選択されたオブジェクトを確認し、不要なものを削除

#### 3. 最終セルの確認と修正
Excelでは、意図しないセルが最終セルとして記録されることがあります。これにより、不要な空白セルを含む範囲が広がり、ブックのサイズが大きくなります。
**対処方法:**
- [Ctrl] + [End] を押して、最終セルが適切か確認
- 不要な範囲が含まれていた場合、適切な最終セルの位置まで行と列を削除
- [Ctrl] + [S] で保存し、ブックを再起動

### その他の軽量化方法
- **ピボットテーブルのキャッシュを削除**（ピボットテーブルのパフォーマンスが低下するかも）
- **ファイル形式を変更**（.xlsb形式、,csvなどにする）

### まとめ
いろいろ書きましたが、Excelブックが重くなったとき、初手で気にすべきことは、「無駄なセルを参照していないかどうか？」な気がします。
Active Directory入門：Windows クライアントPCをActive Directory (AD) ドメインに参加させる方法

## はじめに

Active Directory (AD) にクライアントPCを参加させることで、LDAP認証を統一し、シングルサインオン（SSO）やアクセス管理を一元化できます。

本記事では、実際にADドメイン参加を行った経験をもとに、Windows クライアントPCを AD ドメインに参加させる方法を解説します。

## **1. 事前準備**
### **必要条件**
- **Windows クライアントPC**（Windows 10 / 11など）
- **Active Directory ドメインコントローラー（DC）** が稼働している
- **ドメイン管理者のアカウント情報**（例: `Administrator@corp.example.com`）
- **クライアントPCがドメインネットワークに接続済み**
- **適切なDNS設定（ドメインコントローラーのIPアドレスを指定）**

## **2. Windows クライアントPCをドメインに参加させる**

### **① [システムのプロパティ] を開く**
1. キーボードの **`Win + R`** を押して、「ファイル名を指定して実行」ダイアログを開く。
2. **`sysdm.cpl`** と入力し、「OK」をクリック。
3. 「システムのプロパティ」ウィンドウが開く。

### **② コンピューター名の変更**
1. 「コンピューター名」タブを開く。
2. 「変更」ボタンをクリック。

### **③ ドメインを設定**
1. 「所属するグループ」で「**ドメイン(D)**」を選択。
2. **ドメイン名（例: `corp.example.com`）** を入力。
3. 「OK」をクリック。

### **④ 認証情報を入力**
1. ドメイン管理者の認証情報を入力。
   - **ユーザー名:** `Administrator@corp.example.com`
   - **パスワード:** 設定した管理者パスワード
2. 「OK」をクリック。

### **⑤ ドメイン参加の完了と再起動**
1. 「ようこそ `corp.example.com` ドメインへ」というメッセージが表示される。
2. 「OK」をクリックし、PCを再起動。

## **3. ドメイン参加の確認**
再起動後、以下の手順でドメイン参加が成功したかを確認できます。

1. **ログイン画面で「その他のユーザー」を選択**
2. **ドメインユーザーでログイン**
   - ユーザー名: `corp\username` または `username@corp.example.com`
   - パスワード: ADで設定されたユーザーのパスワード
3. 正常にログインできれば、ドメイン参加成功！

## **4. トラブルシューティング**
実際にドメイン参加を行った際に、以下の問題に直面する可能性があります。

- **ネットワーク接続の確認**
  - クライアントPCが **ADドメインネットワーク** に接続されているか。
  - `ping corp.example.com` コマンドで応答があるか確認。
- **DNS設定の確認**
  - クライアントPCのDNS設定が、ドメインコントローラーのIPアドレスになっているか確認。
  - AD DSの管理ツール（`nslookup` など）で名前解決をチェック。
- **認証情報の確認**
  - 入力したユーザー名・パスワードが正しいか確認。
  - AD管理コンソール（Active Directory Users and Computers）でアカウントのロック状態や有効期限を確認。
- **Windowsのファイアウォール設定**
  - ドメインネットワークへの接続を許可しているか確認。
  - ポート `88 (Kerberos)`, `389 (LDAP)`, `445 (SMB)`, `53 (DNS)` が開いているか確認。

## **まとめ**
Windows クライアントPCを Active Directory (AD) に参加させることで、LDAP認証の統一やセキュリティ管理の強化が可能になります。

:::note warn
***本記事は、実際に設定を行った経験をもとにまとめました。***
:::

もし問題が発生した場合は、トラブルシューティングの内容を参考にしながら調査を進めてみてください！
FlutterWebでFirebaseHostingにデプロイするgithubActionを作ってみた

## yaml全文
```yaml
name: Deploy to Firebase Hosting
on:
  push:
    branches:
      - develop
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: kuhnroyal/flutter-fvm-config-action/config@v3 # FVM設定
        id: fvm-config-action
      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }}
          channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }}
          cache: true # Flutter SDKをキャッシュ
      - name: Get dependencies
        uses: actions/cache@v3
        id: pub-cache
        with:
          path: ~/.pub-cache
          key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: |
            ${{ runner.os }}-pub-
      - name: Install dependencies # 依存関係のインストール（キャッシュがない場合のみ）
        if: steps.pub-cache.outputs.cache-hit != 'true'
        run: flutter pub get
      - name: Generate localization files # ローカライズファイル生成
        run: flutter gen-l10n --no-nullable-getter
      - name: Run build_runner # build_runner実行
        run: flutter pub run build_runner build --delete-conflicting-outputs
      - name: Build Flutter (web) # 
        run: |
          flutter build web -t lib/main_develop.dart 
      - uses: FirebaseExtended/action-hosting-deploy@v0
        with:
          repoToken: ${{ secrets.GITHUB_TOKEN }}
          firebaseServiceAccount: ${{ secrets.FIREBASE_SERVICE_ACCOUNT_YOUR_PROJECT_NAME_DEVELOP }}
          channelId: live
          projectId: your-project-id
          target: your-target
```


## 使用したアクション
https://github.com/marketplace/actions/flutter-fvm-config-action

https://github.com/marketplace/actions/flutter-action

## 参考
https://zenn.dev/kobalab/articles/60c610c9ee2185
Ubuntu24.04でWindsurfをアップデートするとクラッシュする

# はじめに

Windsurfで問題が起きたのでまとめておきます

# 問題

Ubuntu24.04でWindsurfのアップデートをしました

```
$ sudo apt-get upgrade windsurf
```

するとUbuntu24.04が起動しなくなりました

https://qiita.com/Sicut_study/items/77e9d6f626bc3ab68b21

# 解決方法

windsurfを完全に消します

```
$ sudo apt purge windsurf
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get clean
$ sudo apt-get autoremove

$ sudo reboo
```

そして新しくインストールをすると上手くいきました

```
sudo apt-get upgrade windsurf
```

# おわりに
これでClaude3.7がつかえｍ
AIエージェントデザインパターン実践：シングルパスプランジェネレータ

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

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

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

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

今回は「シングルパスプランジェネレータ」パターンを実装してみる。シングルパスプランジェネレータは、ユーザーから入力された目標について複数のゴールに分解したときに、それぞれのゴールについてさらに細かい検討を行い、最終的に全体の目標に向けた計画をより詳細化することを目的とする。

## シングルパスプランジェネレータ

以下のフローチャートをもとにAIエージェントを実装した。最大６つのゴールに分解した後、それぞれのゴールを達成するためのより詳細な手順や懸念事項をさらに問い合わせ、それらをもとに最終的な回答を生成している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517503/e95dcc5b-57b4-4584-9cb8-1d1745089c68.png)

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

目標例としては、「新しい家電製品を作りたい。今まで人が行っていた家事を代替できるロボットを開発したい。」とし、計画中で各ゴールについてかなり細かな手順と懸念事項を作成することができた。
Ubuntu24.04でハイバネート出来ない場合の対応記録(NVIDIAグラボ使用)

古いWindows10PCを、OSをUbuntuに乗せ換えサブPCとして使用しているのでその記録

# 問題
Ubuntuでハイバネート出来ない

# 症状
ハイバネート状態からキー入力して復帰させようとした際に、ブラックスクリーンのまま画面に何も映らない
(電源は回復しCPUファンなどは回っている)

# 環境
|項目|値|
|:--|:--|
|OS|Ubuntu 24.04.2 LTS|
|デスクップ環境|Cinamon 6.0.4|
|Linuxカーネル|6.8.0-55-generic|
|プロセッサー|Intel Core i7-7700K|
|メモリ|31.3GiB|
|グラフィックカード|NVIDIA GTX750Ti|

# 対応

https://qiita.com/ocean_f/items/60825042f10c7f43a4af

→自分の環境では改善せず

https://qiita.com/k_uchida_____/items/e8a2fdd0f7c6bf6a5f8a

→改善し、ハイバネート出来るようになった

なお上記記事の、
```
sudo systemctl enable nvidia-hibernate.service && $ sudo systemctl enable nvidia-suspend.service
```
をそのままコピペして使用したが、実際は途中の$については不要。
(そんなん見れば分かる、と言われそうだが念のため)
アジャイルな見積もりと計画づくり スケジュールを立てる（リリース計画づくりの基本）

スクラムでチーム開発する上でのプロダクトゴールに向けたスケジュールの立て方がわからなく、書籍でそれらしきタイトルを見つけたので学習しました。

著者mike cohn 氏について


- Agile AllianceやScrum Allianceでの活動
- 有名書籍
    - [アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法](https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%81%AA%E8%A6%8B%E7%A9%8D%E3%82%8A%E3%81%A8%E8%A8%88%E7%94%BB%E3%81%A5%E3%81%8F%E3%82%8A-%E4%BE%A1%E5%80%A4%E3%81%82%E3%82%8B%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%92%E8%82%B2%E3%81%A6%E3%82%8B%E6%A6%82%E5%BF%B5%E3%81%A8%E6%8A%80%E6%B3%95-Mike-Cohn/dp/4839924023)
    - [User Stories Applied](https://www.amazon.co.jp/User-Stories-Applied-Development-Addison-Wesley/dp/0321205685)
    - [Agile Estimating and Planning](https://www.amazon.co.jp/-/en/Mike-Cohn/dp/0131479415)


# リリース計画づくりの基本
### 概要
- リリース計画とは、期間内に、チームのベロシティの範囲内でできるタスクを選択して、一覧にしたもの
- 期間が3~6ヶ月（12週〜24週）
- イテレーションは3~12回（1週間/1回〜2ヶ月/1回）

### 必要な理由
- プロダクトオーナーとチームで何をどれくらいの期間で開発するかを決断できる
- 何をいつ開発できるかをステークホルダーに伝えられる
- ただイテレーションを繰り返すのではなく、最終的な目標へ向かう道標となる

### リリース計画手順
1. 作業量の計算
    - 作業量の合計 = 予定しているイテレーションの回数 × チームのベロシティ
    - 例: 6ヶ月後に新しいプロダクトをリリースしたい。1イテレーションの長さが2週間。リリースまでに13回のイテレーションを繰り返せる。チームのベロシティを20ポイントと想定する
        - 13回のイテレーション × 20ポイント = 260ストーリーポイント
        - 260ストーリーポイントがプロジェクトでこなせる作業量となる
        - 260ポイントを超えないように選んで、それぞれに優先順位を付ける
2. 作業量に見合う分だけのストーリーを選ぶ
    - 260ポイントを超えない範囲でストーリーを選び、優先順位を決定

注意
- この時点では、担当者を割り当てず作業する順番も決めない
- 結局は、これをタスクへと分解することになる。しかし、そのタイミングは開発するイテレーションの開始時点にする

### リリース計画を始める前準備
- プロジェクトの成功と失敗を決める評価条件の把握
- スケジュール・スコープ・リソースの3つの要素それぞれの理想的な目標を提示する
    - 例「4つのテーマ（合計200ストーリーポイント）を3ヶ月で、増員することなく開発したい」
- 特に重要なのは大抵1つ
    - 多くの場合、日付か機能のいずれか
        - 日付の場合、フィーチャーは調整できる
        - フィーチャーの場合、できることが重要
        - 両方重要な場合は不明

### 見積もりについて
##### 前提、各チケットごとに見積もらなければならない。
- しかし、見積もりが必要なのは、新しいフィーチャーのうち、次のリリースに含まれそうなものだけ
- 数リリース先のような遠い将来のことまで見積もる必要はない

##### リリース日を決める
- フィーチャー手動の場合
    - リリースに必要なすべてのフィーチャーの見積もりを合計し、その値に期待されるベロシティで割る
- 日付手動の場合
    - イテレーション数に期待されるベロシティをかければ、ストーリーポイントの合計がわかる
- フィーチャーも日付も両方重要な場合
    - 本書での記載はなし

### リリース計画をどれだけ詳細にするか
リリースプランニングでどこまで詳細にするかは、あらかじめチームで話し合う必要がある
ケース
- リリース計画にあらかじめ全てのイテレーションでの開発内容を含める
- イテレーションごとの詳細は後回しにする=>こっちが一般的

メリデメ
リリース計画にあらかじめ全てのイテレーションでの開発内容を含める
- メリット: 具体的な詳細がわかる
- デメリット: 計画変更に対応しづらく、工数がかかる

イテレーションごとの詳細は後回しにする=>こっちが一般的
- メリット: 工数少なく、不確実性の多い（計画が変化しやすい）場合、柔軟性を持たせられる
- デメリット: 詳細がわからない

筆者の落とし所
- 最初の3回程度のイテレーションまではどのイテレーションにどのフィーチャーを割り振るのかを決めておく。残りはひとまとまりにしておく。付箋を使って入れ替え可能にする

### リリース計画を更新する
- リリース計画には定期的な見直しと更新が必須。イテレーション終了時点でリリース計画を見直すようにルールを定めているチームが成果を上げている
UbuntuでDify環境構築

## はじめに
Ubuntuを搭載したVPSサーバーでDifyの環境を構築します

## 環境
・サーバー: Ubuntu 24.04 LTS

## 手順
### サーバーにDockerとDockerComposeをインストール
1. Dockerの公式GPGキーを追加
    ```bash
    sudo apt-get update
    sudo apt-get install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    ```
    <br>
1. Aptソースにリポジトリを追加
    ```bash
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    ```
    <br>
1. Docker関連のパッケージをインストール
    ```bash
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    ```
    <br>
1. Hello Worldコンテナを実行してDockerが正しく動作していることを確認
    ```bash
    sudo docker run hello-world
    ```
    <br>
### Difyの設定と起動
1. Difyのリポジトリをクローン
    ```bash
    git clone https://github.com/langgenius/dify.git
    ```
    <br>
1. 環境変数の設定
    ```bash
    cd dify/docker
    cp .env.example .env
    ```
    <br>
1. Docker ComposeでDifyの起動
    ```bash
    docker compose up -d
    ```
    <br>
1. ブラウザから初期設定アクセス
    ```
    http://<サーバーのIPアドレス>/install
    ```
    <br>
1. アクセスできました
    ![スクリーンショット 2025-03-08 115819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534893/9b57e628-9a33-44da-8805-1d4178d5a189.png)

## 追記
コードブロックが「Loading...」となり、コードが記述できない状態であったため、以下を追加で実施

```bash
# ディレクトリ移動
cd dify/docker

# コンテナ停止
docker compose down

# 最新コードを取得
git pull origin main

# 最新のDockerイメージを取得
docker compose pull

# .envを最新に
cp .env.example .env

# コンテナ起動
docker compose up -d
```
はじめてのReactアプリ作成を通しての振り返り

## はじめに
JISOUに入会してからReactとJavaScriptを使った初めてのミニアプリ制作として、**ToDoアプリ**を作成しました！
こちらが作成したToDoアプリのサンプルとなります。
![画面収録 2025-03-07 21.53.44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021196/8ae9e975-2116-4a29-9d02-ff9ab13a8065.gif)

機能としては、基本的なToDoアプリに加えて
* 学習内容と学習時間を入力するとリアルタイムで文字が反映される
* 学習記録を登録するたびに合計時間が合計されていく
* 項目が何も入っていない時は「入力されていない項目です」という文字列が出力される

といった形です。


## 学んだこと
### オブジェクト付き配列からデータを取得する方法
今回の課題では今まで習った内容に加えて、「オブジェクトが含まれた配列から特定のプロパティの値を取得し、その値を合計する」といった実装が加わりました。
その際に配列からオブジェクトの値を取り出す点がかなり苦労しました。

私が試した方法としては、**一度map構文を使って特定の値の配列を変数化しておき、その変数に計算の処理をする**という方法でした。

```javascript
// studyContentとstudyTimeはそれぞれデータ取得用の変数
const newData = { title: studyContent, time: studyTime };
const newRecords = [...records, newData];

const newTime = newRecords.map((record) => {
  return record.time;
});

const newSum = newTime.reduce((current, next) => {
  return current + next;
});
```
このように処理を分けて実装することで思った通りの挙動を実現できました。


### 予期せぬエラーが出てきても一度落ち着いて原因を切り分けてみること
今回の実装を通して、いくつかConsole上で初見のエラーが出てきたことがありました。

そういった状況の中でも、まずはエラーコードを読んでみておおまかな原因を推測したり、発生したエラーコードを検索してみて原因を調べてみることでエラーを解消して進めることができました。
上記のような対処スキルはReactに限らず必要になってきそうと感じました。

## 思ったこと・気付き
### 自分の手で一つずつ機能を追加できることが楽しい
今回の課題の中ではToDoリスト本体に加えて上記のような追加機能をいくつか実装してきました。
その中で最も感じたこととして、**想定通りの仕様を実現できた瞬間はとても嬉しかったこと**、**その過程でエラーと格闘しながら試行錯誤する過程も楽しさを感じた**という点でした。

これは全てのことに共通すると思うのですが、勉強する過程では嫌々やるよりも楽しんでやった方がモチベーション維持に繋がり最終的な成果も出やすくなります。
そういった意味でReact開発を「楽しい」と思えたことは一番の収穫でした。

### レクチャーを「聞くだけ」では頭に定着しきっていなかった
このアプリを作成する前にインプットとして動画教材を視聴していました。今回作成したアプリでも動画教材で教わった内容と共通する部分がいくつか出てきます。

ですが、動画を視聴し終わった瞬間は完全に理解したと思っていても、いざコードを書こうとすると「あれ...？どう書けばいいんだっけ...？」と迷う箇所がいくつも発生しました。
 <br>
この経験を通して、学んだことはインプットの満足感で終わらせることなく**何かしらアウトプットの機会を設けることで定着度合いが深まる**ことを改めて認識できました。

## さいごに
今回の課題を通してReactでモノを作ることの達成感と楽しさを味わえました。
まだ第一歩を踏み出しただけではあるものの、二歩目を踏み出したいというモチベーションを保ったまま学習を進めていきたいと思います。

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

https://projisou.jp/
【2025年最新】JavaでのJWT認証 - 非推奨APIの変更点と安全な実装方法

## JWT の基本とトークン構造
JWT（JSON Web Token）は、ユーザー認証や情報の保持 に使われるトークン方式であり、以下の 3 つの要素で構成されます。

- ヘッダ（Header）
  - 暗号化アルゴリズム（例: HS256）
  -  トークンのタイプ（通常は "JWT"）
- ペイロード（Payload）
  - ユーザー情報（個人情報は含めない）
  - 発行時間（iat）、有効期限（exp）などのメタ情報
- 署名（Signature）

ヘッダとペイロードを 秘密鍵 で署名する
JWT は改ざん防止されるが、暗号化されていないため、ペイロードの情報は見られるところにおくと誰でもデコードして内容を見ることができる。
そのため、パスワードや個人情報を含めるのはNG！

### 推奨される JWT 生成方法

```java
// jwtsecret は base64エンコードされた秘密鍵情報
// JWT_SECRET を Base64 デコードして Key オブジェクトを作成
byte[] keyBytes = Decoders.BASE64.decode(jwtSecret);
Key key = Keys.hmacShaKeyFor(keyBytes);

String token = Jwts.builder()
                .subject(oauth2User.getName())  // ユーザー識別子
                .issuedAt(new Date())          // 発行時間
                .expiration(new Date(System.currentTimeMillis() + 86400000))  // 有効期限 1日
                .signWith(key)                 // 署名の適用（生の文字列を禁止）
                .compact();

```

:::note info
新しい Jwts.builder() の改善点
✅ signWith(key) に変更 → Base64 デコードした Key オブジェクトを必須に
✅ 生のパスワード文字列を誤って使うリスクがなくなった
✅ null の場合はプロパティを生成しないため、コンパクトなトークンが作成される
:::

### 現在は推奨されていない JWT 生成方法
emailをプロパティとしてtoken生成しているので アンチパターンでもあります
```java
String token = Jwts.builder()
                .setSubject(oauth2User.getName())
                .claim("email", email)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 86400000))  // 有効期限を1日に設定
                .signWith(SignatureAlgorithm.HS256, JWT_SECRET) 
                .compact();
```
### JWTのアンチパターン

JWT は 署名による改ざん防止 はできるが、ペイロードの内容は誰でも閲覧可能！
そのため、以下のような個人情報は 絶対に含めてはいけません！

```java
{
  "user_id": "12345",
  "email": "user@example.com",
  "password": "secret123"
}
```

:::note alert
JWT に個人情報を入れてはいけない理由
❌ JWT の内容は Base64 デコードすれば誰でも見られる
❌ 攻撃者が取得した場合、情報漏洩のリスク
❌ ログやデバッグ時にトークンの内容が記録される可能性あり
:::

:::note info
対策
✅ 個人情報は JWT に含めず、暗号化されたセッションストレージに保存する
✅ 短い有効期限 (exp) を設定し、長期トークンはリフレッシュトークンを使用する
:::


## まとめ
:::note info
JWT の実装ポイント 
✅ 推奨: signWith(key) に変更し、秘密鍵は Base64 デコードして Key オブジェクト化する
✅ JWT にパスワードや個人情報を含めない！
:::

JWT を正しく使えば、セキュアで拡張性のある認証システムを構築できる！
間違った実装を防ぎ、安全に運用しよう！🔥
Arduino IDE 2.x でフォントを変更する方法

Arduino IDE 2.xでフォントを変更する方法をまとめます。
2025年3月8日時点、IDEのバージョンは2.3.4です。
（参考サイト：[arduino/arduino-ide: Changing font in Arduino IDE 2.X #1755](https://github.com/arduino/arduino-ide/issues/1755) ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/1fb86da1-ecdd-4dba-ad3a-a38b849c7660.png)

Ctrl + Shift + Pを押し、”Preferences: Open Settings (UI)"を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/7d000eb1-6ee5-42c7-8c5f-5f8dc73f435c.png)

IDE上に”設定”タブが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/dd86f80c-96e0-44cf-aa08-e7917bc0a7c1.png)

右上の”{}”ボタン（設定（JSON）を開く）を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/3a9cdc3a-a850-4bce-a499-f9c649f97082.png)

VSCodeのような方式を踏襲しているそうで、JSONファイルが開きます。
```
”editor.fontLigatures": false
```
という記述を探し、trueに変更します。
（ない場合は追記します。追記する際に前の要素の後にカンマを付加することに注意してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/3acf2cfb-994f-4c5d-b9b4-59fa777d93f9.png)

```
"editor.fontFamily": "JetBrains Mono", 
```
を追記すると、下記のように即座に設定が適用されるようです。<br>
指定したいフォントの名前は、Windows設定 > フォント設定で確認できる”完全名”を使用してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/2bbc1f73-1649-428e-98b6-abb9a6149397.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/04c0ae34-9efe-4e1b-863e-0729f169c4ef.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/9d23ae2f-888e-4810-9c2e-4d1644cec7d4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/2bd60328-579e-4a89-b600-d36dd112cbc1.png)


以上です。”設定”タブ、”settings.json"を閉じていつも通り開発を続けましょう!
ヤバいデータ分析 - 2. 〇〇学習

https://qiita.com/aokikenichi/items/9d829910efd5dff0b79f#2-%E3%80%87%E3%80%87%E5%AD%A6%E7%BF%92

で書いたことを1つずつ掘り下げていこうと思います。今日は「2. 〇〇学習」

機械学習をやっているととにかく〇〇学習という言葉が溢れ、AIと機械学習との違いも曖昧模糊としている。学び出した初期にかなり悩みました。

まず、人工知能と機械学習の位置付けですが、これがこれではっきりしない。なんせ人工知能学会のページ

https://www.ai-gakkai.or.jp/whatsai/AIresearch.html

をご覧いただくとわかると思いますが、別に住所が決まっっているわけではない。さらにAIマップなるものがあり、

https://www.ai-gakkai.or.jp/aimap/

こんな感じ。ビジネスでも使いそうなわかりやすいものに「ルールベース」がある。

if then で表せるような「ルール」で処理していく。こんなのが人工知能かよ、と思われるかもだけど世の中の全てをif thenで表していけば、少なくとも特定の問題についてはこれでいけるのでは、と本気で考えられていた。

実際のビジネスでも例えばマーケティングのRFM分析（購買の直近さ、回数、金額）で期間、回数、金額で条件をつけて、この顧客にはこの対応って決められてビジネス的な価値が出るならばこれはルールベース。別にたの機械学習などをしなくてもいい。

そんなこんなで人工知能をざっくり分けると、

```mermaid
graph LR
    subgraph 人工知能
        機械学習
        ルールベース
        etc[その他]
    end
    style etc fill:#ffd,stroke:#ffd
```

こんな感じ。さらに現在隆盛を誇っている機械学習の中身を見ていくと「◯◯学習」の海に溺れるがざっくりいうとこんな感じ。

```mermaid
graph LR
    subgraph 機械学習
        教師なし学習
        教師あり学習
        強化学習
    end
```

ルールを人間が作って指示してやるんじゃなくて、学習するアルゴリズムを与えてコンピュータ=機械に学習しなさいと指示する。その学習の仕方として大きく、

- 教師なし学習
    - 答えを与えずに学習させる。主にデータとデータの「距離」を計算させて、これが近いね、これが遠いねなどと学習する
    - 次元削減
        - たくさんの変数があるものを少ない次元にまとめる。2次元にマップして、このデータとこのデータが近いね、これは遠いねとか視覚的に判断することもある
    - クラスタリング
        - データとデータのまとまりを知る
- 教師あり学習
    - 答えを与えて学習させる。与えたデータだとどういう答えになるか学習させ、正解の答えと誤差が大きければその誤差を小さくさせるように学習を繰り返させる
    - 分類
        - 答えがYes/Noやカテゴリ値などのような場合、与えたデータを分けるから分類
    - 回帰
        - 答えが金額など連続値の場合（円単位などで自然数の場合もここでは連続値として扱うことが多いな）、与えたデータから連続値を予測する。「回帰」とは変わった名前だが歴史的経緯からこう呼ぶ（ゴルトンさんとか）
- 強化学習
    - そもそも答えがない状態で学習する。例えば将棋などのボードゲーム。1手打つたびに正解があるわけじゃなく、最終的にどっちが勝ったか負けたかがわかり、1手1手では正解がない。ただ、この環境でこの手を打つと良さそうだよなんてことはわかるのでそれを「報酬」として与え、トータル報酬が最大になると勝ちつまり正解となるような学習をさせる

鉤括弧の「距離」としたのは我々が普通に思う距離はユークリッド距離と言いますが、それ以外にも「距離」はあるため。

大体はこんな感じなのですが、ざっと他にも
- 半教師あり学習
- 転移学習
- バッチ学習
- オンライン学習
- 深層学習
- 多様体学習
- アンサンブル学習
- 表現学習
- ...
などがありますね。書籍やネットの記事を見るとそれぞれ解説があるのですが、じゃぁAとBで何が違うのか、実際は同じことを言ってんじゃないのか？ようとの違い？など訳がわからなくなります。

こういう時はロジックツリーを書くと良いと思います。同じレイヤーには同レベルのものが並び含む、含まれるの関係を図示する感じですね。

```plantuml
@startmindmap
+ 生物
++ 動物
+++ 哺乳類
++++ ヒト
++++ イヌ
++++ ネコ
+++ 鳥類
+++ 魚類
++ 植物
@endmindmap
```

こんな感じ。これを機械学習でやると

```plantuml
@startmindmap
+ 機械学習
++ 学習目的の違い
+++_ <b>教師なし学習</b>
+++_ <b>教師あり学習</b>
++++_ <b>半教師あり学習</b>
+++_ <b>強化学習</b>
++ 学習アルゴリズムの違い
+++_ 回木木・分類木
+++_ サポートベクターマシン
+++_ ニューラルネットワーク
++++_ <b>深層学習</b>
+++_ <b>多様体学習</b>
++++_ t-SNE
+++_ <b>アンサンブル学習</b>
++ 学習時点の違い
+++_ <b>オンライン学習</b>
+++_ <b>バッチ学習</b>
++ 学習対象の違い
+++_ <b>転移学習</b>
+++_ <b>表現学習</b>
@endmindmap
```

といったんはこういう分け方ができます。ただ、「学習」とほぼ同じ意味でも「学習」という言葉を使っていないものがあることもあります。また、研究分野によっては違う見方をする場合もあります。ですのでこの図が正解ではなく、ここをベースに分野や目的によって理解をUpdateしていくのが良いと思います。
The following packages have unmet dependencies:  libc6-dev

# 症状

以下のように、libc6-devのエラーがでて、何も入れられなくなったとき

```
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install -y build-essential
..snip..
The following packages have unmet dependencies:
 libc6-dev : Depends: libc6 (= 2.35-0ubuntu3) but 2.35-0ubuntu3.1 is to be installed
E: Unable to correct problems, you have held broken packages.
```

ubuntu install直後なのに、上が出て、何にも環境設定ができなくなったが、、、

# 対処方法

```
$ sudo apt-get install -f --fix-broken
```

効果なし

```
$ sudo apt-get install apptitude
$ sudo apptitude install libc6-dev
```

直った！ apt-get installでbuild-essentialなど各種installができるように
【Rails】303 see_other

# はじめに

こんにちは。アメリカで独学でエンジニアを目指している者です。
現在Railsチュートリアルを用いて勉強していますが、本日はそこで出てきたHTTPステータスコード 303 see_other について記事にしたいと思います

## status: :see_other と HTTP 303 ステータスコード

### はじめに
Rails でリダイレクト処理を行う場合、たとえば `redirect_to root_url` といったコードをよく見かけるかと思います。ここに `status: :see_other` オプションをつけることで、HTTP ステータスコード 303 を利用したリダイレクトが実現できます。本記事では、この `status: :see_other` がどのような意味を持ち、なぜ使用されるのかを解説します。

---

### 303 (See Other) ステータスコードとは

HTTP には様々なステータスコードがありますが、その中で 303 は **“See Other”** と呼ばれています。これは以下のような特徴を持ちます。

1. **リクエストメソッドを GET に変換する**
   - 元のリクエストが POST や DELETE などの非 GET リクエストであった場合、リダイレクト先には GET リクエストを送信するようにブラウザに指示します。

2. **フォームの再送信を防ぐ**
   - POST や DELETE といった状態変更を伴うリクエストの直後にリダイレクトを挟むことで、ユーザーがブラウザを再読み込み (リロード) した際にもう一度同じリクエストを送ってしまう「二重送信」を防ぎます。

3. **安全な再読み込みを実現**
   - ユーザーが戻る操作や再読み込みをしても、意図せず状態変更リクエスト (DELETE など) を行わずに済むようになります。

---

### Rails での利用例

#### ログアウト処理 (DELETE → GET)

```ruby
# SessionsController
class SessionsController < ApplicationController
  # ...

  def destroy
    log_out
    redirect_to root_url, status: :see_other
  end
end
```

- `destroy` アクションは、多くの場合 HTTP メソッド DELETE に紐づけられています。
- Rails では、このアクションを呼び出した後に `redirect_to` を使ってトップページなどにリダイレクトすることが一般的です。
- ここで `status: :see_other` (ステータスコード 303) を指定すると、ブラウザは **リダイレクト先へのリクエストを GET で行う** よう指示されます。
- これにより、再読み込み時に DELETE リクエストが再度送られるのを防ぎ、安全なページ遷移が行えます。

---

### なぜわざわざ 303 を使うのか？

通常のリダイレクトといえば、302 (Found) や 301 (Moved Permanently) なども使われることが多いですが、Rails ではあえて 303 を選択する利点があります。

1. **PRG パターン (Post/Redirect/Get) のサポート**
   - フォーム送信による状態変更の直後に、別のページへリダイレクトするのは業界標準とも言える手法です。これによりユーザーが再読み込みした際に意図しない再送信を回避できます。
   - 303 は PRG パターンに最適なステータスコードとして利用できます。

2. **DELETE リクエストの二重送信を防ぐ**
   - ログアウト処理など、DELETE リクエストを伴う操作の後にページを再読み込みしても、再度 DELETE が行われず、安全な GET リクエストとなります。

3. **明示的な意図を示す**
   - 303 は “See Other” という名前のとおり、あくまで「他のリソースを参照してね」とブラウザに伝えます。これは元のリクエストのメソッドをそのまま持ち越すような 307 (Temporary Redirect) とは異なり、明示的にメソッドを変えたいときに使われます。

---

### まとめ

- `status: :see_other` を指定すると、HTTP 303 が使われ、ブラウザがリダイレクト先に **GET** でアクセスするようになります。
- 状態変更を伴うリクエスト (POST や DELETE) の後にリダイレクトを行う際、二重送信を防ぐために非常に便利です。
- Rails では特にセキュリティとユーザー体験を向上させるため、`status: :see_other` を積極的に活用するケースが見られます。

もし `redirect_to some_path, status: :see_other` を見かけたら、「HTTP 303 を返すことでリダイレクト先では GET が行われ、再投稿や再ログアウトを防止するんだな」と理解していただければ幸いです。
便利ページ：カスタムQRコードの生成

WiFi接続のためのQRコードを毎回生成するので、便利ページに追加しました。

「[便利ページ：Javascriptでちょっとした便利な機能を作ってみた](https://qiita.com/poruruba/items/6c67c7eef34ed302feb3 )」のシリーズものです。

すでにQRコードのためのユーティリティとして、以下を作成済みです。
・文字列からQRコードを生成する
・WebカメラからQRコードをスキャンする
・クリップボードの画像からQRコードをスキャンする

今回は、それに加えて、以下のQRコードを生成します。
・WiFiアクセスポイントへの接続
・ユーザID・パスワード付きURL
・Androidアプリ検索

(参考）Barcode Contents
https://github.com/zxing/zxing/wiki/Barcode-Contents

ソースコードもろもろは、以下に上げてあります。

poruruba/utilities

https://github.com/poruruba/utilities

すぐに使いたい場合は以下から参照し、ユーティリティタブからQRコードを選択してください。（すべてJavascriptのみで動作します）

https://poruruba.github.io/utilities/

# WiFiアクセスポイントへの接続

こんな感じで作ります。

```
WIFI:T:WPA;S:{SSID};P:{パスワード};;
```

# ユーザID・パスワード付きURL

こんな感じで作ります。

```
https://{ユーザID}:{パスワード}@hogehoge.com
```

# Androidアプリ検索

こんな感じで作ります。

```
https://play.google.com/store/search?c=apps&q=${キーワード}
```

# ソースコード

Javascriptで書くとこんな感じです。

```js:js/comp/comp_qrcode.js
    qrcode_cusom_generate: function(){
      var input = '';
      if( this.qrcode_custom_type == 'text'){
        input = this.qrcode_custom_text.text;
      }else
      if( this.qrcode_custom_type == 'wifi'){
        var escapeWiFiString = (str) => {
          return str.replace(/([\\;:])/g, '\\$1');
        }
        var ssid = escapeWiFiString(this.qrcode_custom_wifi.ssid);
        var password = escapeWiFiString(this.qrcode_custom_wifi.password);
        input = `WIFI:T:WPA;S:${ssid};P:${password};;`;
      }else
      if( this.qrcode_custom_type == 'url'){
        var userid = encodeURIComponent(this.qrcode_custom_url.userid);
        var password = encodeURIComponent(this.qrcode_custom_url.password);
        if( this.qrcode_custom_url.userid ){
          input = this.qrcode_custom_url.url.replace(/^(https?:\/\/)/, `$1${userid}:${password}@`);
        }else{
          input = this.qrcode_custom_url.url;
        }
      }else
      if( this.qrcode_custom_type == 'android'){
        var keyword = encodeURIComponent(this.qrcode_custom_android.keyword);
        input = `https://play.google.com/store/search?c=apps&q=${keyword}`;
      }

      var element = document.querySelector('#qrcode_custom_area');
      element.innerHTML = '';
      new QRCode(element, input);
      this.qrcode_custom_generated = input;
    },
```

以上
マルチテナントとシングルテナント、どっちがいいの？

## はじめに

以前、お仕事でマルチテナントSaaSの新規開発に途中参画することがありました。

その時は既に前任者が作っていたアーキテクチャにそこまで違和感なかったのですが、去年夏頃に「MySQLを使ってると会社が潰れる」っていう内容が少しSNSで流行り、少し私の考え方も変わってきました。

https://x.com/osakenoman/status/1829469129159721260

ちなみに、「MySQL使うとが会社潰れる」とは思いませんが、そもそもRLSを知らなかった自分がマルチテナントSaaSを構築することの方が会社を潰してしまいそうです。

３月にJAWS初登壇させていただく予定ができたので、この件をテーマにしようと思い、事前にQiitaでまとめていきたいと思います！

## マルチテナントSaaSってなに？

複数（マルチ）の顧客（テナント）にサービスを提供するアーキテクチャの総称です。

１つのお客様のみに提供するSaaSでない限り、SaaS＝マルチテナントでは？と思ったのですが、下記サイトでは分けて考えるべきというような記載がありました。

https://docs.aws.amazon.com/ja_jp/whitepapers/latest/saas-architecture-fundamentals/saas-is-a-business-model.html

ざっくりまとめると、SaaSはビジネスモデルとサービス提供の形態を表し、マルチテナントはそのSaaSを実現するための技術的な実装方法の一つと考えることを推奨しているようです。

## マルチテナントの考慮点。

マルチテナントはSaaSの実装方法の一つだと紹介しましたが、マルチテナントを採用するかどうかの判断材料をいくつか紹介します。

### コスト観点

シングルテナントと比べ、圧倒的に有利なのがコストメリットです。
一つのリソースを複数のテナントで利用するからですね。

![スクリーンショット 2025-03-08 6.41.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/e09a958d-f8e9-4792-a221-21d6b34bd41b.png)

> 引用元：https://www.youtube.com/watch?v=CYkN90CN6jc

マルチテナントが有利な点というのは、リソースおよび、運用にかかるコスト面が中心になってきそうです。

この後の比較は、すべてマルチテナントを考える上の難しさを表すものとなります。

### 可用性観点

すべてのテナントが１つのインフラを利用する為、１つの障害がすべての顧客に影響してしまうデメリットがあります。

また、顧客単位で求められる可用性のレベルが異なる場合、その実装方法が複雑になりそうですね。

![スクリーンショット 2025-03-08 6.47.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/87f3e098-5723-4e8d-bd34-046e6ecdca1f.png)

> 引用元：https://www.youtube.com/watch?v=CYkN90CN6jc

### パフォーマンス問題

総称して「うるさい隣人（ノイジーネイバー）問題」です。

浮遊リソースがない代わりに、一つのテナントが利用可能なリソースを多く占有してしまう可能性があります。

それぞれのテナントで利用できるリソースの上限を指定するなどもできますが、システムの複雑さを生み出しそうです。

![スクリーンショット 2025-03-08 6.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/aa2d8dc5-e8ec-464f-a894-f8d24c5de546.png)

> 引用元：https://www.youtube.com/watch?v=CYkN90CN6jc


### コンプライアンス観点

システム外のところで、そもそも共有していいんだっけ？という議論もあります。

自社サービスならこちらで決めてしまえばよいですが、受託案件等の場合は要考慮です。

特に公共系の案件なんかはここらの制限や、データは日本国内のデータセンターに置くことみたいなのもありますね。

![スクリーンショット 2025-03-08 6.38.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/01e0d5a9-0d10-4bc8-8fa1-5eac12805eea.png)

### セキュリティ観点

マルチテナントはDBのようなストレージも共用する場合があります。
このケースで一番気にしないといけないのは、許可されていないテナント間のアクセスです。

特にこのケースでアクセスできてしまうのが顧客情報などの個人情報だったりするので、普通に会社が潰れます。

「MySQL使うとが会社潰れる」は、MySQLにはPostgreSQLにあるRow Level Security(RLS)がないことを言いたかったんだと思いますが、データのテナント分離方法はもちろんこれだけではないので、間違いです。

### 拡張性観点

新規顧客が増える時は、マルチテナントの方がテナント追加にかかるコストと時間が少なくて済みそうです。

特に小規模の顧客を大量に獲得していくような形態はマルチテナントな構成が最適かと思います。

## まとめ

ビジネスとしてシステムを作る以上、コストパフォーマンスは無視できません。

マルチテナントの難しさは物理的な集約と論理的な分離をどうやっていくか？というところで色々な選択肢があるので、アーキテクチャを考えるは楽しそうですね！
clineを用いたコーディング方法

皆さん、こんにちは。

今日は「clineを用いたコーディング方法」についてご紹介します。

# Clineの概要

Cline(クライン)はVisual Studio CodeやCursorで動作するAIエージェント型の拡張機能です。 
Clineを使うことでエンジニアの開発時間を短縮し、生産性を向上させることができます。

## インストール:

Visual Studio Codeのマーケットプレイスから「Cline」を検索し、インストールします。Cursorでも同様に拡張機能として導入できます。

# 基本的な使い方

Clineは対話形式でプロンプトを入力することで、ユーザーの意図に応じたコードやアドバイスを提供します。以下のポイントを意識すると、より効果的に活用できます。

- 具体的な指示:
「何を実現したいのか」を明確に記述することで、望む結果に近いコードや提案が得られやすくなります。

- サンプルの提示:
既存のコードやサンプル例を含めると、AIがより適切な出力を行いやすくなります。

- 段階的な質問:
複雑なタスクは、ステップごとに指示を出すことで、処理の流れや論理が明確になり、効率的なサポートを受けることができます。

# プロンプトの実例

## コード生成

- プロンプト: 
```
PythonでCSVファイルを読み込み、特定の列の値が一致するデータをフィルタリングして表示するコードを書いてください。
```

- 期待される出力例:

```
import csv

def read_and_filter_csv(file_path, filter_value, column_name):
    with open(file_path, 'r', newline='', encoding='utf-8') as csvfile:
        reader = csv.DictReader(csvfile)
        filtered_data = [row for row in reader if row[column_name] == filter_value]
    return filtered_data

if __name__ == "__main__":
    data = read_and_filter_csv('data.csv', 'desired_value', 'column_name')
    for row in data:
        print(row)
```

## リファクタリング提案

- プロンプト:

```
以下のコードをパフォーマンス向上のためにリファクタリングしてください：
def inefficient_function(data):
    result = []
    for item in data:
        if item not in result:
            result.append(item)
    return result
```

- 期待される出力例:

```
def efficient_function(data):
    return list(set(data))
```

## バグ修正

- プロンプト:

```
次のコードにはバグがあるようです。修正案を提案してください：
def divide_numbers(a, b):
    return a / b
print(divide_numbers(10, 0))
```

- 期待される出力例:

```
def divide_numbers(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return "Error: division by zero"

print(divide_numbers(10, 0))
```

# 使い方のコツ

- 目的を明確に:
単に「コードを書いて」ではなく、「どの言語で、どのような機能を実現するか」を具体的に記述します。

- エラーの背景を提示:
バグ修正やデバッグの場合、エラー内容や問題の再現手順を含めると、より正確なアドバイスが得られます。

- 段階的に依頼:
複雑な処理を一度に依頼せず、まず基本的な部分のコード生成や改善提案を受け、その後詳細な調整を加えるとスムーズです。

Clineを活用することで、日々の開発作業の効率が大幅に向上します。具体的なプロンプトを用いることで、コード生成やリファクタリング、バグ修正の提案など、さまざまなタスクを迅速に行うことが可能です。まずは上記の実例を参考に、実際の開発シーンに合わせたプロンプトを試してみてください。

このように、Clineはエンジニアの作業を補助する強力なツールとして、効率化と生産性向上に寄与します。

今日は以上です。

ありがとうございました。
よろしくお願いいたします。
AIエージェントデザインパターン実践：パッシブゴールクリエイター、プロアクティブゴールクリエイター

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

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

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

今回は「パッシブゴールクリエイター」、「プロアクティブゴールクリエイター」パターンを実装してみる。
パッシブゴールクリエイター、プロアクティブゴールクリエイターは、ユーザーからのある目標が与えられたときに、それを達成するための計画として複数のゴールに分解して構造化することを目的とする。
ユーザーから与えられた目標の情報のみから複数のゴールに分解して構造化することを目的とするのが「パッシブゴールクリエイター」、追加でユーザーに問い合わせたりwebから情報を引っ張ってくるなど目標以外の情報も活用するのが「プロアクティブゴールクリエイター」となる。

## パッシブゴールクリエイター、プロアクティブゴールクリエイター
今回はプロアクティブゴールクリエイターを実装した。パッシブゴールクリエイターについては以下のフローチャート中で、追加で情報をユーザやwebに問い合わせる部分を除けば作成できるため省略した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517503/58b1dbaf-09ee-4ede-abeb-fc5e2acc54fd.png)

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

質問例として、「新しい家電製品を作りたい。今まで人が行っていた家事を代替できるロボットを開発したい。」という目標のもとにプロアクティブゴールクリエイターパターンを適用した。すると、６つのゴールに分解され、そのゴールをより明確にするための10のユーザーへの追加質問と4のweb検索を行い、最終的な計画を作成した。
Proxmox VE Helper-Scriptsのすすめ

ProxmoxのVMインストール、OSSのインストールを簡単にできてしまうツールを見つけてしまいました。

## Proxmox VE Helper-Scriptsとは?
名前の通り、インストールを手助けしてくれるスクリプトです。
Proxmoxのシェルからコマンドを叩くと、インストールガイドが起動して自動的にインストールしてくれます。

https://community-scripts.github.io/ProxmoxVE/scripts

## 使い方
上のリンクをクリックして、View Scriptsのボタンを押します。

左ナビゲーションバー（Categories）から、自動で構築してほしいOSS、OSを選択します。(名前の横に仮想マシンのタイプが書かれています。VM/CT)

選択したら、画面中央下の``How to install``の中のコマンドをその自動構築してほしいノードのシェルで実行します。

あとはインストールスクリプトの質問に合わせてインストールを進めていきます。
スクリプトの選択によって、IPや、rootパスワードなどが設定できます。(アディショナルかデフォルトか)

## まとめ
- 簡単に自動、構築ができるため時短や効率化を図れます。
- 細かく設定をしたりしたい時はおすすめできません...
- 自動でやってくれてるところを見るとなかなか面白いです！
seedデータをFactoryBotで作ったら幸せになった話

## 結論
`db/seeds.rb`
```ruby
require 'factory_bot_rails'

FactoryBot.create(
  :party,
  title: "すでに募集が終わってる",
  date: Date.today-2.day,
  expire: Date.today-1.day
)
```

## Motivation / Context
上記コードでseedファイルを作成できます。

通常、以下のようにseedファイルって定義されると思います。

```ruby
Party.create(
  title: "すでに募集が終わってる",
  date: Date.today-2.day,
  expire: Date.today-1.day
)
```

でも、FactoryBotを導入しているんだから、せっかくならそっちを使いたいなって思っていました。
RSpecの方でもよくFactoryBotは使っているのでね！
seedファイルとfactoryファイルの両方をメンテしていくのは非常に大変ですよね。（カラムに変更があった時とか）
AMDのGPUをDaVinci Resolveが認識しないときの対処法

## はじめに
DaVinch ResolveはAMDのGPUと相性が悪いようで、下のような表示が出てDaVinchが開けない！という人が多いようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4030417/d0f4f55f-7ecc-4af9-bd9f-75d6dea4c737.png)
「コンフィギュレーションを更新」ボタンを押して、GPUコンフィギュレーションの欄を見ても、GPUが認識すらされていませんでした。

僕の環境は
OS:windows11
CPU:AMD Ryzen 7 8840U w
GPU:Radeon 780M Graphics 
メモリ：32GB

のノートパソコンです。
こまっているひとは参考にしてみてくださいね。

## 解決法
結論から言うと、GPUのドライバを更新するとDaVinchが起動するようになりました。
DaVinchをダウンロードしたのは、パソコンを買ってまだ２日しかたっていない時だったので、ダメもとでやってみたのですがまさか解決するとは…。
その前に仮想メモリを増やしたりしましたが、３２Gもメモリを積んでいるのであまり関係ないでしょう。
windowsの機能で更新を行った結果、知らないアプリケーションがインストールされていたので、ドライバが変更されたのが主な要因だとおもいます。

## 手順
１．デバイスマネージャーを開きます
わからない人は画面の下のほうにある「検索欄」にデバイスマネージャーと打ち込んでください

２．ディスプレイアダプターの横の＞をクリック

３．出てきたGPUのうち、使いたいものをダブルクリック

４．ドライバータブを選ぶ

５．ドライバーの更新ボタンを押す

６．黒い画面を見ながら待機
僕の場合は、ドライバーの検索が済んだ後に、急に画面が真っ暗になってめっちゃビビりました。
その後無事に起動しましたし、windowsの機能なのでよっぽど大丈夫だとは思いますが、やるときは自己責任でお願いします。

７．動作確認
DaVinchを開いてみると、起動するようになっているはずです。
【react-router v7 エラー】Uncaught Error: A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>

# はじめに
今回はRouter設定を *`react-router v7`* で実装しようとした時に遭遇したエラーについてです。

# 問題

```plaintext: エラーメッセージ
Uncaught Error: A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>
```

```diff_tsx: src/router/Router.tsx
import { Route, Routes } from "react-router";
import { Cards } from "../cards";
import { DynamicSegments } from "../DynamicSegments";

export const Router = () => {
  return (
    <>
      <Route path="/" element={<Cards />} />
      <Route path="/cards/:id" element={<DynamicSegments />} />
    </>
  );
};
```

# 解決方法
```diff_tsx: src/router/Router.tsx
+import { Route, Routes } from "react-router";
import { Cards } from "../cards";
import { DynamicSegments } from "../DynamicSegments";

export const Router = () => {
  return (
    <>
+     <Routes> //RoutesでRouteを囲む
        <Route path="/" element={<Cards />} />
        <Route path="/cards/:id" element={<DynamicSegments />} />
+     </Routes>
    </>
  );
};
```

# おわりに
エラーメッセージを翻訳すると、ちゃんと `<Route>を<Routes>で囲んでください` と言ってくれていました。
また、公式ドキュメントでも `ルートの設定` で書いていました。
ちょっとずつではあるがドキュメントを読む癖がついてきた気がする。:eyes:

# 参考

https://react-router-docs-ja.techtalk.jp/start/library/routing#%E3%83%AB%E3%83%BC%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A