Ruby
最近は仕事では Docker 上で開発することがほとんどでローカルでRubyをいじらない。 いつからか ローカルでの bundle install が失敗するようになっていた。 bashのshebangを実行ファイルに書くと良いという情報があったが、それでもなおらなかった。 $ bund…
以下をコードの止めたいところに書けば良い。 メソッドの定義内に書いても問題ない。 require "pry"; binding.pry コードを確認し終わって、元に戻したい時は以下を実行すれば良い。 $ bundle pristine GEM_NAME
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…
戻り値 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…
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) …
Railsで開発をしていると、たくさんSQLを実行しているサーバだと development.log の出力が多すぎて追うのが大変になります。 こういう時、別ファイルに出力させたいのですが、以下のように行えばOKです。 また、log/ 以下は gitignore されていることがほと…
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…
以下を /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…
いつも仕事でもプライベートでも使っている bundler だけど、中身のコードを把握していないのでどうも雰囲気で使っている感が否めない。 そこで、ソースを読み腹落ち感を得るためにコードを読む準備を進めてみた。 pry-byebug を使ってブレークポイントで止…
設定 .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',…
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…
この書き方ができるの知らなかった. # レシーバが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 :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…
定義 class Log < ActiveRecord::Base enum reason: { login: 0, purchase: 1, finish_game: 2 } end 呼び出し 以下のように書いておくと、後から変更が必要になった時にわかりやすい pry(main)> Log::reasons[:login] => 0 全部欲しい場合 pry(main)> Log::…
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ライブラリの検索パス, $LOAD_PATH $0 : 実行中のRubyスクリプトのfile名 $/ : 区切り文字 $, : デフォルトの出力フィールド区切り文字列 参考: module Kernel (Ruby 2.1.0)
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…
以下の記事を読んで初めて知ったのでメモ。 Ruby で メモ化カッコカリ( #rubytokai 発表メモ) - 名古屋で数学するプログラマ(仮) Hash.new にブロックを渡すことができる。 このブロックはすぐには実行されずに、h["key"] と言う形で参照されたキーがhash…
オブジェクトのパラメーターとメソッドの引き数名が同じ時は、メソッドの引数が優先される。 もしも、パラメーターを呼びたい時はselfをつける。 class Foo attr_accessor :name def bar(name) p name # => "aaa" 引数が優先されている p self.name # => "do…
プロジェクトで使っている bundler で入れたgemの調査をするためのコマンドをbashで書いた。 Ruby 書くときは atom がメインエディタになりつつある。 RubyMineは重いので、コードリーディングの時だけ使っている。 ### bundler でインストールした gem を編…
「Rubyのしくみ」(Ruby Under a Microscope)を読みました。 Rubyのしくみ -Ruby Under a Microscope-作者: Pat Shaughnessy,島田浩二,角谷信太郎出版社/メーカー: オーム社発売日: 2014/11/29メディア: 単行本(ソフトカバー)この商品を含むブログ (4件) を…
# 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
固有ベクトルは任意の行列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を書いてみました。 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…
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"]