JavaエンジニアがPythonを勉強するときに役にたったサイト

概要

業務でPythonを使うことになり、勉強をはじめました。
今まで一切触れたことがなかったので、これからPythonに触れる方に参考になればと思います。

pyenvで環境構築

環境設定には、pyenvをつかいました。
pyenv は複数の Python のバージョンを簡単に切り替えることができるライブラリです。
Python では Python 2.x 系 と Python 3.x 系
.x 系は後方互換がなく、2.x 系のプログラムは動作しない可能性があります。
pyenvの設定は、以下の記事を参考にして行いました。 http://qiita.com/Kodaira_/items/feadfef9add468e3a85b

学習方法

https://www.udemy.com/python-jp/
udemyの「実践 Python データサイエンス」を使って学びました。
クーポンで1200円になっているので今がおすすめです。
コースのコンテンツはいっぱいありますが、「セクション 7: データ解析の基礎 その3」まで勉強すればPythonの基礎は学べるとおもいます。 オライリーの「Pythonによるデータ分析入門」も買いましたが、こちらは初めから読んでいくというよりは、 上記のudemyのサイトでわからないところを調べる、辞書代わりに使いました。

学習してみて

業務ではJavaを使っているのですが、業務外でJavaを書こうとはなりませんが、 
Pythonはさくっとかけて、クローリング、機械学習と使える用途も広いので今後も継続的に勉強していきたいなと思いました。
今後は以下の内容をやっていきたいです。

・Scrapy + Scrapy Cloudで快適Pythonクロール+スクレイピングライフを送る
http://data.gunosy.io/entry/python-scrapy-scraping

【Java】Amazon SNSをつかってPush通知をおくる

やったこと

ユーザー毎のイベントに対して、プッシュ通知を送りたい。
以下みたいな感じです。
・Tinderでマッチングしたユーザーに対してPush通知をおくる
Twitterリツイートされたらリツイートされたユーザーに対してPush通知を送る

Amazon SNSについて

Amazon Simple Notification Service
この資料がわかりやすかったです。
https://speakerdeck.com/kiharu/http-pushtong-zhi
SNS は100万リクエスト/月が無料で利用できます。超過する場合でも、100万リクエスト毎に $1.0 と安価です。

Amason SNS 用語集

Amazon SNS独特の単語を理解するのに1番てこずりました。

Endpoint Arn

端末のトークン(android ならregistration ID)を登録すると、 このEndpoint Arnが作られる。 1台だけに配信する場合には、このEndpoint Arnを指定する。

Applications Arn

Push通知を送る対象のOSを区別するもの
- iOSなら"Apple Production"か"Apple Deveolpment"
- Androidなら"Google Cloud Messaging(GCM)"

Topic

1台だけに配信する場合には、このTopicを指定する。

Subscriptions

任意のTopicにエンドポイントをサブスクライブし、サブスクリプションが確認されると、 エンドポイントはそのトピックに発行されたすべてのメッセージを受信するようになる。
TopicとSubscriptionsは1対0..nの関係
ユーザー1人ずつにPush通知を送るなら、TopicとSubscriptionsは、使う必要がないです。
TopicとSubscriptionsは、複数のユーザーに対してまとめてPush通知を送る際に使うものです。

コード

// deviceTokenとApplicationArnからendpointArnを作成する 
public String createEndPoint(String appArn, String token) {
  AmazonSNSClient sns = new AmazonSNSClient(new ClasspathPropertiesFileCredentialsProvider());                                 
  CreatePlatformEndpointRequest cpeReq = new CreatePlatformEndpointRequest();
  cpeReq.setPlatformApplicationArn(appArn);
  cpeReq.setToken(token);
  CreatePlatformEndpointResult result = sns.createPlatformEndpoint(cpeReq);
  return result.getEndpointArn();
}
public void sendPushNotification(String message, String endpointArn) {
  AmazonSNSClient sns = new AmazonSNSClient(new ClasspathPropertiesFileCredentialsProvider());
  PublishRequest publishRequest = new PublishRequest();
  publishRequest.setTargetArn(endpointArn);
  publishRequest.setMessage(message);
  sns.publish(publishRequest);
}