読者です 読者をやめる 読者になる 読者になる

There's an echo in my head

日々のメモ。

rubotyをデーモンとして動かす

Herokuで動かしてたりdockerでデプロイしてたりするとあまり旨味はないのかもしれないけど、普通にcapistranoでデプロイして動かしたいようなときもあるのでやってみた。 下記のスクリプトを例えばyour_ruboty/lib/daemonize.rbみたいな場所に置いておく。 #…

Ruby 2.2.0でsafe_yamlを使うときはv1.0.4以上が必要

Ruby 2.2.0を使っていて次のようなエラーが起きたらsafe_yaml(webmockなどが依存)がv1.0.4未満になっていないか確認、なっていたらv1.0.4以上に上げる。 NoMethodError: undefined method `tagged_classes' for Psych:Module NoMethodError: undefined met…

PTY.spawnで外部コマンドを実行する

以前Open3.popen3で外部コマンドの出力を随時受け取って表示するということをやったけど、それでは不便な場面が出てきた。 というのも、例えばgrepでマッチした部分を色付けしたものを得ようとしてもOpen3.popen3で受け取ることはできない。これはgrepが出力…

SingleXLSXというgemをリリースした

Ruby標準のCSVライブラリのように、一枚のシートだけからなるXLSXファイルを読み書きするためのもの。 a2ikm/single_xlsx http://rubygems.org/gems/single_xlsx 使い方 読み 配列の配列で取得する。 Name Age Einstein 76 Feynman 69 SingleXLSX.read("path…

外部コマンド実行時の標準出力、標準エラーを随時受け取る

Rubyで外部コマンドを実行する手段はいろいろあるけど、そのほとんどは実行し終わったときにまとめて標準出力等を得ることになる。時間がかかるコマンドを実行しつつその出力を随時受け取りたい場合にはOpen3.popen3を使う。 require "open3" Open3.popen3("…

Gemfileを分割すればbinstubしたコマンドがもっと早く起動するかと思ったけどそんなことはなさそう

経緯 Gemfileのなかでrailsとcapistranoの両方を書いていたら、capコマンドを実行するたびにrailsを読み込んで無駄じゃないのか?せっかくbinstubしたスクリプトのなかでGemfileを指定してるんだから、それをcapistrano用に分割すればcapコマンドがもうちょ…

natsortというgemを作った

自然順ソートするやつ。 require "natsort" %w(a 02 1).natsort #=> ["1", "02", "a"] PHPからRubyに移ってきた頃にこことか見ながら適当にmixinしてたものをちゃんとgemにしたんだけど、最近はnturallyとかあるのでそっちを使ったほうがよさそうな気もして…

ActiveDecoratorと組み合わせてJbuilderのpartial!を使うとnil?というキーができる

ActiveDecoratorと組み合わせてJbuilderのpartial!を使ったら、次のようにnil?というキーで空のハッシュができていた。 { "nil?": {}, // .jbuilderに書いた通りのキー } これは、partial!したときに裏で呼ばれるrenderメソッドの:localsオプションにjsonオ…

Rack::Session::Abstract::IDのsecureオプションをリクエストごとに変えられるようにしてみた

a2ikm/rack-dynamic_session_secure RailsのセッションストアではRack::Session::Abstract::IDに渡される:secureオプションの値によってCookieのsecure属性を付けたり外したりできるんだけど、基本的にベタの値*1しか受け付けていない。 これをリクエストに…

WebMockでスタブしつつSSLのOpenID認証を使う

結論からいうと WebMockでHTTP通信をスタブしつつとSSLのOpenID認証を使う場合には次のようにWebMockを設定する必要がある: WebMock.allow_net_connect!(net_http_connect_on_start: true) どういうことかというと ruby-openidはidentifierがSSL(https://か…

OmniAuthでの動的なパスとOpenID認証

とりあえずメモ。 :request_pathオプションと:callback_pathオプション OmniAuthでproviderを宣言する際に:request_pathオプションにProcを渡すことで、デフォルトだと/auth/:providerとなっているリクエストフェーズ開始のパスを動的に設定できる。 たとえ…

callの返り値とRack::Response.newの引数の順序

callの返り値の順序とRack::Response.newの引数の順序が違ったのでメモ。*で展開できたら楽だったのになあ。 class GreatMiddleware def initialize(app) @app = app end def call(env) result = @app.call(env) response = Rack::Response.new(result[2], r…

RubyでSchemeの処理系を書いてみた

つくって学ぶプログラミング言語 RubyによるScheme処理系の実装を4章まで読んで、実際に実装してみた。 a2ikm/scheme_r 文字列どうするんだろうとか、REPLしょぼいなーとか、一つのクラスにほとんど処理ツッコんでるなーとか、さらに5章ではこの処理系で自分…

Rubyの正規表現で対応する括弧を考慮していい具合にマッチさせる

1.9以降に搭載された正規表現エンジン(oniguruma, onigumo)では (?<name>式)によってマッチした式部分に名前(ここではname)を付けることができ、 それにマッチした内容を後方参照\k<name>で参照でき、 また\g<name>でその式を再帰的に呼び出すことができる これを使えば、</name></name></name>…

sortと<=>

2列ソートをやろうとしたんだけど、ここらへんのことをすっかり覚えてなかったので復習。 a <=> bはa > bなら1を、a < bなら-1を返す。一致すれば0。bに対してaが大きいかどうかを返してて、aが主人公っぽいイメージ(レシーバだから当然か)。 p 1 <=> 2 #=…

Unicodeブロック/スクリプトを使うと日本語の正規表現に便利

Oniguruma(CRuby 1.9系組み込み)とOnigumo(CRuby 2.0系組み込み)で利用できるUnicodeブロックおよびUnicodeスクリプトを使うと、日本語(というか多バイトの文字列)に対する正規表現が手軽に書ける。 例えば\p{N}は全角半角にかかわらずアラビア数字に…

TCPServerを相手にスレッドを使ったテスト

ok_gntpdというTCPServerをつかったサーバを相手にしたテストを書いた時のメモ。 テストしたい内容としては サーバを立ちあげて、 特定の文字列を送信したときに 特定の文字列を受信する ということ。規模的に結合テストというほどのものではないけど、サー…

Enumerable#cycleで無限に循環するイテレータを作る

周期の異なるループを混ぜ込むのに便利。 iterator = ("a".."z").cycle 1.upto(100) do |i| puts "#{i}: #{iterator.next}" end

SinatraでJbuilderを使う

RABLのDSLわからんヽ(Д´)ノ((object`ってなに…)) ってなってるので、tilt-jbuilderをforkしてSinatraで動くようにした。 sinatra-integrationというブランチを切ったので、Gemfileに次のように記載するとSinatraでもJbuilderが使えるようになる。 # Gemfile g…

ok_gntpdというgemのバージョン0.0.5をリリースしました

しました。 ok_gntpd (0.0.5): is.gd/Pk8Yl2 An GNTPd which always return "OK".— RubyGemsさん (@rubygems) 2013年2月24日 リポジトリはgithub:a2ikm/ok_gntpdです。 これはGrowl Notification Transportation Protocol 1.0にしたがってOKを返すだけのサー…

rspecの初期化手順

とりあえずspecを回したいよね、というとき。 $ vim Gemfile $ bundle install $ rbenv rehash $ rspec --init $ vim spec/spec_helper $ vim Rakefile Gemfile gem "rspec" spec/spec_helper 冒頭に以下を追記して、$LOAD_PATHの追加(この場合はlib/)と適…

ruby-2.0.0-rc2を入れた(サクッと)

@satococoa先生により、前回よりだいぶスッキリした方法でインストールできた。 環境は引き続きOSX 10.8.2。 $ RUBY_CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`" rbenv install 2.0.0-rc2 D…

ruby-2.0.0-rc2を入れた(いったん)

環境はOS X 10.8.2 Mountain Lion。 とりあえずrc1と同じ手順。 $ cd ~/.rbenv/plugins/ruby-build $ git pull origin master $ CONFIGURE_OPTS="--enable-shared --with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`…

CSVをYAMLに書き換える

標準添付のcsvライブラリの使い方をいつも忘れるのでメモっておく。 require "csv" require "yaml" hash = {} csv = CSV.read(path_to_csv, headers: :first_row) csv.each do |row| id = row["id"] hash["foo_#{id}"] = { "id" => id, "name" => row["name"…

ok_gntpd.gemを作った

常にOKを返すGNTPサーバok_gntpd.gemを作った。 内容はほぼMacで(たぶん*nix系であれば)動く、とても簡単なGNTPサーバ のコピペ。ソースはGitHubに上げてある。 GNTPdってしてるけど、まだdaemonにできない。

Rackことはじめ

run <callメソッドに反応するオブジェクト>となっていれば良い。 # config.ru run lambda { |env| [ 200, # ステータスコード { "Content-Type" => "application/json" }, # レスポンスヘッダ [ %Q!{"title":"Back to the Future","type":"movie"}! # レスポンスボディ(ここではJSON) ] ] } レ</callメソッドに反応するオブジェクト>…

mrubyをビルドしてみる

$ git clone git://github.com/mruby/mruby.git $ cd mruby $ make mruby/bin以下にmruby、mrbc、mirbができる。 それぞれインタプリタ、コンパイラ、REPLである。 mrubyとmirbはいつもどおりとして、mrbcとはなんだろう。 #!/usr/bin/env mruby puts "Hello…

Time.parseで時刻をパースする

標準ライブラリであるtimeをrequireするとTime.parseで文字列をパースしてTimeのインスタンスを作ることができる。 require "time" time = Time.parse("Thu, 08 Mar 2007 15:30:46 +0000") #=> 2007-03-09 00:30:46 +0900 ちなみにRailsでは事前にrequireさ…

ruby 2.0.0-rc1を入れた

1/7にリリースされてたので入れた。 基本的にはruby 2.0.0-preview2と導入方法は同じで、ruby-installを更新したあとでインストール。この記事もほとんどコピペ。 ちなみに環境はOS X 10.8.2 Mountain Lion。 cd ~/.rbenv/plugins/ruby-build git pull origi…

おみくじ

%w[大吉 中吉 小吉 大凶].sample ちなみに。全国のおみくじの70%は女子道社というところで作られていて、折りたたむ作業はすべて手作業だそうな。すべて自動化されているんだろうと思ってたけどそうでもなくて、ちょっと面白い。

RSpecにdescribeやcontextで使えるメソッドを実装する

describeやcontext間で共通する処理をメソッドにするとスッキリするんだけど、それをspecファイルをまたいで共有したいときに。 module RSpec module Core module MyHelper # 適当に名付ける module ExampleGroupMethods def my_let(*args) p args let(*args…

Kernel.rand(n)はnが整数値の場合にn未満の値を返す

よく忘れるのでメモ。 Kernel.rand(n)は、nが整数値の場合には0..(n-1)の範囲の整数をランダムで返す。 つまり、rand(2)とやっても返ってくるのは0もしくは1のどちらかのみで、2が返ってくることはない。

serialize-rails gemでJSONをDBに格納する

ActiveRecordのserializeはYAMLにしか対応していないけど、serialize-railsを使うとJSONやXML、RubyのMarshalも保存できるようになる。 # Gemfile source 'http://rubygems.org' gem 'rails', '3.2.9' # 3.0.0 以上が必要 gem 'serialize-rails' # app/model…

クラス変数とインスタンス変数

class Klass @iv = 1 @@cv = 2 def self.iv; @iv end def self.cv; @@cv end def iv; @iv end def cv; @@cv end end class SubKlass < Klass end # クラスのインスタンス変数を参照してみる Klass.iv #=> 1 SubKlass.iv #=> nil Klass.new.iv #=> nil SubKla…

ruby 2.0.0-preview2を入れた

12/1にリリースされてたので入れた。 基本的にはruby 2.0.0-preview1と導入方法は同じで、ruby-installを更新したあとでインストール。 ちなみに環境はOS X 10.8.2 Mountain Lion。 $ cd ~/.rbenv/plugins/ruby-build $ git pull origin master $ CONFIGURE_…

bundlerでgemを作る

不完全ながらメモ。 雛形を作る $ bundler gem hello こうするとhelloディレクトリが作られて、その中にひな形のファイル(hello.gemspecとかlibとかが作られる)。 hello.gemspecを変更する TODOと書かれているgem.description、gem.summaryは変更しないとr…

Object#instance_execでブロック引数を省略する

def configure(&block) @config ||= Configuration.new block.call(@config) end configure do |config| config.use :yaml end みたいなのが、Object#instance_execを使うとスッキリ書ける。 def configure(&block) @config ||= Configuration.new @config.i…

ruby 2.0.0-preview1を入れてみる(成功)

前回のログをさかのぼってみたらreadlineまわりでもエラーが起きていた。 なので、readlineも入れなおしてやってみたところ上手くいった。 ちなみにOS X 10.8.2 Mountain Lion。 $ brew upgrade readline $ brew link readline $ brew upgrade openssl $ bre…

has_one, has_many, belongs_toでconditionsを動的にする

Rails has_many with dynamic conditionsより、ActiveRecord 3.1+ではprocを使う必要があるみたい。3.2.8で確認済み。 class User has_many :pictures has_one :profile_picture, class_name: "Picture", foreign_key: "user_id", conditions: proc { ["id =…

ruby 2.0.0-preview1を入れてみる(失敗中)

ruby-installの一覧を更新したあとで、rbenvで2.0.0を入れたらopensslがrequireできない を見ながらチャレンジ。 $ brew upgrade openssl Error: openssl-1.0.1c already installed $ CONFIGURE_OPTS=--with-openssl-dir=`brew --prefix openssl` rbenv inst…

rbenv install(ruby-build)の一覧の更新

rbenvのプラグインとしてインストールしている場合、 $ cd ~/.rbenv/plugins/ruby-build $ git pull $ rbenv rehash Homebrewで入れている場合、 $ brew upgrade ruby-build ただしこちらは更新が遅いので、横着してHomebrewで入れるよりもrbenvのプラグイン…

gemのディレクトリに移動する

$ cd $(dirname `gem which active_record`)

Enumerable#zipってなんぞ

レシーバと引数で与えられた配列を、レシーバの要素数個の配列に分割する。 (複数の配列の要素を、そのインデックスごとに取り分けた配列を作る、のほうが的確?) a = [1, 2, 3] b = [4, 5, 6] c = [7, 8, 9] a.zip #=> [[1], [2], [3]] a.zip(b) #=> [[1,…

Hash[]ってなんぞ

偶数個の引数からハッシュを作る。 Hash[] #=> [] Hash[1] #=> ArgumentError: odd number of arguments for Hash Hash[1,2] #=> { 1 => 2 } Hash[1,2,3,4] #=> { 1 => 2, 3 => 4 } array = [1,2,3,4] Hash[array] #=> {} 最後の一つだけよくわからないなぁ…

schema_plusで外部キー制約をかける

schema_plusを使うとcreate_tableやadd_columnでカラムを定義するときに:referencesオプションにテーブル名を渡すだけで、外部キー制約を手軽にかけることができる。 create_table :posts do |t| t.integer :category_id, references: :categories end 個々…

ActiveRecord::Baseにfindとかfirstっぽいメソッドを生やす。

Rails 3.2.8の話。ActiveRecordは長いのでARと略す。 findやfirstの実装自体はAR::FinderMethodsで定義されていて、それをincludeすることでAR::Relationのインスタンス(user.postsとかUser.scopedの返り値)から使えるようになっている。 module AR::Finde…

rabl、配列を作るときはcollectionよりもnodeを使ったほうが楽なこともある

{ "user": { "id": 1, "name": "John Smith", "posts": [ { "id": 1, "title": "Hitchin' Ride" ] } } というJSONを作りたいとき、"posts"が配列だからcollectionでも使えばいいのかなと思ったけど、どうにもうまくいかなかった。結局nodeを使うのが楽だった…

rablで各エンドポイントに共通のノードをルートに生やす

【追記】とても微妙。要検証 言葉で説明しづらいので、例を示す。APIが次のようなJSONを返すとする。 { "note": { "text": "補足情報" }, "user": { "id": ユーザのID, "name": "ユーザー名" } } ここで "note"はAPIの各エンドポイントで共通のノードなので…

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。