u16suzuの blog

日々学んだことのメモブログです。

Ruby

The file '/usr/local/bin/bundle' is marked as an executable but could not be run by the operating system.

最近は仕事では Docker 上で開発することがほとんどでローカルでRubyをいじらない。 いつからか ローカルでの bundle install が失敗するようになっていた。 bashのshebangを実行ファイルに書くと良いという情報があったが、それでもなおらなかった。 $ bund…

Railsで使っているgemの内部で実行を止める

以下をコードの止めたいところに書けば良い。 メソッドの定義内に書いても問題ない。 require "pry"; binding.pry コードを確認し終わって、元に戻したい時は以下を実行すれば良い。 $ bundle pristine GEM_NAME

Rubyでグラフを表現してみる

class Vertex attr_accessor :id, :edges def initialize(id, edges=[]) @id = id @edges = edges end def print puts "#{ @id }" @edges.each do |edge| puts edge end end end class Edge attr_accessor :id, :from, :to, :length def initialize(id, from…

Kernel#systemと`` の挙動の違い

戻り値 p system "ls" # => true p `ls` # => "Capfile\nGemfile\nGemfile.lock\n...." エラー時の挙動 p system "ls2" # => nil p `ls2` # => No such file or directory - ls2 (Errno::ENOENT) の例外が発生し、 空文字列がかえる p ls2 の例については be…

Rubyの細かい記法のメモ

begin, end で複数行をインスタンス変数にキャッシュできる def calc_camage(base) # 最終値={基本値×(1-1/8)×武器補正×攻撃回数} base * (1-1/8) * 8 * 1 end def damage @damage ||= begin atk = 12 dfn = 9 base = atk/2 - dfn/4 calc_camage(base) …

Rubyで別ファイルにログを出力する

Railsで開発をしていると、たくさんSQLを実行しているサーバだと development.log の出力が多すぎて追うのが大変になります。 こういう時、別ファイルに出力させたいのですが、以下のように行えばOKです。 また、log/ 以下は gitignore されていることがほと…

size,count,empty? のパフォーマンスを確認する

size,count,empty? のパフォーマンスを確認をしてみる。 require "benchmark" count = 1000_000 ar = [1, 2, 3, 4, 5] Benchmark.bm(10) do |x| # 10はラベルの為に確保する長さ x.report("size") do count.times do ar.empty? end end x.report("count") do…

gem のコードを git clone して RubyMine で開くスクリプト

以下を /usr/local/bin に置いて、 chmod a+x clone_and_open.rb しておく。 clone_and_open.rb https://github.com/u16suzu/foo すると ~/src にダウンロードされる。 clone_and_open.rb #!/usr/bin/env ruby class CodeReader # clone and open # # git re…

gemのソースを pry-byebug を使ってブレークポイントで止めて読む準備

いつも仕事でもプライベートでも使っている bundler だけど、中身のコードを把握していないのでどうも雰囲気で使っている感が否めない。 そこで、ソースを読み腹落ち感を得るためにコードを読む準備を進めてみた。 pry-byebug を使ってブレークポイントで止…

rails console から任意のメソッドのソースコードをRubyMineで開く

設定 .pryrcに以下を追記する。RubyMineのCUIコマンドがない場合は Tools > Create Command-line Launcher... で作っておく。 Pry.config.editor = proc { |file, line| "/usr/local/bin/mine --line #{line} #{file}" } Pry.commands.alias_command 'mine',…

RubyMineとiTerm2 でRubyのバックトレースからファイルを開く時に RubyMine で開けるようにする

1 RubyMineのコマンドラインランチャーを作成する RubyMine のツールバー > Tools > Create Command-line Launcher... 2 iTerm2側で設定をする iTerm2 の Preferences > Profiles > 任意のプロファイルを選択 > Advanced タブ > Semantic History > Run Comm…

リトライ処理のメモ

Rubyでリトライ処理をする際のテンプレ。再帰を使って綺麗に書ける。 class RetryException < StandardError; end def foo p Time.now raise RetryException end def retry_foo( rc = 3) begin foo rescue RetryException => ex # RetryException以外はretry…

Object#methodについてメモ

この書き方ができるの知らなかった. # レシーバがself. (Object#methodはレシーバとメソッドの実態を封入する.) [1,2,3].each( &self.method(:puts) ) [1,2,3].each( &method(:puts) ) # selfを省略できる [1,2,3].each{|i| puts(i) } こちらはたまに使う. #…

定数を定義する

module Constants GOLD_DEFAULT = 100 ITEM_MAX_COUNT = 255 end p Constants::GOLD_DEFAULT, Constants::ITEM_MAX_COUNT # => 100 # => 255 p Constants.constants # => [:GOLD_DEFAULT, :ITEM_MAX_COUNT] 定数は初めだけ大文字であればよいのだが、全部大…

実引数側でのアスタリスク(*)の使用例メモ

実引数側でのアスタリスクの使用例メモ。配列オブジェクトを展開してメソッドの各引数に入れてくれる。便利。 def foo(name, val) "#{name}: #{val}" end ar = [[:a, 1], [:b, 2], [:c, 3]] ar.each do |elem| puts foo(*elem) # here end こちらの記事のsci…

scopeの使い方メモ

よくググるのでメモ scope :available, -> { where('deleted = false') } scope :available, -> { receivable.opened.showable } # 引数あり scope :find_by_friend_ids, -> friend_ids { where( target_id: friend_ids ) }

[キーワード引数] キーワード引数の使い方メモ

よく忘れるのでキーワード引数の使い方のメモ. 2.1からarg1のようにキーワード引数のデフォルト引数は省略できるようになった. def foo( arg1: , arg2: "arg2") puts "#{arg1} #{arg2}" end # 定義時に省略したarg1は呼び出し時には省略できない.(ArgumentEr…

enumのメモ

定義 class Log < ActiveRecord::Base enum reason: { login: 0, purchase: 1, finish_game: 2 } end 呼び出し 以下のように書いておくと、後から変更が必要になった時にわかりやすい pry(main)> Log::reasons[:login] => 0 全部欲しい場合 pry(main)> Log::…

Rubyのメタプログラミングメモ

Classをインスタンス化する時にHashで渡した値でInitializeするクラスのテンプレート class Person attr_accessor :name, :age, :address def initialize( hash={}) if block_given? yield( self ) else hash.each do |k, v| public_send("#{k}=", v) if res…

Rubyの特殊変数メモ

$! : 最後に発生した例外オブジェクト $: : Rubyライブラリの検索パス, $LOAD_PATH $0 : 実行中のRubyスクリプトのfile名 $/ : 区切り文字 $, : デフォルトの出力フィールド区切り文字列 参考: module Kernel (Ruby 2.1.0)

Classをインスタンス化する時にHashで渡した値でInitializeする

Classをインスタンス化する時にHashで渡した値でInitializeする class Person attr_accessor :name, :age, :address def initialize( hash={}) if block_given? yield( self ) else hash.each do |k, v| public_send("#{k}=", v) if respond_to?("#{k}=") en…

Hash.newにブロックを渡す

以下の記事を読んで初めて知ったのでメモ。 Ruby で メモ化カッコカリ( #rubytokai 発表メモ) - 名古屋で数学するプログラマ(仮) Hash.new にブロックを渡すことができる。 このブロックはすぐには実行されずに、h["key"] と言う形で参照されたキーがhash…

オブジェクトのパラメーターとメソッドの引き数名が同じ時は、メソッドの引数が優先される

オブジェクトのパラメーターとメソッドの引き数名が同じ時は、メソッドの引数が優先される。 もしも、パラメーターを呼びたい時はselfをつける。 class Foo attr_accessor :name def bar(name) p name # => "aaa" 引数が優先されている p self.name # => "do…

2016/8/1(mon)の日記

プロジェクトで使っている bundler で入れたgemの調査をするためのコマンドをbashで書いた。 Ruby 書くときは atom がメインエディタになりつつある。 RubyMineは重いので、コードリーディングの時だけ使っている。 ### bundler でインストールした gem を編…

「Rubyのしくみ」(Ruby Under a Microscope)を読んだ

「Rubyのしくみ」(Ruby Under a Microscope)を読みました。 Rubyのしくみ -Ruby Under a Microscope-作者: Pat Shaughnessy,島田浩二,角谷信太郎出版社/メーカー: オーム社発売日: 2014/11/29メディア: 単行本(ソフトカバー)この商品を含むブログ (4件) を…

2つの proc を合成して1つの proc にする

# 2つの proc を合成して1つの proc にする def foo(arg1, arg2) Proc.new do arg1.call arg2.call end end p1 = Proc.new { p 123} p2 = Proc.new { p 456} res = foo( p1, p2 ) res.call # => 123\n456

Rubyで行列とベクトルの演算

固有ベクトルは任意の行列m を適用した際に,向きが変わらないベクトルのこと require 'matrix' m = Matrix[ [2,1], [1,2] ] v1 = Vector[1, 1] v2 = Vector[1, -1] # v1は m の eigen vecotr p m * v1 # => Vector[3, 3] # v2 is eigen vector of matrix m t…

Rubyで設定系DSLを書いてみた

こちらのスライドを参考にしてRuby で設定系のDSLを書いてみました。 sixeight.hatenablog.com ところどころ、コメントを書いて理解しながら書いてみました。 # 設定系DSL class Awesome class Config attr_accessor :hoge, :fuga # (a) attr_accessor :method …

よく使うクエリパラメータ系のメソッドを使い回せるようにする

ページネーションがあるAPIを作るとき毎回書くのが大変なので共通化した。 base_controller.rb に書いておくと、他のコントローラから使い回せて便利。 def params_page params[:page].try(:to_i).presence || 1 end def params_site_ids params["site_ids"].tr…

自分で作ったクラスで Enumerable モジュールを include して使う

class CatList include Enumerable def initialize(*cats) @cats = cats end def each for v in @cats yield v end end end cats = CatList.new( "mike", "cha", "tora" ) p cats.map(&:upcase) # => ["MIKE", "CHA", "TORA"]