Programming

ソフトウェアを設計するということ

  • ARTICLES
『オブジェクト指向入門』という本がある。今は第2版が出版されていて、原則・コンセプトをテーマにしたものと方法論・実践をテーマにした二分冊になっている。この本はオブジェクト指向によるソフトウェア構築 (Object-Oriented Software Construction) とはなにかについて、緻密に基礎の基礎から話を積み上げ、その全体像を描き出す他にない名著だ。ぼくはまつもとゆきひろさんが推薦する本として最優先に挙げていたのを見て当時出ていた第一版の翻訳を買って読んだ。 最近になって必要があって読み返して驚いたのだけど、今でも自分の設計の指針となっているベースはとことんこの本の内容だった。技法ではなく、設計をするというときに考える思考の観点はこの本からもらったもので、その観点を実現するにはどんなことを理解し考えないといけないかをその後学んで実践し続けてきたのだということに気付くことができた。ソフトウェアを設計するということができるようになるために、方法論を理解しその実践を通して設計ができている状態を目指しているような人にこそ読んでみてほしい本だ。 この本は丁寧に理論が構築されているので、いきなり美味しいところから入ったりはしない。最初はソフトウェアの品質から始まる。 工学の目的は品質である。したがって、ソフトウェア工学は、品質の高いソフトウェアの生産を意味する。 自分の設計の指針となっているベースと書いた内容は第 3 章にある。ここでは、モジュール性をテーマにその 5 つの基準 (criteria)、5 つの規則 (rule)、そして 5 つの原則 (principle) が説明される。 5 つの基準 基準は「モジュール性がある」と呼ぶときに満たしている必要がある基準を挙げている。 分解しやすさ (Decomposability) 組み合わせやすさ (Composability) 分かりやすさ (Understandability) 連続性 (Continuity) 保護性 (Protection) 5 つの規則 これらを保証するために守らなければならない 5 つの規則というのが規則として挙げられているもので、これが「設計の指針となるベース」として設計のことを考えるときに常に頭の中で考えている観点そのものだった。 直接的な写像 (Direct Mapping) 少ないインタフェース (Few Interfaces) 小さいインタフェース (弱い結び付き) (Small Interfaces (weak coupling)) 明示的なインタフェース (Explicit Interfaces) 情報隠蔽 (Information Hiding) 直接的な写像 ソフトウェアシステムというものは何らかの問題領域の必要に対処しようとする。ある問題領域を記述する良いモデルがある場合、ソフトウェアによって提供される解決手法の構造と、モデルとして表現される問題の構造の間の写像 (マッピング) を、明快に保つことが望ましいことに気づくはずだ。このことから次の第 1 の規則が導き出される。 『ソフトウェアシステムの構築過程で考案されたモジュール構造は、それに先立つ問題領域のモデル化の過程で考案された任意のモジュール構造との互換性を維持していなければならない。』

Ruby で自分のための問題を解決していく話 (個人の Wiki を esa に移行した話) : 続き

  • ARTICLES
Ruby で自分のための問題を解決していく話 (個人の Wiki を esa に移行した話) の続き。前回は文章とコードでの説明ばかりになってしまったので全体的にやっていることを図にしてみた。 PukiWikiをesaへ移行する流れ 作戦としては、 一連の PukiWiki のファイルはローカルに置いて失敗があれば最初からやりなおせるようにする esa の記事作成以外は繰り返し実行可能にする Markdown の変換で PukiWiki と esa の仕様の差分を吸収できるようにがんばる 最終結果を esa 上で確認し、意図しない表示になっているものは Markdown の変換からやりなおして差分が出た記事について esa へ更新をかける という流れで、実行制限のある esa の API 呼び出しを最小限にしつつ、Wiki 内のページリンクなど PukiWiki 資産を最大限に活かせる形を考えた。実際はここまで全部最初から考えてやったわけではなくて、やりながらやっぱり Wiki 内のページへのリンクも有効にしたいなとか #ls もただ機能をつぶすのじゃなくて活用したいなとか考えては実装し、そして再度手順を実行し、という繰り返しだったのでやりなおせる構成にしたのは正解だった。 ここからは esa への新規投稿による記事 URI 確定と、二度目に Wiki 内リンクを解消した更新をかける流れを説明し、最後に繰り返し修正と更新を繰り返す中でどんな PukiWiki の仕様で引っかかったかとその対処を説明する。 esa への新規投稿で記事 URI を確定させる ページ名を日本語でもつけていることもあり、WikiName による Wiki 内のページのリンク機能を前提として書いている文章はさほどないが、[[Page name]] と囲むことでページ名を指定してのリンクは多用しているのでこれは活かしたい。 実際は記事の URI を確定させたいというだけなのだけど、esa 上に記事をつくるしかその手段がないので全記事を投稿して記事番号を採番してもらい、URI を確定させる。

Ruby で自分のための問題を解決していく話 (個人の Wiki を esa に移行した話)

  • ARTICLES
はじめに 遅くても 2008 年ごろから使っている個人の Wiki があって、調べたことや頻繁に探すことをメモしたりして使ってきた。当時職場で使っていたのが PukiWiki で使い慣れていたという理由だけで使い始めた PukiWiki をそろそろさすがに別のものにしたいなと感じていたので esa に移行をした。そのときに考えたことやこうやって移行をしたという記録。移行対象となった PukiWiki のバージョンは 1.5.0 のため、以後の各仕様は v1.5.0 のものになっている。 最初に考えたこと まずなにはなくとも PukiWiki 記法を Markdown にする必要がある。それから自分の用途としてダウンロードした各種スライドを添付していて、中にはすでに WWW 上では見つけられないものもあるので添付ファイルを完全に移行したい。そこまでどうにかできればあとは互換性のない移行をあきらめることでどうにかなるだろう。 と、まあ、あまり細かいことは考えずに始めた。 PukiWiki 記法を解釈して Markdown に変換する 検索すると正規表現を使ってごりごりと変換していくサンプルはいくつか見つかったのだが、自分でこれを修正しながら互換性を上げていく土台としてはきついなというものが多かった。そこで、パーサジェネレータを使ってみたかったという興味もあり、Parslet で PEG スタイルのパーサを書いてみることにした。 Parslet のパース結果はツリーで Array として返され、Hash が入ってる。Hash は Symbol と Parslet::Slice でできてる。Parslet::Slice は出自の位置をもった String みたいなもの。to_s をすると文字列を取り出せる。 {:toc=>"#contents"@0} #=> [Symbol, :toc] [Parslet::Slice, "#contents"@0] 実装進めるにあたっては、他の実装を参考にするのが一番イメージがつかみやすかった。 https://github.com/kschiess/parslet/tree/master/example frsyuki さんの MessagePack パーサの実装 できあがった実装が pukiwiki2md として公開されている。この Gem を使うと、Parslet に則って、Parser#parse でパースし、その結果を Transform#apply で Markdown へと変換することができる。