【β版開発室】データベース・テーブル Create SQL 作成簡易ツール (複数データベース対応)

各種データベースをセットアップした後にいったん仮置きでデータベースやテーブルを作っておきたい人もいると思います。そんな人の為に各種 Create SQL を自動生成するツールを作ってみました。

image

今回、仮で実装(β版)しているので機能の豊富さや使いやすさは考慮していません。入力した値に合わせて SQL が生成されます。

生成できる SQL の種類は「ユーザー」「データベース」「テーブル」「レコード」です。それ以外の Create SQL は現在対応していません。また細かいパラメータはいじることはできないので、パラメータを設定したい場合は生成した SQL に対して変更を行ってください。

生成する SQL が対応しているデータベースは「SQL Server」「PostgreSQL」「MySQL」です。選択項目にバージョンが記載されていますが、仕様変更がなければ他のバージョンでも使えると思います。

使い方はサンプルデータを見てまねて入力してください。そこまで難しいものではないですがユーザビリティとしてはちょっといまいちかなと思ってます。とりあえず作ってみたかったというレベルなので利用者が多くなりそうであれば改良してみたいと思います。

生成された SQL は一つにまとまっています。複数データベースを選択した場合も1つにまとまってるので使う際は SQL を切り出して実行してください。

例のごとく Blazor (WebAssembly) で作ってるので初回表示は少し時間がかかります。頻繁に利用する場合は PWA に対応しているのでスタートメニューにアプリとして登録しておくことも可能です。

β版開発室に「ランダム文字列生成」を追加しました。

Blazor アプリの構築の勉強もかねてランダムな文字列を生成する Web アプリをβ版開発室に追加しました。

使い方はいたって簡単なので説明するほどのものではないと思います。記号については、見やすさを考慮して使いたくない記号もあるかと思いましたので個別に出力するかどうかを選択できるようにしました。

また入力内容は実行時に保存されるので次回開いたときはそのままの設定で再使用できるようになっています。

image

Blazor WebAssembly で制作したプログラムを発行するときに AOT コンパイルを行うとエラーになる場合の対処法

Blazor で作成したプログラムは AOT コンパイルを有効にするとファイルサイズの縮小や実行パフォーマンスの向上を得ることができます。

2023-03-25 23_09_58-公開

しかしいつのころからかこれを有効にして発行するとエラーになってしまう現象が発生しました。

2023-03-25 23_10_27-RandomStringGenerator - Microsoft Visual Studio

エラー文を見る限りは「wasm-tools-net6」のインストールが必要と書いており、調べてみたところ以下のコンポーネントを追加でインストールすることで解決するようでした。インストールする場合は Visual Studio のメニューの「ツール」>「ツールと機能を取得」で行うことができます。

2023-03-25 23_10_39-Visual Studio Installer

インストール後に発行したところ正常に実行することができました。

2023-03-25 23_27_48-RandomStringGenerator - Microsoft Visual Studio

β版開発室に「マークダウンを HTML に変換」を追加しました

Web サービスなどではマークダウンで記述したテキストを Web サイト上で表示する機能をよく見かけると思いますが、そのまま HTML のテキストとして使いたい場面があったりしたのでちょっと作ってみました。

image

使い方は簡単でマークダウンファイル (.md) をグレーのエリアにドロップすると HTML コードに変換されて自動でダウンロードするような仕組みになっています。

ちなみに変換される HTML は body タグ内のコードのみなので、html タグなども含めて出力したい場合は下にある HTML フォーマットを適用することもできます。フォーマットはローカルストレージに保存しているので繰り返し使用することができます。

人によってはコピペでコードが欲しかったりするかもしれませんが、まあ今回はあくまでもβ版ということでとりあえずダウンロード限定の機能として作っています。

Blazor で作っているので初回表示は遅いです。こちらで新しいバージョンを公開したりブラウザのキャッシュをクリアしない限りは2回目以降はすぐに表示されるはずです。PWA を設定しているのでローカルにインストールすることもできます。

β版開発室に「文字数カウント」を追加しました

ひさびさに Blazor を触ってみたので簡単なアプリとして入力されたテキストの文字数をカウントするアプリを作ってみました。機能としてはそれだけです。

以下のページで公開しています。PWA を設定しているのでローカルにインストールすることも可能ですが、実際には対象の Web 画面がすぐに開けるぐらいのメリットだと思います。

image

MonoGame で制作したゲーム「リトルセイバー」を Web (Blazor + WebGL) で動かしてみた話 その2

image

前回の投稿

今回の記事は前の投稿の後日談になるので前回の記事を読んでいない場合は読むことをお勧めします。

nkast.Xna.Framework.Blazor がバージョンアップされました!

ゲームフレームワーク「MonoGame」で作ったゲームを Blazor で動かせるライブラリ「nkast.Xna.Framework.Blazor」が 3.8.9100 から 3.8.9101 にバージョンアップされました!

数字を見るとマイナーバージョンアップのように見えますが、内容的にはかなり大きな改善が入っています。改修内容を見てみると私が報告した不具合と、なんと私が書いたブログの内容がいくつか反映されているようでした。

主なバージョンアップ内容

バージョンアップ内容についてはコミュニティの以下の投稿に書いてあります。(一部私宛の返信の内容になっています)

バージョンアップ内容を簡単にまとめると以下のようになります。

  • SpriteBatch のパフォーマンスが大幅に向上 (←これがすごい)
  • SoundEffect.Volume の設定が反映されない不具合修正
  • DXT3 圧縮がサポート

まず SoundEffect.Volume の不具合が直ったのでわざわざ音量を調整した音声ファイルを用意する必要はなくなりました。さすがにそれは面倒なのでやっていませんが。こちらはコミュニティに報告した内容が反映されています。

DXT3 圧縮もサポートされたので、SpriteFont などのコンテンツを作成する際にわざわざ別なフォーマットを選択する必要がなくなりました。こちらはなぜかブログに書いていた内容が反映されています。

そして一番影響が大きいのが SpriteBatch のパフォーマンスが上がったことです。プログラムを変更することなくライブラリを更新するだけで 2D のゲームのパフォーマンスが大幅に上がります。どのぐらいパフォーマンスが上がったかは動画を上げましたので前回の動画と比較して見てみてください。

プレイ動画

以下は前回、バージョン 3.8.9100 で作成したゲームを動かしてみたときの動画です。動画の内容は前回と同じものです。

ニコニコ動画

Youtube

そして今回、バージョン 3.8.9101 に更新してゲームを動かしてみた動画が以下になります。

ニコニコ動画

Youtube

見てもらえれば一目瞭然ですが、ちょっとどころではなく数倍ぐらいパフォーマンスが上がっているように見えると思います。パフォーマンスが上がっていると行ってもさすがにネイティブに比べれば劣りますが、多少低スペック向けにゲームを調整すれば Blazor 版でも十分に実用に耐えられるゲームが動かせると思います。

バージョンアップの経緯

今回 Blazor 版で実装するにあたりライブラリの中の `SoundEffect.Volume` で不具合を見つけたのでコミュニティの Blazor のスレッドで報告しました。Blazor 版のライブラリはお試し版であることもあり、せっかくゲームを動作させてみたので Blazor で動かしてみたらこうなったよ、という動画も一緒に作って投稿しました。動画にはブログのリンクも付けてあります。

その後コミュニティで nkast さんから返信を頂いたのですが、回答を頂いた内容を見るとコミュニティに投稿した内容や動画の内容だけではなく、私がブログに書いた内容についても回答を頂いていました。本人に確認したわけではないので本当かどうかは分かりませんが、おそらく日本語で書いたブログをわざわざ読んでいただいたんだと思います。

前回の調査内容に対しての相違点

先述の通り、nkast さんに前回の記事を読んでいただいたらしく、いくつかの調査内容は正しくないものがあるようでした。以下相違点について記載します。書いてる内容はコミュニティで回答いただいたものと同じです。

Effect (.fx) コンテンツはシェーダモデル 2.0 まで対応可能

前回 Effect コンテンツはサポートされていないと書きましたがシェーダモデル 2.0 までなら対応されているようです。確かに私がゲームで使用していたのはシェーダモデル 4.0 なので対象外ですね。

ちなみにシェーダモデル 2.0 にしたら動きました。

Load 用コンテンツ (.xnb) の配置場所

こちらについてはコンテンツを実行ファイルに埋め込むか、静的ファイルとして `/wwwroot/Content/` に配置するかの2択であることは前回説明した通りです。

`/wwwroot/Content/` に配置した際にうまく読み込めない件については Web サーバーで .xnb ファイルの MIME タイプを 'application/octet-stream' にするとうまくいくという回答を頂きました。ただ、こちらは試していないので実際に使う方は正しく動くか確認してみてください。

SpriteFont.Characters は使えない

どうやら Blazor 版では `SpriteFont.Characters` の代わりに `SpriteFont.Glyphs` を使うようです。現在 MonoGame の正式版では `SpriteFont.Characters` が使われてるので今後 `SpriteFont.Glyphs` に置き換わる可能性はあるかもしれません。

まとめ

前のバージョンでは Blazor+WebGL で高負荷のゲームを動かすのはなかなか難しいという印象を受けましたが、今回のバージョンアップで2Dスプライトの描画性能が飛躍的に上がったので、Web 上でゲームを動かすのもかなり現実味を帯びてきたと思います。パフォーマンス的には Silverlight + XNA に近いレベルになったのではないかと思います。これなら体験版としてゲームを作って Web で公開するという方法も行けそうな気がしました。

MonoGame で制作したゲーム「リトルセイバー」を Web (Blazor + WebGL) で動かしてみた話

Web で動くゲームを作ってみようと思った話

image

現在 Steam や DLsite, Microsoft Store, Google Play で配信中のアクションゲーム「リトルセイバー」ですが、動作フレームワークとして「MonoGame」を使用しています。

当ゲームは有料での販売であるため各々で体験版を配布しているのですが、よりお手軽にゲームを体験できるようにするために開発中のデモ版も含めて以前まで Web で公開していました。

その時は「Silverlight + XNA」をフレームワークとして作り公開していましたが、残念ながら 2021 年にサポートが終了し、唯一動く IE もサポートが終了してしまったため、現在 Web で試せる環境はなくなってしまいました。まあ一応「β版開発室」にはずっとページは残っているのですが。

image

Unity など他のゲーム開発プラットフォームでは WebGL がサポートされていたりしますが、MonoGame では現時点で Web 版はサポートされていません。しかし実験的に開発はしているらしく、コミュニティを見てみたら一応 Web 上で動くライブラリを公開しているようでした。

内部的な動作ベースは WebAssembly となっているため、これまでの Flash や Silverlight とは異なり多くのブラウザでサポートされています。今後 (現在もですが) Web ブラウザで手軽に遊べるゲームを作るなら WebAssembly + WebGL ベースで作るのが良いかと思います。

WebGL で動かせるライブラリが見つかったので、今後 Web でゲームのお試し版を公開する可能性があるかもしれないことも考え、試しに現在のゲームを Web 版で動かせるかどうか試してみました。

実際に動かしてみた動画

実際にどうやったのかなどは後で書きますが、結果としては「動かすこと」はできました。どんな感じに動いているかは動画としてアップしましたので見てみてください。

ニコニコ動画

Youtube

ちなみにこのゲームを動かしているサイトは開発目的で作ったものなので非公開となっており一般の方が遊ぶことはできません。理由としては使用しているライブラリがまだ未完であるのと、遊べるレベルまで最適化するのが非常に面倒だったためです。

使用しているライブラリなど

今回使用しているライブラリは MonoGame の開発者でもある nkast さんが個人的に作ったライブラリとなっています。

該当するコミュニティのページは以下となっています。

またビルド・実行可能なサンプルプログラムも公開されています。

フレームワークとしては「Blazor WebAssembly」+「WebGL」+「.NET 6」+「C#」で動く形となっています。

動くプログラムを確認するならサンプルプログラムを触ってみるのが手っ取り早いですが、ライブラリは nuget でも公開されているので新規プロジェクトとして制作することもできます。

プログラムの移行に関していろいろやったこと

WebGL 版も MonoGame ベースのフレームワークとして作られているので大部分のコードについては変更することなく移行することができました。ただ本ゲームは 2D ベースなので 3D ベースのゲームプログラムの場合はどのぐらい影響があるかは分かりません。また、大部分は変更はありませんでしたが Web ブラウザで動くプログラムになってしまうので、いくつかは変更が必要になるものはありました。ここではゲーム固有部分ではなく誰にでも影響がありそうな修正箇所についていくつか書いてみたいと思います。

Effect (.fx) コンテンツは使用できない

デフォルトで実装されているエフェクトは分かりませんがコンテンツパイプラインから読み込む形の Effect は使用できないみたいです。`Content.Load` で読み込もうとした時点でエラーになります。2D でもカスタマイズした描画を実行している場合は注意が必要です。3D は特に影響が大きいのではないでしょうか。

リトルセイバーでは被弾時の白点滅にエフェクトを使っていたのですが今回省きました。

Song クラスは使用できない

BGM 再生などに使用されることがある `Song` クラスは使用できません。こちらも `Content.Load` でエラーになります。BGM を流したい場合は効果音と同じ `SoundEffect` クラスを使用する必要があります。`Song` クラスはストリーム再生できるメリットがあるのですが汎用性が低いこともあり、リトルセイバーでは `SoundEffect` で BGM を再生していたため手間はあまりありませんでした。

GamePad は使用できない

`GamePad` クラスで何らかのアクセスをしようとしただけでエラーになります。キーボードやマウスは使用可能です。Web ブラウザではゲームパッドの対応が元々難しかったりするので仕方ないですね。

Load 用コンテンツ (.xnb) を実行ファイルに埋め込み

WebGL 版のライブラリでは `wwwroot` フォルダ内にあるファイルからコンテンツを読み込むように作成されていますが、テスト段階でなぜか読み込めない場合がありました。キャッシュの問題なのかなんなのか不明だったため、コンテンツファイルはすべて「埋め込みリソース」として実行ファイルに埋め込むようにしました。これが原因か分かりませんが、先述のサンプルプログラムでも一部そのようにカスタマイズして読み込んでいるコードがあったりします。

コンテンツファイルを埋め込むと初回ダウンロード時にすべてのファイルをダウンロードする必要があるので読み込みに時間が掛かります。ただし、全て読み込んでからゲームを動かすのでゲーム実行中の読み込みスピードは上がります。逆に `wwwroot` に置くパターンは初回のゲーム読み込みは早いですが、コンテンツが必要なタイミングでインターネットからダウンロードするので途中の読み込みは遅くなります。

テクスチャーで Dxt3 は使用できない

おそらく WebGL 版にデコーダーがないので `Content.Load` でエラーになります。`SpriteFont` もデフォルトでは `Compressed` (Dxt3) になっているので、普通に作ってるとエラーになります。テクチャーフォーマットは `Color` にしておけば大丈夫です。

SpriteFont.Characters は使えない

使っている人がいるかどうかは分かりませんが `SpriteFont` に何の文字が含まれているかをチェックするためなどの目的で `Characters` プロパティは使用できません。

暗号化やハッシュのライブラリは使用できない

これは MonoGame 側の話ではなく Blazor 側の話です。一応クラスはあるのですが使おうとするとサポートされていないという Exception が発生します。代わりに `BouncyCastle.NetCore` などのサードパーティライブラリを使用する必要があります。ただ今後の .NET のバージョンで暗号化やハッシュがサポートされる可能性はあります。

ローカルファイルへの書き込みはできない

Web ブラウザで動作するものなのでローカルへのファイル書き込みは出来きず代案が必要となります。...とはいうものの実は一時的にできたりはしますが、結局は永続化はできないので対処は必要です。ローカルストレージやインターネット上の Web ストレージなどを使用する必要があります。

SoundEffect の音量が正しく設定できない

これはおそらく不具合だと思うのですが、`SoundEffect.Volume` プロパティを設定しても必ず 100% の音量で再生されてしまいます。対処法としては元のサウンドファイルの音量を下げるしかないのですが、さすがに面倒なので放置しています。ただなぜか再生中には音量は変更できるようです。

パフォーマンス関連

おそらくこれが一番影響がでかいのではないかと思います。ネイティブで動くコードと WebAssembly で動くコードではパフォーマンスに大きな差があるため、ネイティブでギリギリまで調整して動いているプログラムは Web で動かそうとするとほぼ動かすことが困難になるのではないかと思います。ちなみにどれぐらいパフォーマンスが落ちるかについては先述の動画で確認できると思います。

ただ WebAssembly はまだ発展途上なので今後少しづつ改善はされていくと思います。それでもネイティブに勝てることはないと思うので Web 版が正式リリースの対象に含まれているゲームの場合は定期的にパフォーマンスの確認をしていった方がよいと思います。

まとめ

今回 WebGL 版としてゲームを動かせるか試してみたのですが、目的としてはローカルで動くゲームをまずは手軽に Web 上で遊んで確認できるような環境を作りたかったというのがあります。

リトルセイバーについてはすでに本リリースしているので今のところそういう環境が必要という場面にはなっていないですが、今後そういったこともあるかもしれないので興味的なものも含めて試してみました。

もしかしたら WebGL でゲームを公開してみたいという方もいるかもしれないので、この調査結果が大なり小なりでも参考になればいいかなと思いました。

β版開発室に「ウディタ用オートタイルを汎用マップチップに展開 (Blazor 版)」を追加しました

前回β版開発室に「ウディタ用オートタイルを汎用マップチップに展開」を追加しましたが、今回は同様の機能で Blazor 版 を公開しました。機能については変わりはないので簡単な説明は前回のブログを参照してください。

image

Blazor とは WebAssembly を作るフレームワークのことで、WebAssembly は基本的に Web ブラウザー内でプログラムが動作します。

前回公開したものは画像データをサーバーに送信してサーバーで展開したマップチップを画面に表示する、という動作をしていましたが、Blazor 版は全てクライアントで処理されるため、画像データをサーバーに送信せずにマップチップを展開して表示できます。

また WebAssembly には「PWA」という機能があり、Web ブラウザからインストールしてスタートメニューに登録できる仕組みもあります。

image

image

ちなみに現在β版という形で公開していますが、よっぽどのことがない限りは消さずにしばらく置いていると思います。正式版になるかどうかは今後の利用状況なども見て考えます。

【β版開発室】使用文字抽出 (Blazor 版)

β版開発室で公開してみました。Blazor アプリの開発の練習を兼ねてのリリースです。本リリースすることはないのでたぶんずっとβ版のままだと思います。

機能としてはシンプルでテキストの内容から使用している文字を一覧化して出力できます。

image

ちなみにこのプログラムは通常の HTML 版ですでに実装済みなので同じものが2つ存在している形になります。Blazor 版はクライアントで処理を完結しているのでインターネット上にテキストが流れることはありません。

image

また、今回 Blazor 版は PWA の機能を入れているので Web ブラウザからローカル環境にインストールすることができます。

image

image

とは言っても中身は Web ページなので使える機能については変わりはないです。まあ手軽に起動できる点としてはメリットでしょうか。

image