終電23時11分って早くね?

都内のIT企業で働くカラオケ大好きエンジニアの雑記

【Laravel Practice01】デプロイサーバー、Webサーバー、DBサーバーの準備

f:id:blue_goheimochi:20160622231431p:plain

Laravelを勉強するにあたって、色々な方面にも興味が出てしまったので、
Laravelアプリケーションを動かすためのサーバー環境構築とか含めて色々やってみようと思ったのでログとして残してみます。

今のところですが、画像のような感じで、

  • デプロイサーバー
  • Webサーバー
  • DBサーバー

を用意して、

  • 各サーバーはAnsibleでプロビジョニングする
  • デプロイサーバーからlaravel/envoyでデプロイする
  • サンプルのLaravelアプリケーションを作る

っていうところまではできたらいいなと思っています。
デプロイは他のツールも試してみたいなぁ。
とりあえずローカルにVirtualBoxVagrantで仮想環境を立ててやってみます。

デプロイサーバー、Webサーバー、DBサーバーの準備

ローカルにVirtualBoxVagrantでCentOS7の仮想環境を3台用意します。
VirtualboxVagrantは各自ご用意ください。
ちなみに私はWindows環境ですが、Chocolateyというソフト(Macでいうbrewみたいなやつ)でインストールしてます。簡単。

Vagrantfile

github.com

こちらのコミットをご覧ください。
3つのサーバーを起動するだけのVagrantfileになっております。
README.mdにも書きましたが、

$ git clone https://github.com/blue-goheimochi/laravel-servers.git
$ cd laravel-server
$ vagrant up

で、3つのサーバーをすべて起動する事ができます。

サーバーの定義
config.vm.define "deploy" do |server|
~~~~~~
end

config.vm.define "web" do |server|
~~~~~~
end

config.vm.define "db" do |server|
~~~~~~
end

と、Vagrantfileに記述することで複数のサーバーを定義できます。
deploywebdbという名前を設定しています。

個別にサーバーを起動したい場合は、

$ vagrant up deploy

のように、定義した名前をvagrant up [名前]とつけることで個別に起動できます。

Boxファイルの指定

各サーバーで同じBoxファイルを指定しています。

今回はbento/centos-7.1というBoxを使います。
CentOS7のBoxファイルです。

server.vm.box = "bento/centos-7.1"

【参考】bentoプロジェクトのBoxファイル一覧
bento | Atlas by HashiCorp
chef社が正式にサポートしているbentoというプロジェクトのBoxのようです。
多分安心して使っていいはず・・・!
色々なディストリビューションがそろってます。

IPアドレスの指定

IPアドレスは各サーバー別々のものを指定します。
すでに仮想サーバーがローカルに存在する場合は、それともかぶらないIPアドレスを指定しましょう。

server.vm.network "private_network", ip: "192.168.33.70"
vagrant-vbguestプラグインの自動アップデートを無効にする

vagrant-vbguestの自動アップデートを無効にします。

if defined?(server.vbguest)
  server.vbguest.auto_update = false
end

boxファイルが作成されたときのVirtualBoxのバージョンと自分がインストールしているVirtualBoxのバージョンが違う際に、
VirtualBox Guest Additionsを自動で更新してくれるプラグインvagrant-vbguestプラグインなのですが、
自動アップデートされてしまう際に、フォルダの共有が失敗する場合があるっぽかったので無効にしています。

アップデートしたい場合は手動で

$ vagrant vbguest deploy

と実行すればできると思います。

【参考】dotless-de/vagrant-vbguest
https://github.com/dotless-de/vagrant-vbguest

VirtualBoxの設定

VirtualBox周りの設定です。

vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]

okisanjp.hatenablog.jp
上記サイトを参考に、わたしの環境でネットワークが遅かったので指定しています。

vb.gui = false

これをtrueにすると仮想ディスプレイが一緒に起動しますが、いらないのでfalseを指定。

vb.memory = 1024
vb.cpus = 2

こちらはメモリとCPUのコア数設定です。

まとめ

  • デプロイサーバー、Webサーバー、DBサーバーの3台をローカルに準備
  • Vagrantfileで複数台の仮想環境を指定できる
  • 個別にサーバーを起動することも可能
  • BoxファイルはChef社のbentoプロジェクトのBoxファイルが安心っぽい
  • IPアドレスはかぶらないように設定する
  • vagrant-vbguestの自動アップデートは無効にした
  • VirtualBoxのネットワークが遅いときの設定をいれた
  • 仮想ディスプレイはオフ

次は、デプロイサーバーにAnsibleをインストールして自分自身をプロビジョニングしてみたいと思います。

本当はたぶんデプロイサーバーに向けてAnsibleをホストOSから実行すればよいのですが、
Windows環境で(面倒なので)ローカルからAnsibleを実行するのではなく、
デプロイサーバー(兼プロビジョニングサーバー)という風に位置づけてAnsibleのインストールをしたいと思います。


次の記事はこちら
【Laravel Practice02】デプロイサーバーにAnsibleをインストール - 終電23時15分って早くね?

TOEICで600点をとるか挫折してあきらめるまで #1 初受験

f:id:blue_goheimochi:20160314014355j:plain
photo by zwenzini

2016年3月13日、TOEIC初受験をきめてきた。

今年の目標と抱負の中の1つに「TOEICで600点」を掲げました。
会社の同僚とも話をして「まず申し込もうぜ」ってなって1月7日には申し込みが完了。

その時点では、1回目で600点なんかぺろんとクリアして、
「ぼくが3ヶ月でTOEIC600点を取った方法」とかエントリを書くところまで想像してたんですが、
どうやら思い通りに行かないことが分かった(笑)ので自分への戒めの意味と泥臭く600点取るまでどんなことしたかとかが残せればいいなぁと思ってログを残しときます。

TOEIC初受験の感想

実は今までTOEICを受けたことがなかったんですが、みなさんそんなもんなのだろうか。
会社からTOEICのスコアとか必要とされなかったし、昇進とか転職とかそういうのの条件にもなかったので見て見ぬふりをしてました。
過去問すら受けずに試験を受けに行ったわけですがそんな中で感想を記しておく。

自信をもって答えられたものがほとんどなかった

リスニングセクションに関してもリーディングセクションに関しても100%これだ!って思って回答できたものがなかった。
もちろん「これはほぼ確定だな」って思ってマークしたものはあったんですが、なんて言ってるのか聞き取れなかったり、単語が分からなくて問題が理解できなかったりでいろいろアカン気がした。

時間が足りない

これはいろんなサイトとかでも見てたり人から聞いたりしてましたが時間が最後足りなかったです。
残り2つの問題で10回答分くらいが追いつかなかったので適当にマークしてしまいました・・・
そもそも問題文の読解に時間が掛かってしまうってのが問題ではありますが、試験の大まかな内容(どんな問題が出るか?)って言うのはいろいろ調べたら分かるし、試験料をムダにしたくないんであれば絶対に過去問解くとかTOEIC攻略的な本読んだほうがよいと思った。

どんな問題が出るかをほとんど知らなかった

まぁ各パートの冒頭でどういう風な問題かって言うのは書いてあったと思うので、知らなくても何とかはなると思うんですがね。
知ってるのと知っていないのでは、TOEICで点を取るためには必要ですなぁという感じでした。
次はこういうパターンの問題だとかある程度心構えがあったほうがいいと思うし、この問題は設問のほうを読んでから問題文を読んで・・・的なことが有効な部分もあったと思うので、次はちゃんとTOEIC対策自体もしようと思った。

ちなみに、2016年5月29日の回からちょっとだけ出題形式が変わるみたい。
square.toeic.or.jp


問題持って帰れると思ってた

と初受験の感想はこんなところ。
で思ったのは、がんばればもうちょっと解けるようになるかも・・・っという風には思いました。
まぁ大体TOEICみたいな試験を受けたり、勉強会に行った帰りだったりとかって「やるぞっー!」ってパズーみたいな気持ちになってるので、ちゃんとその気持ちを維持できるようにしたいです。できたためしがない気がするけど・・・。

でもね、ちょっとだけ勉強はしたの・・・

ホントちょっとだけ!w
いろいろと気合を入れてテキスト買ったりだとかして、1月初旬の私は完全にパズーでした。
で、最初はちょっとだけやってたんですが、だんだん、だんだんとやらなくなり。。。
「とりあえず受けるだけでもえらいでしょ自分!」って開き直った結果がボロボロなのはしょうがない。

で買ったものとかやったこととかを一応載せてみることにする。

DUO 3.0/DUO 3.0/CD復習用

DUO 3.0

DUO 3.0

DUO 3.0 / CD復習用

DUO 3.0 / CD復習用

いろいろなサイトでもイイヨイイヨと紹介されているDUO 3.0。
実際、たくさんの単語を少ない文章に詰め込んで覚えられるのは効率いい気がする。
1月の中旬くらいから初めて最初はがんばってたんだけど、結局2月の初めくらいには止まってしまっていた。
Section4まで・・・。
電車の中ではその日までにやったセクションまでのところの音声を聞いて・・・とかをやってました。

中学・高校で習った英語の基本を5時間でやり直す本

中学・高校で習った英語の基本を5時間でやり直す本 (PHP文庫)

中学・高校で習った英語の基本を5時間でやり直す本 (PHP文庫)

これは更なる昔に英語の学習に目覚めかけたときに買った本(もちろん挫折)だったんですが、引っ張りだしてきて読み直しました。
が、これも1時間目のところまででストップ。。
やればいいだけなのに・・・なんでやらないんだ自分・・・。

mikan

スマホのアプリ。

株式会社mikan | 圧倒的に一番速く覚えられる英単語アプリmikan

TOEICとかTOEFLとか大学受験とかカテゴリを選んでそれにあった単語の学習が出来るアプリ。
これが一番続いた。
んですが、続いたとは言ってもTOEICの2500単語のうち1400単語までしか進まなかった・・・し、やってるうちにアプリが勝手に「苦手な単語」を分類してくれるんですがその数940単語でおいおいって感じです。笑

と、この3ヶ月でがんばったのは(がんばってないけど)これだけです(苦笑)

まとめ

まだ結果も出ないうちだけど、感想とがんばらなかったことを書きました。
自分に対するがんばるがんばる詐欺をやめるための自戒もこめて。。

次は6月か7月にまた受験しようとは思いますが、日々の学習記録とか今回の結果とかも届いたらまたエントリ書きたいと思います。

とりあえず、上であげたテキストとかをちゃんとやる!ってことをがんばります。
そんなもんクソだ捨てちまってこっちをやれ!!とかあったら教えてください。
タイトルにもありますが挫折してあきらめることの内容がんばりたいです・・!

2016年の目標と抱負

あけましておめでとうございます!
みなさま、今年もよろしくお願いします。

今までやってこなかったですが、今年は目標と抱負的なことを書き残して年末に振り返ってみたいなぁと思います。

2016年のテーマ

昨年、30代に突入しましたが結果だらだらすごしてきてしまった感が否めません。。
ここで改めて初心に戻って様々なことに取り組もう!っという気持ちをこめて、
「原点回帰」
を今年のテーマにしようと思います。

2015年のプチふりかえり

こんなこと言ったらアホみたいですがインプットもアウトプットも少なかったのかな・・・と思っています。特に対外的?に。
会社事ではいろいろとやりましたが、特に個人的なところでの勉強不足が否めない感じがしました。

f:id:blue_goheimochi:20160103160331j:plain

この写真にも象徴されるように、積読がやばい。やばすぎます。笑
いったいいつ買ったんだよ!ってやつもちらほら。
「114,288円」
この本の中でちゃんと読んでないものの金額を定価でまとめるとこの金額です。
定価で買ったものばかりではないので、実際これだけの金額を投下した訳ではないですが、読もうと思って手元にあった本がこれだけ読まれてないのは由々しき事態では・・・。

後は積リンクもひどいです。笑
あとで読みたいな・・・と思っていてストックしてあるリンクたちもたくさん消化したい。

目標

「原点回帰」というテーマからさらに

  • 開発者基礎
  • 英語
  • 健康

の軸で目標を立てました。
ただ1年間の中でもガシガシ変化するようなことな気もするのでつどつど見直していきたいです。

開発者基礎

私、エンジニアとしての基礎というかプログラマーとしての基礎というのか、ITにかかわる人間としての基礎が欠落してる気がしています。笑
昨年はLaravelを触っていろいろな方にお会いして話を聞いたりしている中で、こういう部分が足りないのかなぁ・・ということで、

などの基礎?的なところを固める1年にしたいです。おそらく新人研修とか先輩から学ぶとかして習得すべき部分だったんだろうとは思うのですがそこが抜けています。笑
何かこれやっとけー!とかあったらアドバイスもらいたいですし、勉強会とかでお会いした方にはそういうの聞いてみようと思っています。

何か資格とか取ると自身になるよなぁ・・・と思うのでITとか開発者が取得するような資格をベースに基礎固めとしてもいい気がしているのでお勧めの資格もあれば教えてください。そもそも資格いらねーよ!とかも教えてください。笑

英語

英語力がありません。聞く力も読む力も話す力も。。笑
思えば大学時代に「英語勉強するために海外留学しよう!」という高い志をもっていたくせに4年間何もせず。。。というように英語からはだいぶ逃げてきてたなぁと思います。
特に衝撃を受けたのはRakuten Technology Conference 2015に参加したときですね。
3年前から行く行く詐欺をしていて昨年やっと参加したんですが当たり前に英語で話す方たちを見てとても刺激になりました。
あとはLaravelを触る中で英語のドキュメントを読めるとすごくよいなと感じました。新しい情報とか拾えたり、幅広く情報収集できるとより理解も増えるんじゃないかなぁ・・・と。

ということでTOEIC600点を当面の目標にがんばりたいです。

健康

体重が増えました。
昨年ちょっと走ったことにより少し落ちたんですがもうちょっと落としたいです。
68kgが目標。かつ腹筋を割りたいです。笑
お酒も飲むのも好きなので、健康維持できないと飲むのも出来なくなる日が来るでしょうしちゃんと両立できるようにします。

まとめ

  • 本を読む(積読なるべくしない)
  • ITパスポートの資格を取る
  • コンピュータについて学ぶ
  • ネットワークについて学ぶ
  • オブジェクト指向について学ぶ
  • デザインパターンについて学ぶ
  • テストについて学ぶ
  • 月1回以上勉強会に参加する
  • TOEIC600点
  • 月に1回フットサル
  • 年間420km以上走る(週7kmくらい)
  • 体重を68kgまで落とす。維持する。
  • 腹筋を割る

開発者基礎の部分とかざっくり感満載ですが書かないよりはいいかなぁ・・・と。
新しいこととかへの感度も保つために月に1回以上はちゃんと勉強会にも出よう。
あとは去年、一昨年とちゃんと参加できていないので、今年のPHPカンファレンスはちゃんと参加したい・・・

以上です。
皆様今年も仲良くしてください!&いろいろ学ばせてください。
よろしくお願いいたします。

Laravel5.1でNo supported encrypter found. The cipher and / or key length are invalid.のエラーになる件

解決方法

Laravelのコードがあるディレクトリにてコンソールから、

php artisan key:generate

を実行。
で解決しました。

当方の環境としては、

でしたが、
Windowsのコンソールからでも、
vagrant sshしてサーバにログインしてからでも、
どちらでもうまくいくようでした。

原因

いろいろと設定して、
いざトップページを表示しようとすると、

f:id:blue_goheimochi:20151004231142j:plain

RuntimeException in EncryptionServiceProvider.php line 29:
No supported encrypter found. The cipher and / or key length are invalid.

のエラーになってしまい、
LaravelのWelcomeページが表示されませんでした。。

原因としては、.envファイルで指定されるはずのAPP_KEYが指定されていなかったためです。


ex).evnファイルの一部

APP_ENV=local
APP_DEBUG=true
APP_KEY=SomeRandomString


composer経由でLaravelをインストールした場合には、

"post-root-package-install": [
    "php -r \"copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
    "php artisan key:generate"
]

がcomposer.jsonで指定されており、

  • env.exampleを.envとしてコピー
  • php artisan key:generateの実行

を自動で行ってくれるので大丈夫ですが、
コードをzipで取得した際などにおいては、
上記2点が実施されていない場合がありますので手動で実行する必要があるでしょう。

Laravel Meetup Tokyo Vol.6 に行ってきた!

だいぶ遅くなってしまいましたが、Laravel Meepup Tokyo Vol.6に行ってまいりました。
で、LTの機会をいただいたので、「LaravelアプリケーションをSeleniumでテストしてみた」というのを発表してみました。

f:id:blue_goheimochi:20150710013154p:plain

が、結論から言うとLaravel関係なくSeleniumの話やんけーって感じの内容だったのでどうなのかな・・・と思ったのですが、
ちょっとですがTwitterで反応していただりとかしてよかったです!笑
一応スライドとサンプルを公開しておきます・・・

実際、当日にはサンプルが間に合わずデモができなかったのですが、
サンプルをあげましたのでそちらで確認してみてもらえばなーと思います。

スライドはこちら。


サンプルのコードはこちら。github.com

サンプルの内容

●動かし方

コードをGitHubから持ってきてもらい、

$ vagrant up

$ vagrant ssh

$ cd /vagrant/src/

$ vendor/bin/phpunit

でテスト実行の確認までできます。

f:id:blue_goheimochi:20150709152823p:plain

テスト中に取得されるスクリーンショットが、/vagrant/src/tests/screenshotのディレクトリの中にできていると思います。

●何をやっているの?

PHPUnitからSelenium Serverを通してFirefoxを起動しブラウザテストをしています。

Selenium Serverのインストール&実行やFirefoxのインストールなど、
もろもろはChefのレシピを書いていてそっちがやってくれます。

ぶっちゃけ大変なのはその辺のサーバー環境の設定で、
それさえできていればSelenium Serverを用いたテストは割と簡単です。

●必要な設定は?

-サーバーの設定
サンプルではCentOSを使用しておりますが、
サーバー用途のだと当然ディスプレイとかの設定がないので、
仮想のディスプレイをXvfbを利用してエミュレートする必要があったりで、
以下のインストールが必須です。

Selenium Server
・Xvfb
Firefox

正直サンプルを作るにあたりこの部分が一番時間かかりました。笑
実際の設定内容についてはChefのレシピを見ていただければと・・・

PHPUnit周りの設定

  • composer.jsonの修正
"require-dev": {
    "phpunit/phpunit": "~4.0",
    "phpspec/phpspec": "~2.1",
    "phpunit/phpunit-selenium": ">=1.3.1"
}

require-devの部分に"phpunit/phpunit-selenium": ">=1.3.1"を追記しています。
phpunitからSelenium WebDriverのAPIを使うために必要です。

  • テストケースの作成

PHPUnit_Extensions_Selenium2TestCaseをextendしたテストケースを作成します。

<?php
class WebTest extends PHPUnit_Extensions_Selenium2TestCase
{
    protected function setUp()
    {
        $this->setBrowser('firefox');
        $this->setBrowserUrl('http://www.example.com/');
    }

    public function testTitle()
    {
        $this->url('http://www.example.com/');
        $this->assertEquals('Example WWW Page', $this->title());
    }

}
?>

https://phpunit.de/manual/current/ja/selenium.html#selenium.selenium2testcase.examples.WebTest.php

上記ページの引用ですがもっとも簡単な感じだとこんな風です。
http://www.example.com/を開いて、タイトルタグが「Example WWW Page」であるかをみるテストですね。

$this->setBrowserUrl('http://www.example.com/');でURLを設定しているので、
$this->url('http://www.example.com/');は$this->url('/');でも大丈夫です。

●後はPHPUnitを実行するだけ

後はphpunitを実行するだけです。

サーバーの設定さえしっかりできてれば、結構簡単にやれちゃいます。
そしてやっぱりLaravelである必要はなくて(笑)、
↑のテストケースでも$this->setBrowserUrl('http://www.example.com/');のURLを変えれば、
実際はどんなサイトでもテストできちゃいます。
(※他の人のサイトにはやらな・・(ry)

なので、既存のWebアプリケーションあるけどUnitテストそろえるのつらいな・・・
とかそういう状況であればSeleniumを使ったE2Eのテストからはじめてみるのもいいのかなぁ・・・
とか思っていて、実際にそういう方向から個人的には攻めたりもしています。

●Laravel特有の設定

とはいえLaravelでやった感を出したかったので、いくつかLaravel用に設定した部分を書きます。

-ArtisanコマンドとかをPHPUnit_Extensions_Selenium2TestCaseをextendしたテストケースでも使う。
LaravelでUnitテストを書くとするとtestディレクトリの中のTestCase.phpをextendして使うかと思います。
そうすることで、Artisanコマンドなどが使用できるようになるかと思うのですが、
PHPUnit_Extensions_Selenium2TestCaseを直接extendしてしまうともちろん使えないので、
Illuminate\Foundation\Testing\TestCaseと同じような構成をとるために、
src/tests/TestCaseSelenium.phpにTestCaseSeleniumクラスを作成して、
TestCaseクラスを使うときと同様にLaravelの機能が使えるようにしています。

この辺はもうちょっといいやりかたがある気がするので誰か教えてください・・・

-testingの環境変数の設定

テスト用の環境変数としてtestingを利用しています。
sqliteのファイルの切り替えなどを行いたいためですが、
SeleniumのテストでFirefoxからアクセスする場合当然ですが、
phpunit.xmlに設定しているenvは適応されません。

ですので、

というような感じで、VirtualHostに対する環境変数Apatchで設定しています。

SetEnv APP_ENV testing
SetEnv SQLITE_FILE_NAME testing.sqlite

ドメインを切るのってなんかスマートじゃない気はしますが・・・

というのがLaravel特有の設定かなーと思うところでした。

以上でーす。


ちなみに・・・

2015年7月18日(土)に「Laravel Meetup Tokyo Vol.7」が開催されるようです。
現時点でちょっと空きがあるみたいですので、
興味ある方はぜひ行ってみてはどうでしょうか??

laravel.doorkeeper.jp

【書評】「Laravel エキスパート養成読本」の読書感想文

「Laravel エキスパート養成読本」をご献本いただきました!
竹澤さん(@ex_takezawa)ありがとうございます!

Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

拝読させていただいたので、読書感想文をば。

【2015/05/01追記】
※本の内容について、正誤表が技術評論社さんから出ていますので、あわせてご確認ください。
サポートページ:Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!]:|技術評論社

目次

全部で5つのChapterと1つの特別記事がありました。

[Chapter1]Laravelをはじめよう

Laravelがどんな感じで流行ってきたか?というのが分かります。
Hello World!ができるのでまだLaravelさわったことないよー!って人はここから読むといいと思います。

副題にもありますが、「PHPの開発が楽しくなる」の言葉のとおり、
モダンで見通しがよく使いやすいフレームワークで開発速度もあがり、
PHPの開発が楽しくなるなーと使っていて個人的にも感じるところです。

[Chapter2]MVCモデルが基礎から分かる

Webフレームワークって何ぞ?って人はここを読むとよさげです。
とはいえLaravelの機能ベースでMVCを説明してるようなイメージではあるので、
MVCとか興味が沸いてきたら他のフレームワークをさわったりMVCについてググってみたり本を読んだりしてみるとより理解が深まると思います。

[Chapter3]IoCコンテナファサード、サービスプロバイダ、Eloquent

Laravelのコアな部分の説明がしっかり書かれています。
(って自分もまだ完全に理解できてるわけではないのですが・・・)

Laravelに慣れてきたあたりで読むとより理解が深まったり、
新しい発見があると思います。(バルクインサートできるとか知らなかった・・笑

Laravelを扱ううえでの基礎固めという意味でも、
すでに使っている方も読んでおいて損はない内容だと思います。

[Chapter4]Laravel5の新機能を紹介

ご献本くださった竹澤さんのパート。

本の中では全体的にLaravel4.2系が使われていますが、
ここでは最新バージョンのLaravel5の新機能などが紹介されています。

だいぶ内容が濃いーのでおなかいっぱいになります 笑
自分自身ももう何度か読んで腹に落としたいなぁ・・・と。。

Laravel5を使ってもう1歩進んだ開発をしたいぜ!っという、
中~上級者向けの記事かなぁと思います。

[特別記事]PHPフレームワーク最新事情

SymfonyCakePHPZend Framework、Yiiが紹介されています。
他にも取り上げることができなかった・・・ということで、
CodeIgniter、FuelPHP、Phalconなどの名前もあがっています。

Laravelは開発スピードをあげられるフレームワークだなーという風に
個人的には思っていて使いやすいなぁーと感じていますが、
CakePHPなんかは日本語の情報が充実してて利用者も多かったり、
Zend Frameworkは独立性が強い設計になってたりと、
それぞれ特徴や長所・短所があるかと思うので、
他のも触ってみて自分にあったフレームワークを探してみるのもいいかもしれません。

[Chapter5]実践!REST APIアプリケーション

ホントに実践的な内容になっていて、
サンプルアプリケーションの仕様から順々と、
ルーティング、コントローラ、サービス・モデル、さらにテストにまで説明が及んでいます。

サンプルアプリケーション自体にVagrantfileも含まれており、
VagrantVirtualBoxがインストールされていれば
vagrant upのコマンド1つですぐに試すこともできるのも親切!

どんな風に実践すればいいかなーと思っていたり、現状の方法と照らし合わせてみたりするとより理解が深まるのではないでしょうか。

まとめ

感想文を書いていましたら日が回ってしまいましたが・・(笑
4月21日(火)の今日、「Laravelエキスパート養成読本」が販売されるそうです!

初めてLaravelを使う方から割とガシガシ使っている方まで、
Laravelに興味があれば1冊あって間違いなしの本ではないかなと。

日々の新しい情報はTwitterや日本語チャットで情報を追っかけるとよいでしょう!

ご献本いただきました、竹澤さんをはじめとした著者のみなさま、
技術評論社さん、ありがとうございました!

Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)



もう何周かは読んでちゃんと勉強しないとなぁ・・・
みんなと飲みたいなぁ・・・

いまさらgulpはじめてみました

GulpとかGruntとか「タスクランナー」って聞くとだいぶ敷居がたけえなって感じていた私。
「色々何でもタスクにしてGulpとか使うとめっちゃはかどるよ!!」
って言われても色々何でもって・・・覚えること多そう・・・
ってなってずっと敬遠してたんですがこのたび重い腰をあげて、
ようやっと手をだしてみたのでまとめます。
同じように感じていた人が使ってみてうおーってなってくれるとうれしい。

なるべく分かりやすくgulpがどんな感じのものか手順をまとめたつもりなので、
上から順番に手元で動かしながら試してみてもらえばと。

とりあえずやってみたこと(gulpにどんなタスクを実行させたか)

  • CSSとかJSとかを更新するとブラウザが自動的に更新される。
    CSS・JSを編集して、ブラウザに切り替えて、F5押して・・・っていう作業をしなくてよくなります。
  • CSS・JSファイルを圧縮する。
    ファイル容量が意外に圧縮されるのでページ読み込みが多少早くなると思います。

動作確認環境

$ npm -v
1.4.28

※node.jsがインストールされていない場合は、
公式からダウンロードするか、OSのパッケージ等をご利用ください。
http://nodejs.org/

  • gulp
$ gulp -v
[16:37:33] CLI version 3.8.10

※gulpがインストールされていない場合は、

$ npm install -g gulp

でgulpをインストールしてください。

サンプルソースをダウンロードする

https://github.com/blue-goheimochi/gulp-sample/releases

こちらにサンプルソースを置いておりますので、
ziptar.gzのアーカイブをダウンロードして、デスクトップなどで解凍してください。

必要なパッケージをインストールする

npmを使って必要なパッケージをインストールします。

■package.jsonを作成

{
  "devDependencies": {
    "gulp": "^3.8.8",
    "gulp-minify-css": "^0.4.6",
    "gulp-uglify": "^1.1.0",
    "browser-sync": "^2.0.0"
  }
}

解凍したディレクトリ直下にpackage.jsonを上記の内容で作成してください。

【参考】
Add package.json for install dependencies · e13af57 · blue-goheimochi/gulp-sample · GitHub

■パッケージのインストール

$ npm install

解凍したディレクトリに移動してnpm installコマンドを実行してください。
node_modulesディレクトリが作成されてその中にパッケージがインストールされます。

gulpfile.jsを作成しgulpを実行してみる。

■gulpfile.jsを作成

  • gulpfile.js
var gulp = require('gulp');
var browserSync = require('browser-sync');

gulp.task('default', function(){
    browserSync({
        server: {
            baseDir: "./public_html",
            port: 8080
        }
    });
});

解凍したディレクトリ直下にgulpfile.jsを上記の内容で作成してください。

【参考】
Add gulpfile.js for browser start-up · 1634aba · blue-goheimochi/gulp-sample · GitHub

■gulpを実行

$ gulp

解凍したディレクトリにカレントディレクトリを移動してgulpコマンドを実行してください。

自動的にブラウザが開いたでしょうか!?
ブラウザが開けば、gulpの実行は成功です。

「ctrl」+「c」でgulpの実行を停止できます。

gulpコマンドとタスクについて

$ gulp

gulpコマンドでgulpを実行すると、defaultのタスクが実行されます。
サンプルで言うと、

gulp.task('default', function(){
    browserSync({
        server: {
            baseDir: "./public_html",
            port: 8080
        }
    });
});

ここの部分が実行されます。
サンプルではこの部分でブラウザを起動するようになっています。

また別のタスクを定義することもできます。
ブラウザを起動するプログラム部分をbrowser-syncというタスクに定義し、
defaultタスクから呼ぶように修正します。

  • gulpfile.js
var gulp = require('gulp');
var browserSync = require('browser-sync');

// browser-syncタスクの追加
gulp.task('browser-sync', function() {
    browserSync({
        server: {
            baseDir: "./public_html",
            port: 8080
        }
    });
});

// defaultタスクからbrowser-syncタスクを呼び出すように変更
gulp.task('default', ['browser-sync']);

このようにするとdefaultタスク実行時にbrowser-syncタスクが実行されるようになります。

■gulpを実行

実際にgulpコマンドを実行してみましょう。

$ gulp

先ほどと同様にブラウザが開かれると思います。

【参考】
Change default task to browser-sync task · b3b274a · blue-goheimochi/gulp-sample · GitHub

public_html/css/app.cssが変更されたらブラウザが更新されるようにする

ファイルの変更を監視するためにはgulp.watch()を使います。
gulpfile.jsを以下のように変更します。

  • gulpfile.js
var gulp = require('gulp');
var browserSync = require('browser-sync');

gulp.task('browser-sync', function(){
    browserSync({
        server: {
            baseDir: "./public_html",
            port: 8080
        }
    });
});

gulp.task('default', ['browser-sync'], function(){
    // gulp.watch()を追加。
    gulp.watch(['./public_html/css/app.css'], function(){
        browserSync.reload();
    });  
});

この追加部分を補足すると、

gulp.task('default', ['defaultタスク実行前に実行するタスク'], function(){
    gulp.watch(['監視対象とするファイル'], function(){
        browserSync.reload(); // 監視対象のファイルが変更されたときに実行される処理
    });
});

という形になります。

サンプルソースの流れだと

  1. gulpコマンドを実行する
  2. defaultタスクが呼び出される
  3. browser-syncタスクがまず実行される
  4. defaultタスク内のgulp.watch()が実行される
  5. public_html/css/app.cssが変更されるとbrowserSync.reload();が実行される

という流れで実行されていきます。

■public_html/css/app.cssを変更する

public_html/css/app.cssのどこかを変更してみましょう。
たとえば、

body {
    color: #363947;
    font-size: 15px;
    background: #FF0000;
}

bodyにbackgroundを設定して保存してみます。

うまくいけば、自動的に既に起動していたブラウザが更新され、
背景が赤色に変わっていると思います!

その他の箇所でもpublic_html/css/app.cssが変更されると、
ブラウザが自動的に更新されるはずなので色々変更してみましょう。

【参考】
Modified gulpfile.js for app.css watching · 23568dc · blue-goheimochi/gulp-sample · GitHub

public_html/js/app.jsも監視対象に設定する

CSSファイルに続いてJSファイルも監視対象に設定してみます。
public_html/js/app.jsが監視対象になるように以下のように変更します。

  • gulpfile.js
var gulp = require('gulp');
var browserSync = require('browser-sync');

gulp.task('browser-sync', function(){
    browserSync({
        server: {
            baseDir: "./public_html",
            port: 8080
        }
    });
});

gulp.task('default', ['browser-sync'], function(){
    gulp.watch([
        './public_html/css/*.css',
        './public_html/js/*.js' // 監視対象にJSファイルを追加
    ], function(){
        browserSync.reload();
    });
});

上記のようにgulp.watch()は監視対象とするファイルを複数指定することができます。
またお気付きになったかもしれませんが、
ファイルの指定には「*」(ワイルドカード)も指定できるので、
このように指定を入れておくことで、別のcss、jsが追加された場合でも、
追加されたファイルが監視対象になってくれます。

■public_html/js/app.jsを変更する

public_html/js/app.jsを変更してみましょう。

function btnClick() {
  alert('Bye!');
}

alert();のメッセージを「Hello!」から「Bye!」に変えてみました。
デザインには影響はないと思うので変化はなさそうですが、
「Click Me!」のボタンを押すと実際に「Bye!」とアラートが出ると思います。

【参考】
Modified gulpfile.js for app.js watching · 731e6df · blue-goheimochi/gulp-sample · GitHub

CSSを圧縮する

CSSをgulpのタスクで圧縮することができます。

public_html/css/app.cssを圧縮すると、
Modified gulpfile.js for minify app.css · 97286b7 · blue-goheimochi/gulp-sample · GitHub
このような感じでCSSの機能を保ったまま圧縮されます。
(「Diff suppressed. Click to show.」をクリックして確認してみてください。)

圧縮すると可読性は下がってしまうので、
修正自体は圧縮されていないCSSに手を加えて、
その後圧縮するという流れにするために、
resource/css/app.cssに圧縮前のCSSを配置し、
それを圧縮してpublic_html/css/app.cssに書き出す。
という方法でやります。

■resource/css/app.cssを作成

public_htmlと同じ位置にresourceディレクトリを作成し、その中にcssディレクトリを作成。
そしてpublic_html/css/app.cssresource/css/app.cssに配置するようにコピーします。

■gulpfile.jsを修正

gulpfile.jsを修正します。

var gulp = require('gulp');
var minifyCSS = require('gulp-minify-css'); // 追記
var browserSync = require('browser-sync');

gulp.task('browser-sync', function() {
    browserSync({
        server: {
            baseDir: "./public_html",
            port: 8080
        }
    });
});

// minify-cssのタスクを追加
gulp.task('minify-css', function () {
    gulp.src(['./resource/css/app.css'])
        .pipe(minifyCSS())
        .pipe(gulp.dest('./public_html/css')
    );
});

gulp.task('default', ['browser-sync','minify-css'], function(){ // minify-cssタスクがdefaultタスクで実行されるように追加
    gulp.watch([
        './public_html/css/*.css',
        './public_html/js/*.js'
    ], function(){
        browserSync.reload();
    });
});

修正箇所は3点で、

  • var minifyCSS = require('gulp-minify-css');を追記。
  • minify-cssのタスクを追加
  • minify-cssタスクがdefaultタスクで実行されるように追加

です。

■gulpを実行

$ gulp

今まで通りブラウザが起動し見た目には変わりがないと思いますが、
public_html/css/app.cssを確認するとCSSが圧縮されているのが分かると思います。

【参考】
Modified gulpfile.js for minify app.css · 97286b7 · blue-goheimochi/gulp-sample · GitHub

JSを圧縮する

CSSと同様にJSも圧縮してみましょう。

■resource/js/app.jsを作成

resourceディレクトリの中にjsディレクトリを作成。
そしてpublic_html/js/app.jsresource/js/app.jsに配置するようにコピーします。

■gulpfile.jsを修正

gulpfile.jsを修正します。

var gulp = require('gulp');
var minifyCSS = require('gulp-minify-css');
var uglify = require('gulp-uglify'); // 追記
var browserSync = require('browser-sync');

gulp.task('browser-sync', function() {
    browserSync({
        server: {
            baseDir: "./public_html",
            port: 8080
        }
    });
});

gulp.task('minify-css', function () {
    gulp.src(['./resource/css/app.css'])
        .pipe(minifyCSS())
        .pipe(gulp.dest('./public_html/css')
    );
});

// compressのタスクを追加
gulp.task('compress', function () {
    gulp.src(['./resource/js/app.js'])
        .pipe(uglify())
        .pipe(gulp.dest('./public_html/js')
    );
});

gulp.task('default', ['browser-sync','minify-css','compress'], function(){ // compressタスクがdefaultタスクで実行されるように追加
    gulp.watch([
        './public_html/css/*.css',
        './public_html/js/*.js'
    ], function(){
        browserSync.reload();
    });
});

修正箇所は3点で、

  • var uglify = require('gulp-uglify');を追記。
  • compressのタスクを追加
  • compressタスクがdefaultタスクで実行されるように追加

です。

■gulpを実行

$ gulp

ブラウザが起動し、
public_html/js/app.jsを確認するとJSが圧縮されていると思います。
ちょっとサンプルのJSだと圧縮の効果が薄いですがしっかりと圧縮がかかっているのが分かると思います。

【参考】
Modified gulpfile.js for compress app.js · 8fcb7cd · blue-goheimochi/gulp-sample · GitHub

タスクを個別に呼び出す

タスクを個別に呼び出すには、

$ gulp [タスク名]

でコマンドを実行します。

gulpコマンドを実行した場合はdefaultタスクが実行されますが、
gulp.watch()でのファイル監視はgulpコマンドでは動かなくていいといいよ。
という場合などに活用できます。

サンプルでは

$ gulp

が実行された場合はCSS・JSの圧縮のタスクのみが実行され、

$ gulp watch

が実行された場合のみgulp.watch()が実行されファイルの監視をするようにしています。

■gulpfile.jsを修正

gulpfile.jsを修正します。

var gulp = require('gulp');
var minifyCSS = require('gulp-minify-css');
var uglify = require('gulp-uglify');
var browserSync = require('browser-sync');

gulp.task('browser-sync', function() {
    browserSync({
        server: {
            baseDir: "./public_html",
            port: 8080
        }
    });
});

// ブラウザをリロードをタスクに切り出し
gulp.task('bs-reload', function() {
    browserSync.reload();
});

gulp.task('minify-css', function () {
    gulp.src(['./resource/css/app.css'])
        .pipe(minifyCSS())
        .pipe(gulp.dest('./public_html/css')
    );
});

gulp.task('compress', function () {
    gulp.src(['./resource/js/app.js'])
        .pipe(uglify())
        .pipe(gulp.dest('./public_html/js')
    );
});

// watchのタスクを追加
gulp.task('watch', ['browser-sync'], function () {
    gulp.watch([
        './resource/css/*.css', // resource/css/の中のCSSを監視するように修正
        './resource/js/*.js' // resource/js/の中のJSを監視するように修正
    ], ['minify-css','compress', 'bs-reload']); // 監視対象のファイルに変更がかかると、CSSの圧縮、JSの圧縮、ブラウザのリロードが実行される
});

// defaultタスクではCSS・JSの圧縮のみ実行されるように変更
gulp.task('default', ['minify-css','compress']);

■gulpを実行

$ gulp

CSS・JSの圧縮のみが実行されます。

■gulp watchを実行

$ gulp watch

ブラウザが起動し、ファイル監視が行われます。
resource/css/*.cssresource/js/*.jsが変更されると、
public_html/css/*.csspublic_html/js/*.jsに圧縮されたファイルが作られるとともに、
ブラウザがリロードします。

【参考】
Modified gulpfile.js for devide default task and watch task · cfd9b30 · blue-goheimochi/gulp-sample · GitHub

まとめ

いかがでしたでしょうか?

少し手順は多くなってしまいましたが、

  • CSSとかJSとかを更新するとブラウザが自動的に更新される。
  • CSS・JSファイルを圧縮する。

この2つのタスクをgulpで実行することができました。

他にも、

  • 複数CSSファイルを1つのファイルにまとめて書き出す
  • sass、lessのファイルをコンパイルしてCSSに書き出す

・・・などなど、色々なことができます!

「こんなことタスク化しておきたいな・・・」、「この手作業自動化できないかな・・・」
って思ったら、自分でコマンドを書いても実現できるかもしれないですし、
探してみると既にそれにマッチしたgulpのプラグインも見つかるかもしれません。
gulpのプラグインは下記に色々上がっておりますので、
こちらから探してみても面白いと思います!


results for gulp

以上、gulp食わず嫌いのあなたのお力になれたら幸いです。