2020/08/14

C# (15) Array オブジェクトのテスト結果

今回のテスト結果

今回は演算子と Array オブジェクトについてテストしました。

(6) 演算子 (ZSP643) PASS

(7) Array オブジェクト (JSM615-1) FAILED

配列のテストが通らなかった点については次項で詳しく結果を見ていきます。

SBD の結果

以下が期待される結果になります。

shape=Rectangle;color=Lime;
Lime
shape=Rectangle;
200
Array param has value 100.
1=x;2=y;
Array param has 4 items.
Array param is an array.
5.7
300
Press any key to continue...

SBO の結果

こちらが実際の結果です。

shape=Rectangle;color=Lime;
Lime
shape=Rectangle;color=;
200
Array param has value 100.
1=200;2=100;
Array param has 4 items.
Array param is an array.
2.0

Program has ended.

まず、3行目の結果が違います。SBD では空文字列を代入することで配列のエントリーを削除できたのですが、SBO では値だけが空になっています。これは #150 としてレポートしました。

次に6行目ですが、Array.GetAllIndices の戻り値が、インデックスの配列ではなく、値の配列になっています。#151 としてレポートしました。

9行目は、インデックスは大文字と小文字を区別しないというテストですが、SBO では区別しています。これは #152 としてレポートしました。

10行目は、`param = "x=200;y=100;width=300;height=150;"` のように配列の複数のエントリーを一度に初期化する方法をテストしたものですが、SBO では配列として初期化されず何も表示されていません。これはすでに #119 としてレポートしています。

(つづく)

関連項目

| | コメント (0)

2020/08/12

C# (14) サンプルによる SBO のテスト

Small Basic オンライン (SBO) の開発も結構進んできたのですが、まだまだ デスクトップ版ほどには仕上がっていません。きちんとテストをして、不具合についてはレポートしていく必要があります。

Small Basic の書籍に掲載されているプログラムを走らせるということもやってみたのですが、結局、起きた問題に限定したコードを作り直すことになるので、なかなか手間がかかります。

そこで、今度はオブジェクトの操作やプロパティ毎のサンプルプログラムを走らせてみようと思います。Small Basic のサンプルプログラムは TechNet Wiki にまとめている最中で、File オブジェクト、Math オブジェクト、Sound オブジェクトの一部がまだ完成はしていません。これを進めることで、サンプルプログラムも充実しながら、テストも並行して進められると思います。

今日は 14 のキーワードに関するサンプルを走らせてみました。

(1) If Then ElseIf Else EndIf (WKV187) PASS

(2) For To Step EndFor (MPP890) FAILED

GraphisWindow.Title = "Pinstripe" で次のエラー: #69 として報告しましたが、仕様としてクローズしています。

The library menber 'GraphicsWindow.Title' was available in older versions only, and has not been made available to this version yet.

(3) While EndWhile (VXQ678) FAILED

以下の4つのエラー: これらも SBO の仕様と考えたほうが良さそうです。

  1. Property 'GraphicsWindow.Height' cannot be assigned to. It is ready only.

  2. Property 'GraphicsWindow.Width' cannot be assigned to. It is ready only.

  3. The library member 'GraphicsWindow.Top' was available in older versions only, and has not been made available to this version yet.

  4. The library member 'GraphicsWindow.Left' was available in older versions only, and has not been made available to this version yet.

上記の行を削除すると動作しますが、タートルの動きがとても遅いのも気になります。While のサンプルとしてはもうちょっとシンプルなものにしたほうがいいかもしれません。

(4) Sub EndSub (DPB919) PASS

(5) Goto (WWV874) PASS

この調子で演算子や20個全てのオブジェクトの全メンバについての動作を確認したいと思います。

関連項目

| | コメント (0)

2020/08/10

C# (13) SBO 既知の留意点3

最近、Small Basic Online (SBO) の一部の留意点が解決されました。前回から新たに追加された留意点もありますが、それも含めてまとめました。

2020-03-06 以降、解決した留意点

以下の12件の留意点が解決されました。ただし #57 に関しては仕様が変更され従来の "#aarrggbb" ではなく "#rrggbbaa" の形式になりました。

  • #134 レベル 2 チュートリアルが動かない(#106や#112と同じ問題)
  • #129 文字リテラルの一部が消える
  • #127 Mac+Safari で SBO のエディタ画面が表示されない
  • #126 GraphicsWindow.FontBold のデフォルトが "False"
  • #122 TextWindow.ReadNumber で負の数や小数が入力できない
  • #112 GraphicsWindow.KeyDown イベントが呼び出されない
  • #107 ブラウザ Chrome と Edge でタートルが軌跡の上に現れない
  • #106 GraphicsWindow.LastKey が常に空を返す
  • #88 ブラウザ Edge で Shapes.Zoom() が図形の中心から拡大・縮小しない
  • #87 ブラウザ Edge で Shapes.Rotate() が図形の中心で回転しない
  • #58 GraphicsWindow.DrawImage が画像を表示しない
  • #57 "- #12345678" のような透明な色は無視される

2020-08-10現在、残っている留意点

以下の25件が残っている留意点です。#139~#135 は新たに追加された留意点です。

  • #139 名前付き定数を Small Basic に導入(仕様変更)
  • #138 数値計算でオーバーフローでもアンダーフローでも例外を発生させる(仕様変更)
  • #137 数値の Small Basic 内部での型を IEEE decimal64 に統一(仕様変更)
  • #136 右ボタンで表示されるメニュー(Cut/Copy/Paste/Find/Format Program)がない
  • #135 レベル 3 チュートリアルが動かない(プログラムにループがあると Controls.MouseMoved イベントが呼び出されない)
  • #125 プログラムにループがあると Controls.ButtonClicked イベントが呼び出されない
  • #124 テキストボックスとマルチラインテキストボックスのフォント属性が変更できない
  • #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 への代入が文法エラーになる(リードオンリー)
  • #110 GraphicsWindow.DrawImage でローカルファイルが使用できない
  • #108 オンスクリーン キーボードが自動的に有効にならない
  • #74 GraphicsWindow.GetPixel がサポートされていない
  • #69 GraphicsWindow.Title がサポートされていない
  • #60 オブジェクトを切り替えたとき、ライブラリ サブメニューがスクロールしたままとなる
  • #27 ビルド中に monaco を最小化から除外する
  • #13 インポートと発行機能(発行とインポートが未サポート)
  • #12 長い初期ロード時間(起動に時間がかかる)
  • #4 ライブラリ エクスプローラにバッジを付ける
  • #3 ブリッジプロジェクトを Electron.NET に置き換える
  • #2 開発サイクルの改善

関連項目

| | コメント (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)

2019/05/09

C# (10) SBO 既知の留意点

Small Basic Online (SBO)の既知の留意点はオフィシャルブログの記事や GitHub の Issues にまとめられていますが、英語ということと載っていないものもあるので、ここにまとめ直しておきます。2019年5月9日現在の既知の留意点です。番号は GitHub Issues のものです。

  • #12 起動に時間がかかる。
  • #13 発行とインポートがサポートされていない。
  • #14 タートルが Edge ブラウザで表示されない。
  • #57 "#12345678" のような透明な色は無視される。
  • #58 GraphicsWindow.DrawImage() がイメージを表示しない。
  • #69 GraphicsWindow.Title がサポートされていない。
  • #71 サブルーチン名と変数名が同じだと文法エラーとなる。
  • #74 GraphicsWindow.GetPixel() がサポートされていない。
  • #87 Shapes.Rotate() が図形の中心で回転しない。
  • #88 Shapes.Zoom() が図形の中心から拡大・縮小しない。
  • #89 Shapes.Zoom() の倍率を1にするとプログラムが停止する。
  • #92 Shapes.Rotate() の角度を360にするとプログラムが停止する。
  • ファイルの拡張子が .sb ではなく .txt になった。
  • GraphicsWindow.WidthGraphicsWindow.Height がリードオンリー。
  • GraphicsWindow.FontBold の規定値が "False"
  • Program.Directory がサポートされていない。
  • File.GetSettingPath() がサポートされていない。
  • File.GetTemporaryPath() がサポートされていない。
  • 配列を a = "1=One;2=Two;" のような初期化ができない。

ある程度、動くようにはなったものの、まだ正式版とするにはそれなりの修正が必要となりそうです。どの程度動くのかということでは、サンプルとして鯉のぼりのプログラムを修正してみました。SBO 1.0 ではまだ発行ができないので、こちらにソースとその結果のスクリーンショットを公開しました。

関連項目

| | コメント (0)

2019/05/08

C# (9) Blazor とは

前回、Blazor について簡単に触れました。Small Basic Online 自体が Blazor アプリケーションとなっています。今回は私自身もまだよく判っていないところもあるのですが、Blazor とは何かについて簡単にまとめてみたいと思います。

Blazor について調べてみるとまず jsakamoto さんの Slide Share のスライド C#でSingle Page Webアプリが開発できる「Blazor」が見つかりました。jsakamoto さんは Small Basic 1.0 向けの Excel や IE の拡張ライブラリを作られた方です。

一言で言えば Blazor はブラウザ上で動く SPA (Single Page Application) を作るための開発から実行までの環境です。SPA とはその名のとおり一つのページでさまざまな動作が可能なブラウザ上のアプリケーションです。Small Basic Desktop から発行したプログラムは IE(インターネットエクスプローラー)上の Silverlight というプラグインで実行できましたが、Small Basic Online ではエディタからコンパイラ、実行まで全てブラウザ上で行えます。

Blazor 以前の環境の SPA ではブラウザ上で JavaScript(や TypeScript)のプログラムが動いていました。Small Basic Online の初期のバージョンも TypeScript で動く仕組みでした。それが Blazor では C# でプログラムを記述できるようになりました。.NET の代表的な言語です。.NET の言語は Java のように中間言語にコンパイルされ、その中間言語が実行時に解釈されて動きますが、Blazor ではその中間言語をさらに、WebAssembly というブラウザ共通の実行コードで解釈し実行しているようです。

Blazor の表示は HTML と CSS をベースとしており、Small Basic Online ではグラフィックスとして SVG を利用しています。

Blazor は開発途中でしたが、実験段階を終え、公開プレビュー版となりました。間もなく正式版になるところです。

| | コメント (0)

C# (8) Shapes のデバッグ

Small Basic Online v1.0 のソースのどこから手をつけたらいいのか悩んでいたのですが、先日見つけた Shapes の回転と拡大・縮小の不具合の修正案が示されたので、そこに着目していきたいと思います。

今回取り上げる問題点は2つあり、Shapes.Rotate が図形の中心で回転しないという問題Shapes.Zoom が図形の中心で拡大・縮小しないという問題です。それぞれ GitHub の Issue として報告済みです。

Rotate

それに対しての学生の alxnull さんによる修正案がこちらです。まず、対象となっているファイルは Source/SmallBasic.Editor/Libraries/Shapes/BaseShape.cs というファイルです。Source フォルダにはいくつかのプロジェクトがありますが、今回の修正箇所は SmallBasic.Editor というプロジェクトの中で、エディタの一部になります。このエディタの中に Libraries というフォルダがあり、実行時に呼ばれるライブラリの記述があります。Small Basic Online のエディタは Blazor という仕組みを利用しており、図形は SVG として扱われています。

今回の修正案はこの SVG の図形に対して CSS の transform-origin という style で図形の中心を指定する center というキーワードを与えています。この修正で Chrome では問題が解決していることを確認できましたが、Edge では直っていませんでした。いろいろやってみたところでは、Edge 上では SVG の図形に対する CSS がうまく働いていないようです。

CSS を使わずに SVG の記述だけでうまく対応できるよう alxnull さんに働きかけていく予定です。

関連項目

| | コメント (0)

2019/03/01

C# (7) ビルドしてテスト

前回、ローカルフォルダのソースも更新されたので、今回はこれをビルド(コンパイル)し、テストします。

スタートページの「最近」というところにソリューションファイル「SmallBasic.sln」が表示されているので、これをクリックします。

Vs_open_solution

出力にエラーが出ますが、左下に「準備完了」が出るのを待ち、「スタートアップ プロジェクト」の欄に「SmallBasic.Editor」が選ばれた状態で、その右の緑の三角のある「IIS Express」ボタンを押します。

Vs_build

ビルドが完了すると Small Basic Online のエディタがブラウザ上に表示されます。このときの Visual Studio の画面は以下のようになります。

Vs_executing

これでビルドは完了です。ここからは実行環境でのテストになります。テストにも色々な手段がありますが今回は以前あった Issues (問題点)の再現テストを行います。

GitHub の sb/smallbasic-editor に登録した Issues を表示します。今回確認するのはすでにクローズしたものになるので、「Closed」を選んで #44~#47 を順に確認します。

#44 は単純に GraphicsWindow.DrawEllipse() で楕円を描きます。本来輪郭だけが描かれるはずが前回の版では黒く塗りつぶされていました。新しい版で試したところ、直っていませんでした。

Issue_44

この問題は Edge でのみ発生し、他のブラウザでは正常に表示されることが分かりました。原因は Edge が #00000000 を透明と認識しないことにあるようです。

#45 は GraphicsWindow.DrawText ()と Shapes.AddText() で文字の表示位置が違っていたのですが、これは修正されました。

#46, #47 は文字リテラル、変数名、 サブルーチン名、ラベル名に漢字を使うと文法エラーになっていました。これも修正されました。

テストの結果は以上です。過去の問題も記録が残っているので同様にテストすることができます。過去の問題の再現テスト(リグレッションテスト)を新しいリリースの度に行うことは重要です。一度直したところに別の修正を入れて昔の問題がまた発生するようなこともあるからです。

これまでの問題もほぼ修正されてきたので、『小学生からのプログラミング』掲載のプログラムの動作確認を続けていきたいと思います。

(つづく)

| | コメント (1) | トラックバック (0)

2019/02/27

C# (6) リモートリポジトリとの差分をプル

前回に引き続き、今度は Visual Studio を使ってリモートリポジトリの内容をローカルにプルします。これも第3回で簡単に説明しましたが、今回詳しく説明します。

スタートメニューから Visual Studio 2017 を選んで起動します。「表示」メニューから「チーム エクスプローラー」を選びます。

Vs_team_explorer_menu

チーム エクスプローラで第3回に作ったローカルリポジトリ Repos をダブルクリックします。

Vs_local_git_repository

「プロジェクト」の「同期」をクリックします。

Vs_sync

「入力方向のコミット」の「プル」をクリックします。

Vs_pull

「リポジトリはすでに最新の状態です。」と表示されればプルが完了です。

Vs_repo_updated

次回は最新のソースから Small Basic Online をビルドします。

(つづく)

| | コメント (1) | トラックバック (0)