RubyからEvernoteAPIを使ってノートブックの取得と、ノートの作成をする

以下参考

APIキーの取得

ここでは、まず、自分の手元で動かしたかったので、「ClientApplication」でAPIキーを発行しました。
WebApplicationを選択した場合、OAuthでの認証が必要になるみたい。また次に試してみます。

Evernote API Overview | Evernote


Evernote API Overview | Evernote
Evernote API Overview | Evernote Photo by meganii



昔は、数日かかってたみたいですが、今は、すぐに発行してもらえました!

sandboxでのユーザ登録(2012/03/6追記)

Evernoteからは、まずsandbox(砂場)でアプリケーションをテストしてから、本番のアカウント使ってねっていうことでAPIキーをもらえるみたい。
っていうことで、まずは、https://sandbox.evernote.comでsandbox用のアカウントを作ります。


gemのインストール

以下のリンクから、EvernoteSDKをダウンロードできて、サンプルプログラムとかも入っています。
http://evernote.s3.amazonaws.com/api/evernote-api-1.20.zip
が、ゆとりは、まずgemを探します笑。
ちょうど、evernoteのgemがあったので、インストール。

gem install evernote

evernote | RubyGems.org | your community gem host

cgs/evernote


アクセストークンの取得

require 'rubygems'
require 'evernote'

user_store_url = "https://sandbox.evernote.com/edam/user"

config = {
   :username => 'YOUR_USERNAME',
   :password => 'YOUR_PASSWORD',
   :consumer_key => 'YOUR_CONSUMER_KEY',
   :consumer_secret => 'YOUR_CONSUMER_SECRET'
         }

user_store = Evernote::UserStore.new(user_store_url, config)

auth_result = user_store.authenticate
user = auth_result.user
auth_token = auth_result.authenticationToken
puts "Authentication was successful for #{user.username}"
puts "Authentication token = #{auth_token}"

取得したAPIキーを、configに反映して、アクセストーンを取得

evernote_ruby ― tmux ― 80×24
evernote_ruby ― tmux ― 80×24 Photo by meganii

ノートブックの取得

存在するノートブックの取得

note_store_url = "http://sandbox.evernote.com/edam/note/#{user.shardId}"
note_store = Evernote::NoteStore.new(note_store_url)

notebooks = note_store.listNotebooks(auth_token)
puts "Found #{notebooks.size} notebooks:"
notebooks.each { |notebook| puts "  * #{notebook.name}"}

ノートの作成

ノートの新規作成。
ノートの作成についてはここを参考にしました。
Atsushi's Homepage 〜 Evernote API を使ってみる

note = Evernote::EDAM::Type::Note.new()
note.title = "test"

defaultNotebook = note_store.getDefaultNotebook(auth_token)
note.notebookGuid = defaultNotebook.guid

	
content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + 
  "<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml.dtd\">" +
  "<en-note>" + 
  "note" +
  "</en-note>"

note.content = content

#note.created = Time.now.getutc
#note.updated = note.created

puts "#{note}"

puts note_store

begin 
  createdNote = note_store.client.createNote(auth_token, note)
rescue Evernote::EDAM::Error::EDAMUserException => ex
  parameter = ex.parameter
  errorCode = ex.errorCode
  errorText = Evernote::EDAM::Error::EDAMErrorCode::VALUE_MAP[errorCode]

  puts "Authentication failed (parameter: #{parameter} errorCode: #{errorText})"

  exit(1)
end

puts "#{createdNote.guid}" 

サンドボックスのノートを確認してみると、作成されました!!
https://sandbox.evernote.com

まとめ

ノートの作成のときに、例外が多発したから、ちゃんと例外処理を書いたら、エラーが判明。例外処理って大事だなって改めて思った。

次にしたいこと

  • WebサービスとしてEvernoteAPIを叩くところをやってみる。

HerokuのチュートリアルからFacebookアプリを作る!

前回のTODOアプリをなんとかFacebookに絡めてみようと思って、Facebookアプリを作ってみる。SinatraでTwitterBootstrapを使ってTODOアプリを作ってみよう - ギークを夢見るじょーぶん男子

Herokuのチュートリアルを参考に作ってみよう!!

Getting Started with Your Facebook App on Heroku | Heroku Dev Center
チュートリアル

アプリケーションの作成

まずは、https://developers.facebook.com/appsから Create New Appで新規作成

なにやら、携帯かクレジットカードの番号を教えろと言われたから、携帯のアドレスを登録

Herokuのクラウドサービスを利用

以下のところから、CloudServiceとして Herokuを選択

Basic - Facebook Developers
Basic - Facebook Developers Photo by meganii

Basic - Facebook Developers
Basic - Facebook Developers Photo by meganii

Rubyを選ぶよ!

Basic - Facebook Developers
Basic - Facebook Developers Photo by meganii

もうできたぁ!!!笑。

すると、なんだか、Sinatraとmogliを使ったFacebookアプリケーションを生成してくれるみたい!!

次回

次は、生成されたこのFacebookアプリを触ってみようと思う。

SinatraでTwitterBootstrapを使ってTODOアプリを作ってみよう

Bootstrap, from Twitter
Bootstrap!!!!


TwitterBootstrapを使ってみたいと思っていたところに、ドットインストールでTwitterBootstrapのレッスンがあることを発見。

Twitter Bootstrap (v2.0)の基礎 - ドットインストール

改めてドットインストールをやって見たけど想像以上だった。動画で今まさに欲しい情報を見ることが出来るのって素晴らしい。Twitter Bootstrap 使ってみようかなぁってところだったので、これで導入がスムーズになりそう。jQueryのレッスンもあったので、受けてみようって思った。

publicフォルダにCSS

最初、layout.erbと同じフォルダにTwitterBoostrapのcssフォルダを置いていて、なんでcssが読み込まれないんだろうと思っててたら、Sinatraでは、publicフォルダに静的ファイルを置く作りになってた。勉強不足...

Static Files
Static files are served from the ./public directory. You can specify a different location by setting the :public_folder option:

set :public_folder, File.dirname(__FILE__) + '/static'
Note that the public directory name is not included in the URL. A file ./public/css/style.css is made available as http://example.com/css/style.css.

Use the :static_cache_control setting (see below) to add Cache-Control header info.

Sinatra: README

SinatraでTODOアプリを作ってみよう

以下参考にさせてもらいました。
I Did It My Way

SinatraからDataMapperを使う(1)動作チェック用のコード - アインシュタインの電話番号☎

Bootstrap

"span6"とかclassの名前を指定するだけで、いい感じにしてしてくれるのは嬉しいですね。

layout.erb

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>To Do List</title>
    <meta charset=utf-8 />
    <link href="css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body>
    <div class="container-fluid">
    <div id="header">
    header
    </div>

   <h1>To Do List</h1>
    <div class="row-fluid">
      <div class="span8" id="main">
      	 <%= yield %>
      </div>
      <div class="span4" id="sidebar" style="background-color:green;">a</div>
    </div>

    <div id="footer">
    footer
    </div>

    </div>    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>

index.erb

<form action="/create" method="POST">
  <label>task</label>
  <input type="text" name="user" id="name">
  <input type="submit" value="Add Task!" class="btn" />
</form>


<% @post.each do |p| %>
   <div class="span6" style="height:100px; margin:0 auto 0 auto">
   <%= p.id %> <br />
   <%= p.user %> <br />
   <%= p.create_at %>
   </div>
<% end %>


Gemfile

source :rubygems
gem 'sinatra'
gem 'dm-core'
gem 'dm-sqlite-adapter'
gem 'dm-migrations'


config.ru

require 'rubygems'
require 'bundler'

Bundler.require

require './app.rb'
run Sinatra::Application


app.rb

# -*- coding: utf-8 -*-
DataMapper.setup(:default, 'sqlite3:db.sqlite3')

class Post
  include DataMapper::Resource
  property :id, Serial
  property :user, String
  property :create_at, DateTime
  auto_upgrade!
end

get '/' do
  @post = Post.all.map{|r| "#{r.id}, #{r.user},#{r.create_at} <br />"} 
  erb :index
end

get '/:id' do
  @post = Post.get(params[:id])
  erb :post
end

get '/create' do
  post = Post.create(:user => params[:user],:create_at => Time.now)
  "#{params[:user]}"
end

post '/create' do
  post = Post.new(:user => params[:user])
  if post.save
    status 201
    redirect '/'+post.id.to_s
  else
    status 412
    redirect '/'
  end
end

こんなのが出来ました。

jQueryを使ったブックマークレットで、TEDからmp4を抽出する

ブックマークレットが自分でサクサク書けるようになりたい。まずは、「TEDからmp4を抽出したい」ってところからブックマークレットのお勉強。

ついでに、jQueryも触ってみたいので、ブックマークレットjQueryを使ってる例を探してみました。

以下のページを参考にさせてもらいました。
jQueryでブックマークレットを書く | ethertank diary
jQueryが読み込まれてるかどうか判定して、もしjQueryが読み込まれていなかったら、googleがホストしているjQueryライブラリを読みこめばよいみたい。Google Libraries API - Developer's Guide - Google Libraries API - Google Code

javascript:(function(){
    if (typeof jQuery == 'undefined') {
        var d=document,
            j=d.createElement('script');
        j.type='text/javascript';
        j.src='http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js';
        j.onload = bml;
        d.body.appendChild(j);
    }else {
        bml();
    }
    function bml(){
        (function($){
            /* 任意のjQueryコード */
        })(jQuery);
    }
})();

ここでは、以下に公開されていたものを使わせてもらうことにする。
jQueryでブックマークレットを書く 3 | ethertank diary

javascript:(function(d, j, b) {
 
    function r() {
        setTimeout(function() {
            (typeof jQuery == 'undefined') ? r() : b(jQuery);
        }, 99);
    }
 
    if (j) b(jQuery);
    else {
        var s = d.createElement('script');
        s.src = '//p.tl/Q9Fz';
        d.body.appendChild(s);
        r();
    }
 
})(document, this.jQuery, function($) {
    $('*').css({'background':'#000','color':'ghostwhite'});
});

その中でも、短縮verを使わせてもらって、jQeuryコードを書いてみる。

javascript:(function(d,j,b){function r(){setTimeout(function(){(typeof jQuery=='undefined')?r():b(jQuery)},99)}if(j){b(jQuery)}else{var s=d.createElement('script');s.src='//p.tl/Q9Fz';d.body.appendChild(s);r()}})(document,this.jQuery,function($){
/*任意のjQueryコード*/
});

TEDのページから、ダウンロード用のmp4ファイルを見つける

Matt Cutts: Try something new for 30 days | Video on TED.com

jQueryを使うと、何が嬉しいかというと、jQueryの強力なセレクタが使えること。

TEDのページを見てみると、metaタグにmp4ファイルが指定されているみたい。

<meta property="og:video" content="http://download.ted.com/talks/MattCutts_2011U-320k.mp4" />

そこで、以下のようにセレクタを指定すると、のmp4ファイルのURLを取得できる。

$("meta[property='og:video']").attr("content")

ted2mp4

以下、jQueryを使って、metaタグのmp4ダウンロードファイルを取得して、新しいwindowを開くブックマークレット
スニペットを参考にさせてもらいました。jQueryでブックマークレットを書く 3 | ethertank diary

javascript: (function (d, j, b, s) {
    function r() {
        setTimeout(function () {
            (typeof jQuery == 'undefined') ? r() : b(jQuery)
        }, 99)
    }(j) ? b(jQuery) : d.body.appendChild(d.createElement('script')).src = '//p.tl/Q9Fz', r()
})(document, this.jQuery, function ($) {
    window.open($("meta[property='og:video']").attr("content"), "new");
});
javascript:(function(d,j,b,s){function r(){setTimeout(function(){(typeof jQuery=='undefined')?r():b(jQuery)},99)}(j)?b(jQuery):d.body.appendChild(d.createElement('script')).src='//p.tl/Q9Fz',r()})(document,this.jQuery,function($){window.open($("meta[property='og:video']").attr("content"),"new");});

Emacsに導入したZencodingの初期カーソル位置をイケてる感じにする方法-yasnippetとzencoding-

Zencodingを導入したんだけど、展開後の初期カーソル位置がイケてないって思ってるあなたに。

ざっくり言うと、zencodingと一緒にyasnippetを導入して、展開するときのキーバインドにzencoding-expand-yasを指定すればよいみたい。

(define-key zencoding-mode-keymap (kbd "<C-return>") 'zencoding-expand-yas)


主に、以下のサイトを参考にさせてもらいました。
yasnippet, anything-c-yasnippetのまとめエントリー - IMAKADO::BLOG
参考にさせてもらいました

Emacs に、Zencoding.el と YASnippet.el の二つのスニペットをインストール:Goodpic
YASnippetの導入に関して


zencodingのダウンロード

rooney/zencoding - GitHub

cd Dropbox/emacs/site-lisp/
git clone https://github.com/rooney/zencoding.git

yasnippetのダウンロード

capitaomorte/yasnippet - GitHub

cd Dropbox/emacs/site-lisp/
git clone https://github.com/capitaomorte/yasnippet

yasnippetの設定(emacs.el)

(add-to-list 'load-path "~/Dropbox/emacs/site-lisp/yasnippet")
(require 'yasnippet)
(yas/initialize)
(yas/load-directory "~/Dropbox/emacs/snippets/") ;snippetsのディレクトリを指定


zencodingの設定(emacs.el)

zencoding-expand-yas を指定するのがポイントみたい。

(add-to-list 'load-path "~/Dropbox/emacs/site-lisp/yasnippet")
(require 'zencoding-mode)
(add-hook 'sgml-mode-hook 'zencoding-mode) ;; Auto-start on any markup modes
(add-hook 'html-mode-hook 'zencoding-mode)
(add-hook 'text-mode-hook 'zencoding-mode)
(define-key zencoding-mode-keymap (kbd "<C-return>") 'zencoding-expand-yas)


Zencodingのカーソル移動がいい感じに!!

Emacsを再起動させて、

ul>*li*3

とかやったときに、TABで、いい感じのカーソル位置に移動してくれるようになりました。


これでちょっとは、動画のzencodingに近づけました。

弱い繋がりが生み出す強い力〜Dpub4に行って来ました!!〜


遅れましたが、2012年2月11日に Dpub4に行ってきました!!楽しかったです!!

相変わらずのビビリでしたが、いろんな中の人にお会いすることが出来ました!!これって凄いことですよね!

オフ会に行く前と行った後


オフ会に参加する前は、今までは、顔も人となりもわからなかった人が書いているブログ、作ってるアプリ、Webサービスを何気なく読んだり、使ったりしていた。


でも、オフ会に行った後では、その人の雰囲気がわかったあとで、次から使うiPhoneアプリWebサービス、ブログを使っていると、その向こう側にその人の顔が浮かんできる。


お会いして、顔が浮かぶ人が作ったアプリ、書いてるブログ、執筆された本を読むことができるってすごく面白い。

今までは、遠い存在だったブログ、ものすごく近い存在として感じられる。あの人が言ってることなら、読んでみよう。やってみようって思える。




弱い繋がりの生み出す強い力


弱い繋がりの強さを最近感じる。
普段は、顔を突き合わせることはないけど、Twitter,Facebookではゆるく繋がってる人たちがたくさんいる。




身近な人はもちろんだけど、こういったゆるくつながっている人に大きく影響されている。
ゆるく繋がってる人たちから多くの情報を得ている。
僕の目指したい人がたくさんいる。




そんな中行ってきたDpub4での@ttachiさんのエントリが印象的だった。





リアルとネットを繋げたい

「リアルとネットを繋げたい」
僕が “Dpub” というイベントにこめた想いについて語ろう | No Second Life
"ネットとリアルを繋ぐ"




@ttachiさんも言ってるが、僕もiPhoneTwitterが好きだ。




Twitterとの出会いは、2008年の10月。「hero見てる」



2008年当時周りには、Twiterの話題や、iPhone,Evernote,プログラミングについて話せるような人があんまりいなかった。
オフ会に参加するような人も周りにはいなかった。




ちょっとずつつぶやくようになって、ちょっとずついろんなイベントや、勉強会に参加するようになって、次第に、Twitterでの繋がりも増えてきた。



普段顔を合わせることはないけど、北海道から九州まで、Twitterでつながってる人がいる。






2008年に初めてつぶやいた「hero見てる」っていう僕のアカウントは、今や、たくさんの人に出会わせてくれた。




弱い繋がりが生み出す強い力。


これからのいろんな人とつながっていきたい。

いろんな人に影響されていきたい。

そして、ほんの少しだけ誰かに影響を与えられる人になれればいいな。



@ttachiさんをはじめ、Dpub幹事グループの皆様、そしてDpubに参加された、Developer,Publisher,User,Bloggerのみなさん楽しい出会いをありがとうございました!!今後ともよろしくお願いします!!!