oinume journal

Scratchpad of what I learned

エストニアに行く前準備

今日からエストニアに6日間出張に行くのでその前準備に何をやったかをメモしておく。

エストニア出張の目的

  • ちゃんとしたマイナンバーがある
  • 選挙の投票や、学校の授業の成績管理などが電子化されている
  • e-Residencyなにそれかっこいい
  • スタートアップ界隈が熱い

というのを見てみたくて行く感じ。特にスタートアップシーンはTransferWiseやPipedriveという会社は日本にも支社があるぐらい成功しているらしい。エストニアは人口が130万人と少ないので、国内である程度うまくいったらヨーロッパやアメリカに事業を展開するというモデルらしい。

エストニアの概要

  • 人口は130万人(参考:福岡の人口が160万)
  • 主要産業は製造業、卸売・小売、不動産、運輸、建設等。製造業は、主に機械、木材、製紙、家具、食品、金属、化学等が中心。エネルギー資源関連では、オイルシェールを産出、主として発電に利用している。IT等のイノベーション産業の誘致・育成を積極的に進めている。
  • 首都のタリンの旧市街は世界遺産になっている
  • 英語が通じる
  • 観光地はクレジットカード(デビットカード)の決済がメイン。中国みたいにQRコード決済はない

航空券

  • アエロフロートだと1人10万円以下で行ける。ただし、行き14時間、帰り18時間ぐらいかかる
  • FINAIRだと10万ちょいかかるけど、行きも帰りも12時間

あたりが狙い目。

宿

エストニアは宿泊費用が安い。ホテルも1泊5千円ぐらいあればそこそこのに泊まれそう。自分たちは今回はAirBnBにしたけど、4人それぞれの寝室がついていて1泊2万円ぐらい。タリン周辺にはAirBnBの部屋はたくさんあるけど、1週間前を切ると急に埋まりだすので余裕をもって2週間前までには予約しておくと良さそう。

今回泊まるのは↓の部屋。

www.airbnb.jp

申し込んだ現地のツアー

www.likealocalguide.com

これが良さそうだったので申し込んでみた。日本語でのガイドも可能なのとPipedriveのオフィスも訪問できる。値段も30ユーロで良心的。ちなみにこのLike a Local Guide というサイトには他の観光ツアーもいろいろあるのでオススメ。

SIMとWiFi

現地で買えば良さそう。3GBで30日間使えるSIMが3.99ユーロらしい。安い!またWiFiも整備されているっぽい。

最後に

というわけで行ってきます!

未来型国家エストニアの挑戦  電子政府がひらく世界 (NextPublishing)

未来型国家エストニアの挑戦  電子政府がひらく世界 (NextPublishing)

ハワイでのSIMはKDDI x h2o が良かった

9/1から1週間ほどハワイに行ったのだけど、現地でのネットワーク環境どうしようかと悩んでいて色々調べた結果KDDI mobile x h2o のSIMが良かったのでレポート。良かった点としては

  • 安い
  • 4G LTE使える
  • 電話もかけられる
  • auのiPhoneだとSIMロック解除してなくてもそのまま使える
  • SIMは日本のAmazonで事前に買える
  • 現地でトラブルがあっても日本語でのサポートがある

というところ。以下で詳しく説明してみる。

料金

30日未満の利用で3GBで$30。1週間の滞在で自分は1GBも使わなかった。もっと大容量が必要な場合でも、$40で6GBなのでかなりオトクな感じ。 詳しくはプランの詳細を参照。

ちなみにハワイで1週間イモトのWiFi借りると1万円を超える。今回はSIM2枚で7000円ぐらいだったのでSIMの方が安上がりで便利。

auのiPhoneだとそのまま使える

ウチの奥さんはauのSIMロックされたiPhone5sを使っていたのだけど、WiFiがつながるところでSIMを挿してAPNプロファイルをインストールすればすぐ使えるようになった。

このh2oというキャリアはAT&Tのネットワークを使っているので、以下の周波数が使える。(参考)

  • Band 2 1900 MHz
  • Band 4 1700 MHz
  • Band 5 800 MHz
  • Band 12/17/14/29 700 MHz

au iPhone5s(モデルA1453)はLTE Band1、2、3、4、5、8、13、17、18、19、20、25、26に対応しているので、Band 17が使えていたっぽい。(参考)

SIMはAmazonで購入可能

旅行に行く前にAmazonでSIMを買っておいて、現地に着く日にアクティベートされるようにWebサイトから設定すれば使える。10/1からAmazonでデータ通信料金込みのSIMも発売されるようだ。

現地での日本語サポート

自分が持っていったNexus4では最初データ通信だけができずサポートに問い合わせたんだけど、日本語だったのですぐに解決できた。

現地での使用感

写真を撮り忘れてしまったけど、iPhone5sだとハワイでは2Mbpsぐらい出ていたらしい。ネットで調べ物をするとか、GoogleMap使うぐらいの用途であれば特にストレスはなかったけど、写真をアップロードするのは少し遅いかなーと感じた。まぁ日本のモバイルネットワークの帯域幅を期待してはいけないのでこんなものなのかなと。

あと、Air B&Bで借りた部屋でちょっとしたトラブルがあり、ホストに緊急連絡するのに電話が必要だったので、このSIMで電話もかけられてありがたかった。

使い終わったら

何もしないと次の月にまた利用料がクレカから引き落とされてしまうので、旅行が終わったら忘れずに customercare@kddimobilesim.com にオートリチャージの解除のメールを送っておこう。

gcloudコマンドを使わずにGoogle Cloud Storageにファイルをアップロードする

概要

gcloudコマンドを使わずにPythonとgoogle-cloudを使ってGoogle Cloud Storage(GCS)に頑張ってファイルをアップロードしてみる。google-cloudはPython向けのGoogle Cloud Platformの何かを操作するためのクライアントライブラリ。GCPの以下の機能の操作がサポートされている。

  • GA
    • Google Cloud Datastore
    • Google Cloud Storage
    • Google Cloud Translation
    • Stackdriver Logging
  • Beta
    • Google BigQuery
    • Google Cloud Natural Language
    • Google Cloud Speech
    • Google Cloud Video Intelligence
    • Google Cloud Vision
  • Alpha
    • Google Cloud Bigtable
    • Google Cloud Bigtable
    • Google Cloud DNS
    • Google Cloud Pub/Sub
    • Google Cloud Resource Manager
    • Google Cloud Runtime Configuration
    • Google Cloud Spanner
    • Stackdriver Error Reporting
    • Stackdriver Monitoring

gcloudコマンドはPython 2.7を必要とするんだけど、Python 2.7をどうしてもインストールできない環境で役立つ話だと思う。自分はHerokuでPython 3.6.x を使っていて、gcloudコマンドのためにPython 2.7をインストールできなくて困っていたのだけど、このgoogle-cloudライブラリを使うようにしてみた。

セットアップ

前提として

  • Python 3.4 以上
  • pip

がインストールされていること。

$ pip install google-cloud

でgoogle-cloudをインストールする。

認証

google-cloudのライブラリを使うにあたり、credentialが必要になる。おそらく一番ラクなのは

  • GCPのConsoleでService Accountを作って
  • そのcredential情報をJSONファイルとして取得し
  • GOOGLE_APPLICATION_CREDENTIALS 環境変数で指定する

ことだと思う。詳しい話は google-authのドキュメントに書いてある。その他の認証のやり方についても詳しく書いてある。

Pythonのスクリプトを実行する前に以下のコマンドで credential 情報のJSONファイルを指定すれば、Pythonのスクリプトでは特に何もしなくてOKだ。

$ export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json

GCSにファイルをアップロードする

それでは本題。google-cloudのstorageモジュールを使ってGCSにファイルをアップロードしてみる。

  • get_bucketでバケットを取得して
  • blobオブジェクトを作ってアップロードする

感じ。

from google.cloud import storage
import sys


def upload(bucket_name, f):
    client = storage.Client()
    bucket = client.get_bucket(bucket_name)
    new_blob = bucket.blob(f)
    new_blob.upload_from_filename(f)


if __name__ == '__main__':
    if len(sys.argv) < 3:
        print('gcs.py <bucket> <file>', file=sys.stderr)
        sys.exit(1)
    upload(sys.argv[1], sys.argv[2])

まとめ

gcloudコマンドは早くPython3対応するかGoで書き直されて欲しい。

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで

2017年の進捗

2017年の抱負 - oinume journal で書いた、今年の抱負の進捗。

機械学習を学ぶ

みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 | Udemy というものをやったけど、本当にまだまだわからないことが多い。あと、自分は機械学習よりもデータ分析の方が現時点ではオモシロイと感じている。numpyやpandasは少しわかってきたので、もう少し深掘りしていきたいところ。

Twitterの時間を制限する

うまくいった。唯一Twitterだけずっとやめられなかったけど、頻度は1日1回以下、時間は15分以下に抑えられてる。ひどい時は1日1時間ぐらい見ていたのでだいぶ改善したと思う。

辞められたのは、やっぱりスマホからアプリを削除したのが一番大きい。手癖のように暇さえあればTwitterのアプリを起動してしまっていたので、これが物理的にできなくなった。今はTwitter見たい時はブラウザで頑張って見てる。使いづらいけど、はまりたくないのでちょっと使いにくいぐらいが逆にちょうどいい。

去年より本を読む

Twitterをやめたことで、通勤時間に本を読む時間が増えた。とりあえずこの半年で読んだ本。

ルポ MOOC革命――無料オンライン授業の衝撃

ルポ MOOC革命――無料オンライン授業の衝撃

ルポ MOOC革命――無料オンライン授業の衝撃

2013年の本だけど、オンラインでの学習というものがここまで多様化していることに驚いた。感想は読書感想「ルポ MOOCS革命」 - oinume journal に書いてある。

新・所得倍増論

デービッド・アトキンソン 新・所得倍増論―潜在能力を活かせない「日本病」の正体と処方箋

デービッド・アトキンソン 新・所得倍増論―潜在能力を活かせない「日本病」の正体と処方箋

戦後の日本の高度経済成長の理由は単純に人口増加だったという説を説く本。グラフを見るとたしかにその通りだなぁと思う。この本を見て、安倍内閣のやっていることはまともなんだなとあらためて思った。

初めてのPHP

初めてのPHP

初めてのPHP

  • 作者: David Sklar,桑村潤,廣川類,木下哲也
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2017/03/18
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

仕事でPHPを書かなくてはいけなくなったので仕方なく。特に新しい学びはなかった。中級者向けのPHPの本があったら教えて欲しい。

Google AdSense 成功の法則 57

Google AdSense 成功の法則 57

Google AdSense 成功の法則 57

自分で運営しているサイトのAdSenseの収益を上げたくて購入したけど、特に目新しいことは書いていなかった。

日本人の9割が知らない遺伝の真実 (SB新書)

日本人の9割が知らない遺伝の真実 (SB新書)

日本人の9割が知らない遺伝の真実 (SB新書)

橘玲の「言ってはいけない 残酷すぎる真実」よりかは信憑性がありそうだったので購入。IQや体重の遺伝の影響など、興味深いトピックが多かった。たまに「ほとんどすべてが遺伝で決まる」みたいなことを言う人がいるけど、決してそうではないと分かったので少し安心した。

徹底調査 子供の貧困が日本を滅ぼす 社会的損失40兆円の衝撃

徹底調査 子供の貧困が日本を滅ぼす 社会的損失40兆円の衝撃 (文春新書)

徹底調査 子供の貧困が日本を滅ぼす 社会的損失40兆円の衝撃 (文春新書)

日本の家庭の6分の1が相対的貧困にある日本の実体について、インタビューをまじえながら書かれている。貧困が連鎖することがどのぐらい日本の財政に影響をあたえるかなど面白かった。日本は教育については他の国と比べて国からの支援が弱いのでもっと頑張ってほしいな。最近流行りのGRIT(やり抜く力)は第3者が介入することで補完できる、など教育についても興味深いことがたくさん書いてあった。

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

まだ読み途中。Dockerの本はたくさん出ているけど、Dockerの仕組みがわかりやすく書いてある気がする。

英語

ショッキングなことに、昨年のTOEICからスコアが下がっていた。800点まではあと少しなので頑張りたいけど、非ネイティブの人とはだいたい意思疎通できるようになったので、自分的には今のレベルで満足している。

アルゴリズム勉強する

あんまりできてない。

VPSをやめる

これはやめられていない。とりあえずvultrの一番安い$2.5のプランにしてお金の節約はしてみた。

MySQLのデータをJupyter Notebook上でグラフにする

最近少しずつJupyter Notebookやpandas, matplotlibに慣れてきて、PythonによるData Scienceが面白くなってきたと感じてます。今日はMySQLのデータをSQLで持ってきて、Jupyter Notebook上でグラフにしてみる話。

セットアップ

Python3はインストールされていることを前提。jupyterなどの必要なソフトウェアを入れる環境を作って、pip でインストールする。

python3 -m venv jupyter
source jupyter/bin/activate
pip install jupyter pandas matplotlib pymysql

インストールが成功したら、こんな感じでJupyter Notebookを立ち上げる。

./jupyter/bin/jupyter notebook

立ち上がったらブラウザから適当にnotebookを作っておく。

MySQLに接続

今回はPure Pythonなpymysqlを使ってMySQLに接続する。接続先の情報は以下の例では環境変数から取っているけど、ここはpymysql.connectに直接渡すように変更してOK。connという変数に入っているのが、MySQLへのコネクションになる。

import os
import pymysql
import pandas as pd
import matplotlib.pyplot as plt

host = os.getenv('MYSQL_HOST')
port = os.getenv('MYSQL_PORT')
user = os.getenv('MYSQL_USER')
password = os.getenv('MYSQL_PASSWORD')
database = os.getenv('MYSQL_DATABASE')

conn = pymysql.connect(
    host=host,
    port=int(port),
    user=user,
    passwd=password,
    db=database,
    charset='utf8mb4')

pandas.read_sql_queryを使ってSQLを実行

df = pd.read_sql_query(
    "SELECT DATE(created_at) AS date, COUNT(*) AS count FROM user GROUP BY date HAVING date >= '2017-04-01' ",
    conn)

次にpandas.read_sql_queryを使って、MySQLからSQLで取得した結果をpandas.DataFrameにする。この関数には

  • 第1引数にSQL
  • 第2引数にMySQLのコネクション

を渡せばよい。これだけでMySQLから取得した結果がそのままDataFrameになるなんて簡単すぎる…

ちなみに今回は以下のuserテーブルから、日付ごとに登録したユーザー数を取得するSQLを発行している。

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(255) CHARACTER SET utf8mb4 NOT NULL,
  `followed_teacher_at` datetime DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
);

read_sql_queryを実行した結果の df を表示してみるとこんな感じになっている。

f:id:oinume:20170601191237p:plain

DataFrameをグラフにする

最後に本題のグラフ化。DataFrameのindexに date カラムの値をセットして、DataFrameのplot.bar()を呼び出せば棒グラフが表示される。

%matplotlib inline はJupyter上にグラフを表示するためのおまじないっぽい。df.tail(10)しているのは直近の10件に絞って見やすくするため。

%matplotlib inline

df.index = df['date']
p = df.tail(10).plot.bar()

f:id:oinume:20170601211553p:plain

ちなみに plot.pie() とかやると円グラフが表示できる。描画できるグラフの種類についてはpandasのvisualizationというページに全部載っている。

まとめ

  • pandas.read_sql_query を使うと、SQLでSELECTした結果をそのままDataFrameにできる
  • DataFrameからグラフを表示するのは簡単
  • いろんな種類のグラフが描画できるよ

おまけ

gistに今回のnotebookを上げておいたのでよかったらどうぞ。