PHP7でデザインパターン入門1/23 Iteratorパターン

結城浩氏の「増補改訂版Java言語で学ぶデザインパターン入門」を読んでいる。 これは、デザインパターンについてまとめられた良書だ。

デザインパターンについて、自分なりまとめてみようと思う。

Iterator パターンとは

Iteratorパターンとは、何かの集合体を順番に指し示して、全体をスキャンする処理を行うためのパターンである。

Iterator パターン - Wikipedia

Iterator pattern - Wikipedia

example

Iteratorパターンを利用して、本棚に本を入れ、その本の名前を順番に表示するプログラムを作成する。 PHP7で実装してみる。

<?php
interface Aggregate
{
    public function iterator(): MyIterator;
}

interface MyIterator
{
    public function hasNext(): bool;
    public function next();
}

class Book
{
    private $name;

    public function __construct(string $name) {
        $this->name = $name;
    }

    public function getName(): string {
        return $this->name;
    }
}

class BookShelf implements Aggregate
{
    private $books;
    private $last = 0;

    public function getBookAt(int $index): Book {
        return $this->books[$index];
    }

    public function appendBook(Book $book) {
        $this->books[$this->last] = $book;
        $this->last++;
    }

    public function getLength(): int {
        return $this->last;
    }

    public function iterator(): MyIterator {
        return new BookShelfIterator($this);
    }
}

class BookShelfIterator implements MyIterator {
    private $bookShelf;
    private $index;

    public function __construct(BookShelf $bookShelf) {
        $this->bookShelf = $bookShelf;
        $this->index = 0;
    }

    public function hasNext(): bool {
        return ($this->index < $this->bookShelf->getLength()) ? true : false;
    }

    public function next() {
        $book = $this->bookShelf->getBookAt($this->index);
        $this->index++;
        return $book;
    }
}

上記のiteratorパターンは以下のように利用できる

<?php
$bookShelf = new BookShelf();
$bookShelf->appendBook(new Book("Around the World in 80 Days"));
$bookShelf->appendBook(new Book("Bible"));
$bookShelf->appendBook(new Book("Cinderella"));
$bookShelf->appendBook(new Book("Daddy-Long-Legs"));
$it = $bookShelf->iterator();
while ($it->hasNext()) {
    $book = $it->next();
    echo $book->getName() . PHP_EOL;
}

実行結果

Around the World in 80 Days
Bible
Cinderella
Daddy-Long-Legs

まとめ

Iteratorを使うことで、BookShelfの実装に依存せずに数え上げることができる。 つまり、BookSelfの修正はwhile内のループには影響しない。BookSelfの利用者は、本の管理方法が変わったとしても、同じように数え上げることができる。

関連パターン

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

laravel 5.4 - vagrant環境(centOS6)で認証機能をデモしてみる

vagrant環境でlaravel 5.4 の認証機能をテストする

# composer からlaravelをインストールする
$ composer global require "laravel/installer"

# プロジェクトを作成する
$ laravel new myApp

$ cd myApp
$ composer install

$ cp .env.example .env
# .env の DB_HOST等を使用するDBの上に書き換える
$ php artisan key:generate

# permission
$ chmod -R 777 storage
$ chmod -R 777 bootstrap/cache

# デフォルトの認証用テーブル作成
$ php artisan migrate

# make:authで認証機能を作成
$ php artisan make:auth

# サーバ起動
$ php artisan serve --host 0.0.0.0

ブラウザから http://{vagrant環境ip}:8000/ へアクセスすると以下の画面が表示されるはず。

f:id:tic40:20170412090416p:plain

右上のregister からユーザ登録ができればOK。

おこりがちな問題

php artisanが動かない

composer install していないと動かない。

php artisan migrateでエラーが起こる

dbサーバへのアクセス情報が間違っている可能性がある。 .envを確認。あとはdbサーバにユーザ、ログインパスワードが 設定されてないとか。

ブラウザからregisterでユーザ登録時に以下のようなエラーが出る。

TokenMismatchException in VerifyCsrfToken.php line 68
  • bootstrap/cache, storage ディレクトリが書き込み可能になっていなければ、書き込み可能権限を与える。
  • 一度ブラウザのクッキーを削除してみる。

目黒川の桜

仕事終わりに中目黒へ夜桜を観に行った。

駅改札からもうかなりの人混み。配備された警備員が声を張り上げていた。

目黒川両脇には、屋台が並んでいて、ちょうちんの灯と合わせてまるで祭りのような雰囲気。 屋台ではワインを売ってる店が多くて、中目黒だなあという感じ。

とにかく混んでいて、終始身動きが取りにくかった。でもこの桜の景色はここでしか観れないんだろうな。

f:id:tic40:20170407204909j:plain

第218回TOEIC結果

結果

score: 785

  • listening: 440
  • reading: 345

過去最高点を20点だけ更新した(765 -> 785)。

readingは前回の320 -> 345 と25点アップしたが、実感はない。 最後の5問はほぼ読む時間がなく勘で答えたぐらいだから、運が良かっただけかもしれない。

readingがずっと300半ばで伸び悩んでて、どうすればいいのやら。 今日前回の結果が出たばかりだが、早速次の試験は今週だ。

前回試験からあまり勉強はできていないが、残りの時間はTOEIC公式問題集のreading partを繰り返しやろうと思う。

次回は4/9。

デジタル一眼の基礎知識まとめ

一昨年ミラーレス一眼を買った。Nikon J5 ダブルレンズキット。

購入して1年以上経っているが、未だにプログラムオート撮影しか使ったことがない。 もうちょっとこだわった写真を撮りたいと思うようになったので、勉強することにした。 Nikonのオフィシャルにデジタル一眼レフカメラの基礎知識という素晴らしいページがあったので参考にする。

www.nikon-image.com

以下は上記サイトのまとめ。

露出ってなに?

シャッタースピードってなに?

  • シャッターが開いている時間のこと
  • 1sec, 1/2sec, 1/4sec…のように表される
  • シャッタースピードが早いと、光は少なく、一瞬の動きを捉えられる(ブレが減る)
  • シャッタースピードが遅いと、光は多く、ブレは増える

絞り値(F値)ってなに?

  • レンズを通って撮像素子に写る像の明るさのこと
  • F1.4, F2, F2.8…のように表される
  • 絞り値を大きくすると、絞られレンズを通る光は少なくなる。反対に絞り値を小さくすると、絞りが開かれ光は多くなる。
  • 絞り値を大きくするほど、ピントの合う範囲が広がる
  • 絞り値を小さくするほど、ピントの合う範囲は狭くなる

被写界深度ってなに?

ピントをあわせた位置に対して、その前後のピントが合って見える範囲を、「被写界深度」と言う。

絞り値とシャッタースピードってどう組み合わせばいいの?

絞りとシャッタースピードの組み合わせで明るさは、同じ明るさでの撮影でも2通りの調整が可能。 実際にNikon J5 のマニュアル撮影で同程度の露出での違いを比較してみる。

シャッタースピード: 1/15 | F値:16 f:id:tic40:20170330212515j:plain

シャッタースピード: 1/1000 | F値:2 f:id:tic40:20170330213027j:plain

上記2枚の明るさはほぼ同じだが、被写界深度(ピントの合う範囲)が違っている。 F値が大きい上の写真は、ピントが広範囲に合っているが、下の写真はF値が小さいため、ピントが合っているのはカップのみで背景がボケていることがわかる。

ISO感度ってなに?

  • カメラが光を捉える能力のこと。
  • 国際標準機構(ISO)で策定された規格なのでISO感度と呼ばれる
  • ISO感度を2倍(例えばISO100 -> ISO200) に上げると、同じ絞り値であれば2倍早いシャッタースピードで撮影できる。
  • 暗い場所での撮影時に、ISO感度を上げれば、シャッタースピードを速くしてブレを抑えることができます。

シャッタースピード: 1/15 | F値: 1,8 | ISO感度: 400 f:id:tic40:20170331084226j:plain

シャッタースピード: 1/60 | F値: 1,8 | ISO感度: 1600 f:id:tic40:20170331084408j:plain

上記2枚の写真を比較すると、あまり違いがない。 つまり上の設定であればほぼ同じ写真を撮ることができる。

ではISO感度を上げるメリットはなにか。

  • ISO感度を上げるとシャッタースピードが速くできるため、手ブレや被写体ブレを防ぐことができる。
  • ISO感度を上げるとざらつきが発生することがある。ISO感度を上げることは、電気信号を増幅すること。信号が増幅されるときにノイズも増幅されるため、ISO感度を上げるほどノイズが増える。
  • ブレなどを防ぐために必要であればISO感度を上げる。必要がなければISO感度は上げすぎない

オートフォーカスってなに?

  • オートフォーカス(AF)とはカメラがピントを自動的に合わせる機能のこと。
  • シャッターボタンを半押しするとAFでピントが合う。

ホワイトバランスってなに?

  • ホワイトバランスとは、被写体に当たる光の種類に応じて変わる色味を調整して、白いものを白に近い色に仕上げる機能のこと。

レンズの性能はどこを見ればいいの?

焦点距離と画角

  • レンズの焦点距離とは、ピントを合わせたときの、レンズから撮像素子までの距離。
  • XXmmという数値で表される。ズームレンズの場合は、XX-YYmmというように焦点距離の両端の数字で表される。
  • 撮影画角とは、撮像素子に写る範囲を角度で表したもので、画角が広いと写る範囲が広くなり、画角が狭いと写る範囲が狭くなる。
  • 焦点距離の短いレンズほど画角が広くなり、写る範囲が広がる。
  • 焦点距離の長いレンズほど画角が狭くなり、被写体が大きくなる。

f:id:tic40:20170401095731j:plain

これはダブルレンズキットについている単焦点レンズ。このレンズの焦点距離は18.5mm。

レンズのフォーマット

レンズにはフォーマットがあり、どのレンズでも使えるというわけではない。 nikon J5 は CXフォーマットを採用しているため、DXやFXフォーマットは標準では使用することはできない。

遠近感: 広角レンズと望遠レンズの違い

  • 広角レンズは画角が広いため「近くのものはより大きく、遠くのものはより小さく」写る。
  • 望遠レンズは画角が狭いため、広角レンズほど近くのものと遠くのものの差が現れにくくなる。

開放絞り値(開放F値

  • レンズの絞りをもっとも開いた状態のことを「開放絞り」という。
  • 開放絞り値がそのレンズで設定できるもっとも小さい絞り値になる。レンズに表記されており、nikon J5 のダブルレンズキットの単焦点レンズだと'1:1.8'と書かれている部分、1.8が開放絞り値である。
  • 絞り値は、レンズを通って撮像素子上に写る像の明るさを表し、開放絞り値が小さいレンズは、開放絞り値が大きいレンズよりも、撮像素子上に写る像を明るくできる。そのため開放絞り値の小さいレンズを「明るい」レンズと言う。
  • 絞り値が小さいほど、被写界深度が浅くなり、背景などのボケを大きくできますので、開放絞り値の小さいレンズほど大きなボケを作り出せる。

最短撮影距離

  • レンズの最短撮影距離とは、被写体にピントを合わせることができる最短の撮影距離のこと。
  • 最短撮影距離よりも近い場所の被写体にはピントを合わせることができない。
  • レンズ自体には記載がない場合はレンズの仕様から確認できる。

http://www.nikon-image.com/products/lens/1nikkor/1_nikkor_185mm_f18/spec.html

画質モードと画像サイズ

  • RAW、JPEGTIFFなどのファイル形式が存在する。
  • 画像編集に向いているのはRAW形式。JPEGは圧縮されるため画像編集には向いていないが、ファイルサイズはRAWに比べて小さくなる。

まとめ

nikon J5 好きです。

多摩動物公園へ行く

多摩動物公園に行ってきた。

多摩動物公園駅を降りたら目の前がもう多摩動物公園入り口になっている。

入り口には「アリからゾウまで」の文字。A to Zってことかな?と思ったけど、それだとant to elephant だから違うよなあ。とかどうでも良いことを考えながらチケット購入窓口へ。

開園時間9:30の5分前に到着。既に結構入場行列ができていた。 入場料金は600円。動物園ってこんなに安いのか。600円なんて表参道ならコーヒー一杯しか飲めないっていうのに。

逆時計周りに周る。アフリカ園-オーストラリア園-アジア園を見て回った。 多分ゆっくり周ったら一日は楽しめる。割りと坂道が多く、一通り見て回るだけで4-5kmは歩くのでスニーカーに軽装が良い。

ショウジョウトキはとても美しかった。トラは生で見ると本当に迫力がある。フクロウはかわいすぎた。サーバルちゃんは人気。

昔子供の頃、動物園に連れて行って貰ったときはちっとも楽しくなかった。大人になってわかることもあるし、その逆もまたあるんだろうな。

f:id:tic40:20170320093029j:plain

f:id:tic40:20170320093308j:plain

f:id:tic40:20170320163846j:plain

f:id:tic40:20170320115603j:plain

f:id:tic40:20170320094727j:plain

f:id:tic40:20170320101022j:plain

f:id:tic40:20170320103659j:plain

ミュシャ展へ行く

国立新美術館ミュシャ展へ行ってきた。

www.mucha2017.jp

f:id:tic40:20170312173713j:plain

アルフォンス・ミュシャ - Wikipedia

メイン展示は、スラヴ民族の神話、歴史を描いたスラヴ叙事詩。チョコ以外での公開は初とのこと。

入場して、いきなり6m x 8m という超巨大な絵画がでてきた驚いた。

ミュシャは花をモチーフにした割りとグラフィックデザイナーというイメージを持っていたので、こんな壮大な歴史画を残していたことは知らなかった。

スラヴ叙事詩は、壮大な歴史画といっても、どこかファンタジーっぽい感じがミュシャらしい。血や虐殺など、歴史画にとっては重要な画をあえて描かないのはデザイナーだなあ。

スラヴ叙事詩がメインではあるが、その他にもポスター作品や商業的な作品展示もある。 ポスターのデザインは100年以上昔の作品なのに今風というか、全く古臭さを感じないのがすごい。

残念ながらメイン展示の写真を撮ることはできないが、いくつか写真撮影可能なスペースもあったので撮影してきた。

f:id:tic40:20170312165043j:plain

f:id:tic40:20170312165030j:plain

同時に開催されている草間彌生展が超行列だったのに驚いた。 あのドットがそんなに観る価値あるんだろうか、自分はよくわからない。

ともかく草間彌生を観に行く人は、ミュシャ展にも行くべき。