Yahoo Blog APIを利用してみる

久しぶりにYahoo devのサイトを見てみたところYahoo Blog APIなるものが2010/3/4に追加されてたので、なんとなくRuby用クラスを作ってみました。

ただ、ブログ情報検索なのだから日付指定フィールドは欲しいところですね。。日付指定項目ってのがありますが、これは最近1週間のBlog情報とかだから個人的にはそんなに必要でなかったり。

下記はてきとーに作ったソースだったり

# -*- coding: utf-8 -*-

require 'open-uri'
require 'cgi'
require 'rexml/document'

# Yahoo Blog API用のクラス
class Yahoo_blog_search

  YAHOO_BLOG_SEARCH_URL = "http://search.yahooapis.jp/BlogSearchService/V1/blogSearch"
  APPID                 = "取得したAPPID"

  def initialize(query = "", results = 50, start = 1 , type = "all")

    @yahoo_api_query = ""    

    @query   = query
    @results = results
    @type    = type
    @start   = start

    @total_results_num = ""

    @raw_search_results_data   = ""
    @rexml_search_results_data = ""

    @search_results_data       = []
    @search_all_results_data   = []
  end

  ################# クエリの作成 + 実行 ##############################

  def build_query
    @yahoo_api_query = "#{YAHOO_BLOG_SEARCH_URL}?appid=#{APPID}&query=#{CGI.escape(@query)}&results=#{@results}&start=#{@start}&type=#{@type}"
  end

  def execute_query
    @raw_search_results_data = open(@yahoo_api_query) {|f| f.read }
    @rexml_search_results_data =  REXML::Document.new @raw_search_results_data
  end


  ################# 取得したデータから特定の情報を取得する関数群  ########
  def get_total_results_available
    @total_results_num = @rexml_search_results_data.elements["/ResultSet"].attributes["totalResultsAvailable"]
  end

  def get_total_results_returned
    @rexml_search_results_data.elements["/ResultSet"].attributes["totalResultsReturned"]
  end

  def get_first_result_position
    @rexml_search_results_data.elements["/ResultSet"].attributes["firstResultPosition"]
  end


  def get_processing_data
    @search_results_data.clear

    resultset = @rexml_search_results_data.elements["/ResultSet"]
    resultset.elements.each("Result") do |i|
      tmp_result = {}

      tmp_result["Id"]          = i.elements["Id"].text 

      tmp_result["RssUrl"]      = i.elements["RssUrl"].text

      tmp_result["Title"]       = i.elements["Title"].text

      tmp_result["Description"] = i.elements["Description"].text

      tmp_result["Url"]         = i.elements["Url"].text

      tmp_result["Creator"]     = i.elements["Creator"].text

      tmp_result["mobileLink"]  = i.elements["mobileLink"].text

      tmp_result["SiteTitle"]   = i.elements["Site/Title"].text

      tmp_result["SiteUrl"]     = i.elements["Site/Url"].text

      tmp_result["DateTime"]    = i.elements["DateTime"].text
      @search_results_data << tmp_result
    end
  end

  ################ 指定したクエリに関するブログ情報をすべて取得する ##################
  def get_all_processing_data

    @search_all_results_data.clear

    @results = 50
    @start   = 1

    build_query
    execute_query
    end_block = get_total_results_available.to_i / @results

    (0..end_block).each do |i|
      @start = 50 * i + 1 
      build_query
      execute_query
      get_processing_data
      #puts @search_results_data
      @search_all_results_data.concat @search_results_data
    end
    
    @search_all_results
  end

  # APIの実行結果に関する変数
  attr_reader :total_results_num, :search_results_data, :search_all_results_data
  # クエリの設定に関する変数
  attr_accessor :query, :results, :type, :start
end

if __FILE__ == $0

  yobj = Yahoo_blog_search.new("それはそれはそれは", 15, 3)
  
  yobj.build_query
  yobj.execute_query
  
  puts "検索結果数 " << yobj.get_total_results_available
  puts "取得したデータの数 " << yobj.get_total_results_returned
  puts "取得したデータの初めのインデックス " << yobj.get_first_result_position

  yobj.get_processing_data


  # 特定クエリに関するブログ情報を全て取得する 
  yobj.get_all_processing_data

  puts "取得したブログ数 " << yobj.search_all_results_data.size.to_s

  yobj.search_all_results_data.each do |i|
    puts "タイトル " << i["Title"]
  end

end

実行結果は以下のような感じです

検索結果数 84
取得したデータの数 15
取得したデータの初めのインデックス 3
取得したブログ数 84
タイトル 6月11日(金)のつぶやき                 

とりあえずgistに貼っつけますた。
rexml使ってるので多少遅いかと

[R] Rで複数の図を重ねる + 右側のy軸に説明を加える

やってみると、意外と面倒だったのでメモをうpしておきます。
ナニが面倒かというと、parで余白設定したり、右軸のy軸の目盛をaxisで描いたりその他色々。R Tipsという本参考

par(mar = c(5, 4, 5, 4)) # 余白設定(デフォルトだと右側の余白が狭いので広くしておく)
plot(1:10, main="baka", ylab = "hahaha")
par(new = T) # 図を重ねるため
plot(0:10, dbinom(0:10, 10, 0.3), type = "l", axes = F, ann = F) # axes, annは軸に何も描かないようにFalse設定
axis(4) # 右側のy軸に目盛を表記
mtext(text = "hehehe", side = 4, line = 3) # 説明を加える

legend(locator(1), legend = c("nanika", "ne"), lty = 1:2)

あと、年度データも作り方忘れやすいので備忘録的な意味であげておいたり

(first.day.2009 <- as.Date("2009-01-01"))

(day.2009 <- seq(first.day.2009, len = 365, by="1 day"))
(week.2009 <- seq(first.day.2009, len = 52, by="1 week"))
(month.2009 <- seq(first.day.2009, len = 12, by="1 month"))

Macでの日本語画像保存方法も備忘録。quartz()とかquartzFonts()のマニュアルにやり方は書いてますが

quartz(file = "tee.jpeg", type = "jpeg")
quartz(file = "tee.pdf", type = "pdf")
par(family = "AppleGothic")
par(family = "Hiragino Kaku Gothic Pro W3")
plot(1:10, main = "あほう")
dev.off()

[cscope][emacs] cscopeをほぼ全ての言語に対応する方法

cscopeはそこそこの規模~大規模ソースを読むツールとしては秀逸なんですけど、デフォルトだと基本C, C++くらいに対応?しているのみで別言語は個別処理する必要があって、それをどうしたものかと考えていてググッた結果、いい記事(http://groups.google.com/group/vim_use/browse_thread/thread/b3cf5f5f66ce2ca6?pli=1)を発見して対処してみました。(ちなみにemacs用のcscope設定なのであしからず)

まず取り敢えずはcscope dbに入れておきたいファイルをまとめる

find . -name "*.py" > cscope.files

そして,cscope.filesを元にcscope db作成

cscope -b

cscope.outがこれで出来上がります。ちなみに、結構な行数になるはずです。
あとは、cscope-modeをマイナーモードとして利用したい言語にフックさせる(.emacsに追加)(xcscope.el参照の事)

(add-hook 'python-mode-hook (function cscope:hook))

ちなみにデフォルトだと以下の3つのモードのみに対応してます.(interactiveでcscope-modeになるようにはなってません. まあ、変更したければした方がいいかも。。)(ちなみにphp-modeとかはc-mode利用してるんでhookしなくても使えたりします。)

(add-hook 'c-mode-hook (function cscope:hook))
(add-hook 'c++-mode-hook (function cscope:hook))
(add-hook 'dired-mode-hook (function cscope:hook))

で、こんな感じで設定したらあとはCとかC++でcscope使う感じで別言語にも対応できてるはずです。まあなかなか便利。
特にRailsとかSymfonyとかのフレームワーク開発の時便利な気がしますね。

ちなみに別話ですが,emacsでcscope-indexer実行時エラーになる時はcontribのcscope-indexerがPATHに入っていないのがエラー原因になることが多いらしいので備忘録。

[PHP] PHPでtwitter OAuthをする方法など

なんとなく調べたのでうpしときます。たぶんtwitteroauthライブラリ使うのが楽だと思います。今回はローカル開発環境でOAuth認証という事にとりあえずしときます。

作業環境はローカルアクセスで127.0.0.1/testにいると仮定しておきます。
まずは127.0.0.1/testフォルダがある位置で,

git clone git://github.com/abraham/twitteroauth.git

を実行します。するとtwitteroauthフォルダが出来ます。

次に

次にtwitteroauth/config.phpを編集します。

define('CONSUMER_KEY', '取得したの');
define('CONSUMER_SECRET', '取得したの');
define('OAUTH_CALLBACK', 'http://127.0.0.1/php/twitteroauth/callback.php');

後は,http://127.0.0.1/test/twitteroauthにbrowser経由でアクセスして,sign in with twitterボタンを押します.
すると、アプリ認証しますかという画面が出てくるのでここでYESを押すとcallback.phpにリダイレクトされて、ユーザー情報が色々と表示されるかと思います。 

作業的にはこれで終了

あとは、サンプルコード(index.phpにある)やtwitter api, twitteroauthにあるファイルを一通り見ておけば良いかと。特にsession周り

/* Some example calls */
//$connection->get('users/show', array('screen_name' => 'abraham')));
//$connection->post('statuses/update', array('status' => "ohoho"));
//$connection->post('statuses/destroy', array('id' => 5437877770));
//$connection->post('friendships/create', array('id' => 9436992)));
//$connection->post('friendships/destroy', array('id' => 9436992)));

単純なCLIENT(PINCODEでトークン入手ver)は以下のような感じでやるといいかと思います。
http://zisakuzien.exblog.jp/12089922/

あと、twitter検索はなんか別系統らしいので違う感じで利用しなければいけないっぽいです。

まあ単純にjson(atomもあり.. json推奨?)ファイル取得してデータ加工するだけっぽいですけど

とりあえず今のところはrubyなどつかって以下のような感じで

# -*- coding: utf-8 -*-
require 'rubygems'
require 'json'
require 'open-uri'
require 'cgi'

data = JSON.parse(open("http://search.twitter.com/search.json?q=#{CGI.escape(ARGV[0])}").read)
data["results"].each {|i| puts i }

 [Emacs] 最近のterm-modeの設定など

 
EmacsのTerm-mode + Multi-term-modeは非常に便利でMac使いだとTerminalとかiTermとかの存在意義が殆ど無くなるほど強力なのですが、Emacsとのbuffer間の連携にちょいとデフォだと問題があるので、最近加えた変更などうpしておきます

(add-hook 'term-mode-hook '(lambda ()
			     (define-key term-raw-map "\C-y" 'term-paste)
			     (define-key term-raw-map "\C-q" 'move-beginning-of-line)
			     (define-key term-raw-map "\C-r" 'term-send-raw)
			     (define-key term-raw-map "\C-s" 'term-send-raw)			     
			     (define-key term-raw-map "\C-f" 'forward-char)
			     (define-key term-raw-map "\C-b" 'backward-char)			     
			     (define-key term-raw-map "\C-t" 'set-mark-command)			     
			     (define-key term-raw-map (kbd "ESC") 'term-send-raw)
			     (define-key term-raw-map [delete] 'term-send-raw)
                             (define-key term-raw-map "\C-z"
                               (lookup-key (current-global-map) "\C-z"))))

内容としては移動 + コピペ関連はEmacs固有の関数を使う事で対処。 + VimやViを使った時にESCがEmacs側に奪われるのに問題があるということでESCを'term-send-rawにした感じです。あとは[delete]も'term-send-rawにしておきます。

ちなみにTerm-modeの拡張方法は基本的に以下の二種類に分けることが出来て、

  1. Emacsに割り当てられているキー割り当てをTerm側に割り当てたい(この場合はtem-send-rawを割り当てる(まあESCとdeleteくらいしか設定する必要ない?かと思いますが))
  2. term-mode内で、特定のキーバインドEmacsの関数を割り当てる(設定の大部分はこっちになるはず。この場合はdescribe-key(C-h k)などを実行して普段Emacsで実行しているコマンドをterm-mode内のキーバインドにする。

という感じです。まあ上記の設定くらいやっておけば最低限のバッファ間共有は出来ると思いますが。(Term内部VimEmacs間の交流とか, Termで実行したコマンド出力結果をEmacsの別バッファにペーストするとか)

まあそんなとこ

非常にどうでもよい事など

  • 去年はBlogとか放置してたんですけど個人wikiにはヒソヒソとやっていたHaskellとかCommon LispとかOcamlとかErlangとかAIとか機械学習とかデータマイニングの本のまとめを結構していたりするのできちんとまとめたものを今後似たような感じで書いていくやも。 たぶんParadigms of Artificial Intelligence Programming: Case Studies in Common Lispのまとめを次にやろうかと思っていたりしたり(900P以上あるが。。)。。 まあたぶん日本のBlogとかであまり言及の無い洋書のまとめを中心にやる予定。