Visual Studio 2019(以下VS2019)以前のバージョンで作成したデータベースの単体テストプロジェクト*1をVisual Studio 2022(以下、VS2022)で開いてテスト実行すると、テストが正しく実行できない事象に遭遇しました。 その回避策についてのメモ。
※1年以上前に遭遇してメモしたのだけど、下書きのまま忘れていたので最新の環境で再確認した上で公開しておきます。
*1:SSDT : SQL Server Data Toolsに含まれるデータベース単体テストのこと
PPC200枚程度に対応した裁断機 Durodex 200DX-W を買いました。古めの業務用機器のマニュアルをタブレットで閲覧できるようPDF化する作業が発生し、また今後も(高頻度ではないものの)継続的に発生する見込みがある……というのが主な理由です。
選択の観点は『A4(長辺)を200枚程度を一度にカットできる性能』と、そんなに頻繁に使う予定もないので『なるべく低価格』という2点でした。 動力式のものも良いなとは思いましたが、想定している対象物や使用頻度ではオーバースペックと言わざるを得ない上に金額の桁が一つ上がるため、今回はスコープ外としました。
なお裁断後の取り込みは、元々所有しているScanSnap iX 1500を利用する前提です。
配達されて箱を持った第一印象は「思ったより重い」でした。あとでカタログスペックを確認すると9.8kgとなっていました。一般的な成人男性であれば持ち運びには苦労はしないと思いますが、例えば棚の上の方に保管するのは止めた方が無難かもしれません。
消耗品?の付属物として、プラスチック製の「刃受け(カットした時に刃と接触する台になる部分)」と単三乾電池2本が同梱されていました。乾電池はカット位置を投影するLED用です。説明書や注意書き的な印刷物も入っており、それらに従って本体の裏側部分に収納されている「刃受け」をセットするのさえ忘れなければ特に利用で悩むことは無さそうに思いました。
100ページほどの冊子を何冊かカットしてみましたが特に留意がコツが必要というわけでもなく、自然に力をかけるだけで綺麗にカット出来ました。 消耗品の「刃受け」と「刃」も(少なくとも現時点では)容易に入手できそうですし、そもそも自分の想定する仕様頻度だと少なくとも5年くらいは無交換で使えそうです。
現時点では、使用感や価格も含めて総合的に満足のいく買い物だと感じています。
少し話は変わります。
最近、子供が漢字検定の受験のために問題集を買って勉強を始めました。 書き込み式の問題集を購入したのですが(この手の問題集は概ねその方式)、一度やった程度ではなかなか身につくものでもなくやはり繰り返し利用したくなります。こういう場合は「別のノートに回答する」「問題集をコピーして書き込む*1」もしくは「もう一冊、問題集を買う」などが選択肢になると思います。
1つめの選択肢でもよいとは思うのですが、別のノートに回答すると答え合わせが少し面倒と私は感じて出でいます。特に我が子はは字が少々雑で読みにくく*2、仕事や家事の合間に採点する際に無駄にストレスになることが経験上分かってるので可能な限り避けたい。
なので私は普段は大抵は2つ目の選択肢を取っています。カラーレーザー複合機を所有しているので一枚あたりのコピー時間もたいしてかかりませんし、隙間時間に予めまとめてコピーしておけるので諸々のコントロールのしやすさを考えると一つ目の選択肢よりマシ、というのがその理由です(あくまで私としては)。とはいえ、やはりページをめくりながらのコピーがそれなりに手間がかかりますし、うっかり失敗することもありますのでもっと良い方法が何とか改善したいと思ってはいました。
3つ目の選択肢は、1冊数百円のドリル形式ものであったり全体を通して何度もやるような場合はそれでもよいのですが、『苦手なところだけ何度か繰り返す』ような使い方をしたい場合は無駄が多すぎることになります。
そんな状況だったところに、今回裁断機を購入したことで新たな道が開けたわけです。
書籍を自炊する習慣のある人/あった人ならとっくに思いついていそうですが、私は読書はそれなりに好きで電子書籍も読むものの『本を裁断しての自炊』は心理的な抵抗が大きく、今までやっていなかったこともあり全く思いつきませんでした。
大変勝手なもので、私の心理的抵抗は問題集に対しては働かないようで*3これらの作業は抵抗なく終えることができました。
取り込み後の印刷も、元々所有しているレーザー複合機でサクサク印刷できますしトータルで効率化・ストレス減を達成できました。 繰り返しやりたいところだけ印刷することも簡単ですし、両面印刷と多ページ割付が容易に行えるので手で1ページづつコピーするよりも、手間がかからない上に低コストで印刷できます。またページめくり方向などを工夫することで元の冊子の状態より使いやすいものにすることもでき、一石三鳥以上の効果を実感できています。
ということで、裁断機+スキャナによる自炊は、繰り返し学習に利用する問題集に適用すると色々と捗るのでお勧め、というメモでした。
スーパーファミコン(SFC/SNES)のコントローラーをUSBに変換するアダプタを作成したのでメモ。 ”最強”についてはあくまで主観です。異論は認める。

なお以前にもArduinoを利用してSNESコントローラーを(XInput)に変換するものを作成して使用していたのですが遅延が多少気になったのとNintendo Switchでも使いたくなったのでそのあたりを解消できるもの作ることにしました。
Raspberry Pi Pico(およびRP2040搭載の互換マイコン)を多機能・高性能USBゲームコントローラーにするOSSファームウェア GP2040-CEは、SNES(SFC)コントローラーの信号線をGPIOに接続することでコンバーターとして動作する機能を有しています。この機能を利用するとGP2040-CEの機能と性能をフルに近い*1形で享受できる高性能なSNESパッド to USBコンバーターを容易に作成することが可能になります。 ボタンのアサインは固定ですが、ごく直感的なものになっているので基本的に困ることは無いと思います*2。
GP2040-CEのSNESパッドコンバーター機能についてのオフィシャルドキュメントは以下です。 gp2040-ce.info
GP2040-CEが対応している機種は現在のv0.7.11では以下です。つまりは現行のプラットホームでUSB刺さるやつなら大体OK、という感じになります。
任意のキーを割り付けできるキーボードエミュレーションもあるので、PC用のゲームやアプリケーションでゲームコントローラーに対応していないものでも、JoyToKey のようなソフトウェア無しでコントローラーで操作できるようになります。例えば最近だとscratchはゲームパッドに対応していませんが、GP2040-CEのキーボードモードを使用すればscratchで作成したゲームをゲームコントローラーで操作できるようになります。
またGP2040-CEは入力遅延についても現在存在するもののなかでも最低クラスですので*3、少なくともSNESコントローラーコンバーターとしては ”最強” を名乗ってもバチは当たらない筈です。
というわけで作ってみました。
ますは試作1号機(v1.0)です。

これは実は、KiCadでのPCB設計の練習と基板発注のお試し目的で作ったものでもあります。 そのため、機能面ではさほど問題はなかったのですが、下記の不満が残りました。
そこで次に作成したのがこちらの試作2号機(v3.0)です*4。

試作一号機での不満を解消しつつ、GP2040-CE v0.7.11で実装されたMini Menuを有効活用する方向性も狙って作成したものになります。フットプリントのサイズについては二階建てにすることで解消を考えました。OLEDのピン配置についても力技で対応しやすいようにしてみました。
これ以降は、は試作2号機についてのメモとなります。
ざっくり以下の仕様としました。
MCUは実装サイズを重視してWaveshare RP2040-Zeroを利用することにしました*5。

v0.7.11から搭載されたMini Menuが使えるとモード切り替えなどとても便利なのでOLEDも実装することにしました。部品代として~400円程度で入手できますし。 Mini Menuでは、Web Configを使用することなくコントローラー単体で動作モード(Xinput/PS4/Switch/DirectInput/XBOX/各種miniコンソール等々)の切り替えや十字キーの動作モード(D-PAD,L-Stick,R-Stick)切り替えもできるため利便性が上がります*6。
Mini Menuについてはこちらも参照ください。

試作一号基板で問題になった『OLEDモジュールのピン配列が製品によって一定しない』件に対しては、パターンカットとジャンパで対応し易くしてみました。私の手元にあるものだけでも三パターンありましたし*7、今後もECサイトで買う場合は写真と実際に届くもので配列が違う可能性も否めません(特にAliexpressとかAmazonのマーケットプレースとかだと)。

SNESパッドには存在しない、現代コンソールゲーム機が通常備えるL2/R2/L3/R3とA1(Home/PS等相当)、A2(CaptureやTachpad等相当)ボタンを基板上に配置しました。

SNESパッドが適するようなゲームにおいて通常のゲーム操作で必要になることはあまりないかもしれませんが、ゲーム外の部分*8などで困る事が予想できるためです。また、前述のMini Menu操作にも使用できるという利点もあります。
S2ボタンは言わゆるStartボタン相当のボタンです。StartボタンはSNESパッド上に存在するのですが、ファームウェアの書き換えやリセットした直後等はSNESパッドがまた使用できない状態でWeb Configuratorに入る際にあると便利なのでえて配置しています*9 。 またこの理由から、firmwareの初期導入直後でもWeb Configモードに容易に入れるようにするためにS2ボタン対するGPIOのピンアサインは規定値のままとしています。
その他のボタンとして、連射機能のOn/Offを切り替えるTurboボタンと他のキーと組み合わせでホットキーを構成することでMini Menuの操作などを行うためのFunctionボタンを配置しています。 Functionキーを利用したホットキーのアサインは別途後述します。
パススルー認証用のUSBコネクタも実装しておくことにしました。 XBOXやPS4/5で利用する予定は現状ないのですが、USBコネクタは部品代としては安いので負担になりませんしGPIOも余裕がありまた基板上のスーペースも空いているので…という程度の理由です。将来的に使いたくなる可能性も十分ありますし。

想定するGPIOのアサインは以下の通りです。
| GPIO | Assign | GPIO | Assign |
|---|---|---|---|
| 00 | Function | 11 | SNES Data |
| 01 | S2 | 12 | SNES Latch |
| 02 | Turbo | 13 | SNEC Clock |
| 03 | Turbo LED | 14 | A1 |
| 04 | OLED SDA | 15 | A2 |
| 05 | OLED SCL | 16 | (on board RGB LED) |
| 06 | [N/A] | 17-25 | [N/A] |
| 07 | [N/A] | 26 | L3 |
| 08 | R2 | 27 | R3 |
| 09 | L2 | 28 | USB D+ |
| 10 | [N/A] | 29 | USB D- |
RP2040-ZEROではGP16はオンボードのRGB LEDに接続されているので今回使用しません。 またGP17~25は裏面の小さなパッドでアクセスできますが今回は足りていることもあって使用しません。
なおUSBコネクタへの配線ですが、詳細は後述しますが少なくとも現時点のv0.7.11とRP2040-ZEROの組み合わせでは、 GP28 -> D-、GP29 -> D+ の組み合わせは設定できませんでした。留意が必要かと思います。
GP2040-CE のWeb Configurationで設定した内容のメモです。
Save すること(重要)4 SCLを 5 に設定28 に設定(Pin Orderは規定値のまま)03 に131211| キー | 機能 | 意味 |
|---|---|---|
| Fn + S2 | Mini Menu Toggle | OLEDでMini Menuを表示 |
| Fn + R2 | Mini Menu Up | Mini Menuで上キー操作 |
| Fn + R3 | Mini Menu Down | Mini Menuで下キー操作 |
| Fn + L2 | Mini Menu Right | Mini Menuで右キー操作 |
| Fn + L3 | Mini Menu Left | Mini Menuで左キー操作 |
| Fn + A1 | Mini Menu Select | Mini Menuで選択操作 |
| Fn + A2 | Mini Menu Back | Mini Menuで戻る操作 |
Current Mode にPS4を選択USB HOST を選択SaveすることCurrent Mode にPS5を選択USB HOST を選択Saveすること
基板は、マイコン基板・SFCコントローラーコネクタ・OLED・ボタン類をなるべく無駄なく最小のフットプリントにするために、基板を二階建てにすることにしました。 二枚の基板をスペーサーを挟んでビスで固定する方式です。
ただしOLEDや追加ボタンが不要な場合や、それらをこれらを別途ケースに取り付けて配置して利用するような組み込み方も考ええ、
として下段だけでも機能する設計にしました。 (ケースにボタンやOLEDを組み込む場合はピンヘッダからそれぞれに必要な配線は取れる)
また1枚のみで使用する場合、Turbo用のLEDインジケータとしてRP2040-ZEROのオンボードLEDを利用するのもありかもしれません*10。
P2040-ZEROを実装するパターンは、ピンヘッダ等の足無しで直接基板にはんだ付けできるよう設計しました。単純な長方形以外のPCBを発注してみるテストも兼ねて。
OLEDの項でも書きましたが、上段のOLEDの配線はパターンカットとジャンパで色んな配列に対応できるようにしています。
PCBの設計はKiCad 9を使用しました。 製造はJLCPCBを利用しました。KiCadにJLCPCB用のアドオンを入れると必要な出力を勝手に生成してくれるのですごく楽ですね。
また初回限定クーポンなどもあったので、おそらく今回に限ってになるとは思いますがすごく安く発注出来ました。 レジストの色は無駄に紫とか選んでみましたが、なかなかいい色で気に入っています。
以前購入して在庫している手持ちの部品の利用がおおいので、正確ではないですが概ね以下です。
仕上げとして保護目的で3mm厚の透明アクリルで挟んでみました。 アクリルは穴あけを頼むとそこそこコストが上がるので(穴一個につき100円とかになることも)、今回は自分であけました。地味に面倒でしたし適当にやったので精度が微妙ですが、まあ自分で使うためのDIYだし問題ない範囲に仕上がったと思っています。
全体的にPCB設計のノウハウが無さ過ぎるので、わかってる人から見るとおそらくよくない実装になっているのでないかと思います。が、そもそもユニバーサル基板で雑に実装しても実用上全く支障がないようなレベルの回路ですし、とりあえず気にしないことにします。趣味の自作ですし。
ただそんな中でも2点だけ、もう少し考えればよかった&実験してから決めればよかったな……となった点があります。
USBパススルー端子のアサインにfirmwareの制限?問題?があり*11、予定していたアサインにできない という事象が発生しました。
実はPCBの設計時点では、USB端子のD+をGP29、D-をGP28に振る設計にしていました。

所が実際にそのように設定してみると、firmwareがフリーズすることがわかりました。いくつか実験をしてみましたがどうも解消しそうにないので、基板をパターンカットしてGP28をD+にGP29をD-にジャンパで配線しなおすことで対応することにしました。

上側の基板上の、基板と基板を接続するためのケーブルを配線がちょっと面倒でした。 手癖でなんとなく2.54mmのピンヘッダ用のフットプリントを適用したのですが、接続に市販の2*4の14ピンコネクタが圧着されたフラットケーブルを使用するであれば1mmピッチにしておいた方が多少配線が楽だったように思います。
もしくは、フレキで接続するように両端ともフレキ用のコネクタにするべきだったかもしれません。 これについては次回なにか作るときに活かせられるといいなと思ってます。
使用感は最高で、自分の中では決定版と言えるSNES to USBコンバーターが出来上がったと思っています(自画自賛)。 アスキーグリップを使用して、左手でゲーム操作&右手でマッピング のスタイルでダンジョンRPGのプレイも大変捗ります。最高。

*1:SNESパッド上のボタンがHOTKEYに使用できないとかOLEDの表示に一部対応していない等細かいところはあるものの実用上問題はないレベル
*2:どうしてもアサインを変更したい場合はソースコードを修正して自分でビルドする方法もある
*3:https://github.com/OpenStickCommunity/GP2040-CE?tab=readme-ov-file#performance
*4:v2.0は机上の設計案の時点で没になりv3.0に移行したためこの世に試作機は存在してません
*5:実際には手元にダブついていた互換ボードを使用
*6:正直なところショートカットを覚えてられないというのもある
*7:左から『VCC/GND/SCL/SDA』と『GND/VCC/SCL/SDA』と『GND/VCC/SDA/SCL』があった
*8:例えばNitendo Switchの場合Homeボタンが無いとゲームを終了し難いです。
*9:ジャンパ線などでショートさせるなど他にもやりようはありますが
*10:RP2040-ZEROのオンボードLEDはRGB LEDだが、v0.7.11以降ではTurbo LEDとしてRGB LEDも使用できるようになっている
*11:一応githubにissueを作成しましたが現時点ではレスポンスなどないので詳細は不明
※ 2025.05.01 不具合と思える挙動がありましたので、最後に追記しています
※ 2025.04.30 大きく誤解していた部分があったので修正しました(操作方法の設定回り)
2025年4月にリリースされたGP2040-CE v0.7.11にMini Menu機能が搭載されました。 オフィシャルドキュメントはこちら。 gp2040-ce.info
おおざっぱに言えば、名前から想像できる通りOLEDディスプレイにミニメニューを表示し(PCとの接続無しの)アケコン単体でいくつか機能についての設定変更が可能になる機能です。

現時点で設定できるのは以下のようでした:
Current Input Mode の切り替えのみ可能で、PS4/5やXBOXの認証関連などの細かな設定は操作は変更できない模様Left Analog Stick D-Pad Right Analog Stickの切り替えInput Mode など設定変更を有効にするためにリブートの必要があるものは、Menuを閉じる際に保存と再起動を確認されます。
Mini Menuを利用するには以下が必要です。
なにはともあれOLEDディスプレイの実装が必要です。 SSD1306, SH1106, SH1107 などを実装した128x64のI2C接続のOLEDディスプレイモジュールを実装しましょう。 (国内の電子部品屋さんだと1個600円前後、Aliexpressなどで探せば1個あたり250円前後くらいから見つけられると思います)
実装したらWeb Configuratorの Configuration->Peripheral MappingのI2C0`でSDAとSCLとして使用するGPIOのピン番号を設定します。

Mini Menuを呼び出す操作を以下のいずれか*1決定し、設定します。
Configuration -> GPIO Pin Mapping でピンに Menu Toggle を割り当て

Settings -> Hotkey Settings で任意の組み合わせのHotkeyにアクション Menu Toggle を割り当て
1 + A2 + 上 に割り当て → 
Mini Menuでのカーソル操作と決定/キャンセル操作をどのように行うか決めて設定します。 3パターンの方法があります。
Menu Up,Menu Down,Menu Left,Menu Right,Menu Select,Menu Backを割り当てるMenu Up,Menu Down,Menu Left,Menu Right,Menu Select,Menu Backを割り当てるUp, Down, Left, Right, B1, B2でメニュー操作ができるようにします。Settings -> Gamepad Settings で Use Gamepad Input for Display Mini Menu を ONにします。

SNES Extensionを有効にして接続したSNESパッドでも問題なく操作出来ました*2GPIOの消費(節約)と起動中のゲームへの影響を考えてか、 公式ドキュメントではGPIOにFunctionを割り当てFunction(fn) を絡めたHotkeyへのアサインが推奨 されているようです。
普段通りGP2040-CE実装のコントローラーをデバイス(PCやゲームコンソール)に接続したあと、前段で設定した Menu Toggle操作を行えばOLEDにMini Menuが表示されます。
USB挿入時の限定されたタイミングではなく、コントローラー使用中にいつでも呼び出せます。
自分としてはInput ModeとD-Pad Mode、Profileの切り替えだけでも超便利です。
特にInput Modeは色々な環境で利用しようと思うと割り振れるホットキーだけでは足りないので、Web Configuratorを介さず変更できるのは超絶便利と感じています。
そもそも今まではアサインした各種Hotkeyもどれに何を設定したか忘れたりごっちゃになったりすることが多々ありましたし。
D-Pad Modeも今までスライドスイッチなどで実装してきたのですが、そうしょっちゅう切り替えるものでもないので今度からは諸々Menu Toggleボタンだけでいいのではないかと思ってしまいます。
恐らく私は、今後はOLEDを実装する場合はMini Menuで操作できるものはもうそれ前提にしてHotkeyは極力使わない方向で考えるようになりそうだと思っています。
どうも少しバグがあるようです。
私の環境ではミニメニューの Input Mode -> Web Config でWeb Configurator モードにした場合、設定画面の Settings ( http://192.168.7.1/settings ) にアクセスするとweb画面がホワイトアウトして設定をいじることができなくなりました。
『B1を押しながら接続』などの方法でInput Modeを別のものに切り替えたうえで改めて『S2を押しながら接続』でWeb Configurator に入ると正常に動作しますが、Focus Modeの設定でInput ModeとWeb ConfigをOFFにしている場合は再度nukeして書き直すしか復帰方法が無いかもしれません。Focus Modeを使用されるかたは特に注意した方が良いかと思います。
『いい加減に一回くらいはLM1881Nを使用した同期信号分離回路を自分で一から作ってみたいな*1』などと思い、まずはLM1881Nのデータシートを眺めはじめました。

そこで長年ずっと勘違いしていたことがあることに気が付きました。
LM1881Nの機能は
『C-Video(コンポジット映像信号)から C-Sync(複合期信号)とV-Sync(垂直同期信号)を分離する』
だったのですね。
私はいままでずっと『C-Sync(複合同期信号)を H-Sync(水平同期信号)とV-Sync(垂直同期信号)に分離する』だと思い込んでいました。 思い込みって怖い。
で、ようやく理解した(と思っている)のが大まかに以下です。
そういえばSFC(SNES)のRGBケーブルの初期ロット以外はRGB21JPコネクタのC-Syncピンに本体から出力されているC-Syncではなくコンポジット映像信号を接続しているのは有名ですが、その理由もようやくわかった気がしました。
*1:バッ活の記事を見ながら適当に組み込んだりはしたことがあるものの、ちゃんとした仕組みや各部品の値の意味などについて深く考えることなくただ部品表と配線図を見ながらプラモデル感覚で組んだだけだった