何も変えてないのにjenkinsのdailyのテストが通らなくなった。

% rake test
rake aborted!
no such file to load -- omniauth/password

(See full trace by running task with --trace)

手元でも確かに動かない。omniauthに何が起こった?bundleなどビルドプロセスが外部に依存してるとコードは変わってなくてもこういうことがあるのでdailyのテストも大事だな。

% bundle list | grep omniauth
  * omniauth (0.0.1)

OMG!

何故だかバージョン指定無しだと0.0.1が入るようになっている。

# Gemfile:
gem 'omniauth', '~> 0.2.6'

バージョンを指定して凌ぎましたが、他でも起きたら怖いので原因知ってる人がいたら教えてもらえると嬉しいです。

Herokuの新しいCedar Stackを使う。

今までと大きく違うのはforemanを使ったprocess modelが導入されたこと。要はwebアプリもcronジョブもバックグラウンドタスクもみんな宇宙船UNIX号の仲間たち、foremanで平等に扱おうよということ。具体的にはProcfileにprocessの設定を書いてforeman経由で動かす。

# Gemfile:
source :rubygems
gem 'rack'
# config.ru:
require 'rubygems'
require 'rack'

class App
  def call(env)
    [200, {'Content-Type' => 'text/plain'}, ['hello']]
  end
end

run App.new
# Procfile:
web: bundle exec rackup -p $PORT

こんな感じ。

$ gem install foreman
$ foreman start

ローカルでもforemanで試せる。

$ heroku apps:create --stack cedar
$ git push heroku master
$ heroku apps:open

http://floating-dawn-850.herokuapp.com/

いいね!

process typeを自分で定義する

unixのprocessなら何でもありなので適当に定義できる。

# Procfile:
web: bundle exec rackup -p $PORT
unk: echo unk; sleep 1000
% foreman start
02:23:42 web.1     | started with pid 77070
02:23:42 unk.1     | started with pid 77071
02:23:42 unk.1     | unk
02:23:43 web.1     | [2011-06-23 02:23:43] INFO  WEBrick 1.3.1
02:23:43 web.1     | [2011-06-23 02:23:43] INFO  ruby 1.8.7 (2011-02-18) [i686-darwin10.7.0]
02:23:43 web.1     | [2011-06-23 02:23:43] INFO  WEBrick::HTTPServer#start: pid=77072 port=5000

こいつは自由だぜ。

# Gemfile:
gem 'barista'
gem 'therubyracer-heroku'
$ rails g barista:install

coffeeをrailsに提供するからバリスタってか?heroku上ではコンパイルするためのjs実装が無いのでエラーが出る(ローカルではnodejsを使ってます)。therubyracerはv8のrubyバインディング。therubyracer-herokuはそれをherokuで動かすためのもの(何やってるのかはわからない。見てない)。

jpgのグリッチをもうちょっと。

こちらのpythonのコードをrubyで書いて幾つかのパターンを作ってみた。

#!/usr/bin/env ruby

require 'rubygems'
require 'mini_magick'
require 'base64'

path = ARGV.first
img = MiniMagick::Image.open(path)
txt = Base64.encode64(open(path, 'rb') {|f| f.read }).gsub(/\n/, '')
num = img[:width] * img[:height] / 10000

(1..32).each do |i|
  glitched_txt = txt.split(//).map do |c|
    if c == '0' and rand(num) == 0
      rand(9).to_s
    else
      c
    end
  end.join
  open("glitched-#{i}.jpg", 'wb') {|f| f.write(Base64.decode64(glitched_txt)) }
end

glitch

glitched-16

こっちの方が怖くていいな。

参照:サケグリッチ

夜、寝る前に布団のなかで、

(画像グリッチってデジタルなホラー表現に使えるんじゃね?)

と唐突に思い、布団から飛び起きてこちらを参考にいろんなパターンを生成するコードを書いてみた。

# glitch.rb
(1..9).each do |i|
  (1..9).each do |h|
    `cat bell.jpg | sed 's/#{i}/#{h}/g' > bell-#{i}-#{h}.jpg` unless i == h
  end
end

元の画像はこれ。

昼-寺

沢山できてる。

jpg

jpgとgifを試してみたんですが、単なる文字置換なのでフォーマットの性質がモロにでて面白い。jpgの場合はカオス過ぎてもうちょっと別のパターンを使った方が良さそう。

gif

gifの場合は何色が何個続くかってだけなので不気味感はちょっと少なめ。jpgとgifでそれぞれ怖そうなのは下記の2つぐらいかなあ。

bell-8-6

bell-7-8

参照:hysysk:blog: today's glitch 3

sqlite3-rubyをインストールしたら(tapsの依存で入る)見覚えのあるマークが。

Terminal — zsh — 80×24

これ、Twitterで聞いたらハートを横にしたマークなんですね。(屁的なものかと思ってた)

「sqlite3-rubyはsqlite3に変わったYO!」ってだけの警告文なのに誰が書いたのか分かるのって凄い個性ですね・・・。

authorを見に行ってみる。

sqlite3-ruby | RubyGems.org | your community gem host

やっぱりアンタか・・・。

まだ空きがあるはず!今日はTokyo PayPal Developers Groupのイベントですよ!

PayPal Express Checkout, Subscriptions - Tokyo PayPal Developers Group

セレゴ・ジャパン様がミーティングルームとプロジェクターを貸してくださいました。場所は渋谷駅の北川、セルリアンタワーから歩いて2分ほどです。地図:http://www.cerego.com/en/contact-us/

開場は19:30から、発表の開始は20:00頃です。イベント終了後、おそらく近くのお店で懇親会が行われます。

paypal-express@novさんのお話も絶対聞きたいし、@mreinschさんが作った、簡単にPayPalの定期支払いが出来るRailsプラグインのsubscription_fuも超注目なのです。

っていうか、今やってる仕事のプロジェクトでもsubscription_fu使うので行かなければならないのです。そしてsubscription_fuの低レイヤー部分はpaypal-expressに置き換えられる予定なので両方必聴なのです。

# Gemfile:
group :development
  gem 'haml-rails'
end

真面目なサイトを作る時になんでSlimじゃなくてHamlかっていうと、ちょこちょこバグがあるからです・・・。

ProxyLocal

ProxyLocal could proxy your local web-server and make it publicly available over the internet.

ローカルのWebサーバーに他人にちょっとアクセスして欲しい時(何かの実験中とか)に便利なgem。

# app.rb:
require 'rubygems'
require 'sinatra'

get '/' do
  ' ┐(´ー`)┌'
end

こういう糞アプリがあったとして、まずローカルで立ち上げる。

% ruby app.rb 
== Sinatra/1.2.6 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.2.11 codename Bat-Shit Crazy)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4567, CTRL+C to stop

でproxylocalをインストールして立ち上げると・・・

% gem install proxylocal
% proxylocal 4567 --host unk
Local server on port 4567 is now publicly available via:
http://unk.t.proxylocal.com/

http://unk.t.proxylocal.com/

xxx.t.proxylocal.comでアクセス出来るようになる。このぐらいの気軽さで外からアクセスさせることができると嬉しい。

datamapper(dm-core) 1.1.0では0.10.0からdeprecatedになっていた明示的なINの利用が出来なくなりました。明示的なINと暗黙的なINって何なのかというと下記の様な違いです。

# implicit
Foo.all(:id.in => [1, 2, 3])

# explicit
Foo.all(:id => [1, 2, 3])

対象がArrayだと自動的にINになるんですね。1.0.2で使ってたけどdeprecatedの表示は出てなかった気がするけどなあ。ヤラレタ。

つい先日、LokkaにもCI環境が整ったのでデグレしないようにテスト駆動バグ修正していくことにしました。

RuntimeError - explicit use of 'in' operator is deprecated - Issues - komagata/lokka - GitHub