# はやりに乗って、Boxen止めてBrewfile+brew-caskにした
元ネタです。
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
travisでgithub連携をして、travisで使うリポジトリ選択画面がでるので、選択する 僕の場合はtravis_nodeを選択してます。
https://travis-ci.org/shinofara/travis_node こんな感じになれば、せいこう!
いつもどおりざっくり導入手順でした
# jenkinsでのunitテストは、dockerでクリーン環境を作って行おう
準備
docker
jenkins
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を使う
めんどくなくなってた。。。
# 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も複雑な手順踏まなくていいという分いいかもしれない あとは、キャッシュとか色々調べてからになるけど