FC版 女神転生2の思い出

f:id:rymo:20170622154110p:plain

小学生の頃、ファミコンが大好きで毎年の誕生日にはだいたいファミコンカセットを買ってもらっていた。
年に1,2本買ってもらい友達とも貸し借りしてゲームを楽しんでいたけど、それだけでは足りずゲーム雑誌も読んでいた。ファミマガファミ通・マル勝ファミコン。ゲームを実際にプレイしなくても、ゲーム紹介記事を眺めているだけで楽しかった。

あれはファミマガだったかな。女神転生2の紹介記事を読んだことがある。1/2ページだけの記事だったけど、ゲーム内でゲームが出来る、というような事が書いてあった。
今ではそんなの当たり前のアイデアなんだけど、当時は物凄く斬新に感じだ。それから虜になり、ゲーム雑誌を買ったら必ず女神転生2の記事をチェックして何度も読み返すようになった。誕生日にはもちろん女神転生2を買ってもらった。

実際にプレイしてみたら世界観にやられた。ゲーム内ゲームや、敵を会話で仲魔に出来るなど魅力的な要素は沢山あったけど、1番はやっぱりドライすぎるサイバーパンクな世界観だ。
RPGといえば、中世ヨーロッパのような世界が舞台で剣や魔法で戦い最後は魔王を倒す、というような世界観が主流だった。だけどこのゲームは剣や魔法・ゴブリンやハーピーといったお馴染みの要素は出てくるのに、東京が舞台でデザートイーグルやウージーといった銃も出てくる。
東京でゴブリンの群れに向かってマシンガンをぶっ放す、といった頭がクラクラするような世界だ。
そして現実と同じように銃がやたら強く、前半は銃頼みでゲームを進めていく。

敵キャラは馴染みのファンタジーキャラに加えて、やたらマニアックな悪魔が出て来る。パビルサグ・チョンチョン・ラクチャランゴ・ギリメカテ。当時他のゲームではまず見かけない悪魔たちだ。グラフィックもおどろおどろしく、コミカルな感じは少ない。ドライなストーリーにとても合っていた。
RPGといえば魔王はゲーム中に1体、もしくは2体しかでないのがお約束だったけど、このゲームは中ボスとして何体も出て来る。この辺りも斬新だった。

主人公は(多分)全く喋らず、パートナーのヒロインもやたら口数が少ない。途中イベントで主人公の腕が食い千切られるというショッキングすぎる出来事があるけど、そこでも確か一切喋らなかったと思う。
RPGはプレイヤーが主人公に感情移入して進めることが多いと思うけど、いきなりこんな鬼畜なイベントをぶっこんでくるセンスが凄い。腕が千切られて流血しているので、歩くたびにダメージを受ける。変なところがリアルなのに、主人公もヒロインもこの出来事について一切コメントしない。ドライすぎるだろ。
怪しげな研究所に行って、機械の腕を付けてもらい先に進めるようになる。この展開は小学生にはキツかった。

RPGのお約束として先に進むと雑魚キャラも強くなる。なので次の町に進む前に近辺の雑魚を狩ってレベル上げをすることになる。
後半のとある町近辺にはエナジードレインという恐ろしい特技を使ってくる雑魚キャラがいた。レベル上げの為に雑魚狩りしているのに、その雑魚にレベルを下げられるのである。
仕方なく更に一つ前の町に戻ってレベル上げをしようとしたけど、今度は雑魚キャラが弱すぎてほとんど経験値を貰えない。
何時間も掛けてレベルを上げても、運悪くエナジードレインを喰らうとムダになる。昔のゲームは本当に鬼畜である。

数年後、スーパーファミコン真・女神転生が発売された。このゲームは更に素晴らしかった。もう、世界観がたまらない。そのまた続編の真・女神転生2、そして真・女神転生3も異常なくらい世界観が良かった。
真・女神転生5が近々発売されるという事なので、そちらも期待している。

モニタを購入したけど揺れがひどい

今までノートPCをメインとして使っていたけど、画面の小ささに耐えられなくなってきたのでモニタを購入した。

31.5インチ IO-DATA EX-LD3151DB

ノートPC自体は机に置いておくと邪魔なので、下記ブログを参考にモニタ背面へ配置。
電源ボタンを押す方法もこちらのブログのクリップを使うやり方をマネさせてもらった。

hiki-jiritsu.hatenablog.com

ただ、このモニタの問題なのか安物机を使っているせいなのか、キーボードをタイピングするとモニタが揺れる揺れる。
100円ショップへ行って揺れを緩和してくれそうなものを探してみた。

f:id:rymo:20170606165245j:plainf:id:rymo:20170606165304j:plainf:id:rymo:20170606165223j:plain

それぞれを机の足の下に置いたりモニタの下に置いて揺れを比較してみたら、固いスポンジ状の「ガタゴト防音マット」をモニタ下に置くのが1番揺れを抑えられることが分かった。
他のジェル状のものは揺れが変わらないか、逆に酷くなってしまった。

f:id:rymo:20170606165320j:plain

ただこれでもまだ少しだけ揺れる。 タイピングするときに肘から机にかなりの振動が伝わってるようだ。
肘の下にタオルを敷いたらほぼ揺れなくなった。

f:id:rymo:20170606172651j:plain

そもそもの話としてタイピングに力を入れすぎな気がする。 少し意識してソフトなタイピングを心がけよう。

HDDからSSDに換装

家で使用しているノートPCには250GBのSSDを載せていたけど、容量が逼迫して辛くなってきた。500GBのSSDを新たに購入して、データクローンして換装してみた。

環境

準備したもの

SSDを接続

SSDSATA-USB変換アダプタを通してPCにUSB接続。最初は認識されなかっけどUSB接続口を変更・OS再起動・変換アダプタにUSBで電源供給するなどして正常に認識されるようになった。
Windowの「ハードディスクパーテーションの作成とフォーマット」を起動 (タスクバーの検索窓に「ハードディスク」と入力してEnter)し、新SSDをフォーマット。フォーマット時にはMBRかGPTか形式を聞かれるので、旧SSDと同じ形式でフォーマットする。

クローンに試行錯誤

「EaseUS Todo Backup Free 10.0」をダウンロード・インストール

「EaseUS Todo Backup」ドライブやパーティションを丸ごとイメージ化してバックアップできるソフト - 窓の杜ライブラリ

EaseUS Todo Backup を起動。右上の「システムクローン」をクリック。

f:id:rymo:20170502170538p:plain

次の画面でクローン先のSSDを選択し、「SSDに最適化」「セクタバイセクタクローン」をチェックし「次へ」をクリック。

f:id:rymo:20170502170548p:plain

クローン化が始まるが、「断片化が多すぎます。デフラグするか十分な空き領域を作る必要があります。」と表示されてクローンが中止されてしまった。

f:id:rymo:20170502170558p:plain

指示に従いデフラグを行った。Puran Defrag というアプリを使用し、ブートタイムデフラグを実行。

Puran Defrag Download

再度クローンを試すも「ディスクまたはパーテーションに十分な空き領域がありません。書き込み先を変更するか、不要なデータを削除した後、再試行してください。」と表示されてクローンできない。

f:id:rymo:20170502170608p:plain

Windowsの電源オプションを「高パフォーマンス」に設定。更にクローン元の旧SSDは8割近いデータ使用率だったので4割までデータ削減した。 だけど、ここまでやってもまた「断片化が多すぎます。デフラグするか十分な空き領域を作る必要があります。」が表示される。。

色々試した結果「セクタバイセクタクローン」のチェックを外したらクローンに成功した。

クローン後の新SSDに換装

クローンが完了したのでSSDの換装を行い動作確認。 ほぼ問題無さそうだけど、何故かChromeが起動しなくなった。EaseUS Todo Backup は怪しい動きをする、という情報をネットで聞いたのでコレを削除して再起動したところ正常にChromeが起動できるようになった。

また、新SSDが250GBまでしか認識していなかったので「ハードディスクパーテーションの作成とフォーマット」でボリューム拡張し500GBまで認識するよう設定した。

念のため数日様子を見て他に問題無ければ旧SSDはフォーマットして、家族共有の古いPCにお下がりとして導入することにしよう。

ErgoDoxEzを使ってみた(Windows10)

f:id:rymo:20170502165906j:plain

去年末からPCキーボードにハマりだした。 「Majestouch2 Tenkeyless 日本語配列 茶軸」「HHKB Professional Type-S」と来て最近「ErgoDox EZ 赤軸」を購入した。肩こり解消や姿勢維持を考えると一度セパレート型に手を出してみたかったと云うのと、親指を活用出来そうな所も良かった。

購入

購入は ここ から行った。 私が購入した時点(2017/4)では以下のオプションから選べた。

  • リストレスト+ティルト(有り・無し)
  • バックライト(有り・無し)
  • キーの文字プリント(有り・無し)
  • カラー(黒・白)
  • キースイッチの種類(青軸・赤軸・黄軸・黒軸・白軸・緑軸・茶軸)

肩こり解消が購入目的の1つのなのでリストレスト+ティルトは「有り」
バックライトは利点がイマイチ分からないので「無し」
キーの文字プリントはキー角度が付いていて快適そうだったので「無し」
カラーは自分のノートPCと色を合わせたかったので「黒」
キースイッチの種類はある程度の軽さが欲しかったので「赤軸」
を選択した。
バックライト付きキーボードって結構見かけるけど、どういう利点が有るんだろう・・ 気にはなってるけどよく分かんないので今回は見送った。 注文してから2週間程度で届いた。時期が良かったのかも知れないけど意外と早い。

キー配列の変更

ErgoDoxはキー配列が通常キーボードとかなり異なるし、デフォルト配列だとちょっと使いづらいのでみんなキーリマップして使ってるんじゃないだろうか。キー配列をソフト側で変更すると、PCを変えたり仮想環境に入る度に設定しなきゃいけないのがちょっと辛い。だけどErgoDoxはハード側で変更出来るのも嬉しい。

ここここ で簡単にキー配列を設定できるようだけど、細かい修正は出来ないらしいので勉強がてらコード修正&ビルドを自分で行った。

環境

私の環境はWindows10Homeなので、Windowを使っている人はErgoDoxEzキーリマップの参考になるかもしれない。と言っても設定はほとんどBashから行った。

Teensy Loader Application

ErgoDoxEzにはTeensyというUSB接続のマイコンボードが組み込まれている。このTeensyにファームウェア情報を書き込むことでキー配列の変更が出来る。 書き込む為のツールとしてTeensy Loader Applicationが有るので、 以下のサイトからWindows版の実行ファイルをダウンロードして実行。

Teensy Loader Application - available for Windows, Linux and Macintosh systems

実行すると下図のように表示されるので

f:id:rymo:20170502165929p:plain

ErgoDoxEzの右上にある小さな穴に針かクリップを差し込んで

f:id:rymo:20170502165939p:plain

こうなればOK。

qmk firmware

Teensyに書き込むファームウェアは「qmk firmware(Quantum Mechanical Keyboard Firmware)」という物で、キーボード用のファームウェアらしい。 このファームウェアをビルドする為の環境を整える。 ビルドガイドが有るのでそれを参考にすれば良い訳だけど

github.com

ErgoDoxEzに限らずWindowsって他のOSに比べると手間掛かる事が多いなぁ・・ 私の場合は以下のような手順を行った。

Bash On Ubuntu On Windows (Ubuntu 16.04.2 LTS) をインストー

以下のサイトを参考にしてBash環境を作る。

qiita.com

各種ツールをインストー

コマンドプロンプトbash と打ちbashを起動。以下bash上で作業を行う。

sudo apt-get install git gcc-avr avr-libc dfu-programmer make
cd
git clone https://github.com/jackhumbert/qmk_firmware.git

キーマップデータの編集

vim ~/qmk_firmware/keyboards/ergodox/keymaps/default/keymap.c

キーマップの編集方法については以下のサイトを参考にすると良いかも。

キーコードまとめ :: ErgoDox | Refills

d.hatena.ne.jp

qiita.com

qiita.com

github.com

キーマップデータのビルド

編集が終わったらビルドを行う。

cd ~/qmk_firmware/
make keyboard=ergodox subproject=ez keymap=default
ls .build/ergodox_ez_default.hex

キーマップデータの書き込み

Teensy Loader Application を開き、File > Open HEX File でビルド作成したhexファイルを選択。 その後 Operation > Program, Operation > Reboot と選択

F13/F14キーに英数/かな を割り当て

英数かなの切り替えはトグルではなく、Mac風に2つのキーで切り替えたい。その場合 変換/無変換キーを 英数/かな に割り当てる方法がメジャーだと思う。 だけどErogoDoxEzを英語キーボードとして使った場合、変換/無変換(KC_HENK/KC_MHEN)が認識してくれなかった。仕方ないので代わりにF13/F14キーを設定し、それを英数/かな に割り当てた。

ほとんどのIMEでは、各種キーを英数/かな に割り当てる事ができる。 以下はGoogle日本語入力の場合の手順。 Google日本語入力のプロパティを開き、 キー設定の選択 > カスタム を選択。その後 編集 をクリック。

f:id:rymo:20170502170010p:plain

左下の 編集 をクリック

f:id:rymo:20170502170023p:plain

定義済みのキーマップからインポート > MS-IME を選択。 その後以下のエントリーを追加する。

モード 入力キー コマンド
入力文字なし F13 IMEを無効化
直接入力 F14 ひらがなに入力切替
変換前入力中 F14 ひらがなに入力切替
入力文字なし F14 ひらがなに入力切替

英語配列キーボードとして認識

2通り方法がある。お手軽な方法は Windows10の 設定 > 時刻と言語 > 地域と言語 > 「日本語」をクリック > オプション > ハードウェア キーボード レイアウト > レイアウトを変更する > 「英語キーボード」を選択 > サインアウト

ただこれだと他のキーボードも英語キーボードとして認識されてしまう。ErgoDoxEzだけ英語キーボードとして認識させるにはレジストリをいじる方法で設定する。以下のサイトを参照。

WindowsでUSキーボードとして認識させる :: ErgoDox | Refills

ついでに 全角スペースを入力させない設定

Google日本語入力のプロパティを開き スペースの入力 > 半角 を選択。

現在のキーマップ

今のkeymap.cはこんな感じ。使い始めたばかりなのでこれからどんどん変わっていくと思う。

#include "ergodox.h"
#include "debug.h"
#include "action_layer.h"
#include "version.h"

#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys

enum custom_keycodes {
  PLACEHOLDER = SAFE_RANGE, // can always be here
  EPRM,
  VRSN,
  RGB_SLD
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 0: Basic layer
  *
  * ,--------------------------------------------------.           ,--------------------------------------------------.
  * |  ESC   |  1!  |  2@  |  3#  |  4$  |  5%  | LEFT |           | RIGHT|  6^  |  7&  |  8*  |  9(  |   0)  |  `~    |
  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
  * | Tab    |   Q  |   W  |   E  |   R  |   T  |  [{  |           |  }]  |   Y  |   U  |   I  |   O  |   P  |   '"   |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
  * | LCtrl  | A/Sht|   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |;:/Sht|  RCtrl |
  * |--------+------+------+------+------+------|  -_  |           |  =+  |------+------+------+------+------+--------|
  * | LShift |  Z   |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |  ,<  |  .>  |  /?  | RShift |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
  *   | LAlt | LGui |      |      |  F13 |                                       |  F14 |  |\  |      | RGui | RAlt |
  *   `----------------------------------'                                       `----------------------------------'
  *                                       ,--------------.     ,---------------.
  *                                       |  PSc | Paus |       | Up   |      |
  *                                ,------|------|------|       |------+------+------.
  *                                | Space|      |ScrLk |       | Down |      |Enter |
  *                                | / ~L1|  L1  |------|       |------|  L1  | / ~L1|
  *                                |      |      |  L2  |       | L2   |      |      |
  *                                `--------------------'       `--------------------'
  */
// If it accepts an argument (i.e, is a function), it do esn't need KC_.
// Otherwise, it needs KC_*
[BASE] = KEYMAP(  // layer 0 : default
        // left hand
        KC_ESC,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_LEFT,
        KC_TAB,         KC_Q,         KC_W,   KC_E,   KC_R,   KC_T,   KC_LBRC,
        KC_LCTL,        SFT_T(KC_A), KC_S,   KC_D,   KC_F,   KC_G,
        KC_LSFT,        KC_Z,         KC_X,   KC_C,   KC_V,   KC_B,   KC_MINS,
        KC_LALT,        KC_LGUI,      KC_NO,  KC_NO,  KC_F13,
                                              KC_PSCR,  KC_PAUS,
                                                              KC_SLCK,
                                              LT(SYMB, KC_SPC), TG(SYMB), TG(MDIA),
        // right hand
             KC_RGHT,     KC_6,   KC_7,    KC_8,     KC_9,   KC_0,            KC_GRV,
             KC_RBRC,     KC_Y,   KC_U,    KC_I,     KC_O,   KC_P,            KC_QUOT,
                          KC_H,   KC_J,    KC_K,     KC_L,   SFT_T(KC_SCLN),  KC_RCTL,
             KC_EQL,      KC_N,   KC_M,    KC_COMM,  KC_DOT, KC_SLSH,         KC_RSFT,
                                  KC_F14, KC_BSLS,  KC_NO,  KC_RGUI,          KC_RALT,
             KC_UP,   KC_NO,
             KC_DOWN,
             TG(MDIA), TG(SYMB), LT(SYMB, KC_ENT)
    ),
/* Keymap 1: Symbol Layer
 *
 * ,---------------------------------------------------.           ,--------------------------------------------------.
 * | Alt-F4  |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
 * |---------+------+------+------+------+------+------|           |------+------+------+------+------+------+--------|
 * |  Tab    |      |      |   (  |   )  |      |      |           |      |  Del |  Bs  |  Up  | PgUp | App  |   F12  |
 * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * |  Ctrl   |      |      |   +  |   -  |  =   |------|           |------| Home | Left | Down | Right| End  |  Ctrl  |
 * |---------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * |  Shift  |      |      | AltL | AltR |      |      |           |      |      |      |      | PgDn |      | Shift  |
 * `---------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   | Alt   |  Win |      |      |  F13 |                                       |  F14 |      |      |  Win |  Alt |
 *   `-----------------------------------'                                       `----------------------------------'
 *                                       ,-------------.       ,-------------.
 *                                       |      |      |       |      |      |
 *                                ,------|------|------|       |------+------+------.
 *                                |      |      |      |       |      |      |      |
 *                                |      |      |------|       |------|      |      |
 *                                |      |      |      |       |      |      |      |
 *                                `--------------------'       `--------------------'
 */
// SYMBOLS
[SYMB] = KEYMAP(
       // left hand
       LALT(KC_F4), KC_F1,  KC_F2, KC_F3,           KC_F4,          KC_F5, KC_TRNS,
       KC_TRNS,     KC_NO,  KC_NO, KC_LPRN,         KC_RPRN,        KC_NO, KC_NO,
       KC_TRNS,     KC_TRNS,  KC_NO, KC_PLUS,         KC_MINS,        KC_EQL,
       KC_TRNS,     KC_NO,  KC_NO, LALT(KC_LEFT),   LALT(KC_RGHT),  KC_NO, KC_NO,
          KC_TRNS, KC_TRNS, KC_NO, KC_NO,   KC_TRNS,
                                       KC_NO, KC_NO,
                                               KC_NO,
                               KC_TRNS, KC_TRNS, KC_TRNS,
       // right hand
       KC_TRNS, KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,
       KC_NO,   KC_DELT, KC_BSPC, KC_UP,   KC_PGUP, KC_APP,  KC_F12,
                KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, SFT_T(KC_END),  KC_TRNS,
       KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_PGDN, KC_NO,   KC_TRNS,
                         KC_TRNS, KC_NO,   KC_NO,   KC_TRNS, KC_TRNS,
       KC_TRNS, KC_NO,
       KC_TRNS,
       KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |  Esc   |      | Mute |VolDn |VolUp |      |      |           |      |      |      |   /  |   *  |      |        |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * |  Tab   |      |      | MsUp |      |      |      |           |      |      |   7  |   8  |   9  |   -  |        |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * |  Ctrl  |      |MsLeft|MsDown|MsRght|      |------|           |------|      |   4  |   5  |   6  |   +  |  Ctrl  |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * |  Shift |      |      |      |      |      |      |           |      |      |   1  |   2  |   3  |Enter |  Shift |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   | Alt  | Win  |      | Lclk | Rclk |                                       |   0  |   0  |   .  |Enter |  Alt |
 *   `----------------------------------'                                       `----------------------------------'
 *                                       ,-------------.       ,-------------.
 *                                       |      |      |       |      |      |
 *                                ,------|------|------|       |------+------+------.
 *                                |      |      |      |       |      |      |      |
 *                                |      |      |------|       |------|      |      |
 *                                |      |      |      |       |      |      |      |
 *                                `--------------------'       `--------------------'
 */
// MEDIA AND MOUSE
[MDIA] = KEYMAP(
       KC_ESC,  KC_NO, KC_MUTE, KC_VOLU, KC_VOLD,   KC_NO, KC_NO,
       KC_TRNS, KC_NO, KC_NO,   KC_MS_U, KC_NO,   KC_NO, KC_NO,
       KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO,
       KC_TRNS, KC_NO, KC_NO,   KC_NO,   KC_NO,   KC_NO, KC_NO,
       KC_TRNS, KC_TRNS, KC_NO, KC_BTN1, KC_BTN2,
                                           KC_NO, KC_NO,
                                                    KC_NO,
                                  KC_TRNS,  KC_TRNS, KC_TRNS,
    // right hand
       KC_TRNS,  KC_NO, KC_NO, KC_SLSH, KC_PAST, KC_NO, KC_NO,
       KC_NO,  KC_NO, KC_7,    KC_8,    KC_9,    KC_MINS, KC_NO,
                 KC_NO, KC_4,    KC_5,    KC_6,  SFT_T(KC_PLUS), KC_TRNS,
       KC_NO,  KC_NO, KC_1,    KC_2,    KC_3,    KC_ENT,  KC_TRNS,
                          KC_0,    KC_0,    KC_COMM, KC_ENT,  KC_TRNS,
       KC_TRNS, KC_NO,
       KC_TRNS,
       KC_TRNS, KC_TRNS, KC_TRNS
),
};

const uint16_t PROGMEM fn_actions[] = {
    [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
};

const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
  // MACRODOWN only works in this function
      switch(id) {
        case 0:
        if (record->event.pressed) {
          SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
        }
        break;
        case 1:
        if (record->event.pressed) { // For resetting EEPROM
          eeconfig_init();
        }
        break;
      }
    return MACRO_NONE;
};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    // dynamically generate these.
    case EPRM:
      if (record->event.pressed) {
        eeconfig_init();
      }
      return false;
      break;
    case VRSN:
      if (record->event.pressed) {
        SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
      }
      return false;
      break;
    case RGB_SLD:
      if (record->event.pressed) {
        #ifdef RGBLIGHT_ENABLE
          rgblight_mode(1);
        #endif
      }
      return false;
      break;
  }
  return true;
}

// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {

};


// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {

    uint8_t layer = biton32(layer_state);

    ergodox_board_led_off();
    ergodox_right_led_1_off();
    ergodox_right_led_2_off();
    ergodox_right_led_3_off();
    switch (layer) {
      // TODO: Make this relevant to the ErgoDox EZ.
        case 1:
            ergodox_right_led_1_on();
            break;
        case 2:
            ergodox_right_led_2_on();
            break;
        default:
            // none
            break;
    }

};

左手親指部分のキーは LT(SYMB, KC_SPC) と設定してあるけどこれが結構便利で、例えば
押しっぱなしでレイヤー切り替え。
一回押すとスペースを1つ入力(ゆっくり押すと反応しないので注意)。
二回押して二回目を押しっぱなしにすると、スペースを複数個入力 となる。