2012年3月29日木曜日

XMLのエスケープ文字処理

こないだ作ったスクリプトのデバックしていたら、エスケープ文字が極稀に入り込む事で、XMLが正常にパース出来ない場合がある事が判明したので、対処しましたん。


#不要文字エスケープ処理
def escapeCode(hoge):
 p1 = re.compile(u'&')
 p2 = re.compile(u'<;')
 p3 = re.compile(u'>;')
 p4 = re.compile(u'\'')
 p5 = re.compile(u'\"') #"
 
 q = p1.sub(u'&amp;',hoge)
 q = p2.sub(u'&lt;',q)
 q = p3.sub(u'&gt;',q)
 q = p4.sub(u'&apos;',q)
 q = p5.sub(u'&quot;',q)
 return q
こんな感じ。

もうちょいスマートな方法もありそうだけんど、正規表現あんまり詳しくないので、もうちょっと勉強しないとなと反省。

さくらのVPSリニューアル

らしいのですが、折角構築した環境をどうしてくれるんだと小一時間。

http://vps.sakura.ad.jp/lp/

とはいえ、メモリ容量2倍、ストレージ容量5倍でお値段据え置きは魅力的。
今の用途で、今の動かしている小さいシステム(クローラーを幾つかと、データの集計表示)には全く不足無く、別に弄らんでくれても良かったのに。
まだ、手戻りが出来るうちに移行しちゃった方がいいのかなぁ。と思う次第。

背景にはやっぱりCPIなどの競合が結構イカすプランを出してきているので、そこにぶつけに来た感じなんでしょうね。
でも、さくらはバックボーン回線はホントに早いからなぁ。クロール早い早い。

という訳で近日中に”はじめて”のシステム移行予定です。

2012年3月20日火曜日

Google Sites APIsの使用時の注意

ちょっとハマったので忘れないうちにメモ。

Google Sites API は取りたいデータの種類で指定するURLが違うのだ。

具体的には

コンテンツフィード
https://sites.google.com/feeds/content/domainName/siteName/[contentEntryID]
リビジョンフィード
https://sites.google.com/feeds/revision/domainName/siteName/contentEntryID/[revisionEntryID]
サイトフィード
https://sites.google.com/feeds/site/domainName/[siteName]
aclフィード
https://sites.google.com/feeds/acl/site/domainName/siteName/[aclEntryID]
アクティビティフィード
https://sites.google.com/feeds/activity/domainName/siteName/[activityEntryID]
こんな感じで指定するURLを変えないと狙ったデータが取って来れなかった。
コンテンツの中身を取りたいのにサイトのURLを指定してても変な値しか帰ってきません。

コンテンツはコンテンツの中身。リビジョンは更新履歴をサイトごとに。
サイトフィードは、サイトのサマリーを取ってきます。
aclはアクセスコントロールリストの略で、サイトオーナーとか権限の設定や参照です。
アクティビティは、閲覧履歴とかですかね。

詳細はコチラ

Google Appsの2-legged oauth

Google Appsのデータに外部からアクセスしたくて、色々調べていたら、2-legged oauthと言う方法がスマートという事が分かり、色々試してみた。

他の認証方法は
・SSO(シングルサインオン) Apps側での設定が煩雑
・OpenID    よく調べてないけど却下。
・Oauth     2leggedと3legged

んで、何がしたいかって言うと、
pythonのスクリプトから、Appsのデータにアクセスしたい。
の用途では、やり取りの手順が少ない2-legged oauthがスマートという判断。

Googleコードからサンプルスクリプトを引っ張ってきたのがこんな感じ。
import gdata.gauth
import gdata.docs.client

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'
requestor_id = 'any.user@anydomain.com'

client = gdata.docs.client.DocsClient(source='yourCompany-YourAppName-v1')
client.auth_token = gdata.gauth.TwoLeggedOAuthHmacToken(
    CONSUMER_KEY, CONSUMER_SECRET, requestor_id)

# Retrieve user's list of Google Docs
feed = client.GetDocList()
for entry in feed.entry:
  print entry.title.text

そんでもってCONSUMER_KEY,CONSUMER_SECRETには、Appsのドメイン管理>高度なツール>OAuthドメインキーを管理するの所から取って来た、自分とこのドメインとシークレットキーを入力。

pythonの実行環境にeasy_installでgdataなるgoogle data APIを叩く為のモジュールをインストールしないと上記のコードは動きませんのであしからず。

実際に試したみたのですが、幾つかの設定の注意点があるのでそのままでは動きません。
ハマった点を箇条書きに。

・google appsでは動きません。(google apps for buisinessじゃないと駄目)
・サーバ側の情報をwebアプリケーションとしてgoogleに登録する必要があります。
・サーバ側でHTTPSの通信に対応してないと動きません。
・google apps側でもAPIを動かす許可が必要です。

という訳で、必然的にローカルでは正常な動作検証出来ませんし、普通のレンタルサーバでもモジュールの追加の関係で厳しいんじゃないかな?既に何らかの形で公開しているサーバで、root権限持ってるサーバが無いと駄目なので、その時点で結構敷居高めな感じです。
幸い、先日動いたサーバの方で動作検証出来たので事亡きを得ましたが…。

認証さえ通ってしまえば、後はほぼフルコントロールなので、結構色んな事が出来ます。
けれども、要は使い道って感じですね。
でもgoogle appsってまだまだニッチなんだよなぁ。便利なんだけど、エクセルとかに慣れた人とかだとほぼ覚え直しになっちゃうので、その辺が敷居高いのかなぁ。
スタートアップとかだとこんなに便利で低コストなモノ、他に無いんですけどね。

2012年3月15日木曜日

クソはどんなに煮詰めてもクソでしかない。

こんなニュースが。ちょっと気になったので。

年金システム開発が1年以上停滞


元の構想がクソならば、どんなにこねくり回した所で、それはクソでしかない。
既存の運用の仕組みがクソならば、そこを変えないとどうしようもないという好例。
ベンダーどうこう、マネージメントどうこうでは無く、運用の問題であり、ひいては国民の問題である。
そんでもって、一人で何か変えるには問題が大きすぎるのも事実。
どうなるのでしょうか?

個人的な感想なのだけれども、良く出来たシステムを先に作っちゃって、その上で年金を動かす仕組みにした方が余程マシなのではないかなと。実際、色々と後付けで変更するのでこういう事態になる。その何だか良くわからない仕事やコストって無駄な仕事でしかないよね。
ていうか、社保庁のやり方は卑劣でしかなくて、面倒なフロント業務は全部外注。で、解体の原因になったグダグダぶりには一向に手をつけた気配無く、なんとなくミンナ忘れるまで大人しくしてる雰囲気。こういう役所に何かさせる位なら、全部コンピュータにやらせた方がまだマシ。

2012年3月11日日曜日

インストールしたモジュールのメモ

BeautiflSoup
Tweepy
pip
flask

※メモなので書き散らかし。失礼。

さくらVPSでpython2.7にしてみた。

さくらVPSはCentOS5.5で入ってるpythonのバージョンが2.4系です。
このままだとimport JSONとか出来ないので、不便だし、開発ローカルと環境を合わせないと何かと不便なので、2.7にアップデートします。

ちなみに、OSX Lionのpythonのバージョンはデフォルトでは2.7です。
(GAEとか視野に入れた場合、微妙に使いにくいのか?)

参考にしたのはこちら。
http://d.hatena.ne.jp/hateka/20110923/1316799206

詳細書くのはめんどくさいので注意点のみ補完です。

2.4の時にツール系を色々、setup.pyしていましたが、2.7にした後、全部やりなおしです。
先にバージョンアップしておく事をオススメします。

パスの構成がいまいち不理解なところがあり、Cronで叩いたスクリプトがうまく動いてくれない事態に遭遇しました。よくよく調べると、cronで叩いてたのが2.4のインタプリタだったというオチ。crontabに2.7が入ってる所をフルパス指定で対処しました。

元のシステムで使ってる可能性があるので、実運用はこんな感じがいいのかもですね。
その辺は未検証なので良くわかりません。

とりあえず自動実行の環境が整ったので、cronでスクリプト叩いて色々とゴニョゴニョ出来るサーバが実働段階に入りました。
っていうか、VPSとは言え、月額980円って電気代とか回線代まで勘案すると破格ですよね。自宅でサーバ立てようかなと思ったけど、とりあえず全然用が足りる感じです。
スクリプトで大量のデータ扱うにしても、20Gあれば当面は十分でしょう。
でも最近CPIのVPSのが競合としていい感じのスペックなので、足りなくなったら今度はこっちにしようかなって感じです。