kairo-gokko (7) 前処理と実行に分ける



分けます。

今の段階でいえば、元データを整形して Unit::EdgeUnit::PlusPole に変換する部分が前処理、 描画部分が実行処理に当たります。

  • 前処理(データの整形)の部分は LibreOffice Draw で編集して元データが変更されたときに 1回だけ動けばよい。実行時に毎回やらなくてよい。
  • 実行部分に DXOpal を使おうとしているので、 起動時間(実行が始まるまでの時間)を短縮するために依存するコンポーネントをなるべく減らしたい

のような理由です。

前処理したデータは一度シリアライズしてファイルに出力し、 実行の際はそれを読むようにします。

to_plain, from_plain

シリアライズ、デシリアライズのためのメソッドを追加します。 たとえば Circuit はこんな感じ。ハッシュにしたり、逆にハッシュから復元したり。

  def to_plain
    {
      edges:       @edges      .map { |it| it.to_plain },
      plus_poles:  @plus_poles .map { |it| it.to_plain },
      minus_poles: @minus_poles.map { |it| it.to_plain }
    }
  end

  def self.from_plain(plain)
    edges       = plain["edges"      ].map { |it| Unit::Edge     .from_plain(it) }
    plus_poles  = plain["plus_poles" ].map { |it| Unit::PlusPole .from_plain(it) }
    minus_poles = plain["minus_poles"].map { |it| Unit::MinusPole.from_plain(it) }

    Circuit.new(
      edges,
      plus_poles,
      minus_poles
    )
  end

野暮ったいですが気にしない。

preprocess.rb

circuit オブジェクトができたら data.json に出力します。

print JSON.pretty_generate(circuit.to_plain)

viewer.rb

data.json を読んで circuit オブジェクトを復元します。 ファイル名はいったん決め打ちで。

json = File.read("data.json")
circuit = Circuit.from_plain(
  JSON.parse(json)
)

run.sh

別々に実行できるようになったとはいえ、 毎回両方とも実行出来たほうが今のところ便利なので、両方とも実行するシェルスクリプトを用意します。

前処理では Bundler で管理している gem を使っていないので bundle exec は不要。

#!/bin/bash

set -o errexit

ruby preprocess.rb "$@" > data.json

bundle exec ruby viewer.rb

./run.sh data_01.fodg 3 のように実行すると、 今までのように動かせます。