- 1. 【一網打尽】Specが書かれていないメソッドを検知する構文解析CLIツール”omochi”の紹介
- 2. SDK for Rubyを使用してS3で署名付きURLを発行し、ブラウザにてダウンロードを行う。
- 3. 手数料計算【javascript】
- 4. Dockerで環境構築(Rails7+mysql)
- 5. Rails 6.1においてのAWSへのwebcompile
- 6. AtCoder Beginner Contest 344参戦記録(A~C問題)
- 7. docker compose run時にNameError: uninitialized constant Nokogiri::HTML4と遭遇した時の対処法
- 8. 文字列から特定の文字列だけ抜き出したい時の正規表現はどう書いたらいいの?
- 9. 【Rails】一覧表示の順番を指定する(古い順、新しい順)
- 10. 【Rails】メソッドの中でメソッドを定義したらRuboCopに怒られたゾ
- 11. 約数を求める
- 12. 三項演算子について
- 13. left_joinを理解する
- 14. クラスの作成とクラスの継承
- 15. 【Ruby】paizaラーニング問題集解答(入力値を使った演算)
- 16. Rubyのeachとmapを比較してみた
- 17. Railsでのアーキテクチャを考える
- 18. 【Ruby】入力の確認とエラー処理(備忘録)
- 19. エラーメッセージの日本語化
- 20. ハッカソン序章: 初挑戦!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”);
“`
urbo:loadというイベントは、ページが全て読み込まれた後に発火します。JSファイルの読み込みが正しく出来ていればコンソール上に”OK”という文字列が表示される“`ruby:
document.getElementById(“id名”)は、id名を指定してHTMLの要素を取得するメソッドです。
“`金額を次は金額を入力するたびに、イベント発火するようにaddEventListenerを使用
const inputValue = priceInput.value;
value属性を指定し、input要素から実際に入力した金額の値を取得。つまりフリマの出品値段から今回指定したい10%の値段を取得
これが終わると次はいよいよ手数料の実装。
innerHTMLを使用して、販売手数料や利益計算結果を表示できるようにしましょう。innerHTMLは、HTML要素の書き換えを行うことができます。
“`ruby
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カラムに分類している状態”加え
left_joinを理解する
### はじめに
nilのデータを取得したい時に`LEFT JOIN`を使用すると思います。この時に欲しいデータがうまく取得できず色々やった結果、改めて`LEFT JOIN`を理解しなおすことができたのでメモとして残します。今回取得したいデータの条件は以下の通りです。
– サブ商品には登録されていないメイン商品、サブ商品から削除された商品も取得
“`sql
MainProductTable(メイン商品)
+—-+————-+——–+
| id | product_name | stock |
+—-+————-+——–+
| 1 | XxxProd1 | 50 |
| 2 | XxxProd2 | 30 |
| 3 | YyyProd1 | 20 |
| 4 | YyyProd2 | 20 |
| 5 | XyxProd3 | 20 |
| 6 | ZzzProd3 | 30 |
| 7 | TttPr
クラスの作成とクラスの継承
クラスの作成とクラスの継承を使ってプログラムを作りました。
“`Ruby
class User
attr_accessor :name
@@count = 0
VERSION = 1.1
def initialize(name)
@@count += 1
@name = name
enddef sayHi
# puts “私は#{@name}です”
puts “私は#{self.name}です”
# puts “私は#{name}です”
enddef self.info
puts “User Class #{@@count} Instance Count”
puts “#{VERSION}”
end
endclass AdminUser < User def sayAdminUser puts "Hi! AdminUser #{name}" end end mai1 = User.new("白石麻衣") mai1.sayHi mai2 = AdminUser.n
【Ruby】paizaラーニング問題集解答(入力値を使った演算)
# 引き算・掛け算 (paizaランク D 相当)
https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__accompanied_by_stdin_2
### 自分の解答(誤答)
“`ruby:practice.rb
numbers = gets.splitA = numbers[0]
B = numbers[1]D = A – B
P = A * Bputs “#{D} #{P}”
# Runtime error
# Main.rb:18:in `‘: undefined method `-‘ for “397”:String (NoMethodError) # D = A – B
# ^
# Did you mean? -@
“`
### ChatGPTの解答理解しました。入力が半角スペースで区切られて1行で行われる場合、それに対応するようにコードを修正します。
“`ruby
# 1行で入力を受け取り、半角スペースで分割
Rubyのeachとmapを比較してみた
## はじめに
転職をきっかけにRubyを触り始めており、プロダクションコードや書籍、チュートリアルで`each`と`map`が多用されいたのですが、メソッドの処理が似ているということもあり混乱してしまいました。そこで、この二つのインスタンスメソッドの共通点や異なる点をリファレンスマニュアルを参考にしてまとめてみました。
## eachとmapの共通点
共通点は以下の二つです。
– Arrayクラスのインスタンスメソッドである
– ブロックを省略した場合は`Enumerator`が返るhttps://docs.ruby-lang.org/ja/latest/class/Array.html
Arrayのリファレンスマニュアルのインスタンスメソッドを確認すると、`each`と`map`があるのでどちらもArrayクラスのインスタンスメソッドであることがわかります。
また、`irb(interactive Ruby)`でブロックを省略した挙動を確認してみると`Enumerator`というものが返ってくることがわかります。
“`ruby
irb(main):001> [
Railsでのアーキテクチャを考える
### はじめに
Ruby on RailsでAPIの開発を行ってるんですが、Railsは開発者に優しくとても開発がしやすいです。一方、どこからでもModelが呼べたりと人によって書き方もバラバラになりやいフレームワークでもあります。
とはいえ、Rialsをクリーンアーキテクチャで設計して開発を進めていくのは、Railsの良さをなくしちゃうのであまり相性が良くないと思います。そこで、Railsの既存のMVCを崩さない範囲でルールを決めて開発を行うようにしました。
開発はRailsの6系で、APIモードで開発を行っています。### 考えた各層の役割
最終的に各層の役割は以下のように定義しました。| | 役割、詳細 |
|———|———|
| Controller | パラメーターなどを取得し、Service層とPresenter層を呼び出す役割。ビジネスロジックは持たず、基本的に呼び出しのみを行う。 |
| Model | バリデーションや(サービスではなく)ドメインに依存するロジックを持つ役割。joinやwhereなどactive recordを
【Ruby】入力の確認とエラー処理(備忘録)
ChatGPTからRubyにおける入力の確認とエラー処理について教えてもらったので、一旦書き留めておく。
いますぐ実践するのは難しいが、早くこのレベルのコードをすらすらかけるようになりたい。
### 私
以下のコードについて解説してください。array = []
array[0] = gets
array[1] = gets
puts array
### ChatGPT
このコードは、Ruby言語を使用して標準入力からユーザーに2つの入力を求め、それを配列に格納してから、その配列を出力する簡単なプログラムです。解説を具体的に説明します:
1. `array = []`: 空の配列を作成します。これは後でユーザーの入力を格納するための容器として使用されます。
2. `array[0] = gets`: `gets` メソッドを使用して、ユーザーに対して1つ目の入力を要求します。入力された値は、配列 `array` の最初の要素に代入されます(インデックス0の位置)。
3. `array[1] = gets`: 同様に、`gets` メソッドを使用して、ユーザーに対して2つ目
エラーメッセージの日本語化
# はじめに
プログラミング初心者です。
温かく見守ってください。
何か謝っている点があれば、ぜひご指摘をお願いいたします。
# エラーメッセージの日本語化
### 事前準備
“`ruby:config/aplication.rb
# 中略
module アプリの名前
class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 7.0 # 日本語の言語設定 config.i18n.default_locale = :ja ←追記 # 省略 end end ``` ```ruby:Gemfile #中略 gem 'rails-i18n' ←追記 ``` bundle installをして、サーバーを再起動します。 ### ファイルを新規作成(2つ) 1、config/localesディレクトリに、devise.ja
ハッカソン序章: 初挑戦!Ruby勉強会の企画から運営まで
# はじめに
とあるハッカソンに技術メンターとして、参加させていただきました。ハッカソン当日以前に**Rubyに関する勉強会**(1時間枠)を実施する必要があり、その勉強会の企画と運営に関してお話します。# 勉強会当日までの流れ
技術メンターとして参加することが決まり、まず始めにハッカソン運営メンバーとキックオフMTGを行い、どのような勉強会の内容でいくのか摺合せを行いました。その後、他技術メンターと協力して勉強会の資料を作成し、勉強会当日を迎える形になりました。# 勉強会の内容
勉強会の内容は、受講対象者をプログラミング経験者だがRubyを触ったことがない人ということでハッカソン運営メンバーと摺合せできていたので、RubyやRuby on Railsの概要から入り、Rubyの基本構文等を説明しました。その後、クラスやインスタンスに関して簡単に説明しました。Rubyの基本構文等を説明する際は、例題や問題を散りばめて実際に実行(ブラウザ上でRubyコード実行できるサービスを使った)してもらい実行結果を自分の手で確かめてもらう形式を選択しました。# 勉強会当日
勉強会はウェブ会