Hatena::ブログ(Diary)

130単位

2013-12-31

Sitespecを使ってみた感想

Background

  • 住んでるシェアハウスWebサイトがなかった
  • プロモーションの拠点として必要性を感じた
  • 最初は割とよく耳にするMiddlemanで作ろうかと思った
  • 直近で読んだr7kamuraさんの記事 no title に影響を受けた
    • "Middlemanの嫌いなところは、何をするにもMiddlemanに従う必要があることだった"
  • 必要十分そうなSitespecというツールがそこにあったので使ってみることにした

Goal

  • とりあえず1ページでよい
  • 費用や入居までの流れなどがわかればよい
  • デザインはシンプルかつそれなりな見栄えであればよい
  • コンテンツはMarkdownで書きたい
  • Herokuくらい簡単に公開したい

Sitespec with Sinatra

r7kamuraさんのブログ(ソース)はPadrino使ってますが、全部引用するのは忍びないのでSinatra使ってみました。

helpers do
  def markdown markdown_text
    renderer = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks: true)
    renderer.render(markdown_text)
  end
end
use Rack::Static, :urls => ['/images'] #Sitespecに渡すアプリにこう書く

Others

Result

ぼちぼちコンテンツ増やしていきたいと思っています(あと入居者募集中です!)。

Conclusion

上記の画像の件ですが、Sitespecとしては "まずは画像のパスをSpecに書け" というテストファースト的コンセプトなんだと思います。RSpec派生ツールなので当然といえば当然なんですが、そこを理解するとスムーズに開発できる気がします。ほぼ学習コスト無しでいけるため、さくっと静的サイトを作りたい場合にはMiddlemanよりおすすめです、たぶん!

Links


4774158798
パーフェクトRuby (PERFECT SERIES 6)

*1:IFTTTなどでTwitterに流しているとなおさら

2013-10-15

Rails3.0 -> Rails3.2 アップグレード

今さら需要があるかわからない3.2へのアップグレード情報です。半年前にはほぼ準備完了していたんですが、諸事情あった末にようやく調整ができたので、先日アップグレードしました。ちなみにRails4リリース後のセキュリティメンテナンス対象は3.2系のみであるため、3.1系以前を運用されている方はできるだけアップグレードしたほうがいいと思います。

Gitのlogを見ながら書き起こしているため、エラーか非推奨警告かは曖昧な上に、もしかしたらバージョンアップ関係ない点もあるかもしれませんがご了承ください。

Gemfile

#gem 'rails', '~> 3.0'
gem 'rails', '~> 3.2'
#gem 'mysql2', '< 0.3'
gem 'mysql2'
gem 'devise-encryptable'
#gem 'jpmobile', '< 2.0'
gem 'jpmobile'
#gem 'spork', '> 0.9.0.rc'
#gem 'guard', '~> 0.8.8'
  • 古いバージョン指定を除外(コメントアウト分が3.0用)
  • DeviseでRestful Authentication互換のEncryptorを利用しているのでDevise Encyptable追加

Rails

rake rails:update
  • config以下が3.2のデフォルトで上書きされる
  • git diff で3.0の内容と比較しながら設定
config.assets.enabled = false
  • asset pipeline をオフにして3.0時代のasset管理を継続
has_many_association#clear
# has_many :posts
has_many :posts, :dependent => :delete_all
  • 3.0は @user.posts.clear = @user.posts.delete_all だった
  • 3.2は :dependent を指定しないと 関連idを NULL で UPDATE する
    • 関連idがNULL不可の場合、:dependent を :delete_all (または :destroy) にする
Rails.cache with specific instances
config.eager_load_paths += %W[#{config.root}/lib]
config.after_initialize do
  require_dependency 'my_class' unless defined? MyClass
end
MimeType
  • config/initializers/mime_types.rb でPDF追加してたけど不要になった

Gems

Devise
<%#= confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>
<%= confirmation_url(@resource, :confirmation_token => @token) %>
#User.__send__(:generate_token, 'encrypted_password').slice(0, 8)
Devise.friendly_token.slice(0, 8)
  • ランダム文字列生成
RSpec(Guard)
#guard 'rspec', :version => 2, :cli => '--fail-fast --drb' do
guard 'rspec', :cli => '--fail-fast --drb' do
  • :version 指定不要
Capybara
  • git mv spec/requests spec/features
  • Capybara2系の仕様により、Capybara::DSL を使うspecをfeaturesへ移動
#select @datetime.month.to_s, :from => 'created_at_2i'
select "#{@datetime.month}", :from => 'created_at_2i'
#select @datetime.hour.to_s, :from => 'created_at_4i'
select '%02d' % @datetime.hour, :from => 'created_at_4i'
  • optionのテキスト検出が厳格になった
#click_button 'resource_submit'
click_button '登録する'
  • FormBuilder で submit の id が付かなくなった
Fabrication
  • resource!{ ... } -> resource{ ... }
  • sequence はブロック化して遅延評価
  • :from => Resource -> :class_name => :resource

感想

そもそもアップグレードが遅れたのは、非エンジニアがpublic以下を編集することが多いアプリで、asset pipeline対応ができなかったのが原因でした。ただ対応しないという判断で割り切ってしまえば、2系から3系よりは、対象項目が少なかった印象です。またテストを書いていたため、(テスト自体の修正もあったものの)比較的安心して進めることができました。Model.pluckが使えるようになったのが地味にうれしいですね。


4844331566
改訂新版 基礎Ruby on Rails (IMPRESS KISO SERIES)

関連記事

2011-07-11

foursquare APIを使って自動フレンド承認

foursquare APIのラッパーgemライブラリを使います。

環境

  • Ruby 1.9.2p180
  • Foursquare 0.3.4

OAuthアクセストークン取得

CLIENT ID, CLIENT SECRET取得

f:id:deeeki:20110711070102p:image

アクセストークン取得
require 'foursquare'
CLIENT_ID = 'XXX'
CLIENT_SECRET = 'XXX'

oauth = Foursquare::OAuth.new(CLIENT_ID, CLIENT_SECRET)

request_token = oauth.request_token.token
request_secret = oauth.request_token.secret

print "access following url.\n"
print oauth.request_token.authorize_url
print "\nand input access code. >> \n"
VERIFIER = STDIN.gets.gsub!(/\n/,'')

access_token, access_secret = oauth.authorize_from_request(request_token, request_secret, VERIFIER)

print "success! paste following code to config file.\n"
print "ACCESS_TOKEN = '" + access_token + "'\n"
print "ACCESS_SECRET = '" + access_secret + "'\n"
  • authorize_urlにアクセスして表示されたコードを入力して認証

f:id:deeeki:20110711070103p:image

フレンド承認

require 'foursquare'
CLIENT_ID = 'XXX'
CLIENT_SECRET = 'XXX'
ACCESS_TOKEN = 'XXX'
ACCESS_SECRET = 'XXX'

oauth = Foursquare::OAuth.new(CLIENT_ID, CLIENT_SECRET)
oauth.authorize_from_access(ACCESS_TOKEN, ACCESS_SECRET)
foursquare = Foursquare::Base.new(oauth)

foursquare.friend_requests.each do |u|
	p u.firstname
	if u.photo =~ /foursquare.com\/img\/blank/
		foursquare.friend_deny :uid => u.id
	else
		foursquare.friend_approve :uid => u.id
	end
end
  • friend_requestsでフレンド申請中ユーザーのリスト取得
  • friend_approveでフレンド承認
  • friend_denyでフレンド拒否
    • 個人的な趣味でデフォルトアイコンは省かせていただきたいので
  • これをcronに登録するなどして自動化

サンプル

一連の手順のサンプルコードです。

関連リンク

おまけ

デフォルトの設定だと、フレンドであるユーザーにはメールアドレスが公開状態になっているみたいです。気になる方は確認してチェックを外しておくといいと思います。

f:id:deeeki:20110711070104p:image

4873113946
プログラミング言語 Ruby

0071773177
The Power of foursquare: 7 Innovative Ways to Get Customers to Check In Wherever They Are


関連記事

2011-06-26

Google Analyticsデータ取得gemライブラリ「Garb」

Google Analytics の Data Export API のラッパーライブラリです。

環境

  • Ruby 1.9.2p180
  • Garb 0.9.1

OAuthアクセストークン取得

ユーザー名とパスワードでも扱えますが、あえて茨の道を選択してみました。

Consumer Key,Consumer Secret取得
アクセストークン取得
require 'oauth'
CONSUMER_KEY = 'XXX'
CONSUMER_SECRET = 'XXX'

consumer = OAuth::Consumer.new CONSUMER_KEY, CONSUMER_SECRET, {
	:signature_method   => 'HMAC-SHA1',
	:site               => 'https://www.google.com',
	:request_token_path => '/accounts/OAuthGetRequestToken',
	:authorize_path     => '/accounts/OAuthAuthorizeToken',
	:access_token_path  => '/accounts/OAuthGetAccessToken',
}

request_token = consumer.
	get_request_token({}, :scope => "https://www.google.com/analytics/feeds/")

print request_token.authorize_url + "\n"
ACCESS_CODE = STDIN.gets.gsub!(/\n/,'')

access_token = request_token.get_access_token(:oauth_verifier => ACCESS_CODE)

print "ACCESS_TOKEN = '" + access_token.token + "'\n"
print "ACCESS_SECRET = '" + access_token.secret + "'\n"
  • authorize_urlとget_access_tokenはrequest_tokenが同一インスタンスでないといけないっぽい
    • なので標準入力を使ってみた
  • irbでやってもよかったかもしれない

Analyticsデータ取得

require 'garb'
ACCESS_TOKEN = 'XXX'
ACCESS_SECRET = 'XXX'

#consumer生成までは上記コードと同じ
access_token = OAuth::AccessToken.new(consumer, ACCESS_TOKEN, ACCESS_SECRET)

Garb::Session.access_token = access_token
profile = Garb::Management::Profile.all.detect {|p| p.web_property_id == 'UA-XXXXXXX-X'}

class PageTitle
	extend Garb::Model

	metrics :pageviews
	dimensions :hostname, :page_path, :page_title
end

rs = PageTitle.results(profile, {:limit => 20, :sort => :pageviews.desc})
rs.each do |r|
	print r.pageviews + "\n" + r.page_title + "\n" + r.hostname + r.page_path + "\n\n"
end

サンプル

こちらに一連の手順のサンプルコードが置いてあります。READMEなくてわかりづらいかもしれませんが、試してみたい方はどうぞー。


4873113946
プログラミング言語 Ruby

4839935483
Google Analyticsではじめるテストマーケティング

*1:動的に値を追加変更できる構造体、バリューオブジェクト的なもの

2011-05-07

Rails3初心者と最先端gemライブラリの付き合い方

Rails3でデファクトになりつつある認証ライブラリのDeviseを使って開発していて、ちょっとしたことでかなり時間を浪費してしまいました。

no title

大元はライブラリのバグだったにせよ、自分の経験不足も少なからず影響はしてるので、同じ轍を踏まないためにメモを残しておいてみます。

現象

  • パスワードリセット機能
  • 正しい手順を踏んでるのに「トークンが不正」と出る
  • ログにあるトークン付きSELECT文は問題なくレコード取得できてる

原因と解決

  • コードを追いつつ原始的なデバッグをしてたら原因っぽい部分を発見した
  • 原因らしきフレーズ「reset_password_sent_at」でググったらissueやpull requestが出てきた
  • 最近追加された仕様で、要はreset_password_sent_atカラムがない場合に発生するバグ
  • 使っているバージョンが悪く、すでに修正されていた
  • 最新バージョンにしたら問題なくなった
    • 1.3.1 → 1.3.4
  • generate機能の仕様変更もすこし関係していた
  • 設定ファイルも最新版でgenerateしたものをベースに差し替えた

デバッグでわかったこと

  • まずはプレーンな状態で新規アプリをつくって不具合が再現するか確認する
  • 糸口がなければコードを追って愚直にデバッグしてみる
  • gemライブラリでもlogger.debug()は効く
    • log/以下のログファイルに出力される
    • 使いかた:logger.debug variables
    • オブジェクトはinspectするといい:logger.debug object.inspect
  • ただしサーバー(Rails)を再起動させないと反映されない
    • Powはtouch tmp/restart.txt

まとめ

  • 利用実績のあるgemライブラリでもバグがあるかもしれないことを覚悟して使う
  • ドキュメント等は基本的に英語を読まないといけないので苦手意識をなくす
  • GitHubリポジトリをWatch、またはフィードをチェックする
  • 未リリースの開発中であれば頻繁にbundle updateして最新版を使うようにする
    • ただし諸刃の剣でもあるのでCHANGELOGをよく読む
  • generateで生成されるファイルの変更も確認する
  • バグ修正がオープンかつソーシャルに行われてるRails界隈すごい
  • その場を提供してるGitHubもすごい

そんなわけで、先端をゆくWAFによる開発は面白くもあるけど大変というおはなしでした。もっといい方法があるということでしたら教えていただけるとありがたいです!


4774146633
Ruby on Rails 3 アプリケーションプログラミング