OmniAICreator/Qiita-1.07M huggingface dataset:
vimについて　コマンド解説

vimについての解説を行なっていきます。
## ステップ０　まずはvimを使えるようにしよう
私自身VSCodeを利用していたので、VSCodeでvimを利用できるようにするための準備から始めていきました。
下記記事を参考に設定等を進めていけば問題なくvimを利用できるようになると思いますので、ご参考にどうぞ。
<a href="https://fe-notes.work/posts/20200708_vsvim01/">VimmerのVimmerによるVimmerのためのVSCode環境構築(Part1)
</a>
<a href="https://qiita.com/meruneru/items/412c4a699f45d60f478c">VSCodeVimの有効/無効をショートカットキーで切り替える方法
</a>

## ステップ１　vimのModeとカーソル移動のコマンドを覚えて操作に慣れよう
vimではマウスを使用しないので３つのModeを駆使して編集していきます。
|モード | できること | コマンド|
|:----:|:--------:|:-------:|
|NormalMode | カーソル移動、他のモード移行、テキストのコピー・カット・ペースト | Esc|
|InsertMode| テキストの入力・編集                                    　| a/i/oなど|
|VisualMode| 文字選択モード                                         　| v|

次にカーソル移動に必要なコマンドです。
NormalModeで使用していきます。

| コマンド | 効果 |
|:--------|-----:|
|h  | カーソルを左にずらす|
|j  | カーソルを下にずらす|
|k  | カーソルを上にずらす|
|l  | カーソルを右にずらす|

## ステップ２　vimの起動と終了、テキスト編集のコマンドを覚えよう
まずは<Exc>キーを押して確実にNormalModeに移行していきましょう。
下記コマンドを実行することでテキスト編集や内容の保存等を行うことができます。

| コマンド | 効果 |
|:------:|:-----:|
|a  | カーソルの場所から1文字右からInsertMode（文字入力モード）|
|A  | カーソルの行の最後に飛んでInsertMode|
|i  | カーソルの場所からInsertMode|
|I  | カーソルのある行の最初に飛んでInsertMode|
|o  | カーソルの場所の次の行からInsertMode|
|.  | 直前にやったことを繰り返す|
|x  | カーソル直下の文字を削除|
|:w | ファイルの保存|
|:q | 実行中のタブを閉じる|
|:wq| 組み合わせて実行することもできる（左記のコマンド例でいうとファイルの保存をして実行中のタブを閉じる）|
|:w!| !をつけることで強制終了することができる|

以上で紹介したコマンドをまずは使ってみて慣れていきましょう！

## ステップ２　テキストの削除するコマンドと取り消しコマンドを覚えよう

|コマンド|効果|
|:-----:|:---|
|dw | カーソル位置から次の単語までを削除|
|de | カーソル位置から単語の末尾までを削除|
|d$ | カーソル位置から行の末尾までを削除|
|dd | 行全体を削除|
|u | 前回の動作を取り消す|
|U |行全体の変更を取り消す|
|CTRL-R| 取り消しの取り消し|

変更に用いるコマンドは、「**オペレータ**  **[数値]** **モーション**」という形でも入力して編集することができます。
- オペレータ：削除dの類で何をするのか
- [数値]：そのコマンドを何回繰り返すか
- モーション：w（単語）やe（単語末尾）、$（行末）などの類で、テキストの何に対して働きかけるか

例：d2w(2単語削除)

## ステップ3 貼り付け・置き換えコマンドを覚えよう
|コマンド|効果|
|:----:|:----|
|p|dd等で削除したテキストを貼り付けすることができる|
|r|置き換えたいテキストにカーソルを合わせてr入力後正しいテキストを入力する|
|c|変更と挿入を組み合わせることができる。例：ce(選択したカーソル位置から単語末尾までを置き換えることができる)|
|:%s/[変更対象の文字]/[変更後の文字]/gc|ファイル全体でoldという文字で見つかるものに対して、1つ1つ確認を取りながらnewに変更する(gのみだったら確認なし)|

例えばoldという文字をnewに置換したい場合は、
`:%s/old/new/gc`となります。

## ステップ４　ファイルの位置・情報を取得しよう
この操作を覚えていることで任意の場所に移動することができます。

|コマンド|効果|
|:-----:|:-----|
|CTRL-g|ページの一番したにファイル名と行番号が表示される|
|G|ファイルの最下行に移動|
|gg|ファイルの先頭に移動|
|[行番号]G|任意の行番号に移動|

## ステップ５　検索コマンドを覚えよう
この操作を覚えることで任意の文字を検索することができます。

|コマンド|効果|
|:---:|:----:|
|/[任意の文字]|NomalModeで/入力し[任意の文字]<enter>で検索できる。同じ語句を検索するときは単に**n**、逆方向に検索するときは**N**|
|?[任意の文字]|「/」とは逆方向に検索することができる|
|%|対応する括弧に移動。(,[か{のどれかにカーソルを合わせて%を入力することで対応する括弧に移動する|

## ステップ６　外部コマンドを実行する方法を覚えよう

|コマンド|効果｜
|:----:|:----:|
|:!ls|外部シェルコマンドが実行できるようになる。（lsやdirなど）|

今までご紹介させていただいたコマンドを利用していけばvimになれることができると思います。
下記記事はここでは紹介されていないコマンドも紹介されていますので、ぜひ参考にされてみてください。

> <a href="https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d">知識0から始めるVim講座</a>

引用記事

> <a href="https://fe-notes.work/posts/20200708_vsvim01/">VimmerのVimmerによるVimmerのためのVSCode環境構築(Part1)
</a>

> <a href="https://qiita.com/meruneru/items/412c4a699f45d60f478c">VSCodeVimの有効/無効をショートカットキーで切り替える方法
</a>

> <a href="https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d">知識0から始めるVim講座</a>
はじめてのMac

Windowsを20年近く使い続けてきたけど、はじめてMacを使用してみて
色々と戸惑うこともあるので備忘録としてここに残していく。

## マシン
MacBook Pro
OSはSequoia15.2

## はじめにやったこと

### 🔸デバイスの保証を有効にする
https://checkcoverage.apple.com/coverage

### 🔸トラックパッドでタップを強く押さないで済むようにする
　リンゴマーク→システム設定→トラックパッド→「タップでクリック」をON

### 🔸Enterを２回押さずに入力確定させる
https://ischool.co.jp/2019-08-05-japanese-input-in-mac-how-to-convert-at-once-instead-of-twice/

### 🔸ライブ変換を無効にする
https://netsetsu.com/mac-live-conversion/

### 🔸F7とかで変換できるようにする
https://qiita.com/kamorits/items/781e07d4779d6eb44b2f

### 🔸ファイアウォールを有効にする
https://pc-karuma.net/mac-firewall/

### 🔸トラックパッドとマウスのスクロール向きが合わないのを直す
https://www.bossraku.com/blog/538/

## 開発関連でやったこと

### 🔸Git&Github関連のセットアップ
ここに書かれている通りやれば問題ないが、
configの記載内容にあるUserのところはgitとすればよい

https://zenn.dev/hayato94087/articles/abae7203b59ecb

### 🔸Python関連のセットアップ
Homebrewをインストールしたあとに以下のコマンドでPythonをインストール
シンボリックリンク作成コマンド（sudo ln -s）でパスを間違えても正常終了するので気づきにくい
which pythonやwhich python3とやるとコマンドのパスが正確に分かるのでよく確認して行うこと
~~~
brew install python3
python3 -V
sudo ln -s /opt/homebrew/bin/python3 /usr/local/bin/python
python -V
~~~

## メモ
### 🔷ファイルの削除コマンドは？
　Windowsと違ってDeleteキーがない。
　command＋バックスペース で削除ができる。

### 🔷appファイルってなに？
　Visual Studio Codeを使おうと思って、公式サイトからダウンロードしたら
　拡張子がappのファイルだった。
　このファイルをダブルクリックしてもアプリとして起動するけど、
　以下の方法でアプリとして登録することができる。
　＜方法＞
　Finderの「アプリケーション」に、appファイルをドラッグ＆ドロップする。
　そうするとLaunchpadに表示されて他のアプリと同じように使えるようになる。

### 🔷Homebrewってなに？
ソフトウェアを管理するパッケージマネージャー
Windowsだとあまり馴染みがないがコマンドラインでインストールができるように
依存関係なども解決してくれる
「ターミナル」で以下のコマンドを実行すればインストールができる
~~~
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
~~~

## ショートカット
・デスクトップ表示
　F11
.env ファイルの使い方　メモ

### `.env` ファイルの使い方と説明（Python）

#### **.envファイルとは？**
`.env` ファイルは、環境変数を定義するためのファイルです。  
アプリケーションの設定情報（APIキー、データベースの接続情報など）をコードに直接書かず、`.env` に保存することでセキュリティや管理の利便性を向上できます。

#### **.envファイルの基本構造**
`.env` ファイルは通常、プロジェクトのルートディレクトリに配置し、以下のようにキーと値を `KEY=VALUE` の形式で記述します。

```env
# 環境変数の定義
DATABASE_URL=mysql://user:password@localhost:3306/dbname
SECRET_KEY=your_secret_key
DEBUG=True
```

> `.env` ファイルは `.gitignore` に追加し、GitHub などのリポジトリにアップロードしないようにしましょう。

---

### **Pythonで.envファイルを使う方法**

Pythonで`.env` ファイルの内容を読み込むには、`dotenv` ライブラリ（`python-dotenv`）を使用します。

#### **1. 必要なライブラリをインストール**
まず、`python-dotenv` をインストールします。

```sh
pip install python-dotenv
```

---

#### **2. `.env` ファイルを読み込む**
`dotenv` を使って `.env` ファイルの環境変数をロードし、Python の `os.environ` から値を取得できます。

```python
import os
from dotenv import load_dotenv

# .envファイルの内容を読み込む
load_dotenv()

# 環境変数を取得
database_url = os.getenv("DATABASE_URL")
secret_key = os.getenv("SECRET_KEY")
debug_mode = os.getenv("DEBUG")

# 結果を表示
print(f"Database URL: {database_url}")
print(f"Secret Key: {secret_key}")
print(f"Debug Mode: {debug_mode}")
```

---

### **補足**
#### **環境変数のデフォルト値を設定**
`.env` に値がない場合、デフォルト値を設定することもできます。

```python
secret_key = os.getenv("SECRET_KEY", "default_secret")
```
上記のようにすると、`SECRET_KEY` が `.env` に定義されていない場合 `"default_secret"` を使います。

---

### **なぜ.envファイルを使うのか？**
#### **メリット**
✅ **セキュリティ向上**  
・APIキーやパスワードを直接コードに書かずに済む。  
・誤ってリモートリポジトリ（GitHubなど）にプライベート情報をアップロードするのを防げる。  

✅ **環境ごとの設定を簡単に切り替え可能**  
・ローカル環境、本番環境で異なる設定を使用できる。  
・`.env` の内容を変更するだけで、アプリの動作を調整できる。  

✅ **設定情報の管理が楽になる**  
・複数の開発者が関わる場合でも、`.env.example` などのサンプルを用意すれば、簡単に環境設定を共有できる。  

---

### **まとめ**
1. `.env` ファイルに環境変数を定義する。  
2. `python-dotenv` をインストールする (`pip install python-dotenv`)。  
3. `dotenv.load_dotenv()` で `.env` をロードし、`os.getenv()` で値を取得する。  
4. `.env` ファイルは `.gitignore` に追加し、Gitにアップロードしないようにする。  

この方法を使うことで、安全かつ便利に環境変数を管理できます！
【HTML】HTMLの基本構造について改めて勉強してみた③～head要素とその子要素~


下記記事の続きです（②記事については編集中です）。

https://qiita.com/moko_san/items/0339996542cf0c886f9c



# 基本構造
```HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```
今回は、３行目～７行目の```<head>```とその子要素を確認していきます。
# ３行目：head要素
ページ情報であるメタデータを記述する要素の親要素です。
この内容はページには表示されません。
必ずtitle要素を１つ含みます。
### メタデータとは
データを説明するためのデータのことです。
HTML文書としては、ページタイトル、ビューポート、文字エンコーディング指定などが
あります。
# ４～５行目：meta要素
他要素で指定できないメタデータを記述するための要素です。
終了タグはなく、内容を持つことはできません。メタデータの内容は各種属性で
指定します。
基本的にはcontent属性は含まないといけませんが、charset属性の場合は不要です。
## charset属性
HTML文書内で適用する文字エンコーディング（文字コードの変換ルール）を指定するための
属性です。一般的な現在のHTML文書ではUTF-8を利用します（[Encoding Living Standard](https://encoding.spec.whatwg.org/#preface)
により必須として要求されています）。
```html
<meta charset="UTF-8">
```
## name属性
任意のメタデータの名前を指定する属性です。メタデータの内容を指定するcontent属性
と併用します。
メタデータの標準的な名前は、[HTML Living Standard](https://html.spec.whatwg.org/multipage/semantics.html#standard-metadata-names) に記載があります。
例えば５行目の内容は、ビューポートについての指定です。
```viewport```という名前のメタデータについて、```width=device-width, initial-scale=1.0```
という内容を設定しています。
```HTML
<meta name="viewport" content="width=device-width, initial-scale=1.0">
```
表示領域が異なる場合の表示方法を```content```属性によって以下のように指定しています。
様々なデバイスでページを閲覧することがほとんどのため、指定が推奨されます。
**```width=device-width```**
　幅についての指定です。
　```device-width```と指定しているため、デバイスやブラウザの横幅に合わせて表示する
 　ような指定です。
**```initial-scale=1.0```**
　最初にページを表示したときのズーム倍率を指定します。
　```1.0```と指定しているため、拡大縮小なしの等倍で表示します。

### ビューポートとは
デバイスやブラウザでページが表示される領域のことです。
PC、タブレット、スマートフォンなどのデバイスやブラウザの表示サイズにより
異なります。

# ６行目：title要素
```html
<title> 採用情報 | ABC株式会社 </title>
```
ページのタイトルを指定するための要素です。
子要素などは含められず、テキストのみを内容として持つことができるため
タグなどを記述するとテキストとして出力されてしまいます。

ブラウザのタブに表示されたり、検索結果の内容表示として利用されます。
また、スクリーンリーダーはこの内容を最初に読み上げるため、
適切に内容を設定することが大切です。
同じシステムやページ内のすべてのHTML文書で同一のタイトルをつけてしまうと
現在のページがどの内容か、タイトルから分かりづらくなってしまいます。
そのため、固有のページタイトル、カテゴリ、会社名やサイト名などをページごとに設定
するようなタイトルにすると分かりやすいです。
例えば、MDNは以下のようにページタイトルを構成しています。

▼title要素の記事（https://developer.mozilla.org/ja/docs/Web/HTML/Element/title）
「&lt;title&gt;: 文書題名要素 **- HTML: ハイパーテキストマークアップ言語 | MDN**」

▼meta要素の記事（https://developer.mozilla.org/ja/docs/Web/HTML/Element/meta）
「&lt;meta&gt;: メタデータ要素 **- HTML: ハイパーテキストマークアップ言語 | MDN**」

「:」「-」「|」などで内容を区切り、かつ「固有のページ名 - カテゴリ名 | サイト名」という
構成で統一させています（太字部分は共通）。

# 参考
https://developer.mozilla.org/ja/docs/Web/HTML/Element/head
条件で絞り込んだEntityやIssueの一覧表示を保存してみた

New Relicには条件でフィルターしたEntityやIssueの一覧表示を保存できるSave viewという機能があります。本記事では、Save viewの活用方法について具体的な手順とともに紹介したいと思います。

:::note info
最新のアップデートの詳細はこちら
- [New Relic アップデート(2024年6月)
](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202406 "New Relic アップデート(2024年6月)")
- [New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::


# Save viewとは

New Relicには、**条件で絞り込んだ一覧表示を保存できる「Save view」という機能**があります。この機能を使うことで、**よく使う検索条件や表示設定を保存しておき、必要なときにすぐに呼び出す**ことができます。

保存された表示設定は **All Capabilitites > Saved Views で一覧で確認**することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/71e0677a-51a7-508d-2200-a25f3329e455.png)

# Save viewの使い方

## :one: 一覧画面での条件設定

まず、保存したい条件で一覧を絞り込みます。

例えば、APMの一覧画面で言語がJavaであるEntityに絞る場合は、APM & Services で Serices - APM の隣にある[View all]をクリックして、APMの一覧を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/c67be64e-3aa3-cab7-78a9-8fd19db9679a.png)

一覧が表示されたら、+ボタンをクリックして、フィルター条件として language = java と設定して [Add] をクリックします。一覧がフィルターされていることを確認します。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/744e5413-f7fa-bf73-02ed-e29efb5cbce1.png)


## :two: ビューの保存

フィルター条件が完了したら、画面右上の「Save view」ボタンをクリックします。
このときに、保存する表示設定の名前と誰が閲覧することができるかを選択して[Save]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/3e1ceedf-2af9-a57e-fb49-2bd481c27cb4.png)


## :three: 保存したビューの利用

保存したビューは、画面左側のメニューから簡単に呼び出すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/c34b388f-919d-638a-e9ba-93ef1f10c2b1.png)

また、All Capabilitites > Saved Views で一覧から呼び出すことも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/71e0677a-51a7-508d-2200-a25f3329e455.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/2ab620f7-f63d-78fa-14bc-aa304fced11f.png)


# 活用例

Save view機能を活用することで、New Relicでの作業効率を大幅に向上させることができます。よく使う検索条件を保存して効率的にNew Relicを活用してください。

- 担当しているシステムのEntityを一覧表示
- 特定のアプリケーションに関連するアラートを一覧表示

# その他
New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
【競技プログラミング】AtCoder Beginner Contest 360_E問題

# 問題
https://atcoder.jp/contests/abc360/tasks/abc360_e

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)

# 独り言

AtCoder360のC/D/Eを考えていると、自信なくすわ。
C/Dなんて理解するのに苦労したのにdiffが非常に低いし、Eは問題分けわからないし。
まばらに問題見てきたけど、モジュラ逆数って初めて遭遇したんじゃないかな。

[モジュラ逆数と拡張ユークリッドの互除法を理解する](https://qiita.com/Cper0/items/1dc7e7db1eddcbfd259f)を読んで要約理解できました。

中学・高校で水色持っている人達って、このレベルの問題はサクサク解けるの？？

多分、私が学生時代に挑戦してても無理だったと思うけど、まぁ上位勢は本気で魔境だからペースを崩さないようにマイペースで進めますか。


# 解法手順1

1. 必要な定数と変数を初期化する。
   - MOD: 998244353（問題で指定された法）
   - n, k: 入力値（ボールの数と操作回数）
   - dp: 動的計画法のテーブル（各操作回数での期待値を格納）

2. 逆元を計算する。
   - inv_n: nの逆元（mod MOD）
   - inv_2: 2の逆元（mod MOD）

3. 確率計算に必要な値を事前に計算する。
   - p: 黒いボールが動く確率
   - q: 黒いボールが端に移動する確率

4. 動的計画法で各操作回数での期待値を計算する。
   - dp[i+1] = dp[i] * (1-p) + (1-dp[i]) * q
   - これは、前の状態から黒いボールが動かない確率と、端に移動する確率を考慮している

5. 最終的な期待値を計算する。
   - 最後の操作後、黒いボールが動かなかった場合とランダムな位置に移動した場合を考慮
   - ans = dp[k] + (1-dp[k]) * (n+1)/2

6. 計算結果をMODで割った余りを出力する。


# ACコード1
```python:ac.py
import logging

def setup_logger(debug_mode):
    logger = logging.getLogger(__name__)
    if not logger.handlers:  # ハンドラが存在しない場合のみ追加
        logger.setLevel(logging.DEBUG if debug_mode else logging.INFO)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        
        file_handler = logging.FileHandler('program_trace.log', encoding="utf8")
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
    
    return logger

# 法を定義
MOD = 998244353

def io_func():
    # 標準入力からnとkを読み取る
    return map(int, input().split())

def solve(n, k, logger):
    logger.debug("動的計画法の計算を開始")
    
    # dpテーブルを初期化
    dp = [0] * (k + 1)
    dp[0] = 1  # 初期状態では黒いボールは必ず左端にある
    
    # nとnの逆元を計算
    inv_n = pow(n, -1, MOD)
    inv_2 = pow(2, -1, MOD)
    
    # 確率pとqを計算
    p = 2 * (n - 1) * inv_n * inv_n % MOD
    q = 2 * inv_n * inv_n % MOD
    
    logger.debug(f"確率計算: p = {p}, q = {q}")
    
    # 動的計画法で期待値を計算
    for i in range(k):
        dp[i+1] = dp[i] * (1 + MOD - p) + (1 - dp[i] + MOD) * q
        dp[i+1] %= MOD
        logger.debug(f"ステップ {i+1}: dp[{i+1}] = {dp[i+1]}")
    
    # 最終的な期待値を計算
    ans = dp[k] + (1 - dp[k] + MOD) * inv_2 * (n + 2)
    ans %= MOD
    
    logger.debug(f"最終的な期待値: {ans}")
    
    return ans

def main():
    logger = setup_logger(debug_mode=False)
    n, k = io_func()
    result = solve(n, k, logger)
    print(result)

if __name__ == "__main__":
    main()

# ###
# - MOD: 計算結果を割る法（998244353）
# - n: ボールの総数
# - k: 操作回数
# - dp: 動的計画法のテーブル。各要素は各操作回数での黒いボールが左端にある確率
# - inv_n: nの逆元（mod MOD）
# - inv_2: 2の逆元（mod MOD）
# - p: 黒いボールが動く確率
# - q: 黒いボールが端に移動する確率
# - ans: 最終的な期待値

# 1. io_func関数: 標準入力からnとkを読み取る
# 2. solve関数: 主な計算ロジックを実装
#    a. dpテーブルを初期化
#    b. 逆元と確率を計算
#    c. 動的計画法で各操作回数での期待値を計算
#    d. 最終的な期待値を計算
# 3. main関数: プログラムのエントリーポイント
#    a. ロガーをセットアップ
#    b. 入力を受け取る
#    c. solve関数を呼び出し
#    d. 結果を出力
```
【ChatGPT】50-80-100ルールで、問題解決の助言をしてくれるPromptです。


　どうも、カーブミラーです。

　今回は、50-80-100ルールで、問題解決の助言をしてくれるPromptです。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　まずは、ニュースです。

　メディアプラットフォームのnoteが
　　Google Geminiを搭載しました。
　　　しかも無料での開放です。

　誰でも回数制限なしに使えます。

　[note株式会社ポスト](https://x.com/note_corp/status/1886634687537303798?t=L2Y-rZbhhTe-4A8ZbFxs1g&s=19)
***
　次に

　カリフォルニア州立大学システムは、
　　これまでで、最大数の
　　　ChatGPTを導入する｡

　460,000人の学生と
　　63,000人以上の教職員に
　　　AIを提供する。

　[OpenAI and the California State University system bring AI to 500,000 students and faculty](https://openai.com/index/openai-and-the-csu-system/)
***
　最後に

　OpenAIが
　　リブランディングしました。

　[Design Guidelines](https://openai.com/brand/)

　[YouTube動画・Refreshed.](https://youtu.be/k3d_xeVxEOE?si=gf_ma54z66cddgDX)

　まぁ、見た目の変化は
　　ありませんが😅
***
　ではさっそく、【本題】です。

　今回は、
　　50-80-100ルールで、
　　　問題解決の助言をしてくれる
　　　　Promptです。

　こちらの記事を
　　参考にしました。
　　　[完璧主義で疲れているあなたへ｜Apple、Amazonも実践する「適度主義」の成功法則](https://studyhacker.net/perfect-failure-success)

　こちらがそのPromptです。
　　＊＊＊に解決したい問題を書き、
　　　送信してください。
```Text:50-80-100ルールで問題解決の助言するPrompt
あなたは優秀なコンサルタントです。  
以下の問題に対して、「50-80-100ルール」を用いた解決策を提案してください。  

【問題】  
{＊＊＊}  

【50%の完成度】  
まず、大まかな枠組みを作り、最低限の解決策を考えてください。  
この段階では、細かい部分にはこだわらず、全体の方向性を決めることを重視してください。  

【80%の完成度】  
次に、実際に使えるレベルまで具体化してください。  
どのように進めれば、問題が解決に近づくのか、重要なポイントを挙げて説明してください。  

【100%の完成度】  
最後に、仕上げとして細部を磨き、より洗練されたアドバイスを提供してください。  
実際の成功事例や追加の工夫があれば、それも含めてください。  

出力は、【50%の完成度】→【80%の完成度】→【100%の完成度】の順番で、分かりやすく整理して提示してください。
```

　解決したい問題には
　　どういうものなのかを入れると、
　　　より具体的な助言がもらえます。

　例えば、
　　“{ひとつの小説作品を書きたい。ジャンルはファンタジー異世界もののラノベ。Web投稿} ”と
　　　書き入れれば、
　　　　それに適した具体的な助言が
　　　　　もらえました。

　おそらく、
　　もっと入れれば、
　　　本当に具体的な助言を
　　　　得られることと思います。

　あるいは、
　　深堀りしてみることも
　　　良いでしょう。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
LambdaのProvisioned Concurrency利用に関するメモ

Lambdaのコールドスタートを回避したく、Provisioned Concurrencyを利用することとした。それに関するメモ。いじってみての所感も入っているので、間違えているかも。

## 設定箇所

対象Lambda関数の"設定">"同時実行と再起の検出"と進むと設定できる

## 設定内容 

### 同時実行
"同時実行”を設定しただけではLambdaが起動しっぱなしにはならない。形としては、これは対象の関数が占有できる枠を抑えたにすぎない様に思う。
今回は、一つのLambdaのみ動かしておきたいので１を設定した。

### プロビジョニングされた同時実行設定

これが必要。ここに追加することでLambda関数が起動しっぱなしになる。
ただ、ここで設定するためには、対象のバージョンを設定し、エイリアスを作成する必要がある。

### バージョン

"バージョン"タブで設定すれば、$LATESTに対してバージョンが振られる。なので、再デプロイした時は再度バージョンを設定しないとデプロイ前の物を使い続けることになる

### エイリアス

"エイリアス"タブで設定できる。上記のバージョンを指定してエイリアスを作成できる。
これは、基本的にバージョンを指定することになるので、新しいバージョンをリリースした場合は対象バージョンを変更する必要がある。

### プロビジョニングされた同時実行設定（再）

そしてここに戻り、対象のエイリアスを指定して同時実行設定を追加。

## API Gatewayとの接続

ここで、エイリアスを起動して同時実行として設定したところで、WebAPIを叩いてもここでは処理されない。APIGatewayの接続を、こちらに切り替える必要がある。
この設定は、以下で対応可能。
1. エイリアスの画面で、エイリアスのARNを取得
2. API Gatewayの対象のメソッドの”統合リクエスト”で、そのARNを設定する（差し替える）

とりあえず、上記の感じで対応できた。
これをSAMで実行したいが、それはこれからの検討。。。
「JEDAI2025新年会meetup!」に参加してきた！

# はじめに
先日行われた、DatabricksのユーザーコミュニティJEDAI主催の「JEDAI2025新年会meetup!」に参加をしました。JEDAIのユーザー会に初めて参加しましたが、非常に実りある会であったため、お礼も兼ねてレポートとしてまとめました。

https://jedai.connpass.com/event/342295/

# 参加のモチベーション
昨年9月に、[所属するprimeNumberが「テクノロジーパートナー」](https://primenumber.com/news/1297)に認定されました。
私自身も案件として携わる機会が増えてきたので、実際にDatabricksを利用するユーザーの解像度を上げることに加え、TROCCOやCOMETAといった自社プロダクトとの連携についても考えるきっかけになればと考え、今回参加するに至りました。

# 会の中身
オープニングの後、２社の発表があり、その後の交流会といった流れでした。
オープニングの前にアイスブレイクとして、参加者間の交流も10分程度ありました。

発表は、X（旧Twitter）の投稿のようにスクリーンで登壇者が発表するスタイルで行われました。

https://x.com/taka_aki/status/1884172380773511587

## オープニング
昨年の運営の振り返りと、今年の運営方針について発表がありました。
今年は、月一開催で様々なテーマの発表が行われるそうです。
オープニングのタイミングで、もうすでに来月分も開催が決まっており、運営のスピード感がすごいなあと感じました。

https://jedai.connpass.com/event/344119/

私も業務に直結するテーマについて、積極的に参加したい！と思っています。


## Databricksで挑む！　SEGAのデータ活用の次なる一歩
セガ社においてDatabricksのUnity Catalogからデータを参照できるようにしたお話でした。

かつては、AWSのRedshiftからビジネスサイド、データアナリスト、データエンジニアがそれぞれでデータを取り出して、思い思いのツールで分析や可視化等を行っていたようでした。
グローバルでのデータ活用を推進したいというビジネス的な課題もあったそうです。

Databrickでは、[Lakehouse Federation](https://docs.databricks.com/ja/query-federation/index.html)という機能があります。
この機能によって、Amazon Redshiftをはじめ、BigQueryやSnowflakeにもあった社内のデータをUnity Catalogに集約できたようです。また、１つのデータカタログ上で違う活用用途の分析や開発ができるため、データの統合を急速に進めることができました。

Unity Catalog導入後、導入前にあったデータ取得やテーブル設計の相談が激減し、データアナリストの要望通りにデータマートを作れるようになったそうです。

今後はDatabricks Appsを活用していき、グループ内の職種全体（マーケ、デザイナー、グループ会社、ゲーム担当、運営担当も含め）に展開していくとのことでした。

2025/2/16追記: こちらの発表も、Speacker Deckに資料が公開されていました!

https://speakerdeck.com/databricksjapan/sega-future-of-data-analytics-with-databricks

## MILIZE ProにおけるDatabricks活用事例 〜データカタログ化とAIによる開発効率化の実現〜

MILIZE社において、かつてMongoDBにあったデータをDatabricksに移行した話と、コードアシスト機能のAiderを使って、DatabricksのNotebook開発生産性を上げている発表でした。

まず、MonGoDBのネスト構造をDatabricksで可視化したところ、かなり複雑な構造になっていたそうです。
Databricksジョブとワークフローを用いることで、Databricks上でわかりやすい構造のデータに変換できたそうです。

![スクリーンショット 2025-02-04 12.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/42b24df2-d59f-fbed-5bb6-acace4533dd0.png)

また、Aiderを使ってDatabricks内のセキュアな環境で、開発生産性を上げている点も非常に興味深い内容でした。
GitHub CopilotやClineといった別製品の場合、VS Codeでないと対応していなかったり、コードのコピペが厳禁だったりします。しかし、Aiderであれば、シェルスクリプトでコマンドを入力することで、Databricksの環境でも対応可能です。今後は、Databricks Assistantのコードアシストツールと併用して、さらなる開発生産性向上を目指すとのことでした。

こちらの発表は、Speacker Deckにも資料が上がっています。

https://speakerdeck.com/onhrs0622/milize-proniokerudatabrickshuo-yong-shi-li-detakataroguhua-tokodoai-agentniyorukai-fa-shi-qing

## 交流会
交流会では、セガ社で発表いただいた方に、発表の深いお話を聞かせて頂きました。データの統合が進んだなかで、今後も取り組みたいことについても話が盛り上がりました。

また、「データ活用は進めたいけど、Databricksの導入はこれから」といった企業の方ともお話させて頂きました。私が所属するプロフェッショナルサービスで行っている「企業のデータ活用の支援」や「データ基盤整備」と被る部分も多くあり、お話していて知的好奇心がそそられる話ばかりでした。

# 最後に
今回、初めてJEDAI主催のユーザー会に参加をしました。会に参加して、Databricksユーザーの声や、実際のユースケースも解像度高く理解することができました。
また交流会でも、発表では聞けない裏話的なことも聞けたため、対面で参加して意味のある会となりました！

今後は業務に直結する領域を中心に、会に参加しつつ、自社内に還元できたらなと感じる次第です。
renderでHTMLだけのWEBページ(static Site)をデプロイする手順

## はじめに

本記事では、[Render](https://render.com/)を使用して、HTMLのみで作成した静的なWebサイトをGitHubリポジトリからデプロイする手順を解説します。

## 対象者

- Webサイトを簡単に公開したい人
- プログラミング初心者
- GitHubを使ってWebサイトを管理したい人
- Renderを利用してみたい人

## Renderとは？

Renderは、無料で利用できるクラウドサービスの一つで、簡単に静的なWebサイトやWebアプリケーションをホスティングできます。デプロイの手順がシンプルで、GitHubとの連携もスムーズに行えるのが特徴です。

## デプロイの手順

### 1. Renderのアカウントを作成し、GitHubと連携

まず、[Render公式サイト](https://render.com/)にアクセスし、アカウントを作成します。

その後、GitHubアカウントと連携します。

### 2. 新しいStatic Siteの作成

1. 「My Workspace」の「Overview」タブを開く
2. 右側の「Add new」ボタンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657075/30385711-9451-86c9-09ee-92b0f96c13d6.png)


3. 「Static Site」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657075/6bb446ca-77a4-e19d-9d97-849acf7a8324.png)


### 3. GitHubリポジトリを選択

次に、デプロイしたいHTMLファイルが含まれるGitHubリポジトリを選択します。

1. 「Source Code」欄にGitHubの候補リポジトリが表示されるので、該当のリポジトリを選択
2. 「Continue」ボタンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657075/ae3b8ef4-b206-2cac-37bd-af66aa9b810e.png)


### 4. サイト情報の入力

以下の情報を入力します。

- **Name**: 公開するサイトの名称
- **Publish Directory**: `./`（ルートディレクトリ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657075/b3e6ee48-404a-4b45-a397-5c11e6e8964e.png)


### 5. デプロイの開始

1. 画面下部の「Deploy Static Site」をクリック
2. デプロイの進捗状況が表示されるので、完了するまで待つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657075/f248aafe-4b4e-f482-4697-376736e922d6.png)


### 6. デプロイ完了とWebサイトの公開

デプロイが完了すると、「Your site is live」と表示され、WebサイトのURLが発行されます。

このURLをクリックすると、Webブラウザ上でサイトを確認できます。


## まとめ

今回は、Renderを使ってGitHubからHTMLファイルをデプロイする手順を説明しました。
Renderを利用すれば、無料かつ簡単にWebサイトを公開できますので、ぜひ試してみてください！

## 参考記事

[無料で使える！ Render.comとは？](https://qiita.com/ren_180/items/d82b371783e638b6c3d7)
基本情報技術者試験を久しぶりに受けてみた

ITエンジニアの基本資格としてよく上げられる基本情報技術者試験。
私は10年ほど前に旧基準で資格合格しているのですが、新基準ではどのような試験になっているのかを知りたくて先日再受験しましたのでそちらのレポを記載しようと思います。

# 試験結果について
科目A(旧試験で午前)：0685/1000点
科目B(旧試験で午後)：1000/1000点
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990347/3821c65a-8734-d448-2d7f-02fd9872c6b8.png">

「結果公開前」となっていますが、基準点を超えてるので合格していそうです。
※不正の確認とかしているんですかね？すぐ結果出してくれればいいのに...

# 試験内容について

試験の内容については試験の規約上詳細をお話しすることはできないので簡単に所管だけお話ししようと思います。

## 科目A
旧試験で午前といわれていた箇所ですね。
過去と比べると新しい技術や用語が増えている分昔の勉強した記憶ではとれるところが少なかったですね。

結果的にはぎりぎりの点数になってしまいました。。。

## 科目B
旧試験で午後と呼ばれていた箇所ですね。
問題配分が変わってアルゴリズム8割、セキュリティ2割になったのでかなり範囲が絞られた配分になった印象です。

アルゴリズムについては順当に読んでいけば解けそうな感じですので、大体の問題が自信をもって解けたので結果が出てよかったです。

# 受験の所管について
旧試験と比べると試験時間も問題数も短く、テストセンターで自分の時間で入って行けるので私としては少し楽になった印象を覚えました。
特に、私が受験したところのセンターはほぼほぼ人がいなかったので誰かに集中を切らされることもなかったのでいい感じでした。

# 勉強法について
今回の目的が試験を知ることだったのであんまり勉強はしてきていないのですが、問題の傾向等を見てこんなことをすればよさそうっていうのを書き出していこうと思います。

科目Aについては広く浅く様々なことを覚えるのがよさそうです。
そのためにおなじみにはなりますがとにかく過去問を解いて覚えることですね。
重要なキーワードが拾えるのでとにかく解いて覚える、がよさそうです。

過去問を解くならこちらのサイトがおすすめです。
基本情報技術者試験ドットコム: https://www.fe-siken.com/fekakomon.php

科目Bについては私の私見としては問題を解くための論理力/文章力/イメージ力が重要になってくるように思います。
もちろんアルゴリズムという科目自体への理解も重要ですが、それ以上に重要なワードが拾えるようになること/順序だてて物事を整理できることが大事だと思います。
イメージ力についてはいわゆる具体化の能力ですね。アルゴリズムでは結果的に数値を求められることが多いと思いますので各選択肢について具体的に代入した結果どのような出力が得られるかを考えてみると確実に答えに近づけると思います。

論理的思考力については以下の書籍がおすすめです。

https://amzn.asia/d/2barQsh



# 終わりに
私は今高度情報処理資格としてネットワークスペシャリストの受験に向けて勉強中です。
同じく勉強してる方はともに頑張っていきましょう！
Windowsにollamaを入れてローカルLLMを試す

# はじめに
ローカル環境にてLLMをより気軽に試す手段としてollamaというものがあります。
以前から自分のPCで試そうと思っていましたが、中々時間が取れず後回しになっていましたが、環境構築ができたのでその備忘録です。

# 環境概要
ollama本体はWindows版のバイナリをDLしてインストールしています。
ollama本体はCLIツールなので利便性良くするためにopen-webuiも入れています。
こちらは、WindowsのAnaconda上にPython3.11の環境を作成し導入しました。

# ollamaのインストール
1. 下記のURLからダウンロードします。
https://ollama.com/download
1. インストーラの起動
任意のパスにインストールする場合には下記のようにします。
```OllamaSetup.exe /DIR="d:\llmtest"```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/6e875995-b2ea-4b61-349d-cbc495b8a96f.png)
1. ollama導入後の動作確認
導入直後の状態では言語モデルが入っていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/89e4706c-b42c-5c25-525b-d783f21e5ac2.png)
次のコマンドでインストールします。
```ollama run ollama run granite3.1-dense:2b```
この時モデルはアカウントのホームディレクトリにダウンロードされます。
変更する場合はOLLAMA_MODELSという環境変数に値を入れる必要があります。
私はCドライブの空き容量が少ないのにホームディレクトリに入れてしまったので後日試します。
今回はIBMのLLMであるgranite3.1-dense:2bを導入しました。
利用可能なモデルは以下のURLから確認できます。
https://ollama.com/search
最近話題の中国のLLMであるdeepseekやqwenもリストされていますので追々試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/21688621-1ebe-5c7c-b90a-818241780a04.png)
```ollama run```を入れた後、プロンプトが表示されるので、何か適当に聞いてみましょう。
1. AirGappedでのLLM動作確認
オフライン状態でもLLMが利用できることを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/8f53ed6f-e956-5a52-8812-c094f6caf72e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/90786c8d-573b-248b-d76d-9ab065944030.png)
問題なく動くようです。

# Open-webuiのインストール
1. Python3.11の環境を作成します
私は環境の管理がしやすいAnacondaを利用しています。（この検証は私用PCでの個人的な検証です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/5101b7d6-0ab1-9777-60f1-56584f151d61.png)
コマンドプロンプトを開き、以下のコマンドを実行します。
```pip install open-webui```
WebUI関連のモジュールがダウンロードされ準備されます。
1. open-webuiの開始
次のコマンドでWebUIが開始されます。
```open-webui serve```
1. open-webuiの起動画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/8a6f8caa-2484-43fb-5b6c-2265f3b649d8.png)
管理アカウントの作成が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/6ba812ef-c64d-2549-7bb9-1593725f6d6b.png)
必要な情報の入力をしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/88777ccf-aad3-f320-04da-611ad6f3a12d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/c81f3848-f276-34d5-ba23-42f7f01868fc.png)
1. 動作確認
先ほどDLしたモデルがリストされるので会話してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/b6b64903-79af-c3a5-b859-f668888cd293.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/d2bf3932-9c0a-d087-c011-793acd6c3014.png)
会話時のGPU負荷とVRAM使用状況です。私はRTX3060 12Gを使っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203259/009b3230-b3ef-c779-a00b-95b617111cbc.png)

# まとめ
ollamaとOpen-webuiを利用することで、かなり簡単にLLMのローカル環境を構築できました。
今後はRAGとの連携なども試してみます。
LLMの活用に興味はあるが、データの外部接続やクラウド利用に制限のある状況下で比較的安価なコンシューマー向けGPUでもLLMを試すことができるのは良いと思いました。

私はまずは、モデルのDL先を指定ディレクトリに変えてみます。
OpenAIが提供する主要なモデル７選

以下は、OpenAIが提供する主要なモデルの特徴を整理した表です。モデルの種類、用途、パフォーマンス、対応する機能などを比較しています。

| **モデル名**       | **用途**                     | **特徴**                                                                 | **主な機能**                       | **API対応** | **備考**                                 |
|--------------------|------------------------------|--------------------------------------------------------------------------|------------------------------------|-------------|------------------------------------------|
| **GPT-4 Turbo**    | 高度なテキスト生成・分析    | GPT-4ベース、GPT-4より高速でコスト効率が高い                           | チャット、要約、翻訳、推論、生成    | あり        | ChatGPT (有料プラン) で使用可能          |
| **GPT-4**          | 高精度な自然言語処理         | 高度な推論能力、複雑なタスクにも対応                                    | 長文生成、複雑な推論、コード生成    | あり        | より高コスト、Turbo版より遅い場合がある |
| **GPT-3.5**        | 高速な応答、軽量処理          | GPT-4に比べてコストが低く、応答速度が速い                               | テキスト生成、簡易チャットボット     | あり        | 無料プランのChatGPTで使用可能            |
| **DALL·E 3**       | 画像生成                     | 高解像度の画像生成、テキストプロンプトに基づくクリエイティブな出力       | 画像生成、画像編集（インペインティング） | あり        | ChatGPTで直接画像生成が可能              |
| **Whisper**        | 音声認識                      | 高精度な音声からテキストへの変換、マルチリンガル対応                     | 音声文字起こし、翻訳                 | あり        | 高精度だがリアルタイム用途には向かない   |
| **Codex**          | コード生成                   | 複数のプログラミング言語に対応、コード補完やデバッグが可能               | プログラミング支援、コード生成       | あり        | GitHub Copilotで広く使用                 |
| **Embeddings**     | テキストのベクトル化           | テキスト検索や類似度計算向け、意味的な類似性を捉える                    | 検索エンジン、レコメンドシステム     | あり        | GPT-4対応の高度なベクトル化が可能        |

### **ポイント解説**

- **GPT-4 Turbo vs GPT-4:** Turboはコスト効率が良く、APIでの使用にも最適。GPT-4はより高精度な推論タスク向け。
- **DALL·E 3:** 画像生成において大幅に品質向上、編集機能も統合。
- **Whisper:** 多言語対応が強み、インタビューや会議の文字起こしで活躍。
- **Codex:** プログラミングの自動化や補助に特化し、開発者向けに人気。

この表は最新の情報に基づいていますが、モデルや機能のアップデートが頻繁に行われるため、定期的な確認をお勧めします。
バッファなしチャネルの挙動について

------------
🚀 非同期処理（ゴルーチン） = 複数の作業を同時に進める
📩 チャネル = ゴルーチン間でデータをやり取りするための仕組み

だから、Goで 「複数の処理を非同期にしたい」→ ゴルーチン！
「非同期処理同士でデータをやり取りしたい」→ チャネル！

これを覚えておけばバッチリ！😊✨

------------

### 本題

バッファなしチャネルを作ると、デッドロックする。

```
package main

import(
	"fmt"
)

func main() {
	ch := make(chan int)
	ch <- 10
	num := <-ch
	fmt.Println(num)
}
```
実行結果
```
fatal error: all goroutines are asleep - deadlock!
```


### このコードを実行したときに起こっていること
```
ch := make(chan int)
```
これで、チャネル`ch`が作成される。
```
ch<-10
```
チャネル10を送信するが、受信先がないのでここでロックしてしまう。
次の行`num:=<-ch`で受信先があるじゃないか！と思うかもしれないが、この行を実行している時点では受信先がないので、この行で受信先をいつまでも待ってしまうことになり、コードがデッドロック状態になっていた、というわけだ。

### go routineを使って並列処理にする
```
package main

import(
	"fmt"
)

func main() {
	ch := make(chan int)
	go func(){
		ch <- 10
	}()
	num := <-ch
	fmt.Println(num)
}
```
ch<-10の送信部分を並列処理に渡すと、mainでnum:=<-chの受信部分が実行され、numに値を渡せるようになる。

----
tips: バッファありチャネルなら、バッファ分まではデッドロックが起こらない

```
func main() {
	ch := make(chan int, 3) //バッファサイズ３
	ch <- 1
	ch <- 2
	ch <- 3
	
	num := <-ch
	fmt.Println(num)
	num = <-ch
	fmt.Println(num)
	num = <-ch
	fmt.Println(num)
}
```
実行結果
```
1
2
3
```
(ちゃんと、FIFOになってる。)
Chakra UI V3でシステム設定の色がデフォルトカラーになってしまう

# はじめに
Chakra UI V3で詰まったところを解消します

# 問題
Chakra UI V3を使った時に、デフォルトのカラーがダークモードになっていました。
原因を探っていると、自分が使っているPCの設定がダークモードになっていたため、
デフォルトのカラーモードも変わったみたいでした。

# 解決方法
ドキュメントを見ると、
・ColorModeProvider や useColorMode は Chakra UI v3 から削除された
・常にライトモードやダークモードに固定したい場合は、Chakra UI v3 で推奨される next-themes などを使うのが最も簡単

などが記載されていたので、ThemeProviderを間に挟むことでなんとか解決


```react:provider.tsx
import { ChakraProvider } from "@chakra-ui/react";
import { ThemeProvider } from "next-themes";
import { system } from "../../theme";
import { ColorModeProvider, type ColorModeProviderProps } from "./color-mode";

export function Provider(props: ColorModeProviderProps) {
  return (
    <ThemeProvider enableSystem={false}>
      <ChakraProvider value={system}>
        <ColorModeProvider {...props} />
      </ChakraProvider>
    </ThemeProvider>
  );
}

'
```
# おわりに
Chakra UI v3にしたら急にデフォルトのカラーが変わり、
一気にデザイン性が悪くなったので、とりあえず治ってよかったです。

# 参考
https://www.chakra-ui.com/docs/get-started/migration#color-mode
https://zenn.dev/shimabukuromeg/articles/1062bd78bf096c
https://github.com/chakra-ui/chakra-ui/issues/4987
AWS Certified Machine Learning Engineer - Associate を新規取得した話

# はじめに

・AWS Machine Learning Engineer Associate
が去年の秋頃に正式リリースされたので取得してきました。

Practitionerで、一度躓いてSageMakerを総ざらいしたおかげか、比較的スムーズの解けました。
体感的な難易度は、丁度よい。（難しすぎず、簡単すぎず、アソシなら、これ位よね。の感）

試験のバージョンは、
+ MLA-C01
のバージョンでした。
# スコア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/c41e15c3-8271-3e78-273f-31c21f59080d.png)

+ 機械学習固有の問題、AWS総合的な問題、SageMakerのアレコレがバランスよく出題
+ プルダウン選択式の問題が他の認定試験よりも多め
+ 導入事例問題あり

今までのAWS認定問題から出題形式が少しずつ変わってきている感があります。

# 受験対策

## 公式模擬試験

https://awscertificationpractice.benchprep.com/app/aws-certified-machine-learning-engineer-associate-official-practice-question-set-mla-c01#exams

無料の公式問題（20問）があります。登録して必ず実施しておくことを推奨します。

## 利用した問題集

https://www.udemy.com/share/10c7ot3@SKbqN3TSRyQxTdhAyd9jrEG0wYn88eOVzzZBnaVusv3q0jXR_MsVLK3ecPLF7B00/

SageMaker系の細かい所や、機械学習関連の設問など細かい解説があり、理解や知識の底上げに役立ちました。

https://techstock.jp/

１月後半に入って、こちらでも問題集が配信開始されました。有効期間が残ってたので、こちらも活用しました。

## 抑えておいた方が良いサービス（と一言ポイントメモ）
+ Bedrodk
+ Sage Maker
+ IAM
+ Firehose
+ cloudtrail
+ StepFunctions

「AWS Certified AI Practitioner」よりも、比較的、スムーズに解けました。
初見の問題でも設問の中のキーワードから類推が効くのが、まだ分かりやすいのだと思います。

# まとめ
生成AIの分野が、まだまだ世を賑わしています。
この分野は、引き続き抑えていきたいですね。

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
OpenWrt 24.10.0が正式リリースされました！

OpenWrt 24.10.0がついに正式リリースされました。
既にAttended Sysupgradeでもイメージが作成できるようになっています。

https://openwrt.org/releases/24.10/notes-24.10.0

# 変更点
- TLS 1.3をデフォルトでサポート
- 大きいフラッシュサイズのデバイスでPOSIX ACLとファイルシステムセキュリティ属性を有効化(Dockerで必要らしい)
    - Small_Flash機能フラグがないすべてのターゲットで有効
    - 対象外は下記の通り
        - ATH79/TINY
        - BCM47XX/LEGACY
        - LANTIQ/ASE
        - LANTIQ/XRX200_LEGACY
        - LANTIQ/XWAY_LEGACY
        - RAMIPS/MT76X8
        - RAMIPS/RT288X
        - RAMIPS/RT305X
        - RAMIPS/RT3883
- 大きいフラッシュサイズのデバイスでMultiPath TCPのカーネルサポートを有効化
- Wi-Fi6(802.11ax)のサポート改善とWi-Fi7(802.11be)のサポートを開始
    - まだ多くのデバイスはサポートされていません
- 改善されたLink Layer Discovery Protocol(LLDP)サポート
- OpenWrt 24.10はOPKGのみを使用し、APKパッケージはサポートしません
    - (メインブランチのみAPKに変更されました)

# 具体的な変化(Luci)
## インターフェース
### 詳細設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/a4eb9d2d-0dfe-9346-e5ef-38cac11a45db.png)
IPv6 デリゲーションでサブネットを委任するときの優先度っぽいですね(詳細不明)

### DHCPサーバ - IPv6設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/0417950d-2e77-fbf2-4891-f1a846d12d06.png)
プレフィックスデリゲーションの最小長を指定できるようになったみたいです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/7a4e0416-52ac-e985-70d6-1e55e334ab0e.png)
NTP設定も広報出来るっぽい

## グローバルネットワークオプション
### パケットステアリング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/7ddec2cd-ef23-27da-d7e6-8ea31fae72ed.png)
> 複数のCPUに跨ったパケットステアリングを有効化します。ネットワークスピードの改善または妨げになります。

CPUを全スレッド使うか、一部使うかを選べるようになったみたいです

### Steering flows(RPS)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/6a09911e-77b2-cd0a-098f-80c2b16ea761.png)
> Directs packet flows to specific CPUs where the local socket owner listens (the local service). Note: this setting is for local services on the device only (not for forwarding).

よくわかりません！

## いろんなルール
### Cloneボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/3f052d8c-bc27-b944-4811-d0f77a51a231.png)
ルーティングやファイアウォールなどの設定でCloneボタンが追加され、ルールの複数作成が楽になりました

## DHCPおよびDNS

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/b66824ee-6edd-827e-5116-1d9bf99e55bc.png)
設定項目一覧がガラッと変わりました

:::note warn
インスタンスを空にしたまま24.10.0にSysupgradeしたり、ターミナルから設定を削除するとエラーになってLuci上で設定できなくなります
:::

### Cache
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/b567036c-7ea9-0b10-6844-d34c82801fd0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/62c5e4a4-7785-c431-b100-ec8886679d50.png)

キャッシュ対象が選べるようになったみたいです

### 転送
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/c1d2b278-696c-3dea-fa27-3bdbe0c5846c.png)
なんかいっぱい増えてます。多分DNSサーバにリクエスト投げるときの付加情報とかですかね？

## ファイアウォール
### ルーティング/NATオフロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/93139541-9759-f699-b90a-7c7911a469b7.png)
プルダウンメニューで選べるようになってます

# おわり
何の解説にもなってませんがひとまずここが違う！と気づいたところをまとめてみました。
今のところ不具合もなく動いていますが、しばらく様子見しながら遊んでみます！
Chrome Extension w/z React (超入門)

Chrome Extensionってどうやってつくるの？

# はじめに
Chromeブラウザの拡張機能って奴がJavaScriptで作られてるらしい。ってことで簡易的なものを作成してみたので、メモ。

このメモではウェブストアに公開とかAPIをつかったりとかはしません。
あくまで、__Chrome Extension初見の人が初見の人の為に、環境構築の手助けになりたいためのメモ__ です。

詳しく知りたい方は↓

https://developer.chrome.com/docs/extensions?hl=ja

# 今回のソース

https://github.com/rk7fd3s/vite-react-chrome-extension/tree/master

# 予備知識

### マニフェスト (manifest.json)
必ず必要となるファイル(らしい)
詳細は、公式マニュアルに任せるとして、簡単な説明としては、作る拡張機能はどういったものかを記載したJSONってこと。例えば、拡張機能のアイコンはどういったものか？それを押したとき、どのファイルを表示すればよいか？などを記載する。

https://developer.chrome.com/docs/extensions/reference/manifest?hl=ja


<details><summary>今回生成するmanifest.json</summary>

```json
{
  "manifest_version": 3,
  "name": "Chrome Extension Exercises",
  "description": "Chrome Extension, TypeScript, React",
  "version": "0.0.0",
  "chrome_url_overrides": {
    "newtab": "overrides/index.html"
  },
  "action": {
    "default_popup": "popup/index.html",
    "default_icon": "images/icon.png"
  },
  "icons": {
    "16": "images/risu16.png",
    "32": "images/risu32.png",
    "48": "images/risu48.png",
    "128": "images/risu128.png"
  }
}
```
</details>
にある項目だけを解説する

#### chrome_url_overrides
デフォルトの Chrome ページのオーバーライドを定義します。
つまり、新規タブを作ったときに表示する画面をデフォルトのものから変更することが可能です。

#### action
Google Chrome ツールバーの拡張機能のアイコンを制御します。
アイコンの見た目や押下したときの画面を定義できます。

#### icons
拡張機能のアイコンを定義します。
これは、Google Chrome ツールバー上のアイコンとは別となります。

# 作ったものの説明

### 技術的なもの

* `TypeScript`での`React`フレームワーク
* CSSは `tailwindcss` を使用
* `Vite`を使用して、ビルド

### 機能的なもの

* 拡張機能のアイコン押下時のポップアップ表示
* 新規タブの画面変更

# 構築

##### １. react + ts + vite の環境を作成する
```shell
npm create vite@latest my-vue-app -- --template react-ts
```

##### ２. プロジェクトディレクトリに入ってgit初期化
```shell
cd my-vue-app
git init
```

##### ３. npmモジュールをインストール
```shell
npm install
```

##### ４. 必要なモジュールをインストール
```
npm install -D @types/node
npm install -D @crxjs/vite-plugin@beta
npm install -D tailwindcss @tailwindcss/vite
```

##### ５. 不要ファイルを削除

https://github.com/rk7fd3s/vite-react-chrome-extension/commit/5ccf51ecd242fb2e93d1939da7887fabdf4d3cdb

##### ６. コーディング

```shell
npm run dev
```
で画面(ブラウザ)を確認しながら作成できる

https://github.com/rk7fd3s/vite-react-chrome-extension/commit/b2c5711595ebdd16013c73017d795cf80317faf1

##### ７. ビルド
```shell
npm run build
```
プロジェクトディレクトリ配下にdistディレクトリが作成され、まとまったファイル達が配置される

##### ８. 拡張機能として登録
Chromeの拡張機能を管理する画面にて、「パッケージされていない拡張機能を読み込む」でdistディレクトリを指定する

# まとめ
今回、Chrome Extensionを初めて触ってみるってことで中身はほぼないものを作成したが、既存にある拡張機能を見ても分かる通り色々なことができそうだ。
🚀 VSCodeのターミナルでファイル作成時のエラー解決方法！



VSCode のターミナルで `touch` や `echo` を使おうとして、  
**「操作可能なプログラムまたはバッチファイルとして認識されていません」** というエラーが出た！！  

✅ **原因 → Windows のコマンドプロンプト（cmd）では `touch` コマンドが使えない！**  
✅ **解決策 → `type nul > ファイル名` または `echo. > ファイル名` を使う！**

---

## **🔹 まず、今どのターミナルを使っているか確認！**
VSCode のターミナルは、**2種類のシェル（コマンド環境）** が使える！  

1. **PowerShell**（デフォルト）  
2. **コマンドプロンプト（cmd）**  

**ターミナルの左上に「PowerShell」または「cmd」と書いてあるのを確認！**  

---

## **✅ Windows でファイルを作成する方法**
**1️⃣ コマンドプロンプト（cmd）の場合**
```cmd
type nul > myfile.txt   （← 空のファイルを作成）
echo. > myfile.txt      （← 空のファイルを作成）
```

**2️⃣ PowerShell の場合**
```powershell
New-Item myfile.txt     （← 空のファイルを作成）
```

**3️⃣ WSL（Windows Subsystem for Linux）を使っている場合**
```bash
touch myfile.txt        （← `touch` コマンドが使える！）
```
※ WSL なら `touch` が使えるが、普通の Windows 環境（cmd や PowerShell）では使えない！  

---

## **🔹 VSCode で PowerShell → コマンドプロンプトに切り替える**
もし **`New-Item` も動かない** 場合、ターミナルが PowerShell ではなく cmd になっている可能性がある！  

### **1️⃣ ターミナルのシェルを変更**
1. **VSCode のターミナルを開く（`Ctrl + ~`）**
2. **ターミナルの左上にある「`^`（矢印アイコン）」をクリック**
3. **「PowerShell」または「コマンドプロンプト（cmd）」を選ぶ！**

### **2️⃣ VSCode のデフォルトターミナルを変更（ずっと PowerShell を使う場合）**
1. **`Ctrl + Shift + P`（コマンドパレットを開く）**
2. **「既定のプロファイルを選択」** と検索して選択
3. **「PowerShell」または「コマンドプロンプト」を選択！**
4. **VSCode を再起動！**

---

## **✅ まとめ**
| **環境** | **コマンド** |
|----------|-------------|
| **cmd（コマンドプロンプト）** | `type nul > myfile.txt` または `echo. > myfile.txt` |
| **PowerShell** | `New-Item myfile.txt` |
| **WSL / Linux / Mac** | `touch myfile.txt` |

💡 **Windows の標準環境（cmd や PowerShell）では `touch` は使えない！**  
💡 **自分のターミナル環境を確認し、正しいコマンドを使おう！** 🚀✨
OutSystemsとNULLについて改めて考えてみる

# はじめに
OutSystemsで開発を３年ほどやっています。
「NULL」の概念がないと言われるOutSystemsですが、理解があいまいなままで実際のところどうなんだろうと思い調べてみることにしました。
今回の内容は「内部DB」「Integer/LongInteger型」「Text型」に絞っています。

## NullIdentifier()とNullTextIdentifier()
OutSystemsでNULLを表現する方法ではありますが、Create ActionやCreateOrUpdate Actionで指定してもNullIdentifier()は0に、NullTextIdentifier()は""に置き換えられてDBに登録されてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239988/241f9c68-583f-0f6c-bc43-0d3eae87ebd5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239988/b83396ec-2798-49c3-46b3-c1cfe7cd0253.png)
様々なActionの中で使用する上では、
- NullIdentifier() = 0
- NullTextIdentifier() = ""

という認識で問題なさそうです。
ただし、Aggregateで使用する場合は、NullIdentifier()もNullTextIdentifier()もいずれもNULLとして扱われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239988/f884512a-0d60-7e23-0354-fc262105a3fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239988/0853bd78-27e8-a8bf-3731-a3784b3b29a2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239988/8cbc2175-309c-1ed1-4524-746ba26acac6.png)

上記のパターンで NullIdentifier() = 0 で登録されたデータは、
Filterで例えば、Employee.AgeAtJoining <> NullIdentifier()のように入力した場合、Employee.AgeAtJoiningは0で登録されてしまっているためデータを適切に抽出することはできません。

## じゃあ内部DBにNULLは入らない？
入らないのかと思っていたのですが、こちらの記事にあるように意図的にNULLを入れることは可能です。

https://qiita.com/kata_junn/items/5018b3b42c142d7e4997

SQLでUpdate、Insertの登録・更新値としてNULLを指定します。
ただし、Service Studio上ではNULLが入っているかどうかは確認することができません。
- AggregateのView
- EntityのView
- SQLのTest Output

もし、内部DBの実テーブルにアクセスできる環境があれば、そちらから確認するか「SQL Sandbox」というForgeでDBの中身を見ることができます。

https://www.outsystems.com/forge/component-overview/5900/sql-sandbox-o11

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239988/9e100488-928c-6fc9-4a9b-1ca6c85bbc3e.png)

# 実装時に気をつけること
前述したとおり、意図的に入れない限り、内部DBにNULLが入ることはないと考えていいという認識ですが、Aggregateで扱う場合のみNullIdentifier()と0、とNullTextIdentifier()と""を区別して考える必要があります。
※SQLではNullIdentifier()、NullTextIdentifier()は使用しないためAggregateに限定しました
iOSアプリ開発環境構築@M3Mac


iOSアプリのプロジェクト一式をとりあえず落としてBuildしたらエラー
そういえば、このMacでビルドするの初めてだった

Unable to open base configuration reference file '/pj_name/Pods/Target Support Files/Pods-appname/Pods-appname.debug.xcconfig'.

どうもCocoaPodsが入ってなかった模様（...そりゃそうか）

CocoaPodsのインストール
```zsh
% sudo gem install cocoapods
:
:
ERROR:  Error installing cocoapods:
	The last version of securerandom (>= 0.3) to support your Ruby & RubyGems was 0.3.2. Try installing it with `gem install securerandom -v 0.3.2` and then running the current command again
	securerandom requires Ruby version >= 3.1.0. The current ruby version is 2.6.10.210.
```
rubyのバージョンが古いんだよと怒られる

ruby入れる、前にrbenv入れる
```zsh
% brew install rbenv ruby-build
```
バージョン確認して、とりあえずこの時点ではリリースされて間もないが、3.4をインストールして切り替える
```zsh
% rbenv install --list
3.1.6
3.2.6
3.3.7
3.4.1
jruby-9.4.10.0
mruby-3.3.0
picoruby-3.0.0
truffleruby-24.1.1
truffleruby+graalvm-24.1.1

% rbenv install 3.4.1
:
NOTE: to activate this Ruby version as the new default, run: rbenv global 3.4.1
% rbenv global 3.4.1
% rbenv versions
  system
* 3.4.1 (set by /Users/xxx/.rbenv/version)
% ruby -v
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin23]
```
...切り替わってない
```zsh
% which ruby
/usr/bin/ruby

% source ~/.zshrc
% ruby -v
ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [arm64-darwin23]
```
OK

もう一回CocoaPodsのインストール
```zsh
% sudo gem install cocoapods
:
:
Successfully installed cocoapods-core-1.16.2
Successfully installed cocoapods-1.16.2
34 gems installed

A new release of RubyGems is available: 3.6.2 → 3.6.3!
Run `gem update --system 3.6.3` to update your installation.
```
gemの新しいのがあるらしいが、一旦無視でsetupしてlockファイルから依存関係をインストール
（動作確認なので作られたプロジェクトをごっそり持ってきている）
```zsh
% pod setup
Setup completed
% pod install
```

インストール後、Xcodeに戻って無事にBuild成功
Tableau Desktop→Snowflakeへキーペア認証で接続する

# はじめに
Snowflakeの単一要素パスワード認証が廃止になるため、Tableau→Snowflakeへキーペア認証を使用して接続してみたいと思います。
https://www.snowflake.com/ja/blog/blocking-single-factor-password-authentification/

キーペア認証の手順についてはSnowflakeの公式ドキュメントがあるので、こちらを参考にしながら進めていきます！
参考：https://docs.snowflake.com/ja/user-guide/key-pair-auth

# 使用環境
Tableau Desktopバージョン：2024.3
※Tableauがキーペア認証に対応したのがバージョン2024.3～
　参考：https://help.tableau.com/current/pro/desktop/ja-jp/examples_snowflake.htm
Snowflake ODBCドライバー：snowflake64_odbc-3.5.0.msi
OpenSSL：Win64 OpenSSL v3.4.0

Opensslは初めてダウンロードしたので、その手順については後述しようと思います。


# OpenSSLのダウンロード
こちらからインストーラーをダウンロードできます。
https://slproweb.com/products/Win32OpenSSL.html

ダウンロード後openssl.exeが格納されるインストール先のbinディレクトリを環境変数「PATH」に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684797/9866bb32-abc4-84ac-bcae-fdfb55a0cd64.png)

最後にPowerShell等で以下コマンドを実行し、バージョン情報が出力されれば完了です！
 ```
 openssl version
 ```

 環境の準備ができたので、本題のキーペア認証に必要な設定をしていきます。
 
# ①秘密鍵/公開鍵の作成
まずは秘密鍵の作成を行います。
秘密鍵は暗号化or非暗号化が選べますが、安全性を高めるため今回は暗号化していきたいと思います。

```
openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8
``` 
続いて暗号化パスワードが求められるので入力
```
Enter Encryption Password:
```

もう一度同じパスワードを入力
```
Verifying - Enter Encryption Password:
```

PowerShellでログイン中のユーザーと同じ場所に秘密鍵が生成されていると思います。
続いて公開鍵の作成です。

```
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
```
先ほど作成した秘密鍵を暗号化したときに使用したパスワードを入力します。
```
Enter pass phrase for rsa_key.p8:
```
以上で秘密鍵/公開鍵の作成は完了です！





# ②Snowflakeユーザーの作成&公開鍵の割り当て
Snowflakeでキーペア認証用のユーザーを作成します。
```
USE ROLE USERADMIN;

CREATE USER TOOL_USER DEFAULT_ROLE = SYSADMIN TYPE = SERVICE;
GRANT ROLE SYSADMIN TO USER TOOL_USER;
```
※ここでは一旦SYSADMINを付与しておきます

続いて、以下コマンドで上記の手順で作成したユーザーに公開鍵を割り当てます。
```
ALTER USER TOOL_USER SET RSA_PUBLIC_KEY = 'XXXXX';
```
公開鍵に改行が含まれている場合、改行を削除して一行にします。

以上でSnowflakeの設定も完了です！

# ③Tableau Desktop→Snowflakeへキーペア認証で接続
①②の準備ができたのでTableau Desktopからキーペア認証で接続してみます。
Tableau DesktopでSnowflakeへの接続設定画面を開くと、
「キーペアを使用したサインイン」がありますね！
こちらを選択して、次の手順に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684797/1a1a3fae-d67a-ed52-013f-529da0fd969e.png)

以下情報の入力を求められるので、適宜入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684797/beeb6af7-dca3-2623-92ff-7911d6451f7e.png)
サーバー：SnowflakeのログインURLの、https:// 以降の文字列です
秘密キーファイル：手順①で取得した秘密鍵の場所を指定します
秘密キーファイルのパスワード：手順①で設定した暗号化パスワードを指定します

以上で設定は終わりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684797/68096f0c-b979-6206-50f1-4637d25b7626.png)


キーペア認証を使用して接続することができました！:tada:


# おわりに
今回初めてキーペア認証を使用した接続をするのでビビってましたが簡単に設定できました！
今後SERVICEユーザーにはOauth認証が必須になってくると思いますが、事前にやり方を把握できていれば安心ですね。

ただ、上記手順の中には記載していませんが手順①②でフィンガープリントを取得し、
一致するか突き合わせてみたのですが一致しませんでした。
でも接続は問題なくできるという謎状態。。
何が原因か調査中なので、分かり次第この記事はアップデート予定です。

最後まで読んでいただきありがとうございました:raised_hands:
Qwen2.5-VL-7B-InstructをvLLMで動かす方法

## 初めに 

最近、大規模言語モデル（LLM）の推論を高速化するためのライブラリとして、vLLMが注目を集めています。今回は、Qwen2.5-VL-7B-InstructというモデルをvLLMを使って動かす方法を紹介します。

## 環境構築

まず、必要な環境を構築します。以下のコマンドを実行して、新しいconda環境を作成し、アクティベートします。

```bash
conda create -n vllm_qwen2_5_vl python=3.12 -y
conda activate vllm_qwen2_5_vl
```

## vLLMのインストール

次に、vLLMをインストールします。

```bash
pip install vllm
```


## 依存ライブラリのインストール

vLLMを動かすために必要な依存ライブラリをインストールします。

> 今後、vLLMのGithub Repoにマージされたら、`pip install vllm`だけを実行すればよいです。

```bash
pip install "git+https://github.com/huggingface/transformers"
pip install flash-attn --no-build-isolation
```

また、Hugging Face Hubからモデルをダウンロードするためのツールもインストールします。

```bash
pip install "huggingface_hub[hf_transfer]"
```

## モデルのダウンロード

Qwen2.5-VL-7B-InstructモデルをHugging Face Hubからダウンロードします。

```bash
HF_HUB_ENABLE_HF_TRANSFER=1 huggingface-cli download Qwen/Qwen2.5-VL-7B-Instruct
```

## vLLMサーバーの起動

最後に、vLLMを使ってモデルをサーバーとして起動します。以下のコマンドを実行してください。

```bash
VLLM_USE_V1=1 \
VLLM_WORKER_MULTIPROC_METHOD=spawn \
vllm serve Qwen/Qwen2.5-VL-7B-Instruct --trust-remote-code --served-model-name gpt-4 --gpu-memory-utilization 0.98 --tensor-parallel-size 4 --port 8000
```

このコマンドでは、以下のオプションを指定しています。

- `--trust-remote-code`: リモートコードを信頼して実行します。
- `--served-model-name gpt-4`: サーバーで提供するモデルの名前を`gpt-4`とします。
- `--gpu-memory-utilization 0.98`: GPUメモリの使用率を98%に設定します。
- `--tensor-parallel-size 4`: テンソル並列処理のサイズを4に設定します。
- `--port 8000`: サーバーをポート8000で起動します。

## まとめ

以上で、Qwen2.5-VL-7B-InstructをvLLMを使って動かすための手順を紹介しました。vLLMを使うことで、大規模言語モデルの推論を高速化することができます。ぜひ試してみてください！

## 参考

- [vLLM GitHubリポジトリ](https://github.com/vllm-project/vllm/pull/12604)