PHP学習者にお勧めの本10選

これまで、WEBアプリ制作のために、PHPを中心としてプログラミングに関する本を100冊ほど読んできました。そこで、一つの区切りとして、その100冊の中からプログラミング力の向上に効果があり、実際に役立つと思う書籍を10冊ほどピックアップして紹介したいと思います。

それでは、おすすめの読むべき順に、書籍の「目的、難度、効果、概要」等を簡単にですが紹介していきます。

1.パーフェクトPHP (PERFECT SERIES 3)

目的:PHP学習の総仕上げとして
難度:難
効果:大
言語:PHP
概要:PHPの文法の基礎から、フレームワークの制作まで。また、セキュリティについても学習できる盛りだくさんな一冊。PHP使いなら是非とも読んでおきたい書籍です。

2.SQLアンチパターン

目的:データベースとSQLの総仕上げとして
難度:普
効果:大
言語:SQL、PHP
概要:データベースとSQLの2つについて、誰もが疑問に思う躓き(つまづき)どころを、要点を絞って、かつ、必要十分に解説した貴重な一冊。データベースの設計は、あとから修正するのが困難なので、早い時期に学習しておきたい書籍です。

3.体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践

目的:WEBアプリのセキュリティを万全にするために
難度:普
効果:大
言語:PHP、JavaScript、Java等
概要:WEBアプリの脆弱性とその防止策を網羅した貴重な一冊。WEBアプリの構築の際には、本書に書いてあるセキュリティ事項を常に意識してプログラミングすることが肝要です。

4.リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

目的:コーディングの適切なスタイルを習得するために
難度:易
効果:普
言語:C、Java等
概要:標準的なコーディングがどのようなものであるのかを学習し、そのスタイルを早い時期から意識することで、可読性の高いコーディングが可能となります。コーディング規約に縛られない、独学でプログラミングを学習している人におすすめの書籍です。サンプルコードは易しいので、言語を問わず読むことができます。

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

目的:デザインパターンの入り口として
難度:普
効果:大
言語:Java
概要:プログラミングの文法を学習した後の課題は、どのようにアプリケーションを制作するかです。それに答える設計の標準として「デザインパターン」が存在します。デザインパターンの習得は困難とも言われますが、本書は易しい解説となっているので、デザインパターンの入門として最適です。また、オブジェクト指向の理解が深まる効果も期待できます。

6.PHPによるデザインパターン入門

目的:デザインパターンをWEBアプリに活かすために
難度:普
効果:普
言語:PHP
概要:本書は、PHP言語を利用してデザインパターンを解説しています。デザインパターンの適用例がWEBアプリとなっているので、WEBアプリ制作者にとって貴重な一冊です。他のデザインパターン本と併せると理解が一段と深まります。

7.新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

目的:アプリケーションの改善力を高めるために
難度:難
効果:大
言語:Java
概要:既存のアプリケーションを改善する手法として「リファクタリング」が知られています。本書では、様々な改善手法が紹介されており、お手本がどのようなもであるかを意識して、一つひとつ実践することで、プログラミング力が向上します。その結果、よりよいコーディングとアプリケーションが一歩ずつ実現できるでしょう。

8.Java言語で学ぶリファクタリング入門

目的:リファクタリングの理解を深めるために
難度:普
効果:普
言語:Java
概要:書籍「リファクタリング」を、より簡単に易しく解説した書籍です。これら2冊を読み込むことで、リファクタリングの肝がよく見えてきます。要点を押さえるには本書が役に立つと思います。

9.パターン指向リファクタリング入門~ソフトウエア設計を改善する27の作法

目的:デザインパターンとリファクタリングの総合的な学習のために
難度:難
効果:普
言語:Java
概要:リファクタリングは、デザインパターンと密接に関連しています。そこで、両者を関連付けて総合的に理解することが重要です。よりよい設計のためにデザインパターンを学習し、それを実現するためにリファクタリングを学習します。

10.オブジェクト指向における再利用のためのデザインパターン

目的:デザインパターンを深く理解するために
難度:難
効果:大
言語:C++
概要:「デザインパターン」の原典です。いわゆる「GoF本」として知られる有名な書籍です。プログラミングの学習の一つの到達点として、是非とも読んでおきたい一冊です。ただ、惜しむべきは、C++でサンプルコードが書かれているため、学習のハードルが一段ほど高くなっています。もっとも、C言語とJavaの既習者であるならば、C++の基礎を学習するのは困難でないため、C++の入門書を片手に、本書を読んでも理解できるのではないかと思います。本書を読了すれば、自己のプログラミング力に大きな自信が付いているはずです。

以上、これまでに読んだ本の中からおすすめの10冊をピックアップしました。もちろん、これら以外にも、良書はたくさんありますし、読んでいない本の中にも素晴らしい書籍があると思います。また、関数型言語等には手を出していないのでそれらの本も抜けています。

ここで紹介した本については、後半からデザインパターンとリファクタリング関連の本に偏ってしまった感もありますが、これらの事項を理解すれば、多くの言語でも通用するプログラミング力がつくのではないかと思います。

プログラミングを学習し始めた当初は、100冊以上読めばハッカーレベルの知識を獲得できると想像したものですが、現実には、それは妄想に過ぎませんでした。多少の自信は付きましたが、100冊を読了しても、まだまだスタートラインに立ったばかりという思いがします。

今後、余力があれば、ネットワークの分野とサーバーの分野についても100冊ずつくらい読んでみたいとも思います。合計で300冊も読めばハッカーに少しは近づけるのでしょうか?想像、もとい妄想がまた捗ります。

【注意】
上記本の紹介はページ作成時点での最新版です。時間の経過とともに、新たな版が出る可能性があるのでご自身にてご確認ください。

カテゴリー: BOOK, プログラミング全般 | コメントする

【書評】アルゴリズムを、はじめよう

アルゴリズムを、はじめよう の書評です。

結論から言うと、アルゴリズムの学習の最初の一冊としてお勧めできる入門者向けの書籍です。

■ 良い点
・ 文章が易しく読みやすい
・ コンパクトなので短時間で読める
・ 重要な9つのアルゴリズムに重点が置かれている
・ 解説が丁寧でステップ・バイ・ステップで進む
・ 図表が多くアルゴリズムのイメージをつかみやすい

■ 悪い点
・ 最後の方に誤字が少しある

■ 総評
アルゴリズムの学習の入門者にお勧めの一冊です。定番である9個のアルゴリズムが重点的に解説されています。文章が読みやすいので短時間でストレスなく読み進められます。

各章の流れとしては、各アルゴリズムの「イメージ(図)」→「流れ図(フローチャート)」→「コード(擬似コード)」の順に解説されます。イメージと流れ図ともにコマ送りのようにひとつずつ進むので、アルゴリズムの内部構造がわかりやすくなっています。そして、最後に、そのアルゴリズムが擬似コードで表現されます。

個人的には、擬似コードではなく、CやJavaでのコードの方がありがたいのですが、情報処理の試験などでは、擬似コードも使われるらしい?のでこれはこれで有りなのかとも思います。

わかりやすさに重点が置かれており、初心者にも易しいのでアルゴリズムの学習のとっかかりに最適な一冊です。

アルゴリズムを、はじめよう

カテゴリー: BOOK, アルゴリズム | コメントする

【書評】やさしいC アルゴリズム編

やさしいC アルゴリズム編 (やさしいシリーズ) の書評です。

結論から言うと、C言語のやさしいコードによる「データ構造とアルゴリズム」の入門書です。

■ 良い点
・ アルゴリズムの基礎を一通り学習できる
・ データ構造も一通り扱われている
・ C言語の復習になり理解が深まる
・ サンプルコードが短めでやさしい
・ 図表も理解を助けてくれる

■ 悪い点
・ コードにある変数名がc,s,wとかで少し分かりづらい

■ 総評
「やさしい」シリーズのアルゴリズム編です。アルゴリズムの入門書では図や表だけの説明でコードが無かったりもしますが、本書では、C言語によるきちんとしたコードが多く記載されています。扱われているコードも短めで分かりやすく、コードと解説文章のバランスも絶妙です。「やさしいC」を読んだならば、なるべく早い時期に、この「アルゴリズム編」を学習すると相乗効果が期待できます。

本書において、いわゆる「データ構造とアルゴリズム」として扱われるのは、7章から10章の約200ページとなっています。それより前半の章では、順次・分岐・反復の構造化プログラミング、そして、ビット演算が扱われており、それより後半の章では、プログラミング作法と開発方法などが扱われています。個人的には、もっと「データ構造とアルゴリズム」に重点があればと思ったりしますが、ビット演算なども必須の知識なので読んでおいて損はないでしょう。

繰り返しになりますが、「やさしいC」と本書「アルゴリズム編」は、セットにして読むことをお勧めします。そうすれば、C言語の難所と言われる『ポインタ』や『構造体』の使いどころが理解でき、かつ、代表的な『データ構造』と『アルゴリズム』をマスターすることが可能になると思います。

やさしいC アルゴリズム編 (やさしいシリーズ)

やさしいC 第4版 (「やさしい」シリーズ)

カテゴリー: BOOK, C, アルゴリズム | コメントする

【書評】フシギなくらい見えてくる! 本当にわかる論理学

フシギなくらい見えてくる! 本当にわかる論理学 の書評です。

結論から言うと、論理学をこれから学ぼうとする人に、論理学の基礎を簡潔に教えてくれる入門書です。

■ 良い点
・ 論理学の文法と原則が簡潔に説明されている
・ 論理学の知識全般にも触れられている
・ 文章が易しく読みやすい
・ 一口メモが理解を助ける
・ 各節が短くテンポ良く読める

■ 悪い点
・ 文法に入るまでの前置きが少し長い
・ 説明不足な箇所が若干ある

■ 総評
論理学に関する要点がコンパクトにまとまっている初心者向きの入門書です。
論理学の文法や原則が簡潔に説明されているので論理学が初めての人でも一通り読了できると思います。

内容的には、命題論理と述語論理までを扱っており、そこでの論理原則がいくつか紹介されています。また、最後の章では、議論において論理的であるための方法等が紹介されています。なお、巻末には、公務員試験等で出題されたことのある論理問題が6題ほど出題されています。

最後に誤植と思える箇所があったので訂正用にメモしておきます。
P108の10行目・・・(誤)¬(P∧Q)(正)¬(P∧¬Q)
多分、こうしないと意味が通らないと思います。ここで一時間ほど躓きました。
もしかしたら自分の解釈が間違っているのかもしれませんが。
なお、公式の誤植・訂正ページを探したのですが見つけられませんでした。

フシギなくらい見えてくる! 本当にわかる論理学

カテゴリー: BOOK, 論理学 | コメントする

【MySQL】SQLSTATE[HY000]: General error: 1615 Prepared statement について【PHP】

さて何から書こう。

ある日、突然、PHPアプリケーションのエラーログに次のエラーが吐かれるようになった。

PHP Warning: PDO::query(): SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared in …

原因が分からないまま数日の間、観察していると、どうも毎日一定時刻になるとこのエラーを吐くことが判明した。その時間は、ちょうど0:00:00~0:00:45と日付の変わった数十秒に限られる。

なぜ、この時間だけエラーが出るのか不明で散々アプリケーションのコードを確認したが日付の切り替え時にエラーが出るような処理は行っていなかった(たぶん)。

もちろん、ネットでも検索して原因を調べていたのだが、検索結果はすべて英語ページばかりで読むのを躊躇していた。だって英語読むの面倒。。。

とは言え、エラーが出続けるのも良くないので検索上位の数ページを読んでみた。どうやら原因は、MySQLのバックアップ、とりわけmysqldumpにあるようだ。どういうことかと言うと、サーバー上のあるmysqlプロセスがmysqldumpを使ってデータ量の多いバックアップを取ると、その間、PDOにバグが生じるというものらしい。それで、上記のようなエラーが吐かれてしまう。また、cronを使っている場合には、エラーが出現する時刻も一定となる。

(参考)
https://bugs.mysql.com/bug.php?id=42041

解決策として挙げられているのが、table_definition_cache の値を大きくすること。しかし、これも完全な解決策にはなっていない模様。根本的な解決策は、どうやら見つかっていないようだ。

もっとも、共有サーバーで、他のユーザーによるmysqldumpが原因であるならば、他のサーバーへ移れば解決するかもしれない。おそらくこれが現在有力な解決策だと思う。

ただ、サーバーを移動するのも一苦労なので躊躇してしまう。

この『General error: 1615 Prepared statement …』に悩まされている人は多そうなのだが日本では話題になっていないようだ。

【後記】
エラーが出る時間帯にsshログインしてtopコマンドで確認したところ、同時刻にmysqldumpを実行しているユーザーを確認。やはりmysqldumpしてgzipしてバックアップを取っているようだ。

カテゴリー: MySQL, PHP | コメントする