自分用のCMSを作ってみた その2

ドクジリアン柔術少女 すから☆ぱいそん
≪ 前の記事
自分用のCMSを作ってみた

「プログラマのためのCMS」についてkwsk

前のエントリで長々と語ってしまった自分用のCMSについて。

普通のCMS

普通のCMSはこんな感じ。

普通のCMS

プログラマのためのCMS

今回自作したったのはこれ。

プログラマのためのCMS

_人人人人人人人人人人人_
> それなんてCouchDB? <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

CouchDBにフロントエンドを付けたらこんな感じですな。

で、よく考えてみたらこれとは逆でコンテンツを書くのにテキストエディタを使うOctopressのアプローチの方がプログラマ向け要素が濃いので、プログラマのためのCMSという表題は考えなおした方がいいのかもしれない。(みもふたもない)

こっちの方式の利点としては、コンテンツがJSON over HTTPで提供されるためページのレンダリングに好きなテンプレートエンジンやら何やらが使えるっていうことがある。Jinja(Python) でも Smarty(PHP) でも Go言語標準の html/template でも。そういう面ではプログラマ向け。(このサイトは Flaskで動いているので JinjaでHTMLをレンダリングしている)

あと、コンテンツとプレゼンテーションが粗結合なのでサーバをまたがった複数のWebサイトのコンテンツを一元管理できる。これはまあ・・・プログラマ向けというよりは、とある商業的な用途目的のメリットかもしれないが。その方向ではCBaaS (Contents Backend as a Service) っていう言葉も考えたので機会があったら使ってみたい。(ものごとに名前をつけることが重要なのであって、それはドクジリアン柔術でもなんでも良いのだ。わかりやすい・すごそうに聞こえるにこしたことはないが)

開発に使ってるもの

図にまとめたて軽く解説したらもう特に書くことがなくなったので主な材料のリスト

IntelliJ IDEA Community Edition (統合開発環境)

無料の Coummunity Editionでも以前にJava開発環境のデファクトスタンダードであった Eclipse より十分強力。これと比べてしまうと Eclipseは基本設計が古くてもうどうしようもないんだろうなと思う。

Java以外の開発もできる。

Scala (プログラミング言語)

なんか新しくて便利なプログラミング言語。この世代のプログラミングパラダイムについて言及するとめんどくさい人たちの標的になるのが特徴。ちょっと前も例えばMVCアプリケーション設計モデルについて語ると自分がガンダムを一番うまく使えると主張するアムロみたいな人たちが湧いたけど今のコレは数学との関わりも深い関係でアムロどころじゃないガチの人達が出てくるので命がけである。

Java VM上で動作するバイナリを生成するため Java用のフレームワークやライブラリが使えることから資産豊富であり、また Java 1.6以上なら動くので最新の言語であるにもかかわらず太古の環境でも走らせることができる(Java SE 6のリリースは2006年12月)。

Spring Framework (Javaアプリケーションフレームワーク)

バージョンを重ねるにつれ機能を追加しても変更はあまりしないため何年経ってもほとんどのソースがそのまま使えるという手堅さから、Scala向けの新しいフレームワークをあえて選択せずこれを使っている。日本では同時期に Seasarが普及した(日本人が開発してたため日本語ドキュメントがあった)ためSpringはそれほど採用されていないが、世界ではデファクトスタンダードの地位にまでなったフレームワークなので困ったことがあっても必ず Stack Overflowで答えが見つかる。英語で検索すればね。

ScalikeJDBC (Scala用データベース操作ライブラリ)

JDBCは異なるベンダのリレーショナル・データベースに対して同じAPIでアクセスできるうえにSQL内でプレースホルダを使えたりと、それが登場した時期から考えると優れたものではあるのだが、流石に今はちょっと生で使うのは無理なので薄かったり厚かったりする高位のレイヤを通して利用するのが普通。ScalikeJDBCは Scala言語から JDBCでデータベースにアクセスするための薄いと言えば薄いレイヤで、いわゆるORMと呼ばれるSQLを完全に覆い隠してしまうことを目標にした厚いもの(JavaでいうHibernateJPA)とは違い、 SQLを受け入れると決めた上で極力利便性を提供するというバランスがよく考慮されているのが特徴。ORMでことあるごとに発生するN+1問題やトランザクション境界をまたがって生存したオブジェクトが引き起こす問題を嫌う向きにはこのようなものが好まれるだろう。

独自のトランザクション管理機構を持っているが Spring Frameworkのそれとは互換性がないため、ScalikeJDBCのトランザクション管理機構は使用せず Spring Framework側に合わせる工夫をして使っている。

Jackson (JSONシリアライザ・デシリアライザ)

Spring Frameworkが標準でサポートする JSONプロセッサ。Scalaモジュールを追加することで TupleやOptionといった Scala独自の型も JSONと相互変換できるようになる。JSONはWebブラウザとサーバとの間でデータを交換するのに使われる一般的なフォーマットで、昔でいうXMLにあたる。XMLより記述が簡素で通信容量を節約できるのが特徴。

SimpleCaptcha (Java用Captchaライブラリ)

人間による操作であることを証明するため、画像内に描かれた読みにくい文字列を入力させられるよくあるアレ(Captcha)を Javaで実装するためのライブラリ。当然のごとくこれを破る技術もあるわけで、ましてやよく使われているライブラリで生成された画像であれば破りやすいのではあるが、Captchaのある入力フォームにイタズラされる可能性は無いフォームにイタズラされる可能性よりも相当低くなるであろうことは確か。(有名なサイトでもなければ面倒を乗り越えてまでイタズラする奴はそういない)

H2 Database Engine (データベース)

Javaで出来た、ローカルファイルやメモリにデータを配置して直接読み書きするタイプのデータベース。データにはSQL(JDBC)でアクセスできる。SQLiteの Java版みたいなものと考えても良い。データベースサーバー要らずで運用できるため開発作業がとてもやりやすい。データベースファイルに直接アクセスできるのは同時にひとつの Java VM(の中のひとつのクラスローダー)だけなので、複数のプロセスから同時にアクセス出来る構成にしたい場合はクライアントサーバーモードにしなければならず、それだったら MySQL/MariaDBなり PostgreSQLなりといった他のDBMSにした方が高性能で運用もしやすいため、H2を採用して何かを作ろうとする際にはそこら辺を先にちゃんと考える必要がある。

Flyway (スキーママイグレーション)

リレーショナル・データベースはスキーマ定義にない項目を保存することができない(例えば姓・名のフィールドしか持たないテーブルにミドルネームを保存することはできない)ので、データベースに保存したい項目が増えた時には項目の追加(スキーマの更新)をしなければならない。ソフトウェアは進化するものなのでそういうことは日常的に起こるのだが、データベースに対して手でコマンドを打っていちいち項目を追加していてはミスがいつか発生する。

Flywayは、スキーマの更新がどこまで行われたかをデータベース(のschema_versionテーブル)に保存しておいて、まだ適用されていない更新があった時には自動的にそれを適用するという処理をしてくれる。多分 ActiveRecordのスキーママイグレーション機構を手本にしていると思われる(ただしFlywayが対応するのはスキーマの進化だけで退化はできない)。Flywayにスキーマの自動更新をさせるには、スキーマ更新のコマンドを書いたファイルを連番で db.migration パッケージに置いておき、アプリケーションの起動時に Flywayが走るようにしておけば良い。Spring Frameworkを使っているなら Bean定義ファイルに下記のように書いておくだけだ。

<bean class="org.flywaydb.core.Flyway" init-method="migrate">
    <property name="dataSource" ref="dataSource"/>
</bean>

Jsoup (HTMLパーサ)

HTMLファイルのある断片だけを読み込んでインクルードしたいとか、他所のサイトからパクってキュレーションしてきたHTMLの特定部分を切り出して利用したいとかの処理に使える。Pythonでいうところの BeautifulSoup

Bootstrap (スタイルシート)

いわゆるレスポンシブWebデザイン(画面のサイズによって最適なレイアウトで構成要素を表示するようなWebデザイン)を簡単に導入できるスタイルシートと素材集。これを導入するだけで素のHTMLよりもマシな見た目のページが出来るため、エンジニアのようにビジュアルデザインを専門外とする人が何らかの Webページを作成する際には必須といってもいい存在。

AngularJS (JavaScript用フレームワーク)

サーバーとの通信と、画面を通じてユーザーと対話をする部分(Webブラウザで動作する)をJavaScriptで開発するためのフレームワーク。古典的な Webアプリケーションはユーザーが何らかのアクションを起こすたびにページ全体をサーバーから取得することで状態遷移するが、今はWebブラウザ側で出来ることが多いためサーバーからのページ読み込みは一度きりにして残りの動作をブラウザ主導で行うSPA(Single Page Application)という方式も取れるようになっている。AngularJSは主に SPAを開発するのに使用される。

AngularJS本体に下記のようなモジュールを追加して利用している。

ACE Editor (Webページ内に組み込めるテキストエディタ)

HTMLの textarea要素では本格的なテキスト入力がしにくいので、長いテキストを入力する画面では代わりにこれを使うと良い。ただし高機能な分全てのWebブラウザでキッチリ同じように動かすのが難しいらしく、特定のブラウザで細かい不具合が起こることはある。

AngularJSと組み合わせるには UI.Ace を使う

Selenium (Webブラウザ自動運転ツール)

Webブラウザを起動して自動運転させるためのツール。Webシステムを開発するさい、自動運転のシナリオさえプログラムすればログインから始まって長ったらしいフォームの入力するといった手でやると面倒な一連のテストを繰り返し自動でできて開発効率が上がる。E2E(エンドツーエンド)テストツール、受け入れテストツールと呼ばれる。

≪ 前の記事
自分用のCMSを作ってみた

同じカテゴリの記事

カテゴリ ドクジリアン柔術少女 すから☆ぱいそん の記事一覧
企業向けニッチ製品にフリーミアムは通用するのか 2015年1月9日
【宣伝】ドンキに行ったら外国人がすごかった(メディアファクトリー社刊) 2014年12月18日
オタクと常識人 2014年12月5日
テキトーな人達と、不必要に細かい人達 2014年11月30日
SPAとログイン認証 2014年11月27日

お勧めカテゴリ

英語でアニメ観ようず
なじみ深い日本製アニメの英語版DVDで、字幕と音声から英語を学びましょうという趣旨のシリーズ記事です。
ScalaのようでJavaだけど少しScalaなJSON API
Scalaと Spring Frameworkを使って REST的なJSON APIを実装してみましょう。
ドクジリアン柔術少女 すから☆ぱいそん
代表 嶋田大貴のブログです。写真は神仏に見せ金をはたらく罰当たりの図