ぷぎがぽぎ このページをアンテナに追加 RSSフィード

2015-12-20

[][] Loggerクラスをテストのたびにmockを用意しなくて済むための工夫

この記事は、Symfonyアドベントカレンダー2015の19日目の記事です。でも今日は20日ですね。(ごめんなさい。。忘れてました。。

18日はnaoyesさんのSymfonyプロジェクトのテストにCodeceptionを使ってみるでした。

今日は11/24 に開催された PHP BLT #1 でLTしてきた内容ですが、まだ発表内容をまとめていなかったので書きます。

Symfony では yaml でサービス構成の定義ができる

Symfony で 何かサービスを作るとき、必要な外部サービスを次のようにyamlで定義することができ、DI コンポーネントによって hoge_manager が用意されます。

    hoge_manager:
        class: HogeBundle\Service\HogeManager
        arguments:
            - @doctrine.orm.entity_manager
            - @report
            - @slack_notification
            - @loger

そして、HogeManager クラスはargumentsで定義した何かをコンストラクタで受け取るようにすればいいわけです。

<?php
/**
 * Hoge Manager
 */
class HogeManager
{
    public function __construct($em, $reporter, $slack, $logger)
    {
        $this->em = $em;
        $this->reporter = $reporter;
        $this->slack = $slack;
	$this->logger = $logger;
    }

コントローラーからは InjectParams が便利

また、このように名前をつけた何かは、コントロラーからなどは `InjectParams` を使えばコンストラクタなどで利用することもできます。

<?php

namespace HogeBundle\Controller\Hoge;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use JMS\DiExtraBundle\Annotation as DI;

/** @Route("/hoge") */
class HogeController extends Controller
{
    private $hoge;

    /**
     * @DI\InjectParams({
     *     "hoge" = @DI\Inject("hoge_manager")
     * })
     */
    public function __construct($hoge)
    {
        $this->hoge = $hoge;
    }

外部の何かを利用したクラスのテストはmockが活躍

さて、このHogeManager クラスのテストを書いてみましょう。このマネージャのテストを書きたいので、

外部の何かはmockにすることになります。Phakeを使うとこんな感じでしょうか

<?php
namespace HogeBundle\Tests\Service;

use HogeBundle\Service\HogeManager;

class HogeManagerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * setup
     */
    public function setUp()
    {
        $this->logger = \Phake::mock('Psr\Log\LoggerInterface');
    	...

ここで `$this->logger` を毎回用意しないといけなくなります。

もはや mock を毎回書かなくてもテスト書けるように慣れると幸せですよね。というわけで Loggable Trait を作ってみます。

Loggable Trait

<?php
namespace Hoge\HelperBundle\Logger;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Log\NullLogger;

trait Loggable
{
    /** @var LoggerInterface */
    private $logger;

    public function setLogger($logger)
    {
        $this->logger = $logger;
    }

    protected function logger()
    {
        if (is_null($this->logger)) {
            $this->logger = new NullLogger();
        }

        return $this->logger;
    }
}

コードはたったこれだけです。

loggerのsetterを用意しているのと、getterではsetされていなければNullLoggerを返しています。

なので、setされていなくてもエラーを履かずに動きます。

なので、yaml定義を以下のようにします。

    hoge_manager:
        class: HogeBundle\Service\HogeManager
        arguments:
            - @doctrine.orm.entity_manager
            - @report
            - @slack_notification
            - @loger
		calls:
			- [setLogger, ["@logger"]]

コンストラクタではなくsetLoggerをコールするように指定します。

HogeManager は Trait を使うので以下のようなコードに修正します

<?php
/**
 * Hoge Manager
 */
class HogeManager
{
use Loggable;
    public function __construct($em, $reporter, $slack)
    {
        $this->em = $em;
        $this->reporter = $reporter;
        $this->slack = $slack;
    }

コンストラクタでloggerを渡さなくてもよくなりましたし、logger関連のメソッドは全部Traitにあるのでuse Loggable するだけです。

これで、テストもmock作らなくてもNullLoggerが勝手に作成されるのでテストもすっきりします。

コンストラクタで渡す何かが増えすぎたら設計を考えなおす時期かもしれない

あと、このLoggableを使うとわかることは、そのサービス全体が依存しているものはコンストラクタで渡すのは自然で良いのですが、

サービスの一部だけが依存しているようなものまでもコンストラクタで渡すようにするとテストが辛いものになりやすくなります。

サービスの一部が利用するような外部の何かは、その一部で利用するメソッドで渡すなど別の手段を考えてみたほうが良いです。

Symfony では簡単に依存関係をコンストラクタで渡せるのでついついなんでも書いてしまいがちですが、

コンストラクタに大量に何か渡すような設計になってきたら、本当にそれはコンストラクタで渡すべきなのか、またはクラスの仕事が多すぎるなど設計を再度考える時期なのかもしれませんね。

というわけで、20日はimunewさんで「Doctrine DBALで取得したデータをキャッシュする」です!(既に公開されていますね!すばらしい!いや、ほんとごめんなさい。。

DBの問い合わせがWebアプリケーションで一番重くなることはよくあるので、キャッシュ大事ですよね!

2015-12-06

[] 勉強会で発表するときに役立つ正しいマイクの扱い方

Microphone

この記事はAdvent Calendar 2015 - VOYAGE GROUP 6日目の記事になります.

こんにちは!社内で音響エンジニアしてる @brtriver です。

今日はPA*1屋さん的視点でマイクの正しい扱い方についてお話できればなと思い、アドベントカレンダーで書くことにしました。


IT関連では勉強会も多く開催されており、勉強会で発表される機会がある方も多いと思います。

そのときに普段利用しないけど使うことが多いのがマイクです。


でも、そのマイクも正しく使えずに損をしている方がチラホラ見受けられます。

正しく使えることで、発表内容をより参加者に聞こえやすくなり伝えたい事もより伝わると思います。

ある意味カラオケでも活用できるネタですが色々書いてみます。

やってはいけないことを覚えるだけ

i can has hit record?

正しい持ち方を覚えるよりは、やってはいけないこと覚えると自然と良い持ち方になるということで

やっちゃダメなことについて説明してきます。

マイクが入っているかどうか確認するときにヘッド(マイクの頭の部分)を叩いてはいけない

Speak up!


マイクのヘッド部分を叩いて確認する人がいますが、あれはNGです。

マイクの音を拾う部分は衝撃に強くありません。最悪マイクが壊れてしまう可能性があります。

じゃあどうするか。ツメサキでヘッドの部分を "カリカリ" してみましょう。

それでスピーカーから聞こえていれば入っているということですね。

マイクをスピーカーに向けてはいけない

loudspeaker
これを説明するためには "ハウリング" (通称ハウる) について簡単に説明しておく必要があります。 ハウリングとは "ピーン" とか "キーン" とかなるアレのことです。 最悪スピーカーが壊れてしまう可能性があります。またお客さんも不快ですよね。 ハウリングは特定の音域が マイク => (増幅) => スピーカー => マイク => (増幅) => スピーカー とループすることで発生します。 色んな要因があるのですが、一番分かりやすく避ける方法はループしないようにすることです。 なので、マイクをスピーカーに向けるようなことをやってはいけません。 通常の勉強会だとスピーカーとマイクがそれほど近くにあるということは無いと思いますが知っておいてください。
また、勉強会でハウリングがよく発生するときは、スピーカーの位置と発表者のマイクの位置を調整しましょう。 もし、スピーカーが発表者の後ろにあるような場合は、スピーカーの位置より前に置くようにすることでハウリングは防げます。
あと、手にマイクを持って話しながら移動したりするときも、スピーカーの位置を把握しておいて スピーカーにマイクを向けないようにしましょう。
ちなみに、よくライブやイベントの現場で "ワンツー、ワンツー..." といった発言している人達がいますが、 彼らはマイクチェックとモニターのスピーカーのチューニングをしているPAさんたちです。 "ワン" の部分で低い音域、 "ツー" の部分で高温域を発声してスピーカーがハウリングするポイントを探してるんですね。 ハウりやすい音域のレベルを下げたりしてます。 おっと、話がそれたので戻します。

マイクから離れすぎてはいけない

Andy with Mic 1
さきほどハウリングについて説明しました。 話す人がマイクから離れていると、スピーカーから聞こえるようにするためにスピーカーのボリュームを上げたり、 マイクの感度(ゲイン)を上げる必要があります。 そうすることで、周りの余計な音も増幅されてしまいハウリングしやすくなってしまいます。 なので、マイクにはできるだけ近づいた方が良いです。 どれほど近づいた方が良いかは地声の大きさなどもありますので色々探ってみてください。 少なくとも、マイクが遠くて声が小さいときにはマイクに近づくようにしましょう。 スピーカーのボリュームを上げるのはその次の手段です。
演台だとミニスタンドにマイクが設置されていることがありますよね。 自分は観客側を見て話したり、スクリーン側を見て話しをしたりすることがある場合は手に持って話すようにしています。 そうすることで、マイクとの距離を一定にして話すこともできますしUSTREAMなどの配信されている場合でも一定の音量で流れるからです。

マイクのヘッドの下半分を持たない

rap
マイクには指向性というものがあります。 発表者が使うマイクで手に持つようなタイプは大体単一指向性というマイクになると思います。 これはマイク正面の音を一番よく拾います。横からの音はほとんど拾わないような仕組みになっています。 そうすることで余計な音を拾わずにハウリングにも強くなっているのです。 が、マイクのヘッドの下半分を手で覆ってしまうと指向性がなくなり無指向性になってしまいます。 簡単にハウります。声質もモコモコとこもった感じになります。 参考正しいマイクの握り方
よくバンドマンがマイクのヘッド部分を持って歌っていたりしますが、全部覆わないような握り方をしているはずです。 とはいえ、勉強会ではそういうラッパー的な持ち方をされている方は見たことないので大丈夫だと思います。が。

突然ケーブルを抜かない

Standby
これはマイクに限らずですが、スピーカーのボリュームが上がった状態でケーブル抜くと場合によっては "ボンッ" と大きなノイズが出ることがあります。 これは下手するとスピーカーを壊してしまいますのでケーブルは勝手に抜かないようにしましょう。

正しいマイクの扱い方

Man holding microphone
というわけでまとめると以下のようにマイクを使うとリスナーも聞きやすくて発表の感想が良くなるかもしれません。
  1. スピーカーの位置を確かめる。
    • スピーカーにはマイクを向けるとハウるので位置確認する
    • マイクを直接向けないように気をつける
  2. 演台からマイクを手に持つ
    • ラッパー持ちしない
  3. 爪でカリカリして繋がっているかを確認する
    • 叩かない
  4. できるだけ口に近づけて話す
    • 音が大きすぎるなと思ったらマイクを少し離して調整する
  5. 発表が終わったら演台に戻す
    • 勝手にケーブルを抜かない
なにはともあれ、出来る限り声は大きめではっきりと滑舌よく話せすことはマイクの使い方以前に大事です。はい。

おまけ

懇親会の乾杯の挨拶とかで、突然叫びたくなった場合は、マイク使わず叫んでください。 普通の勉強会の会場の音響設備ではコンプレッサー通されてないので大体スピーカー痛めます。
これで皆さんの発表もより参加者に伝わりつつ、カラオケでも高得点が狙えますね!

*1PAとは Public Addressの略でコンサートなどで客席の一番いいところで大きな機械さわってオーディエンスにステージの音を伝えるお仕事してたりします

2015-12-02

[] #ajiting Advent Calendar 2日目 AJITOで音楽を楽しむためのメモ

1日目

こんにちは。VOYAGE GROUPの社内Bar「AJITO」に関するAdvent Calendar 2日目です。


2日目は AJITO で音楽を楽しむ方法についてメモっておきます。

というのも、AJITOで飲むときにBGMがあると、ちょっとおしゃれな感じになったり、懐メロテロ的に流して楽しんだりすることもできますよね!

AJITO でスマホに入っている音楽を流す方法

AJITO には常設の音響機器があるので、それを使って流すだけです。

f:id:brtRiver:20151202133829p:image

入り口にテーブルがあり、そこにミキサーやらマイクやらが配置されています。

この中に Bluetooth でペアリングすればスマホの音声出力を AJITO のスピーカーに繋ぐことができる BELKIN のレシーバーがあります


お手持ちのスマホの Bluetoothを有効にして belkin とペアリングするだけです

f:id:brtRiver:20151202133813p:image

ペアリングができれば belkin 本体が青く光ります

f:id:brtRiver:20151201131918j:image

ボリュームが最大になっていると、突然大音量が流れて周りがびっくりしますので、ボリュームは最小にしておきます。

あとは、スマホで曲を再生してみてください。再生が始まってからジョジョにボリュームを上げて良い感じに調整してください。


AJITO で生演奏する方法

AJITO では生演奏するための楽器もあったりします。たとえば電子ピアノが AJITOの奥に常設されています。

f:id:brtRiver:20151201132156j:image

椅子だと思って座っていたものが実はカホンだったりします。ウクレレもあります。

(supported by VOYAROCK)

お酒を飲んで生演奏したくなったら是非弾いて楽しんでみてください。

明日は _nishigori さんです。

2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |