自作キーボードをビルドして使う

08/29

モルモット

自作キーボードのあれやこれや

目次

きっかけ

最近、テレワークが多くなってきて、自宅環境での作業が多くなってきてからというもの、作業場の改善というかこだわりたくなってきた。
具体的には、テレカンのためのカメラやマイクの位置とか、ケーブリングとか、ディスプレイの数や大きさとか、プライベートと仕事の環境分離とか、開発環境とか。
そして、特に入出力デバイスについてはこだわりを持ちたいと思っている。

自作キーボードを作りたい

ここ1年のことの話にはなるが、マウスやキーボードを買いまくっている。

マウスだとELECOM
ELECOM M-DT1DRBK

キーボードだと、logicool
logicool K835 TKL メカニカル

あとはRedragonとか
Redragon K617

ROYAL KLUDGEとか
RK ROYAL KLUDGE RK61

あとは、マクロキーボード。

いろいろ欲が出てくるもので、あれもこれもポチポチしていたらこんな結果に。
ただこうだったらいいなみたいな、欲も出てきてついにキーボードを自作してみたいなという想いが募ってきた。
そう思い始めてきたのも、先日購入したRaspberry Pi Picoがキーボードのコントローラになることが分かっていたので、これはやるっきゃないと思い立ったわけ。

思い立ったが吉日

早速、作ってみたいという欲求に駆られたので、作りたいときが作り時とばかりにググってみる。

すると1から全部作ることもできるらしいのだが、先ずは何が必要かを一覧にしてみる。

材料

  • マイコン(ここではRaspberry Pi Pico)
  • 基板
  • キー数分の以下のパーツ
    • ダイオード
    • キースイッチ
    • キーソケット
    • キートップ
    • LED(オプション)
  • ゴム足(オプション)
  • キーボードケース
  • ねじ
  • USBケーブル(ここでは MicroUSB typeA <-> USB typeA)

道具

  • はんだ
  • はんだごて
  • こて台
  • ニッパー
  • ドライバー
  • テスター
  • ラジオペンチ
  • PC(開発環境&試験環境)

こんなところかな?
電気工作を苦ではない人たちには、めちゃくちゃ簡単に作れる。
そもそもキーボードの仕組みが単純で、制御はラズパイに任せられるので、非常に簡便にカスタマイズできるので自作キーボード製作初心者の私でもとっつきやすい。

さてやってみようではないか。
ということで


いってみよう。
やってみよう。

キーボードできた暁には、やーったやったたった、で・き・たーって踊ることとする。

理想

まずはどんなのが欲しいのか。
キーボードの理想を描く。

  • 61キーぐらいのコンパクトなやつ
  • 英語配列
  • 数字キーより上にキーは要らない
  • Enterキーより右にキーは要らない
  • Aの左は絶対Ctrl
  • 矢印キーは出来ればほしい
  • できればBluetoothのマルチ接続
  • 出来れば控えめに光ってほしい
  • 有線接続時のコネクタはできればUSB typeC

このくらいかな。
この前、左右セパレートタイプのやつを触ったときも非常に心地よかったのだが、完全なタッチタイピングが出来ないのでイライラしそうで止めた。

これが取り敢えずの理想。
これを自作できたらとりあえず嬉しいかな。
でも、最初からこのスペックはかなりハードルが高いので、先ずは試しにもっとコンパクトで簡単なやつを作ってみる。
出先でササッと出してパチパチできるコンパクトなのあったら何かと便利だと思うので、多分。
トランジスタなBodyも磨けば光りだすってね。

76th Star

30キー

さて、自作キーボードの登竜門でありメッカである遊舎工房TALP KEYBOARDを覗いてみたところ、かなりたくさんの種類の自作キーボードがある。
まずは何においてもキーボードの基板が全てのベースになってくるので選定は大事。
そこでよさそうなのを調べてみたら、Gherkin for RPPという基板が見つかった。
キー数は30キーで私がほしいものの半分、テストにはもってこい。
このキーボード専用ケースの3Dプリンタデータを公開されている方がいらっしゃっるので、こちらを使うのも手。

あとは、

こんな感じいけそうだな。
Picoは前に買っていて引き出しの奥に眠っているので、それ以外のものを調達することとする。
Ima get them all except rpp.

調達

ボス「もちろん装備は現地調達だ。」

スネーク「梅澤無線に行ってくる。」

ネイキッド

札幌は梅澤ぐらいしかないので、、、いや、流石にコロナの関係でそういうのは憚られる時期なのでネットで調達。

ただ、キーボードケースだけは3Dプリンタがないとダメだな、、って探したらDMM.makeというのを見つけた。
このサイトにレンダリングデータをアップロードして、成形する素材を選んで見積依頼するとすぐに金額を出してくれるので、その場でクレジット決済もでき、そのまま製作までしてくれるというめちゃくちゃ便利なサービス。
他にもこんなサービスあるのかもしれないけど、探していないのでよくわからない。

DMM.make 3D PRINT

組み上げ

さて物がすべて届いたら、組み上げてみる。
基板にハンデ付けするのは、ダイオードとキーソケット。
それと、もう他に流用することもないので、今回はラズパイと基板はハンデで固定してしまった。
そこまでの様子がこちら。

  • キーソケットとダイオードをはんだ付け
  • Picoをはんだ付け
  • キースイッチを差し込む

  • ブランクキーキャップをつけたとこ

  • DMM.makeのケースをつける
  • シリコンシートを底面につける(ゴム足と同じ効果)

これで一応ハード的な組み上げが出来た。

導通チェック

テスター使ってちゃんとハンダ付が出来ているか確認する。
I Don’t Like Mondays.の曲に合わせる(あ、今のBGMね)かのように、合いの手か声援のようにテスターでピーピー言わす。
うん、大丈夫そうだ。
ここ結構大事。

キーソケットというのはこんなにスカスカなんだっけ。
ちょっとした衝撃でスイッチが抜けてしまう。
本来はキャップとスイッチの間にカバーを入れるべきなんだろうな。
最初だからいいかいかイルカ、ハッ、るるるるるるるる。

開発環境構築

さて、ここからはソフト的な環境構築をしていく。

コントローラであるラズパイPicoにファームウェアを書き込む必要があるのだが、その環境を準備する必要があるのでそちらをサラッと紹介。

まずはRaspberry Pi Picoの仕組みとしては、起動にはファームウェアをインストールする必要がある。
インストールするには、本体にあるタクトスイッチを押しながら、PCとUSB接続することで、ファームウェアインストールモードになる。
PCがWindowsの場合はDドライブみたいなかたちでマウントされるので、そこのルートディレクトリにファームウェア(ここではuf2)ファイルを置くと自動的にファームウェアが起動される。

で、ここから大事。
ファームウェアの作り方が2種類あって、どちらも試してみた。

  • QMK Firmware
  • PRK Firmware

まずはQMKの方から。

QMK編

基本的にはこちらのSelf-Make Keyboards in Japanさんの記事を参考にしている。
ただ上記のサイトはrp2040対応をベースに紹介されているので、上記の記事の最後の方でも説明されているとおりカスタマイズが必要だと思う。
作業はWindows 11でWSL2を使っている。
ま、紹介するまでもないのでちゃちゃっと。

python3

gitとpython3がインストールされていれば以下のコマンドは不要。

$ sudo apt-get update 



$ sudo apt-get install git python3 python-pip



$

QMK

QMKとは主にキーボード用のファームウェアをビルドできる環境であり、以下を実行すると準備が完了する。

$ python3 -m pip install qmk



$ ls .local/bin/qmk
qmk
$

pico-sdk

pico-sdkはRaspberry Pi PicoのSDKでCやC++などで開発するためのプログラミング環境である。
以下の通り実行する。

$ cd ~
$ git clone https://github.com/raspberrypi/pico-sdk.git
$ cd pico-sdk
$ git submodule update --init --recursive
$ pwd | xargs -ICURDIR echo "export PICO_SDK_PATH="CURDIR |tee -a ~/.bashrc
$ bash -l
$ set |grep PICO_SDK
PICO_SDK_PATH=~/pico-sdk
$

QMK Firmware

ファームウェアのソース群。rp2040対応版。
こちらをgithubから頂く。

$ cd ~
$ git clone --branch rp2040 https://github.com/sekigon-gonnoc/qmk_firmware.git



$

ビルド

pipi_gherkinというキーボードのタイプが今回の対象。
ソース群は、QMK Firmwareの下にpipi_gherkinというのがあるのだが、こちらを使ってビルドしてみる。

$ cd ~
$ cd qmk_firmware
$ find keyboards/40percentclub/pipi_gherkin/ -print |sort
keyboards/40percentclub/pipi_gherkin/
keyboards/40percentclub/pipi_gherkin/config.h
keyboards/40percentclub/pipi_gherkin/info.json
keyboards/40percentclub/pipi_gherkin/keymaps
keyboards/40percentclub/pipi_gherkin/keymaps/default
keyboards/40percentclub/pipi_gherkin/keymaps/default/keymap.c
keyboards/40percentclub/pipi_gherkin/pipi_gherkin.c
keyboards/40percentclub/pipi_gherkin/pipi_gherkin.h
keyboards/40percentclub/pipi_gherkin/readme.md
keyboards/40percentclub/pipi_gherkin/rules.mk
$

このソース一覧を使う。
一度何も変更せずにビルドしていく。

$ cd ~
$ cd qmk_firmware
$ make 40percentclub/pipi_gherkin:default:uf2



$ ls -l |grep uf2
-rw-r--r-- 1 me me 94720 Aug 8 21:49 40percentclub_pipi_gherkin_default.uf2
$

出来上がったuf2ファイルを先述のインストール手順でコピペすると勝手に再起動されてUSBキーボード(HID)として認識されるはずなので、メモ帳とか起動して、パチパチしてみると。


いやいや、こんな指増やすほどキーないから。

動作チェック

全キー認識できているかを確認して入力テスト終わり。
次にケーブルを抜き差ししても問題なく認識されるか、別のPCに挿しても認識されるかを確認して動作チェック終わり。

ちなみに、このキーボードはキー数が少ないので少し癖のあるカブトムシ仕様である。
キーアサインは以下の通り。

Normal
Q W E R T Y U I O P
A S D F G H J K L ESC
Z X C V BS SPC B N M Ent

で、3行目のキーがそれぞれメタキーになっており、長押しで別のキーとして認識する。
長押しすると、

Macro Keys
Q W E R T Y U I O P
A S D F G H J K L ESC
Ctrl Alt FN3 FN4 FN2 FN1 FN5 ALT Ctrl Shift

こんな感じになる。
FN1~FN5はキーマップを動的に変更するキーになっており、例えばFN2を押し続けている間は以下のキーマップになる。

FN2
1 2 3 4 5 6 7 8 9 0
F1 F2 F3 F4 F5 F6 F7 F8 F9 F10
DEL FN2

なので、SPACE押しながらQって押すと1が入力されるって仕組み。
ちなみに:(コロン)は、V押しながらL
-(ハイフン、ダッシュ)は、C押しながらY
覚えるのが面倒かも。
でも、慣れたら最強になってくれるのかも。
そのタイピング音に耳を傾けて深い安らぎに酔いしれることができるのだろうか。

いろいろ問題が

Linuxターミナルでパチパチしようと思ったら、TABキー、ESCキー、Backspaceキー、Ctrlキー、SPACEバーをかなり多様するんだけど、このキーボードだとかなり苦戦しそう。

例えば

$ LANG=C find . -maxdepth 3 -type f -name "*.js" -mtime +3 -exec ls -l --full-time {} \; |awk '{"echo -n $(basename "$9")"|getline f; print f,$6,$7,$9;}' |sort |sed -e "s/\.[0-9]\{9\}//;s/^[^ ]* //" |tee /tmp/result.txt
$

このくらいの長さのコマンドを画面の前で考えながら打っているので、これと同程度のことを新しいキーボードでタッチタイピングできるためにはかなり練習しないと。
あと決定的なのが、CtrlがZのところに割り当てわれているので、Ctrl + Zができない。
ということは、LinuxでProcessをStopさせることができないし、WindowsでUndoができない。
あとは、普段キーアサインを変更してCtrlCapsとしているため、かなり使いづらさがある。

リビルド準備

ということで、現在のキーマップから変更できるかを試す。
現行ソースは以下の通り。
下のLAYOUT_ortho_3x10の引数がキーに当たる。
これを下の変更してちゃんと反映されるかを行ってみる。

qmk_firmware/keyboards/40percentclub/pipi_gherkin/keymaps/default/keymap.c

#include QMK_KEYBOARD_H

#define FN1_SPC LT(1, KC_SPC)
#define FN2_V LT(2, KC_V)
#define FN3_X LT(3, KC_X)
#define FN4_C LT(4, KC_C)
#define FN5_B LT(5, KC_B)
#define ALT_Z ALT_T(KC_Z)
#define ALT_N ALGR_T(KC_N)
#define CTL_M RCTL_T(KC_M)
#define SFT_BSPC RSFT_T(KC_BSPC)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

[0] = LAYOUT_ortho_3x10(
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_LCTL, ALT_Z, FN3_X, FN4_C, FN2_V, FN1_SPC, FN5_B, ALT_N, CTL_M, SFT_BSPC
),

[1] = LAYOUT_ortho_3x10(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
_______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______
),

[2] = LAYOUT_ortho_3x10(
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,
KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, KC_GRV,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),

[3] = LAYOUT_ortho_3x10(
KC_ESC, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
KC_TAB, _______, _______, _______, _______, KC_COMM, KC_DOT, KC_SLSH, KC_SCLN, KC_QUOT,
_______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),

[4] = LAYOUT_ortho_3x10(
KC_ESC, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
KC_TAB, _______, _______, _______, _______, KC_LABK, KC_RABK, KC_QUES, KC_COLN, KC_DQUO,
_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
),

[5] = LAYOUT_ortho_3x10(
KC_CALC, KC_WHOM, KC_MAIL, KC_MYCM, _______, _______, _______, _______, _______, KC_PSCR,
_______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC,
_______, _______, _______, _______, RESET, _______, _______, _______, _______, _______
)

};

行った変更は以下の通り。

Normal
Q W E R T Y U I O P
A S D F G H J K L Enter
Ctrl Z/Alt X/FN3 C/FN4 V/FN2 SPC/FN1 B/FN5 N/Alt M/Ctrl BS/Shift

うーんこれでも若干打ちづらいけど仕方ないかな。
あと、USBコネクタをキーボードの右側に置きたいので、上下反転させることにした。
変更箇所は以下の通り。

qmk_firmware/keyboards/40percentclub/pipi_gherkin/config.h

#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER 40 Percent Club
#define PRODUCT PiPi Gherkin

#define DYNAMIC_KEYMAP_LAYER_COUNT 6

/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 6

/* key matrix pins */
/*
#define MATRIX_ROW_PINS { 8, 9, 10, 11, 12 }
#define MATRIX_COL_PINS { 2, 3, 4, 5, 6, 7 }
*/
/* if u put USB port on the right side, */
/* use this instead */
#define MATRIX_ROW_PINS { 12, 11, 10, 9, 8 }
#define MATRIX_COL_PINS { 7, 6, 5, 4, 3, 2 }
#define UNUSED_PINS

/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

/* number of backlight levels */
#define BACKLIGHT_PIN B5
#ifdef BACKLIGHT_PIN
#define BACKLIGHT_LEVELS 3
#endif

/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5

/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE

#ifdef RGB_DI_PIN
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 0
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
#endif

リビルド

以下の通り。

$ cd ~
$ cd qmk_firmware
$ make clean
$ make 40percentclub/pipi_gherkin:default:uf2
$ ls -l 40percentclub_pipi_gherkin_default.uf2
-rw-r--r-- 1 me me 96256 Aug 26 16:00 40percentclub_pipi_gherkin_default.uf2

ちゃんとできているようなので、新しいファームウェアをコピーする。
キーボードのBOOTSELボタンを長押ししながらケーブルを接続する。
上記uf2ファイルをRPI-RP2ドライブにコピーしたら完了。
キーボードパチパチしてみる。大丈夫そうだ。

ちょっと慣れるまで時間がかかりそうだ。
でも、まぁ、完成したことに満足していたりする。

次は別の方法としてRubyによるファームウェア構築を紹介。

PRK編

さっきのQMKはCで作るファームウェアなのに対し、このPRKはRubyでうごくFirmware。
こちらも開発環境を用意してみる。
前のQMKはキーマップのソースを変更した結果はビルドしてuf2ファイルを作ってコピーして適用しないと分からなかった。
ま、Cのプログラムなので当然なのだが、対してこちらのPRKは一味違っていてuf2の更新は一度だけ。
その後はkeymap.rbを更新するだけでよい。
なんと便利な時代になったものだな。
思えば遠くへ来たもんだ。

開発環境を用意して、一からビルドしてもよいのだが、先の通りキーマップのファイルだけを更新するだけでよく、githubにファームウェアも公開されているので、今回はありがたく使用させていただくこととする。
今回は、prk_firmware-0.9.17-20220806-df5f361.uf2を使用する。

インストール

このファームウェアをRPI-RP2ドライブにコピーする。
するってーと、ファームウェアがインストールされリブートして、RPKFirmwareというドライブが自動的に出てくる。
で、ここにkeymap.rbをコピーしてケーブル挿しなおすと自動的にそのRubyファイルを解釈してくれてキーマップが適用されるという便利仕様。

で、このkeymap.rbというのは以下の場所に公開されている。

https://github.com/picoruby/prk_pipigherkin

$ cd ~
$ git clone https://github.com/picoruby/prk_pipigherkin.git
$ ls -l prk_pipigherkin/
total 2596
drwxr-xr-x 2 me me 4096 Aug 26 15:16 build
-rw-r--r-- 1 me me 3953 Aug 26 15:16 keymap.rb
-rw-r--r-- 1 me me 1071 Aug 26 15:16 LICENSE
-rw-r--r-- 1 me me 1106307 Aug 26 15:16 pipigherkin_2.jpg
-rw-r--r-- 1 me me 1529301 Aug 26 15:16 pipigherkin.jpg
-rw-r--r-- 1 me me 447 Aug 26 15:16 README.md
$

keymap.rbの中身はこんな感じ。

#Initialize a Keyboard
kbd = Keyboard.new

#Initialize GPIO assign
kbd.init_pins(
#[ 8, 9, 10, 11, 12 ], # row0, row1,... respectively
#[ 2, 3, 4, 5, 6, 7 ] # col0, col1,... respectively
#If you put USB port on the right side, use below instead
[ 12, 11, 10, 9, 8 ],
[ 7, 6, 5, 4, 3, 2 ]
)

#default layer should be added at first
kbd.add_layer :default, %i(
KC_Q KC_W KC_E KC_R KC_T KC_Y KC_U KC_I KC_O KC_P
KC_A KC_S KC_D KC_F KC_G KC_H KC_J KC_K KC_L KC_BSPACE
Z_LSFT X_LGUI C_LALT V_LCTL SPC_LOWER ENT_RAISE B_RCTL N_RALT M_RGUI UNDS_RSFT
)
kbd.add_layer :raise, %i(
KC_EXLM KC_AT KC_HASH KC_DLR KC_PERC KC_CIRC KC_AMPR KC_ASTER KC_EQUAL KC_PLUS
KC_LABK KC_LCBR KC_LBRACKET KC_LPRN KC_MINUS KC_LEFT KC_DOWN KC_UP KC_RIGHT KC_BSPACE
KC_RABK KC_RCBR KC_RBRACKET KC_RPRN ADJUST ENT_RAISE KC_BSLASH KC_COMMA KC_DOT KC_SLASH
)
kbd.add_layer :adjust, %i(
KC_F1 KC_F2 KC_F3 KC_F4 KC_F5 KC_F6 KC_F7 KC_F8 KC_F9 KC_F10
KC_F11 KC_F12 KC_QUOTE KC_DQUO KC_MINUS KC_LEFT KC_DOWN KC_UP KC_RIGHT KC_DELETE
KC_ESCAPE KC_LGUI KC_LALT KC_LCTL UNLOCK UNLOCK KC_RCTL KC_RALT KC_RGUI KC_ESCAPE
)
kbd.add_layer :lower, %i(
KC_1 KC_2 KC_3 KC_4 KC_5 KC_6 KC_7 KC_8 KC_9 KC_0
KC_TAB KC_NO KC_QUOTE KC_DQUO KC_MINUS KC_GRAVE KC_TILD KC_PIPE KC_COLON KC_SCOLON
KC_ESCAPE KC_LGUI KC_LALT KC_LCTL SPC_LOWER ADJUST KC_RCTL KC_RALT KC_RGUI KC_RSFT
)

kbd.define_mode_key :Z_LSFT, [ :KC_Z, :KC_LSFT, 150, 150 ]
kbd.define_mode_key :X_LGUI, [ :KC_X, :KC_LGUI, 150, 150 ]
kbd.define_mode_key :C_LALT, [ :KC_C, :KC_LALT, 150, 150 ]
kbd.define_mode_key :V_LCTL, [ :KC_V, :KC_LCTL, 150, 150 ]
kbd.define_mode_key :B_RCTL, [ :KC_B, :KC_RCTL, 150, 150 ]
kbd.define_mode_key :N_RALT, [ :KC_N, :KC_RALT, 150, 150 ]
kbd.define_mode_key :M_RGUI, [ :KC_M, :KC_RGUI, 150, 150 ]
kbd.define_mode_key :UNDS_RSFT, [ :KC_UNDS, :KC_RSFT, 150, 150 ]
kbd.define_mode_key :ENT_RAISE, [ :KC_ENTER, :raise, 150, 150 ]
kbd.define_mode_key :SPC_LOWER, [ :KC_SPACE, :lower, 150, 150 ]
kbd.define_mode_key :ADJUST, [ Proc.new { kbd.lock_layer :adjust }, :KC_LSFT, 300, nil ]
kbd.define_mode_key :UNLOCK, [ Proc.new { kbd.unlock_layer }, :KC_LSFT, 300, nil ]

kbd.start!

こんな感じ。キーマップを可視化したらこんな感じ。

PRK
Q W E R T Y U I O P
A S D F G H J K L BS
Z/Shift X/WIN C/ALT V/CTRL SPC/lower Enter/raise B/CTRL N/ALT M/WIN _/Shift

なかなか面白いキーマップ。
これはこれでとても便利な仕組み。

ただ、なぜか私のキーボードでは誤動作(特にメタキーを設定した3段目で)を繰り返すので、運用は出来なかった。

最後に

ま、兎にも角にも目的のことができたので踊ることとする。


コメント: