Web開発
Show HN: WebBase-III – dBASE IIIをブラウザで再構築、独自のインタプリタ付き
Show HN: WebBase-III – dBASE III rebuilt in the browser with its own interpreter (github.com)
要約
WebBase-IIIは、1980年代のデータベースシステムdBASE IIIをブラウザ上で再現する現代的なウェブアプリケーションです。 TypeScriptで書かれた独自のインタプリタを搭載し、Node.js、WebSockets、SQLiteをバックエンドに利用しています。 コマンドラインインターフェース、データ表示、インデックス作成、BROWSEグリッド編集、プログラムエディタ、フォームエンジンなど、dBASE IIIの主要な機能をウェブ上で提供します。
全文翻訳
WebBase-III dBASE IIIが帰ってきました。ブラウザで。まるで1984年のように顧客を「USE」する。ドットプロンプトを覚えていますか?SQLが勝利する前、ORMが登場する前、誰も「フルスタック」と言わなかった時代 — そこにはdBASE IIIがありました。USE customersと入力し、次にLISTと入力すると、データがそこにあったのです。WebBase-IIIはその世界全体を復活させます。ターミナル、言語、BROWSE、@ SAY GETフォーム、.prgプログラム、インデックス、レポート — TypeScriptで独自のインタプリタを持つモダンなウェブアプリとしてゼロから再構築され、Node.js、WebSockets、SQLiteをバックエンドとしています。
ワンクリックで試せます — インストール不要:
Codespaceが依存関係をインストールし、開発サーバーを自動的に起動します。転送されたポート5173を開くと、ドットプロンプトが表示されます。
スクリーンショット
ターミナル REPL
コマンドインターフェース — W3Scriptを入力し、結果を即座に確認できます。
LIST — 表形式レコード表示
LISTは、アクティブなインデックス順にすべてのレコードを表示します。ステータスバーには、アクティブなデータベースとテーブルが表示されます。
インデックスとSEEK
INDEX ON name TO BYNAMEはSQLiteインデックスを作成し、アクティブ化します — その後のLIST出力はアルファベット順にソートされます。SEEK "Delta NV"は、O(log n)でレコードポインタを最初の一致にジャンプさせます。
BROWSE — 編集可能なグリッド
BROWSEはスプレッドシート形式のグリッドを開きます。レコードはアクティブなインデックス順に表示されます。Tab/Enterでセルを編集、Ctrl+Nで新しい行、Deleteで選択した行を削除、Escでターミナルに戻ります。
プログラムエディタ
EDIT <name>は内蔵の.prgソースエディタを開きます。プログラムはW3Script言語の全機能に対応しています:DO CASE/ENDCASE、DO WHILE/ENDDO、IF/ENDIF、フォームレイアウト、およびすべてのデータコマンド。Ctrl+Sで保存、Escでキャンセル。
フォームエンジン — @ SAY GET / READ
@ row,col SAY "label" GET variableは文字セル形式のフィールドをレイアウトします。READはそれらをライブフォームとしてレンダリングし、ユーザーが値を入力して送信するのを待ちます。
アシスタント — サイドバー
カテゴリピッカーとアクションボタンを備えた常時表示される左サイドバー。
アシスタント — 新規テーブルウィザード
ウィザードはメイン領域で開き、ライブのW3Scriptプレビューを表示します。
機能
機能 詳細
W3Scriptインタプリタ dBASE IIIコマンド方言:ナビゲーション、フィルター、変数、ループ、条件文、フォーム、プログラム
BROWSEグリッド インラインセル編集、キーボードナビゲーション、インデックス順表示
フォームエンジン @ ROW,COL SAY … GET 文字セルレイアウトとREAD
インデックス作成 INDEX ON, SEEK, FIND — アクティブインデックスがすべてのレコード順を制御
DO CASE マルチブランチ条件文、OTHERWISEフォールバック
組み込み関数 EOF(), BOF(), FOUND(), RECNO(), SUBSTR(), STR(), AT(), CTOD(), DTOC()など多数
プログラムファイル DO / EDITで.prgスクリプトを保存、編集、実行
アシスタント 常時表示される左サイドバー — データベース/テーブルを開く、参照、フィルター、インデックス、検索、レポートのデザイン、タイピングせずにプログラムを実行
マルチユーザー 各WebSocket接続が独自の隔離されたインタプリタセッションを取得
永続ストレージ WALモードのbetter-sqlite3 — データベースはサーバー再起動後も存続
アシスタント
左側のサイドバーは、タイピングせずにすべてを操作します:データベースとテーブルを開いたり作成したり、データを参照したりフィルタリングしたり、インデックスを構築したり、検索したり、レポートを設計して実行したり、プログラムを実行したり、テーブル構造を変更したりできます。クリックするたびに、実際のW3Scriptコマンドが生成され、ターミナルにエコーされます — それを見て言語を学習してください。ウィザード(新規テーブル、フィルター、構造変更、レポートデザイナーなど)はメイン領域で開き、実行されるコマンドのライブプレビューを表示します。
クイックスタート
npm install
npm run dev # http://localhost:5173
本番環境:
npm run serve # ビルド後、http://localhost:3000で全てを提供
LAN / Tailscale:サーバーは0.0.0.0にバインドされるため、http://<tailscale-ip>:3000はすぐに動作します。
セッション例
USE DATABASE mydb
CREATE TABLE customers (name CHAR(40), phone CHAR(20), country CHAR(30))
USE customers
APPEND RECORD
REPLACE name WITH "Acme Corp", phone WITH "555-1234", country WITH "BE"
APPEND RECORD
REPLACE name WITH "Zeta Ltd", phone WITH "555-5678", country WITH "NL"
INDEX ON name TO BYNAME * ソート済み A→Z
LIST
SEEK "Zeta Ltd" * レコードに即座にジャンプ
BROWSE * 編集可能なグリッドを開く
SET FILTER TO country == "BE"
LIST * フィルターされたビュー
SET FILTER TO * フィルターをクリア
W3Scriptコマンドリファレンス
ワークエリア
WebBase-IIIは無制限のワークエリアをサポートします — それぞれが独立してテーブル、レコードポインタ、フィルター、インデックスを保持します。リレーショナルデータアクセスには、SET RELATION TOを使用してキーフィールドでエリアをリンクします。クロスエリアフィールドアクセスには、alias.fieldドット表記を使用します。
注意:dBASE IIIは最大10個のワークエリアをサポートしていました(DOSファイルハンドルの制限)。WebBase-IIIにはそのような制限はありません。dBASE IIIはalias->field矢印構文を使用していましたが、WebBase-IIIはモダンなalias.fieldドット表記を使用します。
コマンド 実行内容
SELECT <alias> ワークエリアを名前でアクティブ化(または作成)
USE <table> [ALIAS <name>] アクティブエリアにテーブルを開く;オプションのエイリアスオーバーライド
SET RELATION TO <expr> INTO <alias> アクティブエリアを別のエリアにリンク;すべてのナビゲーションで自動的にシーク
SET RELATION TO アクティブエリアのリレーションをクリア
LIST [col, alias.col, ...] レコードをリスト表示;クロスエリアフィールドを含むオプションの列リスト
LIST AREAS 開いているすべてのワークエリア、ポインタ、インデックス、リレーションを表示
CLOSE アクティブエリアのテーブルを閉じる
CLOSE ALL すべてのワークエリアを閉じ、単一の空のエリア1にリセット
クロスエリアフィールドアクセス:式が受け入れられる場所ならどこでもalias.fieldドット表記を使用 — SET FILTER TO, IF, REPLACE, LIST, INDEX ON。
データとナビゲーション
コマンド 実行内容
USE <table> テーブルを選択;保存されているアクティブなインデックスを復元
USE DATABASE <name> 名前付きSQLiteデータベースを開く
LIST アクティブなインデックス順にレコードを印刷(最大500件)
LIST STRUCTURE 列スキーマを表示
LIST TABLES レコード数とともにすべてのテーブルを表示
LIST DATABASES ディスク上のすべてのデータベースを表示(エイリアス:LIST DBS)
BROWSE 編集可能なグリッドを開く
CLEAR ターミナル出力をクリア
CREATE TABLE <n> (col TYPE, ...) テーブルを作成
DROP TABLE <name> テーブルを削除
APPEND RECORD 空の行を挿入
DELETE / DELETE ALL 現在のまたはすべてのレコードを削除
PACK SQLiteファイルをVACUUM
GO TOP / GO BOTTOM / GO <n> レコードポインタを移動
SKIP <n> ポインタを前方/後方に移動
REPLACE <field> WITH <val>, ... 現在の行のフィールドを更新
REPLACE ALL <field> WITH <val>, ... すべての(フィルターされた)行を更新
SET FILTER TO <expr> WHERE句を設定;空にするとクリア
MODIFY STRUCTURE アクティブなテーブルの構造変更ウィザードを開く
ALTER TABLE <t> ADD <col> <type> テーブルに列を追加
ALTER TABLE <t> DROP <col> テーブルから列を削除
ALTER TABLE <t> RENAME <col> TO <new> 列の名前を変更
ALTER TABLE <t> ALTER <col> <type> 列の型を変更(テーブルコピー;データは保持される)
インデックスを無効にする可能性のある列操作(DROP、RENAME、ALTER type)は、テーブルのすべてのインデックスを削除し、INDEX ONで再構築するよう警告します。
インデックスと検索
コマンド 実行内容
INDEX ON <expr> TO <tag> 式にインデックスを作成;即座にアクティブに設定
SET INDEX TO <tag> 以前に作成したインデックスをアクティブ化
SET INDEX TO アクティブなインデックスをクリア — 自然な挿入順序を復元
REINDEX 現在のテーブルのSQLiteインデックスを再構築
LIST INDEXES *アクティブマーカー付きで現在のテーブルのすべてのインデックスを印刷
SEEK <expr> レコードポインタを最初の一致に位置づける
FIND <string> SEEKのエイリアス(引用符なしの文字列 — dBASE IIIのレガシー形式)
SORT ON <field>[/D] TO <newtable> ソートされたテーブルのコピーを新しいテーブルに書き込む;/D = 降順;アクティブなフィルターを尊重
レポート
コマンド 実行内容
CREATE REPORT <name> 新しいレポート定義を作成(JSONエディタを開く)
MODIFY REPORT <name> 既存のレポート定義を編集
REPORT FORM <name> レポートを実行 — ASCIIをターミナルに、HTMLプレビューパネル
LIST REPORTS 保存されているすべてのレポート定義をリスト表示
DELETE REPORT <name> レポート定義を削除
プログラム
コマンド 実行内容
DO <name> 保存されている.prgプログラムを実行
EDIT <name> .prgソースエディタを開く
LIST PROGRAMS 保存されているすべてのプログラムを表示
デモプログラムはdemos/*.prgに存在し、単一の真実の情報源です。これらはサーバー起動時にプログラムストアにシードされ、ストアのコピーを上書きします。DO inventoryを試して、完全なインタラクティブなデモ(ワークエリア、リレーション、インデックス、フォーム)をご覧ください。
変数とI/O
コマンド 実行内容
STORE <val> TO <var> 変数を割り当てる
INPUT "prompt" TO <var> キーボード入力を収集
@ r,c SAY "text" GET <var> フォームフィールドを定義
READ フォームを表示し、送信を待つ
制御フロー コム