Laravelでカスタムコレクションクラスを利用する

今回はLaravelのお話です。
先日5.5(LTS)がリリースされるなど最近何かと話題のLaravelですが、今回はそんな新しい機能の話ではありません。

Laravel5.xやCakePHP3.xでは、PHPの残念な配列(連想配列含む)を良い感じに扱えるCollectionというクラスが存在します。
上記2フレームワークでは、ORMを使ってDBへ問い合わせた結果がCollection型で返ってくるケースが多いこともあって、new Collection()するよりはそのインスタンスを使うケースのほうが多いように感じます。

通常のforforeachでループできることはもちろん、map()filter()といったデータの整形や絞り込みをメソッドチェーンで行えるので、直感的にコードを書くことができます。
そこで、「拡張コレクションを作って特定モデルの結果はそいつを使おうぜ」というのが今回のテーマです。

注意しないといけないのは、map()メソッドのように内部でコレクションを生成する関数を呼び出した場合です。
map()関数は、内部で保持しているインスタンスがModelでなかった場合、Collectionクラスを返します。
上記evenPosts()の例だと、メソッドが最終的に返却するArticleCollectionクラスが内包しているのは配列なので、この戻り値からさらにmap()すると戻り値はCollection型になってしまいます。
つまり、evenPosts()map()evenPosts()といった呼び出し方をするとエラーになります。

その場合は上記コードにあるように、継承元であるIlluminate\Support\CollectiontoBase()メソッドをオーバーライドすれば良いです。

同様のことがCakePHP3でもできるんじゃないかと思っているんですが、こちらは今のところIteratorクラスを使うことになりそうです。

Laravelはドキュメントも充実しているので、大体はそこから情報を得られます。
以下に私が利用しているサイトのリンクを掲載しておきます。

Javaで並行処理を書く

最近はPHPやGo、JavaScriptばっかりやっていて、ほとんどJavaを触らなくなっていました。
Java9もリリースされたことですし、ここらで少し触っておこうと思います。

今回やってみるのは並行処理です。
以前、仕事で「Javaでバッチ処理」を実装した際、「メインスレッドと別スレッドでバッチを実行させる」という対応をしました。
いわゆる並行処理です。

並行処理とは

1つのCPU上で複数の処理を行うこと(この場合、実行順は保証されない)

並列処理とは

複数のCPUで1つの処理を行うこと(時間のかかる処理を分散させる)

ちなみに、JavaScriptでPromiseやコールバックを使って処理するケースは前者です。
並列処理は計算・演算面で使われるケースが多い印象です。
今回Javaで実装したのは並行処理です。
ExecutorServiceFutureを使います。

  • コード

  • 結果

一番処理に時間がかかっているタスク(8件目)とほぼ同じ時間でメイン処理が終了したことがわかります。
また、出力内容からスレッドが使いまわされていることもわかります。

いかがでしたでしょうか。
意外と簡単に実装できたことと、このjava.util.concurrentパッケージはJavaSE6からあったことが衝撃でした。
ちなみに、GoならGoroutineという機能があるので、もっと簡単に実装できます。
※ただし、プロセスやスレッドとは厳密には異なるため、アプローチや考え方が少し変わります。

余談として、内容的に大したプログラムではありませんが、メソッド宣言でfunctionと書きそうになったり、変数宣言でvalとか書いてしまい、コンパイラに怒られっぱなしでした。

今日からあなたもCakePHPer

昔の記事を読んでいると、「いろんな意味で若いな」と思いますね。
そんな自分もアラサーです。
イメージしていたものとは大きく違っていますが、まあ色々経験した結果かなとプラスに考えておきます。

さて、今回は、先日3.5がリリースされたCakePHPについて書きます。
私がPHPを学習する際、初めて触れたフレームワークがCakePHP2.xでした。
2.xの配列地獄をご存知の方は、3.xになった際のORMの変更に少なからず戸惑ったのではないかと思います(もちろん良い意味です)。
マイナーバージョンで大きい変更があることも少なくありませんが、ある程度の後方互換が維持されているのはありがたいですね。

最近はLaravelに人気を持っていかれている感はありますが、個人的にはCakePHP3が一番好きなフレームワークなので、いくつかおすすめポイントを書こうと思います。
PHPをある程度使っている方はもちろん、以前の私のように、

  • PHPフレームワーク使いたいけど何が良いのか
  • そもそもPHPの基礎がそこまで固まっていない

といった方も対象です。

「設定より規約(CoC)」という安全性

これが一番大きいと思います。
ファイル名・クラス名・ディレクトリ構成などの「決まり」に則って開発するということは、個人的にはプラスだと思っています。
ある程度の経験があるとこのあたりはどちらでも問題ないのかもしれません。
ただ、PHPフレームワークの経験が浅いと、どのクラスがどういった役割をするのかがイマイチピンとこないケースは多いように感じます。

個人開発なら、ある程度自由にコードを書き始めて、慣れたら適切にモジュール分割していくことが良い学習になります(私もこのタイプでしたし、今も日々改善しています)。

チーム開発なら、開発者に規約という前提があるので、レビューでもコードに集中できます。
経験者がいればなお良いですね。

日本語ドキュメントが充実している

こちらにあるドキュメントがとても役に立ちます。
サンプルコードも多く掲載されているので、実装に迷うこともありません。
オフラインドキュメントも取得できます(こちらは英語です)。

デバッグバーが優秀

デバッグモードだと画面下にバーが表示され、画面表示時に実行されたクエリや変数の値、メモリ使用量や環境変数などを確認できます。
情報量がとても多く、開発中とてもお世話になります。

CLI

bakeコマンドです。
これによってControllerやModelなどのひな型(+テストケース)を作成できます。
マイグレーションも実行可能ですし、それをもとにテスト用のダミーデータの生成スクリプトも用意してくれます。
バッチ処理も書けます。

CakePHPで完結できる安心感

RubyのRuby on Rails、PythonのDjangoのように、基本的にはフレームワークの標準機能(+一部拡張機能)でカバーできるため、導入コストが大きくありません。
基本的なMVCはもちろん、APIClientやメール送信・セキュリティといったアプリケーションに必要な機能は一通り揃っており、上記ドキュメントを見れば大体解決できます。
また、コレクションやHash、テキスト処理などのユーティリティも充実しています。

リポジトリパターン

CakePHP3.xではリポジトリパターンを採用しており、DB問い合わせを行うクラス(Table)とデータを格納するクラス(Entity)は別です。
個人的にはModelになんでもかんでも突っ込むのがあまり好きでないので、これが標準なのはありがたいです。

他にも便利な機能はたくさんあります。
私も日々勉強しているので、皆さんも是非一度使ってみてください。

CakePHP3を使ったシステムのリポジトリはこちら
※PRお待ちしています。

サーバ移行とそれに伴うWordPress.comエラーのお話

お久しぶりです。
今回、本当はフレームワークの比較記事を書きたかったのですが、色々あって他のことを書きます。

まず、このブログおよびGo to Everyone!が動作するサーバを乗り換えました。
その話は追々書くとして、心機一転ブログ書くかと思ったわけです。

話は変わって、最近仕事や個人での開発で、ドキュメントをMarkdown形式で書くことが増えてきました。
HTMLより簡潔にマークアップすることができ、かつExcelのようにバイナリでもないのでバージョン管理の比較もやりやすいわけです(単純なテキスト比較で済むので)。

そんな経緯から、「ブログの記事もMarkdownで書けたらええのにな」と思い、ちょっと調べたわけです。
このブログはWordpressで運営しているのですが、すでに導入していた「Jetpack」というプラグインにその機能があったので、それを有効化しました。

で、これを使うためにはWordPress.comというところから書くことになるわけですが、ここからハマりました。

投稿・プロフィール・画像など、ほとんど見えません!!!

ブラウザの開発者ツールで確認すると、関連してそうなAPIのレスポンスがエラーになっているようです。
Wordpress.comでは、「Wordpress.com → 公開API → 当ブログ」の流れでデータを取得していますが、どうやらサーバー移転に伴いおかしなことになっていそうだったので調べました。

調べているうちに、ついにJetpackプラグインのソースコードのデバッグを始めるも、

  • プラグインは最新 → ソースコードは最新のはず
  • サーバー上での直接編集なのであまり色々できない
  • GithubのIssuesを見てもそれっぽいバグも上がっていない

とすっかりはまっていたわけですが、以下の記事で解決しました。

PHP7.1でJetpakがエラーになる件【原因と解決方法】

以前のサーバーではPHP7.0.xを利用していました。
今回の移行に伴い「PHP7.1.x使えるからこれにしておこう」とやった結果、今回の問題に遭遇したというわけです。
サーバーの管理画面からPHP7.0.xを利用するように戻すと、問題なく表示されるようになりました。
ただ、上記の記事でも原因まではわかっていないとのことだったので、これについてはもう少し調べてみます。

改めてネットの力はすごいですね。
元記事と同様、取り急ぎ同じ事象にハマっている人の手助けになればと、こちらでも取り上げました。

プログラマにおすすめする書籍・その2

以前の記事に続き、今回もいくつか紹介させていただきます。

60分でわかる!機械学習&ディープラーニング超入門

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

60分でわかる!機械学習&ディープラーニング超入門 [ 安達章浩 ]
価格:1058円(税込、送料無料) (2017/8/6時点)

 

私と同じく碁を打つ方なら記憶に新しい「Alpha碁」をはじめ、昨今何かと話題の「機械学習」。
この「機械学習」とはどのようなものなのかをわかりやすい図解を見ながら学べます。
「60分でわかる」内容なのであくまでも入門ですが、

  • どんなものかざっくりと知りたい
  • どういった製品・サービスに活用されている(できる)のか知りたい

という方にはぴったりです。

Pythonではじめる機械学習

 

こちらは完全に参考書ですね。
数学的な知識や分析についてある程度経験がある人でないと読み進めるのは難しいかもしれません。
ただ、Pythonのコード例や図式も多いですし、内容としては基礎から学んでいけるので、ある程度プログラミングの経験があれば特に問題なく読み進められるかなと思います。

Ruby on Rails 5アプリケーションプログラミング

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Ruby on Rails 5アプリケーションプログラミング [ 山田祥寛 ]
価格:3888円(税込、送料無料) (2017/8/6時点)

 

こちらはRubyで一番有名なフレームワーク、Railsの書籍です。
Railsはコミュニティやプロジェクトが「ひとつの世界」を作りあげている気がしています(gem使ってなんでもRailsでやってやろうぜという文化はある意味狂気です)。
最新メジャーバージョンである5に対応しており、これ一冊でアプリケーション作成は問題なく進められます。
個人的には、推しエディタであるVS Codeについてコラムで触れられていたのが嬉しかったです。
CoffeeScriptって最近あまり聞きませんが、Railsをメインで使っている人は今もバリバリ使ってるんですかね…。

今回は以上です。
日進月歩(下手すればもっと早いですね)なIT業界では情報が陳腐化するのも早いので、
フレームワークやライブラリについて書かれている書籍は新しめのものを購入するべきだと思います。
ただ、言語仕様や考え方などの根底部分は基本的に変わらないので、そういった書籍はいつのものでも新しい発見がありますね。