2011年2月27日日曜日

AppEngineとBloggerをくっつける・その2

Blogに投稿したりデータを取得するためにはBlogIDが必要。

とりあえず、まずはBlogの一覧を表すEntryをあらわすメソッドを作成。
 /**
  * Blog一覧を取得
  * @return
  * @throws IOException
  * @throws ServiceException
  */
 public Map getBlogMap() throws IOException, ServiceException{
  final URL feedUrl = new URL("http://www.blogger.com/feeds/default/blogs");
  Feed resultFeed = service.getFeed(feedUrl, Feed.class);

  Map blogMap = new HashMap();
  // Print the results
  for (int i = 0; i < resultFeed.getEntries().size(); i++) {
   Entry entry = resultFeed.getEntries().get(i);
   blogMap.put(entry.getTitle().getPlainText(), entry);
  }
  return blogMap;
 }
これで、Blog名をキーとしてBlogのEntryを取得できる。
ここからBlogIDを取得するメソッドは以下のとおり。
protected String toBlogId(Entry entry){
 Matcher m = Pattern.compile("blog-(.\\d+)$").matcher(entry.getId());
 if(m.find()){
  return m.group(1);
 }
 return "";
}
で、このBlogIDを使うとBlogに記事を書いたり、記事を取得したりできる。
 /**
  * 記事の一覧を取得する
  * @param blog
  * @throws ServiceException
  * @throws IOException
  */
 public List getEntryList(Entry blog) throws ServiceException, IOException {
  List entryList = new ArrayList();
  URL feedUrl = new URL("http://www.blogger.com/feeds/"+toBlogId(blog)+"/posts/default");
  Feed resultFeed = service.getFeed(feedUrl, Feed.class);

  for (int i = 0; i < resultFeed.getEntries().size(); i++) {
   Entry entry = resultFeed.getEntries().get(i);
   entryList.add(entry);
  }
  return entryList;
 }

 /**
  * 記事を投稿する
  * 
  * @param blog
  * @param title
  * @param content
  * @throws IOException
  * @throws ServiceException
  */
 public void createPost(Entry blog, String title, String content)
   throws IOException, ServiceException {
  Entry myEntry = new Entry();
  myEntry.setTitle(new PlainTextConstruct(title));
  myEntry.setContent(new PlainTextConstruct(content));

  URL postUrl = new URL("http://www.blogger.com/feeds/"+toBlogId(blog)+"/posts/default");
  service.insert(postUrl, myEntry);
 }
 

AppEngineとBloggerをくっつける

以前から使っていた個人用HPサーバを運営してくれていた後輩が
サービスを停止したいと言ってきたので、
Blogger+AppEngineでただでサーバを再構築することを目指してみようと思う。

とりあえず、そのためにAppEngineからBloggerを直接更新できるようにするぞ、ということで
AppEngine上でGDATAを利用するための方法を模索。

まずは、http://code.google.com/p/gdata-java-client/の左にあるgdata-src.java-?.??.?.zipをダウンロード。
その中にある、
  • gdata-blogger-*.*.jar
  • gdata-blogger-meta-*.*.jar
  • gdata-client-*.*.jar
  • gdata-client-meta-*.*.jar
  • gdata-core-*.*.jar
  • google-collect-***.jar
  • jsr***.jar
をWEB-INF/lib以下に移動。
GoogleService service = new GoogleService("blogger", "companyname-appname-version");
try {
 service.setUserCredentials(user, pass);
} catch (AuthenticationException e1) {
 e1.printStackTrace();
}

final URL feedUrl = new URL("http://www.blogger.com/feeds/default/blogs");
Feed resultFeed = service.getFeed(feedUrl, Feed.class);

// Print the results
System.out.println(resultFeed.getTitle().getPlainText());
for (int i = 0; i < resultFeed.getEntries().size(); i++) {
 Entry entry = resultFeed.getEntries().get(i);
 System.out.println("\t" + entry.getTitle().getPlainText());
}
これで、書いているBlogを全部取得することに成功。
本当はTokenつかって認証したいんだけど、よく分からないなあ。

参考はこちら。 http://kuribo-programming.blogspot.com/2009/12/gaejblogger-api.html

2011年2月2日水曜日

MongoDB使ってみる

Twitter検索の中の人が日本語ツイッターユーザのFollow関係DBを作っていたので,利用してみようと思う.
ちなみにデータはこちら.
https://github.com/penguinco/yats-socialgraph-dump
約300万ノード,約2.8億エッジという巨大なソーシャルネットワークを扱うことが出来るようになる.
分析のやりがいがあるけど,まずはデータを扱いやすい形にするところから.
今回のデータはMongoDBのDumpとして渡されるので,MongoDBをインストールして使ってみる.

とりあえず,何はともあれインストール.
http://www.mongodb.org/から
Production Release Window32Bitをダウンロード.
zipで来るので適当なディレクトリで解凍すればOk.

MONGODB\bin\mongod.exe
でサーバを立ち上げる.
その後,ダウンロードしたyats-socialgraph-dumpを
MONGODB\bin\以下に解凍して,
>mongorestore.exe -d twitter dump\twitter
とかやればOk.
もしかしたらあらかじめtwitterというデータベースを作っておかないと駄目かも.

現在インストール中.
どうなる事やら.