マイペースなRailsおじさん

Ruby、Ruby on Rails、オブジェクト指向設計を主なテーマとして扱います。だんだん大きくなっていくRuby on Rails製プロダクトのメンテナンス性を損なわない方法を考えたり考えなかったりしている人のブログです。

rspecのrspecに学ぶ、ネストの深いrspecを書かない方法

ネストの深いrspec BDDは、下記のように書くので、GivenとWhenをcontextで書くとネストが深くなることがある。 Given:最初の文脈(前提)があって、 When:イベントが発生した場合、 then:なんらかのアウトプットを保証する。 例えば、fizz_buzz問題でfizz…

rspecの発端、BDDの考え方

BDDとは何か 振る舞い駆動開発。 ソフトウェアの振る舞い検証するテストをまず記述して、次にそのテストをパスするソフトウェアを記述するという開発の方法。 BDDとTDD TDDでは、何をテストして、何をテストしないべきか、という問題に当たることがある。 BD…

フラットなファイル構成のディレクトリでguardを使ってrspecを自動実行する

やりたいこと 下記のように、rubyソースコード、specファイル、Guardfileが全て一つのディレクトリにフラットに配置されている環境で、guardによる自動テスト実行を行いたい。 root_dir ├── Guardfile ├── gilded_rose.rb └── gilded_rose_spec.rb 設定方法 …

Proxyパターン

使いどころ オブジェクトに対する操作の間に何らかの操作を挟み込みたいとき 間に挟み込まれている処理に関する詳細を、対象のオブジェクトとそれを操作するオブジェクト隠蔽したいとき 構造 商品を表すItemを考える。ItemImplはItemそのものを表すクラスで…

Railsで、ユーザーの環境にあった言語を表示する

やりたいこと 言語設定が英語の人には英語、日本語の人には日本語を表示したい HTTPのAccept-Languageヘッダに応じて切り替えたい 手順 Rack::Localeミドルウェアを導入する ローカライズする Rack::Localeミドルウェアを使うと、Accept-Languageヘッダに応…

Use rails application configuration to read credentials instead of reading it directly.

When we use secret values, we can utilize credentials. Explained at below page. Securing Rails Applications — Ruby on Rails Guides For example, to use secret information for omniauth configuration, we can read from credentials. config.omni…

Set placeholder for 'contenteditable' element.

We can add placeholder to contenteditable element. HTML [contenteditable="true"]:empty::before { content: attr(data-placeholder); color: #ccc; } CSS <p contenteditable="true" data-placeholder="Please input something."></p> And then we placeholder appers. Sample https://jsfiddle.net/ytnk531/tgLw1fv5/…

tribute.js supports `contenteditable`

tribute.js is used to implement mention feature. GitHub - zurb/tribute: ES6 Native @mentions By the way, in Slack (and some chat applications) highlights inputted mentions as illustrated below. tribute.js can implement such decoration. I i…

sidekiq does not support local time zone.

sidekiq logger prints messages with occurrence time. This time is UTC. I wanted to use JST. After investigating the source code and github of sideq, I retired to do that. Because I realized sidekiq uses only UTC arbitrarily. In sidekiq log…

`break` terminates smallest loop and overrides return value.

As you know break terminates loop. Below code execute the block only once. And return nil. [1, 2, 3].each { |n| break } # => nil break can have 1 argument. If the argument was given, the value will be used as the return value of evaluation…

Authenticate user by twitter with devise and omniauth

We can authenticate an user with twitter. Set route as below. This activates callback url from twitter. devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } devise_scope :user do get 'sign_in', :to => 'd…

トランザクション中にrescueするとロールバックしないので注意!

トランザクション中のrescueはロールバックを発生させない 動画による説明 www.youtube.com トランザクション中のrescue このようにすると、create!で発生した例外をキャッチして、exec_transactionの返り値としてfalseを返すことができます。 def exec_tran…

Ruby CoreをCLionでデバッグモード実行する

CLionでRubyをデバッグする CLionは、JetBrains製のC、C++用の高機能なIDEです。このIDE上でCRubyをデバッグモードで実行すると、解析や試行錯誤が捗ります。デバッグの様子は、下記のビデオを見てください。 youtu.be 設定方法 1. Rubyのソースコードをダウ…

RubyでWebスクレイピングしたい(ダウンロード編) ~Google画像検索で検索した画像をダウンロードしてくるgemを作りました~

ダウンロード編として、スクレイピングの方法を解説する記事を書く予定だったのですが、gemの公開をもって解説ということにします。 特にメンテしていく気は無いのですが、スクレイピングで色々とコツが必要だったので忘れないようにgemとして形にしました。…

RubyでWebスクレイピングしたい(ChromeDriverインストール編)

Seleniumを使って、Google画像検索から画像をスクレイピングすることにしました。 環境 Ubuntu 18.04.2 LTS WSL2 on Windouws 10 ruby 2.7.2 selenium-webdriverをインストール まずはruby経由でWebDriverへのリクエストを送信するためのgem、selenium-webdr…

RubyでWebスクレイピングしたい(ツール選定編)

自作したスクレイピングツールで画像をあつめたい 現在開発中のアプリケーションで、エフェクターボードの画像が100枚くらい欲しかったので、Google画像検索から画像を集めることにしました。 画像収集は機械学習などでかなり需要があるらしく、自作せずとも…

やる気が出ないエンジニア、目標がわからなくなってしまったエンジニア、伸び悩んでいるエンジニア…みんな今すぐ「情熱プログラマー」を読もう

とにかくおすすめな「情熱プログラマー」 エンジニアのChad Fowlerさんが自身の経験を元に、エンジニアがどう生きていくべきか、について書いた本です。 技術革新によって自分の仕事がなくなるかもしれない、あるいは稼げなくなるかもしれない、という危機に…

Tennis-Refactoring-KataでRubyのリファクタリングの練習をやってみた

Refactoring Kataでリファクタリングを練習しています。今日も頑張りました。 Tennis-Refactoring-Kata github.com 概要 テニスのスコアリングをするプログラムのリファクタリングを行う テストは書いてある 同じ仕様のプログラムが3パターン用意されていて…

gemの概要を雑に把握するシリーズ③ rack/rack

rackgithub.com 概要 WebサーバーとWebフレームワークの組み合わせを自由に選択できるように、統一的なインターフェースを提供するライブラリ。 Middlewareを選択することで、双方向の通信の間に特定の処理を割り込ませることができる。 各ソフトウェアで必…

Refactoring Kataを使ってRubyのリファクタリングを練習する

Refactoring Kata CodeKataというサイトがありまして、これはプログラミングの練習をしたい人のための問題集です。この様な練習問題を総称して「Code Kata」あるいは「Coding Kata」と呼んでいます。Emily Bacheさんは、リファクタリングに焦点を絞ったCode …

Active RecordとNull Objectパターン

Active RecordでNull Objectパターンを使うことはできるのか考えてみました。 RubyでNull Objectパターン RubyでもNull Objectパターンを使えます。下記の記事を御覧ください。 ytnk531.hatenablog.com Active RecordとNull Objectパターン どんなときに使い…

RubyのNull Objectパターン

Rubyの場合はNil Objectパターンと呼ぶことになるんでしょうか? Null Objectパターン Null Objectパターンは、値が存在しない場合の処理を共通化したい場合に使えるデザインパターンです。 こちらの解説がわかりやすいです Nullオブジェクトパターンの紹介…

n+1クエリの自動テストが書けるgem、n_plus_one_control

N+1問題 N+1問題は、ループ内の処理を通過するたびにSQLが発行されるというパフォーマンス上の問題です。Railsにおいては、includesメソッドを使って、preloadあるいはeager loadを使って回避できます。 こちらの記事がわかりやすいです 【Ruby on Rails】N+…

Railsの設計について思うこと

Railsと設計 Railsは、Active Recordを中心に据えてコードを書いていきます。そうなると、自然とテーブル設計に強く依存したアプリケーションになって行くので、アプリケーションが複雑になっていくとツライ!となることがあります。こういった、Railsのアー…

Ruby on Railsがわからないときに見る場所

RailsはSQLからJavaScriptまで広い範囲を扱えるため、詰まりポイントが非常に多いです。私がRailsに慣れなかったころに確認していたことを振り返ってまとめてみます。 どこがつまりポイントになるか Railsが扱う要素技術は非常に多いので、初心者にとっては…

Rails6 + Webpackerな環境でyarnで入れたbulmaを使う

bulmaは美しいCSSフレームワークです。Railsで使おうとする場合、bulma-railsというgemを使ってもいいのですが、せっかくyarnが入っているので、yarnでインストールすることにしました。 bulma-railsは、本家よりすこし遅れてアップデートが反映されていくの…

Stimulas、いつつかうん?

Stimulas Stimulasは、少ないコード量で動的な表現をすることに主眼を置いて開発された、軽量なJavaScriptフレームワークです。DHH率いるBaseCampが公開してます。 主に提供している機能はこの2つです。 DOM要素のイベントと、そのイベントにフックするJSの…

gemの概要を雑に把握するシリーズ② ruby-i18n/i18n

概要 Ruby用の国際化(i18n)機能を提供するgem。ymlで書かれた設定ファイルを、規定の構造で設定しておくと、I18.tメソッドで翻訳を取得できる。 github.com 仕組み I18n.tの引数と、現在設定されているロケールを頼りにymlに書かれた対応関係に従って翻訳を…

Fiber Schedulerの使い方

この記事では、Ruby3で追加される予定のScheduled Fiberを紹介します。Ruby 3.0.0 preview1の情報であり、この機能はまだまだ議論と開発の真っ只中です。実際に正式にリリースされるのものとはインターフェースや実装が異なることをご理解ください。 Ruby本…

gemの概要を雑に把握するシリーズ① intridea/multi_json

github.com 概要 システムで利用可能なJSONパーサーのうち、最適なものを選んで使ってくれるJSONパーサーのラッパー。 できるだけ早いものを使うようにしていて、独自に優先順位を付けている。 候補がなにも使えない環境の場合はOkJSONを使う。 仕組み Adapt…