既存のRailsプロジェクトにRedisコンテナを追加した

Redisとは RedisはWebサービスなどのシステムにキャッシュ機能を簡単に実装出来るツールです。キャッシュを利用していない場合のシステムは毎回クエリを発行するので、DBが大きければ大きいほどパフォーマンスが落ちてしまいます。少しでもシステムを高速化したい時にキャッシュは一番手っ取り早く効果を出せる方法です。 今回はDocker上で動かしている既存のRailsプロジェクトにRedisコンテナを追加してキャッシュ機能を実装したいと思います。 Docker修正 まずはdocker-compose.ymlにRedisコンテナを追記します。必要な場合は各自6379/tcpポートの開放を行っておいて下さい。 〜 中略 〜 ... 御覧になる | 御シェアする

joinsとincludesの違いを分かっている奴どんくらいいるの?

はじめに Rubyを扱っていれば一度くらいはDB操作でjoinsやincludesといったメソッドを使うことがあるかと思います。この2つのメソッドは意外と奥が深くてそれ故に理解するのが少しだけ難しい側面があります。久しぶりにjoinsとincludesを使おうとしたのですが完全に使い方を忘れていて調べ直すはめになってしまいました。そこで今後繰り返し調べることがないように今回まとめておきたいと思います。 N+1問題について まず用途についてですがN+1問題を回避する為に使うことが多いです。N+1問題とはループの中でDB操作を記述してしまい、結果クエリを大量に(ループ回数分)発行してしまうことです。 例えばAモデルとBモデルに関連があるとしてAテーブル全体に対してeachで一つずつ処理をするとします。そして関連のあるBテーブルのレコードを検索してA・Bそれぞれの情報を出力する。これをAテーブルのレコード分繰り返します。 ↑は典型的なN+1問題が起こるパターンです。クエリをAテーブルから全件取得する1回と、Aテーブルのレコード数分Bテーブルから関連のレコードを検索するので合計(N+1)回のクエリを無駄に発行しています。レコードが多いほどパフォーマンスが低下してしまいます。これを回避するのにjoinsやincludesを使います。 joinsメソッドについて まずはjoinsメソッドについて見てみます。仮にAとBに関連があるとしてA.joins(:B)と実行したとします。この場合SQL的には次のようなクエリが実行されています。 ※A、Bそれぞれのカラムは適当ですが関連を持つためにBがa_idを持っていると想定して下さい。 SELECT... 御覧になる | 御シェアする

RubyistのAtCoderとの向き合い方

AtCoderとは AtCoderとは競技プログラミングのコンテストを行っているサービスです。良質なプログラミングの問題が沢山提供されています。またRubyistとはRubyを書く人の事で私もRubyistです。今回はRubyistがAtCoderに取り組む姿勢についてまとめてみました。 といっても私は偉そうにプログラミングを語れる程の技術力がある訳ではないです。なので今回はRubyistがAtCoderを利用することで何を得られるか、どう向き合っていくべきなのかという事を自分なりの目線で勝手にまとめてみたという記事です。 RubyistがAtCoderに取り組む意味 まず先に断っておくと私がAtCoderに取り組んでいる目的は競プロで良い成績を残したいからではありません。そもそもパフォーマンスで他の言語に劣るRubyは競プロには向いていません。※もちろん少ない記述でコードを書けるRubyは大好きですよ 私がAtCoderに取り組んでいる目的はRubyを使って様々な問題を解くことでRubyに対する理解を深めるためです。AtCoderで問題を解いているとそれまで知らなかったメソッドを知れたり思いがけない発見があったり多くのことを学べます。そしてRubyによる課題解決の訓練をたくさん積むということは確実に仕事にも活きてきます。場数を踏んだエンジニア達は面構えが違います。 人の回答を読む AtCoderで問題を解いてみると分かりますがコードを提出すると即採点してくれます。ただ、その結果が合格だからといってそれで終わらせてしまうのは勿体ないです。大事なことは先にも言いましたが、Rubyの理解度を高める事です。他のRubyist達がどんな解き方をしているか見ることは非常に勉強になります。これは自分の知らないメソッドだけじゃなくアルゴリズムや考え方など概念レベルで学べる事が多くあり、コーディング以外の副産物も得られます。 コードを書くこととコードを読むことは表裏一体です。コードを書くのが速い人はコードを読むのも速く、逆にコードを書くのが遅い人は大抵読むのも遅いです。人のコードを読む能力は書く能力と同じぐらい重要なことです。 テストを書け AtCoderを続けていればいつか必ず提出したコードが不合格になります。その時優秀な貴方ならきっとこう思うでしょう。「何故不合格なんだ、落ちたテストサンプル見せろや」と。お気持ちはよく分かるのですが、しかしこの考え方はエンジニアの姿勢として正しくありません。何故なら「テストサンプルくらい手前で作って自力でバグを見つけろや」が世のエンジニア達の一般論だからです。 もしかするとこの記事の中で一番伝えたかった事はこれかもしれません。どんなに小さな機能でもテストを書きましょう。どんな機能でもテストを書けるということはそれ自体が高度な技術です。テストを書く事はベストプラクティスです。また、テストを書く事に慣れるほど仕事の開発速度・精度が向上し必ず幸せになります。 これはつい最近の話ですが兄弟会社からあるシステムの機能拡張を依頼されましたが、こいつがとんでもなくクソコードでした。恐らく様々な人達が手を加えたのであろう無秩序で煩雑なコードで書かれた無数のファイル、もといゴミの山がそこにありました。勿論テストは一切ありません。 一応は要件通りの機能を追加しました。ですが果たして今回の変更が既存の機能に影響が出ないと言い切れますでしょうか。無理でした。システム全てを把握している時間は無かったですし、何より作成者との連絡が取れなかったので。そもそもバグの上に機能を追加するような状況でしたからとりあえずリリースして出たとこ勝負です。 こういう時テストさえきちんと書いていればどこで不具合が発生しているかの切り分けが楽になるのです。切り分けがスムーズにいけばデバッグに掛かる時間も短縮され、精神的にも余裕が生まれます。面倒でもテストは書きましょう。AtCoderでテスト力も身につけてられたらエンジニアとしてもっと上に行けるはずです。 とりあえず一問解いてみる まずは一問解いてみましょう。AtCoderのチュートリアルのような問題です。 あなたは、500 円玉を A 枚、100 円玉を B 枚、50 円玉を CC 枚持っています。... 御覧になる | 御シェアする

Vue.jsとRailsをDocker上に構築

Vue.jsは良いぞ Vue.jsはSPAを作るのに非常に良いフレームワークです。学習コストが低くパフォーマンスは高く、そして自由があります。サードパーティの開発も盛んでVuetifyというUIを提供しているフレームワークも併せてお勧めです。 今回はバックエンドにRailsを使いAPIサーバを立てて、フロントエンドにはVue.jsを使ってAPIを叩いてシェルスクリプトを実行出来る環境をDocker上に構築してみたいと思います。フロントエンドのUIにはVuetifyを使用します。 環境構築にはこちらの記事を参考にさせて頂きました。https://qiita.com/Kyou13/items/be9cdc10c54d39cded15 Vue.jsとRailsのコンテナを作成 Dockerfile作成 適当なディレクトリを作成して下さい。その中身を下記のような構成にすることが目標です。 $... 御覧になる | 御シェアする

RubyOnRailsで付箋アプリ作成

はじめに 今回作りたい物は付箋アプリです。もう何回目の付箋アプリなのか、分かりませんが、Railsに慣れていくためにも、基本的な事からやっていこうと思います。 環境の準備はこちらを見ながらやってみて下さい。 モデル作成 プロジェクト・データベースは作成済として、モデル作成からまとめていきます。contentカラムはメモ内容を格納する用です。 $... 御覧になる | 御シェアする