2012年7月8日日曜日

開発環境整備とアプリケーションの実装(1)

はじめに

おはようございます。当ブログにアクセス頂き、ありがとうございます。
『千里の道も一歩から』とつぶやきながら、人生を迷走しているたなけんです。
本エントリではClojureを用いたWebアプリケーション開発の第一歩として、仕様策定(全体, 第1イテレーション)と開発環境の整備、そして実装について記載いたします。

アプリケーションの全体像

クライアントからhttp GETメソッドによって、サーバに問い合わせ、
外部APIから取得した情報をhttpレスポンスとして返す、
非常にシンプルなWebアプリケーションとなります。
  • 入力: クライアントにより入力された単語を受信する
  • 処理: 外部APIを利用し、英単語の意味を取得する
  • 出力: クライアントへ取得した意味を送信する

各イテレーションのゴール

  1. プログラムから辞書にアクセスし、意味を取得する。(アプリケーション層)
  2. ブラウザからの操作を可能にする。(プレゼンテーション層)
  3. ユーザごとの履歴を残す。(パーシステント層)
  4. Herokuへのデプロイ及び性能テスト(運用)

第1イテレーション実装方針

  • 辞書はDictionary.com のWeb APIを利用する
  • clj-httpを用いDictionary.comにアクセスし、意味を含むXMLを取得する
  • clj-xpathを用いXMLから意味を取得する
  • clj-jsonを用いClojureオブジェクトをjson文字列に変換する

異常系の処理(全体方針)

  • 例外発生時には、Exceptionを補足して、アプリケーション例外を投げる
  • tools.loggingを用い、適切にログを残す(例外内容のトレース等)
その他、機能毎に以下のような異常の発生が考えられます。
  • 設定ファイルの不備
  • 外部APIのダウン
  • 外部APIの仕様変更

開発環境の整備

以下のサイトを参考にさせて頂きました。
  • Emacsインストール Link
  • swank-clojureインストール via ELPA Link
  • Leiningenインストール Link

ビジネスロジックの実装(1)

本日は以下のコードを紹介します。
  • プロジェクトファイル
  • アプリケーション例外クラス
  • nsマクロ
  • 例外処理関数
  • 設定ファイル読み込み関数

プロジェクトファイル


Leiningenでプロジェクトを作成した際、自動生成されるproject.cljに
利用する各種ライブラリを追記します。
Leiningenは、JavaでいうところのMavenのようなもので、ライブラリの依存関係を解消します。
プロジェクトファイルはMavenのPOMファイルにあたり、
lein deps
を実行することで、依存ライブラリのダウンロード、クラスパスへの追加をすることができます。

アプリケーション例外クラス


例外発生時にはJavaのクラス情報を利用するため、java.lang.RuntimeExceptionを継承した、
アプリケーション例外クラスを作成します。
compile関数でこのファイルをコンパイルした後は、他のJavaクラスと同様、
Clojureプログラム内で利用することができます。

nsマクロ


nsマクロはJavaのpackageとimportを合わせたようなもので、
名前空間と、その名前空間内で使用するClojure/Javaクラスを宣言します。
:reload-allオプションは、逐次関連するファイルを再読み込みすることの指定です。
:requireで宣言されたClojureファイルについては、
asで付けられたエイリアス/メンバ
で、指定されたファイルのメンバにアクセスすることができます。

例外処理関数


例外の内容をログに記録し、アプリケーション例外を発生させます。
  • do特殊形式: 副作用のある処理を行う
  • clojure.tools.logging/error関数: エラーをログ出力する
  • throw特殊形式: 例外を発生させる

設定ファイル読み込み関数


設定ファイルを読み込み、読み込まれた文字列をClojureのオブジェクトに変換します。
  • slurp関数: ファイルの記述内容を文字列として読み込む
  • read-string関数: 文字列をClojureのオブジェクトに変換する
  • try特殊形式: 例外が発生される可能性のある処理を包む。例外発生時に対応する例外を含むcatch節を評価する
逐次ファイルI/Oが発生することを避けるために、一度だけget-properties関数をよび、
その値をpropertiesとしてモジュール内に保持しておきます。

今回の作業は以上。最後までお読み頂きありがとうございました。
たなけん (作業時間60分(各種インストールは除く))

0 件のコメント:

コメントを投稿