Technofara

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

# 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

vagrantcentos環境に入れた手順メモ

$ 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

参考

http://apatheia.info/blog/2013/06/17/docker/

# 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

たしかに。

参考

http://www.1x1.jp/blog/2013/12/docker_on_centos65.html

# 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

完了!

参考 http://qiita.com/yuku_t/items/9312fd82a0fd291b683f

# 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

参考

http://www.atmarkit.co.jp/ait/articles/1307/02/news021.html