技術ネタを書けるような人間になりたいという心情を詠んだ句

SublimeTextのreindentをtabで

SublimeTextいいよって薦められるんですが、どうも乗り換えられぬ。

黒い画面ではemacsvimを使ってて、STという選択肢は無いのですが、GUIな環境でも結局ターミナル開いちゃうんですよ。

要因としては、この2つ。

  • 日常的に黒い画面で作業しているのでキーバインドとか覚えるのメンドイ
  • emacsでのTabキーの挙動が好き

前者は気力と習慣で何とかなるとしても、後者はSTには無理じゃろと思ってたらできたっぽい。

Key Bindings - Userを開いて

[
	{ "keys": ["tab"], "command": "reindent" }
]

かなり思い切った割り当てではあるけれど。

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への理解が足りませんでしたね。

というわけでソース置いときます。

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は省略してもいいのかも。