2011年10月5日水曜日

仕様変更に伴うTwitterStreamingReaderの変更

どうやら,Twitterで仕様変更があったらしく,
StreamingAPIを使ったデータの読み込みを変更しなければいけなくなりました.

具体的には,TwitterのDeveloper用ブログにあるとおり,
All our Streaming API products are now supporting SSL and we've just updated the Streaming API Methods, User Streams and Site Streams documentation pages accordingly. As we're planning to sunset HTTP support in about a month, we strongly encourage you to switch to SSL (HTTPS) as soon as possible, especially if you're still authenticating your Streaming API requests with Basic Auth.
ということで,SSLを使ってね,ということらしいです.

そんなわけで,以前作成したTwitterStreamReaderではなく,新しいバージョンを使ってください.

変更点は,SSLに対応させただけだけど.
得られるTweetデータはJSON形式なので,jsonicなどを使ってJSONの処理をちゃんとしないと日本語が文字化けするようです.
また,日本語のTweetだけ取り出したい人は,文字列に日本語が含まれるかどうかの判定をご参照ください.

package twitter;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * StreamAPIから送られてくるStreamデータをひたすら取得し続けるクラス
 * @author tori
 *
 */
public class TwitterStreamReader {


 /**
  * 使い方の例
  * @param args
  * @throws UnsupportedEncodingException 
  */
 public static void main(String[] args) throws UnsupportedEncodingException {
  
  TwitterStreamReader tsr = new TwitterStreamReader("Twitter-UserName", "Password");
  tsr.start();
  
  while(true){
   List<String> tweetList = tsr.readStoredList();
   List<String> errList = tsr.readErrLogList();
   
   for(String text:tweetList){
    System.out.println(text);
   }
   
   for(String err:errList){
    System.err.println(err);
   }
  }
 }
 
 /**
  * sampleのタイムライン取得のためのURL
  */
 private static final String DEFAULT_API_URL = "https://stream.twitter.com/1/statuses/sample.json";

 String userName;
 String password;

 /**
  * 強制終了させられたかどうか
  */
 boolean isForceStop;

 /**
  * 取得しているかどうか
  */
 boolean isRunning;
 
 /**
  * Synchlonizedされたリスト
  */
 List<String> dataList;

 /**
  * Synchlonizedされたリスト
  */
 List<String> errLogList;

 /**
  * apiのURL
  */
 String apiUrl = DEFAULT_API_URL;

 /**
  * ストリームを読み続けるためのスレッド
  */
 private Thread streamReadThread;
 
 public TwitterStreamReader(String userName, String password) {
  super();
  this.userName = userName;
  this.password = password;

  dataList = Collections.synchronizedList(new ArrayList<String>());
  errLogList = Collections.synchronizedList(new ArrayList<String>());
  
 }

 /**
  * 読み込みを開始する
  */
 public void start(){
  StreamReader streamReader = new StreamReader();
  
  streamReadThread = new Thread(streamReader);
  streamReadThread.start();
 }

 /**
  * 取得を停止する
*/
 public void stop() {
  this.isForceStop = true;
 }
 
 /**
  * データ取得中かどうかを返す
  * @return
  */
 public boolean isRunning(){
  return streamReadThread.isAlive();
 }
 
 /**
  * 取得済みのTweetデータのリストを取得する
* これまでに読み込んだデータは削除される
  * @return 是までに読み込んだデータ
  */
 public List<String> readStoredList(){
  List<String> storedList;
  synchronized (dataList) {
   storedList = new ArrayList<String>(dataList);
   dataList.clear();
  }

  return storedList;
 }
 
 /**
  * エラーログのリストを取得する
* これまでに読み込んだデータは削除される
  * @return 是までに読み込んだデータ
  */
 public List<String> readErrLogList(){
  List<String> storedList;
  synchronized (errLogList) {
   storedList = new ArrayList<String>(errLogList);
   errLogList.clear();
  }
  return storedList;
 }

 /**
  * 強制停止信号を送ったかどうか
  * @return the isForceStop
  */
 public boolean isForceStop() {
  return isForceStop;
 }
 
 /**
  * データ読み込み用クラス
  * @author tori
  *
  */
 class StreamReader implements Runnable{
  @Override
  public void run() {
   isForceStop = false;
   while(!isForceStop){
    InputStreamReader isr = null;
    BufferedReader br = null;
    try{
     URL connectUrl = new URL(apiUrl);
     HttpURLConnection con = (HttpURLConnection)connectUrl.openConnection();
     
     con.setRequestMethod("GET");
     con.setDoOutput(true);
     con.setInstanceFollowRedirects(true); 

     Authenticator auth = new Authenticator(){
      public PasswordAuthentication getPasswordAuthentication(){
       return new PasswordAuthentication(userName, password.toCharArray());
      }
     };
     Authenticator.setDefault(auth);
     

     isr = new InputStreamReader(con.getInputStream(), "UTF8");
     br = new BufferedReader(isr);
     while(!isForceStop){
      String tweet = br.readLine();
      synchronized (dataList) {
       dataList.add(tweet);
      }
     }
    }catch(Exception e){
     StringBuffer buf = new StringBuffer();
     buf.append(e.getClass().getName()+"\n");
     for(StackTraceElement ste:e.getStackTrace()){
      buf.append(String.format("\tat %s.%s(%s:%d)\n", ste.getClassName(), ste.getMethodName(), ste.getFileName(), ste.getLineNumber()));
     }
     synchronized (errLogList) {
      errLogList.add(buf.toString());
     }
    }finally{
     try{
      br.close();
     }catch(Exception e){
     }
     try{
      isr.close();
     }catch(Exception e){
     }
    }
   }
  }
 }
}

2011年7月30日土曜日

じゃんけん大会の必勝法

世の中こんなブログであふれている.
たった5万円から億万長者になった、成功の9ステップ

非常に学びが多く、ここに書かれたことを実践することで、自分なりの成功に近づけると思った。

とか書いてあるけれど,
成功例だけ見てその結果を模倣しても,
それは単にじゃんけん大会で勝った人の話を聞いているだけじゃないかと思う.
何万人でじゃんけん大会をしても,必ず一人は優勝者が出る.
ただ,その優勝者は偶然優勝しただけであって,必勝法など無い.
にもかかわらず,その人がどう優勝したかを聞いて,それを実践してじゃんけん大会で優勝しようとしているようなもの.

ある行動が成功に結びつくかどうかを知りたいのならば,
その行動を行った人を一定量サンプリングして,その中の成功例と失敗例を調べるべき.
成功した人のほんとどがやっていた行動をすれば成功する信じるのならば,みんな毎日息をしていればいいと思う.
成功者はみんな息をしているんだから.

というわけで,そんな簡単な統計学も分からないようではやっぱり成功しないんじゃないだろうか.

2011年7月13日水曜日

作業用にSugerSync

出張が多い身としては,職場のPCとノートPCとでデータを共有したいんだけど,
いちいち動かすのが面倒くさい.
そんなときは,ファイル共有アプリである,DropBoxがスタンダードでしょう.
DropBoxフォルダに入っているデータを自動的に全PCで共有してくれるので,面倒なことを考えなくてもフォルダにファイルをぶちこんでおけば入れ忘れに悩む必要は無い.
とはいえ,特定のフォルダ以下にデータを入れておかないと共有されないのがちょっと不便.
ドキュメントならそれでもいいけど,Eclipseを使ってプログラミングしているものを共有しようとすると,最初からDropbox内にプロジェクトを作らなければいけないし,共有をやめようと思ったら一々フォルダの場所を動かして設定も変更しないといけないのが欠点.

んで,色々探したらSugarSyncというのがあるらしい.
こっちはDropBoxと違って任意のフォルダを共有可能.
共有したいフォルダは一個一個選ばなければいけないけど,一度指定すればその下に作ったフォルダは全部教諭されるので,作業中のフォルダだけ共有するのも楽勝.
フォルダ内の共有したくないデータは除外出来るので,プログラムプロジェクトのなかで,ログフォルダだけ除外とかも余裕.
容量は5~5.5G.これは,Dropboxと同じ.
ただ,作業の必要なくなったら共有をやめればいいだけなので,Dropboxより使い勝手が良いかも.
お金さえ払えば250Gまでいけるらしいけど,そこまでは必要ない気がする.
iPodとかiPadとかアンドロイド携帯でも使えるらしいけど,そっちは試したことが無いのでよく分からない.誰か試したら教えて.
Dropboxを併用できるのもポイント高い.
両方使えば最初から11G使えるようにもなるので,半永久共有したいファイルはDropBoxに,一時的なファイルはSugerSyncに入れると容量を節約しつつ使えてよい.
というわけで,外用のノートPCと職場のPCを併用している人にはお勧め.
家と職場でも使えるけど.

SugarSyncを容量5.5Gで開始
SugarSyncを容量5Gで開始

Dropboxを容量5.5Gで開始
Dropboxを容量5Gで開始

2011年6月11日土曜日

震災時のTweetデータの分析

先日共同研究者を募集したTweetデータについて,簡単な分析を行ってみました.

まず,総Tweet数ですが,3月5日から3月24日までで3億3235万8199Tweetでした.
日ごとのTweet数の内訳は,図1の通りです.
図1 Tweet数の変位
ただし,震災直後(3月12~15日)あたりは計画停電などの影響で十分にデータが取れていない可能性もあります.後々再収集を試みましたが,すべて収集出来ているとは限りません.

まあ,とはいえ3月11日にTweet数が一気に増加したのは間違いなさそうです.

次に,震災時にどの県が注目されていたかを分析しました.
各県名がTweetされた回数について,日常の1時間あたりの平均を県名Tweet数を1としたときに,震災時に何倍Tweetされたかを日本地図上に色分けして乗せました.
色が濃いほど日常よりも多くつぶやかれていることを示します.
autoボタンを押せば,時系列で見ることが出来ます.
画面がチラ付くのはご愛敬.

やはり,地震直後は「宮城」「福島」などがTweetされていますが,
時間とともに「宮城」などは減少し,「福島」が目立つことが分かります.
二日目付近からは,原発に注目が行っていたのでしょう.
また,長野や静岡でも地震が発生すると,大きく注目されていることが分かります.

ここから分かることはまだまだ少ないですが,今後さらに多くの情報をデータから抽出して,
震災時に何が起きたのかを明らかにしていきたいと思います.

2011年6月8日水曜日

ポモドーロテクニック

研究生活を続けていると,集中して論文を書いたりする作業が必要になったりします.
でも,つい他のことが気になって論文書きながら別の事をやってしまったりとかありますよね.
そんなときに集中力を維持するのに有効なテクニックとして,ポモドーロテクニックがあります.

これは,25分間は集中して一つの作業をして,その後5分間休憩し,
また25分作業する,というのを続けるテクニックです.
作業中の25間はメールが来てもFacebookに書き込みがあっても,全部無視して作業に集中します.
Twitterへの書き込みだって控えます.
電話は出ないとダメかもしれないけど.
雑用は5分ですませて,ついでに少し休みます.
それを4~5回繰り返すと作業効率がぐっとアップするというわけです.

本当かよ~とか思いつつタイマーを用意してやってみたのですが,
これが意外といい.
確かに,集中出来るので思ったより作業が進む.
特に,レポートの採点とか論文の査読とかあんまり楽しくない作業にはぴったり.

というわけで,単にタイマーを使うのではなく,
ちゃんと25分を計ってくれるアプリがいいなあと思って作成しました.
ポモドーロタイマー
作業回数と内容を入力してスタートするだけで25分間+5分の休憩を淡々と記録していってくれます.

しかも,Twitterと連携して作業開始時にTwitter上に宣言をしてくれます.
今作業中だよ,と.
つまり,作業をサボってTwitterで遊んでいると他の人にばれてしまうわけですね.

というわけで,集中力のないそこのあなた.
是非使ってみてください.

外部関連記事:
ポモドーロテクニックについて

2011年4月7日木曜日

東日本大震災時のTwitterデータを用いた共同研究者募集

東日本大震災が発生してから一ヶ月が経過しようとしています.

そんななか,
Twitter検索の@PENGUINANA_さんのご協力の下,
2011年3月5日から24日までのTwitterでつぶやかれた日本語のTweetのうち2億6688万9069Tweetを入手しました.

含まれているデータには,
・TweetID(1ツイート毎に割り当てられる唯一のID)
・ScreenName(ツイート当時の物)
・Contents(本文)
・Source(ツイート元)
・Time(ツイート時間)
・reply_to(Reply機能を使ったときのリプライ先TweetID)
・reply_to_sc(Replyを受けた人のScreenName)
があります.

2011/4/8追記
各Tweetに含まれるハッシュタグと,はてなキーワードを抽出したメタデータもあります.
また,@User関連のデータも作成予定です.
追記ここまで.

近いうちに公開したいと思いますが,
その前に共同で研究してくださる方を募集します.

ネタとしては,
・情報の信頼性分析
・情報伝播の分析
を考えていますが,これにこだわりません.

一緒に研究しようぜ!という方はメール(ご存じの方)か,Twitter(@toritorix)につぶやくか,このエントリーのコメントでご連絡ください.

あ,ちなみに本件に関して(今のところ)予算はありませんw

2011年3月7日月曜日

数の暴力

Googleがインフルエンザの流行を予測する
http://www.google.org/flutrends/intl/ja/about/how.html
大量のデータがあるというのはそれだけですごいことができるということ.
なんというか,Googleの中の人がうらやましい.
そして,なんとかこういうデータを手に入れることが出来ないものかと悶々としてしまいます.

そのほかの記事.
http://www.kk.org/thetechnium/archives/2008/06/the_google_way.php
http://www.wired.com/science/discoveries/magazine/16-07/pb_theory/

2011年3月5日土曜日

Yahoo!知恵袋カンニング事件で仙台の浪人生が逮捕された2つの理由

今回のYahoo!知恵袋を利用したカンニング事件については,いろんな人が色々な意見を述べている.
しかしながら,意外なほど
「逮捕はやりすぎだ」
という意見が意外と多いことに違和感を感じる.
個人的には今回の大学側の対応はこれ以外には無いものだったと思う.
なお,法律などについては詳しくないため,そういった観点からの意見はhttp://togetter.com/li/107865を参照していただきたい.
また,現在の入試の構造自体に問題があるかどうかや,,
カンニングを発見できなかったことが問題なのかどうかについては論じない.

カンニングが発覚した場合,大学がとる行動としては,
1,警察に逮捕を依頼
2,不合格にするなど内部的な処分
3,罰しない
の3種類が考えられる.
今回は1の行動を取って批判されているのであるから,2,3を取るべきだと思った方が多いのだろう.
しかしながら,今回は1以外の行動を取ることは考えられなかった.

まず,2についてであるが,
従来のカンニングであればこのように処理していたはずである.
そのため,
「今までカンニングした人は逮捕されていないのに,今回だけ逮捕するのはおかしい」
と批判されることになる.
しかしながら,今回の場合「2,不合格など内部的処分」を取ることはできない.
なぜならば,「誰がやったのか」を大学側が知る方法が無いからである.
カンニングは現行犯でのみ処分が可能となる.
そのため,すでに試験が終わってしまった段階ではYahoo!知恵袋に投稿した人が誰なのかは分からない.
それを知るためには,Yahoo!や携帯電話会社の協力を仰ぐしかないが,
一法人でしかない大学に情報提供をしてもらう権限は無い.
したがって,警察の力を借りなければ誰がカンニングしたのかが分からないのである.
以上のような理由で,カンニングした受験生に罰を与えるには「1,警察に逮捕を依頼」しかありえないのである.

次に,「3,罰しない」について考えてみる.
実際,大学試験の現場でどの程度のカンニングがされているのか分からないが,
カンニングをして見逃されている人は0ではない可能性はある.
しかしながら,大学側としては
「カンニングによって入学する不正な受験生」
がいるせいで,
「本来入学すべきだった正しき受験生」
が入学できなくなるのは,不公平である.
そのため,カンニングした受験生は不合格とするべきである.
したがって,カンニングした受験生が明らかに存在するのに,それを無視することはできない.

ポイントは「明らかに存在」し,かつ「特定も可能」であるという状況である.
通常のカンニングであれば,「俺がやった」と大声で言うことも無く,またその言葉が真実かどうか確かめるすべは無い.
一方,今回の場合は証拠があり,かつカンニングした人を見つけることが容易にできる状況であった.
このような状況にもかかわらず「不正に入学する受験生」を見逃して「本来入学すべきだった受験生」を
落とさなければならない理由があるだろうか?
今回の逮捕によって仙台の浪人生の人生が狂うのであれば,
不正を見逃すことで,本来入学すべきだった受験生の人生は大きく狂ってしまうだろう.
さらに,今回の事態を放置してしまえば
「カンニングはやったほうが得」
ということになってしまい,不正行為を助長する可能性すらある.
不正行為が増加すれば,その分まじめに受験している受験生の人生が狂う可能性が高くなる,
そのため,放置という方法は取ることはできない.

まとめると,ポイントは2つ.
・カンニングした受験生を罰するには逮捕以外の方法が(現状では)ない.
・放置することによって,人生を狂わせるほど損をする「不正をしていない受験生」が存在する.
このような理由により,大学側は今回の事件で仙台の浪人生を逮捕せざるを得なかったのではないだろうか.
逮捕がやりすぎなのか,罪状が正しいのかどうかは分からないが,
大学側がとるべき行動としては,他には無かったような気がする.

と,たまには真面目な長文を書いてみたりして.
まあ,一大学教員の戯言です.
来年から受験監督時にカンニング対策を強めなければいけないと思うと気が重い.
たった一人の不心得モノのために,多くの人が迷惑をこうむるなあ.

2011年3月4日金曜日

SQL4G

AppEngineにSQL3gを入れて,SQL文を使えるようにしてみる.
詳しいインストール方法はhttp://www.littlesoft.jp/sql4g/#installここをチェック.

そのまま使うとweb.xmlでWarningが出たりするけど無視して進める.
と,http://localhost:8888/sql4gadminにつなげば,SQL4GAdminが立ち上がって,色々操作ができるようになります.
とりあえず,TESTというデータベースを作成して,
create table test_tbl (id int auto_increment, text text);
を実行すると,テーブルができあがった.
insert into test_tbl (text) values ('hoge');
で,データを入れておく.

その後,適当なActionを作って,
package com.appspot.tori.sql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class SqlTestAction extends Action {

 /* (非 Javadoc)
  * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
  */
 @Override
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  // JDBCドライバーをロード
  Class.forName("jp.littlesoft.sql4g.Driver");
  // コネクションオブジェクトを取得
  Connection con = DriverManager.getConnection("TEST", "user", "password");

  try{
   Statement st = con.createStatement();
   ResultSet rs = st.executeQuery("select * from test_tbl");
   while(rs.next()){
    System.out.println(rs.getInt("id"));
    System.out.println(rs.getString("text"));
   }
  }finally{
   con.close();
  }
  return super.execute(mapping, form, request, response);
 }

}
ってな感じで実行してみたら,
1
hoge
って出力された.
おお,すごいぞ.

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というデータベースを作っておかないと駄目かも.

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

2011年1月19日水曜日

世界におけるSNSの変化 ~またはFacebookの躍進

最近Facebookが流行ってきているらしく,
テレビなどでも見かける機会が多くなってきました.
これはソーシャルネットワークの宣伝の一環なのか,

まあ,それはさておき,世界中には実はいろいろなSNSがあるわけで,
国によって使っているSNSはだいぶ違うんですよね.

2008年の各国で尤も使われていたSNSの地図がこちら.

2008年10月


いろんなSNSがあるものですね.
アメリカではMySpaceが優勢だったりします.
さて,これから2年たった現在までSNSの使われ方がどう変化していくのか見てみましょう.

World Map of Social Networksに,2009年から半年ごとに,世界中の各国で最も多く使われているSNSがどこなのかが示されています.



2009年6月
すでに,だいぶFacebookに浸食されている.米国が陥落.
世界有数のSNSだったCyworld有する韓国もあっさり陥落.


2009年12月
中米各国が陥落.インドも脱落.


2010年6月
東南アジア陥落.世界はFacebookに飲み込まれていく.
東ヨーロッパ~東アジアが最後の抵抗を見せる.

2010年12月
ヨーロッパ全滅.モンゴルもまさかの陥落.
もはや世界がFacebookの手に落ちる日は近い.
一方ブラジルはなぜか我が道を行き続けている.




これを見ると,徐々にFacebookが世界中に浸食していく様子が分かりますね.
2010年12月の段階では,日本,中国,ロシア,ブラジルあたりでかろうじて違うSNSが使われているくらいか.ただ,ブラジルはorkutで世界進出しているSNSである一方,他の3国は独自のSNSを利用している点が少し違うところか.ちなみに,中国では2008年と2010年ではトップになっているSNSが違う.

そして,映画ソーシャルネットワークブームで今後の日本のSNS事情がどうなるのか,大変気になるところですね.
世界的にはFacebookの一人勝ちは揺るがないのか.

今後のWEBはGoogle vs Facebookなんて言われてます.
日本からもこれに匹敵するくらいすごいWEBサイトが出てきて欲しいものです.

2011年1月17日月曜日

以前,短縮URLを作るブックレットを作ってみたけど,同じように
Internet Archiveを簡単に見るためのブックレットを作ってみた.
javascript:(function(){
 var%20s=location.href;
 s.charset="UTF-8";
 var%20b="http://web.archive.org/web/*/"+s;
 document.location=b;
})();
使ってみたい人は,以下のURLをブックマークバーにドラッグしてください.

[Archive]

これを使えば,無くなってしまった
iswebライトのページも,閉じてしまったページでも簡単に見ることが出来ます.