おふくろさまより愛をこめて

mmmpa ふとしです。誠実なプログラミングを心がけたい。

Ruby entries

2018/05/01 13:23:02

一つのアプリケーション開発でも機能を gem に分けて分割統治すると具合がよい

コツは同じリポジトリかローカルパスが通る状態でやること。あと vendor とかにダウンロードする方式にしないこと。 gem 'module_a', path: '../module_a' gem 'module_b', path: '../module_b' rails s でのサーバーへの反映 (つまりブラウザでクリッククリックして動作確認しているような場合) は再起動が必要で

2016/11/01 00:01:19

Ruby 外から Web アクセスする何か (Capybara とか、cli とか) を RSpec でテストするときのアクセス先をモックする

mmmpa.mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmpa.net のテストをこの方法で行いました。 本編 たとえば、Capybara は各種ブラウザを介するアクセスのため、webmock が効かず、別の gem が必要なのは有名です。 https://github.com/oesmith/puff

2016/10/30 22:35:11

siege をラップして多少細かい情報をまとめる gem 書いた。

github.com Usage たとえば Rails 内でこうやる。 re = SiegeSiege.run( time: 20, concurrent: 4, user_agent: false, urls: [ "http://localhost:3002#{students_path}"

2016/10/24 05:06:39

RSpec とか Capybara の Example 内で使いたいメソッドをクラス単位でまとめて使いやすくする gem を書いた。

これ github.com 先週の gem は 80 行ぐらいだったんですが、今回は 40 行です。 なぜ 入社してからこっち、ずっと Vue.js で SPA 制作という業務に従事していましたが、UI 系の宿命で (一部しか) テストがない。 そんななかで、わりと分岐の多い (難しくはない) 実装をすることになって、これは手作業では (変更の都度に) 確認しきれん

2016/07/28 06:38:08

Access-Control-Allow-Originが設定されてないWeb APIを叩くために中継サーバー書いた。

大げさなタイトルみがありますがただのRailsです。 github.com うすうす実装なのでさがせばあるんでしょうけど、人が書いたもの使いたくない場合ってあるじゃないですか。 起動 $ TARGET=http://you-want-to-ajax.server.com ALLOW=http://your-local-js.server.com rails s つか

2016/07/26 13:28:10

ActiveAdmin辺りでCircular dependency detected while autoloading constant Fooが出る場合の措置。

Rails 4.2.7、ActiveAdmin 1.0.0.pre4で発生しました。 普通にやってる分には出ないんですけど、下の記事みたいに外からRails.application.require_environment!すると、models関連でCircular dependency detected while autoloading constant Fooが出ます。 mmmp

2016/07/24 16:00:27

Rails開発でリポジトリには入れたくないんだけどローカルではやっておきたいテストがある場合の取りあつかい

自明だったり、すごく重かったり、細かすぎるテストたちがいます。 重いテストは短期的にも長期的にもコストになり、細かすぎるテストは実装変更時のコストが必要以上に高く、よくありません。 しかし、たまにやっときたいんですよというテストがありますので、本体に影響がないようにやっていきます。 Railsのディレクトリの外にもう一層つくる 以下のような構成になりました。 - /

2016/07/24 00:09:38

Authlogicに関するメモ

認証機能再発明するべからずは有名な鉄則ですが、まるで知らないままというのもマズイので実装を読むことでお茶を濁していきたい。 saltやSCryptの運用、persistence_tokenの更新などで比較的安全にいけるのでは。 パスワード salt Authlogic::Random.friendly_token def friendly_token # us

2016/07/05 02:34:47

レールズにプルリクエストがマージされてハッピーだった

ので、思いつく限りのSNSやブログに書いています。 ここにも書きます。 どれ 以下の記事のやつを作ってる時に「バグかしら?」と思ってモンキーパッチで回避してて、せっかくだからとpull requestを飛ばしてみたら忘れた頃にマージされたという話です。 qiita.com Rails5.0.0がつい先日リリースされましたが、その時には自分でも忘れていて、ほん今日、な

2016/06/15 15:27:21

rails-erdでRails Engineベースのアプリケーション(Spree、Solidusなど)のER図を得る。

たっぷりとしたコードを含むRails Engineは上から読んでいくにはつらいものです。 いくつかのgemに分割されているSpreeのようなアプリケーションを読むにはインストールして起動しつつ、その上で読んでいくのが楽ですが、手がかりがないのはつらい。ということてrails-erdを使います。しかし、 Engine以下のmodelsは読んでくれない という問題があるのでそれに対

2016/05/14 01:20:01

ActionCableで遊んでたらなんかリロード毎につながったりつながらなくなったりすんですけど?って時。

あたらしいもの好きなのでActionCableをいじっています。WebSocketは別に新しくない?おかたいことを言わないで。 ところでこの解決策は推測でしかないんですが、とりあえず解決したので暫定メモ的なアレですが、困ってる人はどうですか。 Redisががんばったまま おそらく開発中に、ブラウザから接続したままでサーバーを再起動したりしてると、適切にConnectionが切断

2016/03/15 00:13:00

一年越しでpaizaコーディングスキルチェックの「うなぎを蒲焼きにしたくない」を倒せたので嬉しくなって日記に書く。

トイレ最高! 去年、6回ぐらい挑戦して駄目だったけど、今日ふと思いついて何度か失格して、トイレで座ってる時に突然わかって書いたらうまくいきました。 トイレ最高! 日記です 結局今回も何度か失格はしてるんですけど、個人的に引っかかってたのをなんとかクリアできてうれしくなったというだけの話で、素晴らしいコードを編みだしたとかそういうのではないので、日記です。 成長

2015/10/12 13:38:30

CGIとしてつくってSinatraにのせた時に気づいたことメモ。

フレームワークに頼りきりだったので、リクエストとレスポンス、アプリケーションの入力と出力などを個別に意識できず、それぞれの責務をうまく分離できていなかった。 リクエスト ユーザーのアクセスした場所やポストされたパラメーター、自動的に送られるクッキーなどが関心の対象になる。 フレームワークやライブラリによって、参照する方法や保持の形がちがう。 未加工でつっこんだ時の問題

2015/10/11 23:30:48

Herokuを使う予定のない人もTwelve-Factorは読んでおいて損がない。「プロフェッショナルのための実践Heroku入門」読んだ。

The Twelve-Factor AppはHerokuが提唱する、モダンなアプリケーション開発において守らなければならないドグマみたいなもんです。 なおネットで無料で和訳ページがあります。 12factor.net 見よう見まねでやってた実際的な開発手法がカリッとまとまっているので、再就職して新しい流儀が必要になるまでは守っていきたい。 でHeroku本体。 He

2015/10/11 20:33:40

今朝のメールフォームをHerokuで動くように変更した。

http://sinatra-liaison.herokuapp.com/ github.com データベースへの保持をしなくなったので、Herokuにかんして特につまずくことはなかった。 CGIとSinatra間でのちょっとした違いでちょっと時間がかかった。 CGIとSinatraでのパラメーターの扱いのちがい チェックボックスは配列としてうけとるのだが、CGIラ

2015/10/11 14:12:44

CGIとしてRubyでメールフォームした。その後、立ちあがりが遅いのでSinatraで動くようにした。

最近バックトゥ基礎ということでC言語の学習やデータ構造、アルゴリズムの勉強をしていたのですが、そういえばCGI時代に生きてきたけどCGIで何かをつくったことがないと思い当たった。 それに、徳丸本やAPIの本、Railsガイドなどを読んでフレームワークが良い仕事をしていることを知り、それに乗っかって生きるのがベストプラクティスであることはわかったのだが、いや自分でもちゃんと書けた方がいいよね

2015/07/24 02:58:59

プログラミング問題とその回答に「ん?」と思うところがあったのでメモる

問題はこれ。 <a href="http://qiita.com/jnchito/items/2db66f9a5c7d55aed925">【Rubyプログラミング問題】値札分割メソッド(split_price)を作成してください - Qiita</a>qiita.com 自分の回答はこれ def split_price(price_text) uni

2015/06/28 13:16:58

Viewのテンプレート内で下から上に挿入するgem書いた。

Kaizan <a href="https://github.com/mmmpa/kaizan">mmmpa/kaizan</a>github.com 改ざんです。self.output_buffer.gsub!するとCould not concatenate to the buffer because it is not html safe.って怒られたりH

2015/06/22 02:37:06

うまれてはじめて gem をつくって公開しました。

Tanemaki といいます <a href="https://github.com/mmmpa/tanemaki">mmmpa/tanemaki</a>github.com README.md に書いてあるとおり、seed.rb で CSV に使って大量の初期値を楽にぶちこむためのやつです。業務で 10 keys ほどもつ Hash を Hoge.creat

2015/06/02 14:42:12

Squeel 導入したら ActiveRecord#select で死んだ

User.select(:first_name, :last_name) みたいなことをしておった状態に squeel をいれたら ArgumentError (wrong number of arguments (2 for 0..1)) と言われました。 コードをみたら引数一個しか取らない感じになってる。他はだいたい*argsなのに、なんでselectだけこんな仕打ち

2015/03/12 15:02:15

Heroku のファイル永続化用に Nginx nginx-upload-module でアップローダーを用意する

おはようございます。 先週末にはじめて Heroku にデプロイして以来その便利さのとりこになってとにかく何でもつくってはあげつくってはあげしています。自前のサーバーにあげるとリソースを食いあって残念なことになりますが、これなら多くても安心で文明を感じました。 アップロードしたファイルを Nginx に投げて保存してリネームして名前を返してもらって Heroku 側で保持する

2015/03/03 06:14:25

Rails で mountable なのを作ってる時、test/dummy 以下の FactoryGirl が二重に呼び出されてしまいアレだった。

ネット上で見つけたコードを馬鹿正直にコピペしていたら死んだし俺が悪かったという話です。 いつもの感じで rails plugin new new_plugin --mountable cd new_plugin rails g rspec:install したままではプラグイン用に生成される factories にパスが通ってないので以下のような感じで rails_helpe

2015/02/25 23:14:34

API へのアクセス後にコールバックがいる動作のテスト用にアクセス内容を表示するだけの Rails 用意した。

ギョームおつかれさまです。 <a href="https://github.com/mmmpa/any_receiver">mmmpa/any_receiver</a> 素 これで http://192.168.30.130:3000/access こう返る。 {"path":"access","method":"get"} パラ

2015/02/23 13:29:02

Rails で RESTful な API をつくるときは認証、承認をどうしたらいいの?

認証はまぁともかくとして承認の段で http://example.com/api/sessions/token/resources/show みたいなのが一般的ですみたいなこと言われて「?」となったのが発端で考えてました。許可証からなんか出てくるわけじゃないだろ的なあれで。 こう? Rails では簡単にベーシック認証を処理できるので http://token@ex

2015/02/11 21:57:39

clientside-haml-js を試そうとしたら undefined がどうのと言われて困った。

結論だけいうと underscore.string のバージョンが 3.0.x だと 640 行目の contents = (_.str || _).rtrim(line[0]); で死ぬ。 underscore.string を 2.4.0 に換えれば健康な生活に戻れます。 で clientside-haml-js 動かしてみましょう + Haml をとり

2015/02/11 15:44:18

Authlogic の create、save で undefined method `true' と言われて困った

Rails 4.2.0、Authlogic 3.4.2 での話です。 Authlogic の問題ではなく scrypt が 2.0.0 だと死ぬので 1.2.1 にしたら動きます。 gem 'authlogic' gem 'scrypt', '~> 1.2.1' 原因がわからなかったのでひとまず gem 'authlogic', github: 'binarylo

2015/02/08 00:47:10

各 Input の下にエラーメッセージ出すだけの FormBuilder を書いていた

Rails Plugin のつくりかたを学ぶ一環として書いていた。 これが こうなる 仕事で Rails を触りだしてからとにかくフォームをつくる機会が多い。サイト訪問者が使う層はともかくとして、サイト管理画面になるとなんか嫌になるほどフォームをつくる羽目になって半ば死んでいた。 もっと早く Rails Guide をちゃんと読んで FormBuilder

2015/02/05 14:00:29

Rails の FormBuilder をテストしようと思ったら new にわたす template をどうすればいいかわからず困った

view 内の form_for から instantiate_builder を経てこういう形で呼びだされます。 builder.new(object_name, object, self, options) self is 何?かというと view から呼びだされるのでもちろん view ですが、FormBuilder 対象のテストなので view なんてありません。ので用意し

2015/02/03 02:09:26

SASS 記法でマップの書き方がわからなくて困った。

SCSS ではこうですが、SASS では怒られる。 $black: ( name: 'black', light: #666, dark: #000 ) SASS 記法では 1 行でおねがいしますということでした。 $black: (name: 'black', light: #666, dark: #000) ちまたでは SCSS の記事ばか

2015/02/01 16:32:04

Authlogic の Session.create! を失敗したときに Session のインスタンスを例外オブジェクトに持たせたかった。

要は ActiveRecord::RecordInvalid#record のように使いたいんでモンキーパッチで module Authlogic module Session module Existence class SessionInvalidError < ::StandardError def initialize(session)

2015/01/27 13:50:05

途中から attr_encrypted を導入したら配列アクセス演算子でアクセスできなくて困った。

最近はドット演算子で attribute を参照する統一をしているので問題ないのですが、初期に書いたのは配列アクセス演算子 [] を結構使っていて難儀しました。 もともとはworker[:name]つう感じで生で扱われてました。 attr_encrypted :name, key: 'a secret key', attribute: 'name_encrypted' こ

2015/01/19 00:39:33

ActiveModel の errors.messages に入ってるエラーメッセージが、どの validation でひっかかったかテストで知りたい。

という思いがずっと前からあって下記エントリーのような対応をしていました。 <a href="http://mmmpa.hatenablog.com/entry/2014/05/11/%E3%83%86%E3%82%B9%E3%83%88%E3%81%8C%E9%80%9A%E3%82%8B%E3%81%9F%E3%81%B3%E3%81%AB%E3%83%AC%E3%83%83%E3

2015/01/12 23:56:30

Rails の form_for でエラー出たときに、エラーはちゃんとエラーが出た項目の下に出したい。

エラーは各フォームの近くに表示したいけど form_for の中身の記述を増やしたくはないのでカスタムフォームビルダーを作成する。 Rails Guide でやり方読む フォームヘルパー — Rails ガイド <a href="http://railsguides.jp/form_helpers.html#%E3%83%95%E3%82%A9%E3%83%BC%E3%8

2015/01/12 13:48:33

Rails Engine を RSpec でアレしてたら controller spec で No route matches が出まくって困った

rails plugin new --mountable からつくる Rails プラグイン作成を試しています。 自動テストにはいつも RSpec を使っているので使えるように調整して model spec は問題なく終了したのですが、controller spec でひっかかりました。 generate にまかせた spec で module ChatPlug RSpec

2015/01/06 07:28:18

Capybara と Phantomjs で ChatWork をアレしようと思ったら Capybara::Poltergeist::StatusFailError とかいわれてなにも取得できなくて困った。

取得できる HTML は <html><head></head><body></body></html> こんなんだし、status_code は nil だしで完全に困っていたが debug: true オプションをつけると題名のようなエラーが出ていたのでグーグル先生に聞くとこれ。 <a href=

2014/12/16 14:13:05

カスタム Validator をつくったら自動的に translate されなかったので困った。

ネット先生いわくこのようにエラーメッセージを追加しなさいとのことだったが、直接 errors に << すると ActiveModel::Errors#normalize_message を通らないのでメッセージが未消化のまま出てくる事態となる。 class StrNumValidator < ActiveModel::EachValidator def valida

2014/11/28 14:42:52

Ruby on Rails の Routes を Controller スペックで使える感じに内部で取得する。

ログイン時、非ログイン時の振り分けなんかは全自動総当たりテストしたいので。 routes = Rails.application.routes.routes.map do |route| path = route.path.spec.to_s.gsub(/\(\.:format\)/, "") params = path.scan(/:([a-zA-Z_]+)/).flatten.

2014/11/05 00:31:20

Capybara で feature から 2 つ以上の scenario を回すと Capybara::Poltergeist::DeadClient で死ぬ

用もないのに Poltergeist などで全ページスクリーンショット撮るのが半ば趣味です。 さて今日も今日とて楽しくフィーチャスペックを書いておりましたところ死にました。 Failure/Error: auth_manager(page, kill: true) Capybara::Poltergeist::DeadClient: PhantomJS client died whi

2014/09/23 21:41:26

validates いじってないのに valid? で false になるようになった

作業をすすめていると突然テストが通らなくなって、valid? が false 返すのはいいけど errors みてもなにも message ないし本当にどうしようかと思いました。save(validate: false) でその場をしのいて、結局あとで一つずつコメントアウトしたりして、これ。 <a href="http://itakeshi.hatenablog.com/entry/

2014/08/15 05:48:11

弊社、アジャイルっぽいことをしたいらしい。

テスト一枚も書かない文化の弊社でそれやると、サイクル毎に臨死体験が楽しめると思う。 おれも頭数で聴衆として参加した Ruby ビジネスフォーラムで、講師 matz さんがアジャイル推ししていたのをきいて思いついてしまったのだろうか。同時に、テストあってこそアジャイルでまわせる、すなわちテスト文化がある Ruby 最高と言っていたのだが(たぶん)、そういうことはおろか弊社の現状もわかっていな

2014/07/15 14:30:20

滅裂というツイッタークライアントをつくりました。

http://m2r2.ore-omae.com/ ツイートの単語を入れかえて文意が変わる感じのやつです。 Twitter の連係保持とかアカウント確認テストの試しように作りました。 ツイートの単語を入れかえて文意が変わる感じのやつです。 が 単語のやつを入れかえてツイートが変わる文意の感じです。 みたいになります。

2014/06/23 00:23:26

Ruby on Rails で Stylus をつかう。あと、nib も。

Stylus は簡潔な記法で CSS をナニできるアレです。HTML コーディングが主だった前職でもウィンド~ズ + Sublime Text で使ってました。いまも使ってますが。 http://learnboost.github.io/stylus/ 最近の Rails では stylus_rails じゃなくて stylus を使います。 gem 'stylus' 忘

2014/06/09 03:04:59

Rails でアクションの再利用してたら render :hoge and return で DoubleRenderError に足つっこんだ。

任意の view を描画してアクションを中断するには render :hoge and return などとするわけですが、これは render がtrueを返すことを期待したandの使用法です。今回は new -> create の流れのなかでエラーを出すために使っていたのですが、エラー表示や hidden の埋め込みのためにrender :newではなくnew()しており

2014/05/23 19:53:21

RSpec 3 にアップデートするにあたっての章が「RSpec による Rails テスト入門」に追加されたらしいので早速ためした。

読むと RSpec 2.99 beta2 を導入すると RSpec 3 でなくなったりする API を使ってたりすると警告を出してくれるらしいので早速ためしました。 うまれてはじめてテスト書き出いてから 1 週間とか 2 週間なので、変更するポイントはほとんどなくて、指示に従ってこういうのを expect(collection_owner).to have(0).errors_on(

2014/05/16 06:58:04

Rails で MeCab と KEN_ALL.CSV などをもちいて住所の抽出を試みた。

http://13.ore-omae.com こんな感じの精度が悪いアレです。 形態素解析(なんて言葉も把握してなかったときですけど)を試みようとして、これあきらかに個人では無理やんとあきらめていたところ MeCab というオープンソース形態素解析エンジンを発見したのでさっくりとコンパイルしてコマンドを叩いたところ、おどろきの性能に文明を感じました。 http://mecab.go

2014/05/14 01:32:01

今日もテストを書いてて Capybara に殺されそうになってる。

コントローラーのテストの章が終わったのでフィーチャテストに進んだのですが、しょっぱなから Capybara 内でおこなった Model#create が visit 先のビューに反映されない事例に遭遇して死にそうになった。 Capybara でもコントローラーもビューも全部 Rails.env == 'test'なのにビューだけからっぽでなにが起こってるかさっぱりわからない。 泣きそ

2014/05/12 02:22:13

テストが通るたびにレッドライト!グリーンライト!ってさけんでるんだけど RSpec でわからないことがある。

Ruby を全面に押し出してる会社に転職してはや半年ほど、Ruby というか Rails 力が足りないので他の職務をこなしておりますが、そればっかりやってもいられないということで最近は空き時間をみて Rails をさわっています。 いちおう慣れてきた感じはするので Ruby と Rails といえばテストだろつうことで「Everyday Rails - RSpecによるRailsテスト入門

2014/05/08 23:47:55

Rails の Rake からツイートさせるようにしました。

http://13.ore-omae.com の追加内容を http://twitter.com/mmmpa にツイートします。 必要な gem は twitter だけなので Gemfile に書いて gem 'twitter' あとは twitter.rake かなにかを用意して引数でツイ~トできるようにする。 namespace :twitter do tas

2014/05/07 19:21:37

定期的に動くなにかを Rails でつくりました。

http://13.ore-omae.com twitter でロムしてる優れ技術者のなかには定期的に動く何かを飼っている人がおり、ワナビーとしてはやはり形から真似しなければなるまいと、とりあえずスクレイパーのたぐいをつくることにしました。 定期実行には Whenever Rails の定期実行には Whenever という gem を使いました。 #config/sch

2014/05/01 14:49:11

ファイルアップロード機能をつけた。

先日 Rails で作成したブログにファイルアップロード機能をつけた。 おもに画像をアップロードして記事内に貼りつけることを目的としているので、画像の情報を取得する必要があった。 https://github.com/sdsykes/fastimage が使えるっぽいので使った。 FastImage.size('/www/img/hotei.jpg') => [853, 48

2014/04/30 00:09:00

Rails の練習に最小限の機能しかもたないブログをつくりました。

http://ore-omae.com/ 転職先ではいまのところ Actionscript と Javascript を書く生活ですが、他のチームでは Rails が猛威をふるっており Javascript との連携でもこの先使えるし使えるようにならないとねってことで自習をすすめています。 ということで以下のように勉強していました。 http://railstutorial

2014/04/29 00:33:58

Ubuntu + rbenv + ruby-build 用コピペ

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc git clone https://github.co

2014/02/10 01:55:40

POST データが切り捨てられちゃうのでなんでかなーと思ったら Ruby とか Rails の制限じゃなくてブラウザごとの違いだった。

Safari 系だと 1 value につき 524288 文字っぽい。DOM で編集した長いテキストを HTML のまま保存しようとしたらひっかかった。value をいくつか用意したら問題なく送信できましたけど、可変長なデータを扱うしなんだかなー。 コマッタナー。 追記 : hidden の input にいれたら普通にいけましたね。

2014/02/04 00:02:16

Ruby の GServer で message-body がうまくとれなかった

勉強のために Ruby でブログでもつくってみるやんけ、とまず Gserver で簡易サーバーをたてて POST を取得しようとしたらいきなりつまずいた。 require 'gserver' class HttpServer < GServer def initialize(port=8080, host="127.0.0.1", *args)