OmniAICreator/Qiita-1.07M huggingface dataset:
Ghidra MCP, Binary Ninja MCP, IDA MCPを使ってみた

# 概要
- 静的解析ツールのMCP使ってみたよ～
- CursorでMCPを使ったよ～
- ~~Ghidraは変数のrenameができるがBinary Ninjaはできない~~
    - 現在は出来ます


# Ghidra MCP編
https://github.com/LaurieWired/GhidraMCP

## 構築
READMEに動画があるしほぼ詰まらず構築できるけど一応

### Ghidra側
1. githubのreleaseからzipをダウンロード
1. Ghidraを起動しFile->Install Extensions->+ボタンを押して展開したzipファイル内にあるzipファイルを読み込ませる
1. Ghidraを再起動
1. CodeBrowserへ移動しFile->ConfigureでConfigure Toolウィンドウが表示されたら右上のプラグアイコン(Configure All Plugins)を選択
1. GhidraMCPPluginにチェックを入れる(ここ動画に載ってなかったので注意)

### Cursor側
Claude Desktopとかでもほぼ変わらんと思う
1. 必要に応じてvenvを作成
1. `pip install mcp==1.5 requests==2.32.3` (https://github.com/LaurieWired/GhidraMCP/blob/main/requirements.txt 参照)
1. mcp.jsonを設定する
- bridge_mcp_ghidra.pyは展開したzip内にあるので指定
- commandのpythonはvenvの場合など必要に応じて変更
```json
{
  "mcpServers": {
    "ghidra": {
      "command": "python",
      "args": [
        "/ABSOLUTE_PATH_TO/bridge_mcp_ghidra.py",
        "http://127.0.0.1:8080/"
      ]
    }
  }
}
```

## 使ってみた
https://youtu.be/oCvdnfiVsvU

# Binary Ninja MCP編
https://github.com/Invoke-RE/binja-lattice-mcp

## 構築
1. リポジトリをクローン`git clone https://github.com/Invoke-RE/binja-lattice-mcp.git`
1. venvを作成後`pip install -r requirements.txt`
### Binary Ninja側
1. lattice_server_plugin.pyをプラグインディレクトリに移動
    - windowsの場合AppData\Roaming\Binary Ninja\plugins (READMEがミスってる)
1. Binary Ninjaを起動
~~ctrl + ,で設定を開きpython関連のパスをvenvのものに変更する~~
~~ctrl + pでRestart Binary Ninjaと入力し実行~~
1. 適当な実行ファイルをBinary Ninjaで開く
1. Plugins->Start Lattice Protocol Serverを選択
1. Logにtokenが表示されるのでコピー

### Cursor側
mcp.jsonを編集
```
{
    "mcpServers": {
      "binja-lattice-mcp": {
        "command": "/path/to/venv/bin/python",
        "args": ["/path/to/mcp_server.py"],
        "env": {
            "BNJLAT": "your_api_key_here"
        }
      }
    }
}
```
"your_api_key_here"に先ほどコピーしたtokenを張り付ける
あとはcommandとmcp_server.pyのpathを修正する
## 使ってみた
https://youtu.be/qay2blP0U2Q

# 検証に使用させていただいたバイナリ
https://alpacahack.com/ctfs/seccon-13-finals-booth/challenges/slow-flag-printer

# IDA
https://github.com/mrexodia/ida-pro-mcp

## 環境構築
1. python 3.11以降のバージョンを用意 & gitを使えるように
1. `pip install --upgrade git+https://github.com/mrexodia/ida-pro-mcp`
1. `ida-pro-mcp --install`
1. 必要に応じてida側のpythonを変更
    1. IDAがインストールされているディレクトリへ移動
    1. idapyswitchを実行し3.11以降のバージョンを選択

# 比較
- ~~Ghidraはxrefの参照ができないらしい https://x.com/PINKSAWTOOTH/status/1912032582579175929 (そのうちフォークが出るかも...？)~~ → マージされた
- ~~Ghidraはコメント追加できない~~ → できるようになった
- ~~Binary Ninjaは変数や関数のリネームができない~~
    - 追加された
- Binary Ninjaはコスパとか無視するなら公式プラグインのSidekickでよくないっすかね
- IDAは大体全部できる
atcoder-toolsをreCaptchaに対応しログインできるようにする

# なんかログインできないんだけど？？
久しぶりに`AtCoder`に取り組もうかと思い、`atcoder-tools`でディレクトリを作ろうとしたら...
```zsh
$ atcoder-tools gen abc212
2025-04-11 13:37:59,363 INFO: Going to load /Users/user/.atcodertools.toml as config
2025-04-11 13:37:59,363 INFO: Loaded session from /Users/user/.local/share/atcoder-tools/cookie.txt
AtCoder username: user
AtCoder password: 
2025-04-11 13:38:04,965 ERROR: Failed to login (maybe due to wrong username/password combination?)
```

おかしい、何度試してもログインできない、絶対に入力は正しい。
どうやらAtCoderにreCaptcha認証が導入され、自動ログインが機能しなくなったようです。`atcoder-tools`としての記事こそ出てきませんでしたが、`acc`,`oj`を対象として同様の問題に対処している[こちら](https://kaiyou9.com/acc_and_oj_login_failed/)の記事を発見しました。ログイン可能なCookieを`atcoder-tools`に渡せば今まで通りログインできるようです。この情報を元に対処します。

::: note info
今回自動でCookieを更新するツールも作成しました。ただし、Cookie（ログイン情報）を取得するものになりますので、使用は自己責任でお願いします。記事でも後半の紹介に留めます。（Cookieを自動で読み取らず、手入力とするモードもあります）
:::

# 手動でCookieを更新する

## 1. cookieファイルを開く
`atcoder-tools`のcookieが保存されているパスは以下のようにして確認できます。
(実際に`atcoder-tools`のソースにある処理を探してきました)
```python
from atcodertools.fileutils.artifacts_cache import get_cache_file_path
print(get_cache_file_path('cookie.txt'))


>>>/Users/user/.local/share/atcoder-tools/cookie.txt
```
atcoder-toolsを用いて一度もログインしたことがない場合、このファイルはまだ存在しません。その場合は作成してください。

## 2. デフォルトのCookieを貼り付ける
先ほどのcookieファイルを、以下の内容で上書きしてください。
`atcoder-tools`はデフォルトで`REVEL_SESSION="";`の値のみ保存するようですが、これだけではログインできない場合があります。
```
#LWP-Cookies-2.0
Set-Cookie3: REVEL_FLASH=""; path="/"; domain="atcoder.jp"; path_spec; secure; discard; HttpOnly=None; version=0
Set-Cookie3: REVEL_SESSION=""; path="/"; domain="atcoder.jp"; path_spec; secure; expires="2025-10-06 10:09:30Z"; HttpOnly=None; version=0
```
## 3. `expires="2025-10-06 10:09:30Z";`の値を上書きする
おおよそ入力時点の半年後の日時を記入しておけば問題ないはずです。一応100年後でもログインできました。

## 4. REVEL_SESSION の値をAtCoderのCookieからコピーする
[こちら](https://kaiyou9.com/acc_and_oj_login_failed/)の記事に従えばコピーできます。

## 5. `REVEL_SESSION="";`の値を上書きする
先ほどコピーした値を書き込み、ファイルを保存します。

---
これでログインできるようになっているはずです。


# ツールを利用する
私が作成した[ツール](https://github.com/FukumotoIkuma/atcoder-tools_login)を使う方法です。詳細は`README`に記載しているので、この記事では以下の条件で紹介します。
- `Chrome`または`Firefox`を使っている
- AtCoderに一つのプロフィールでしかログインしていない

ちなみにLinuxとWindowsについては動作確認できていないのでご了承ください...ChatGPTを信じましょう。

## 1. インストール
```zsh
pip install git+https://github.com/FukumotoIkuma/atcoder-tools_login
```

## 2. 実行
次のコマンドで実行できます。使っているブラウザによって、オプションを切り替えます。
```zsh
atl chrome
```
```zsh
atl firefox
```

## ３.キーチェーンパスワードの入力
デフォルトでは、ログインパスワードと同じです。合計２回入力する必要があります。
このパスワードを入力しない限りCookieを読み取られることはないのでご安心ください。

パスワードを入力したくない場合、オプションをつけずに実行し、該当Cookieを手入力することも可能です。


# 最後に
コマンドラインからログインできるようにしたくて、随分と余計な開発をしてしまったように思います。多分このツールを使うのは年に1,2回です。


参照

https://kaiyou9.com/acc_and_oj_login_failed/


https://github.com/FukumotoIkuma/atcoder-tools_login
JenkinsとBitbucketを連携する備忘録

## 公開鍵の登録
Docker環境で立ち上げているため、各環境に置き換えて実施
やることは同じでSSHの鍵を作って公開鍵をコピーする
```
起動中のコンテナ名を確認
docker ps

# Jenkins コンテナに入る(jenkinsでなければ変えて実行)
docker exec -it jenkins bash

# jenkins ユーザの HOME をログインシェルに変更（初回のみ）
usermod -d /var/jenkins_home -s /bin/bash jenkins

# jenkins ユーザで鍵を生成（パスフレーズなし）
ssh-keygen -t ed25519 -C "jenkins@ci" -N "" \
  -f /var/jenkins_home/.ssh/id_ed25519

chown jenkins:jenkins /var/jenkins_home/.ssh/id_ed25519*

## Windowsの場合
### PowerShell を「管理者」ではなく *Jenkins と同じユーザー* で起動
### ed25519 推奨。コメントは任意
ssh-keygen -t ed25519 -C "jenkins@bitbucket" `
           -f "$env:USERPROFILE\.ssh\jenkins_bitbucket_ed25519"

# 公開鍵を表示
cat /var/jenkins_home/.ssh/id_ed25519.pub
ssh-ed25519 ここに公開鍵 jenkins@ci
↑これをそのままコピー
```

Bitbucketに登録
Repository settingsから
![スクリーンショット 2025-04-11 10.20.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692471/6a88e0ee-5bc4-4e94-943d-a232d4cf6eac.png)

Securty→access Key → Add key
![スクリーンショット 2025-04-11 10.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692471/6e68f228-14f9-4558-9029-b5e87a90a60c.png)

先ほど作成した公開鍵を登録
![スクリーンショット 2025-04-11 10.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692471/268ba36f-5a6d-4858-a1fa-81be20e9ae57.png)

## WebHookの登録
Bitbucket pluginをインストール
![スクリーンショット 2025-04-11 13.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692471/d66ad61a-cfd6-4746-b5a5-7f4b93d518d7.png)

Webhookの登録
![スクリーンショット 2025-04-11 10.27.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692471/5ff02d4f-53fd-4801-b85a-fdee1318c5bb.png)


## 認証情報(Credentials)を登録
![スクリーンショット 2025-04-11 13.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692471/12b2c842-f05f-4689-bc8a-83f4ed8c3778.png)
Add Credentialを押下
![スクリーンショット 2025-04-11 13.21.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692471/cabc944f-c088-4c92-bda0-bf129e88458f.png)
各項目を入力
秘密鍵の確認方法は下に記載
![スクリーンショット 2025-04-11 13.25.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692471/b3243ae8-77f0-46c6-9e0a-82e2d5efee14.png)

秘密鍵
```
cat /var/jenkins_home/.ssh/id_ed25519
-----BEGIN OPENSSH PRIVATE KEY-----
ここに秘密鍵
-----END OPENSSH PRIVATE KEY-----
```

## Jobの登録
![スクリーンショット 2025-04-11 14.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692471/75d9e2bd-737a-4663-ba72-b80f4afc42ac.png)
リポジトリのURLはBitbucketから拝借
![スクリーンショット 2025-04-11 14.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692471/9ccf7888-4003-4a6e-9c85-8b128e418ff8.png)
expo・android、textを共有する候補とする

# これはなに
expo・android app を構築する際、Instagramから投稿記事を共有しようとした時に候補として表示されるようにしたかった。
その時の備忘メモ。

# 結論

`IntentFileters` をセットし、`text/plain` を受領することを定義すればよい。

```app.config.js
  "android": {
    ...
    "intentFilters": [{
      "action": "SEND",
      "category": [ "DEFAULT" ],
      "data": { "mimeType": "text/plain" }
    }]  
  }, 
```

# はまったポイント

当初、以下のように記述していた。

```app.config.js
  "android": {
    ...
    "intentFilters": [{
      "action": "android.intent.action.SEND",
      "category": [ "android.intent.category.DEFAULT" ],
      "data": { "mimeType": "text/plain" }
    }]  
  }, 

```
この状態で `eas build` を実施、実機で動かしてもテキスト共有の候補に表示されない。
原因究明をする中で、`npx expo prebuild` を実行し `AndroidManifest.xml`を確認してみた。

```AndroidManifest.xml
<intent-filter data-generated="true">
  <action android:name="android.intent.action.android.intent.action.SEND"/>
  <data android:mimeType="text/plain"/>
  <category android:name="android.intent.category.android.intent.category.DEFAULT"/>
</intent-filter>
```

なんと、`action`と`category`が不正…orz
これらは自動で接頭辞が付与される模様。`doc` のどこかに書いてあるのかしら。
今後は気をつけるべし。
転職でキャリアを壊さないために。ITエンジニアが知っておきたい判断軸

## 転職の時に考えること 〜エンジニアとして後悔しない選択を〜

### はじめに

エンジニアとして働いていると、「今の環境を変えたい」「もっと成長したい」と思うことがあります。  
特にIT業界では、転職は決して珍しい選択肢ではなく、むしろキャリアアップの手段として活用する人も増えてきました。

しかし、転職は大きな決断。  
勢いだけで動いてしまうと、「こんなはずじゃなかった……」と後悔することにもなりかねません。

この記事では、エンジニアが**転職を考える時に意識したいポイント**について、私自身の経験や周囲の事例も交えて解説していきます。  
これから転職活動を始める方や、迷っている方の参考になれば幸いです。

---

### 1. 転職理由を明確にする：なぜ今、転職したいのか？

まず最初に考えるべきは、「自分はなぜ転職したいのか？」という根本の動機です。

#### よくある転職理由（例）

- **給与が上がらない**：同年代の他社エンジニアと比べて、年収が見劣りする
- **技術的な停滞**：レガシー環境で新しい技術に触れられない
- **マネジメントばかりになって開発から離れてしまった**
- **チームや上司との人間関係にストレスを感じる**
- **リモート不可でライフスタイルと合わない**

これらの理由自体は正当ですが、**「その会社が嫌だから辞めたい」だけでは、次の職場選びに失敗しやすい**のが現実です。

#### ポジティブな転職動機に言い換える

転職活動では、「転職して何を実現したいか？」を語れることが大事です。  
たとえば次のように置き換えてみましょう。

| ネガティブな理由 | ポジティブな目的 |
|----------------|----------------|
| 上司と合わない | チームで対話できる文化を重視したい |
| 給料が安い | 自分の市場価値に見合った報酬を得たい |
| 古い技術しか使えない | 最新の技術を実務で扱い、成長したい |

「◯◯が嫌」ではなく、「△△を実現したい」に変えることで、企業側からも前向きな印象を持ってもらえます。

---

### 2. 今の環境で得られることを棚卸しする

転職したいと思ったとき、感情だけで動かずに、**今の環境で得られているもの**を冷静に見直すことも大切です。

#### 具体的に見直すポイント

- 今の会社で得た**スキルや経験**
  - 例：「Vue.jsを使ったSPA開発の経験」「要件定義から関わる上流工程の経験」
- プロジェクトの進め方や**開発文化**
  - アジャイル／スクラム、レビュー文化など
- 周囲のメンバーからの学びや刺激

「辞めたい」と思った背景には、本当に環境の限界があるのか、それとも自分がアクションを起こしていないだけなのか、を一度考えてみるのがおすすめです。

#### 異動や副業という選択肢も

社内異動や部署変更で環境を変えられる可能性がある場合もあります。  
また最近では、副業やOSS活動、コミュニティ参加を通じて外の世界と接点を持つことでモヤモヤが解消される人もいます。

「転職＝唯一の手段」と考えず、**選択肢を広く持つこと**が後悔しない第一歩になります。

---

### 3. 次の職場で実現したいことを明確にする

転職は「過去からの逃避」ではなく、「未来への前進」であるべきです。  
そのためには、次の会社でどんなことを実現したいのかを具体的に言語化しておくことが重要です。

#### 自分に問いかけるべき質問

- 自分はどんな働き方を理想としているか？
- どんなスキルを伸ばしていきたいか？
- どんなチームや組織で働きたいか？
- 将来どんなキャリアを築きたいのか？

#### 例：理想の転職像

- 技術選定に関われるポジションで働きたい
- 自社サービスのUI/UX改善に深く関わりたい
- フルリモートで柔軟に働きつつ、チームとの連携も重視したい

このような「軸」がはっきりしていれば、転職活動の企業選び・面接対策にもブレがなくなります。

---

### 4. 転職活動の準備を丁寧に進める

転職活動は、実際に企業に応募する前の「準備」がとても大切です。  
特にエンジニアの場合は、ポートフォリオや技術ブログなど、**スキルの見える化**が重要な武器になります。

#### 準備のToDoリスト

- ✅ 職務経歴書をブラッシュアップ（プロジェクト単位で実績を書く）
- ✅ GitHubのアクティビティやコードを整備
- ✅ 個人開発アプリをまとめて紹介できるページを作る
- ✅ QiitaやZennなどの技術記事を書く
- ✅ 模擬面接や自己紹介の練習をする
- ✅ 転職エージェントやスカウトサービスを活用する

#### 技術ブログはアピールポイントになる

Qiitaでの記事投稿は、技術的な理解力やアウトプットの姿勢を伝えるのに非常に有効です。  
「自分の言葉で技術を整理できる人」は、どの企業からも重宝されます。

---

### 5. 転職後に「本当に良かった」と思えるように

転職はスタート地点であってゴールではありません。  
新しい職場でも、**前向きに行動する姿勢や、学び続ける意欲**がなければ、環境が変わっても満足できない可能性があります。

#### 転職後に大切にしたいこと

- 最初の3ヶ月は「信頼構築期間」として丁寧に立ち回る
- 疑問点はすぐに確認し、積極的にコミュニケーションをとる
- 技術だけでなく、ビジネスやチーム文化への理解も深める

また、**「転職してよかった」と思えるかどうかは、自分の視点次第**です。  
どんな職場にも課題はありますが、それを成長の糧として捉えられるかどうかが大きな差になります。

---

### おわりに：転職は「自分のキャリアを見つめ直すチャンス」

エンジニアとして転職を考えることは、単なる「会社選び」ではなく、「人生や働き方を再定義すること」にもつながります。

焦って選ぶのではなく、  
「今の自分はどこで、どこを目指したいのか」  
を丁寧に考える時間にしてみてください。

この記事が、あなたのキャリア選択に少しでも役立てば嬉しいです。  
そして、これからの道のりが、納得のいく前向きなものになることを願っています。
VPC内ネットワーク接続方式比較

# 前置き
AWSマネージメントコンソールをぽちぽちしていたら、サービス[VPC]に以下のような項目を発見しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/4b74bc20-de8b-4f84-8a7f-61f702cdd56d.png)

なにこれぇ？と思って調べてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/48525138-03ba-4d53-ad47-ff575dd2dbce.png)

そんなのあるんかーい。
ということで似たようなサービスを生成AIに比較させました。

# VPC内ネットワーク接続方式：4種比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/69b7d7c3-78a5-4f0a-a13f-839feb1b5f86.png)

# まとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/96c5b15d-1758-444d-a94f-90e94d7f60e0.png)
Cursor Proを2週間くらい使い倒したら爆速開発が可能になった話 [Cursor解説]

# はじめに
今までCodyAIを使ってたのですが、色々なAIを触りたいということで**Cursor Pro**に加入し、実際にブログサイトを開発したら爆速開発が可能になった話をしようと思います。

CursorFreeを使っている人やAIエディタを使おうとしている人が、CursorProを使うきっかけになればと思っていますので、よろしくお願いします。

# 宣伝
今回の記事を書くに当たって、自分の日常や記録を発信するブログサイトを作りました。現在進行形で更新中なので、ぜひみていってください。

https://kanikanlab.xyz/

ということで、本編どうぞ。

# Cursorとは？
AIエディタといえば？と聞かれて必ず出てくるのがこの**Cursor**です。

https://www.cursor.com/ja

今まではVSCodeが主流でしたが、CursorはここにLLMが搭載され、AIとチャット形式でやりとりしながらコーディングをすることができます。

### 料金
料金は現在、下のようになっています。
![スクリーンショット 2025-04-11 9.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678410/3bb618ca-6b0d-4405-a696-9bef8b8e2994.png)


# 基本的な使い方
Cursorでプロジェクトを開くと次のようになると思います。

![スクリーンショット 2025-04-11 13.41.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678410/3cae9ec5-41f3-441c-a150-9205ce4b6975.png)

Cursorは、基本的に右にある**Chat**で操作します。

## チャットの使い方
チャット機能だけでも、それぞれ３つのモードに分かれます。
![スクリーンショット 2025-04-11 13.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678410/1c6f3a3d-eddc-42fe-8c90-df7002075d94.png)

### Agent
Agentモードは、３つの中でも特に「自動化」に特化したモードです。プロジェクトディレクトリを自動でコンテキスト化して読み取り、コード編集、ファイル操作が可能です。

### Ask
Askモードが、この中でも一般的なチャット形式によるコード編集モードです。元あるプログラムのデバッグや追加をする際に、このモードは重宝します。

### Manual
限定的な編集をしたい場合のみ、このManualモードを使います。自分は使ったことがないのですが、特定のファイルのリファクタリングをする際に用いるそうです。

# 実際に使ってみる。
今回は開発途中だったブログサイトのデバッグをやってもらおうと思います。

![スクリーンショット 2025-04-11 14.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678410/b4b158a5-d1c0-4c3e-8249-e561d9d9485b.png)

Sendすると、AIが全体のコンテキストを取得してデバッグを開始してくれます。

![スクリーンショット 2025-04-11 14.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678410/3f1342f6-b76b-4743-840a-3dd8d5d286b9.png)

いいですね。

さらにCursorはコードファイル内にも呼び出すことができ、コードを直接修正、編集してくれます。

![スクリーンショット 2025-04-11 14.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678410/2ac37189-be80-43a3-af04-f84afce2f163.png)

この機能を酷使して、ブログサイトを開発してました。

![スクリーンショット 2025-04-10 19.52.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3678410/1ba03cbb-6566-4b0a-b5a4-5b5d6163e1ae.png)

気づいたらもう500リクエスト送ってた...笑
この開発で、多分700~800リクエストは送ったきがします。

# 開発で使ってみて
色々デバッグを重ね、ブログサイトを完成させることができたので、デプロイまでの感想を述べたいと思います。

まず現在開いているプロジェクトのコンテキストを全て把握してくれるのはありがたすぎる。それに基づいてコード編集が可能なので精度が高い。

少し懸念してたのが、Limit hitした時のLLM呼び出しの制限です。CursorProは有料といえどリクエスト数に制限があります。これに達すると、呼び出しが遅くなると書いてあるのですが、気になるほどの遅延は発生せず、快適に開発できるのでよかったです。時間帯によって変わるかも？

# おわりに
いかがでしたでしょうか？
今回初めて記事を書いたのですが、CursorProの魅力が少しでも伝わると嬉しいです。
今後は、Qittaだけでなく自分のブログサイトを中心にテック関係やプライベートのことについて発信していきますので、よろしくおねがいします。
【AWS構築】AWSのAutoScaling機能をハンズオン

## EC2のスケーリングサービスのAutoScalingをハンズオンで理解したい

## AutoScalingとは？

EC2の水平スケーリング（台数を増やす）サービスです。
起動テンプレートに従って、複数のAZに跨って、スパイク時にEC2を追加で増やすことができます。


## 手順
まず、AutoScalingテスト用のEC2を立てました。（無料枠）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/5adccb9d-1cdb-4ac6-b289-9a84318e6eb3.png)


AutoScaling設定は左ペインの一番下にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/822201eb-a65e-407b-a97a-0f4757d689c5.png)

起動テンプレートがないので、EC2を元に作る必要があるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/071cd4fa-b12e-475c-a9da-51b235bccb86.png)


## EC2のAMI取得と起動テンプレート作成

「アクション」⇒「イメージとテンプレート」⇒「イメージの作成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/e9209036-a836-4323-83b3-5d753f7b1520.png)

イメージを作成すると、左ペイン「イメージ」⇒「AMI」でイメージの一覧を確認可能
作成直後はステータスが「保留中」のため、「」になるのを待つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/34c0e72f-16d9-4945-84d3-5493c336805e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/88b16e0d-b37b-4e3c-a61c-430c700afc3d.png)


起動テンプレートの作成画面に移動し、適当な名前と説明を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/7e4d4053-8816-4c36-8b54-b548d3def10c.png)

起動テンプレートのAMIは「自分のAMI」から先ほどのAMIを選択
キーペアとインスタンスサイズは適当な値
サブネットは入力なし


## ほかのサービスと統合
AutoScalingされたEC2に正常にトラフィックを分散されるためには、前段にALB,NLBを配置するのが一般的だが今回は割愛する。

## グループサイズ
下記のように指定
・常時1台で最大で2台までスケールアウト
・平均CPU使用率50％を超えると、AutoScaling起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/65279b41-a0dc-42a0-9484-9578ada1c5ee.png)


:::note
インスタンスのウォームアップとは？
AutoScalingが働いてスケーリングがすぐに始まると一気にEC2が立ち上がるため、スケーリング後の待機期間を設定できる
:::

タグなどの設定はデフォルトで良いので「AutoScalingグループを作成」する。

↓AutoScalingグループが作成された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/0b6e7961-074e-41be-a760-2f15844b0ca0.png)

↓AutoScalingグループの「インスタンス管理」内でこのグループ内のインスタンスを確認可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/35722247-8ffd-4b0a-a25f-5a68082cf3cb.png)


## CloudWatch
CloudWatch内にもAutoScalingグループの標準メトリクスが閲覧可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801383/b5d2f5a2-17d0-481b-b945-783c403f9fa9.png)



#　次の記事で負荷テストでの自動スケーリング確認を行う。
初投稿

# 軽めの自己紹介
情報系の学部を卒業して情報系の外部大学院に進学した人。
学部全体の中でのGPAは多分半分よりちょい上ぐらいかな...(だと思いたい)そんなに悪くはなかったはず。

元々インターネットに興味があって進学したし、そこそこにちゃんと授業受けてたし、理解もしてたと思う。
でも、趣味でサーバー立てたりとか競技プログラミング...みたいなことにはならず授業以外は吹奏楽に没頭してました。

学部時代に吹奏楽へリソースを割いたことに後悔はないですが、「情報学や情報関連のテクノロジを**楽しんで**きた人にはなかなか叶わないな...」と思う今日この頃です。


# Qiitaに記事を書こうと思ったわけ
大学院に入って周りのレベルの高さに驚いたのが投稿のきっかけ。バッググラウンドは様々だけど、みんな私より情報関連のこと詳しいし、話についていけないこともしばしば。

「周りに追いつきたい」とか「自分の学びを積極的に言語化することで少しでも自分を高めていきたい...」とか「単純にアウトプット必要じゃない？」とか「学んだこと可視化したい」とか考えた結果、記事投稿を始めよっかなって思いました。とりあえず始めてみるか、ぐらいのわりと軽い理由です。情報関連の学びは超素朴なものも含めてここに書けたらな。

# 私の記事を読むのがおすすめな人
上述の文章でもわかるように記事投稿の主目的は内省的な側面が強いわけですが、せっかくネット上に投稿するので誰かの役に少しでも立てたらいいなとも思っています。おそらく私の記事を読んで何か得られるのでは、って対象を自分なりに考えてみました

- プログラミング言語の文法は理解したけど、何をしたらいいか分からない人
- シェルを使いこなしたいけど、よく分からない人
- 情報学初学者の気持ちを知りたい人

これらに沿う記事が投稿することの保証はできませんが、**まだまだ伸びしろのある情報初学者の私が背伸びせず等身大の記事を書くこと**をお約束します。

# 最後に
Qiita記事投稿は完全に思いつきです。ほんとに。~~同期に一言勧められただけなんですね、実は。~~
でも、せっかくずっとROM専だったQiitaで初めて記事書いたんで、続けていきたいです。まだまだ初心者で色々拙いと思いますが、あたたかく見守ってもらえればと思います😊
オンプレミス環境からAWSへデータ移行手段比較

# 前置き
AWS SAPを勉強する中で、オンプレミスからAWSへデータ移行するシナリオが出てきました。
似たようなサービスがあり混同したので、生成AIにも相談した内容をメモとして残します。


# AWS DataSyncとStorage Gateway とRobocopy/rsync 比較まとめ

✅ AWS DataSync：バッチ型の高速・安全なデータ移行サービス

✅ AWS Storage Gateway：オンプレからAWSストレージへ透過的接続を実現

✅ Robocopy / rsync：OS標準 or 汎用CLIツールを使った手動移行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/0d0c13c7-44bf-4b11-a1ec-2d4bf45e6ffe.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021557/52855d75-9440-4b91-b5c9-e8d9c24343d0.png)
SESAMEをWear OSから解錠/施錠する

# はじめに
家のスマートロックとして、SESAME5を使っています。
bluetooth接続だとたまにうまくいかず外で待ちぼうけを食らうのですが、Wifiに接続させておくことでどこからでも鍵を開け閉め出来て便利。

ただ、**より便利にしたい！！**

今は
1. ポケットからスマホを取り出す
2. スマホを起動/ロック解除
3. SESAMEアプリ起動
4. 家の鍵を解錠/施錠

という流れです。

これを
1. スマートウォッチを起動
1. マクロ実行で家の鍵を解錠/施錠

の**2手順**にしたお話です。

# 参考
https://zmzlz.blogspot.com/2021/06/sesame3-sesame-os2-gas-web-api.html

# 必要なもの
- SESAME
（今回使ったのは5だけど、多分4とかでも出来る？）
- SESAME Hub
（これもWifiモジュールでもいける？）
- スマホ
- Wear OS搭載のスマートウォッチ
- Macrodroid

# 手順
## 1. 自分のスマホに入っているSESAMEアプリでログインしておく
SESAMEアプリを開いて「自分」タブを選び、メアド登録。

## 2. SESAMEのAPIキー取得
https://biz.candyhouse.co/login

公式のユーザーページにログインして、APIキーを取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/b5faa015-8ff6-49a6-bfad-6bb7169f3f8c.png)

## 3. SESAMEキーのSSIDとSecret Key取得
APIキー下部にある「個人で登録済のデバイス」から利用したいSESAMEを選べば取得出来る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/d64206fc-68b0-4cf7-9e11-c89dba5c6bcd.png)

## 4. Google Apps Scriptを構築する
https://zmzlz.blogspot.com/2021/06/sesame3-sesame-os2-gas-web-api.html

手順はこちらのサイト様の「【事前準備２：外部JavaScriptを追加】」を参照。
（素晴らしいコードありがとうございます・・。）

これが終わったらGAS上でのスクリプト実行で、SESAMEの鍵が開け閉め出来ることが確認出来るはず。

## 5. Macrodroidで鍵の開閉マクロを作成する
※Macrodroidアプリはスマホ、スマートウォッチ両方に入っていること。

ざっくりこんな感じで作る。
![1744346923680.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/629094d7-41db-4c2b-bf92-c4ba1adf9a30.jpeg)

HTTPリクエストの設定はそれぞれ下記の通り。
- リクエストメソッド：POST
- URL：GASのデプロイに記載されているウェブアプリのURL
- コンテントボディ：`{"myKey":"GASにて自分で設定したキー","deviceName":"実際のセサミの名前","command":2}`

上記以外は特に触らなくて大丈夫です。

## 6. コンプリケーションクリックの設定用マクロを用意する
:::note warn
後日追記：
こちら、機能自体はするのですが・・。
WearOS側のMacrodroidを起動してから5分も経つとトリガーが死ぬっぽく、動かなくなっちゃいました。
無駄に電池や場所を取るので、一度試してダメそうなら諦めたほうが良いかもしれません。
:::

コンプリケーションクリック（Complication Click）がよく分かっていませんが、何かしらのトリガーを元にアクションとして値を表示するような仕組みっぽい。
参考：

https://www.reddit.com/media?url=https%3A%2F%2Fpreview.redd.it%2Fphone-battery-level-on-wear-os-watch-face-v0-f81awj0mznae1.jpeg%3Fwidth%3D1080%26format%3Dpjpg%26auto%3Dwebp%26s%3Daca8e0e8de4f1b9d48ebcfa007bcbb40ffb2af46

ただ、今回は常駐するボタンとして扱いたいのでこんな感じで設定しました。
![Screenshot_2025-04-11-15-18-19-367_com.arlosoft.macrodroid.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/90bda053-d3ee-41b6-a9ca-8d3095468a75.jpeg)

:::note alert
画像だと「このマクロが有効時」をトリガーにしていますが、これだと電池の消耗が激しくなってる（気がする）ので、「週に1回のみ実行」にするのをおすすめします。

:::


## 7. スマートウォッチのウォッチフェイスに表示するよう設定
僕が使っているGalaxy Watch7だとこんな感じ。
他の機種だとどうなるかはわかりませんが・・。
なんとか表示出来るはず！
![1744352454438.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/74dc4e2a-d2f4-461f-bb8f-54142a266fc4.jpeg)

## 8. スマートウォッチを開いてMDアイコンを押す
これで鍵が開け閉め出来ていれば完了！やったね！

# おわりに
ここから更に発展して「鍵を開けました。バッテリー残量：XX%」的なメッセージまで出すようにしました。
自分が普段仕事で使っている技術で、自分自身の生活が楽になるときってドーパミンがすごいです。
API×ローコード開発でできること3選

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/ac2d686be85eec9feaf0&utm_content=link-top&f000099824=https://qiita.com/SPIRAL_internship/items/ac2d686be85eec9feaf0

---

## はじめに
こんにちは！スパイラル株式会社インターン生です。
近年、ローコードプラットフォームが注目を集めていますが、これにAPIを組み合わせることで、システム開発をさらに効率的に開発することができます。本記事では、ローコードとAPIを組み合わせた具体的な活用事例について紹介します。
## APIとは
API（Application Programming Interface）は、ソフトウェアやプログラム間でデータの受け渡しを行うための仕組みです。
APIには誰でも利用できるオープンAPIや、クラウドプロバイダが提供するAPIなど様々な種類があります。
## API×ローコード開発でできること3選
- ①Azure OpenAI API＋Power Platform
ローコードで作成したアプリに「OpenAI API」を組み込むことで、コンタクトセンターのオペレーターの対応評価をAIが行ってくれます。他にも、問い合わせの概要要約や顧客情報の特定が可能になります。
- ②NAVITIME API＋Claris Connect
「NAVITIME API」では車のルート検索をする「For Claris car」や地図を表示する「For Claris map」などのサービスを提供しています。
このNAVITIME APIとローコードプラットフォーム「Claris Connect」を組み合わせることで、車のルートプランニングサービスを構築することができます。
ただし、NAVITIME APIはClaris Connectと連携した場合しか使用できないため注意が必要です。
- ③SPIRAL API＋ローコードプラットフォーム
SPIRAL® ver.2は主要機能をREST APIで公開しています。[(https://docs.spiral-platform.com/api/)](https://docs.spiral-platform.com/api/)
 この「SPIRAL API」を活用することで環境を構築することなくセキュアなデータベースとメール配信機能を導入することができます。また、操作画面が標準で提供されているため、メール配信画面も用意する必要がありません。
ローコード開発は従来の開発手法に比べて効率的に開発を行うことができますが、このローコード開発とSPIRAL APIを組み合わせることでより迅速に開発を行うことが可能になります！

---
▼SPIRAL ver.1のお試しはこちら

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/ac2d686be85eec9feaf0&utm_content=link-middle&f000099824=https://qiita.com/SPIRAL_internship/items/ac2d686be85eec9feaf0

---

## API活用時の注意点
- 利用規約の確認
API提供元によっては利用規約に禁止行為を定めている場合もあるため、APIを利用する前には利用規約を必ず確認しましょう。
- セキュリティ
APIを活用することでセキュリティ上のリスクに晒される場合があります。セキュリティ対策は十分に行いましょう。
- レート制限
APIによってはリクエスト数が制限されていることがあります。こちらも利用規約と同様API利用前に確認しておきましょう。
## まとめ
APIとローコード開発を組み合わせることで、より迅速な開発やローコード開発だけでは難しい多彩な機能の実現が可能になります！利用規約を十分確認した上で存分に活用しましょう。
## 参考にしたサイト
[enjoy.CRMⅢにノーコード・ローコードとAzure OpenAIをぶち込んでみた]( https://www.oki-osk.jp/column/column_2023/column04.html)
[アプリケーション統合プラットフォームClaris Connect×ルート検索、地図開発ツールNAVITIME API]( https://api-sdk.navitime.co.jp/api/clarisconnect/)
[API連携]( https://spiral.pi-pe.co.jp/function/api/)
[APIとは？種類と利用上の注意点]( https://qiita.com/Norennn/items/88404d306a63eccb0802)

---
 
 
私がインターンしているスパイラル株式会社は、ローコードプラットフォーム、SPIRAL ver.1の**トライアルアカウント**を**無償提供**しています。このアカウントの記事でも紹介するように、たくさんの機能ございます。
 
▶︎ フォーム
▶︎ 認証エリア
▶︎ ログイン
▶︎ メール送信
▶︎ カスタムプログラム
 
などの作成できますので、ぜひ試してみてください!!
 
https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/ac2d686be85eec9feaf0&utm_content=link-bottom&f000099824=https://qiita.com/SPIRAL_internship/items/ac2d686be85eec9feaf0
 
そして、今チームでトライアル登録者向けに、オンボーディングコンテンツを作成しています。**SPIRAL ver.1**にご興味のある方、ぜひこちらもご覧ください👇

 https://knowledge.spirers.jp/special/detail/11680
TEST

```
stages:
  - build
  - deploy

build:
  stage: build
  script:
    - echo "ビルドステージ（今回は省略して、デプロイ時にビルド）"
  only:
    - main

deploy:
  stage: deploy
  only:
    - main
  script:
    - echo "デプロイステージ"
    - chmod 600 deploy_key.pem
    - ssh -o StrictHostKeyChecking=no -i deploy_key.pem ec2-user@EC2_PUBLIC_IP '
        cd /home/ec2-user/app &&
        git pull origin main &&
        docker-compose down &&
        docker-compose build &&
        docker-compose up -d
      '
```
無料でパイソン学ぼう！役立つ実践的な講座3選🐍✨


こんにちは、韓国在住のsanaです！

今回は、パイソンを使った実践的なスキルを身につけるために役立つ3つの講座を紹介したいと思います！


1️⃣Python無料講義（活用編1） - 思い出の娯楽ゲームを作る（3時間）

実際の開発に役立つスキルを深めることができます。初心者でも安心して取り組める内容なので基礎知識がある方、パイソンの応用力を身につけたい方におすすめです！📈

https://u.inf.run/429LZ9s

2️⃣Pythonプログラミング
基礎からスタートし、徐々にプログラミングの力を養うことができます。プログラムを書く力を身につけたい初心者の方にぴったりです👨‍💻

https://u.inf.run/3G5UB8k


3️⃣Pythonベースライブラリから積み重ねる機械学習
機械学習に興味がある方には、このパイソンを使った機械学習の講座が最適です！

https://u.inf.run/3GfTL8W

私はPythonの学習を始めるときに２番目の講座を参考にしたんですが、座学＋実習＋座学＋実習と交互に講座が組まれていたので学んだことをすぐ実践して、わからないことがあったら戻って復習してとできたので個人的に役に立ったなと思いました！🌟
ChatGPTだけでLINEスタンプを作ってみた話：企画〜制作まで、AIの“配役”で完結！

## はじめに

「AIが仕事を奪う」といった言葉が話題になる中で、今回はその一端を体感すべく、**LINEスタンプ制作の全工程をAIに任せてみる**という実験をしてみました。

結果はこちら👇  
[作成したスタンプ一覧（LINEストア）](https://store.line.me/stickershop/author/5309163/ja)

本記事では、以下のように**役割ごとに異なるAIモデルを“配役”して制作を進めたプロセス**と、活用上のポイントを紹介します。

---

## スタンプ制作におけるAIの“配役”

AIは一つのツールではなく、「複数の役割」を演じさせることでより高い効果を発揮します。今回は次のような“役割分担”で進行しました。

### 👤 1. スタンプ企画者（ChatGPT o1）

- **ターゲット層の設定**
  - 例：20〜40代の女性（OLや主婦層など）
- **キャラクター設計**
  - 例：アメコミ風・働く女子 など
- **セリフ・シチュエーションの企画**
  - 在宅勤務あるある、恋愛系、日常の感情表現など

### 🎨 2. クリエイティブ担当（ChatGPT o3-mini-high）

- **デザイン指示書の作成**
  - 表情・ポーズ・服装・背景などを具体化
- **トーンやスタイルの整合性**
  - シリーズ全体のトーン（ポップアート風、手書きセリフ etc）


### 🖌️ 3. イラストレーター（GPT-4o）

- **最終的なスタンプ画像の生成**
  - 指示書に基づき、イラストを生成
  - セリフ追加や画像サイズ調整も自動で対応

---

## 実際に作ったスタンプ（一部紹介）

![Screenshot 2025-04-11 at 14.36.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/e0441c63-743b-4acf-abbe-4dd2286f9ab5.png)

気になる方はぜひ実物をご覧ください👇  
[LINEスタンプ販売ページ](https://store.line.me/stickershop/author/5309163/ja)

---

## AIだけで制作して感じたこと

### ✅ メリット

- **スピードが圧倒的**
  - 企画〜デザイン指示〜イラスト生成まで、1日で完結
- **シリーズとしての一貫性も保てる**
  - 指示書をテンプレ化すれば、量産も容易

### ⚠️ 課題

- **“人間っぽさ”の微調整**
  - 表情やセリフの“リアルさ”には人間の感性が必要
- **著作権やガイドラインの確認**
  - LINEスタンプの規約に準拠するためのチェックは要注意

---

## これからの時代に必要なのは「任せ方」

AIは、すでにスタンプ企画者・クリエイティブ担当・イラストレーターの仕事を“それっぽく”こなせるレベルに達しています。

もはや「AIが仕事を奪う」というのは未来の話ではありません。  
これから重要になるのは、

> **「AIに何を任せて、どこに人が価値を出すか」**

という視点です。

---

## おわりに

今回はLINEスタンプ制作を題材にしましたが、この手法は以下にも応用可能です：

- ノベルイラスト制作  
- 漫画の1コマアイデア出し  
- Instagram・YouTube向けイメージ作成 など

今後もAIを使った創作や業務効率化の事例を発信していく予定です。
Spring Boot + Reactで記事投稿アプリを作成予定｜ER図でデータ構造を設計してみた

※学習中のため誤っている箇所があるかもしれません。
# ER図とは？
ER図(Entity Relationship Diagram)とはデータベースの設計図です。
データの構造を視覚的に表現することで、効率的なデータベース設計を行うことができます。

ER図はツールやウェブサービスを利用することで簡単に作成できます。
今回は以下のサービスを利用しました。
[https://dbdiagram.io/：ブラウザ上でER図を簡単に作成できる無料ツール](https://dbdiagram.io/)

## ER図の種類
概念ER図：抽象的で主にテーブル名称とその関係性を記載
論理ER図：概念ER図に中身を追加し、詳細化したもの
物理ER図：実際のデータベース構造に合わせて作成したもの

論理ER図、概念ER図に関しては今回作成は省略します。
チーム開発であれば情報整理のため作成したほうがいいかもしれません。

しかし、小規模開発だとあまり論理ER図とその他ER図の違いがなく、複数作成する意味があまりないため
以下の物理ER図のみ作成しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155918/e37eab29-fe04-4ace-b47e-815afcc82e2b.png)

## 説明
今回の記事投稿サイトで
それぞれの情報を保持するため
以下のようなテーブルを設計しています

### ユーザーテーブル
登録したユーザー情報

### 記事テーブル
ユーザーが投稿した記事情報

### タグテーブル
記事に設定されたタグ情報

article_tagsは
タグテーブルと記事テーブルの「多対多」を管理するための中間テーブルです。

## リレーションシップ
ER図に記載されている記号について説明します。

### 0...1
これは「0件または1件までの関連」があることを表します

### *
この記号は接続元に対し、多数であることを表します。
三又になっている場所で、
userテーブルのidに対して
articleに登録されいているuser_idが複数存在していることを意味します。

#### userテーブルとarticleテーブル
0または1件のusers.idに対し、複数のarticle.user_id情報が存在します。
そのため「users.id : article.user_id」は1対多(1:N)の関係です。
※0件の可能性があるのは、ユーザーが削除された場合でも記事情報は残るためです

#### tagsテーブルとarticleテーブル
1件のtags.tag_idに対し、複数のarticle_tags.tag_idが存在します。
こちらも上記同様「tags.tag_id : article_tags.tag_id」が1対多(1:N)の関係です。


## article_tagsテーブルに関して
このテーブルを作成したのは
タグテーブルと記事テーブルの多対多を整理して登録することができます。

記事テーブルにタグ情報を保存しようとすると

|id|user_id|title|content|tag1|tag2|tag...|
|---|---|---|---|---|---|---|
||||

このように記事テーブルにタグ情報を持たせると
tag1,tag2,tag3...カラムを増やす必要が出てきます。
このような構造は柔軟性に欠け、運用や検索が困難になります。

しかしarticle_tagsを作成し、中間テーブルを作成することで
動的に管理することができます。

|tag_id|article_id|created_at|
|---|---|---|
|タグテーブルのid|記事テーブルのid|作成日|

以下は例として記載した簡易なテーブルデータです。

## タグテーブル
|tag_id|tag_name|status|
|---|---|---|
|001|JAVA|2025/01/01|
|002|PYTHON|2025/01/01|
|003|PHP|2025/01/01|

## article_tags
|tag_id|article_id|created_at|
|---|---|---|
|001|0001|作成日|
|002|0001|作成日|
|003|0002|作成日|

## 記事テーブル
|id|user_id|title|content|
|---|---|---|---|
|0001|example@example.com|JAVAとPYTHON|～|
|0002|example@example.com|PHP|～|

こうすることでタグ情報が増えても、テーブルに新たに登録するだけで
情報を増やしていくことができます

#### 複合主キー
今回article_tagsでは複合主キーを採用しています。
複合主キーとは、tag_id + article_idを結合し、主キーとして扱います。

サロゲートキーではなく、複合主キーを採用した理由として、
同一記事に同じタグが複数紐づけされることを防ぐといった理由があります。
（※サロゲートキーとは、意味を持たない自動連番のIDのことです）

# まとめ
この記事では、ER図の概要から、記事投稿システムのテーブル構造、リレーションの考え方までを紹介しました。
ポートフォリオ作成やチーム開発の土台づくりに、少しでも役立てば嬉しいです。

次回は、このER図をもとにSpring Boot側のEntity定義とAPI設計を進めていく予定です。

## 参考
https://dbdiagram.io/d/article_database-67f7e7694f7afba184219ab5

[前：Spring Boot + Reactで記事投稿アプリを作成予定｜機能整理と設計メモ](https://qiita.com/suica1010/items/1910e82dea147c19cddb)
[次：Spring Boot + Reactで記事投稿アプリを作成予定｜Entity・三層アーキテクチャ学習ログ](https://qiita.com/suica1010/items/7e7a200a0fef2338d94d)
Databuttonのアドバンテージとは

# Databuttonのアドバンテージとは

## 💡 Databuttonって何？

Databuttonは、**ノーコード／ローコードでAIアプリやデータツールを素早く構築できるプラットフォーム**です。  
Pythonが使えるのに、UIはGUIで直感的に操作可能。  
非エンジニアでも、開発スピードを落とさずに高機能なツールが作れます。

---

## 🚀 Databuttonの主なアドバンテージ

### ✅ 1. ノーコードとコードの“いいとこ取り”

- UIはドラッグ＆ドロップで作成可能
- ロジックはPythonで柔軟にコーディング
- 非エンジニアでもGUIで扱いやすく、  
  エンジニアはコードで自由に制御できる

---

### ✅ 2. データソースとの豊富なインテグレーション

Databuttonは多数のサービスと連携しています：

- Google Sheets
- Notion
- OpenAI (ChatGPT)
- Supabase / PostgreSQL
- Firebase
- Airtable
- REST API / JSON

→ 面倒な認証や接続作業を最小化し、**ワンクリックで接続・活用が可能**

---

### ✅ 3. AIとの親和性が抜群

- OpenAI（GPT-3.5 / GPT-4）と直接連携
- テキスト生成・要約・分類・自然言語処理がすぐに使える
- AI出力をそのまま**画面に表示 or データベースに保存**できる

---

### ✅ 4. フロントエンドとバックエンドを一体で構築可能

- 1つの画面の中で、**UI + ロジック + データ処理** をすべて完結
- FlaskのようなPythonベースのロジックを書く感覚でWebアプリを構築
- 表示制御、ルール分岐、API呼び出しなども自由自在

---

### ✅ 5. Model Context Protocol（MCP）との相性が抜群

MCP（Model Context Protocol）は、**LLMとの対話状態・履歴・意図などの文脈を構造化して扱うプロトコル**です。  
Databuttonはその柔軟な構成により、MCPのような**構造化されたプロンプト設計やコンテキスト管理**をシームレスに組み込むことが可能です。

- ステップごとの会話履歴・インタラクションを保持
- モデルごとに異なるプロンプト構造・メモリ形式を分離管理
- PythonでMCPデータ構造を動的に生成・操作できる

つまり、**DatabuttonはMCPベースのLLMアプリケーション構築の基盤にもなりうる**のです。

---

### ✅ 6. デプロイが超速い

- アプリを公開するのに**インフラ不要**
- ボタン一つでWebアプリを即時公開
- 社内共有やプロトタイプ提出にも向いている

---

## 🧠 こんな人におすすめ

- **AIを活用した社内ツールをすばやく試したい人**
- **プロトタイプやPoCをすぐに作りたいスタートアップ**
- **Pythonは書けるけどフロントが苦手なエンジニア**
- **ノーコードユーザーとエンジニアが協力して開発したいチーム**
- **MCPベースのLLMアプリを構築したい研究者・開発者**

---

## ✨ まとめ：Databuttonは“最速で試せる”AIアプリ開発環境

Databuttonは「**アイデアをそのままアプリにするスピード感**」が圧倒的。  
開発者と非開発者の垣根をなくし、**実験・実装・共有**までのサイクルを極限まで短縮します。

さらに、Model Context Protocol のような構造化された文脈制御のアプローチとも非常に相性が良く、**LLMエージェント構築の土台としても最適**です。

---

## 🔗 公式サイト
[https://www.databutton.com](https://databutton.com?via=takahiro19)

## 🔗 関連サイト
[https://ai.ronbun-ai.org](https://ai.ronbun-ai.org)
【負け惜しみ】構想していたAIエージェント協調プロトコルを供養する

# 本記事について
いわゆるポエムの一種かつ、構想段階のものを先行されたっていう（さっさと動かない方が悪い）よくある事態についての、単なる負け惜しみです。
単に私自身がこの記事を書いておいて、気持ちにケリをつけたかっただけです。

よってなんら技術的な知見を得られるものではありません！

こんなこと考えてた人いたんだと言うのをへ〜と思いたい方、どういう構想だったのか興味ある方だけご覧ください。

# Agent2Agentプロトコルについて

2025年4月10日にGoogle Cloudから発表された、昨今流行っているAI Agento同士の連携についてのプロトコルです。

詳細は当該発表記事をご覧ください。

https://cloud.google.com/blog/ja/products/ai-machine-learning/a2a-a-new-era-of-agent-interoperability 

# AIエージェント協調プロトコルについて

昨年から私が構想していた、同じようなものです。  
(多分私以外にも考えてた人はごまんといるでしょうし、個人や学部・院・企業等の研究でも試作レベルのものはあるんじゃないでしょうか？）

## 考え始めた時期

将来的にはこういう連携があり得ると考え始めたのが、今年の1月時点（おそらくですが、この時点でGoogleCloudには負けてると思います）。

実際、詳細をもう少し考えようと、ChatGPTとアイデアの壁打ちをしたのが2月（相談した時の見出しが残ってまs）。

![スクリーンショット 2025-04-11 13.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343307/c434bed9-db4e-44a7-8f12-89d9ae263505.png)

## 残骸

で、その時のアイデアの残骸がこちらです。

https://chatgpt.com/share/67f893a2-cc00-800a-8bc7-d645916f51ce

細目は異なるでしょうが、AIエージェント同士の連携を目指したプロトコルを想定していたことは伝わるかと思います。

コンセプトは「（AIエージェント同士の）口コミ・専門家同士の人脈」でした。
自分の使うAIエージェントは、そのユーザーの求める答えを直接的に知らなくても、他のよりその課題に詳しいAIエージェントの力を借りられるようにすることで、AIエージェントの回答精度・機能を拡張します。

自分がAIエージェントにやってほしい機能について、自前でAIエージェントに機能を組み込むのは、それがRAG的な機能（例えば経路検索や正確なPOI検索など、LLMのモデルでは実現困難なもの）であればあるほど、実装は煩雑になります(API利用の申し込み、支払い、機能の組み込みなど)。

こうした機能拡張を、「すでにそれを実現したAIエージェント」との間の緩い連携で解決できるのでないか？と構想したものです。

エンジニアでも、よく「⚪︎⚪︎について知りませんか？こう言うことですか？」と同僚や知人に聞くことはあるかと思います。
同僚や知人が答えを持っていなくても、「××さんなら知ってるかも？」と代わりに聞いてくださったり、紹介してくださったりはあるかと思います。

そうした口コミ・人脈をAIエージェント同士で仕組み化することで、実装工数を減らすとともに、自社で構築したAIエージェントの活用される場が広がるのでないか？（通常自社で構築したAIエージェントは自社ユーザーしか使いませんが、連携網に乗ることで他エージェントから使用され、その対価を得られる）と言うのがアイデアの発端でした。

# 最後に

私がしたかったのはAIエージェント同士を協調させることで、低コストに機能拡張を図ることであって、自前のプロトコルを実装・普及させたかったわけではありません。

単に私の思いついた当時、先行事例がなかったので、じゃあ自分で作るかと思っただけで。

Google CloudのAgent2Agentプロトコルの全貌をまだ全て見たわけではないですが、私のやりたかったことは十分実現できそうなので、現時点、私自身のAIエージェント協調プロトコルを進める気はありません。

むしろAgent2Agentプロトコルが出てきたので、そっちを勉強します。
qt5/qt6　と Libreoffice

## 日本語入力の安定環境とは?
[ "Linuxの日本語環境には一貫性がない"](https://qiita.com/ai56go/items/2b033d014d34a602e219) そうですね。そうです。
* 今年の初めからGhostBSDの入ったサブノートPC、ibus-mozc を使っていたのですが、最近libreofficeを入れたら日本語入力できないことに気づきます。
* メイン機でも ibus/fcitx の環境をうろうろしていましたが、最近は fcitxになっています。
* QT絡みで fcitxになったともいえます。
* 最近 qt6をいれたので、 fcitx5 も qt6 だけが入っていました。
## GhostBSD(FreeBSD)/libreoffice CJK塩対応(というか...)
* 利用者が皆無だからか、LOCALE対応はUSのみ...
* ibus はダメっぽいです。
* qt5 なので、　fcitx5-qt6 を入れても動きません。なぜだ!と5分くらい、設定をうろうろしていましたが、qt5なのか?気がついて追加しました。

## 今日の結論: 2025/04 現在、GhostBSD/libreoffice で日本語入力できるのは qt5対応の anthy しかない模様。 mozc-ibus さようなら・・・でした。

* 環境変数に何某を入れろとかいうのは、pkg install fcitx5 とか入れますと終わりに表示されるので割愛します。
レガシーコードをCursorに読ませたらめっちゃ仕事が楽になった

# 前提
* 今の会社に転職してきて半年、社内システム保守・開発をしてます
* 出来て8年目くらいのPHPアプリを触ってます
* 仕事では、困った時にGeminiかChatGPTに相談するくらいしかAI使ってない

# 抱えていた課題

## 仕様が不明確
システム作成当初はスピード重視で開発されたため、まず仕様書がありませんでした。
また、システムを作成した人が既に退職しており、「この機能はどういう意図で作られたのか」「なぜこのような実装になっているのか」といった背景情報も社内に残っていませんでした。
開発メンバーの中にも、仕様背景や細かい仕様を覚えている人がおらず、バグ報告や問い合わせ対応時に、まず該当機能の画面にたどり着くまでが一苦労という状態…

## コードの複雑さ
スピード重視故に、コードの可読性や保守性があまり考慮されていません。結構グチャグチャ:cry:
複雑なロジックや入り組んだ条件分岐が多く、バグの原因を特定するのにかなり時間がかかっていました。


# そこで「Cursor」ってやつを使ってみることに
そんな中、AI機能を搭載した「Cursor」というエディターがすげーらしい！という記事がよく見られるようになりました。
Cursorはコード全体を読んであれこれしてくれるらしい！と聞いて「これもしかして原因調査にめっちゃ役立つのでは？」と思い使ってみたところ、本当に役に立ったのでこの記事を書きました。

Cursorの説明は、この記事がわかりやすいです。
[Cursor 【はじめからそうやって教えてくれればいいのに！】](https://zenn.dev/ak/articles/f1f0a7a8688398)


# 楽になったこと
## バグ原因調査
例えば、ユーザーからある機能についてのバグ報告があった際、これまでは

1. その機能がどこにあるのかを探す
1. 関連するコードを見つける
1. 複雑なロジックを解読する
1. 問題の原因を特定する

というステップを踏んでいました。
これが、Cursorに報告内容とちょっとした前提情報を教えてあげるだけで
* 機能の概要
* アクセス手順
* 問題の原因

を的確に説明してくれるため、調査時間が大幅に短縮されました。
まだまだプロンプト力が足りないのか、たまに回答が間違ってたりするので自分で確かめる必要はあるのですが、「まずどこの話？」が一発で「多分ここかも」に進むので、圧倒的に調査が楽になりました。

## 仕様の整理
ある時「権限によってどのような機能に制限をかけているかの一覧が欲しい」という要望がありました。
本来あるべきドキュメントですが、うちの場合システム構築時に作成されたままメンテされておらず、実際のコードとの乖離が激しい状態でした…。
これもCursorに相談。
現在のコードを分析して権限と機能制限の関係を一覧化してくれました。
ただ、これに関しては権限に関する実装手法が統一されていないと正確なものが出てこないです。
実装手法統一しろよというのはごもっともなのですが、古いコードだと統一されていなかったりするのが現状。
これはプロンプトの改善でなんとかなるかもです。試してないけど。
権限による機能制限の実装手法をまず洗い出してもらってから、その情報を元に一覧を出してもらうとかでいけそうな気がします。

# 古いシステムこそCursorの使いどころ
いろんなシーンで活躍している便利なCursorくんですが、
特に、仕様背景が分からない・作成者がもういない・動いてるけどコードがカオスで手がつけられない…といった古いシステムほど真価を発揮するのでは？と思いました。

* 仕様が不明確 → AIがコードから意図を読み取ってくれる
* 複雑なコード → AIが整理して説明してくれる
* ドキュメント不足 → AIが現状を分析してまとめてくれる

# まとめ
開発者が退職していたり、コードの保守性が低かったりする古いシステムの保守担当者にとって、Cursorは最高の相棒になり得ると思いました。
少なくとも自分は、レガシーコードを理解する時間を短縮し、問題解決に集中できるようになるため、業務が圧倒的に楽になりました。
同じような悩みを抱えている方は、ぜひCursorを試してみることをおすすめします！
ただし、Cursorはデフォルトだと利用するコードをサーバーに送信して処理を行うので、仕事で使う場合は大体の場合プライバシーモードを有効にする必要があると思います。そこだけご注意ください！
参考：[企業で使うために、次世代AIエディタCursorのPrivacy Policyを読んでみた #ChatGPT - Qiita](https://qiita.com/posi_posi/items/1509257fbfccff3293fd)
レアゾン・ホールディングス 2024新卒エンジニアShell/Linux研修 - 現場で活きる効率化と自動化のためのスキルセット -

<br>

はじめまして。Zapshotバックエンドエンジニアの山田梨加子です。

少しだけ自己紹介をしておくと、私は、アメリカカリフォルニア州のシリコンバレーというビッグテックのお膝元でコンピューターサイエンスを専攻しました。
面接官や同期になんで日本？って散々言われました笑
端的に言うと日本がやっぱり好きだからです。今までタイとかアメリカ他州でも住んできましたが、やはり日本が一番です。ご飯美味しいしトイレ綺麗だしバスは時間通りに来るし。
あくまで個人の意見です！

というわけで、ここでは、コンピューターの基本のきであるShell/Linux研修の様子についてお話しします。
コンピューターサイエンスを専攻した方以外は、あまり触れる機会のない分野ではないかと思います。
ですがレアゾン・ホールディングスの新卒研修では必須項目として学びます。

研修の内容が気になる方は、ぜひこの記事を読んでみてください。

## 研修の概要
研修の概要はオウンドメディアの記事で詳しく紹介していますので、こちらからご覧ください。

https://media.reazon.jp/articles/NewGraduate_engineer


## テーマの概要
### Shell/Linux研修のゴール
サーバー管理やデプロイに不可欠なLinuxに関する基礎知識を身につけ、アプリケーションを動かすための環境を理解すること

これに加え、この講義では、「エンジニアとしての人間力を育てる」という目的も兼ねていたので、チームワークや言語化によせた内容になっていました。

主な研修内容としては、グループで、以下のトピックについて調査/発表後、Hands-on演習を行うというものでした。

- Linuxの歴史とその特徴

- 各種ディストリビューションの違い

- KernelやShellの仕組み


発表は、Shell/Linuxについて、講師陣の方々に全く知識がない前提で説明をするという内容でした。

演習問題は全部で15問ほどあり、shellコマンドを打って、指定された作業をするという内容でした。

例えばこんな感じです。



`mkdir`、 `cd`、 `ls`など基本のコマンドから、`ping`、`curl`などの知っていると便利なコマンドに加え、vim (テキストエディタ）を使ったスクリプトの書き方も教わりました。

## 技術的なお話
### Linuxとは
一言で言うと、UnixライクなオープンソースのOS。 サーバー構築やクラウドコンピューティング、スーパーコンピューターなど様々な用途に使われていて、以下のようなメリットから幅広い分野で使われています。

- カスタマイズ性

- 安定性

- 用途や目的に合ったディストリビューションが選べる

### Kernel、Shell、Terminalとはなんぞや
**Kernel**：OSのコアの部分で、システムリソースの管理をする
**Shell**：ユーザーがkernelとあれこれするときに用いるソフトウェア
**Terminal**：ユーザーがコマンドを入力するときなどに使われるプログラム


## 学んだこと
発表では、技術的な単語を使いがちなところを、みんな上手くアナロジーを使いながら説明していました。
個人的に難しく感じたのは、深く掘り下げず程よい説明をすることです。
相手にとにかく理解してもらわないとという一心で、冗長に話しがちなので、どこまで説明すべきかを判断するのが難しかったです。
今回の研修で、一度の説明で相手が理解することはなく、わからなければ質問をされるので、その都度より詳細な説明をすればいいのだと気づきました。

この研修で学んだことは実務でも生きています。
相手が必ずしも自分と同等の知識レベルを持っているとは限らないということを知りながら話し合いができると、お互いへの理解も深まるし、連携も取りやすくなります。

技術的な話だと、業務ではIDEなどのGUIを使うことが主ですが、shellを使うと早かったり便利なことも多いので、知っていると得します。
<br>

Zapshotで私個人がshellを使うことの多い場面は

- ちょこっとスクリプトをいじるとき

- サーバー上のデータベースに接続するとき

- APIをcurlでshellから直接叩きたいとき

などです。

## 最後に
レアゾン・ホールディングスの新卒研修は、グループワークが多いのが特徴です。
これは、会社がコミュニケーションが何よりも重要とする考えから来ています。
一人で作業しがちになるプログラミングをみんな知識レベルが異なる中で、一緒に学べるのはとても良い機会です。
この記事を読んで、レアゾン・ホールディングスにさらに興味を持っていただけたら幸いです。

<br>
▼採用情報

https://recruit.reazon.jp/
⚙️ 2009年ロリポWPをメンテしたら爆発しかけた話

# ⚙️ 2009年ロリポWPをメンテしたら爆発しかけた話

## 【概要】
2009年からロリポップで継続運用されてきた旧型WordPress。
そろそろデータベースやプラグインに限界を感じ、メンテナンスを行ったら…

結論、
- MyISAM デフォルト値にやられ
- 接頭辞変更でroles消失
- redisキャッシュも悪さを増強

しかし WP-CLI とログを駆使して無事復旧させました。

---

## 【目的】
- MyISAM の InnoDB 化
- 接頭辞変更 (prefix)
- 消えたrolesの復旧

---

## 【MyISAMの罠】

指定した ALTER TABLE 文のエラー:

```
#1067 - 'comment_date' へのデフォルト値が無効です
```

datetime型に「0000-00-00 00:00:00」を指定していると、InnoDBではエラーになる。

### 実際に行った変更
```sql
ALTER TABLE `wp_***_comments`
  MODIFY `comment_date` datetime NOT NULL,
  MODIFY `comment_date_gmt` datetime NOT NULL,
  ENGINE=InnoDB;
```

> ※datetime型のカラムは他にもあります

---

## 【接頭辞の変更はサクッといけない】

WordPressの接頭辞はDB内の特定カラムにも登場してくる。

### 一括変更するSQL例
```sql
UPDATE wp_usermeta SET meta_key = REPLACE(meta_key, 'wp_', 'WP2025_');
UPDATE wp_options SET option_name = REPLACE(option_name, 'wp_', 'WP2025_');
```

---

## 【roles消滅。なおったけど。】

ユーザーのrolesは

- `usermeta` テーブル:
  - `{prefix}_capabilities`
  - `{prefix}_user_level`
- `options` テーブル:
  - `option_name = '{prefix}_user_roles'`

が有効。

### WP-CLI 便利
```bash
# これでrolesまとめてわかる
wp user list

# optionテーブルに user_roles あるか検索
wp option list --search=user_roles
```

> ここが消えてると、全ユーザーのrolesが空になる

---

## 【おわりに】

旧いWordPressを残したまま運用するのは怖いけど、そこに思いれもある。

ゆえに、無理なリプレイスじゃなく「作りなおして使う」のスタンスは大事なのです。

---

> ▶ なお、記事で使用したWordPress環境は「2009年からロリポップで運用されてきた」ものです。
> ▶ MTの時期もあったらしくそのテーブルも今回整理しました
個人的備忘録：実践コースのハッカソンで「SLA（Service Level Agreement）」を扱うことになったので、ざっくりまとめてみた

## はじめに

ITサービスを利用する中で、しばしば耳にするのが「SLA（Service Level Agreement）」という言葉です。

:::note info
**これは、サービス提供者と利用者の間で交わされるサービス品質の取り決めのことを指します。**
:::

たとえば、サービスの稼働率や、障害が起きた場合の対応スピード、復旧までの時間など、明確な基準を設けることで、サービスの信頼性や安定性を保つ役割を担っています。

本記事では、SLAとは何か、どのような内容が含まれるのか、そしてなぜ重要なのかについて紹介します。

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

書こうと思ったきっかけは、実際の運用の中でSLAを使っていたことと、今回受講しているITスクールのハッカソンの活動においてSLAを採用することになったためです。

:::note warn
***日々の業務の中で、外部ベンダーとの契約やクラウドサービスの導入に関わる中で、「このサービス、本当に信頼できるのかな？」と感じたことが何度かありました。***
:::

しかし、意外とSLAの重要性や意味を深く理解していないまま「なんとなくの安心感」で終わらせてしまうケースも少なくありませんでした。自分自身もそうだった時期があります...。

そこで改めてSLAの基礎に立ち返り、その内容や意義について整理しておこうと思い、今回記事を書くことにしました。

## SLA（Service Level Agreement）とは？

SLA（サービスレベルアグリーメント）は、「サービス提供者」と「利用者（顧客）」の間で交わされるサービス品質の取り決めのことです。日本語では「サービス品質保証契約」とも訳されます。

**参考文献**

https://www.idcf.jp/words/sla.html#:~:text=SLA%E3%81%A8%E3%81%AF%E3%80%81Service%20Level,%E3%81%AA%E3%81%A9%E3%81%A8%E8%A8%B3%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

SLAに書かれる主な項目には以下のようなものがあります：

- **稼働率**：サービスが正常に使える時間の割合（例：99.9%）
- **応答時間**：システムの応答にかかる最大時間（例：3秒以内）
- **障害対応時間**：問題発生時の初期対応までの時間（例：1時間以内）
- **復旧時間**：システムが復旧するまでの時間（例：4時間以内）
- **サポート体制**：電話／メール対応時間、有人チャットの時間帯など
- **報告頻度**：月次レポート、障害レポートの提出頻度

これらの指標が明記されることで、利用者は「どれくらいの品質でサービスが提供されるか」を明確に理解することができます。

## なぜSLAが大事なのか？

SLAが重要視される理由には、次のようなものがあります。

- **安心感**：利用者にとって、どれくらい信頼できるサービスかを判断する指標になります。
- **責任の明確化**：トラブルが起きた際に、誰が何をすべきかが明記されていることで対応がスムーズになります。
- **信頼関係**：契約の透明性を保つことで、サービス提供者と利用者の間に健全な信頼関係が生まれます。

また、SLA違反が発生した場合には、多くの場合ペナルティが定められており、返金対応や追加のサービス提供が行われるケースもあります。

ただし、SLAはあくまで「努力目標」として定められることもあり、絶対の保証ではないことも理解しておく必要があります。

**参考文献**

https://aws.amazon.com/jp/what-is/service-level-agreement/

https://www.resm.jp/column/202407191868/

## まとめ

SLAは、単なる契約書の一部ではなく、サービスの信頼性を支える重要な要素です。特にクラウドサービスや外部ベンダーとの連携が増える中で、SLAの理解はますます重要になっています。

:::note warn
***本記事を通じて、SLAの基本的な内容とその意義について、少しでも理解が深まれば幸いです。***
:::

今後、サービス選定や契約締結の場面で迷ったときは、ぜひSLAの内容に立ち返ってみてください！
A5:SQL Mk-2 で Timestampをレコードコピーすると起こる問題

# 事象
「A5:SQL Mk-2」は、Delphiで作成されている。
Delphi の日付時刻型(TDateTime型)が日付時刻をミリ秒までしか扱えない。
その為、「A5:SQL Mk-2」ではレコードコピーした場合、小数点4桁以下がomitされる。

## 例
12:34:56.123456
　↓
12:34:56.123000

# 対策
「レコードのコピー（その他のフォーマット指定）」などで一旦
INSERT/UPDATE文などに変換して、コピーする。

# 参考
https://a5m2.mmatsubara.com/wp/?topic=postgresql-%E6%97%A5%E4%BB%98%E5%9E%8B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6#post-9910

# 余談
A5:SQL Mk-2 が固まった時に実行するコマンド

```dosbatch
taskkill /IM A5M2.exe /F
```
NetSuiteとサブスクリプション管理サービスの連携【概要】

## NetSuiteとサブスクリプション管理サービスの連携【概要編】

近年、企業のビジネスモデルは「モノの販売」から「サービス提供（サブスクリプション）」へと大きく変化しています。この変化に対応するためには、サブスクリプション管理サービスとNetSuiteの効果的な連携が欠かせません。本記事では、NetSuiteと一般的なサブスクリプション管理サービスを連携する際のポイントや留意点について解説します。また、本記事は概要編として詳細な仕様までには言及しません。

---

サブスクリプション管理サービスは国産、海外産のものが複数あります。
本記事は具体的な任意のサブスクリプション管理サービスとの連携に限定せず、一般論としての観点で「NetSuiteと他社サブスクリプション管理サービスの連携」についてまとめています。

---

本記事には「NetSuiteはサブスクリプション管理機能を持たない」という前提があります。また、本記事中でも言及していますがサブスクリプション管理の一機能として「従量課金」があります。従量課金は更に「使用量課金」「使用回数」に細分化され、使用量課金はサービスを受けた秒数・分数などの時間がその例となり、使用回数はサービスを受けた回数として保守メンテナンスの訪問回数などがその例になります。
例えば、翻訳サービスにおいて月間100回までは文字数を制限を受けずに回数カウントを行い月定額内でのサービス提供を行うが、100回を超え101回目からの依頼は文字数制限として1000文字までを一回としてカウント、1001文字以降は別カウントとする、回数について月間10回までの持ち越しを1年間有効とするなど複雑な課金モデルを実現できることを想定しています。

### 1. 連携の目的とメリット
NetSuiteとサブスクリプション管理サービスの連携により以下のメリットを実現します。

- **業務の効率化**：請求書発行や収益認識などの会計処理を自動化し、手作業によるミスを低減
- **データの整合性維持**：サブスクリプションサービス側の請求データとNetSuiteの財務データをリアルタイムに同期し、常に最新の財務状況を把握
- **柔軟な課金モデル対応**：定額課金、使用量課金（従量課金）、回数課金など多様な課金方式を一元管理

### 2. 連携の基本的な仕組み
一般的に、サブスクリプション管理サービス側で顧客契約情報や使用量データを管理し、それらのデータをNetSuiteへAPI経由で連携します。NetSuite側では受け取った情報を元に、顧客レコード、請求書（Invoice）、収益認識、入金消込などの処理を自動で実行します。

### 3. 留意すべき主な項目

- **データ整合性の管理**：顧客や請求データの同期ルール（リアルタイム同期またはバッチ処理）の明確化
- **収益認識ルールの設定**：収益認識基準（ASC 606やIFRS 15等）に対応し、収益期間や計上タイミングを明確に設定。
- **多通貨管理の対応**：グローバルビジネスの場合、為替レートや通貨の取扱いを明確に設定
- **例外処理の設計**：返金、キャンセル、チャージバックなどのイレギュラー処理にも対応可能な仕組みを設計

### 4. 連携に利用されるNetSuiteのAPI
NetSuiteとの連携には以下のAPIが主に使用されます。

- **SuiteTalk REST API**：軽量かつ柔軟なAPIで、請求書や顧客情報などのCRUD操作に適しています
- **SuiteTalk SOAP API**：機能が豊富で複雑な処理や大量データの取り扱いに対応しています
- **SuiteScript（RESTlet）**：Webhooksなどを用いたリアルタイム処理や、独自のビジネスロジックを実装する際に使用

### 5. 利用者が整理しておくべきユースケース

- 定額課金（Basicプラン等）
- 使用量課金（リクエスト数に応じた課金）
- 使用回数課金（一定回数を超えた利用に対する追加課金）
- 定額課金と使用課金の組み合わせ（自由組み合わせ）
- 定額課金と使用課金の組み合わせの（固定コース）
- 割引、クーポンの取扱い
- 返金、返金相当対応
- キャリーオーバー
- 複数通貨・グローバル対応

### 6. 本番導入前に検証すべき項目

- 顧客・請求データの同期精度と整合性確認
- 課金モデルごとの収益認識スケジュール検証
- 入金処理と消込の自動化精度
- 多通貨環境での為替差損益の処理
- 例外処理（返金・キャンセルなど）の動作確認
- パフォーマンス検証（大量トランザクション時のAPI負荷）

### 7. 連携するサブスクリプション管理サービスの機能の確認
サブスクリプション管理サービス側が自社製品として他社製品との連携をするためのアダプターやコネクターを持っている場合があります。サブスクリプション管理を利用するお客様が実現したい「課金モデル」は上記ユースケースを複数組み合わせるとかなり複雑なものになり、顧客ニーズの変化や対象サービスの追加変更によって、課金モデルはを変更することになり、変更には即時対応が求められることが多い。そのため、サブスクリプション管理サービス側がERPやSFAに対する連携のノウハウを持っている場合がありNetSuite側の情報のみならずサブスクリプション管理サービス側の情報も調査する必要がある。

### 8. まとめ
NetSuiteとサブスクリプション管理サービスを適切に連携することで、効率的かつ正確な財務管理を実現し、変化の激しいサブスクリプションビジネスに迅速に対応できます。連携設計の初期段階からここで述べた項目を整理し、円滑なシステム導入を目指しましょう。
Linuxのスケジューリング機構における優先度の自動調整機構について

質問：「Linuxのスケジューリング機構に組み込まれている優先度の動的自動調整機構について説明してください．」
以下はChatGPTによる回答．

---

Linuxのスケジューリング機構には、プロセスの「**動的優先度（dynamic priority）**」を自動的に調整する**優先度の動的自動調整機構**が組み込まれています。これは、主に**CFS（Completely Fair Scheduler）** や古い **O(1)スケジューラ** において実装されており、プロセスの実行状況に応じてスケジューラが自動的に優先度を変化させる仕組みです。

---

### ✅ 目的

- **I/Oバウンドプロセス（待ち時間が多い）**に対しては優先的にCPUを割り当てる。
- **CPUバウンドプロセス（CPU使用時間が長い）**には低めの優先度を与えて、他のプロセスへの公平性を保つ。

---

### 🎯 動的優先度の自動調整の概要

Linux では、プロセスには主に2種類の優先度があります：

1. **静的優先度（static priority）**  
   - リアルタイムプロセス（`SCHED_FIFO` や `SCHED_RR`）で使用。
   - ユーザーが設定し、カーネルは変更しない。

2. **動的優先度（dynamic priority）**  
   - 通常のプロセス（`SCHED_NORMAL`）で使用。
   - スケジューラが自動で変更する。

---

### 🧠 動的優先度の調整アルゴリズム（例: O(1) スケジューラ時代）

- プロセスごとに「**niceness値（-20〜19）**」があり、これは**静的優先度**のベースになります。
- スケジューラは、プロセスの「**sleep時間**」と「**実行時間**」を観察し、
  - 長時間スリープしていたプロセスには**ボーナスを与える**（= 優先度を上げる）。
  - 実行時間が長いプロセスは**優先度を下げる**（ペナルティ）。

---

### 🌱 CFS（現在のデフォルトスケジューラ）の場合

CFSでは「優先度」というよりは、**実行時間の公平性（公平なCPU配分）**をベースにしています。

- 各プロセスに**vruntime（仮想ランタイム）**が割り当てられ、これが少ないプロセスほど優先的に実行されます。
- I/Oバウンドなプロセスは頻繁に待機状態になるため、`vruntime`の伸びが遅く、結果的に**CPUが割り当てられやすくなる**。

つまり、CFS では**明示的に優先度を設定せずとも、I/Oバウンドなプロセスが有利になるようにスケジューリングされる**のです。

---

### 📌 まとめ

| 特徴                     | 内容 |
|--------------------------|------|
| 対象プロセス             | 通常プロセス（SCHED_NORMAL） |
| 調整される優先度         | 動的優先度（静的 + ボーナス） |
| 調整要因                 | 実行時間 / スリープ時間 |
| 目的                     | インタラクティブ性向上 / 公平な資源配分 |
| スケジューラによる違い   | O(1): 明示的な優先度調整<br>CFS: 実行時間ベースの公平性 |

---

もし、リアルタイムプロセス（`SCHED_FIFO`や`SCHED_RR`）との違いも詳しく知りたければ、それについても解説できますよ！
【Docker】Dockerのditオプション

# はじめに

こんにちは。アメリカに住みながら独学でエンジニアを目指しているTairaです。
Dockerでコンテナを起動するときによく見かけるオプションに `-dit` があります。
これは複数のオプションをまとめた形で、それぞれが特定の意味を持っています。この記事では、`-dit` のそれぞれの役割と、いつどのように使うのかを解説します。

---

## -dit の意味

### -d：detached（デタッチド）モード
- コンテナをバックグラウンドで実行します。
- ターミナルに張り付かず、裏で常駐させたいときに使います。
- 例：WebサーバーやAPIなど、常に起動しておく必要があるサービス。

### -i：interactive（インタラクティブ）
- 標準入力（stdin）を開いたままにします。
- コンテナに対してコマンドを送れるようにしたいときに必要です。
- 通常は `-t` とセットで使います。

### -t：tty（ティーティーワイ）
- 疑似端末を割り当てます。
- コンテナ内での表示がターミナルのようになり、シェルを操作しやすくなります。
- 例：bash や sh を使ってコンテナ内を操作したいとき。

---

## 具体例

### bashシェルを操作したい場合：
```bash
docker run -it ubuntu bash
```
- ユーザーがコンテナ内で直接操作する場合。

### バックグラウンドで起動し、あとから入る場合：
```bash
docker run -dit --name mycontainer ubuntu
```
```bash
docker exec -it mycontainer bash
```
- 常駐させておきたいが、必要があれば中に入って操作したいときに便利。

---

## -dit を使わない場合

例えば、Webサーバーのように一度起動すれば特に人間が操作しないサービスには `-it` は不要です。

```bash
docker run --name webserver -d -p 8080:80 httpd
```
- `httpd` はApacheのWebサーバーです。
- 入力操作が不要なので `-it` は付けていません。

---

## まとめ

| オプション | 役割                             | 主な用途                                 |
|------------|----------------------------------|------------------------------------------|
| `-d`       | バックグラウンドで実行            | WebサーバーやAPIサーバーなど常駐型サービス |
| `-i`       | 標準入力を受け付ける             | bashなど、コマンド入力が必要なとき         |
| `-t`       | 疑似端末（TTY）を割り当てる       | 見た目や操作感を通常のターミナルに近づける |

`-dit` はコンテナを「裏で動かしながら、必要があれば中に入って操作できる」便利なセットです。目的に応じて柔軟に使い分けていきましょう！