ソフトウェア探訪記

ITの「なぜそうなのか」、「なにがそうなのか」を中心にあなたのIT投資をサポートします。

公開鍵証明書とは何か - CA署名の仕組みを理解する

きっかけは「なんとなく使ってるファイル」への違和感

これらのファイル。 xxxx.crt xxxx.p12 クライアント認証を設定するとき、HTTPS化するときも、気づけば当たり前のようにこの手のファイルを扱っていますよね。

「証明書を配置してください」「証明書をインポートしてください」という手順書通りにやれば動くし、それで済ませがちですよね。

証明書を使うと、なぜか完全性の証明になったり、認証ができたりしますが、「らしい」というのが正直なところで、少しあやふやなまま過ごしていて、仕組みを人に説明したこともありませんでした。

というわけで、X.509(RFC 5280)に沿って、証明書の中身を解釈してみることにしました。

証明書の中身は、3つ

証明書の中身は、

  1. 公開鍵の文字列
  2. 属性情報(公開鍵の主体者情報や有効期限、シリアル等)
  3. 1と2に対する、第三者による署名

だけみたいです。それぞれ確認していきます。

1. 公開鍵

まず、公開鍵は公開鍵暗号方式におけるキーペアの片割れです。秘密鍵と公開鍵のうち、みんなに知られてもいい方(知らせる方)ですね。

生成したキーペアのうち、公開鍵がべたーっと書かれます。それと公開鍵のアルゴリズムの情報(キーペアを生成したときのアルゴリズム)も書かれるようです。

公開鍵が単体で存在しているとき、拡張子は.pubや.pemで見かけることが多いです。ただし.pemは「公開鍵専用の形式」というわけではなく、Base64でエンコードされたコンテナ形式そのものの名前で、公開鍵・秘密鍵・証明書・証明書チェーンのどれもが.pemになり得ます。中身が何かは、ファイルを開いて-----BEGIN ...-----というヘッダー部分を見ないと判別できない、というのが実態に近いです。

.p12もよく見かけますが、これは秘密鍵+証明書(場合によっては中間証明書のチェーンも)をパスワードで保護しつつひとつにまとめたファイル形式です。公開鍵を持ってるっちゃ持ってるけど、.pubや.pemとは用途が違う、と考えたほうが実態に近いと思います。

.p12は、クライアント端末に秘密鍵とそれに対応する証明書をインポートするためのファイル形式(PKCS#12)です。

2. 属性情報・メタ情報

バージョン、シリアル番号、有効期限、発行者(署名した人)、主体者(使う人・ドメイン名等)などが書かれます。

この属性情報がどう使われるのかは、単体で見てもいまいちピンと来ないと思いますが、RADIUSのEAP-TLSでのクライアント証明や、TLS(HTTPSとか)でのサーバ証明の流れを追ってみると、急に「あ、ここで使うのか」と繋がってくると思います。対話式でない認証でも、証明書が活躍している場面は意外と多いです。

それだけだと「言ってるだけ」なのでは

証明書を用いた処理では主に①と②の部分を使うため、中身としてはこれで充分に思えますが、問題があります。それは、証明書の中身が改ざんされていないかがわからないことです。

状況で言うと、「身分証として免許証を提出したが、客が自分で書いたものなので本物か不安である」ということです。本人性の認定を行う認証の文脈で、これはキツいですよね。

なので、証明書には①と②のほかに

  • 改ざんされていませんよ
  • この証明書を認めます

という要素が必要になります。これが3つ目の要素、署名です。

3. 第三者による署名

署名による効果は先述の2点です。

  • 改ざんされていませんよという印
  • この証明書を認めますという印

それぞれ確認していきましょう。

改ざんされていませんよという印

まず、改ざんされていない、つまり完全性について確認していきます。

署名の仕組みでは、公開鍵と属性情報に対してハッシュ化と数学処理を行った結果を用いて担保します。公開鍵か属性情報が1バイトでもズレると、ハッシュ化・数学処理ともに結果が大きく異なることになります。

なお、数学処理の際には、これまで用意したキーペアのほかに、発行者側の秘密鍵(CA鍵と呼ぶ)を用います。これが署名の肝です。

ざっくりとした署名の作り方はこんな感じです。 (アルゴリズムによって計算方法は異なります。下記はRSAの例です)

  1. 公開鍵と属性情報をバイト列になおす
  2. バイト列のハッシュ値を出す(SHA-256など)
  3. ハッシュ値をもとに、発行者のCA秘密鍵と署名アルゴリズムを使って署名値を計算する
  4. できた署名を証明書にくっつける(と、.crt/.pemになる)

ここで一点補足です。RSAの場合は「ハッシュ値を秘密鍵で暗号化する」という説明がよくされ、実際そのイメージに近い処理です。ただしECDSAの場合はこのモデルは当てはまらず、まったく別の処理になります。「秘密鍵を使って署名値を計算する(アルゴリズムごとに計算方法は異なる)」くらいに捉えておくのが正確です。

公開鍵や属性情報が1バイトでも改ざんされていたらハッシュ値が変わってしまうので、署名検証時に不一致となり、すぐわかる仕組みになっています。

署名検証はこんな流れです。主に、送られてきた証明書と、署名に用いたCA秘密鍵とキーペアの関係にある公開鍵を用いて検証を行います。

  1. 受け取った証明書を「公開鍵と属性情報の本体部」「署名アルゴリズム」「署名値」の3つに分解する
  2. 「公開鍵と属性情報」からハッシュ値を計算する(Aとする)
  3. 証明書の発行者情報を確認し、対応するCAの公開鍵を用意する(すでに信頼しているCA証明書から取り出す)
  4. 証明書についている「署名値」とCAの公開鍵を使って検証用の値を計算する(Bとする)。RSAの場合は署名値をCAの公開鍵でべき乗演算すると、秘密鍵で暗号化する前のハッシュ値そのものが復元できます。ECDSAの場合は「復号してハッシュを復元する」というモデルにはならず、署名値(r, s)と公開鍵とメッセージハッシュを使った検証式を計算し、その結果が一致するかを見る、という違うプロセスになります
  5. AとBが一致すれば、改ざんされていない証明書であるということが担保される

なお、このCA公開鍵は事前に署名検証する側に登録が必要です。基本的に事前インストールされているのは「ルート証明書」で、その中の公開鍵を使います。中間証明書は通常、TLSハンドシェイクの際にサーバー側が送ってくるので、あらかじめ端末に入っているわけではありません(ブラウザやOSの実装によっては、一度見た中間証明書をキャッシュすることもありますが、それは補助的な挙動です)。もしルート証明書も中間証明書もない場合(自分で作ったCAで署名した場合など)は、手動で証明書をインポートする必要があります。

ハッシュを突き合わせるだけで改ざんの有無と第三者の認証が同時に証明できるっていうのはよくできてるなと思う。数学者たちが積み重ねてきた努力やチャレンジ、神秘を感じます。

認めますという印

次に、証明書の発行プロセスに工夫を入れると、たとえば「ドメインの所有者であることを認めます」だとか「この組織は実在します」といったことも証明書で表現できます。ドメイン名だけを確認するDV、組織の実在性まで確認するOV、さらに厳格な審査を経るEVといった段階があり、確認済みの内容は証明書のSubjectフィールドに実際の属性として書き込まれます。

つまり証明書とは

証明書は、キーペアのうち、公開鍵の完全性や真正性を証明することに用いることができます。 キーペアが数学的につながっていることを利用し、特定の計算を仕掛けることで検証できるからです。

また、この記事では触れませんでしたが、認証にも用いることができます。 証明書にメールアドレスとかユーザー名を書けるのでIDになるし、秘密鍵つまりシークレットな情報を「所有」しているという点で、ID/PWを入力しているのに近い状態と言えます。 ただし決定的に違う点もあります。ID/PW認証では秘密(パスワード)そのものをネットワーク越しに送信しますが、証明書ベースの認証(TLSクライアント認証など)では秘密鍵そのものは一切送信されません。サーバーから送られたチャレンジに対して秘密鍵で署名を返すだけで、「秘密鍵を持っていること」を証明します。盗聴されても秘密鍵自体が漏れることはない、という点でパスワード認証より本質的に安全な仕組みです。

これは公開鍵認証方式(チャレンジレスポンス)というものです。そのうち書きます。

とはいえ、秘密鍵と証明書のファイル自体を盗まれると、それだけでとてもラクチンに不正アクセスが可能になってしまいます。
なので、いろいろな対策が必要になります。それはまた別のお話。

共有IDの利用者を特定する方法【Try SCS:4-1-1-2 / 4-1-2-2】

はじめに

SCS評価における下記基準項目を満たすための手法をTryしていきます。
この記事は特定の企業から報酬をもらっているわけではなく、たまたま手元にあるソフトで試しているだけです。
また、別解などもあると思うので、鵜呑みにせず皆様の歩幅にあった選択をしてください。

本記事の対象

4-1-1-2 評価基準

  • ユーザIDの共有について、以下のいずれかを適用すること。
    • ユーザIDを共有しない。
    • やむを得ず共有IDが必要な場合(例えば、システムの仕様により、使用人数分のユーザIDを発行することができない場合)は、共有IDを利用したユーザを特定できるようにする。

4-1-2-2 評価基準

  • 管理者権限を付与する役員、従業員、派遣社員及び受入出向者を限定したうえで、管理者IDについて以下のいずれかを適用すること。
    • 管理者IDを共有しない。
    • やむを得ず管理者IDの共有が必要な場合(例えば、システムの仕様により、使用人数分のIDを発行することができない場合)は、共有の管理者IDを利用したユーザを特定できるようにすること。

20260327001-cより抜粋

これを、下記のように解釈します。

「原則、アカウントの共有はしないこと、せざるを得ないなら、共有の管理者IDをいつ、だれが使ったか特定できるようにすること。」

アプローチ方法をいくつか考えました。

1. 台帳化

土臭くいく方法です。
IDと利用時刻と利用者をメモします。
共有IDを割り振られているユーザーは利用時にそこに追記する形を取ります。
これはスプレッドシートとか、ドキュメントを作成して終わるので安上がりですが、一方で、「うっかり書き忘れた」とか「悪意をもって書かなかった」ということが生じます。

2. パスワード管理ツール使う

エンタープライズパスワードマネージャ(EPM)を利用して、共有IDを管理する形にします。
各ユーザーのレコードへの操作は記録され、管理者から確認できます。
下記情報を揃えれば、当該時間帯にパスワードを何かに利用したユーザーの候補を挙げることができます。

  • レコードID
  • サインイン日時

そういった情報から総合的に利用したであろうユーザーの候補を絞り、ヒアリングを行って特定する、という段取りです。
IdPやCASBなどのログと併せて完成させるイメージですね。

本記事ではKeeperの環境が手元にあるので、Keeperで試します。

やってみる

  1. Keeper 管理コンソールにアクセスし、「レポートとアラート」を開き、「最近のアクティビティ」を開きます

  2. 「フィルター」のイベントタイプより、「一般的な操作」から「パスワードをクリップボードにコピー」、「レコードの自動入力」を選択し、「適用」をクリックします。

  3. 画面にどのユーザーがどのUIDのレコードを利用したかが表示されます。

  • 管理コンソール上からはUIDがどのログインIDのレコードかということは確認できなかった点に注意してください。そのため、アカウントを探す時にはレコード保有者からレコードIDを聞く必要があります。
  • ログはデフォルトで30日しか保存されません。オプションの「高度なレポートとアラートモジュール」が必要です。1アカウントあたり150円だそうです。
  • Keeperでは、Keeper Commanderを用いて、気合で自前取得もできなくはないと思いますが、150円×ユーザー数支払って、SIEMやログ収集サーバに飛ばすのが良いと思います。

弱点

この手法は「パスワードを暗記してサインインする」といったケースでは、Keeper上にログがつかなくなります。
そのため、ユーザーが覚えられないようにする対策が効果的なのかなと思います。
つまり、共有アカウントのパスワードは複雑かつ長いパスワードにしておけると良いと思います。
また、誤認しやすい文字・数字(0とO、Iとlなど)もふんだんに使ってもいいかもしれません(万が一手動入力する時はめんどくさいですが)。
入力は結局コピペか自動入力で行えるので、手動での利便性は下げたほうがいいんじゃないかなと思います。

3. その他の手法

思いついたけど、ちょっと有り得ないかもなぁ、という手法も備忘録として残しておきます。

  • 契約しているすべてのSaaSでSAMLやOIDC等でSSOを構成し、IdPのサインインログとターゲットリソースから特定する
    • もしかしたらできるのかもな、とも思ったんですが、SAML/OIDCでのSSOに対応してないSaaSも多いので現実的じゃないと断念。環境によっては実現可能性はありそうです。

そもそも、対象の「共有アカウント」がSaaS以外も出てくる可能性を考えると、やはり違うかもなぁという気持ち。EPMを用いた手法が現実的か。

まとめ

  • 共有アカウントはSaaSに限らずインフラ機器やローカルアカウントなど多岐にわたるため、SSO前提の手法(3)は範囲が狭い。
  • 対象を選ばず記録を残せるEPMを軸に、IdP/CASBログで補完するのが現実的。
  • ログの保管期間は要注意。SCS評価制度にログ保管期間の定めはないが、4-4-3に合わせて6か月保管する場合、SIEMとの連携が必要。

というのが今の結論です。


他にもこういったSCS評価制度で、こうやったらこの項目達成できるんじゃないですかね?といった試行錯誤を書いていきますので、良ければブックマークしてください。
そのうち記事が溜まったら、違う形態でお披露目していきたいなと思ってます。

VPNとZTNAって何が違うの?「毒沼」で考えるセキュリティの新常識

リモートワークが当たり前になった今、「会社のシステムに外からアクセスする」場面がぐっと増えました。
そのときによく使われるのが VPN という仕組みです。でも最近、ZTNA(ゼットティーエヌエー) という新しい考え方が注目されています。
いったい何が違うのでしょうか?

VPNは社内ネットワークに入る仕組み

VPNを使うとき、あなたのパソコンはまず会社のネットワーク(LAN)に接続します。
ネットワークに入ってしまえば、あとは社内にいるのと同じように業務システムが使える、というイメージです。
シンプルで便利な反面、ひとつ気になることがあります。それは、「ネットワークに入る」という行為そのものにリスクがある、ということです。

ネットワークは「毒沼」かもしれない

少し想像してみてください。
あなたが使いたいシステムは、広大な沼地の真ん中にある小屋だとします。
VPNでは、その小屋にたどり着くために毒沼かもしれない沼地に足を踏み入れる必要があります。
普段は安全でも、どこかに毒が潜んでいたら? 
知らず知らずのうちに危険にさらされてしまいます。

そしてこれは、会社のLAN側から見ても同じ問題です。
「外からやってくる人が、ウイルスに感染したパソコンを持ち込んでくるかもしれない」という不安があります。
社内のシステムに悪意のあるものが紛れ込んでしまったら、被害は一気に広がりかねません。
つまり、お互いに相手を信用しきれないという、双方向の不信が存在するのです。

これがまさに「ゼロトラスト(何も信用しない)」という考え方の出発点です。

ZTNAは「沼に入らずに小屋を使う」仕組み

この問題を解決するのが、ZTNAです。
ZTNAでは、会社のネットワーク全体を公開するのではなく、使いたいアプリ(システム)だけをピンポイントで公開します。
社内のLANには「コネクターサーバー」と呼ばれる中継役を置いて、そこを窓口にして特定のアプリだけを外に届けるイメージです。
利用者側は、専用の「エージェント」というソフトをパソコンにインストールします。
アクセスの際には本人確認(認証)がしっかり行われるので、許可された人だけがアプリを使えます。
結果として、

  • 利用者は毒沼に足を踏み入れることなく、必要なシステムだけを使える
  • 会社側は怪しい来訪者をネットワークの中に入れることなく、サービスだけを提供できる

という、双方にとって安心な環境が実現します。


「ネットワークに入る」から「アプリに直接つながる」へ。ZTNAはそんな発想の転換から生まれた、これからのセキュリティの形です。

Cisco 2960(無印)を買ってしまったので、分解して理解することにした話

先日、ついに
「自宅にも VLAN が必要だぞ」と思い立ち、
Cisco Catalyst 2960(無印)を購入しました。

無印

これは明らかな失敗でした。

なぜなら、無印は 100Mbps まで。
完全にやってしまったな、というやつです。

とはいえ返品するわけにもいかず、
「じゃあ、別の価値を引き出そう」ということで、
知り合いを集めて分解大会を開催することにしました。

Sさん、Iさん、Kさん、ありがとう。

スイッチをつつくネットワークエンジニアたち(ぼくはネットワークエンジニアじゃない)

この記事では、その分解の様子と、
そこで得られた気づきをまとめます。

そんなわけで、分解の模様をお届けします。

※ 本記事は、 基板や IC チップに詳しくない人間がChatGPT と会話しながら観察した内容です。
話半分で読んでください。

まずは分解してみる

背面のネジを外すと、上蓋はあっさり外れます。
中身は思ったよりシンプルでした。

  • 電源基板
  • メイン基板
  • ファン

大きな構成としては、ほぼこれだけ。

上蓋を外したところ

「Cisco Systems」のチップ

基板を見て、真っ先に目を引いたのが
「Cisco Systems」と刻印された ICと、その周囲のメモリ。

調べてみると、これは管理系(CPU側)の ASICらしいです。

周囲には、

が配置されています。

Cisco SystemsのICチップ周り

RAM と Flashの役割(おさらい)

  • Flash
    • IOS
    • startup-config
    • 電源を切っても保持される
  • RAM
    • running-config
    • 電源を切ると消える

ASIC(というか管理CPU)は RAM 上の情報を使って動作するため、
running-config は RAM に存在します。

つまり、

copy running-config startup-config

とは、 「RAM 上の設定を Flash に保存しよう」という操作。

スイッチやルータといえど、
こういった動作を見ると「パソコンに似たようなものだなぁ」だと実感します。

ポート上にある Broadcom チップの正体

次に気になったのが、
ポートモジュールのすぐ上にある Broadcom の IC。

これは Ethernet PHY IC だそうです。
型番は BCM5248UA2KQM と思われます。

Ethener PHY ICチップ

Ethernet PHY IC の役割

PHY は L1(物理層)担当で、
LAN ケーブルの電圧変化を受け取る

  • 等化・増幅・ノイズ除去
  • クロック同期
  • ビット化(0 / 1 に変換)

といった処理を行うそうです。

また、

も PHY の仕事。

ここで「電気の世界」と「デジタルの世界」が変換されているんだと解釈しました。

PHYの数と、ポート障害の考え方

この 2960 では、

  • 12ポート(6ポート×2段)のモジュール × 2
  • Ethernet PHY IC は 3つ

という構成になっています。

最初は
「ポートモジュール単位で故障を考えればいいのでは?」
と思いましたが、構造を見るとそう単純でもなさそう。

ポート単体 → 次の障害単位は PHY IC

という見方のほうが現実的だと感じました。

「モジュールで分かれているから安心」
とは限らない、というのは地味ですが大きな気づきでした。

ヒートシンク下の正体(スイッチASIC)

次に気になったのが、大きなヒートシンク。

……が、
グリスが固着して外せませんでした。

そこで ChatGPT に相談。

どうやらここは スイッチ ASIC らしいです。
型番までは確認できませんでしたが、
以下の Broadcom 系が候補として考えられるそう。

  • BCM5650
  • BCM5651
  • BCM56514 系

スイッチASICまわり

スイッチ ASIC がやっていること

データシートを見ると、

  • L2 スイッチング
  • MAC 学習
  • VLAN
  • STP
  • QoS
  • 内部 SRAM

などを内包。

これらを CPU 上の OS ではなく、専用回路で処理するため、
ソフトウェアルーターより高速になるわけですね。

ASIC の目線からすると、
「CPU、無駄な動き多すぎでは?」
と言われても仕方ない気がします。

ASIC 周辺のメモリ配置

ASIC のすぐ周囲に、複数の IC が配置されているのも印象的でした。

おそらく、

  • パケットバッファ
  • 内部テーブル用のメモリ

でしょう。

配線距離が非常に短く、
「ここに置く意味」が物理的にも伝わってきます。

アップリンクポート周りを観察する

アップリンクポートの直後には、
IC が 2 つ並んでいます。

最初は PHY かと思いましたが、
型番 824-M0060R を調べると 磁気トランス とのこと。

Ethernet 規格では、

  • 装置とケーブルの電気的絶縁
  • 1500Vrms 以上の耐圧
  • コモンモードノイズ抑制

が求められるそうです。

つまり、
PHY IC だけでは規格を満たせないということ。 (通常ポートはRJ45コネクター内に内蔵している・・・らしい)

これもポート経路上にあるため、
当然ながら故障点になり得ます。

普段からマニュアルや教本はよく読みますが、 実物を見ながら考えると、
「冗長化」という言葉の解像度が
一段上がる感覚があります。

アップリンクポート周り

そんなこんなで大の大人が4人揃って機器の分解を楽しみました。

その他、良かったこと

ミニチュアが活躍した

分解後の雑談で、
ミニチュアを使って普段のプロジェクト経験の話や、構成をざっくり組みながら話してみました。

これまでは
「PowerPoint でよくない?」
と言われがちだったのですが、

今回は反応が一変。

やはり 立体で触れる というのは強いですね。
もっと普及させたいです。

ASIC がなんとなく理解できた

「専用の役割だけを持つ IC」という言葉が、
今回かなり腹落ちしました。

  • 命令を解釈するのではなく
  • 回路を流すと結果が出る

この感覚が掴めたのは大きい収穫です。

全体的に

今回はかなり勢いで観察していたので、

  • 解釈違い
  • 順番の誤認

などもあると思います。

次はデータシートをちゃんと読みながら
もう一度観察したいところ。
(詳しい人、教えてください)

今後

  • Ethernet の信号処理を、もっと正確に理解したい
  • PCIe 拡張 NIC を観察してみたい

「眺める」のと「観察する」の違いを、
強く実感した一日でした。

今日は収穫が多すぎて、
脳疲労が段違いです。

この辺で終わります。

ミニチュアについて

話していて思ったのですが、
ルーター・スイッチ・サーバーの色バリエーションは増やしたほうが良さそう。
……モデル、作ろっと。

ITミニチュア研修:若手向けのインフラ学習体験

昨日、若手向けの研修をやってみた。

この研修は、
ITのミニチュア(サーバとか)を使って勉強したら、もっと分かりが良くなるんじゃないか?
という仮説を検証するためのもの。

参加者は若手のS君。
妻の旧姓と同じ苗字なので、勝手に親近感が湧いている。

学生時代は運動に打ち込んできたタイプで、
僕みたいな引きこもりパソコン厨とはだいぶ毛色が違う。
それでも、ITを1からちゃんとやろうとしてくれているのが分かるので、一緒にやっていて楽しい。

この研修でやりたいこと

狙いはシンプルで、

インフラの構成をミニチュアで説明したら、分かりやすいんじゃね?

という一点。

たとえば、

  • クライアントがインターネットに出ていくまで
  • プロキシとクライアントの役割
  • Web / AP / DB の分け方

こういう話は、ホワイトボードやPowerPointではよくやる。
いわゆる、よくある説明。

でも実際には、

  • この順番だよね~
  • ここで分かれるよね~

みたいな話を、積み木で遊ぶように確認することはできない。
そこを、手元に「それっぽいもの」を置くことで、
何か変わらないかな、というのが今回の試み。

ということで、大枠のストーリ―としては、
インフラデザインパターンに乗ってるものを実際に手元に置いてみていろいろ感じてみようか。
だったり、マスタリングTCP/IPを見て、
パケット通信を再現してみようぜ。みたいなところを想定しています。

gihyo.jp

www.ohmsha.co.jp

とりあえずやってみた

というわけで、某所にS君を呼びつけて、早速試してみた。

本当は、いわゆるWebの3層構造の説明をするつもりだったんだけど、
僕があれやこれや気になっていろんな話をしていたら普通に時間を食った。 これは想定通りでもあるので、とりあえずその時の話をメモしておく。

パソコンの拡張スロットと、PCIeの話

ITミニチュアを渡して、まずは眺めてもらった。 一応それっぽくデザインしてあって、

  • 電源が二つあったり
  • RJ45っぽい形があったり
  • フロントにボタンみたいなのがあったり
  • SSDなのかHDDなのかわからん溝が掘ってあったり という感じ。

それを見ながら、あれこれ説明していたら、案の定、いろんな質問が飛んでくる。 さすがS君。

こんなやりとりをした

❓オンボードNICがあるのに、拡張スロットでNICを刺す意味が分からない

→ ネットワークの冗長化とかセグメントを分けたい時に使うんだよ
 これがのちに「セグメント何」ってことにつながる  

帯域の話とか、セグメントの話をしました

❓これ、NIC以外にも刺せるの?

→グラフィックボード、サウンドカード、Wi-Fi・Bluetoothとか。拡張スロットに収まれば大体なんでも刺せるね。構造的には自作もできそうだよね。

他にもいろいろ話したけど、この時点で感じたのは、

PowerPointや紙芝居では出てこない質問が出てくる

ということ。
手元に「観察できるモノ」があると、自然と「これ何?」が生まれる。
(もちろん、S君の筋がいいだけの可能性もあるけど)

セグメントの話

ここで、完全に見落としていたことに気づいた。 S君とはSaaSインプリの仕事を一緒にやっていて、

みたいな話は、わりとやってきた。

一方で、

  • サーバを作る
  • ネットワークを組む

という経験は、この1年ほぼ無かったなと。

つまり、

3層構造の前に、セグメントとルーティングの話が要る

ということ。

もしPowerPointを作り込んでいたら、
この時点で「今日はここまで」になっていたと思う。

でも今回は、手元にミニチュアがあったので、

  • ネットワークセグメントとは何か
  • ルーティングとは何か

という話に、そのまま切り替えることができた。

これも気づきにくいが、大きな価値だなと思った。
S君にも説明しきれるし、準備も無駄になりにくいし、非常に良かった。

ミニチュアとあれやこれや説明していた跡

本題:3層構造の話

最終的には、Webの3層構造の話にたどり着いた。

  • Web / AP を同居させるとどうなる?
  • なぜ分けるのか?
  • 分けた上で、DBの足をバックアップ用に伸ばすのはアリだよね

みたいな話を、インフラデザインパターンの本を見ながら、
ミニチュアに置き換えて進めていった。

このあたりは、かなり入りが良かったと思う。
正直に言うと、S君に教えながら、自分の中でも整理が進んでいく感覚があった。
これ、教える側にとっても、かなり良いトレーニングだ。

ふと思ったけど、 本を読みながら一手一手再現していく感じは将棋の勉強に近いのかもしれない

その後

翌日、S君からpowerpointが送られてきた。 研修で話した事項をまとめてくれていた。
特に、ここが大事だなと思ったところは抑えられていてよかった。
きっと僕が資料を用意してたら多分作られなかったんだろうなと思う。 彼の行動を喚起できたのも、良い結果だと思う。

まとめ

今回やってみて、次にやりたいことがだいぶ見えた。

新たに作りたいもの

次取り上げたい研修内容

  • ルーターを置いて、ルーティングをもうちょっと真面目に。
  • プロキシ構成

もっと先だけど、やりたいこと

インフラやシステムの「動き方」を、 このミニチュアで再現しながら、ガシガシ育成していきたい。 たぶん、まだ面白くなる!

トークン単価を最適化して新しいモデルをあきらめたくない

生成AIを活用したアプリを作っています。その中での気づきです。
基本的にはChatGPTくんに書かせてるのでコード的なアレコレは書けませんが、「工夫」の話をメモしておきます。
なるべくサービスには最適なモデルを利用したいですが、利用料金のせいで違うモデルを選ばなきゃいけないってなると悲しいです。
良いサービスを作るために、良いモデルを使う。そのためにコストを削減するという観点でプロンプトについて考えます。

1. 入力プロンプトは英語で書く

なるべく入力プロンプトは英語で書くと良いです。
日本語でプロンプトした時と比べて、だいぶ削減されます。

日本語の場合

■入力プロンプト (11トークン)
このブログを読み込んで、要約してください

英語の場合

■入力プロンプト(8トークン)
Please read this blog and summarize it.

2. 入力プロンプトは能動文で書く

動作に影響ない範囲で無駄な言葉はなるべく減らします。
米軍を見習って能動文が良いでしょう。
影響がない助詞などは積極的に削る良いです。
どこで言霊を感じられるか。を見極めることが大事です。

修正前

■入力プロンプト(8トークン)
Please read this blog and summarize it.

修正後

■入力プロンプト(4トークン)
Summarize blog

本当にこれだけ短くていいの?と思うかもしれません。
そこはあなたの環境で、どこまで省略しても問題ないかをチューニングしてみてください。

2. 出力はjsonやhtmlで出力し、再利用する

生成AIからの出力をまんま再利用しようとするとバラけるし、サーバ側で持っているような情報も再掲してくるので、トークン効率が悪いです。 例えば、

■入力プロンプト command:明日の天気を教えてください
location:Tokyo

■出力(56トークン)
明日、2025年5月6日(火)の東京都の天気予報は「雨」です。
これは、低気圧や前線の接近により、広い範囲で雨が予想されているためです。

とかされたらめちゃくちゃ重いわけです。 ここをどうにか匿名化したり、コード化するとトークン効率が良くなります。

■入力プロンプト command:明日の天気を教えてください
location:tokyo
filetype:json
format:{ w:X }
天気ごとの数字=[晴れ=0,雨=1,曇り=2]

■出力(7トークン)
{"w": 1 }

※日本語は平均1トークン ≒ 3.3文字を基にした推定

こうすることで、自然文によるトークンの増加を防ぐことができます。 ちゃんとした文の整形はサーバ側で実装すれば良いので、決まった言葉とか、フォーマットなんかを毎度出力させるくらいなら、構造体で出してパースしてサーバ側で利用するのがお得なんじゃないでしょうか。

まとめ

「プロンプトを英語にする」、「プロンプトに不要な表現を削る」、「フォーマット化していらない情報は出力させない」
この3つに尽きます。 お得に良いモデルを使いましょう!

自作キーボードはじめた vol1

はじめに

大西配列なる、日本語ローマ字入力に最適化された配列を見つけた。 左右分割キーボードが使いやすくなるっていうことで、まずは先に自作キーボードを買ってみた。

おさかなキーボードが一番いいなと思ったんですが、ユーザーコミュニティでのトラシュー見てると自分にはまだ早いなと思いCorneから始めようと思いました。

大西さんが製造終了する前に、FWをいじれる程度になればーーーとか思ってます。

あと人気すぎて売り切れてる。 かわいいしソウダヨネ。

で、今回作成したのがこちら。

俺のCorneV4 11/18時点

レシピ

Corne を選んだのは大西さんが開発中にCorneを使っていたことをきっかけに大西配列の練習にちょうどいいかな?って思ったことから。
製品名のcherryはキースイッチの互換モデルのことっぽい。他に、chocolateもあったけど、スイッチ互換が違うってことだと思う。

キースイッチはなるべく、今使っているRealforceに近いものにするために選びました。 キートップは遊舎工房のお店で購入したのでこれ以外に選択肢が無かったとです。

自作キーボードも初めてなので結構気づくことも多いです。

キーマップ

レイヤー0

レイヤー1

まだまだ使い始めなので、タイピング速度はでませんねぇ。。。 作者の大西さんのサイトでタイピング練習が実装されたので、それでちゃぷちゃぷしてます。

ちょっとしたチャットなら打てる感じですが、執筆が多い状況

組み立てについて

Corneの組み立ては4歳の娘に手伝ってもらえるくらいには簡単でした。えぇ。

今の気持ち

  • qwerty配列で左右分割キーボードは難しいなと思ったけど、大西配列とは結構共存できると思った
  • Enterキー、スペース、バックスペースの場所が難しい。Enterキーも親指のところに置きたいけど、backspaceとspaceの方が直感的。これはレイヤーしながらエンターでもいいかもしれないと思いつつも、Enterキーが二打になるのはなんかめんどくさい。自分、5文字入力したくらいでenterするので。 逆にタッチタイピングでご入力減るならそれでもいいか。
  • 上記の3つのキーのキースイッチは重めにしたい。
  • その他特殊キーの扱いが難しい。home/end/pagedown/pageupは多様するので、そこらへんも便利に使えるようにカバーしたい。でも今はまだ考えない。大西配列に慣れるのが先。 *ctrl/shift/esc/半角,全角はどうにかなる。
  • @などの特殊キーも考慮が必要
  • 色々課題洗ってくと思うけど、育成していくって感じなんですねぇ。 *十字キーは十字キーっぽく配置しないと使いづらい。viやvimバキバキの人はいいだろうけど、アタシはそうじゃないから・・・。
  • って言うかやっぱりテンキーの右端の十字キーとかナビゲーションキーの部分は別途作ってもいいかもしれない。Corneだけにこだわる必要はないかもな。1枚で完結するならそれでいいけど、自分の脳みそにはちょっと難しいかもわからん。

大西配列に惹かれた内容については、また次回などに。。。