- 1. eachメソッドの使い方
- 2. Rubyのputs,print,pメソッドの違い
- 3. Ruby で Thread.new してるコードを RSpec 実行時だけ同じスレッドで実行させる
- 4. Ruby メモ
- 5. [Ruby]オブジェクト指向設計を使って変更に強いコードを書きたい ~クラスの責任とインターフェース編~
- 6. Ruby芸160チャレンジ(#1):複数行のテキストからサブセットを含む行の抽出
- 7. 【Ruby】+ と
- 8. Dockerイメージから作成したLambdaで画像リサイズ処理を行う
- 9. 大体0から始めるRuby入門その1 ~Ruby、動く~
- 10. 【Rails】ミドルウェアでパスを見てDBを切り替える
- 11. 大規模 Rails で役立つテクニック: Iteratorパターン編
- 12. ISUCON13に参加しました
- 13. RubyのCSV作成時に undefined method ‘collect’ for nil:NilClass エラーが出たときの対処
- 14. Danger でコードレビューの機械的な指摘を自動化する話
- 15. rubyで大量データをキャッシュした話
- 16. PagerDutyのOnCall当番をAPIで取得してみる
- 17. Workato:Connector SDKでユーティリティコネクタを開発してWorkatoを便利に活用する
- 18. 【Ruby】optparseの使い方
- 19. Ruby – How to check instance variable defined? -> e.g defined?(@a) ( Rubyでインスタンス変数が定義済みのことをチェックする )
- 20. 初めてのRSpecで学んだこと No.2
eachメソッドの使い方
## `each`メソッドについて
[each](https://docs.ruby-lang.org/ja/latest/method/Hash/i/each.html)は繰り返しメソッドのひとつです。
ブロック内の処理をオブジェクトの要素分だけ繰り返すことができます。
オブジェクト内の要素の計算などもできます。
___
#### 使い方
“`
オブジェクト.each do |変数|
実行したい処理内容
end
“`
doを省略することもできます。
“`
オブジェクト.each { |変数|
実行したい処理内容
}
“`
___
#### eachを使ってオブジェクト内の要素の計算をしてみよう!
“`
array = [1, 2, 3]sum = 0
array.each { |x|
sum += x
endputs sum
“`
“`
実行結果
6
“`
___
|変数|の縦棒`「|」`はバーティカルバーと呼ばれる記号です。
Rubyのputs,print,pメソッドの違い
Rubyには出力の際によく使うメソッドがあります。
どれも結果を出力するメソッドではありますがそれぞれ出力結果に違いがあります。## ◉putsメソッド
渡されたオブジェクトを文字列として出力します。文字列の**末尾には改行が追加**されるため、表示される内容は1行ごとに改行されます。
“`
puts “Hello”
puts “Ruby”
puts “World”
“`-結果-
“`
Hello
Ruby
World
“`
## ◉printメソッド
putsメソッドとは異なり、**改行を追加しません**。
そのため、printメソッドを使うと、出力される内容は1行にまとまります。“`
print “Hello”
print “Ruby”
print “World”
“`-結果-
“`
HelloRubyWorld
“`## ◉pメソッド
渡されたオブジェクトを詳細に表示し、**戻り値としてそのオブジェクト自体(文字列や数値型など一緒に)を返します**。また、改行も含めて表示します。
“`
p “今日の最高気温は”
p 10
p “度です”
Ruby で Thread.new してるコードを RSpec 実行時だけ同じスレッドで実行させる
“`ruby:some_klass.rb
class SomeKlass
def main
do_somethingThread.new do
do_something_heavy
end
end
end
“`こんな風に `Thread.new` してるコードがある時、テストではスレッドを分けずに同じスレッドで処理をさせたくなることがある。そんなときは `Thread.new` を何もしないように `allow` してしまう。
“`ruby:some_klass_spec.rb
describe SomeKlass do
describe ‘#main’ do
subject { described_class.new.main }# Thread.new をただブロック実行するだけにする
before { allow(Thread).to receive(:new) { |&block| block.call }it { is_expected.to eq ‘somethi
Ruby メモ
## Rubyについて
### Ruby
– 1993年に日本人のまつもとゆきひろさんに設計された言語です。
– Rubyが得意とするのは、ショッピングサイト、ブログサイト、アプリケーションサイト など、フレームワークを使い構築できるWebサイトです。
– マイグレーションは、直接SQLを使わずにデータベースのテーブルやカラムなどの構造 を変更できる仕組みのこと。
– [公式サイト](https://www.ruby-lang.org/ja/)
– [GitHub](https://github.com/ruby)### SideKiq
– Rubyで記述されたオープンソースのバックグラウンドジョブフレームワークです。
– Ruby On Railsと緊密に統合し、バックグラウンド処理を非常にシンプルにします。
– [公式サイト](https://sidekiq.org/)### RSpec
– Rubyの自動テストツールです。
– [公式サイト](https://rspec.info/)### RubyGems
– RubyGems
[Ruby]オブジェクト指向設計を使って変更に強いコードを書きたい ~クラスの責任とインターフェース編~
変更に強いコードを書きたい。
変更に強いコードを書くことで、後々修正が楽になるから。
これがオブジェクト指向設計を学ぶ目的の一つではないでしょうか?
でもオブジェクト指向設計って、色々と難しい言葉が出てきて理解しにくい…
そんな悩みを抱えている方もいらっしゃると思います。そこで今回は、変更に弱いコードを少しずつ変更に強いコードに修正しながら、オブジェクト指向設計の考え方の一部を紹介していきたいと思います。
# 1.この記事の目的
変更に強いコードを書きたい。そのために、①クラスが果たすべき責任について考えてみる
②クラス内のインターフェースを設計してみる
③クラス同士の依存関係を減らしてみる# 2.クラス同士が強い依存関係にあると、コードは変更に弱くなる
ではまず変更に弱いコードから紹介していきます。## 2-1.変更に弱いコード例
今回は、上司が新卒部下に会議の準備をするように指示するシチュエーションをコードとして表現してみました。上司と新卒部下の仕事上でのやり取りって、現実でもよくありますよね。
現実でもよくあるシチュエーションをもとにオブジェク
Ruby芸160チャレンジ(#1):複数行のテキストからサブセットを含む行の抽出
## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。
例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160## 実行環境など
– Docker image: ruby:3.0.2
– 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/1.md“`bash
$ grep ‘\.exe$’ files.txt
“`上記相当の処理
【Ruby】+ と<<で配列の要素を追加した時の話
https://qiita.com/advent-calendar/2023/infratop
シリーズ2の1日目です!卒業生とメンターさんがコラボして書いています📝
まずは、これを見てください。
“`rb:sample.rb
numbers = [1,2,3]
numbers += [4]p numbers # [1, 2, 3, 4]
“`“`rb:another_sample.rb
numbers = [1,2,3]
numbers << [4] p numbers # [1, 2, 3, 4] ``` 一見、配列に要素を追加しただけに見えます。 しかし、[Object#freeze](https://docs.ruby-lang.org/ja/latest/method/Object/i/freeze.html)を使ってみると以下のような違いが出てきます。 ```rb:freeze_sample.rb numbers = [1,2,3] numbers.freeze # numbers << [4] # can't modify frozen Ar
Dockerイメージから作成したLambdaで画像リサイズ処理を行う
# やりたいこと
Lambda関数でlibvipsで画像をリサイズする
Lambda関数はRubyで動かす
画像はS3から取得する
ローカル環境で動作確認もしたい# Dockerfileの用意
libvipsを使う場合そもそもlibvips本体をインストールしないといけません。
今回は、libvipsをインストールしたDockerイメージからLambdaを作成することにしてみました。“`:Dockerfile
FROM amazon/aws-lambda-ruby:latest# EPELリポジトリを追加
RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm# remiレポジトリを追加
RUN yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm# libvipsとlibvipsを使うために必要なパッケージをインストール
RUN yum install
大体0から始めるRuby入門その1 ~Ruby、動く~
この記事は[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)の1日目です。
注意:学んだ内容に間違いがあることがあります。何か間違っていたら教えてください。勉強になります。## 去年のカレンダーのこと
去年ミカンのプロジェクトは今年リベンジしようと10日間試行錯誤しましたが、うまくいかなかったのであきらめて次行きます。
ついでに復習もします。もちろん毎日新しい知識を学び、アウトプットします。:::note info
目標:いろいろ新しいことにチャレンジする。
:::
↓以下本題Rubyは6月ごろに一回触ったことがありましたが、その後全然触ってなかったので知識をつけていきたいと思います。
今回はとりあえず動かすことを目標にしておきます。
# Rubyとは
↓復習
Webアプリケーションとかを作るのに適しているようです。
ただし入門である今回は、そんなに知識がないのでとりあえず何か動けば良しということで。# Rubyを動かすには
【Rails】ミドルウェアでパスを見てDBを切り替える
# 概要
つい昨日パスでアクセスするDBを変更する方法をまとめて書きましたhttps://qiita.com/yothio/items/84daecd154624cdd059e
結果的にcocernに共通処理として本来ControllerやModelが持つべき処理を切り出して、各々で読み込む対応をしましたが中身のないModelやControllerが大量に作成されることになりました
DBへ接続しに行くときのミドルウェアで接続先DBを変更できればめちゃいいじゃんと思いちょっと試してみました
サンプルコードはこちらです
https://github.com/yothio/rails_multi_db_test/tree/modify_database_for_middleware
## 実際にミドルウェアを書いて読み込ませる
アクセスがあったときのDBの切り替えは下記のように定義します
– /hoge/contentsでアクセスがあった場合
– defaultの設定を利用する(db名はkanban_development)
– /fuga/contentsでアクセスが
大規模 Rails で役立つテクニック: Iteratorパターン編
# はじめに
先日、LTイベント「Qiita Night~Rails~」にて登壇させていただきました。
https://increments.connpass.com/event/297116/
そこで、Railsで大規模Webアプリケーションを 開発するときに知っておきたいテクニックを Qiita の Rails を例にいくつか紹介しました。発表資料はこちらです。
アーカイブ動画もあります。
RubyのCSV作成時に undefined method ‘collect’ for nil:NilClass エラーが出たときの対処
みんな大好き Ruby にてSQLでデータベースからとってきた結果をもとに素朴にCSVをつくろうと、検索した記事を参考に書いてみると・・・・
“`ruby
require ‘csv’
CSV.generate do |csv|
@query_result.each{|row|
csv << row } end ``` `csv << row` の箇所でこんなエラーが出ました。インスタンス変数 `@query_result` は [ActiveRecord::Result](https://api.rubyonrails.org/classes/ActiveRecord/Result.html) クラスです。 ``` NoMethodError - undefined method 'collect' for nil:NilClass: ``` `@query_result` をそのまま each するとブロック変数は Hash になるので values でとってくる必要があります ```ruby require 'csv' CSV.generate d
Danger でコードレビューの機械的な指摘を自動化する話
# はじめに
コードレビューで機械的な指摘をすることがあります。
– MR には Issue 番号を書いてください
– MR にこのラベルを付けてください
– 変更ファイル数が大きすぎます—
# こんな不毛な指摘は機械化しましょう!
—
# Danger
Github の説明から引用
> Stop saying “you forgot to …” in code review
つまり、簡単な指摘はDangerに任せよう!
https://github.com/danger/danger
—
# まずはミニマムな構成を作ります
—
# ディレクトリ構成
“`
.
├── .gitlab-ci.yml
├── Dangerfile
└── Gemfile
“`—
# Gemfile
“`Gemfile:Gemfile
source “https://rubygems.org”gem ‘danger-gitlab’
“`—
# .gitlab-ci.yml
“`yml:.gitlab-ci.yml
dang
rubyで大量データをキャッシュした話
# はじめに
実装中、ループのたびに同じデータをデータベースから取得している処理がありました。このデータ取得の処理をキャッシュ化したかった。# クラス変数によるキャッシュ化
まず、クラス変数を使用してキャッシュを実装しました。クラス変数はクラスとそのサブクラスのすべてのインスタンス間で共有されるため、アプリケーション全体で一貫したデータを保持するのに適しています。
以下のような形
“`ruby
class DataCache
@@cache = {}def self.store(key, value)
@@cache[key] = value
enddef self.retrieve(key)
@@cache[key]
end
end
“`
ただし、この実装ではサブクラスへの影響も考慮する必要があります。
DataCacheクラスのみで使用できるようにしたい。# クラスインスタンス変数によるキャッシュ化
次に、クラスインスタンス変数を使用したキャッシュ化を試みました。クラスインスタンス変数はクラス自体に固有で、クラスのすべてのイン
PagerDutyのOnCall当番をAPIで取得してみる
PagerDutyは障害検知などの用途で利用されるプロダクトですが、拡張を作成したりできるように複数のAPIが用意されています。
また、そのAPIのラッパーが様々な言語で用意されています。
今回はRubyラッパーである https://github.com/technicalpickles/pager_duty-connection を利用し、現在のオンコール当番を列挙する簡単なプログラムを作成してみます。## APIトークンの作成
PagerDutyにログイン後、自身のプロフィールページに行き、`user Setting`タブをクリックすると、`API Access
`の項目に`Create API User Token`のボタンがあるのでそこをクリックします。クリックすると下記のようなモーダルが出るので、Descriptionを埋めてCreate Tokenで作成します。
![スクリーンショット 2023-11-30 18.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3597
Workato:Connector SDKでユーティリティコネクタを開発してWorkatoを便利に活用する
# はじめに
WorkatoにはConnector SDKというカスタムコネクタを開発する機能があります。この機能を利用することで、カスタムコネクタを開発し、レシピでそのコネクタを使用することが出来ます。
カスタムコネクタは、主にWorkatoが標準で提供していないアプリケーション向けの連携コネクタを開発する際に使用されますが、連携コネクタだけでなくユーティリティコネクタの開発にも活用ができます。
# ユーティリティコネクタのユースケース
ユーティリティコネクタの開発を検討している方や開発に興味のある方は、Workatoをより活用したい、Workato開発を効率的に行いたい(開発を楽にしたい)という方であろうと思います。例えば、次のようなものがユースケースとして挙げられます。
– 関数(formula)で提供される機能をコネクタ化してレシピ開発の敷居を下げる
– 複雑なformulaの処理をコネクタ化して使いやすくする
– よく使う処理をコネクタ化して使いやすくする(例えば文字列処理や日付・時刻処理など)
– Rubyコネクタ等のローコード系コネクタで開発したユーティリティ
【Ruby】optparseの使い方
Rubyを学習する過程で使用した`optparse`の使い方を解説したいと思います。
本記事に間違った内容が含まれている場合、ご指摘いただけますと幸いです。## `optparse`とは
[公式リファレンス](https://docs.ruby-lang.org/ja/latest/library/optparse.html)を見ていただければわかりますが、要するに**コマンド実行時のオプションを自分で作るためのライブラリ**です。
オプションというのは、コマンドを実行するときにその後に`-`や`–`をつけて指定できるものです。
たとえばGitの`branch`コマンドでは、以下のように`-d`(`–delete`)オプションの後にブランチ名を指定することでそのブランチを削除できます。`-d`がショートオプション、`–delete`がロングオプションです。
“`
git branch -d ブランチ名
git branch –delete ブランチ名
“`上の例ではオプションのあとにブランチ名を指定していますが、これは引数となるものです。引数は省略できる場合もありま
Ruby – How to check instance variable defined? -> e.g defined?(@a) ( Rubyでインスタンス変数が定義済みのことをチェックする )
# Code
Defined
“`rb
@a = nildefined?(@a) # “instance-variable”
!!defined?(@a) # true
“`Undefined
“`rb
defined?(@b) # nill!!defined?(@b) # false
“`# チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ
初めてのRSpecで学んだこと No.2
## バージョン
– ruby 3.2.2
– Rails 6.1.7.6
————————-## タスク管理アプリでの、タスクが降順に並んでいるかをRSpecでテストする
タスク管理アプリにて、投稿したタスクを降順に並べ、降順に並んでいるかをテストするために、「最新のタスクが一番上に表示される」、ということを確認するためのコードを書いたが、その時に学んだことを備忘録として残しておく。
“`spec/factories/tasks.rb
FactoryBot.define do
factory :task do
name { ‘パパ’ }
content { ‘日曜日歯医者’ }
end
end
“`“`spec/system/task.rb
RSpec.describe ‘タスク管理機能’, type: :system do
describe ‘新規作成機能’ do
context ‘タスクが作成日時の降順に並んでいる場合’ do
it ‘新しいタスクが一番上に表示される’ do