OmniAICreator/Qiita-1.07M huggingface dataset:
コワーキングスペースというか勉強場所というか京王プラザホテル ibasho

世の中にはコワーキングスペースというのがありますね。

# AWS Startup Loft Tokyo（＠目黒）

https://aws-startup-lofts.com/apj/loft/tokyo

AWS Loft Tokyoだと思ったら名前にStartupって入ってるんですね。
サイト見てみたら平日、月火水の3日間だけなんですね。
なお、行ったことありません。

# デロイトトーマツイノベーションパーク（＠丸ノ内）

https://park.deloitte.jp/

こちらも気になってるけど行ったことはありません。

さてここらか本題です。
私がSnowProの試験勉強のために行ったのが

# 京王プラザホテル ibasho（都庁前）

https://www.keioplaza.co.jp/stay/sky_plaza_ibasho.html

有料というところが先に記載した2つとはちょっと違うところです。
平日 8：00～16：30　2,000円
土日 8：00～16：30　2,500円
京王プラザホテルの会員（無料）に登録したら1割引きになります。
京王百貨店の無料のポイントカードでもよさそうでした。（確証無し）

2月に平日1回（有給休暇）、休日1回利用してきました。
![2025-03-01_09-00-15_393.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/a655b8f3-be97-4a55-8ba8-50a28f5747c2.jpeg)
これは誰も写ってない朝一の写真ではありますが・・・。

ビックリしたのがキッズというか赤ちゃんめっちゃいる！
どうやらコワーキングスペースではなさそう。
ママさんたちの憩いの場のようです。完全に間違えた。

といいつつリピーターになってるのはなぜかというと。
![2025-02-18_10-59-34_721.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/3733eba0-80cd-4eff-8ed7-0e533fc44a60.jpeg)
スタバが飲み放題なんです。

![2025-02-18_11-51-14_624.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/fe05b126-e8a3-47e6-9ecd-aed1cf45e1d5.jpeg)

![2025-02-18_11-50-55_637.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/aa7aada4-31d3-430e-b536-eae11447cd8f.jpeg)

8杯くらい飲んだ気がするので利用料は実質無料です。

## いいところ
- 上記の通りスタバ飲み放題
- 最上階の47Fからの見晴らし
- キッズ立ち入りNGのエリアもちょっとある（全体の2割くらい？）

## 悪いところ
- キッズの泣き声すごい
- スタバの飲みすぎでお腹が・・・
- 16:30で退出なのでテレワーク環境として終日使うのは厳しい（会社にもよる？）

## その他
食べ物は持ち込み不可なので、ランチは向かいの三井ビルとか住友ビルとかに出ました。
レシートがあれば当日再入場可能です。

キッズの泣き声対策についてはイヤホンしてYoutubeで作業用Jazzみたいなのを流しておいて、なかったことにしました。
そんな中あの環境でリモート会議してる人がいて「正気か？」と思いました。

## 見晴らし
目の前の都庁の画像でも貼っておきます。
![2025-02-18_11-43-35_515.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/b7bda33d-8924-414e-8314-60a9f147fddd.jpeg)
InDesignフレーム調整オプションを全ページから一括消去

InDesignで画像差し替えの際に問題になるのが、画像フレームの自動調整オプションです。
レイアウトを試行錯誤しているときは便利なのですが、これがオンだと画像をリサイズしてUSMして…という正規の手順で差し替えるとトリミングが吹っ飛びます。なので差し替える前に消去しておきたい。
![SS_InDesign_20250309-185020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/28e60def-d365-44a3-85b3-51292224768a.png)

実行すると、全ページ全リンクフレームから「フレーム調整オプションを消去」します。



```javascript:フレーム調整オプションを消去

var doc = app.activeDocument;
var graphics = doc.allGraphics;
var counts = {};

if (!confirm("リンク画像フレームの自動調整をオフにしますか？")) {
  exit();
}

for (var i = 0, len = graphics.length; i < len; i++) {
  var frame = graphics[i].parent;
  if (frame instanceof Rectangle || frame instanceof Oval || frame instanceof Polygon) {
    if (frame.frameFittingOptions.autoFit && frame.parentPage !== null && frame.visible && frame.itemLayer.visible) {
      frame.frameFittingOptions.autoFit = false;

      var pageNum = frame.parentPage.name;
      counts[pageNum] = (counts[pageNum] || 0) + 1;
    }
  }
}

var message = "";
for (var pageNum in counts) {
  message += pageNum + "ページ（" + counts[pageNum] + "アイテム）\n";
}

alert(
  message
    ? "処理したアイテムと含まれるページ\n\n" + message
    : "処理したアイテムはありませんでした。"
);

```
Apple Intelligenceとは何か。どう向き合うか

# はじめに
この記事は筆者自身の理解を深めるために、Too社が公開した記事『Apple Intelligenceの安全性と企業における向き合い方』をベースに、筆者が一部加筆・再編集したものである。

最後に参照したサイトを記載しているため、参考にする際は併せてご確認いただきたい。

## 想定読者

- Apple Intelligenceのことがよくわからないけど、社内での利用について検討・対応する必要がある人

## 3行にまとめると

- Apple IntelligenceはPCCという仕組みを使っているため、安全で、学習に利用されることもない
- ChatGPTとの連携ができるが、ChatGPTは別の仕組みなので要注意
- MDMによる制限が可能

# **Apple Intelligenceとは**
Apple Intelligenceとは、Mac、iPhone、iPadといったデバイスの中核にパワフルな生成モデルをもたらすパーソナルインテリジェンスシステム。「Private Cloud Compute（PCC）」という仕組みを使用しており、ユーザが入力したデータがサーバに保存されることは一切ない。

なお、現在は一部言語のみの対応に対応しており、日本語非対応。そのため、言語設定が日本語の場合は以下のように使用できない旨のメッセージが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/d430114b-4e50-485c-a07e-b984c8ed3955.png)



:::note info
Appleによると、4月初旬から日本語にも対応予定とのこと。
参照：Apple「Apple Intelligence」https://www.apple.com/jp/apple-intelligence/
:::

**▼主な機能**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/796cb82d-12b5-4780-b73b-19ccea1cf6f5.png)

**▼対応デバイス**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/14f83090-94f7-488c-80c4-a80a89ea1d1b.png)

# Private Cloud Compute（PCC）とは

AIを用いたデータ処理のセキュリティやプライバシーを保護する仕組み。

**▼特徴**

- クライアントから送信されるデータをサーバに一切保存しない
- クライアントのリクエストのみに使用される
- 第三者によるPCCのプライバシー規定準拠の検証/証明が可能

## PCCが安全と言える理由
**PC・サーバのデータ安全性を確保**
- PCCを用いた通信は暗号化される
- サーバでデータの復号が行われ、復号に必要な暗号鍵は消去される
- データにAppleもアクセスできない

つまり、サーバ・PC間の通信を覗き見することはできないし、復元のための鍵は消されるので、再度復元することもできないってこと。


**第三者による検証が可能**
上記を証明するために、以下の取り組みを実施。

- 原理上書き換え不可能なログ情報を公開
- 第三者がPCCのセキュリティの分析を独自に実行できるように、PCCのVirtual Research Environment (VRE) を公開
- PCCにてセキュリティやプライバシーの保証が侵害される脆弱性を発見したら報奨金も授与

つまり、第三者が調査したログとAppleが公開しているログを比較することで、公開情報が正しいのかを検証できるうえ、何か穴があったらお金をくれる。**「疑ってもいいよ、好きなだけ調べな。もしミスがあったら逆に教えてほしいからお金はらうよ」** と宣言してるってこと。

# PCCとChatGPTは別の仕組みのため要注意
ChatGPTにサインインすることでアカウントに紐づいた情報（有料プラン等）がデバイス上でも利用できるようになったり、会話内容が履歴として保存され後からアクセス可能になるが、同時にChatGPTアカウントの設定とOpenAIのデータプライバシーポリシーが適用される。つまり、利用プランによっては**OpenAIの学習に使われる可能性がある**。

ただし、OpenAI社によると、ChatGPTアカウントに**サインインせず**Apple Intelligenceを通してChatGPTを使用する場合、OpenAIはIPアドレスを受け取ったり、リクエストを保存したり、AIモデルのトレーニングに使用したりすることはないとのこと。

とはいえ、PCCのように第三者による検証が可能というわけではないので、ChatGPTをPCCを同じよう信頼度で扱うのは避けたい。

# 企業での利用を検討するにはどうするか
「Apple Intelligence（PCC）」と「ChatGPT」についてそれぞれ対応の検討が必要。MDM（JamfPro）を導入していれば以下のように制限が可能。

**▼MDMで制限できる内容**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/f113595c-be62-49db-b4f7-3df876319465.png)


**▼対応例**
- Apple Intelligence：許可
- ChatGPT：利用自体は許可するが、学習しない利用法に限る
という場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/4a3d4976-887e-43ed-ba51-914f1a835158.png)

# おわりに
この記事を作成するまでは、「また新たなAIサービスが登場したな。ルールの検討が面倒だなぁ」と思っていたが、Apple Intelligenceは企業利用を想定したものであり、ルール検討に悩む者にとっては救世主のような存在だと感じた。

AI利用を固く禁じる会社でも、ChatGPTは制限をかけつつ、Apple IntelligenceはOKとしても良いのではないだろうか。

# 参照
- Apple「Apple Intelligence」https://www.apple.com/jp/apple-intelligence/
- 株式会社Too「Apple Intelligenceの安全性と企業における向き合い方」https://www.too.com/apple/apple_tips/apple-intelligence-manage.html
システム開発はじめてみるぜ #1

## 筆者の前提知識
- 大学院の研究で画像認識のコードを書きながら実験する。（1年, python Keras）
- 就職してから薄くstreamlitで家計簿アプリを個人開発（1年, python streamlit）
- 職場では便利系野良コードを月一のペースで作る程度

## システム開発始めるきっかけ
1. システム開発初心者のまま、ソフトウェア開発のスクラムマスターになり、派遣のエンジニア6人を動かして成果を出さざるを得ない状況になる。
2. 開発のいろはを知らないため、なかなかうまくコントロールできず、バグだらけで効率悪いプロダクトマネジメントになってしまう。
3. 自分である程度のモノを作っていろはを体得したいと強く感じる
4. ソフトウェア会社に勤めている父親にモノを作りたい欲を訴えると、OCR入力にて領収書の管理をするシステム作成を依頼される

## 今の進捗
- ヒアリング #1
    - 要件定義書の作成
        - 機能一覧
        - システム構成
        - 
- 環境構築 #1
    - React
    - XAMPP
    - MySQL

- GPTとの壁打ち
    - CI/CDどうするか？
        - そもそも自動テストってGithub Actions使ってどうやるの？
    - アーキテクチャどうするか？
    - リポジトリのディレクトリ/branch戦略って何がベスト？
    - 一人開発の心得とは？

## まとめ
初心者なので、連番の記事で学んだことをつらつら書いていきます。
ある程度いい感じになったら、進捗じゃなく、技術ごとに記事を書いていこうかなと思います。


## （付録）一人開発の心得をChat-GPTスクラムマスターに聞きました。

一人開発のときに大事な心構えをまとめてみたで！  
MVPファーストでアジャイルに進めるなら、**効率よく進める工夫**と**モチベーション管理**がカギやな。

---

### **1. 設計は最小限に、まず動くものを作る**
💡 **「完璧を目指さず、まず動かす」**  
👉 設計に時間をかけすぎず、動くものを早くリリース  
👉 画面遷移やデータフローが決まったら、すぐに開発に着手  
👉 仕様変更に強い柔軟な設計を意識（疎結合 & 拡張しやすいコード）  

⚠ **注意点**  
- 「後で直せばいい」と思って無計画に作りすぎると、あとで修正コストが増える  
- 重要な部分（OCR処理・データ管理）は、最低限の設計をしてから実装する  

---

### **2. 一人でも振り返り（定期レビュー）をする**
💡 **「定期的に、開発の進み具合をチェック」**  
👉 **週1回くらい、MVPの進捗を確認 & 次にやることを決める**  
👉 Trello、Notion、GitHub Projects みたいなツールを使ってタスク管理  
👉 **「今、何ができてて、次に何をやるか？」を明確にする**  

⚠ **注意点**  
- 一人やと開発がダラダラしやすいので、明確なゴール設定が必要  
- 「今日はこれだけやる！」と決めて開発する  

---

### **3. 可能な限り自動化する**
💡 **「自動化できる作業は極力減らして、開発に集中」**  
👉 **CI/CD導入（テスト & デプロイ自動化）**  
👉 **フォーマッター & 静的解析導入（Prettier, ESLint, Black, Flake8 など）**  
👉 **シェルスクリプトで繰り返し作業を省く**  

⚠ **注意点**  
- 自動化にこだわりすぎると、本来の開発が遅れる  
- 「後回しにしてもいいもの」と「今やるべきもの」を見極める  

---

### **4. モチベーション維持の工夫**
💡 **「やる気が続く仕組みを作る」**  
👉 **作業の進捗を「見える化」して達成感を得る**  
👉 こまめにGitコミットして、「積み上げ」を実感する  
👉 Twitterやブログに進捗をポストする（適度な外圧をかける）  
👉 **1日の終わりに「今日やったこと」をメモして、次のタスクを決める**  

⚠ **注意点**  
- **「全部やろうとしない」** → MVP完成までは機能を絞る  
- モチベが下がったときは、無理に頑張らずに小さいタスクをやる  

---

### **5. コードを「未来の自分」にわかる形に**
💡 **「未来の自分が読んでも理解できるコードを書く」**  
👉 **変数・関数名は明確にする**（適当な名前は避ける）  
👉 **適切なコメントを残す（特に複雑な処理）**  
👉 **Gitのコミットメッセージをわかりやすくする**（後で見返してわかるように）  

⚠ **注意点**  
- 「とりあえず動けばOK」なコードを書きすぎると、後でメンテが辛くなる  
- 特にOCRの処理は、どこで何をやってるか整理しておくと後々楽  

---

### **6. 外部の力を活用する**
💡 **「全部自分でやろうとせず、便利なツールやライブラリを使う」**  
👉 OCRやPDF処理は、既存のライブラリ（Tesseract, PyOCR, OpenCVなど）を活用  
👉 ChatGPTやGitHub Copilotでコード補助  
👉 バグの解決はStack OverflowやQiitaをフル活用  

⚠ **注意点**  
- ライブラリに依存しすぎると、独自のカスタマイズが難しくなることもある  

---

### **まとめ**
📝 **一人開発の心得**
1. **「まず動くものを作る」**（設計しすぎず、MVPを優先）  
2. **「定期的に振り返り」**（週1で進捗確認 & タスク整理）  
3. **「自動化できるものは自動化」**（CI/CD、フォーマッター、シェルスクリプト）  
4. **「モチベ管理」**（進捗の見える化、こまめなGitコミット）  
5. **「未来の自分が読めるコードを書く」**（コメント & わかりやすい命名）  
6. **「外部の力をうまく使う」**（ライブラリやAIを活用）  

これを意識すれば、**効率よく & 楽しく**開発を進められるで！ 🎯💪
ProxmoxでgpsdからDBUSに接続できないのを解消する

# 発生した事象

Proxmox 6.8.4にgpsdをインストールして起動すると下記のログが記録される。

```text:journalctl -u gpsd.service(抜粋)
gpsd:ERROR: unable to connect to the DBUS system bus
```

# 調査

ジャーナルの直近ログを `journalctl -xe` で確認すると下記の記録があった。

```text:journalctl -xe(抜粋)
AVC apparmor="DENIED" operation="connect" class="file" profile="/usr/sbin/gpsd" name="/run/dbus/system_bus_socket" pid=××××××× comm="gpsd" requested_mask="wr" denied_mask="wr" fsuid=0 ouid=0
```

AppArmorで止められているらしい。
このため、DBusが使えるようにgpsdのAppArmorローカルプロファイルを編集して対応することにした。

# 対応

```text:/etc/apparmor.d/local/usr.sbin.gpsd
include <abstractions/dbus-accessibility>
include <abstractions/dbus-session>
include <abstractions/dbus>
```

```text:/etc/apparmor.d/usr.sbin.gpsd(追記・またはコメントアウト解除)
include <local/usr.sbin.gpsd>
```

あとは `aa-enforce usr.sbin.gpsd` コマンドを実行してgpsdを再起動すればおしまいです。
【Android】WebViewのリセット【Kotlin】


# WebViewを使う時にやること　
WebViewにUrlをloadさせる前に必ず

```
webView.loadUrl("about:blank") 
```

とすることで、ビューの状態を確実にリセットできます。
以前はclearView()　という関数が使用されていたみたいですが、API レベル 18 で非推奨になり、今では上記のやり方になっているみたいです。
公式にも

>このメソッドは API レベル 18 で非推奨になりました。WebView.loadUrl("about:blank") を使用して、ビューの状態を確実にリセットし、ページ リソース (実行中の JavaScript を含む) を解放します。
とあります。

WebViewをリセット（クリア）すると白い背景のみが描画されます。
Active Directory入門：PowerShell で Active Directory のユーザー情報を取得する方法

## **はじめに**
Active Directory（AD）のユーザー情報を取得するには、PowerShell を使用すると便利です。本記事では、`xxx` というユーザーの情報を取得するための簡単な方法を紹介します。

---

## **方法 1: Get-ADUser を使用する（推奨）**
最も簡単な方法は、PowerShell の `Get-ADUser` コマンドを使用することです。

```powershell
Get-ADUser -Identity xxx -Properties *
```

### **動作の流れ**
- `-Identity xxx` : ユーザー `xxx` の情報を取得します。
- `-Properties *` : すべてのプロパティ（名前・メール・所属グループなど）を取得します。

### **前提条件**
- **Active Directory モジュール（RSAT: Remote Server Administration Tools）がインストールされている**
- **ドメインコントローラー上で実行する** か、**ドメイン参加済みの PC で実行する**
- **管理者権限が必要な場合がある**

### **特定の情報だけ取得**
例えば、表示する情報を **名前・メール・最終ログイン** に絞る場合:
```powershell
Get-ADUser -Identity xxx -Properties DisplayName, EmailAddress, LastLogonDate |
    Select-Object DisplayName, EmailAddress, LastLogonDate
```

---

## **方法 2: DirectoryServices を使用する**
`Get-ADUser` が使えない環境（Active Directory モジュールがない場合）でも、`DirectoryServices` を使って情報を取得できます。

```powershell
$ldapPath = "LDAP://ad.honda.com"
$username = "xxx@honda.com"
$password = "honda"

$entry = New-Object DirectoryServices.DirectorySearcher([ADSI]"$ldapPath")
$entry.Filter = "(&(objectClass=user)(sAMAccountName=xxx))"
$user = $entry.FindOne()

$user.Properties
```

### **この方法のポイント**
- `LDAP://ad.honda.com` に接続して `xxx` の情報を取得
- `FindOne()` で 1 件の結果を取得
- `Properties` でユーザーのすべての情報を表示

---

## **方法 3: コマンドライン（dsquery / dsget を使用）**
PowerShell を使わずに Windows のコマンドプロンプトから取得する場合は、`dsquery` を使用できます。

```cmd
dsquery user -name xxx | dsget user -dn -samid -display -email -dept
```

### **この方法のポイント**
- `dsquery user -name xxx` でユーザーの DN (識別名) を取得
- `dsget user -dn -samid -display -email -dept` で詳細情報を取得

⚠ `dsquery` は **ドメイン環境** でのみ動作します。

---

## **まとめ**

| 方法 | コマンド | メリット | 注意点 |
|------|---------|---------|---------|
| **方法1: `Get-ADUser`（推奨）** | `Get-ADUser -Identity xxx` | 簡単・詳細な情報が取れる | ADモジュールが必要 |
| **方法2: DirectoryServices** | `$entry = New-Object DirectoryServices.DirectorySearcher(...)` | ADモジュールなしでOK | 少しコードが長い |
| **方法3: dsquery/dsget** | `dsquery user -name xxx | dsget user` | コマンドラインで簡単 | AD環境が必要 |

### **どれを試すべき？**
- **ドメイン参加済みで PowerShell モジュールが使えるなら** `Get-ADUser`
- **LDAP 経由で取得したいなら** `DirectoryServices`
- **コマンドラインで簡単に取得したいなら** `dsquery`


---

## **おわりに**
PowerShell を使用すると、Active Directory のユーザー情報を簡単に取得できます。環境に応じて適切な方法を選び、ぜひ活用してください！

もしエラーが出る場合は **エラーメッセージ** を確認し、適切な対処を行なってみてください！
多重ループ問題！行番号とindexのズレに注意！

Paizaの多重ループ問題で「m+2」を使って爆死…。
行番号と配列のインデックスのズレに気づかず…。でも解決しました！

<br>**問題概要**
m個の文字 c_1, ..., c_m と n個の文字列 S_1, ..., S_n が与えられ、
各 c_i が各 S_j に含まれるかを判定して "YES" / "NO" を出力する問題。

入力例
```js
1
a
2
paiza
kyoko
```
出力例
```js
YES
NO
```


<br>⭐**ミスったポイント**

問題文に「(m + 2) 行目に n がある」と書いてあったから、
const n = lines[m + 2]; // インデックスのズレでエラー！
と書いたけど、動かない…。

行番号は1から始まるけど、配列のインデックスは0から！
だから m + 1 を使うのが正解だった。

<br>**解決コード**
```js
const n = Number(lines[m + 1]); // 正しく n を取得！

for (let count = 1; count <= m; count++) {
    let charC = lines[count];
    for (let i = 1; i <= n; i++) {
        let stringS = lines[m + 1 + i];
        console.log(stringS.includes(charC) ? "YES" : "NO");
    }
}
```
ポイント
✅ .includes() で YES / NO をスマート判定
✅ m+1 で n の取得ミスを回避
✅ 三項演算子 ? : でコードを短縮

これで僕もエラー地獄から脱出！


[僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/03/09/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc-%e5%a4%9a%e9%87%8d%e3%83%ab%e3%83%bc%e3%83%97%e5%95%8f%e9%a1%8c%ef%bc%81%e8%a1%8c%e7%95%aa%e5%8f%b7%e3%81%a8index%e3%81%ae/)
RestControllerAdviceを使って全体共通のExceptionHandlerを設定しよう!!

## @ RestControllerAdvice とは

`@ControllerAdvice` と `@ResponseBody` が組み合わされた アノテーションです

 ControllerAdvice は アプリ全体のコントローラに適用される共通の処理 を定義できる

## ExceptionHandler の 動かし方

ExceptionHandler は 同クラス内で発生したExceptionをハンドリングし、設定したオブジェクトを返します. 
そのため ExceptionHandlerを動かしたい場合は **同じクラスに記述** するか **RestControllerAdvice** で 全体のクラス共通のExceptionとすることで動く!!

## 実装例

実際に以下のような例でハンドリングをした場合の処理です 
- ユーザーを検索したが見つからない場合の処理
- フロントエンドサーバ からの入力を受け付け、内容が不正だった場合の処理

#### 例外のハンドリング
```java
package test.web.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ProblemDetail;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;


@RestControllerAdvice
public class ExceptionController {
    // 入力不正の自作例外
    @ExceptionHandler(InvalidRequestException.class)
    public ProblemDetail InvalidRequestExceptionHandler(InvalidRequestException e) {
        ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, e.getMessage());
        problemDetail.setDetail("InvalidRequest");
        return problemDetail;
    }

    // ユーザー不明の自作例外
    @ExceptionHandler(UserNotFoundException.class)
    public ProblemDetail UserNotFoundExceptionHandler(UserNotFoundException e) {
        ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.FORBIDDEN, e.getMessage());
        problemDetail.setDetail("NotFoundUser");
        return problemDetail;
    }
}

```

#### 入力不正の例外
```java
package test.web.exception;

public class InvalidRequestException extends RuntimeException {
    public InvalidRequestException(String message) {
        super(message);
    }
}

```

#### ユーザー不明の例外
```java
package myenglish.web.exception;

public class UserNotFoundException extends RuntimeException {
    public UserNotFoundException(String message) {
        super(message);
    }
}

```

:::note info
あとは該当のRestControllerで throw new すればハンドリングされてエラーレスポンスが返されます!
:::
backend が異なる powerdns/py-certbot plugins 

## ややこしやDNS環境
* powerdns を運用するサーバが、バックエンド同一でないというのは、オフサイトで未だにAXFRに頼らざる得ないということになります。
* 今日はAXFRの設定がFWで不通になっているので苦労してました。問題をクリアしたと思ったら、今度はSOAが更新されませんでした・・・なんてこったい。
* 途中、curl でチェックしたらIPアドレス間違ってたとかで１時間潰れました..　/etc/hosts 共有して名前で引けばよかったかも・・・三重苦でした。

## 注意書きを読むべし・・・

https://github.com/strnh/certbot-dns-pdns/tree/main
>Since this plugin communicates with PowerDNS via the HTTP API make sure that the SOA-EDIT-API setting for your zone is set to a value that results in an increase of the SOA serial (i.e. the setting exists in your domain metadata). Otherwise the changes made to the zone by this plugin will not propagate to any secondaries you may have configured, causing the certificate challenge to potentially fail.

 SOA-EDIT-APIをセットしないと、SOAの値が進まないため、AXFRをしません・・・

```
$ pdnsutil set-meta example.com SOA-EDIT-API 1
```

割と最近更新がされていると思ったら最後はこんなトコロで引っかかっていたわけです・・・　orz...
(ミスったらドキュメントして二度とやらないように）
Dockerのコンテナ内でlocalhostにリクエストするとエラーになる

# 事象
* Dockerのコンテナ内で、`curl http://localhost:8010/`を実行すると`curl: (7) Failed to connect ~ `が返ってきてしまう。
* Dockerのコンテナ外で、`curl http://localhost:8010/`を実行すると正常にレスポンスが返ってくる。

# 結論
ホスト側とコンテナ側でポートが異なる設定にしていたため。

# ホスト側のポートとコンテナ内部のポートのマッピングを確認する
例えば、docker-compose.yml が下記のようになっていた場合、
```
services:
  php81:
    image: php:8.1-apache
    ports:
      - "8010:80"
```
ホスト側の 8010 がコンテナの 80 にマッピング される。
そのため、コンテナの中からは 8010 ではなく 80 にアクセスする必要がある。

# 検証
* Dockerのコンテナ内で、`curl http://localhost:8010/`を実行すると`curl: (7) Failed to connect ~ `が返ってくる
* `curl http://localhost:80/`を実行すると、正常にレスポンスが返ってきた。

# まとめ
* ホスト側のポートとコンテナ内部のポートのマッピングの設定により、ポートが異なることがある。
* コンテナ内部でも同じポート番号でアクセスしたい場合は、docker-compose.yml で `ports: - "8010:8010"`に変更する。
シェルの日付&日時機能のメモ（dateコマンド不要）

## はじめ

シェルの日時機能の雑なメモです。意外と知られていない気がしますが、bash、ksh、zshを使うのであれば日時の処理に `date` コマンドは必要なかったりします。シェルの機能なので `date` コマンドを使うよりも速いです。

## 現在日時の取得

```console
$ bash -c 'printf "%(%F %T)T\n"'
2025-03-09 17:47:05

$ ksh -c 'printf "%(%F %T)T\n"'
2025-03-09 17:48:12

$ zsh -c 'zmodload zsh/datetime; strftime "%F %T"'
2025-03-09 17:50:36
```

## UNIXタイムの取得（＋ マイクロ秒 or ナノ秒）

```console
$ bash -c 'echo $EPOCHSECONDS; echo $EPOCHREALTIME'
1741510387
1741510387.048045

$ bash -c 'printf "%(%s)T\n"'
1741510525

$ sh -c 'zmodload zsh/datetime; echo $EPOCHSECONDS; echo $EPOCHREALTIME'
1741510368
1741510368.5248692036

$ ksh -c 'printf "%(%s.%N)T\n"'
1741489522.461796790

$ mksh -c 'echo $EPOCHREALTIME'
1741489529.610125
```

## UNIXタイムからの変換

```console
$ bash -c 'printf "%(%F %T)T\n" 1000000000'
2001-09-09 10:46:40

$ ksh -c 'printf "%(%F %T)T\n" "#1000000000"'
2001-09-09 10:46:40

$ zsh -c 'zmodload zsh/datetime; strftime "%F %T" 1000000000'
2001-09-09 10:46:40
```

## 相対時間の計算

```console
$ ksh -c 'printf "%(%F %T)T\n" "now + 1day"'
2025-03-10 17:58:55
```

## おまけ: 日時を変数にいれる方法

```console
$ bash -c 'printf -v now "%(%F %T)T"; echo $now'
2025-03-09 18:02:00
```

サブシェルを使う `now=$(printf "%(%F %T)T"` よりも `-v` オプションを使ったほうが速いです。

## さいごに

そのうち忘れる予定なので現在覚えていることのメモ。他にも思い出したら or 調べて気づいたら追記します。
⚖️ Function Calling 対 MCP：開発者による実際の比較

[記事元](https://quaily.com/lyric_kiji/p/function-calling-vs-mcp-developers-comparison)

---

ヘイ、みなさん！👋

Function CallingとMCPを実際に使ってみて、両者の実践的な比較検討について共有したいと思います。

多くの読者はすでにMCPとFunction Callingについて理解していると思うので、技術的な詳細は省略します：

## シナリオ：認証とセッション管理

例えば、AI駆動のニュースレターツール[Quaily](https://quaily.com)を開発しています。AIを使ってquaily.comに記事を投稿したいのですが、もちろん認証が必要です：

**MCPを使用する場合：**

ローカルプログラム（[quail-cli](https://github.com/quailyquaily/quail-cli)）で認証とセッション管理を処理できます。ログイン状態はMCPサーバー（quail-cli）に自然に存在し、ログイン認証情報がLLMに漏洩することはありません。

認証情報が期限切れになった場合、MCPサーバーは簡単にquail-cliでユーザーに再ログインを強制できます。

認証とLLM処理の間に明確な境界があり、鍵と錠を別々に保管するようなものです。

**Function Callingを使用する場合：**

明らかにトークンやその他のログイン認証情報をLLMに送信することはできません：セッション識別子がLLMに記憶されるリスクがあるからです。これらのLLMが密かに鍵をコピーしないとは限りません。

可能な解決策：

- 超短期トークンの使用：例えば10秒間だけ有効なトークンを生成する
- さらに、再利用を防ぐために各リクエストで新しいトークンの使用を強制する

しかし、これらの方法はすべて複雑さを増し、それでもMCPアーキテクチャと同レベルのセキュリティ保証を提供できません。根本的な問題は変わりません：Function Callingを使用すると、制御できないシステムを通じて機密情報を渡すことになります。

## ビジネスモデルへの影響

セキュリティの問題だけでなく、ビジネスモデルにも関わります。ビジネスモデルは基本的に、顧客やユーザーに一連の有料ゲートを持つ高速道路を提供し、そのゲートからお金を稼ぐことです。

例えば、Quailyでは、ゲートは有料コンテンツへのアクセスであり、ビジネスモデルはサブスクリプション制です。

前述の通り、Function CallingはMCPアーキテクチャと同レベルのセキュリティ保証を提供するのが難しいため、製品の迅速な構築には適しているかもしれませんが、サービスの境界を作るのは困難です。このようなビジネスモデルの実施は、厄介というよりもむしろ苦痛です。

一方、MCPはアクセス制御の構築に本質的に適しています - 特に、OpenAIのようなインフラを構築する能力がないがAIアプリケーションを作りたい開発者にとってはそうです。

## 決定：MCPの選択

今日、両方のアプローチが実際の問題を解決していますが、両方の方法を深く使用した後、私はMCPが多くのシナリオにより適していると感じています。以下が私の見解です：

- **セキュリティ設計**：MCPのアーキテクチャは、Function Callingが対処困難な認証情報の露出問題を根本的に解決します
- **将来性**：アプリケーションの成長に伴い、MCPのモジュラーアーキテクチャはより優雅にスケールします
- **明確な境界**：データアクセスとLLM処理の分離により、より保守しやすいシステムが作成されます
- **エコシステム構築**：MCPはアプリケーション間で共有可能な能力ネットワークを構築でき、商業化に有利です

どう思いますか？考えを共有してください。
SwiftUIのListで空白のSectionを作る

# はじめに
今回はSwiftUIのListを使う際に空白のSectionを作る方法を紹介します
### 本文
下記のようにすることでタイトル等を表示しないSectionを作ることができます。
```swift
Section(header: Color.clear.frame(height: 20))
```
### 最後に
自分は普段Androidエンジニアなのでheaderに対してColorを設定することができるのはすごく斬新で、発想にもなかったので少しハマりました。
どなたかのお役に立てれば幸いd
QLineEdit にアクションボタンを追加する

## 前書き
ファイルダイアログでファイルパスを取得した後QLineEditにsetするUIを作ろうとして、以前はそれぞれ別のボタンとQLineEditを隣に並べていましたが、QLineEditにボタンを埋め込み単一のウィジェットとする手段を知ったので記事にしてみました。

## イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4011271/4a821169-e269-4c7d-9124-8d50c37998da.png)
上がQLineEditとボタンを横に並べたもの
下が本題のQLineEditにボタンを埋め込みしたものです

上はウィジェットが二つになっているので、新たな水平レイアウト追加するなど手間があり少々面倒です。
下は単一のウィジェットになっているのでレイアウトが簡単です。

## 本題
QLineEditのメソッド``addAction``を使用します。
addActionを使うには、アクションとアクションを追加する位置を渡します。
これで追加されるボタンはアイコンのみ表示されるのでアイコンを設定する必要があります。
``LeadingPosition``で入力の前の位置に追加し、``TrailingPosition``で後ろの位置に追加します。


```python:サンプル
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QLineEdit

lineedit = QLineEdit()
lineedit.addAction(
    QIcon.fromTheme(QIcon.ThemeIcon.FolderIcon),
    QLineEdit.ActionPosition.TrailingPosition,
)
```

## 参考
- https://doc.qt.io/qtforpython-6/PySide6/QtWidgets/QLineEdit.html#PySide6.QtWidgets.QLineEdit.addAction
DockerでGiteaを立てる。

# ① Giteaコンテナの起動
sudo docker run -d \
  --name gitea \
  -p 3000:3000 \
  -p 222:22 \
  -v ~/gitea-data:/data \
  --restart always \
  gitea/gitea:latest

# ↑ まず最初にこのコマンドを実行します。


# ② 初回Giteaにアクセスする

ブラウザで以下のURLにアクセスします。

```
http://サーバのIPアドレス:3000
```

初回アクセス時に表示されるセットアップ画面で、以下の設定を行います。

### 1. データベースの設定（Database Settings）
- データベースタイプ: 「SQLite3」（推奨、デフォルト）
- パス: デフォルトのまま変更不要（通常は「/data/gitea.db」）

### 2. 一般設定（General Settings）
- サイト名: 任意の名前（例: MyGitea）
- ドメイン: サーバのIPアドレスやドメイン名（例: 192.168.0.10）
- SSHポート: 「222」
- HTTPポート: 「3000」
- URLベース: デフォルトのまま「/」

### 3. 管理者ユーザー作成（Administrator Account Settings）
- 管理者ユーザー名: 任意（例: admin）
- パスワード: 安全なパスワードを設定
- メールアドレス: 任意のメールアドレスを入力

設定を入力後、「Install Gitea」ボタンをクリックして設定を完了します。

設定完了後はログイン画面が表示され、作成した管理者アカウントでログインできます。


# ③ クライアント側でのGitリポジトリの利用手順

### 1. Giteaでリポジトリ作成
Giteaにログイン後、「New Repository」をクリックして新規リポジトリを作成します。

### 2. クライアントでリポジトリをクローン
クライアント側で以下のコマンドを実行します。

```bash
git clone ssh://git@サーバのIPアドレス:222/ユーザー名/リポジトリ名.git
cd リポジトリ名
```

### 3. ファイルの追加とコミット
```bash
echo "My First File" > README.md
git add README.md
git commit -m "Initial commit"
```

### 4. リモートリポジトリの設定とPush

既存のリモートが存在する場合は削除します。

```bash
git remote remove origin
```

新しいリモートを設定します。

```bash
git remote add origin ssh://git@サーバのIPアドレス:222/ユーザー名/リポジトリ名.git
```

その後、Pushします。

```bash
git push -u origin main
```

これでクライアントからのリポジトリ操作が完了します。


## （補足）Docker未インストール時の手順

Dockerがまだインストールされていない場合は以下を実行します。

```bash
sudo apt update
sudo apt install -y docker.io docker-compose
sudo systemctl enable --now docker
```

## ④ コンテナ操作の基本コマンド

- コンテナの停止

```bash
sudo docker stop gitea
```

- コンテナの起動

```bash
sudo docker start gitea
```

- コンテナの再起動

```bash
sudo docker restart gitea
```

- コンテナの削除

```bash
sudo docker rm -f gitea
```

- データの削除

```bash
rm -rf ~/gitea-data
```

- 削除後の確認

```bash
ls -la ~/gitea-data
```

## ⑤ データディレクトリの権限設定（事前準備）

```bash
mkdir -p ~/gitea-data
chmod 775 ~/gitea-data
```

## ⑥ Giteaのアップデート方法

```bash
sudo docker pull gitea/gitea:latest
sudo docker stop gitea
sudo docker rm gitea

sudo docker run -d \
  --name gitea \
  -p 3000:3000 \
  -p 222:22 \
  -v ~/gitea-data:/data \
  --restart always \
  gitea/gitea:latest
```

この順番で進めると、ローカル環境でのGiteaセットアップ・運用がスムーズに行えます。
Pokémon GO Plus+ の振動を無効化する

# はじめに
:::note alert
以下の手順を実施することで、機器の故障やデータ損失（Sleepでのピカチュウのなつき状態）のリスクがあります。
この記事は研究目的での作業なので、もし再現する場合は自己責任で行ってください。
:::

GO++便利ですよね。
モンボ+のころにあったペアリングの頓挫さがなくなり、Sleepでの睡眠計測でも使えるのでポケモンアプリユーザーには欠かせないデバイスだと思います。

唯一の欠点として電車や会社で使用できないほど、振動がうるさすぎるという問題があります。
モンボ+のころからですがこれを切るオプションはないそうです。

[「Pokémon GO Plus +」 の振動しないようにするための方法を知りたい](https://pgpp.pokemon-support.com/hc/ja/articles/20331470722329--Pok%C3%A9mon-GO-Plus-%E3%81%AE%E6%8C%AF%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%96%B9%E6%B3%95%E3%82%92%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84)

:::note info
『Pokémon GO』で使用する場合
・ポケモンの通知やポケストップの通知において、振動を切ることはできません。
:::

今回はこちらを無振動化していきます。

# 分解手順

## 1. 外装の取り外し
赤丸部分のネジを取ります。
形状は＋なのですが、小さめなので精密ドライバーを使用しないと難しいと思います。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/4c5eab67-a3e4-4c05-9cf3-4ada30c29e05.jpeg">

ネジを外したあとは白い部分と黒いふち部分の間をヘラで抉っていきます。

**注意**
青丸部分に振動防止テープのようなものが非常にしっかりと貼付されているため、無理に剥がすと破損する恐れがあります。
テープが剥がれると内部基盤にアクセス可能になりますが、十分注意して作業を行ってください。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/965b2cdd-ce7d-455e-a39a-ec1554062551.jpeg">

テープが剥がれるとパコっと外れるので以下のように基盤部分にアクセスできます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/e609542e-025e-4d8f-948e-f0b51d56d3e5.jpeg">

## 2. 基盤
以下の赤丸部分のネジをすべて外します。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/f0c628d1-7b01-4322-bcff-7fe14ec11cae.jpeg">

上記のネジを外すとバッテリーが外せるので下記のネジを外していきます。（画像は取ったあと）
☆部分にも隠れているので、USBモジュールを外してからネジを取っていきます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/cd7ec3a4-62a0-4e23-b66c-ee2399b79118.jpeg">

## 3. バッテリーを外す
**安全のために**以下のようにバッテリーと繋がってるコネクタを外します。
ここが一番神経を使うところで、無理に外そうとするとユニット部分から線だけ抜けてしまうので慎重にやりましょう。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/dc458166-6634-4047-ae01-7a91adb3c31a.jpeg">

取り付けるときは表裏に気をつけて、斜め上から押し込むように接続します。

## 4.振動モジュールを取り外す
基盤の表側を向けて以下の赤丸部分の半田を取り除く、もしくは配線を切断します。
ここにつながっているのが振動する部品です。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/1cca05b8-ec74-4b92-ba6d-52f163d4e09e.jpeg">

取り外した部品がこれです。
こんなでかい金属が高速で振動してたらそりゃうるさい。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/b0c9b812-0d1d-4322-922b-618360ea5a1c.jpeg">

これで無振動化は完了です。
逆の手順で元に戻します。

# まとめ
今回、Pokémon GO Plus+ の振動を無効化するための改造手順を紹介しました。
モンボ+とは内部構造が異なり、半田作業や配線の切断が必要となる点にご注意ください。
作業は自己責任で行い、十分な注意を払って進めてください。
VBAテスト

Sub SaveSelectedEmailAttachments()
    Dim sourceExtension As String
    Dim destinationFolder As String
    Dim email As MailItem
    Dim attachments As Attachments
    Dim attachment As attachment
    Dim senderEmail As String
    Dim receivedDate As String
    Dim newName As String
    Dim destinationPath As String
    Dim tempPath As String
    
    ' 拡張子と保存先フォルダを設定
    sourceExtension = ".zi"
    destinationFolder = "C:\Temp"

    ' 現在選択されているメールを取得
    On Error Resume Next
    Set email = Application.ActiveExplorer.Selection.Item(1)
    On Error GoTo 0
    
    If Not email Is Nothing Then
        Set attachments = email.Attachments
        senderEmail = email.SenderEmailAddress
        receivedDate = Format(email.ReceivedTime, "yyMMdd_HHmm")
        
        ' 添付ファイルを処理
        For i = 1 To attachments.Count
            Set attachment = attachments.Item(i)
            If Right(attachment.FileName, Len(sourceExtension)) = sourceExtension Then
                ' 添付ファイルの名前と保存先を設定
                newName = Left(senderEmail, 5) & "_" & receivedDate & ".zip"
                destinationPath = destinationFolder & "\" & newName
                
                ' 一時的なパスに添付ファイルを保存
                tempPath = destinationFolder & "\" & attachment.FileName
                attachment.SaveAsFile tempPath

                ' 添付ファイルの拡張子を変更して保存先フォルダに移動
                Name tempPath As destinationPath
            End If
        Next i
    Else
        MsgBox "メールが選択されていません。"
    End If
End Sub




@echo off
powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$vpnName = '****';" ^
    "$vpn = Get-VpnConnection -Name $vpnName -ErrorAction SilentlyContinue;" ^
    "if ($vpn) { Connect-VpnConnection -Name $vpnName; Write-Host 'VPN 接続完了'; } else { Write-Host 'VPNが見つかりません'; }"

pause


@echo off
rem プロキシをONにする（1: ON, 0: OFF）
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f
CLS出島からの「次の一歩」

## はじめに

2025年3月8日、 CLS 出島の記念すべき初回に運営メンバーとして参加してきました

https://cls-dejima01.peatix.com/view

今回参加したことで、「次の一歩」への勇気がもらえたと思います

前回（CLS出島#0）のイベントレポートはこちら

https://qiita.com/RyoWakabayashi/items/52b434dced1688fa2d1c

## 参加経緯

私は大分のコミュニティ、 [JAWS-UG 大分](https://jawsug-oita.connpass.com/) 、 [JBUG](https://jbug.connpass.com/) 大分 、 [Cloudflare Meet-up](https://cfm-cts.connpass.com/) 大分 などなどに所属し、定期的に勉強会を開催しています

https://qiita.com/RyoWakabayashi/items/f93cb7a5c2932958172d

https://qiita.com/RyoWakabayashi/items/1f473a039ce3e7e0ab4c

直近では大分ハンズオン祭りを開催予定です！

https://oitan.connpass.com/event/344646/

その流れで CLS = コミュニティリーダーズサミット 高知にも参加してきました

https://qiita.com/RyoWakabayashi/items/ffcc3f9ad1fd02721ee0

CLS 高知の後夜祭で長崎県から来ていた古地さんと知り合い、 CLS 出島の話を伺いました

https://x.com/yuunakochi/status/1791858377603355102

そのまま同じ九州、大分県や佐賀県から来ているメンバーで、 CLS 経験者として運営に関わらせて頂くことに

https://x.com/yuunakochi/status/1800867886963323138

#0 も大盛り上がりとなり、ついに初回開催が決定

https://x.com/CoDejima/status/1895388294680322347

大分メンバーもオンラインで毎週定例会に参加し、いよいよ本番となりました

https://x.com/cls_dejima/status/1854500010769125481

## 本編のまとめ

運営でバタバタ動いていたため、各セッションのちゃんとした感想は書けないのですが、みなさんのポストをまとめました

https://posfie.com/@nakaji573/p/IOnkB4b

これから内容を追っかけます

## 次の一歩

単なる勉強会で終わらず、全員が「自分ごととしてアクションしていく」ことが CLS なのだと思います

セッションやワークショップを通じて、「次に何をするのか」を全員で考えることができました

https://x.com/yuunakochi/status/1898297832073048316

https://x.com/sugimisu/status/1898300164512862674

次のアクションをポストして宣言！

https://x.com/Etupirkazuyan/status/1898302345189966183

https://x.com/beajourneyman/status/1898302164982001866

https://x.com/clsmishima/status/1898302877015142512

https://x.com/tanimo312/status/1898303950639558736

私は運営で不参加でしたが、ここに宣言しておきます

**社内に技術コミュニティを作り、所属に関係なく技術研鑽したい人を支援します**

今年度も社内で色々な取り組みをやってきましたが、やはり次は **社内コミュニティ** かな、と考えていました

ただ、人が集まるか、ちゃんと継続できるか、など不安だらけです

そんなところ、前夜祭で中村亮太さんの話を聞き、LT登壇も聞き、やはりやろうと勇気をもらいました

https://x.com/Rinatamu_ITDR/status/1898313420694560970

https://x.com/nakaji573/status/1898284352452399256

また、後夜祭の二次会で春日井製菓の原さんから聞いたお話にも感銘を受けました

https://www.kasugai.co.jp/members/03/

どうやって「それぞれのやりたいこと」を見つけるのか、それを「みんなのためのこと」に繋げていくのか、考えるヒントをもらいました

## 感想

長崎の人たちがすごく楽しんでいるのが伝わりました

運営メンバーも「やってよかった」と笑顔で後夜祭を楽しんでいました

https://x.com/Etupirkazuyan/status/1898328180395782582

https://x.com/hide69oz/status/1898356336292950212

関心軸が「コミュニティ」という幅の広いものなので、多くの越境が起き、思わぬ出会いがたくさん生まれるのが CLS の良いところだと思います

まさか同じ境遇の人がいるとは！憧れていた職業の人の話が聞けるとは！というようなことが後夜祭のそこかしこで起きているのが本当に面白いイベントだと思います

## CLS の仲間たち

CLS はどんどん広がっています

https://x.com/CLSKOUCHIFUJITA/status/1898601542401589453

https://x.com/clsmishima/status/1898305586992963887

https://x.com/clskochi/status/1898304997013733652

もしかしたら、大分でも、、、？

## まとめ

まずはみんなが楽しめていて良かったです

運営として、少しでも役に立てたのなら幸い

「次の一歩」の勇気をもらえたので、一歩を踏み出していきます！
【next.js】×【lenis】で慣性スクロールをお手軽実装

リッチなサイトには慣性スクロールが採用されていることが多いですよね。
lenisというライブラリを使用すると簡単に実装することができるので
今回はそれの実装手順を解説していきます


## インストール

まずは、下記のコマンドで `lenis` をインストールします。

```bash
npm i @studio-freight/lenis
```



## LenisProvider コンポーネントの作成

次に、慣性スクロールを実装するためのコンポーネントを作成します。  
今回は、`LenisProvider.ts` というファイルに以下のコードを記述してください。

```typescript
'use client'

import { useEffect } from 'react'
import Lenis from '@studio-freight/lenis'

export const LenisProvider = () => {
  useEffect(() => {
    const lenis = new Lenis({
      duration: 1.2,
      easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
      wheelMultiplier: 1,
      touchMultiplier: 1,
      infinite: false,
    })

    const raf = (time: number) => {
      lenis.raf(time)
      requestAnimationFrame(raf)
    }

    requestAnimationFrame(raf)

    return () => {
      lenis.destroy()
    }
  }, [])

  return null
}
```


## 各プロパティの解説

- **duration**  
  スクロールのアニメーションにかかる時間（秒単位）を設定します。  
  例では `1.2` 秒となっており、スクロールの動きが1.2秒間続きます。

- **easing**  
  スクロール時の動き（加速・減速）を制御するイージング関数を設定します。  
  例として用意されている `(t) => Math.min(1, 1.001 - Math.pow(2, -10 * t))` は、自然な加速と減速を実現するためのカスタム関数です。

- **wheelMultiplier**  
  マウスホイールでのスクロール速度を調整する倍率です。  
  値を大きくするとホイール操作によるスクロールが速くなり、逆に小さくすると遅くなります。  
  例では `1` に設定されているため、デフォルトのスクロール速度が維持されます。

- **touchMultiplier**  
  タッチ操作によるスクロール速度を調整する倍率です。  
  同様に、値を変更することでタッチスクロールの感度が変化します。  
  例では `1` に設定されています。

- **infinite**  
  無限スクロール（スクロールがループするかどうか）を有効にするかを決定します。  
  `false` の場合は、スクロールはページの範囲内に留まり、無限にループしません。


## 利用方法

実装したいページで `LenisProvider` を import し、コンポーネントとして配置するだけで、慣性スクロールが実現できます。  
例えば、以下のように使用します。

```jsx
import { LenisProvider } from './LenisProvider'

const App = () => (
  <>
    <LenisProvider />
    {/* その他のコンポーネントやコード */}
  </>
)

export default App
```


## まとめ

この手順で、簡単にリッチなサイトに慣性スクロールを実装することができます。  
`lenis` の設定はプロジェクトのニーズに合わせて調整可能なので、ぜひ試してみてください！
Xcodeシミュレーター作成方法

ipadでの確認したい場合などに、新たにシミュレーターを作成したい場合があると思います。

- Xcodeの上部の端末名をクリックします
![スクリーンショット 2025-03-09 17.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/a4f9f8da-1dc3-4bb8-9aaa-a5fea4bb7d08.png)

- クリックするとManage Run Destinations...が出てくるので、クリックします
![スクリーンショット 2025-03-09 17.12.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/7e7d786b-9a26-4c4c-8f3c-862521831582.png)

- 作成したい端末を選択します
![スクリーンショット 2025-03-09 17.13.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/b9b5e638-a522-4a2d-a36c-10062cf98b6d.png)

- OS Versionを選択すれば完成です
![スクリーンショット 2025-03-09 17.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/b8b2551c-9b03-4680-8da9-3c9270f0937d.png)
mqtts: パプリック MQTT ブローカーに接続

broker.emqx.io に mqtts で接続するサンプルです。

## サブスクライブ

```bash
mosquitto_sub -d -h broker.emqx.io \
	 -p 8883 --capath /etc/ssl/certs/ \
    --topic example/testTopic
```

次でもオーケーです

```bash
mosquitto_sub -d -h broker.emqx.io -p 8883 \
	--cafile /etc/ssl/certs/ca-certificates.crt \
	--topic example/testTopic
```


## パブリッシュ

```bash
message="Hello Mqtt "`date`
mosquitto_pub -d -m "${message}" \
	-h  broker.emqx.io \
	 -p 8883 --capath /etc/ssl/certs/ \
	--topic example/testTopic
```

次でもオーケーです

```bash
message="Hello Mqtt "`date`
mosquitto_pub -d -m "${message}" \
	-h broker.emqx.io -p 8883 \
	--cafile /etc/ssl/certs/ca-certificates.crt \
	--topic example/testTopic
```
LLMの用語整理（自分向け）　その 1

# 【一周回ってど忘れした自分へ】

たまに忘れてしまう用語たちを振り返りつつ、Qiita に残していこうと思います。
もし誤りなどありましたら、コメントいただけると幸いです。

## **1. はじめに: LLMの学習プロセス**

LLM (大規模言語モデル) がどのように学習し、どのように実用化されるのかを理解するために、

- **事前学習 (Pretraining)** 
- **事後学習 (Post-training)** 

を理解するとよさそうです。


## **2. 事前学習 (Pretraining): AIの基礎を構築する**

事前学習は、膨大なテキストデータを用いて、LLMが **言語の構造、文法、文脈の相関を理解するための基礎を構築するフェーズ** と表現できます。

### **事前学習に関する専門用語**

#### **◆ LLMの基盤アーキテクチャ**
- **Transformer** 
    - LLMの基本構造
    - あの有名な「Atention Is All You Need」の論文で紹介された、長距離依存関係を効率的に学習するディープラーニングモデル
    - RNN や CNN に比べて並列計算が容易で大規模データの学習に向いている
- **Self-Attention**
    - 入力されたトークン同士の関連度を計算、情報の重み付けを行う仕組み
    - Transfomer では、各単語が文章内すべての単語と関連付けられるため、長距離の依存関係を捉えやすく、文脈理解能力が向上する
    - Multi-Head Attention といって、複数の自己注意機構を並列実行することで、情報の多様性を向上する手法もある
    - FlashAttention など、最適化手法もある、計算コストを削減しつつ高速な処理を可能に
- **Mixture of Experts (MoE)**
    - 通常の Transfomer とちがい、入力ごとに特定のサブネットワークが動作して、最も適したエキスパートが選択される構造（Expert: 専門家みたいな）
- **State Space Model (SSM, Mamba)**
    - 系列データの処理に適したアーキテクチャで、Transfomer 代替として研究されている
    - より少ない計算量で長いシーケンスの処理が可能となった
- **Scaling Laws**
    -スケーリング則（モデルサイズ・データ量・計算量のバランスが重要）
    - 単にモデルを大きくするだけではなく、データ効率や計算コストの最適も不可欠
    

#### **◆ 事前学習の手法**
事前学習の手法は、モデルが言語のパターンや意味を理解するために設計されています。
たとえば下記のような手法です。

1. **Causal Language Modeling (CLM)**
   - 次の単語を予測（GPT系）
   - 自己回帰型学習で、文章の前半部分を使って、次の単語を予測する
   - テキスト生成が得意、コンテキストの一貫性が高い
   - 並列計算が難しく、長いシーケンスの学習が非効率になりがち
2. **Masked Language Modeling (MLM)**
   - 一部の単語を隠して予測（BERT系）
   - 双方向的学習（Bidirectional）で、文章の一部の単語をマスク、それを推測する
   - 文全体の意味を考慮して単語を推測できるため、文脈理解力が向上
   - 推論時にはマスクトークンがないため、ファインチューニングが必要
3. **Denoising Autoencoder**
   - データの復元を目的とする自己教師あり学習で、文章にノイズを加えてそれを復元することで学習する
   - 生成タスクと文脈理解の両方に適用可能
   - ノイズの種類によっては、学習効率が低くなる可能性あり
4. **Contrastive Learning (コントラスト学習)**
   - 文の類似度を比較して、意味的な距離を学習する
   - 文章の意味をエンコーディングする際、類似する文を近づけ、異なる文を遠ざけることができる
   - 負例の選択が学習の効率に大きく影響する

---

### 最後に
会話中に瞬間的にど忘れする、もしくはうまく解説できなくてどもってしまうので、しっかり記憶していきたい所存です。
どんどん新しい用語が増えたり、技術も発展しているのでキャッチアップするのが大変ですね。


次は事後学習あたりをメモしていきたいと思います。
まだまだ続きます。
「Encountered two children with the same key」エラーについての考察

以前にはじめてのReactアプリ作成の記事を作成しました。

https://qiita.com/nagi-0106/items/c958aa9bee4cc29f6268

上記のアプリを作成した際に発生したエラーについて、私が調べた範囲の内容をまとめてみようと思います。

## 発生したエラーと発生時の状況
Reactでのミニアプリを作成中に検証ツールのコンソールを見ていたところ、以下のようなエラーが発生しました。
```javascript
// 視認性を上げるために文ごとに改行を加えています(原文は改行なし)
Encountered two children with the same key, `[object Object]`.
Keys should be unique so that components maintain their identity across updates. 
Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version.
```
発生時の該当箇所のコードは以下の通りでした。
```javascript
// 配列の仮データ
const records = [
    { title: "勉強の記録1", time: 1 },
    { title: "勉強の記録2", time: 3 },
    { title: "勉強の記録3", time: 5 },
];
// 配列の各データを出力するJSX部分
{records.map((record) => {
  return (
    <div key={record}>
      <p>{`${record.title} ${record.time}時間`}</p>
    </div>
  );
})}
</div>
```

## エラーの原因考察
### エラー文を和訳してみる
改めて今回のエラーを再確認してみましょう。
```javascript
Encountered two children with the same key, `[object Object]`.
Keys should be unique so that components maintain their identity across updates. 
Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version.
```
この記述をDeepL翻訳にかけたところ以下のような結果が得られました。
>同じキー `[object Object]` を持つ2つの子に遭遇しました。
キーは一意でなければなりません。そうすることで、コンポーネントは更新後も同一性を保つことができます。
一意でないキーは子要素の重複や省略を引き起こす可能性があります - この動作はサポートされておらず、将来のバージョンで変更される可能性があります。

ここから読み取れることとして、
* キーの値は要素を一意に示せるものでないといけない
* 重複する(ことが想定される)キー値を設定すべきではない
という点が考えられるでしょう。

つまり、**map構文のkey値を設定する場合は要素が一意に定まる値を設定する必要がある**ということになります。

### エラー部分のコードを再確認
改めて今回エラーが発生した部分のReactコードを見返してみます。
```javascript
{records.map((record) => {
  return (
    <div key={record}>
      <p>{`${record.title} ${record.time}時間`}</p>
    </div>
  );
})}
</div>
```
`key`の値が`records`のmap構文の引数である`record`となっていました。
これでは値が重複してしまう危険性があり、よくない記法でした。


## 改善案
結論としては**key値には一意に定まるような値を設定しよう**ということになります。

具体的には
* データのID値 (基本的にはデータに対して固有の値となるため)
* データのindex値 ※要素の順番が変わらない保証がある場合

あたりを設定すると良いと思います。


## 参考文献
https://qiita.com/yoshiwo/items/2d73f10fd1011b3a6b8a

https://qiita.com/TK-C/items/b8b621e009a31df7df63
MCP（Model Context Protocol）って何？

## 概要
最近業務でもCline / RooCodeの試験導入を始めたが、MCP（Model Context Protocol）を正しく利用することで開発体験が更に向上できそうと感じた。そもそもMCPって何？というレベルなので調査のついでにメモしておく。
個人向けの備忘なので、チラシ裏レベルのことしか書いてませんが他の誰かにも参考になれば幸いです。


## MCPとは
https://www.anthropic.com/news/model-context-protocol



MCPはAnthropicが2024/11月に公開したオープンソースの規格らしい。
アナウンスと同時に仕様と主要言語（TypeScript、Python、Java、Kotlin）のSDKが[公開されている](https://github.com/modelcontextprotocol)。

>MCPは、アプリケーションがLLMにコンテキストを提供する方法を標準化するオープンプロトコルだ。MCPはAIアプリケーションのUSB-Cポートのようなものだと考えてほしい。USB-Cがデバイスを様々な周辺機器やアクセサリーに接続するための標準化された方法を提供するように、MCPはAIモデルを様々なデータソースやツールに接続するための標準化された方法を提供します。

上記は参考元の翻訳の引用。
肝心の内容は、LLMからデータソースを接続する部分の規格を統一したものらしい。
さまざまなデータリポジトリやサービスとAIアシスタントを統一的な方法で接続する仕組みを提供しており、
分かりやすいメタファーとしてLLMのUSB-Cポートのようなものと表現されていた。





## コンポーネント
以下は公式から引用した図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031771/dff9d5c7-4157-441d-ba72-a404da27d095.png)




主要なコンポーネントは以下
- MCPホスト、MCPクライアント： 
IDE、ClaudeデスクトップなどMCPを介してデータにアクセスするホストとそのホストで稼働するクライアントプロセス
- MCPサーバ：
MCPクライアントと通信するサーバ。クライアントとの通信はMPCプロトコルを介して行う
- ローカルデータソース、リモートサービス： 
MCPサーバーが安全にアクセスできる、コンピュータのファイル、 データベース、サービスもしくはインターネット上で利用可能な外部システム（APIなど）。



## RAGとの違いは？
参考

https://www.runloop.ai/blog/model-context-protocol-mcp-understanding-the-game-changer#:~:text=,%E2%80%9D%20The%20layering%20system%20still

どちらもLLMに外部の情報を取り込んで回答する仕組みだが、担うレイヤーが違いそう。
RAGが「情報を取ってくる」役割なら、MCPは「情報を取ってきて整理・統合し、モデルの動きをコントロールする」より高度なレイヤーを担ってそう。


### RAG
シンプルに情報を「検索して貼り付ける」手法。
ユーザーが質問すると、その都度関連する文書やデータベースを検索して、得られた情報をLLMへのプロンプトに追加する。毎回検索結果を詰め込むため、情報が多すぎたり不要な情報が混ざったりするとLLMから期待した回答が得られないかもしれない。
つまり、追加された情報をモデルがそのまま処理するため、文脈や情報の整理はAI任せになりがち。

### MCP
LLMと外部情報をつなぐ「情報統合のための仕組み（プロトコル）」。
対話中にLLM自身が直接外部ツールを呼び出してリアルタイムに情報を取得したり、状況に応じて再度データを取りに行ったりなど「行動」を取れるようにしている。
また、得た情報はラベル付けしてレイヤー化しているらしい。
（「必ず参照すべき情報」「参考程度でよい情報」など）
結果、モデルが文脈を理解しやすくなり、より精度の高い応答や一貫した行動が可能になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031771/49a575a3-1b1a-4f6c-a201-38500b617d3d.png)
図：上記の参考から引用

## 実際の利用イメージ
軽く調べた感じ、現状は以下のシーンで利用できそう
- Claudeデスクトップから利用する
- Clien/RooCodeから利用する

### Claudeデスクトップから利用する
https://modelcontextprotocol.io/quickstart/user

上記はClaudeデスクトップからローカルのファイルシステムにアクセスするために、MCPサーバを作成するチュートリアル。
ClaudeデスクトップにはMCP Clientは組み込まれているっぽいので、MCP Serverの設定を行えば、プロンプトの実行時に自動的にMCP Serverの情報が反映されるようになる（はず）

### Clien/RooCodeから利用する
https://zenn.dev/codeciao/articles/cline-mcp-server-overview

上記が参考になりました。

ClienでMCPを有効にした場合のみ、システムプロンプトにはMCP関連の説明が追加されるらしい。
その際、使用できるMCPのサーバーやそのサーバーで使えるリソースとツールなどがプロンプトに追加される。


マーケットプレイスとして豊富なMCPサーバが利用できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031771/05aeb943-c4c3-453a-bed1-5069adc04869.png)


## まとめ
なんとなく概念は理解できたので、実際に使ってみたいと思う。
次回はそのあたりが記載できれば
Deno: MQTT を使う

こちらのページと同様のことを行いました。
[Deno で MQTT(MQTTS) を動かしてみる](https://www.ccbaxy.xyz/blog/2023/07/29/js76/#kuraianto)

## ブローカーの起動

```bash
deno run --allow-net https://deno.land/x/opifex/bin/demoServer.ts
```

## 動作確認のスクリプト

サブスクライブ

```bash
mosquitto_sub -d -h localhost -p 1883 --topic /test/aa
```

パブリッシュ

```bash
mosquitto_pub -d -h localhost --topic /test/aa \
	-m "こんにちは Mar/09/2025 PM 16:20"
```

## クライアント （サブスクライブ）

```ts:subscriber.ts
import { Client } from "https://deno.land/x/mqtt/deno/mod.ts";

const client = new Client({ url: "mqtt://localhost:1883" });

console.log("connecting");
await client.connect();
console.log("connected");

await client.subscribe("/test/aa");

client.on("message", (topic, payload) => {
  console.log([topic, new TextDecoder().decode(payload)]);
});
```

起動コマンド

```bash
deno run -A subscriber.ts
```

## クライアント　（パブリッシュ）

```ts:publisher.ts
import { Client } from "https://deno.land/x/mqtt/deno/mod.ts";

const client = new Client({ url: "mqtt://localhost:1883" });

console.log("connecting");
await client.connect();
console.log("connected");

console.log("publishing");
setInterval(async () => {
  await client.publish("/test/aa", "from publisher1");
}, 2000);
```

起動コマンド

```bash
deno run -A publisher.ts
```
【応用情報】DHCPがUDPを使用する理由

## はじめに
応用情報技術者試験で出てくるDHCPがUDPを使用する理由についてまとめてみました。

## 理由
　**DHCP**がトランスポート層のプロトコルにUDPを使用する理由は、DHCPのシーケンスの中でブロードキャスト通信が行われるためです。**TCP**(Transmission Control Protocol)は、通信相手とコネクションを確率して通信を行うプロトコルです。**ユニキャスト**（1対1の通信）しかサポートしていません。これに対して**UDP**(User Datagram Protocol)は、コネクション確立の必要がないプロトコルです。ネットワーク内で不特定多数の相手に向かって同じデータを送信する**ブロードキャスト**や、ある特定の複数の相手を対象に同じデータを送信する**マルチキャスト**といった、1対Nの通信にはUDPが利用されます。


## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
令和06-07年 応用情報技術者 試験によくでる問題集【午後】 単行本（ソフトカバー） – 2024/3/22
大滝 みや子 (著)
p.320
ビット全探索の考え方

## 今回の問題
https://paiza.jp/works/mondai/b_rank_new_level_up_problems/b_rank_new_level_up_problems__a_cup_of_water

全探索に関する問題です。


＞1 〜 N 個のアイテムのうち、いくつかを選んで合計の水量が X 以下になるように組み合わせを選ぶ。最適な水量を求めなさい。

このような問題では、全ての選択肢を試すために「ビット全探索」を使うことができます。

## ビット全探索とは？
ビット全探索とは、ビット演算を利用して、与えられた集合の全ての部分集合を効率よく探索する方法です。

N 個の要素の組み合わせを、2 の N 乗通り（全ての部分集合）をビット列で表現します。
各ビットが 1 であればその要素を選び、0 であればその要素を選ばないという形です。
具体的な例
例えば、次のように 3 個のアイテム（コップ）があるとします：

```
水量: [3, 5, 7] (ml)
```
1 番目のコップを選ぶ場合: 1 番目のビットが 1。
2 番目のコップを選ぶ場合: 2 番目のビットが 1。
1 番目と 2 番目のコップを選ぶ場合: 1 番目と 2 番目のビットが 1。
これらの組み合わせをビット列で表現し、全ての可能な選択肢を探索します。

## ビット全探索を使うメリット
ビット全探索を使用することで、次のような利点があります。

全ての組み合わせを簡単に列挙できる。
比較的少ないコードで解くことができる。
条件に基づいて簡単に組み合わせをチェックできる。
## 実装例
以下に、簡単なビット全探索の例を示します。この例では、与えられたコップから水量を最大化する組み合わせを選びます。水量が X 以下になる組み合わせを探索します。

``` java
import java.util.*;
public class Main {
    public static void main(String[] args) {
        // 自分の得意な言語で
        // Let's チャレンジ！！
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();//小さいコップの個数
        int X = sc.nextInt();//大きいコップの容量
        int[]w = new int[N];//小さいコップ
        for(int i = 0; i < N;i++){
            w[i] = sc.nextInt();
        }
        int maxSum = 0;//合計値のうち最大
        
        //小さいコップのすべての組み合わせ分ループ
        for(int bit = 0; bit < (1 << N);bit ++){
            int sum = 0;
            for(int i = 0; i < N;i++){
                //今回のbitで選ばれたコップの水を加算
                if((bit & (1 << i)) > 0){
                    sum += w[i];
                }
            }
            
            // 合計水量が大きいコップの容量以下の場合、最大値を更新
            if(sum <= X){
            maxSum = Math.max(sum,maxSum);
            }
        }
        
        System.out.println(maxSum);
    }
}
```
**コードの解説**
外側の for 文
for (int bit = 0; bit < (1 << N); bit++) は、2 の N 乗通りのビット列を使って全ての組み合わせを列挙しています。ここでの bit は、N 個の要素が選ばれているかどうかを示すビット列です。

**内側の for 文**
各 bit に対して、各要素が選ばれているか（ビットが 1 か）を判定するために、(bit & (1 << i)) > 0 の条件でビット演算を行い、選ばれていればそのコップの水量 w[i] を加算します。

**最大水量の更新**
合計水量 sum が大きなコップの容量 X 以下であれば、その水量が最大値より大きければ更新します。

## さいごに
今回の探索方法は、かなりいろいろな問題に応用できそうと感じました。
まだまだ知らないことだらけですが引き続き頑張ります!
メンター制度導入提案で意識したこと

## はじめに
米田です。
会社にメンター制度導入を提案した話について、先日記事を投稿しました。
[メンター制度導入を提案した話](https://qiita.com/komeda557/items/7f610cb14efbce239674)
今回は、記事の中でも触れた「制度提案において意識したこと」について、少し詳細に書いてみようと思います。

## 意識したこと
今回の制度策定で意識したことは、
**・導入ハードルを下げること**
**・形骸化リスクを下げること** の2点です。

一つずつ説明します。

#### 導入ハードルを下げる
新制度の導入は、会社や現場に少なからず負荷がかかります。
会社主導の提案ならある程度許容できるかもしれませんが、今回は「新卒入社1年目現場社員」の提案。さらに、今まで目立った不満が出ていなかった「新人教育」に関する制度となると、導入まで持っていくことはかなり難しいのではと考えていました。
そこで、「導入のためにしなければならないこと」をできるだけ終えた状態で提案し、導入ハードルを極限まで下げるようにしました。

新制度導入のためにしなければならないことは、
**・制度内容の設計
・導入計画の策定
・関係者との調整**
などが挙げられます。

今回は、**「制度設計・導入計画案を提案書に盛り込む」「関係者との調整に自分も携わることを伝える」** ことで、上記の負担をなるべく巻き取り、スムーズに導入に進めるようにしました。

また、導入計画案の策定でも、なるべく会社の負担や懸念を減らすことを意識しました。
**・初年度はトライアル導入とし、その効果をもとに改めて導入可否を判断することを提案**
いきなり本導入としてしまうと、より確実な成功を担保する必要があり、制度検討の長期化や心理的ハードルの高さから導入が遠のいてしまうと考えました。
そこで、初年度はトライアル導入とすることを提案。
さらに、「導入推進チーム」を立ち上げ、トライアルを通した制度ブラッシュアップや効果検証・改善を行うとすることで、「まずはやってみよう!」という方向に持ち込みやすくしました。(ただし、評価の基準は導入段階で明確にしています)

**・自身が初年度メンターや導入推進を担当することを前提に提案**
「提案しておわり」という姿勢では、面倒事を丸投げすることになり無責任に感じます。
「初年度のメンター」「導入推進チームのメンバー」など、導入に際し負荷がかかりそうな部分に自分の名前を挙げておくことで、自分の提案に責任を持っていること、本気で導入したいことが伝わればいいなと考えていました。
初年度メンターに関しては、導入推進と兼任することで制度の評価検証をより効率的にしたかった狙いもあります。

#### 形骸化リスクを下げる
メンター制度を導入している企業は多いですが、実際には形骸化してしまっているというパターンが一定数あると知りました。
今回の導入はOJT制度の(やや)形骸化がもとになっていることもあり、これは他人事ではないと感じました。
そのため、制度設計においては、**関係者全員の役割を明確にすること**を意識し、全員が当事者意識をもって取り組んでもらえるようにしました。
詳細は書けませんが、「メンター(伴走者)」「OJT担当(教育者)」「会社(運営者)」の3つの役割が担う仕事と責任範囲を明確に記すことで、それぞれが適切に動けるような制度としました。

制度の形骸化は、**制度内容の曖昧さ**が引き起こすものだと思っています。
今回の提案では、なるべく曖昧さを排除した状態で物事を記載し、一部私が判断できない点についても会社と認識をすり合わせ、確実にした状態で導入できるようにしました。

## おわりに
こんな感じのことを意識して提案しました。
導入決定まで至ったのは会社側の協力があったからこそですが、こうした意識も少しは貢献したのかなと思っています。
ただし、この制度はこれからが本番です。
来年の本導入に向け、トライアル期間を通じて制度のブラッシュアップを図っていこうと思います。
ここまで読んでいただき、ありがとうございました!
【応用情報】DNSリソースレコード

## はじめに
応用情報技術者試験で出てくるDNSリソースレコードについてまとめてみました。

## DNSリソースレコード
　DNSサーバ（権威DNSサーバ）は、自身が管理するゾーンの情報をテキスト形式で定義し、ゾーンファイルと呼ばれるファイルで管理しています。ゾーンファイルには、任意のホストを指し示すドメイン名（FQDN : Fully Qualified Domain Name）に対し、そのIPアドレスを定義するAレコードのほか、ホスト名の別名を定義するCNAMEレコードなど様々な種類の情報（リソースレコード）が定義されます。代表的なものを下記にまとめておきます。

## Aレコード
ホスト名に対応するIPアドレスを定義
（例）
www.example.jp. IN A 100.1.1.1
dns.example.jp. IN A 100.1.1.2

## CNAMEレコード
ホスト名の別名（エイリアス）を定義
（例）
www.example.jp. CNAME backup.example.jp.

## NSレコード
DNSサーバを定義
（例）
example.jp. IN NS dns.example.jp.

## MXレコード
メールサーバを定義
（例）
example.jp. IN MX **10** mail1.example.jp.
example.jp. IN MX **20** mail2.example.jp.
　　　　　　　　 **↑優先度：小さい方を優先**
                    

## 終わりに
ここまで読んでいただきありがとうございます！

## 参考文献
令和06-07年 応用情報技術者 試験によくでる問題集【午後】 単行本（ソフトカバー） – 2024/3/22
大滝 みや子 (著)
p.318