- 1. 投稿アプリのコントローラーの単体テストコード
- 2. paizaラーニング解答: 算術・代入演算メニュー[Ruby]
- 3. paizaラーニング解答: データセット選択メニュー[Ruby]
- 4. 続: Rubyでかの有名な水の移し替えパズルを解く(ちゃんと探索アルゴリズムを使う)
- 5. paizaラーニング解答: 標準入力メニュー[Ruby]
- 6. paizaラーニング解答: 標準出力メニュー[Ruby]
- 7. 投稿アプリのモデルの単体テストコード
- 8. findとfind_byの違い
- 9. Optparseの使い方
- 10. ルーティングの記述方法
- 11. 効率的にテストコードを書こう
- 12. N+1問題を解決する
- 13. rbenvを用いたRubyのインストール
- 14. 忘れやすいRspecのletとlet!の違い
- 15. Rails初心者の学習日記 CRUDの基本
- 16. 精度の高い計算
- 17. どうしても syslog に特定の文字列があったら即時通知したかったので Logstash Output Plugin を自作した
- 18. モジュール結合度をrubyで理解する
- 19. Railsのエラー解消
- 20. Rails APIとReactを使用したウェブサイトのXSSとCSPの対策について
投稿アプリのコントローラーの単体テストコード
モデルのテストはよくしていましたが、コントローラーはあまりやっていなかったので
いい復習になりました!### 目的
– Request Spec の流れを理解
– レスポンスを判定するテストコードを記述### コントローラーの単体テストコード
#### テストコードを書く方針
あるアクションをリクエストを送った時、想定通りのレスポンスが生成されるかどうか確かめる
### Request Spec
コントローラーのテストコードを書くために特化した手法`rails g rspec:request tweets`
### tweetsコントローラーindexアクションの単体テストコード
#### exampleを整理
– indexアクションにリクエストすると正常にレスポンスが返ってくる
– indexアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する
– indexアクションにリクエストするとレスポンスに投稿済みのツイートの画像URLが存在する
– indexアクションにリクエストするとレスポンスに投稿検索フォームが存在する####creat
paizaラーニング解答: 算術・代入演算メニュー[Ruby]
# 算術・代入演算メニュー
https://paiza.jp/works/mondai/arithmetic_substitution_op/problem_index?language_uid=ruby
## STEP: 1 足し算
“`ruby
puts 1_231 + 5_178
“`## STEP: 2 引き算・掛け算
“`ruby
a, b = gets.split.map(&:to_i)
puts “#{a – b} #{a * b}”
“`## STEP: 3 割り算
“`ruby
a = 437_326
b = 9_085
puts “#{a / b} #{a % b}”
“`## STEP: 4 掛け算 2
“`ruby
a, b, c = gets.split.map(&:to_i)
puts “#{a * a} #{b * b + c * c}”
“`## STEP: 5 累乗
“`ruby
a, b, c = 202, 134, 107
puts ((a + b) * c) ** 2
“`## FINAL問題 累乗 2
paizaラーニング解答: データセット選択メニュー[Ruby]
# データセット選択メニュー
https://paiza.jp/works/mondai/data_structure/problem_index?language_uid=rubyこの問題集にチャレンジする前にハッシュ(辞書)と集合について学んでおくことをお勧めします。
## STEP: 1 ランダムアクセス
“`ruby
n, m = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
puts a[m – 1]
“`## STEP: 2 複数回のランダムアクセス
“`ruby
n = gets.to_i
a = gets.split.map(&:to_i)
q = gets.to_i
b = gets.split.map(&:to_i)
b.each do |i|
puts a[i – 1]
end
“`## STEP: 3 最大値と最小値
“`ruby
a, b, c = gets.split.map(&:to_i)
puts [a, b, c].max – [a, b, c].min
“`##
続: Rubyでかの有名な水の移し替えパズルを解く(ちゃんと探索アルゴリズムを使う)
# はじめに
先日は下記 **[「Rubyでかの有名な水の移し替えパズルを解く」](https://qiita.com/jerrywdlee/items/c7bbcbb6c68e37e7ef71)** を投稿しました。https://qiita.com/jerrywdlee/items/c7bbcbb6c68e37e7ef71
@nodai2h_ITC さんよりコメントを頂いて、**「[幅優先探索](https://ja.wikipedia.org/wiki/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2)」** を活用した方が、ランダムウォークよりも合理であると指摘されました。
まったくご指摘通りでした🙇♀️。
しかし私の不勉強である故、なかなか綺麗な探索木のコードを書けなくて(~~決してゲームに没頭したせいではありません~~)、記事の更新を放置してました。
昨日、@mogamoga1337さんよりJavaScriptで探索木を使った解き方が投稿されたので、サボっては行けないと思い、連休中殴り書いたRuby版探索木コードを整理し
paizaラーニング解答: 標準入力メニュー[Ruby]
# 標準入力メニュー
https://paiza.jp/works/mondai/stdin_primer/problem_index?language_uid=ruby
## STEP: 1 1 行の入力
“`ruby
s = gets.chomp
puts s
“`## STEP: 2 2 行の入力
“`ruby
s = gets.chomp
t = gets.chomp
puts s
puts t
“`## STEP: 3 3 行の入力
“`ruby
s = gets.chomp
t = gets.chomp
u = gets.chomp
puts s
puts t
puts u
“`## STEP: 4 10 行の入力
“`ruby
10.times { puts gets.chomp }
“`## FINAL問題 【行入力】1,000 行の入力
“`ruby
1000.times { puts gets.chomp }
“`## STEP: 1 2 つの文字列の半角スペース区切りでの分割
“`ruby
puts “Hello paiz
paizaラーニング解答: 標準出力メニュー[Ruby]
# 標準出力メニュー
https://paiza.jp/works/mondai/stdout_primer/problem_index?language_uid=ruby
## STEP: 1 1 行の出力
“`ruby
puts 813
“`## STEP: 2 2 行の出力
“`ruby
puts 8
puts 13
“`## STEP: 3 3 行の出力
“`ruby
puts 8
puts 1
puts 3
“`## STEP: 4 10 行の出力
“`ruby
puts %w[813 1 2 923874 23648 782356 3256 2342 24324 112]
“`
%w記法を使うことで配列にできます。
## FINAL問題 【改行あり出力】1,000 行の出力
“`ruby
(1..1000).each do |i|
puts i
end
“`## STEP: 1 2 つの数値を出力
“`ruby
puts “1 1”
“`## STEP: 2 3 つの数値を出力
“`ruby
puts “8 1 3”
`
投稿アプリのモデルの単体テストコード
テストコードは本当に理解できず一周目は正直飛ばしてましたが
復習してなんとなく理解できました!
というわけで復習の備忘録です!目的
– Userモデルの単体テストの実装を通して、正常系テストを理解
– Userモデルの単体テストの問題を解いて、異常系テストに関する知識を定着
– Tweetモデルの単体テストの問題を解いて、モデル単体テストに関する知識を定着####文字数制限のバリデーションを設置
「保存できる値は最大6文字まで」というバリデーションを設置
app/models/user.rb
“`ruby
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :reme
findとfind_byの違い
# はじめに
`find`と`find_by`は、Railsでデータベースからレコードを取得するためのメソッドですが、いくつかの違いがあります。
findとfind_byの違いについて理解が曖昧だったため備忘録も兼ねてまとめます。
# 検索条件の指定方法
`find`: 主キー(通常はid)を指定してレコードを取得します。例えば、`User.find(1)`は`id`が1であるユーザーを取得します。`find_by`: 様々な条件を指定して検索できます。例えば、`User.find_by(name: ‘John’)`は`name`がJohnであるユーザーを取得します。
“`ruby
# 主キーを指定して取得
user = User.find(1)# 条件を指定して取得
user_by_name = User.find_by(name: ‘John’)
“`
# エラーハンドリング
`find`: 主キーが見つからなかった場合、`ActiveRecord::RecordNotFound`例外が発生します。主キーが存在しない場合、エラーが発生するため注意が必要です。`fin
Optparseの使い方
optparseを使う機会があったので、整理を兼ねて使い方を書いてみます。
Rubyでは沢山のライブラリが用意されており、Gemfileを通して追加することなく使用できるものが沢山用意されています。
その中でも特に使用頻度が高いとされているものは組み込みライブラリと呼ばれ、requireを使って呼び出すことなくそのまま使用することができます。
optparseはコマンドライン上でオプションを受け取る為の呼び出しが必要な標準ライブラリです。
optparseを使う時は以下の3ステップを踏んで進めていきます。1, `OptionParser`を使ってオブジェクトoptを生成
“`ruby
require ‘optparse’
opt = OptionParser.new
“`2, オプションを扱うブロックを作成
“`ruby
opt.on(‘-m int’) {|m| month << m.to_i} ``` `on`メソッドで`opt`オブジェクトに登録するオプションを定義する。 `-m`で数値として(intで数値として指定)受け取ったオプションをブロック内で`month
ルーティングの記述方法
# はじめに
ルーティングの記述方法の理解が曖昧だったため備忘録も兼ねてまとめます。
# ルーティングとは
Webアプリケーションにおいて、クライアントからのリクエストを処理するために、どのコントローラのどのアクション(メソッド)が呼び出されるかを指定する仕組みです。Railsでは、config/routes.rbファイルでルーティングを設定します。
“`config/routes.rb
Rails.application.routes.draw do
root “sample#index”
get “/new” => “sample#new”
post “/create” => “sample#create”
resources :articles
end
“`
# Rootとは
ルートは、アプリケーションのトップページを指します。上記の例では、SampleControllerのindexアクションがルートに設定されています。
# GETとは
indexアクションやshowアクションのようにデータの取得が目的のアクションです。
# POSTとは
c
効率的にテストコードを書こう
テストコードを効率的にできるのは便利ですね!
“`ruby“`
### 目的
– FactoryBotの概要と設定の方法を理解
– Fakerの概要と設定の方法を理解### インスタンスを生成するコードを分離
#### FactoryBot
インスタンスをまとめることができるGem。他のファイルであらかじめ各クラスのインスタンスに定める値を設定しておき、各テストコードで使用する### FactoryBotを導入
“`ruby
group :development, :test do
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
gem “debug”, platforms: %i[ mri mingw x64_mingw ]
gem ‘rspec-rails’, ‘~> 4.0.0’
gem ‘factory_bot_rails’
end
“`
`bundle install`
specディレクトリ
N+1問題を解決する
# 1.はじめに
投稿一覧画面にて無駄なクエリが発生していたので解決方法を備考録として記事に残します。# 2.環境
Ruby (2.6.4)
Rails (6.1.7)
gem kaminariを導入している# 3.N+1とはなにか
ざっくりいうと不必要なSQLを何回も発生させてしまう現象のことです。
それによりDBへの問い合わせ処理が複数回走るためパフォーマンスが悪化します。例えば、スーパーにりんご、みかん、いちごを買いに行こうとしていたとします。
そのとき、何度も自宅とスーパーと往復せず、まとめて購入するでしょう。N+1問題は、この例でいくと自宅とスーパーと何度も往復することにあたります。
1往復1食材しか持っていかなかったら効率悪いです。1往復で買い物を終わらせようというのがN+1問題を解決するということです。
# 4.おこなったこと
## 修正前
page(params[:page])について
gem kaminariを導入しているのでこのような記述になっていますが、page(params[:page]) ≒ all: と考えてください。
“`:con
rbenvを用いたRubyのインストール
# rbenvを用いたRubyのインストール
rbenvを利用してRubyをインストールする手順です。
手順の大まかな流れは以下になります。
1. Homebrewをインストール
2. Homebrewを用いてrbenvをインストール
3. rbenvを用いてRubyをインストール## Homebrewのインストール
“`bash
brew -v
“`
`zsh: command not found: brew`と表示された場合は、Homebrewをインストールします。
`Homebrew 4.2.0`と表示された場合は、Homebrewはインストールされています。バージョンの数字は環境により異なります。Homebrewがインストールされていない場合は、以下のコマンドを実行してインストールします。
“`bash
/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
“`M1 Macの場合は、次のコマンドも実行して設定を
忘れやすいRspecのletとlet!の違い
# はじめに
rspecのletとlet!の違いを忘れてしまうことが多いのでここにメモする# 問題
letとlet!はRSpecのヘルパーメソッドで、テスト内で使用するデータを定義するために使われます。しかし、それらはいつデータが生成されるかという点で違いがあります。
このような場合はcourseが複数保存されている必要があるのでlet!で定義しないとなにも保存されていない状態になります。
“` ruby
get “/api/v1/courses”
expect(JSON.parse(response.body)[0][“authority”]).to eq(course.authority)
expect(JSON.parse(response.body)[0][“travel_mode”]).to eq(course.travel_mode)
expect(JSON.parse(response.body)[1][“authority”]).to eq(other_course.authority)
expect(J
Rails初心者の学習日記 CRUDの基本
## はじめに
Railsの学習を始めたばかりの初心者です。私がRailsで学んだCRUD処理の基本について共有します。## Railsとは
Rails(Ruby on Rails)は、Ruby言語をベースにしたWebアプリケーションフレームワークです。Railsの大きな特徴は、開発を迅速化し、簡素化するための多くの機能を備えている。## CRUDとは
CRUDは「Create(作成)」「Read(読み取り)」「Update(更新)」「Delete(削除)」の頭文字を取ったもので、データベースの基本的な操作を指します。これらの操作は、Webアプリケーションにおいて非常に重要されるようです。Create(作成): 新しいデータをデータベースに追加します。
Read(読み取り): データベースからデータを検索・取得します。
Update(更新): データベース内の既存のデータを変更します。
Delete(削除): データベースからデータを削除します。## RailsでのCRUD処理
Railsでは、これらのCRUD操作を簡単に実装できる。ブログアプリケーションを例に説明しま
精度の高い計算
精度の高い小数点の計算プログラムを作りました
“`Ruby
# 自分の得意な言語で
# Let’s チャレンジ!!
input_line = gets
array1 = input_line.split(‘ ‘)
M = array1[0].to_f
p1 = array1[1].to_f
q1 = array1[2].to_f
ans1 = (M * p1 / 100).to_f
ans2 = (M – ans1).to_f
ans3 = (ans2 * q1 / 100).to_f
ans4 = (ans2 -ans3).to_f
puts ans4
“`
どうしても syslog に特定の文字列があったら即時通知したかったので Logstash Output Plugin を自作した
# 概要
SNMP Trap を送信できず、syslog でなら目的のログは送信できるが、緊急性の高い syslog が出た場合、どうしてもなるべくリアルタイムに Slack 通知したい、という稀によくある自体に遭遇したので、ログ収集に使っている Logstash を拡張して、特定の文字列があったら Slack 通知する Output Plugin を自作した。
# 構成の概要
現在、各ネットワーク機器は集約サーバを通すことで SNMP メトリック、syslog を収集している。
![無題のプレゼンテーション.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88428/243e8e2e-0b9d-da14-5cb1-0af8738a250d.jpeg)
![無題のプレゼンテーション (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88428/8fc29fed-11a8-f6a5-2a16-d046
モジュール結合度をrubyで理解する
# はじめに
(この記事はProgaku Advent Calendar 2023 17日目の記事です。)こんにちは!
普段は東京都でバックエンドエンジニアをしているおっちーと言います!
最近、業務でコードレビューをする機会が増えてきました。
そこで、今回はコードレビューの観点として含めると有用な「モジュール結合度」について、rubyによるサンプルコードとともに説明させて頂こうと思います!# モジュール結合度とは
モジュール結合度とは、モジュール間の関連性の強さを示すもので、一般的にソフトウェアの設計において、モジュール間の結合度が可能な限り低いほうが良いとされています。
結合度は、次の7つの種類があります。上から順番に結合度が強いです。– [内容結合](#内容結合)
– [共通結合](#共通結合)
– [外部結合](#外部結合)
– [制御結合](#制御結合)
– [スタンプ結合](#スタンプ結合)
– [データ結合](#データ結合)
– [メッセージ結合](#メッセージ結合)**実務でよく見かけるのは、[内容結合](#内容結合)と[共通結合](#共通結合)以外の結合
Railsのエラー解消
プログラミングはエラー分との戦いです
ただエラー文はHELP(手助け)してくれるものです。
エラーが出てガッカリしず、成長できるものとして捉えましょう!### 目的
– デバック方法を理解
– 仮説と検証の習慣webアプリの開発中は、エラーが頻繁に起きます。
エラー解決を重ねることで、Railsの全体像や仕組みの理解が深まります「No methodError in Tweets#index」
「定義されていないメソッドが呼び出された」というエラーが、
Tweetsコントローラーのindexアクションが実行されたタイミングで
生じたことを表すエラー内容がわかったので、解決の仮説をたて修正し、検証します。
仮説が建てられない場合は、その他の情報を加味しながら仮説をたて、
検証を行うくり返の作業になります#### デバック
プログラミングの間違い(バグ)を見つけて、手直しすること
#### pry-rails
Gem
デバックツールに属し、作業の際にバグの有無を確認したり、処理を止めてソースコードを正しいかを確認できるものです。
`binding.pry`という記述をソース
Rails APIとReactを使用したウェブサイトのXSSとCSPの対策について
### はじめに
Ruby on Rails APIとReactを使用したウェブアプリケーションのセキュリティ設計について、
特にXSS(クロスサイトスクリプティング)とCSP(コンテンツセキュリティポリシー)に焦点を当ててまとめました。## XSS(クロスサイトスクリプティング)
XSSは、ウェブページに不正なスクリプトが注入され、エンドユーザーのブラウザ上で実行されるセキュリティ攻撃です。
これにより、ユーザーのセッション情報の盗用やマルウェアの配布などが発生するリスクがあります。### Railsにおける対策
**JSONレスポンスのサニタイズ** :
– JSON形式でデータを返す場合は、適切にエスケープ処理を行います。**パラメータの検証** :
– 入力されたデータを適切に検証し、不正な入力を防ぎます。
**Strong Parameters** の使用: 不要なパラメータをフィルタリングします。### Reactでの対策
**データバインディング**:
– ReactはデフォルトでHTMLをエスケープしますが、dangerouslySetInnerH