SublimeTextのreindentをtabで
Sinatra + Faye::WebSocketでlambda do |env|したくない
ごぶさた。
最近WebSocketに興味があってなんかやってみようと模索中。
websocket-railsとかしっかり出来てそうだったけど、もうちょいお手軽に出来ないものかと探したらfaye-websocket-rubyというものが。READMEの例は簡単そうで良い感じだぞぉ。
しかしサンプルを読むと
require 'faye/websocket' App = lambda do |env| (中略) end
(´・ω・`)ナニコレ。どうやらconfig.ruにて
run App
ってやって起動してる模様。Rackアプリに対応ってことですかね。
へーこんな書き方あるんだーと思いつつ、sinatra使って
get '/' do (中略) end
という風に書きたいなーと。書き慣れてる & 見慣れてる & ネストが1段浅くできる。て訳で書き換えようとしたが、わからんかったのはラムダに渡されてるenvといふもの。なんぞこれ。これと同じものをgetの内側で取得しないといけないんだけどどうすれば?
puts env.classしたらただのHashで、puts envしたら何やらリクエストのヘッダみたいなのがズラズラ。そこかしこに見えるrackという文字。getの内側でrequestっていうメソッド使えたよなーと思ってここを見たらありました。
request.env
で取れそうですね。そのまんまでしたね。Rackへの理解が足りませんでしたね。
というわけでソース置いときます。
golangのPrintfとPrintln
つまらんことでハマった。
num := 5 Printf("%v\n", num) // => 5 Println("%v", num) // => %v 5
ということでした。
使い分けましょう。
RSpecでファイル読み書きのテストしたいんだけど微妙な方法しか思い付かない
dotfileをゴニョゴニョ読み書きするgemを、Thor使って作ろうと思い立ち、RSpecでテストしようってなったんですが、テストするときにホントにゴニョゴニョされちゃ困るんでスタブファイル用意しますわな。単体テストならstubとかshould_receiveとかand_returnでイケるかなと思ったのですが、読んで書いてちゃんと書き込めてるか確認とかになると一時ファイル作ったほうがいいのかなと。
いろいろ試したのですがイイ感じな方法が思いつきませんでした。
とりあえず動く例を書きます。
# spec_helper.rb lib_dir = File.join(File.dirname(__FILE__), '..', 'lib') $LOAD_PATH.unshift lib_dir unless $LOAD_PATH.include? lib_dir require 'rspec' require 'my_gem' RSpec.configure do |config| end shared_context :prepare_tempfile do before(:all){ load 'stub.rb' } let(:tmpfile){ Stub::TEMP_FILE } after(:all){ Stub::TEMP_FILE.unlink Object.send(:remove_const, :Stub) } end
# stub.rb module Stub require 'tempfile' TEMP_FILE = Tempfile.new(['temp', '.txt']) TEMP_FILE.write 'This is temp file' TEMP_FILE.close end
# my_gem_spec.rb require 'spec_helper' describe MyGem do include_context :prepare_tempfile it '...' do # modify TEMP_FILE expect(TEMP_FILE.open.read).to eql '......' end end
include_contextを別の場所でもできるように、stub.rbはrequireじゃなくてloadで読んでます。んで、そのままだと2回目以降の読み込み時に定数上書きの警告がでるので、after(:all)で定数Stubを葬ってます。
バッドノウハウの芳しい香りが…(´・ω・`)
Twitter Bootstrap 3.0のnavbar-collapseクラスがない
追記
CDNから取ってきたやつにはnavbar-collapseがありました。
公式のサンプルも正しく動作するようです。スッキリしないけど、まあいっか。
追記終わり。
このドキュメントを読みながらBootstrap 3.0を試していた夏の日。何回繰り返してもナビゲーションバーがうまく動作しない。
具体的には、navbar-brand要素は表示されるのに、その右にあってほしいものが表示されない。
これは世界が歪んでいるに違いない。
そう考えた私はオモムロにbootstrap.min.cssをエディタで開き"navbar-collapse"を検索!
該当無し!
おいマジかよ、ホントに歪んでんのかよということで似てるクラスを探すとnav-collapseを発見。
書き換えてみるようまくいきました。
せっかくなんでコード載せときます。slimです。
doctype html html head link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" link rel="stylesheet" type="text/css" href="css/custom.css" script type="text/javascript" src="//code.jquery.com/jquery-latest.min.js" script type="text/javascript" src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js" title = @title || 'Title' body .container nav.navbar.navbar-default.navbar-fixed-top role="navigation" .navbar-header a.navbar-brand href="/" BrandName button.navbar-toggle type="button" data-toggle="collapse" data-target=".navbar-ex1-collapse" span.icon-bar span.icon-bar span.icon-bar .nav-collapse.collapse.navbar-ex1-collapse ul.nav.navbar-nav.pull-right li a href="#" List li a href="#" List
SinatraとGemfile(書き直し)
前エントリで盛大にミスったので書き直します
# Gemfile source 'https://rubygems.org' gem 'sinatra' gem 'slim' group :development do gem 'sinatra-contrib', :require => 'sinatra/reloader' end
# config.ru require 'bundler/setup' Bundler.require(:default) Bundler.require(:development) if development? require './app.rb' run Sinatra::Application
# app.rb get '/' do slim :index end
起動は
$ bundle exec rackup config.ru
SinatraでGemfileとかrackupとか
※相次ぐミス発見※
よく見たらdevelopment環境のgemが動いていませんでした
こっちに書き直しました。
最近、某クルマのCMでおなじみのシナトラ先生。
じゃなくてWAFのSinatraを触ってみました。
やっぱGemfileでgem管理しないとやってられんと思って調べてたんですが、入門記事とかにはGemfileに書いたgemをメインのRubyソースでrequireしないと動かないみたいなことが書いてありました。
まあRailsじゃないんでDRYがーとかうるさくないのかなーとも思うんですが、わざわざ2回書くのは面倒。
これはまさにイッツドライビングミークレイジー。
いろいろ漁ってシンプルに解決できたのでメモっときます。
# Gemfile source 'https://rubygems.org' gem 'sinatra' gem 'slim' group :development do gem 'sinatra-contrib', :require => 'sinatra/reloader' end
# config.ru # require 'bundler' # 修正。間違ってました require 'bundler/setup' Bundler.require require './app.rb' run Sinatra::Application
# app.rb get '/' do slim :index end
アプリの起動は
$ bundle exec rackup config.ru
で。config.ruは省略してもいいのかも。