OmniAICreator/Qiita-1.07M huggingface dataset:
HTML基礎_書き方、タグ等のまとめ

### HTMLを書く際に最低限必要なもの
```
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```
・各種タグの説明
```
<!DOCTYPE html>：htmlで文書作成する際に必須のタグ。VScodeでは、「!」を押した際の予測変換を押すと、
基本のタグが自動で入力されるので便利

<html lang="ja">：langで英語や日本語といった言語を指定
<head>：ヘッダー情報。タイトルやcss等の外部ファイルの読み込みをここで行う。
<title>：そのページのタブのタイトルをつける。
<body>：body部分、実際にページ内に表示される部分。ここに各種タグ等を配置して見た目を作っていく。
```
各種タグは一部を除いて、\<body>\</body>といったように開始タグと終了タグをそれぞれ配置する必要がある。上記サンプルコードの\<head>タグのように開始と終了タグの間にテキストや別のタグを記述することで内容を追加できる。
※\<input>や\<a>には終了タグがないため注意。

---
### HTMLでCSSを使う方法
〇方法１_HTML内にcssファイルを外部ファイルとして読み込む方法
一般的にHTML側の\<head>タグ内に\<link>タグを配置して指定し使う。
```
<head>
    <link rel="stylesheet" href="./test.css">
</head>
```
〇方法２_要素のタグ内でstyle属性を指定し、直接変更する。
そのページのその箇所しか変更しないならいいが、あまり使わない。
```
<p style="font-size: 20px; color: red;">testの文章</p>
```

---
### HTMLの属性とは?
HTMLのタグに補足情報を与える役割を持ちます。タグに名前を付けたり、飾りをつけたり、働きを調整したりすることができる。
※参考サイト

https://it-biz.online/web-design/attribute/

---
### 絶対パスと相対パスの違い
※参考サイト

https://webliker.info/html/78726/

---
### \<h1>タグ
h1～h6まであり、見出しを作るためにある。数字が小さいほど、文字も小さい。
```
<h1>一番大きい見出し</h1>
<h2>二番目に大きい見出し</h2>
<h3>そんな感じ</h3>
<h4></h4>
<h5></h5>
<h6>一番小さい見出し</h6>
```

---
### \<p>タグ
見出し以外の汎用的な文に使うタグ。
```
<p>一般的な文章</p>
```

---
### \<div>タグ
グループを作るタグ。特にidやclassを使用して複数のグループを組み合わせ、サイトのレイアウトを作成できる。
\<div>タグは前後に改行が入る点には注意。
```
<div id="test_group">
    <p>このように</p>
    <p>グループを作成</p>
</div>
```
\<div>と\<span>は似ているようで違う。
※参考サイト

https://saruwakakun.com/html-css/basic/div-span#section1

---
### \<span>タグ
範囲を指定するだけのタグであり、spanタグ単体を使用する意味はない。CSSで特定箇所だけ変更する時などに使用。
また、spanタグはインライン要素なので、ブロック要素の中で使用する必要がある。
```
<p>
あいうえお<span class="test_group">12345</span>かきくけこ
</p>
//CSSでtest_groupクラスを指定し、12345の部分だけ色を変更したりフォントを変えるなどできる。
```



---
### \<a>タグ
リンクを作成するタグ。\<a>タグの間に画像を挟むと画像もリンクにできる。
```
<a href="リンク先URL">リンクになって色が変わる文章</a>
```

---
### \<img>タグ
画像読み込み用のタグ。単体で使うため、終了タグは不要。
jpg,png,GIF,SVG等の画像形式のみ可能。PDFや動画データは読み込み不可。
```
<img src="test_img.jpg" alt='代替テキスト' />
//srcで読み込み先を指定
//altは、画像が表示できなかった際に表示するテキスト
//終了タグが必要なく書かなくても大丈夫だが、最後に/を記述して終わりである事を分かるようにする。
```

---
### \<br>タグ
改行に使うタグ。単体で使うため、終了タグは不要。
```
<p>abc<br>123</p>
//出力結果
//abc
//123
```


---
### \<!---->コメントアウトタグ
他言語では//で書く事がおおいが、HTML内でコメントを書く際には下記ように記述する。
```
<!--このようにコメントアウトします。-->
```

---
### \<button>タグ
ボタンを作成する際のタグ

※参考サイト

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

---
### \<input>タグ
さまざまな種類の入力欄（フィールド）を作るために使用する。
※参考サイト

https://catnose.me/learning/html/input

---
### \<button>タグと\<input>タグの違い
同じような動きをできる両者だが、\<button>の方が\<input>タグより後で追加された要素となる。
より細かく新しい要素を交えてボタンを作成するなら\<button>タグを使うのがいいかも。
・参考サイト

https://zenn.dev/luvmini511/articles/58c1a66a42207b

---
### \<ul>、\<ol>、\<li>タグ
箇条書き時に使うリスト。細かい調整は、css側で行う。
ulは、unordered listの略で順序のない箇条書き
olは、ordered listの略で順番の存在する箇条書き
```
<ul>
  <li>1つめの項目</li>
  <li>2つめの項目</li>
  <li>3つめの項目</li>
</ul>

<ol>
  <li>1つめの項目</li>
  <li>2つめの項目</li>
  <li>3つめの項目</li>
</ol>
```
※参考サイト

https://saruwakakun.com/html-css/basic/ul-ol-li

---
Git における pull vs fetch / merge vs rebase の学習メモ

# git pull vs fetch
### git pull の特徴
git pull = git fetch + git merge

チェックアウト中のローカルブランチ（LB）に対し、リモートブランチ（RB）から取得した変更をマージする

引数なしで実行すると、追跡関係に基づいて自動でリモートとローカルがマージされる

### git fetch の特徴
すべてのリモートブランチの情報をローカル追跡ブランチ（RTB）に取得するが、ローカルブランチには影響しない

git pull 前に現在の状況を把握するのに使える

push 前にリモートとローカルの差分を確認する用途にも便利

### 💬 自分の感想：

fetch + git status で対応するリモートブランチを正しく追跡できているか確認できるので、基本的に fetch のほうが安全そう。

# git merge vs rebase
### merge の特徴
3-way マージ（通常のマージ）と Fast-Forward マージの2種類がある

履歴が分岐している場合、マージコミットが生成される（3-way マージ）


3-wayマージでは、共通の親を基点に両方のブランチの差分を統合し、新たなマージコミットが生成される。

FFマージでは、対象ブランチが現在のブランチに直列に並んでいるとき、単にポインタを進めるだけ（マージコミットは生成されない）。

・強み：

変更の実態が正確に残るため、履歴から変更内容を追いやすい

### rebase の特徴
分岐していたコミット履歴を直線的に改変する

共有のブランチと分岐間の変更を再適用（リプレイ）するための新しいコミットを作成する

結果的に、新しいブランチはその再適用されたコミット群の先端を指す

 ・強み：

コミット履歴がキレイになる（直線的）

・ 弱み：

リモート／ローカル間の不整合を起こしかねない

### 💬 自分の感想：

履歴に手を加えることに違和感があるので、merge の方が好き。<br> シンプルに履歴の不整合が起こるのも怖い。

おまけ:pullが追跡関係にかかわりなくチェックアウト中のブランチに対してマージを行う様子
![スクリーンショット 2025-03-25 022813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875244/e47b7859-8de2-48dd-a844-f774ac50aab5.png)

![スクリーンショット 2025-03-25 022843.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875244/3c10ba7f-6e74-4ece-9f8e-94bd70a580a0.png)
【2025年3月最新動向】Stability Matrixの解説！　複数の画像・動画生成AIツールを使ってみよう！

# はじめに
画像や動画生成AIのモデルが多数存在しています。
簡単に使えるプラットフォームとして登場したのが **Stability Matrix**です。

技術ブログの第一弾として、Stability Matrixの解説！
そしてこのプラットフォームで利用可能な注目の最新AI動向をご紹介します。

次回以降で、Stability Matrixのセットアップ、
複数の画像・動画生成AIモデルの利用・環境構築手順等を紹介していきます。
是非、リンクを登録して更新をお待ちください。

# Stability Matrixとは？

Stability AIが提供するStability Matrixは、複数のAIモデル（画像生成、動画生成、言語生成など）を統一されたUI/UXとAPIで一元的に操作できる次世代プラットフォームです。
![stabilityMatrix.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491794/ff7199df-7ac7-4321-aa3b-542f8826cc5a.jpeg)


# 利用可能パッケージ！ (2025年3月時点)

### ◆Stable Diffusion WebUI

![automatic1111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491794/ba8fae95-b3ab-4e2e-b86b-7baa8fcea4e5.png)
#### ◆Stable Diffusion WebUI Forge
#### ◆Stable Diffusion Web UI-UX

### ◆ComfyUI
![comfyUI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491794/4dee8243-f81c-4db5-81d0-5d017f608f9f.png)

### ◆Fooocus
![Fooocus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491794/6890c0b8-eaf1-4bf4-a35a-47fe33c3c9bb.png)

### ◆SwarmUI
![SwarmUI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491794/1fd39243-e657-42cc-886b-b4845e26a0fb.jpeg)

### ◆SD.Next
![SD.Next.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491794/38e045b0-c00c-4beb-8eea-5a87254d791f.jpeg)

### ◆SDFX
![SDFX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491794/f4b15585-1ea5-4222-a7a1-42211ac14eab.png)

### ◆kohya_ss

### ◆FluxGym
![FluxGym.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491794/6fb538bf-be0c-468c-9673-762672af2123.png)

# まとめ：次回予告と今後の連載予定

Stability Matrixは、AIクリエイティブの新時代を切り拓くプラットフォームです。
次回の記事では、実際にStability Matrixをインストールし、
Stable Diffusion 3.5をセットアップして美麗な画像を生成するまでの手順を解説します！

今後の予定：
【第2回】Stable Diffusion 3.5 のセットアップと画像生成
【第3回】Fluxを使ったストーリー付きイラストの作成
【第4回】動画生成AIの導入とプロンプトで作るショート動画
【第5回】API連携で自作AIツールを作ってみる
Run BERT in Docker on  Ubuntu22.04 with CUDA12.8.1

- venvの環境を用意する
```
python3.10 -m venv bert
source bert/bin/activate
```
- Pythonのライブラリをインストール
```
pip install transformers==4.50.0
pip install fugashi
pip install ipadic==1.0.0
pip install numpy torch
pip install sentencepiece unidic_lite
```
- BERTを動かすためのPython script
```python:run.py
import numpy as np
import torch
from transformers import BertJapaneseTokenizer, BertForMaskedLM

model_name = 'tohoku-nlp/bert-base-japanese-whole-word-masking'
tokenizer = BertJapaneseTokenizer.from_pretrained(model_name)
bert_mlm = BertForMaskedLM.from_pretrained(model_name)
bert_mlm = bert_mlm.cuda()

text = '今日はバンコクで[MASK]を食べる。'
text0 = text
tokens = tokenizer.tokenize(text)
input_ids = tokenizer.encode(text, return_tensors='pt')
input_ids = input_ids.cuda()

with torch.no_grad():
    output = bert_mlm(input_ids=input_ids)
    scores = output.logits
    print(scores.shape)

mask_position = input_ids[0].tolist().index(4) 
id_best = scores[0, mask_position].argmax(-1).item()
token_best = tokenizer.convert_ids_to_tokens(id_best)
token_best = token_best.replace('##', '')
text = text.replace('[MASK]',token_best)

print(text0, "->", text)
```
- 実行結果
```
python run.py
```
```
今日はバンコクで[MASK]を食べる。 -> 今日はバンコクでカレーを食べる。
```

- GPU使用率12%
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041151/9a78211a-6112-4dcb-bae2-f7f4f5622ccb.png)

今日はカレー食べます
【React】MantineのメニューリンクでNext.js13以降のLinkを設定したい場合

## 概要
MantineのMenuコンポーネントでは[Menu.Item as Next.js Link](https://v2.mantine.dev/core/menu/#menuitem-as-nextjs-link)のドキュメントで紹介されている通り、Next.jsのリンクを設定することができます。ただ、このドキュメントの記載（2025年3月時点）では、Next.js 13以降だと[Next.js 13系で Link with a or use Link legacyBehavior エラーの解決方法](https://zenn.dev/aiq_dev/articles/86c1b0ec509385)の記事にある通り、aタグが配下にあることでエラーとなります。
ということで、どういうふうに対応すればよいかのメモ書きを残しておきます。


## 前提
* 使用したNext.jsのバージョンは`15.2.3`です。
* 使用したMantineのバージョンは`7.17.2`です。

## 対応
以下の通り、aタグを削除して`others`のpropsと`ref`をLinkコンポーネントに直接指定すれば大丈夫でした。

```react
import { forwardRef } from "react";
import Link from "next/link";

export const NextLink = forwardRef(
  (
    { href, ...others }: React.ComponentPropsWithoutRef<typeof Link>,
    ref: React.ForwardedRef<HTMLAnchorElement>
  ) => <Link href={href} {...others} ref={ref}></Link>
);
NextLink.displayName = "nextLink";
```
AWS Jr.ChampionsでW-A BootCampを開催しました！

みなさん、こんにちは！
2024 AWS Jr.Championsの贄川です！

今回はAWS Jr.ChampionsのメンバーとAWS Well-Architected Bootcampを開催したので、振り返りにとして開催・参加した感想を書いていきたいと思います。

### AWS Well-Architected Bootcampとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883129/7774199c-2c37-4806-b61d-09b9a81d8167.png)

AWS Well-Architected Bootcamp(以下、W-A BootCamp）とは架空の企業のシナリオをもとに、AWS Well-Architected フレームワークに沿って、チームで現状(As is)を分析し、将来 (To be) のアーキテクチャーとしてベストプラクティスの適用を検討するワークショップです。

>AWS Well-Architected Frameworkとは、クラウド上でワークロードを設計および実行するための主要な概念、設計原則、アーキテクチャのベストプラクティスについて書かれたドキュメント集です。
AWS Well-Architected FrameworkhはAWSのアーキテクチャの設計指針で、「優れた運用効率」「セキュリティ」「信頼性」「パフォーマンス効率」「コスト最適化」「持続可能性」の６つの柱の設計原則と汎用的なベストプラクティスがまとめられたものです。

W-A BootCampではFrameworkについてAWSの方から説明を行っていただき、その後に参加者がグループに分かれ、ベストプラクティスに沿った設計について話し合います。
そして他のグループの発表を聞き、さらに議論を深めて適切なベストプラクティスとは何かということを考えるワークショップとなってます。

### ワークショップを企画してみた感想
![IMG_5059.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883129/0ce9fb95-f000-40bc-8ce4-c2b952956f96.jpeg)

今回のW-A BootcampはJr.Championsのメンバーと企画し、Jr.Champions内で行いました。
ブログでW-A BootCampの存在は知っていたのですが、中々参加する機会がなく、自分で開催してみたい！という理由から発起人として、メンバーに協力いただいて開催しました。

当日の架空のシナリオやFrameworkの説明などはAWSの方に行っていただいたのであまりやったこととしては少なかったのですが、開催の方法や告知などをメンバーと考えるのはやっていて楽しかったです。

W-A BootCmapとしては1日を通りて6つの柱について検討するワークショップではなく、柱を１つに絞り半日の開催となるMini W-A BootCmapとしての開催になりましたが、業務時間内での参加は難しいだろうとのことで、Frameworkの説明とベストプラクティスを検討するワークショップを別日にしたりして、なるべく参加者を増やせるように変更して開催しました。

ちなみにワークショップで検討した柱は「セキュリティ」にしました！
個人的にセキュリティの重要性が増していると感じたことに加えて、パートナー企業の中でW-A BootCmapを行う際にもセキュリティを重要と考えている人が多いらしいので、セキュリティに決めました。

他にもたくさんメンバーと話し合って決めたり、工夫をした点がありますが、会議で話し合っていて「よりこうした方が良いのでは？」という意見や「ここを見直した方が良い」という指摘をいただいたりと、複数人で何かを企画して創り上げることの良さみたいなものを感じることが出来たということが個人的には非常に良い経験になりました。

### イベントに参加した感想
主催側ですが、当日はワークショップに参加してベストプラクティスについて一緒に考えました！

感想として主に感じたことは3点です。

##### 1.お客様に提案する上での難しさ
ワークショップとしては現状からベストプラクティスの適用をしてシステムの改善方法を検討するということですが、少し脱線して実際にお客様にどう伝えるのかみたいな話になりました。

架空のシナリオにはセキュリティ意識がかなり低いと感じる部分があって、その箇所を馴染みのあるCloudWatchで監視したり、WAFを導入したり、というような改善を考えていましたが、クラウドのセキュリティに理解がない企業に色々変更を提案しても受け入れてもらえないのでは？と感じました。

そこで最低限、まず最初に変更を着手すべき箇所をどのように提案すべきなのかということに迷いました。

##### 2.自分とは異なる業務の参加者の意見が重宝される
僕は普段開発に関する業務を行っていて、すでにセキュリティ面でのベストプラクティスに則った設計などが大体テンプレートとして存在しているので、既存のシステムを改善したり、運用の目線で考えてみることがかなり難しく感じました。

一方で普段からFrameworkのレビューを業務で行っている方や運用に関する業務を行っている参加者は意見がとても的確で、シナリオの前提を疑っていたりする部分から慣れているなぁと感じたりして面白かったです。

参加者によって目の付け所がバラバラでした。

##### 3.システムだけではなく人材教育も大事
上記の2つと多少被る部分になりますが、システムだけをベストプラクティスに沿ったものに適応させるだけでは不十分であるとよく感じました。

セキュリティに関するリスクやヒヤリハットの共有やセキュリティのベストプラクティスについての教育、セキュリティ系のサービスの更新やニュースを確認しておくことなど、日々限られた時間の中で人材教育に関する時間をどう捻出するのか、何から教育するのかなど組織の運営にも関する意識を持っておくことの必要性も感じました。

### 最後に
今回はAWS W-A BootCampを開催・参加してみた感想について書いてみました。

セキュリティについてシステムの堅牢性などを見直すことも大事ですが、人材教育なども同じくらい大事だなと考えさせられたワークショップでした。

AWS Jr.Championsとして開催しましたが、活動も残りわずかしかなく名残惜しいですが、この1年で色々な挑戦をさせていただいて有意義な時間でした！

この記事を読んでAWS Jr.ChampionsやW-A BootCampについて興味をもってもらえると嬉しいです。
作業中に飲むコーヒーからWebアプリ１本作れちゃった話

# 豆から本気 - 札幌恵比寿製作所 presents

> コーヒー抽出の“感覚”を、数値と技術でサポートする。
> 「おいしい一杯」の再現性を上げる、生活密着型Webアプリ。

---

## はじめに

こんにちは。札幌恵比寿製作所です。

日常的にドリップコーヒーを楽しんでいますが、ある日ふと、
「この味、再現できるだろうか？」と疑問に思いました。

抽出量・濃さ・挽き方・蒸らし時間・抽出時間…
これらを全て感覚ではなく**数値化して一元管理**できたら、
もっと安定した一杯が淹れられるのでは？

そんな発想から生まれたのが、今回のWebアプリです。

---

## 作ったもの

### ☕ [豆から本気 - コーヒー抽出ガイド](https://apps.ebisu-craft.net/coffee/)

- スマホでもサクッと使える軽量Webアプリ
- 完全クライアントサイド（HTML＋JS）
- OGP対応／GA4アクセス解析付き

---

## 主な機能

- 抽出量・濃さ・挽き方を入力すると、以下を自動計算：
  - 必要な豆のグラム数
  - 蒸らし用／本抽出用のお湯量
  - 抽出時間の目安（自動調整ロジック）

- 蒸らし → 抽出 タイマーを自動接続
  - 背景フラッシュ（視覚通知）
  - ビープ音（聴覚通知）
  - バイブレーション（触覚通知）

- UIはシンプル／スマホ対応（片手でドリップしながらでも操作しやすい）

---

## 技術構成

| 項目 | 内容 |
|------|------|
| フロントエンド | HTML / CSS / JavaScript（バニラ） |
| タイマー処理 | setInterval ／ JSベースの連携タイマー |
| 通知機能 | navigator.vibrate / Audio API / CSSカラー変更 |
| アクセス解析 | Google Analytics 4（GA4） |
| OGP画像生成 | DALL·E + 手動調整（1200x630px） |

---

## 使用イメージ

- 出勤前に「200mlで少し濃いめの一杯を」
- お店のカウンターで「豆15gを使って最適な注湯ペースは？」
- コーヒー器具を友人にプレゼントするときに一緒に共有

---

## 今後の展望

- PWA化（ホーム追加 → オフライン対応）
- 記録機能（お気に入りの一杯のプロファイル保存）
- 英語対応（海外のコーヒー勢向け）
- フィルター選択、温度調整などの追加要素拡張

---

## SNS告知ポスト（X）

https://x.com/ebisu_sapporo/status/1904216435574112614

> 技術検証の合間に「つい」作った感があるWebアプリですが、
> 技術者にも、生活者にも刺さる仕上がりになったと思います。

---

## 最後に

「豆から本気」は、“生活の中の違和感”から生まれたアプリです。

コードを書くことも、ドリップすることも、再現性が求められるもの。
技術が「おいしい一杯」の後押しになるなら、こんなに嬉しいことはありません。

日々を便利に、そしてちょっと楽しくする技術。そんな視点で今後も開発していきます。
フォームの action とルート指定、基礎的なHTML構造も一緒に学びなおす

# はじめに

Laravelで開発をしていると、Bladeテンプレート内で以下のようなコードをよく見かけます：

```blade
<form action="{{ route('replies.replycompleted', ['id' => $post->id]) }}" method="POST">
```
「これは何をしているの？」「HTMLの form タグってそもそも何？」と気になったので、LaravelとHTMLの基本をセットで学びなおした内容を備忘録としてまとめてみました。

# ①HTMLの form タグの基本
まずは、HTMLの form タグについて復習します。
```html
<form action="/送信先URL" method="POST">
    <input type="text" name="example">
    <button type="submit">送信</button>
</form>
```
- action 属性：フォームの送信先URL
- method 属性：HTTPメソッド（GET / POSTなど）
- <input>：フォームの入力欄（name属性がキーになる）
- <button type="submit">：フォーム送信ボタン

# ②Laravelでのroute()の使い方
Laravelでは、route() ヘルパーを使って、ルート名からURLを自動生成できます。

**例:**
```blade
action="{{ route('replies.replycompleted', ['id' => $post->id]) }}"
```
このコードは、routes/web.php に定義されたルートのURLを取得しています。
**web.php 側の定義例：**
```php
Route::post('/reply/completed/{id}', [ReplyController::class, 'store'])->name('replies.replycompleted');
```
このようにルート名が 'replies.replycompleted' で、パラメータに id を取るルートに対して、
Blade内で route('replies.replycompleted', ['id' => $post->id]) を使うことで、以下のようなURLが生成されます：
```
/reply/completed/5
```
（※ $post->id が5だった場合）

# ③method=“POST” とCSRF対策
Laravelで method="POST" を使うときは、**CSRF（クロスサイトリクエストフォージェリ）対策**として、必ず @csrf を入れる必要があります。
```blade
<form action="{{ route('replies.replycompleted', ['id' => $post->id]) }}" method="POST">
    @csrf
    <!-- フォーム内容 -->
</form>
```
これがないと、Laravel側で「419 Page Expired」エラーになります。

# ④Bladeテンプレートでの変数展開
- {{ ... }} → 変数や関数の**値をHTMLに表示**
- route('ルート名', パラメータ配列) → 指定したルートのURLを生成

# ⑤まとめ
![IMG_3741.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/aa98a433-dd9f-464e-94b7-ef8823592348.jpeg)
cronの使い方

##### 目次
- cronとは
- crontabの使い方
- 設定方法について
- 設定値について

##### **cronとは**
cronとは、**定期的に処理を実行するプログラム**のことです。
crontabでcronを設定することで、**処理を定期的に実行する**ことができます。

##### **crontabの使い方**
- 現在の設定を表示する
```
crontab -l
```
- 設定内容を編集する
```
crontab -e
```
- 設定内容を削除する
```
crontab -r
```

編集画面から設定内容の先頭に「#」をつけることで繰り返し処理を止めることもできます。

##### **設定方法について**
以下のコマンドを実行すると、**viエディタと同じ操作**で修正できる画面に移動します。
```
crontb -e
```

左から「分」「時」「日」「月」「曜日」の順に記載します。
以下のように設定した場合、**毎分コマンド**が実行されます。
```
* * * * * [実行コマンド]
```

##### **設定値について**
- 数値の範囲
「*」を以下の範囲内の値に設定することで、毎分以外の繰り返し処理にすることができます。

|  設定項目  |  数値  |
|:---|:---|
|  分  |  0～59  |
|  時  |  0～23  |
|  日  |  1～31  |
|  月  |  1～12  |
|  曜日  |  0～7  |
|   　|0,7：日曜、1:月曜、2：火曜、3：水曜、4：木曜、5：金曜、6：土曜



- より柔軟な設定

|  指定方法  |  設定例  |  設定内容  |
|:---|:---|:---|
|  複数指定  |  15,45 * * * * [実行コマンド]  |  15分、45分に実行  |
|  間隔指定  |  */10 * * * * [実行コマンド]  |  10分おきに実行  |
Allied Telesis AT-x510-28GPX初期化

中古購入したAT-x510-28GPX(移行x510)が初期化されておらずユーザ名・パスワードが不明だったため初期化した記録

1. Bootloder起動中にコマンド入力、その後初期化コマンドを実行することで初期化可能
    1. Ctrl + B -> 5 -> 1 -> 0 -> 9
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733625/b0f9ece2-2c45-4fe5-ac54-39d87d930c78.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733625/752d27ec-1ec6-40a5-95d7-4562156b0bab.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733625/3824b233-1343-4186-bb12-2de62cc21261.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733625/464e524f-e856-497d-9a38-c1335c164389.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733625/7f2e0583-de86-4b69-8c70-d99d83a63406.png)
    2. (一時的に)初期化完了
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733625/657fa6dc-ee73-4c7c-91af-9f1bbb6e5071.png)
    3. 初期ユーザ名・パスワードにてログイン
        awplus login: manager 
        Password: friend
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733625/c6fb70d3-31a7-4d89-a440-dca603e6d9c7.png)
    4. "enable"コマンドにて特権モードに移行
    5. "atmf cleanup"にてメモリ上の設定を初期化
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733625/56dae99a-ae61-42cc-8b6d-69ce4bb11297.png)
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733625/b076591c-a68c-4e16-b755-ad0538d0e2a2.png)
    6. 再起動後"write memory"コマンドにてメモリに初期設定を保存
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/733625/5fb3c1d7-192b-409d-9578-dcead0d137af.png)
return view() の引数と with() / compact() の違いを理解する

# はじめに

Laravelのコントローラでビューを返すとき、必ず使うのが `return view()`。  
よく見るけど、「第1引数？ 第2引数？ 第3引数？」「with() と compact() ってどう違うの？」と迷ったことはありませんか？

この記事では、`view()` の引数の意味と、`with()`・`compact()` の使い方の違いを初心者向けに整理してみました。

---

# ①`return view()` の基本構文

Laravelの `view()` 関数は以下のように3つの引数を取ることができます：

```php
return view($view, $data = [], $mergeData = []);
```
![IMG_3739.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/ea326a86-7aac-4b1a-9774-da211692a4a2.jpeg)

**使用例**

```php
 return view('posts.index', ['title' => '記事一覧'], ['user' => $user]);
 ```
 
この例では、posts/index.blade.php に以下の変数が渡されます：
- $title → '記事一覧'
- $user → $userオブジェクト（第3引数が上書きされる）

# ②with() メソッドの使い方
view() の戻り値に対してチェーンで使えるメソッドです。
```php
return view('posts.index')->with('title', '記事一覧');
```

**複数渡すとき：**
```php
return view('posts.index')
    ->with('title', '記事一覧')
    ->with('user', $user);
```
- 可読性はやや下がるが、個別に追加しやすい
- 条件分岐の中で追加する場合にも便利

# ③compact() 関数の使い方
PHP標準の関数で、**変数名をそのままキーとした連想配列を作成**できます。

```php
$title = '記事一覧';
$user = Auth::user();

return view('posts.index', compact('title', 'user'));
```

上記は実質以下と同じ意味になります：
```php
return view('posts.index', ['title' => $title, 'user' => $user]);
```

- コードがスッキリして読みやすい
- 複数の変数をまとめて渡したいときに便利

# ④with() と compact() の違いまとめ
![IMG_3740.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246240/a8ddfa6f-61fc-4996-a72b-a8f37345ac65.jpeg)

# ⑤まとめ
- return view() の **第1引数**：ビューのパス
- **第2引数**：ビューに渡す変数の配列
- **第3引数**：追加で上書きしたい変数（あまり使わない）
そして、
- **compact()**：複数変数をまとめて渡すときに便利（コードが短くなる）
- **with()**：チェーン形式で個別に変数を渡したいときに便利（条件分岐にも強い）
どちらを使っても結果は同じなので、**チームのコーディングスタイルや可読性のバランスで使い分ける**と良いでしょう！
Cline for IntelliJを作ってみる

AIエージェントがすごく流行っていますが、だいたいVSCode関連で悲しいです。
JetBrainsにも欲しいです。

ということで、作ってみました。

https://github.com/kavos113/cline-for-intellij-test

Clineの最初期のバージョン(Claude Dev 1.0.4)をIntelliJプラグインとして再実装しています。
バグや未実装の機能がたくさんあるので実用に耐えうるものではありませんが、それっぽく動作するものは作ることができました。

# デモ
Hello Worldを作ってもらいました。
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4044360/94fdf157-05d9-42f2-ab04-abaac3947b45.gif)

# 実装
### バックエンド
バックエンド（Claudeと通信する部分）は、大部分がClineをそのままKotlinに書き換えたものです。
ClaudeDev.tsがCline.ktに、ClaudeDevProvider.tsがClineService.ktに書き換えられています。

tree-sitterはKotlinで実装するのが面倒そうだったので、node.jsで無理やり実行するという方法を取っています。
```kotlin
val commandParts = if (System.getProperty("os.name").lowercase().contains("win")) {
    listOf("cmd", "/c", "node ${jsFile.absolutePath} $strPath")
} else {
    listOf("node", jsFile.absolutePath, strPath)
}

val commandLine = GeneralCommandLine(commandParts)
commandLine.charset = StandardCharsets.UTF_8

val processHandler = OSProcessHandler(commandLine)
```

### UI
SwingとKotlin UI DSLを用いて構築しています。データのバインドがうまくいけばWebViewのほうが楽だと思います。

### Clineからの変更点
#### 通信
バックエンド → UI へのイベントの送信は、IntelliJプラグインの[メッセージバス](https://plugins.jetbrains.com/docs/intellij/messaging-infrastructure.html)を使用しています。

#### 設定
APIキーなどの設定は、設定ウィンドウに統合しました。![settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4044360/62aadffc-138a-4b67-be50-65e562f54882.png)

# 今後の展望など
### 既知の問題
- メッセージがマークダウンに対応していない
- "start new task"を押したときにうまく始まらない
- IDEを終了せずに別のプロジェクトを開いたとき、元のプロジェクトのパスをベースにしてタスクを開始してしまう

### 感想
ロジックを丸写ししているおかげか、思ったよりも楽に再実装を作ることができました。この調子でアップデートしていきたいですね。
C++ 転ばぬ先の杖～①概要とメモリとアドレス～

## 概要

### 対象読者
- C++に入門した人
- C++がちょっぴり苦手になってきた人
- C++が好きになってきた人

### この記事は？
普段、C言語とC#を扱っている私がC++に入門したらはまった（良い意味でも悪い意味でも…）ので少しポエムも交えた全11回で魅力をお届けする記事です、前置きが長くなりそうなので早速本題へまいりましょう。

## ざっくりこんな感じ
**第1回：メモリとアドレス。**<< いまここ 
第2回：スコープ。
第3回：static。
第4回：値渡しと参照渡し。
第5回：オブジェクト指向。
第6回：オブジェクト指向～カプセル化～。
第7回：オブジェクト指向～継承～。
第8回：オブジェクト指向～多様性～。
第9回：YAGNI、DRY、KISS、SOLID。
第10回：2年後の私たちへ。
第11回：「とりあえず」の本質。
後々リンク張ります。

## 第1回：メモリとアドレス
C言語やC++から始めた方は、なじみ深いのではないでしょうか。
**メモリはパソコンの記憶領域、アドレスは記憶領域の番号**です。初めての方は「ん？」と疑問に思うかもしれませんがそれで良いです。実際に動かして、感じて、理解していきましょう。

### 1バイトのメモリに1つのアドレスが割り当てられる。
早速ですが、コードを書いていきましょう。
```c++
// 便利な入出力が使える
#include <iostream>

int main() {
    int a = 1;
    // 便利な入出力で「a」を出力して改行を出力する。
    std::cout << a << std::endl;
}
```
```
// 出力結果
>> 1
```
このコードでは、int型変数「a」 に整数「1」を代入してint型変数「a」を出力しますので出力結果は「1」となります。さてここで問題ですが、整数「1」はどこにあるのでしょうか？int型変数「a」の中でしょうか？

正解は、**どこかのメモリ**です。

では、その**どこかのメモリ**を見てみましょう。先ほどのコードに少し変更を加えます。
```diff_cpp
// 便利な入出力が使える
#include <iostream>

int main() {
    int a = 1;
-   // 便利な入出力で「a」を出力して改行を出力する。
-   std::cout << a << std::endl;
+   // 便利な入出力で「&a」を出力して改行を出力する。
+   std::cout << &a << std::endl;
}
```
```
// 出力結果
>> 0xfffaac
```
このコードはint型変数「a」に「&」を足しただけですが、出力結果が変わっています。
この「0xfffaac」はint型変数「a」の**アドレス**です。ただし、このアドレスはプログラムを実行するたびに変わったり、パソコンの環境（OSなど）によっても変わりますので皆様の場合は異なる値かも。

**つまり、整数「1」はアドレス「0xfffaac」のメモリにある。ということなのです。**

厳密には先頭のアドレスが「0xfffaac」のメモリにある。ですが、配列などを使うとき以外は意識しなくても良いかも。ただ、**データは特定アドレスのメモリにある。という事だけは忘れないよう心掛けてください。**

### 最後に
第1回の内容はいかがでしたでしょうか？伝えたい内容だけを端的に。シリーズを通して体系的に理解を深めていけるよう努めますので、お付き合いください。また、わからないことがあればなんなりと聞いてください。
実は本記事の内容は、C言語やC++のつまづきポイントの「ポインタ」に関係しています。しっかりとポインタについて説明はしませんがこの程度の理解でよいかもしれません。あまり突き詰めるとはまってしまします。

## コラム：Vim
皆さんはコーディングするときどんなエディタを使いますか？
私は普段、VisualStudioのエディタを使ったりVisualStudioCodeを使用することが多いですが、この度C++を使うにあたり、Vimを使い始めました。
完全に個人の主観になってしまいますが、コマンドラインでプログラミングしてると、「めっちゃプログラミングしてる」感があっていいんですよね。ただ、モードであったり←↓↑→がhjklだったり使いこなせてはいません。さらに言うとモードのビジュアルモードを使ったことなかったりと散々ですが、「めっちゃプログラミングしてる」感があるので私は使っています。ただ、本記事においては好きなエディタを使用していただければと思いますので「めっちゃプログラミングしてる」感が欲しい時にでも手を出してみてはいかがでしょう？
SAN環境リモートレプリケーションの仕組み

本番用のSAN環境で使用しているデータをディザスタリカバリ用SAN環境へのレプリケーションをしたい、というケースで今回の投稿をしていきたい。
いつも投稿の際の冒頭の導入の書き出しについては悩みつつも、いきなり脈絡のない始め方をするので、そこはご容赦いただきたい。

## 目次
- SAN環境間レプリケーションで使われるプロトコル
- SAN環境のデータはどうやってIPネットワークで運ばれるのか

## SAN環境間レプリケーションで使われるプロトコル

本番サイトとは別の、ディザスタリカバリ用のサイトを設置してそこでレプリケーション関係を構築する場合において、推奨される具体的な距離は一般的に100km以上だと言われている。
日本国内のケースを見ていくと、本社機能をどこの都道府県にあるのかで話は変わっていくが、本番サイトを東京に置いて、ディザスタリカバリ用サイトは200kmほど離れた大阪に置く、という企業さんが非常に多い印象がある。

SAN環境で長距離の通信を実現するプロトコルとしてFC(Fibre Channel)が存在する。距離だけでなく非常に高速である、という側面もあるのだが最大伝送距離が10km程度のためディザスタリカバリ用としてのデータ転送としてはやはり距離が足りなすぎる。
そのためSAN環境同士で100km以上の距離でデータ転送を行なう際はIPネットワークを介した形でデータ転送を行なう。具体的なプロトコルとしてはFC over IPやiSCSIなどが挙げられる。

## SAN環境のデータはどうやってIPネットワークで運ばれるのか

ではそのFC over IPやiSCSIではどのような仕様でデータ転送が行なわれているのか。1つずつ見ていく。

●FC over IP

地理的に分散しているSAN環境を既存IPネットワークで相互接続するためのプロトコルである。FCのブロックデータをIPインフラ構造で転送する際にはメインの選択肢となる。

簡単な仕組みとしては、各FC環境でFCIPゲートウェイが使われて、そのゲートウェイをIPネットワークの一端として通信が行なわれる考え方である。
そしてFCフレームをIPパケットにカプセル化してそのゲートウェイ間をIPネットワーク経由での転送、という流れである。

まず送信したいデータが含んだFCフレームを、IPヘッダーやTCPヘッダーとともに構成の中に入れていく。
FCフレームが格納されたIPパケットは一端からIPネットワーク上で送信されてもう一端の受信側まで届く。届いたデータは受信側でデカプセル化することによってFCフレームが復元される。


●iSCSI

IPネットワーク上でのデータ転送ではかなりの頻度で利用されるiSCSIも、長距離でのSAN環境間という要素が含んだ形でも使うことができる。

仕組みとしてはFC over IPとほとんど似通っていて、こちらもデータをカプセル化してTCP/IPパケットに入れて送信される。
各SAN環境の一端にはルーターを設置すればゲートウェイなどは不要である。

FC over IPと違ってデータをFCフレームに格納する必要はなく、SCSIコマンドとともにそのままパケットにカプセル化されての送信となる。
受信側でこちらもデカプセル化が行なわれて、データとSCSIコマンドの復元がされる。

iSCSIについては、より詳細な仕組みとしてプロトコルデータユニットがあるのだが、このお話についてはいつかのテーマとして投稿ができたらと思っている。

といったように、どちらもパケットにカプセル化というキーワードを伴った形でのデータ転送となる。用途としてはまさに長距離でSAN接続するために特化されたFC over IPの方がパフォーマンスが良いとされている。

## ひとりごと

ここ数日の間で関東地方は桜の満開を迎えるとのこと。とうとう春の到来だ。

多くの大学が乱立している地区に自宅を構えていることもあり、3月中は卒業式に出席する学生の姿をイヤというほど目にする。

彼らがまた4月から社会人としての生活が始めていく、と考えるとまた年下が増えるんだなという気持ちにさせられる。
そろそろ老害に足の指を踏み入れるような年齢になってきたので、そこは自覚的に日常を過ごしていければと思う。
PHPerKaigi2025に参加してきました

## はじめに

先月のPHPカンファレンス名古屋に引き続き、人生2回目の参加です

1回目の参加記録：[PHPカンファレンス名古屋2025 に初参加しました](https://qiita.com/murasuke/items/dbb6c3af1404401d0b07)

今回はちょっと遠いので、day1をリモートで、day2はオフラインで参加しました(またも1人)

前回(名古屋)はたまたま近かったので申し込んでみたのですが、今回はこんな理由で参加を決めました
* 誰も知り合いがいなくても、カンファレンスは楽しい(楽しめる)ことがわかった
* 初めての参加だったにも関わらず、遅くまでいろいろな話をさせていただいた方々に直接感謝を伝えたかった
* [ちゃちいさん](https://x.com/chatii)からXで「ぜひまた(どこかで)お会いしましょう」といただいたのですが、高松は(ちょっと)難しいかも（けど東京なら）

## day1

day1は気になるトークをリモートで聞いていたのですが、なんとなく身に入って来ない気が・・・
リモートではその場の雰囲気を感じられないというかなんというか
「現場でしか摂取できない栄養がある 」ことに、気が付かされてしまいました


## day2
day2は早起きして(というか、緊張と期待で自然と目が覚めてしまって)東京へ向かいました

まず聴いたのはこちら
### PHPで作るPHP～セルフホストできる言語処理系を作ろう～ by nsfisis
https://fortee.jp/phperkaigi-2025/proposal/ef8480fc-1403-4020-9f24-aca9361f51e4

20年くらい前、数式をパースして計算するくらいはやったことがあったので幾分かは理解できたのですが、実際のソースを見たときの複雑さに驚きました（必要なものは「根性」だとおっしゃってました）

それでも、サブセットでもいいから、言語処理系を書いてみたいと本当に思いました
(夢のまた夢なんですが・・・根性が足りないです)

続いて

### アンカンファレンス会場で[Soudaiさん](https://x.com/soudai1025)の「能力を伸ばす、成長」に関するトーク

を拝聴しました
「知識」と「経験」があって「知恵(スキルとして身につく)」になる、なるほどと気づかされました

日報を書いて、毎日計画した作業を終わらせる、当たり前のことが成長につながるんだなと再認識しました


### パスキーでのログインを実装してみよう！ by ヒビキ
https://fortee.jp/phperkaigi-2025/proposal/6b32d201-321f-485b-8a6c-1046c7af4b95

パスキーはユーザーも、運営者にも嬉しい認証だということが分かりました
しかも、デバイス間で同期してくれるのでスマホを買い替えても大丈夫、なんて素晴らしい機能なんでしょうか
懇親会でも、質問に対して丁寧に答えていただき、本当にありがとうございました


### php-fpm がリクエスト処理する仕組みを追う by 新原雅司

https://fortee.jp/phperkaigi-2025/proposal/22cfb5c0-7079-43d2-9b3a-d5966f3dc68d

普段使っているのに仕組みはよく知らないphp-fpmをデバッグしながら実際に追ってみるという、すごいトークでした
PHPではなくCのソースをデバッグしながら、実際にPHPにGETパラメーターがセットされる様子や実行の様子を見ることができました

自分で実行環境のソースを追うことがあるのか？と一瞬思ったのですが、そういえばVB6を使っていた時代、API呼び出しのよくわからないエラーが起きたら、VC++でVB6にアタッチしてAPIにブレークポイントを張って引数の値(ポインタ)がちゃんと入っているか？とか確認していたのを思い出し、GDBも(難しそうですが・・・)使ってみたいなと思いました



### 技術的負債を正しく理解し、正しく付き合う by 河瀨 翔吾

https://fortee.jp/phperkaigi-2025/proposal/b00332b5-8965-4438-bcce-932c3b8f8f15

技術的負債はリスクなので、いかに管理していくか？という興味深いお話でした
最後のQ＆Aで「上層部を説得するにはどうすればよいですか？」という質問に対して
「一度、痛い目をみればよいです」という答えが秀逸すぎて笑いながら、どこか心が痛い言葉でした


### LT大会

人生で初めてペンライト振りましたw
めちゃくちゃ楽しかったです

個人的に「リアルISUCONの戦い方」が最高でした
実際には稀にしかないですが、こういう時にこそ血が騒いでしまうのは何故なんでしょうか？

### 懇親会

知っている人がいないので、声をかけて話に入れてもらったり、一人でいたら声をかけてもらったりしながら楽しく交流することができました

実際話をして驚いたのは「メインがPHPではない」人が結構いたこと

また、１人でいたら他カンファレンスの委員の方から声をかけていただきました。
自己紹介すると「77Webさんが「名古屋で初参加してくれた人が今日きているよ」って言ってた人！」と逆になぜか知られていたり

間口が広くて、初参加者でも楽しめる雰囲気がいいなと改めて感じました

2時間の懇親会はあっという間でした

## 最後に

登壇者のみなさま、スタッフのみなさま、僕が突然声をかけても、いやな顔せずにお話をしてくれたみなさま本当にありがとうございました

リモートとオフライン両方を経験してみましたが、やっぱ現地参加は楽しくて、深く学ぶことができるので、次の機会は可能な限りオフラインで参加しようと思います

あと、もし参加に迷っている人がいたら、大丈夫なのでぜひ申し込んでみてください。1人で不安でも、Xで一言呟けば（1人で参加します、とか、話しかける人がいないですとか）、きっと誰かが声をかけてくれます！
Devin と OpenHands を試してみた感想

# はじめに

[株式会社よりそう](https://qiita.com/organizations/yoriso) システム部の社内イベント用の発表資料です。

---

# Devin とは
- 一言で言うと AI エンジニア
- Slack や GitHub 上で会話しそのまま PR 作成までやってくれる

---

# OpenHands とは
- 一言で言うと Devin の OSS 版
- 元々は OpenDevin という名前だった

---

# Devin でできること
- Slack や GitHub 上で会話してタスクの指示ができる
- 会話＝スレッド単位でコンテナを持ち、ターミナル、ブラウザ、エディタ、オーケストレーションを使い自律的にタスクを実行できる
- GitHub PR を作ることができる
- 会話の中からそのプロジェクトのタスク遂行に必要と判断した知識を PlayBook に記録して擬似的に学習していく

demo

---

# OpenHands でできること
- ~~Slack や GitHub 上で会話してタスクの指示ができる~~
- 会話＝スレッド単位でコンテナを持ち、ターミナル、ブラウザ、エディタ、オーケストレーションを使い自律的にタスクを実行できる
- GitHub PR を作ることができる
- ~~会話の中からそのプロジェクトのタスク遂行に必要と判断した知識を PlayBook に記録して擬似的に学習していく~~

demo

---

# その他の違い

| 特徴                 | Devin                      | OpenHands                          |
|----------------------|----------------------------|------------------------------------|
| モデル     | 独自モデル        | 好きなモデルのAPIを使用可能          |
| 課金方式             | 固定課金 + 従量課金         | APIごとの従量課金 |
| ホスティング | マネージド | セルフホスティング or ローカル |

---

# それぞれを使ってみた感想

## Devin
- Slack でタスクを依頼して PR を出してくれるのは衝撃的な体験だった。
- 新規開発系のタスクには強いが、既存のプロジェクトの修正タスクは簡単なものでも 20 回以上コメントをやりとりの末上手くいかない、のようなことがざらにあった。Playbook の整理が重要そう。
- 個人開発にはちょっt高い😢

## OpenHands
- **思っていたよりもセットアップが楽だった。（2コマンドのみ。3分くらいで試せる。）**
- モデルを自分で選べるのは良い。
- claude-3.5-sonnet の API はエラーでよく止まる。リトライなどができないので使いづらい。
- 代わりに使った DeepSeek が安くてコードもまあまあだった。
- PlayBook はコードに含めることで代用出来るかも。

---

# 両方を使ってみての感想
- 開発に必要なツールのセットを複数個簡単に用意できるのがすごい
- 見えた未来
    - 開発の水平スケール = 一人の人が何人分も働くことができる
        - 複数タブで OpenHands を開いて並行で指示を出す
        - タスクが完了したタブから次の指示を出す
        - 以下ループ
    - 要件定義がボトルネックになる
        - エンジニアも要件定義をする必要が出てくる

---

# 最後に
- 重い腰を上げてみて OpenHands を触ってみたが想像以上に簡単に使うことができた
- みんなも是非今すぐにやってみてください
ChannelTubeでのダウンロードされないエラー潰せた

# エラー内容
```
sign in to confirm you're not a bot. use --cookies-from-browser or --cookies for 
the authentication.
```
こんなやつ
環境としてUbuntuserverのdocker乗せ
とりあえず
```
sudo docker images
sudo docker pull thewicklowwolf/channeltube
sudo docker run -v /mnt/cookies.txt:/cookies.txt thewicklowwolf/channeltube --cookies /cookies.txt
```
自分メモ用だかわっかりにくくしておきます
/mnt/cookies.txtは自分で探してゲットしてね
https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc
こいつ使ってがんば
TerraformでAWSプロバイダ認証情報を設定する

## はじめに
Terraformはインフラを宣言的なコードで定義・管理するためのIaCツールです。しかし、Terraformをインストールしただけでは、AWS、GCP、AzureなどといったProviderへアクセスすることはできません。Terraformがクラウド上のリソースを作成・変更・削除するためには、各Providerに対するCredentials（認証情報）の設定が必要です。これが、TerraformとProviderの間を繋ぐ「鍵」の役割を果たします。
本記事では、AWSリソースをTerraformで管理するための、認証情報の設定について紹介します。

## Terraformの認証プロセス
TerraformがAWS、GCP、Azureなどのプロバイダーと通信する際の認証プロセスは、以下の図のようになります：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958955/e00a7184-e0fb-445e-bd57-3726f8839371.png)

※ 青色の線はリクエストやデータ処理の流れ、黄色の線はレスポンス処理を表しています。

#### 1. Core ⇒ Provider Plugin
Coreは.tfファイル（設計図）を解析し、Provider Pluginへ「どのようなリソースを構築したいか」という指示を出します。例えば、「EC2インスタンスを1台作成」といった命令がこの段階で行われます。

#### 2\. Provider Plugin ⇒ Credentials
Provider Pluginは、ProvideのAPIにアクセスするためのCredentialsを取得します。

認証情報は以下の方法から読み込まれます：
1. 環境変数
1. 認証ファイル
1. Providerブロックに直接記述する

#### 3\. Credentials ⇒ API Gateway
取得した認証情報を使用して、ProviderのAPI Gatewayにアクセス権を証明します。この証明により、APIへのリクエスト許可を取ることができます。

図書館の貸出システムに例えると：
1. 学生証や図書館利用カード = 認証情報
- 「誰が」「どんな権限」を持っているかが記載されています
1. 図書館の貸出システム = API Gateway
- カードをかざすと情報を読み取り、利用者の権限を確認

このメカニズムにより、クラウドサービスは利用者の正確な権限を確認し、適切にリソースへのアクセスを提供します。まるで、図書館が適切な利用者にのみに本の貸し出しを許可することと同じなのです。

#### 4\. API Gateway ⇒ Core
認証に成功すると、APIからレスポンスが返され、Coreに結果が通知されます。
このレスポンスには、作成されたリソースのID、ステータス、メタデータなどが含まれます。
これらのデータはTerraformにおけるState（状態管理）の基盤となり、インフラの一貫性と再現性を確保する重要な役割を果たします。

認証フローを理解することで、クラウドで何が起こっているのか、誰がどのようにリソースにアクセスできるのかを明確に把握できるようになります。それぞれのProviderには固有の認証メカニズムはありますが、「APIへのアクセス権を安全に証明する」という基本的な考え方は共通しています。

## Providerの認証情報を設定する

#### 事前準備
- IAMユーザーを作成し、適切なポリシーを付与する
- アクセスキーとシークレットアクセスキーを取得する

### 1. 環境変数による認証情報の設定
Terraformは、事前に設定した環境変数からAWS認証情報を自動的に読み取ります。
これにより、安全かつ簡単にAWSリソースにアクセスできます。

mac/Linuxの場合
```bash
export AWS_ACCESS_KEY_ID="アクセスキー"
export AWS_SECRET_ACCESS_KEY="シークレットアクセスキー"
```
Windowsの場合
```cmd:cmd
SET AWS_ACCESS_KEY_ID="アクセスキー"
SET AWS_SECRET_ACCESS_KEY="シークレットアクセスキー"
```
```powershell:PowerShell
# Windows（PowerShell）の場合
$Env:AWS_ACCESS_KEY_ID="アクセスキー"
$Env:AWS_SECRET_ACCESS_KEY="シークレットアクセスキー"
```
### 2\.認証情報ファイルによる設定
`~/.aws/credentials`ファイルはAWS CLI、AWS SDK、TerraformなどのツールがAWSに接続する際に使用する認証情報を保存するためのファイルです。
AWS CLIで`aws configure`コマンドを実行すると、このファイルが自動的に生成されます。

```bash
[default]
aws_access_key_id = "アクセスキー"
aws_secret_access_key = "シークレットアクセスキー"
region = ap-northeast-1
```

### 3\.Providerブロックによる設定
Terraformの設定ファイル内で直接AWSの認証情報を指定する方法です。
このProviderブロックでは、使用するProviderと、その接続に必要な情報を定義します。

```bash
provider "aws" {
  region     = "ap-northeast-1"
  access_key = "アクセスキー"
  secret_key = "シークレットアクセスキー"
}
```
:::note alert
この設定方法は**非推奨で**す。
認証情報をコード内で記述すると、その情報は平文で保存されます。
万が一、GitHubなどのバージョン管理システムにアップロードしてしまった場合、認証情報が第三者に漏洩する危険性があります。
:::

## まとめ
TerraformでProviderのリソースを操作するためには、認証情報の設定が必須です。
これは、TerraformがクラウドAPIにアクセスするための「鍵」のような役割を果たします。
インフラをコード化する前に認証のメカニズムとセキュリティの基本を理解することが重要です。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html

https://registry.terraform.io/providers/hashicorp/aws/latest/docs

https://developer.hashicorp.com/terraform/tutorials/aws-get-started/aws-build
【Terminal】プレビュー付きでファイルを検索する方法

fzfとbatを使用するとプレビュー付きで
## fzfとは

`fzf`は、コマンドライン用の汎用的なファジーファインダーです。ファイルやコマンドのリストからインタラクティブに選択することができます。非常に軽量で、シンプルなインターフェースを持っています。

## batとは

`bat`は、ファイルの内容を表示するためのコマンドラインツールで、`cat`の代替として使われます。シンタックスハイライトや行番号の表示など、視覚的にわかりやすい出力を提供します。

## fzfとbatのインストール

Homebrewを使用してインストールできます。

```bash
brew install fzf
brew install bat
```

## fzfとbatを使ったファイル検索とプレビュー

以下の手順で、`fzf`と`bat`を組み合わせてファイルを検索し、プレビューします。

1. ターミナルを開く

2. 検索したいディレクトリに移動します。例えば、`Desktop`フォルダに移動する場合：

```bash
cd ~/Desktop
```

3. fzfとbatを組み合わせたコマンドを実行します。以下のコマンドを入力します：

```bash
fzf --preview 'bat --style=numbers --color=always {}' --preview-window=up:30%
```

   - `fzf`がファイルを検索し、選択したファイルの内容を`bat`でプレビューします
   - `--style=numbers`オプションで行番号を表示し、`--color=always`で色を常に表示します
   - `--preview-window=up:30%`でプレビューウィンドウの位置とサイズを指定します

4. ファイルを検索します。

![画面収録 2025-01-09 22.24.56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/5c83411c-24bd-b3fc-b7d3-b737bc1e287f.gif)
【WordPress】 Twenty Seventeen のサイトを移行したら、カスタマイズに Theme Options が出てこなくなった

WordPressのサーバを移行しようとしていて、コンテンツや画像などはだいたい移行できたのに、フロントページの2番目以降のセクションが表示されないし、カスタマイズに Theme Options が出てこなくなって、セクションの設定もできないし、そもそもフロントページのフッターも表示されてないし、何かがおかしい、という場合。

`wp-config.php` で 

```
define( 'WP_DEBUG', true );
```

としてみるとわかりますが、`wp-content/themes/twentyseventeen/template-parts/page/content-front-page-panels.php` の `thumbnail` のところが不調になっています。

これは、セクションの各ページの 'Featured image' (アイキャッチ画像) が移行できてなかったからで、セクションの各ページを編集して、 Featured image を新たに指定してあげれば、復旧します。

以上
TypeScript:2.constructorとは

## そもそもconstructorとは
constructorはクラスからインスタンスを作るときに自動的に呼び出される特別な関数
```typescript:exem.ts
const food = new Food(element); //これを実行するとよばれる
```
newでインスタンスを作った瞬間に、自動的にconstructor()の中身が実行される

## 基本の書き方と動き
```typescript:exem.ts
class Food{
    constructor() {
        console.log("Foodのインスタンスが生成されました");
    }
}
const myFood = new Food(); //コンソールにログが出る
```

## 引数を受け取るconstructor 
```typescript:exem.ts
class Food{
    name: string;

    //コンストラクタで引数を受け取っている
    constructor(name: string){
        this.name = name;
    }

    sayName() {
        console.log(`この食べ物は ${this.name} です！`)
    }
}

const apple = new Food('リンゴ');
apple.sayName();//この食べ物はリンゴです！
```
## 引数を受け取るconstructor 
```typescript:exem.ts
class Food{
    constructor(public name: string){}
}

const banana = new Food('バナナ');
console.log(banana.name)
```
下記と同じことをやっている
```typescript:exem.ts
class Food{
    name: stirig;

    constructor(name: string){
        this.name = name
    }
}
```
publicをつけると、自動的に「プロパティ宣言＆代入」をやってくれる


## 🎯 まとめ：TypeScriptのconstructorとは？
・いつ呼ばれる？
　→new した時、自動で
・何のために使う？	
　→プロパティの初期化、引数の受け取り、初期処理
・引数あり	
　→constructor(name: string) など
・プロパティとまとめて定義	
　→constructor(public name: string) みたいに省略OK
HP作成備忘録：Formsubmitを使ったお問い合わせフォームの実装例についてコードとともに紹介してみた

## はじめに

Webサイトにお問い合わせフォームを設置するのは、ユーザーとの重要な接点になります。

:::note warn
**しかし、サーバーを用意したりバックエンドを構築したりするのは初心者にはハードルが高いことも。個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

今回は、無料サービス「Formsubmit」を利用して、簡単にメール送信フォームを実装する方法を紹介します。

## 書こうと思ったきっかけ

静的なWebサイト（例：S3バケット上に配置したサイト）でメール送信機能を実装したいと思ったとき、PHPやサーバーなしで対応できる方法を探していたところ、Formsubmitが便利だったため備忘録としてまとめました。

## 内容の説明（フォーム構造とポイント）

以下は、実際に設置したHTMLコードの例です。

```html
<main class="container">
  <section>
    <h2>お問い合わせフォーム</h2>
    <form action="https://formsubmit.co/tbentian37@gmail.com" method="POST">
      <!-- thanks.html がS3に存在する場合はOK。なければ index.html などに変えても可 -->
      <input type="hidden" name="_next" value="thanks.html">

      <!-- スパム対策 -->
      <input type="text" name="_honey" style="display:none">
      <input type="hidden" name="_captcha" value="false">

      <label for="name">お名前：</label><br>
      <input type="text" id="name" name="name" required><br><br>

      <label for="email">メールアドレス：</label><br>
      <input type="email" id="email" name="email" required><br><br>

      <label for="message">お問い合わせ内容：</label><br>
      <textarea id="message" name="message" rows="5" required></textarea><br><br>

      <button type="submit">送信する</button>
    </form>
  </section>
</main>
```

### 解説
- `<form action="https://formsubmit.co/メールアドレス" method="POST">`
  - Formsubmitに送信するためのエンドポイント。送信先のメールアドレスを登録しておく必要があります。

- `<input type="hidden" name="_next" value="thanks.html">`
  - フォーム送信後に遷移するページの指定。

- スパム対策用の `_honey` フィールド
  - 人間には見えない入力欄で、ボットによる送信を防止します。

- `_captcha` の無効化
  - Formsubmitのデフォルトのキャプチャ機能を無効にします。

- 入力項目（名前、メール、メッセージ）
  - `required` 属性で必須項目に。

- ボタン
  - CSSでスタイリングすることで押しやすく、おしゃれな見た目にできます。

## まとめ

Formsubmitを使えば、サーバー不要でシンプルなお問い合わせフォームが実現できます。
HTMLだけで実装可能なため、静的なWebサイトでも導入しやすく、初心者でも扱いやすい点が魅力です。

今後は、自動返信メッセージの設定やバリデーション強化なども試してみると、より便利なフォームになるとかと思います！
HHKB Pro Driverのインストール方法 (MacOS 15

一生ものと言われているHHKBですが、ProfessionalでMac特有のキー（かな、英数など）を使う場合にはドライバーが必要。ということで、新しいMacにドライバーをインストールしようとしたときに衝撃の事実。

![スクリーンショット 2025-03-24 23.04.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/c6976db2-e56d-48eb-8a35-0e51d03fb70a.png)

ということで、サポート終了となっています。ちゃんとMacOS 15で使えたものの、設定場所が違いかなり迷ったのでメモです。

次にインストールする時のために。

## 環境
- MacOS Sequoia 15.3.2
- HHKB Professional JP

## 手順

- [HHKBのサイトよりファイルダウンロード](https://happyhackingkb.com/jp/download/macdownload.html)を行います。

- 「アプリケーション」フォルダーにコピー
- 「HHKB Pro ドライバー」アプリを起動

    ![スクリーンショット 2025-03-24 23.13.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/bfc9fb25-d75a-4d6d-a413-0af235dd30bd.png)

ここで「システム設定」を開く、が正解。

![スクリーンショット 2025-03-24 23.13.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/2a6f34c6-47bd-4cfd-9d05-604be1aab199.png)

この右端のトグルをONにすればOK。しかし、押してくれと言わんばかりの「OK」を押すとハマる。

## OKをして閉じてしまった場合

- いつまで経ってもインストール状態（悲
- ダイアログにある「システム環境設定＞セキュリティとプライバシー（プライバシーとセキュリティ）」の中に「一般」など無く、どこを探しても機能拡張をONにする場所がない....

![スクリーンショット 2025-03-24 23.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/a4d36502-e363-4dc4-8792-4056e90578b5.png)

### 正解は...

- MacOS15の場合の場所は「一般＞ログイン項目と機能拡張＞機能拡張＞ドライバ機能拡張」の右端のインフォアイコン(i)を押す。わかりにくすぎる...

![スクリーンショット 2025-03-24 23.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/93790dbc-8ee5-4458-9f71-fee9578a53ad.png)

キター。

![スクリーンショット 2025-03-24 23.13.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/2a6f34c6-47bd-4cfd-9d05-604be1aab199.png)

## ぶつぶつ

- Macドライバー保守してください...
- 色々な都合で保守できないならオープンソースにして欲しいな。プルリク出しますので！
[VBA]クラスモジュールファイルをインポートしたら、標準モジュール扱いになってしまった時の備忘録

# はじめに
本記事はVBAのクラスモジュールファイル(拡張子：cls)をインポートしたら
「クラス モジュール」へ行く筈が「標準モジュール」へ振り分けられてしまった時に慌てないためのメモ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331961/1167ece6-e129-4533-bfca-63f827bd1234.png)

# 本題
新規作成後、エクスポートしたファイルはこうなっている(改行コード：CRLF)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331961/60a86625-63a2-41f5-b7bf-bc0ce6a525e6.png)

標準モジュール扱いになってしまうのはこちら(改行コード：LF)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331961/183824c9-0a51-4fec-90f7-2d6b3dd78676.png)
※1…改行コード：CRで試みても同じく標準モジュール扱いとなる
※2…実際インポートしたら、属性部を除いて取込となる
```VB:class1_lf.cls(標準モジュール扱い且つインポート後の記述)
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
End
Option Explicit
```
# 結論
１．コンナノ見タ目ダケデハキヅケナイヨ、
　　慌てず改行コードが目視出来るテキストエディタで対象ファイルを確認しよう
２．中身をコピペしてしまえば良い？それは言ってはいけない
AWSパラメータシートからBedrockでCloudFormationを自動生成した際のTips

## 記事の対象者
- パラメータシートを元に手動でCloudFormationやTerraformのコードを書いている方
- IaC化に工数を割けず疲弊している方


## はじめに
IaC化したくても以下のような状況は多々あると思います。
状況１：手動で作成済みの既存環境をコード化したいが、IaC化に避ける工数がない(運用面のメリットは伝わりにくい。。。)
状況２：IaC管理をしていても顧客への納品物としてパラメータシート(以下パラシ)も作成せざるを得ない

そのような状況の課題の1例として、以下のようなことが起こりがちです。
状況１の課題：運用の中の度重なる設定変更でパラシのメンテナンスが管理しきれず、パラシと実環境の設定が一致しない
状況２の課題：IaCとパラメータシートの2重管理になり、管理工数が高くなる。

上記の課題を流行りの生成AIで解決すべく、
AWSパラメータシートをBedrockに読み込ませてCloudFormationテンプレートを自動生成するツールを作成しました！

## 注意事項
- ツールの中身については記載しておりません

## 前提条件
- AWSパラメータシートとは
  - AWSの設定値を主にExcelで一覧化したドキュメント
    - 例:EC2のインスタンスタイプや、セキュリティグループのルール等を記載 
    - メリット：視認性が高い（誰でも読める）
    - デメリット：管理が大変。数年運用していると、実環境と完全一致していることを誰も保障できない

## アーキテクチャ構成
アーキテクチャについて解説します。
①Cloudshell上で実行するツールでS3に配置したパラメータシートをロード
②ロードしたパラメータシートを元にCloudFormationテンプレートの生成するようにBedrockに依頼
※モデルはツール作成時点で最新のClaude3.5 Sonnet V2を採用しています
③完成したCloudFormationテンプレートをS3に出力
④出力したテンプレートを人間がチェック
⑤Infrastructure Composerで視覚的に構成をチェック
⑥チェック済みのテンプレートからStackを作成
⑦Stackを元にAWSリソースを構築
![kousei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942010/2c5b0847-9e1c-48f9-a1cb-4e64c2258031.png)

本記事では②の中の簡単な仕組みの紹介と工夫について共有します

## Tips
### Tips1
#### 問題

:::note alert
Bedrockの仕様で1リクエストの添付ファイル数上限が5つしかない。
https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/conversation-inference-call.html
:::
AWSサービス単位でパラメータシートを分割していた(VPC.xlsx,IAM.xlsx,...)ため、Bedrockに対して一度のリクエストでCloudformationテンプレートの生成することができませんでした。


#### 対処法

:::note info
パラメータシート単位でBedrockへのリクエストを分けてCloudFormationを生成することで対策
:::
パラメータシート単位でBedrockにリクエストを行うことで上記の問題を回避しました。


上記の問題として、パラメータシートをAWSサービス単位等6つ以上のファイルで管理している場合、Bedrockへのリクエスト1回で依存関係のあるAWSサービスのテンプレートを別々に作成することになるため、Outputや参照の命名が統一されなくなります。



### Tips2
Tips1の問題点に対して以下の工夫で対応しました
#### 対処法

:::note info
依存関係の少ないAWSサービスから順番にテンプレートを生成し、生成したテンプレートを後続のテンプレート生成時のリクエストに含める
:::
VPC等、EC2やECSを使用する際の前提になるパラメータシートから順にテンプレートを生成させ、生成したテンプレートを後続のテンプレート生成時に含めることで参照の問題を解決しました。例えば、EC2構築時にVPCやサブネットを指定する必要がありますが、先行して作成したVPCのテンプレートをEC2のテンプレート作成時のリクエストに含めることでテンプレート間の参照(ImportValue)を正しく行うことができるようになります。


### その他
:::note alert
入力ファイルはpdf | csv | doc | docx | xls | xlsx | html | txt | md形式である必要があり、ファイル名に日本語は含められません。
また、環境によってはSharepointに保存していると自動的にブックが保護されている可能性があり、保護されているとBedrockでエラーになるので事前に解除する必要があります。
:::

:::note info
テンプレートのサイズが大きいと一度のリクエストで出力トークン数の上限で途切れる可能性があります。
(モデルによって異なりますが、Claude 3.5 Sonnetの場合8,192トークンが上限です）
そこで、プロンプトで出力が途切れる場合の識別子を付与させて、プログラム側でマージする処理を組むことで解消しました
:::

## おわりに
- 東京リージョンで使用可能なモデルの中で最新のClaude3.5 Sonnet v2の性能が驚異的でインフラ構築・運用に革命が起きたなと感じました。
- Cloudformation対応していないリソースでそれっぽいテンプレートを作成してしまう等の課題はありますが、公式ドキュメントをナレッジベースで読み込ませたり、web検索可能なモデルを使用することで性能向上の余地があると思うので取り組んでいきます。
logging formatterのタイムスタンプの桁数を増やしたい。

# 背景
loggingを使って出力するログのフォーマットをいじる機会があり、タイムスタンプの桁数について調べ直したことを残しておきます。

ログのフォーマットをいじる時に調べたものもまとめるつもりでしたが、一つの記事に入れるとわかりにくいのでそっちは別の記事で。

# 結論
サンプルコードはこちらです。
default_time_formatとdefault_msec_formatを定義してあげることで設定可能です。

フォーマットの変更については上記の通り別の記事ですがコードは新しいサンプル作るのめんどかったのでこれで。。
json形式で作成した構造化ログです。

```python
class CustomFormatter(Formatter):

    default_time_format = '%Y-%m-%d %H:%M:%S'
    default_msec_format = '%s.%06d'

    # この下で使いたいログのフォーマットを指定
    def format(self, record: LogRecord) -> str:

        log_data = {
            "timestamp": self.formatTime(record), 
            "level": record.levelname,
            "message": message,
            # その他加えたいフォーマット
        }
        return json.dumps(log_data)
```
# 桁数の追加について
みたまんまですが、default_msec_formatに桁数を指定することができます。
上の例だとログは
```python
{"timestamp": "2025-03-25 10:00:00,123456", "level": "INFO", "messages": "sample message."}
```
という感じになります。
3桁の場合は下のようにしてあげればOK。
```python
default_msec_format = '%s.%03d'
```



# 参考文献
- [logging --- Python 用のログ記録手段 formatTime(record, datefmt=None)](https://docs.python.org/ja/3.13/library/logging.html#logging.Formatter.formatTime)
minimaをclineから使う

# minimaでRAGをやりたい


https://github.com/dmayboroda/minima/blob/main/README.md

## 動機
1. VScodeでClineを使用して開発している
2. MCPサーバでいろいろ拡張したい
3. ローカル完結でRAGを組んで、いろいろ情報みてほしい


## 下準備
uvのインストール
dockerのインストール
.envファイルの設定

```example
LOCAL_FILES_PATH = C:\\Users\\yuzup\\source\\repos\\minima\\local_files
EMBEDDING_MODEL_ID = sentence-transformers/all-mpnet-base-v2
EMBEDDING_SIZE = 768
OLLAMA_MODEL = mistral
RERANKER_MODEL = sentence-transformers/ms-marco-MiniLM-L-12-v2
```

## 最初にはまったこと

公式ReadMeの通りに設定してみても動かない

```json:
{
  "mcpServers": {
    "minima": {
      "command": "uv.exe",
      "args": [
        "--directory",
        "C:\Users\yuzup\source\repos\minima\mcp-server",
        "run",
        "minima"
      ]
    }
  }
}
```

ダメ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181099/3f78aace-6202-46ca-ade9-064c884ba6a1.png)



## 解決策=パスの書き方
cline_mcp_settings.json
```json
{
  "mcpServers": {
    "minima": {
      "command": "uv.exe",
      "args": [
        "--directory",
        "C:\\Users\\yuzup\\source\\repos\\minima\\mcp-server",
        "run",
        "minima"
      ]
    }
  }
}
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181099/e4c03536-aa4b-4c9a-86c3-11281adb45db.png)


この表示がでていても、mcp serverとして機能する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181099/7dd38582-ce06-4041-b036-0340bdb8e3e3.png)

Retry Connectionと表示されてしまうのは
https://github.com/cline/cline/issues/1272 に回答あり
minimaに特有でなく、cline側のバグ
Redis導入調査 - どのバージョンにする？

## 目的

.NET Core MVCアプリケーションのセッション管理をRedisに委譲し、複数サーバでのセッション共有を可能にしたい。
オンプレミス環境とサーバレス環境の両方で動作するセッション管理の仕組みを構築する。

## 課題

Redis はバージョン7.4以降、OSS（オープンソースソフトウェア）ではなくなった。
7.4以降を「Redis Community Edition」と名称変更。
一般ユーザは引き続き無償利用可能だが、AWSなどクラウドベンダーでは利用できなくなった。

AWSやGCPでは、
***Redisをフォークしたインメモリデータベース「Valkey」が使われ始めている。***:sunny:
（GCPではまだプレビュー版を公開している状況。）

## AWSにはどんなサービスがあるの

・Amazon MemoryDB
データは複数のアベイラビリティーゾーンにまたがって永続的に保存されます。
ゲームのリーダーボードなど、高速な読み書きとデータの永続性が求められるユースケースに適している。

・Amazon ElastiCache
主にキャッシュ用途に設計されており、パフォーマンスを重視しています。
セッションストア、リアルタイム分析など、高速なデータアクセスが求められるユースケースに適している。

今回は、データが揮発してもよい用途なので、ElastiCacheの方を採択。

### AWS 費用感

▼Amazon ElastiCache
TOKYOリージョン(2025-03-24)

・Valkey
保存されたデータ	USD 0.101 / GB-時
ElastiCache Processing Units (ECPU)	USD 0.0027 / 100 万 ECPU

・Memcached
保存されたデータ	USD 0.125 / GB-時
ElastiCache Processing Units (ECPU)	USD 0.0034 / 100 万 ECPU

・Redis OSS
保存されたデータ	USD 0.151 / GB-hour
ElastiCache Processing Units (ECPUs)	USD 0.0041 / million ECPUs

▼Amazon MemoryDB

・Valkey
db.r7g.large　USD 0.2597

・Redis OSS
db.r7g.large　USD 0.371


### 性能・機能

・Valkey
Redisとの互換性を維持。
Valkey7はRedis7.2.4をフォークしたもの。
Valkey8はRedis7.2との互換性を保ちつつ、性能向上や機能強化が盛り込まれている。

・Memcached
マルチスレッドで動作。CPUのコア数を上げれば性能向上。
シンプルなキー/バリュー型のデータ構造のみをサポート。

・Redis OSS
シングルスレッドで動作。
多機能・高機能。


# GCPにはどんなサービスがあるの

## GCP費用感
TOKYOリージョン(2025-03-24)

・Memorystore for Valkey
shared-core-nano　1.4 GB　$0.0408
※まだプレビュー版しか提供していない。

・Memorystore for Memcached
vCPU　$0.064($ per vCPU per hr)
Node ≤ 4 GB　$0.0056($ per GB per hr)

・Memorystore for Redis
Basic M1 (1 to 4 GB)  $0.065


### 性能・機能

・Memorystore for Valkey
Redis 7.2と完全互換（既存のRedisクライアントで利用可能）

・Memcached
マルチスレッドで動作。CPUのコア数を上げれば性能向上。
シンプルなキー/バリュー型のデータ構造のみをサポート。

・Redis OSS
シングルスレッドで動作。
多機能・高機能。


## 所感

AWSの方がValkey版のリリースが早く、費用も安い様子。
AWS、GCPともに、Redis 7.2と互換性が高い。
なので、オンプレ版もRedis 7.2を使うことにする。

## 後日談
Redis 7.2に合わせてプログラムを作成し、
Valkey 7.2.8、および8.0.2で動作確認したところプログラムや設定の変更は必要なく動作した。
AWSとGCPはValkey 7.2、および8.0に対応しているので、性能を意識した場合、Valkey 8.0 を採用するとよいだろう。

## 参考
・公式ドキュメント[[Valkey との主なエンジンバージョン動作と互換性の違い]]
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/dg/VersionManagementConsiderations-valkey.html

-Valkey 7.2 には Redis からバージョン 7.2.4 OSSまでのすべての変更が含まれています。
-Valkey 7.2 と Redis 7.1 (または 7.0) OSS の間で、重大な動作変更が発生する可能性があります。