目次: RISC-V
DOOMのクローン実装prboom2を組み込み環境に移植する話です。前回はLinux上で動作確認しました。今回は想定する組み込み環境と移植作戦&移植です。
想定する組み込み環境は下記のとおりです。
改造元にするコードは何でも良いですけど、私は動作するコードから出発した方がやりやすいので、前回Linux上で動作を確認した実装(src/SDL/*)をベースに改造します。移植にあたって障害となりそうなものは、
この辺の機能が移植先の組み込み環境に存在しないことです。順番に対処しましょう。
SDL(Simple DirectMedia Layer、公式サイトへのリンク、リポジトリへのリンク)はC/C++から簡単にグラフィクスや音声、各種入力機能が利用できる、素敵なライブラリです。が、しかし移植先の環境にSDLなど高等なものはないのでSDLを使用している箇所は削除します。
メイン(src/SDL/i_main.c)、サウンド(src/SDL/i_sound.c)、画面(src/SDL/i_video.c)とジョイスティック入力(src/SDL/i_joy.c)はSDL.hをインクルードか、SDLの構造体やマクロを使用していてコンパイルエラーになるので、エラーになる箇所を全て削除します。
サウンド(src/SDL/i_sound.c)、とジョイスティック入力(src/SDL/i_joy.c)は動作しなくても問題を起こさないように、常に成功もしくは無意味な値を返すように改造します。
ゲームエンジンを動作させるにはprboom2ビルド時に生成されるprboom.wadとIWADファイル(オリジナルのDOOMのWADを指してこのように呼ぶそうです)の2つのファイルが必要です。が、移植先の環境にファイルなど高尚なものはないので、下記の作戦でファイルアクセスなしでも動作するように改造します。
ファイルアクセスを行うコードはシステム(src/SDL/i_system.c)に実装されていますので、ファイルアクセスしている実装を全部静的配列へのアクセスに書き換えます。他の場所(src/d_main.c, src/w_wad.c)のファイルアクセスしている箇所も同様に置き換えます。
ファイルアクセス機能を置き換えたので、ファイル(DOOM.WADとprboom.wad)をC言語の静的配列に変換する方法も作りましょう。
変換方法は色々あると思いますが、昔作った「CmakeでバイナリをC言語の配列に変換する」やつを使います(2023年6月16日の日記参照)。こやつは適当に作った割に意外と便利です。
画面描画を削除するとDOOMが動いているかどうかわかりません。移植先の環境に画面を描画するような高尚な機能はないので、UARTとANSIエスケープシーケンスを利用して画面描画の代わりとします。
UARTの出力を受け取る端末には文字を出力する以外にもたくさんの機能があります。端末の各種機能のなかから「背景色の設定+空白の出力」をピクセル描画の代わりとして利用します。端末によって対応する機能は異なり(ECMA-48やANSI X3.64仕様が有名)ますが、今回の実装ではANSI X3.64のカーソル移動、文字色の変更機能を使用します。大抵の端末ソフトが実装しているはずです。たぶん。
端末の文字は縦長(縦:横=2:1くらい、フォント依存です)が多いため、Space 2文字でだいたい正方形になります。つまり背景色変更 + Spece 2文字 = 1ピクセルとすれば画面の描画ができる寸法です。普通の文字サイズだと1ピクセルが大きくなりすぎるので、端末側のフォントサイズ設定で調整しましょう。
背景色を変更するエスケープシーケンスはこんな感じ。
24bit色モードであれば1つのピクセルを表現するために、エスケープシーケンス16バイト+スペース2バイト = 18バイト必要になります。極めて効率が悪いですが、とりあえず動かすために先に進みましょう。
方針が決まったところで画面描画の実装(src/SDL/i_video.c)を改造します。prboom2の画面はフルカラーではなくパレット描画なので、パレット操作をする部分も合わせて改造します。
prboom2が動作している様子(ウインドウはPuTTY、画面サイズ128x120、フォントサイズ5pt)
実際描画してみるとこんな感じです。ウインドウタイトルを見るとわかりますが、SDLによる描画ではなく端末ソフトウェアPuTTYの画面です。
とりあえず動きました。やったね。画面描画が遅い問題は、次回以降対処していこうと思います。
目次: RISC-V
みなさまはDOOMをご存じでしょうか?特に海外で超有名なFPS(First Person Shooter、一人称視点のシューティングゲーム)の草分け的な存在です。1993年にid Softwareが開発したロングセラーシリーズです。オリジナルのid Softwareによる実装も2012年にオープンソースになりました(リポジトリへのリンク)。
日本ではそれほどでもない気がしますが、海外ではDOOMの人気は絶大で海外エンジニアの間ではゲーム機ではない電子機器(プリンタ、カメラ、ATMまで)でDOOMを動作させる改造が非常に人気のようです。
DOOM移植の良いところとしては、3D描画のゲームなので画面が派手で目を引きます。それでいて昔のゲームなので、しょぼいスペックの機器でもそこそこ動きます。操作せずに放っておいてもデモが実行される点も素晴らしいです。
今回はオリジナルのDOOMではなくて、クローン実装のprboom2(リポジトリへのリンク)を使います。prboom2はLinuxで簡単に動作確認できて楽です。いいですね。
DOOMはゲームエンジンなので実行時にはゲームデータを指定しなければなりません。ゲームデータは*.WADファイル(Where's All Dataの略らしい)に格納されていて、オリジナルDOOMのWADファイルのことをIWAD(Internal WAD)と呼ぶようです。IWADはDOOMの製品版に付属しているはずです、見たことがないから知らないですけど。本来はオリジナルDOOMを購入しDOOM.WADを持ってくるべきですが、手に入れる手段がなさそうです……。
ネット検索するとIWADを公開しているサイトがあるのでどうにかして手に入れてください。Doom Wiki(リンク)にDOOM.WADのMD5 hashが掲載されているので、入手したIWADファイルがどのバージョンか(あるいは壊れていないか)確認しましょう。
今回はIWADファイルはDOOM.WAD、バージョン1.8のもので試します。
まずは普通に動かしてみます。ビルドは簡単でbootstrapとconfigureを実行してmakeするだけです。SDLがインストールされていない環境の場合はlibsdl2-devのインストールが必要かもしれません。
$ cd prboom2 $ ./bootstrap $ ./configure $ make $ ./src/prboom -iwad DOOM.WAD
DOOM同様prboom2もゲームエンジンなので実行時にはゲームデータを指定しなければなりません。ビルド時に勝手に生成されるprboom.wadファイルと、ゲームデータが入ったIWADファイル(オリジナルのDOOM、freedoomなど)の2つが必要です。prboom.wadはカレントディレクトリに置けば勝手に見つけます。IWADファイルはオプション-iwadで指定しましょう。
音声なしで起動したければ-nosound、フルスクリーンではなくウインドウモードが良ければ-nofullscreenオプションが使えます。フルスクリーンとウインドウモードの切り替えはゲーム内のオプションから設定することもできます。
確認だけで終わってしまいました。次回から組み込み環境への移植を始めたいと思います。
タイトルのとおりなのですがGitHubアカウントの2FA(二要素認証、2 Factor Authentication)で使える手法として、SMSが非推奨になりました。最近、GitHubではこんな警告が出ます。
検索用に文字起こししておくと、
Please configure another 2FA method to reduce your risk of permanent account lockout. We strongly recommend against SMS as it is prone to fraud and delivery may be unreliable depending on your region. (適当訳) アカウントが永久にロックアウトされる危険性を減らすため、他の2FA手法を設定してください。 SMSは詐欺にあいやすく地域によっては配送が信用できない場合があるので、SMSはお勧めしません。 (strongly recommend against itなので「利用を避けることを推奨する」くらい強い意味かも?)
SMSが非推奨になった理由は詳しく書かれていませんが、携帯電話番号乗っ取り被害(スマホの電話番号を乗っ取られる「SIMスワップ」被害が増加 求められる対策とは? - ITmedia NEWS)を受けてのものでしょう。
SMS以外の2FA手法は下記のものがあります。
Authenticator appが最もお手軽でしょう。スマホに過剰に依存するのはあまり好きじゃないですけど。Authenticator appはスマホの紛失や破損で設定が消し飛ぶと2FAできなくなる弱点がありますから、設定のバックアップが取れるアプリを選択すると良いと思います。
例えばGoogle Authenticatorなら[アカウントを移行] - [アカウントのエクスポート]とするとQRコードが表示され、別のスマホに設定を丸ごと移行可能です。アカウントエクスポート用のQRコードがバックアップデータ代わりになりそうですが、時間制限とかあるんですかね??
Security keysはどうかと調べてみると、1つ1万円〜2万円(YubiKey 5 NFC, YubiKey 5 bio)となかなかのお値段でした。これも紛失や破損に備えるなら2つ購入した方が良いでしょうから、GitHubの2FAのために2万円〜4万円払えるか?というとうーん、嫌ですね……。
しばらくはAuthenticator appで運用したいと思います。
目次: 自宅サーバー
昔買って放置していた秋月のGPS受信機キット(太陽誘電のGYSFDMAXBを使用しているそうな)を組み立てて、サーバーPCに接続しました。GPSが送ってくるNMEAメッセージはgpsdが一旦受け取りますが、このメッセージをローカルマシン以外から見る方法が地味にわからなかったのでメモしておきます。環境はDebian Bookwarmです。
どうやらgpsdは直接ソケットをlistenしているわけではなく、gpsd -> systemd -> 外部という形になっているようです。まずsystemdの設定を変更します。
# /etc/systemd/system/sockets.target.wants/gpsd.socket [Socket] ListenStream=/run/gpsd.sock #ListenStream=[::1]:2947 #ListenStream=127.0.0.1:2947 # To allow gpsd remote access, start gpsd with the -G option and # uncomment the next two lines: ListenStream=[::]:2947 ListenStream=0.0.0.0:2947 SocketMode=0600 BindIPv6Only=no
次にgpsdの設定を変更します。オプションに-G(外部からの接続を受け付けるためのオプション)を追加します。
# /etc/default/gpsd # Other options you want to pass to gpsd GPSD_OPTIONS="-G"
設定を反映します。
# systemctl daemon-reload # systemctl restart gpsd.socket # systemctl restart gpsd.service # netstat -tlp | grep gpsd tcp 0 0 0.0.0.0:gpsd 0.0.0.0:* LISTEN 1/init
設定を反映するとsystemd(pid=1, initプロセス)がポートgpsd(= 2947)をlistenしていること、listenアドレスがlocalhostではなく0.0.0.0つまりinaddr_anyになっていることが確認できます。
あとは外部のマシンからxgps (gpsdが動いているマシンのIP):2947などとすれば、gpsdに接続してNMEAメッセージが届いていることを確認できるはずです。
NMEAメッセージは送ってきてくれますが、窓際に設置して1時間位放置してもまったくGPS衛星を捕捉しません。壊れてしまったのだろうか……。
< | 2024 | > | ||||
<< | < | 06 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | - | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | - | - | - | - | - | - |
合計:
本日: