「入門 UML 2.0」を読んだ。 UMLってユースケースを表現するためのものでしょ?と思っていて、図を使ってユースケースを書く必要に迫られることも無かったのであまり勉強する気にもなっていなかったのですが、Plant UMLというテキストでUMLを既述できるものを知り、図を描くのにテキストで記述できるのは便利そうということで読んでみることにしました。
読んでみると、そもそもユースケース図を描くたものものという認識が誤りで、ユースケース図を表現することにも使えるが、それ以外の様々なものを表現するために使えるものであるということがわかりました。また、表現の仕方が定義されていて、UMLを知っている人であれば書き方を説明せずに記述できるということもよく分かりました。そのため、記述ルールについての凡例を書く必要もないのです。
UMLは既述したい目的毎に図の書き方がいくつも用意されています。そして、その目的や使い分けについて説明しています。しかし、その使い方は限定的ではありません。ある特定の種類の図ですべてを表現する必要はなく、その図で表現したい箇所だけをその図で表現し、そのほかの場所は異なる種類の図で表現しても良いとされています。結局は表現すべき重要な事柄を、それを表現するのに適切な図を使って表現すべきとしています。 つまり、何を表現すべきかを考えて使い分けるということです。
この本を読むことで、システム設計においてどのような情報を表現するべきかということがわかると思います。全体の概要を示したい場合や、特定部分の詳細について説明したい場合がありますが、それらがどのような種類の情報であるか、また混ぜるべきではない情報というのはどういうものかというのがなんとなくわかると思います。実際に書いて表現することを繰り返すことで、システムのどの部分をどのように表現するべきかというのがより直感的にわかるようになってくるのだと思います。
ところで、Plant UMLはテキストで記述したものをUML図に変換する仕組み(Webサービス、Javaプログラムとして提供されています)ですが、テキストをエディタで変更すると即座にその結果のUML図が変更されるという使い方ができます。
Vimでは、previmというpluginを使うことで実現できます。 previmはそもそもMarkdownに対してのプレビューを提供するものでしたが、PlantUMLにも対応したのです。
これを使いたかったという気持ちもあります。
そんなわけで、今後、図を記述する必要がある場合にはPlantUMLを積極的に使っていきたいと思っています。
vim plugin を作っていてなかなか解決できなかった課題のメモです。
vim ではファイルタイププラグインという種類のプラグインが作成できます。
ファイルタイププラグインはファイルタイプに合わせて挙動を変えることができるようにするためのプラグインです。
vim はファイルを開いた際に、そのファイルがどのファイルタイプか判別します。
ファイルタイプはC言語のようなプログラミング言語毎にあらかじめ定義されていますし、自分で作成することもできます。
自分で作成する場合には、ファイルタイプ名を決めて、そのファイルタイプの場合にどのような挙動にするかを定義したプラグインファイルを作成します。
例えば、ファイルタイプ毎に異なるマップを定義することができます。
その場合、プラグインファイルには定義したいマップコマンドを記述します。そうすることで、特定のファイルタイプの場合にのみそのマップコマンドが実行されるようになります。
ところで、ファイルを開くたびにそのファイルがどのファイルタイプかを判別する必要がありますが、自分で作成したファイルタイプのことはvimは知らないので、どのファイルが自作のファイルタイプに該当するかを定義する必要があります。
それには何らかの方法で以下のようにしてファイルタイプを指定する必要があります。これを実現する方法はいくつかありますが、その一つに ftdetect/*.vim というファイルを使う方法があります。
set filetype=aaaa
ftdetect/*.vim というファイルは、ファイルを開いた際(厳密にはバッファを開いた際)に自動的に読み込まれて実行されるファイルの一つです。
runtimepath配下にあるftdetect/*.vimを実行します。
このファイルは、以下の設定がされていないと読み込まれないようですが、これだけを設定していても読み込まれない場合がありました。
set runtimepath+=~/where/to/pluginpath/
filetype plugin on
読み込まれるようにするためには以下のように、runtimepathの設定の前に filetype offを設定する必要がありました。
filetype off
set runtimepath+=~/where/to/pluginpath/
filetype plugin on
どこに書くか
blogを書き始めようとするときに、まずはどこに書くかを決める必要があります。
世界中で人気のWord Pressというソフトウェアを使う手もありますが、ややニッチ(?)なMovable Typeというソフトウェアもあります。 Movable TypeはSix Apartという会社が開発しているソフトウェアで、商用ブログサービスとしてType Padというものもあります。 私はMovable Typeに書くことにしているのでMovable Typeを使います。
何で書くか
Movable
TypeはWebインタフェースがあるので、ブラウザで書くのが通常ですがブラウザのテキストフォームに書くような形になるので使いづらいです。使いやすくするにはjavascriptを書いて機能拡張するなどの工夫が必要です。しかし、世の中には文章を書くためのツールとしてエディタがいくつもあり、それらを使う方が文書を書くには都合が良いのです。当たり前ですね。Movable
TypeにはWebのGUIインタフェース以外にWeb APIも提供しています。このWeb
APIはData APIという名前で定義されていて、これを使うと記事の新規作成や編集なども行えます。
そういうわけで、エディタで書いた文章をData APIを使ってMovable
Typeに投稿する仕組みが実現できそうです。
これができればエディタで気持ちよく文章を書いて、そのままMovable
Typeのblogエントリとして投稿できるはずです。
欠点があるとすれば、写真などの画像を入れようとすると難しくて、WebのGUIインタフェースの方が直感的に配置できたり、アップロードもできるので操作性は上です。
ですので、画像の取り扱いはWeb
GUI、文字はエディタと使い分けることにします。
さて、エディタで書いた文章をData APIを使ってMovable
Typeに投稿しようと思いますが、どのような操作性が良いでしょうか。
気軽に編集できるようにするには、エディタでテキストファイルを保存するような操作でData
APIを使って投稿できる、修正できるというのが良いでしょうか。
ローカルに編集したり、Data
APIを使って編集を反映したりと使い分けられるようにするのも手です。
とりあえずはローカルにあるファイルを編集し、上書き保存すると、Data
APIを使ってMovable
Typeの記事も編集(変更)されるという仕組みを目指します。
足りない機能
エディタでファイルを保存すると自動的にData
APIにアクセスする仕組みを実現する必要が出てきました。
自動で行うというのがポイントですが、そのためには以下のような方法が考えられます。
- ファイルの更新チェックをリアルタイムで行うようにカーネルフックモジュールを用意する
- ファイルの更新チェックを行うデーモンを用意する
- エディタの保存処理をフックする仕組みを用意する
カーネルフックモジュールで実装すると、色々と無駄で遅くなりそうです。
デーモンを用意するのも大げさな感じですし、無駄な感じです。
そこで今回はエディタの保存処理をフックする仕組みを用意することにします。
保存処理をフックできるようなエディタはいくつもありますが、筆者はvimが好きなのでvimを採用します。
vimはemacsと同じく拡張が用意で基本的になんでもできます。
vimの場合は、vim
scriptという形で保存処理をフックする仕組みを記述すれば実現できます。 vim
の設定ファイルはvimrcに記述しますが、この設定ファイルもvim
script形式です。
そのため、vimrcに保存処理のフックすく仕組みを書けば解決できますが、その仕組みが巨大であったり、汎用的にできたり、公開したい場合にはプラグインとして作成することもできます。
今回はMovable
Type利用者でかつ、vim利用者のためのプラグインを作成することにします。
足りない機能を補う
vim プラグインに必要な機能はData
APIへのアクセスに関するものと、ローカルファイルの取り扱いに関するものに分けられます。
Data
APIはHTTPアクセスなのでHTTPリクエストとレスポンスの取り扱いが必要です。
この部分はvital.vimを使います。
ローカルファイルの取り扱いは自分で用意します。
Data
APIで取得したエントリはJSON形式で取得できますが、それをローカルファイルに保存する前にエディタで編集しやすい形に整形する必要があります。
また、その逆にローカルファイルの内容をData
APIで投稿する際には逆の整形を行う必要があります。
こうした処理をちまちま書いていくといずれ出来上がります。
プラグインの処理の詳細は別の記事に書きますので、そちらを参照してください。
作成中の vim プラグイン vim-mtdataapi
記事を投稿する
プラグインが完成したら、ようやく記事を投稿できます。 長い道のりでした。
mtdataapiというvimのpluginからMovable Typeへの記事投稿の際、markdown形式で投稿できるようにしました。 変換にはpandocを使っています。
mtdataapi
Movable Type というCMSを使ってブログを書いていますが、基本的にブラウザで入力するため文章入力が非効率に感じることが多々あったので、vimから投稿できるようにvim pluginを開発しています。
単純な更新ができるようになってきたので、一旦githubに公開しましたが、とても一般の方が使える状態ではありません。
需要があるようでしたら、issueやSNSなどで連絡もらえると嬉しいです。
Movable Type 用 Vim Plugin: mtdataapi.vim
vimconf2018 には参加できなかったけれども、発表資料を読んだりTwitterを眺めているとやっぱり何かしたくなったのと、もっとvimを使いこなしたくなったのでpluginを書く練習を始めようと決意した。
helpを読んで書いてみようと思ったが、サンプルで既に理解できないところがあったので、Alisueさんの発表資料にあるHello Worldを真似てみるところからスタート。
ファイル名やコマンド名は多少変えたけれども、そのまんま。すごく簡単。
plugin/helloworld.vim
1 if exists('g:loaded_helloworld')
2 finish
3 endif
4 let g:loaded_helloworld = 1
5 command! HWorld call helloworld#hello_world()
autoload/helloworld.vim
1 function! helloworld#hello_world() abort
2 echo "Hello, World"
3 endfunction