2010-06-28

Simple Twitter Bot on Google App Engine




久々の更新です。mixiやtwitterなどで既につぶやきましたが、先週の週末に衝動的にtwitter botを作ってしまいました。このBotは次のように振る舞います。

1. Twitter上のつぶやきの中から、任意の単語が含まれるtweetを集める。

2. そのtweetをRe-tweetする。

以上です。
実際には例外処理などの細かな処理も含まれていますが、大まかな振る舞いは上述の通りです。この一連の処理を、cronを用いて1時間毎に1回実行します。

下記に、実際のコードの一部(main.py)を引用します。
Twitter Bot作成の参考になれたら幸いです。

#!/usr/bin/env python
#! -*- coding: utf-8 -*-

from appengine_twitter import AppEngineTwitter
from basehandler import BaseHandler, h
import twitter
 
# twitter.Api.__init__ method for override.
def twitter_api_init_gae(self,
                       username=None,
                       password=None,
                       input_encoding=None,
                       request_headers=None):
   import urllib2
   from twitter import Api
   self._cache = None

   self._urllib = urllib2
   self._cache_timeout = Api.DEFAULT_CACHE_TIMEOUT
   self._InitializeRequestHeaders(request_headers)
   self._InitializeUserAgent()
   self._InitializeDefaultParameters()
   self._input_encoding = input_encoding
   self.SetCredentials(username, password)

def run(name, pswd, search_term):
   gae_twitter = AppEngineTwitter(name, pswd)
   results = gae_twitter.search(search_term.encode('utf8'), {'rpp': 20})
   api = twitter.Api(username=bot_username, password=bot_password)

   # Get most corrently tweeted tweet
   status = api.GetUserTimeline()
   
   for s in status:
      if s.text.startswith("RT"):
         recent_tweet = s.text
         break
      else:
         print "The following tweet would be posted by hand, so skipped it."
         print "Tweet: " + s.text.encode('utf8')
         print
      
   print "Recent Tweet: "+recent_tweet.encode('utf8')
   print

   # Search Most Recent Tweet
   results.reverse()
   flag_enable = 0
   for i,result in enumerate(results):
      rt = "RT @" + result['from_user']  + " " + result['text']
      rt_len = len(rt)
      if flag_enable and result['from_user'] != bot_username and rt_len < max_len :
         """
         Retweet and exit
         """
         print "Re-tweet: "+rt.encode('utf8')
         print "Re-tweet Result: " + str(gae_twitter.update(rt.encode('utf8')))
         exit()
               
      if recent_tweet == rt:
         flag_enable = 1

   if flag_enable:
      print "There are no tweet found that I should tweet."
      exit()
      
   print "There are no tweets recently tweeted, so tweet the oldest tweet
   for i,result in enumerate(results):
      rt = "RT @" + result['from_user']  + " " + result['text']
      rt_len = len(rt)
      if result['from_user'] != bot_username and rt_len < max_len:
         """                                                                    
         Retweet and exit                                                       
         """
         print "Re-tweet: "+rt.encode('utf8')
         print "Re-tweet Result: " + str(gae_twitter.update(rt.encode('utf8')))
         exit()

# overriding API __init__                                                       
twitter.Api.__init__ = twitter_api_init_gae

# User Setting and Run Twitter Bot                                              
bot_username = 'CafeMiyamaBot'
bot_password = '???'
max_len = 140
search_term = u'Cafe Miyama'
run(bot_username, bot_password, search_term)

なお、上述のコードには、cronの設定などは含まれていません。
詳細な振る舞いおよび設定を知りたい方は、下記のコマンドでcloneしてください。

     $ git clone git://github.com/yasulab/Simple-Twitter-Bot.git

もしくは、下記のGithubレポジトリに直接アクセスしてください。

     http://github.com/yasulab/Simple-Twitter-Bot

bot_usernameとbot_passwordの内容を別のtwitterアカウントに書き換えて、お手持ちのGoogle App EngineのアカウントにdeployするとTwitter Botが動くと思います。加えて、search_termを任意の単語に書き換えれば、オリジナルTwitter Botの出来上がりです。


参考にさせて頂いたサイトおよびコード:
1. Python Twitter, Google Code
http://code.google.com/p/python-twitter/

2. Google App Engineで手軽にTwitterアプリを作成!
http://0-oo.net/sbox/python-box/appengine-twitter

2010-05-24

NHK白熱教室 - 第4回「この土地は誰のもの?」ノート




そろそろ、ノート取らないと全然内容が理解できなくなってきそうなので、メモを取り始めました。が、メモを取ってもやっぱし分からないところは分からない。実際、納得できない主張や理論については全て疑問形の文としてメモしていたのですが、いざ自分の取ったメモを読み返してみると、疑問文が多すぎるw。真面目に理解しようとしたら、ちゃんとReading Listも読まないとマズいですね。本業の方のReading Listも溜まっているので、そこまで読む気には中々なれませんが。。。

参考:
第4回「この土地は誰のもの?」, NHK白熱教室



Lecture 7: 土地略奪に正義はあるか
===============================
ジョン・ロック
ーリバタリアンの味方
ーー例え民主的に選ばれた政府であっても、犯せない権利がある
ーーーe.g. 生命/自由/財産に対する自然権
ー財産権
ーー政治以前のものである=自然権である
ーーー政府が存在する前から存在するもの
ー法律が出来る前の状態/法律が出来る前の状態を考えるー>自然状態(=自由な状態)
ーー人間は自由で平等ー>階層は存在しない。王や農民などはダメ
ーーただし、自由≠好き勝手
ーー自然状態でも法律が存在する。ー>自然法
ー自然法によって制約される行動とは?
ーー自然権を手放したり、取り上げたりすること
ーーーe.g. 生命/財産の権利
ーー自分を奴隷にすることもできない??? -> 完全なリバタリアンではない。

2つの答え:
ー1. 生命/財産は自分のものではない。神の創造物???
ーー神なんているの?信じていない人はどうするの?
ーー自由≠好き勝手でないと説いた。矛盾してない???
ーーー不可譲。e.g. 航空券は譲渡できない。
ーーー誰かのものではない。
ーーーcf. アメリカ独立宣言
ーーー不可譲の権利:自然状態から持っている権利。
ーー財産の場合は?
ーーー政府が無くても私有財産が存在するのか?
ーーーその人の中では存在している???
ーー私有財産についてはリバタリアンの考え方と同じだが、他は違う。

エイズの薬の特許の話:
ー医薬に関しては、特許を尊重しなければ、色々な人が助かる?
ー作り出すための研究開発のコスト/モチベーションは?
ーこのとき、私有財産権はどうなる???

ネイティブアメリカンの話:
ーアメリカの入植者がネイティブアメリカンから略奪した行為の正当化である?
ーー証拠はない。また、統治時は戦争状態だから、状況が違う。双方の同意が無い。
ーーロックの理論によれば、ネイティブアメリカンは既に土地を占有していた。ただし、主張はしていなかった。

政府のあり方:
ー私的所有権は絶対化される。政府もその権利を犯せない。
ーしかし権利が絶対化されることは政府によって定義される。

ー2.  ???
ーー???
ーー???



Lecture 8: 社会に入る「同意」
============================
同意なしで私有財産権を持つことは可能か?
ー例外:他者のために、充分なリソースがある場合に限り、ロックの理論は適用される。
ー同意とは?
ーーe.g. くじ引きに同意/殺害に対する同意
ーー正当な政府の基礎は同意にある?

同位に基づいて設立された政府には、何ができるのか?
ー復習:自然状態とは?
ーーなぜ政府など作ったのか?
ーー自然状態の不都合な点
ーーーe.g. 誰もが自然法を実行できる/誰もが執行者である
ーーーーe.g. 泥棒を勝手に処罰できる
ーー人は、自分が判事になると我を忘れる?
ーーー行き過ぎた侵略/行き過ぎた処罰->いずれは、不可譲の権利を享受出来なくなる。
ーー人は、戦いを仕掛けてくる人を処罰出来るー>力と暴力の世界
ーー人は、故にそういった世界から離れたくなる。ー>同意
ーー他の皆に同意をする。
ーーー他の皆:協定や社会契約に参加したい全ての人々
ーーーマジョリティが決めたことに、皆従う。
ーーーvs. 自然権との兼ね合い。
ーーーー疑問:多数はどれほどの力を持てるのか?

少数派に課税することはなぜダメと思われるのか?
ー自然権を侵害することになるから

社会に入る理由=自然権を守りたいから?
ー所有権は””コミュニティの法”によって制定される。
ー所有権は政府が定義するもの?
ー多数派の同意で決まる?
ー財産権も含まれる?
ー財産を恣意的に取り上げることは違法。
ーしかし、何を持って財産とみなすか/財産を取り上げたとみなすか?
ーーそれは、政府が定義していいの?
ーー定義して良いのならば、同意の果たすやることは大きいー>大きな政府が必要?

社会に参加することに同意したのか?
ー祖先が社会に参加することに同意した?
ー同意はサインではない?暗黙的に同意が有効である?
ー捕まらなければ税を払わない?

徴兵制や生命に対する権利:
ー不可譲の権利は持っているが、放棄する権利は持っていない
ー同意する際に権利を放棄することが出来ないから、政府は制限できない。
ーーもし放棄がゆるされないのならば、なぜ徴兵制のような生命を脅かすことを強制出きるのか?
ー人の権利を恣意的に犯すのはダメだが、法律を通して無作為に選ぶのは良いのか?
ーー恣意的でなければ、例えば、人の生命の権利を犯すことは許されるのか?

ロックは想像上の世界について理論を展開させていたわけではない。
ー当時の現実世界の現状を見て、理論を展開させたかもしれない。
ーー???

次回:
ー同意は、どのような働きをもたらすのか?
ー同意の限界とは?

まとめ:
ー多数派が権利を侵害することは許されない?
ー政府は法律という形で課税?

2010-05-23

Google Sitesのページを移行する方法



最近、Google Appsが提供しているサービスの1つ"Google Sites"をよく使わせて頂いています。結構便利で、ページの複製やテンプレートの作成が出来るだけで無く、Google DocsやGoogle Calendarの内容をウェブサイトに表示させることも出来ます。特に、Google Docsで1つのまとまった情報をファイルとして作成し、Google Sitesで各ファイルを整理することで、肥大化していく情報量を短時間でスッキリさせることができるので、思考を整理するツールとして中々の優れものだと個人的には感じています。


今日は、このGoogle Sitesで複数のドメインを所持しているとき、ドメイン間でウェブサイトを移行する(より正確には、複製する)方法について記します。例えば、"aaa.net"のwikiページを, "bbb.net"に移行させる場合は、次の方法で移行することができます。

1. Google Appsのページから"aaa.net"にログインし、Google Sitesのページに飛ぶ。

2. 移行させたいページ(今回はwikiページ)に飛ぶ。

3. 右上の"More actions"をクリックし、"Share this sites" をクリック。

4. "bbb.net"のユーザを、"as owners"として招待する。
※もし他ドメインのユーザを招待できないように設定している場合は、その設定を解除しておく必要があります。

5. "Sign out"をクリックし、ログアウトする。

6. ログイン画面が表示されたら、左下部にある"Sign in with a different account"をクリック。

7. "Enter your email address:"に"USERNAME@bbb.net"を入力し、ログインする。
※URLに"aaa.net"が含まれていて、ログインユーザに"bbb.net"が含まれていたら成功。

8. 再度wikiページに飛び、"More actions" -> "Manage site"をクリック

9. 左中央にある"General"をクリックし、ページ下部の"Copy this site"をクリック

10. 任意のサイト名とURLの設置場所を指定し、"Copy site"をクリックして終了。
※成功していたら、"bbb.net"のGoogle Sitesに, "aaa.net"のwikiサイトが複製されているはずです。"aaa.net"のwikiページが不要である場合は、"Delete Page"でそのページを削除することができます。


以上です。



参考にさせて頂いた資料:
Moving a Google Site out of an Educational Domain



オマケ:
どうやら2009年にGoogle Sites APIsというサービスが発表され、2010年現在Google Labsで鋭意開発中のようです。上記の一連の動作を数クリックで出来るアプリとかあると便利かもですね。