るびー めも

Ruby の学習メモを記す

開発環境のおはなし

久しぶりの書き込みです。

最近、いろいろありまして First MacBook(Early 2006)に
再度、開発環境を構築することになりました。

このマシン、ボロボロなんですが SSD 化したりしながら
SnowLeopard 環境で、なんとか延命しています。
# CoreDuo 機なので、SnowLeopard が限界

開発環境再構築の背景は、もう1台ある MacBook Air(2012 Mid)が
奥さんの Microsoft Office 資格試験のために Bootcamp で Windows7 化して
専有されてるからなんですね。#奥さん、勉強頑張って!

というわけで仕方なく、開発環境を再構築する羽目になりました。

話は変わりますが、西脇&東灘.rb の伊藤さんと Aki さんが
「Everyday Rails - RSpecによるRailsテスト入門」という電子書籍を出版されました。
詳細は、以下を見てください。
RSpec初心者必読!「Everyday Rails - RSpecによるRailsテスト入門」を発売しました

私も先日購入してから、第2章までしか読んでませんが
第1章に紹介されていた Rails Tutorial で Rails に関する基本から
学習し直しているところです。
rspec に関しても、ほとんど知らないので電子書籍を読破するまでは、
#まだまだ道のりは遠そう、、、

http://instagram.com/p/kLkBQ_GJ9j/
Instagram

というわけで本題。
その Rails Tutorial で Heroku の環境セットアップに関する記事があり
久しぶりに Heroku Toolbelt をインストールしたら、こんなエラーが発生しました。

$ heroku login
-bash: /usr/bin/heroku: /usr/local/heroku/ruby/bin/ruby: bad interpreter: Bad CPU type in executable

エラーメッセージから、ある程度想像できますが
64bit バイナリ Only になってるっぽい。
確認してみても、予想どおりの結果

$ file /usr/local/heroku/ruby/bin/ruby
/usr/local/heroku/ruby/bin/ruby: Mach-O 64-bit executable x86_64

原因は /usr/bin/heroku のシェバン(1行目)に、
/usr/local/heroku/ruby/bin/ruby が指定されているから。

仕方がないので、/usr/bin/heroku をゴニョゴニョ

$ head -1 /usr/bin/heroku
#!/usr/bin/env ruby

これで heroku コマンドが使えるようになりました。

$ heroku login
Enter your Heroku credentials.
Email: yuji.shimoda@gmail.com
Password (typing will be hidden): 
Authentication successful.

まだまだユーザはいるはずなので、32bit 環境見捨てないで欲しいなぁ…
#Qiita の Kobito も 32bit バイナリが提供されていなかったりします、、、

Amazon ECS を使う

現在、鋭意作成中のWEB アプリで Amazon からDVDパッケージの画像を
Rails で取得したいので、amazon-ecs というgem を使ってみた。

https://github.com/jugend/amazon-ecs

色々とWEB に公開されている情報を参照しながら、コピペで
サンプルを動かそうとしてみたけど全然動かなくて(情報が古くて)
最終的には、github の EXAMPLE 参照しながら実装したらあっけなく動いたので
自戒の意味も込めてメモを記す。
#要するに、WEB の情報はあくまでも参考情報なので
#まずは、オフィシャルなドキュメントから参照しましょうということ

拙作の amazon.rb からソースを抜粋します。
#associate_tag/AWS_access_key_id/AWS_secret_key は、取得した自分のコードを入力すること

require 'amazon/ecs'
Amazon::Ecs.options = {
  :associate_tag => '[your associate tag]',
  :AWS_access_key_id => '[your developer token]',       
  :AWS_secret_key => '[your secret access key]'
}

res = Amazon::Ecs.item_lookup(ARGV[0], :res_group => 'Small' )
if(res.items.length > 0)
  res.items.each do |item|
    puts("asin: #{item.get('ASIN')}")
    puts("title: #{item.get('ItemAttributes/Title')}")
  end
else
  puts("#{ARGV[0]}: products not found")
end

上記のようなコードで、Amazon から情報を引っ張ってこれた

Macbook Air OSX 10.8.4 環境での実行結果は、以下のとおりです。

$ uname -a 
Darwin lion.local 12.4.0 Darwin Kernel Version 12.4.0: Wed May  1 17:57:12 PDT 2013; root:xnu-2050.24.15~1/RELEASE_X86_64 x86_64
$ ruby -v
ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.3.0]
$ gem list | grep amazon
amazon-ecs (2.2.4)
$ ruby ./amazon.rb 4873113679
asin: 4873113679
title: 初めてのRuby

VirtualBox ゲストの debian 環境での実行結果は、以下のとおりです。

$ uname -a
Linux debian-squeeze 2.6.32-5-amd64 #1 SMP Fri Feb 15 15:39:52 UTC 2013 x86_64 GNU/Linux
$ ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]
$ gem list | grep amazon
amazon-ecs (2.2.4)
$ ruby ./amazon.rb 4873113679
asin: 4873113679
title: 初めてのRuby
$ 

ASIN とは、 Amazon Standard Identification Number の略称で、
Amazonグループが取り扱う、書籍以外の商品を識別する10けたの番号です。
CD、DVD、ビデオ、ソフトウェア、ゲームなど、書籍以外の商品の詳細ページに記載されています。

とのこと、詳細は以下を参照願います。
http://www.amazon.co.jp/gp/help/customer/display.html?ie=UTF8&nodeId=747416

というわけで、次回は Rails に組み込みたいと思います。
#次回がいつになるかは不明ですが、、、

第5回西脇&東灘.rb もくもく会@東灘区民センター に参加してきました。

今回で3回目の参加となる西脇&東灘.rb もくもく会に、
本日参加してきました。

今回も例に漏れず、色々なバックヤードをお持ちの
Rubyist にお会いすることが出来ました。

もくもく会の様子は、以下のとおりです。

f:id:yuji_shimoda:20130720132609j:plain
#写真をアップしました。

第5回のもくもく会、アジェンダは以下のとおり

  • Rails アプリの作成(在庫一覧リストを生成する)
  • sinatra を使ったWEBアプリの作成(勉強会開催会場情報を集める)
  • vagrant + chef の検証
  • bundler の実装に関する調査
  • Spree のエクステンション作成
  • Khan Academy という学習動画サイトに、日本語+英語字幕を付けたmp4 を生成するアプリの作成
  • Ruby + Ragel を使った、文字列を操作するライブラリのパーサー開発

相も変わらず多岐に渡る発表が多く、
技術者として知識の裾野を広げる機会に恵まれた
勉強会と言えます。
#参加後の充実感は、半端ない勉強会です。

今回、私がお題に掲げた内容は以下のとおりです。

 「映画を観た、観たいリストをまとめるための Rails アプリ」の作成

そもそも、Ruby を始めたきっかけも
WEB アプリを作りたいという漠然とした思いつきと
勉強会やコミュニティへ参加してみたいという思いからです。

Ruby ど素人の初心者でも WEB アプリを作るんだという気持ちがあれば
頑張ってWEBアプリを作ってみれば良いはずなので、挑戦しようと思い立ちました。

せっかく作るならば、自分が欲しいと思うアプリを作りたいと考えるのは
必然なので趣味のための WEB アプリを作ろうと考えました。

突然ですが、私の趣味は「映画鑑賞」です。

ただ、よくある出来事として以下のようなことがあります。

  • 一度観た映画を忘れて、再度レンタルしてしまう。#もの覚えが悪いだけという指摘はなしで
  • 観たい映画のタイトルを、いざ借りるときに覚えていない #同上

それならば、観た or 観たいリストを
いつでも参照できるようにしておけば良いよね?
という考えに至りました。

私が欲しいと思うアプリの要件(個人的な要望)は、以下

  • 観た映画のリストログ
  • 観たい映画のリストログ
  • ネタバレなしの映画書評一覧(twitter みたいな、120文字程度のまとめ)
  • 他人の書評に対して、「いいね」したりできる機能
  • 映画の良さを表す★★★☆☆ みたいな機能
  • twitter アカウントでログインする機能
  • etc...

とりあえず、挙げだすときりがないですがこんな感じ

自分の性格上、途中で投げ出す恐れがあるので(笑)
.com ドメイン(年間600円)を取得してしまいました。(笑)
#というわけで、頑張ろうと思っております

で、今回の勉強会では入り口となる認証周りを実装したいなぁと考え
Rails + Devise + Omniauth を取り上げました。
#結論から言うと、Devise を使えていません

あと、ログインページだけは見よう見まねに頑張って作ってみました。
イメージは、以下のとおりです。

f:id:yuji_shimoda:20130720235147p:plain

#WEBサービスとしては、中身のからっぽなハリボテ状態です。(笑)

ちなみに、本日の成果としては以下のとおり
twitter による認証のところまでクリアしました。

f:id:yuji_shimoda:20130720235428p:plain

頑張って中身を作っていこうと思います。

#なお、勉強会にてアプリの本質的な機能から実装するのが一般的だよ。と指摘を
#受けました、、、おっしゃるとおり、分かっているのではありますが、
#難しい部分を初心者が自力でクリア出来る確率を考えると、中身が空っぽでも
#難しい部分を勉強会でクリアして、自力で頑張れるところは、自宅で実装するという
#スタイルもありかな?(お許し頂きたい)と考えています。

もくもく会後の懇親会も含め、楽しかったです。
勉強会に参加した事の無い方は、勇気を振り絞って参加してみるべきと思います。

以上です。

Square リーダー注文しました

Square リーダーが届いた。

開けたらこんな感じ。

これで、iPhone が簡易的なレジに早変わり。
しかも、Square リーダーもアプリも無料。

なんか未来。

レシート代わりのメールが送信されるとか、すごいね。

フリーマーケットとかでも、その場で
クレジット払いが出来てしまいますね。

個人店で、クレジットを取り扱っていないようなお店でも
気軽に導入出来そうです。

うーん、すごい

OSX 10.8 (Mountain Lion) + Rails で通知センター

terminal-notifier って gem で、OSX 10.8 の通知センターが
簡単に使えるって、前回の記事で書きました。

使い道は、あんまり考えてませんが
Rails 環境でも簡単に通知が上げれました。

使い方は、以下のとおり

  • Gemfile に以下を追記
gem 'terminal-notifier'
  • bundle install でgem をインストール
$ bundle install

今回検証した使い方は、以下です。
#今、勉強しながら作成中の Rails アプリを例に上げます。

  • あるモデルのコールバックメソッドに仕込む
class Customer < ActiveRecord::Base
  attr_accessible :number, :payment, :table
  has_many :orders, :dependent => :destroy
  has_many :menus
  after_destroy :sales_record

  private 
  def sales_record
    logger.info('Sales: ' + self.inspect)
    TerminalNotifier.notify('customer model destroy', :title => 'Rails Callback')
  end
end

Customer モデルが、削除された後に呼ばれる sales_record コールバックメソッドに
以下の一行を仕込むことで、Title が Rails Callback メッセージが 'customer model destroy' と
通知されます。
 "TerminalNotifier.notify('customer model destroy', :title => 'Rails Callback')"

上がってくる通知は、以下のとおり

f:id:yuji_shimoda:20130628225554p:plain

だから何?って言われると少し困りますが、何か有用な使い道はあるのかなー?

OSX 10.8 (Mountain Lion)の通知センターで遊ぶ

あまりよく覚えていないんだけど、西脇&東灘.rb もくもく会の第2回目?で
通知センターに通知あげる方法について、発表があったの(ふと)を思い出した。

なんか、簡単に通知上げれる方法無いのかなぁって調べていると
こんな記事に出会いました。

通知センターでHello, world!

上の記事で、一番簡単そうだったのが、以下の gem です。

terminal-notifier

$ sudo gem install terminal-notifie
:
$ which terminal-notifier
/usr/bin/terminal-notifier

使い方は、めちゃくちゃ簡単でした。

$ terminal-notifier -title 'Test' -message 'Hello, World!'
* Notification delivered.

右上に、こんな通知が上がります。

f:id:yuji_shimoda:20130627224737p:plain

何となく色々遊べそうな雰囲気ですね。