人生の恥は書き捨て

プログラムとかいろいろ

【Laravel入門】Bladeテンプレート

引き続きLaravelについて勉強していきたいと思います。

バックナンバー的なもの
【Laravel入門】 インストールから起動まで - 人生の恥は書き捨て
【Laravel入門】ルーティング - 人生の恥は書き捨て

LaravelのViewではBladeテンプレートという便利なテンプレートが使えるので、
それの紹介をします。

Bladeテンプレートとは

BladeテンプレートはLaravelの組み込みテンプレートです。
viewにphpをそのまま書くと煩雑になってしまうような、
テンプレートの継承、テンプレート処理、イテレーター処理などを、
簡単簡潔に記述することができます。

Bladeテンプレートのファイルは ファイル名.blade.phpで保存します。

使ってみる

レイアウト
app/views/layouts/master.blade.php

<html>
<body>
@section('sidebar')
parent
@show

<div class="container">
    @yield('content')
</div>
</body>
</html>

ビュー
app/views/template.blade.php

@extends('layouts.master')

@section('sidebar')
@parent
<p>child</p>
@stop

@section('content')
<p>ここは本文のコンテンツ</p>
@stop

こんな感じで使うことができます。


セクションの宣言をして

@yield('content')

セクションを実装します。

@section('contents')
<p>ここは本文のコンテンツ</p>
@stop

レイアウトで共通部分をだけを実装して、残りの部分の実装は個別のテンプレートに任せる場合は、
sidebar部分のように

宣言

@section('sidebar')
parent
@show

実装

@section('sidebar')
@parent
<p>child</p>
@stop

というようにします。

@show と @stop

Bladeテンプレートは、正規表現を使って置換を行っているだけなので、
想定されない使い方をすると変わった挙動をするようです。

@showの部分は継承したときに個別のviewが表示されるところを表していて、
継承したときに末尾に@stopをつけるわけですが、
じゃあ2回継承した場合どうなるの?って思ったのでやってみました。

master.blade.php

@section('sidebar')
master
@show

master2.blade.php

@extends('layouts.master')

@section('sidebar')
@parent
<p>master2</p>
@show

template.blade.php

@extends('layouts.master2')

@section('sidebar')
@parent
<p>template</p>
@stop

これで2重継承できました。
でも書き方が直感的じゃないというか@stopが2回ってどうなの?
master2の@stopを@showに変えると表示がおかしくなってしまいます。

fuelPHPで同じ名前のファイルアップロードができない件

はじめに

fuelPHPで同じ名前のファイルがアップロードできないという事がありました。
応急処置的な対処をしたので、方法を書いておきます。

auto_rename

fuelのuploadでは同じ名前のファイルをアップロードする場合、
3つの方法が選べます。

auto_rename = true

として同じ名前のファイルがアップされたら元ファイル名_(数字).extensionとする。

auto_rename = false

として同じ名前のファイルがあったら書き込みをしない。

auto_rename = false
overwrite =true

として同じ名前のファイルが来たら上書きする。
この3つです。

…ですが、auto_renameは正しく動いていないようです。
ここにauto_rename動いてねーよ!っていうプルリクが投げられた痕跡もあるようですが、
現状直ってない。
Fix auto_rename file checking logic by kenjis · Pull Request #1152 · fuel/core · GitHub

そもそもアップロードされた画像をそのままの名前で保存するのってどうなの?ってのもあるので、
今回は自分でrenameして保存することにします。

Uploadクラスのregistarメソッドでcallback関数を呼ぶ

詳しくはUpload 使い方 - クラス - FuelPHP ドキュメントに書いてあるのですが、
Uploadクラスのregistarメソッドでupload前の処理やあとの処理を設定できるようです。
registarの第1引数にvalidateを指定するとファイル保存前に処理を挟む事ができます。

これを使って、自分でファイル名を設定します。

Upload::register('validate',function(&$file){
            $uid = uniqid("image_");
            $file['basename'] = $uid;
            $file['name'] = $uid;
            $file['name'] .= ".".$file['extension'];
        });
        Upload::process();
        if (Upload::is_valid())
        {
            Upload::save();
        }

これでファイル名を指定してファイル保存ができます。

【Laravel入門】ルーティング

はじめに

前回Laravelのインストールをやりました。
詳細はこちら→【Laravel入門】 インストールから起動まで - 人生の恥は書き捨て

つい先日Laravelの日本語版サイトもできたということで、
なかなか盛り上がってきているようです。
Laravel - ウェブ職人のためのPHPフレームワーク

今回はLaravelのルーティングについて見て行きたいと思います。

routes.phpでのルーティング

Laravelでは、基本的にリクエストとレスポンスの対応をroutes.phpに書いていきます。

文字列を返す

Route::get('/', function()
{
	return "Hello Laravel!"
});

この記述でルートにgetリクエストが来たときに、"Hello Laravel""という文字列を表示します。
ここではPHP5.3以降からの無名関数が使われています。function(){~}の部分ですね。
リクエストに対して文字列を返す無名関数を返しています。

Route::get('/', function()
{
	return "Hello Laravel!"
});

Viewを返す

リクエストに対してViewを返します。
これもViewを返す記述をした無名関数を返しています。

Route::get('/', function()
{
	return View::make('hello');
});

app/views/hello.php が表示されます。

関数を返す

リクエストに対して関数を指定して返します。

Route::get('/', 'HomeController@sayHello');

app/controllers/HomeController.phpのsayHelloメソッドが実行されます。

<?php

class HomeController extends BaseController {
    public function sayHello(){
        return View::make('hello');
    }

}

という風にHomeController.phpに記述しておけば、【Viewを返す】と同様になります。

更に詳しいルーティングについてはここに載ってます。
ルーティング

Controllerでのルーティング

Laravelでは基本的にはroutes.phpでルーティングを設定しますが、
Restfulコントローラーというのを使えば、Controller内でもルートごとのロジックを記述することができます。

routes.php

Route::controller('/', 'RestfulController');

と記述して

app/controllers/RestfulController.php

<?php
class RestfulController extends BaseController{
    public function getIndex(){
        return "get";
    }

    public function postIndex(){
        return "post";
    }

    public function getYo(){
        return "Yo";
    }
}

と記述すれば、
/にgetリクエストをした時は、get
/にpostリクエストをした時は、post
/yoにgetリクエストした時は、yo
それぞれの文字列を表示できます。
さらに詳しくはここに載ってます。
コントローラー

【Laravel入門】 インストールから起動まで

はじめに

phpのframeworkで最近特に注目度が上がってきているLaravelのインストールです。

環境

php5.4以上の入っている環境を用意してください。


前にphpのセットアップについても書いてるので、
良ければどうぞ。
Vagrantのprovisioningを使ってapache2.4+php5.4+mysql5.6 - 人生の恥は書き捨て

インストール

LaravelはComposerというPHPのパッケージ管理プログラムを使用してインストールするので、
Composerを入れます。

curl -sS https://getcomposer.org/installer | php


成功するとだいたいこんなかんじのメッセージが出ます。

#!/usr/bin/env php
All settings correct for using Composer
Downloading...


Composer successfully installed to: /usr/local/apache2/htdocs/composer.phar
Use it: php composer.phar


グローバルに配置して、いつでも使えるようにしておきましょう。



準備ができたら早速Laravelをインストールします。

composer create-project laravel/laravel プロジェクト名 --prefer-dist


なんかやたら時間がかかります。
最初の1分位で「あれ?動いてないのかな?」と思うかも知れませんが、
多分動いてるのでもう2、3分待ちましょう。

[RuntimeException]  
  Error Output:

というエラーが出た時は、phpのモジュールが足りていない場合があります。
自分の場合はmcryptが入ってなかったので、入れてphpコンパイルし直しました。


インストールが終わったら、
アクセスしてみましょう。
アクセスするところは プロジェクト名/public/ です。


ここで

Error in exception handler. 

というエラーが出ました。


これはプロジェクト内のapp/storageに書き込み権限がないから起きるようです。
なので、

chmod -R 777 app/storage 

します。


もう一回アクセスすると
f:id:kazuhei0108:20140713224031p:plain
こんな画面が表示されます。


うまくインストールできたようです。

Apache Solrのインストール

はじめに

Apache Solrのインストールについてです。

Solrは便利な全文検索システムです。
様々な機能があって、サイト内検索などに便利です。
フリーワード検索、類似語検索などが高速に行えます。

Solrのインストール

Solrはjavaで動いているので、javaを入れます。

yum install java-1.7.0-openjdk.x86_64

yum install java-1.7.0-openjdk-devel.x86_64

yum install ant.x86_64

次に、Solrをダウンロードします。

wget http://ftp.riken.jp/net/apache/lucene/solr/4.9.0/solr-4.9.0.tgz

tar xzf solr-4.9.0.tgz

ダウンロードしたファイル内に、サンプルのファイルがあるので、実行します。

cd solr-4.9.0/example

java -jar start.jar

これで起動が確認できます。

f:id:kazuhei0108:20140713000225p:plain


コマンドの設定

便利に使うために、
solrをserviceとして登録して、
service solr startというふうに呼び出せるようにします。


起動用のスクリプトを/etc/init.d/solr として作成します。

  1 #!/bin/sh
  2 # chkconfig: 345 90 90
  3 # description: Solr Boot
  4 JETTY_HOME_DIR=/usr/local/solr/example/
  5 cd $JETTY_HOME_DIR
  6 JAVA="/usr/bin/java"
  7 LOG_FILE="/var/log/solr.log"
  8 
  9 KEY=stopkey
 10 CORE=solr
 11 cd $JETTY_HOME_DIR
 12 start() {
 13   $JAVA -Dsolr.solr.home=${JETTY_HOME_DIR}${CORE} -DSTOP.PORT=8079 -DSTOP.KEY=$KEY -jar start.jar >> $LOG_FILE 2>&1 &
 14   echo "Solr started!"
 15 }
 16 
 17 stop() {
 18   $JAVA -DSTOP.PORT=8079 -DSTOP.KEY=$KEY -jar start.jar --stop
 19   echo "Solr stopped!"
 20 }
 21 
 22 case "$1" in
 23     start)
 24         start
 25         ;;
 26     stop)
 27         stop
 28         ;;
 29     restart)
 30       stop
 31       start
 32       ;;
 33     *)
 34       echo "Usage: $0 {start|stop|restart}"
 35       exit 1
 36 esac

4行目のJETTY_HOME_DIRはsolrをインストールした場所を指定してください。
僕はusr/local/に解凍したフォルダをsolrという名前に変更して配置したのでこのようになっています。


solrは停止するときに、起動時とは違うポートを指定する必要があります。
solrの起動時のdefaultのポートは8983になっていて、停止時のポートは今回8079にしています。

ここまでできたら、

chkconfig --add solr

でsolrをserviceに登録できます。

chkconfig solr on
service solr start

自動起動とserviceコマンドからの起動ができます。

solrを使ってみる

solrのデータ登録と検索を簡単に試してみます。

データの登録

登録するためのxmlファイルを用意します。

lovelive.xml

<add>
    <doc>
        <field name="id">1</field>
        <field name="name">Honoka Kosaka</field>
    </doc>
    <doc>
        <field name="id">2</field>
        <field name="name">Umi Sonoda</field>
    </doc>
    ・
    ・
    ・
    <doc>
        <field name="id">7</field>
        <field name="name">Nico Yazawa</field>
    </doc>
    <doc>
        <field name="id">8</field>
        <field name="name">Eri Ayase</field>
    </doc>
    <doc>
        <field name="id">9</field>
        <field name="name">Nozomi Tojo</field>
    </doc>
</add>

そして、このファイルをsolrに向かってpostします。

curl 'http://localhost:8983/solr/collection1/update?commit=true&indent=true' --data-binary @lovelive.xml -H 'Content-Type: text/xml'

これでデータが登録されます。

solrではデータをsolrに渡して、それをcommitすることで初めて検索ができるようになります。
solrのcommitは時間がかかるので、普通は複数のデータをsolrに渡してからcommitで一度に書き込みます。
今回はcommit=trueとして、データ渡しとcommitを両方行っています。

データの検索

さっき登録したデータからNicoという言葉を検索します。

curl "http://localhost:8983/solr/collection1/select?q=Nico&wt=json&indent=true"

形式はjsonを指定しています。
f:id:kazuhei0108:20140713005550p:plain
ちゃんと検索出来ました。

エンジニアとして入社してから入れたMacの便利ツール5つ

入社してから先輩に便利だから入れるといいよと言われたツールを紹介します。
これでMacでの開発がよりはかどるかも。

Alfred

f:id:kazuhei0108:20140707001411p:plain

とっても便利なランチャーです。
検索は高速で、1文字打ち込むごとに対象がしぼられていきます。

f:id:kazuhei0108:20140707001424p:plain

アプリケーションの起動と終了はこれで一瞬

f:id:kazuhei0108:20140707001546p:plain

有償版にするとさらにいろいろな機能が使える様ですが、
無償版でも十分に便利です。

インストールはここから

Alfred

Alfred

  • Running with Crayons Ltd
  • 仕事効率化
  • 無料


Dash

リファレンスを探すときに便利なツールです。
あらかじめ、自分の使う言語を登録しておくと、
登録したすべての言語のリファレンスを検索できます。

f:id:kazuhei0108:20140707001931p:plain

さらに、先ほどのalfredとの連携設定をしておくと、
dash serchという形でそのままdashの検索機能が使えます。

f:id:kazuhei0108:20140707001952p:plain

alfredから直接リファレンスを検索できてなお便利です!


連携はalfredの設定から行います。

f:id:kazuhei0108:20140707003739p:plain

右下のAdd Custom Searchからdashを登録します。

f:id:kazuhei0108:20140707003900p:plain

キーワードはalfredからdash searchを呼び出すための文字列なので、
自分の使いたい文字を入れてください。

インストールはここから

Dash (Docs & Snippets)

Dash (Docs & Snippets)

Better Touch Tool

windowsの様にブラウザ等を簡単にディスプレイ全体に広げたり、
寄せたり等ができます。

インストールはここから
Great Tools For Your Mac By Andreas Hegenberg » BetterTouchTool, BetterSnapTool & SecondBar

KeyRemap4Mac

エディタを使っている時など、通常の設定だと移動速度が遅くて不便。
KeyRemap4Macを使えば、キーの連続入力の認識時間と間隔時間を変更できます。
KeyRepeatのDelay Until RepeatとKeyRepeatのところを設定してください。

f:id:kazuhei0108:20140707002616p:plain

早くしすぎると、打ち間違いの元になるので、適度な感じで。

インストールはここから
KeyRemap4MacBook - OS X用のソフトウェア

Sequel

MySQLフロントエンド用のアプリケーションです。
Macっぽいおしゃれで便利なUIでデータベースが扱えます。

f:id:kazuhei0108:20140707003215p:plain

当然、テーブルを作ったり、カラムの設定をいじったり、レコードを挿入したり、
スマートにできます。
もうphpMyAdminなんかにはおさらば

インストールはここから
Sequel Pro

Vagrantのprovisioningを使ってapache2.4+php5.4+mysql5.6

タイトル通りです。

apache2.4とphp5.4とmysql5.6で開発環境を作って、
vagrantのprovisioninigで使えるように、そのshellscriptを書き出しました。

apache2.4はソースからインストールしなければならず、
それならphpもソースからインストールするかーってな感じ。

これで、apachephpmysqlがインストールされています。
しかし、この状態ではapacheを起動するhttpdコマンドがserviceに登録されていません。
かなり使いづらいので、コマンドのスクリプトをコピーしてきてサービスに登録します。

cp /usr/local/src/httpd-2.4.9/build/rpm/httpd.init /etc/init.d/httpd
vim /etc/init.d/httpd

編集内容

60 httpd=${HTTPD-/usr/local/apache2/bin/httpd}
61 pidfile=${PIDFILE-/usr/local/apache2/logs/${prog}.pid}
62 lockfile=${LOCKFILE-/usr/local/apache2/logs/${prog}}
・
・
・
67     CONFFILE=/usr/local/apache2/conf/httpd.conf

パスをapache2.4の方のコマンドに書き換えました。

httpdコマンドをserviceに登録

chkconfig --add httpd

これでserviceにhttpdが登録されたので、

service httpd start 

apacheが立ち上がります。