2015年11月30日月曜日

CoffeeScriptのススメ

CoffeeScript は、シンプルな記述でJavaScriptのコードを生成するための一種のコンパイラです。
これにより、冗長な記述や誤りが入り込みやすい部分を、よりシンプルに記述することが可能になります。
そのCoffeeScriptでクラスを記述してみたいと思いますが、その前にライブラリをインストールします。
ここでは、Node.jsを既にインストール済みであることを前提とします。

$ npm install -g coffee-script

グローバル・オプションでインストールしました。これでCoffeeScriptのインストールは完了です。
コンパイルのコマンドは以下のようになります。

$ coffee -c hoge.js.coffee

CoffeeScriptによって記述された hoge.js.coffee をコンパイルすることにより、hoge.js が生成されます。
この流れが基本です。

JavaScriptにはクラスという考え方が存在せず、prototypeというクラスに似た考え方を利用して、あたかもクラスを実装しているように見せかけていますが、CoffeeScriptでは、classキーワードを使用してクラス定義を記述できます。

# TVクラスを定義
class Television
  # チャンネルプロパティを定義します。
  ch: '7'

  # 引数としてnameを受け取り初期化をするコンストラクタを定義します。
  constructor: (@name) ->

  # メソッド watach を定義
  watach: ->
    alert "#{@name}で#{@ch}を視聴中 ..."
    return

# Usage;
tv = new Television 'television'
tv.watch()


var Television, tv;
Television = (function() {
  Television.prototype.ch = '7';

  function Television(name) {
    this.name = name;
  }
  Television.prototype.watch = function() {
    alert("" + this.name + "で、ch " + this.ch + "を視聴中 ...");
  };
  return Dog;
})();

tv = new Television('4Kテレビ');
tv.watch();

結果は ...
「4Kテレビで、ch 7を視聴中 ...」


CoffeeScriptの @は、thisとほぼ同じ意味でインスタンス・プロパティへの参照です。
また、()なども省略可能で、インデントにより表します。このあたりは、Rubyや、Python、または、Jadeに似た感覚です。

2015年11月14日土曜日

DockerでGUIアプリケーションを動かしてみる

高性能なIDEなどを構築するのはとても手間な作業だと思います。
この実験がひとつの発火点になれば、より合理的に仕事ができるようになるかもしれません。

まず、以下のような Dockerfile を用意します。

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y firefox
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

USER developer
ENV HOME /home/developer
CMD /usr/bin/firefox

そして、イメージを作成します。
ビルドにはしばらく時間がかかります。

$ docker build -t kenny/gui-docker .

次に run します。

$ docker run -ti --rm \
       -e DISPLAY=$DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       gui-docker

すると Firefox が起動します。























たったこれだけの実験なのですが、ひとつ可能性の地平が拡がりました。




2015年11月11日水曜日

Docker ver. 1.9 を発表

米Docker が現地時間(11月3日)にバージョン1.9を発表しました。
大きなポイントとして、マルチネットワーキングへの対応と永続的ストレージ関連の強化あたりでしょうか。

ひとつめは、コンテナの配備に関係なく仮想ネットワークと紐付けてコンテナの通信を完全に制御できるという点です。複数のホストにまたがって仮想ネットワークが構築できるようになります。
つまり、仮想ネットワークで抽象化され、どのホストでコンテナを実行するのか、という事実を隠蔽します。今回は安定板という位置づけなので本番環境での利用も可能です。

つづいて永続化ストレージに関して
1.9ではボリュームシステムが完全に再設計されたようです。データボリュームは複数コンテナで共有できるようになります。また、Swarmとの連携で、たとえばクラスタ全体での永続化を管理できるようになります。

その Docker Swarm ですが、今リリースから ver1.0 に到達し正式版になります。
コンテナで構成したクラスタのスケールが自動的に管理されるようになります。

オーケストレーションの Docker Compose は、ver. 1.5 になりました。
今回からWindowsのサポートも加わりました。
Swarm上でComposeのアプリケーションを複数のホストにまたがってデプロイすることが可能になります。

以上、Docker 1.9 のバージョンアップの要点をまとめました。

2015年11月9日月曜日

MongoDBをDokcerに隔離してマニュアル操作する

まずは、MongoDBのコンテナを作成します。

$ docker pull mongo

Latestは3.2です。
早いです。
11月5日に MongoDB Blog でアナウンスされたばかりです。3系の最新版ということになります。
軽く主な変更点に触れておこうと思います。

1)注目はストレージエンジンです。負荷状況に応じた最適化の選択肢の設定を行いやすくなった点です。これにより複数のストレージ稼働でのスケールがより柔軟になり運用の負担を軽減します。
2)ドキュメントバリデーションも強化されました。
3)インデックス作成時にフィルタをかけることによりメモリ容量を節約する。
4)BIコネクタ (BI Connector) が導入されました。

主なところをリストしてみました。
BIコネクタの導入は簡易なBI分析に向けて、ビッグデータ的な大がかりではないようなちょっとしたことがいろいろ可能になるような夢を感じますね。

では、pullしたmongoDBコンテナを起動します。

$ docker run --name mongo-sampler -d mongo:latest

さて、起動したら念のため ps で確認してみてください。
クライアントを起動してMongoDBを扱いたいわけですが、ホスト側のローカル環境にはMongoのコマンドは存在しません。
そのために、クライアントの役割を演じるコンテナをひとつ起動します。

$ docker run -it --link mongo-sampler:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/sample-db"'

MongoDBの操作が終わればクライアントのコンテナは必要なくなるので -rm でオプションを設定して、これからログインするコンテナを抜けると同時に終了するように設定します。
--link で既に起動してある MongoDB のコンテナに接続します。
sh -c でシェルスクリプト経由で、$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT のコマンドを実行します。内容は、Dockerで自動的に生成される環境変数でMongoDBのIPアドレスとポート番号を参照するようにします。
最後の sample-db は MongoDB に作成するデータベースです。

先のDockerコマンドを実行するとMongoDBのコンテナにログインするので、作成されたデータベースを使ってみます。

> use sample-db
switched to db sample-mongo

データを投入します。

> db.records.insert({_id:1,title:"MongoDBへテストレコードを投入する。",number:100})
WriteResult({ "nInserted" : 1 })
> db.record s.insert({_id:2,title:"続いてレコードをもう1件投入します。",number:101})
WriteResult({ "nInserted" : 1 })

検索します。

> db.record s.find()
{ "_id" : 1, "title" : "MongoDBへテストレコードを投入する。 ", "number" : 100 }
{ "_id" : 2, "title" : "続いてレコードをもう1件投入します。 ", "number" : 101 }

更新します。

> db.books.update({ _id:2 }, { $set : { title: "上書きします。" } })

確認します。

> db.record s.find()
{ "_id" : 1, "title" : "MongoDBへテストレコードを投入する。 ", "number" : 100 }
{ "_id" : 2, "title" : "上書きします。 ", "number" : 101 }

削除します。

> db.books.drop()
true
> db.record s.find()
>
> exit
bye

そしてプロセスを抜けたので、クライアントのコンテナは消滅しました。
NoSQLを実感してください。

2015年11月3日火曜日

Cloud9 で Rails を動作させてみる

ローカル環境でアプリケーションを構築して、gitにコミットしてクラウドにデプロイという流れとは別にクラウド上でアプリケーションを構築して、gitにpushしたり、任意のクラウドにデプロイという開発の流れもあります。
いちばんのメリットは個々の環境に開発環境を作らなくても済むという点です。
つまりブラウザさえあればモノが作れてしまうというわけです。

そういうわけで、今回は Cloud9 という開発用のクラウドサービスを試してみようと思います。

まずは、どんな機能を持っているのか? をまとめます。

1)開発に関連する環境がすでに揃っている(ruby, php, node.js, java C++ ...)
2)フレームワークもインストール済みなので、そのまま使用できる(Rails, httpd など)
3)Ubuntu環境なので、ターミナル操作をそのまま実行可能
4)データベースも用意されている(MySQL, Postgres, Redis, MongoDB など)
5)サンプルやデモとして簡単にアプリケーションをインターネットに公開できる
6)メンバーとのリアルタイム編集
7)エディタ環境は、Vim, Emacs, Sublime から好みのものを選択できる
8)Chrome, Firefox, safari など、クロスブラウザチェックが可能

次に、無料の範囲でどこまでスペックを活用できるのか? もついでにまとめます。

1)1GBのディスク容量
2)512Mのメモリ
3)ひとつまでのプライベート環境インスタンス

さて、Cloud9のアカウントを作成するか、GitHub、Bitbucketのアカウントがあれば、そのままログインできます。























ログインしたら、まずはワークスペースを作成しますが、Workspace name の入力欄に任意の名前をつけて入力します。この部分がのちほどURLのドメインの部分に付与されます。
Workspece Privacyは、公開したければ public で設定します。

今回は、Ruby on Rails のプラットホームでアプリケーションを構築してみようと思います。
プラットホームのアイコンから Ruby on Rails を選択して Createボタンを押して、しばらく待ちます。
すると IDEが起動します。
左のペインにワークスペースのディレクトリツリーが、右ペイン上部には選択したファイル、下部にターミナルが表示されています。Visual Studio や eclipse を使い慣れた方ならば直観的に操作できると思います。

まずは、左のペインのワークスペースのディレクトリツリーから Gemfile を開きます。
とくに今回は編集しませんが、gem 'sqlite3' という部分があります。データベースは、そのままsqlite3でいこうと思います。

さて、さっそくbashターミナルでコマンドを実行します。
右側のペイン下部です。

$ bundle update
$ bundle install

必要なgemパッケージをインストール完了しました。
つづいて、Scaffoldでテンプレートを作成します。

$ rails generate scaffold User name:string email:string
      invoke  active_record
      create    db/migrate/20151103062340_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.coffee
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

そしてマイグレーションです。

$ bundle exec rake db:migrate
== 20151103062340 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0023s
== 20151103062340 CreateUsers: migrated (0.0025s) =============================

これで完了です。
実行の Run ボタンを押すと、クラウド上でアプリケーションが構築されます。データベースは c9 インスタンスが生成されます。
ブラウザで、https://ワークスペース名-ユーザ名.c9.io/users にアクセスすると、おなじみのRailsのチュートリアル画面を生成します。



















個々のPCに開発環境を作るのは、意外と大変です。
たとえば、vagrantなどで合理化しても、それなりに学習コストがかかりますが、今回の Cloud9 であれば、直観的にプラットホームを作成して、コーディングに専念できるという点がアドバンテージだと思います。
興味のある方は、ぜひ試してみてください。