Google

2011年11月01日

emacsにもだいぶ慣れてきた。
calender機能があるのだが、今いち使い道がないと思っていたが、google calendarに登録したイベントが 読み込む方法がわかったので、俄然使える機能になった。
ブラウザを起動せず、emacsを終了しなくても、スケジュール確認、登録・削除ができる。
これはすばらしい。
cal1

設定方法は、以下を元ネタにしている。
http://code.google.com/p/emacs-google/wiki/googlecalendar

2 インストール方法

  1. iCalendar.elは、emacsのelispディレクトリに置く
    $ cp icalendar.el ~/.emacs.d/
  2. google-emacsもemacsのelispディレクトリに置く
    $ cp -r google ~/.emacs.d/
  3. gdataは、pythonでインストール 展開したディレクトリで、
    $ sudo python setup.py install

3 設定ファイル

~/.emacsに以下を追記する


;; 1) icalender.elの読み込み
(setq load-path (append (list (expand-file-name "~/.emacs.d/icalendar")) load-path))
(require 'icalendar)
;----
;; 2-1) google calender関連elispの読み込み
(setq load-path (append load-path (list (expand-file-name "~/.emacs.d/google"))))
(require 'google-calendar)
;----
;; 2-2) google calendarの設定
(setq google-calendar-user           "GOOGLE USER ID")         ;;; GOOGLE USER
(setq google-calendar-code-directory "~/.emacs.d/google/code") ;;; PATH TO THE PYTHON CODE
(setq google-calendar-directory      "~/tmp")               ;;; TEMPORARY DIRECTORY
(setq google-calendar-url            "https://www.google.com/calendar/ical//…../basic.ics")  ;;; URL TO YOUR GOOGLE CALENDAR
(setq google-calendar-auto-update    t )                    ;;; DEFINE IF THE CALENDAR IS DOWNLOADED AFTER EVERY MODIFICATION

GOOGLE USER IDは、@gmail.comの@マーク前の単語を書いておく。
code-directoryとcalendar directoryは、適宜書き換える。~/tmpとしたら、忘れずに~/tmpを作っていくこと。 google-calendar-urlは、対象のgoogleカレンダーの設定画面で、以下の限定icalのURLを貼り付ける。

ical_link

 

.emacsに以下を書いておくと、emacsの起動のたびにカレンダーイベント情報がダウンロードされる。 そのため起動は遅くなる。

(google-calendar-download)

4 使い方

主たるキーは以下のとおり。

M-x calenderカレンダーバッファを作成しカレンダー表示
M-x google-calendar-downloadカレンダーイベントのダウンロード
C-c C-g d同上
C-c C-g q quick event add
C-c C-g adetail event add
M-x google-calendar-delete-eventevent delete
dその日の予定を表示
m予定の入っている日を色付けする


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

2011年02月17日

google app engine上でEvernote連携のwebサービスを作るには、OAuthでの認証が必要になる。
このエントリーでは、OAuthをGoogle AppEngine上でpythonを使って認証するサンプルプログラムcunsumer_oauth.pyを提供する。
OAuthの直接的な部分は、google codeで提供されているoauth.pyを使い、それの呼び出し方を記述しているのが、consumer_oauth.pyである。
このプログラムは、oauth.pyのライブラリの使い方の参考とすることを目的としているので、元のoauth.pyライブラリに則り、MITライセンスとする。

oauth.pyを使ったサンプルプログラムは、webで調べるとtwitter向きのものが多い。
しかし、Evernoteをproviderとしたとき、同じOAuthでも、twitterとevernoteではパラメータの扱いが若干違うため、そのままは使えない。 そのあたりを修正して、ここにあげておく。

1. OAuthの仕組み

まずは、OAuthの基本的な動きを理解する。

2.ライブラリの入手

google codeでは、pythonのOAuthライブラリが ここ で公開されている。

oauth.pyを入手

ここでは、exampleとしてoauth.pyを使った client.py というのもあるのだが、これがどうもわかりづらい。
いろいろ探っているうちに、わかりやすいexampleをみつけた。

GAE+OAuth

このexampleは、いろいろミスがあり、動かすためにはかなりの修正が必要となるが、oauth.pyの使い方はとても参考になった。おかげで、oauth.pyを使えたといっても過言ではない。

3.EvernoteからAPI keyの取得

実際に、以下のプログラムを動かすには、Evernoteからconsumer用API keyを入手しなくてはならない。

以下のフォームからEvernoteにAPI keyを申請する。

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

application typeは"web application"とすること。
1,2日でメールで届くはずである。

4.Evernote OAuthの特徴

Twitterなど、あちこちで公開されているOAuthの使用例と比べて、Evernoteでは、以下の2点を注意する必要がある。

  1. twitter OAuthなどでは、request tokenからaccess tokenに交換するために、承諾されたoauth_okenを送るが、evernoteの場合は、同時にverifierも送らないといけない。
    verifierは、エンドユーザが承諾ボタンを押した後のcallback urlで戻ってくるhttp getリクエストの中に、パラーメータとして格納されている。

  2. 承諾画面より後はevernoteではoauth_secretを使わないので、url encodeされたパラメータ部分で&oauth_secret=&、と値部分がnullになるリクエストが一度だけくる。

1.については、verifierパラメータを抜き出して、リクエストURLを生成時する関数にパラメータを渡すことで対処できる。oauth.pyのライブラリは、verifierをリクエストに加える機能を持っている。

2.については、secretパラメータがnullになるとoauth.pyの中でエラーとなる。ouath.pyの以下の行でエラーを補足し、secretにダミーの文字列をセットすることで対処する。

5.oauth.py変更箇所

137行目から

(変更前)
    def from_string(s):
        """ Returns a token from something like:
        oauth_token_secret=xxx&oauth_token=xxx
        """
        params = cgi.parse_qs(s, keep_blank_values=False)
        key = params['oauth_token'][0]
        secret = params['oauth_token_secret'][0]
        token = OAuthToken(key, secret)
        try:
            token.callback_confirmed = params['oauth_callback_confirmed'][0]
        except KeyError:
            pass # 1.0, no callback confirmed.
        return token

(変更後)
    def from_string(s):
        """ Returns a token from something like:
        oauth_token_secret=xxx&oauth_token=xxx
        """
        params = cgi.parse_qs(s, keep_blank_values=False)
        key = params['oauth_token'][0]
        try:
            secret = params['oauth_token_secret'][0]
        except KeyError:
            secret = "dummy"
        token = OAuthToken(key, secret)
        try:
            token.callback_confirmed = params['oauth_callback_confirmed'][0]
        except KeyError:
            pass # 1.0, no callback confirmed.
        return token

6.Access Tokenの保存

consumer webサービスを使うたびに、毎回evernoteで承諾をするのが面倒なので、承諾済みであることをどこかに記録しておきたい。

クッキーを使ってブラウザに保存する方法と、consumerサーバ上に保存する方法がある。
今回作成したconsumer_oauth.pyでは、google app engineのデータストアに保存することにする。 そのため、consumerサービスを使うときは、googleアカウントでのログインを必須とし、GAE上のデータストアにgookeアカウントにひもづくEvernote access tokenを保存することにした。
本当のwebサービスでは、プライバシー保護としてaccess tokenを保存しないオプションを用意する予定である。

7.consumer_oauth.pyの実行

変更済みのoauth.pyとapp.yamlもセットにして、consumer_oauth.pyをgithubで公開したので、以下からダウンロードする。

consumer_oauth.pyのソース

GAE開発キットが動作する環境であれば、githubからダウンロードした3つのファイルを同一ディレクトリにおいて、開発サーバを起動すれば、ブラウザからアクセスできる。

注意点は、以下の2点である。

  1. evernote開発環境のアカウント
  2. Evernoteでの承諾は、evernoteログインが必要である。(当然だが) このプログラムでは、URLをEvernoteの開発サーバ(sandbox.evernote.com)に指定しているので、本番サーバ(www.evernote.com)のアカウントとは別に、開発サーバ用にユーザ登録をしないとEvernoteにログインはできない。

  3. Callback URL
  4. callback URLは、GAE開発環境(localhost:8080)をデフォルトとしている。GAE上にアップロードする前には、.appspot.com名のホスト名に修正してからアップロードする必要がある。

 

正常に動作すれば、以下のような画面がブラウザでみれるはず。

1.googleにもEvernoteで承認されていない状態

1-2

2.Googleにログインし、Evernoteで承認されていない状態

2-2

3.Evernoteで承認する画面

4-2

4.Evernoteに承認された状態

3-2

これ以降、このoauth_keyをEdamに格納し、Edam_userIdのディレクトリに向かってAPI を呼び出す部分を作ることで、consumerからノートの操作が可能となる。

Endpoint URL: https://sandbox.evernote.com/edam/note/<shardId>



sylphide_ffr31mr at 23:09コメント(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月20日

Googleが発表したFont API。フォントは、ローカルPCにあるものだ、という既成概念をうち崩し、ネットワークからフォントを提供するというもの。 Google Font APIのGetting Startedを見ながら、まさに見よう見まねでやってみた。

ブログのカスタマイズの画面から、「トップページ」と「個別記事ページ」のテンプレートに以下を追加。Tangerineのところを変えれば、いろいろなフォントが選べる。Font名は、Font Directoryから選べる。

<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Tangerine">

スタイルシートに以下を追加。影付きの効果も入っている。

.gfont {
font-family: 'Tangerine', serif;
font-size: 48px;
text-shadow: 4px 4px 4px #aaa;
}

そして、ブログ記事のHTMLで以下のように書く。

<p class="gfont">Google Font Sample</p>

すると、こうなる。

Google Font Sample

早く日本語フォントもでてほしいな。



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