俺のインターネットが欠けた日

もやもやする気持ちをまとめるために日記を書きます。ブログなんてそんなもんです。

いきなりの訃報から早半月。悲哀の底から幾分か距離を置くことができていて、空き時間を見つけては故人の思い出をまとめている。死んだ人に向ける気持ちとして相応しくないのは百も承知だけど、今の気持ちは「ふざけんな阿呆」という感じです。次の飲み会楽しみにしてたんだぞ。 30余年も生きてるので友人・知人が亡くなることもあったけど今回の訃報はちょっと堪えた。そのひとが居ない人生ってのがあんまり想像できない場合、こういう気持ちが湧き上がるのではないだろうか。

俺がTwitterを始めたのは2007年10月。当時のTwitterは全体が知り合いみたいなもので、直接つながっていなくても「あー、あの人か」って感じで話が通じた。はてなグループTwitter部で仲間を探して適当に繋がるようなゆるいコミュニティがあり、コミュニティ間もゆるくつながっていた。故人とはどこでお互いフォローしあったのかさっぱりわかんないけど、はてなグループか共通の知り合い経由だったのだと思う。

直接会ったのは2014年で、ちゃっぴーが地図好きという共通点からFacebookでつないでくれたことが切っ掛け。勝手に会社に招き、来客用会議室で会社について説明して「この会社は止めておいた方が良い」という話をした。カーペットの柄に興奮していたのを覚えてるんだけどどんな柄だったかさっぱり覚えてない。今度前職のオフィスに行く機会があったら見ておこう。

一度直接会ってからはちょこちょこ会ってた。あいつが就職活動で東京に来て、ギークハウス護国寺のリビングに泊まってたこともあった。就職活動も終わり社会人になった後、同じ業界でつながっていたので会社のイベントで会ったり、G空間サミット行ったり、地図バーで遊んだりした。 二人で酒を飲むと赤裸々に色々話してくれるのだけど、そのまま突っ走るとヤバそうなものも多かった。冗談交じりで「止めておけ」と伝えたりもしたなあ。

ダイヤルQ2でインターネットに触れてから20年、自分のPCでネットを徘徊するようになって15年、Twitterを始めてから10年あまり。Twitter経由で出会った人は仲の良い友人か、それ以上の何かになっているんだなと。あの世とも繋がるSNSがあれば良いのだけど、それはそれで「人とは」みたいな話になるんだろうな。こういう感じの毒にも薬にもならない馬鹿話をする相手がいなくなったのは悲しい。

あー、あびこと雑な話するの好きだったんだよなー。アルバムちゃんと作って、あいつが嫌がる感じに盛り上がってやろう。

PythonとTwitter APIを使ってフォロー・フォロワーのアイコンを収集する

特定アカウントのフォロー・フォロワーのアイコンを一括で集めたくなったのでなんとかしました。

使うもの

環境はAnacondaを使ってます。標準環境では tweepy 入ってないので pip install tweepy でインストール。 あとTwitter API Keyが必要です。これは色んな方が記事にしているのでそちらを参考にしてください。

【2018年】TwitterのAPIに登録し、アクセスキー・トークンを取得する具体的な方法|さぎのみや家の分析録

ではやっていきます。

API Keyを使ったauth認証

Twitter API Key で認証をかけていきます。必要なモジュールを読み込んで、その後API Keyを渡します。

import tweepy

CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

xxxのところは取得したAPI Keyを入力。

フォロー・フォロワーのリストを作る

tweepyではフォローは friends*1 , フォロワーは followers です。フォローしている人の一覧(id)が欲しい場合は

friends_id = []
friends = tweepy.Cursor(api.friends_ids, screen_name='<対象アカウント>').pages

for f in friends():
    friends_id.extend(f)

のように書くとリストにid一覧が格納されます。特定のアカウントのフォロー一覧をとる場合は<対象アカウント>のところにアカウント名(例:screen_name='Takaki_')を入れてください。

フォロワーの場合は以下のような書き方になります。

followers_id = []
followers = tweepy.Cursor(api.followers_ids, screen_name='<対象アカウント>').pages

for i in followers():
    followers_id.extend(i)

これ extend使わずに、もう少し綺麗に書く方法がある気がします。

画像を保存

作ったリストをもとにアイコン画像を取ってきます。まず画像を保存するための関数を作ります。

import urllib.request
import urllib.error

def download_image(url, dst_path):
     try:
         data = urllib.request.urlopen(url).read()
         with open(dst_path, mode="wb") as f:
             f.write(data)
     except urllib.error.URLError as e:
         print(e)

nkmkさんの記事をそのまま参考にしました。いつもお世話になってます。

PythonでWeb上の複数の画像を一括ダウンロード・保存 | note.nkmk.me

この関数にアイコンのURLを引き渡して画像を取ります。tweepyのget_userにidを引き渡すとユーザ情報が取れるので

# idを渡すとユーザ情報が取れる
usr = api.get_user(<ユーザid>)

それにnameやstatus噛ませて色々情報を引っ張ってくることができます。

f:id:kazutaka83:20180911233248p:plain

で、profile_image_url_httpsメソッドを噛ますとアイコンのURLが取れるので、これをidでループさせて画像をダウンロード。

for i in friends_ids:
     img = api.get_user(i)
     url = img.profile_image_url_https
     dst_path = './' + str(i) + '.png'
     download_image(url, dst_path)

このまま叩くとAPI制限に引っかかるので、1,000件以上のアイコンを取りたい場合は適宜sleepを噛ませてください。

やるぞー。

*1:この呼び方ちょっと好き

iPhoneをGPSロガーとして使用する

GISやってる人間はたいてい動態管理に手を出します(俺調べ)。

GPSロガーを使った位置管理が昔からある手法、現在ではGoogleのロケーション履歴を使う方法もあります。普通の方はロケーション履歴で十分ですが、自力で緯度経度取得したいという奇特な人は iPhone + Python + pyicloud 使うと良いでしょう。

GIS屋はたいてい奇特な側です。

pyicloudとは

iPhoneでは端末を無くす/盗まれるといった時のためにiPhoneを探すという機能があり、端末の大まかな緯度経度をクラウドサービス上に保存しています。pyicloud は iCloud の情報を取得するライブラリで、これを使ってクラウド上の緯度経度を取得します。

pyicloudはiCloudを使ったサービスを呼び出すことができるので、例えばiPhoneから音を鳴らすとか、カレンダーの情報にアクセスするとかも可能です。何が出来るかはgithubの公式ページ書いてるので詳しいことは以下をご確認ください。

github.com

公式ではPython2系のお作法で書いてるのでコピペで動かすとPython3系の環境ではエラーが出ます。コピペ実行の際にはprintに括弧のつけ忘れに注意してください。

事前準備

Anacondaの環境が整っている場合はpip経由でpyicloudをインストールするだけでたぶん大丈夫。後はiCloudのサービスに登録しているかを確認してください。****@icloud.comのアカウントと紐づくパスワードが必要です。

pip install pyicloud

素のPython環境から動かす場合はモジュールの依存関係で色々エラーが出るので個々につぶしていってください。*1

REPLで使ってみる。

どういう情報が取れるかを対話環境(REPL)で見ていきます。個人的な好みで以降iPythonを使って作業を進めていきます*2。パスワード秘匿のためにgetpassを使っていますが、個々人の環境でやる場合は無くて問題ありません。

まずは必要なモジュールをインポートします。ついでにgetpassでiCloudの情報を入力。

from pyicloud import PyiCloudService
from getpass import getpass

# hoge@icloud.comを入力
iCloudAccount = getpass('Enter your icloud Account: ')
# パスワードを入力
iCloudPassword = getpass('Enter your icloud Password: ')

f:id:kazutaka83:20180825225637p:plain

入力したアカウント情報をPyiCloudServiceに渡します。

api = PyiCloudService(iCloudAccount, iCloudPassword)

これだけでOK。このapiを使ってiCloud経由で情報を取得したり、iPhoneを制御したりできます。

初めて使用する場合はiCloudの二段階認証を通す必要があるので以下のスクリプトを実行してください。

if api.requires_2fa:
    import click
    print("Two-step authentication required. Your trusted devices are:")
    
    devices = api.trusted_devices
    for i, device in enumerate(devices):
        print("  %s: %s" % (i, device.get('deviceName',
                 "SMS to %s" % device.get('phoneNumber'))))

    device = click.prompt('Which device would you like to use?', default=0)
    device = devices[device]
    if not api.send_verification_code(device):
        print("Failed to send verification code")
        sys.exit(1)

    code = click.prompt('Please enter validation code')
    if not api.validate_verification_code(device, code):
        print("Failed to verify verification code")
        sys.exit(1)

実行するとデバイス番号の入力を求められます。iCloudに複数台の端末を登録していない人は0、複数台iPhoneを持ってる人は使いたい端末番号を入力します*3

数字の入力後、SMSで認証コード(6桁)が送られてくるので入力します。

f:id:kazutaka83:20180825231636p:plain

緯度経度が欲しい場合、iphone.locationを呼び出します。返り値はdictなのでlongitude, latitudeを指定すると緯度経度を個々に取得できます。

#緯度経度に関するiCloud上の全情報を取得
api.iphone.location()

api.iphone.locationを見ると測位方法なんかを取得しているのがわかります。

# 緯度・経度を取得
api.iphone.location()['latitude']
api.iphone.location()['longtitude']

f:id:kazutaka83:20180825230951p:plain

これを定期的に回せば動態管理ができるようになりますね。iCloudに保存されている測位情報はそこまで精度が良くないので、ガチでサブメートル測位したい場合には向いてませんが、ある程度の場所を把握するのには使えます。

注意事項とおまけ

セキュリティのためだと思いますが認証はすぐに切れます。体感的には5分以内に切れているので、api.iphone.locationが値を返さない場合はもう一度 api = PyiCloudService() を実行して再認証してください。

あと、api.iphone.play_sound() を呼び出すとマナーモードの有無に関わらずiPhoneがなります。部屋でiPhoneなくしたときに便利です。

*1:「future, clickモジュールが無い」的なエラーが出た気が

*2:スクリーンショットがいい感じに映えるので

*3:複数台持ってないのでここは良くわからない

福岡そば旅行(不老庵・蕎麦文治郎)

福岡と言えばうどん(とラーメン)ですが、蕎麦も中々良いのです。というわけで最近訪問して好きだった蕎麦屋を二軒上げておきます。

続きを読む

2分で出来るふるさと納税の可視化(超簡易版)

昨日上げた記事ではPythonを使ってデータの可視化を行いました。実はあのような手順を踏まなくても可視化は簡単にできたりします。使うのは ExcelArcGIS Online。Pythonのような小難しいものは使いません。

続きを読む

九州電力の電気使用実績データ(2011年11月~2018年8月/日毎)をひとまとめのデータに加工する

Pythonを使い電力消費量と気温の相関を取ろうと思います。事前準備として九州電力の電気使用実績データをpandas DataFrameにサクッと加工していきます。

九州電力の電気使用実績データは以下のサイトに掲載されています。CSVデータは時間毎。日毎のデータを取る場合は『過去の電力使用実績データ』ページのHTMLから整形していくのが良いでしょう*1

公開ページ

九州電力 でんき予報(電力のご使用状況)

個別月ページ(2014年1月)

九州電力 過去の電力使用実績データ

これは以前書いた記事の応用です。

quzee.hatenablog.com

*1:全部まとめて落とすことができるURLあったら教えてください

続きを読む

ふるさと納税の寄附金額を地図上で可視化する

先日、世田谷区がふるさと納税で税収41億円減というニュースがありました。保坂区長は愚策中の愚策とおっしゃっててかなりご立腹の様子です。

www.zeiri4.com

じゃあこのふるさと納税で集まったお金、いったいどこの自治体に回ってるんでしょうか。ふるさと納税関連のデータは総務省が取りまとめていて、以下の『ふるさと納税トピックス』にデータが落ちてます。

総務省|ふるさと納税ポータルサイト|トピックス|平成30年度ふるさと納税に関する現況調査について

データはExcelなのでソートしやすいですが、全国どのあたりに分布しているかを調べたい場合は地図で可視化したほうが良いです。なのでGISの力を使ってちゃちゃっと可視化してしまいましょう。

白石さんが先に可視化をやってらっしゃったので完全に二番煎じです。

続きを読む

スポンサード リンク