マイペースなRailsおじさん

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

2021-01-01から1年間の記事一覧

やりすぎないドメイン駆動設計 on Rails

ドメイン駆動設計(DDD)では、Springのようにドメインをほかの関心事(データソース、プレゼンテーション)から分離したフレームワークが用いられることが多です。一方で、Ruby on Railsは、ドメインとデータソース層が密に結合しており、DDDには向いていな…

Windows 11 + WSL2でRubyMineを動かす

Windows11をクリーンインストールしました。 WSL上で動くRubyMineのセットアップがとても簡単になっていたので紹介することにしました。 ほかの処理系のインストールを除けば、ほかのJetBrains系のIDEも同じ手順でできると思います。 なぜWSLでRubyMineを動…

いい感じのAction View用gemを作ったら、すでに提供されている機能だった

解決したかった問題 ActionViewで、条件付きで有効になるクラスを作ろうとすると、ややこしくなることがある。 buttonは常につけて、特定のコントローラーで処理しているときだけbutton-activeをつけたいとき、erbで頑張ると下記のようになる。 <a class="button<%= " button-active" if controller_name=="targets" %>"> # control</a>…

Peoplewareを読んだ

Tom Demarco & Timothy ListerのPeoplewareを読んだ。いまいち理解できていない部分が多いので、ここに書いて整理する。 要旨 ソフトウェア開発における課題の大半は技術的な問題ではなく社会学的なものである、という主張を核に、ソフトウェア開発のマネジ…

Minecraft統合版サーバーを立ててNintendo Switchからも遊べるようにする

環境 Windowsで立てたサーバーに、ローカルネットワーク内の統合版のマイクラからアクセスして遊べるようにしたい。 サーバー: 統合版サーバー (マシン: Windows 10 自作PC) クライアント: マインクラフト統合版(マシン: Windows 10, Android, iPad, Swit…

YouTube Data APIを使って登録者の少ないYouTubeチャンネルを探す

YouTubeからデータを取得しまくってアプリケーションを作ろうと思っていたが、一日あたりにリクエストできる量が限られていて結構厳しくて頓挫した。 アプリケーションを作る前にやりたいことができるのか確かめるためにスクリプトを書いたので、供養のため…

システム設計って何すりゃいいの? ~System Design Primerを読んでみる~

System Design Primer https://github.com/donnemartin/system-design-primer システムをスケールさせるためのアーキテクチャ構成の仕方を学べる資料集。 主に、パフォーマンスの要求に応えられるようにするにはインフラをどのように組み合わせればよいのか…

実践TDD 第一章

テスト駆動開発のポイントとは? システム開発は、作ろうとしているものへの理解を深めながら進行する システムとその用途を学ぶためには、作ってリリースしてフィードバックを得るのが良い 実装する前にテストをすることで設計する。何をさせたいかが明確に…

命名のコツ

クリーンコードのメモ。 良い名前付けのためのルール 意図を明確にする なぜそれが存在するか、何をするか、どのように利用するか、がわかる名前にする コードの外側にあるコンテキストがわかるようにする 偽情報を避ける 意図した意味とは違う用途で使われ…

テストとリファクタリングがよい設計を作る -創発的設計の考え方-

クリーンコードに「創発」という気になる名前の章があったので読んでみた。ざっくりいうと、とりあえず動くものを作ってから後から設計するという考え方で、私も最近はこういった感じで開発している。 創発的設計 よい設計を最初に考えるのではなく、コード…

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として形にしました。…