aburi6800のブログ

コンピュータのプログラミング、ゲームに関するニッチな情報を書いていくブログです。

【Obsidian】Obsidian gitプラグイン

f:id:aburi6800:20210725005439p:plain

(2022/4/13 加筆修正しました)

Obsidian gitプラグインとは

Obsidianからgitのローカル/リモートリポジトリ操作を行えるプラグイン
予めVaultに対してgitの操作を行い、githubなどのリモートリポジトリと関連付けさせておく必要があるため、gitの知識があることが前提となりますが、利用できるのであればほぼ自動でバックアップしてくれるので便利なプラグインです。

ここでは、プラグインのドキュメント、設定画面の和訳と、具体的な利用方法を記載します。

個人的にはGoogleドライブやOne Driveなどのクラウドストレージはいつ壊れてもおかしくないと考えているので、githubに保存できるのは安心。

目次

プラグイン配布元

Obsidian gitプラグインは、以下で公開されています。

github.com

プラグインドキュメント和訳

Obsidian.mdのデータ保管庫をリモートのgitリポジトリGitHubのプライベートリポジトリなど)にバックアップするためのシンプルなプラグインです。
このプラグインは、認証情報が設定されていることを前提にしています。

git でデータ保管庫をバックアップすることの利点については、@tallguyjenks による素晴らしい記事を読むことをお勧めします。

このプラグインは現時点ではモバイルでは動作しません。更新については #57 を参照してください。

1. インストール方法

詳しい説明は、インストールガイドをご覧ください。

2. ドキュメンテーション

要件、ヒント、よくある問題などは、Wikiで確認できます。

3. 特徴

  • 保管庫の自動バックアップ(X分毎)
  • Obsidian起動時にリモートリポジトリから変更を取り込みます。
  • リモートリポジトリへの変更のプル/プッシュのためのホットキーの割り当て
  • Gitサブモジュールによる異なるリポジトリの管理

4. サイドバービュー

ソースコントロールビューでは、個々のファイルのステージングとコミットを行うことができます。
「ソースコントロールビューを開く」コマンドで開くことができます。

f:id:aburi6800:20220411000428p:plain

5. 使用可能なコマンド

  • Create Backup(バックアップを作成する): すべての変更をコミットし、バックアップ時にプッシュするかどうかの設定に応じてプッシュします。
  • Create Backup with specific message(特定のメッセージでバックアップを作成する): 上記と同じですが、カスタムメッセージを使用します。
  • Commit all changes(すべての変更をコミットする): プッシュせずに全変更のコミットのみ行います。
  • Commit all changes with specific message(特定のメッセージとともにすべての変更をコミットする): 上記と同じですが、カスタムメッセージを使用します。
  • Push(プッシュ)
  • Pull(プル)
  • List changed files(変更されたファイルを一覧表示する): すべての変更点をモーダルにリストアップします。
  • Edit remotes and Remove remote(リモートの編集とリモートの削除)
  • Initialize a new repo(新しいリポジトリを初期化する)
  • Clone an existing remote repo(既存のリモートレポジトリをクローンする)

最新バージョン(執筆時点はversion 1.24.1)では、gitの基本的な操作を行うコマンドがObsidianから実行できるようになりました。
簡単な操作だけであれば、Obsidian上で全て完結できるでしょう。

6. 連絡先

フィードバックや質問がある場合は、GitHub issues または Obsidian Discord の @evrwhr までご連絡ください。

このプラグインは denolehov が最初に開発しました。3月以降は、主にVinzent03がこのプラグインを開発しています。

もし私(Vinzent03)をサポートしたいなら、Ko-fiでサポートできます。


設定画面和訳

f:id:aburi6800:20220411000733p:plain

  • Vault backup interval (minutes)
    Commit and push changes every X minutes. Set to 0 (default) to disable. (See bellow setting for further configuration!)

    X分ごとに変更をコミットしてプッシュする。
    0(デフォルト)に設定すると無効になります。(さらに詳しい設定は下の設定を見てください!)

  • If turned on, do auto backup every X minutes after last change. Prevents auto backup while editing a file. If turned off, do auto backup every X minutes. It's independent from last change.

    オンにした場合、最後の変更からX分ごとに自動バックアップを行います。
    編集中のファイルは自動バックアップしません。
    オフにした場合は、最後の変更に関係なく、X分ごとに自動バックアップを行います。

  • Auto pull interval (minutes)
    Pull changes every X minutes. Set to 0 (default) to disable.

    X分ごとに変更をプルします。
    0(デフォルト)を設定すると無効となります。

  • Sync Method
    Selects the method used for handling new changes found in your remote git repository.

    リモート git リポジトリで見つかった新しい変更の処理に使用する方法を選択します。
    訳注)通常はMergeで問題ありません。

f:id:aburi6800:20220411000717p:plain

 - Merge
 - Rebase
 - Other sync service (Only updates the HEAD without touching the working directory)

その他の同期サービス(作業ディレクトリを触らずにHEADだけ更新する)

  • Commit message on manual backup/commit Avaliable placeholders: {{date}} (see below), {{hostname}} (see below) and {{numFiles}} (number of changed files in the commit)

    手動バックアップ/コミット時のコミットメッセージ。 使用可能なプレースホルダーは以下。 {{date}} この下の日付フォーマットに従った書式の日付を埋め込みます。 {{hostname}} この下のホスト名フォーマットに従った書式のホスト名を埋め込みます。 {{numFiles}} コミットで変更されたファイル数を埋め込みます。

  • {{date}} placeholder format Specify custom date format. E.g. "YYYY-MM-DD HH:mm:ss"

    日付の書式をデフォルトから変更したいときに指定します。

f:id:aburi6800:20220411000820p:plain

  • {{hostname}} placeholder replacement Specify custom hostname for every device.

    コミットメッセージにホスト名を埋め込む場合、ホスト名を指定します。

  • Preview commit message

    訳注)Previewボタンを押すと、右上にコミットメッセージのサンプルが表示されます。

  • List filenames affected by commit in the commit body

    コミット時のファイル名の一覧をリストアップします。

  • Specify custom commit message on auto backup You will get a pop up to specify your message

    自動バックアップ時のコミットメッセージをカスタムで指定します。
    メッセージを指定するためのポップアップが表示されます。

  • Current branch
    Switch to a defferent branch.

    現在のブランチ。 別のブランチに切り替えることができます。

  • Pull updates on startup
    Automatically pull updates when Obsidian starts.

    起動時に変更を Pull する。
    Obsidianの起動時に自動的にアップデートを取得します。

  • Disable push Do not push changes to the remote repository.

    プッシュを無効にする。 リモートリポジトリに変更をプッシュしない場合にONにする。

  • Pull changes before push Commit → Pull → push (Only if pushing is enabled)

    プッシュする前に変更をプルする コミット後、プルしてからプッシュする(プッシュが有効な場合のみ)

f:id:aburi6800:20220411000846p:plain

  • Automatically refresh Source Control View on file changes
    On slower machines this may cause lags. If so, just disable this option.

    ファイル変更時にソースコントロールビューを自動的に更新する。 低速なマシンではラグが発生する可能性があります。その場合は、このオプションを無効にしてください。

  • Update submodules
    "Create backup" and "pull" takes care of submodules. Missing features: Conflicted files, count of pulled/pushed/committed files. Tracking branch needs to be set for each submodule.

    サブモジュールの更新 "バックアップの作成 "と "プル "の処理は、サブモジュールが担当します。
    不足している機能:ファイルの競合、プル/プッシュ/コミットされたファイルのカウント。 サブモジュールごとにトラッキングブランチを設定する必要があります。
    訳注)具体的にどういう設定なのかわからないため、問題が無ければオフのままで良いと思います。

  • Disable notifications
    Disable notifications for git operations to minimize distraction. (refre to status bar for updates)

    通知機能を無効にする git の操作に気を取られることがないよう、通知を無効にします。(更新はステータスバーに反映されます) 訳注)処理されるごとに右上に出る通知メッセージが鬱陶しい場合は、オンにします。

  • Show status bar
    Obsidian must be restarted for the changes to take affect.

    ステータスバーを表示する 変更を反映させるには、Obsidianを再起動する必要があります。

  • Custom Git binary path

    訳注)通常はパスが通った場所にあるため設定不要ですが、設定が必要な場合はここにgitのパスを指定します。


Obsidian gitプラグインの利用手順

ローカルのVaultにGithubのリモートリポジトリを登録し、Obsidian gitプラグインGithubへVaultの内容を保存するまでの手順を記載します。

1. 前提

ここでは、以下を前提としています。

  • 既にObisidanを利用しており、Vaultのディレクトリがあること。
  • githubにアカウントを持っていること。
  • githubSSH接続する設定を行っていること。
  • gitの利用経験があること。

なお、まっさらな新規Vaultを作るところからで良い場合は、Githubに適当なリポジトリを作成し、ローカルにcloneしてくるやり方が一番簡単です。

2. Valutをローカルリポジトリにする

ObsidianのVaultにしているディレクトリで、git bashなどを使用して、以下コマンドを実行します。

$ git init

既にVaultにファイルがある場合は、以下を実行してコミットします。
(git commitのメッセージは例です、好きな内容に変更してください)

$ git add -A
$ git commit -M 'first commit.'

ここまでの手順で、ローカルのValutがgitリポジトリとなり、ファイルがあれば登録された状態になります。

3. githubにリモートリポジトリを作成する

続いて、githubにローカルのVaultを保存するためのリポジトリを作成します。
githubの自分のページでRepositoriesタブを開き、「NEW」ボタンをクリック。

f:id:aburi6800:20220413233316p:plain

リポジトリ名を指定して作成します。
Publicだと誰からも見られてしまうため、Privateにしてください。

f:id:aburi6800:20220413233430p:plain

4. ローカルリポジトリgithubのリモートリポジトリを追加する

Githubリポジトリが作成されると、以下にようにクイックセットアップページが表示されます。

f:id:aburi6800:20220413233847p:plain

基本的にはここに書かれている通りにコマンドを実行していきます。
コマンドは、完全に新規であれば一番上の「...or create a new repository on the command line」のものになりますが、今回は既にあるリポジトリからプッシュしたいので、真ん中の「...or push an existing repository from the command line」の手順を実行します。
なお、このコマンドはリポジトリ名に応じて自動的に生成されるものなので、実際は作成したリポジトリで表示されたコマンドを使用してください。

また、ローカルのリポジトリ名(ディレクトリ名)とリモートのリポジトリ名は一致している必要はありません。

ここまでの操作で、ローカルのgitリポジトリgithubのリモートリポジトリが登録され、相互に通信ができる状態になります。
あとは、自動的にGithubにValutの内容がバックアップされるように、Obsidian gitプラグインの設定を行います。

5. Obsidian gitプラグインを設定する

各設定値については先の和訳を参照頂くとして、参考として私の設定している内容を記載しておきます。(ほとんど設定を変更していません)

設定項目
Vault backup interval (minutes) 10
If turned on, do auto backup every X minutes after last change. ... オン
上記以外 初期値のまま

右上の表示が鬱陶しくなったら、「Disable notifications」をオンにするかもしれません。

モバイルアプリとの共存について

PCだけでObsidianを利用する場合は、各端末でそれぞれリモートリポジトリをcloneして同じ設定をしていけば、Github経由でVaultが同期できます。
しかし、モバイルアプリも併用すると、問題が発生します。
モバイルアプリではObsidian gitプラグインが(この記事を執筆している4/14時点では)利用できないため、Vaultの同期は別のクラウドストレージを利用して行うしかありません。
この場合、GithubはあくまでPCからのバックアップ、という目的で利用することになります。
例えば、私の場合は以下のような構成で運用しています。

f:id:aburi6800:20220413231143p:plain
モバイルアプリと共存した運用イメージ

一見して無駄に思えるかも知れませんが、Githubはブラウザからアクセスしてデータを検索・参照できますし、過去の更新履歴も保存されますので、バックアップ目的としても充分有用です。
ObsidianのVaultは個人的なデータを蓄積していく大事なものですので、Githubという信頼性の高いシステムにバックアップできるのは非常に安心材料なのではないかと考えます。

さいごに

Obsidian gitプラグインは比較的開発が活発なので、この記事も都度アップデートできればと思います。
(この記事を書いた時点で、既に1.25.0が公開されている)

【MSX】AndroidでMSXクロス開発環境を構築する(3)

今回は、ubuntuにz88dkとcode-serverをインストールし、Z80アセンブラの開発を行えるようにします。
最後に簡単なサンプルプログラムを作り、動作確認を行います。
これまでの作業については、以下の記事を参照してください。

aburi6800.hatenablog.com

aburi6800.hatenablog.com

z88dkのインストール・設定

z88dkをソースからビルドします。
手順は以下のサイトに詳しく書いてありますが、一応記載しておきます。

github.com

まず、適当なディレクトリで以下を実行してソースを取得します。
ここではホームディレクトリで実行する前提で進めます。

git clone  --recursive  https://github.com/z88dk/z88dk.git

依存関係のあるライブラリをインストール。

sudo apt install build-essential dos2unix libboost-all-dev texinfo texi2html libxml2-dev subversion bison flex zlib1g-dev m4 libtemplate-perl libtemplate-plugin-yaml-perl libfile-slurp-perl ragel re2c

恐らく上記で依存関係にある上位のパッケージが無くてもインストールされると思いますが、ビルド時にエラーになった場合は不足しているパッケージを追加でインストールしてください。

以下コマンドを順次実行してビルド。

cd z88dk
export BUILD_SDCC=1
chmod 777 build.sh
./build.sh

現在はシステムインストールは完全にサポートされていないため、ビルド後の z88dk\bin に直接パスを通すことで使用します。
~/.bashrc の最後に以下を追加します。

export Z88DK_HOME=~/z88dk
export PATH=${PATH}:${Z88DK_HOME}/bin
export ZCCCFG=${Z88DK_HOME}/lib/config

最初にホームディレクトリ以外でソースの取得を行った場合は、Z88DK_HOMEディレクトリを適切なパスに置き換えてください。

追加後、以下を実行して設定を反映させます。

source ~/.bashrc

以下でコマンドにパスが通っていることを確認できます。

zcc

code-serverのインストール・設定

Termuxのubuntu環境では、code-serverを起動し、ブラウザからVS Codeを使用します。
code-serverのインストール手順は以下サイトに書かれています。

coder.com

具体的には、インストールスクリプトが用意されているので、それを実行するだけです。
スクリプトを取得するためにcurlをインストールします。

sudo apt install curl

その後、ホームディレクトリでインストールスクリプトを取得して実行します。

curl -fsSL https://code-server.dev/install.sh | sh

インストール完了後、デフォルトではパスワード入力を要求される設定になっています。
ここでは、ローカルから自分のみアクセスする想定ですので、パスワードを無効にします。

sed -i.bak 's/auth: password/auth: none/' ~/.config/code-server/config.yaml

code-serverを起動します。

code-server &

起動までしばらく時間がかかります。
以下のようなメッセージがコンソールに表示されたら、起動完了です。

[2022-03-16T16:44:13.482Z] info HTTP server listening on http://127.0.0.1:8080/  
[2022-03-16T16:44:13.482Z] info - Authentication is disabled  
[2022-03-16T16:44:13.483Z] info - Not serving HTTPS

ブラウザアプリを起動し、以下のURLにアクセスします。

http://127.0.0.1:8080

画面が表示されたら、必要な拡張機能を入れて準備完了です。
具体的な方法は、一般的なVSCodeの使用方法と同じですので、ここでは割愛します。
日本語化するのと、Z80アセンブラの開発を行うため、以下の拡張機能を入れることを推奨します。

テストプログラムの作成

適当なディレクトリを作り、 hello.asm のファイル名で新規ファイルを作り、以下のコードを貼り付けます。

SECTION code_user
PUBLIC _main
_main:

CHGMOD:    EQU $005F            ; BIOS スクリーンモード変更
WRTVRM:    EQU $004D            ; BIOS WRTVRM
LINL32:    EQU $F3AF            ; WIDTH値

    LD A,1                      ; Aレジスタにスクリーンモードの値を設定
    CALL CHGMOD                 ; BIOS スクリーンモード変更
    LD A,32                     ; AレジスタにWIDTHの値を設定
    LD (LINL32),A               ; Aレジスタの値をワークエリアに格納

    LD HL,$1800                 ; 表示開始アドレス
    LD DE,TEXT                  ; 表示データアドレス

PRTSTR:
    LD A,(DE)                   ; AレジスタにDEレジスタの示すアドレスのデータを取得
    OR A                        ; 0かどうか
    JR Z,PRTSTR_END                ; 0の場合はPRTSTR_ENDへ
    CALL WRTVRM                 ; BIOS WRTVRM呼び出し
                                ; - HL : 書き込み先のVRAMアドレス
                                ; - A  : 書き込むデータ
    INC HL                      ; HL=HL+1
    INC DE                      ; DE=DE+1
    JR PRTSTR

PRTSTR_END:
    JR PRTSTR_END               ; 無限ループ

SECTION rodata_user
TEXT:
    DB "HELLO MSX !",0

コンソールで以下コマンドを実行して、コンパイルします。

zcc +msx -create-app -subtype=rom hello.asm

以下のメッセージが表示され、ソースのディレクトリにa.romが出来ていれば、コンパイル成功です。

Program requires cartridge with 1 16k ROM banks
Notice: Available RAM space is 16173 bytes ignoring the stack
Adding main bank 0x00 (16206 bytes free)

作成した.romファイルを、他のアプリから参照できるように、端末のストレージへコピーします。
内部ストレージは直接アクセスできないアプリがあるため、SDカードにコピーします。
コピー先のディレクトリを調べるには、以下のようにします。

cd /storage
ls -al

以下のようなディレクトリリストが表示されます。

合計 0  
drwxr-xr-x  5 root    root             100 3月 19 19:32 .  
drwxr-xr-x 22 hitoshi hitoshi         4096 3月 19 21:07 ..  
drwxr-xr-x  3 root    aid_everybody 131072 3月 19 19:32 129B-6156  
drwx--x--x  4 root    aid_everybody   4096 8月 13  2019 emulated  
drwxr-x--x  2 root    root              60 3月 19 19:32 self  
hitoshi@localhost:/storage$

このうち、emulatedは内部ストレージ、129B-6156のような名前のディレクトリ(環境によって異なる)がSDカードになります。
129B-6156の部分は自分の環境に合わせて読み替えてください。

cp <ソースを作成したディレクトリ>\a.rom \storage\129B-6156\Android\data\com.termux\files

com.termuxディレクトリまではあると思いますが、filesディレクトリが無ければ作成してください。

動作確認は色々な手段がありますが、今回は webmsx を使用します。
ブラウザから以下サイトにアクセスします。
WebMSX

画面左下の電源ボタンをクリックし、Open Fileを選択、ファイル選択ダイアログから先ほどのディレクトリのa.romを選択します。
画面に文字が表示されれば成功です。

RAMが4Gの場合は、ブラウザによってはメモリ不足のエラーが出ることがあります。 その場合は、OpenMSXなどのエミュレータアプリをインストールして実行してください。

さいごに

ここまでの作業で、Android上にz88dkとVSCode(code-server)を使ったMSXクロス開発環境ができました。
z88dkを使っていますのでC言語での開発もできますし、SDCC互換ライブラリも導入していますので、SDCCで開発したものでも簡単に移行できると思います。
なお、以下URLに便利なテンプレートプロジェクトやcmakeでのビルドなどが記載されていますので、参考にすると良いでしょう。

maple4estry.netlify.app

ではでは。

【MSX】AndroidでMSXクロス開発環境を構築する(2)

今回は、ubuntuにgit環境を構築し、GitHubSSH通信するまでの設定を行います。
一般的な内容になりますので、詳細は色々と検索すると出てくるかと思います。
Android上にubuntu環境を構築するまでの手順については、前回の記事を参照願います。

aburi6800.hatenablog.com

ubuntuへのgitインストール・設定

(1) インストール

以下コマンドを実行して、gitをインストールします。

sudo apt update
sudo apt install git

よくaptではなくapt-getでインストールする、という手順が書かれていますが、結論からするとどちらでも良いです。
apt-getはAPTの最初のコマンドラインベースフロントエンドで、その設計上のミスを克服したものがaptになります。
ubuntuの14.04以降からaptコマンドが推奨されています。

gitのインストール結果を確認します。

git --version

(2) 設定

初期設定として、まず、以下を設定します。
これらは、コミット履歴などで他ユーザーから見える情報です。

git config --global user.ename = '<ユーザー名>'
git config --global user.email = '<メールアドレス>'

続いて、git pushする際にブランチ名/タグ名を指定しなかったときの挙動を設定します。

git config --global push.default 'simple'

ここで設定する値と意味は以下になります。

  • simple
    • 現在のブランチをupstreamのブランチにpushする。ただしupstreamのブランチ名が現在のブランチ名と違っている場合はpushしない。
  • matching
    • 同名のブランチをpushする。
  • nothing
    • refsが設定されてない場合はpushしない。
  • current
    • 現在のブランチを同名のリモートブランチにpushする。
  • upstream
    • 現在のブランチをupstreamのブランチにpushする。

これまでのデフォルトはmatchingでしたが、git 2.0以降からはsimpleになっているようです。
以前と同じ挙動にしたい場合は、matchingを指定してください。

最後に、これは任意ですが、git commitなどを行った際に使うツールの設定を行います。
VS CodeWindowsでもLinuxubuntu)でも使えるので、設定しておくと便利かと。

git config --global code.editor 'code --wait'
git config --global merge.tool 'code --wait "$MERGED"'

設定値の確認は、以下で行います。

git config --global --list

GitHubSSH通信する設定を行う

GitHubSSH通信するための設定を行います。
SSH キーを使用すると、アクセスのたびにユーザ名と個人アクセストークンを入力することなく GitHub に接続できます。
手順の詳細については、以下の記事を参照願います。

aburi6800.hatenablog.com

なお、上記で記載した手順はWindows(Git bash)で実行するものですが、Linux(ubuntu)でも同じ手順になります。

以上で、Termux上のubuntuにgitの環境を構築しました。
次回はクロス開発環境であるz88dkと、VS Codeをブラウザから使うためのCode-Serverのインストールを行います。

【MSX】AndroidでMSXクロス開発環境を構築する(1)

はじめに

今回から数回に分けて、Android端末にMSX開発環境を構築する手順を紹介します。
とは言え、AndroidMSX開発用のアプリという都合のいいものはないので、AndroidにPCと同様の開発環境(※1)を構築することにします。
具体的には、gitでソースのバージョン管理、VSCodeでソースの編集、z88dkでZ80のCまたはアセンブラソースからromファイルを作成、WebMSXで実行という構成になります。
宜しければお試しください。

※1
ほぼ同様で、違いと言えば実行環境がPCほど選べない(アプリで提供されているMSXエミュレータかWebMSXが選択肢となる)のと、デバッグ環境が無いところだけが違いです。
とはいえ、このデバッグ環境がないのが、結構ツラいところですが・・・

全体の流れ

全体の流れは、以下になります。

  1. Android端末上にLinuxubuntu)環境を構築する
  2. ubuntuにgitをインストール、GitHubSSH通信する設定を行う
  3. ubuntuにz88dkをインストールする
  4. ubuntuにcode serverをインストールする
  5. テストプログラムをコンパイルし、MSXエミュレータ上で実行する

今回は、「1. Android端末上にLinuxubuntu)環境を構築する」部分について記載します。

1.AndroidLinux環境を構築する

(1) Termuxのインストール

まず、AndroidLinux環境を構築します。 これにはroot権限不要でLinux環境を構築できる「Termux」というアプリを使用します。
詳細については以下リンク先を参照してください。
Termux wiki

なお、以前はPlayストアで配信されていましたが、現在はF-Droidで配信されているものを使用することになっています。(Android7.0以降に対応)
F-Froid / Termux

基本的には、apkをダウンロードしてインストールするだけです。

ここで、自分のAndroid端末へのapkのインストール方法が判らない場合は、この先に進むのは止めた方が良いと思います。

(2) Termuxの設定

ダウンロード後の最初の起動時に権限を求められるので、それぞれ許可してください。
その後、コマンドプロンプトが表示されます。

Termuxは基本的にシングルユーザーのため、rootで使用します。特にユーザーの追加などは不要です。
まず、TermuxからSDカードなどにアクセスできるよう、以下のコマンドを入力します。

pkg update && pkg install termux-setup-storage

この結果、ホームディレクトリに storage ディレクトリが作成され、内部ストレージやSDカードにアクセスできるようになります。
以下は、pkg install後のディレクトリ内容を確認した例です。

~ $ ls -al
total 24
drwx------ 4 u0_a245 u0_a245 4096 Mar  5 22:38 .
drwxrwx--x 4 u0_a245 u0_a245 4096 Feb 20 19:06 ..
-rw------- 1 u0_a245 u0_a245  302 Mar  5 22:25 .bash_history
-rw------- 1 u0_a245 u0_a245   26 Feb 20 19:22 .bashrc
drwx------ 2 u0_a245 u0_a245 4096 Feb 20 19:06 .termux
drwx------ 2 u0_a245 u0_a245 4096 Feb 23 00:44 storage
~ $ cd storage/
~/storage $ ls -al
total 8
drwx------ 2 u0_a245 u0_a245 4096 Feb 23 00:44 .
drwx------ 4 u0_a245 u0_a245 4096 Mar  5 22:38 ..
lrwxrwxrwx 1 u0_a245 u0_a245   24 Feb 23 00:44 dcim -> /storage/emulated/0/DCIM
lrwxrwxrwx 1 u0_a245 u0_a245   28 Feb 23 00:44 downloads -> /storage/emulated/0/Download
lrwxrwxrwx 1 u0_a245 u0_a245   48 Feb 23 00:44 external-1 -> /storage/129B-6156/Android/data/com.termux/files
lrwxrwxrwx 1 u0_a245 u0_a245   26 Feb 23 00:44 movies -> /storage/emulated/0/Movies
lrwxrwxrwx 1 u0_a245 u0_a245   25 Feb 23 00:44 music -> /storage/emulated/0/Music
lrwxrwxrwx 1 u0_a245 u0_a245   28 Feb 23 00:44 pictures -> /storage/emulated/0/Pictures
lrwxrwxrwx 1 u0_a245 u0_a245   19 Feb 23 00:44 shared -> /storage/emulated/0
~/storage $

(3) ubuntuのインストール

上記でインストールしたTermuxはDebianベースのLinux環境ですが、若干使い勝手が悪いため、ubuntu環境を使えるようにします。
PCでもubuntuを使っているという場合は、同じコマンドを使えるので、この方が便利だと思います。
もしDebianに慣れている場合は、以降はスキップしても問題ありません。

ます、コンソールで以下のコマンドを実行し、prootproot-distroをインストールします。

pkg install proot proot-distro

その後、以下コマンドで、ubuntuをインストールします。

proot-distro install ubuntu

インストールが完了したら、以下コマンドで確認します。

proot-distro list

ubuntustatusinstalledになっていれば、インストールが成功して利用可能な状態となります。

インストール後は、以下のコマンドで、ubuntuを開始できます。

proot-distro login ubuntu

ログインできたことを確認したら、一度exitとしてubuntuから抜け、以下のコマンドを実行します。

echo 'proot-distro login ubuntu' >> ~/.bashrc

これで、次回からコマンドを実行しなくても、Termux起動後に自動的にubuntuにログインした状態になります。

(4) ubuntuの基本設定

ここまででインストールしたubuntuは、一般的にPCにインストールされるものと違い、必要最低限なものです。
GUI環境でもありませんし、日本語にも対応しておらず、wgetなどもインストールされていません。
また、シングルユーザー(root)の状態ですので、まずはubuntuの基本設定を進めていきます。

日本語ロケールへの変更

まずは日本語ロケールに変更します。
これは全ユーザーに適用されても問題ないので、root(デフォルトのユーザー)のままで行います。

pkg update && pkg upgrade -y
apt install language-pack-ja -y
locale -a

3つ目のコマンドの実行結果で、ja_JP.utf8が表示されていればインストール完了です。
引き続き、以下のコマンドを実行し、システムの設定を変更します。

echo 'export LANG=ja_JP.UTF-8' >> ~/.bashrc
echo 'export LANGUAGE="ja_JP:ja"' >> ~/.bashrc
source ~/.bashrc

一般ユーザーの追加

現状ではrootでの作業となり危険ですので、一般ユーザーを追加します。
まず、sudoがないため、以下コマンドを実行します。

apt update
apt dist-upgrade
apt install sudo

その後、ユーザーを追加し、sudoグループに追加します。

adduser <ユーザー名>
gpasswd -a <ユーザー名> sudo

最後に、シェル起動時のスクリプトsuするコマンドを追加し、実行します。

echo 'su <ユーザー名>' >> ~/.bashrc
source ~/.bashrc

ここで、プロンプトが以下の表示になっていれば成功です。

<ユーザー名>@localhost:/root$

ただし、sudoコマンドが使えない場合があります。(少なくとも私は使えなかった)
その場合は一度exitしてrootに戻り、以下コマンドを実行して、設定ファイルを編集します。
一行目は初回のみ必要なものです。

apt install vim
visudo

vimの画面になるので、以下の行を追加します。

:
root ALL=(ALL:ALL) ALL
<ユーザー名> ALL=(ALL:ALL) ALL    ←この行を追加
:

この後、su <ユーザー名>とすると、sudoが使えるようになっていると思います。

意味的にはrootと同じ権限をユーザーに与えるということなので、実際はユーザーを切り替える必要性はあまりありません。 しかし、一般的な情報にある手順はsudoコマンドを使うものですので、読み替えしなくても使えるというメリットはあります。

なお、suした後のカレントディレクトリがrootのホームディレクトリになっています。
これをユーザーのホームディレクトリに変更するには、一般ユーザーでログインした状態で以下のようにします。

echo 'cd ~' > ~/.bashrc
source ~/.bashrc

以上で、Termuxにubuntuをインストールし、必要最低限の設定を行いました。
次回はgitをインストールし、GitHubSSH通信するための設定を行います。

【MSX】ubuntu20.04でopenMSX+debuggerの環境を構築する

WindowsにはblueMSXというデバッガ機能を内蔵した強力なエミュレータがあるが、Linux(ubuntu)には用意されていない。
そこで、openMSXに用意されているdebuggerを使って、デバッグ環境を構築してみる。
なお、openMSXはリポジトリからのインストールも可能だが、今回はgithubに公開されているソースからビルドする。

openMSXのインストール

githubからcloneする。

$ git clone https://github.com/openMSX/openMSX.git

configureする。

$ cd openMSX
$ ./configure

すると以下の出力がされる。

Using Python: python3
Probing target system...
Creating derived/x86_64-linux-opt/config/probed_defs.mk...
Creating derived/x86_64-linux-opt/config/systemfuncs.hh...

Found libraries:
  ALSA:             version 1.2.2
  GLEW:             no
  libogg:           no
  libpng:           version 1.6.37
  libtheora:        no
  libvorbis:        no
  OpenGL:           version 4.6
  SDL2:             version 2.0.10
  SDL2_ttf:         no
  Tcl:              version 8.6.10
  zlib:             version 1.2.11

Components overview:
  Emulation core:   no
  GL renderer:      no
  Laserdisc:        no
  ALSA MIDI:        yes

Customisable options:
  Install to        /opt/openMSX
  (you can edit these in build/custom.mk)

Please install missing libraries and headers and rerun "configure".

If the detected libraries differ from what you think is installed on this system, please check the log file: derived/x86_64-linux-opt/config/probe.log

このうち、Found Librariesのところでnoと出ているのが不足しているライブラリになる。
追加でインストールする。

$ sudo apt install libglew-dev
$ sudo apt install libogg-dev
$ sudo apt install libtheora-dev
$ sudo apt install libvorbis-dev
$ sudo apt install libsdl2-ttf-dev

make、install。

$ sudo make
$ sudo make install

起動する。
BIOSを適切に配置して設定すると実機と同様にBASICが使えるが、素の状態ではC-BIOSという互換BIOSが起動する。

$ openmsx &

f:id:aburi6800:20210831223109p:plain
C-BIOSでのopenMSXの起動

debuggerのインストール

OpenMSX debuggerにはqt5が必要なのでインストールする。

$ sudo apt install qtbase5-dev qttools5-dev-tools qt5-default

githubからcloneする。

$ git clone https://github.com/openMSX/debugger.git

configureはないので、そのままmake。

$ cd debugger
$ make

するとエラーが出る。

Compiling DebuggerForm.cpp...
src/DebuggerForm.cpp: In member function ‘void DebuggerForm::createForm()’:
src/DebuggerForm.cpp:624:45: error: ‘SkipEmptyParts’ is not a member of ‘Qt’
  624 |   QStringList s = list.at(i).split(" ", Qt::SkipEmptyParts);
      |                                             ^~~~~~~~~~~~~~
src/DebuggerForm.cpp: In member function ‘void DebuggerForm::setDebuggables(const QString&)’:
src/DebuggerForm.cpp:1454:38: error: ‘SkipEmptyParts’ is not a member of ‘Qt’
 1454 |  QStringList l = list.split(" ", Qt::SkipEmptyParts);
      |                                      ^~~~~~~~~~~~~~
make: *** [build/main.mk:326: derived/obj/DebuggerForm.o] Error 1

表示されたとおり、Qt::SkipEmptyPartsqtにないよ、と言われている。
調べてみると現在のバージョンでは廃止になっているようで、代わりにQString::SplitBehavior::SkipEmptyPartsを使う模様。
エラーに出ているsrc/DebuggerForm/cppの624行目と1454行目の該当箇所を書き換えて、改めてmake。

2021/9/9 追記
z88dkの.mapを読んでdisassemblerウィンドウにラベルを表示するパッチを適用する。
以下からzipを取得して展開。
[openmsx-debugger で z88dk の -m 形式の .map symbol を読ませる hack (github.com)]
中にある0001-add-z88dk-symbol-read-hack.patchopenmsx-debuggerディレクトリに配置し、以下コマンドを実行。
$ patch -p1 < 0001-add-z88dk-symbol-read-hack.patch
@h1romas4さん、ありがとうございました!

無事にコンパイルできたら、openmsxと同じ場所にコピーしておく。(make installは用意されていない)

$ sudo cp -p derived/bin/openmsx-debugger /usr/local/bin

起動してみる。

$ openmsx &
$ openmsx-debugger &

起動したデバッガーウィンドウのメニューから[System]-[Connect]を選ぶか、[Ctrl]+[C]を押す。

f:id:aburi6800:20210831223214p:plain
openMSXへの接続
メモリやレジスタなどの情報が表示されれば、ひとまず成功。
f:id:aburi6800:20210831223245p:plain
openMSXへの接続後の状態

補足

この記事の内容は、ubuntu20.04、及びWindows10+WSL2のubuntu20.04で実施済です。
また、記事執筆時点(2021/8/31)でのソース及びライブラリの状態での結果ですので、今後はエラーが解消していたり、新しいエラーが発生する可能性があります。
この記事を参考に作業される場合は、上記をご理解の上、行ってください。

【MSX】GALAXY ZONE

これまでのMSX-BASICの研究結果をもとに、ちょっとしたゲームを作ってみました。
以下のURLで遊べます。
webmsx.org

遊び方

  • しばらく待って、タイトルが出たらSPACE or Aボタンでスタート。

    f:id:aburi6800:20210815133037p:plain
    タイトル画面

  • カーソルキー or コントローラの左右で移動、スペースキーで前進して、ミサイルを動かします。

  • ステロイドにぶつからないように、画面上部のマザーシップを破壊してください。

    f:id:aburi6800:20210815133215p:plain
    ゲーム画面

  • 以下のいずれかの条件でミスになります。

    1. ステロイドに当たった
    2. 燃料がなくなった
    3. マザーシップに当てられなかった
  • 3回ミスするとゲームオーバーです。

ソースなど

githubでもソースとディスクイメージを公開しています。
詳細については、こちらを参照してください。
github.com

ではでは。

【MSX】MSX-BASICの研究(2) PRINTとVPOKEの性能比較

この記事について

MSXでキャラクタを画面表示する際には、PRINTを使うよりはVPOKEを使う方が速いのだが、ではどれくらい速度差があるのだろうか?
具体的に数値として知らなかったので、調べてみました。

テスト方法

今回のテスト方法は、以下の方針としています。

  • WebMSXで実施。
  • 一般的に使用される、SCREEN 1、WIDTH 32、DEFINT A-Zで初期化した状態で実行する。
  • 文字表示を1,000回繰り返し、経過時間を測る。(TIMEを使用)

1文字表示編

パターン1:PRINT(セミコロンなし)

プログラムリスト

10 SCREEN 1:WIDTH 32:DEFINT A-Z
20 TI=TIME
30 FOR I=0 TO 999:LOCATE 0,0:PRINT "A":NEXT
40 LOCATE 0,5:PRINT "TIME="; TIME-TI

結果

f:id:aburi6800:20210811013101p:plain
パターン1の実行結果

パターン2:PRINT(セミコロンあり)

プログラムリスト

10 SCREEN 1:WIDTH 32:DEFINT A-Z
20 TI=TIME
30 FOR I=0 TO 999:LOCATE 0,0:PRINT "A";:NEXT
40 LOCATE 0,5:PRINT "TIME="; TIME-TI

結果

f:id:aburi6800:20210811013357p:plain
パターン2の実行結果

パターン3:VPOKE

プログラムリスト

10 SCREEN 1:WIDTH 32:DEFINT A-Z
20 TI=TIME
30 FOR I=0 TO 999:VPOKE &H1800,&H41:NEXT
40 LOCATE 0,5:PRINT "TIME="; TIME-TI

結果

f:id:aburi6800:20210811013510p:plain
パターン3の実行結果

比較結果

パターン 概要 処理時間
1 PRINT(セミコロンなし) 355
2 PRINT(セミコロンあり) 305
3 VPOKE 116

VPOKEPRINTの2倍以上速いという結果になりました。
また、PRINTも、セミコロンをつけることで若干高速化されています。

2×2キャラクタ表示編

パターン4:PRINT(セミコロンなし)

プログラムリスト

10 SCREEN 1:WIDTH 32:DEFINT A-Z
20 TI=TIME
30 FOR I=0 TO 999:LOCATE 0,0:PRINT "マイ":LOCATE 0,1:PRINT "コン":NEXT
40 LOCATE 0,5:PRINT "TIME="; TIME-TI

結果

f:id:aburi6800:20210811013748p:plain
パターン4の実行結果

パターン5:PRINT(セミコロンあり)

プログラムリスト

10 SCREEN 1:WIDTH 32:DEFINT A-Z
20 TI=TIME
30 FOR I=0 TO 999:LOCATE 0,0:PRINT "マイ";:LOCATE 0,1:PRINT "コン";:NEXT
40 LOCATE 0,5:PRINT "TIME="; TIME-TI

結果

f:id:aburi6800:20210811013907p:plain
パターン5の実行結果

パターン6:VPOKE

プログラムリスト

10 SCREEN 1:WIDTH 32:DEFINT A-Z
20 TI=TIME
30 FOR I=0 TO 999:VPOKE&H1800,&HCF:VPOKE&H1801,&HB2:VPOKE&H1820,&HBA:VPOKE&H1821,&HDD:NEXT
40 LOCATE 0,5:PRINT "TIME="; TIME-TI

結果

f:id:aburi6800:20210811014019p:plain
パターン6の実行結果

比較結果

パターン 概要 処理時間
4 PRINT(セミコロンなし) 733
5 PRINT(セミコロンあり) 633
6 VPOKE 362

1文字表示の時と比べての処理時間は、PRINTは約2倍強ですが、VPOKEは約3倍強ほどになっています。
これは、プログラムリストの通り、キャラクタの数だけVPOKEする(=4回実行する)必要があるためですが、それを差し引いても、PRINTよりは速いですね。
通常、ゲームで表示するパターンは2×2キャラクタ(16×16ドット)が多いと思われるため、なるべくVPOKEを使うことで高速化が見込めると思います。

余談

なお、VPOKEする値を10進数で書いて計測もしてみたのでが、16進数の時とほとんど変わりませんでした。
MSXのBASICプログラムでは、16進数、10進数のどちらで書いても良いと思います。


※2021/8/11追記: エスケープシーケンスで、1回のPRINT文で2×2キャラクタを表示した場合の処理速度を計測してみました。

パターン7:PRINT(エスケープシーケンス使用)

プログラムリスト

10 SCREEN 1:WIDTH 32
20 TI=TIME
30 FOR I=0 TO 999:LOCATE 0,0:PRINT "マイ"+CHR$(29)+CHR$(29)+CHR$(31)+"コン";:NEXT
40 LOCATE 0,5:PRINT "TIME="; TIME-TI

CHR$(29)がカーソル左移動、CHR$(31)がカーソル下移動になります。

処理結果

f:id:aburi6800:20210811091619p:plain
パターン7の処理結果

結果、961とPRINT2回より遅いという結果になりました。
MZとかだと速かった気がしたんですけど、MSXだと結構遅かったのですね…。


関連記事

【MSX】MSX-BASICの研究(1) 条件分岐ロジック - aburi6800のブログ