ActiveRecord ERDの代わりを求めて

いろいろ言われることはあるけれど、何はともあれ ActiveRecord はエコシステムの強力さが魅力。最近はあんまりやってなかったけど動くコードでモデリングするという方法を採用することがあって、その際に使えるのがコレ。

amatsuda/erd: A Rails engine for drawing your app's ER diagram

今回は ActiveRecord 以外の環境でこれに近いことができないかと思い探してみたところ、以下の組合せでそれなりに実現できそうということが分かった。

  1. PostgreSQL + schema dump + sql_graphviz ( Python )
  2. rom-sql + rom_sql_graph ( Ruby )

あくまでそれなりではあるけど。Rails + ActiveRecord から距離を置くことは実現できている。

sql_graphviz ( Python )

rm-hull/sql_graphviz: Generates graphviz commands to graphically display tables and show foreign key links.

SQL を dot 言語に変換するアプローチ。要 Python. これなら DDL としての SQL があればなんとかなるので、ORM にも開発言語にも依存しない。

本当は Graphviz 本家に Java で動くものがあるんだけど、

Sql2Dot

これはどうにも思ったような動作をしなかった。対応している SQL にいろいろ制限があるのかもしれない。

sql_graphviz を手元で試したところ、SQLite 3 の .schema で出力した SQL では table 情報は出力できるが relation を追うことができなかったため、目的を果たすことができなかった(table 情報を出力したかったわけではない)。

PostgreSQL の schema dump の場合は意図通りに relation を辿って graph を生成することができたが、生成された dot の label に各 column の詳細な情報が含まれてなかなかゴツイ graph になってしまうので、entity が多くなると ER 図としては結構きつそうに見える。

とは言えシンプルな Python スクリプトなので、label に生成される HTML をカスタマイズすればよいだけとも言える。例えば以下のような感じ。

  def field_act(s, loc, tok):
      fieldName = tok[0].replace('"', '')
-     fieldSpec = html.escape(' '.join(tok[1::]).replace('"', '\\"'))
+     fieldSpec = html.escape(tok[1].replace('"', '\\"'))

cf.

rom-sql + rom_sql_graph ( Ruby )

rom-sql は ROM.rb の SQL Adapter のことで、Hanami::Model の実質的な正体。つまりこの組み合わせは Hanami::Model に対しても使える。

気をつけないといけなのは 2020-12-12 時点で GitHub 上の README は master 時点のものでリリース済みの 0.2.0 のものとは異なり、

# First: create rom repository object
repo = UserRepository.new

# Next: create Rom::Sql::Graph object
graph = RomSqlGraph.generate(repo)

# Generate image or html file with your db associations
graph.generate_image
graph.generate_html

として ROM::Container ではなく Repository を RomSqlGraph に与えないといけない。

また、出力は entity 名だけになってしまうので、前述の sql_graphviz とは反対に情報量が減りすぎてしまうという問題がある。これも中を覗いて直していってもよいが多すぎる情報を削っていくより存在しない情報を追加していく方がつらそうではある。

ちなみに ROM.rb には Rails 向けのプロジェクトもある

Rails を ActiveRecord ではなく ROM.rb と組み合わせて Repository パターンを基本に実装することもできるようだ。多少コード量が増えても Rails で影響範囲の小さなコードを実現したいという場合に利用できるかもしれない。(もっとも、今なら新規に立ち上げられるなら素直に Hanami を使った方がよさそうだとは思うが。)

cf.

SimmpleTest のサイトが引っ越してた

しかも古い方は放置だったんで変化に気づかなかった。おいおい。

SimpleTest - Unit Testing for PHP

1.0.1 が出ました。PHP 4.2 から 5.3 までカバーするテストツールですよ、とでかでか書かれているんだけど、左の方にこっそりこのリリースが PHP 4 互換で最後だよと書かれている。つまり、

PHP 4 から 5 の移行に活かせるのは SimpleTest 1.0.1 までだよ

ということ。

※ サンプルを見ると SimpleTest の方にも BDD の影響が出ている気がする。ただ PHP な世界のテストツールでは新しく出てきた PHPSpec なんかも同じなんだけど関数名を Behavior にするアプローチが多い。でもこれ絶対ダメだと思うんだよな。関数名に使える文字には制限が多すぎる。ただでさえ Ruby と違って ? とか使えないんだから。お前ら RSpec の上っ面だけ真似して喜んでるんじゃねえ。

手前味噌な話だけど、自分が預かっている環境で PHP 4 のものはもうない。これは 1年前散々苦労した成果だ。その際、

  • SimpleTest によるユニットテスト
  • お手製のチェッカ(要は片っ端からスクリプトを起こしまくって致命的なエラーを吐き出させるもの)

が大活躍してくれた。

実は SimpleTest の前に PHPUnit をちょっとだけ使っていたこともあったんだけど、その後すぐ SimpleTest に乗り換えた。理由は

  1. PHPUnit は PHP 4, 5 の両対応ではなかった
  2. SimpleTest の方がテスト結果の表示が標準で派手めで、ちょっと楽しそうだったので導入の心理的ハードルを下げてくれた

の二つが大きかった。自分一人だったら 1 だけで十分に移行理由になるんだけど、他の人にも使ってもらおうと思うと 2 の理由も同じくらいに大きなものになってくる。

インストールは今までずっと pearified.com の 1.0 を使っていたんだけど、なんか pearified もこのまま放置プレイな匂いがぷんぷんするので、自前で pear パッケージングしようかなと思い始めている。まぁ、開発環境だけならパッケージングする必要もないっちゃないし、最近流行りのフレームワークは pear 使わないのも多いんだけどね。でも pear パッケージにしないんならせめてリポジトリでちゃんとタグは打っといてほしいわ。svn co は実質 trunk のみとかいやすぎる。

ムンクの誕生日なのか

Google さんが例によってロゴを差し替えている。

これしかし。

検索結果がゼロだったときにこそ表示されてほしいな。

ちょっと shell をいじった

今まで FreeBSD では tcsh、Linux と OS X では bash、とデフォルトのものをそのまま使うというポリシーのなさできていたのだけど、思うところあって zsh にしてみた。

zsh にしたのはなんのことはない、単に補完候補の表示のされ方がかっこいいから。それ以上は特になし。だから乗り換えも困らない。prompt の設定がよく分からなかった以外は .bashrc をほとんどコピーして終了。

shell を変えたら alias から漏れた瞬間に ls に色がついた。実は普段 ls はモノクロで -AF を使うようにしているのでとても違和感があったのだが、それでもデフォルトの Linux のギトギトさのようなものは感じなかった。なんでかなーと思ったら、bold になってないからだ。

BSD系の OS では特に指定しない限り bold にならない。おぉ、これはあんまりいやな感じしないぞ。早速 Linux の方でも bold にならないように設定してみた。おぉ、なんだか見やすくなった。でもやたらと拡張子ごとに色が変わるのはうざいので、結構設定を削った。品位がないとね。shell にも ls にも。

※ jarp によると zsh で UTF-8 がオッケーなのは 4.3.1 からとか? まぁあんまり影響ないかな? ダメなときはまた変えればいいじゃない。

ハウル

思ったより面白かった。

宮崎駿は基本的に暗い。ナウシカが象徴的だけど千と千尋も決して楽しい話ではなくむしろ説教くさい。まんが日本むかし話的と言ったら分かる人は分かるだろうか。何かしらの教訓を込めたがると言った方が分かりやすいかもしれない。

原作つきやキャラクターありきの作品のときはそういう宮崎臭はあまりしなくなる。ハウルはその良い面が出た感じだ。昔の作品のようなつきぬけた1楽しさはもうないが、久石譲の音楽と相まって楽しく、物悲しく、そして楽しい作品に仕上がっていていい感じ。久石譲は本当にいいなぁ。

キムタクは美輪明宏の絶賛に少し期待したけれどやはり声だけでもキムタクであった。というか美輪明宏がものすごくよい。すごい。

文中、敬称は略させてもらってます。

  1. コナンとかルパンとかホームズとか 

田村亮子さんが結婚式を挙げたそうですが

どんなドレスよりもクボタの CM の作業着が、もう柔道着以上に似合って見えたのは自分だけだろうか。

あの CM はクボタの人のセンスなのか代理店のセンスなのか分からないけど、キャスティングが最高だと思う。個人的にはものすごく評価が高い CM だ。ちゃんと使い物になる鍛えた身体と健康的な笑顔が、実に農機具にマッチするんだな。農業のイメージも少しは良くなるかもしれないとか、そんなことまで考えてしまいますよ。

そういうえば、テレビではああいう健康的な感じのする人ってあんまり見ないな。だからかな、こんなに強い印象があるのは。

いや、まぁ、ドレスが似合わないなぁと前から思ってました。えぇ、認めます。

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm