PHPCompatibilityを実行するためのDockerイメージを作った

PHP5からPHP7への移行を検討するとき、この記事を思い出してPHPCompatibilityを使ってみたところ、結構便利そうだった。

kakakakakku.hatenablog.com

で、ちょっと導入が面倒な気がしたので、Dockerイメージに無理やり押し込んでみたのがこちら。

https://hub.docker.com/r/ariarijp/php-compatibility/

PHP_CodeSnifferとPHPCompatibility導入済みのイメージなので、Dockerホスト上のPHPアプリが置いてあるディレクトリをマウントすれば phpcs が実行できる。

設定ファイルは元記事を参考に、PHP7で非推奨になったものをチェックする。

<?xml version="1.0"?>
<ruleset name="wordpress">
  <rule ref="PHPCompatibility">
    <arg name="testVersion" value="7.0" />
    <exclude name="PHPCompatibility.PHP.DefaultTimezoneRequired" />
  </rule>
</ruleset>

試しにWordPressを対象に実行してみる例がこちら

$ docker run --rm -v `pwd`:/mnt/host ariarijp/php-compatibility phpcs --extensions=php --standard=/mnt/host/ruleset.xml /mnt/host/wordpress

FILE: /mnt/host/wordpress/wp-admin/includes/class-ftp.php
----------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
----------------------------------------------------------------------
 902 | WARNING | Function dl() is deprecated since PHP 5.3
----------------------------------------------------------------------


FILE: /mnt/host/wordpress/wp-admin/includes/class-pclzip.php
----------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 2 LINES
----------------------------------------------------------------------
 5345 | ERROR | Function set_magic_quotes_runtime() is deprecated
      |       | since PHP 5.3 and removed since PHP 7.0
 5376 | ERROR | Function set_magic_quotes_runtime() is deprecated
      |       | since PHP 5.3 and removed since PHP 7.0
----------------------------------------------------------------------

...略...

PHP5.6のEOLは2018/12/31。まだ余裕があるようで、時間はあっという間に過ぎてしまうので、こういったツールも活用しつつ計画的にアップグレードしていきたいところ。

PHP BLT #6 でPHPのパフォーマンスモニタリングについてLTした

ちょっと前の話になってしまいますが、2/22にメルカリさんで開催されたPHP BLT #6に参加しました。

phpblt.connpass.com

発表内容

php-profiler-extensionとElasticsearch/Kibanaを使用したパフォーマンスモニタリングの試行について発表しました。

speakerdeck.com

5分に収まるように資料を無理やりまとめてしまったのと、発表時は緊張してたのもあって、駆け足なLTになってしまったのですが、後からハッシュタグを追ってみるとphp-profiler-extensionはXHProfの代替として利用でき、PHP7に対応しているというところは興味を持っていただけたようでした。

LTで軽くデモをしたElasticsearch/Kibanaでの可視化については、別途記事を書くかもしれません。

感想

PHP BLT初参加だったのですが、話題が多岐にわたりながらLTサイズ(5分)で聞けるので、普段気にしていなかったり触れていなかったことを発見できる場として、素直にいいなと思いました。

個人的にはPHP BLT #5での @sotarok さんの発表スライドを見て、次に開催されるときは必ず参加しようと思っていたこともあり、そういった意味でも充実した時間を過ごすことができました。

speakerdeck.com

遅くなってしまいましたが、メルカリさん(と、司会の @koemu さん)ありがとうございました!

Mackerel Meetup #9でPHPerとしてLTしてきました

LT枠が空いていて、会社からも近かったので参加してきました。

mackerelio.connpass.com

参加レポートはこちらの記事を読んでいただくのがよいと思います。さすがの当日投稿でした。

cross-black777.hatenablog.com

そんななかで、年始に時間が空いてたときに作ったmackerel-client-phpについてLTしてきました。

実はLT枠で参加を決めた後に、先にLT枠で登録されていたのが sion_cojp さんだと知って、「Get wildのあとにする話なんか無い」と膝から落ちたのはいい思い出です。

speakerdeck.com

このLT時点でGithubのStarが0だったことをネタにしたのがややウケでよかったです。

ちなみに、当日のMeetupが終わってから家につくまでにStarがじんわり増えたのですが、都合によりかなり飛ばしたペースで話したので、ほとんど記憶に残らないぐらいのリポジトリ名にもかかわらず、わざわざ探してStarをつけていただいた皆様には感謝しかありません。ありがとうございました。

会場にはPHPerの方が少ないように見受けられましたが、対 not PHPerネタとして無理やり仕込んだSlack APIを使ったチームのがんばり度合いの可視化もちょっとウケたようでよかったです。

クローズ時間が差し迫っていたこともあり、あまり多くの方とお話できなかったのですが、またMeetupの機会があれば、参加させていただきたいなと思っています。

最後に、Meetupの場とLTのノベルティを提供していただいたレコチョクさん、はてなさん、ありがとうございました!

使っていないAndroid SDKを削除してディスク容量を空ける

妙にホームディレクトリーのファイルサイズが大きいので調べたら、Android SDKが結構大きかった。

$ du -hs ~/Library/Android
 42G    /Users/ariarijp/Library/Android

仕事でAndroidアプリを書くような人でなければ古いSDKは必要な時に入れればいいと思ったので、Android SDK Managerで最新版だけ残して、古いSDKのたぐいは一括削除した。

削除後はこんな感じ。

$ du -hs ~/Library/Android
 11G    /Users/ariarijp/Library/Android

すっきりしてよかった。

PhantomCSSを使ってページ内の特定のDOM要素のみを画像として保存する

仕事でちょっとした便利ツールを作る機会があったので、ページ内の特定のDOM要素のみを画像として保存する方法を調べました。

PhantomJSやCasperJSは多少使ったことがあったので、PhantomCSSというのを使ってみることにしました。

github.com

これはおそらく画面のテストに使うもので、2つの画像の差分も取れるようなのですが、その一部の機能を使うことで目的を達成することができました。

導入

前提条件

PhantomJSとCasperJSが必要です。

PhantomJS | PhantomJS

casperjs.org

これらのインストール方法は割愛します。

インストール

npm でインストールできます。グローバルインストールするかどうかは環境やお好みに合わせて変えてください。

$ npm install -g phantomcss

使い方

このブログのトップページに表示されている、1件目の記事を画像として保存するサンプルコードはこちら。

casper.options.viewportSize = {
    width: 1280,
    height: 1024
};
var phantomcss = require('phantomcss')
phantomcss.init({screenshotRoot: './screenshots'})

casper.start('http://ariarijp.hatenablog.com/').then(function() {
    phantomcss.screenshot('#entry-10328749687202579336', 'article');
}).run();

動作確認

このスクリプトを以下のように実行します。

$ casperjs test sample.js

正常に実行できれば、以下のようなファイルが作成されているはずです。

screenshots/
`-- article_0.png

保存した画像はこのようになっています(実際は記事すべてが入っているのでもっと縦長です)

f:id:ariarijp:20170114214103p:plain

まとめ

他にも方法があるかもしれないけど、意外と簡単にできてよかった。