SHOYAN BLOG

I am a pragmatic programmer.

PHPコーディング規約とサポートするツール

この記事の内容

PHPのコーディング規約とそれをサポートするツールの紹介です。
座学形式で説明していきます。

概要を知りたい場合は以下のスライドを参照ください。

はじまり、はじまり

みなさん、こんにちは。
PHPが大好きなプログラマことshoyanです。

今回、PHPのコーディング規約とそれをサポートするツールの紹介をしたいと思います。

なぜ必要か

まずはなぜコーディング規約が必要なのでしょうか?

みんなに質問してみる
しばらく沈黙

目のあった人に質問する
なんか適当に答えてくれる

ありがとうございます。
正解です。
補足として、なぜコーディング規約が必要になったかを説明します。

そもそもコーディング規約は一人で開発する場合には必要ありません。
二人以上で開発を行う場合に必要となってきます。

たとえば、太郎くんとドナルドさんが二人で開発をしていたとします。
太郎くんがコードレビューを依頼しました。
30分後に確認するとコメントがついていました。

1行で書いていたif文のコードにドナルドさんからコメントがついていました。
少し下にスクロールすると、if文のあとにスペースが必要だとコメントが入っていました。
少し下にスクロールすると、else ifのスペースは不要だとコメントが。
また更にその下には改行は不要とのコメントが…
なんと全部で30個のコメントがついていたのです。
30個のコメントの27個はコーディングスタイルに関するコメントでした。

さて、このレビューは有益でしょうか。
お互いにとってあまり有益ではありませんね。

じゃあ、どうしましょう。

そこでコーディング規約です。
コーディング規約という共通のルールを作ることにより、お互いが納得できるコードを書く指標をつくります。

さて、コーディング規約に則ったコードを書くぞ!となったとしましょう。
では、PHPのコーディング規約を探してみましょう。
ところが、PHPの本家にはコーディング規約のドキュメントがありません。

ということは、共通ルールがないということになります。
PHPの本家はコーディングルールなんて知ったこっちゃない。
開発者が勝手にやってくれ。ということです。

その要望に答えてPHPにはコーディング規約が乱立しています。
たとえば、以下のような感じです。

このようにフレームワークごとにコーディングルールが定められています。

1つのフレームワークであれば問題はありません。
しかし、2つのプロジェクトがあって、別々のフレームワークを使っていたらどうでしょう。
開発者はそれぞれのフレームワークの規約を切り替えながら開発をしないといけません。
これは考えるだけでも面倒くさそうですね。

PSR

このような現状をなんとかしようと策定されたのがPSRです。
PSRはPHP Standards Recommendations の頭文字をとったものです。
日本語にするとPHP標準勧告です。
PHP Framework Interop Groupが策定しています。

PSRのゴール

We’re a group of established PHP projects whose goal is to talk about commonalities between our projects and find ways we can work better together.

要するにフレームワークに依存しないルールを作って、どのプロジェクト(どのフレームワークを使っているプロジェクト)でも
同じようにコードを書くことをできるようにしましょうということです。(意訳)

ちなみにPSRには状態が色々あって、正式なものはACCEPTEDです。
ほかにも、DEPRECATED、REVIEW、DRAFTがあります。
以下のページで見ることができます。
http://www.php-fig.org/psr/

StatusがACCEPTEDなPSRは1〜7があります。
その中のPSR1とPSR2をここでは紹介します。
PSR1はBasic Coding Standardが定義してあります。
PSR2はCoding Style Guideで、PSR1を拡張したものです。
詳細は以下のページをご覧ください。

PHP Code Snifferについて

PHPのコーディング規約をチェックするツールはいくつかありますが、ここではPHP_CodeSnifferを紹介します。

Snifferは嗅覚性探知機という意味です。

たとえば、捜索犬はsniffer dog 、ガス探知機はgas snifferと英語でいいます。
要するにPHP Code探索機です。

PHP Code Snifferにはツールが2つあります。
1つめはphpcsです。

phpcsはコーディングスタイルのチェックをするツールで、PHP Code Snifferを略したものです。
コーディングスタイルを指定することができます。
指定できるコーディングスタイルは、MySource, PEAR, PHPCS, PSR1, PSR2, Squiz and Zend です。
また、コーディングルールを自分で設定することもできます。

実行コマンド

1
phpcs --standard=PSR2 check_file or check_dir/

2つめはphpcbfです。

PHP Code Beautifier and Fixerを略したツールです。
これは自動でコードを修正してくれるツールです。

実行コマンド

1
phpcbf --standard=PSR2 check_file or check_dir/

PHP Code Snifferのいいところは、チェックと修正のツールがわかれているところです。
それにより、CIによるチェックとその修正が簡単に行えます。

PHP Code Snifferの詳しい使い方はWikiを参照ください。
https://github.com/squizlabs/PHP_CodeSniffer/wiki’

コーディング規約の運用

コーディング規約を運用していくにあたっての問題点はなんだと思いますか?

しばらく沈黙

「コーディング規約が存在してもあまり守られない」ことです。

多分、みんな納得

では、どうすればコーディング規約を守れるようになるでしょうか。

CIでチェックするのが1番です。

コーディング規約に違反しているコードがあればエラーにします。
そうすればコーディング規約を違反しているコードがmasterにマージされることはありません。

コーディング規約の導入はプロジェクトの初期から始めるのがベストですが、
途中からでも自動修正ツールを使えば大半は修正することができます。
また、CIのプラットホームが最近は充実しているのでチェックの自動化も容易に行えます。

実際に導入した記事を書きましたので、こちらも参考にしてください。

Mac OSXにPHP7をインストール

2015年12月にPHP7.0.0がリリースされました。
先日、PHP7.0.2がリリースされ、活発に開発が行われているようです。

手元でPHP7を試すために、PHP7.0.2をインストールしてみました。
OSはMac OSX(Yosemite)です。

依存パッケージのinstallにはhomebrewを使うので、updateしておきます。

1
brew update

PHPのインストールには、phpenvを使います。
phpenvを使うことで、複数のバージョンをインストールすることができます。

phpenvのインストール

1
2
3
$ git clone git@github.com:CHH/phpenv.git
$ cd phpenv
$ phpenv-install.sh

以下を $HOME/.bash_profile or $HOME/.bashrcに追記します。
(zshの場合は、$HOME/.zsh_profile or $HOME/.zshrcです。)

1
eval "$(phpenv init -)"

php-buildのインストール

phpのbuildはphp-buildで行うため、php-buildのインストールを行います。

1
$ git clone git://github.com/php-build/php-build.git $HOME/.phpenv/plugins/php-build

依存パッケージのインストール

PHP7のインストールに必要なパッケージをインストールします。

1
2
3
4
5
6
$ brew install bison
$ brew install re2c
$ brew install libjpeg
$ brew install libpng
$ brew install libmcrypt
$ brew install autoconf

PHP7.0.2のインストール

1
$ phpenv install 7.0.2

PHP7がインストールできたら、globalコマンドでPHPのバージョンを設定します。

1
$ phpenv global 7.0.2

PHPのbuild時にエラーがでた場合はphp-buildのソースコードを修正して確認してみてください。
https://github.com/php-build/php-build/blob/bfd562bd6c11a97f953d92b0aac699ad82a045e2/share/php-build/extension/extension.sh#L128

.phpenv/plugins/php-build/share/php-build/extension/extension.sh

1
2
3
4
5
6
7
8
{
    $PREFIX/bin/phpize > /dev/null
    "$(pwd)/configure" --with-php-config=$PREFIX/bin/php-config \
        $configure_args > /dev/null

    make > /dev/null
    make install > /dev/null
} >&4 2>&1

以下のように修正します。

1
2
3
4
5
6
7
8
{
    $PREFIX/bin/phpize
    "$(pwd)/configure" --with-php-config=$PREFIX/bin/php-config \
        $configure_args

    make
    make install
} >&4 2>&1

PHP7について

PHP7はPHP5との互換性が重視されているようなので、移行コストは低そうです。
基本的にはPHP5.6までで非推奨の機能が廃止されています。
詳しくは以下を参照ください。

パフォーマンスに関してはけっこう改善されているようで、PHP5の2倍とのことでした。

幸せな子育てとエンジニアライフ

この記事は子育てプログラマ・ITエンジニア・Webデザイナー Advent Calendar 2015 7日目の記事です。

我が家は僕と妻、4歳の長男と1歳の長女の4人家族です。
どちらの子もすくすくと育っています。
上の子は幼稚園が楽しいようで毎日元気に登園しており、日に日に成長する我が子の姿を見るのは幸せなことだと感じています。

幸せな子育てとエンジニアライフについて、僕が考えていることをまとめました。

愛情を持って接すればうまくいく

上の子は妻より僕のほうが好きです。
夜寝るときは僕と一緒に寝たがります。
妻がお父さん、お母さん、どっちが好き?ということを時々聞いているらしいのですが、お父さんのほうが好きなようです。
なぜ上の子とよい関係を築くことができたのかを振り返ってみたいと思います。

今ではお父さん子の上の子ですが、最初の1年間は全然懐きませんでした。
母乳だったので基本的には妻でないとだめで、泣いているところをあやしてもまったく歯がたたずといった状態でした。
そういう状態なので、あまり育児も楽しいと感じませんでした。

しかし、オムツを替えたり、散歩に連れていったりといったことをコツコツと続けていると、1歳を過ぎたあたりから段々と懐いてくれるようになりました。
愛情を持って接すればその分は返ってきます。
子供は正直なのです。

よい子育てとは

どういう子育てがいいのでしょうか。
それはよくわかりません。
なぜなら子供によって性格が全然違うからです。
運動が大好きな子やお絵描きが大好きな子など、子供が100人いれば100人の個性があります。
また、親にも個性があります。
その全てによい子育て方法というものがあるのでしょうか。

特別なことをしなくても、子供はみんな大人になります。
なぜなら、自分は特別な教育は受けていません。
それでも、こうやって社会生活を営んで家族を養っていくことができています。

現在は、たくさんの情報に溢れています。
しかし、たくさんの情報は本当に有用なのでしょうか。
50のハウツーを知っていることが幸せに繋がるのでしょうか。
情報が多すぎることで、一体何が本当に大切なことなのか、わからなくなってしまいそうです。

それよりも、一緒に公園で遊んだり、一緒にご飯を食べたり、そういうことでいいんだと思います。

僕の両親は自営業なので決まった休みがありませんでした。
父親はほとんど家にいませんでした。
楽しみは月に何回かいくスーパーの買い物でした。
ただ、それでも幸せでした。
家族揃って食べた晩ご飯もよい思い出です。

そういうことを考えると、一緒に生活を送る何気ない日々が大切なのではないかと思うのです。

エンジニアライフと子育て

エンジニアライフと子育てについて少し触れておきます。
エンジニアは専門職なので、勉強が必要です。
ですので、その勉強時間を確保しないといけません。

僕は、通勤の時間と子供が寝たあとの時間を自分の時間に充てています。
その時間以外は仕事をしているか子供の世話をしている時間となります。

子供がいるからやりたいことができないということはなくて、工夫をすればなんとかなるものです。
自分の時間がたくさんあればいいというものではなく、限りある時間を有効に使うという意識が大事なのではないかと思います。

本の紹介

育児をするにあたって、多くの育児書との出会いがありました。
その中でおすすめの著書を紹介します。

子供の花が育つとき

日本人で初めてシュバイツァー博愛賞を受賞した内藤寿七郎先生の著書です。「育児の神様」と呼ばれていたそうです。
多数の著書がありますが、丁度よいボリュームで最初の1冊に最適です。

子供へのまなざし

子供の花が育つときは3歳までの時期を対象とした著書ですが、子供へのまなざしは思春期の時期までカバーされています。
ボリュームはありますが、大切なことがわかりやすく書いてあります。
育児書のベストセラーです。

まとめ

幸せな子育てとはなんなのでしょうか。
僕は家庭円満で日常生活を送ることだと思います。

「思いやりのある子に育てたい」

親なら誰もが思うことですが、人に対する思いやりは理屈で教えられるものではないと思います。
お父さん、お母さんがお互いをいたわりあい、相手を思いやる気持ちを持つ。
そういう姿をみて思いやり、優しさというものを自然と子供が覚えていくのではないでしょうか。

本来、子育ては楽しいものです。
子供はどんどん成長していきます。
そして、同時に親も成長をしていきます。
こんな素晴らしい体験ができることを、楽しまずにやらないわけにはいきません。

冒頭でも申し上げた通り、本記事は子育てプログラマ・ITエンジニア・Webデザイナー Advent Calendar 2015 の記事ですので、次回へのバトンを渡したいと思います。
次回は、12/8(火) foostanさんです。

最後に子育てプログラマ・ITエンジニア・Webデザイナー Advent Calendar 2015を企画してくださった、jnchitoさん、楽しい企画をありがとうございました。

30歳から始める数学

math-image

この記事はMath Advent Calendar 2015 2日目の記事です。
前回の記事は515hikaruさんのMath Advent Calendar 2015 一日目 - 515 ひかるのブログ 日常編です。

とあることから、30歳にして数学を学び始めました。いまは毎日楽しく数学の書籍を読んだり方程式を解いたりしています。
本記事では、僕と同じようにもう一度数学を学びたいなと思っている人向けに、数学の魅力を再発見する方法を紹介します。

30歳にして数学を学び始めたきっかけ

きっかけはプログラマのための数学勉強会です。
とあるご縁でこの勉強会で発表することになり、そこから数学を学び直しました。

内容については、以下の記事を参照ください。

この数学勉強会で数学を勉強することになったのですが、様々な書籍を読んでいくうちに、「なんだ数学って面白いじゃないか!」と感じるようになりました。
いまとなっては、趣味で数学を学んでいます。

数学をやり直してよかったこと

アルゴリズムに強くなる

数学を理解するには論理的な思考が必要です。
なぜかというと、数学は1つ1つの単純な定理を積み重ねて段々と複雑な定理を作っていくからです。

これって、アルゴリズムと似ていると思いませんか。
アルゴリズムも1つ1つは単純です。
単純なアルゴリズムが積み重なって複雑なアルゴリズムを形成していきます。

考え方が同じということは、数学に強くなるということはアルゴリズムに強くなるということでもあるのです。

数学を違う観点でみることができた

学生の頃は、問題を公式に当てはめて解を出すということをひたすらやっていました。
数学がおもしろくないと思っている人はこの観点で数学を捉えているのではないかと思います。
しかし、公式を当てはめて解を出すというのは数学の一部分です。

解を出すより重要な点は、「数学の理論を使うことである問題を解決することができる」という点だと思います。
このような観点で数学を捉えると見え方が違ってきます。

自分としては方程式を解くことより、方程式を自在に作れるようになりたいと思っています。

どういうふうにやり直したのか

図書館で数学に関する書籍を借りたり、書籍を買って学びました。
書籍は通勤の時間に読んでいます。

読んだ書籍のうち、個人的に面白いと感じた書籍を紹介したいと思います。

おすすめの書籍

はじめまして!数学

はじめの1冊は何がよいかと聞かれたらまずはこの1冊をおすすめします。
廃盤となっていましたが、リメイク版がでたようです。
数や素数、無限の概念から始まり、ベクトル、分数の話しがイラストつきで解説されています。
語り口がわかりやすく、数学の知識がなくてもスラスラと読めてしまいます。
また、挿絵がいい味を出しています。
この書籍を読めばきっと数学がおもしろいと思うはずです。

数学入門

こちらもおすすめの1冊。数学書の大ベストセラーです。
はじめまして!数学より内容は難しめなので2冊目におすすめします。
数学の歴史的な話し、分離量と連続量、代数、図形、複素数について解説されています。

これだけはおさえたい-文系プログラマーの数学知識-基礎の基礎-

プログラマーの数学入門用におすすめの1冊。
コンピュータサイエンスの基礎的な話しや、数学がプログラミングでどのように使われているかが丁寧に説明されています。
この書籍を読めば代数学や微積分がどのようなところでプログラミングに利用されているかがわかることでしょう。

いかにして問題をとくか 実践活用編

G.ポリアの著書が有名かと思いますが、こちらは現代版 いかにして問題をとくかです。
全体的に平易な文章で記述してあり、専門用語や数学の知識がなくても読めるようになっています。
まずこちらを読んでからG. ポリアのほうにとりかかると、より理解がしやすいのではないかと思います。

数学ガール

たくさんのシリーズが出版されている数学の人気書籍です。
物語形式になっており、そちらの話しもおもしろいです。
また、物語形式だと頭にスッと内容が入ってくるのでよいですね。
物語を楽しみながら数学の勉強もできるというお得な著書です。

まとめ

数学を学び直すことで、様々な関心することに出会えました。また、先人への畏敬の念を抱かずにはおれません。
というのも、現代数学の基礎は紀元前〜19世紀にかけて発見されているのです!改めて数学とは面白い学問だなと感じています。
これからも楽しみながら数学を学んでいきたいと思います。

本記事が数学の魅力を再発見していただくきっかけになれば幸いです。

冒頭でも申し上げた通り、本記事はMath Advent Calendar 2015の記事ですので、次回へのバトンを渡したいと思います。
次回は、12/3(水) PAIOTU_NO_OWARIさんによる選択公理⇔整列定理の証明のお話しです。

最後にMath Advent Calendar 2015を企画してくださった、515hikaruさん、楽しい企画をありがとうございました。

プログラマのための数学勉強会@福岡#2に登壇してきました

2015年11月6日(金)にプログラマのための数学勉強会@福岡#2が開催されました。

前回に続き、今回も発表をさせていただきました。

今回は「コンピュータと数学」というタイトルで、コンピュータでデータがどのように扱われているかや、コンピュータで行われる演算についてお話させていただきました。

他の登壇者のかたのスライド

他の登壇者のかたのスライドを紹介します。

###「無限と計算可能性と対角線論法」
@nakalyさんはコンピュータの停止性問題と対角線論法についてお話をされていました。

「Shinyで中心極限定理」

Tomokazu Fujino(@nonki1974)さんは、R言語とフレームワークのShinyを使って行う統計のお話をされていました。
大学の先生をされているので、発表がとてもお上手でした。
fukuoka.Rを主催されているとのことです。
発表のスライドは公開されていないようでした。

「オイラーの等式」

@ringojuringoさんは、「オイラーの等式」の証明についてお話されていました。
テイラー展開を使って証明ができるとのことでした。
発表のスライドは公開されていないようでした。

Twitterのまとめ

プログラマのための数学勉強会@福岡#2まとめ

おわりに

主催者の@tkengo氏は急用のため、残念ながら今回は欠席でしたが、今回も面白い内容だったなと思います。

場所を提供いただいた、LINE Fukuokaさん、登壇者、参加者のみなさん、ありがとうございました!