There's an echo in my head

日々のメモ。

ruby

M1 Mac で Ruby 3.2.0 をインストールした際に libyaml でちょっとハマった

Ruby 3.2 から libyaml や libffi などのソースコードがバンドルされなくなった*1らしく、その影響で次のようなエラーが出た。どうやら libyaml が見つからないらしい。 $ rbenv install --verbose 3.2.0 (snip) yaml.h not found (snip) psych: Could not b…

ERROR While executing gem - wrong number of arguments (given 1, expected 0)

ちょっと古いrubygemsで発生する下記のエラーが、普通にコマンドを叩くだけでは回避できなかった。 ERROR While executing gem - wrong number of arguments (given 1, expected 0) · Issue #2224 · rubygems/rubygems · GitHub $ gem install bundler -v 1.…

ファイルアップローダを手軽に立てられるようにした

端末からスクリーンショットをPCにアップロードしたいことがあって、でもAndroidのBluetoothとかよくわからないし…というときに、手軽に立ち上げられるようなアップローダを作った。 github.com $ curl -sL https://raw.githubusercontent.com/a2ikm/uploade…

インタラクティブにRipperで構文解析するIRipperというREPLを作った

github.com 「この記述はRubyにどういうふうに解析されているんだろう!?」という疑問を逐次解決していくためのREPLとして作りました。 lex、sexp、tokenizeというRipperのメソッドを使って、引数で与えられたコードを解析して表示します。 $ iripper iripp…

Integer Unificationの判定方法

CRuby 2.4から整数がIntegerに統合されるとともにその子クラスであるFixnumとBignumが廃止されたが、下記のようなコードを使えばそれを手軽に判定できる。 if 1.class.name == "Integer" # 統合後の処理 else # 統合前の処理 end このようにバージョン番号を…

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にできない。

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