一時期は乱立したgemのgeneratorをbundle gemがほぼ統一。travisのファイルが入ってたり、Code of Conductが入ったり、rspecかminitestか選べたりといろいろ新しくなってました。

% bundle gem google-search_rank
Creating gem 'google-search_rank'...
Do you want to include a code of conduct in gems you generate?
Codes of conduct can increase contributions to your project by contributors who prefer collaborative, safe spaces. You can read more about the code of conduct at contributor-covenat.org. Having a code of conduct means agreeing to the responsibility of enforcing it, so be sure that you are prepared to do that. For suggestions about how to enforce codes of conuct, see bit.ly/coc-enforcement. y/(n): y
Do you want to license your code permissively under the MIT license?
This means that any other developer or company will be legally allowed to use your code for free as long as they admit you created it. You can read more about the MIT license at choosealicense.com/licenses/mit. y/(n): y
Do you want to generate tests with your gem?
Type 'rspec' or 'minitest' to generate those test files now and in the future. rspec/minitest/(none): minitest
      create  google-search_rank/Gemfile
      create  google-search_rank/.gitignore
      create  google-search_rank/lib/google/search_rank.rb
      create  google-search_rank/lib/google/search_rank/version.rb
      create  google-search_rank/google-search_rank.gemspec
      create  google-search_rank/Rakefile
      create  google-search_rank/README.md
      create  google-search_rank/bin/console
      create  google-search_rank/bin/setup
      create  google-search_rank/CODE_OF_CONDUCT.md
      create  google-search_rank/LICENSE.txt
      create  google-search_rank/.travis.yml
      create  google-search_rank/test/minitest_helper.rb
      create  google-search_rank/test/test_google/search_rank.rb
Initializing git repo in /Users/komagata/code/google-search_rank

一回選択したら設定ファイルに書かれるみたいです。

% cat ~/.bundle/config 
---
BUNDLE_GEM__COC: true
BUNDLE_GEM__MIT: true
BUNDLE_GEM__TEST: minitest

もちろん僕はminitestちゃん!

Ruby OpenSSL ホスト名検証の脆弱性が修正されているそうです。

$ CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`" rbenv install 2.2.2
$ sysctl -n hw.ncpu
4

makeとかbundle時にcpuコア数分並列させたいとき便利。

$ bundle install -j`sysctl -n hw.ncpu`

phpenv + php-buildよりphpbrewの方が良さそうです。(rbenvとぶつかる)

インストール

wgetはcomposerのインストールに必要。

$ brew install automake autoconf curl pcre re2c mhash libtool icu4c gettext jpeg libxml2 mcrypt gmp libevent wget
$ brew link icu4c --force

ふむふむ。

$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
$ chmod +x phpbrew
$ sudo mv phpbrew /usr/bin/phpbrew
$ phpbrew init
$ echo "source ~/.phpbrew/bashrc" >> ~/.zshrc
$ phpbrew lookup-prefix homebrew
$ sudo phpbrew install -j `sysctl -n hw.ncpu` 5.6.8 +default+mysql+apxs2
$ phpbrew --version   
phpbrew - 1.18.5
cliframework core: 1.10.0
$ phpbrew switch php-5.6.8
$ php -v
PHP 5.6.8 (cli) (built: May 12 2015 17:33:22) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

composerとphpunitインストール。さりげ嬉しい。

$ phpbrew install-composer
$ phpbrew install-phpunit
ActionController::RoutingError: No route matches [POST] "/stories/2992/trackback"

みたいな存在しないURLで、人間のユーザーには影響無く、botがアクセスしてくるエラーってどうすればいいのかな。

routes.rbの一番下に404へ飛ばすの書いておけばいいけど、人間のユーザーにも影響のあるNo route matchesのエラーもある気がするし…。

でもエラー管理サービス(rollbar)の無料枠のエラー数を消費してしまうので何とかしたいところです。

レガシーがらみで気になったのでサポートに聞いてみた。

マネージドサーバーHDDプランの契約を検討しております。

PHPのバージョンが4.4, 5.2~5.4となっていますが、これはどの5系の場合はどのバージョンになるのでしょうか?

現在PHP公式では5.4未満はサポートが行われていません。 セキュリティパッチなどは御社が独自に提供していただけるのでしょうか。

以下、サポートからの返答。

この度は弊社サービスをご検討いただき、ありがとうございます。

PHPのバージョンは4.4、5.2~5.4の中から任意にお選びいただけます。特に お客様にて設定が行われなかった場合は5.4が適用されます。

セキュリティパッチについては弊社にて独自に作成し、対応を行っております。 ご安心ください。

ご不明な点やご質問等ございましたら、本メール返信にてお問い合わせ ください。

今後ともさくらインターネットをよろしくお願いいたします。

公式のサポートが切れているPHPのバージョンにもセキュリティパッチを当て続けている!?

第89回 PHP勉強会@東京に行ってMac・Windows共通のPHP開発環境 // Speaker DeckというLTをさせていただきました。

会場は株式会社リジョブさんの咲くらぼというスペース。人工芝に座って人工桜を見ながらビール飲んで勉強会とか最高かよ。

咲くらぼ TECH 勉強会サポート | 咲くらぼTECHブログ - 株式会社リジョブ

また、じゃんけん大会でLaravelエキスパート養成読本をいただきました。ありがとうございます。

LT内容を箇条書きにまとめるとこんな感じです。

  • レガシーPHP改善はまずは共通開発サーバーの撤廃からはじめるとよい。
  • WindowsでのPHP開発環境をMac上のVirtualBox内のWindowsでサクッとできるとか思うなよ。
  • shin x blogは神。
  • ansibleはlocalで使え。
  • VirtualDocumentRoot + PHPには罠がある。
  • xip.ioを活用せよ。
  • chocolateyは神ツール。

足ばやになってしまった質疑応答に対する補足。

Q. AnsibleはWindows対応してなかったっけ?

A. provision対象としてはサポートしてるけど、clientの実行マシンとしてはサポートしてません。

Installation — Ansible Documentation

Currently Ansible can be run from any machine with Python 2.6 or 2.7 installed (Windows isn’t supported for the control machine).

Q. Windows対応してないなら何でAnsible?chef-zeroは?

A. ごもっとも。chefは個人的にキモい(ネーミングとかberkshelfとか)。私がruby好きなのでrubyで何でもできるchefをPHPの会社に導入するとやり過ぎてしまうのが怖かった(vagrantはいいのかよ > 俺)。など。後は小規模ではchef-zeroよりansibleの方がシンプルで覚えるのも簡単だと思う。

私の構成管理ツールについての苦悩のエントリーはこちら

構成管理ツールについて - komagata

Q. 技術的な内容ばかりだけど、レガシーPHP改善は「このままでいいや」というみんなのマインドセットを変えることの方が重要なのでは?何か工夫していることは?

A. おっしゃるとおり。答えは例えばみんなを誘ってPHP勉強会に来る、発表する。(3人来ていただけました。ありがとうございます!先月はボッチで行った!)

レガシーPHP改善日記 シーズン2 エピソード1 - komagata

流行りの環境うんぬんは単なる手段であり、"経営陣を含めたマインドセットの更新が大事"ってのはありますが、そんな話みんな読みたくないでしょ?

エピソード1ではこんなこと言ってますがちょっとだけ・・・。

プレスコットのピクルス原理

「漬け水がキュウリに漬かるよりは、キュウリが漬け水に 漬かるほうが早い。」これは、「長いものには巻かれろ」という 世渡り術指南の、ちょうど逆を意味する。 すなわち、大きな仕組みに影響を与えようとして、 接触を続けている小さな個(自分)は、結果として、むしろ自分のほうが変えられてしまう可能性が高い、ということを警告している。

ピクルス原理によれば私が一人息巻いて乗り込んだところでレガシーPHPシステムは変わりません。むしろこっちがレガシー寄りになる。

シーズン1からお読みの方はご存知の通り、レガシーPHP改善にとってPHPコミュニティーと会社をつなげることは既定路線であり、必須のメソッドです。

今回は内容をブログに書くということも了承を得てからお仕事を受けています。(ほう、経験が生きたな

ピクルスを漬けている瓶に穴を開ける。そしてPHPコミュニティーという大きなプールにピクルスの瓶ごと突き落とす。そして割るぐらいのことをしないとマインドセットは変わらないと思います。

逆にいえば人間はピクルス原理のように周囲の環境に急激に馴染むという性質をもっています。PHPコミュニティーという良い漬け水に浸かれば急速に周囲に馴染んでいき、良いPHPエンジニアになれると思います。(良きキュウリは別の瓶に移って行ってしまうという別の法則もありますが…)

レガシーPHP改善でうかがってはじめに取り組んだのがslackの導入です。それまでIP-Messengerやメールで密書のようなやりとりをしているところにslackを導入し、何かにつけPHP界隈の情報を流しました。

先月も今回の勉強会も1時間前まで「まだ定員に空きがあるのでお時間がある方は是非」などと「こいつウゼェ・・・」と思われても仕方ないぐらい必死の勧誘をしました。

また、今回参加された方がいたことで変化に前向きな方々=心強い味方を見つけることができました。そういった方々に協力をおねがいして、参加できない方も巻き込むために社内で開催するぐらいの勢いでやる必要があります。

今回唯一の誤算はレガシー改善はまだ途中であり、会社名は改善が成ってから公開予定だったのですが、自己紹介で「今、自己紹介されたkomagataさんと一緒にやっている(略)」と会社名が思い切りバレたことです。

そりゃあそうなるわなと思いました。何が誤算だよ > 俺

関連:レガシーPHP改善日記シリーズ

先月になりますが、PHP勉強会@東京に行ってきました。数年ぶり。

第88回 PHP勉強会@東京 - PHP勉強会@東京 | Doorkeeper

発表

Let tested using a mock with PHPUnit // Speaker Deck

phpunitは当たり前になったけどmockをもっと使おうという話。

PSR-2でLintした結果を見えるようにして、コード品質の最低限を上げる

PHP_CodeSnifferやphp-cs-fixerでPRにLint結果をコメントとして投稿する言語非依存な静的解析コマンドラッパーのSaddlerを作ったという話。

HoundCIとかはdiffのみから警告作ってるから速いのだそうです。saddlerはファイル全体を見ることで可能になるもっと詳細な静的解析を出してくれる。

Laravelの美容口コミサイトへの導入事例(スライドは未アップ)

cakephp使ってたけどlaravelで中規模サイト作ってみたらすごく良かったという話。Googleトレンドでも上昇中らしい。本ももうすぐ出るらしい。

感想

全員自己紹介のテーマが「好きなエディター」だったが、PHPStormが有料にもかかわらず圧倒的に多かった。次点でvim, sublime text2, atom, eclipseと言った感じ。(KLabでは全員にPHPStormが支給され、git clientも内蔵しているそうです。)

laravelは現状のphpフレームワークで一番良さそうに見えた。

powを別マシンから使う時に出てきたxip.ioがクッソ便利なことに今更気づいた。

% ping 192.168.0.1.xip.io
PING 192.168.0.1.xip.io (192.168.0.1): 56 data bytes

xip.ioの前にIPつけるとそのIPを返してくれる。

ってことはvagrantデフォルトの192.168.33.10を返すようにしたら便利だ。

% ping 192.168.33.10.xip.io
PING 192.168.33.10.xip.io (192.168.33.10): 56 data bytes

その前にIP以外のものを付けても同じIPを返してくれる。

% ping foo.192.168.33.10.xip.io
PING foo.192.168.33.10.xip.io (192.168.33.10): 56 data bytes

ってことは設定無しで好きなIPでVirtualDocumentRootが使えるってことだ。

Macに複数サイトに対応したPHP環境を簡単に作る - komagata

screenで絵文字が出ない問題もあってターミナルマルチプレクサを見なおしてみた。

screenで絵文字を表示できない - komagata

tmuxに移行しようかと思ったけどpaneやwindowの概念がscreenと違うし、そもそも俺は同じディレクトリでTerminalが開きたいってだけで、画面分割はvimでしか使ってないのでNew tabs open with: Same Working Directory(同じワーキングディレクトリで新規タブを開く)でいいやってことになりました。

これはMacのbash用の設定なので独自に下記の設定で、単に最後にいたディレクトリで開くようにした。

# ~/.zshrc:
function save_cwd() { pwd > ~/.cwd }
autoload -Uz add-zsh-hook
add-zsh-hook precmd save_cwd
cd `cat ~/.cwd`

vimで画面分割した時日本語がズレる問題とか、若干重い問題とかもついでに解消された。ターミナルマルチプレクサ通さない直接vimは速い気がします。