「onBeforeunloadHandler」を仕込むとChromeではPage Unresponsiveのエラーが発生する

Google

(ちょっと詰まったのでメモ)

 

JavaScriptの関数にはページのリロードやブラウザの戻るをクリックしたときに、その遷移を防止するためにブラウザのモーダルで可否の確認を出現させる

「onBeforeunloadHandler」

というのがあるのですが、どうもChromeではこの関数を利用すると下のような

「The following page has become unresponsive. You can fot it to become responsive or kill it.」

というエラーが突如現れてきます。

 

f:id:momota10:20170604234239p:plain

確認のモーダル

 

f:id:momota10:20170604234243p:plain

Reload後に出現するエラー

 

ちなみにこれはChromeのバージョンによっては出現しないようで、

58.0.3029.110 (64-bit)

だと出現するのですが、

55.0.2883.87 (64-bit)

だと出ないことが確認されました。

 

Chromeが悪意ある人によるモーダルを表示させまくるといった行為を防止する目的でこのようにしているようです。今後「onBeforeunloadHandler」関数はあまり推奨されるものではないのかもしれません。

 

この現象は下記の執筆現在、下のリンク先にて確認することができます。

blog.yuhiisk.com

 

また、JCBのカード申し込みページにおいても同様の事象が確認できました。

オンライン入会申込

 

 

GitLab CI で「ERROR: Build failed: Get http://unix.sock/v1.18/version: dial unix /var/run/docker.sock: socket: too many open files」と出た時の対処

いつもの様にpushしてCIがpassするのを待っていたら下記の様なエラーに遭遇。

gitlab-ci-multi-runner 1.3.2 (*****)
Using Docker executor with image python:3.5.2-alpine ...

ERROR: Build failed: Get http://unix.sock/v1.18/version: dial unix /var/run/docker.sock: socket: too many open files

このエラーにはgitlab本家にもissueとして上がっており、どうやらgitlab-ci-runnerを再起動すると直るみたいです。
EC2の上に立てていたので、コンソール画面からrebootしてjobをretryしたら問題なく動いてpassしました。

gitlab.com

mailgunのEvent APIによるメールのトラッキングをrubyで実装する

Mailgun at Partner Palooza

 

mailgunでは送信したメールをトラッキングしてくれる機能が標準でついており、APIを使う事によってステータスを取得する事ができます。

 

そこで送信したemailの状態を確認するEvent APIを利用してデータを取得する処理をrubyで実装してみました。

 

コード

 

sample ruby code of mailgun tracking

 

注意点

1. 開封(open)をトラッキングするには別途設定が必要

ドキュメントには下記のように記載されています。

 

The email recipient opened the email and enabled image viewing. Open tracking must be enabled in the Mailgun control panel, and the CNAME record must be pointing to mailgun.org.

CNAMEの設定(向き先は mailgun.org)とtracking settingで「Open Tracking」をONにする必要があるのでこちらを忘れずにやっておきましょう。

 

2. idのユニーク性は1日という期間でしか保証されていない

こちらもドキュメントには

Event id. It is guaranteed to be unique within a day. It can be used to distinguish events that have already been retrieved when requests with overlapping time ranges are made.

と記載されています。気をつけましょう。

 

3. 一回のリクエストで取得できる件数の上限は300

300より大きい数にすると怒られます

 

 

参照

ラッキングの仕様については下記に記載してあります。

Events — Mailgun API documentation

 

簡易的な内容ですがさっと読みたい場合はこちらを。

How to start tracking email events — Mailgun API documentation

【AWS】ELBのログをS3に保存し、Lambdaを利用してElasticsearchにデータ転送。そしてkibanaで可視化。

Amazon

タイトルの通りですが、AWSのサービスを駆使して全てのアクセスログをElasticsearchに突っ込み、kibanaで可視化するというデータ基盤を作る機会があったのでその方法を残しておこうと思います。ちなみにほぼリアルタイムで反映されていくのでlambda archtectureでいうところのspeed layer(スピード層)に相当します。

前提

環境

  • Elasticsearch 5.2.0
  • kibana 5.x

使ったAWSのサービス

  • EC2
  • S3
  • Lambda
  • ELB

概念図

テキストだけだとイメージしにくいので図にしました。

f:id:momota10:20170417170445p:plain

EC2にElasticsearch(=ES)とkibanaを入れて、最終的にはkibanaにアクセスができてデータ閲覧が可能になるという感じです。

ざっくり手順

  • ELBからS3へのログ設定
  • ES, kibana用のEC2作成及びインストール
  • index templateの作成
  • Lambdaの作成

ELBからS3へのログ設定

ログの設定はとても簡単で「EC2 management Console」の左バーにある「Load Balancers」を選択し、対象のELBの「Attributes」にある「Access logs」で設定できます。

f:id:momota10:20170417172415p:plain

  • ELBからS3へのログ転送は5分おきか60分おきかの2択で選べます。
  • あらかじめS3で作成したバケットを指定してprefixが欲しければ任意で設定できます。
  • ログのpathは 「bucket/prefix(任意)/AWSLogs/************/elasticloadbalancing/your-region/2016/04/01/file_name」と結構長いです。なのでprefixは要らないと思いますw

ES, kibana用のEC2作成及びインストール

EC2のセキュリティーグループにおいては 9200(es), 5601(kibana) は許可しておく様にします。 また、t2.micro だとメモリ不足でesが起動しないため、別途ヒープサイズを変更する必要があります。

stackoverflow.com

ESのインストール

$ sudo yum install java-1.8.0-openjdk
$ sudo alternatives --config java
$ java -version

openjdk version “1.8.0_121" //1.8がインストールされていることを確認

$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.1.rpm
$ sudo rpm -i elasticsearch-5.2.1.rpm

/etc/elasticsearch/elasticsearch.yml に追記する

network.host 0.0.0.0

起動

$ sudo service elasticsearch start


$ curl localhost:9200 //下の様な結果が出ればおk
{
  "name" : "UlhX_go",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : “hogehoge",
  "version" : {
    "number" : "5.2.1",
    "build_hash" : “hoge-hash",
    "build_date" : "timestamp",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
}

kibanaのインストール

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

/etc/yum.repos.d/elasticsearch.repo に追記

[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
$ sudo yum install kibana
$ sudo chkconfig --add kibana

/etc/kibana/kibana.yml に追記

server.host: 0.0.0.0
elasticsearch.url: "http://localhost:9200"
$ sudo service kibana start

index templateの作成

ESはデータを突っ込むとよしなにデータ型を決定してくれますが、基本的にstring型です。なので、あらかじめ index もしくは index template を用意しておくと実際にkibanaでESのクエリを組みながらデータ分析をやろうとする時に便利になります。

elbのログフォーマットは設定できるものではなく、従ってデータがesに入るときのフィールド数が同じなのでそこまでマッピングに違いがある訳ではありませんが設定したindex templateを貼っておきます。

gist3c2c089d578d9b61b491a818d3918e99

Lambdaの作成

LambdaではS3にデータが入ったというイベントをトリガーにしてそのデータをEC2に送るという処理を担ってもらいます。これを作る為には

  • LambdaがS3とEC2にアクセスできる様にIAMでロールを作成してアタッチする
  • 実査に処理を行うソースコードを用意する

の2つが必要になります。

ロールについては AmazonS3ReadOnlyAccessAmazonEC2FullAccess の2つがあれば大丈夫ですが、もしEC2がVPC内にある時は AWSLambdaVPCAccessExecutionRole が別途必要です。

ソースコードは下記のスクリプトを参考にendpointを対象のEC2に設定します。

github.com

最後に

  • 設定を終えてenabledにするとesにデータが入っていることをサーバー内で確認出来、kibanaでも見れるかと思います。
  • 以下のリンクはこのデータ基盤を作成する時に役にたった記事です。こちらも合わせて見てみて下さい。特にLambdaの設定は画像付きで詳しく解説してあります。

Ref

ELB のログを Lambda の Node.js で取り込み、Elasticsearch Service の Kibana で可視化する - Qiita

ELBのアクセスログをAWS LambdaでElasticsearchに取り込む | Developers.IO

Install Kibana with RPM | Kibana User Guide [5.0] | Elastic

Installing Elasticsearch | Beats Platform Reference [5.3] | Elastic

台湾でApple Payがついにスタート。日本のApple Payとの違いについて

applepay

台湾でもApple Payがスタートしました。

 

www.apple.com

 

セキュアな環境を作る為にイシュアー(=クレジットカード発行会社)や銀行と連携をしているので、まだ国によっては交渉中で使えないという背景がありそうですが、今回ローンチした台湾でのApple Payは7つの銀行と提携がされています。

 

日本ではイシュアー単位で提携がされていますが、台湾では銀行単位で「指定の銀行が発行したクレジットカード」のみがApple Pay利用可能となっています。

 

f:id:momota10:20170329194632p:plain

公式サイト( http://www.apple.com/tw/apple-pay/ )より

 

対応している国際ブランドはVISA/MASTERの2つです。日本でVISAが対応していないのは、恐らく決済ネットワークにiDとQUIQPayを利用している事に対するVASAの反発によるものですが、台湾ではPayWave及びpaypassといった国際ブランドの決済ネットワークを経由しているので日本以外の国と変わらないですね。

 

規格も日本だけFelicaですが、台湾は日本以外の国同様Type A/Bの非接触決済です。

 

下の画像は台中のとある店での決済端末の画像ですが、対応しているショップにおいてはこの様な端末を用いてApple Payによる決済が出来る様になるだろうと思います。

 

 

台湾でApple Payがどのくらい浸透されるのか興味があるので今後も観察していこうと思います。

 

mailgunのBatch sendingを使って複数のユーザーに同一メールを一括で送信する機能をGoで実装する

mailgunのBatch sendingという機能では同一のメールを複数ユーザーに一括で送信することが出来ます。

この記事ではGolangによる一括送信の機能について紹介します。

 

 具体的なコードは以下の通りです。 

 

gist1984d7f79032c8162b08c2ecaf6e2d6f

 

配列にあるメールアドレス群を"AddRecipient"でセットし、まとめて送信しています。

 

正確に言うと、まるっと投げられたメアド達はmailgunにエンキューされて勝手に捌いてくれるという仕様ですが、こちらのアプリケーション側でメアド毎に毎回リクエストを送る必要が無いので処理速度が速くなるというメリットがあります(特に何百万、何千万ものメールアドレスを抱えているのであれば速度が顕著に速くなります)。

 

注意点

1. Throttling(スロットリング)に注意する

(特にまだそこまでIPレピュテーションが高く無い状態やIPウォームアップを行っている状態においては)大量のメールアドレスが一気に送られるとISPにスロットリングをされたりソフトバウンスが帰ってくる事があるので間隔を持って送るなどの対応をしたほうが良いです。

 

2. 存在しなくなったメールアドレスなどは削除してクリーンな状態を保つ

存在しなくなったメールアドレスに送ってもハードバウンスとなりIPレピュテーションが下がる一方なので定期的に削除したほうが良いです。

 

 

参考

公式DocsにBatch sendingについて記載されています。 

User Manual — Mailgun API documentation

 

 mailgunのhelpページにも同様のソリューションが提示されています

help.mailgun.com