LibreOffice Drawのodgファイルから図形の情報を抜き出して使う

これは LibreOffice Advent Calendar 2019 の 3日目の記事です! TL;DR プログラムに入力として与えるデータの編集をどうするか問題 位置情報などはテキストで管理すると直感的に修正できなくて辛い LibreOffice Draw で編集して odg ファイルから情報を抜き…

JRubyでLibreOffice Calcのfodsファイルを読み書きするサンプル 2019

以前 JavaScript(Rhino/jrunscript)で書いたものを今さらながら Nashorn 向けに書きなおそうとして調べたところ、非推奨になっていました。 2018-06-07 JavaでJavaScriptを実行する「Nashorn」が非推奨に、ECMAScriptの速い進化に追いつけないと。代替案は…

JavaでLibreOffice Calcのfodsファイルを読み書きするサンプル 2019

5年前に JavaScript で書いたもの を大体そのまま Java に書き直しただけです。 例外のハンドリングは適当です。 今では推奨されない古い書き方が残ってたりするかもしれません。 sonota88/libreoffice-java-sample at 20191202 https://github.com/sonota88…

OCaml ちょっとやってみるための準備(Docker + Ubuntu 18.04)

Docker + Ubuntu 18.04 での環境の用意 とりあえず cat コマンドを書いてみた たぶん3日坊主になると思うので、 ホスト側の環境を汚さないように Docker で環境を用意する。 ホストも Ubuntu です。 この記事を参考に。何も分からないので助かります。 WSL …

LibreOffice Calcの入ったDockerイメージを作ってヘッドレスで動かす

とりあえず自分が使いやすいようにポータブルにしておくとよいかも? くらいの思いつきでやってみましたが、たとえば開発チームのメンバーにちょっとしたツールを渡したいとき(そのためだけに LibreOffice をインストールしてもらわなくて済む)とか、サー…

Open JTalkのDockerイメージを作って手軽に喋らせる

Docker イメージとラッパースクリプトを作っておいて echo "ほげ" | ./talk.sh みたいな感じで手軽に喋らせたい。 改善の余地はありますがとりあえず動いた段階での最低限なメモです。 Dockerfile 書く: FROM ubuntu:18.04 RUN apt-get update \ && apt-get …

vm2gol v2 製作メモ(38) おまけの修正

目次ページに戻る 前回からの差分をまとめて見る ゴール設定が「ライフゲームが動けばOK」 だったので、前回で終わり、としてもよかったんですが、 せっかくなのでもうちょっとだけいじります。 すでにライフゲームが動いており目的は達成されているので今回…

vm2gol v2 製作メモ(37) 完成!

目次ページに戻る 前回からの差分をまとめて見る はい、前回でとうとう 1回のターンが動くように……なってないんですねこれが。 1回のターンに必要な処理がもう1つ残ってます。 VRAM のバッファ領域に書き込んだ次世代の状態をメイン領域に戻す処理です。 や…

vm2gol v2 製作メモ(36) すべてのセルで繰り返し

目次ページに戻る 前回からの差分をまとめて見る 前回までで、1つのセルについて 生存セル数をカウントして、 次世代の生死を決定して、 バッファ用の配列に書き込むところまでできました。 今回は、盤面のすべてのセルに対してそれを行うようにしましょう!…

vm2gol v2 製作メモ(35) 次世代の生死をバッファ領域に書き込み

目次ページに戻る 前回からの差分をまとめて見る 周囲の生存セル数から次世代の生死を決定できるようになりました。 今回は、これを VRAM のバッファ領域に書き込む部分を作ります。 VRAM のメイン領域とバッファ領域は、アドレスが 25 ずれているので、 x, …

vm2gol v2 製作メモ(34) 次世代の生死を決定

目次ページに戻る 前回からの差分をまとめて見る もうだんだんライフゲームそのもののコーディングに移ってきたので、 cp 33_adjust_index_2.vgt.json gol.vgt.json として、以後はこの gol.vgt.json に対して修正を加えていきます。 座標補正ができて、その…

vm2gol v2 製作メモ(33) 座標の補正 (2)

目次ページに戻る 前回からの差分をまとめて見る 前回の座標補正の続き……の前に、 先に引っかかるところを潰しておきます。 codegen_return() でローカル変数を返そうとすると 参照の解決ができずにエラーになるので、修正。 --- a/vgcg.rb +++ b/vgcg.rb @@…

vm2gol v2 製作メモ(32) 座標の補正

目次ページに戻る 前回からの差分をまとめて見る これまでは、 その都度の目標に向けて適当に作り、バグや not yet impl で例外が出たら その都度潰していく、という進め方でやってきました。 そういう方針なので、それはそれでいいのですが、 同じようなこ…

vm2gol v2 製作メモ(31) 生存カウント (2) / _cmt

目次ページに戻る 前回からの差分をまとめて見る 1つのセルの生死が取れるようになったので、 今度は周囲の8つのセルに対して同じように取得できるようにして、 生存カウントを完成させましょう。 前回のものを修正していくので、vgtコードをコピーしておき…

vm2gol v2 製作メモ(30) 生存カウント / VRAM から値を取得 / ステップ数を表示

目次ページに戻る 前回からの差分をまとめて見る $stdin.gets を無効化 前回二重ループですべてのセルを生存に変えていくというのをやりましたが、 ループがぐるぐる回るため何度も同じ処理を繰り返すようになり、 Enter キーを押しっぱなしにしないといけな…

vm2gol v2 製作メモ(29) 盤面のスキャン / 組み込みの neq

目次ページに戻る 前回からの差分をまとめて見る 盤面の初期化ができたので続きをやります。 えーと続きというのは何かというと…… とりあえずループを回して盤面のセルを1個ずつスキャンする処理が必要なので、 それをやりましょう。 Ruby のコードでいうと…

vm2gol v2 製作メモ(28) リファクタリング / ダンプ表示の改良

目次ページに戻る 前回からの差分をまとめて見る リファクタリングします! 参照の解決処理をメソッド抽出 前回雑にコピペで追加しまくった fn_arg_pos = fn_arg_names.index(args[1]) + 2 "[bp+#{fn_arg_pos}]" この部分を抽出してメソッド化しようと思いま…

vm2gol v2 製作メモ(27) ライフゲームの実装開始 / 組み込みの掛け算

目次ページに戻る 前回からの差分をまとめて見る なんだかライフゲーム詐欺みたいになってきましたが 今度こそほんとにライフゲームに突入できる……はず……。 というか突入しましょう! やるぞぉ……! はい、やります。 vgtコードです。 最終的にはグライダーを…

vm2gol v2 製作メモ(26) 配列とVRAM その2 / ダンプ表示の改良

目次ページに戻る 前回からの差分をまとめて見る さて、前回やっつけで VRAM を用意しましたが、 今回は VRAM の仕様というか使い方みたいなものを簡単に書いておきます。 あわせて、前回お手軽に inspect で済ませていたダンプ表示を いい感じに修正します…

vm2gol v2 製作メモ(25) 配列とVRAM / set_vram, get_vram

目次ページに戻る 前回からの差分をまとめて見る 関数まわりと条件分岐とかが一応できて、入れ子の式も回避方法が決まり…… たぶんまだ足りないところがボロボロ出てくると思いますが、 ライフゲーム作りながら直していきましょう。 まずはライフゲームのロジ…

vm2gol v2 製作メモ(24) 入れ子の式

目次ページに戻る 前回からの差分 … 今回は差分なし 関数まわりが整備でき、条件分岐ができ、反復処理もできるようになりました。 プログラムを作るのに必要な道具が揃ってきたのでもうそろそろ ライフゲームが書けてしまうのでは!? ……と言いたいところで…

vm2gol v2 製作メモ(23) 組み込みの eq / while文

目次ページに戻る 前回からの差分をまとめて見る 準備が整ったので while やります! ["var", "a"] , ["set", "a", 0] , ["while", ["eq", 0, 0] , ["set", "a", ["+", "a", 1]] ] こんな感じでやりたいのですが!! ["eq", 0, 0] の部分の eq がまだでした…

vm2gol v2 製作メモ(22) 組み込みの足し算

目次ページに戻る 前回からの差分をまとめて見る 分岐ができたので次はループをやりたいですね。 簡単なところで、数を1ずつ増やしていくカウンタとか。 ["var", "a"] , ["set", "a", 0] , ["while" , ["eq", 0, 0] // 条件: 必ず真になるようにして無限ルー…

vm2gol v2 製作メモ(21) case文

目次ページに戻る 前回からの差分をまとめて見る 関数まわりが整備できたので、次は条件分岐(if文)やりましょうか。 えーと、こんな感じで…… ["if" , ["eq", 33, 31] , [ ["set_reg_a", 11] ] , [ ["set_reg_a", 22] ] ] こんな感じで作っていましたが、こ…

vm2gol v2 製作メモ(20) 値を返却してローカル変数に代入 / return, call_set文

目次ページに戻る 前回からの差分をまとめて見る 関数呼び出しができて、 ローカル変数が使えるようになって、 引数も渡せるようになりました。 あと関数まわりは返り値をどうにかすれば一通り必要なものが揃います。 今回は次の2つのステップに分けます。 …

vm2gol v2 製作メモ(19) 関数に引数を渡す

目次ページに戻る 前回からの差分をまとめて見る 今回は関数の引数をやります。こんな感じで進めましょう。 引数を1個渡す 渡した引数をローカル変数に代入 引数を2個渡してローカル変数に代入 引数を1個渡す これを動かします。 // 19_func_arg.vgt.json ["…

vm2gol v2 製作メモ(18) ローカル変数の宣言と代入 / var, set文

目次ページに戻る 前回からの差分をまとめて見る 今回はローカル変数の宣言と代入をやります。 ( アセンブリをやっていたときはループ、条件分岐、 それからサブルーチン〜という順番でやっていました。 それとは違う順番になっていますが、 特に意図したも…

vm2gol v2 製作メモ(17) main から別の関数を呼ぶ / call文

目次ページに戻る 前回からの差分をまとめて見る 空の main 関数の実行の次は、 main から 別の関数の呼び出しをやってみましょう。 簡単そうですが、これも一歩ずつということで 2段階に分けます。 関数定義を並べるだけ(main からの呼び出しはしない) ma…

vm2gol v2 製作メモ(16) 簡単なコード生成

目次ページに戻る 前回からの差分をまとめて見る 条件分岐とループができて、 サブルーチンの呼び出しができて、引数が渡せて、 結果を返せて、ローカル変数が使えるようになった!!! ので、これくらい揃えばもうなんでもできるんじゃね!?!? みたいな…

vm2gol v2 製作メモ(15) ローカル変数 / sub_sp

目次ページに戻る 前回からの差分をまとめて見る 今回はローカル変数をやります! これまでスタックをこんな風に使っていました。 ベースポインタ 戻り先アドレス 引数1 引数2 入れ子の呼び出しがある場合はこう: ベースポインタ 戻り先アドレス 引数1 引数2…