バベルの図書館は完成しない

Extended outer memory module
for my poor native memory.

Posts:
2020/09/28 gendoc という YAML からドキュメントを生成するコマンドを作った
2020/09/13 ISUCON10 の予選を 7 位で通過した
2019/12/01 Puma の内部構造やアーキテクチャを追う
2019/05/27 Golang の正規表現ライブラリの処理の流れをざっくり掴む
2019/04/29 InnoDB の B+Tree Index について
2019/04/29 InnoDB における index page のデータ構造
2019/04/28 InnoDB はどうやってファイルにデータを保持するのか
2019/01/06 Designing Data-Intensive Applications を読んでいる
2019/01/03 年末年始に読んだ本について、など
2019/01/01 Ruby から ffi を使って Rust を呼ぶ
2018/11/10 ブラウザにおける状態の持ち方
2018/07/01 Rust で web アプリ、 或いは Rust における並列処理
2018/05/14 なぜテストを書くのか
2018/05/13 Rust で wasm 使って lifegame 書いた時のメモ
2018/03/12 qemu で raspbian のエミュレート(環境構築メモ)
2018/03/12 qemu で xv6 のエミュレート(環境構築メモ)
2018/03/03 Ruby の eval をちゃんと知る
2018/02/11 Web のコンセプト
2018/02/03 Rspec のまとめ
2018/02/03 Ruby を関数型っぽく扱う

gendoc という YAML からドキュメントを生成するコマンドを作った

僕はローカルのテキストファイルに色々なことを書く

今ぱっと思いつく用途は以下

このときにある程度決まったフォーマットだったり、ファイル作成時の日時をファイル名にしたかったり、都度自分でやるには手間のかかるくらいのルールを設けたいことが多い

そこで生成するファイルのファイル名や保存先のパスや生成直後の内容などをメタ的に記述しておき、どこでも同じコマンドで生成できるといいなと思った

んで久しぶりにちゃんとコード書きたかったというのもあり Rust 使って gendoc というコマンドを用意した(こういったツールはすでにありそうだけど、あまり大変でなさそうだし自分で使うものなので自分で実装していきたい)

リポジトリは以下

https://github.com/furuhama/gendoc

crates.io は以下

https://crates.io/crates/gendoc

meta tag のパース部分や置換部分は実装してて結構楽しかった、 trait 境界使ってクロージャ渡す部分は割に綺麗に設計できたんじゃないかと思っている(<input> tag に関してもうちょっとやりたいことがあるから最終的な設計は変化しているかもしれないけど)

例えばこのブログの記事ファイル生成のための gendoc.yaml は以下の通り

post:
  dir: _posts
  filename: <date:%Y-%m-%d>-<input>.markdown
  body: |
    ---
    layout: post
    title:
    date: <datetime:%Y-%m-%d %H:%M:%S>
    tag: []
    ---
minipost:
  dir: _posts/miniposts
  filename: <datetime:%Y-%m-%d-%H%M>.markdown
  body: |
    ---
    layout: post
    title:
    date: <datetime:%Y-%m-%d %H:%M:%S>
    tag: [minipost]
    ---

普通の記事は gendoc post で、 minipost は gendoc minipost で生成できる

作ってて思ったけどよくちょろっとスクリプト書きたいときがあるから、以下の様に Ruby なんかのスクリプトのテンプレを用意しておくのもいいかもしれない(ActiveRecord の bug report 用のファイルを参考にした)

ruby:
  filename: <datetime>.rb
  body: |
    # frozen_string_literal: true

    require "bundler/inline"

    gemfile(true) do
      source "https://rubygems.org"

      git_source(:github) { |repo| "https://github.com/#{repo}.git" }

      # Activate the gem you are reporting the issue against.
      gem "activerecord", "6.0.3.3"
      gem "sqlite3"
    end

    require "active_record"
    require "minitest/autorun"
    require "logger"

    # This connection will do for database-independent bug reports.
    ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
    ActiveRecord::Base.logger = Logger.new(STDOUT)

    ActiveRecord::Schema.define do
      create_table :authors, force: true do |t|
      end

      create_table :posts, force: true do |t|
        t.integer :author_id
      end

      create_table :comments, force: true do |t|
        t.integer :post_id
      end
    end

    class Author < ActiveRecord::Base
      has_many :posts
    end

    class Post < ActiveRecord::Base
      has_many :comments
      belongs_to :author
    end

    class Comment < ActiveRecord::Base
      belongs_to :post
    end

    class BugTest < Minitest::Test
      def test_association_stuff
        post = Post.create!
        post.comments << Comment.create!

        assert_equal 1, post.comments.count
        assert_equal 1, Comment.count
        assert_equal post.id, Comment.first.post.id
      end
    end
2020/09/28 01:54
tags: rust - cli
This site is maintained by furuhama yusuke.
from 2018.02 -