TomlViewの構想を書いておこうぜ☆(^~^)?

ほげぇ☆(^~^) 公開下書き

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 TomlView の構想を書こうぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 何だぜそれ☆?」

retention_days = 2

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 例えば 上記は ファイル保持日数の設定だが……☆」

retention   2   days   [↑]
          -----        [↓]

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ うまく説明できないが、 GUI が欲しいわけだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 そうか☆」

level = Trace

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 一番欲しいのは、選択形式のやつだぜ☆」

        +--------+
level = | Trace  |
        +--------+
        | Trace  |
        | Debug  |
        | Info   |
        | Notice |
        | Warn   |
        | Error  |
        | Fatal  |
        +--------+

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ まあ、だから GUI が欲しいんだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 誰かが作っているのでは☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 View が乱立してて Visual Studio Code の エクステンション になってりゃいいのかもしれないが、
製品に縛られたくない……、どんなPCにでもあるのは ターミナル☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Webブラウザーで見るのが 筋が良くない?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Web サーバー立てるのが大変だろ……、 Localhost で立てるにしても☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 今なら Docker があるだろ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 かなり長い道のりだな……☆ やるなら Nginx + uWSGI + Python + Flask on Docker がベターだが、
Nginx + FastCGI + Golang on Docker のスキルも習得したい……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 Golang でやると 配るの大変だろ☆ crates.io みたいな パブリッシュ サイトがない☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Webブラウザーって、ローカルのファイルを編集できないのかだぜ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 サンド・ボックスがどうなのかしらねぇ?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 調べてみるか……☆」

ブラウザからドライブにファイルの書き込みができるNative File System APIとは?

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ Google chrome が手を付けてるみたいだが、もっと調べてみるぜ☆」

ChromeのNative File System APIを触ってみる
The Native File System API: simplifying access to local files
Native File System APIでローカルの画像をリサイズする

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ HTTPS にしないといけないのか☆ めんどくせ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 ジョークソフトとして CUI で作れだぜ☆ toml-cui で Rust で☆」

rcmdnk/sentaku

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 何かはあるが、それが何かは分からない☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 MS-DOS のあれ、名前 なんだったっけ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 あれじゃ分からん☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 基本ソフトみたいなやつ☆ じゃあストレートに command-line-toml とかでいいのか……?」

KIFUWARABE_80x100x8_01_Futu.gif
「 お父んがやりたいのは リストボックスなんだよなあ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 あー、toml-menu とか☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 どんなことが できんの?」

> retention_days  [     2 ]
  level           [ Trace ]
  timeout_secs    [    30 ]

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 昔風に言えば こういうやつだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 なんだこの BIOS みたいなの☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Rust でそもそも こんなんできたっけ……☆?
カーソル入力とか☆ 調べてみるか……☆」

casual-logger.type.toml:

# This file is a test.
# このファイルはテスト用です。

file_name = { type = 'string', regex = true, default = 'default', value = '^[a-zA-Z0-9_-]+$' }
file_ext = { type = 'select', default = '.log.toml', value = ['.log.toml', '.log'] }
retention_days = { type = 'i16', default = 7, min = -100000000, max = 100000000 }
level = { type = 'select', default = 'Trace', value = ['Trace', 'Debug', 'Info', 'Notice', 'Warn', 'Error', 'Fatal'] }
timeout_secs = { type = 'u32', default = 30, min = -100000000, max = 100000000 }

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 例えばこう☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 そうか☆ このあとお父んは OS を作ってしまうのか……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ディレクトリ階層を移動してそうだよな☆ あれ 何ていう名前だったかな☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 あれじゃ分からん☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 シェルじゃないの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 シェルに リストボックスは無いだろ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 アドベンチャーゲームみたいなやつ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ TOMLアドベンチャー でいいだろ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Rust でそんなに CUI 操作できたか分からん……、やはり調べないと……☆」

コマンドラインアプリケーション
Command line apps in Rust

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 色を付けたりする説明が出てこないな……☆」

コンソール・アプリケーションで文字色や背景色を変えるには?[2.0、C#、VB]

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ C# にはあるし、昔は もっと普通にでけた☆」

[Rust] 標準出力に色をつける - 3bit/8bit/24bit color

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ やってるやつはいる☆ なんでこんな古いこと やらなければいけないのか……☆?」

20200724toml2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ とりあえず ファイル読取はできるので、これを整形したい……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 桁ぞろえとか、やること多くない?」

KIFUWARABE_80x100x8_01_Futu.gif
「 罫線も引かなければならないだろうし、ページングはどうする?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 帳票ソフト作るぐらい大変だよな☆ 連休に何をやろうとしてるんだろうな☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 パーサーを作る前に、トークンナイザーを作らないといけないよな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 何を言ってるか分かんないわね」

2020-07-27(mon) 18:50

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 TOMLのパーサーを 車輪の再発明する☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 そうか☆」

# Top level
x = 1
[Apple]
    # Table level
    x = 1

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ TOML の トップ・レベルは、テーブルの下と同じだぜ☆
だから TOML のトップ階層は、名前のない、空文字ですらないテーブルの下だと思えだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 細かいこと気にすんのね」

apple = 'pie'

[banana]
apple = 'juice'

[[cherry]]
color = 'red'

[[cherry]]
color = 'green'

[[cherry]]
color = 'blue'

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑  テーブルの下には、大きく分けて 3種類のものを置けるぜ☆
それぞれ 説明しよう☆」

apple = 'pie'

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ これは Value with Key とでも覚えてくれだぜ☆
Java なら KeyValuePair と呼ぶ☆」

apple = 'pie'
-----   -----
Key     Value

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ イコール(=)の左側が キー で、要するに名前だぜ☆
右側は バリュー(値)だぜ☆ バリューには色んな種類があるので あとで説明する☆」

[banana]
apple = 'juice'

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ これは banana テーブル☆ 何に似ているかというと、フォルダーに似ている☆
テーブルの下に何が置けるかは さっき説明した通りだぜ☆」

[[cherry]]
color = 'red'

[[cherry]]
color = 'green'

[[cherry]]
color = 'blue'

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 最後に Array of Table with Key (名前付きのテーブルの配列)だぜ☆
同じ名前のフォルダーをたくさん作れる、みたいに考えてくれだぜ☆
名前付きテーブルの配列の下に何を置けるかも、テーブルと同じだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 ごちゃごちゃ してんな☆」

TOMLJSON Online converter

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ それぞれ、 JSON に変換すると どんな形になるかを知っておくと 理解が早いぜ☆
1つ1つ見ていこう☆」

apple = 'pie'
{
  "apple": "pie"
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 名無しのテーブルに入ってるのが見えるな☆」

[banana]
apple = 'juice'
{
  "banana": {
    "apple": "juice"
  }
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ テーブルは、名前付き になってるのが見えるな☆」

[[cherry]]
color = 'red'

[[cherry]]
color = 'green'

[[cherry]]
color = 'blue'
{
  "cherry": [
    {
      "color": "red"
    },
    {
      "color": "green"
    },
    {
      "color": "blue"
    }
  ]
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 名前付き配列の要素が、全部テーブルだな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 名前付きの配列は無いの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 有る☆ お見せしよう☆」

apple = [ 'pie', 'juice' ]
{
  "apple": [
    "pie",
    "juice"
  ]
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こうだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 なんで テーブルの配列 だけ 特別に構文があんの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 知らね☆
テーブルも 名前付きバリュー のバリューのところに書けるぜ☆ やってみよう☆」

food = { apple = 'pie', banana = 'juice', cherry = 'rice' }

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ これが Inline table だぜ☆
最後の項目の後ろにカンマを付けれないことと、 { から } まで 改行してはいけないという特徴を覚えろだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 なんで改行しちゃいけないの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ふつうの テーブル があるからだぜ☆
1行にするか、1項目ずつ改行するかの2択だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ぜったい そんなん知らない おっちゃん 改行しちゃうわよね?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 専用エディターが居ると思う☆ そんなん知らない おっちゃん は ウィンドウズのメモ帳 使うだろうけど☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 配列は 改行していいの?」

apple = [
'pie', 'juice'
]
{
  "apple": [
    "pie",
    "juice"
  ]
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ していいぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 変なの」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 次に、ネスト を見ていこうぜ☆?」

[pinapple]
drink = 1

[pinapple.banana]
drink = 2

[pinapple.banana.cherry]
drink = 3
{
  "pinapple": {
    "drink": 1,
    "banana": {
      "drink": 2,
      "cherry": {
        "drink": 3
      }
    }
  }
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ テーブルのネストは こう書くぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ずっとフルパスじゃない。うざ……」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 TOMLの特異性って そこだよな☆
つまり TOMLの テーブルというシステムは 絶対パスにしなさい という縛りだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 人類はよっぽど インデントに失敗するのだろう……☆」

[[pinapple.banana.cherry.grape]]
drink = 4

[[pinapple.banana.cherry.grape]]
drink = 5

[[pinapple.banana.cherry.grape]]
drink = 6
{
  "pinapple": {
    "banana": {
      "cherry": {
        "grape": [
          {
            "drink": 4
          },
          {
            "drink": 5
          },
          {
            "drink": 6
          }
        ]
      }
    }
  }
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ テーブルの配列は こうなる☆
これが、 TOML は明瞭で読みやすい、ということだな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 インデントや、閉じかっこ を排除したのが TOML なのね」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 べつに インデントしてもいい……☆ しなくていいだけで☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 配列には 絶対パス特典 無いんだな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 TOML のモデルは 内部的に JSON のような構造にするの? それとも TOML のままの構造にすんの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 TOML の構造のまま 持つというのも手だよな☆
そうすると 何行目でエラー、とか 出せる特典が付けれる☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 マークアップの思想かだぜ☆ 原文そのままに 意味だけ足す、みたいな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 TOML の ML は マークアップ・ランゲージ ではなく ミニマル・ランゲージ だったのね」

Document
|
+-- BroadLine
    |
    +-- Line
    |
    +-- Line    

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ドキュメントは、 ブロード・ラインを複数個持っていて、
ブロード・ラインは 行 を複数個持っている、という構造で行けるだろうか☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 折りたたまれた行、を表すいい具合の英単語は無いだろうか☆?」

pub enum Line {
    Single,
    Multiple,
}

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Rust は Enum 型があるのよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うーむ、その方がスマートかだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 しかし Lines という名前で 途中に Multiple が挟まってたら、行数ではなくなるな……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 Variable height lines でどうか☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 名前が長いが、そういうことだよな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ラインの中にテーブルが入ってるのって おかしくない?
もう パラグラフ とかいう名前にしたら?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 パラグラフ、という感じじゃないんだよな……☆
セクション でいいかな……☆
セクションだと、行だとういことが分からないだろ☆
ブロード・ライン の方がいいかな☆」

Document
|
+-- BroadLine
    |
    +-- EmptyLine
    |
    +-- Comment
    |
    +-- KeyValuePair
    |
    +-- Table
    |
    +-- ArrayOfTable

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ なるべく平易な名前にすると こうか☆」

2020-07-28(tue)

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 行スキャナーにするべきか、行にこだわらないスキャナーにするべきか☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 どういう違いがあるの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 1行の終わりまでスキャンした時点で、何かしらの成果を返すか、それとも、
どこで終わったかは サブのスキャナーに判断させるかの違いだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 配列や、複数行文字列は、複数行に跨るわよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そこも ライン・スキャナー ではなく、 ブロード・ライン・スキャナー という概念で作るか……☆」

Foreach Tokens
|
+-- BroadLineParser
    |
    +-- EmptyLineP
    |
    +-- CommentP
    |
    +-- KeyValuePairP
    |
    +-- TableP
    |
    +-- ArrayOfTableP

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ざっと、こう☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 Empty のパーサーなんか作れるのか☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 正確には NewLineOnly parser だよな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 何もマッチしなかった、ということを能動的に書けるのかだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 要は、残りのうち、エラー無く終わったやつだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 判定しづらいのは Table と Array of table の違いだよな☆
最初に出てくる文字が [ で、2文字目が [ でないならテーブルで、
最初に出てくる文字が[[ なら テーブルの配列だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 2文字目まで バッファーしなさい」

KIFUWARABE_80x100x8_01_Futu.gif
「 そこは マシン・ステート でやったらどうか☆
1文字目が [ だったら、 AfterLeftSquareBracket 状態に遷移するんだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 それは 一貫性があるかも……☆!」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 きふわらべちゃんは 偉いわねぇ」

KIFUWARABE_80x100x8_08_Gentleman.gif
「 ……☆!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 テーブルと、配列のテーブルのパーサー の終端子もまた テーブルと、配列のテーブルというのを説明する☆」

[apple]
# 次のテーブル、または配列のテーブルまで同じセクション

[banana]
[apple]
# 次のテーブル、または配列のテーブルまで同じセクション

[[banana]]
[[apple]]
# 次のテーブル、または配列のテーブルまで同じセクション

[banana]
[[apple]]
# 次のテーブル、または配列のテーブルまで同じセクション

[[banana]]

KIFUWARABE_80x100x8_01_Futu.gif
「 めんどくせ……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 しかし、入れ子構造にしなくていい、というメリットもあるぜ☆
TOML のテーブルは、フラット☆」

<書きかけ>

何度でもクリック!→

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位 の最近の記事