« 2020年2月 | トップページ | 2020年4月 »

2020年3月

2020/03/15

プログラミング講座(186) アフィン変換

Anime の作成からちょっと脱線します。Shapes の移動・回転・拡大/縮小には Move, Rotate, Zoom といった操作が用意されていますが、自前で計算するにはアフィン変換という行列の掛け算が便利です。Small Basic には行列を扱うライブラリがないので、自分で作り始めました。

行列(matrix)を表現するのに Small Basic のジャグ配列(配列の配列)を利用しました。行列演算のサブルーチンに行列の名前を渡せるように以下のような構造にしました。

matrix[名前]["cols"]
matrix[名前]["rows"]
matrix[名前]["values"][行番号][列番号]

プログラム NGR465 で行列の足し算と掛け算を作りました。これをベースに3次元の回転を計算させたのがプログラム JXK757 です。

Ethanol

エタノールの分子をY軸回りに回転させています。このプログラムではベクトルもスカラもそれぞれ1列、1行1列の matrix として表すことで、同じ Matrix_Mul という掛け算のサブルーチンを使っています。計算できるのは、行列×行列、行列×ベクトルとベクトル×スカラです。順番が違うとエラーになります。(スカラ×スカラもやろうと思えばできます。)

関連項目

| | コメント (0)

2020/03/07

C# (12) ソリューションとプロジェクト

今回は .NET の C# や Visual Basic でプログラムを作成するときに出てくるソリューションとプロジェクトについて、実際に Small Basic オンライン (SBO) 1.0 でどうなっているのかを見ながら解説しようと思います。

Visual Studio にソリューション エクスプローラーというウィンドウがあります。これは smallbasic-editor リポジトリのルートにある SmallBasic.sln というファイルの中身を表しています。ソリューションは SBO 1.0 のように、システム全体を表しています。

Vs-solution-explorer-j

ソリューションの中は9つのプロジェクトに分かれています。例えば SmallBasic.Editor というプロジェクトの中をマウス右ボタンの「エクスプローラーでフォルダを開く」メニューで開いてみると、bin\Debug\netstandard2.0 というフォルダに SmallBasic.Editor.dll というダイナミックリンクライブラリ(実行形式のクラス ライブラリ)ができていることがわかります。プロジェクトは通常このように exe や dll などのビルド単位に作られます。

SBO 1.0 の場合、SmallBasic.Analyzers.dll, SmallBasic.Compiler.dll, SmallBasic.Client.dll, SmallBasic.Editor.dll, SmallBasic.Utilities.dll の5つの dll が作られていました。

SBO 1.0 の REAME.md によると、8つのプロジェクトについて説明があります。和訳すると、

  • SmallBasic.Compiler: プログラムを実行するために使われるコンパイラ/エンジン
  • SmallBasic.Utilities: 異なるプロジェクト間で共有されるヘルパーユーティリティ
  • SmallBasic.Analyzers: コードベースの品質管理を助ける C# アナライザー群
  • SmallBasic.Generators: コードベース全体で利用される C# や TypeScript のスニペットを自動生成するスクリプトのコレクション
  • SmallBasic.Client: クライアントの TypeScript, SASS や画像リソースをバンドルしたウェブパックプロジェクト
  • SmallBasic.Editor: エディターUIコンポーネントをレンダリングする Blazor アプリ
  • SmallBasic.Server: エディターのサービスを提供/デプロイ(展開)するのに使われる ASP サーバー
  • SmallBasic.Tests: コンパイラ/エンジンをテストする C# 単体テスト

となります。順番はソリューション エクスプローラーにある順に並べ替えました。

ソリューション エクスプローラーで見るとそれぞれのプロジェクトはフォルダが分けられていて、Backend, Build, Frontend, Tests の4つのフォルダのいずれかに格納されています。Backend はサーバー側のみで実行されるプロジェクト、Build は SBO 1.0 自体をビルドするときに使用されるプロジェクト、Frontend はクライアント側とやりとりしながら実行されるプロジェクト、Tests は(ビルド直後の)自動単体テストのためのプロジェクトと考えられます。

SmallBasic.Bridge というプロジェクトに関しては SBO 1.0 の README.md に説明がありませんでした。このプロジェクトは Small Basic デスクトップ (SBD) をこのソリューションで作成するときに使われるのではないかと思います。

以上のように、ソリューションはシステム全体、プロジェクトはビルド単位と覚えておくと理解しやすいと思います。

関連項目

 

| | コメント (0)

2020/03/05

C# (11) SBO 既知の留意点2

以前、Small Basic オンライン (SBO) の既知の留意点について書いてから約10カ月が過ぎました。直っているものも、新たに見つかったものもあるのでまとめ直してみました。#92, #89, #71, #14は修正されました。

GitHub Issues 掲載分

  • #125 プログラムにループがあると Controls.ButtonClicked イベントが呼び出されない
  • #124 テキストボックスとマルチラインテキストボックスのフォント属性が変更できない
  • #122 TextWindow.ReadNumber で負の数や小数が入力できない
  • #119 配列の初期化がされない(a = “1=One;2=Two;”のような初期化ができない)
  • #118 引用符で閉じない文字リテラルが文法エラーになる
  • #117 Sound.Play と Stop が文法エラーになる
  • #116 Sound.PlayMusic が文法エラーになる
  • #115 GraphicsWindow.Left と Top が文法エラーになる
  • #114 GraphicsWindow.CanResize が文法エラーになる
  • #113 GraphicsWindow.Width と Height への代入が文法エラーになる(リードオンリー)
  • #112 GraphicsWindow.KeyDown イベントが呼び出されない
  • #110 GraphicsWindow.DrawImage でローカルファイルが使用できない
  • #108 オンスクリーン キーボードが自動的に有効にならない
  • #107 ブラウザ Chrome と Edge でタートルが軌跡の上に現れない
  • #106 GraphicsWindow.LastKey が常に空を返す
  • #88 ブラウザ Edge で Shapes.Zoom() が図形の中心から拡大・縮小しない
  • #87 ブラウザ Edge で Shapes.Rotate() が図形の中心で回転しない
  • #74 GraphicsWindow.GetPixel がサポートされていない
  • #69 GraphicsWindow.Title がサポートされていない
  • #60 オブジェクトを切り替えたとき、ライブラリ サブメニューがスクロールしたままとなる
  • #58 GraphicsWindow.DrawImage が画像を表示しない
  • #57 "#12345678" のような透明な色は無視される
  • #27 ビルド中に monaco を最小化から除外する
  • #13 インポートと発行機能(発行とインポートが未サポート)
  • #12 長い初期ロード時間(起動に時間がかかる)
  • #4 ライブラリ エクスプローラにバッジを付ける
  • #3 ブリッジプロジェクトを Electron.NET に置き換える
  • #2 開発サイクルの改善

SBO 1.0 アナウンス掲載分

  • ファイルの拡張子が .sb ではなく .txt になった

その他の留意点

以下の項目はまだ上記のどちらのリストにも載っていない SBD 1.2 との差分になります。

  • File.GetSettingPath() がサポートされていない
  • File.GetTempraryPath() がサポートされていない
  • GraphicsWindow.FontBold の既定値が "False"
  • Program.Directory がサポートされていない

SBO 1.0 でサポートされていない機能はまだ他にもありそうで、GitHub の Issues に登録していく必要があります。

関連項目

その他のリソース

 

| | コメント (0)

« 2020年2月 | トップページ | 2020年4月 »