Ruby
2012年08月18日
sinatraを一から勉強し直している。
Ruby on Railといったフレームワークをちゃんと使ったことがないから、理解していないことが多すぎる。
ということで、sinatraの基本的な使い方として、以下をまず始めに学ぶことにした。
- deply環境の切り替え方法
- auto reloadを使えるようにする方法
auto reloadは、ソースコードを変更したとき、アプリケーションサーバを起動し直さなくても、自動的に再読み込みをしてくれるので、try&errorをするときの作業効率が全く違う。是非早めにマスターしておきたい。
deploy環境の指定ができるようになると、プログラム中で環境に応じた処理を分岐させることができる。
開発環境では、reloaderを有効にするが、本番環境では無効にするとか、開発環境の場合にdebug用の出力を出す、とかを簡単に切り替えられて楽になる。
で、いきなりつまずいた。
sinatraでのdeploy環境は、以下の3つから選択することとなる。
- 開発環境:development
- テスト環境:test
- 本番環境:production
環境を指定するには、コードの最初の方で以下のように宣言しておく。
|
環境の指定は、rubyを実行する時の-eオプションで指定することもできる。
|
使い方は、それ以降でdevelop?もしくはproduction?メドッドで判別し、trueかfalseが返るので、それで条件分岐させる。
|
このdevelopment?やproduction?やtest?というメッソッドは、sinatra/base.rbの中で以下のように定義されている。
|
さて、このenvironment変数に入っている環境指定のシンボルをどうやって参照するかも試した。
マニュアルによれば、settings.environmentで取れるはずだ。
しかし、settings.environmentで得た結果と、production?で得た結果が異なるのである。
例えば、以下のようなコードでは。
|
出力はこうなる。
|
一方、以下のようにclass定義内にset文を入れると、
|
このようになる。
|
この違いがわからないまま、今に至る訳である。
class定義の外でsetしたものはクラス変数に入り、内側でsetしたものはインスタンス変数に入るのだろうか。
そして、settingsはインスタンス変数を見ているが、?メソッドはクラス変数を見ていると考えれば、合点はいくが、なぜそんなふうになっているのかは謎。
実用上は、production?メドッドで分岐させることが多いはずなので、classの外側で定義しておけば問題ない。
また、ruby起動時の-eオプションで指定した場合も、前者(classの外側で定義)と同じ動きをする。
ややこしいことに、configure 〜 do は、内側で定義した:environmentで判断されるようだ。
では、外側で定義した:environmentの値を、内側の:environmentに代入するような仕組みにすればいいかと思ったが、どうもそれもうまく動かない。
結局、rubyの思想に反するが、両方で定義しておくのが安定しそうだ。
ちなみに、reloaderの読み込みは、上記コード内のconfigureブロックの中で書いてあるとおり。
参考は以下。
2012年07月30日
OS Xでgem installをしようとすると、以下のようなエラーが出てしまう。 調べてみると、gccを入れるとか、Xcodeを最新にするとか、いろいろ対策がでてくる。 入れようとするgemも、mysql関係や、hpricot関係やらと、千差万別だが、エラーメッセージは 同じようだ。
|
結論としては、XcodeでCommand line toolsを入れれば、必要なライブラリが入るようだ。 入れ方は、Xcodeを起動して、Xcodeメニューから。
Xcode-->open developer tool-->More developper tool-->safariが開く-->OSに合わせたCommand line toolsをインストール
このインストールが終わると、以下が実行可能となった。
|
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コマンドをインストールする。
|
githubとは、sshでファイルをアップロードするので、ssh key pairを作っておく。
後ほど、この公開鍵を、githubに登録する。
|
パスフレーズもちゃんといれる。
~/.sshの下に、id_rsaとid_rsa.pubができるので、id_rsa.pubが後ほど登録する公開鍵。
2.サインアップとリポジトリの作成
http://github.com/ にアクセスし、sign up。ログインをして、dashboardを見ると、Create a Repositoryというのがあるので、そこで公開したいソースファイルのリポジトリを作成する。
3.アップロードテスト
すると親切に、次に何をするかを教えてくれる。アップロードしたいファイルを入れるリポジトリ用のディレクトリを掘り、
そこをカレントディレクトリとして、以下のコマンドをいれる。
|
すると、READMEファイルがgithubのリポジトリにアップロードされた。
4.アップロード
いよいよ、公開したいソースファイルをアップロードする。上で作ったディレクトリに、アップロードしたいファイルをコピーし、以下のコマンドを入れる。
|
- ブログネタ:
- Rubyプログラミング に参加中!
2010年08月18日
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が解決してくれているので、今や意識しなくてよいようだ。
動作環境は以下。
|
Gemfilesとrequireリストは、以下になる。
|
$ cat sample.tw.rb |
- ブログネタ:
- Rubyプログラミング に参加中!
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のインストール
|
使ったバージョンは、以下である。
|
2. "hello world"プログラムの設定とソースを作成
最初に、プログラムを作るディレクトリを、どこかに作る。このディレクトリ名がアプリケーション名になる。
|
|
3. 設定ファイルapp.yamlの作成
|
ここで、application名は、ディレクトリ名と同じにしておく。
4. ローカル内のサーバを起動
appengine-jruby gemのすごいところは、サーバ起動前に、jrubyを起動するための設定ファイルや必要gemのインストールなど、全てをやってくれる。
|
いろいろメッセージやらエラーやらが出るが、そこは無視して、"The server is running at http://localhost:8080/"というメッセージが出るまで待つ。
ブラウザでhttp://localhost:8080/にアクセスし、動作テスト。
5. GAEへアップロード
事前に、GAEのDashboardでアプリケーション名と同名のアプリケーションを作成しておかないとアップロードエラーが出る。
|
6. 動作確認
URLは、http://<アプリケーション名>.appspot.com/となる。
helloを見たい暇な方は、下記URLをアクセスしてみて。
|
画面が表示されるのに、数秒かかるのは、GAE内のJAVA仮想マシンでjrubyが起動するためだと思われる。この際、いたしかたあるまい。
さぁ、次は、sinatraに挑戦だ。
- ブログネタ:
- Rubyプログラミング に参加中!
2010年05月25日
Evernoteから簡単にノートを取り出すスクリプトをバージョンアップした。
動作環境の準備については、前のエントリを参照していただくとして。
使い方は、以下のとおり。
キーワードを1つ引数で指定し、そのキーワードにマッチするノートのリストを得る。 そして、最初にヒットしたノートの本文を表示する。
キーワードと工夫し、よく参照するノート固有のキーワードをタグなどでつけておけば、webやクライアントを起動することなくノートの内容を簡単に参照できる。
|
以下のオプションを追加した。
-g | ノートの識別子GUIDを直接してしてノートを取り出す。GUIDは、キーワードサーチしたときのノートリストにタイトルと共に表示している。 |
-r | ノートを表示するときに、 タグを外したり、アンパサンドや不等号マークなどを変換して表示しているが、このオプションを付けると、そうした変換をせず、そのまま表示する。 |
-gオプションをつけて、GUIDを直接指定する場合は、以下のようになる。
|
ソースコード
note.rb |
|
- ブログネタ:
- Rubyプログラミング に参加中!
2010年05月15日
EvernoteのAPI KEYが届いたので、サンプルプログラムをまねして、APIをいじってみた。
API KEYは、申請から7時間後に届いた。(夕方に申請したので、米国が活動時間だったと思う)
1.準備
(1)API KEYの申請
以下のフォームに必要事項を記入して申し込む。
|
メールで、consumer keyとconsumer secretが送られてくるので、それをプログラムに埋め込む。
最初の段階では、実験用システム(sandbox)にしか登録されないので、デバッグ等をそのシステムで行う。
本番システムのAPI KEYをもらうには、再度申請が必要。その場合も、同じフォームでよい、と思う。案内のメールには、本番用の申請方法は書いてなかった。
sandboxのシステムには、本番と同じくwebアクセスをして、自分でuser IDとパスワードを再登録しないといけない。
ノートも空っぽなので、実験用のノートも新たに作っておかなければならない。
(2)Evernote APIのライブラリをダウンロードする。
|
(3)展開したライブラリにPATHを通す
ふたつのパスを設定することに注意。
|
2.サンプルプログラム
サンプルプログラムは、以下を使った。というか、rubyはこれしかない。
認証系は、ほぼサンプルのまま。
|
3.作成するプログラム機能
キーワードを1つ引数で指定し、そのキーワードにマッチするノートのリストを得る。
そして、最初にヒットしたノートの本文を表示する。
キーワードと工夫し、よく参照するノート固有のキーワードをタグなどでつけておけば、webやクライアントを起動することなくノートの内容を簡単に参照できる。
|
4.ソースコード
最新バージョンはこちら。
note.rb |
|
5.出力例
|
- ブログネタ:
- Rubyプログラミング に参加中!