symfony1.4でTwitter Bootstrap使ってたらデバッグツールバーの表示が残念になったのでなんとかした

小ネタ。

Twitter Bootstrapいいですよね。僕はバリバリ使ってます。

そんなBootstrapですがsymfony1.4でデバッグツールバーを表示させるときにちょっとだけ問題があります。
topbarクラスを指定してページ上部固定のトップバーを表示させていると、デバッグツールバーがトップバーの後ろに隠れてしまうんです。

ちょっと困ります。

なのでこの状態を解決するためにbootstrap.cssのあとから読み込ませるcssをすこしだけ編集します。

div.topbar {
  z-index: 1000 !important;
}

これで大丈夫です。

symfonyデバッグツールバーのz-indexが10000、Bootstrapのトップバーもz-indexが10000故に起きる問題でした。

アジャイルサムライ他流試合に参加しました

2011/09/18 に開催されました「アジャイルサムライ他流試合」に参加しました。

イベント概要
http://atnd.org/events/19733

@shinyaa31さんによる当日のつぶやきまとめ
http://togetter.com/li/189708

監訳者の西村直人さん(@nawoto)、角谷信太郎さん(@kakutani)、会場を提供していただいたオラクルの @yokatsukiさん、主催の@ShiroKappaさん、ust職人の@brtriverさん、ナイスな名札をデザインしていただいた@NEKOGETさん、会場の準備や受付などの運営を行ったスタッフのみなさん、そしてこの日のために集ったサムライのみなさん、全ての方に改めて感謝をいたします。

僕も当日スタッフとして会場の設営、案内など行なっておりました。
スタッフとして参加しておいてなんなのですが、とても楽しく参加することができたイベントでした。

楽しかった理由はあの会場に集まった全員が達人開発者への道をもがきつつも歩んでいる仲間だったから、だと思います。
仲間がいることを再確認できたことが僕にとっての最大の収穫です。

この経験を糧に、よりよい仕事をするように燃え上がっています。
ときには挫けそうになるかもしれませんがその時はあの他流試合を思い出して頑張ろう、そう心に誓いました。

師を仰ぎ、師を追いかけ、師に歩調を合わせ、師の意図を組み、そして自らが師となろう。

Ubuntuでもコードやテストを保存したら自動でPHPUnitを実行して通知する環境

@HIROCASTさんが書いた記事「コードやテストを保存したら自動でPHPUnitを実行しGrowlへ通知する環境」に感銘を受けました。
僕が使用しているUbuntuでも同じように通知する環境を用意します。

まずUbuntuGrowlのように通知を表示してくれるnotify-sendをインストールします。

sudo apt-get install libnotify-bin

次にhttps://github.com/mynyml/watchrを参考にしつつwatchrをインストールします。

sudo gem install watchr
sudo gem install rev

このままだとwatchrにパスが通っていないので、.bashrcなどにパスを追加するように設定しておきます。

PATH="/var/lib/gems/1.8/bin:$PATH"

設定した内容を反映させて、watchrが実行できるか確認します。

jiska@jiska-laptop:~$ source .bashrc
jiska@jiska-laptop:~$ watchr -v
watchr version: 0.7

OKですね。

あとは@HIROCASTさんが用意してくれた環境(https://github.com/hirocaster/phpunit-stack)を参考にしつつwatch.rbをUbuntu向けに変更します。
といっても変更内容はGrowlをnotify-sendに変えただけです。

変更したものは僕のgithubにおいてあります。
https://github.com/jiska/phpunit-stack

[:large]

[:large]

これでUbuntuでもテスト結果が通知されるようになりました。
よりよいTDDライフを。

2011.07.07 23:40追記

@HIROCASTさんの素早い対応でmac,Linux対応になっています

PHPでTDD&CIワークショップにいってきました

PHPでTDD&CIワークショップにいってきました。スタッフのみなさん、会場を提供してくれたGREEのみなさんには感謝感謝です。

独学ながらTDDについて学んでるところなんですが、やっぱり同じ目的を持って勉強会に参加している方の手法や姿勢をみていると刺激になります。はじめてのペアプロも楽しかったです。jenkinsのセッションもすごく興味深いのであとでおさらいしてみたいですね。

さて、僕が参加したTDDセッションではおなじみのFizzBuzzをTDD手法で開発してみようというものでした。

とりあえずあの場で書きあがったコードを未完成ですが晒してみます。

fizzbuzz.php

<?php
/**
 * Generated by PHPUnit on 2011-06-20 at 21:36:50.
 */
class fizzbuzz {
  function getFizzBuzz($i) {
    if (!is_numeric($i)) throw new Exception('数値以外はだめだよ');

    if ($i % 3 === 0 && $i % 5 === 0) return 'FizzBuzz';  
    if ($i % 3 === 0) return 'Fizz';
    if ($i % 5 === 0) return 'Buzz';
    return (string) $i;
  }

  function getFizzBuzzList($from, $to = 1) {
    if (!is_numeric($from)) throw new Exception('数値以外はだめだよ');
    if (!is_numeric($to)) throw new Exception('数値以外はだめだよ');

    if ($from < $to) {
      $to = $from;
      $from = 1;
    }

    $result = array();
    for ($i = $from; $i <= $to; $i ++) {
      $result[] = $this->getFizzBuzz($i);
    }
    return $result;
  }
}

fizzbuzzTest.php

<?php

require_once dirname(__FILE__) . '/fizzbuzz.php';

/**
 * Test class for fizzbuzz.
 * Generated by PHPUnit on 2011-06-20 at 21:39:26.
 */
class fizzbuzzTest extends PHPUnit_Framework_TestCase {
  /**
   * @var fizzbuzz
   */
  protected $object;

  /**
   * Sets up the fixture, for example, opens a network connection.
   * This method is called before a test is executed.
   */
  protected function setUp() {
      $this->object = new fizzbuzz;
  }

  /**
   * Tears down the fixture, for example, closes a network connection.
   * This method is called after a test is executed.
   */
  protected function tearDown() {
  }

  function test_getFizzBuzz_引数が1のときには1() {
    $this->assertEquals('1', $this->object->getFizzBuzz(1));
  }

  // 別データでテストをすることで精度を高める
  function test_getFizzBuzz_引数が2のときには2() {
    $this->assertEquals('2', $this->object->getFizzBuzz(2));
  }

  function test_getFizzBuzz_引数が3の倍数のときはFizz() {
    # Test関数の中のassertは1つがベスト
    $this->assertEquals('Fizz', $this->object->getFizzBuzz(3));
  }

  function test_getFizzBuzz_引数が4のときには4() {
    $this->assertEquals('4', $this->object->getFizzBuzz(4));
  }

  function test_getFizzBuzz_引数が5の倍数のときはBuzz() {
    $this->assertEquals('Buzz', $this->object->getFizzBuzz(5));
  }

  function test_getFizzBuzz_引数が3の倍数かつ5の倍数のときはFizzBuzz() {
    $this->assertEquals('FizzBuzz', $this->object->getFizzBuzz(15));
  }

  function test_getFizzBuzz_引数が数字以外のときにはException() {
    try {
      $this->object->getFizzBuzz('');
      $this->fail('例外を返すつもりが反らなかったよ');
    } catch (Exception $e) {
      $this->assertEquals('数値以外はだめだよ', $e->getMessage());
    }
  }

  function test_getFizzBuzzList_引数が数字以外のときにはException() {
    try {
      $this->object->getFizzBuzzList('');
      $this->fail('例外を返すつもりが反らなかったよ');
    } catch (Exception $e) {
      $this->assertEquals('数値以外はだめだよ', $e->getMessage());
    }
  }

  function test_getFizzBuzzList_1_to_16 () {
    $expected = array(
      1,
      2,
      'Fizz',
      4,
      'Buzz',
      'Fizz',
      7,
      8,
      'Fizz',
      'Buzz',
      11,
      'Fizz',
      13,
      14,
      'FizzBuzz',
      16
    );
    $this->assertEquals($expected, $this->object->getFizzBuzzList(16));
   }

  function test_getFizzBuzzList_2_to_16 () {
    $expected = array(
      2,
      'Fizz',
      4,
      'Buzz',
      'Fizz',
      7,
      8,
      'Fizz',
      'Buzz',
      11,
      'Fizz',
      13,
      14,
      'FizzBuzz',
      16
    );
    $this->assertEquals($expected, $this->object->getFizzBuzzList(2, 16));
   }
}

これgetFizzBuzzListを呼び出した際に第2引数がある時とない時とでfrom,toがいい感じで入れ替わる…みたいな実装を考えた結果from,toの入れ替え処理が怪奇なことになってます。

先にテストありきで進めていかないとダメですね。

まだ精進が足りないです。

app/console cache:clearするときは--no-warmupオプションつけると幸せ

先日行われたSymfony2勉強会に参加してきました。
会場を提供してくれたZynga Japanさん、企画開催をしてくださったスタッフの皆さん、プレゼンを発表された方々、一緒に参加した皆さんに感謝です。すばらしいイベントだったので今後も参加していきたいですね。

さて、symfony1を使っている方がSymfony2をさわって一番最初につまづくのがsymfony ccに変わるapp/console cache:clearの挙動だと思うんです。

symfony1でcache:clearを行うとcacheディレクトリ以下のファイルを全削除して終わりだったのですが、Symfony2のapp/console cache:clearを動かすとcacheディレクトリ以下のファイルを消した後に再作成を行います

その結果webサーバーの実行ユーザーとapp/consoleを実行したユーザーとが違う場合、書き込み時などに権限が云々とエラーが発生してしまいドハマリします。自分はつまづきました。

yamlの記述間違いがキャッシュされてしまうのでクリアする、しかしブラウザ上で確認してみるとキャッシュファイルへ書き込み権限でエラーになる、そんな悲痛な叫びがワークショップでも聞こえました。
僕は 男は黙ってrm -fr app/cache/* などと物騒なことをつぶやいてみたりもしたのですが、あまりにも物騒です。まねしちゃだめです。

こんなときにはno-warmupオプションを使います。

php app/console cache:clear --no-warmup

このオプションをつけることでファイルの再作成を行わなくなります。

実際にはどんな風に動いているのか、
プロジェクトディレクトリ/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.phpを覗いてみるとわかります。

該当部分の抜粋です。

<?php

..

$realCacheDir = $this->container->getParameter('kernel.cache_dir');
$oldCacheDir  = $realCacheDir.'_old';

if (!is_writable($realCacheDir)) {
    throw new \RuntimeException(sprintf('Unable to write in the "%s" directory', $realCacheDir));
}

if ($input->getOption('no-warmup')) {
    rename($realCacheDir, $oldCacheDir);
} else {
    $warmupDir = $realCacheDir.'_new';

    $this->warmup(!$input->getOption('without-debug'), $warmupDir);

    rename($realCacheDir, $oldCacheDir);
    rename($warmupDir, $realCacheDir);
}

$this->container->get('filesystem')->remove($oldCacheDir);

というわけで、no-warmupオプションをつけると幸せになれるよというお話でした。


……ときにapp/console ccとか動かすパッチはニーズがありますかね?あれば書いてみます。

MacBook Air 11インチ欲しい!

MacBook Air 11インチ欲しい!

まわりのweb開発な紳士淑女がこぞってmac book airを導入して喜んでるのをみながら今日も僕はEeePC S101 on ubuntuを二年ほど使ってます。
しかしSSD容量が16GBしかないから辛いこともしばしば。

今回のキャンペーンで当選したら乗り換えちゃうかもしれない…

symfony2をローカルで動作させる環境をサクッと作る

この記事は、Symfony アドベントカレンダー 2010 に参加しています。


開発環境が不手際によって消えてしまったため用意してきた記事がパーになってしまいブルーです。
そこで開発環境の再構築をまとめた結果を記事にすることにしました。
アドベントに参加されている他のみなさんの記事を読んで、自分もsymfony2を試してみたい!
そう思った方の参考になれば幸いです。
なおUbuntu大好きな僕なので今回の構築作業はUbuntu10.10にて行っています。

必要なソフトウェアのインストール

apache,php,mysql,mongoDB,gitをインストールします。

sudo apt-get install -y apache2
sudo apt-get install -y mysql
sudo apt-get install -y mysql-server
sudo apt-get install -y mongodb
sudo apt-get install -y mongodb-server
sudo apt-get install -y git
sudo apt-get install -y php5
sudo apt-get install -y php5-mysql
sudo apt-get install -y php5-dev
sudo apt-get install -y php-pear
sudo apt-get install -y php-apc
sudo pecl install pdo

必要なものはインストールできました。

symfony2のダウンロードと設置

次にsymfony2の最新ソースをgithubからチェックアウトします。
今回は/home/jiska/Public以下にソースを設置することにします。

cd /home/jiska/Public
git clone https://github.com/symfony/symfony-sandbox.git

最後にapp/cache,app/logsディレクトリを全ユーザーで書き込める権限をつけます。
本番運用時ではphp実行ユーザーに適切な権限を与えましょう。

chmod 777 app/cache
chmod 777 app/logs

これでsymfony2の設置は完了です。

php.iniの設定確認

symfony2は設置しましたがすぐに使うことはできません。
php.iniの設定を変更する必要があります。

php /home/jiska/Public/symfony-sandbox/web/check.php

以下のエラーと警告が表示されました。

[[ ERROR ]] Checking that the "date.timezone" setting is set: FAILED
            *** Set the "date.timezone" setting in php.ini (like Europe/Paris) ***
You must fix this problem before resuming the check.

[[WARNING]] Checking that php.ini has short_open_tag set to off: FAILED
            *** Set short_open_tag to off in php.ini ***

/etc/php5/cli/php.ini, /etc/php5/apache2/php.ini それぞれに以下の値を設定します。

date.timezone = Asia/Tokyo
short_open_tag = Off

最後にapacheのドキュメントルートを設定してブラウザからアクセスしましょう。
/etc/apache2/sites-available/defaultを編集します。
オリジナルのdefaultは消してしまうともったいないので/etc/apache2/sites-available/default.distとリネームして保存しておきます。

cd /etc/apache2/sites-available
sudo cp default default.dist
sudo vi default
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /home/jiska/Public/symfony-sandbox/web
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /home/jiska/Public/symfony-sandbox/web>
        Options Indexes FollowSymLinkS
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ErrorLog ${APACHE_LOG_DIR}/error.log
</VirtualHost>

編集がおわったらapacheのconfファイル文法チェックを行ないましょう。

apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server localhost.localdomain (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost localhost.localdomain (/etc/apache2/sites-enabled/000-default:1)
Syntax OK

Syntax OKと表示されているので大丈夫ですね。たぶん。
apacheを再起動して、ブラウザからアクセスしてみます。

http://localhost/check.php

すべてグリーンで表示されていますか?もし表示されていなければphp.iniを確認してください。

これでsymfony2の環境作成は終わりです!

symfony2の使い方

symfony2の使い方ですが、いきなりソースを読み始めてもなにがなんだかわからない状態になってしまうかもしれません。
僕はなりました。symfony2はsymfony1.4から大きく構造が変わっているのも戸惑う原因の一つでした…。

公式サイトのドキュメントを見るのがいちばん手っ取り早いです。
Symfony2 Documentation

それでは良きsymfony2 lifeを。

Symfony Advent 2010

Symfony Advent 2010では12月1日から12月24日までを使って日替わりでsymfonyでイイなと思った小さなtipsから内部構造まで迫った解説などをブログ記事にして公開していくイベントです。

日本Symfonyユーザー会
Symfony アドベントカレンダー2010

※Syfony Advent 2010はsymfony好きな有志で集まったチームです。