Engineer as a Lifestyle @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

brew upgradeしたらphp実行できなくなって、php-buildも失敗するようになった【たぶん解決】

とりあえず現状を載せておきます。 brew upgrade を実行したら、php-buildでインストールしたphpの実行に失敗するようになりました。 php-buildは最新版であることを確認して、(コミットハッシュ: e2969a6) install.sh を実行しました。 結論としては CXXFLAGS='-std=c++11' を追加してビルドすると、phpが実行できるようになりました。

環境

  • MacBook Pro 2016Mid
  • macOS Sierra 10.12.6
  • direnv でphpのパスを設定
  • ghq で php-build をインストール

現象

PHP実行

$ php -v
dyld: Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.8.dylib
  Referenced from: /Users/tenkoma/local/php/7.1.8/bin/php
  Reason: image not found
Abort trap: 6

php-build

$ ghq look php-build
        cd /Users/tenkoma/src/github.com/php-build/php-build
bash-3.2$ time YACC=$(brew --prefix bison)/bin/bison PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j7 php-build -i development 7.1.8 ~/local/php/7.1.8/
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: Loaded zendopcache Plugin.
[Info]: php.ini-development gets used as php.ini
[Info]: Building 7.1.8 into /Users/tenkoma/local/php/7.1.8/
[Downloading]: https://secure.php.net/distributions/php-7.1.8.tar.bz2
[Preparing]: /var/folders/pc/vq2zc_sn05v190vzzvz99bpc0000gn/T//php-build/source/7.1.8
^@[Compiling]: /var/folders/pc/vq2zc_sn05v190vzzvz99bpc0000gn/T//php-build/source/7.1.8
^@^@
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
                                                   ^
                                                    _Nullable
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/signal.h:106:48: note: insert '_Nonnull' if the pointer should never be null
int     sigvec(int, struct sigvec *, struct sigvec *);
                                                   ^
                                                    _Nonnull
352 warnings generated.
352 warnings generated.
352 warnings generated.
331 warnings generated.
-----------------------------------------

The full Log is available at '/tmp/php-build.7.1.8.20170814220930.log'.
[Warn]: Aborting build.

real    3m15.342s
user    6m5.609s
sys 1m21.761s

ビルド成功しました(追記 2017/08/16 1:22)

下の、libjpegのエラーについては、ビルドしなおせば、上記のエラーは発生しなくなりますも確認ください。 解決策情報をいただきました。

やってみます。まず、libjpeg のバージョンを切り替え

$ brew info libjpeg
jpeg: stable 9b (bottled)
Image manipulation library
http://www.ijg.org
/usr/local/Cellar/jpeg/8d (19 files, 708.3KB)
  Poured from bottle on 2016-11-19 at 12:49:23
/usr/local/Cellar/jpeg/9b (20 files, 724KB) *
  Poured from bottle on 2017-08-14 at 00:35:36
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/jpeg.rb
$ brew switch libjpeg 8d
Cleaning /usr/local/Cellar/jpeg/8d
Cleaning /usr/local/Cellar/jpeg/9b
17 links created for /usr/local/Cellar/jpeg/8d

次に CXXFLAGS を指定してビルド

$ ghq look php-build
        cd /Users/tenkoma/src/github.com/php-build/php-build
bash-3.2$ time YACC=$(brew --prefix bison)/bin/bison CXXFLAGS='-std=c++11' PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j7 php-build -i development 7.1.8 ~/local/php/7.1.8/
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: Loaded zendopcache Plugin.
[Info]: php.ini-development gets used as php.ini
[Info]: Building 7.1.8 into /Users/tenkoma/local/php/7.1.8/
[Downloading]: https://secure.php.net/distributions/php-7.1.8.tar.bz2
[Preparing]: /var/folders/pc/vq2zc_sn05v190vzzvz99bpc0000gn/T//php-build/source/7.1.8
^@[Compiling]: /var/folders/pc/vq2zc_sn05v190vzzvz99bpc0000gn/T//php-build/source/7.1.8
^@^@^@^@[xdebug]: Installing version 2.5.5
[xdebug]: Compiling xdebug in /var/folders/pc/vq2zc_sn05v190vzzvz99bpc0000gn/T//php-build/source/xdebug-2.5.5
[xdebug]: Cleaning up.
[Info]: Enabling Opcache...
[Info]: Done
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.7.1.8.20170816011335.log
[Success]: Built 7.1.8 successfully.

real    6m12.645s
user    16m37.504s
sys 5m20.081s
bash-3.2$ php -v
PHP 7.1.8 (cli) (built: Aug 16 2017 01:18:24) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.8, Copyright (c) 1999-2017, by Zend Technologies
    with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans

ビルド時刻が更新されているので、ビルド成功です。

libjpegのエラーについては、ビルドしなおせば、上記のエラーは発生しなくなります(さらに追記 2017/08/18 18:27)

さらに情報をいただきました。ありがとうございます。

libjpeg を元に戻してビルドし直しました。

$ brew switch libjpeg 9b
Cleaning /usr/local/Cellar/jpeg/8d
Cleaning /usr/local/Cellar/jpeg/9b
17 links created for /usr/local/Cellar/jpeg/9b
$ ghq look php-build
$ time YACC=$(brew --prefix bison)/bin/bison CXXFLAGS='-std=c++11' PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j7 php-build -i development 7.1.8 ~/local/php/7.1.8/
$ ~/local/php/7.1.8/bin/php -i | grep JPEG
Supported filetypes => JPEG,TIFF
JPEG Support => enabled
libJPEG Version => 9 compatible

いただいた情報の通り、 php 実行できました。

5.4.45, 5.5.38, 5.6.31, 7.0.22, 7.1.8, 7.2beta2 までビルド成功しました。5.3.29では以下の通りビルド失敗しました。

$ time YACC=$(brew --prefix bison)/bin/bison CXXFLAGS='-std=c++11' PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j7 php-build -i development 5.3.29 ~/local/php/5.3.29/
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: Loaded zendopcache Plugin.
[Info]: php.ini-development gets used as php.ini
[Info]: Building 5.3.29 into /Users/tenkoma/local/php/5.3.29/
[Downloading]: https://secure.php.net/distributions/php-5.3.29.tar.bz2
[Info]: Applying patches: /usr/local/bin/../share/php-build/patches/php-5.3.29-64bit-intl.patch
[Preparing]: /var/folders/pc/vq2zc_sn05v190vzzvz99bpc0000gn/T//php-build/source/5.3.29
[Compiling]: /var/folders/pc/vq2zc_sn05v190vzzvz99bpc0000gn/T//php-build/source/5.3.29
^@
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
        ^
          _Nullable
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdio.h:475:6: note: insert '_Nonnull' if the pointer should never be null
FILE    *funopen(const void *,
        ^
          _Nonnull
330 warnings generated.
330 warnings generated.
330 warnings generated.
331 warnings generated.
-----------------------------------------

The full Log is available at '/tmp/php-build.5.3.29.20170818191216.log'.
[Warn]: Aborting build.

real    2m24.479s
user    3m19.952s
sys 1m30.081s

今後5.3を使う必要に迫られない限り、放置でいこうかと思います。

CircleCI 2.0でCakePHPアプリをビルドする話を PHP BLT #8でしてきました

PHP BLT #8 - connpass

8月8日、株式会社メルカリ 東京支社オフィスで開催されたPHP BLT #8 に参加してLTしました。

CircleCI 2.0 で CakePHP3 アプリのビルド // Speaker Deck

CircleCI 2.0を検証してみて

参考文献

余談

見てくださるかたの反応を見ながら話すのが苦手です…

あと、LTでコードを見せて理解してもらうのは困難、という学びがありました。

ワークフロー機能が実装される前は、副ジョブのAPIをcurlで叩く、というやり方だったので(参考: CircleCI 2.0 でNode.jsのマルチバージョンビルド - teppeis blog)、CircleCI に「お前は何を言ってるんだ」と言いたくなりましたが、ワークフロー機能は便利です。

PHPカンファレンス福岡2017 に参加しました #phpconfuk

2017年6月10日に福岡で開催されたPHPカンファレンス福岡2017に行ってきました。

関西は2回ほど行ってますが福岡は初参加でした。

前日入りしてFusicさんに初訪問して雑談したりコード書いたりしてましたが後で述べます。

当日の感想など

ひとりLT大会

途中から参加。早口すぎてわからないところが多かったのですが、LTは勢いが大事、ということで… クイズを支える技術についてはY8 2017 spring in Shibuya懇親会で聴いてました。

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

スポンサードセッション3つのうちの1つでした。私はこれ1つだけ聴いて、あとはスポンサーブースを回ったのですが(すみません!)題目だけ見るとまったく宣伝くさくないですね。開発ノウハウの共有自体が最高の宣伝ということなのでしょう。

  • PHP5.6で書いてたコード、ほぼPHP7でも動いたとのこと
  • デプロイを自動化する、コマンドを使わず、エンジニア以外でもデプロイできるようにする仕組みについては僕もとりくんでいるので、参考になるかも…と思います。
  • 僕はDeployer — Deployment Tool for PHP使ってます。CakePHP3なら、デプロイ時はここに書き込み権限が必要でORMキャッシュクリア必要だよねー、みたいな部分をプリセットで用意してくれる(他にもいろんなレシピがあります)ので、おすすめです。

実践Action Domain Responder

「Action Domain Responder」という用語自体知らなかったので参加

スライド未アップロードのようですが、Lumen/Laravel Action-Domain-Responder(ADR)アプローチ - Qiitaにyuuki takezawaさんの資料がありました。

CakePHPでコードを書いていると、Controllerのコードが太りやすくなったり、ビューロジック(Responseの操作)が混ざったりするので、分けられないかな〜と思うことはあるので、後ほどチェックしたいと思います。

faultline / faultline-php によるサーバ管理不要なエラートラッキングとその効果

少し前にツール自体試してないのにプルリクを送ったことがあり、興味があったので参加しました。

小規模なプロジェクトが数多くある現場だとSaaSのエラートラッキングツールは選びにくいので、そういった現場では非常に有用ですね! S3にログを蓄積していて、WEBUIを使った場合、それをHTTPで取得しているので、検索機能は実装しにくい(もしAmazon Athenaを使うとなると金が発生しそう…?)そうですが、GitHub Issueに登録する機能があるので、簡易的な検索はそちらで出来る気がしました。

次の日もFusicさんにお邪魔してfaultlineを実際に試してみることができました。

Progressive Web Apps + AMP = PWAMP for PHPer

Progressive Web Apps はHTML5 Conferenceだったかで聴いたことがあり参加。

Progressive Web Apps や Service Worker といった新しめの技術はlocalhost以外でHTTPSが必須となっていて、僕も新規にサイト構築するときはhttps前提に考えているので、HTTPS化をすすめるためにも勉強していきたい。

PHPerに覚えて欲しい日本語の重要性

エラーメッセージってどうかくか、よく迷いますね。 ユーザーにとっての「具体的な解決策」を書くようにしよう!

CakePHP 1.3 + PHP 5.3 → CakePHP 3 + PHP 7 移行を決めた話

開催前から注目してたセッション。 バージョンアップ条件の整理(20ページ)など、バージョンアップ時に注意していることの情報がたくさんで貴重です。 CakePHPコアに直接手を加えている箇所、多いですね…

[LT]カンファレンスのあちら側とこちら側

勉強会・カンファレンスで発表したいけど一歩踏み出せない方に超おすすめLTでした。

スポンサーブースまわり

ホールから1度出た別の部屋でスポンサーコーナーとAsk The Speakerコーナーがありました。 BaserCMS のブースがあり、要望を書くとくじが引けたのでCakePHP3対応を要望しました(笑)

全体的な感想

最近、福岡にはASCII.jp:髙島市長も熱弁!さくら、アカツキ、ピクシブ、メルカリが福岡拠点開所へというニュースもあり、その盛り上がりを見たいというのがあり、初めて参加しました。

カンファレンスの会場はとても快適で、3つあるホール/ルームはすべて座って聴くことができました。前の方の席にテーブルが用意されていてセッション開始後でもすいていたので助かりました。ルームの移動もしやすかったです。

セッション内容も興味のあるものが多く、カンファレンス後もPHPerの皆さんと飲みながら長く話すことができて充実できました。

来年も開催されるなら是非参加したいです。

(おまけ)前日と翌日

カンファレンスの前日と翌日、地下鉄天神駅の近くにある株式会社Fusicさんにお邪魔して、雑談したりコード書いたりしてました。

前日は8. 現場の座談会(cakephper / tomzoh / tadsan) | PHPの現場の収録も行われ、生で内容を聞いてました。その後、前夜祭まで少し時間があったので、会場で袋詰めのお手伝いをしました。

翌日は主にfaultlineのハンズオンに参加していて、ちょっとしたバグ修正のPRをその場で送ったりしてました。

ローカル開発環境のPHPをphpenv から php-build + direnv に変えた

engineering.otobank.co.jp

こちらやってみました。

php-build を使う

GitHubリポジトリを管理する ghq はインストール済みとして, まず php-build をインストールする

$ ghq get php-build/php-build
$ ghq look php-build
$ ./install.sh
$ exit

現在最新の PHP 7.1.6 をビルドしてみる

php-build -i development 7.1.6 ~/local/php/7.1.6
$ ~/local/php/7.1.6/bin/php -v
PHP 7.1.6 (cli) (built: Jun 10 2017 16:21:37) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.6, Copyright (c) 1999-2017, by Zend Technologies
    with Xdebug v2.5.4, Copyright (c) 2002-2017, by Derick Rethans

direnv を使って、ディレクトリごとにphpのバージョンを指定する

direnv では cd した時に .envrc の内容を実行します。 そのファイルで $PATH を変更することでディレクトリごとにPHPバージョンの切り替えが実現できます。

path/to/project/.envrc

PATH_add $HOME/local/php/7.1.6/bin

.envrc を保存したとき、

direnv: error .envrc is blocked. Run `direnv allow` to approve its content.

と怒られる場合は

$ direnv allow

を実行するとdirenvが使えるようになります。 ここまでセットアップすれば以下のように切り替わります。

$ php -v
PHP 7.0.19 (cli) (built: May 21 2017 11:56:11) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
$ cd ~/projects/sample_projects/direnv_sample
direnv: loading .envrc
direnv: export ~PATH
$ php -v
PHP 7.1.6 (cli) (built: Jun 10 2017 16:21:37) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.6, Copyright (c) 1999-2017, by Zend Technologies
    with Xdebug v2.5.4, Copyright (c) 2002-2017, by Derick Rethans

PHPのバージョンアップがあったときは

新しいバージョン定義が追加されていれば、(Pull Requestで更新されてます) git pull して ./install.sh すれば新しいバージョンをビルドできます。以下のような感じです。

$ ghq look php-build
        cd /Users/tenkoma/src/github.com/php-build/php-build
bash-3.2$ git pull
Already up-to-date.
bash-3.2$ ./install.sh
Installing php-build in '/usr/local'
  - creating directories... done.
  - copying files... done.
Done.

PHP BLT #7 でGitLab Review Apps の話でLTしました

2017/5/22 に株式会社メルカリで開催されたPHP BLT #7でLTしてきました。PHP BLT初参加です。

とりあえず参加登録後に過去の発表資料をチェックしたら、ほとんどPHPの話だったので、そういう縛りがあるのかーPHPネタは難しいな、と思ったのですが杞憂でした。 最近取り組んでいるGitLab CI を使った自動化の例として、レビュー環境を自動生成する話の(私が勉強中の)現状について紹介しました。

発表内容は、GItLab CI + Review Appsの簡単な紹介と .gitlab-ci.yml の設定例です。

CakePHPで自作したデプロイツール(gitリポジトリURLを指定すれば「デプロイ」ボタンを押すだけでレビュー環境が更新される、HTTP認証も設定できるというもの)を運用しているのですが、gitコマンドまわりでバグがあったり、push時に自動でデプロイする機能がまだなく使い勝手がまだまだです。しかし、Review Appsならそのあたりをイイ感じに解決できそう、という感想です。

LT中にでてくる唯一のPHP要素、 .htdigest ファイルを生成するワンライナーは以下の通りです。

php -r 'printf("%s:%s:%s\n", $argv[1], $argv[2], md5("{$argv[1]}:{$argv[2]}:{$argv[3]}"));' $HTTP_USER "$HTTP_REALM" $HTTP_PASSWORD >> $SRC_PUBLIC_DIR/.htdigest

紹介した設定ファイルのコードは以下で参照できます。

GitLabは使い方を覚えれば、できる自動化が増えていって楽しいですね。

プルリクメモ 4/15

CakePHP Cookbook修正のプルリクエスト

2年前に追加された説明を削除してシンプルにするものだったので丁寧な説明を心がけた。 検証もして、8時間くらいかかった。

説明は以下の順で構成した。

  • 何をするプルリクかを1行で説明
  • あらすじ、何が問題か
  • どう改善したか
    • 設定の記述を1つにまとめた。検証したらまとめられることがわかった。
    • この節はPretty URLを実現するためのRewrite設定の説明なので、直接的な部分だけ先に明示した。
  • 検証結果・メモ

nginx の設定で試行錯誤したので勉強になった。