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

PerlerのRuby日記

Rubyとか

配列の要素を条件によって2つに割ってループしたい

配列の中のものに同じ処理を施すんだけど、先に奇数を処理してから、偶数を処理したい。 numbers = [1,2,3,4,5,6,7,8,9,10] numbers.select{|n| n.odd?}.each{|n| puts n*n} numbers.reject{|n| n.odd?}.each{|n| puts n*n} Array#rejectとかselectでは、条…

剰余算の自己代入の優先順位

よく変数に数を足し込むときには、+=を使う。 これと同じように掛け算、割り算も*=、/=が使えるけれど、この場合の四則演算の優先順位が気になったのでやってみたメモ。 a = 120 a /= 12 + 3 puts a #=> 8 # 120 / (12 + 3) = 8 # 120 / 12 + 3 = 13 b = 12 …

Capistrano3のデプロイのリポジトリ先を変更する

Capistrano3を使ってデプロイを行っているアプリがあったのだけれど、途中でgitのリポジトリを変更しなければならなくなってしまったので、そのときのメモ。config/deploy.rbのrepo_urlを変更する。 diff --git a/config/deploy.rb b/config/deploy.rb index…

SidekiqのWorkerクラス内でJobIDを知る

Sidekiq::Workerをincludeして使っているクラス内のperformメソッド内で自分のJobIDを知るには、self.jidで取れる。 class MyWorker include Sidekiq::Worker def perform job_id = self.jid puts job_id # some codes end end job_id = MyWorker.perform_as…

親メソッドのテスト

よくわからなくなったのでメモ。 メソッドを作ったのでテストを書く。 class H def hoge(flag) if flag "hogehoge" else "hoge" end end end describe H do describe "#hoge" do subject{ H.new.hoge(flag) } context "when flag is true" do let(:flag){ tr…

Rails Skeletonっていうのを作った

http://railsskeleton.herokuapp.com/いつもスケルトンのつづりを間違えてしまう。

単項演算子メモ

メモ。 Rubyには単項演算子が3つある。+と-と~だ。 ただし、これらは二項演算子と明確に区別されるので、オーバーライドするときには記号に@をつけて定義する。 class Fixnum def -@ -2 * self end end i = 5 puts -i #=> -10 ちなみに、左辺に値が存在しな…

Mac + Webkit + Rails + RSpec + Capybaraによるテスト

昨日のテストを、レンダリングエンジンにWebkit(QtWebKit)を使ってテストする。 こちらのいいところは、完全にheadlessなのでモニタがない環境でもテストしやすいところ。Gemfile group :test do gem 'rspec-rails' gem 'capybara' gem 'selenium-webdriver'…

Mac + FireFox + Rails + RSpec + Capybaraによるテスト

Macの環境で実際にブラウザを使ったテストがしたかった。 iOSビルドの関係でMacの上にJenkinsが載っていることもあるので。 FireFox インストール。 Gemfile 以下を追加して、bundle install。 group :test do gem 'rspec-rails' gem 'capybara' gem 'seleni…

Sinatraのエラーハンドリング

http://www.sinatrarb.com/intro.html#Error%20Handlingこちらを見ると例外はRackオブジェクトのsinatra.errorに入っているとあるが、ブロック引数としても受け取ることができる。 (バージョン1.4.4で確認) require "sinatra" # developmentモードでもデバッ…

初めてTravis CI使った

https://travis-ci.org/rightgo09/chamber 初めてTravis CI使った。CIさせるための.travis.ymlの設定ファイルの書き方があって 「またこういうルールを覚える作業が始まるお・・・」とダウナーにTravis CI: Building a Ruby Projectを見たらデフォルトでbund…

Chamberっていうbotをつくった

https://github.com/rightgo09/chamber外国人と英語でチャットしているときに、よく「ん?」となって辞書を引くのがしんどくなったので 翻訳してくれるbotをつくった。元ネタはこれ。 http://matome.naver.jp/odai/2136876483489139901Microsoftの翻訳APIが…

gemが突然見えなくなった

今日突然Jenkinsのあるジョブがエラーになってしまった。↓失敗してたジョブのコンソール表示 [error]: Missing 'redcarpet' gem for Markdown formatting. Install it with `gem install redcarpet`でもその直前にbundle installはしていて、そこにちゃんとr…

ensureはループ処理内でも動く

メモ。ensureはちゃんとnextとかbreakも捕捉してくれる。さすがensure。 %w[ normal raise next break ].each do |w| puts "===============================" puts "w: #{w}" begin raise if w == "raise" next if w == "next" break if w == "break" rescu…

配列の中にハッシュがひとつ

知らなかったのでメモ。 こう書くと users = [ id: 123, name: "Yamada", age: 21, ] こうなる。 p users #=> [{:id=>123, :name=>"Yamada", :age=>21}]

SequelでFactoryGirlを使うとき

FactoryGirl.createは最終的にsave!メソッドが呼び出されるけれど、 Sequelにはsave!はなくsaveしかないのでそれを使うようにFactoryGirl側に教えなければならない。こんな感じのエラーが出るので Failure/Error: Unable to find matching line from backtra…

2つの配列の重複要素を抽出する

社内レビューで教えてもらったのでメモ。 a = [1,2,3,4,5,6,7,8,9,10] b = [ 2,3, 5, 7, 11,12,13,14] p a & b #=> [2, 3, 5, 7] Array#&を使うと簡単だった。ちなみに最初に僕が書いたのは2つの配列をeachで回して(以下略

autotest gem 使ってみた

見ました。 r7kamura/autodoc · GitHub Rails でつくる API のドキュメントを自動生成してくれる autodoc がすごい - 彼女からは、おいちゃんと呼ばれています テストしたらそれがドキュメントになるの素晴らしいとおもいます。 で、触ってみてのメモ。 バー…

新人女子の書いたコードを直すだけの簡単なお仕事をした結果www

窓際に追いやられました。。 https://paiza.jp/poh/ec-campaign 「素直に頭から組み合わせてもいけるんじゃね?」「一回組み合わせたらキャッシュはしてるしw」と思って最初は愚直に書いてみましたが、見ての通り甘かったです。 その後、なんか登録すれば模…

Sequelの2つのマイグレーションファイル命名規則

http://sequel.jeremyevans.net/rdoc/files/doc/migration_rdoc.htmlSequelのマイグレーションファイルは2つの命名規則から選ぶことができる。 インクリメンタルな数字をつける方法と、タイムスタンプをつける方法の2つ。両方とも管理するデータベース内に…

最近何か作るときのフレームワーク

最近何か作るときは、本当に短い(寿命とかサイズとか)APIは、Sinatra一枚岩で簡単に書けるからそこそこ使うAPIは、Padrino最初から綺麗に分離できてるからHTML吐き出す必要があるときは、Railsassets compileが楽だからという感じになってる。あとは、アクテ…

はてなブログに移行しました

サブ垢で作ってたブログは置いてきた! PerlerのRuby日記 仕方ないからMovableType形式でインポートした! なんではてなの日記データ形式でインポートできないのか謎だ! 同じはてなのブログなのに! でもインポートはちゃんとできた! これからはこちらでよ…

Sequelのカラム名にはシンボルを使うこと

http://sequel.rubyforge.org/rdoc/files/README_rdoc.html Column references in Sequel Sequel expects column names to be specified using symbols. はまったのでメモ。 条件に沿って"field1", "field2"のようなフィールドにアクセスするときに 間違って…

Oj.dumpでシンボルを吐く時は:mode => compatする

Ojを知ったきっかけ Padrinoでスケルトンを作るとGemfileにojというgemが入っている。Optimized JSONの略らしい。 標準ライブラリとなったjsonよりも早いらしい。 Ruby - JSONの替わりに使ったOJが速い - Qiita [キータ] 自分も、開発しているサービスで使わ…

thinでsleepして止まった話

先日、スマートフォンアプリの実装の開発を助けるために、以下のようなAPIをつくった。 # app.rb require "sinatra" # ロックファイルを作る get "/lock" do FileUtils.touch("/tmp/lock") "ok" end # ロックファイルが存在する限りループ(1秒間隔でチェック…

reelというWebサーバを知った

celluloid/reel ? GitHub Celluloidという非同期の処理をするライブラリを使って作られているらしい。 Sinatraの1.4.4のChangesに入ってたので知った。 Rackと協調するには別途reel-rackというgemが必要。 # Gemfile source 'https://rubygems.org' gem 'sin…

Sinatraでrake routesその2

いま流行りっぽいYARDのSinatra用gem yard-sinatra | RubyGems.org | your community gem host を使うと 簡単にルーティングを出力できるみたい。 ↓の"Other use cases"を見た。 rkh/yard-sinatra ? GitHub Gemfile source 'http://rubygems.org' gem 'rake'…

Sequel3.48でgraph使ったらdeprecated出たので対応した

通常のjoin Sequelを使って、単純にAテーブルとBテーブルをjoinすると、同名のカラムが存在する場合、右側の方が有効になる。 mysql> select * from a; +----+------+-------------+ | id | z_id | name | +----+------+-------------+ | 1 | 123 | Yamada T…

Padrino入門した

Sinatraのapp.rbがどんどん大きくなって仕方がなくなってきた。 が、Railsまでいかないので、よくその中間と言われるPadrinoの門を叩いてみた。 Padrinoについてぼくが知っていることといえばビュッフェスタイルということだけである。 $ ruby -v ruby 2.0.0…

Railsで2個めのDBを作ってマイグレーションする

Ruby on Rails使ってて、どうしても2個めのDBを作る必要があったのでメモ。 Railsのバージョンは4.0.0。 アプリ名は「Sakura」。 (1個目マイグレファイル)db/migrate/* に加えて (2個目DB名)sakura_second (2個目マイグレファイル)db/second_migrate/* とし…

privateメソッドはrespond_to?でfalse

タイトルどおり。一瞬詰まったのでメモ。privateなんだからオブジェクトは直接respondできません! class Foo def bar "bar" end private def baz "baz" end end foo = Foo.new foo.respond_to?(:bar) #=> true foo.respond_to?(:baz) #=> false

Rack::MethodOverrideを少しいじった話

よくある背景 よくある理由でIE対応を迫られて、ありがちな理由でPOSTなのにURLにパラメータがくっついてくるという ありふれた問題にぶつかったまでは良かったのだが(悪かったのだが) RESTfulなAPIに対応するという点で少しはまったのでメモ。 試したこと …

SinatraでJSONを返す

Sinatraと小さいAPIはとても相性がいい。 APIで返すものといえばJSONが最近は楽ですね。 まあ普通にrequire "json"して、#to_jsonすればよいのですが、 sinatra-contribにあるsinatra/jsonを使うのもよいかと思います。 Sinatraだけの場合 app.rb require "s…

Sinatraとsinatra-contribのStreamingの違い

Sinatra標準のStreamingと、公式拡張sinatra-contribのStreamingの違いについてメモ。 Sinatra標準Streaming 使い方 # coding: utf-8 require "sinatra" get '/' do stream do |out| out << "やあ<br>" sleep 1 out << "こんにちは、<br>" sleep 1 error_message = "…

なぜRackのResponse BodyはStringではなくArrayなのか

run lambda { |env| [ 200, {"Content-Type" => "text/plain"}, ["Hello World!"] ] } この3つ目のbody。 PSGIでもそうだけど、なんでStringでも良さそうなのにArrayなのか。 ふと気になってググったら全く同じ内容がstachoverflowにあった。 ruby - Why is …

Sequel4.1.0とmysql2でstream

Sequel4.1.0からmysql2クライアントのstreaming機能を使えるようになったらしい。 4.1.0.txt テーブルからでっかい行数を取得しようとするときに、 一気に取ってきてメモリに展開するのではなく ちょっとずつ取ってきて、メモリを節約できる。 例えば1行ず…

デフォルト引数を入れる変数を2個

デフォルト引数を入れる変数を2個 作ることもできると知ったのでメモ。 def hoge(foo = bar = 123) puts "foo: #{foo}" puts "bar: #{bar}" end hoge(234) #=> foo: 234 #=> bar: hoge #=> foo: 123 #=> bar: 123 引数を渡してhogeをcallしたときに、barの…

elsifに条件式がない

今日面白いコードを見た。 「elsif」に条件文がなくって、「あれ? これバグじゃね?」と思ったけど結果的にちゃんと動いていた。 a = "Hello, world!" if /hoge/ === a a.downcase! elsif a.upcase! end p a #=> "HELLO, WORLD!" こんな感じ。 たぶん「elsi…

ハッシュのシンボル

1.9からハッシュの生成に簡易な書き方ができるようになった。 {key:"value"} # => {:key=>"value"} JSっぽい。 ただ言語仕様上、値がシンボルの時は空けざるを得ないので、空ける。 「::」になるとクラスの空間セパレータになってしまうから。 { key: :value…

raiseで投げる例外クラス

raiseで投げる例外クラスは、Exceptionクラスを継承しなければならないみたい。 class Hoge end raise Hoge #=> TypeError: exception class/object expected

短いけどわかりにくいコードを可読性考えて書きなおしてみた

なんかこういう感じのコードがあったので、 def readable? !Hoge.count(self) == 0 && self.title != "" end こういう感じに書き換えた。 def readable? return false if Hoge.count(self) == 0 return false if self.title == "" true end 3行に増えたけど…

Sinatraでrake routes

SinatraでRailsのroutesタスクを作ってみた。 Sinatraのバージョンは 1.4.3 で確認。 見た目重視。 トップレベルにルーティングを定義している場合 Rakefile desc 'something like rake routes of Rails' task 'routes' do require "./app" Sinatra::Applica…

Sinatraについて

書く

RSpecのbeforeはeachよりallが先に動く

はまったのでメモ。 beforeがどこに書かれているかに関わらず、eachよりもallの方が先に動くらしい。 spec_helper.rb require "rspec" RSpec.configure do |config| config.before(:each) do puts "config before each" end end shared_context "sharecon" d…

三項演算子の代わりに

簡単に書けるならハッシュを使ってる。 slimテンプレート li class:"#{@sidebar==:home ?'active':nil}" home li class:"#{{home:'active'}[@sidebar]}" home @sidebarが:homeなら、 <li class="active"> になるし、 @sidebarが:home以外なら、ハッシュのキーが存在しないから、</li>…

cucumber-railsでpendingがCIで失敗扱いになった話

メモ。 cucumber-railsを入れて、 rails generate cucumber:install したときにできるconfig/cucumber.ymlが <% rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : "" rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] …

二次元配列は1回のeachで回せる

教えてもらったのでメモランダム。 いままで二次元配列は二回eachを使って取り出していたが、 ブロック引数に複数指定すると中の配列の要素がそのまま取り出せる。 いままでやってたやり方 array = [[1,2,3], [4,5,6], [7,8,9]] array.each do |ary| ary.eac…

Rails勉強会@東京 第80回に行ってきた

Rails勉強会@東京 第80回 - Rails勉強会@東京 | Doorkeeper 初めてのRails勉強会に行ってきた 入口の裏口に@onkさんと@nobyukiさんがいて戸惑うことなく入館できたよかった 自分含め5人で少ないなと思ってたら、結局そのまま5人だけだった やったこと まずdi…

変数とメソッドで同じ名前だと、呼び出しでは変数が優先される

hoge = 123 def hoge 234 end hoge #=> 123 # かっこをつけるとメソッドコール hoge() #=> 234

勉強会でGitの使い方について色々知った

Git

A-B-C-Dと積まれているコミットを A-B-C └D みたいに分けたいときどうするか branch && reset && commit -a それrebase --ontoでできね? マニュアル見よう! git help rebase We can get this using the following command: git rebase --onto master next …