Technofara

Golangエンジニア!仕事で必要になって勉強した事とか、新しい事とか色々まとめたりを緩くやります。技術系と思考系だけにしておきます、

# はやりに乗って、Boxen止めてBrewfile+brew-caskにした

元ネタです。

brew

boxenは色々不便だったりした、rubyのversionで引っかかったり、、まぁ組織で管理しないなら、boxenのメリットは弱いかなと

Brewfileのいいところ

  • Brewfileファイルにインストールしたいパッケージを書く
  • homebrewさえあればOK

Boxenを消す

リンク貼ってたりして、邪魔なのでバイバイ

script/nuke --all --force

Homebrewを入れる

Homebrew公式サイトにも書いてるけど、以下のコマンドを実行して、Homebrewを入れるよ

ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

Brewfileを書くよ

まずはじめに、brewだけでできる事

$ cat Brewfile
update
install wget

実行

$ brew bundle

実行すると色々やってくれます。 ええ色々 終わったらwgetが使えるはずです

brew以外のパッケージも入れれるよ

このままだと結局brew installで入れれる物だけなの?って感じですが brew-caskを入れると、chromeとかもいけます

tap phinze/homebrew-cask
install brew-cask
cask install google-chrome

を書いて実行すると /usr/local/Library/Taps以下にクローンされて /usr/local/Library/Formula以下にシンボリックリンクが作られる。

移行中なので、とりあえずこんな感じで

# update Homebrew
update

install tree
install wget
install fontforge
install mycrpt
install tmux

tap phinze/homebrew-cask
install brew-cask
cask install firefox
cask install google-chrome
cask install skitch
cask install evernote
cask install sublime-text
cask install virtualbox
cask install vagrant

他zipパッケージとかも入れれるみたいだけど、それはまた今度

# あのC拡張で書かれた超高速なPHPフレームラークPhalconに2.0.0が!!

前々から気づいてたけど、手をつけてなかったphalconを使い始めました!

Phalcon は、ハイパフォーマンス で少ないリソース消費のC拡張として実装されたWebフレームワークを提供します

と、公式サイトに書かれているがタシカニ早い さすが、C拡張で書かれて、PHPのコードが一つもない PHPフレームワーク

Tutorial - Creating a Poll application in 15 minutes with Phalcon from Phalcon Framework on Vimeo.

入れてみたけど、タシカニ早いです! 今度パフォーマンス計測してみたいです

更に、phalconは現在v1なのですが、 githubで2.0.0が公開されています。

今はossとして公開して、version up中なのかな

phalcon 2.0.0導入手順は

git clone https://github.com/phalcon/cphalcon.git
git checkout 2.0.0
cd ext
sudo ./install-test

です。

色々触ってみようー

CI導入したいけど、構築とかてまやん?それならTravisCI

nodejsで何かを作ってて、jasmine-nodeで、テストをかいてたりしませんか? しますよね?

サンプルではそんな状況だと仮定して node 0.7 ~ 0.11までを使いCIテストを行いたいと思います。

なぜ、CIを使うのか?とかは今回はスルー

余り纏める時間がないので、nodejs環境構築済み、jasmine-node導入済み前提でいきます!!

package.jsonは以下の様に

{
  "name": "travis_node",
  "version": "1.0.2",
  "main": "index.js",
  "scripts": {
    "test": "node --harmony ./node_modules/jasmine-node/bin/jasmine-node spec"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/shinofara/travis_node.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/shinofara/travis_node/issues"
  },
  "homepage": "https://github.com/shinofara/travis_node",
  "dependencies": {
    "jasmine-node": "~1.13.1"
  },
  "devDependencies": {},
  "directories": {
    "test": "test"
  }
}

もう見覚えありますよね travis化する為にやったことと言えば

node --harmony ./node_modules/jasmine-node/bin/jasmine-node spec

というコマンドを

npm test

で実行出来るようにする為に

  "scripts": {
    "test": "node --harmony ./node_modules/jasmine-node/bin/jasmine-node spec"
  },

と書いたくらいですかね

ここまで来たら、あとはtravis用の設定を書く!!

ファイル名は、 .travis.yml で、内容は

language: node_js
node_js:
  - "0.11"
  - "0.10"
  - "0.8"
  - "0.6"

意味としては、node_jsを使います nodejsのテストを行うversionは0.6,8,10,11で行います

これで、準備は完了ですあとは、 githubのpublicリポジトリを作成して https://github.com/shinofara/travis_node

travisgithub連携をして、travisで使うリポジトリ選択画面がでるので、選択する 僕の場合はtravis_nodeを選択してます。

https://travis-ci.org/shinofara/travis_node こんな感じになれば、せいこう!

いつもどおりざっくり導入手順でした

# jenkinsでのunitテストは、dockerでクリーン環境を作って行おう

準備

docker

dockerに関してはこちら(導入手順もあります)

jenkins

jenkins構築に関してはこちら(centos編)

jenkinsがdockerを利用するために、グループ追加

sudo gpasswd -a jenkins docker

CI用Dockerの環境定義

Dockerfileで環境定義

# cat Dockerfile 
FROM centos

RUN yum install -y git man
# NVM インストール
RUN git clone --depth 1 https://github.com/creationix/nvm.git ~/.nvm

# nodejs インストール
RUN bash -c ". /.nvm/nvm.sh; nvm install 0.10"

# スクリプト実行ユーザの作成
RUN useradd -u 45678 -s /bin/bash -m worker

# ワークスペースのマウント先を作成
RUN mkdir /workspace

ENTRYPOINT ["/bin/bash", "-c"]

jenkinsのjob作成

新規job作成

ジョブ名を今回は「docker_test」と入力して、フリースタイルを選択

jobの設定内容

ビルド->シェルの実行を選択して、以下を記述

#job名をIMAGEに保存
IMAGE=$JOB_NAME

#dockerで作成するときのimage名定義
#ワークスペースをjenkinsのワークスペースに設定
docker build -t $IMAGE $WORKSPACE
docker run -v $WORKSPACE:/workspace -w /workspace $IMAGE "$(cat <<EOL
source ~/.nvm/nvm.sh
nvm use 0.10
npm install jasmine-node -g
jasmine-node --junitreport --output junit-reports/ spec
EOL
)"

#nvmを読み込み
#nvm0.10を使用
#jasmine-nodeをglobalでインストール
#jasmineでjsのunitテストを実行
# - --junitreportでjunit形式のレポートを出力する
# - --outputでレポート出力先をjunit-reportsに設定
# specディレクトリ以下のspecを実行

ビルド後の処理

JUnitテスト結果の集計

junit-reports/*xml

ワークスペースにサンプルでテストを作成する

テスト対象のjsを作成

# cat lib/stylist.js 
var Stylist, exports;
Stylist = (function() {
  function Stylist() {}
  Stylist.prototype.styles = {};
  Stylist.prototype.decorate = function(target, options) {
    var key, value, _ref;
    if (!target) {
      return this.styles[options.style];
    }
    _ref = this.styles[options.style];
    for (key in _ref) {
      value = _ref[key];
      if (options.override || !target[key]) {
        target[key] = value;
      }
    }
    return target;
  };
  return Stylist;
})();
if (!exports) {
  exports = {};
}
exports.Stylist = Stylist;

specを作成

# cat spec/stylist_spec.js 
var Stylist = require('lib/stylist').Stylist;
 
describe('Stylist', function() {
  beforeEach(function() {
    this.stylist = new Stylist;
    this.stylist.styles["normal"] = {
      width: '50',
      height: '100'
    };
    this.stylist.styles["double height"] = {
      width: '50',
      height: '200'
    };
  });
  describe('オブジェクトをデコレートした場合', function() {
    it('オブジェクトに指定されたスタイルを付与すること', function() {
      var obj = { name: 'マネキン' };
      this.stylist.decorate(obj, {
        style: "double height"
      });
      expect(obj.width).toEqual('51');
      expect(obj.height).toEqual('200');
      expect(obj.name).toEqual('マネキン');
    });
    describe('オブジェクトにスタイルと同名のプロパティがあった場合', function() {
      it('プロパティを上書きしないこと', function() {
        var obj = {
          name: 'マネキン',
          width: '1000'
        };
        this.stylist.decorate(obj, {
          style: "double height"
        });
        expect(obj.width).toEqual('1000');
        expect(obj.height).toEqual('200');
        expect(obj.name).toEqual('マネキン');
      });
      it('上書きフラグが立っていればプロパティを上書きすること', function() {
        var obj = {
          name: 'マネキン',
          width: '1000'
        };
        this.stylist.decorate(obj, {
          style: "normal",
          override: true
        });
        expect(obj.width).toEqual('50');
        expect(obj.name).toEqual('マネキン');
      });
    });
  });
});

これで、jenkins,docker,js,unitテストの準備が完了!

jenkinsでjobを実行

http://localhost:8080/job/docker_test/ を開いて、左カラムのビルド実行を押下 するとテストが走ります。 左下に結果が表示されます。

おわりに

今回は、ワークスペースにjs,unit testファイルを事前に準備しましたが gitrepositoryを定義して、jobが走るごとに、checkoutしてきて テストする。とすると なんかCIぽくなります

今回は、dockerを使って、テストをするまでだったので そういったところは、省きましたが次回、テスト部分をもっと書いていきたいです。

# jenkins使いたいけど、、入れるのめんどう。。だったんですが

yumで入れれるんです!

事前準備

java 1.6以上が必要なので入れます。

sudo yum install -y java-1.6.0-openjdk.x86_64
sudo yum install -y java-1.6.0-openjdk-devel.x86_64

java確認

# java -version
java version "1.6.0_30"
OpenJDK Runtime Environment (IcedTea6 1.13.1) (rhel-3.1.13.1.el6_5-x86_64)
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)

jenkins準備〜起動

jenkins準備

$ wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ yum install -y jenkins

jenkins起動

$ service jenkins start

jenkinsを使う

http://localhost:8080/

めんどくなくなってた。。。

# laravelを使って二日目で覚えたコマンドを書き出してみた。

ちなみに、二日目で知ったけど ららべるって読むんですね。

覚えたコマンド

コマンド一覧を表示

$ php artisan

app/config/app.phpのパスコードをランダム生成

php artisan key:generate

nginx,fpmがなくても、serverを立ち上げて確認できる!

$ php artisan serve
Laravel development server started on http://localhost:8000

controller:makeはControllerを作る

などなど書き出すと多いことに気づいたので、おいおいで migrateとかは特に

どうでもいいメモでした

# laravelのORMとMIGRATEを触ってみた。

とりあえずは、公式のチュートリアルを参考に

-> http://laravel.com/docs/quick

まずは、Mysqlに対してのMIGRATEなど

テーブルを作成してみよう

プロジェクトディレクトリ以下まで移動してから、色々やっていきます。

php artisan migrate:make create_users_table

create_users_tableってクラスのファイルを作る!

app/database/migrations以下にファイルが

$ ls -la app/database/migrations
drwxr-xr-x 2 schoo wheel 4096 Jan 30 14:36 .
drwxr-xr-x 4 schoo wheel 4096 Jan 29 17:36 ..
-rw-r--r-- 1 schoo wheel    0 Jan 29 17:36 .gitkeep
-rw-r--r-- 1 root  root   598 Jan 30 14:27 2014_01_29_164142_create_users_table.php

年月日と時間がファイル名の先頭についてる

早速編集してみます

<?php

use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration {

        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('users', function($table)
            {
                $table->increments('id');
                $table->string('email')->unique();
                $table->string('name');
                $table->timestamps();
            });
        }

        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::drop('users');
        }

}

upにはmigrate実行時に走る処理を downにはrollback時に走る処理を

準備が出来たので、早速実行してみます。

$ php artisan migrate

完了したので、mysqlを確認してみます。

mysql> desc users;
+------------+------------------+------+-----+---------------------+----------------+
| Field      | Type             | Null | Key | Default             | Extra          |
+------------+------------------+------+-----+---------------------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| email      | varchar(255)     | NO   | UNI | NULL                |                |
| name       | varchar(255)     | NO   |     | NULL                |                |
| created_at | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| updated_at | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
+------------+------------------+------+-----+---------------------+----------------+

お、できてる!

カラム追加してみよう

次は、カラムの追加をしてみます。

$ php artisan migrate:make modify_users_table

今回もapp/database/migrations以下にファイルができています。 僕の場合は、2014_01_30_052837_modify_users_table.php

早速編集

public function up()
{
    Schema::table('users', function($table)
    {
        $table->string('company');
    });
        //
}
public function down()
{
        //
}

usersテーブルに、varcharでcompanyを作成する。

$ php artisan migrate
mysql> desc users;
+------------+------------------+------+-----+---------------------+----------------+
| Field      | Type             | Null | Key | Default             | Extra          |
+------------+------------------+------+-----+---------------------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| email      | varchar(255)     | NO   | UNI | NULL                |                |
| name       | varchar(255)     | NO   |     | NULL                |                |
| created_at | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| updated_at | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| company    | varchar(255)     | NO   |     | NULL                |                |
+------------+------------------+------+-----+---------------------+----------------+

追加された。

消してみよう

最後は、消してみてみましょう

$ php artisan migrate:make delete_company_users_table

今回もapp/database/migrations以下にファイルができています。 僕の場合は、2014_01_30_053153_delete_company_users_table.php

早速編集

public function up()
{
    Schema::table('users', function($table)
    {
        $table->dropColumn('company');
    });
        //
}
public function down()
{
    Schema::table('users', function($table)
    {
        $table->string('company');
    });
        //
}

実行

$ php artisan migrate

確認

mysql> desc users;
+------------+------------------+------+-----+---------------------+----------------+
| Field      | Type             | Null | Key | Default             | Extra          |
+------------+------------------+------+-----+---------------------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| email      | varchar(255)     | NO   | UNI | NULL                |                |
| name       | varchar(255)     | NO   |     | NULL                |                |
| created_at | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| updated_at | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
+------------+------------------+------+-----+---------------------+----------------+

結構使い勝手がいいかんじです!

そのたコマンド

http://laravel.com/docs/schema

次はORM

実は、上の手順を全て行っていると app/models/User.php

というファイルが作成されていますので、今回は Controller、View、Routeファイルだけ触ります。

Controllerを作ってみる

app/controllers/UserController.php

<?php

class UserController extends BaseController {

        public function showUsers()
        {
                //users全件取得
                $users = User::all();
                //usersという名前で、view tenplateに渡しますよ
                return View::make('users')->with('users', $users);
        }

}

これだけです。

次は、viewテンプレート

今回の内容では、不要ですがレイアウトファイルを作ります

$ vim app/views/layout.blade.php
<html>
    <body>
        <h1>Laravel Quickstart</h1>

        @yield('content')
    </body>
</html>

レイアウトファイル、テンプレートの使い方に関しては、今回は省略(というより、調べてない。。)

次テンプレート

$ vim app/views/users.blade.php
@extends('layout')

@section('content')
    @foreach($users as $user)
        <p>{{ $user->name }} {{ $user->email }}</p>
    @endforeach
@stop

レイアウトに、contentセクションにforeachなどなど展開する。 foreachの箇所で、Controllerで定義したusersを使用しています。 これでテンプレートも完了

あとは、リクエストに対応する為、routeファイルを編集するだけ

$ vim app/routes.php 
Route::get('users', 'UserController@showUsers');

これであとは、ブラウザから http://....../usersとアクセスするそれだけ

ORMもDBMIGRATEも複雑な手順踏まなくていいという分いいかもしれない あとは、キャッシュとか色々調べてからになるけど