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()
よく使うwgetオプションなど
メモ
wget --http-user=ohoho --http-passwd=hohoho -r -A pdf -l 2 --restrict-file-names=nocontrol http://hehehhehehehehe
[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フォルダが出来ます。
次に
- https://twitter.com/appsでアプリ作成.
- callbackは以下のような感じで設定http://127.0.0.1/php/twitteroauth/callback.php
- 後は適当に設定してアプリを作成すると,CONSUMER_KEYとCONSUMER_SECRETをゲットできます。
次に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の拡張方法は基本的に以下の二種類に分けることが出来て、
- Emacsに割り当てられているキー割り当てをTerm側に割り当てたい(この場合はtem-send-rawを割り当てる(まあESCとdeleteくらいしか設定する必要ない?かと思いますが))
- term-mode内で、特定のキーバインドにEmacsの関数を割り当てる(設定の大部分はこっちになるはず。この場合はdescribe-key(C-h k)などを実行して普段Emacsで実行しているコマンドをterm-mode内のキーバインドにする。
という感じです。まあ上記の設定くらいやっておけば最低限のバッファ間共有は出来ると思いますが。(Term内部VimとEmacs間の交流とか, Termで実行したコマンド出力結果をEmacsの別バッファにペーストするとか)
まあそんなとこ
非常にどうでもよい事など
- 去年はBlogとか放置してたんですけど個人wikiにはヒソヒソとやっていたHaskellとかCommon LispとかOcamlとかErlangとかAIとか機械学習とかデータマイニングの本のまとめを結構していたりするのできちんとまとめたものを今後似たような感じで書いていくやも。 たぶんParadigms of Artificial Intelligence Programming: Case Studies in Common Lispのまとめを次にやろうかと思っていたりしたり(900P以上あるが。。)。。 まあたぶん日本のBlogとかであまり言及の無い洋書のまとめを中心にやる予定。