# PHPフレームワークのlaravelが流行ってると聞いて、、
PHPのフレームワーク勉強するならどれがいいかなー いいかなー と思ってた時に、ソーシャル上で見かけた これ「laravel」
curl -s http://getcomposer.org/installer | php
http://laravel.com/docs/quick では
composer create-project laravel/laravel your-project-name --prefer-dist
と書かれているけど、 macのグローバルを汚したくなかったので そのまま使います
php composer.phar create-project laravel/laravel your-project-name --prefer-dist
nginx.confの設定
https://gist.github.com/davzie/3938080
「You have arrived.」という画面が表示されれば準備完了
# PHP5.6.0が出てたので、早速centosに入れてみた!!だけ
リリースがでてるよ
http://jp2.php.net/index.php#id2014-01-23-1
ここにあるよ
http://downloads.php.net/tyrael/
アップデート内容は
- constant scalar expressions,
- variadic functions,
- argument unpacking,
- support for large(>2GiB) file uploads,
- SSL/TLS improvements,
- a new command line debugger called phpdbg.
そうだ、僕は英語が、、、orz
2Gib を超えるファイルのアップロードがサポートされたとか
今までは、
function sum() { return array_sum(func_get_args()); } echo sum(1, 4, 12, 20, 11);
こう書かないと行けなかったものが
function sum2(...$nums) { return array_sum($nums); } echo sum2(1, 4, 12, 20);
こうやってかけるようになったり
したらしい
その他はこちら
http://philsturgeon.co.uk/blog/2013/08/potential-variadic-function-syntax-for-php-56
vagrantのcentos環境に入れた手順メモ
$ sudo su $ cd /usr/local/src $ curl -Lso php-5.6.0.tar.gz http://downloads.php.net/tyrael/php-5.6.0alpha1.tar.gz $ tar xfz php-5.6.0.tar.gz -C /usr/local/src/ $ cd /usr/local/src/php-5.6.0alpha1 $ ./configure -enable-opcache --prefix=/usr/local/php/5.6.0 --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --enable-zip --enable-fpm --with-mcrypt -- with-curl --enable-xml --enable-mbstring $ make;make install;
configure時のoptionはその都度変えてください。 今回は、必要だったこともあり、curl,xmk,mbstring,zip,mcrypt,opensslなどをつけました
全て正常に完了したら
$ php -v PHP 5.6.0alpha1 (cli) (built: Jan 29 2014 16:44:01) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.6.0-dev, Copyright (c) 1998-2014 Zend Technologies
こんな感じ
# Dockerで環境作るのにDockerfileを使ってないの?
どこでもいいので Dockerfileを用意する。
~/Dockerfileファイルを用意しました。
前回Docker導入時に行った簡単なコマンドを、Dockerfileに定義してみます。
その前に、今回確認するimageが何かを確認
$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE <none> <none> 5d021e068905 49 seconds ago 300.6 MB centos 6.4 539c0211cd76 9 months ago 300.6 MB centos latest 539c0211cd76 9 months ago 300.6 MB
僕の場合は、centosというイメージ名があります。 ※イメージ名は、人によって違いますので、事前に確認を
centosに対して簡単なコマンドを実行してみると
$ docker run centos /bin/echo "Hello World" Hello World
お決まりの言葉「Hello World」が出力されました。
これをDockerfileに書き出すと
$ vi ~/Dockerfile FROM centos RUN /bin/echo "Hello World"
こうなります。 たったのこれだけです。
centosでecho "Hello World"実行させる と書いてます。
ではでは、実行
Dockerfileを使って実行する方法は docker build <Dockerfile格納ディレクトリパス>なので
$ docker build ./
と実行します。
では、
# docker build ./ Uploading context 30.72 kB Step 1 : FROM centos ---> 539c0211cd76 Step 2 : RUN /bin/echo "Hello World" ---> Running in b7f432d09ac5 Hello World ---> 92a6f4e013d2 Successfully built 92a6f4e013d2
Stepを踏んで処理が実行されていることがわかりますね。
ただ、これだけだと、Dockerfileを使うメリットが全然わかないですね。 Dockerfileのメリットを簡単に書くとしたら
FROM centos RUN /bin/echo "現在の日時は?" RUN /bin/date RUN /bin/echo "なるほど"
こんな感じで、複数のRUNを定義できる!! ちなみに実行すると
$ docker build -no-cache . Uploading context 30.72 kB Step 1 : FROM centos ---> 539c0211cd76 Step 2 : RUN /bin/echo "現在の日時は?" ---> Running in b670e4c9dc07 現在の日時は? ---> 3e8f0a3a1fa9 Step 3 : RUN /bin/date ---> Running in ce7076b6c8ee Wed Jan 22 22:48:32 EST 2014 ---> 44ef8a8b589b Step 4 : RUN /bin/echo "なるほど" ---> Running in edea3c58c41a なるほど ---> dd113a8261cd Successfully built dd113a8261cd
結果はこんな感じですね。 これで色々CI回したりしてみたいです。 Dockerfile入門は以上です。
※追記 作成した環境にsshもできます docker run -i -t dd113a8261cd /bin/bash
参考
# Docker初心者が、CentOSでアレした手順を書いてみた
CentOS 6.5からでDockerが使えるようになったらしい!
Docker はひとつの Linux システムの上で、複数の Linux システムを動かすためのソフトウェアらしいです。 システムの分離には Linux Containers (LXC) を、ファイルシステムまわりには Advanced multi layered unification filesystem (Aufs) をつかっているとのこと。。(この辺りは僕のレヴェルではまだまだ理解できない。)
とりあえず、centOS上にcentOSを立てれる!やってみよう
Mac
今回はvagrantを使ってます。 vagrantは普段から使ってるので余裕です( ー`дー´)キリッ
$ vagrant init opscode-centos65 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box $ vagrant up $ vagrant ssh
centos6.5のboxをダウンロードして、立ち上げて、sshして
CentOS
次はCentOS上での手順などなど
インストール
$ cd /usr/local/src/ $ sudo su $ rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm を取得中 警告: /var/tmp/rpm-tmp.ig0t00: ヘッダ V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY 準備中... ########################################### [100%] 1:epel-release ########################################### [100%] $ yum -y install docker-io $ chkconfig docker on $ service docker start Starting cgconfig service: [ OK ] Starting docker: [ OK ]
Docker で Hello World
ではさっそく Docker を試してみましょう。Docker 公式の centos イメージを使って、コンテナ内で echo を実行してみます。
$ docker run centos /bin/echo "Hello World" Unable to find image 'centos' (tag: latest) locally
初回はcentosのイメージが見つからないから時間がかかります。
Pulling repository centos 539c0211cd76: Download complete
おわったぁぁぁぁ。(僕の場合は3分程度)
Hello World
こんにちは!!
/bin/bashを実行したら、コンテナ内でシェルが起動する
$ docker run -i -t centos /bin/bash bash-4.1# exit exit
たしかに。
参考
# boxenをアップデート
boxenを本家から、cloneしてつかってると masterがプライベートなリポジトリに向いてしまってる。 なので、本家のour-boxenをremoteに設定してから、色々やります
our-boxenをアップデートする
remoteに設定
$ git remote add upstream git://github.com/boxen/our-boxen.git
設定できてるか確認
$ git remote -v | grep upstream upstream git://github.com/boxen/our-boxen.git (fetch) upstream git://github.com/boxen/our-boxen.git (push)
そしたらupstreamからpullします
$ git pull upstream master From git://github.com/boxen/our-boxen * branch master -> FETCH_HEAD Auto-merging manifests/site.pp CONFLICT (content): Merge conflict in manifests/site.pp Auto-merging Puppetfile.lock CONFLICT (content): Merge conflict in Puppetfile.lock Auto-merging Puppetfile Automatic merge failed; fix conflicts and then commit the result.
あわわわわ(コンフリクトでちゃった) コンフリクトが出たら、手動でなおします。 終わったら
script/boxen
完了!
# play2(scala)からmysqlのデータ取得して、表示するまで
データの準備
前々回 http://shinofara.hateblo.jp/entry/2014/01/16/232308 作成した、Mysqlとテーブルを使います。
Userテーブルには以下のデータが入ってる状態にします。
insert into user(`name`,`email`,`password`) values('hoge_name','hoge@test.com','1234'); insert into user(`name`,`email`,`password`) values('hoge_name_2','hoge2@test.com','5678');
Controllerからデータ取得
ライブラリをimportする記述追加
import play.api.Play.current import play.api.mvc.Results._ import play.api.db._ import anorm._
レコードを全件取得して、Listへ格納
implicit val connection = DB.getConnection() val selectUsers = SQL("Select * from user") val users = selectUsers().map(row => Map('name -> row[String]("name"), 'email -> row[String]("email"))).toList
viewテンプレートへデータを渡す
Ok(views.html.mydb("DBつないでみたよ", users))
ViewTemplateで表示
app/views/mydb.scala.html
@(message:String,userList:List[Map[Symbol, String]]) @main("show scala templates") { <h1>@message</h1> <ul> @userList.map { user => <li><p>@user('name) -> @user('email)</p></li> } </ul> }
ブラウザで確認すると DBつないでみたよ hoge_name -> hoge@test.com hoge_name_2 -> hoge2@test.com と表示されました。
もう少し、scalaなりplay2なりの記述法を覚えてから、 次は、ORMに挑戦しようと思います。
# play2からlocalhostのmysqlに接続するには、、
play2とか関係なしに、どの言語勉強してても DBをつかってなんやかんやしたくなる時ってある
って事で、play2アプリケーションからmysqlに接続するように設定をしてみようと思う。
play2とmysqlの接続設定
肝心の接続の仕方は、 jdbcドライバーを使ってだね、 ローカルのmydbに接続してだね、、、
まずは、jdbcを使う事と、何処のmysqlにつなぐのかを設定ファイルに記述
$ vim conf/application.conf db.default.driver=com.mysql.jdbc.Driver db.default.url="jdbc:mysql://localhost:13306/mydb" db.default.user=root db.default.password="" #実行されたSQLを出力するように指定 db.default.logStatements=true
JDBCドライバも取得する必要があるので、 build.sbtファイルに、mysql-connectorを追記
$ vim build.sbt libraryDependencies ++= Seq( jdbc, anorm, cache, "mysql" % "mysql-connector-java" % "5.1.24" )
依存ライブラリなどなどを取得しておく。 確認の為に
$ play .. .. [hoge] $ reload [hoge] $ dependencies [hoge] $ exit
DBスキーマの定義、管理
ここまで準備ができたら、次はDBのテーブルつくったりとか、そういう事やります。
play2では、Evolutionsというものが用意されていて Evolutionsを使って、DBスキーマを管理できるみたい。 Railsとかのマイグレーションとは、違うんやね(そういうのもあるのかな?でも今回はこれ)
Evolutions作成!
DBスキーマ定義ファイル作成場所は、 conf/evolutions/default/ です。defaultというのは、 db.default....とさっきつくったファイルに定義したと思うんやけど そのDBに対しての設定ファイルをおいてますよーって事
命名規則は、1,2と順につけること、
conf/evolutions/default/1.sqlを作成してみる。 中身は、以下の内容
# --- !Ups create table User ( id int(10) not null auto_increment, name varchar(100), email varchar(100), password varchar(100), createDate timestamp default current_timestamp(), primary key(id)); # --- !Downs drop table User;
conf/evolutions/default/2.sqlも作ってみる
# --- !Ups create table Post ( id int(10) not null auto_increment, userId int(10) not null, title varchar(100) not null, body text, createDate timestamp default current_timestamp(), primary key(id), foreign key(userId) references USer(id) ); # --- !Downs drop table Post;
Ups,Downsは、見た感じの意味です! コメントは今回用ではなく、グルーピングの為に記述は必須だそうです。
じゃぁ実行してみよう
play2サーバを起動して、立ち上げたページにブラウザでアクセス。
play run http://localhost:9000/
すると、エラー画面的なものが表示
Apply this script now!をクリックして、sqlを実行します。 実行完了したら、いつものwelcomeページになります。
ほ、、ほんとうにmysqlに反映されてるのか確認
$ mysql -u root mysql> use mydb Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-----------------+ | Tables_in_mydb | +-----------------+ | Post | | User | | play_evolutions | +-----------------+ 3 rows in set (0.00 sec)
おおUserが出来てぃぃぃぃぃる!
mysql> desc User; +------------+--------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+-------------------+----------------+ | id | int(10) | NO | PRI | NULL | auto_increment | | name | varchar(100) | YES | | NULL | | | email | varchar(100) | YES | | NULL | | | password | varchar(100) | YES | | NULL | | | createDate | timestamp | NO | | CURRENT_TIMESTAMP | | +------------+--------------+------+-----+-------------------+----------------+ mysql> desc Post; +------------+--------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+-------------------+----------------+ | id | int(10) | NO | PRI | NULL | auto_increment | | userId | int(10) | NO | MUL | NULL | | | title | varchar(100) | NO | | NULL | | | body | text | YES | | NULL | | | createDate | timestamp | NO | | CURRENT_TIMESTAMP | | +------------+--------------+------+-----+-------------------+----------------+
おおおお、テーブルもできてる!! とりあえず、これで テーブル作成まで完了!!
今回の設定は、前回boxenで作ったmysqlに対して接続してるので、多少ポートなりなんなりが作り方によって変わると思います。 http://shinofara.hateblo.jp/entry/2014/01/16/232308