<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fumifumi</id>
		<title>Eospedia - 利用者の投稿記録 [ja]</title>
		<link rel="self" type="application/atom+xml" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fumifumi"/>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/Fumifumi"/>
		<updated>2026-06-17T10:30:33Z</updated>
		<subtitle>利用者の投稿記録</subtitle>
		<generator>MediaWiki 1.23.6</generator>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T09:58:59Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 新しいサービスを作る */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== アプリケーションの構成 ==&lt;br /&gt;
　AngularJSでは、controller、service、factory、filterなど、さまざまん機能を持ったコンポーネントを作ることができます。&lt;br /&gt;
Zephyrでは、TypeScriptのクラス構文や関数を使って、それらのコンポーネントを開発しました。&lt;br /&gt;
/front-end/app/scripts/App.tsがZephyrのアプリケーションのmainファイルです。&lt;br /&gt;
App.ts内で、Zephyrアプリケーションのmoduleを作り、利用するコンポーネントをzephyr moduleに追加しています。&lt;br /&gt;
zephyr moduleに追加されたコンポーネントは、zephyr module内のどこからでも利用できるようになります。&lt;br /&gt;
&lt;br /&gt;
Zephyrアプリケーションには、三つの画面があり、それぞれexecution、workspace、historyです。&lt;br /&gt;
三つの画面は、App.tsの中でstateに登録されていて、それぞれのstateは、&lt;br /&gt;
* localhost:3000/execution&lt;br /&gt;
* localhost:3000/workspace&lt;br /&gt;
* localhost:3000/history&lt;br /&gt;
のそれぞれのパスに対応しています。&lt;br /&gt;
&lt;br /&gt;
それぞれのパスにアクセスされたときにそれぞれのstateに登録されたcontrollerが動く仕組みとなっています。&lt;br /&gt;
&lt;br /&gt;
* localhost:3000/executionへのアクセス → executionController&lt;br /&gt;
* localhost:3000/workspaceへのアクセス → workspaceController &lt;br /&gt;
* localhost:3000/historyへのアクセス → historyController&lt;br /&gt;
&lt;br /&gt;
Zephyrでは、これらのcontrollerをそれぞれのページのメインのcotrollerとして開発しています。&lt;br /&gt;
このメインのcontroller中で、コンポーネントを注入し(DI: Dependency Injection)利用しています。&lt;br /&gt;
コンポーネントとして登録しておくことで、異なるcontroller中で、コンポーネントを再利用することが可能となり、コードの体系化や開発効率の向上につながります。&lt;br /&gt;
例えば、Zephyrは、「MyModal」というモダルウィンドウの操作に関連するserviceがありますが、executionページとworkspaceページの両方で同じコンポーネントを利用しています。&lt;br /&gt;
詳しくは、「DI」で検索して勉強してみてください。&lt;br /&gt;
また、stateを使ったページ遷移の管理は、[[https://github.com/angular-ui/ui-router ui-router]]というAngularJSのページ遷移を管理するライブラリを利用しているので、詳しくはソースコードを追ったり、ドキュメントを読んだりして勉強してください。&lt;br /&gt;
&lt;br /&gt;
== コンポーネントについて ==&lt;br /&gt;
　2016年3月現在、Zephyrで利用されている各コンポーネントについて簡単に説明します。&lt;br /&gt;
controller、service、factory、directive、filterというのは、AngularJSの概念なので、それぞれの概念についてはAngularJSののドキュメントは解説記事にて勉強するようにしてください。&lt;br /&gt;
&lt;br /&gt;
=== controller ===&lt;br /&gt;
　Zephyrでは、stateに登録されたページのロジック管理、serviceのロジック管理、directiveのロジック管理に利用しています。&lt;br /&gt;
それぞれのcotrollerは、クラス化されています。&lt;br /&gt;
controllerに全てのロジックや操作について記述するのではなく、できるだけ外部のserviceやdirectiveに切り出し、controller内ではそれらのserviceやdirectiveをDIして利用するようにしています。&lt;br /&gt;
例えば、executionページのexecutionControllerでは、REST APIを呼び出すためのAPIEndPoint service、モダルウィンドウを呼び出すMyModal serviceなどをDIして利用しています。&lt;br /&gt;
&lt;br /&gt;
=== service ===&lt;br /&gt;
　template(htmlのパーツ)を伴わない機能を切り出したものです。&lt;br /&gt;
それぞれのserviceはクラス化されています。&lt;br /&gt;
現在、以下のserviceが開発されています。&lt;br /&gt;
serviceの特性上、DIされるたびにインスタンスが生成されてしまうので、メモリリークに注意が必要です。&lt;br /&gt;
* APIEndPoint　REST APIの通信を請け負う。&lt;br /&gt;
* Console　　　CLIでの標準出力を、Webブラウザ上に表示する部分の機能を請け負う。&lt;br /&gt;
* MyModal　　　モダルウィンドウの部分のロジックや操作などを請け負う。&lt;br /&gt;
* WebSocket　　WebSocketの通信の追加や削除などを請け負う。&lt;br /&gt;
&lt;br /&gt;
=== directive ===&lt;br /&gt;
template(htmlのパーツ)を伴った機能を切り出したものです。&lt;br /&gt;
それぞれのdirectiveはクラス化されています。&lt;br /&gt;
現在、以下のdirectiveが開発されています。&lt;br /&gt;
* Command　　executionページで使われており、各EosコマンドのUIの表示とその操作を請け負う。&lt;br /&gt;
* Directory        workspaceページ使われており、各ディレクトリの情報の管理を請け負う。&lt;br /&gt;
* HeaderMenu　全てのページに表示される、ヘッダー部分の管理を請け負う。&lt;br /&gt;
* Option　　　　Command directive中で使われており、EosコマンドのそれぞれのオプションのUIの表示やその管理を請け負う。&lt;br /&gt;
&lt;br /&gt;
=== factory ===&lt;br /&gt;
　2016年3月現在、Zephyrでは利用していません。&lt;br /&gt;
serviceと同じようにtemplateを伴わない機能に切り出しに利用できるが、factoryを使うとアプリケーション中でインスタンスは一つしか生成されません。&lt;br /&gt;
Zephyrアプリケーション中で、唯一存在するインスタンスを作りたいときに利用すればよいです。&lt;br /&gt;
&lt;br /&gt;
=== fillter ===&lt;br /&gt;
　AngularJSで使われているデータ構造を何らかの形でフィルタりんグしたいときに利用します。&lt;br /&gt;
現在存在するのは、Tag filterで、コマンド選択画面で選択されたtagを持ったコマンドのみを表示するのに利用しています。&lt;br /&gt;
filterは、クラスではなく、関数として定義しています。&lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
未編集。&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
=== 新しいserviceを作る ===&lt;br /&gt;
# /front-end/app/scripts/services/ServiceName.tsという名前のファイルを作る。&lt;br /&gt;
# /front-end/app/scripts/entry.ts中で、作ったファイルをimportする。&lt;br /&gt;
# /front-end/app/scripts/refernce.tsに作ったファイルのreferenceタグを書く。&lt;br /&gt;
# /front-end/app/scripts/App.tsで、作ったserviceをzephyr moduleに追加する。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T09:47:12Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* フロントエンドアプリケーションの開発 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== アプリケーションの構成 ==&lt;br /&gt;
　AngularJSでは、controller、service、factory、filterなど、さまざまん機能を持ったコンポーネントを作ることができます。&lt;br /&gt;
Zephyrでは、TypeScriptのクラス構文や関数を使って、それらのコンポーネントを開発しました。&lt;br /&gt;
/front-end/app/scripts/App.tsがZephyrのアプリケーションのmainファイルです。&lt;br /&gt;
App.ts内で、Zephyrアプリケーションのmoduleを作り、利用するコンポーネントをzephyr moduleに追加しています。&lt;br /&gt;
zephyr moduleに追加されたコンポーネントは、zephyr module内のどこからでも利用できるようになります。&lt;br /&gt;
&lt;br /&gt;
Zephyrアプリケーションには、三つの画面があり、それぞれexecution、workspace、historyです。&lt;br /&gt;
三つの画面は、App.tsの中でstateに登録されていて、それぞれのstateは、&lt;br /&gt;
* localhost:3000/execution&lt;br /&gt;
* localhost:3000/workspace&lt;br /&gt;
* localhost:3000/history&lt;br /&gt;
のそれぞれのパスに対応しています。&lt;br /&gt;
&lt;br /&gt;
それぞれのパスにアクセスされたときにそれぞれのstateに登録されたcontrollerが動く仕組みとなっています。&lt;br /&gt;
&lt;br /&gt;
* localhost:3000/executionへのアクセス → executionController&lt;br /&gt;
* localhost:3000/workspaceへのアクセス → workspaceController &lt;br /&gt;
* localhost:3000/historyへのアクセス → historyController&lt;br /&gt;
&lt;br /&gt;
Zephyrでは、これらのcontrollerをそれぞれのページのメインのcotrollerとして開発しています。&lt;br /&gt;
このメインのcontroller中で、コンポーネントを注入し(DI: Dependency Injection)利用しています。&lt;br /&gt;
コンポーネントとして登録しておくことで、異なるcontroller中で、コンポーネントを再利用することが可能となり、コードの体系化や開発効率の向上につながります。&lt;br /&gt;
例えば、Zephyrは、「MyModal」というモダルウィンドウの操作に関連するserviceがありますが、executionページとworkspaceページの両方で同じコンポーネントを利用しています。&lt;br /&gt;
詳しくは、「DI」で検索して勉強してみてください。&lt;br /&gt;
また、stateを使ったページ遷移の管理は、[[https://github.com/angular-ui/ui-router ui-router]]というAngularJSのページ遷移を管理するライブラリを利用しているので、詳しくはソースコードを追ったり、ドキュメントを読んだりして勉強してください。&lt;br /&gt;
&lt;br /&gt;
== コンポーネントについて ==&lt;br /&gt;
　2016年3月現在、Zephyrで利用されている各コンポーネントについて簡単に説明します。&lt;br /&gt;
controller、service、factory、directive、filterというのは、AngularJSの概念なので、それぞれの概念についてはAngularJSののドキュメントは解説記事にて勉強するようにしてください。&lt;br /&gt;
&lt;br /&gt;
=== controller ===&lt;br /&gt;
　Zephyrでは、stateに登録されたページのロジック管理、serviceのロジック管理、directiveのロジック管理に利用しています。&lt;br /&gt;
それぞれのcotrollerは、クラス化されています。&lt;br /&gt;
controllerに全てのロジックや操作について記述するのではなく、できるだけ外部のserviceやdirectiveに切り出し、controller内ではそれらのserviceやdirectiveをDIして利用するようにしています。&lt;br /&gt;
例えば、executionページのexecutionControllerでは、REST APIを呼び出すためのAPIEndPoint service、モダルウィンドウを呼び出すMyModal serviceなどをDIして利用しています。&lt;br /&gt;
&lt;br /&gt;
=== service ===&lt;br /&gt;
　template(htmlのパーツ)を伴わない機能を切り出したものです。&lt;br /&gt;
それぞれのserviceはクラス化されています。&lt;br /&gt;
現在、以下のserviceが開発されています。&lt;br /&gt;
serviceの特性上、DIされるたびにインスタンスが生成されてしまうので、メモリリークに注意が必要です。&lt;br /&gt;
* APIEndPoint　REST APIの通信を請け負う。&lt;br /&gt;
* Console　　　CLIでの標準出力を、Webブラウザ上に表示する部分の機能を請け負う。&lt;br /&gt;
* MyModal　　　モダルウィンドウの部分のロジックや操作などを請け負う。&lt;br /&gt;
* WebSocket　　WebSocketの通信の追加や削除などを請け負う。&lt;br /&gt;
&lt;br /&gt;
=== directive ===&lt;br /&gt;
template(htmlのパーツ)を伴った機能を切り出したものです。&lt;br /&gt;
それぞれのdirectiveはクラス化されています。&lt;br /&gt;
現在、以下のdirectiveが開発されています。&lt;br /&gt;
* Command　　executionページで使われており、各EosコマンドのUIの表示とその操作を請け負う。&lt;br /&gt;
* Directory        workspaceページ使われており、各ディレクトリの情報の管理を請け負う。&lt;br /&gt;
* HeaderMenu　全てのページに表示される、ヘッダー部分の管理を請け負う。&lt;br /&gt;
* Option　　　　Command directive中で使われており、EosコマンドのそれぞれのオプションのUIの表示やその管理を請け負う。&lt;br /&gt;
&lt;br /&gt;
=== factory ===&lt;br /&gt;
　2016年3月現在、Zephyrでは利用していません。&lt;br /&gt;
serviceと同じようにtemplateを伴わない機能に切り出しに利用できるが、factoryを使うとアプリケーション中でインスタンスは一つしか生成されません。&lt;br /&gt;
Zephyrアプリケーション中で、唯一存在するインスタンスを作りたいときに利用すればよいです。&lt;br /&gt;
&lt;br /&gt;
=== fillter ===&lt;br /&gt;
　AngularJSで使われているデータ構造を何らかの形でフィルタりんグしたいときに利用します。&lt;br /&gt;
現在存在するのは、Tag filterで、コマンド選択画面で選択されたtagを持ったコマンドのみを表示するのに利用しています。&lt;br /&gt;
filterは、クラスではなく、関数として定義しています。&lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
未編集。&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
=== 新しいサービスを作る ===&lt;br /&gt;
# /front-end/app/scripts/services/ServiceName.tsという名前のファイルを作る。&lt;br /&gt;
# /front-end/app/scripts/entry.ts中で、作ったファイルをimportする。&lt;br /&gt;
# /front-end/app/scripts/refernce.tsに作ったファイルのreferenceタグを書く。&lt;br /&gt;
# /front-end/app/scripts/App.tsで、作ったserviceをzephyr moduleに追加する。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T09:31:48Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 問題点 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== アプリケーションの構成 ==&lt;br /&gt;
　AngularJSでは、controller、service、factory、filterなど、さまざまん機能を持ったコンポーネントを作ることができます。&lt;br /&gt;
Zephyrでは、TypeScriptのクラス構文や関数を使って、それらのコンポーネントを開発しました。&lt;br /&gt;
/front-end/app/scripts/App.tsがZephyrのアプリケーションのmainファイルです。&lt;br /&gt;
App.ts内で、Zephyrアプリケーションのmoduleを作り、利用するコンポーネントをzephyr moduleに追加しています。&lt;br /&gt;
zephyr moduleに追加されたコンポーネントは、zephyr module内のどこからでも利用できるようになります。&lt;br /&gt;
&lt;br /&gt;
Zephyrアプリケーションには、三つの画面があり、それぞれexecution、workspace、historyです。&lt;br /&gt;
三つの画面は、App.tsの中でstateに登録されていて、それぞれのstateは、&lt;br /&gt;
* localhost:3000/execution&lt;br /&gt;
* localhost:3000/workspace&lt;br /&gt;
* localhost:3000/history&lt;br /&gt;
のそれぞれのパスに対応しています。&lt;br /&gt;
&lt;br /&gt;
それぞれのパスにアクセスされたときにそれぞれのstateに登録されたcontrollerが動く仕組みとなっています。&lt;br /&gt;
&lt;br /&gt;
* localhost:3000/executionへのアクセス → executionController&lt;br /&gt;
* localhost:3000/workspaceへのアクセス → workspaceController &lt;br /&gt;
* localhost:3000/historyへのアクセス → historyController&lt;br /&gt;
&lt;br /&gt;
Zephyrでは、これらのcontrollerをそれぞれのページのメインのcotrollerとして開発しています。&lt;br /&gt;
このメインのcontroller中で、コンポーネントを注入し(DI: Dependency Injection)利用しています。&lt;br /&gt;
コンポーネントとして登録しておくことで、異なるcontroller中で、コンポーネントを再利用することが可能となり、コードの体系化や開発効率の向上につながります。&lt;br /&gt;
例えば、Zephyrは、「MyModal」というモダルウィンドウの操作に関連するserviceがありますが、executionページとworkspaceページの両方で同じコンポーネントを利用しています。&lt;br /&gt;
詳しくは、「DI」で検索して勉強してみてください。&lt;br /&gt;
また、stateを使ったページ遷移の管理は、[[https://github.com/angular-ui/ui-router ui-router]]というAngularJSのページ遷移を管理するライブラリを利用しているので、詳しくはソースコードを追ったり、ドキュメントを読んだりして勉強してください。&lt;br /&gt;
&lt;br /&gt;
== コンポーネントについて ==&lt;br /&gt;
　2016年3月現在、Zephyrで利用されている各コンポーネントについて簡単に説明します。&lt;br /&gt;
controller、service、factory、directive、filterというのは、AngularJSの概念なので、それぞれの概念についてはAngularJSののドキュメントは解説記事にて勉強するようにしてください。&lt;br /&gt;
&lt;br /&gt;
=== controller ===&lt;br /&gt;
　Zephyrでは、stateに登録されたページのロジック管理、serviceのロジック管理、directiveのロジック管理に利用しています。&lt;br /&gt;
それぞれのcotrollerは、クラス化されています。&lt;br /&gt;
controllerに全てのロジックや操作について記述するのではなく、できるだけ外部のserviceやdirectiveに切り出し、controller内ではそれらのserviceやdirectiveをDIして利用するようにしています。&lt;br /&gt;
例えば、executionページのexecutionControllerでは、REST APIを呼び出すためのAPIEndPoint service、モダルウィンドウを呼び出すMyModal serviceなどをDIして利用しています。&lt;br /&gt;
&lt;br /&gt;
=== service ===&lt;br /&gt;
　template(htmlのパーツ)を伴わない機能を切り出したものです。&lt;br /&gt;
それぞれのserviceはクラス化されています。&lt;br /&gt;
現在、以下のserviceが開発されています。&lt;br /&gt;
serviceの特性上、DIされるたびにインスタンスが生成されてしまうので、メモリリークに注意が必要です。&lt;br /&gt;
* APIEndPoint　REST APIの通信を請け負う。&lt;br /&gt;
* Console　　　CLIでの標準出力を、Webブラウザ上に表示する部分の機能を請け負う。&lt;br /&gt;
* MyModal　　　モダルウィンドウの部分のロジックや操作などを請け負う。&lt;br /&gt;
* WebSocket　　WebSocketの通信の追加や削除などを請け負う。&lt;br /&gt;
&lt;br /&gt;
=== directive ===&lt;br /&gt;
template(htmlのパーツ)を伴った機能を切り出したものです。&lt;br /&gt;
それぞれのdirectiveはクラス化されています。&lt;br /&gt;
現在、以下のdirectiveが開発されています。&lt;br /&gt;
* Command　　executionページで使われており、各EosコマンドのUIの表示とその操作を請け負う。&lt;br /&gt;
* Directory        workspaceページ使われており、各ディレクトリの情報の管理を請け負う。&lt;br /&gt;
* HeaderMenu　全てのページに表示される、ヘッダー部分の管理を請け負う。&lt;br /&gt;
* Option　　　　Command directive中で使われており、EosコマンドのそれぞれのオプションのUIの表示やその管理を請け負う。&lt;br /&gt;
&lt;br /&gt;
=== factory ===&lt;br /&gt;
　2016年3月現在、Zephyrでは利用していません。&lt;br /&gt;
serviceと同じようにtemplateを伴わない機能に切り出しに利用できるが、factoryを使うとアプリケーション中でインスタンスは一つしか生成されません。&lt;br /&gt;
Zephyrアプリケーション中で、唯一存在するインスタンスを作りたいときに利用すればよいです。&lt;br /&gt;
&lt;br /&gt;
=== fillter ===&lt;br /&gt;
　AngularJSで使われているデータ構造を何らかの形でフィルタりんグしたいときに利用します。&lt;br /&gt;
現在存在するのは、Tag filterで、コマンド選択画面で選択されたtagを持ったコマンドのみを表示するのに利用しています。&lt;br /&gt;
filterは、クラスではなく、関数として定義しています。&lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
未編集。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T09:29:57Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ドキュメントAPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== アプリケーションの構成 ==&lt;br /&gt;
　AngularJSでは、controller、service、factory、filterなど、さまざまん機能を持ったコンポーネントを作ることができます。&lt;br /&gt;
Zephyrでは、TypeScriptのクラス構文や関数を使って、それらのコンポーネントを開発しました。&lt;br /&gt;
/front-end/app/scripts/App.tsがZephyrのアプリケーションのmainファイルです。&lt;br /&gt;
App.ts内で、Zephyrアプリケーションのmoduleを作り、利用するコンポーネントをzephyr moduleに追加しています。&lt;br /&gt;
zephyr moduleに追加されたコンポーネントは、zephyr module内のどこからでも利用できるようになります。&lt;br /&gt;
&lt;br /&gt;
Zephyrアプリケーションには、三つの画面があり、それぞれexecution、workspace、historyです。&lt;br /&gt;
三つの画面は、App.tsの中でstateに登録されていて、それぞれのstateは、&lt;br /&gt;
* localhost:3000/execution&lt;br /&gt;
* localhost:3000/workspace&lt;br /&gt;
* localhost:3000/history&lt;br /&gt;
のそれぞれのパスに対応しています。&lt;br /&gt;
&lt;br /&gt;
それぞれのパスにアクセスされたときにそれぞれのstateに登録されたcontrollerが動く仕組みとなっています。&lt;br /&gt;
&lt;br /&gt;
* localhost:3000/executionへのアクセス → executionController&lt;br /&gt;
* localhost:3000/workspaceへのアクセス → workspaceController &lt;br /&gt;
* localhost:3000/historyへのアクセス → historyController&lt;br /&gt;
&lt;br /&gt;
Zephyrでは、これらのcontrollerをそれぞれのページのメインのcotrollerとして開発しています。&lt;br /&gt;
このメインのcontroller中で、コンポーネントを注入し(DI: Dependency Injection)利用しています。&lt;br /&gt;
コンポーネントとして登録しておくことで、異なるcontroller中で、コンポーネントを再利用することが可能となり、コードの体系化や開発効率の向上につながります。&lt;br /&gt;
例えば、Zephyrは、「MyModal」というモダルウィンドウの操作に関連するserviceがありますが、executionページとworkspaceページの両方で同じコンポーネントを利用しています。&lt;br /&gt;
詳しくは、「DI」で検索して勉強してみてください。&lt;br /&gt;
また、stateを使ったページ遷移の管理は、[[https://github.com/angular-ui/ui-router ui-router]]というAngularJSのページ遷移を管理するライブラリを利用しているので、詳しくはソースコードを追ったり、ドキュメントを読んだりして勉強してください。&lt;br /&gt;
&lt;br /&gt;
== コンポーネントについて ==&lt;br /&gt;
　2016年3月現在、Zephyrで利用されている各コンポーネントについて簡単に説明します。&lt;br /&gt;
controller、service、factory、directive、filterというのは、AngularJSの概念なので、それぞれの概念についてはAngularJSののドキュメントは解説記事にて勉強するようにしてください。&lt;br /&gt;
&lt;br /&gt;
=== controller ===&lt;br /&gt;
　Zephyrでは、stateに登録されたページのロジック管理、serviceのロジック管理、directiveのロジック管理に利用しています。&lt;br /&gt;
それぞれのcotrollerは、クラス化されています。&lt;br /&gt;
controllerに全てのロジックや操作について記述するのではなく、できるだけ外部のserviceやdirectiveに切り出し、controller内ではそれらのserviceやdirectiveをDIして利用するようにしています。&lt;br /&gt;
例えば、executionページのexecutionControllerでは、REST APIを呼び出すためのAPIEndPoint service、モダルウィンドウを呼び出すMyModal serviceなどをDIして利用しています。&lt;br /&gt;
&lt;br /&gt;
=== service ===&lt;br /&gt;
　template(htmlのパーツ)を伴わない機能を切り出したものです。&lt;br /&gt;
それぞれのserviceはクラス化されています。&lt;br /&gt;
現在、以下のserviceが開発されています。&lt;br /&gt;
serviceの特性上、DIされるたびにインスタンスが生成されてしまうので、メモリリークに注意が必要です。&lt;br /&gt;
* APIEndPoint　REST APIの通信を請け負う。&lt;br /&gt;
* Console　　　CLIでの標準出力を、Webブラウザ上に表示する部分の機能を請け負う。&lt;br /&gt;
* MyModal　　　モダルウィンドウの部分のロジックや操作などを請け負う。&lt;br /&gt;
* WebSocket　　WebSocketの通信の追加や削除などを請け負う。&lt;br /&gt;
&lt;br /&gt;
=== directive ===&lt;br /&gt;
template(htmlのパーツ)を伴った機能を切り出したものです。&lt;br /&gt;
それぞれのdirectiveはクラス化されています。&lt;br /&gt;
現在、以下のdirectiveが開発されています。&lt;br /&gt;
* Command　　executionページで使われており、各EosコマンドのUIの表示とその操作を請け負う。&lt;br /&gt;
* Directory        workspaceページ使われており、各ディレクトリの情報の管理を請け負う。&lt;br /&gt;
* HeaderMenu　全てのページに表示される、ヘッダー部分の管理を請け負う。&lt;br /&gt;
* Option　　　　Command directive中で使われており、EosコマンドのそれぞれのオプションのUIの表示やその管理を請け負う。&lt;br /&gt;
&lt;br /&gt;
=== factory ===&lt;br /&gt;
　2016年3月現在、Zephyrでは利用していません。&lt;br /&gt;
serviceと同じようにtemplateを伴わない機能に切り出しに利用できるが、factoryを使うとアプリケーション中でインスタンスは一つしか生成されません。&lt;br /&gt;
Zephyrアプリケーション中で、唯一存在するインスタンスを作りたいときに利用すればよいです。&lt;br /&gt;
&lt;br /&gt;
=== fillter ===&lt;br /&gt;
　AngularJSで使われているデータ構造を何らかの形でフィルタりんグしたいときに利用します。&lt;br /&gt;
現在存在するのは、Tag filterで、コマンド選択画面で選択されたtagを持ったコマンドのみを表示するのに利用しています。&lt;br /&gt;
filterは、クラスではなく、関数として定義しています。&lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
未編集。&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T09:29:44Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* API一覧 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== アプリケーションの構成 ==&lt;br /&gt;
　AngularJSでは、controller、service、factory、filterなど、さまざまん機能を持ったコンポーネントを作ることができます。&lt;br /&gt;
Zephyrでは、TypeScriptのクラス構文や関数を使って、それらのコンポーネントを開発しました。&lt;br /&gt;
/front-end/app/scripts/App.tsがZephyrのアプリケーションのmainファイルです。&lt;br /&gt;
App.ts内で、Zephyrアプリケーションのmoduleを作り、利用するコンポーネントをzephyr moduleに追加しています。&lt;br /&gt;
zephyr moduleに追加されたコンポーネントは、zephyr module内のどこからでも利用できるようになります。&lt;br /&gt;
&lt;br /&gt;
Zephyrアプリケーションには、三つの画面があり、それぞれexecution、workspace、historyです。&lt;br /&gt;
三つの画面は、App.tsの中でstateに登録されていて、それぞれのstateは、&lt;br /&gt;
* localhost:3000/execution&lt;br /&gt;
* localhost:3000/workspace&lt;br /&gt;
* localhost:3000/history&lt;br /&gt;
のそれぞれのパスに対応しています。&lt;br /&gt;
&lt;br /&gt;
それぞれのパスにアクセスされたときにそれぞれのstateに登録されたcontrollerが動く仕組みとなっています。&lt;br /&gt;
&lt;br /&gt;
* localhost:3000/executionへのアクセス → executionController&lt;br /&gt;
* localhost:3000/workspaceへのアクセス → workspaceController &lt;br /&gt;
* localhost:3000/historyへのアクセス → historyController&lt;br /&gt;
&lt;br /&gt;
Zephyrでは、これらのcontrollerをそれぞれのページのメインのcotrollerとして開発しています。&lt;br /&gt;
このメインのcontroller中で、コンポーネントを注入し(DI: Dependency Injection)利用しています。&lt;br /&gt;
コンポーネントとして登録しておくことで、異なるcontroller中で、コンポーネントを再利用することが可能となり、コードの体系化や開発効率の向上につながります。&lt;br /&gt;
例えば、Zephyrは、「MyModal」というモダルウィンドウの操作に関連するserviceがありますが、executionページとworkspaceページの両方で同じコンポーネントを利用しています。&lt;br /&gt;
詳しくは、「DI」で検索して勉強してみてください。&lt;br /&gt;
また、stateを使ったページ遷移の管理は、[[https://github.com/angular-ui/ui-router ui-router]]というAngularJSのページ遷移を管理するライブラリを利用しているので、詳しくはソースコードを追ったり、ドキュメントを読んだりして勉強してください。&lt;br /&gt;
&lt;br /&gt;
== コンポーネントについて ==&lt;br /&gt;
　2016年3月現在、Zephyrで利用されている各コンポーネントについて簡単に説明します。&lt;br /&gt;
controller、service、factory、directive、filterというのは、AngularJSの概念なので、それぞれの概念についてはAngularJSののドキュメントは解説記事にて勉強するようにしてください。&lt;br /&gt;
&lt;br /&gt;
=== controller ===&lt;br /&gt;
　Zephyrでは、stateに登録されたページのロジック管理、serviceのロジック管理、directiveのロジック管理に利用しています。&lt;br /&gt;
それぞれのcotrollerは、クラス化されています。&lt;br /&gt;
controllerに全てのロジックや操作について記述するのではなく、できるだけ外部のserviceやdirectiveに切り出し、controller内ではそれらのserviceやdirectiveをDIして利用するようにしています。&lt;br /&gt;
例えば、executionページのexecutionControllerでは、REST APIを呼び出すためのAPIEndPoint service、モダルウィンドウを呼び出すMyModal serviceなどをDIして利用しています。&lt;br /&gt;
&lt;br /&gt;
=== service ===&lt;br /&gt;
　template(htmlのパーツ)を伴わない機能を切り出したものです。&lt;br /&gt;
それぞれのserviceはクラス化されています。&lt;br /&gt;
現在、以下のserviceが開発されています。&lt;br /&gt;
serviceの特性上、DIされるたびにインスタンスが生成されてしまうので、メモリリークに注意が必要です。&lt;br /&gt;
* APIEndPoint　REST APIの通信を請け負う。&lt;br /&gt;
* Console　　　CLIでの標準出力を、Webブラウザ上に表示する部分の機能を請け負う。&lt;br /&gt;
* MyModal　　　モダルウィンドウの部分のロジックや操作などを請け負う。&lt;br /&gt;
* WebSocket　　WebSocketの通信の追加や削除などを請け負う。&lt;br /&gt;
&lt;br /&gt;
=== directive ===&lt;br /&gt;
template(htmlのパーツ)を伴った機能を切り出したものです。&lt;br /&gt;
それぞれのdirectiveはクラス化されています。&lt;br /&gt;
現在、以下のdirectiveが開発されています。&lt;br /&gt;
* Command　　executionページで使われており、各EosコマンドのUIの表示とその操作を請け負う。&lt;br /&gt;
* Directory        workspaceページ使われており、各ディレクトリの情報の管理を請け負う。&lt;br /&gt;
* HeaderMenu　全てのページに表示される、ヘッダー部分の管理を請け負う。&lt;br /&gt;
* Option　　　　Command directive中で使われており、EosコマンドのそれぞれのオプションのUIの表示やその管理を請け負う。&lt;br /&gt;
&lt;br /&gt;
=== factory ===&lt;br /&gt;
　2016年3月現在、Zephyrでは利用していません。&lt;br /&gt;
serviceと同じようにtemplateを伴わない機能に切り出しに利用できるが、factoryを使うとアプリケーション中でインスタンスは一つしか生成されません。&lt;br /&gt;
Zephyrアプリケーション中で、唯一存在するインスタンスを作りたいときに利用すればよいです。&lt;br /&gt;
&lt;br /&gt;
=== fillter ===&lt;br /&gt;
　AngularJSで使われているデータ構造を何らかの形でフィルタりんグしたいときに利用します。&lt;br /&gt;
現在存在するのは、Tag filterで、コマンド選択画面で選択されたtagを持ったコマンドのみを表示するのに利用しています。&lt;br /&gt;
filterは、クラスではなく、関数として定義しています。&lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
未編集。&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T09:29:27Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 一覧 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== アプリケーションの構成 ==&lt;br /&gt;
　AngularJSでは、controller、service、factory、filterなど、さまざまん機能を持ったコンポーネントを作ることができます。&lt;br /&gt;
Zephyrでは、TypeScriptのクラス構文や関数を使って、それらのコンポーネントを開発しました。&lt;br /&gt;
/front-end/app/scripts/App.tsがZephyrのアプリケーションのmainファイルです。&lt;br /&gt;
App.ts内で、Zephyrアプリケーションのmoduleを作り、利用するコンポーネントをzephyr moduleに追加しています。&lt;br /&gt;
zephyr moduleに追加されたコンポーネントは、zephyr module内のどこからでも利用できるようになります。&lt;br /&gt;
&lt;br /&gt;
Zephyrアプリケーションには、三つの画面があり、それぞれexecution、workspace、historyです。&lt;br /&gt;
三つの画面は、App.tsの中でstateに登録されていて、それぞれのstateは、&lt;br /&gt;
* localhost:3000/execution&lt;br /&gt;
* localhost:3000/workspace&lt;br /&gt;
* localhost:3000/history&lt;br /&gt;
のそれぞれのパスに対応しています。&lt;br /&gt;
&lt;br /&gt;
それぞれのパスにアクセスされたときにそれぞれのstateに登録されたcontrollerが動く仕組みとなっています。&lt;br /&gt;
&lt;br /&gt;
* localhost:3000/executionへのアクセス → executionController&lt;br /&gt;
* localhost:3000/workspaceへのアクセス → workspaceController &lt;br /&gt;
* localhost:3000/historyへのアクセス → historyController&lt;br /&gt;
&lt;br /&gt;
Zephyrでは、これらのcontrollerをそれぞれのページのメインのcotrollerとして開発しています。&lt;br /&gt;
このメインのcontroller中で、コンポーネントを注入し(DI: Dependency Injection)利用しています。&lt;br /&gt;
コンポーネントとして登録しておくことで、異なるcontroller中で、コンポーネントを再利用することが可能となり、コードの体系化や開発効率の向上につながります。&lt;br /&gt;
例えば、Zephyrは、「MyModal」というモダルウィンドウの操作に関連するserviceがありますが、executionページとworkspaceページの両方で同じコンポーネントを利用しています。&lt;br /&gt;
詳しくは、「DI」で検索して勉強してみてください。&lt;br /&gt;
また、stateを使ったページ遷移の管理は、[[https://github.com/angular-ui/ui-router ui-router]]というAngularJSのページ遷移を管理するライブラリを利用しているので、詳しくはソースコードを追ったり、ドキュメントを読んだりして勉強してください。&lt;br /&gt;
&lt;br /&gt;
== コンポーネントについて ==&lt;br /&gt;
　2016年3月現在、Zephyrで利用されている各コンポーネントについて簡単に説明します。&lt;br /&gt;
controller、service、factory、directive、filterというのは、AngularJSの概念なので、それぞれの概念についてはAngularJSののドキュメントは解説記事にて勉強するようにしてください。&lt;br /&gt;
&lt;br /&gt;
=== controller ===&lt;br /&gt;
　Zephyrでは、stateに登録されたページのロジック管理、serviceのロジック管理、directiveのロジック管理に利用しています。&lt;br /&gt;
それぞれのcotrollerは、クラス化されています。&lt;br /&gt;
controllerに全てのロジックや操作について記述するのではなく、できるだけ外部のserviceやdirectiveに切り出し、controller内ではそれらのserviceやdirectiveをDIして利用するようにしています。&lt;br /&gt;
例えば、executionページのexecutionControllerでは、REST APIを呼び出すためのAPIEndPoint service、モダルウィンドウを呼び出すMyModal serviceなどをDIして利用しています。&lt;br /&gt;
&lt;br /&gt;
=== service ===&lt;br /&gt;
　template(htmlのパーツ)を伴わない機能を切り出したものです。&lt;br /&gt;
それぞれのserviceはクラス化されています。&lt;br /&gt;
現在、以下のserviceが開発されています。&lt;br /&gt;
serviceの特性上、DIされるたびにインスタンスが生成されてしまうので、メモリリークに注意が必要です。&lt;br /&gt;
* APIEndPoint　REST APIの通信を請け負う。&lt;br /&gt;
* Console　　　CLIでの標準出力を、Webブラウザ上に表示する部分の機能を請け負う。&lt;br /&gt;
* MyModal　　　モダルウィンドウの部分のロジックや操作などを請け負う。&lt;br /&gt;
* WebSocket　　WebSocketの通信の追加や削除などを請け負う。&lt;br /&gt;
&lt;br /&gt;
=== directive ===&lt;br /&gt;
template(htmlのパーツ)を伴った機能を切り出したものです。&lt;br /&gt;
それぞれのdirectiveはクラス化されています。&lt;br /&gt;
現在、以下のdirectiveが開発されています。&lt;br /&gt;
* Command　　executionページで使われており、各EosコマンドのUIの表示とその操作を請け負う。&lt;br /&gt;
* Directory        workspaceページ使われており、各ディレクトリの情報の管理を請け負う。&lt;br /&gt;
* HeaderMenu　全てのページに表示される、ヘッダー部分の管理を請け負う。&lt;br /&gt;
* Option　　　　Command directive中で使われており、EosコマンドのそれぞれのオプションのUIの表示やその管理を請け負う。&lt;br /&gt;
&lt;br /&gt;
=== factory ===&lt;br /&gt;
　2016年3月現在、Zephyrでは利用していません。&lt;br /&gt;
serviceと同じようにtemplateを伴わない機能に切り出しに利用できるが、factoryを使うとアプリケーション中でインスタンスは一つしか生成されません。&lt;br /&gt;
Zephyrアプリケーション中で、唯一存在するインスタンスを作りたいときに利用すればよいです。&lt;br /&gt;
&lt;br /&gt;
=== fillter ===&lt;br /&gt;
　AngularJSで使われているデータ構造を何らかの形でフィルタりんグしたいときに利用します。&lt;br /&gt;
現在存在するのは、Tag filterで、コマンド選択画面で選択されたtagを持ったコマンドのみを表示するのに利用しています。&lt;br /&gt;
filterは、クラスではなく、関数として定義しています。&lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T09:29:05Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 一覧 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　未編集。&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== アプリケーションの構成 ==&lt;br /&gt;
　AngularJSでは、controller、service、factory、filterなど、さまざまん機能を持ったコンポーネントを作ることができます。&lt;br /&gt;
Zephyrでは、TypeScriptのクラス構文や関数を使って、それらのコンポーネントを開発しました。&lt;br /&gt;
/front-end/app/scripts/App.tsがZephyrのアプリケーションのmainファイルです。&lt;br /&gt;
App.ts内で、Zephyrアプリケーションのmoduleを作り、利用するコンポーネントをzephyr moduleに追加しています。&lt;br /&gt;
zephyr moduleに追加されたコンポーネントは、zephyr module内のどこからでも利用できるようになります。&lt;br /&gt;
&lt;br /&gt;
Zephyrアプリケーションには、三つの画面があり、それぞれexecution、workspace、historyです。&lt;br /&gt;
三つの画面は、App.tsの中でstateに登録されていて、それぞれのstateは、&lt;br /&gt;
* localhost:3000/execution&lt;br /&gt;
* localhost:3000/workspace&lt;br /&gt;
* localhost:3000/history&lt;br /&gt;
のそれぞれのパスに対応しています。&lt;br /&gt;
&lt;br /&gt;
それぞれのパスにアクセスされたときにそれぞれのstateに登録されたcontrollerが動く仕組みとなっています。&lt;br /&gt;
&lt;br /&gt;
* localhost:3000/executionへのアクセス → executionController&lt;br /&gt;
* localhost:3000/workspaceへのアクセス → workspaceController &lt;br /&gt;
* localhost:3000/historyへのアクセス → historyController&lt;br /&gt;
&lt;br /&gt;
Zephyrでは、これらのcontrollerをそれぞれのページのメインのcotrollerとして開発しています。&lt;br /&gt;
このメインのcontroller中で、コンポーネントを注入し(DI: Dependency Injection)利用しています。&lt;br /&gt;
コンポーネントとして登録しておくことで、異なるcontroller中で、コンポーネントを再利用することが可能となり、コードの体系化や開発効率の向上につながります。&lt;br /&gt;
例えば、Zephyrは、「MyModal」というモダルウィンドウの操作に関連するserviceがありますが、executionページとworkspaceページの両方で同じコンポーネントを利用しています。&lt;br /&gt;
詳しくは、「DI」で検索して勉強してみてください。&lt;br /&gt;
また、stateを使ったページ遷移の管理は、[[https://github.com/angular-ui/ui-router ui-router]]というAngularJSのページ遷移を管理するライブラリを利用しているので、詳しくはソースコードを追ったり、ドキュメントを読んだりして勉強してください。&lt;br /&gt;
&lt;br /&gt;
== コンポーネントについて ==&lt;br /&gt;
　2016年3月現在、Zephyrで利用されている各コンポーネントについて簡単に説明します。&lt;br /&gt;
controller、service、factory、directive、filterというのは、AngularJSの概念なので、それぞれの概念についてはAngularJSののドキュメントは解説記事にて勉強するようにしてください。&lt;br /&gt;
&lt;br /&gt;
=== controller ===&lt;br /&gt;
　Zephyrでは、stateに登録されたページのロジック管理、serviceのロジック管理、directiveのロジック管理に利用しています。&lt;br /&gt;
それぞれのcotrollerは、クラス化されています。&lt;br /&gt;
controllerに全てのロジックや操作について記述するのではなく、できるだけ外部のserviceやdirectiveに切り出し、controller内ではそれらのserviceやdirectiveをDIして利用するようにしています。&lt;br /&gt;
例えば、executionページのexecutionControllerでは、REST APIを呼び出すためのAPIEndPoint service、モダルウィンドウを呼び出すMyModal serviceなどをDIして利用しています。&lt;br /&gt;
&lt;br /&gt;
=== service ===&lt;br /&gt;
　template(htmlのパーツ)を伴わない機能を切り出したものです。&lt;br /&gt;
それぞれのserviceはクラス化されています。&lt;br /&gt;
現在、以下のserviceが開発されています。&lt;br /&gt;
serviceの特性上、DIされるたびにインスタンスが生成されてしまうので、メモリリークに注意が必要です。&lt;br /&gt;
* APIEndPoint　REST APIの通信を請け負う。&lt;br /&gt;
* Console　　　CLIでの標準出力を、Webブラウザ上に表示する部分の機能を請け負う。&lt;br /&gt;
* MyModal　　　モダルウィンドウの部分のロジックや操作などを請け負う。&lt;br /&gt;
* WebSocket　　WebSocketの通信の追加や削除などを請け負う。&lt;br /&gt;
&lt;br /&gt;
=== directive ===&lt;br /&gt;
template(htmlのパーツ)を伴った機能を切り出したものです。&lt;br /&gt;
それぞれのdirectiveはクラス化されています。&lt;br /&gt;
現在、以下のdirectiveが開発されています。&lt;br /&gt;
* Command　　executionページで使われており、各EosコマンドのUIの表示とその操作を請け負う。&lt;br /&gt;
* Directory        workspaceページ使われており、各ディレクトリの情報の管理を請け負う。&lt;br /&gt;
* HeaderMenu　全てのページに表示される、ヘッダー部分の管理を請け負う。&lt;br /&gt;
* Option　　　　Command directive中で使われており、EosコマンドのそれぞれのオプションのUIの表示やその管理を請け負う。&lt;br /&gt;
&lt;br /&gt;
=== factory ===&lt;br /&gt;
　2016年3月現在、Zephyrでは利用していません。&lt;br /&gt;
serviceと同じようにtemplateを伴わない機能に切り出しに利用できるが、factoryを使うとアプリケーション中でインスタンスは一つしか生成されません。&lt;br /&gt;
Zephyrアプリケーション中で、唯一存在するインスタンスを作りたいときに利用すればよいです。&lt;br /&gt;
&lt;br /&gt;
=== fillter ===&lt;br /&gt;
　AngularJSで使われているデータ構造を何らかの形でフィルタりんグしたいときに利用します。&lt;br /&gt;
現在存在するのは、Tag filterで、コマンド選択画面で選択されたtagを持ったコマンドのみを表示するのに利用しています。&lt;br /&gt;
filterは、クラスではなく、関数として定義しています。&lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T09:27:55Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* コンポーネントについて */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== アプリケーションの構成 ==&lt;br /&gt;
　AngularJSでは、controller、service、factory、filterなど、さまざまん機能を持ったコンポーネントを作ることができます。&lt;br /&gt;
Zephyrでは、TypeScriptのクラス構文や関数を使って、それらのコンポーネントを開発しました。&lt;br /&gt;
/front-end/app/scripts/App.tsがZephyrのアプリケーションのmainファイルです。&lt;br /&gt;
App.ts内で、Zephyrアプリケーションのmoduleを作り、利用するコンポーネントをzephyr moduleに追加しています。&lt;br /&gt;
zephyr moduleに追加されたコンポーネントは、zephyr module内のどこからでも利用できるようになります。&lt;br /&gt;
&lt;br /&gt;
Zephyrアプリケーションには、三つの画面があり、それぞれexecution、workspace、historyです。&lt;br /&gt;
三つの画面は、App.tsの中でstateに登録されていて、それぞれのstateは、&lt;br /&gt;
* localhost:3000/execution&lt;br /&gt;
* localhost:3000/workspace&lt;br /&gt;
* localhost:3000/history&lt;br /&gt;
のそれぞれのパスに対応しています。&lt;br /&gt;
&lt;br /&gt;
それぞれのパスにアクセスされたときにそれぞれのstateに登録されたcontrollerが動く仕組みとなっています。&lt;br /&gt;
&lt;br /&gt;
* localhost:3000/executionへのアクセス → executionController&lt;br /&gt;
* localhost:3000/workspaceへのアクセス → workspaceController &lt;br /&gt;
* localhost:3000/historyへのアクセス → historyController&lt;br /&gt;
&lt;br /&gt;
Zephyrでは、これらのcontrollerをそれぞれのページのメインのcotrollerとして開発しています。&lt;br /&gt;
このメインのcontroller中で、コンポーネントを注入し(DI: Dependency Injection)利用しています。&lt;br /&gt;
コンポーネントとして登録しておくことで、異なるcontroller中で、コンポーネントを再利用することが可能となり、コードの体系化や開発効率の向上につながります。&lt;br /&gt;
例えば、Zephyrは、「MyModal」というモダルウィンドウの操作に関連するserviceがありますが、executionページとworkspaceページの両方で同じコンポーネントを利用しています。&lt;br /&gt;
詳しくは、「DI」で検索して勉強してみてください。&lt;br /&gt;
また、stateを使ったページ遷移の管理は、[[https://github.com/angular-ui/ui-router ui-router]]というAngularJSのページ遷移を管理するライブラリを利用しているので、詳しくはソースコードを追ったり、ドキュメントを読んだりして勉強してください。&lt;br /&gt;
&lt;br /&gt;
== コンポーネントについて ==&lt;br /&gt;
　2016年3月現在、Zephyrで利用されている各コンポーネントについて簡単に説明します。&lt;br /&gt;
controller、service、factory、directive、filterというのは、AngularJSの概念なので、それぞれの概念についてはAngularJSののドキュメントは解説記事にて勉強するようにしてください。&lt;br /&gt;
&lt;br /&gt;
=== controller ===&lt;br /&gt;
　Zephyrでは、stateに登録されたページのロジック管理、serviceのロジック管理、directiveのロジック管理に利用しています。&lt;br /&gt;
それぞれのcotrollerは、クラス化されています。&lt;br /&gt;
controllerに全てのロジックや操作について記述するのではなく、できるだけ外部のserviceやdirectiveに切り出し、controller内ではそれらのserviceやdirectiveをDIして利用するようにしています。&lt;br /&gt;
例えば、executionページのexecutionControllerでは、REST APIを呼び出すためのAPIEndPoint service、モダルウィンドウを呼び出すMyModal serviceなどをDIして利用しています。&lt;br /&gt;
&lt;br /&gt;
=== service ===&lt;br /&gt;
　template(htmlのパーツ)を伴わない機能を切り出したものです。&lt;br /&gt;
それぞれのserviceはクラス化されています。&lt;br /&gt;
現在、以下のserviceが開発されています。&lt;br /&gt;
serviceの特性上、DIされるたびにインスタンスが生成されてしまうので、メモリリークに注意が必要です。&lt;br /&gt;
* APIEndPoint　REST APIの通信を請け負う。&lt;br /&gt;
* Console　　　CLIでの標準出力を、Webブラウザ上に表示する部分の機能を請け負う。&lt;br /&gt;
* MyModal　　　モダルウィンドウの部分のロジックや操作などを請け負う。&lt;br /&gt;
* WebSocket　　WebSocketの通信の追加や削除などを請け負う。&lt;br /&gt;
&lt;br /&gt;
=== directive ===&lt;br /&gt;
template(htmlのパーツ)を伴った機能を切り出したものです。&lt;br /&gt;
それぞれのdirectiveはクラス化されています。&lt;br /&gt;
現在、以下のdirectiveが開発されています。&lt;br /&gt;
* Command　　executionページで使われており、各EosコマンドのUIの表示とその操作を請け負う。&lt;br /&gt;
* Directory        workspaceページ使われており、各ディレクトリの情報の管理を請け負う。&lt;br /&gt;
* HeaderMenu　全てのページに表示される、ヘッダー部分の管理を請け負う。&lt;br /&gt;
* Option　　　　Command directive中で使われており、EosコマンドのそれぞれのオプションのUIの表示やその管理を請け負う。&lt;br /&gt;
&lt;br /&gt;
=== factory ===&lt;br /&gt;
　2016年3月現在、Zephyrでは利用していません。&lt;br /&gt;
serviceと同じようにtemplateを伴わない機能に切り出しに利用できるが、factoryを使うとアプリケーション中でインスタンスは一つしか生成されません。&lt;br /&gt;
Zephyrアプリケーション中で、唯一存在するインスタンスを作りたいときに利用すればよいです。&lt;br /&gt;
&lt;br /&gt;
=== fillter ===&lt;br /&gt;
　AngularJSで使われているデータ構造を何らかの形でフィルタりんグしたいときに利用します。&lt;br /&gt;
現在存在するのは、Tag filterで、コマンド選択画面で選択されたtagを持ったコマンドのみを表示するのに利用しています。&lt;br /&gt;
filterは、クラスではなく、関数として定義しています。&lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T09:14:21Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* アプリケーションの構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== アプリケーションの構成 ==&lt;br /&gt;
　AngularJSでは、controller、service、factory、filterなど、さまざまん機能を持ったコンポーネントを作ることができます。&lt;br /&gt;
Zephyrでは、TypeScriptのクラス構文や関数を使って、それらのコンポーネントを開発しました。&lt;br /&gt;
/front-end/app/scripts/App.tsがZephyrのアプリケーションのmainファイルです。&lt;br /&gt;
App.ts内で、Zephyrアプリケーションのmoduleを作り、利用するコンポーネントをzephyr moduleに追加しています。&lt;br /&gt;
zephyr moduleに追加されたコンポーネントは、zephyr module内のどこからでも利用できるようになります。&lt;br /&gt;
&lt;br /&gt;
Zephyrアプリケーションには、三つの画面があり、それぞれexecution、workspace、historyです。&lt;br /&gt;
三つの画面は、App.tsの中でstateに登録されていて、それぞれのstateは、&lt;br /&gt;
* localhost:3000/execution&lt;br /&gt;
* localhost:3000/workspace&lt;br /&gt;
* localhost:3000/history&lt;br /&gt;
のそれぞれのパスに対応しています。&lt;br /&gt;
&lt;br /&gt;
それぞれのパスにアクセスされたときにそれぞれのstateに登録されたcontrollerが動く仕組みとなっています。&lt;br /&gt;
&lt;br /&gt;
* localhost:3000/executionへのアクセス → executionController&lt;br /&gt;
* localhost:3000/workspaceへのアクセス → workspaceController &lt;br /&gt;
* localhost:3000/historyへのアクセス → historyController&lt;br /&gt;
&lt;br /&gt;
Zephyrでは、これらのcontrollerをそれぞれのページのメインのcotrollerとして開発しています。&lt;br /&gt;
このメインのcontroller中で、コンポーネントを注入し(DI: Dependency Injection)利用しています。&lt;br /&gt;
コンポーネントとして登録しておくことで、異なるcontroller中で、コンポーネントを再利用することが可能となり、コードの体系化や開発効率の向上につながります。&lt;br /&gt;
例えば、Zephyrは、「MyModal」というモダルウィンドウの操作に関連するserviceがありますが、executionページとworkspaceページの両方で同じコンポーネントを利用しています。&lt;br /&gt;
詳しくは、「DI」で検索して勉強してみてください。&lt;br /&gt;
また、stateを使ったページ遷移の管理は、[[https://github.com/angular-ui/ui-router ui-router]]というAngularJSのページ遷移を管理するライブラリを利用しているので、詳しくはソースコードを追ったり、ドキュメントを読んだりして勉強してください。&lt;br /&gt;
&lt;br /&gt;
== コンポーネントについて ==&lt;br /&gt;
　2016年3月現在、Zephyrで利用されている各コンポーネントについて簡単に説明します。&lt;br /&gt;
controller、service、factory、directive、filterというのは、AngularJSの概念なので、それぞれの概念についてはAngularJSののドキュメントは解説記事にて勉強するようにしてください。&lt;br /&gt;
&lt;br /&gt;
=== controller ===&lt;br /&gt;
　Zephyrでは、stateに登録されたページのロジック管理、serviceのロジック管理、directiveのロジック管理に利用しています。&lt;br /&gt;
それぞれのcotrollerは、クラス化されています。&lt;br /&gt;
controllerに全てのロジックや操作について記述するのではなく、できるだけ外部のserviceやdirectiveに切り出し、controller内ではそれらのserviceやdirectiveをDIして利用するようにしています。&lt;br /&gt;
例えば、executionページのexecutionControllerでは、REST APIを呼び出すためのAPIEndPoint service、モダルウィンドウを呼び出すMyModal serviceなどをDIして利用しています。&lt;br /&gt;
&lt;br /&gt;
=== service ===&lt;br /&gt;
　template(htmlのパーツ)を伴わない機能を切り出したものです。&lt;br /&gt;
それぞれのserviceはクラス化されています。&lt;br /&gt;
現在、以下のserviceが開発されています。&lt;br /&gt;
serviceの特性上、DIされるたびにインスタンスが生成されてしまうので、メモリリークに注意が必要です。&lt;br /&gt;
* APIEndPoint　REST APIの通信を請け負う。&lt;br /&gt;
* Console　　　CLIでの標準出力を、Webブラウザ上に表示する部分の機能を請け負う。&lt;br /&gt;
* MyModal　　　モダルウィンドウの部分のロジックや操作などを請け負う。&lt;br /&gt;
* WebSocket　　WebSocketの通信の追加や削除などを請け負う。&lt;br /&gt;
&lt;br /&gt;
=== directive ===&lt;br /&gt;
template(htmlのパーツ)を伴った機能を切り出したものです。&lt;br /&gt;
それぞれのdirectiveはクラス化されています。&lt;br /&gt;
現在、以下のdirectiveが開発されています。&lt;br /&gt;
* Command　　executionページで使われており、各EosコマンドのUIの表示とその操作を請け負う。&lt;br /&gt;
* Directory        workspaceページ使われており、各ディレクトリの情報の管理を請け負う。&lt;br /&gt;
* HeaderMenu　全てのページに表示される、ヘッダー部分の管理を請け負う。&lt;br /&gt;
* Option　　　　Command directive中で使われており、EosコマンドのそれぞれのオプションのUIの表示やその管理を請け負う。&lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T08:01:38Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* クラス */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== アプリケーションの構成 ==&lt;br /&gt;
　AngularJSでは、controller、service、factory、filterなど、さまざまん機能を持ったコンポーネントを作ることができます。&lt;br /&gt;
Zephyrでは、TypeScriptのクラス構文や関数を使って、それらのコンポーネントを開発しました。&lt;br /&gt;
/front-end/app/scripts/App.tsがZephyrのアプリケーションのmainファイルです。&lt;br /&gt;
App.ts内で、Zephyrアプリケーションのmoduleを作り、利用するコンポーネントをzephyr moduleに追加しています。&lt;br /&gt;
zephyr moduleに追加されたコンポーネントは、zephyr module内のどこからでも利用できるようになります。&lt;br /&gt;
&lt;br /&gt;
Zephyrアプリケーションには、三つの画面があり、それぞれexecution、workspace、historyです。&lt;br /&gt;
三つの画面は、App.tsの中でstateに登録されていて、それぞれのstateは、&lt;br /&gt;
* localhost:3000/execution&lt;br /&gt;
* localhost:3000/workspace&lt;br /&gt;
* localhost:3000/history&lt;br /&gt;
のそれぞれのパスに対応しています。&lt;br /&gt;
&lt;br /&gt;
それぞれのパスにアクセスされたときにそれぞれのstateに登録されたcontrollerが動く仕組みとなっています。&lt;br /&gt;
&lt;br /&gt;
localhost:3000/execution&lt;br /&gt;
&lt;br /&gt;
このstateを使ったページ遷移の管理は、[[https://github.com/angular-ui/ui-router ui-router]]というAngularJSのページ遷移を管理するライブラリを利用しているので、詳しくはソースコードを追ったり、ドキュメントを読んだりして勉強してください。&lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T07:44:35Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
 └── services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== クラス ==&lt;br /&gt;
クラスのグループがある。&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T07:44:10Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ワークフロー */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集する&lt;br /&gt;
# $ gulp　を実行する　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&lt;br /&gt;
# $ zephyr debug　でWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
  |_____ services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== クラス ==&lt;br /&gt;
クラスのグループがある。&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T07:42:34Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ワークフロー */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# gulpコマンドの実行　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません)&amp;lt;br /&amp;gt;&lt;br /&gt;
 $ gulp&lt;br /&gt;
# zephyrコマンドでWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
  |_____ services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== クラス ==&lt;br /&gt;
クラスのグループがある。&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T07:40:20Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* フロントエンドアプリケーションの開発 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
　フロントエンドアプリケーションを用いた開発のワークフローを以下に示すます。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# .tsのトランスパイル、.scssのトランスパイルし&lt;br /&gt;
# アプリケーションに関連する全てのファイルをdistディレクトリに配置&lt;br /&gt;
# Webサーバを立ち上げる&lt;br /&gt;
# ブラウザ上でデバッグ&lt;br /&gt;
&lt;br /&gt;
編集したソースコードにエラーがあれば、TypeScriptのトランスパイラやscssのコンパイラからエラーが出力されます(1,2)。2と3のワークフローは全てGulp、Webpackで自動化されています。マニュアルでの操作はほとんど必要ではありません。Webサーバの立ち上げについては、zephyrコマンド(=CLIアプリケーション)で行うことができるようになっています。これらを踏まえた上で、実際のオペレーションを以下に示します。&lt;br /&gt;
&lt;br /&gt;
# .html、.scss、.tsファイルなどのソースファイルの編集&lt;br /&gt;
# gulpコマンドの実行　(ワーキングディレクトリが/front-end/app 以下でないと、gulpコマンドの実行は出来ません) &lt;br /&gt;
 $ gulp&lt;br /&gt;
# zephyrコマンドでWebサーバを立ち上げる&lt;br /&gt;
# ブラウザでlocalhost:3000に接続し、アプリケーションを操作しながらデバッグする&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
  |_____ services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== クラス ==&lt;br /&gt;
クラスのグループがある。&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T07:15:54Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
  |_____ services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
&lt;br /&gt;
== クラス ==&lt;br /&gt;
クラスのグループがある。&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T07:15:09Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // /front-end/appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
 // /front-end/scriptsディレクトリ&lt;br /&gt;
&lt;br /&gt;
 ├── App.ts　　　　　　　　アプリケーションのメインファイル&lt;br /&gt;
 ├── controllers　　　　　　controllerのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── declares.ts　　　　　　Zephyrで利用する型を定義したファイル&lt;br /&gt;
 ├── directives　　　　　　　directiveのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── entry.ts　　　　　　　　TypeScriptのソースファイル全てを読み込むentryファイル&lt;br /&gt;
 ├── factories　　　　　　　factoryのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── filters　　　　　　　　　filterのソースファイルが格納されたディレクトリ&lt;br /&gt;
 ├── reference.ts　　　　　　アプリケーション内で利用するreferenceを記述したファイル&lt;br /&gt;
  |_____ services　　　　　　　　serviceのソースファイルが格納されたディレクトリ&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
&lt;br /&gt;
== クラス ==&lt;br /&gt;
クラスのグループがある。&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T07:07:23Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
 // /front-endディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコードが格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
 // appディレクトリ&lt;br /&gt;
 &lt;br /&gt;
 ├── index.html　　　　　　メインのhtmlファイル&lt;br /&gt;
 ├── scripts　　　　　　　　TypeScriptのソースコードが格納されたディレクトリ&lt;br /&gt;
 ├── style.scss　　　　　　.scss(コンパイル後、.cssとなる)ファイル&lt;br /&gt;
 └── templates　　　　　　　AngularJSで利用するテンプレートファイル(.html)&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
&lt;br /&gt;
== クラス ==&lt;br /&gt;
クラスのグループがある。&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T07:04:09Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
&lt;br /&gt;
 ├── app　　　　　　　　　アプリケーションのソースコード(TypeScript)が格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
&lt;br /&gt;
== クラス ==&lt;br /&gt;
クラスのグループがある。&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T07:03:35Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
&lt;br /&gt;
 ├── app　　　　　　　　アプリケーションのソースコード(TypeScript)が格納されているディレクトリ&lt;br /&gt;
 ├── dist　　　　　　　　プロダクション用のコードが格納されているディレクトリ&lt;br /&gt;
 ├── gulpfile.js　　　　　Gulpの設定ファイル&lt;br /&gt;
 ├── tsconfig.json　　　　TypeScriptトランスパイラの設定ファイル&lt;br /&gt;
 ├── tsd.json　　　　　　TSDの設定ファイル&lt;br /&gt;
 ├── typings　　　　　　TypeScriptの型定義ファイルが格納されているディレクトリ&lt;br /&gt;
 └── webpack.config.js　Webpackの設定ファイル&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
&lt;br /&gt;
== クラス ==&lt;br /&gt;
クラスのグループがある。&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T06:56:20Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 開発のワークフロー */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= CLIアプリケーションの開発 =&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= サーバサイドアプリケーションの開発 =&lt;br /&gt;
==  概要 ==&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
== APIエンドポイントの開発 ==&lt;br /&gt;
=== 追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== クラスの開発 ==&lt;br /&gt;
=== クラスの利用 ===&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
=== クラスの追加 ===&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
=== テスト ===&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
=== 一覧 ===&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
= フロントエンドアプリケーションの開発 =&lt;br /&gt;
== 言語、フレームワーク、ライブラリ ==&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
=== タスクランナーについて ===&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== Gulpの利用 ===&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
== 参考にしたWebサイト ==&lt;br /&gt;
=== AngularJS と TypeScript ===&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
=== Webpack ===&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
=== AngularJS と Webpack ===&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScriptとWebpack ===&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
=== TypeScript ===&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
== ディレクトリ構成 ==&lt;br /&gt;
&lt;br /&gt;
== ワークフロー ==&lt;br /&gt;
&lt;br /&gt;
== クラス ==&lt;br /&gt;
クラスのグループがある。&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== API一覧 ==&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-30T06:49:41Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* フロントエンドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 言語、フレームワーク、ライブラリ ===&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
==== AngularJS ====&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
==== タスクランナーについて ====&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
==== Webpack ====&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
==== Gulpの利用 ====&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
=== 参考にしたWebサイト ===&lt;br /&gt;
==== AngularJS と TypeScript ====&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
==== AngularJS ====&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
==== Webpack ====&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
==== AngularJS と Webpack ====&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
==== TypeScriptとWebpack ====&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
&lt;br /&gt;
=== ワークフロー ===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-29T10:19:10Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 参考にしたWebサイト */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 言語、フレームワーク、ライブラリ ===&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
==== AngularJS ====&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
==== タスクランナーについて ====&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
==== Webpack ====&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
==== Gulpの利用 ====&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
=== 参考にしたWebサイト ===&lt;br /&gt;
==== AngularJS と TypeScript ====&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
==== AngularJS ====&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
==== Webpack ====&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
==== AngularJS と Webpack ====&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
==== TypeScriptとWebpack ====&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-29T10:14:34Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* フロントエンドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 言語、フレームワーク、ライブラリ ===&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
==== AngularJS ====&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
==== タスクランナーについて ====&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
==== Webpack ====&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
==== Gulpの利用 ====&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
&lt;br /&gt;
=== 参考にしたWebサイト ===&lt;br /&gt;
==== AngularJS と TypeScript ====&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
==== AngularJS ====&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
==== Webpack ====&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
==== AngularJS と Webpack ====&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
==== TypeScriptとWebpack ====&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-29T10:10:11Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* フロントエンドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 言語、フレームワーク、ライブラリ ===&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
# TypeScriptのソースファイル(.ts)&lt;br /&gt;
# TypeScriptのコンパイラ&lt;br /&gt;
# TypeScriptの型定義ファイル&lt;br /&gt;
# コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
==== AngularJS ====&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
==== タスクランナーについて ====&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
==== Webpack ====&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
# トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
==== Gulpの利用 ====&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
　&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-29T10:09:20Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* フロントエンドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 言語、フレームワーク、ライブラリ ===&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
* TypeScriptのソースファイル(.ts)&lt;br /&gt;
* TypeScriptのコンパイラ&lt;br /&gt;
* TypeScriptの型定義ファイル&lt;br /&gt;
* コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
==== AngularJS ====&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
==== タスクランナーについて ====&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
==== Webpack ====&lt;br /&gt;
　[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
* TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
* トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
==== Gulpの利用 ====&lt;br /&gt;
　[[http://gulpjs.com Gulp]]は、フロントエンドの開発でよく利用されるタスクランナーです。Webpackのみでタスクを記述することもできますが、簡潔に書くことのできるGulpに慣れている、Gulpみので、モジュール管理やTypeScriptのトランスパイルを記述すると面倒、という理由でGulpとWebpackを併用しています。/front-end/gulpfile.jsにGulpの設定を記述しています。Zephyrの開発において、Gulpを使って自動化しているのは以下の処理です。&lt;br /&gt;
# TypeScriptのソースコードのトランスパイル(Webpackを利用したタスク)&lt;br /&gt;
# htmlファイルをdistディレクトリにコピー&lt;br /&gt;
# .sassファイルを.cssファイルにコンパイルし、distディレクトリにコピー&lt;br /&gt;
# templateディレクトリにある全てのtemplateファイルをdistディレクトリにコピー&lt;br /&gt;
# 1~4のソースコードの変更監視&lt;br /&gt;
# デフォルトタスク(= 1~5のタスクを依存関係に考慮し順番に実行する)&lt;br /&gt;
* &lt;br /&gt;
　&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-29T09:58:30Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* = */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 言語、フレームワーク、ライブラリ ===&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
* TypeScriptのソースファイル(.ts)&lt;br /&gt;
* TypeScriptのコンパイラ&lt;br /&gt;
* TypeScriptの型定義ファイル&lt;br /&gt;
* コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
==== AngularJS ====&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
==== タスクランナーについて ====&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
==== Webpack ====&lt;br /&gt;
　Webpack[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
* TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
* トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== ZephyrにおけるGulpの利用 ===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-29T09:57:33Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* フロントエンドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 言語、フレームワーク、ライブラリ ===&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。利用しているツールは以下に示します。&lt;br /&gt;
&lt;br /&gt;
開発言語&lt;br /&gt;
* TypeScript&lt;br /&gt;
&lt;br /&gt;
フレームワーク&lt;br /&gt;
* AngularJS&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)&lt;br /&gt;
* Webpack&lt;br /&gt;
* Gulp&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
* TypeScriptのソースファイル(.ts)&lt;br /&gt;
* TypeScriptのコンパイラ&lt;br /&gt;
* TypeScriptの型定義ファイル&lt;br /&gt;
* コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
==== AngularJS ====&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
==== タスクランナーについて ====&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
==== Webpack ====&lt;br /&gt;
　Webpack[[http://webpack.github.io Webpack]]は、モジュール化を支援するツールです。/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
* TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
* トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== ZephyrにおけるGulpの利用 ===&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-29T09:18:47Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* フロントエンドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 言語、フレームワーク、ライブラリ ===&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
フロントエンドアプリケーションの開発には、[[http://www.typescriptlang.org TypeScript]]という言語を利用しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
* TypeScriptのソースファイル(.ts)&lt;br /&gt;
* TypeScriptのコンパイラ&lt;br /&gt;
* TypeScriptの型定義ファイル&lt;br /&gt;
* コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。tsdコマンドを使うことで、型定義ファイルのインストールが可能です。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリ(AngularJSやその他関連ライブラリ)の型定義ファイルが置かれています。新しいライブラリを追加するときには、/front-endディレクトリでtsdコマンドを使ってインストールしてください。&lt;br /&gt;
&lt;br /&gt;
=== AngularJS ===&lt;br /&gt;
　JavaScriptのフレームワーク、[[https://angularjs.org AngularJS]]を使って開発しています。AngularJSは学習コストが大きいですが、既存のソースコードを読む、書籍やブログを読むなどして勉強してください。Zephyrでは、TypeScriptとAngularJSを使って開発しているので、AngularJSのソース、TypeScriptで使うAngularJSの型定義ファイルがそれぞれnpmとtsdでインストールしています。&lt;br /&gt;
&lt;br /&gt;
　AngularJSはバージョン1系と2系がありますが、Zephyrでは1系を利用しています。また、AngularJSの概念で「$scope」というものがありますが、バージョン1.4以降では「$scope」を使わず「bindToController」を使うことが推奨されています。Zephyrでは、「$scope」を使わずに、「bindToController」を利用しているので注意してください。&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)には、[[http://gulpjs.com Gulp.js]]、[[http://webpack.github.io Webpack]]を利用しています。大変申し訳ないですが、AngularJSとTypeScriptは、学習コストは非常に大きいので、既存のコードを眺めたり、本やブログ記事を読んで勉強してください。&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ZephyrにおけるWebpackの利用 ===&lt;br /&gt;
* /front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
 * TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
 トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== ZephyrにおけるGulpの利用 ===&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-29T08:45:16Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* フロントエンドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 言語、フレームワーク、ライブラリ ===&lt;br /&gt;
フロントエンドアプリケーションの開発では、便利に開発できるようにさまざまなツールを導入しています。フロントエンド開発のツールは、同じツールであってもさまざまな使い方ができることが多いので、Zephyrにおいて、それぞれのツールをどのように使っているかを記します。個々のツールがどういったものかについては、本やブログ記事を読む、既存のコードを読むなどして勉強してください。&lt;br /&gt;
&lt;br /&gt;
==== TypeScript ====&lt;br /&gt;
　[[https://angularjs.org AngularJS]]と[[http://www.typescriptlang.org TypeScript]]という言語を利用して開発しています。TypeScriptとは、静的型付けのないJavaScriptに静的型付けをすることができるようにした言語です。TypeScriptをコンパイルすると、コンパイラがJavaScriptのコードを生成(トランスパイル)します。JavaScriptはインタプリタなので実行時までエラーチェックできませんが、TypeScriptではコンパイラによって事前にエラーチェックをすることができます。Zephyrにおいて、TypeScriptを採用した理由は以下の通りです。&lt;br /&gt;
* 肥大化したアプリケーションの体系化に、TypeScriptのクラス構文を有効であるため。&lt;br /&gt;
* TypeScriptはJavaScriptのソースコードを生成するので、少なくともコンパイル後のコードについてはTypeScriptのバージョンアップにより仕様変更があっても、アプリケーション自体は影響を受けない。&lt;br /&gt;
TypeScriptの開発には以下が必要となります。&lt;br /&gt;
* TypeScriptのソースファイル(.ts)&lt;br /&gt;
* TypeScriptのコンパイラ&lt;br /&gt;
* TypeScriptの型定義ファイル&lt;br /&gt;
* コンパイラに渡すオプション or 設定ファイル&lt;br /&gt;
TypeScriptのコンパイラは、npmで事前にインストールしてあります(package.jsonの記述を確認してください)。TypeScriptのソースコードをコンパイル(トランスパイル)するには、コマンドに対してオプションを渡す、もしくは事前に設定ファイルを書いておき設定ファイルと同一のディレクトリでコマンドを実行する、の二通りの方法があります。Zephyrでは、/front-end/tsconfig.jsonに設定を記述しています。TypeScriptでJavaScriptのライブラリ、フレームワークを利用するためには、型定義ファイルが必要となります。有名なJavaScriptのライブラリの型定義ファイルのほとんどは、TSDというTypeScript型定義システムで取得することができます。Zephyrでは、/front-end/typingsディレクトリに利用しているJavaScriptのライブラリの型定義ファイルが格納してあります。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
タスクランナー(C言語でいうmakeのようなもの)には、[[http://gulpjs.com Gulp.js]]、[[http://webpack.github.io Webpack]]を利用しています。大変申し訳ないですが、AngularJSとTypeScriptは、学習コストは非常に大きいので、既存のコードを眺めたり、本やブログ記事を読んで勉強してください。&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== ZephyrにおけるWebpackの利用 ===&lt;br /&gt;
* /front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
 * TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
 トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== ZephyrにおけるGulpの利用 ===&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-29T08:13:20Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* フロントエンドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 利用しているフレームワークやライブラリ ===&lt;br /&gt;
　開発には、[[https://angularjs.org AngularJS]]と[[http://www.typescriptlang.org TypeScript]]というフレームワーク、ライブラリを利用しています。タスクランナー(C言語でいうmakeのようなもの)には、[[http://gulpjs.com Gulp.js]]、[[http://webpack.github.io Webpack]]を利用しています。大変申し訳ないですが、AngularJSとTypeScriptは、学習コストは非常に大きいので、既存のコードを眺めたり、本やブログ記事を読んで勉強してください。&lt;br /&gt;
　タスクランナーのWebpack、Gulp.jsで書かれたワークフローは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。GulpやWebpackは、開発時に発生するさまざまなマニュアル操作(コマンドを叩いてコンパイルする、コンパイルしたコードを任意のディレクトリにコピーする、など)を自動化するのに利用しています。&lt;br /&gt;
&lt;br /&gt;
=== ZephyrにおけるWebpackの利用 ===&lt;br /&gt;
　/front-end/webpack.config.jsにWebpackの設定を記述しています。Zephyrの開発において、Webpackを使って自動化しているのは以下の処理です。&lt;br /&gt;
 TypeScriptで書かれたソースコードをJavaScriptにコンパイル(=トランスパイル)する。&lt;br /&gt;
 トランスパイルされたJavaScriptのコードを一つのファイルに結合し、bundle.jsに書き出す。&lt;br /&gt;
&lt;br /&gt;
=== ZephyrにおけるGulpの利用 ===&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-27T08:19:05Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 開発のワークフロー */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
=== 利用しているフレームワークやライブラリ ===&lt;br /&gt;
　開発には、[[https://angularjs.org AngularJS]]と[[http://www.typescriptlang.org TypeScript]]というフレームワーク、ライブラリを利用しています。タスクランナー(C言語でいうmakeのようなもの)には、[[http://gulpjs.com Gulp.js]]、[[http://webpack.github.io Webpack]]を利用しています。大変申し訳ないですが、AngularJSとTypeScriptは、学習コストは非常に大きいので、既存のコードを眺めたり、本やブログ記事を読んで勉強してください。&lt;br /&gt;
　タスクランナーのWebpackは、バグがなければ、既存のコードを書き直さずに、コマンドを叩くだけで継続して利用できると思います。&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-27T08:08:56Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* サーバサイドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中でrequireされ、使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-27T08:04:57Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* サーバサイドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
下記コマンドをzephyrプロジェクトのディレクトリ内で実行することでテストコマンドを実行することができます。&lt;br /&gt;
テストコマンドの実行設定については、package.jsonに記述してあります。&lt;br /&gt;
&lt;br /&gt;
 $ npm test&lt;br /&gt;
&lt;br /&gt;
テストには、[[http://mochajs.org mocha]]という、JavaScriptのテストランナーと、[[http://chaijs.com chai]]というJavaScriptのテスト用ライブラリを利用しています。テスト用のソースコードは、testディレクトリ以下にソースコードを書いてください。&lt;br /&gt;
&lt;br /&gt;
プロダクションのコードでは、クラスは任意のAPIエンドポイントにリクエストがあったときに、APIエンドポイントの処理の中で使われます。&lt;br /&gt;
しかし、クラスの開発の際に、サーバを立ち上げてREST APIを叩いてみてテストするとデバッグが困難であるので、REST APIの部分とは独立させてクラスのみでテストを動かす、というフローで開発すると、効率が良くなります。。&lt;br /&gt;
テストコード内では、クラスをインスタンス化し、任意の引数でメソッドを実行したときに、適切な振る舞いをしているかどうかテストします。&lt;br /&gt;
詳細は、既存のテストコードを読んだり、「TDD」で検索してください。&lt;br /&gt;
&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-27T07:42:02Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 開発のワークフロー */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ==&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-27T07:38:37Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* クラスの利用 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立しています。&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ===&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-27T07:38:13Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* サーバサイドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイントの開発(REST APIのアクセスポイント)&lt;br /&gt;
* クラスの開発(特定の処理を行うクラスの作成や既存クラスの拡張)&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの開発 ===&lt;br /&gt;
==== 追加 ====&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
=== クラスの開発 ===&lt;br /&gt;
==== クラスの利用 ====&lt;br /&gt;
　クラスを利用する.jsファイルで、requireすることでクラスを利用することができます。&lt;br /&gt;
requireすると、exportされたJavaScriptのオブジェクトを利用することができます。&lt;br /&gt;
一般的には、requireするごとにメモリが割り当てられるので、別々の参照先を指すことになるので注意が必要です。&lt;br /&gt;
例えば、class1.jsで書いたclass1を、api1.js、api2.js使う場合&lt;br /&gt;
 // api1.js&lt;br /&gt;
 var class1 = require('/path/to/class1.js');&lt;br /&gt;
&lt;br /&gt;
 // api2.js&lt;br /&gt;
 var class1 = require('/path/to/class2.js');&lt;br /&gt;
&lt;br /&gt;
api1.js内のclass1とapi2.js内のclass1では参照先が異なるので、それぞれ独立している。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== クラスの追加 ====&lt;br /&gt;
　クラスを追加するときは、既存のものにならってclassディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
クラスを記述した.jsファイルの最下部では、&amp;lt;br /&amp;gt;&lt;br /&gt;
 module.exports = ******;&lt;br /&gt;
と記述することで、他のソースコードでrequireすると利用できるようになります。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2016年3月現在、Eos、DB、WebSocketという三つのクラスでは、どのapiから呼び出すときにも同じオブジェクトを参照したいので、技巧的に同一の参照を取得できるようにしている(デザインパターンのシングルトンで調べてみてください)。&lt;br /&gt;
&lt;br /&gt;
このシングルトン化の方法はNode.jsのモジュールの仕組みを利用した技巧的な方法を利用しています。&lt;br /&gt;
詳しくは、[[http://d.hatena.ne.jp/jovi0608/20111226/1324879536 Node.js : exports と module.exports の違い（解説編）]]や「CommonJS」、「RequireJS」、「Node.jsのモジュールシステム」等で調べてください。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　&lt;br /&gt;
==== クラス一覧 ====&lt;br /&gt;
　2016年3月現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ===&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-27T05:12:12Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 開発のワークフロー */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイント(REST APIのアクセスポイント)&lt;br /&gt;
* 特定の処理を行うクラスの作成や既存クラスの拡張&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイント一覧 ====&lt;br /&gt;
　2016/3/23現在&lt;br /&gt;
&lt;br /&gt;
== フロントエンドアプリケーション ===&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-27T05:09:34Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 開発のワークフロー */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイント(REST APIのアクセスポイント)&lt;br /&gt;
* 特定の処理を行うクラスの作成や既存クラスの拡張&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016/3/23現在&lt;br /&gt;
&lt;br /&gt;
=== フロントエンドアプリケーション ===&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-23T07:33:23Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* サーバサイドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイント(REST APIのアクセスポイント)&lt;br /&gt;
* 特定の処理を行うクラスの作成や既存クラスの拡張&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
==== テスト ====&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
==== APIエンドポイント一覧 ====&lt;br /&gt;
　2016/3/23現在&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-23T07:23:09Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* サーバサイドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイント(REST APIのアクセスポイント)&lt;br /&gt;
* 特定の処理を行うクラスの作成や既存クラスの拡張&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、APIエンドポイントの登録(ルーティングの追加)、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイントの追加 ===&lt;br /&gt;
　APIエンドポイントを追加するときは、既存のものにならってapiディレクトリ以下にソースコードを追加してください。&lt;br /&gt;
この部分には、httpメソッド(GET, POST, PUT, DELETEなど)のハンドリングを行うコードを書きます。&lt;br /&gt;
複雑な処理を書きたいときは、別にクラスを作成しておき、そのクラスで実行を行うようにしてください。&lt;br /&gt;
APIエンドポイントの処理では、httpリクエストの処理、エンドポイントでのロジックの実装(必要に応じてクラスを使う)、httpレスポンスの処理を行います。&lt;br /&gt;
APIの設計(どのようにエンドポイントを作るか、エンドポイントの命名など)については、[[http://www.amazon.co.jp/Web-API-The-Good-Parts/dp/4873116864 Web API: The Good Parts]]や[[http://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042 Webを支える技術 -HTTP、URI、HTML、そしてREST]]が参考になります。&lt;br /&gt;
&lt;br /&gt;
=== APIのテスト ===&lt;br /&gt;
　作成したエンドポイントは、単独でのテストが可能です。[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]などの、ブラウザの拡張機能を使うことで、任意のエンドポイントに対して、任意のhttpメソッドで実行することができます。様々なパラメータを与えたときに、意図通りのレスポンスが返ってくるかどうかテストできます。&amp;lt;br /&amp;gt;&lt;br /&gt;
APIエンドポイントのテスト方法として、フロントエンドアプリケーションからアクセスしてみて試す方法があります。&lt;br /&gt;
ブラウザ上で動作するJavaScriptをテスト用に書き（フロントエンドアプリケーションに組み込んで）、特定のAPIエンドポイントにメソッドを実行して、Google Chromeデベロッパツール等でレスポンスを確認する、といった方法です。&lt;br /&gt;
これは、実際に動くアプリケーションに近いので、やりたくなる方法ではありますが、よくない方法です。&lt;br /&gt;
バグがあったときに、テスト用に書いたコードとAPIエンドポイントのコードのどちらにバグがあるのか判断するのが難しくなるからです。&lt;br /&gt;
実際に動くフロントエンドアプリケーションにテストコードを組み込むのも同様の理由でよくない方法です。&lt;br /&gt;
さらに、実際に動くフロントエンドのコードが汚くなる温床となるので、避けたほうがよいでしょう。&lt;br /&gt;
[[https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop Postman]]や[[https://addons.mozilla.org/ja/firefox/addon/restclient/ RESTClient]]のようなツールを使って、APIエンドポイントだけを独立してテストするのがオススメです。&lt;br /&gt;
&lt;br /&gt;
=== APIエンドポイント一覧 ===&lt;br /&gt;
　2016/3/23現在&lt;br /&gt;
&lt;br /&gt;
===&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-23T06:49:23Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 概要 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というNode.jsのWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイント(REST APIのアクセスポイント)&lt;br /&gt;
* 特定の処理を行うクラスの作成や既存クラスの拡張&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-22T12:56:50Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* サーバサイドアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイント(REST APIのアクセスポイント)&lt;br /&gt;
* 特定の処理を行うクラスの作成や既存クラスの拡張&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
  ├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  ├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
  └── routes.js　　ルーティングが設定されたファイル&lt;br /&gt;
 　　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。各種設定ファイルの読み込み、クラスのインスタンス化、Webサーバの起動などが行われている。&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-22T12:34:44Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* 開発のワークフロー */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
== サーバサイドアプリケーション ==&lt;br /&gt;
===  概要 ===&lt;br /&gt;
　Webを通じてEosコマンドの実行をするためのアプリケーションである。全ての操作は、REST APIを通じて行う仕様となっている（一部、コンソールへの出力メッセージを通信する部分のみWeb Socketを利用している）。&lt;br /&gt;
[[https://github.com/expressjs/express Express]]というWebアプリケーションフレームワークを使って開発されている。&lt;br /&gt;
サーバサイドアプリケーションで開発するものは、&lt;br /&gt;
* APIエンドポイント(REST APIのアクセスポイント)&lt;br /&gt;
* 特定の処理を行うクラスの作成や既存クラスの拡張&lt;br /&gt;
の二通りがある。&lt;br /&gt;
&lt;br /&gt;
=== ディレクトリ構成 ===&lt;br /&gt;
├── api　　各APIエンドポイントの処理が書かれたソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
├── app.js　main部分&amp;lt;br /&amp;gt;&lt;br /&gt;
├── class　各クラスのソースコードが置いてあるディレクトリ&amp;lt;br /&amp;gt;&lt;br /&gt;
├── config.js　zephyrに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
├── express.js　expressに関する設定が書かれたファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
└── routes.js　　ルーティングについて書かれたファイル&lt;br /&gt;
　　　　　　　　　APIエンドポイントの追加などが行われている&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
app.jsはExpressを使って書かれたサーバサイドアプリケーションの本体で、main関数のような部分です。&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-22T12:19:09Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* CLIアプリケーション */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/ tj/commander.js]]を参照。&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-22T12:13:17Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= 開発のワークフロー =&lt;br /&gt;
== CLIアプリケーション ==&lt;br /&gt;
　zephyrコマンドの種類を増やしたいときは、cliディレクトリにJavaScriptのソースコードを追加する。CLIアプリケーションはNode.js上で実行される。CommanderというNode.jsでコマンドを開発するためのライブラリをベースに書かれている。&amp;lt;br /&amp;gt;&lt;br /&gt;
　新しくzephyrのサブコマンドを開発する場合、cliディレクトリ内にzephyr-***というファイルを作る。この新しく作ったファイルにchmodコマンドで実行権限を付与すればよい。詳しくは、[[https://github.com/tj/commander.js/]]を参照。&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-22T11:24:36Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。(Zephyrのインストールを参照)&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-22T11:23:25Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。([[Zephyrのインストール]])&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-22T11:23:04Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。([[##Zephyrのインストール]])&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-22T11:19:24Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyrは大きく分けて三つのアプリケーションがある。  &lt;br /&gt;
zephryコマンド、フロントエンドアプリケーション、サーバサイドアプリケーションで、それぞれcliディレクトリ、front-endディレクトリ、serverディレクトリにアプリケーションのソースコードがある。  &lt;br /&gt;
Zephyrをインストールすると、zephyrコマンドが使えるようにするために、binディレクトリにcli/zephyr(JavaScriptのソースコード)へのシンボリックリンクを配置している。  &lt;br /&gt;
インストールの際に、zephyr/binディレクトリをPATHに通すので、zephyrコマンドを実行できるようになる。([[インストール]])&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	<entry>
		<id>https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr</id>
		<title>Zephyr</title>
		<link rel="alternate" type="text/html" href="https://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/Zephyr"/>
				<updated>2016-03-22T11:13:31Z</updated>
		
		<summary type="html">&lt;p&gt;Fumifumi: /* ディレクトリ構成 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 概要 =&lt;br /&gt;
　EosコマンドをWebブラウザ上で実行するためのアプリケーションである。&lt;br /&gt;
EosはCUIで実行する場合、[[OptionControlFile]]に基づいて実行時引数を解析している。&lt;br /&gt;
Zephyrでは、Webブラウザ上で動作するUIパーツを[[OptionControlFile]]を用いることで自動的に生成する。&lt;br /&gt;
OptionControlFileはそれぞれのコマンドの[[OptionControlFile]]を事前にJSON形式にパースし、Zephyrプロジェクトディレクトリの特定のディレクトリに格納してある。&lt;br /&gt;
Zephyrでは、JSON形式にパースされたOptionControlFileを使って、Webブラウザを通じてEosコマンドを実行するための様々な機能群を提供する。&lt;br /&gt;
&lt;br /&gt;
= 必要なソフトウェア =&lt;br /&gt;
以下のソフトウェアを事前にインストールしておく必要がある。&lt;br /&gt;
2016年3月現在、以下のバージョンでの動作を確認している。&lt;br /&gt;
* Eos&lt;br /&gt;
* Node.js v4.2.4&lt;br /&gt;
* Ruby 1.9.3p551&lt;br /&gt;
&lt;br /&gt;
= インストール =&lt;br /&gt;
== Node.js(v4.2.4)のインストール ==&lt;br /&gt;
Node.jsのバージョン管理システムnvmを用いてインストールする。(https://github.com/creationix/nvm)&lt;br /&gt;
 # nvmのインストール&lt;br /&gt;
 $ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash&lt;br /&gt;
 $ source .bashrc&lt;br /&gt;
&lt;br /&gt;
 # Node.js(v4.2.4)のインストール&lt;br /&gt;
 $ nvm install v4.2.4&lt;br /&gt;
 &lt;br /&gt;
 # .bashrcに追記&lt;br /&gt;
 $ echo nvm use 4.2.4 &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zephyrのインストール ==&lt;br /&gt;
 $ git clone git://git.osdn.jp/gitroot/eos/zephyr.git&lt;br /&gt;
 $ cd zephyr&lt;br /&gt;
&lt;br /&gt;
 # 必要なnpmのパッケージをインストール&lt;br /&gt;
Zephyrでは、Node.jsのライブラリ管理システム(npm) に登録された様々なライブラリを使って開発されている。&lt;br /&gt;
事前にインストールしておく必要がある。&lt;br /&gt;
 $ npm install&lt;br /&gt;
&lt;br /&gt;
 # .bashrcに追記し、PATHを通す&lt;br /&gt;
 $ echo export PATH=/path/to/zephyr/node_modules/.bin:/path/to/zephyr/bin:\$PATH &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 $ echo export ZEPHYR_HOME=/path/to/zephyr &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
= 使い方 =&lt;br /&gt;
Zephyrディレクトリ中の/user-specific-files/OptionControlFileにJSONファイルが作成されていない場合、Zephyrを起動する前に、OptionControlFileをパースしておく必要がある。&lt;br /&gt;
&lt;br /&gt;
 # OptionControlFileのパース場合&lt;br /&gt;
 $ zephyr parse&lt;br /&gt;
&lt;br /&gt;
 # Zephyrの起動&lt;br /&gt;
 $ zephyr serve&lt;br /&gt;
&lt;br /&gt;
 # デバッグモードでの起動&lt;br /&gt;
 $ zephyr debug&lt;br /&gt;
&lt;br /&gt;
通常の起動、デバッグモードでの起動ともにWebブラウザを開き、アドレスバーにlocalhost:3000を入力し接続すると利用できます。&lt;br /&gt;
デバッグモードは、開発者のためのZephyr起動コマンドです。&lt;br /&gt;
&lt;br /&gt;
= ディレクトリ構成 =&lt;br /&gt;
　Zephyrのディレクトリ構成を以下に示す。&lt;br /&gt;
&lt;br /&gt;
 ├── bin　　　　　　　　　zephyrコマンドのバイナリへのシンボリックリンク&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── cli　　　　　　　　　zephyrコマンドのソースコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── docker　　　　　　 　docker用のファイル群(未実装)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── front-end　　　　　　Zephyrのフロントエンドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　(ブラウザ上で動くHTML, CSS, JavaScriptなどで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── node_modules　　　　　npmのライブラリ群&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── package.json　　　　　Zephyrのパッケージ情報&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── server　　　　　　　　Zephyrのサーバサイドアプリケーション&lt;br /&gt;
 　　　　　　　　　　　　　　　(Node.jsで作られたアプリケーション)&amp;lt;br /&amp;gt;&lt;br /&gt;
 ├── test　　　　　　　　　テストコード&amp;lt;br /&amp;gt;&lt;br /&gt;
 └── user-specific-files　OptionControlFileなど、Zephyrのアプリケーションで利用する静的ファイル&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zephyr&lt;br /&gt;
&lt;br /&gt;
= ドキュメントAPI =&lt;br /&gt;
&lt;br /&gt;
= 参考にしたWebサイト =&lt;br /&gt;
== AngularJS と TypeScript ==&lt;br /&gt;
* [http://tech.recruit-mp.co.jp/front-end/post-7730/ 【AngularJS x TypeScript デザインパターン】 Controller と Routing 篇 - AngularJS + TypeScript ＃4] &lt;br /&gt;
* [http://qiita.com/armorik83/items/0778d757c46e953f3fdf TypeScriptで書くAngularJSのMVC]&lt;br /&gt;
* [http://stackoverflow.com/questions/27803691/how-to-use-angular-ui-bootstrap-modals-in-typescript How to use angular-ui-bootstrap (modals) in typescript?]&lt;br /&gt;
&lt;br /&gt;
== AngularJS ==&lt;br /&gt;
* [http://qiita.com/advent-calendar/2015/angularjs AngularJS Advent Calendar 2015]&lt;br /&gt;
* [http://qiita.com/armorik83/items/8e1f8003d4be8bb8555e ng-repeatでのフィルタをフックする]&lt;br /&gt;
* [http://qiita.com/armorik83/items/5542daed0c408cb9f605 AngularJSモダンプラクティス]&lt;br /&gt;
&lt;br /&gt;
== Webpack ==&lt;br /&gt;
* [http://thujikun.github.io/blog/2014/12/07/webpack/ Webpackを使い倒す]&lt;br /&gt;
* [http://ameblo.jp/ca-1pixel/entry-11884453208.html RequireJS等はもう古い。WebPackとは？]&lt;br /&gt;
* [http://liginc.co.jp/web/js/other-js/148813 WebPackを使ってJavaScriptを効率的に書くチュートリアル【入門編】]&lt;br /&gt;
&lt;br /&gt;
== AngularJS と Webpack ==&lt;br /&gt;
* [http://angular-tips.com/blog/2015/06/using-angular-1-dot-x-with-es6-and-webpack/ Using Angular 1.x With ES6 and Webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScriptとWebpack ==&lt;br /&gt;
* [http://www.jbrantly.com/typescript-and-webpack/ TypeScript and webpack]&lt;br /&gt;
&lt;br /&gt;
== TypeScript ==&lt;br /&gt;
* [https://html5experts.jp/vvakame/17004/ TypeScript の開発環境構築と周辺ツールの紹介]&lt;br /&gt;
&lt;br /&gt;
= 問題点 =&lt;br /&gt;
* UIの機能のコンポーネント化できてない&lt;br /&gt;
* メインページのcontrollerにベタ書きしているので、密結合になっている。&lt;br /&gt;
* 機能追加や修正に時間を要してしまう。&lt;br /&gt;
* ライブラリの管理&lt;br /&gt;
* パッケージ管理システムによる管理を整えられていない。&lt;br /&gt;
* ユーザに配布する際に、自動で環境を整えることができない。&lt;br /&gt;
* 機能追加の際のプロセス・ワークフローを構築できていない。&lt;br /&gt;
* 今は自分以外の人が開発しようとすると、ソースを全部読まないといけない。&lt;br /&gt;
* 各機能を疎結合にする+開発プロセス決めることで、自分の開発も効率化できる。&lt;br /&gt;
* APIドキュメントがない&lt;br /&gt;
* JSDoc等を使ってドキュメントが生成されるようにすべき。&lt;br /&gt;
* JSDocでドキュメントが作れるように設計することで、システムの見通しもよくなるはず。&lt;br /&gt;
&lt;br /&gt;
== 解決策のアイデア ==&lt;br /&gt;
* AngularJSのCommonJS?的な使い方探す(Browserify, Bowerを使う)&lt;br /&gt;
* ディレクティブを細かく作る。特に、コマンド実行の部分。&lt;br /&gt;
* ページ遷移の際の、REST APIの呼び出しはresolveに押し込む。&lt;/div&gt;</summary>
		<author><name>Fumifumi</name></author>	</entry>

	</feed>