Hatena::ブログ(Diary)

風柳メモ このページをアンテナに追加 RSSフィード Twitter

2014-04-20

GAE-Cron:Python 2.7 runtime版を公開(version 0.0.3)

GAE-Cron(Google App Engine上で動作する簡易 web cron サービス)の Python 2.7 runtime 版を公開しました。

version 0.02aをPython 2.7 runtime対応版に修正したものであり、機能的には変わりません。

GAE-Cron ソースコード

GAE-Cronの説明書

GAE-Cron最新版ダウンロード

furyutei/GAE-Cron ? GitHub

Google App Engine Python 2.7 runtime 開発環境が必要

新版の GAE-Cron を使用(デプロイ)するためには、Google App Engine Python 2.7 runtime 環境が必要になります。

既に Python 2.5 runtime 環境を構築済みの方も新規構築が必要です。


Google App Engine の Python 2.5 runtime 環境は、2014年現在非推奨となっています。

f:id:furyu-tei:20140420125126p:image

Python 2.5 runtimeを使用する新規アプリケーションの作成は出来なくなっているようです。既存アプリケーションは今のところ動作していますが、将来的には動作しなくなる可能性があります。

バージョン2.7への移行を:Google App Engine、Python 2.5ランタイムを非推奨に - @IT

Google App Engine Blog: Python 2.5, thanks for the good times


無料枠(Free Quota)で使うための設定

Google App Engine のアプリケーション管理画面より、(Administration)Application Settings → Performance にて、

  • Max Idle Instances をデフォルトの"Automatic"から"1"に下げる(左(Min)方向にスライド)
  • Min Pending Latency をデフォルトの"Automatic"から"15s"に上げる(右(Max)方向にスライド)

し、[Save Settings]をクリックして保存。

f:id:furyu-tei:20140420125124p:image


Google App Engineの無料枠(Free Quota)のリソース制限はかなりきつくなっており、油断するとすぐに"Over Quota"などと言われて一時的に使用できなくなるなどしますが、上記設定を行うことにより、かなり緩和できます。

緩和出来るだけであり、無料枠での快適な使用を保証するものではありません。念のため。


旧版からの移行について

基本的には、

  • ファイルは全て上書き。
  • *.yaml.sample となっているファイルは、*.yaml にリネーム。
    設定変更等を行っている場合、予め旧設定をメモしておき、必要な部分を手動で書き換え。
  • app.yaml の "application:" の箇所をご自分で取得されたアプリケーション名(Application Identifier:appid)に変更してアップロード(デプロイ)。
  • デプロイ後に、管理者アカウントでログインし、[全タイマ再設定]

という流れになります。

version 0.02* からの移行であれば、gaecron.yamlおよびcron.yamlはそのまま使用できますが、app.yaml は使用できません。

必ず app.yaml.sample をコピーしたものをご自分の設定に合わせて書き換えるようにしてください。

0.02*からの移行に限り、[全タイマ再設定]を実施しなくてもそのまま動作するはずです。ただし、動作がおかしいと思われる場合は[全タイマ再設定]を実施してみてください。

2014-04-11

【近傍ツイート検索】少しだけ延命?!検索方法の変更とユーザータイムラインの新デザイン対応(ver.0.02)

終了宣言をしかけたものの、悪あがきをしてみた。

インストールはこちらから

【近傍ツイート検索(twDisplayVicinity)】特定ツイート前後のタイムラインを表示するユーザースクリプト

furyutei/twDisplayVicinity ? GitHub
  • https://twitter.com/search?q=... を使った検索のヒット率が落ちてしまったため、https://twitter.com/<screen_name>?max_id=... を使った検索機能を追加、こちらをデフォルトに変更
    [Shift]キーを押しながらリンクをクリックすると従来の検索方法になる
  • ユーザータイムラインの新デザインに対応
  • その他、ソースコードの整理・バグフィックス

記事

【近傍ツイート検索】特定ツイート前後のタイムラインを表示するユーザースクリプト試作 - 風柳メモ


独り言など

偶然見つけた方法を試してみただけ

ユーザータイムラインの新デザインは…

慣れの問題もあるのかも知れないが…うーん。

  • ヘッダ画像が大きいので、余分なスクロールが必要。
  • ツイートひとつひとつも大きく表示されるようになったため、ざっと流してみるには不向き。
  • リツイート数やお気に入り数等に関連して、ツイートの文字の大きさが変更されている。これは、これらに関係なくフラットに読みたいときに困る。
  • 人によっては、@ツイートが表示されていない場合がある。
  • いままで新規ツイートがあると「〜件の新しいツイート」みたいなリンクが出て、クリックすることで読み込まれるようになっていたが、これが自動で読み込まれるようになった模様。
    ただし、上に継ぎ足すのは変わらないため、スクロールの位置が勝手に変更されたりするため、痛し痒し。

2014-04-08

【近傍ツイート検索】終了のお知らせ、か?短い寿命だった(哀)(ver.0.01c)

とりあえず新版はこちら

【近傍ツイート検索(twDisplayVicinity)】特定ツイート前後のタイムラインを表示するユーザースクリプト

furyutei/twDisplayVicinity ? GitHub
  • 近傍ツイートの検索範囲を時間単位で指定可能に
    HIGH_TIME_RESOLUTION=true 時に、HOUR_BEFORE/HOUR_AFTER で近傍ツイートの前後幅を時間単位で指定できるように機能追加*1
  • ツイートがID指定の検索で見つからない場合にスクロールを止める条件変更(投稿時刻で比較し、検索ツイートより古くなったらそこで停止)

記事

【近傍ツイート検索】特定ツイート前後のタイムラインを表示するユーザースクリプト試作 - 風柳メモ


なぜ終了のお知らせ?

  • タイムラインが新画面へと移行を始めている模様で、ページ構造が大幅に変わっているため、対応するのが面倒くさい困難。
  • リアルタイム検索のインデックスが(一部のユーザーで)期間が限られてしまったみたい(?)
    例えば「from:furyutei」で「すべて」検索した場合、3月22日分までしかひっかからなくなってしまった。
    「トップ」検索なら古いのも出てくるが、あたり前だがヒット率が非常に悪い。

今後について

とりあえず、上記理由により心折られてしまったので(苦笑)、自分での開発は中断し、しばらく様子を見ることにしようかなと。

しかし、自分の作ったTwitter関連のユーザースクリプトは、おしなべて寿命が短いな…。


なお、ご自分で対応されるという奇特な方は、

furyutei/twDisplayVicinity ? GitHub

をForkするなりして下さい。

*1:「通知」のユーザーアクション(リツイートなど)についてはこれまで通りおおよその日付単単位

2014-04-04

【librtrt】Twitterで公式RT直後の発言を取得するためのPythonモジュールを更新(0.0.2)

【librtrt】Twitterで公式RT直後の発言を取得するためのPythonモジュールを試作 - 風柳メモ

furyutei/librtrt ? GitHub

更新内容

  • Rtrt#get_rtrt()の引数に
    limit_rtrt_wait:公式RTされた時点から次のツイートまでの最大待ち時間(分)
    を追加(デフォルト5)。
    これにより、statuses/user_timelineのmax_idを指定できるようになり、APIコール回数を削減可能に。
  • 同、use_search_api引数追加。
    use_search=True 時に、use_search_api=Falseを併用することで、search/tweets API を使用しない方法でツイート検索を行うことが可能に。
    現状、search/tweets よりも若干ヒット率が高くなる模様。ただし、3200ツイート以内なら、use_timeline=Trueの方が優位なため、あまり使う意味はないかも。

Twitter のツイートID(ステータスID)の増え方について

調べていたら、おもしろいことが分かった。

もっとも、Twitter関連開発者の方には常識かも知れないけれど。


まず、@ や @ 等の、時報をツイートするアカウントを利用して、一定時間内のツイートIDの増分を実際に調査してみたところ、

  • 2010年11月04日22時(UTC・日本時間だと11月5日07時)頃を境に、30,000,000,000以下だったツイートIDが、300,000,000,000,000以上に切り替わっている
  • 以来、毎秒約42億ずつ IDが増加している

らしいことがわかった。


約42億→0xFA000000という意味ありげな数字なのが気になって、ネットで検索してみると…

snowflake

•64bitのlong値でIDを表現 (※先頭1bitは0)

•3つの要素で構成

 •timestamp (41 bit) : 現在のunixtime(ms)から、ある時点のunixtimeを引いた値

 •machine id (10 bit): 生成器に割り当てられたID。datacenter id + worker id。

 •sequence (12 bit): 生成器ごとに採番するsequence番号 17

Twitterのsnowflakeについて

改行は引用者による

ということらしい。

なるほど、ms の位置は 2^22 になるから、1秒だと、(2^22)*1000 = 4194304000 = 0xFA000000 になるわけか。


そんなわけで、ある特定のツイートのIDがわかれば、その一定時間後のツイートIDはどれくらいになっているか、予測しやすくなっているようだ。


謝辞

S治 えすじさん( id:esuji5 / @ )に有用なコメントをいただいたおかげでおもしろいことがわかった。感謝。

【librtrt】ホームやユーザタイムラインからRTを抜き出してRtRTする例

承前

user_timelineで自分のTLを持ってきて"retweeted_status"要素を持っているもので絞り込むと、自分がRTしたつぶやきのRtRTが探せるので、100RT以上のつぶやきのテストや「へー、みんなはこんなこと言ってるんだなー」という暇つぶしに使えます。絞り込んだ後の処理はほとんど同じなので、手間の割には楽しいかと思います。

esuji5さんのコメントより

100RT以上には対応していないけれど、とりあえず librtrt の使用例を兼ねて。


サンプルソース

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

from librtrt import Rtrt
import tweepy


DEBUG = False

USER_NAME = 'furyutei' # 自分の screen_name

LIMIT_RT = 5           # タイムラインから取得するRT件数の制限(最新からLIMIT_RT件目まで)
LIMIT_RTERS = 20       # RT人数制限(最新からLIMIT_RTERS人まで)


def get_rtid_list(tl_iter): #{
  rtid_list = []
  for status in tl_iter:
    rt = getattr(status, 'retweeted_status', None)
    if rt:
      if DEBUG: print rt.id
      rtid_list.append(rt.id)
      if LIMIT_RT and LIMIT_RT <= len(rtid_list): break
  return rtid_list
#} // end of get_rtid_list()


rtrt = Rtrt(use_aauth=True)

print "##### ユーザタイムラインのRTよりRtRT検索"
api = rtrt.api
tl_iter = tweepy.Cursor(api.user_timeline, screen_name=USER_NAME, count=rtrt.MAX_STATUSES_PER_CALL_TIMELINE).items()
rtid_list = get_rtid_list(tl_iter)
rtrt.get_rtrt(retweeted_ids=rtid_list, limit_rters=LIMIT_RTERS, debug=DEBUG)
rtrt.json_write('user_rt_rtrt')


print "##### ホームタイムラインのRTよりRtRT検索"
api = rtrt.oapi # OAuth用API使用時は Rtrt#oapi を使用
tl_iter = tweepy.Cursor(api.home_timeline, count=rtrt.MAX_STATUSES_PER_CALL_TIMELINE).items()
rtid_list = get_rtid_list(tl_iter)
rtrt.get_rtrt(retweeted_ids=rtid_list, limit_rters=LIMIT_RTERS, debug=DEBUG)
rtrt.json_write('home_rt_rtrt')


2014-04-03

【librtrt】Twitterで公式RT直後の発言を取得するためのPythonモジュールを試作

GitHub

【librtrt】Twitterで公式RT直後の発言を取得するためのPythonモジュール

勢いで GitHub に登録してみたはいいものの、使い方がよくわからない…教えて偉い人。


使い方

準備
  1. Python で PyYAML と tweepy を easy_install や pip 等でインストールしておく。
  2. config.yaml.sample を参考に、config.yaml というTwitter認証情報ファイルを作成して自分の認証情報(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)を保存し、__init__.py・AppAuthHandler.py・librtrt.py と同じディレクトリ上に配置。

使用例

■特にオプションを使用しない場合

from librtrt import Rtrt # librtrtのRtrt classをインポート
rtrt = Rtrt() # オブジェクト作成
rtrt_info_list = rtrt.get_rtrt() # 自分のツイートを公式RTした人のRT直後の発言を取得
rtrt.json_write() # JSON 形式でファイルに出力

のようにすると、

[
    {
        "rted_status": {
            "text": "@tari_tipa リツイート通知等から、RTしたユーザの前後のタイムラインを表示する機能を追加してみましたので、よろしければお試しください。\nhttp://t.co/bePuac5fnt\nかなり無理やりなので、精度は悪いですが…。", 
            "created_at": "2014-03-29 05:27:15", 
            "retweet_count": 1, 
            "id": "449779799842488321", 
            "user": {
                "protected": false, 
                "screen_name": "furyutei", 
                "profile_image_url": "http://pbs.twimg.com/profile_images/318199851/kaze2_normal.png", 
                "id": "46094747"
            }
        }, 
        "rtrts": [
            {
                "text": "自分の意見が反映されたよ!わいわい記念。 / 【近傍ツイート検索】リツイート通知などの近傍を表示する機能追加(ver.0.01b) - 風柳メモ http://t.co/loY0pLhuIp", 
                "created_at": "2014-03-29 12:05:06", 
                "retweet_count": 1, 
                "id": "449879923591639040", 
                "user": {
                    "protected": false, 
                    "screen_name": "tari_tipa", 
                    "profile_image_url": "http://pbs.twimg.com/profile_images/448123752262287360/yC10negM_normal.png", 
                    "id": "131547676"
                }
            }
        ]
    }, 
:(中略)
]

のような感じで、「最近RTされた自分のツイート(デフォルト5件まで)」の、「RTした人(デフォルト5人まで)のRT直後のツイート」が取得できる。


■Twitter認証情報の切り替え(オブジェクト作成時)

rtrt = Rtrt(config='another-config.yaml') # 別の認証情報ファイルを読み込み
rtrt = Rtrt(consumer_key='xxx', consumer_secret='xxx', access_token='xxx', access_token_secret='xxx') # 認証情報直接指定
rtrt = Rtrt(use_aauth=True) # Application-only authentication 有効化
# 有効にすると、OAuth 以外でも可能な動作には Application-only authentication を優先して使用

OAuthとApplication-only authenticationとでは、API制限に差がある


■RT直後の発言収集時(Rtrt#get_rtrt())

rtrt_info_list = rtrt.get_rtrt(retweeted_ids=['xxx','yyy',]) # 指定したIDのツイートを公式RTした人のRT直後の発言を取得
# 「最近RTされた自分のツイート」の代わりに、「retweeted_ids で指定したツイート(複数化)」の「RTした人の直後のツイート」を取得
rtrt_info_list = rtrt.get_rtrt(retweet_user_names=['mmm','nnn',]) # RTした人のうちで、指定したユーザ(screen_name)名のみに絞って抽出
rtrt_info_list = rtrt.get_rtrt(use_timeline=False, use_search=True)
# 「RTした人の直後のツイート」取得に、"statuses/user_timeline" の代わりに"search/tweets"を使用

statuses/user_timelineは最大3200件までしか遡れず、かつ、タイムスタンプで絞り込めないため、これを補う目的でsearch/tweetsも使えるようにしてある。ただし、どうも後者の精度は(Web版Twitterの検索と比べても)すこぶる悪いようで、今の所は使用に耐えない。


経緯

【近傍ツイート検索】特定ツイート前後のタイムラインを表示するユーザースクリプト試作 - 風柳メモ

を作っていた時に、かつてあった RtRT - (Find the) Reference to ReTweet - というサービス

RtRTは、自分の発言を公式RTした人が直後にどんな発言をしているかが分かるサービスです

RtRT - このサイトについて - (Find the) Reference to ReTweet -

が、いまは動作していないらしいと目にして残念に思っていたところ、その作者のS治 えすじさん( id:esuji5 / @ )が、

RtRTはAPI廃止でダメになった→すまん、ありゃウソだった - esuji5's diary

という記事を書かれていたので興味をひかれ、これを参考にPythonモジュールを試作してみた。


それと、tweepy にて Application-only authentication を使用するために、

tweepyでApplication-only authenticationしてみた - Shogo’s Blog

の記事内のソースをほぼそのまま使わせていただいた(AppAuthHandler.py)。


独り言

モジュールを作ってみたはいいものの、

  • API制限はやはりきつい。
  • 現状では statuses/user_timeline を使うしかなく、動作が重い上に遡れる件数に限りがある(search/tweets がもう少し使い物になればよいのに…)。
  • リツイートした人は最新の100人までしかわからないので、大量にRTされていた場合はどうしても早い段階でRTした人が埋もれてしまう。

ということで、あまり実用的でない気がする。

「自分のツイートがRTされた場合にすぐに見に行って、結果を保存する」という使い方くらいか?

もっと効率のよいやり方やおもしろい利用方法等あったら教えて欲しい。