ラベル アプリケーション の投稿を表示しています。 すべての投稿を表示
ラベル アプリケーション の投稿を表示しています。 すべての投稿を表示

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年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
って出力された.
おお,すごいぞ.

2010年11月1日月曜日

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

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

2010年7月27日火曜日

DropBox

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

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

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

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年1月20日水曜日

学会タイマーOnline

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

さあ,みんな使って!w


学会タイマーOnline

2009年9月28日月曜日

ワードで参照を一気に更新する

ワードでリストの番号を相互参照をしたあと,
リストの順番を入れ替えてもTeXのようには自動的に番号を入れ替えてくれない.
なんのための相互参照なんだか.

というわけで,リストの順番を入れ替えたときに参照箇所の数字も入れ替える方法.

全選択(ctrl+A)→F9.

で良いらしい.
とは言っても実際はあんまりうまく動かないっぽい.

とりあえず,ワードでは相互参照を使わない方がよいということか.

2009年3月31日火曜日

MySql:テーブルの設定の取得

某SNSのデータ,CSVファイルで管理していたのですが,
いい加減データベースを用いて管理したくなったので,OpenPNEのSQL文を取得してみることにしました.
テーブル設定のSQL文を取得するのは比較的簡単で,こんな感じ.


mysql> show create table table名


このSQL文から必要部分をピックアップしてテーブルを再構築してみたいと思います.

Wordで上書き

OS再インストールとともに,Wordも再インストールしたのですが,なんか今までと挙動が違う.
何が違うのかと思っていたら,どうも文字列を選択して別の文字を入力したとき,上書きされないようになっていました.
普通,ある文字列を選択して,別の言葉を入力すれば前の文字列は消去されて,新しい文字列が書き込まれますよね.それが,なぜか前の文字は残ったままで新しい文字が挿入されてしまっていました.
慣れればそれでもいいのかもしれませんが,どうにも使いづらい.
というわけで,どう設定すればいいのか調べてみました.

結果.
ツール→オプション→編集と日本語入力→「選択した文字列を置換入力する」にチェック
としたところ,無事上書きされるようになりました.
やっぱりWordはよくわからん・・・

2009年3月26日木曜日

Adobe Acrobatの悲劇

仕事柄PDFファイルを作ることが多いので,AcrobatのProfessionalを持っています.
当然XP再インストール後もAcrobatをインストールしようと思うわけですよ.
が,ライセンスキーを入れて,さて使おうか,と思ったら認証に失敗します.
あれ?と思って調べてみたら,どうも以前のPC(OS)でアクロバットを認証していたため,今回のOSにインストールしようとすると,二重インストールになるという扱いになるみたいです.
なんてこったい!
しょうがないので,認証解除しようと思ったのですが,なんと,最初にインストールしたPCで認証解除しないと,もう解除できないようなのです.
ということは,このacrobat,どうやっても二度と復旧できないということになりそうです.
高いのに・・・また買わないと駄目なのかもしれません.
なんか納得いかない.

2009年2月24日火曜日

無駄時間を費やすのをやめるぞ~!!!

研究が進まないと,ついついどうでもいいページを見てしまって気がついたら時間が足りなくなっているということが多くなってきたので,自分を律して無駄なHPを見ないようにしようと心に決めて早半年以上.
いまだに自分ひとりでは実現できないため,特定のサイトを見られないようにするアプリケーションとかないのかしらと思って調べてみたら,ありました.
FireFoxのプラグインで,そのものずばり,
「特定の時間だけ特定のサイトにアクセスできなくさせる」
機能を持ったものが.
う~ん,世の中の人は皆同じような悩みを抱えているんですね.
というわけで,今回導入したプラグインは,
LeechBlock」です.
ドメインと時間と曜日を指定して時間つぶしなページを見られないように設定できます.
時間は任意に複数時間を指定できるため,
「9時~12時,13時~17時は見られない」
という設定も可能です.

また,パターンは全部で6種類選べるので,用途に応じてアクセス禁止条件を変更してページを指定することも可能というすぐれもの.
指定できるのは「domain names of the sites」と書いてあるけど,ディレクトリまで指定できるので,特定のブログだけ見られなくすることも可能です.
気がつけば時間を使ってしまっている方にお勧めです.
と言っても,今日から使い始めたばかり.
いつまで耐えられるかな・・・