Ruby

2012年08月18日

sinatraを一から勉強し直している。
Ruby on Railといったフレームワークをちゃんと使ったことがないから、理解していないことが多すぎる。 ということで、sinatraの基本的な使い方として、以下をまず始めに学ぶことにした。

  1. deply環境の切り替え方法
  2. auto reloadを使えるようにする方法

auto reloadは、ソースコードを変更したとき、アプリケーションサーバを起動し直さなくても、自動的に再読み込みをしてくれるので、try&errorをするときの作業効率が全く違う。是非早めにマスターしておきたい。
deploy環境の指定ができるようになると、プログラム中で環境に応じた処理を分岐させることができる。
開発環境では、reloaderを有効にするが、本番環境では無効にするとか、開発環境の場合にdebug用の出力を出す、とかを簡単に切り替えられて楽になる。

で、いきなりつまずいた。

sinatraでのdeploy環境は、以下の3つから選択することとなる。

  • 開発環境:development
  • テスト環境:test
  • 本番環境:production

環境を指定するには、コードの最初の方で以下のように宣言しておく。

set :environment, :production

環境の指定は、rubyを実行する時の-eオプションで指定することもできる。

ruby app.rb -e production

使い方は、それ以降でdevelop?もしくはproduction?メドッドで判別し、trueかfalseが返るので、それで条件分岐させる。

@debug="checkpoint通過" if development?

このdevelopment?やproduction?やtest?というメッソッドは、sinatra/base.rbの中で以下のように定義されている。

def development?; environment == :development end
def production?;  environment == :production  end
def test?;        environment == :test        end

さて、このenvironment変数に入っている環境指定のシンボルをどうやって参照するかも試した。
マニュアルによれば、settings.environmentで取れるはずだ。

しかし、settings.environmentで得た結果と、production?で得た結果が異なるのである。
例えば、以下のようなコードでは。

# encoding: utf-8
require 'rubygems'
require 'sinatra'

set :environment, :production

class App < Sinatra::Base

  configure :development do
    require 'sinatra/reloader'
    register Sinatra::Reloader
  end

  get '/' do
    @messages="hello world with sinatra/reloader"
    @mode="environment is " + settings.environment.to_s
    @debug1="debug: production?="  + production?.to_s  if production?
    @debug1="debug: development?=" + development?.to_s if development?
    erb :envtest
  end
end

App.run!

出力はこうなる。

environment is development
debug: production?=true

一方、以下のようにclass定義内にset文を入れると、

# encoding: utf-8
require 'rubygems'
require 'sinatra'

class App < Sinatra::Base
  set :environment, :production

  configure :development do
    require 'sinatra/reloader'
    register Sinatra::Reloader
  end

  get '/' do
    @messages="hello world with sinatra/reloader"
    @mode="environment is " + settings.environment.to_s
    @debug1="debug: production?="  + production?.to_s  if production?
    @debug1="debug: development?=" + development?.to_s if development?
    erb :envtest
  end
end

App.run!

このようになる。

environment is production
debug: development?=true

この違いがわからないまま、今に至る訳である。
class定義の外でsetしたものはクラス変数に入り、内側でsetしたものはインスタンス変数に入るのだろうか。 そして、settingsはインスタンス変数を見ているが、?メソッドはクラス変数を見ていると考えれば、合点はいくが、なぜそんなふうになっているのかは謎。
実用上は、production?メドッドで分岐させることが多いはずなので、classの外側で定義しておけば問題ない。

また、ruby起動時の-eオプションで指定した場合も、前者(classの外側で定義)と同じ動きをする。
ややこしいことに、configure 〜 do は、内側で定義した:environmentで判断されるようだ。

では、外側で定義した:environmentの値を、内側の:environmentに代入するような仕組みにすればいいかと思ったが、どうもそれもうまく動かない。
結局、rubyの思想に反するが、両方で定義しておくのが安定しそうだ。
 

ちなみに、reloaderの読み込みは、上記コード内のconfigureブロックの中で書いてあるとおり。
参考は以下。



sylphide_ffr31mr at 20:12コメント(0)トラックバック(0) 

2012年07月30日

OS Xでgem installをしようとすると、以下のようなエラーが出てしまう。 調べてみると、gccを入れるとか、Xcodeを最新にするとか、いろいろ対策がでてくる。 入れようとするgemも、mysql関係や、hpricot関係やらと、千差万別だが、エラーメッセージは 同じようだ。

$ sudo gem install evernote
Building native extensions.  This could take a while...
ERROR:  Error installing evernote:
	ERROR: Failed to build gem native extension.

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/ruby.h


Gem files will remain installed in /Library/Ruby/Gems/1.8/gems/thrift-0.8.0 for inspection.
Results logged to /Library/Ruby/Gems/1.8/gems/thrift-0.8.0/ext/gem_make.out

結論としては、XcodeでCommand line toolsを入れれば、必要なライブラリが入るようだ。 入れ方は、Xcodeを起動して、Xcodeメニューから。

Xcode-->open developer tool-->More developper tool-->safariが開く-->OSに合わせたCommand line toolsをインストール

このインストールが終わると、以下が実行可能となった。

$ sudo gem install evernote
Building native extensions.  This could take a while...
Successfully installed thrift-0.8.0
Successfully installed thrift_client-0.8.1
Successfully installed evernote-1.2.1
3 gems installed
Installing ri documentation for thrift-0.8.0...

Enclosing class/module 'thrift_module' for class BinaryProtocolAccelerated not known

Enclosing class/module 'thrift_module' for class BinaryProtocolAccelerated not known
Installing ri documentation for thrift_client-0.8.1...
Installing ri documentation for evernote-1.2.1...
Installing RDoc documentation for thrift-0.8.0...

Enclosing class/module 'thrift_module' for class BinaryProtocolAccelerated not known

Enclosing class/module 'thrift_module' for class BinaryProtocolAccelerated not known
Installing RDoc documentation for thrift_client-0.8.1...
Installing RDoc documentation for evernote-1.2.1...


sylphide_ffr31mr at 23:33コメント(0)トラックバック(0) 

2010年10月23日

プログラムをそれなりに多人数で開発する時のバージョン管理はけっこう難しい。
少し前まではsubversionとかが使われていたらしいが、最近はgitが定番になっているようだ。
Linux Kernelの開発にも採用され、githubという(いまのところ)フリーで使えるサービスもある。

ぼくのような趣味でやっている日曜プログラマには、バージョン管理など不要であるが、ソースを公開するのには便利そうなので使ってみることにした。
ブログでソースを公開するとき、HTML的に適切でないコード(不等号記号やら)が入っていると、ブラウザが正しくソースを表示してくれない。そのため、あらかじめそうした記号は、HTML的に正しく表示できるように変更しておく必要がある。
こうした便利なサイトもあるので利用しているが、それでもけっこう面倒だ。
githubのような、こうしたソースファイルを管理してくれて、ダウンロードの仕組みがあるのはうれしい。

ということで、以前作成した、rubyスクリプト「RMagickを使った画像加工ツール群」をgithubにuploadした。
http://github.com/yasuki/rmagick-tools

以下は、githubを使えるようにするまでのメモ。
詳しくは、以下のサイトで勉強してください。(ぼくもまだ、よくわかっていない)
http://d.hatena.ne.jp/pneumaster/20090615/1245045677
http://d.hatena.ne.jp/keita_yamaguchi/20080409/1207752188

 

1.事前準備

使う端末に、gitコマンドをインストールする。
sudo apt-get install git
git config --global user.name "<USERID>"
git config --global user.email <YOUR@MAIL.ADDR>

githubとは、sshでファイルをアップロードするので、ssh key pairを作っておく。
後ほど、この公開鍵を、githubに登録する。
ssh-keygen -t rsa -C "<YOUR@MAIL.ADDR>"

パスフレーズもちゃんといれる。
~/.sshの下に、id_rsaとid_rsa.pubができるので、id_rsa.pubが後ほど登録する公開鍵。

2.サインアップとリポジトリの作成

http://github.com/ にアクセスし、sign up。
ログインをして、dashboardを見ると、Create a Repositoryというのがあるので、そこで公開したいソースファイルのリポジトリを作成する。

3.アップロードテスト

すると親切に、次に何をするかを教えてくれる。
アップロードしたいファイルを入れるリポジトリ用のディレクトリを掘り、
そこをカレントディレクトリとして、以下のコマンドをいれる。
次の手順:
mkdir <NEW_REPO_NAME>
cd <NEW_REPO_NAME>
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin git@github.com:<USERID>/<NEW_REPO_NAME>.git
git push origin master

すると、READMEファイルがgithubのリポジトリにアップロードされた。

4.アップロード

いよいよ、公開したいソースファイルをアップロードする。
上で作ったディレクトリに、アップロードしたいファイルをコピーし、以下のコマンドを入れる。
git add .
git commit -a
git push


sylphide_ffr31mr at 23:32コメント(0)トラックバック(0) 

2010年08月18日

GAE上でsinatraとoauthとtwitter

GAE上のjrubyプログラムでクライアントからの値を取れるようになったので、次はいよいよ他のサービスとの通信だ。 しかし、他のサービスとの通信をするには、認証という大きな壁がある。
一番簡単そうなtwitterで遊んでみることにする。
twitterは、今月(2010-08)にbasic認証を終了するとアナウンスしているので、oauthを使う。 oauthのお勉強はこちらなど。

まずは、環境の確認の意味で、こちらのプログラムを動かしてみる。

しかし、なかなか素直に動かない。
試行錯誤すること3日。
あちこちを参考にするが、つまづきまくる。

結果としては、原因が2つあったようだ。

一つは、appengine gemでjrubyへライブラリを組み込むとき、appcfg.rb bundleをするが、gemの依存関係の処理がうまくいっていないようだ。 依存gemをGemfilesに書いてあげることで、gemのloadはクリアできた。

二つ目の原因は、twitter gemとoauth gemの2つをrequireしていたのだが、twitter gemにoauthのクラスが組み込まれており、oauth gemと競合していた。require twitterのみにして解決した。

あと、GAEの特徴として、Net::HTTPが素のままでは使えないという問題もあるが、これもgoogle-appengineが解決してくれているので、今や意識しなくてよいようだ。

動作環境は以下。

$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]
$ gem list

*** LOCAL GEMS ***

appengine-apis (0.0.18)
appengine-rack (0.0.11)
appengine-sdk (1.3.5)
appengine-tools (0.0.15)
bundler08 (0.8.5)
crack (0.1.6)
google-appengine (0.0.15)
hashie (0.2.2)
httparty (0.5.2)
jruby-jars (1.5.1)
jruby-rack (1.0.2, 1.0.1)
oauth (0.4.1)
rack (1.2.1)
ruby-hmac (0.4.0)
rubyzip (0.9.4)
twitter (0.9.8)
yajl-ruby (0.7.7)

Gemfilesとrequireリストは、以下になる。

$ more Gemfile 
# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"

# List gems to bundle here:
gem 'appengine-rack', '0.0.11.pre'
gem 'appengine-apis'
gem 'sinatra'
gem 'httparty'
gem 'yajl-ruby'
gem 'jruby-openssl'
gem 'twitter'

$ cat sample.tw.rb
require 'rubygems'
require 'openssl'
require 'twitter'
(以下略)
まちゅダイアリー Sinatra と OAuth を使って Twitter のタイムラインを取得してみたのソースが続く


sylphide_ffr31mr at 20:10コメント(0)トラックバック(0) 

2010年07月21日

GUIクライアントを作りたいで愚痴ったように、Evernote関係のGUIツールを作りたいと思っている。自分の素人なプログラミングの実力を考えると、あまり複雑なアーキテクチャにはできない。
そこそこ使い勝手のいいGUIを備えて、簡易に作るにはどういうアーキテクチャがいいかを考えていたのだが、以下のような構成にしようと心が決まった。

  • 容易で効果的なGUIということでは、ブラウザでJavascript(AJAX)を使う。
  • WEBアプリケーションとし、サーバ基盤はGoogle App Engineを使う。
  • サーバサイドプログラムはrubyとする。

サーバを必要としない伝統的なクライアントプログラムでいくのをやめてwebアプリにしたのは、実行環境の問題もあるが、一番の理由は流行っているから。
流行っていることで、ライブラリやドキュメントが充実していくので、プログラムを作る労力もだいぶ違う。 一ヶ月ほど、20世紀末ごろ流行のクライアントサーバモデルでのアーキテクチャで、gtkなどを使って作ろうともがいてみた結果の結論である。
また、ブラウザのアドオンやextensionで、クライアントを作ってしまうことも考えたが、JavascriptオンリーでEvernoteにアクセスできない(困難)ことがわかって、やっぱりあきらめた。

プログラムに使う言語については、以下の条件により決めた。

  • EvernoteのAPIアクセスをするライブラリで言語が限られる。現在、C#,JAVA,php,python,rubyしかない。
  • Google App Engineは、JAVAかpythonしか動かない。
  • ぼくはrubyしかわからない。

rubyを捨てて、pythonを勉強するのが、GAEとEvernote的には最もわかりやすいのであるが。
ただでさえクライアントサイドのJavascriptを勉強しないといけないのに、サーバサイドの言語まで勉強しなくてはならないとなると、どこから手をつけていいかわからない。激しくモチベーション低下するので、なんとかrubyは残したいとしばらく葛藤していた。
GAE上のJAVA内でrubyを動かす方法があることはわかっていたが、コンパイルやら何やら、JAVA環境の知識がいるので、敷居が高い。
ところが数日前、「あきらめなくていいよ」という声が聞こえてきた。

10分ではじめる GAE/JRuby (OAuth + Sinatraのサンプル)

rubyライブラリで、Google App Engineを使うことができるgemがあるとのこと。すごい!
使えるかどうか(自分の実力に対して)、注意深く読んでいくと、すごく簡単そう!
ということで、上記のアーキテクチャでいけるめどがついたのである。

早速、期待のgemをインストールして、jrubyで"hello world"をやってみる。
googleへの開発者登録などGAEを使う環境は、以前、pythonで"Hello world"をやったことあるので、既に用意してある。
とはいえ、google-appengine gemは、まだ発展途上にあるgem。一筋縄でいかない。
webにある記事のやり方から変わっていたり、環境が悪かったり、なんだかんだでエラーが出る。
以下のサイトを参考にしつつ、しばし試行錯誤。

なんとか、hello worldの表示ができるようになった。
以下は、手順の自分メモ。

1. appengine-jruby gemのインストール

    % sudo gem install google-appengine

    使ったバージョンは、以下である。

    $ gem list|grep "appengine\|rack\|bundler\|jruby"
    appengine-apis (0.0.18)
    appengine-rack (0.0.11)
    appengine-sdk (1.3.5)
    appengine-tools (0.0.15)
    bundler08 (0.8.5)
    google-appengine (0.0.15)
    jruby-jars (1.5.1)
    jruby-rack (1.0.1)
    rack (1.2.1)
    

2. "hello world"プログラムの設定とソースを作成

    最初に、プログラムを作るディレクトリを、どこかに作る。このディレクトリ名がアプリケーション名になる。

    % mkdir jruby-hello-maarui
    % cd jruby-hello-maarui

    % cat config.ru (ファイル名は固定)
    require 'appengine-rack'

    run lambda { Rack::Response.new('Hello World by <a href="http://maarui.doorblog.jp/">Maarui-shippo</a>') }

3. 設定ファイルapp.yamlの作成

    % cat app.yaml
    application: jruby-hello-maarui
    version: 1
    runtime: jruby

    ここで、application名は、ディレクトリ名と同じにしておく。

4. ローカル内のサーバを起動

    appengine-jruby gemのすごいところは、サーバ起動前に、jrubyを起動するための設定ファイルや必要gemのインストールなど、全てをやってくれる。

    $ dev_appserver.rb .

    いろいろメッセージやらエラーやらが出るが、そこは無視して、"The server is running at http://localhost:8080/"というメッセージが出るまで待つ。

    ブラウザでhttp://localhost:8080/にアクセスし、動作テスト。

5. GAEへアップロード

    事前に、GAEのDashboardでアプリケーション名と同名のアプリケーションを作成しておかないとアップロードエラーが出る。

    % cd ..
    % appcfg.rb update jruby-hello-maarui

6. 動作確認

画面が表示されるのに、数秒かかるのは、GAE内のJAVA仮想マシンでjrubyが起動するためだと思われる。この際、いたしかたあるまい。

さぁ、次は、sinatraに挑戦だ。



sylphide_ffr31mr at 22:03コメント(0)トラックバック(0) 

2010年05月25日

Evernoteから簡単にノートを取り出すスクリプトをバージョンアップした。
動作環境の準備については、前のエントリを参照していただくとして。

使い方は、以下のとおり。
キーワードを1つ引数で指定し、そのキーワードにマッチするノートのリストを得る。 そして、最初にヒットしたノートの本文を表示する。
キーワードと工夫し、よく参照するノート固有のキーワードをタグなどでつけておけば、webやクライアントを起動することなくノートの内容を簡単に参照できる。

$ ruby note.rb KEYWORD

以下のオプションを追加した。

-gノートの識別子GUIDを直接してしてノートを取り出す。GUIDは、キーワードサーチしたときのノートリストにタイトルと共に表示している。
-rノートを表示するときに、
タグを外したり、アンパサンドや不等号マークなどを変換して表示しているが、このオプションを付けると、そうした変換をせず、そのまま表示する。

-gオプションをつけて、GUIDを直接指定する場合は、以下のようになる。

$ ruby note.rb -g aaaaa-bbbbb-cccccc-ddddd-eeeeeeeee

ソースコード

note.rb
#!/usr/bin/ruby
#
# Evernote Simple note searcher
# ver.1.4 2010-05-25 Yasuki
#
require 'rubygems'
require 'optparse'
require 'pp'
require "thrift"
require "Evernote/EDAM/user_store"
require "Evernote/EDAM/user_store_constants.rb"
require "Evernote/EDAM/note_store"
require "Evernote/EDAM/limits_constants.rb"

#
# 引数チェック
if (ARGV.size==0)
puts "Usase: note.rb <SearchWord>"
puts "Usase: note.rb -g <GUID>"
exit 1
end

#
# 初期値
guid=""
raw=0
username="LOGINNAME"
password="LOGINPASSWORD"
consumerKey = "CONSUMERKEY"
consumerSecret = "CONSUMERSECRETKEY"
userStoreUrl = "https://sandbox.evernote.com/edam/user"
noteStoreUrlBase = "http://sandbox.evernote.com/edam/note/"
#userStoreUrl = "https://www.evernote.com/edam/user"
#noteStoreUrlBase = "http://www.evernote.com/edam/note/"

userStoreTransport = Thrift::HTTPClientTransport.new(userStoreUrl)
userStoreProtocol = Thrift::BinaryProtocol.new(userStoreTransport)
userStore = Evernote::EDAM::UserStore::UserStore::Client.new(userStoreProtocol)

#
# 認証
authResult = userStore.authenticate(username, password,
consumerKey, consumerSecret)
user = authResult.user
authToken = authResult.authenticationToken
puts "Authentication was successful for #{user.username}"

#
# ノート取得準備
noteStoreUrl = noteStoreUrlBase + user.shardId
noteStoreTransport = Thrift::HTTPClientTransport.new(noteStoreUrl)
noteStoreProtocol = Thrift::BinaryProtocol.new(noteStoreTransport)
noteStore = Evernote::EDAM::NoteStore::NoteStore::Client.new(noteStoreProtocol)

#
# オプション解析
opt=OptionParser.new
opt.banner="This program is easy evernote searcher."
opt.version="1.4"

opt.on("-g GUID","--guid", "note id.") { |v|
guid = v.to_s
}
opt.on("-r","--raw", "Don't replace specific charactors") { |v|
raw = 1
}
opt.on_tail("-h", "--help", "Show this message.") { |v|
puts opt
exit 1
}
opt.on_tail("-v", "--version", "Show version.") { |v|
puts opt.version
exit 1
}
searchword=opt.parse!(ARGV).to_s

# ノートの検索
if searchword.size >= 1 then
search = Evernote::EDAM::NoteStore::NoteFilter.new
search.words = searchword
res = noteStore.findNotes(authToken, search, 0, 100)
# 検索リストの表示
puts "------------------------"
puts "Find note: " + searchword
puts "------------------------"
res.notes.each do |note|
printf("%s %s\n", note.title, note.guid)
end
guid=res.notes[0].guid
end

# ノート本文の取得
noteEdam=noteStore.getNote(authToken, guid, 1,0,0,0)

#
# ノートの表示
puts "------------------------"
puts noteEdam.title
puts "------------------------"
c=noteEdam.content
bodyHead="<en-note>"
bodyEnd="</en-note>"
body=c[ c.index(bodyHead)+bodyHead.length .. c.index(bodyEnd)-1 ]
if raw==0 then
brTag='<br clear="none"/>'
body.gsub!(brTag,"\n")
body.gsub!("<div>","")
body.gsub!("</div>","")
body.gsub!("&quot;",'"')
body.gsub!("&lt;","<")
body.gsub!("&gt;",">")
end
puts body


sylphide_ffr31mr at 21:48コメント(0)トラックバック(0) 

2010年05月15日

EvernoteのAPI KEYが届いたので、サンプルプログラムをまねして、APIをいじってみた。
API KEYは、申請から7時間後に届いた。(夕方に申請したので、米国が活動時間だったと思う)

1.準備

(1)API KEYの申請

以下のフォームに必要事項を記入して申し込む。

http://www.evernote.com/about/developer/api/

メールで、consumer keyとconsumer secretが送られてくるので、それをプログラムに埋め込む。
最初の段階では、実験用システム(sandbox)にしか登録されないので、デバッグ等をそのシステムで行う。
本番システムのAPI KEYをもらうには、再度申請が必要。その場合も、同じフォームでよい、と思う。案内のメールには、本番用の申請方法は書いてなかった。
sandboxのシステムには、本番と同じくwebアクセスをして、自分でuser IDとパスワードを再登録しないといけない。
ノートも空っぽなので、実験用のノートも新たに作っておかなければならない。

(2)Evernote APIのライブラリをダウンロードする。

$ cd ~/ruby
$ wget http://evernote.s3.amazonaws.com/api/evernote-api-1.15.zip
$ unzip evernote-api-1.15.zip

(3)展開したライブラリにPATHを通す

ふたつのパスを設定することに注意。

$ export RUBYLIB=$RUBYLIB:~ruby/evernote-api-1.15/lib/ruby:~/ruby/evernote-api-1.15/lib/ruby/Evernote/EDAM

2.サンプルプログラム

サンプルプログラムは、以下を使った。というか、rubyはこれしかない。
認証系は、ほぼサンプルのまま。

~/ruby/evernote-api-1.15/sample/ruby/EDAMTest.rb

3.作成するプログラム機能

キーワードを1つ引数で指定し、そのキーワードにマッチするノートのリストを得る。
そして、最初にヒットしたノートの本文を表示する。
キーワードと工夫し、よく参照するノート固有のキーワードをタグなどでつけておけば、webやクライアントを起動することなくノートの内容を簡単に参照できる。

$ ruby note.rb KEYWORD

4.ソースコード


最新バージョンはこちら


note.rb
#!/usr/bin/ruby
#
# Evernote Simple note searcher
# ver.1.1 2010-05-14 Yasuki
#
require 'rubygems'
require 'pp'
require "thrift"
require "Evernote/EDAM/user_store"
require "Evernote/EDAM/user_store_constants.rb"
require "Evernote/EDAM/note_store"
require "Evernote/EDAM/limits_constants.rb"

#
# 初期値
username="LOGINNAME"
password="LOGINPASSWORD"
consumerKey = "CONSUMERKEY"
consumerSecret = "CONSUMERSECRETKEY"
userStoreUrl = "https://sandbox.evernote.com/edam/user"
noteStoreUrlBase = "http://sandbox.evernote.com/edam/note/"

userStoreTransport = Thrift::HTTPClientTransport.new(userStoreUrl)
userStoreProtocol = Thrift::BinaryProtocol.new(userStoreTransport)
userStore = Evernote::EDAM::UserStore::UserStore::Client.new(userStoreProtocol)

#
# Version Check
versionOK = userStore.checkVersion("Ruby EDAMTest",
Evernote::EDAM::UserStore::EDAM_VERSION_MAJOR,
Evernote::EDAM::UserStore::EDAM_VERSION_MINOR)
if (!versionOK)
puts "Is my EDAM protocol version up to date? #{versionOK}"
exit(1)
end

#
# 認証
authResult = userStore.authenticate(username, password,
consumerKey, consumerSecret)
user = authResult.user
authToken = authResult.authenticationToken
puts "Authentication was successful for #{user.username}"
#puts "Authentication token = #{authToken}"

noteStoreUrl =
noteStoreUrlBase + user.shardId
noteStoreTransport = Thrift::HTTPClientTransport.new(noteStoreUrl)
noteStoreProtocol = Thrift::BinaryProtocol.new(noteStoreTransport)
noteStore = Evernote::EDAM::NoteStore::NoteStore::Client.new(noteStoreProtocol)

#
# ノートの検索
search = Evernote::EDAM::NoteStore::NoteFilter.new
search.words = ARGV[0]
res = noteStore.findNotes(authToken, search, 0, 100)

#
# ノートリストの表示
puts "------------------------"
puts "Find note: " + ARGV[0]
puts "------------------------"
res.notes.each do |note|
printf("%s %s\n", note.title, note.guid)
end

#
# ひとつめのノートの表示
bodyHead="<en-note>"
bodyEnd="</en-note>"
brTag='<br clear="none"/>'

guid=res.notes[0].guid
noteEdam=noteStore.getNote(authToken, guid, 1,0,0,0)

puts "------------------------"
puts noteEdam.title
puts "------------------------"
c=noteEdam.content
# puts c
# puts "=============================="
body=c[ c.index(bodyHead)+bodyHead.length .. c.index(bodyEnd)-1 ]
body.gsub!(brTag,"\n")
body.gsub!("<div>","")
body.gsub!("</div>","")
body.gsub!("&quot;",'"')
body.gsub!("&lt;","<")
body.gsub!("&gt;",">")
puts body


5.出力例

$ ruby note.rb tv
Authentication was successful for LOGINNAME
------------------------
Find note: tv
------------------------
TV予約 aaaaa-bbbbb-cccccc-ddddd-eeeeeeeee

------------------------
TV予約
------------------------
[テレビ予約リスト]
ハートキャッチプリキュア 日  8:30 テレビ朝日
花咲ける青少年           日 23:00 NHK BS2
ふしぎ大好き    月  9:00 NHK教育
ドラえもん      金 19:00 テレビ朝日

[ 放送終了]
シュガーバーニーズ 金  8:00 kidsチャネル
とある科学                 土 1:30 MX
キディーガーランド   土 2:30 MX
ささめきこと    木  2:20 テレビ東京
涼宮ハルヒの憂鬱  土  2:30 Tokyo MX
グインサーガ    日 23:29 NHK BS2
ジパング      木 22:30 アニマックス
戦場のヴァルキリア 火 14:00 アニマックス
鉄のラインバレル  水 00:00 Kidsチャネル
電脳コイル     火 20:00 NHK BS2
東京マグニチュード 金  0:45 フジテレビ
夏目友人帳     月 17:30 テレビ東京
亡念のサムド 水 23:30 MX
Monster 金 2:00 Animax
東のエデン 金 00:45 フジ
デスノート   火   23:00 アニマックス
エウレカ 木 23:00 キッズステーション



sylphide_ffr31mr at 20:30コメント(0)トラックバック(0) 
記事検索
最新コメント
livedoor プロフィール
月別アーカイブ
  • ライブドアブログ