2010年12月24日金曜日

TwitterStreamingAPIを使って日本語だけを取り出す

以前書いたTwitterStreamingAPIを使う話は,Twitter4jを使っていなかったので,今度はTwitter4jを使ったバージョンを書いてみる.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;


public class StreamReader implements StatusListener{

   /**
    * @param args
    */
   public static void main(String[] args) {
      StreamReader streamReader = new StreamReader(User, Password);
      streamReader.start();

   }
   
   
   /**
    * ユーザ名
    */
   String userName;

   /**
    * パスワード
    */
   String password;

   /**
    * stream
    */
   private TwitterStream streamTwitter;
   
   
   
   
   public StreamReader(String userName, String password) {
      super();
      this.userName = userName;
      this.password = password;
   }

   public void start() {
      TwitterStreamFactory factory = new TwitterStreamFactory();
      streamTwitter = factory.getInstance(userName, password);
      streamTwitter.addListener(this);
      streamTwitter.sample();
   }

   @Override
   public void onStatus(Status status) {
      if(isJapanese(status.getText())){
         System.out.printf("%d\t%s\t%s\n", status.getId(), status.getUser().getScreenName(), status.getText());
         //得られたStatusに対する処理をする
      }
      
   }

   /**
    * 日本語かどうかを返す
    * @param text
    * @return 日本語ならtrue
    */
   boolean isJapanese(String text){
      Matcher m = Pattern.compile("([\\p{InHiragana}\\p{InKatakana}])").matcher(text);
      return m.find();
   }
   

   @Override
   public void onDeletionNotice(StatusDeletionNotice arg0) {
      
   }



   @Override
   public void onException(Exception arg0) {
      
   }

   @Override
   public void onTrackLimitationNotice(int arg0) {
      
   }

}
多分,これで動くはず.
おまけで日本語だけを取得するようにしておいた.

2010年12月10日金曜日

アクティブ遷移図利用促進キャンペーン中

今度,第3回知識共有コミュニティワークショップにて
アクティブ遷移図に関する発表を行います.
それに伴って,
OpenPNE3用プラグインアクティブ遷移図opActiveTransitionPlugin 利用促進キャンペーン中です.
いや,キャンペーンって行っても何するわけでもないけれど.

OpenPNE3を使っていて,興味がある管理者は今すぐ以下のURLへGo!
アクティブ遷移図作成プラグインの解説ページ
OpenPNEの活性度を可視化する、アクティブ遷移図プラグイン

あなたのOpenPNE3の利用状況をグラフィカルにお見せします.

2010年11月26日金曜日

GoogleChartAPIをリアルタイムにテストする

GoogleChartAPIは、URL指定だけで図を描画してくれる素敵なAPI。
でも、結構書くのが面倒で、ちゃんと書いたものが動くかどうかいちいち確認するのも大変。

そこで、テスト用にコードを書けば即座に図を描画してくれる以下のURLがとても便利。
http://code.google.com/intl/en-EN/apis/chart/docs/chart_playground.html

ぽじったーでも使ってます。

GAEでユーザ管理

GAEでAdministratorしか使えないページを作る場合.

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        UserService userService = UserServiceFactory.getUserService();
        String thisURL = request.getRequestURI();
        if (request.getUserPrincipal() != null && userService.isUserAdmin()) {
         String urlLogout = userService.createLogoutURL(thisURL);
         request.setAttribute("urlLogout", urlLogout);

         RequestDispatcher rd = request.getRequestDispatcher(jsp).forward(request, response);
        } else {
            response.getWriter().println("<p>
Please <a href=\"" +userService.createLoginURL(thisURL) +"\">sign in</a>.</p>");
        }

 }
これで,jsp側で
<%
String urlLogout = (String)request.getAttribute("urlLogout");
%>
・・・
<a href="<%=urlLogout%>">ログアウト</a>
としてあげればOk.

2010年11月2日火曜日

いろんな自然言語資源

自然言語関連の辞書とかコーパスが色々あると面白いなと思って,調べてみた.

電子的じゃないけど,役立ちそうな辞典.
他にもこんな辞書があるよ,ということをご存じの方がいたら,
コメント欄にお願いします.

2010年11月1日月曜日

プレゼンタイマーオンライン修正

以前作成したプレゼンタイマーオンラインが,
IEでは動かないという致命的バグがあったのですが,修正しました.
http://conference-timer.appspot.com/
これで,誰でも使えるはず!

2010年9月3日金曜日

bit.lyの短縮URLをワンクリックで作る

TwitterにURLを張るときは,http://bit.ly/などの短縮URLを使うのが普通らしいけど,
いちいちbitlyへ移動して作るのが面倒くさいので,ブックマークレットを作ってみた.
javascript:(function(){
var%20s=location.href;s.charset="UTF-8";
var%20b="http://bit.ly/?u="+encodeURIComponent(s)+"&searchButton=Shorten";
window.open(b,"bitly");})();
使ってみたい人は,以下のURLをブックマークバーにドラッグしてください.
[短縮URL]
たぶん,もっと便利なものを誰かが作っているんだろうなあと,思いつつ.

2010年7月30日金曜日

strutsのcheckbox

strutsでcheckboxを使っていると,
onにして表示したデータはチェックを消してもoffを返してくれない.
これは一種のバグじゃないか?

ActionFormを継承したクラスで,
resetをオーバーライドして
 @Override
 public void reset(ActionMapping mapping, HttpServletRequest request) {
  super.reset(mapping, request);
  hoge = false;
 }
とすればうまく動くようだ.

2010年7月27日火曜日

DropBox

大学のPCとノートPCでファイルのやり取りをするのが面倒すぎるため,
ついにDropBoxを導入.

簡単に言えば,ネット上のフォルダにファイルを置いておいて,
どこからでも取り出せるようになっているもの.
しかも,そのフォルダは普通のフォルダのように存在しているので,
DropBoxフォルダに入っているファイルはどのPCからでも見ることができるイメージ.

これは便利だ・・・
ちなみに,2Gまでタダらしい.

2010年7月21日水曜日

Jaws2010

合同エージェントワークショップ&シンポジウム2010(JAWS2010)が開催されます.

2010年10月27日(水) - 29日(金)
会場:新富良野プリンスホテル
http://harmo.complex.eng.hokudai.ac.jp/jaws2010/

発表申込締切:2010年8月13日(金)
ロング発表研究論文原稿締切:2010年8月31日(火)
ショート発表研究論文原稿締切:2010年9月30日(金)
なので,ふるってご参加ください.

2010年6月23日水曜日

GoogleAppEngineでRollback

GoogleAppEngine(GAE)でDeployに失敗すると,
その後Deployができなくなって,
「rollbackしろ」
と怒られることがある.
そんなときの対処法.

プロンプトで自分のアプリケーションディレクトリを開いて,
> eclipseのディレクトリ/plugins/com.google.appengine.eclipse.sdkbundle_xxxxx/appengine-java-sdk-x.x.x/bin/appcfg.cmd rollback ./war
とすればOkらしい.

2010年6月22日火曜日

GoogleAppEngineでStruts

なんか論文投稿用ページを作れという話になってきたので,
再びGAEにStrutsを入れるところから作業が始まります.

まずはstrutsのダウンロード
http://struts.apache.org/download.cgi#struts1310
から,
struts-1.3.10-apps.zip
をダウンロード.

その後は
http://googleappengine.seesaa.net/article/117110106.html
を参考に,ライブラリなどをプロジェクトに追加する.

とりあえず,アップローダを作成しないとなあ.

2010年6月21日月曜日

Robocup Rescue Simulationを動かす2

「Robocup Rescue Simulationを動かす」で動かしたMAPはちょっと大きすぎて
最初の取っ掛かりとしては難しいので,まずは簡単なMAPから実行してみる.

mapの変更
rescue-nightly\boot\config\gis.cfg
の中にMAPが書いてあるので, それを変更.

たとえば,

# The map directory to read
# gis.map.dir : ../maps/gml/legacy/Kobe
gis.map.dir : ../maps/gml/test

とすると,Mapがlegacy/Kobeからtestに変更できる.

これで実行すれば,各種エージェントが1種類ずつしかいない
小さいMAPを試してみることが可能.

エージェントの数の制御
ついでに,エージェント数などを変更する場所もメモしておこう.
rescue-nightly\maps\gml\
にマップデータがあるので,
scenario.xml
を書き換える.



エージェントの作り方
さて,ここまできていよいよエージェントの作成.
基本となるAbstractClassは,
rescuecore2.standard.components.StandardAgent
これを継承して,
import rescuecore2.standard.components.StandardAgent;
import rescuecore2.standard.entities.StandardEntity;

abstract public class AbstractAgent<E extends StandardEntity> extends StandardAgent<E> {
}

などというAbstractAgentクラスを作成すると良い.
さらに,それを継承して,AmbulanceTeam,PoliceForce,FireBrigaterを作成する.

たとえば,PoliceForceを作成するなら,
public class MyPoliceForceAgent extends AbstractAgent<PoliceForce> 

とする.
とりあえず,ざっくりとしたMyPoliceForceAgentを作成してみる.
package jp.ac.nagoyau.is.ss.kishii.tori.rescue.test.agent;

import java.util.Collection;

import java.util.EnumSet;

import rescuecore2.messages.Command;
import rescuecore2.standard.entities.PoliceForce;
import rescuecore2.standard.entities.StandardEntityURN;
import rescuecore2.worldmodel.ChangeSet;

public class MyPoliceForceAgent extends AbstractAgent<PoliceForce> {

    /**
     * つなげるために呼ばれる.<br>
     * これが呼ばれると全体のMAPなどが読み込めるようになる
     */
    @Override
    protected void postConnect() {
        super.postConnect();
        //何か初期化処理
    }
    
    /**
     * なんだかよくわからないけど,書いておく.
     * たぶんサーバ側で利用する
     */
    @Override
    protected EnumSet<StandardEntityURN> getRequestedEntityURNsEnum() {
        return EnumSet.of(StandardEntityURN.POLICE_FORCE);
    }

    /**
     * 1ステップごとに呼び出される.
     */
    @Override
    protected void think(int time, ChangeSet changeSet, Collection<Command> commands) {
        //面倒なので何もしません
    }

}



自分のエージェントで動かす
せっかく作ったら動かしたいというのが人間のサガ.
動かす方法も考えよう.

sample.LaunchSampleAgentsを自分の開発パッケージにコピーしておく.
で,作成したエージェントとSampleAgentを入れ替える.
たとえば,SamplePoliceForceAgentを今作成したMyPoliceForceAgentに変更するなら,
コピーしたLaunchSampleAgentsの100行目付近を
                Logger.info("Connecting police force " + (i++) + "...");
                //launcher.connect(new SamplePoliceForce());
                launcher.connect(new SamplePoliceForce());
                Logger.info("success");

と変更する.

で,実行してみると・・・

無事PoliceForceが何もしないチームが完成.
ますます役立たず.

2010年6月19日土曜日

Robocup Rescue Simulationを動かす

ロボカップレスキューシミュレーションを研究にしている割には
新サーバは一度も自分で動かしたことがなかったので動かしてみる.

ダウンロード&インストール
http://roborescue.sourceforge.net/
からnightly build⇒rescue-nightly-src.tgzをダウンロード
適当なところで展開する.

プロジェクト作成
Eclipse上で適当なプロジェクトを作成.
rescueなどという名前にしておけばいいと思う.
nightlyとは別のところにすべし.

そこに,
rescue-nightly/jars

rescue-nightly/lib
をコピーする.
ちなみに中身は,
・jars以下:ロボカップのjars
・lib以下:各種ライブラリ
である.
それぞれのディレクトリに入っているすべてのjarファイルをビルドパスに追加.

さらに,
rescue-nightly/modules/sample/src/以下をコピー

antをインストール
ANTをインストールする.
http://www.javadrive.jp/ant/install/index.html
この辺が参考になる.


いよいよ実行

nightly直下でプロンプトを立ち上げ,
> ant start-kernel

出てきたWindowでMaximumにチェックがついているものを
Civilian以外はすべて外す.

OKボタンをクリック.
⇒KernelGUIとViewerが立ち上がる.



eclipseで
sample/LaunghSampleAgent
を実行する.


KernelGUIで,
Component manager
にメッセージがないことを確認できれば,すべてつながったことが確認できる.

RUN!

で,とりあえずSampleは動くことを確認,.


街が真っ黒けになりました.

2010年6月16日水曜日

新しいノートPC

新しいノートPCを買ったので、早速インストールがてら遊んでみている。

Let'sNoteのSシリーズで、
Core-i7 2.67GHz
メモリ 8G
SSD 256G
と、とりあえず現状ではかなりがんばっている。
欠点は、若干画面が狭いことか。1280x800だから。
まあ、慣れるでしょう。

で、さっそくいろいろソフトをインストール中。
・Symantec Endpoint Protection
・FireFox
・Eclipse
・Lingoes
・Java
・Lhaca+
・ALZip

・Firefoxのタブが開く位置を変更する。http://www.lifehacker.jp/2010/02/100204firefoxtab.html

PreadesEclipse日本語化
eclipse.iniを書き換える必要があるので要注意。http://www.db.is.kyushu-u.ac.jp/rinkou/javaintro/eclipse.html

・subclipse
Eclipseのヘルプ⇒なんとかかんとかを選んで、
http://subclipse.tigris.org/update_1.6.x
を追加。
いくつか見つからないパッケージがあるので、チェックをはずしてインストール。
で、いざインポートしようとすると
> svn: Can't create tunnel
とかいわれる。
解決策は、こちら。
http://www.woodwardweb.com/java/000155.html
なんか面倒なことになっているなあ。
とにかく、無事できた。

とりあえず,こんなところで一段落.

疲れる.

2010年6月2日水曜日

アクティブ遷移図Wiki

アクティブ遷移図に関して情報をWikiにまとめました.
興味がある方は是非読んで利用してみてください.
http://www.kishii.ss.is.nagoya-u.ac.jp/project/openpne/at/

きっとOpenPNEの運営に大いに役立つことと思います.

2010年5月25日火曜日

javax.jdo.JDOUserException

こんなエラーが出た場合。
javax.jdo.JDOUserException: Persistent class "Class hogehage does not seem to have been enhanced. You may want to rerun the enhancer and check for errors in the output." has no table in the database, but the operation requires it. Please check the specification of the MetaData for this class.


Eclipseでプロジェクトのクリーンをすると解決。

2010年5月18日火曜日

アクティブ遷移図 for OpenPNE3 正式リリース

SNSの見える化プロジェクトの一環として,
SNS内のユーザがどの程度継続して利用しているか,
そして,ある時期に利用していたユーザがどの程度SNSを占有しているかが
一目で分かる「アクティブ遷移図」を作成するプラグイン for OpenPNE3の正式版をリリースしました.
興味がある方でOpenPNE3.1以降をお使いの方はお試しください.

プラグインの導入方法は以下の通りです.
=====
インストール済みのOpenPNE直下のディレクトリで以下のコマンドをうちます.
> ./symfony opPlugin:install opActiveTransitionPlugin
> ./symfony openpne:migrate --target=opActiveTransitionPlugin
> ./symfony cc
これでインストール出来ます.
ただし,このプラグインを使う際にPEAR::HTTP_Clientが必要になります.
インストールされていない場合は,以下のようにしてPEAR::HTTP_Clientをインストールしてください.
> pear install --alldeps HTTP_Client
また,通信部分でJavascriptを利用しているので,
ブラウザでJavascriptを有効にしてください.

インストールすると,OpenPNE管理画面の左側のメニューに,
アクティブ遷移図作成プラグインの項が追加されます.
=====

アクティブ遷移図を使うことで,あなたのSNSが成長中なのか停滞しているのか,あるいは衰退してしまっているのかを一目で判断することが出来ます.
さらに,成長中のSNSであれば,いつどの程度成長したかが分かりますので,これまでに行なったイベントやキャンペーンの効果がどの程度会ったかも分かります.
アクティブ遷移図を導入して,今すぐあなたのSNSに効率的な運営を実現しましょう!(深夜の通販番組的表現)






アクティブ遷移図のサンプル画像(流行っているSNS)

アクティブ遷移図のサンプル画像(あまり流行っていないSNS)

2010年4月28日水曜日

Twitter ストリーミングAPIをgardenhoseで使う

とりあえず,TwitterストリーミングAPIでデータをもっと欲しいので,
gardenhoseに申し込んでみた.
http://twitter.com/help/request_streaming
にアクセスして,名前,所属,E-Mail,URL,申請理由を書くだけ.

登録したら速攻使えるようになりました.
というか,sampleの性能があがって,gardenhoseになりました.
申請理由とか真面目に書いたのに,あんまり意味がない.

で,どのくらいとれるようになったかを確認.
sampleではIDの下一桁が0-4のTweetがとれていたけど,gardenhoseだと下2桁が0-14のTweetが取得出来ていた.およそ3倍の性能と言ったところ.
それでも,全体の15%しかとれない.これが多いか少ないかは難しいところだ.

sampleでは日本語のTweetが秒間6.5個くらいとれたのに対して,
gardenhoseでは日本語のTweetが秒間20個くらいとれた.
ちなみに,計測時間は19:30くらい.
昼間は秒間10Tweetくらいだった.だいぶ差があるなあ.

2010年4月27日火曜日

日本語が含まれるかどうかの判定

TwitterのストリーミングAPIから日本語が使われているTweetだけ取得したいので,
日本語マッチングをやってみた.
Matcher m = Pattern.compile("([\\p{InHiragana}\\p{InKatakana}])").matcher(text);
boolean isJapanese = m.find();
\p{InCJKUnifiedIdeographs}で漢字もとれるけど,漢字オンリーのつぶやきは中国系の人の物が多いみたいなので,ひらがなかカタカナが含まれるもののみにした.

2010年4月26日月曜日

Twitter Streaming APIをJavaで試してみる


2011年10月05日追記:
Streaming APIがHTTPS対応となったので,若干変更が必要です.
詳しくは,こちらのバージョンをご覧ください.

2010年12月24日追記:
Twitter4jを使ったバージョンを作ったので,そちらを使った方が良いと思われます.


TwitterのStreamingAPIにがぜん興味が出てきたので,Javaで実装してみた.
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 = "http://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();
 }

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

  return storedList;
 }
 
 /**
  * エラーログのリストを取得する<br>
  * これまでに読み込んだデータは削除される
  * @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){
     }
    }
   }
  }
 }
}


参考にしたのは,
この辺.

どんどん取ってくるためにThread化したけど,使いたい人は好きに作り直せばいいと思う.

2010年4月25日日曜日

App Engine覚書

Localhostで接続したときのDataScoreViewなど。
http://localhost:8888/_ah/admin

忘れっぽいエンジニアのJakarta Strutsリファレンス
http://struts.wasureppoi.com/

The class "com.appspot.****.className" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found.
org.datanucleus.exceptions.ClassNotPersistableException: The class "com.appspot.****.className" is not persistable. This means that it either hasnt been enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is hidden by an unenhanced version), or the Meta-Data/annotations for the class are not found.
ってな謎のエラーが発生してJSPをうまく処理できないとき。
http://d.hatena.ne.jp/y_koh/20090531/1243766131

とりあえず、datanucleus-appengine-1.0.4.1.final.jarをビルドパスからはずせばいいみたい。

2010年4月23日金曜日

社会実情データ

いろんな社会調査のデータが乗っている.
http://www2.ttcn.ne.jp/honkawa/
便利そう.

2010年4月9日金曜日

またか・・・

今年は研究室で3つも科研費出したのに,一つも通らなかった.
どんだけお金持ってくるのが苦手な研究室なんだ・・・
メインのテーマなんて5年くらい連続で落ち続けてるし.
どうすりゃいいんだ,これ.

分担で一つ通ってるだけマシと思うしかないか.

2010年4月2日金曜日

SNS関連論文サーベイ

SNS関連の論文をサーベイしてみよう.
とりあえず,列挙する.
足りないもの,読んだ方がいい物があったら是非コメント欄で教えてください.

2010年3月31日水曜日

アクティブ遷移図 for OpenPNE

SNSの見える化プロジェクトの一環として,
SNS内のユーザがどの程度継続して利用しているか,
そして,ある時期に利用していたユーザがどの程度SNSを占有しているかが
一目で分かる「アクティブ遷移図」を作成するプラグイン for OpenPNE3のベータ版が完成しました.
興味がある方でOpenPNE3.4OpenPNE3.1以降をお使いの方は人柱としてお試し頂けると嬉しいです.

プラグインの導入方法は以下の通りです.
=====
インストール済みのOpenPNE直下のディレクトリで以下のコマンドをうちます.
> ./symfony opPlugin:install -s beta opActiveTransitionPlugin
> ./symfony openpne:migrate --target=opActiveTransitionPlugin
> ./symfony cc
(4/3追記)

これでインストール出来ます.
ただし,このプラグインを使う際にPEAR::HTTP_Clientが必要になります.
インストールされていない場合は,以下のようにしてPEAR::HTTP_Clientをインストールしてください.
> pear install --alldeps HTTP_Client
また,通信部分でJavascriptを利用しているので,
ブラウザでJavascriptを有効にしてください.

インストールすると,OpenPNE管理画面の左側のメニューに,
アクティブ遷移図作成プラグインの項が追加されます.
=====

まだベータ版で正式公開に向けてテスト中です.
テストにご協力頂ける方を大募集中です!


4/3追記
最初に公開したコマンドでは一部インストールされない機能があることが判明しました。
BugFix版(0.3.1)をUPしましたので、よろしくお願いします。








アクティブ遷移図のサンプル画像(流行っているSNS)

アクティブ遷移図のサンプル画像(あまり流行っていないSNS)

2010年3月27日土曜日

英語教育について面白そうな記事を読んでがっかりして思ったことを書いてみる

こんな記事を読んだ.
日本の中高の英語教育がマイナスにしかならない件について
まあ,とりあえず世の中刺激的なタイトルを付ければいいというものらしい.

色々これを書いた人に聞いてみたい気がする.
・「日本の中高の英語教育がマイナスにしかならない」というのは対照実験をやらないと分からないわけで,断定系を使っている時点でどうなのかと.
英語教育は役に立っていないことはない.
・「間違った発音教育」には面白いネタ話ばかり書いてあるけど,これが一般論とは思えない.
小数の事例ベースで結論づけるとは.
・「英語構文なる間違った英文法」は,確かにそうかもしれないけど,そんなこと気にしててどうするんだ,と.
日本語がそれほど得意じゃない外国人が多少変な日本語を使っても誰も気にしないように,多少変な言葉を使ったって笑いを提供出来るくらいでそれほどひどい目に遭わないのに,最初から萎縮させてどうするんだ,と.
「普通の熟語を覚えた方が1000倍役に立つ。」には賛成.1000倍はさておき.
・「日本の中学高校の教育では、習う英単語すら、日常とかけ離れたものが多い」についてはどうなんだろう?それほどかけ離れていた気はしないけど.
どのくらいかけ離れているのか,示して欲しいところだ.
・「英米系の問題集などを使ってTOEFLやTOEICのために勉強するしかないよ。」
正直TOEICは850超えてるけど,英語が上達した気はしない.TOEICの勉強してもTOEICで点が取れるようになるだけじゃないだろうか.
まあ,それでもいいんだけど.

たぶん,この記事を書いた人は,自分で英語がしゃべれるから色々思うところがあるんだろう.
でも,事例ベースすぎて一般論にはならないんじゃないだろうか.

と,何となく思ったことを書いてみたりして.

2010年3月25日木曜日

Google App Engineでプロジェクト作成

WTKを使わない.

Google App Engineでプロジェクト作成する場合.
新規→Web App Project→ProjectNameとPackageを書いたら,use Google Web Tool Kitを外すとデフォルトな感じのWEBアプリが作れる.

struts1.3を実行するために.

struts-1.3.10-apps.zipをDLする.
解凍すると,struts-blank-1.3.10.warが出てくるので,これまた解凍する.(拡張子をzipにして展開可能.)
(ALZipで関連づけていれば一発)
struts-blank-1.3.10/WEB-INF/lib/*

APP EngineProject/war/WEB-INF/lib
以下にコピー.

次に,
struts-blank-1.3.10/WEB-INF/*.xml

APP EngineProject/war/WEB-INF/
以下にコピー.
web.xmlも上書き.

struts-blank-1.3.10/index.jsp
struts-blank-1.3.10/pages/Welcome.jsp

APP EngineProject/war/
以下にコピー.pagesフォルダも作ること.

struts-blank-1.3.10/WEB-INF/src/java/MessageResources.properties

APP EngineProject/src/
にコピー.

APP EngineProject/war/WEB-INF/appengine-web.xml

<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<sessions-enabled>true</sessions-enabled>
</appengine-web-app>
赤字の部分を追加.

2010年3月23日火曜日

増刷!

なんと,「よくわかるJAVA」が多少誤字を修正して増刷されました.
半年以上売り切れだったAmazonでも買うことが出来るようになりました.
よくわかるJava
購入すると,JAVAがよく分かります.たぶん.

2010年3月12日金曜日

FireFox3.6にしたらタブの開く位置が変わった

FireFox3.6を入れたら,タブを開くと元のタブのすぐ右側に開くようになった.
いや,別にいいんだけど,急に仕様が変更されてなんか気持ち悪い.
というわけで,元に戻したい.

http://news.livedoor.com/article/detail/4596470/
で,

1. アドレスバーに「about:config」と入力してEnterキーを押す。
2. 「動作保証対象外になります!」というアラートが出るので「細心の注意を払って使用する」をクリック。
3. フィルタの検索ボックスに「browser.tabs.insertRelatedAfterCurrent」を入力して検索。
4. バリューを「False」にする。

とすればいいことを発見.
うん,とりあえず満足.
つか,タブを開く位置くらいオプションで変えさせてくれ.

2010年2月22日月曜日

CyteScape

ネットワークを描画したいので,CyteScapeを使ってみる.

まず,ネットワークデータを作成.

6 3
6 4
8 2
6 2
4 2
9 8

みたいなデータ.これが,リンク構造を決定している.
6と3にリンクを張る,みたいな感じ.
network.netみたいな名前を付ける.

File=>Import=>Network from Tableを選択.

こんなのが出てくるので,「network.net」を開く.
で,Source InteractionにColumn1を,Target InteractionにColumn2を選択.
Interaction Typeは放っておこう.
で,Importをポチっとね.
これで取りあえず完成.
Layout=>CystoScape Layout=>Force Directed=>No Weight
で見やすい形になる,と.

2010年2月19日金曜日

Google App EngineでWiki

Google App Engine上で動くwikiはないものかしら.
「Google App Engine wiki」で検索してもApp Engineに関する情報が書いてあるWikiが出てくるだけだから困る.

2010年2月10日水曜日

スケジュールカウントダウン

GoogleCalendarを使っているんですが,
月とか年とかまたぐと締め切り日をどうしても忘れがちです.
特に,月の終わりになると一週間後に締め切りがある論文を発見してビビッたり.
というわけで,GoogleCalendarにあるアイテムに対して,
残り何日(何時間)かを一覧表示するWEBアプリを作ってみました.

予定カウントダウン

個人的には便利.

2010年2月9日火曜日

Texの行間・その2

Texのitemizeでの行間が広すぎるので,直す方法を以前紹介したけど,毎回書くのが面倒.
というわけで,もっとましな書き方を発見した.
\begin{document}の前に以下のように書いておけばいいようだ.

\renewenvironment{itemize}%
{%
\begin{list}{\parbox{1zw}{$\bullet$}}% 見出し記号/直後の空白を調節
{%
\setlength{\topsep}{0zh}
\setlength{\itemindent}{0zw}
\setlength{\leftmargin}{2zw}% 左のインデント
\setlength{\rightmargin}{0zw}% 右のインデント
\setlength{\labelsep}{1zw}% 黒丸と説明文の間
\setlength{\labelwidth}{3zw}% ラベルの幅
\setlength{\itemsep}{0em}% 項目ごとの改行幅
\setlength{\parsep}{0em}% 段落での改行幅
\setlength{\listparindent}{0zw}% 段落での一字下り
}
}{%
\end{list}%
}

元ネタはこちらから.

2010年2月1日月曜日

Twitterのネットワーク分析

とりあえず,誰か興味を持ってくれないかとTwitterのネットワーク分析結果を書いてみる.
データは某所の検索用データベースから.
@が先頭あればリンク有りと見なす.
最大連結成分から取得.


namedateユーザ数lリンク数平均経路長クラスタ係数同類選択性ベキ指数ベキ決定係数平均次数最大次数
Twitter2009/9/191049007822024.728 0.179 0.021 -1.724 0.923 14.913 4485

同類選択性が正な当たりが人間社会っぽい.
あと,めっちゃベキなのと,クラスタ係数が低いのが特徴的.

もっとちゃんと分析したいので,
Twitterのデータを持っている方,
持っている方を知っている方,
あるいは持っている方を知っている方を知っている方を・・・×6
もしくは,作ってくれる方,作ってくれる方を・・・以下同文.

お待ちしてます.

2010年1月29日金曜日

データベースの確認

Google App Engineでは,MySQL等は使えず,Google独自のDBを使うらしい.
詳しいことは,この辺で.

で,DBを作ったらデータを確認したいわけで,
入ったデータを見るためには,
http://localhost:8888/_ah/admin/datastore
を確認すればいいらしい.
ローカルはこれで確認出来るけど,サーバ上のもできるのかしら?まだUPしていないから,謎.

Google App EngineでJSP

Google App Engineで,JSPを使ってみようと思って
/warの下にtest.jspを使ってみたら,
Eclipseさんがエラーをはいてくる.

何だろうと思ったら,「インストール済みのJRE」がC:\Program Files\Java\jre6になっていた.
C:\Program Files\Java\jdk1.6.0_13になおしたら速攻エラーが消えた.
Eclipseの問題か,デフォルトでJREになっていたのが原因.
JDKに直せば問題解決です.

2010年1月28日木曜日

赤字

今年の研究費は大いに赤字と言うことで,何に使ったのかを調べてみた.
予想通り出張費が突出しているわけだけど,
行った出張を調べても,不必要なものはないなあ.
やはり科研費落ちたのは痛かった.
来年は科研費が当たりますように.

2010年1月26日火曜日

学会タイマー改めプレゼンタイマー

学会タイマーとして作成したけど,
「それってプレゼンタイマーじゃないの?」
と言われたので,名前変更.
プレゼンタイマーオンライン

学会タイマーオンライン

モノは一緒です.

2010年1月25日月曜日

Twitter利用実態調査

こんな調査結果が出てました.
Twitter利用実態調査

70歳近くまで利用者はいるんだなあ.

つぶやくモチベーションが,
・特定のユーザーに向けてはいないが、誰かの反応を期待して
・誰に聞いてもらうつもりもなく、純粋に独り言として
・リアルでは面識はないが、SNSやブログ、Twitter上で知り合った人へ
というのは面白い.
フォロワー数が少ない人は,独り言として書くことが多いようだ.
真面目に分析したらもっと面白い者が見えてきそうだ.

2010年1月20日水曜日

学会タイマーOnline

マックユーザな学会の関係者から
「学会タイマーが入ったノートPCを,自分のとは別に持ってきてくださいよ」
という無茶振りをされたので,
勢いに任せて学会タイマーOnlineを作ってみた.
反省はしていない.

さあ,みんな使って!w


学会タイマーOnline

第4回 人工知能学会 ファイナンスにおける人工知能応用研究会(SIG-FIN)

第4回 人工知能学会 ファイナンスにおける人工知能応用研究会(SIG-FIN)


2010年1月23日(土)
産業技術総合研究所 臨海副都心センター

にて開催されます.
詳細はこちら.
http://www.kishii.ss.is.nagoya-u.ac.jp/~tori/society/sig-fin/pukiwiki/index.php?%C2%E84%B2%F3%B8%A6%B5%E6%B2%F1

参加してきます.

TexでLandscape

最近情報処理学会の論文の形式が,
横置き(Landscape)になったので,Texで論文を書くときに色々設定を変更しなきゃ行けない.
特にpdfに変換するときに,うまく横置きにしてくれないため設定をいじる必要がある.
面倒くさいなあと思っていたら,以外な解決法が.

Texのソースに
\AtBeginDvi{\special{landscape}}
と書いておくと,dvipdfmxが自動的に横置きであることを判別してくれます.
そのため,普通にコンパイルしてpdf化するだけでOk.コンパイルコマンドをいじる必要がありません.
なんと便利.
情報処理学会の論文sampleに最初から含めておいて欲しいくらいだ.