きゃべログ

プログラミングや電子工作などについての記事がほとんどです

ToAtm:Python用Twitterのアクセストークンマネージャを作りました


credit: Pete Simon

アクセストークンの管理が面倒くさい

今更ながらPythonからTwitter APIを使ってみようと試みました。
複数のアカウントからAPIを叩こうとすると、どのアカウントがどのアクセストークンに対応づくかという管理が面倒でした。そこで今回はアクセストークンを管理するコードを書いてみました。

最初のうちはコンシューマーキーをコード内に直打ちして認証!みたいな力技をやってしまいがちなのですが、それはちょっとリスキーですね。GitHubなんかでソースを公開する場合であったり、あとはセキュリティの観点から1番理想的なのはデータベースに保存して管理することでしょう。

データベースがポピュラーな方法だと思いますが、今回は飽くまでプロトタイプレベルで簡単にコーディングするためにセットアップ不要の外部ファイルによる永続化という方法を取ってみました。本番環境に使えるかはあまり自信がないのでサポートツールだと思ってもらえれば幸いです。

まずいところがあるなーと思った方がいらっしゃればコメントお願いします!

機能

  • 複数アカウントのアクセストークンが簡単に管理できます。
  • アプリのAPIキーも同時に管理でき、簡単に呼び出せます。

注意点

出力されたデータベースファイル(keys.shelve)は外部に漏れないように取り扱ってください。セキュリティの観点からGitHubにPushするときにはkeys.shelveを.gitignoreに指定するなど対処が必要です。

入手

GitHubからクローンした上でご利用頂けます!
toatm.pyを開発したいpythonコードと同じところに入れましょう。そのディレクトリにアクセストークンが格納されるデータベースファイルが生成されます。
cabbage63/toatm: Twitter OAuth Access Token Manager for Python

使い方

Tweepyのインストール

このツールではその後にTweepyを使うことも想定してPythonのTwitter APIにアクセスするためのライブラリであるTweepyを使用しています。まずはTweepyを導入しましょう。

pip install tweepy

Gitからインストールしたい場合はこのような形でマニュアルインストールします。

git clone https://github.com/tweepy/tweepy.git
cd tweepy
python setup.py install

ToAtmを実行

本アプリ、ToAtmを実行します。

$ python toatm.py

使用するアプリのAPIキーを登録します

プロンプトが出るので指示に従って入力していってください。
これでアプリのAPIキーは登録完了です。

Please select mode.
        1 Update API keys
        2 Update Access tokens
        3 Show access tokens
        q Exit
>> 1
CONSUMER KEY: ************
CONSUMER SECRET: *************

アクセストークンを登録する

指示にしたがってブラウザから指定されたURLにアクセスし、そこで得られたVerifierをアプリで入力することでアクセストークンが登録されます。

Please select mode.
        1 Update API keys
        2 Update Access tokens
        3 Show access tokens
        q Exit

>> 2
Access: https://api.twitter.com/oauth/authorize?oauth_token=***************
Verifier: *******
Updated access token for @****** successfully.

Pythonアプリからアクセストークンを呼び出す

@hogeというユーザアカウントを想定して使用例を掲載します。

import shelve
# Open database file
d = shelve.open('keys.shelve')
print d["hoge"]

こちらのコードを実行するとd["hoge"]の内容として次のものが表示されます。

{'access_token': u'****', 'access_token_secret': u'****'}

アプリのコンシューマーキーも呼び出せます。

print d["consumer_key"]
print d["consumer_secret"]

str型で呼び出したい場合は次のように変換しましょう。

str(d["hoge"])

使用例: タイムラインの読み出し

あらかじめ@hogeというユーザのアクセストークンを登録していると想定します。

# -*- coding: utf-8 -*-

import shelve
import tweepy

# アクセストークンを登録したTwitter IDを入力(@hoge)
SCREEN_NAME = "hoge"

# データベースファイルを読み込み
d = shelve.open('keys.shelve')
consumer_key = d['consumer_key']
consumer_secret = d['consumer_secret']
access_token = d[SCREEN_NAME]['access_token']
access_token_secret = d[SCREEN_NAME]['access_token_secret']

# Tweepyをセットアップ
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

# メイン処理:タイムラインの読み出し
public_tweets = api.home_timeline()
for tweet in public_tweets:
    print tweet.text

まとめ

Python用のTwitter APIを利用した開発者向けのアクセストークンマネージャを作成・公開しました。
普段アクセストークンの管理に悩んでいる方はお試しください。

賛否両論のスーパーマリオランは本当にクソゲーなのか?

ついに発表、しかし賛否両論……

2016年12月15日にNintendoより片手で遊ぶマリオ「スーパーマリオラン」が発表されました。記事を書いていている時点ではレーティングは平均3程度。どでかく広告が打たれていたことが期待を大きくさせ、思ったよりも面白くなかったという反応が多いようですね。それだけでなくゲームの課金システムに一般の方には受け入れがたいところがあるようです。

こちらは2016年12月15日までの1週間の任天堂の株価を示しています。(Yahooファイナンスより引用) 見事にアプリのリリースタイミングに売りが発生していることがわかります。 「スーパーマリオラン」の公開が発表され、任天堂の株価が上昇していたことを考えると、投資家にとっては期待を下回ったものだったのかもしれません。

関連ニュース
任天堂が続急伸、「スーパーマリオラン」12月15日配信開始で再び走る | 個別株 - 株探ニュース
任天堂:スマホ向けマリオ配信、株価は1カ月ぶり日中下落率 - Bloomberg

プレイしてみた

取り敢えずインストールして、一通り遊んでみました。私としてはこのゲームの命運は今後の方針次第かなと思っていて現状はなんとも言えないです。というふうに感じている理由をつらつらとかいてみます。

ゲーム概要

大きくわけて2つのプレイモードがあります。

1つ目がワールドツアーというモードです。これは従来のマリオ動揺、ステージをクリアして楽しむというもの。ゴールに到達すればクリアというシンプルなゲームです。

2つ目がキノピオラリーというゲームで、オンライン上の他のプレイヤーのゴーストとポイントを競って遊ぶというモードです。先にゴールしたほうが勝ちというのではなく、コインの枚数や決めたトリックの回数などから総合的に評価されるスコアに基づいて勝利判定がなされます。

その他にはソシャゲに見られるまちづくりのような「王国づくり」というモードもあります。進度に応じて解禁されるショップアイテムを王国に配置していくというもの。

以降詳細について説明していきます。

ゲーム起動画面

こんなかんじ。
スマホにはとても鮮やかに映る。

メニュー画面

こちらはメニュー兼王国のプレビュー画面です。
マリオ独特の世界観が広がっています。

ワールドツアー

画面をタップするとマリオがジャンプするという実にシンプルな仕様なのですが、タップする長さによって飛ぶ高さが変わったり、2回タップすると滞空時間が長くなったりとシンプルさの中に奥深さがあるデザインになっています。また、小さな敵は自動的に飛び越えるようになっており、初心者の人にもとっつきやすい仕様と言えます。上の図は自動的にクリボーを避ける様子です。

通常のマリオ通りゴールすることが目的ですが、色がついた「カラーコイン」を5枚集めるという遊び方もあります。ある色のカラーコインを集めると別の色が異なる配置で配置されるようになっていて、ピンク→青→緑と順に解禁されていき3度楽しめるようになっています。

さて、Twitterなど世間的に議論を呼んでいるのがこのワールドツアーモードです。その理由は初期で用意されている1-1 ~ 6-4のステージのうち、1-1,1-2,1-3の3ステージしか無料で遊べないという点にあります。それ以外の21ステージを遊ぼうとすると1200円の課金が必要になっています。スマホゲームは無料で遊べるというのが一般的な感覚になっているためか、この点が議論になっているようですね。

キノピオラリー

こちらのモードでは世界中のライバルとランを競うことができます。いかにかっこよくランできるかを競うというのがこのモードのコンセプトですが、詳細には得たコインの数と決めたアクロバットの数でスコアリングされます。タップするタイミングによりアクロバットが発生し、スコアが発生します。

最終的に勝者の王国にキノピオがやってきて、そのキノピオの数によって王国が成長していくというシステムになっています。

なおこのモードをプレイするにはチケットが必要です。これを入手する方法はいくつかあります。

  • ワールドツアーにてカラーコインを5枚集める
  • はてなボックスからたまに出て来る
  • ボーナスゲームの館のゴールで一定確率で入手

これらの条件を満たすことでキノピオラリーに参加するチケットを得られます。

王国づくり

先述の2つのランゲームによって得たコインを使って建築物を購入し、配置するというモードです。キノピオラリーにより王国のレベルがアップしますが、それに伴って新たな建築物が解禁されたりします。

ボーナスゲームの館

通常ステージに比べてたくさんコインが出て来るボーナスゲームをプレイすることができます。8時間に1回プレイできるという仕様です。キノピオラリーのプレイに必要なチケットが一定確率でゴールにて入手できるようになっています。

考察

さて、以上をふまえてスーパーマリオランが良ゲーかはたまたクソゲーか、というところを考えたいと思いますが現状ではどちらとも言えないのではないかと思います。

ワールドツアーモードは課金しなければ3ステージしか遊べないという強い制限があります。いわゆるスマホのゲームは通常プレイは無料というものが普通になっている現状としては少しギャップがあるかもしれません。

ですがキノピオラリーというモードがある点でこの問題は埋め合わせ出来ているのではないかと思います。こちらはプレイできる回数に制限はあるものの、その点ではスタミナというシステムを導入している通常のソシャゲと大差ありません。またこのモードはプレイできる内容について課金如何によって大きな差は生じないので、この点でもソシャゲとしては良心的な部類だと思われます。

通常家庭用ゲームは購入して遊ぶものということを考えるとワールドツアーモードのステージ解禁に1200円かかるというのはそれほど不自然ではないでしょう。Nintendoとしてもワールドツアーモードは従来の据え置き型ゲームのソフトと同じような立ち位置で買い切りのゲームとして制作しているのではないかと思います。対してキノピオラリーというモードは完全に無料で遊べるものとして切り分けているのではないでしょうか。

私個人としては課金システムについては有料・無料のゲームがパッケージングされていると考えれば特に不満を抱いてはいません。ただし1点問題だと感じているのが、キノピオラリー参加に必要なチケットの入手が困難なことです。先程これを入手する3つの方法を挙げました。(ほかにもあるかもしれません。)

  • ワールドツアーにてカラーコインを5枚集める
  • はてなボックスからたまに出て来る
  • ボーナスゲームの館のゴールで一定確率で入手

1つ目の入手法は各ステージ、カラーコインの種類の数と同じ3回×2枚しかチケットを手に入れることができません。つまり1200円の課金をしていない場合は「2枚 × 3種類 * 3ステージ = 18枚」に限られます。

また2つ目については出現する確率が高くないため、手に入れようと思ってすぐに手に入れることができません。筆者は20回ほどゲームをしましたがまだ一度も出てきていません……。

3つめについてはボーナスゲームは8時間に1回しかプレイできない上、最終的に2分の1の確率でしか手に入れることがかなわないのでこちらも確実とは言えません。

上記のようにチケットの入手条件が厳しすぎるような気がします。すなわちチケットが手に入るまでは3ステージしかない体験版のような状態がある程度続いてしまうことになるのです。これが改善されればユーザの満足度が向上するのかなと思っています。

ゲーム自体はNintendoらしいシンプルな面白さがあります。したがって無課金ユーザの権利バランス調整次第でスーパーマリオランは良ゲー、クソゲーいずれにも転ぶかなと感じています。

書評:クリエイティブ思考の邪魔リスト

概要

Kazunobu Setoさんの著書です。クリエイティブ思考をするために心がけることを著者本人の経験や偉人の言葉を交えて活き活きと描かれています。クリエイティブ思考を妨げる15の悪習を軸に話を展開していきます。

文字は大きめでページ数も少なく、すらすらと読めました。2016年7月30日に発行された著書で、この記事を執筆している時点ではかなり新しい本です。データの引用元も201X年と新しいものが多く、話題に上がるものごとも最近のものであるように感じました。

クリエイティブ思考の邪魔リスト
朝日新聞出版 (2016-07-20)
売り上げランキング: 13,185

面白い点

Chapter1 クリエイティブ思考って何?

初めて「クリエイティブ思考」という単語を見た時、わかるようでわからないような印象を受けました。ですが、このChapter1で定義されているのでもやっとした感じが解消されます。

この書籍全体にも通じる所ではあるのですが、クリエイティブ思考の話から少し逸れてビジネスにおけるライフハック的なものが語られることがあります。このことに対し私は悪い印象は持っておらず、むしろこの本の面白さを増しているところだと思います。瀬戸さんの体験談を交えて、こうすると日々の過ごし方が良くなるというアイデアが語られているのです。特に好きな話が「名刺代わりのビジュアル」という見出しのお話です。是非読んでみてください。

Chapter2 いま、世界中が注目する理由

ここではどうしてクリエイティブ思考が必要とされるのかを統計データを用いながら説明されています。AIが登場した未来においては特に必要な能力であることを強く主張されています。人間におきかわってAIが仕事をするような未来を生き抜くためには、職業が如何というのではなく、個人のクリエイティビティが問題になるのかもしれないなと思わされる章でした。

この章にも好きな話があって「上司に求めるのは直感」という話です。上司というのはその道を長く歩いてきた人なので、経験も豊富なはずです。ものごとがうまくいくかどうかの判断は優れていると考えていいでしょう。一方で新しいアイデアに対して否定的すぎるようなものは求められるべき直感ではないように感じます。このことって機械学習で例えられるのかなと思います。経験に近いドメインのものごとについては学習データが豊富なので成功するかどうかのビジョンが明確。その一方であるドメインについてのみに閉じてしまうと過学習のような状態で未知なデータには対応し難くなる。こんなことがぼんやり浮かんだのですが、よくわからなければ無視してください。

Chapter3 クリエイティブ思考の邪魔リスト

この書籍のタイトルにもなっているメインチャプターです。15の邪魔リストを順に解説しています。考える方に柔軟性を持たせるためにはどうすればいいか、という話をしているとも読み替えられます。どの分野・時代においても心がけておくとよい話が多かったと思います。

この章で好きな話は「制約を侮ってはいけません」という見出しのお話です。この中に制約というものはクリエイティブ思考にプラスに働いたりマイナスに働いたりすることがあるということが記述されています。適切な制限というものは考える的を絞り思考をシャープにする力があり、過剰に制限することは工夫の余地をなくすことになりクリエイティビティの低下に繋がる、ということなんですね。面白い。

まとめ

クリエイティブ思考がどうすれば身につくのか、ということに興味がある方はもちろんですが、漠然とビジネスライフをより良くしたいという人にもおすすめできる一冊です。さっと読めて面白い本なので是非。

ビジネスモデル・ナビゲーター
翔泳社 (2016-10-11)
売り上げランキング: 653

Atomで複数行一括で行頭に文字列を入力する方法

AtomでTexファイルをいじっていて不要な箇所を一気にコメントアウトするときに、どうするんだっけ、と迷ったのでメモ。 複数行一括してコメントアウトしたいときだけでなく、コメントアウトを外したいときにも使える手順なので、記事としてシェアしようと思います。 ここで紹介しているのはMacのキーボードショートカットなので、WindowsやLinuxの方は適宜読み替えて実行してください。

手順

1. 文字列を挿入したい行を選択する

まずは先頭に文字列を挿入したい行を選択してください。 マウスでドラッグしても良いですし、Shiftキーを押しながら矢印キーで選択してもいいでしょう。

2. マルチカーソルにする

次に「Shift + Command + L」で選択した行にマルチカーソルを生成します。

3. カーソルを行頭に移動する

この段階ではカーソルの位置がまちまちなので行頭に移動します。 「Control + A」で行頭に移動します。

4. 文字列を入力

ここで万を持して文字を入力します。コメントアウトするなら「//」や「#」や「%」を入力することになるでしょう。 入力を終えたらEscキーでマルチカーソルを解除するのを忘れないでください。

まとめ

Atomで複数行一括文字入力の操作方法をまとめてみました。 かなり使う場面が多い操作だと思うので積極的に使っていきましょう。

Affinity Designerが期間限定で20%オフ中。これは買うしか。

期間限定でディスカウント中

Affinity DesignerとSketchのどちらが買いなのか

昨年この記事を書いて購入して以来Affinity Designer推しな私です。AdobeのIllustratorがサブスクリプション制になってからはすっかりイラレとはご無沙汰です。買い切りのAffinity Designerは財布にやさしい。機能も充実しています。

さて、先日10/6にAffinity Designerがバージョン1.5という大型アップデートがリリースされました。その関係だと思いますが、現在App Storeにて20%オフ価格の4800円で販売されています。この期間限定のセールが買いどきなのは間違いないです。いつまでこのセールが続くのかは公式情報が見つかりませんでしたので、購入はお早めに。


Affinity Designer

公式情報

宣伝


Affinity Tips – Affinity製品の使い方ガイド
Affinity Designの操作方法やチュートリアルを紹介するWebサイトを運営中です。 もしこの記事をきっかけにAffinity Designerを使うことになったら是非読んでくださいね! ちょっとずつ記事もPVも増え、今後も随時更新していく予定です。

Blogger向けAmazletのリンクhttps化ツールを作成しました

概要

BloggerのHTTPS化をしたらやたら警告が出る

以前このブログのプロトコルをHTTPS化したのですが、どうもamazlet (jp)で生成した画像でやたらと記事編集中に警告が出るようになりました。これはHTTPSプロトコルで通信するにも関わらずhttpのプロトコルを利用して画像を埋め込んでいるからだそうです。

そこでこの問題を解決すべく、Amazletで生成したリンクを掲載している記事すべてを更新……するのは面倒だったので一括編集出来るツールを作成しました。

作成したツール

cabbage63/amazletOptimizer: Blogger automation tool making link made by Amazlet suitable for HTTPS

PythonからGoogle Blogger APIを叩いて自動的にURLを全記事置換するというスクリプトを書きました。

使い方は少しだけややこしくて、APIキーを取得→ファイルをちょっといじる→実行という手順です。詳しくはリポジトリのトップページにREADMEが書いてあるのでそちらを参考していただければと思います。

機能

こちらを参考にコードを書きました。
当 Blog を SSL 対応させたので手順や修正が必要になった点などをまとめ | WWW WATCH

機能としては全記事の中身を次のような規則に従って置換するだけです。imgタグの中のURLだけ修正すれば警告は出ないのですが、ついでにaタグのURLも更新しています。

http://ecx.images-amazon.com/
↓
https://images-fe.ssl-images-amazon.com/
http://www.amazon.co.jp/
↓
https://www.amazon.co.jp/

予めこの置換方法で問題ありそうな方は気をつけておいてください。

製作後記

WEB APIを叩くのに慣れていなかったのがそもそも問題ですが、BloggerのAPIを叩くサンプルが少なくて苦労しました。BloggerのPythonライブラリのドキュメントがあまりよくわからなかったのも困った要因の1つです。もし需要がありそうならこのあたりのノウハウについて記事を書いてみようかなと思っています。まああんまりBloggerのAPIを叩くことはないかな。

pythonスクリプトをcronで自動実行したいときに気をつけること

cronでpythonスクリプトを自動実行する場合の落とし穴

最近pythonを使って動画を自動生成して定期投稿をするbotを作ってみました。

botを作るのってもっと簡単なイメージだったのですが、小さなハマりポイントがいくつかあって意外と手こずりました。ということで今回はその情報をシェアしていきます。

ローカルのパス指定は絶対パスで指定する

Pythonスクリプト内のローカルパスを指定するときは絶対パスで記述すると安心です。相対パスで記述すると思った動作をしてくれない可能性があります。

#coding:utf-8
f = open('test.txt','w')

例えば上のようなhoge.pyというスクリプトをcrontabでpython ~/any/path/hoge.pyのようにして実行するとします。するとtest.txtはcrontabを実行しているユーザのデフォルトディレクトリに生成されます。これはcrontabは新たに指定ユーザでログインし、コマンドを実行するためです。

では次のようなスクリプトではどうでしょうか。

#coding:utf-8
f = open('./test.txt','w')

やはりこれでもcrontabのログインシェルのデフォルトディレクトリに生成されます。

補足ですが次にホームディレクトリをした場合にはどうなるでしょうか。

#coding:utf-8
f = open('~/test.txt','w')

この場合はチルダがホームディレクトリに展開されずにエラー終了してしまいます。なのでopen()などでパスを与えるときには/home/[ユーザ名]/のように与えるのが無難だと思います。


実践力を身につける Pythonの教科書
クジラ飛行机
マイナビ出版 (2016-10-26)
売り上げランキング: 66,551

pyenvでバージョン管理している場合は気をつける

おそらく多くの方が.bashrcなどで記述しているであろうeval "$(pyenv init -)"がcrontabでは実行されていないため、pyenvにパスが通っていない状態になってしまいます。そのためpythonはOSプリインストールのpythonで実行されてしまうはずです。そのため想定したバージョンではpipなどでモジュールをインストールしているのにインポート出来ないなどの症状に見舞われます。対応策としては2通りあります。

pyenvにパスを通しちゃう

pyenvにパスが通っていないからデフォルトのpythonが呼び出されているわけなので、通してやれば言い訳です。crontab -eのジョブの最初にパスを通してpyenv initします。サンプルは次のとおりです。

#8hoge.pypyenv
* 15 * * * export PYENV_ROOT=$HOME/.pyenv; export PATH=$PYENV_ROOT/bin:$PATH; eval "$(pyenv init -)"; python /any/path/you/want/hoge.py
#15hoge.pypythonhoge.py
#
* 15 * * * export PYENV_ROOT=$HOME/.pyenv; export PATH=$PYENV_ROOT/bin:$PATH; eval "$(pyenv init -)"; cd ~/any/path/you/want/; python /any/path/you/want/hoge.py

直接pyenv内のpythonを呼び出しちゃう

力技ですが~/.pyenv/versions/下に格納されているpythonを呼び出しても実行できます。そのときのcronジョブの指定は次のようになります。

#15python2.7.9hoge.py
* 15 * * * ~/.pyenv/versions/2.7.9/bin/python /any/path/you/want/hoge.py

環境変数PATHは指定しなおす

前の話からcronではパスが通っていないことはお察しのとおりですが、これが理由でpython経由でshellのコマンドを実行する場合に使いたいコマンドが見つからないことがあります。たとえば初期設定のままだと/usr/local/bin/にインストールしたコマンドが実行できなかったりします。なのでジョブの先頭にパスを登録するようにしましょう。次は/usr/local/bin/にパスを通す一例です。

#hoge.py
* 15 * * * export PATH=$PATH:/usr/local/bin/;python /any/path/you/want/hoge.py

詳しくはこの記事を読むことをおすすめします。
cronジョブを作るのにいつものやり方でいいんですか? - Qiita

まとめ

今回はcronでpythonスクリプトを自動実行する際に気をつけることをまとめました。また何か見つけたら追記するかもしれません。


新しいLinuxの教科書
新しいLinuxの教科書
posted with amazlet at 16.10.12
大角 祐介
SBクリエイティブ
売り上げランキング: 4,333

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
青木 峰郎
ソフトバンククリエイティブ
売り上げランキング: 140,503