読者です 読者をやめる 読者になる 読者になる

かばちんのエンジニアブログ

日々の経験の中で培った内容を備忘録も兼ねて記録していくブログです。少しでも誰かの役に立つために頑張って続けていけたらなと思います。

CoreCLRのインストールとビルド、実行まで

最近必要に駆られてCoreCLRを触っております。


CoreCLRとはMicrosoft社が開発しているオープンソースで、
LinuxOS上で.NET Coreを動かすことができるフレームワークです。


簡単に説明すると、C#で書いたプログラムがそのままLinuxOS上で実行できるという代物です。
LinuxOS上ということなので、Linuxベースで作られているMacOSでももちろん実行することができます。


なんとCoreCLRはdockerにも対応しているので、インストールするのが面倒でかつ
dockerに慣れている方はdocker版を導入してみると良いかもしれません

docker run -it microsoft/dotnet:latest


今回はUbuntuでのインストール手順を説明したいと思います。


インストール

インストールはCoreCLRの公式サイトに分かりやすく手順が書いてありますので、
そちらを参照して頂いても大丈夫ですが、こちらにも記載したいと思います。
.NET - Powerful Open Source Development


Ubuntu 14.04 の場合
sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
sudo apt-get update
Ubuntu 16.04 の場合
sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
sudo apt-get update

上記コマンドを実行してapt-getリストをアップデートしたら、実際にCoreCLRをインストールします。

sudo apt-get install dotnet-dev-1.0.0-preview2-003121


これでCoreCLRのインストールが完了しました!
とても簡単ですね。


ビルド準備

CoreCLRでビルドするには、まず下記のようにプロジェクトの初期化を行います。

$> mkdir sample
$> cd sample

$> dotnet new
Created new C# project in /root/sample.

$> dotnet restore
log  : Restoring packages for /root/sample/project.json...
log  : Writing lock file to disk. Path: /root/sample/project.lock.json
log  : /root/sample/project.json
log  : Restore completed in 1335ms.

$> dotnet run
Project sample (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling sample for .NETCoreApp,Version=v1.0

Compilation succeeded.
    0 Warning(s)
    0 Error(s)

Time elapsed 00:00:01.9024996
 

Hello World!

ひとつずつ説明していきます。


まずは、mkdirでプロジェクトが格納されるフォルダを作成し、cdでその中に入ります。
ここは特に問題ないと思います。



次に dotnet new コマンド。
このコマンドを実行することにより、デフォルトのProgram.csファイルとproject.jsonファイルが作成されます。
Program.csとproject.jsonファイルの中身は下記のようになっています。

// Program.cs
using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

// project.json
{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {},
  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0"
        }
      },
      "imports": "dnxcore50"
    }
  }
}

Program.csはコンソールに「Hello World!」と出力するだけのシンプルなものになっています。
project.jsonはなにやらいろいろと設定されていますが、CoreCLRを動かすのに最低限必要なもののようです。
必要なフレームワークなどがある場合はこのファイルを編集して対応することができそうです。


次に dotnet restore コマンド。
このコマンドを実行するとproject.jsonファイルの設定に基づいて必要なファイルなどをダウンロードしてきます。
それと同時にproject.lock.jsonという中身の多い設定ファイルが作成されます。


最後に dotnet run コマンド。
このコマンドは読んで字の如くプログラムを実行してくれます。
ソースコード変更後の初回実行時に限りビルドも同時に行ってくれます。

ビルドのみを行いたい場合は下記コマンドにて行うことが可能です。

dotnet build

実行結果を見るとたしかに最下部のほうに「Hello World!」と表示されていますね!


最後に

今回はインストール手順とビルド、実行までの説明でした。


今後CoreCLRを使ってプロジェクトを進めていくにあたりいろいろと壁にぶつかることもあると思いますが、
これからCoreCLRを触る機会のある方たちに有用な情報として残していけたらなと思っています。


CoreCLRは2016年6月に1.0版がリリースされたので、今後ますます開発が進められて実用レベルに達する日も
遠くはないんじゃないかなぁと、期待も込めて思っています!


それでは。

Laravel5をLinuxで使う時にハマるポイント

f:id:kabatin:20160510153411p:plain

LinuxサーバでLaravel5を利用する時にだいたいの人がつまずくであろうポイントをまとめてみた。

ハマるポイント1

これを忘れてvendorフォルダが作成されておらず動かない。

composer install

ちなみに composer もインストールしなければならないので下記コマンドでインストールする。
インストールすると composer.phar というファイルになるので mv するなりして composer にするとよい。

curl -s http://getcomposer.org/installer | php

さらに、PHPもインストールされていない場合は下記コマンドでインストール。

sudo apt-get install php5-cli
ハマるポイント2

bootstrap、storageフォルダに対して777権限を付与していなくてエラーになる。
とにかくフォルダもファイルも777にしておけば動く。(セキュリティ面は自己責任で!)

chmod 777 -R bootstrap
chmod 777 -R storage
ハマるポイント3

.envファイルを作成していなくてエラーになる。
作成した後は中身も適切に変更すること。

cp -p .env_example .env
php artisan key:generate
ハマるポイント4

ページに「Whoops, looks like something went wrong.」が表示されて困る。
config/app.php のDEBUGモードをオンにすれば通常のスタックトレースが表示されるようになる。

vi config/app.php
まとめ

ほとんどのことはLaravel5のドキュメントを読めば解決するのでドキュメントはしっかり読みましょう。
(Laravelのドキュメントは英語しかなかった気がしますが、頑張れば読めるレベルだと思います。)

docker-compose のインストール

f:id:kabatin:20160222190902p:plain

Dockerを使っていると複数のコンテナを管理するのが大変になってきます。

そんな時に力を発揮するのが「docker-compose」です。



Docker では Dockerfile にてコンテナの内容を管理していましたが、

docker-compose では docker-compose.yml ファイルでコンテナを管理できます。


まずはインストールの仕方から。


前提条件

Macでの手順
MacVirtualBoxUbuntuがインストール済み
・Dockerもインストール済み


インストール手順

インストール手順は至って簡単で、curl 経由でスムーズにインストールすることが可能です。
/usr/local/bin フォルダに書き込み権限が必要なので、もし root ユーザ意外で権限が付いていない場合は事前に付与しましょう。

sudo chmod 777 /usr/local/bin


docker-compose のインストールをします。
1.7.0 の部分はバージョン情報なので、本家サイトで最新を確認して変更してください。

■公式サイト
docs.docker.com

sudo -i curl -L https://github.com/docker/compose/releases/download/1.7.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

インストールが終わると /usr/local/bin に docker-compose ファイルが作成された状態になります。
今度はこの実行ファイルに実行権限を付与してあげます。

sudo chmod +x /usr/local/bin/docker-compose

正常にインストールされたか確認します。
こんな感じにバージョン情報が表示されればインストール成功です。

docker-compose version
docker-compose version 1.6.2, build 4d72027
docker-py version: 1.7.2
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013


今回は簡単ですがインストール手順のみになります。

Docker + Laravel + MariaDB + Redis での環境構築

f:id:kabatin:20160222190902p:plain

Scalaの開発環境の次に、手堅くPHPの開発環境も作ることになりました。
その手順とハマったポイントなどを備忘録として書いていきたいと思います。

前提条件

Macでの手順
MacVirtualBoxUbuntuがインストール済み
・Dockerもインストール済み
・docker-composeもインストール済み

参考)VirtualBoxUbuntuのインストールや、Dockerのインストール手順はこちらを参照
kabatin.hateblo.jp

参考)docker-composeのインストール手順はこちらを参照
kabatin.hateblo.jp


各ソフトウェアのバージョン情報など

MacOSX 10.11.1
VirtualBox 5.0.14
Ubuntu 14.04 LTS
・Docker 1.10.2
PHP 5.5.9
・Laravel 5.2
MariaDB 10.1.12
・Redis 3.0.5


フォルダ構成

まず完成形のフォルダ構成はこちら

.
├── data
│   └── php
├── docker-compose.yml
├── server
│   └── docker
│       ├── mariadb
│       │   ├── Dockerfile
│       │   └── docker-entrypoint-initdb.d
│       │       └── configure.sh
│       ├── nginx
│       │   ├── Dockerfile
│       │   └── conf
│       │       └── default.conf
│       ├── php
│       │   └── Dockerfile
│       └── redis
│           └── redis.conf
└── storage-compose.yml
MariaDB と Redis

まずは比較的簡単なデータベースとRedisの設定から行います。

設定するファイルはメインの docker-compose.yml とは分けて、storage-compose.yml とします。
中身はこんな感じになっています。

version: '2'

services:

  db:
    build: server/docker/mariadb
    volumes:
      - ./data/mariadb:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_PASSWORD: password
      MYSQL_USER: user1
      MYSQL_DB: password
    entrypoint:
      /docker-entrypoint-initdb.d/configure.sh

  redis:
    image: redis:3.0.5
    volumes:
      - "./server/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf"
    entrypoint:
     - "redis-server"
     - "/usr/local/etc/redis/redis.conf"

MariaDB, Redis 共通

version

このバージョンは "2" じゃないとダメなようです。
決められたものなので、おまじないとして記述しましょう。

build

Dockerfile が置いてあるパスを指定します。
最初にお見せしたツリーを見ると MariaDB 用の Dockerfile の場所が指定されていることがわかります。

volumes

データ永続化のために、MariaDB のデータ置き場である /var/lib/mysql に対して、ローカルフォルダ ./data/mariadb をマウントしています。

environment

コンテナ内の環境変数を設定しています。

entrypoint

コンテナ起動時に実行するコマンドを指定します。
今回は /docker-entrypoint-initdb.d/configure.sh を指定していますが、これは Dockerfile 内で、
事前に用意したファイルをコンテナ内部へコピーしたものを指定しています。

Redis

build

Dockerfile が置いてあるパスを指定します。
最初にお見せしたツリーを見ると Redis 用の Dockerfile の場所が指定されていることがわかります。

volumes

事前に設定してある redis.conf ファイルをコンテナ内の対象ファイルにマウントしています。

entrypoint

コンテナ起動時に実行するコマンドを指定します。
redis-server に対して、volumes でマウントしたコンフィグファイルを指定して実行しています。



MariaDB の Dockerfile

FROM mariadb:10.1.12

COPY ./docker-entrypoint-initdb.d/* /docker-entrypoint-initdb.d/

VOLUME /etc/localtime:/etc/localtime:ro

RUN sed -i -e "s/\(\[mysqld\]\)/\1\ncharacter-set-server = utf8/g" /etc/mysql/my.cnf
RUN sed -i -e "s/\(\[client\]\)/\1\ndefault-character-set = utf8/g" /etc/mysql/my.cnf
RUN sed -i -e "s/\(\[mysqldump\]\)/\1\ndefault-character-set = utf8/g" /etc/mysql/my.cnf
RUN sed -i -e "s/\(\[mysql\]\)/\1\ndefault-character-set = utf8/g" /etc/mysql/my.cnf

RUN sed -i -e "s/^#bind-addresss*=s*0.0.0.0/bind-address=0.0.0.0/" /etc/mysql/my.cnf

FROM

mariadb イメージを利用しています。バージョン指定で 10.1.12 を利用。

COPY

事前に用意した configure.sh が入っているフォルダをコンテナ内へコピーしています。

VOLUME

時計をローカルに合わせています。
最後の「ro」は ReadOnly の略で読み取り専用にしてあります。

RUN

my.cnf に対して文字列痴漢を利用して設定変更を行っています。
上の4つは文字コードの設定、下は外部からの接続を許可するバインドアドレスの設定をしています。



Laravel と Nginx

次にLaravelとNginxの設定を行います。

設定するファイルはメインの docker-compose.yml です。
中身はこんな感じになっています。

version: '2'

services:

  php:
    build:
      context: server/docker/php
    volumes:
      - "${PWD}/data/php/develop:/var/www/html"
    environment:
      DB_HOST: db
      DB_PORT: 5432
      REDIS_HOST: redis
      REDIS_PORT: 6379

  nginx:
    build:
      context: server/docker/nginx
    ports:
      - "8080:80"
    links:
      - php

  db:
    extends:
      file: storage-compose.yml
      service: db
    expose:
     - "3306"

  redis:
    extends:
      file: storage-compose.yml
      service: redis
    expose:
     - "6379"

※新しく出てきたものだけ説明します。

Nginx

ports

外部からコンテナへのポートフォワードを設定します。
8080:80 と記述すると、コンテナのIPの 8080 ポートに対してアクセスが来たら
80 ポートにポートフォワードされるようになります。

links

他のコンテナとリンクします。
docker run コマンドで -lilnk を指定するのと同じです。

DB, Redis

extends

別の yml ファイルに設定されている内容を継承します。
file に指定するのが yml フィアルの名称で、service に指定するのがコンテナ名(サービス名)です。

expose

コンテナの指定ポートを外部へ公開する設定です。
80 を指定すると、外部からコンテナの 80 ポートへアクセスが可能になります。



Laravel の Dockerfile

FROM php:fpm
WORKDIR /var/www/html

FROM

php イメージの fpm を利用しています。
nginx でPHPを利用する場合はこの fpm バージョンが必要になります。

WORKDIR

コンテナにログインした時に最初に表示されるフォルダを指定します。



Nginx の Dockerfile

FROM nginx:1.9.12
ADD conf/default.conf /etc/nginx/conf.d

FROM

nginx イメージの 1.9.12 バージョンを利用しています。

ADD

事前に用意した nginx のコンフィグファイルを対象フォルダへコピーしています。




Nginx のコンフィグファイル

NginxとPHPのコンテナが別々なので、NginxへのアクセスをPHPコンテナへ流す必要がある。
そのためのNginxのコンフィグファイルはこんな感じで設定するとうまくいった。

server {
    listen       80 default;
    server_name  localhost;
    charset utf-8;
    root /var/www/html;

    #access_log /var/www/html/access.log;
    #error_log /var/www/html/error.log;

    access_log /dev/stdout;
    error_log  /dev/stdout;

    #rewrite ^(.+)/$ $1;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        root /var/www/html/public;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        #fastcgi_split_path_info ^(.+\.php)(.+)$;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
フォルダ構成

もう一度フォルダ構成を載せておきます。

.
├── data
│   └── php
├── docker-compose.yml
├── server
│   └── docker
│       ├── mariadb
│       │   ├── Dockerfile
│       │   └── docker-entrypoint-initdb.d
│       │       └── configure.sh
│       ├── nginx
│       │   ├── Dockerfile
│       │   └── conf
│       │       └── default.conf
│       ├── php
│       │   └── Dockerfile
│       └── redis
│           └── redis.conf
└── storage-compose.yml


この状態で、ルートフォルダにて下記コマンドを実行すると正常にサービスが起動するはずです。

$ docker-compose build
$ docker-compose up -d

$ docker ps -a
ONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
01121a809ee9        laravel_db          "/docker-entrypoint-i"   2 seconds ago       Up 1 seconds        3306/tcp                        laravel_db_1
80802a0855e4        laravel_nginx       "nginx -g 'daemon off"   2 seconds ago       Up 2 seconds        443/tcp, 0.0.0.0:8080->80/tcp   laravel_nginx_1
31004578e508        laravel_php         "php-fpm"                2 seconds ago       Up 2 seconds        9000/tcp                        laravel_php_1
5b4b17aa0840        redis:3.0.5         "redis-server /usr/lo"   3 seconds ago       Up 2 seconds        6379/tcp                        laravel_redis_1

ハマった点

・NginxコンテナからPHPコンテナへルーティングするための、Nginxの設定が難しかった。
・Laravelのstorageフォルダ、bootstrapフォルダに対して、777権限を与えないと動かなかった。
 (Laravelの公式ドキュメントに権限付与してくださいってちゃんと書いてあった・・・)


まとめ

・DockerComposeは一度設定すると次回から起動・停止が非常に楽にできて便利だが、
 最初の構築するまでにひたすらつまずきポイントがあり、かなり時間を食ってしまう。
・DockerComposeで環境構築をするときは、まずひとつ1つのコンテナをしっかりと構築していくとうまくいきやすい。

ChatWork Send To ALL

f:id:kabatin:20160331164017p:plain


ブログを始めて間も無いのにすでに数週間も間が開いてしまいました…。

今日はちょっと珍しいことをしたので記事を書きたいと思います。


みなさん、チャットワーク使ってますか?

きっといろいろな企業の方がチャットワークを使われていることと思います。

チャットワークは非常に便利なので私も公私ともに使っておりとても助かっています。


今回試したこと

チャットワークの[TO]ボタンを押すと開く宛先追加ポップアップで、「すべて選択」を押した際に
縦長に宛先がズラーッと並べられてしまうものを、もっと見やすくしよう!

ということにチャレンジしてみました。

Chrome Store「ChatWork Send To ALL」
chrome.google.com




本来であればこんな感じに…

[TO] ● 相手の名前1
[TO] ● 相手の名前2
[TO] ● 相手の名前3
[TO] ● 相手の名前4
[TO] ● 相手の名前5
    ・
    ・
    ・


縦長にズラーッと並んでしまうのですが、今回作成した「ChatWork Send To ALL」をインストールすると

こんな感じに横並びにズラーッと並ぶようになります。

[TO] ● [TO] ● [TO] ● [TO] ● [TO] ● ・・・


f:id:kabatin:20160331164950p:plain


メリット

・見た目がすっきりします。
・全員にTOを付けて送る敷居が下がります。
・全員にちゃんとPUSH通知が飛びます。


デメリット

・表示がシンプルになったせいで乱用される可能性が増えた。
・従来の「すべて選択」機能を上書いているので、従来のまま使いたくなったらアンインストールが必要


まとめ

自分の所属する会社で実際に公開してみたところ、意外にも需要があった。
見た目がシンプルになるのはとても重要なことだと思う。

同じような不満を抱えている方は是非使ってみてください。

DockerのUbuntuコンテナにScala開発環境を構築

この記事を書くに至った動機

エンジニアにはあるあるですが環境構築途中で失敗して、一度削除してまたいちから作成する時に調べ直さなくてもいいように手順を記録していきたいと思います。
(もうすでに1回やり直してます。。)

環境構築の手順

・ベースとなる Ubuntu コンテナの作成
・Redisサーバのインストール
MySQLサーバのインストール
JDK 8 のインストール
・Play Framework (Activator) のインストール
・新規プロジェクトの作成
・アプリケーションの起動
・ブラウザからアクセスして確認
・コンテナの保存
・ポートフォワード設定をして実行
・再度ブラウザからアクセスして確認


かなり長い道のりで、おそらくすんなりいかずに1日がかりの作業になると思いますが
頑張ってベースとなる開発環境構築の手順をお伝えできたらと思います。


Ubuntu コンテナの作成

まずは空の Ubuntu コンテナを作成します。
タグは「Trusty」を使います。

$ docker run -it --name develop ubuntu:trusty /bin/bash


すぐに exit してコンテナが正しく作成されたかを確認してみます。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0309d0f2f1bd        ubuntu:trusty       "/bin/bash"         5 minutes ago       Up 5 minutes                            develop


正常にコンテナが作成されていることを確認したら再度コンテナに入ります。

$ docker exec -it develop /bin/bash

Redisサーバのインストール

とりあえずホームディレクトリに移動したのち、「redis-server」をインストールしたいと思います。

$ cd ~
$ apt-get update
$ apt-get install -y redis-server


少し待つとインストールが完了します。
早速Redisサーバを起動しておきしょう。
正しく起動したかどうかの確認も忘れずに。

$ service redis-server start
Starting redis-server: redis-server.

$ps -ef | grep redis
redis      209     1  0 05:45 ?        00:00:00 /usr/bin/redis-server 127.0.0.1:6379       
root       213    46  0 05:45 ?        00:00:00 grep --color=auto redis

MySQLサーバのインストール

次はMySQLのインストールです。
インストール時に root ユーザのパスワード入力を求められるので入力します。

$ apt-get install -y mysql-server

少し待つとインストールが完了します。
こちらも忘れずにMySQLサーバを起動しておきましょう。

$ service mysql start
 * Starting MySQL database server mysqld                              [ OK ]
 * Checking for tables which need an upgrade, are corrupt or were 
not closed cleanly.

$ps -ef | grep redis
root       754     1  0 05:48 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql     1101   754  0 05:48 ?        00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root      1265    46  0 05:49 ?        00:00:00 grep --color=auto mysql

JDK 8 のインストール

次はJavaをインストールします。
Play Framework を利用するにはJDK8以上が必要なようです。

Ubuntu 14.04 では公式リポジトリに JDK8 が用意されていないとのこと。
サードパーティ製のリポジトリを追加してインストール必要があります。
そこで登場するのが「add-apt-repository」ですが、空のUbuntuにはこれすらもありません。
まずは使えるように設定をします。

$ apt-get install -y apt-file
$ apt-file update
$ apt-file search add-apt-repository


検索して見つかったリポジトリをインストールします。

$ apt-get install software-properties-common


ここまでやるとやっと「add-apt-repository」が使えるようになります。
アップデートを忘れずに実行し、続けて JDK8 をインストールします。

$ apt-add-repository ppa:openjdk-r/ppa
$ apt-get update
$ apt-get install -y openjdk-8-jdk


しばらく待つとインストールが完了するので、バージョンを確認してみます。

$ java -version
openjdk version "1.8.0_72-internal"
OpenJDK Runtime Environment (build 1.8.0_72-internal-b15)
OpenJDK 64-Bit Server VM (build 25.72-b15, mixed mode)

$javac -version
javac 1.8.0_72-internal

Play Framework (Activator) のインストール

最後に Scala の Framework である、Play Framework をインストールします。
まずは下記のサイトで配布されている Activator という zip ファイルを wget で取得します。
2016年2月25日時点での最新版は Play 2.4.6 / Activator 1.3.7 のようです。
https://www.playframework.com/download


wget が使えない場合は、wget を先にインストールします。

$ apt-get install -y wget


適当なフォルダ(今回はActivator)を作成し、先ほどの zip ファイルをダウンロードします。

$ mkdir Activator
$ cd Activator
$ wget https://downloads.typesafe.com/typesafe-activator/1.3.7/typesafe-activator-1.3.7-minimal.zip


ダウンロードが完了したら zip ファイルを解凍します。
解凍するには unzip コマンドを使いますが、例に漏れずこれもインストールが必要です。

$ apt-get install -y unzip


unzip のインストールができたら早速ダウンロードした zip ファイルを解凍します。

$ unzip typesafe-activator-1.3.7-minimal.zip


一瞬で解凍が終わりますが、解凍した後はフォルダが1つ作成されていると思います。

$ ls -al
drwxr-xr-x 3 root root    4096 Feb 25 06:18 ./
drwx------ 3 root root    4096 Feb 25 06:13 ../
drwxr-xr-x 2 root root    4096 Dec  2 20:27 activator-1.3.7-minimal/
-rw-r--r-- 1 root root 1056830 Dec  3 01:28 typesafe-activator-1.3.7-minimal.zip


中に入って内容を確認してみます。

$ cd activator-1.3.7-minimal
$ ls -al
drwxr-xr-x 2 root root    4096 Dec  2 20:27 .
drwxr-xr-x 3 root root    4096 Feb 25 06:18 ..
-rwxr--r-- 1 root root    9507 Dec  2 20:27 activator
-rw-r--r-- 1 root root 1213545 Dec  2 20:27 activator-launch-1.3.7.jar
-rwxr--r-- 1 root root    7342 Dec  2 20:27 activator.bat


この activator というファイルは今後よく使うことになるためパスを通しておきます。

$ pwd
/root/Activator/activator-1.3.7-minimal

$ env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

$ export PATH=$PATH:/root/Activator/activator-1.3.7-minimal
$ env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/Activator/activator-1.3.7-minimal

こんな感じになったかと思います。
これでいつでもどこでも activator コマンドが利用できます。

新規プロジェクトの作成

新しくプロジェクトを作成するのはコマンドひとつで行えます。
まずはプロジェクト用のフォルダを作成して、その中で「activator new」コマンドを実行します。
※初回実行時のみいろいろインストールされるので非常に時間がかかります。コーヒーでも飲みながら気長に待ちましょう。

$ mkdir sampleapp
$ cd sampleapp
$ activator new <appname(省略可)> <apptype(省略可)>
# ひとまずは「activator new」のみで実行してみてください


事前ダウンロードなどが終わると以下のような画面が出てくると思います。

Browse the list of templates: http://typesafe.com/activator/templates
Choose from these featured templates or enter a template name:
  1) minimal-akka-java-seed
  2) minimal-akka-scala-seed
  3) minimal-java
  4) minimal-scala
  5) play-java
  6) play-scala
(hit tab to see a list of all templates)


今回は Scala を利用するので「play-scala」と入力してリターンキーを押します。
するとさらに今度はアプリケーションの名前の入力を求められます。
好きな名前を入力しましょう。未入力時は「play-scala」が設定されるようです。

> play-scala
Enter a name for your application (just press enter for 'play-scala')

> sampleapp
OK, application "sampleapp" is being created using the "play-scala" template.

To run "sampleapp" from the command line, "cd sampleapp" then:
/root/Activator/sampleapp/sampleapp/activator run

To run the test for "sampleapp" from the command line, "cd sampleapp" then:
/root/Activator/sampleapp/sampleapp/activator test

To run the Activator UI for "sampleapp" from the command line, "cd sampleapp" then:
/root/Activator/sampleapp/sampleapp/activator ui


こんなメッセージが表示されたらプロジェクトファイル群がすでに作成されています。
アプリケーション名で新たにフォルダが作成されているので、構成を見てみましょう。

$ cd sampleapp
$ ls -al
-rw-r--r-- 1 root root     591 Feb 25 06:34 LICENSE
-rw-r--r-- 1 root root     148 Feb 25 06:34 README
-rwxr--r-- 1 root root    9507 Feb 25 06:34 activator
-rw-r--r-- 1 root root 1213545 Feb 25 06:34 activator-launch-1.3.7.jar
-rwxr--r-- 1 root root    7342 Feb 25 06:34 activator.bat
drwxr-xr-x 4 root root    4096 Feb 25 06:34 app
-rw-r--r-- 1 root root     472 Feb 25 06:34 build.sbt
drwxr-xr-x 2 root root    4096 Feb 25 06:34 conf
drwxr-xr-x 2 root root    4096 Feb 25 06:34 project
drwxr-xr-x 5 root root    4096 Feb 25 06:34 public
drwxr-xr-x 2 root root    4096 Feb 25 06:34 test

これがデフォルト状態(空状態)のプロジェクトファイル構成になります。
ここら辺については Play Framework のチュートリアルやドキュメントで詳しく書かれていますのでそちらを参照してみてください。


アプリケーションの起動

作成した空のアプリケーションを実行してみたいと思います。
実行時にも「activator run」コマンドを利用します。
アプリケーション作成時同様、初回のみいろいろダウンロードしたりチェックが行われたりして非常に時間がかかりますので大人しく待ちましょう。

$ activator run
・
・
・
--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

こんな表示が出たら見事アプリケーションの起動に成功です!!
おめでとうございます!!


ブラウザからアクセスして確認

アプリケーションが起動したら、実際に見てみたいですよね?
というわけで、早速ブラウザからアクセスしてページを表示してみましょう!

VM環境のIPアドレスとポート番号9000を入力してリターン!

f:id:kabatin:20160225162336p:plain


残念つながりませんでした・・・。
でもこれ、当然繋がらなくて当たり前ですよね。

最初にコンテナを起動するときにポートフォワード設定をせずに起動していますから。
コンテナの9000番ポートに対してアクセスするには一度コンテナから抜けて、コンテナ起動時に9000番ポートに対してポートフォワード設定を指定する必要があります。


が、ここで問題が・・・。

ポートフォワード指定は「docker run」コマンド実行時しかできないため、一度コンテナを削除する必要があります。
ここまで数時間かけて作ってきたコンテナを破棄するなんて…。

ということでコンテナを削除する前にここまで設定したコンテナを保存したいと思います。


コンテナの保存

一度コンテナから抜けるために exit して、以下のコマンドを実行します。

$ docker commit -m "ここにコメントが書けます" <Image Id> <Image Name>

$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
develop                     latest              8c7f1c246564        26 seconds ago      1.192 GB

無事にイメージとして保存することができました。


ポートフォワード設定をして実行

develop コンテナを本当に削除して作り直してもいいんですが、ビビリな僕は残したまま別コンテナとして立ち上げることにします。
コンテナ名を「develop9000」、イメージはさっき自分で作成した「develop」イメージを利用します。

$ docker run -it -p 9000:9000 --name develop9000 develop /bin/bash

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                     PORTS               NAMES
9ca7253918d2        develop:latest      "/bin/bash"         About a minute ago   Exited (0) 3 seconds ago                       develop9000         
0309d0f2f1bd        ubuntu:trusty       "/bin/bash"         4 hours ago          Exited (0) 2 hours ago                         develop             

無事に起動されました。
それでは、前の手順に合わせて sampleapp を実行してブラウザで確認してみたいと思います。
まずは作成したコンテナへ入ります。

$ docker start develop9000
$ docker exec -it develop9000 /bin/bash

プロジェクトがあるフォルダへ移動して「activator run」コマンドを実行します。
コンテナを一度抜けるとパス設定が元に戻っていたようなので再度設定しておきます。

$ export PATH=$PATH:/root/Activator/activator-1.3.7-minimal
$ cd /root/Activator/sampleapp/sampleapp
$ activator run
[info] Loading project definition from /root/Activator/sampleapp/sampleapp/project
[info] Set current project to sampleapp (in build file:/root/Activator/sampleapp/sampleapp/)

--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

今回は2回目の実行なので初回に比べたらはるかに早く起動しました。


再度ブラウザからアクセスして確認

それではブラウザから再度アクセスしてみましょう…。
f:id:kabatin:20160225192004p:plain

やったーーー!!
やっとページが表示されました!!!

ようやくベースとなる開発環境が出来上がったかな…?
これから Redis や MySQL とかの設定したり、Scala で RestfulAPI の作り方を調べたりとやること満載ですが、ひとまずの導入としてはここまでにしておきたいと思います!


長くなってしまいましたが、少しでもみなさまのお役に立てることを願って…

VirtualBoxのディスク容量を拡張する

f:id:kabatin:20160222191347j:plain

VirtualBoxで作業をしていると、想定よりディスクを使用してしまい容量不足になることがあると思います。
作業内容そのままでディスク容量を拡張する手順を残しておきたいと思います。


ディスク容量拡張の手順

・新規ディスクを追加する
・コマンドでHDDをクローンする
・古いディスクをアンマウント
VM上でパーティション調整(BIOS作業)


僕は MacOSX にて作業しています。
それでは早速始めていきたいと思います。


新規ディスクを追加する

まず対象VMの設定画面からストレージメニューを開きます。
f:id:kabatin:20160225172630p:plain


ストレージ一覧の右側にあるディスクの+マークを押します。
デフォルト選択が既存ディスクになっていますが間違えないように「新規ディスクの作成(N)」を押します。
f:id:kabatin:20160225172701p:plain


するとハードディスクのタイプ選択が求められるので前とVDIを選択して進めます。
f:id:kabatin:20160225172826p:plain


ディスクのサイズについては好きな方を選択してください。
ちなみに固定サイズの方が少しだけ速度が速くなるようです。
f:id:kabatin:20160225172835p:plain


最後にディスクの名前と容量を決めたら「作成」ボタンを押します。
注意点としては既存のディスクよりも大きい容量にするようにしましょう。
そうしないとこの後行うディスクのクローン作業がおかしくなると思います(^^;
f:id:kabatin:20160225172956p:plain


新しいディスクが作成されました。
f:id:kabatin:20160225173102p:plain


コマンドでHDDをクローンする

ストレージを選択すると右側にファイルパスが表示されると思います。
ターミナルを開き、この VDI ファイルが置いてあるところまで移動しましょう。
f:id:kabatin:20160225173102p:plain


移動したら下記のコマンドを実行してディスクのコピーを行います。
パーセンテージが表示され、100% になれば完了です。

$ VBoxManage clonehd --existing "Ubuntu 14.04 LTS.vdi" "New Ubuntu 14.04.vdi"
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'VDI'. UUID: 4cc3e925-****-4d78-****-5abfe3e36cf8

古いディスクをアンマウント

無事にディスクのコピーが終わったら、起動させるディスクを変更します。
先ほどのストレージ設定画面で古いディスクを削除します。
削除といっても設定が削除されるだけで物理的にはファイルとして残っていますので安心してください。
古いディスクを選択して下部にあるディスクの「ー」ボタンを押すと削除が完了します。

最終的にはこんな感じになると思います。
f:id:kabatin:20160225173944p:plain

ここまででディスクの差し替えは完了です。


VM上でパーティション調整(BIOS作業)

パーティションの調整は BIOS 上で行う必要があります。
まず下記のサイトで GParted パーティション編集ツールのイメージファイルをダウンロードします。

GParted Live CD/USB/HD/PXE Bootable Image の Stable Releases にある iso ファイルをダウンロードします。
2016年2月25日時点での最新版は「Download gparted-live-0.25.0-3-i686.iso」のようです。

http://gparted.org/download.php


ダウンロードしたら、パーティションを変更したい VM の設定画面を開きストレージメニューを開きます。
CD設定部分へ先ほどダウンロードしたイメージファイルを設定して IDE プライマリマスターに設定します。
f:id:kabatin:20160225184333p:plain


その状態で VM を起動すると BIOS 上で GParted が立ち上がります。
項目2つ目の「Other modes of GParted Live」を選択します。
f:id:kabatin:20160225184612p:plain


次は一番上の「GParted Live (Default settings, KMS)」を選択します。
f:id:kabatin:20160225184638p:plain


keymap について質問されますが、「Don't touch keymap」を選択したままエンターを押します。
f:id:kabatin:20160225184727p:plain


次に言語設定を聞かれるため、「Japan」の 15 を入力してエンターを押します。
f:id:kabatin:20160225184759p:plain


最後にモードを聞かれますが、何も入力しなくても大丈夫なのでそのままエンターを押します。
f:id:kabatin:20160225184824p:plain



こんな画面が起動します。
f:id:kabatin:20160225185220p:plain


実はこの画面…
もうパーティション設定が終わった状態です。
途中のキャプチャを撮るのを完全に忘れていました。。

というわけで、足りない部分は言葉で説明しながら手順を紹介したいと思います!



構成として、まずメインストレージ領域があり、次に linux-swap 領域、最後に未割り当て領域になっていると思います。
この状態のままだと後方に空き領域がなく、メインストレージの領域を拡張することができません。

そのためまず最初に linux-swap 領域を大胆に削除します。
f:id:kabatin:20160225185439p:plain


次にその親の領域も削除します。
f:id:kabatin:20160225185516p:plain


メインストレージである /dev/sda1 以降に未割り当て領域しかない状態になりました!
この状態で /dev/sda1 のリサイズ作業を行います。
f:id:kabatin:20160225185607p:plain


後方に 2GB ほどの領域を残した状態で、好きなサイズまで拡張していきます。
設定が終わったら「リサイズ/移動」ボタンで確定させます。


次に先ほど消してしまった linux-swap 領域をもう一度設定します。
まずは未割り当て領域全てを拡張領域として追加します。
未割り当て領域を右クリックして「New」を選択します。
f:id:kabatin:20160225185812p:plain


種類のところを「拡張パーティション」に設定して「Add」ボタンを押します。
f:id:kabatin:20160225185926p:plain


こんな感じになったと思います。
f:id:kabatin:20160225185945p:plain


これで新規パーティション#1 の配下に未割り当て領域が移動したと思います。
この状態から未割り当て領域を右クリックし、さらに「New」で linux-swap 領域を作っていきます。
ファイルシステムのところを「linux-swap」に変更して「Add」ボタンを押します。
こちらは「論理パーティション」で大丈夫です。
f:id:kabatin:20160225190136p:plain


こんな感じになりました。
これでパーティションの設定自体は完了です。
f:id:kabatin:20160225190157p:plain


「Apply」ボタンを押して設定したパーティションを確定させましょう!

これでパーティション設定は全て完了です。
VM をシャットダウンし、先ほど設定していた CD ブートからイメージファイルを取り出して再起動すれば無事にディスク容量が増えていると思います。

早速ログインして容量を確認してみます。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        14G  5.4G  7.6G  42% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            991M   12K  991M   1% /dev
tmpfs           201M  900K  200M   1% /run
none            5.0M  4.0K  5.0M   1% /run/lock
none           1002M   72K 1001M   1% /run/shm
none            100M   28K  100M   1% /run/user

空き領域がだいぶ増えていますね!
同じような状況の方の参考に少しでもなれば幸いですm(_ _)m