- 1. Ruby on Railsのモジュラーモノリス化を推し進めるpacks-railsというgemがすごいという話📦
- 2. Ruby 3.2以上 (というか psych 4.0.5 以上) と timecop 0.9.5以下を組み合わせると、YAML の Date がパースされなくなる
- 3. Rails DM機能の実装
- 4. ユーザー操作をテストする【Ruby】
- 5. 先日の続き
- 6. Parallel gemで実装した処理をRspecでは同じスレッド上で動かす
- 7. 初心者は第一言語にPython避けるべき?
- 8. Dockerイメージサイズを劇的に削減する方法【Rails7】
- 9. 【一網打尽】Specが書かれていないメソッドを検知する構文解析CLIツール”omochi”の紹介
- 10. SDK for Rubyを使用してS3で署名付きURLを発行し、ブラウザにてダウンロードを行う。
- 11. 手数料計算【javascript】
- 12. Dockerで環境構築(Rails7+mysql)
- 13. Rails 6.1においてのAWSへのwebcompile
- 14. AtCoder Beginner Contest 344参戦記録(A~C問題)
- 15. docker compose run時にNameError: uninitialized constant Nokogiri::HTML4と遭遇した時の対処法
- 16. 文字列から特定の文字列だけ抜き出したい時の正規表現はどう書いたらいいの?
- 17. 【Rails】一覧表示の順番を指定する(古い順、新しい順)
- 18. 【Rails】メソッドの中でメソッドを定義したらRuboCopに怒られたゾ
- 19. 約数を求める
- 20. 三項演算子について
Ruby on Railsのモジュラーモノリス化を推し進めるpacks-railsというgemがすごいという話📦
こんにちは、akitoshiga.jpです。
現在Ruby on Railsのモジュラーモノリス化を行っており、その際に利用した`packs-rails`というgemが大変便利だったのですが情報が少なかったので紹介します。
## 1. packs-railsとは?
一定の規則に従って、単一のRails on Railsアプリケーションをモジュール分割するgemです。
このgem単体でも利用できますが主に[packwerk](https://github.com/Shopify/packwerk)と組み合わせて使われることが多いと思います。
`packwerk`とはRuby on Railsの静的解析を行うgemでモジュールごとの依存関係の管理ができます。https://github.com/rubyatscale/packs-rails
## 2.一体何がすごいのか?
### 2.1 (ほぼ)設定不要
`packs-rails`は内部で`zeitwerk`というgemを利用しています。
`packs-rails`の指定のディレクトリ構成に従えば、`zeitwerk`のおかげ
Ruby 3.2以上 (というか psych 4.0.5 以上) と timecop 0.9.5以下を組み合わせると、YAML の Date がパースされなくなる
# 現象
Ruby 3.2 (というか psych 4.0.5以上)と timecop 0.9.5以下を組み合わせると、YAML の Date がパースされなくなる。
“`ruby:Gemfile
gem ‘psych’, ‘4.0.5’
gem ‘timecop’, ‘0.9.5’
“`“`ruby:main.rb
require ‘yaml’
require ‘timecop’puts YAML.unsafe_load(‘2024-03-14’).class
# => String
“`# 原因
psych の `Psych::ScalarScanner#tokenaizer` で Date のパースをしているので、モンキーパッチしてエラーを見てみる。[v4.0.5/lib/psych/scalar_scanner.rb#L63-L69](https://github.com/ruby/psych/blob/v4.0.5/lib/psych/scalar_scanner.rb#L63-L69) を一部改変したものが以下。
“`ruby
mo
Rails DM機能の実装
# はじめに
今回はXクローンの実装にてDM機能の実装をしたので、自分自身の備忘録として、また今後フォロー機能を実装する方のお役に立てればと思い今回も記事を書くことにしました。# DM機能の作成
要件として、ユーザー同士(1対1)でメッセージを送り合うことができる機能を実装する。
※ 前提として、ユーザー登録がすでに実装されているものとします。# DM機能の流れ
相手ユーザーの詳細ページorポストのメニューorサイドバーのメニューからチャットに進む
↓
roomがなければ新規で作成され、そうでなければ存在するroomに遷移する
↓
roomでメッセージを送ることができるようになるこのように至って普通なDM機能を実装していきたいと思います。
# DM機能について
DM機能では、usersテーブル、roomsテーブル、entriesテーブル、messageテーブルを使用します。2人のユーザーがチャットルームでメッセージをやりとりするというイメージを思い浮かべながら実装していきます。
まず、ユーザーを管理するusersテーブルがあります。
ユーザーはroomsテーブルと
ユーザー操作をテストする【Ruby】
# はじめに
昨日に引き続き、Rspecの記事です!
[rspec入門で知っておけばよさそうなこと #RSpec – Qiita](https://qiita.com/kohki_takatama/items/4088169c0dc726a1b136)
今回はユーザー操作を再現するテストについて。
# capybara**ユーザー操作を再現するDSL** のようです。
Rspecと組み合わせて使われることが多いですが、別のgemのようです。DSLとは、プログラミング言語の中でも、特定の機能に特化したものですね。
他に、SQLやHTMLなどがDSLに分類されるはずです。## 「ユーザー操作を再現する」とは?
例えば、`click_on ‘ログイン’`で、「ログイン」というテキストのボタンをクリックできるようです。
CSSのクラスで指定することも可能(`find(‘.my-class’).click`など)
# スペックの種類
(記事としてはあまりにも短かったので)
スペックの種類をChatGPTに書いてもらいました。|スペックの種類|説明|
|—|—
先日の続き
[先日](https://qiita.com/k587mama/items/c5248e8fbb2eb3e64de2)の解決策が分かったため記述
どうやらrubyとJavaScript を同時に使うことは相性が悪かったことが原因とメンターさんに伺いました。
解としては、該当するviewファイルの中の“`ruby
<%= form_with model: @item, local: true do |f|%>
“`
のなかに`data: {turbo: false},`を追記した
“`ruby
<%= form_with model: @item, data: {turbo: false},local: true do |f|%>
“`と記述すること。でした。
Parallel gemで実装した処理をRspecでは同じスレッド上で動かす
以下のようにParallelにて処理を並列スレッドで実行しているとき、
“`ruby:hoges_controller.rb
def index
procs = [
-> { hoge1 },
-> { hoge2 },
-> { hoge3 }
]
result = Parallel.map(procs, in_threads: 3, &:call)
end
“`
Rspecではletやsubjectが変数に対してロックを獲得するため、複数スレッドで変数の参照待ちになりデッドロックが発生し、テストが永遠に終わらなくなってしまうそれを解決するために、Rspec上では直列で処理を実行するようParallelをモックして、ブロックを呼び出すだけにする
“`ruby:hoges_controller_spec.rb
describe ‘#index’ do
subject { get hoges_path }# Parallel.mapの引数で渡された配列をmapしてcallするだけ
初心者は第一言語にPython避けるべき?
## 初心者は第一言語にPython避けるべき?
そのように思う理由をざっと箇条書きにすると以下
1. カリキュラムが途中で途切れる(かも)
1. アプリ開発したいなら別の選択肢も### 1. カリキュラムが途中で途切れる(かも)
もしプロゲートやドットインストールの教材をメインに学習している場合、Webアプリ作成まで辿り着けない可能性があります。どちらもわかりやすく学べますが、PythonコースではWebアプリ作成の指導コースがありません。(Paizaという似たような学習教材はPythonでのWebアプリ開発コースを用意してくれています。)
やったことはありませんが、ProgateならRubyで、ドットインストールならPHPで、Webアプリ開発の指導までしてくれそうなコースがある気がします。
(Webアプリを作る際、その言語に紐づくフレームワークというものを用いるのが一般的です。RubyではRubyonRails、PHPならLalavel、PythonならDjangoかFlaskというフレームワークがあります。ドットインストールにはRubyonRailsの教材があり、ドットイ
Dockerイメージサイズを劇的に削減する方法【Rails7】
# はじめに
近年、アプリケーションの開発とデプロイのプロセスは、Dockerのようなコンテナ化技術によって大きく変革されています。Dockerコンテナの効率的な利用において、イメージサイズの最適化はデプロイの速度を速めるだけでなく、セキュリティリスクを低減し、ストレージコストを削減する上で重要な役割を果たします。Railsアプリケーションの開発では、その豊富な機能性と便利さにより、依存するGemやアセットが増加し、結果としてDockerイメージのサイズが大きくなる傾向にあります。
この記事では、RailsアプリケーションのDockerイメージサイズを劇的に削減するための具体的な手法を紹介し、デプロイの速度向上とコスト削減を実現する方法について解説します。
全ての検証コードはGitHubリポジトリに公開していますので、詳細は下記リンクからご確認ください。
[検証コードGitHubリポジトリ](https://github.com/mabo-matsu/rails7-docker-sample)# 1. Rubyのベースイメージ比較
イメージサイズの比較を行った結果、下記
【一網打尽】Specが書かれていないメソッドを検知する構文解析CLIツール”omochi”の紹介
## 課題
わたしは、Ruby on Rails を使ってアプリケーション開発を本業としているエンジニアです。
Railsで機能を開発すれば、当然Specも書く必要がありますよね。Specを書かないと動作確認ができていない状態でリリースしてしまう危険性があります。
しかし、開発中に多くのクラスやメソッドを書いていると、どのクラスに対して/どのメソッドに対してSpecを書いたのか忘れてしまいます。そうすると、十分に動作を検証していない状態で、PRがマージされてしまうことがあります。
Railsのアプリケーションにおいて、どのメソッドにSpecが書かれていて、どのメソッドには書かれていないのかをSpecファイルを見なくても明らかにしたい!そんなふうに考えたことはないでしょうか。
わたしは、実装を見た瞬間に対応するSpecが存在することが保証されている(または、実装側にSpecが不要であることが明示されている)ようにしたいと考え、静的解析の技術を使ったCLIツール “omochi” を作成しました。## 作成したCLI “omochi”
>Ruby on Railsの開発を支援するC
SDK for Rubyを使用してS3で署名付きURLを発行し、ブラウザにてダウンロードを行う。
# 実装したもの
view上のダウンロードボタンを押すと、S3にアップロード済みのログデータの署名付きURLを発行してリダイレクトを行いダウンロードさせる機能を作成しました。
今後似たような機能を作成するときに困らないように自分の言葉で備忘録として残しておくための記事となります。# 必要な知識、参考にした記事
### SDK for Ruby
RubyによってS3などのAWSサービスにアクセスし管理ができるようになるものです。SDKはソフトウェア開発キットと呼ばれるけどあんまりピンときてない。現状私はライブラリ、フレームワーク、APIを提供するパッケージというイメージを持っています。なお、今回の記事についてはSDK for Rubyの導入については省略します。
https://aws.amazon.com/jp/sdk-for-ruby/
### AWS::S3::Client
SDK for Rubyに含まれる「クラス」でS3との低レベル(抽象度が低く詳細なことはできない)なAPI通信を行うことができます。
すでに用意されたメソッドによってS3に対してさまざまな操作を行う
手数料計算【javascript】
↓↓↓↓↓↓↓ あなたの記事の内容
“`ruby───────
“`
↑↑↑↑↑↑↑ 編集リクエストの内容
window.addEventListener(‘turbo:load’,() =>{
console.log(“OK”);
})
“`
↓↓↓↓↓↓↓ あなたの記事の内容
turbo:loadというイベントは、ページが全て読み込まれた後に発火します。JSファイルの読み込みが正しく出来ていればコンソール上に”OK”という文字列が表示される───────
`turbo:load` というイベントは、ページが全て読み込まれた後に発火します。JSファイルの読み込みが正しく出来ていればコンソール上に”OK”という文字列が表示される
↑↑↑↑↑↑↑ 編集リクエストの内容“`ruby
document.getElementById(“id名”) // これはid名を指定してHTMLの要素を取得するメソッドです
“`金額を次は金額を入力するたびに、イベント発火するようにaddEventListenerを使用
“`js
const inputVal
Dockerで環境構築(Rails7+mysql)
## はじめに
ポートフォリオ作成のため、Dockerにて環境構築を行いました。
その時の流れと、ファイルの意味について調べたことを記録しました。
初学者のため、間違えていたら申し訳ありません。## 環境
PC: mac(Apple M1)
Ruby: 3.1.4
Rails: 7.0.8## 作業内容
### ① ディレクトリ下にファイルを作成する
ディレクトリ
“`
好きなディレクトリ名/
├── Dockerfile
├── docker-compose.yml
├── entrypoint.sh
├── Gemfile
└── Gemfile.lock
“`
#### ファイル一括作成コマンド
“`
touch Dockerfile docker-compose.yml Gemfile Gemfile.lock entrypoint.sh
“`
### ② ファイルの中身を記述する
#### ファイルの中身
“`:Dockerfile
FROM ruby:3.1.4 # rubyのバージョンを指定RUN mkdir /app # コン
Rails 6.1においてのAWSへのwebcompile
## Rails 6.1で起こったwebcompile errorについて
以前webcompileをしたときの内容の備忘録です。何か間違えがあればよろしくお願いします。
Referencesにおいてある記事はHerokuについて書かれているものもあったのですが、AWSでも機能したので、メモ程度に書いておきます。### 環境設定
node -v 16.17.0
yarn -v 1.22.19
ruby -v 3.0.2
rails -v 6.1.4### 最初に起こったエラー
“`
Compiling…
Compilation failed:
node:internal/process/promises:289
triggerUncaughtException(err, true /* fromPromise */);
^Error: Cannot find package ‘@babel/plugin-proposal-private-methods’ imported from …
“`
AWSでprec
AtCoder Beginner Contest 344参戦記録(A~C問題)
RubyでAtCoderに参戦した記録です。
AB2完で、C問題はコンテスト終了後に解説を見てからコードを書きました。## [ABC344 A Spoiler](https://atcoder.jp/contests/abc344/tasks/abc344_a)
2つの「|」を含む文字列Sが与えられ、「|」とその間にある文字を削除して出力します。
“`Ruby
# 提出コード
a = gets.chomp
pos = a.index(“|”)
ans = []
ans << a.slice(0...pos) pos2 = a.index("|", pos+1) ans << a.slice(pos2+1..-1) puts ans.join ``` 早く解かねばと焦ってしまい、回りくどいことをしてしまいました。 「|」記号でsplitすればシンプルに書けました。。 ```Ruby a = gets.split("|") puts a[0] + a[2] ``` ## [ABC344 B Delimiter](https://atcoder.jp/contests/abc344/
docker compose run時にNameError: uninitialized constant Nokogiri::HTML4と遭遇した時の対処法
Dockerを使ってRailsの環境構築を行なっている時に遭遇したエラーの解決方法を備忘録も兼ねてここに記します。
開発環境
M2チップ Mac Book Air
OS: MacOS Sonoma
Rails: 5.0.0.1
DB: MYSQL 5.7
Ruby: 2.4.6
※詳細は省きますが、Windows11の環境でも同様のエラーに遭遇しました。
同エラー遭遇時にPCを上記のMac Book Air に買い換えた為、Windows環境では解決まで の確認はできていませんが、恐らく解決できると思います。## 実行したコマンドと遭遇したエラー
“`
実行したコマンド
docker compose run web bundle exec rake db:create
“`“`
遭遇したエラー
rake aborted!
NameError: uninitialized constant Nokogiri::HTML4
Did you mean? Nokogiri::HTML
“`## エラー解決の為に行なったこと
1, Gemfileを編集して下記の行を
文字列から特定の文字列だけ抜き出したい時の正規表現はどう書いたらいいの?
目的の文字列を抜き出す方法がわからず困ったのでうまく行った正規表現の書き方をメモしておきます。
結論から言うと正規表現の先読み、後読みを利用して特定の文字列を抽出できました。
今回はRubyで試しています!## 先読み、後読みとは
:::note info
– `(?=ex)` : 先読み。次に`ex`がくる位置にマッチする
– `(?<=ex)` : 後読み。前に`ex`がくる位置にマッチする - `(?!ex)` : 否定先読み。次に`ex`がこない位置にマッチする - `(? cat = “Cat:tama_mike”
> cat.match(‘(?<=\:).*(?=_)') => #
“`– `(?<=\:)`:後読みを利用して、コロン(:)が前にくる位置を指定。
【Rails】一覧表示の順番を指定する(古い順、新しい順)
こんばんは!
ポートフォリオ実装でユーザーの使いやすさを考えたときに、一覧といってもものによっては古い順、新しい順と変えた方がよさそうだと気づき、実装してみました!
実装自体はコントローラ―の記述を少し加えるだけだったので、ご紹介したいと思います。## 環境
AWS Cloud9
Rais 6系## 方法
### 新しい順
例えばですが、普通の投稿の一覧などはより新しい情報をユーザーに見せたいですよね!特に投稿1つ1つに文脈などの関係がない場合は新しい順の方が適しているといえます。
そのような場合どのように新しい順にするか説明したいと思います!普段だと一覧表示をしたい際には
“`rb:app/controller/xxxx_controller.rb
class XxxxsController < ApplicationController def index @posts = Post.all end end ``` というように記述しますよね。これだと特に順番は指定されていない状態で、更新などがあると順番が変わる可能性があります。 そのため、新しい投稿
【Rails】メソッドの中でメソッドを定義したらRuboCopに怒られたゾ
どうもこんにちは。
今回は、Railsでメソッドの中にメソッドを記述してコードを書いた時に、Rubocopに怒られたのでその対処法を紹介します。
Rubocopの導入方法は以下の記事で紹介しています。
https://qiita.com/PDC-Kurashinak/items/1de32b66d95c705f5b82
# 実際に書いたコード
※ こんな感じで書いたという感じで書きます。
“`ruby
def display_calculate_result(x, y, z)
# 足し算メソッドを定義
def add_calculate(a, b)
result = a + b
result
end# 掛け算メソッドを定義
def multiplication(add_result, c)
result = add_result * c
result
end# 足し算メソッドを呼び出し
add_result = add_calculate
約数を求める
## はじめに
AtCoderの問題を解いていた時、計算量を減らすコードの書き方を学習しました。学んだことをアウトプットしようと思い、記事を書きました。
## コード
“`Ruby
a = 1000
divisor1 = []
#計算量の多いコード
for i in 1..a do
if a%i==0
divisor1<
三項演算子について
## はじめに
個人的に「三項演算子」について苦手意識があったので、今回はあえてそれに触れてみます。
## 環境
ruby 3.14rails 7.0.3.1
## 三項演算子って?
**条件式をif, elseを使わないで書いてしまえるもの。**複数に渡ってかかなればならないコードも、これを使えば短いコードで済むのですっきりします。
コードにすると次のようになリます。
“`
条件式 ? 正しいとき : 正しくないとき
“`
これをif,elseで書くとすると次のようになります。“`ruby
if 条件式
正しいとき
else
正しくないとき
end
“`
以上のように短いコードで済むことが分かります。ではこれはどのような時に使えば良いのでしょうか?
## 例
作っているもの→ ”ブログを作成するサイト”
コードを書く場所→ Articleモデルまた
”記事(Article)を『下書き(draft)・公開(published)・公開待ち(publish_wait)』としてstateカラムに分類している状態”加え