Android の基本の Activity のライフサイクルの図が開発サイトに乗ってる。
これでも前後の文章で補完すれば分かるんだが、2〜3ヶ月後の自分はまた忘れてる可能性大なので、 ちょこっと弄ってみた。
まぁ、いらないと思うがPDF版 @ google docs もアップ。
Android の基本の Activity のライフサイクルの図が開発サイトに乗ってる。
これでも前後の文章で補完すれば分かるんだが、2〜3ヶ月後の自分はまた忘れてる可能性大なので、 ちょこっと弄ってみた。
まぁ、いらないと思うがPDF版 @ google docs もアップ。
Google のサービスと連携するには Google Data API を使う。Googleが公式にサポートしているので、とても安心して使える。RSS リーダーとしてよく使われている Google Reader 用のAPI も。。。は、まだ公式には無い。
まぁ、色々な人が解析しており、GoogleReaderAPIのページが、詳細にまとまっている。
なので、Google 提供の python ライブラリで、Google Reader API を叩いてみた
ただ、サンプルを書いたあとで、pyrfeed内にGoogleReader 用のライブラリが含まれていたのに気付いたので、そっちを使うのがいいのかも。
MacPorts を使っているので、さくっとインストール。
% sudo port install py27-gdata
そうでないならば、gdata-python-clientから最新版をインストールする。
gdata-python-client には、Reader サービスの固有の API は無いので、ベースのモノを適当に設定する必要がある。
import gdata.service
config = { 'Email': 'foobar@gmail.com', 'Passwd': 'password' }
# Google Reader サービス設定
service = gdata.service.GDataService(account_type='GOOGLE',
service='reader',
server='www.google.com',
source='MyReaderHoge')
# Google アカウント設定とログイン
service.ClientLogin(config['Email'],config['Passwd'])
# 認証トークン(SIDの値)
print service.GetClientLoginToken()
# 書き込み用のトークンの取得
token = service.Get('/reader/api/0/token',converter=lambda x:x)
print "token:", token
'api/0'以下のレスポンスが AtomPub 形式では無く、小細工が必要である。gdata-python-clientには、ちょうど隙間が開いてるようである。。。
'api/0/unread-count'を JSON 形式で取得する
query = gdata.service.Query(feed='/reader/api/0/unread-count',
params={'all':'true', 'output':'json'})
feed = json.loads(service.Get(query.ToUri(), converter=lambda x:x))
unreadcounts = feed['unreadcounts']
# 全体の未読数を一番前に移動しとく
for i, item in enumerate(unreadcounts):
if re.match(r'^user/\d+/state/com.google/reading-list$',item['id']):
unreadcounts.pop(i)
unreadcounts.insert(0,item)
break
# 全体の未読数
print int(unreadcounts[0]['count'] if len(unreadcounts) > 0 else 0)
#=> 1
# 未読があるラベルとその未読数
for item in unreadcounts:
if not re.match(r'^user/\d+/label',item['id']): continue
print "count:%(count)s id: %(id)s" % item
#=> count:1 id: user/16814486509924941024/label/android
query = gdata.service.Query(feed='/reader/api/0/tag/list',
params={'all':'true', 'output':'json'})
feed = json.loads(service.Get(query.ToUri(), converter=lambda x:x))
tags = feed['tags']
for item in tags:
tag = re.sub(r'^user/\d+/',r'',item['id'])
print "tag: %s" % tag
#=> tag: state/com.google/starred
#=> tag: state/com.google/broadcast
#=> tag: label/android
#=> tag: label/misc
#=> tag: label/neta
#=> tag: state/com.blogger/blogger-following
android 関連の記事を 5 件見てみるかいな。。。
query = gdata.service.Query(feed='/reader/atom/user/-/label/android',
params={'n': str(5)})
feed = service.Get(query.ToUri())
for entry in feed.entry:
print "===="
dom = xml.dom.minidom.parseString(entry.ToString())
print dom.toprettyxml(indent=" ")
print "===="
print "href: %s" % entry.GetHtmlLink().href
print "title: %s" % entry.title.text
# print "%s" % entry.summary.text
先の記事は、読んだから既読にする。
# token, feed は、上に記載の書き込み用トークンと直前で取得した記事リスト
for entry in feed.entry:
i = entry.id.text
s = entry.source.extension_attributes['{http://www.google.com/schemas/reader/atom/}stream-id']
ret = service.Post(urllib.urlencode({'i':i,
'a':'user/-/state/com.google/read',
's':s,
'T':token,
}),
'/reader/api/0/edit-tag',
converter=lambda x:x,
extra_headers={'Content-Type': 'application/x-www-form-urlencoded'})
print i,ret
何でも無いが、この部分には半日悩んでしまった。
何気ない POST パラメータを送信する POST 処理なのだが、gdata.service.Post は aplication/atom+xml形式のデータ送信を想定するため、明示的に Content-Typeを指定する必要がある!気づくまで、「400 Bad Request」+「X-Reader-Google-Bad-Token: true」に悩まされてしまった。
sub = r'feed/http://headlines.yahoo.co.jp/rss/rps_dom.xml'
ret = service.Post(urllib.urlencode({'s':sub,
'ac': 'subscribe',
'T':token,
}),
'/reader/api/0/subscription/edit',
converter=lambda x:x,
extra_headers={'Content-Type': 'application/x-www-form-urlencoded'})
print sub,'subscribe',ret
sub = r'feed/http://headlines.yahoo.co.jp/rss/rps_dom.xml'
ret = service.Post(urllib.urlencode({'s':sub,
'ac': 'unsubscribe',
'T':token,
}),
'/reader/api/0/subscription/edit',
converter=lambda x:x,
extra_headers={'Content-Type': 'application/x-www-form-urlencoded'})
print sub,'unsubscribe',ret
普通の PC にインストールした Linux サーバに Squid + Squidguard で使っていたんだが、 別サーバを必ず立ち上げていないと行けないのが面倒なので、、、 乗り遅れ感が否めないが、polipo を常用をする環境を整えてみた。
移行に関しては、GUIは必要ないが launchd との繋ぎの設定ファイルを準備するのが面倒なので MacPorts パッケージを使いつつ、自前に用意したバイナリを使った。
本家サイトで公開されている git レポジトリを元に数点修正したものを使った。
修正した履歴はgithubに公開してある。
最後の機能は、画像用を公開してるドメインが短縮した別ドメインに置き Referer で制限しているサイトに対応するためで、設定値uncensorRefererFileに、forbiddenと同じ形式で書けば、Referer を削除せずにスルーしてくれる。
まぁ、polipo も使えない事はないかなぁ。。。あとは、forbidden/redirector で Location を返す挙動がなんとかなれば、いいのになぁ。。。もうちょっと弄ってみるかなぁ
かなり期間が空いてしまったが、ブログを再開してみようと思う。 2013年3月が直前の投稿だったが、頻繁に更新していた時期が 2011年11月までなので、8年間ぶりとなる。 8年間なにをしていたのかと言えば、2回転職して未だにIT技術者の職を得ている。 その...