車輪の再発明
車輪の再発明という言葉があります。ある目的を果たすためのライブラリや先行事例があるにも関わらず、 同じことを叶えるためについつい自分で作ってしまう行為を指します。 例えば、SinatraというRubyの特徴的なWebアプリケーションフレームワークがありますが、 そのPerlバージョンを作ろうとすれば、 他にもDancerやMojolicious::Liteといった似たようなものが、 Perlのライブラリには存在していて「 でも、いいっか! 」と制作に入るのがまさに「車輪の再発明」な感じです。 車輪の再発明は一般的に非効率だと言われ推奨はされません。 ただ、僕は勉強のためならばよいと思ってSinatraライクなフレームワークを作ってたりもします。 既存の似たようなものを参考にできるため、学ぶことが多いです。 状況によっては再発明は効果的なこともあると思っています。
とはいえやはり、目的を最短で果たすためには車輪の再発明は避けた方がよいでしょう。 Japan Perl Association (JPA)現代表理事の牧大輔さんと お仕事をしたことがあるのですが、その際に彼は以下のように話していました。
車輪の再発明はしてもいいけど、仕事の時は絶対駄目だよ
この端的な方針は僕も参考にしたいところです。
車輪が無いときは?
しかし、自分がこれをしたいという目的を果たすものが世の中に存在しない時も多々あります。 特に自分一人や数名で使う特殊なケースで最適なものが無いということがよく見受けられるます。 そのような時、あなたがクリエータ、もしくはクリエータを目指すのであれば、「無ければつくる」方針でいきましょう。
書籍執筆のための環境を作る
実は、この記事。将来出版させたい書籍のための原稿の意味も兼ねて書かれています。 編集者さんと連絡しつつ作業をしているのですが、 原稿を書き始めてちらほらと集まってきているのでそのドキュメントを共有したいと先日から思ってました。 文章は記事ごとに小分けにしてMarkdown書式のプレーンテキストで執筆しています。 ならばとDropboxの共有フォルダを作成し、 その中にMarkdownファイルを入れれば編集者の方も見ることができるだろうと考えてみました。 すると当然のことながらMarkdownのテキスト一覧を閲覧し、ファイルもエディタなどで開けるとのことなのですが、 以下のような質問をいただきました。
ちなみにmarkdown形式のファイルは、普通にエディタで 見ればよいのだと思いますが、適したツールなどは あるのでしょうか??
うーん、僕が以前から自作しているMarkdown Viewerはありますが、 いかんせんPerl製のコマンドラインのソフトなんで勧めてみたものの、少しハードルが高いかなぁと感じました。 そこであらためて、僕と編集者の方、2人にとってのニーズを整理してみましょう。
- 僕が主にファイルを編集をする
- 編集者さんがそのMarkdownをHTMLとして確認したい
- ファイルはDropboxで逐一共有されている
このニーズを簡潔に叶えるアイデアを考えてみるとこのようなものになりました。
Dropbox上のファイルを一覧できて、 指定ファイルがMarkdown形式ならばHTMLにレンダリングしてかっこよく表示させる内向けのWebサービス
そして、このようなサービスは軽くGoogleで検索調査したところ無い、 もしくは一般には利用できないということがわかります。
書籍執筆のための 環境も無ければつくる 。この方針にのっとります。 DropboxのDeveloper向けサイトを見てAPIの仕様について調べます。 どうやら作ったものを一般に公開するにはDropbox側の審査が必要になるようですが、 開発者モードでは5名までのユーザーに使ってもらうことができそうです。 「REST APIを使って、OAuth 1.0 で認証する」というだいたいの仕様が把握できたところで、 Perlのライブラリ倉庫である「CPAN」を覗いてみました。 「Dropbox」で検索をすると、いくつかライブラリが出てきまして「さすがCPAN!」と思いましたが、 今回は「WebService::Dropbox」というモジュールが分かりやすかったので、こちらを使用したいと思います。「無いものをつくるために車輪を利用している」わけですね。 ところでこのモジュール、非常に便利です。
実装方針が決まったところで、Dropbox APIを使ってどのようなことができるのか?どのようなデータを取得できるのか? を知るためにサンプルプログラムを作成。 だいたい分かってきたのでいよいよサービスの名前を「Dropdown」として、Webアプリを作ります。 Markdown形式のテキストをHTMLへ変換するにはこれもまたCPANモジュールの「Text::Markdown」を使いました。 Dropboxのファイルもしくはディレクトリの名前を受け取とり、ファイルだったらそのデータをダウンロード。 Markdown形式にマッチすればHTMLに変換して綺麗に表示させる部分がこのアプリの肝です。 そのControllerのコード部分はちょっと長いですが以下のようになりました。
package Dropdown::Dropbox; # Web Application FrameworkにはMojoliciousを使用した use Mojo::Base 'Mojolicious::Controller'; use Text::Markdown qw/markdown/; use Encode; use Plack::Session; sub dropbox { my $self = shift; # $nameにはDropboxファイルへのパスが入る my $name = $self->stash->{name}; my $dropbox = $self->app->dropbox; # sessionにはPlack::Sessionを使用 my $session = Plack::Session->new( $self->req->env ); my $access_token = $session->get('access_token'); my $access_secret = $session->get('access_secret'); return $self->render_not_found if ( !$access_token && !$access_secret ); $dropbox->access_token($access_token); $dropbox->access_secret($access_secret); my $list = $dropbox->metadata($name) or die $dropbox->error; $self->stash->{list} = $list; if ( !$list->{is_dir} ) { my $content; $dropbox->files( $name, sub { $content .= $_[3]; } # using Furl. ); # 拡張子がMarkdownのものだったら if ( $name =~ m!\.(?:md|mkdn|markdown|mkd|mark|mdown)$! ) { $content = decode_utf8($content); $self->stash->{markdown_html} = markdown($content); return $self->render( template => 'dropbox/markdown', format => 'html' ); } else { $self->res->headers->content_type( $list->{mime_type} ); return $self->render( data => $content ); } } return $self->render('dropbox/list'); } 1;
ローカルで試してみて、問題ないのでパブリックな場所に置いて、サーバの設定。 ちょっと本番環境とローカルの環境の差でつまづきましたが、無事修正は終わり、使えるようになりました。 トップページにアクセスしてDropboxでのOAuth認証をすると見事にファイル一覧が閲覧でき、 Markdownも綺麗に整形されています。
さて、これでめでたく動作が確認されたので、編集者の方にも使ってもらいたいのですが なにぶん出来たのが数時間前のお話なので連絡のメールがまだ見られてないようで使ってもらってないのですのよね。 だから、もし編集者の方が「使えない><」という状況になったらなんて考えるとまだ完成ではなく、 そういう事態は起こらないでくださいと願っている最中なのです。
まとめ
車輪の再開発はしないで車輪を利用した方が早い。けれども、それが無かった場合は自分でつくる、 という精神はずっと持っておきたいと思います。 執筆をするような環境において必要なものもしかりです。 また「無ければつくる」の心得はWebサービスのアイデアを考える時、モチベーションを上げる時にも発揮されますね。
お知らせ
メルマガ「ゆーすけべーラジオ」ではWebサービスにまつわる事柄を書いています。 よろしければ覗いてみてください。