カテゴリー別アーカイブ: 未分類

chromeless on AWS Lambda を試してみる

最近は、E2E テストをどうにかできないかと思って、色々探っています。
そのなかで、個人的にアツいなと思った chromeless の紹介と試しに使ってみたレポートを行いたいと思います。

僕が探した限りだと、現時点(2017/10/23)で日本語の記事は、githubのTrendingになっているchromelessをWindowsで試すの1件のみに思えました。

https://github.com/graphcool/chromeless

AWS Lambda 上で Headless Chrome を動作させ、そちらに対してリクエストを行うということで、ブラウザテスト実行の並列性を 1000 まで上げるというアプローチを行うのがこちらのライブラリの目指すところです。

chromeless の README にも記載がありますが、AWS Lambda 上で動作させるために、AWS のアカウントが必要になります。

Lambda 上で動作させるモードと Local で動作させるモードのふたつがあり、 Lambda 上で動作させるモードは Proxy 利用となります。

大まかな手順としては、以下のようになります。

1. chromeless リポジトリを clone し、Proxy 用のサービスのディレクトリで npm install
2. コンフィグを設定し、自分のアカウントの Lambda 上に function をデプロイ
3. デプロイが完了すると、endpoint の url と api key が発行される
4. 発行された endpoint, api key を利用し、proxy に対してリクエストする

手順はこちら。

https://github.com/graphcool/chromeless/tree/master/serverless#chromeless-proxy-service

ひとつハマりどころとしては、全サービス (AWS IoT, AWS Lambda, AWS S3) のリージョンは揃えておく必要があります。

この状態で、Lambda のマネジメントコンソールを確認してみると、たしかに 4 つの関数が追加されています。

さて、次はこちらの API に対してリクエストを投げてみたいと思います。
ここでは試しに iPhone の UserAgent と ViewPort を設定してみています。

こちらを実行してみますと、ほどなくして以下のような出力があらわれます。

s3 にスクリーンキャプチャが自動的にアップロードされ、その URL が返ってきているのがわかります。

早速開いてみますと、ViewPort がちゃんと反映はされているものの、文字化けというか日本語が表示されるであろう箇所が豆腐になっています…。




ちなみに、 https://www.yahoo.com/ を指定してみると

ちゃんと出ています。

やはり日本語が表示されないようです。
その後いろいろと調べていると、chromeless が依存している serverless-chrome に日本語フォントがインストールされていないため、日本語は表示されないという状況のようです。

その issue は こちら

こちらの issue にもコメントされていますが @fd0 さんのブログに「serverless-chrome で日本語を表示できるようにする」というエントリがあり、できないことはないようです。
(lambda の 50MB 制限を超えないようにフォントをインストールした chrome のバイナリを strip して容量を減らすというの、面白かった)

フォント問題は意外と根が深いのかもな…と思いつつ、本家の対応を待つかという気持ちになりつつあります。

ちなみに、chromeless にももちろん click(selector: string) や type(input: string, selector?: string) などの Chrome でのメソッドが使用できます。(一部未実装があるようですが)
一般的に E2E テストは実行時間が遅いという認識ですが、Lambda を利用して並列数を爆発的に増やすというアプローチはすごく面白いので、今後も非常に期待しています。

Mac の git を脆弱性が修正された最新版(2.14.1)にバージョンアップする

git に脆弱性が見つかりました。

Gitの脆弱性 ( CVE-2017-1000117 ) — | サイオスOSS | サイオステクノロジー

早速、脆弱性が修正された git version 2.14.1 がリリースされているようなので、プライベートな Mac でも git をバージョンアップしたいと思います。

現バージョンがこれでした。

てっきり、brew でインストールしたと思っていたので、 brew update して brew upgrade git すればいいのかと思いきや、 brew upgrade git したら、brew でインストールしていないとのこと。(下記エラーが出ました)

デフォルトで入っていたものをそのまま使用していたようです。

brew でインストールすると最新版の 2.14.1 が落とせるようなのでそちらを使うようにします。

ターミナルを再起動してから、バージョンを確認してみます。

無事に、最新版がインストールされ、brew でインストールしたほうが呼び出されるようになりました。

PHP BLT #6 で LT してきた

例によってメルカリで LT (PHP BLT #6) してきました。
PHP BLT #2 のときもメルカリで LT してるんですが、その時と比べて内装がめちゃくちゃキレイになってた…

オシャレスペースすぎてドギマギしました。記者会見とかできるよ…
会場のパノラマ写真を記念に撮ったんですが、 public にしていいものか悩むのでここでは公開しませんw

他の方の発表で特に刺さったのは、

Dockerを使ったPHPアプリ開発とCIについて
Introduction to Guzzle

あたり。

オーディエンスに、Docker を開発環境で使ってる人ー?と呼びかけられてて、チラホラ手を挙げてる方がいたのは見たんですが、本番環境で使ってる人ー?となると誰も手を挙げてなかったのが印象的でした。
Guzzle はコントリビュート出来るチャンスがいろいろあるよと、コントリビュートしてる @DQNEO さんが言ってたのでおそらくあるんでしょう。コードリーディングしていきたい気持ちになりました。

さて、僕の発表スライドはこちら。

今回は PHP 書く人ならおなじみの Carbon を題材にしつつ、最終的に OSS 運営の知見につなげたんですが若干強引だったような…。

ちなみに、これから使うなら Carbon じゃなくて、Chronos じゃない?とは言いつつ Laravel が Carbon 使ってる限り捨てづらい気もしますね。個人的には、Laravel 使わない PHP プロジェクトがあれば積極的に Chronos を使っていきたい所存です。

スライドに両リポジトリで起こった時系列の話を書いているのですが、そこにリンクは張っていないのでここではリファレンスという意味で置いておきます。


2012-09-11 Carbon v1.0.0 公開
2012-09-12 Carbon のリポジトリでイミュータブルに出来ないかという issue が作られる
https://github.com/briannesbitt/Carbon/issues/2
2013-04-19 Eloquent 内で DateTime の代わりに Carbon を使っては?という提案 issue が作られる
https://github.com/laravel/framework/issues/999
2013-04-20 Laravel に Carbon が取り込まれる
https://github.com/laravel/framework/pull/1012
2013-05-26 なぜ Carbon を使っているのか?という質問 issue が作られる
https://github.com/laravel/framework/issues/1408
2013-05-28 Carbon が取り込まれた Laravel v4.0.0 (php >= 5.3.0) が公開される
https://github.com/laravel/framework/releases/tag/v4.0.0
2013-06-20 DateTimeImmutable class が実装された PHP 5.5.0 がリリースされる
http://php.net/ChangeLog-5.php
2014-04-17 CakePHP に Carbon が取り込まれる
https://github.com/cakephp/cakephp/pull/3328
2015-05-08 CakePHP Community で、Carbon を使うのをやめないかという提案がされる
https://github.com/cakephp/cakephp/issues/6509
2015-10-12 Chronos v0.1.0 公開
https://github.com/cakephp/chronos/releases/tag/0.1.0
2016-01-02 Carbon がすべて Chronos に置き換えられた CakePHP 3.2.0-RC1 (php >= 5.5.10) が公開
2017-01-08 Carbon needs to be more ACTIVE. (2016年は一度もリリースなし)
https://github.com/briannesbitt/Carbon/issues/839
2017-01-11 @lucasmichot が member に追加される
2017-01-15 1 年 3 ヶ月ぶりに Carbon のマイナーバージョンアップされ 1.22.0 が公開


Softbank を解約して mineo の SIM に変更した

先月末、なぜか会社の同僚周辺で MVNO に乗り換えるブームが訪れた。
そのブームに乗っかって、無事に MVNO 乗り換えを果たしたので忘備録も兼ねて記録しておく。

僕のケース
・利用端末 iPhone 5S / iOS 10.2.0
・利用キャリア ソフトバンク
・利用プラン ホワイトプラン+ウェブ使用+パケットし放題フラット for 4G LTE+テザリングオプション

端末代金は一括で支払っていたのですが、上記プランで月に大体9000円前後かかっていた。
また、テザリングもそれなりにしていたので、7GB制限も月末の2〜3日前には、かかってしまうような状態で、低速化されると本当に使い物にならなくてストレスが半端なかった。

非常に悩んだ結果、僕は MNP で iPhone SE (SIMフリー版) + mineo D プラン、デュアルタイプ(10GB、データ通信+音声通話) + 留守番電話サービスに切り替えることにした。
10GBは多すぎるかなと思ったけど、プラン内だったら無料で変更可能なので、後々調整すれば良いかなと。
同僚たちは LINEモバイル or FREETEL or mineo あたりで契約している感じだったかな。

いろんなブログや公式サイトを見たりして、利用料金はぶっちゃけ、MVNO ならどこも大差ないと思った。
安いに越したことはないけど、数百円の差だったりするので、そこまで気にしないスタンス。
気にしたのは、やはり通信速度なんだけど環境要因が非常に大きいので、実際使ってみないとなんとも言えなかったりすると思ってた。

そのなかで、通信速度比較をものすごく詳細にやっているブログがあって、ものすごく読み込んだ。
どうして mineo にしたかっていうのは、正直このブログがすべてといっても過言ではない。
個人的には、運営姿勢が一番のポイントとなった。カード差し替えを頻繁にするような運用はしないつもりだったので、長期目線で良さそうだった。

http://yesmvno.com/speed-hikaku-no2/

上記ブログだと、通信速度の面で、Y!モバイルをものすごく推しているが、電話をほとんどしない自分にとってはちょっと割高だなとは思ったので、今回は除外。
LINEモバイルは、運営姿勢がまだ不明確なところもあるので、ちょっとリスクをとるのは怖かったので除外。(一応縛りあるし)

MVNO は選択肢が多すぎて迷ってしまう。
でも、迷ってる時間がもったいないと感じてきたのでもう mineo でいいんじゃないかと思った。
電話もある程度するなら Y!モバイルがいいかも。
ソフトバンクからのMNP転出手続きをする際に、どこに乗り換えるか聞かれ、他社のですと答えたら、Y!モバイルのキャンペーンを提示されたので、それをうまく使うのもありだと思う。

今回の僕の手順としては、

1. 乗り換え先とプランを決める
2. iPhone SE(SIM フリー版) を購入する
3. Softbank に電話して、MNP 転出したいと伝え、MNP 予約番号を取得する
4. MNP 予約番号を使用して、mineo で申し込み
5. 使用している iPhone 5S のバックアップをとる (僕の場合は Macbook)
6. 郵送で mineo から SIM カードと ID 情報が届く
7. iPhone SE に mineo SIM カードを挿入して、とりあえずアクティベートする (この時点では通信はまだできない)
8. iPhone SE を Macbook につないで復元を行おうとするも、まずは iPhone の OS が古いから復元できませんと言われる
9. iOS アップデート
10. 復元
11. ID/Pass を利用して mineo のマイページにログイン
12. 切り替え手続きを行う
13. @softbank.ne.jp ドメインのメールアドレスしか伝えていなかった人に、gmail からメルアド変更の通知を送る
14. 新端末で通信ができるようになり、(端末の再起動が必要だった)、旧端末の通信ができなくなる

こんなところかなー。
注意点は、LINEのフレンド・トーク履歴を新端末で引き継ぎたかったら、復元だけじゃ足りないので事前に調べて準備しておくことが絶対に必要。
今回は、ミスってトーク履歴を失ってしまった。(フレンドリスト失わなくて本当に助かった…)

という感じですね。
この作業、手間は手間だけど、これで毎月4000円以内には必ずおさまるようになるはずなので、長い目で見たらすぐにペイするでしょう。
残作業としては、iPhone 5S を Apple に下取りしてもらうくらいかな、、そのためにいろいろと準備をしないといけない。

これを読んで、mineo にするってひとは、紹介リンクを使ってくれると嬉しいです。

http://mineo.jp/syokai/?jrp=syokai&kyb=U1S6C4H5M0

2016 年の LT と登壇を振り返る

今年は意識的に外で発表しようと心がけた一年でした。

まずは、2016 年 1 月、メルカリで行われた PHP BLT#2 での発表スライド。

composer によってガンガンライブラリインストールしてるけど、ライブラリに含まれる脆弱性チェックって CI に組み込めないのかなっていう話。
ここでは、Circle CI / Travis CI 両方で試した例を交えて SensioLabs 社製の Security Advisories Checker を紹介してます。

次は 2016 年 2 月に行われた PHP 7 Casual Talks #1。 KDDI ムゲン Labo ルームという会場でした。

ちょうど PHP7 がリリースされて少し経ったぐらいのタイミングだったので、そのあたりに合わせた話題に。
個人ブログをさくらの VPS 使って WordPress で立ち上げていたんですが、あまりにもバージョンアップしていなかったりしたので、大幅に見直すタイミングで PHP7 に上げつつ、Ansible で playbook 書いてみたという感じの話ですね。
一番良くないのは、PHP7 の性能比較が出来なかったこと。もう少し時間取ってしっかり検証すべきでした。

夏ぐらいだったかな、、あまり公開できないないようなのでスライドはあげていないのですが、母校の東京高専でキャリアについて話す機会を頂きました。
学生向けに 10 分くらい話しましたが、現役学生に向けて熱のこもった話をしても響かないよなー。とか、いろいろと考えた時期。

そして、11 月頃にも同じく東京高専で、高専 OB / OG 達とセッション形式で講義しました。
こっちはこのポストに書いたとおり。
現役学生でも、学年によって伝える内容を変えないと、全く刺さらないよなーみたいなことを思いました。

同じく 11 月、ザッパラスでの初?のエンジニア向け勉強会の会場提供をしつつ、僕も LT させていただきました。
ゆとり世代エンジニア交流会という名前の通り、メイン参加者はゆとり世代のエンジニア。若干僕は外れてるんですが、だいたいそれぐらいならオッケーというゆるさがとても良い感じでした。

開催レポートも書いていただいているので、是非そちらもご覧ください。

発表スライドはこちらです。
新規サービスを立ち上げる際に、ちょうど AWS Inspector がリリースされて、とても良さそうだったので実験しつつ取り入れてみた話をしました。

そして、締めくくりは Minami Aoyama Night #1 です。
この中では、資料準備に一番時間をかけましたw

別途ポストも書いたので、そっちもご覧頂ければと思いますが、発表スライドはこちら。

前職でも ElasticBeanstalk を既に使っていたプロダクトに関わる機会があって、その良さは分かっていたつもりだったのですが、リソースが無い中で新規サービスを立ち上げるときには、大いに力を発揮するということを改めて感じました。
その良さが伝わればと思って発表しました。

振り返ってみると、それなりに外で発表する機会はあったかなと思ったので今年はこれで良しとしましょう。

高専の授業を通して「素直さ」の大切さに気付いた

16歳の学生にキャリアについて話す難しさ

ありがたいことに、母校(東京高専)の授業の一コマで、キャリアについてのパネルディスカッションをさせて頂く機会があった。

cwzbqbmukaewdok

高専OB集合写真

趣旨としては、高専のOBの人たちが卒業後にどんなキャリアを歩んでいるかというのを聞いてもらって、自分の進路の参考にしてもらう、というもの。

とはいっても、メインターゲットは2〜3年生(なんと16歳前後!)だったため「キャリア」なんてものにピンとくるはずがないだろうな、とは思ってた。

ふと、自分の高専2年生のころを思い出してみると、部活に精を出しつつも、彼女と遊ぶことぐらいしか考えてなかったな…。好きな授業は、パソコンが触れる実習と体育だったかな…というレベル。
卒業後のことなんか微塵も考えてなかった。

そういうこともあり、できるだけ気軽な気持ちで聞いて欲しいなという願いを込めて、Twitterのハッシュタグ #東京高専で授業やってる を設定して、授業中に好きなようにTweetしてもらうようにした。

学生がTogetterですぐにまとめてくれたので、どんな内容だったのか知りたい人はそっちを見てもらうとして。

教育そのものに通ずる「素直さ」の大切さ

パネルディスカッションしながら、Tweetをリアルタイムに追っかけていたんですが、僕らの話をどう受け止めるかってのは人によって温度差はやっぱりあるよなーっていうのを感じた。

授業が終わった後に教授と少し話したのですが、内容は概ね以下の感じ。

根底には、彼らにハッピーになって欲しい、という思いがある。
そして、人生の経験値上「これするよりは、こうしたほうがハッピーになると思う」ってのは少なくとも彼らより知っているはずなので、それを伝える努力はしているが、どうにも響かない。

この話をしてるときに、自分の子どもにも、会社の同僚や後輩にも通ずるところがあるなーと感じた。

もちろん伝える側の努力なくしては、伝わるものも伝わらないってのは大前提として、「響く」人と「響かない」人の差はなんだろうなーとグルグルと考えた。

で、今自分の中での結論は、「素直さ」なのかなと。「おすすめされたことを、四の五の言わずにとりあえずやってみる能力」、と言い換えることができるかもしれない。

なぜこの能力が大事かっていうと、「とりあえずやってみる」ことが、学習の阻害要因をある程度スキップさせてくれる。
結局、経験からの学習が一番効率が良い。

「おすすめされたこと」というのは、先達が通った道であるが故に「これをすれば、おそらくこういった学習ができるであろう」という思いのもとに成り立っているはずなので、イージーモードでプレイしたら?という提案がなされているに等しい。

イージーモードで一回プレイしてみるってのは、本当に大事だと思っていて、この差が後々大きな差になってくるんだろうなと感じる。

しかし、どうやったら素直さを会得できるのかは、なかなか難しいよなーと思い、いろいろヒントを探していた。

そんな中で @otiai10 氏のこのエントリはいろいろな意味でヒントになる。

「イージーモードで一回プレイしてみる」っていうのは @otiai10 氏が言うところの「進言された行動を一挙手一投足違わず遂行できる」という意味合いで同じで、

そしてそれは「言われた文言を一字一句違わず復唱する」という能力が訓練によって出来るようになるのと同じように、「進言された行動を一挙手一投足違わず遂行できる」という能力も、訓練によって出来るようになると思われる。

こう書かれている。

是非全文を読んでほしいが、素直さは才能でも性格でもなく、「能力」であると断言している。

どのようにしたら「素直さ」が習得できるのか

僕の中に未だに解はないが、ひとつは子どもの頃の親の教育が、能力の習得に大きな影響を与えそうだなとは思った。

よく観察し、寄り添い、適切なタイミングで提案し、褒めること。
良いフィードバックループに入るまでは親のサポートが必要だと思う。

では、大人になってから身につけることができるのか?というとできなくはない、ただしとても難しそうという印象。

自らに「素直さが足りない」ということを認知し受容するためにも、素直さ(ここでは謙虚な気持ちのほうが大事かも)が必要な気がするから。

大人になってからの習得が難しいからこそ、「素直である」ことは大きな武器になりえると思う。

Thanks, See you again!

個人的な次のミッション

12月末から1月頭にかけては順調にスタートを切れたので、今後もこの流れを継続するために目標を立てておく。

  • PHP7 CasualTalk の資料作成
    • WordPress のベンチマーク
  • Laravel brancher 検討
    • 実装方法検討
  • ウェブサービス作る
    • 企画は頭のなかにあるので極力シンプルに実装始める

CentOS 7 上の nginx で SSL 化 & HTTP/2 対応

冬休み中、SSL 化とそれにあわせて HTTP/2 対応だけやり残しました。
なので、空いた時間を使ってサクッと終わらせました。

Let’s Encrypt を使えば無料で SSL 証明書を取得できます。良い時代です。
以下のページを参考にさせていただき、手順通りにやれば問題無いです。

Let’s Encryptを使って簡単0円でサーバ証明書を取得

で、http/2 対応している nginx のバージョンは 1.9.5 以降のようなのですが、ソースからビルドするのはやりたくないなーということで yum からいけないかと調べた所ドンピシャな記事がヒット。

yumでnginx 1.9.5にアップデートしてHTTP/2に対応

この通りにやったら、今日時点では、Version 1.9.9 になりました。

で、nginx の設定ファイルの listen 443 ssl; となっている部分を listen 443 http2; に変更し、ssl_ciphers の先頭に AESGCM:HIGH を追加し、nginx を restart させれば完了。

serimacohttp2

無事に HTTP/2 対応できました。
正味、1 時間ぐらいで全部できるので暇な時に是非どうぞ!

冬休み中にやりたいこと

すでに仕事納めも終わっているので、あとはなんとかして空き時間を確保して以下をやりたい。

  • プライベートなサーバを、CentOS 7 にアップグレード
    • おそらく OS インストールから各種ミドルウェアセットアップも行うことになるので、Ansible 使ってみる
  • WordPress を PHP 7 で動作させる
  • nginx に移行
  • Let’s Encrypt で SSL/TLS 対応

(以下、余力があれば)

  • HTTP/2 対応
  • ローカルから簡単にデプロイできる仕組みを作る
  • Public repo な自分の project の CI 整備