@ledsun blog

無味の味は佳境に入らざればすなわち知れず

ニンジャと司教の再出発! 1 レトロゲー迷宮に殴り込み

3巻が出たので、読み直しました。 転生前のキャラクターと転生後のキャラクターの人格が混ざっているという設定と、主人公のちょっと他人事っぽい描写が、ドライでいいっす。

異世界転生ものの常で、主人公が読者と同じ目線で世界観にツッコミをいれるのですが、主人公の記憶が前世と現世で混濁していく間に、読者も読者なんだか主人公なんだかよくわからないポジションに連れて行かれます。 その割に、ちょいちょい現世を前提としたギャグを入れてくるので、夏目房之助のいうところの手塚治虫漫画のヒョウタンツギのような、ストーリー漫画から現実世界に引き戻されるような感覚があるようなないような。

世界観のモチーフはウイザードリィ + ダンジョンズアンドドラゴンズ です。プレイヤーとキャラクターが入り混じった感じや、キャラクター間のボケとツッコミなど、TRPGのリプレイのような感触もあります。

参考

DINKs

DINKs(選択子なし)の話題が、はてなアノニマスダイアリーに上がっていました。 出産・育児の負荷が、少なくとも仕事のキャリアの面で、男女で大きくちがうので、女性には重大な問題なのかなあ?とは思いますが、 当事者でないので、良いとか悪いとか損とか得とかには特に興味ないです。

DINKsの概念がいつ頃から広まったのか調べてみると、 知恵蔵に2007年に載ったようです。 krsnikさんの情報により、ザ・シェフ 23巻に「DINKの時代」というエピソードがあるのがわかりました。

ザ・シェフ 23巻は1989年発行です。 1980年代末にすでにあった言葉のようです。 Kindle unlimitedなので無料で読めます*1。 30年でDINKsへの価値観がどう変わったのか見えて面白いです。

追記まで読んだら、ザ・シェフのエピソード通りの話でした。 どんな顔していいかわかんないです*2

*1:無料になる条件がある気がしますが知りません

*2:ザ・シェフの中では、主人公 味沢 匠の料理を食べた人が自己解決するのですが、それはそういうお話なので、現実世界とは直交した概念だと思います。

サラリーマンが異世界に行ったら四天王になった話 3

現世で報われなかった主人公が、異世界で活躍して女性に囲まれるスタンダードな異世界転移ものです。 主人公の解決する課題が戦闘でなくて、交渉だったりロジスティクスだったり、パターンが多くて予想が付かないのが良いです。課題の大きさも壮大すぎずこじんまりしすぎずちょうどいい感じがします。話に悲壮感がないのも絵と合ってて良いです。

3巻から原作の方がネームまでやるようになったせいか、絵のクオリティが上がったように思います。ネームを書く時間が節約できて、絵に時間を掛けられるようになったのでしょうか?

計算理論の基礎

3月からちょびちょびと読み進めています。 そろそろ第一章の「正規言語」が読み終わりそうです。

難しいです。 一日に3ページくらい読んで、うーんわからんと思います。 翌日同じところを読み直すと、わかったりします。 謎。謎というか、文章のパースに時間が掛かる感じです。

三ヶ月掛けて読んで、まったくできることが増えた気がしないのは、達成感に欠けます。 まあ、モチベーションは「大学の授業でやったけど、よくわからんかったな」に対する敵討ちなので、別にできることが増えなくてもいいのです。

iPadのリモートデバッグで開発コンソールが表示されない

たぶんSafari Web Inspector tabs are miss… | Apple Developer Forumsだと、思います。

で、iPadmacにつないでWebインスペクタを見ると、次のように表示されます。

f:id:ledsun:20210623163442p:plain
リモートデバッグ中のWebインスペクタ

Safariのアップデートを待てばいいのでしょうか?

activerecord_umlをrails runnerから起動する

結論

このコミットです。 github.com

springを使いたい

activerecord_umlは、Railsアプリケーションを読み込んでいます。 大きなRailsアプリケーションでは起動に時間が掛かります。 RailsではGitHub - rails/spring: Rails application preloaderを使って起動時間を減らしています。

activerecord_umlもspringを使えば起動時間を短くできるはずです。

#! /usr/bin/env ruby
require "activerecord_uml"
begin
  load File.join(Dir.pwd,"bin/spring")
rescue  LoadError
end
require(File.join(Dir.pwd, "config/application"))
Rails.application.require_environment!
ActiverecordUml.draw

こんな感じです。実行してみると

~ ~/activerecord_uml/exe/activerecord_uml
Version: 2.1.1
Usage: spring COMMAND [ARGS]
Commands for Spring itself:
  binstub         Generate Spring based binstubs. Use --all to generate a binstub for all known commands. Use --remove to revert.
  help            Print available commands.
  server          Explicitly start a Spring server in the foreground
  status          Show current status.
  stop            Stop all Spring processes for this project.
Commands for your application:
  rails           Run a rails command. The following sub commands will use Spring: console, runner, generate, destroy, test.
  rake            Runs the rake command
  rspec           Runs the rspec command
(中略)
activerecord_umlというクラスがみつかりません
Traceback (most recent call last):
    6: from /Users/shigerunakajima/activerecord_uml/exe/activerecord_uml:12:in `<main>'
  5: from /Users/shigerunakajima/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord_uml-0.5.0/lib/activerecord_uml.rb:29:in `draw'
   4: from /Users/shigerunakajima/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord_uml-0.5.0/lib/activerecord_uml.rb:29:in `map'
  3: from /Users/shigerunakajima/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord_uml-0.5.0/lib/activerecord_uml.rb:29:in `block in draw'
    2: from /Users/shigerunakajima/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord_uml-0.5.0/lib/activerecord_uml.rb:29:in `new'
  1: from /Users/shigerunakajima/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord_uml-0.5.0/lib/activerecord_uml/diagram_drawer.rb:18:in `initialize'
/Users/shigerunakajima/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord_uml-0.5.0/lib/activerecord_uml/diagram_drawer.rb:18:in `const_get': wrong constant name activerecord_uml (NameError)

springコマンドが単体で実行されたような出力が表示され、コマンドの引数にactiverecord_umlが追加されているようです。

springはRails専用

springのソースコードをみると、springを有効にするコマンドはハードコードされています。

https://github.com/rails/spring/blob/master/lib/spring/client.rb#L20-L23

      "binstub"   => Client::Binstub,
      "stop"      => Client::Stop,
      "status"    => Client::Status,
      "rails"     => Client::Rails,

activerecord_umlをspringで動かすためには、Client::ActiverecordUmlを作る必要がありそうです。

よく考えると作ったところで、次の作業のどちらかが必要です。

  • RailsアプリケーションのGemfileを修正して改変したspringを使わせる
  • Railsアプリケーションと独立に改変したspringを使う

どちらも微妙です。

activerecord_umlを使うのに、観察対象のRailsアプリケーションを変更したくないです。 さらに複数のRailsバージョンへの対応も考えなければいけません。

Railsアプリケーションと複数のspringを使うと、どちらのspringが動いているか考えなければいけなります。 springがひとつ動いているだけでも難しいのに、複数動かすのは狂気の沙汰に思えます。

rails runnerを使う

bundle installせずにrails runnerからgemのコマンドを実行する - @ledsun blogで、rails runnerからactiverecord_umlを実行できることはわかっています。

解決しなければいけないのは、activerecord_umlが依存するruby scriptを読み込むことです。 実行コマンドからの相対パスで取得できることに気がつきました。

File.join __dir__,"../lib/activerecord_uml"

あとは、Kernel#systemを使ってrails runnerを起動すれば、springを使ってactiverecod_umlを起動できます。

system  "echo 'require \"#{File.join __dir__,"../lib/activerecord_uml"}\"; ActiverecordUml.draw' | #{File.join Dir.pwd,"bin/rails"} runner - #{ARGV.join ' '}"

activerecord_uml gemを公開しました

rubygems.org

rake releaseで苦戦しました。 gem signinしてもうんともすんとも言いませんでした。

どうやら古いAPI Keyが~/.gem/credentials残っていたのが良くなかったようです。

https://rubygems.org/profile/api_keysAPI Keyを作り直し、~/.gem/credentialsを更新しました。

それからgem signinして*1

~ rake release
activerecord_uml 0.5.0 built to pkg/activerecord_uml-0.5.0.gem.
Tag v0.5.0 has already been created.
Pushing gem to https://rubygems.org...
You have enabled multi-factor authentication. Please enter OTP code.
Code:   XXXXXXXXXX
Successfully registered gem: activerecord_uml (0.5.0)

参考

*1:これも特に何も出力がないので、必要なのかどうかよくわかりません。

rails runnerを使う代わりに実行コマンドでRailsの環境を読み込む

Load the Rails environment with the run command instead of using the … · ledsun/activerecord_uml@e58e990 · GitHub

↑の変更で、行けました。

使用イメージは以下の通りです。

~ activerecord_uml Computer
<html>
  <body>
    <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
    <script>mermaid.initialize({startOnLoad:true});</script>

    <div class="mermaid">

classDiagram
  class Computer {
   integer id
    string user_name
    string maker
    string memory
   integer release_year
  datetime created_at
  datetime updated_at
}


    </div>
  </body>
</html>

代わりに、実行場所がRailsプロジェクトのrootディレクトリに限られるようになりました。 今のところの自分の使い方では特に困らないので、様子を見てみます。

参考

bundle installせずにrails runnerからgemのコマンドを実行する

  1. GitHub - k0kubun/gem-default: Change a non-default gem to a default gem in your local environment を使ってgemをdefault gem化します
  2. gemをrequireして実行するスクリプトを標準入力で、rails runnerに渡します
~ gem install gem-default
Fetching gem-default-0.0.2.gem
Successfully installed gem-default-0.0.2
Parsing documentation for gem-default-0.0.2
Installing ri documentation for gem-default-0.0.2
Done installing documentation for gem-default after 0 seconds
1 gem installed
~ gem default activerecord_uml
=> Copying files from "/Users/shigerunakajima/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/activerecord_uml-0.5.0/lib" to:
/Users/shigerunakajima/.rbenv/versions/3.0.1/lib/ruby/3.0.0/activerecord_uml.rb
/Users/shigerunakajima/.rbenv/versions/3.0.1/lib/ruby/3.0.0/activerecord_uml/diagram_drawer.rb
/Users/shigerunakajima/.rbenv/versions/3.0.1/lib/ruby/3.0.0/activerecord_uml/version.rb

=> Copying files from "/Users/shigerunakajima/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/activerecord_uml-0.5.0/exe" to:
/Users/shigerunakajima/.rbenv/versions/3.0.1/bin/activerecord_uml (original => /Users/shigerunakajima/.rbenv/versions/3.0.1/bin/activerecord_uml.old)
~ echo 'require "activerecord_uml"; ActiverecordUml.draw' | bin/rails runner -
Running via Spring preloader in process 66164
<html>
  <body>
    <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
    <script>mermaid.initialize({startOnLoad:true});</script>

    <div class="mermaid">

classDiagram

    </div>
  </body>
</html>

ruby-jpのslackでid:Pockeさんにgem-defaultを教えてもらいました。

requireの仕方を、もうちょっと工夫したいです。

activerecord_uml

gistのURLを覚えることは不可能なので、ActiveRecordを継承したクラスのクラス図を描くRubyスクリプトをgemにしてみました。いまのところrubygemsには公開していません。

github.com

bundle installすると次のように呼び出せます。

~ bin/rails runner ActiverecordUml.draw Wholesale | browser

rails runnerからは、bundle installしたgemしか使えないので、他人が作ったRailsアプリケーションのgit cloneして読むみたいな時は、一手間掛かる点が微妙です。

参考

夢幻紳士 マンガ少年版

1981年の作品。この頃から、絵もお話もカメラワークも全部不思議なんですよね。 何でこの絵で場面が成り立つのか、この話で話が成り立つのか、こんなにカメラを動かして漫画として成り立っているのが、すべてが謎です。

を、読んでいて、他人の感想を読むだけじゃもったいないと思い、読み直してみました。

複数クラスの図示に対応する

~ curl -s https://gist.githubusercontent.com/ledsun/76d5485644685f19c98f88000a971d00/raw/68d4730c4e9b3fbf35d352e0a97b094f8b1cd39f/class_diagram.rb | bin/rails runner - Dictionary Association User

こういう感じで引数で複数のクラスを指定したら、次のように3クラスまとめて一つのHTMLとして出力します。

<html>
  <body>
    <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
    <script>mermaid.initialize({startOnLoad:true});</script>

    <div class="mermaid">

classDiagram
  class Dictionary {
   integer id
    string name
      text description
   integer user_id
   integer entries_num
  datetime created_at
  datetime updated_at
   boolean public
    string license
    string license_url
      text no_term_words
      text no_begin_words
      text no_end_words
   integer tokens_len_min
   integer tokens_len_max
     float threshold
    string language
  add_entries(hentries)
  additional_entries()
  administrable?(user)
  autosave_associated_records_for_associated_managers()
  autosave_associated_records_for_associations()
  autosave_associated_records_for_entries()
  autosave_associated_records_for_jobs()
  autosave_associated_records_for_user()
  compilable?()
  compile!()
  create_a_black_entry(entry)
  editable?(user)
  empty_entries()
  narrow_entries_by_identifier(str)
  narrow_entries_by_label(str)
  narrow_entries_by_label_prefix(str)
  narrow_entries_by_label_prefix_and_substring(str)
  new_entry(label, identifier)
  num_black()
  num_gray()
  num_white()
  search_term(ssdb, term)
  sim_string_db_dir()
  sim_string_db_path()
  simstring_method()
  tmp_sim_string_db_path()
  to_param()
  undo_entry(entry)
  update_stop_words()
  validate_associated_records_for_associated_managers()
  validate_associated_records_for_associations()
  validate_associated_records_for_entries()
  validate_associated_records_for_jobs()
}

  class Association {
   integer id
   integer user_id
   integer dictionary_id
  datetime created_at
  datetime updated_at
  autosave_associated_records_for_dictionary()
  autosave_associated_records_for_user()
}

  class User {
   integer id
      text username
    string email
    string encrypted_password
    string reset_password_token
  datetime reset_password_sent_at
  datetime remember_created_at
   integer sign_in_count
  datetime current_sign_in_at
  datetime last_sign_in_at
    string current_sign_in_ip
    string last_sign_in_ip
  datetime created_at
  datetime updated_at
   boolean admin
    string confirmation_token
  datetime confirmed_at
  datetime confirmation_sent_at
    string unconfirmed_email
  autosave_associated_records_for_associated_dictionaries()
  autosave_associated_records_for_associations()
  autosave_associated_records_for_dictionaries()
  current_password()
  devise_modules()
  devise_modules?()
  password()
  password_confirmation()
  password_confirmation=()
  validate_associated_records_for_associated_dictionaries()
  validate_associated_records_for_associations()
  validate_associated_records_for_dictionaries()
}

  User --* Dictionary
  Dictionary --* Association
  Dictionary --* AssociatedManager
  Dictionary --* Entry
  Dictionary --* Job
  User --* Association
  User --* AssociatedDictionary

    </div>
  </body>
</html>

こんな見た目です。

f:id:ledsun:20210613015136p:plain
3つのクラスを描画したクラス図

リレーションが重複していると、重複して描画されるので、ユニークする必要がありました。