GAE

2010年08月18日

GAE上にてsinatra+OAuthでtwitterを扱えるようになったので、入力したtweetを、逆順にしてpostするwebアプリケーション「Right to Left twitter」を作った。
とりあえず動いている、というレベルなので、とてもじゃないがソースは晒すことはできない。もっとエレガントに書けるようになりたい。

「こんにちは」と入れると「はちにんこ」と変換してpostされる。
回文モードもあり、「しんぶんし」であれば「しんぶ」と入力することで、「しんぶんし」を作ってくれる。
真ん中の文字を、重ねるオプションもあり、「しんぶ」と入力して重複させると「しんぶぶんし」となる。

いや、だから何の役に立つってわけじゃないけどね・・・。

http://rtl-maarui.appspot.com/

sylphide_ffr31mr at 20:49コメント(0)トラックバック(0) 
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年08月06日

javascriptの練習ということで、文字を大きく表示するページを作ってみた。Google App Engine上で公開しているが、サーバサイドでは何もやっていない。

もじもじくん



はじめてまともにjavascriptを書いてみたが、やはり難しい。
Javascriptだけ考えればいいわけではなく、HTMLと、CSSも書いていく。
ある働きを記述したいときに、CSSでもjavascriptでも表現可能な場合、どこで記述するのがいいのか、余計なことを考えすぎる。
慣れていくしかない。

うちの2番目ちゃんや、3番目ちゃんは、ひらがなを読むことはできるが、書くのを練習中。
ときどき「ふぁ」ってどう書くの? とか聞かれるので、このページで字を大きく表示して教えてあげるような使い方を想定している。
iPhoneやiPadのブラウザでも動作する。
日本語も入力できるので、1番目ちゃんに漢字を聞かれても大丈夫。
入力できる文字数は、16文字まで。



sylphide_ffr31mr at 00:11コメント(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) 
記事検索
最新コメント
livedoor プロフィール
月別アーカイブ
  • ライブドアブログ