[PHP]初めてのfizzbuzzワンライナー

今日、『パーフェクトPHP』を読んでいたところ、range()、array_map()そして無名関数と、fizzbuzzをやるのにぴったりな関数がバシバシ出てきました。ということで、書いてみました、fizzbuzzワンライナー。

<? array_map(function($n){echo$n%15==0?'fizzbuzz':($n%5==0?'buzz':($n%3==0?'fizz':$n));},range(1,100));

↑の行がそれです(折り返してるかもしれませんが、改行はありません)。スクリプト言語の実行結果をブラウザー上で確認できるllevalで、言語をphpにしたあと、上のスクリプトを貼り付けて「eval」すれば、fizzbuzzの結果が確認できます。手元にPHPの実行環境があるなら、そちらでもOK。

このスクリプト、出力は以下のスクリプトと同様です。

<?php
for ($i = 1; $i <= 100; $i++) {
    if ($i % 15 === 0) {
        echo 'fizzbuzz';
    } elseif ($i % 5 === 0) {
        echo 'buzz';
    } elseif ($i % 3 === 0) {
        echo 'fizz';
    } else {
        echo $i;
    }
}

これを、1行でやるにはどうするか。今回利用したのは、「配列の生成」「関数を呼ぶ関数」「無名関数」の組み合わせ。

range()は配列を生成する関数で、例えばrange(1,3)とすると、1から3までの数字を要素にもつ配列を返します。

array_map()は受け取った配列に対して指定された関数を実行する関数。

そして無名関数は、名前をつける必要がなく、その場で実行できるユーザー定義関数。

これらを組み合わせることで、1行でfizzbuzzを実現しています。

また、出来るだけ短くするため、3項演算子をネストして用いたり(可読性が落ちる)、開始タグを省略形にしたり(移植性が落ちる)、比較演算子に===ではなく==を用いていたり(予期せぬ型変換で事故る可能性がある)と、あまり褒められないコーディングスタイルだったりもします。仕事で書くぶんには、後ろのfizzbuzzの方が無難でしょう。

『Head First PHP & MySQL』を読了した

Head First PHP &amp; MySQL ―頭とからだで覚えるWebアプリケーション開発の基本
Head First PHP &amp; MySQL ―頭とからだで覚えるWebアプリケーション開発の基本

Head FirstシリーズのPHP&MySQL版。日本語版で、本文600ページ弱。原著の第11章「Drawing Dynamic Graphics: Visualizing Your Data… and More!」は収録されていない。

PHPは初心者でも学びやすい言語といわれることがあるが、実際には覚えるべきことは多い。データベース(PHPを使う場合、データベースはMySQLであることが多い)の知識はしっかり身につける必要があるし、HTTP通信の知識も必要。

ただし、これは他のサーバーサイド言語でも同様。PHPは、HTMLに埋め込んで使えるので、サーバーサイドのWebアプリケーション開発言語としては敷居が低い。そこが、多くのWebアプリケーションがPHPで開発される理由だろう。

本書にはオブジェクト指向は入ってないし、セキュリティ対策もまだ足りていない部分がある。また、実務ではLinuxサーバーにリモートでログインして操作することが多いので、Unixの知識も必要。。。といった具合に、不足している部分はあるのだが、「HTMLの知識はあるが、PHP及びプログラミングの知識はゼロ」な入門者に向けて書かれた本としては、かなり充実した内容になっている。本書を読み通せばサーバーサイド開発者の入り口には立てるはず。

本の構成は妥当だし、サンプルコードも「無理やり」感があまりない。また、原著のおかしな部分にツッコミを入れたり、登場人物の名前や文章を「超訳」したりと、翻訳者の頑張りとセンスが光っている。

唯一難点なのは、出版年の古さ。本書は2008年に出た本だが、MySQLはバージョン5.1以降で文字コードの設定方法が変わっている。現在の最新版はMySQL5.5なので、本書の設定方法では動かない。MySQL5.5に対応した文字コード設定に関しては、以前書いた記事があるので参考までに。

あと、日本語版のサンプルコード、私の環境(Mac OS X/Ubuntu)では文字化けやら改行コードやらで大変なことなっていた。英語版の方は問題なかった。

本書で初めてプログラミングを学ぶ、という人にはオススメしづらい。PHPの入門書を読んだけど、知識に不足を感じている人にはオススメ。

Essential ActionScript 3.0 読書メモ 第17回 メソッドからの返り値

メソッドが引数という形で値を受け取る事ができるのと同様、メソッドは値を返すこともできる。メソッドから値を返すためには次のように書く。

例:

function methodName () {
  return value;
}

メソッドが実行される時、そのメソッドの返り値は、そのメソッドを呼んだcall式の値になる。

例:

function getDate () {
  date = new Date(); // Dateクラスのオブジェクトをインスタンス化
  return date.time; // timeパラメーターにはオブジェクト生成時のUNIXタイムが数値形式で入る
}

testValue = this.getDate() / 2;

call式this.getDate()の結果、this.getDate()がUNIXタイムに置き換えられる。その後、UNIXタイムが2で割られ、その計算結果がtextValueに代入される。

今日の進捗:293→306/4343

Essential ActionScript 3.0 読書メモ 第16回 メソッドのパラメータと引数

コンストラクターパラメーターと同様、メソッドパラメーターはメソッド定義と同時に作成される特別なローカル変数である。しかし、メソッドパラメーターの初期値は、そのメソッドを呼ぶ(call)際に外部から与えることができる。

メソッドパラメーターを定義する書き方は、コンストラクターパラメーターと同様である。

例:

function methodName (identifier1 = value1, identifier2 = value2) {
}

identifier1の初期値はvalue1であり、デフォルトではこの値が採用される。メソッドを呼ぶ際にパラメーターを与えてやれば、初期値を書き換えることができる。

例:

methodName(value_one, value_two)

こうすると、identifier1の値はvalue_one, identifier2の値はvalue_twoとなる。メソッドを呼ぶ際にメソッドに与えられる値のことを、引数(argument)という。

コンストラクターパラメーターと同様、メソッドパラメーターの定義に初期値を含めなかった場合、その値はメソッドを呼ぶ際に必ず与えなければならない(必須パラメーター)。

例:

function methodName (requiredParameter) {
}

このメソッドを呼ぶ際は、必ず引数を渡す必要がある。

例:

methodName(value)

必須パラメーターに値を渡さなかった場合は、コンパイルエラー又はランタイムエラーが発生する。

今日の進捗:284→293/4343

Essential ActionScript 3.0 読書メモ 第15回 インスタンスメソッドのアクセスコントロール修飾子

インスタンスメソッドで利用できるアクセスコントロール修飾子は、インスタンス変数に対するそれと同様である。すなわち、public, internal, protected, privateの4種類。アクセス可能な範囲も同様だが、簡単にまとめると、以下のようになる。

public:どこからでもアクセス可能
internal:定義したクラスの属するパッケージと同一のパッケージ内からアクセス可能
protected:定義したクラス内、及び定義したクラスの子孫クラスからアクセス可能
private:定義したクラス内でのみアクセス可能

アクセスコントロール修飾子をつけずにインスタンスメソッドを定義した場合、internalになる。

今日の進捗:273→284/4343