array_mapよりはforeachがいいけどforeachよりはarray_walkで書きたい #PHP

基本的にはarray_mapが使えそうなケースでも素直にforeachを使いたい人です。
array_mapは考えて記述していかないと可読性が悪くなりがちだし、パフォーマンスもforeachのほうが良いし。。
ただarray_walkに関しては使っていきたいと思える部分があって、それはunsetすることを意識しなくていいってところです。

foreachで参照渡しするときに起こりうる問題

foreachで配列の破壊的操作をしたい場合は例えば以下のように書くことになりますが、意識しなければいけないのは、ループを終えたあとにunsetによって参照を解除しなければならないということ。

<?php
$arr = range(1, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
unset($value); // 最後の要素への参照を解除します

print_r($arr);
// Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 8 )

もしunsetしなかったら次のようなコードを書いたときにアカンことになります。

<?php
$arr = range(1, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// ここまで同じ
// ここで unset しない

$value = 1000;

print_r($arr);
// Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 1000 )
// $valueは$arr[3]を参照したままなので値が書き換わってしまっている

array_walk使えばunsetいらない

先に挙げたようにPHPの場合foreachは中と外で同一スコープとなってしまうのでunsetしておく必要があります。
ですが、array_walkを使えばスコープは別なのでunsetする必要がないです。

<?php
$arr = range(1, 4);
array_walk($arr, function(&$value) {
    $value = $value * 2;
});
// unsetとかいらない

$value = 1000;

print_r($arr);
// Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 8 )

わざわざunsetしなきゃいけないってのがなくなったので、ちょっぴり気持ちよくなりました。

とまぁそんな感じなんですが

別に気をつければforeachでも全然良いし、array_mapもガンガン使っていけばいいですよね。

初めてのPHP

初めてのPHP

詳細! PHP 7+MySQL 入門ノート

詳細! PHP 7+MySQL 入門ノート

初めてPHPカンファレンスに参加した僕がPHPカンファレンス福岡2017についてブログ書いたよ #phpconfuk

ブログ書くまでがPHPカンファレンス福岡!!

ってことで2017年6月10日(土)に開催されたPHPカンファレンス福岡2017に参加してきました。

PHPカンファレンス福岡2017

会場広くてホールによっては前列の方に机も用意されてたし快適でした。

f:id:tomcky:20170610094745j:plain

開会式・スポンサー紹介、すごく丁寧だったのが印象に残ってます。

PHP7で堅牢なコードを書く - 例外処理、表明プログラミング、契約による設計

@t_wadaさんの発表。

speakerdeck.com

PHPカンファレンス2016で発表されたものに改訂が加わったものだったようです。
内容の完成度が高すぎて。。
すぐにでもお仕事で実践していきたいと思えるようなTipsばかりでした。
以前からいつか買おうと思ってたSQLアンチパターンをカンファレンス帰りに買って帰りました。

SQLアンチパターン

SQLアンチパターン

新卒2年目がサービス開発の際に乗り越えた課題とその解法など

@gorogoroyasuさんの発表。

speakerdeck.com

新卒2年目とは思えない落ち着いた発表。。焦る。頑張ろう。
PHPを5.6から7.0に上げたときのパフォーマンス改善あたりの話はAsk the Speakerでとのことで、がっつり聞きたかったぶん、ほんのちょっぴり残念だったりしました。
が、デプロイツール導入前・デプロイ自動化前の面倒さはすごくわかるなーという話で、頻繁に行うことを少しでも楽に安全になるようにメスを入れる大事さが改めて感じれて良かったです。
Jenkinsとか割と使うんだけど、capistranoとかDeployerみたいなデプロイ特化ツールみたいなものは使ったことないので、触っときたいなーと。
メール大量配信は、バウンス対策しんどいですよね。。という感じで、個人的にはバウンス対策だけに絞ってまた機会があればガッツリ聞きたいくらいありました。

実践Action Domain Responder

@ex_takezawaさんの発表。

Action Domain Responder自体が初耳でして、正直腹落ちするところまで理解しきれませんでした。。ちょっとは予習しておくべきだったなぁ。。
スライドはまだ公開されていないようで、いつかきっと公開されるだろうと期待しております。。復習したいよー。
でもLumenを使った具体的な実装例は公開されているので、こちらで勉強させていただきまっす。

github.com

僕達がやってきたレガシープロジェクトとの付き合い方

@_nabeenさんの発表。

speakerdeck.com

冒頭、「あぁ、なんだかもう、、何も言えない」って感じでした。
バージョン管理がSVN。Git使いたいけどまぁそういうこともあるよね、そこまではまだうん仕方ないという感じ。
そこから怒涛のPHP 5.3.19 サポート切れ、Codeigniter 2.0.2 サポート切れ、MySQL5.5.34 サポート切れ。
やばい何だか涙が出てきた。。。
でもこういう赤裸々?な話が聞けるとか、なかなかないよなぁと。。
レガシーな状態の中でモダンにいかに近づけるかという努力に胸を打たれました。

海外からのアクセスを制御する

ペパボの田平さんの発表。

speakerdeck.com

PHPカンファレンスなのにmrubyの話が聞けるとか、もうお得感しかないですよね。
PHPカンファレンス福岡2017最高。
というか、個人的にmruby自体に対しての興味が結構あって、こういう使われた実例みたいなものが聞けるのは非常に嬉しかったです。
海外IPフィルターって言っても、海外からのIPを考えなしにただ遮断するだけじゃもちろん駄目だし、ペパボさんのサービスのような大規模・高集積で使われることを想定するがゆえの難しさみたいなものもあるんだろうなという感じで、すごい勉強になるなと。
実際に作られたツールも公開されているので、実装見てみよと思います。

GitHub - matsumotory/ngx_mruby: ngx_mruby - A Fast and Memory-Efficient Web Server Extension Mechanism Using Scripting Language mruby for nginx

GitHub - pepabo/mruby-ipfilter

GitHub - pepabo/mruby-msd: multi stage datastore by mruby

1,800リクエスト/秒の世界

@tomzohさんの発表。

speakerdeck.com

対応してときの現場の雰囲気とか想像できてめっちゃ笑いました。
内容もすごくためになる内容で、負荷計算の素材を洗い出してシナリオを作り、想定される負荷を計算できるところまで落とし込んで設定や負荷テストを行う過程がよくわかったし、その過程でうまくいかなかったことや対応策もなるほどなーって感じでした。
APIのレスポンスを静的ファイルにしてしまうとか「マジか!?」って思ったんですけどよくやるもんなんですかね?
そういう対応もケースバイケースではありなのかーと感動しました。
最後に “あたりまえのことをあたりまえに” っておっしゃってましたが「いや本当その通りやで!」と思いましたし、あたりまえのことって意外と知る機会がなかったりするものなのでこういう話が聞けて良かったです。

Dockerを本番で使ってみて分かったこと

@hanhan1978さんの発表。

speakerdeck.com

Dockerってこうやって使いますよとか、開発環境として使ってますっていう話は結構聞くようになったのですが、本番運用しましたって話はなかなかないんですよね。
実際、@hanhan1978さんの「Dockerを本番で使ったことがある人いますか?」っていう質問に対してほぼ手が挙がらなかったですし。
そういう状況の中で、本番運用したからこそわかるハマったこととか、そこから導き出せるアンチパターンの話が聞けたのは、すごく貴重だったなと。
先人の Dockerfile とか docker-compose.yml をパクれってのは本当にそうだなと思いました。
これを機に開発だけでなく本番でもDocker使っていきたいですね(まだめっちゃ怖いけどね)。
あと、マウント劇遅問題に対応したDocker for MacのStable版はよ。

Webセキュリティの実践のための攻防戦演習について

@eidwindsさんの発表。

Webセキュリティの攻防戦演習をやったときのお話。
攻防戦演習をやるにあたってのルール設定や演習内容の一部とその解説などなどがお話の内容でした。
演習の内容・解説よりも攻防戦演習そのものについての説明が多かったような印象で、も少し演習の内容・解説や考察が多めに聞けるとよかったなと思いました。
ただ、これについてもAsk the Speakerで実際に演習問題について触ることができるようになっていたようなので、Ask the Speakerは各セッションを補完する意味でも良い試みだなと思いました。
セキュリティについて理解することは重要なのですが、なかなか独学で鍛えることも難しいと思うので、SECCONとか、こういった攻防戦に参加したりすることで鍛えるのは良いですよね。
スライド見つつもう一度振り返りたいです。公開されないかなー。。

エラーと例外の再入門

@Hirakuさんの発表。

speakerdeck.com

エラーと例外について、めちゃくちゃ丁寧に説明されていて、それらの違いや使いドコロがわかるようになる内容でした。
エラーや例外って後回しにされがちだけど、品質の高いプロダクトを作る上で超重要なトピックなので、しっかり理解しときたいすよね。
あと、"Pokémon catching"なんて初めて聞いた。へぇー。

雑感など

今回はLTの前に帰ってしまったのですが、LT・閉会式がすごく良かったというのをTwitterでみて、もう少しいれば良かったと後悔。。
懇親会も楽しそうだったので、来年はぜひ懇親会まで参加したいなと思いました。

正直、これまで参加した勉強会・イベントの中でも群を抜いて参加して良かったなと思えるイベントで、学べることも多かったし会場の雰囲気もめちゃくちゃ良かったです。
これも運営スタッフの方々が超頑張ってくださったおかげですね!
素晴らしいイベントありがとうございました&お疲れ様でした。
PHPカンファレンス福岡、最高やで!

あと、来年参加するときはただの参加者としてだけでなくて、小さくてもいいので何かしらイベントの運営に対して貢献できるような形で参加したいなと思いましたー。がんばろー。

以上です。

【シェル】ずっと『bash』だったけど『fish』に移行した

デフォルト設定でもイイ感じな『fish』っていう素敵シェルがあると聞いて。

fishshell.com

インストール

Homebrewでインストールできます。

$ brew install fish

デフォルトのシェルをfishに変更

$ which fish | xargs chsh -s

上記のコマンド実行後にターミナル再起動すればOK

もし

chsh: /path/to/fish: non-standard shell

上記のようなエラーが出る場合は /etc/shells の末尾にfishへのパスを追記しましょ。

さっそく使ってみる

デフォルトでも使えるオートサジェスチョン機能が強力。
コマンドを打ち始めると自動でサジェストしてきます。
サジェストしてくれたコマンドを受け入れる場合は ctrl + f で幸せになれます。
https://fishshell.com/docs/current/index.html#autosuggestions

TAB補完機能も充実していて、例えばgitコマンドのオプションやブランチなども補完してくれます。
https://fishshell.com/docs/current/index.html#completion

あと、bashだと ctrl + r で使えるコマンド実行履歴検索(reverse-i-search)機能ですが、コマンド入力途中で ctrl + p とすると、入力した文字列に部分一致するコマンドを履歴から検索して遡ることができます。
行き過ぎたら、 ctrl + n すれば大丈夫。
github.com

エイリアス追加したり、プロンプト変更したり、独自機能いれたり、色々するつもりだけど、ひとまずデフォルトでこれだけ使えれば十分。むしろ最高。