Ruby関連のことを調べてみた

Ruby関連のことを調べてみた

GoでAPIサーバーを立てよう!(Ruby on Railsと比較しながら)

# 概要
Ruby on Railsしかバックエンド触ったことがない筆者がはじめてGoでAPIサーバーを立てた時、「Railsと比較しながら理解すれば理解しやすいのでは・・・!」と思いせっかくなら記事にしようと思い立って記事にした。

# まず最初に、RailsでAPIサーバーを動かすイメージを・・・
まず、RailsでAPIサーバーを動かす時、どうやって実装してサーバーを動かしていたかイメージします。
文字にするとこんな感じでしょうか。
1. rails sするとlocalhost:3000にサーバーが立ち上がる
2. routes.rbにルーティング(エンドポイントと対応するコントローラー, アクション)を定義する
3. コントローラーのアクションの中身を書く(DBの読み込み、書き込み、レスポンスの返却…etc)

GoでAPIサーバーを立てるときも基本的にやることは変わらず、この通り進めていけば問題ないです。

# じゃあ実際にGoでAPIサーバーを立ててみようか
んじゃ、実際にやってみましょう。

## 1. Goの環境を立ち上げる
railsでいうところのrails ne

元記事を表示

Rails6 で動的なセレクトボックスを作りたい(Stimulus x Axios編)

## この投稿は、

DMM WEBCAMP Advent Calendar 2023
シリーズ2 投稿3日目のエントリーです。

2日目も私 @tomoaki-kimura で
[Rails6 で動的なセレクトボックスを作りたい(JQuery編)](https://qiita.com/tomoaki-kimura/private/dc10a4d6eb367f128e6e)でした。
条件を絞り込みながら入力できる動的なフォームを作りました。

## はじめに
DMM WEBCAMP でメンターをやらせていただいております。 @tomoaki-kimura です。
Rails7のリリースから随分経ちますが、Rails6の環境もまだまだあります。
今回は、前回の記事で作ったフォームを [stimulus](https://github.com/hotwired/stimulus-rails) と [axios](https://github.com/axios/axios) で置き換えていきます。

## 環境
– Ruby 3.1.2
– Rails 6.1.4
– yarn 1.22.

元記事を表示

【勉強法】Ruby Gold3.1

# はじめに
Ruby Gold3.1受験にあたり取組んでいた勉強法が3つあるので簡単にまとめていければと思います。

# 勉強法①
まずは「ポモドーロテクニック」です。
ポモドーロテクニックは有名な勉強法で、[こちらの記事](https://qiita.com/moromi25/items/e54d6205e41b8ffb1324#:~:text=%E3%83%9D%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AD%E3%83%BB%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%81%A8%E3%81%AF%E3%80%81%E9%9B%86%E4%B8%AD,%E3%81%93%E3%81%A8%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%99%E6%96%B9%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82)から一部抜粋させていただきます。

>1.その日に達成したい1つのタスクを細かく分割する
2.分割した1つのタスクを25分間集中して行う(タ

元記事を表示

Ruby芸160チャレンジ(#3)0埋めファイルリネーム

## この記事は何
[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/3.md

“`bash
$ time ls -U | xargs -P2 rename ‘s/^/0

元記事を表示

ShopifyのRubyスタイルガイド 日本語訳

https://ruby-style-guide.shopify.dev/

:::note
この記事は[DeepL](https://www.deepl.com/)の結果を編集したものです。修正点などはお気軽に編集リクエストをしてください。
:::

RubyはShopifyのメイン言語です。私たちは主にRubyを使用しており、おそらく最大規模のショップのひとつです。Rubyは新しいWebプロジェクトやスクリプティングのための言語です。

Shopifyではすべての開発者が少なくともRubyを一通り理解していることを期待しています。素晴らしい言語です。日々どのような仕事をしていても、より良い開発者になれるでしょう。以下に示すのはRubyでの開発中に従うべき緩やかなコーディングスタイルです。

このスタイルガイドはShopifyでの10年以上に渡るRuby開発の成果です。内容の多くはBozhidar Batsovの[Rubyスタイルガイド](https://github.com/rubocop-hq/ruby-style-guide)に基づいており、[多くのコントリビューター](htt

元記事を表示

大体0から始めるRuby入門その3

この記事は[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)の3日目です。

# おみくじ
ランダムな数字の生成の仕方を学んだので、おみくじを作ります。
せっかくなので、運勢だけでなくランダムにメッセージが出るようにします。

# 配列
配列は、[]でくくって、中に「,」区切りで入れたいものを入れます。
例)
“`
Test1=[“a”,”b”,”c”]
“`
Test1には、aとbとcの文字列がそれぞれ入っています。
ほかの言語と大体同じでした。
中身を一つ取り出すときは
“`
puts Test[0]
“`
これで0番目のaを取り出せました。
Rubyも、配列は0から始まるようです。
ランダムに文字を出すようにしてみます。
“`
Test1=[“a”,”b”,”c”]
A=rand(0..2)
puts Test1[A]
“`
これでaからcが出てきます。
3行目のputsするTest1の[]の中に直接rand(0..2)を入れても動きまし

元記事を表示

色々な言語で簡単なREPLを実装する #ruby

# REPLとは

REPLとは、Read-Eval-Print Loopの略で、プログラミング言語の実行環境の一つです。ユーザーが入力欄にキーボードなどから式や文を一行入力(Read)、即座に評価(Evaluate)して結果を返し(Print)、再び入力可能(Loop)になる対話的な実行方式です。

## Rubyで実装する

main.rb
“`ruby
def main
while true
begin
print “ruby> ”

input = STDIN.gets
raise Interrupt if input.nil?

prompt = input.chomp
break if prompt == “exit”

# puts eval(prompt)
puts prompt
rescue Interrupt
puts “\nBye!”
break
rescue Exception
puts “Error: #{$!}

元記事を表示

Ruby on Rails 7.1の主要な新機能・機能追加・変更点

## はじめに

Rubyを使用したOSSのWebアプリケーションフレームワーク、Ruby on Rails(以下Rails)の最新バージョンである7.1(以下Rails 7.1)が[2023年10月5日にリリースされました](https://rubyonrails.org/2023/10/5/Rails-7-1-0-has-been-released)。

Rails 7.1はデプロイ用のDockerfileの自動生成、複合プライマリキーのサポート、Active Recordの非同期クエリの機能追加、Trilogy MySQLアダプタのサポートなど、多くの機能追加が行われました。

本記事では、[Railsの公式ブログ](https://rubyonrails.org/blog/)や[Railsガイド](https://edgeguides.rubyonrails.org/active_record_encryption.html)、GitHubのRailsプロジェクトの[Issues](https://github.com/rails/rails/issues)や[Pull Req

元記事を表示

Gem作者が開発するときに考えていること

私は、 [ruby-duckdb](https://github.com/suketa/ruby-duckdb) という gem を開発しています。普段、 gem を開発する上で考えていることを書いてみたいと思います。

## 複数のRubyのバージョンで動作する

普段、業務で開発している Rails アプリケーションとは違い、 gem を使うユーザーは、 どのバージョンの Ruby を使うかわかりません。
なので、広く使われるように、複数の Ruby で使えるようにしたいと考えてます。
とはいえ、古いバージョンのサポートを続けるのは、労力がかかるので、 Ruby が公式にメンテしているバージョンに限定しています。

手元で全バージョンを確認するのも手間なので、CI (GitHub Actions) を使って自動テストを実行して動作確認しています。
なお、CIで実行するときは、head や preview バージョン (2023年11月26日時点では、 3.3.0-preview2)でもテストしています。

私は、開発するときは、最新のバージョンを使っています。
たまに、Ruby 3

元記事を表示

Rails 入力した値をその通り保存できなかった時に、ログを確認して学んだこと!

## バージョン
– ruby 3.2.2
– Rails 6.1.7.6
————————-

スクールの課題でタスク管理アプリを作成中、先に`name`と`content`のカラムを作ってあり、後で、`timelimit`(終了期限)のカラムを追加した。後からカラムを追加すると、既に保存してあるデータベースについては、後から追加したカラムの値が`nil`となってしまいエラーになってしまうので、デフォルト値を設定した。
### しかし、新規投稿しても、終了期限が、デフォルト値で設定してある「今日」になって登録されてしまう!!なぜだ!!

![スクリーンショット 2023-12-01 10.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566175/9e18e723-f2dd-7fab-16c1-9d5304bf224d.png)

`schema.rb` の中身はこんな感じ↓
“`schema.rb
create_table “tasks”, for

元記事を表示

3回目のRuby技術者認定試験Gold 3.1で合格した話

# はじめに
2023年11月上旬に2回目のRuby Gold受験し68点で落ちた([落ちた話はこちら](https://qiita.com/Takaharu_01/items/5da7f656f1e317dc0bc4))ので、2023年11月下旬に3回目受けました。
結果は82点で合格したので、2回目受験から今回の3回目受験までの期間取組んだこと等をまとめてみます。

# 試験当日までにやったこと
1. [Ruby技術者認定試験合格教本](https://www.amazon.co.jp/gp/product/B0756VF9Y3/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)
1. 基礎力確認問題を解く
1. 模擬試験を解く
1. [ctc問題](https://www.school.ctc-g.co.jp/ruby/training_ruby_gold_01_10.html)を解く
1. [模擬問題集](https://github.com/ruby-association/prep-test/blob/versio

元記事を表示

Rails アプリの webpacker を shakapacker に移行した

[webpacker]:https://github.com/rails/webpacker
[shakapacker]:https://github.com/shakacode/shakapacker
[webpack]:https://webpack.js.org/

[ツクリンク プロダクト部 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/tsukulink) の2日目です。

# 概要

[webpacker][webpacker] はもうメンテナンスされないので [shakapacker][shakapacker] に移行した。手順通りやればうまくいくけど、ハマったポイントもある。

# [webpacker][webpacker] はもうメンテされない

> Webpacker has been retired 🌅

[webpacker READMEより][webpacker]

[webpacker][webpacker] はもうメンテナンスされません。最後のコミットから1年くらい経っていて、

元記事を表示

Rails6 で動的なセレクトボックスを作りたい(JQuery編)

## この投稿は、
DMM WEBCAMP Advent Calendar 2023
シリーズ2 投稿2日目のエントリーです。

1日目は @yuki82511988 さんで
[【Ruby】+ と<<で配列の要素を追加した時の話](https://qiita.com/yuki82511988/items/496e69158086bbe2c33c)でした。 Rubyは詳しければ詳しい程幸せになれますね。 ## はじめに DMM WEBCAMP でメンターをやらせていただいております。 @tomoaki-kimura です。 Rails7のリリースから随分経ちますが、Rails6の環境もまだまだあります。 ということで、今年の寄稿はRails6で改めて動的なフォームの処理に触れてみたいと思います。 ## 環境 - Ruby 3.1.2 - Rails 6.1.4 - yarn 1.22.18 ## 作るもの [![Image from Gyazo](https://i.gyazo.com/68f2fe8778990ddf75eed13579d57419.png)](http

元記事を表示

Ruby芸160チャレンジ(#2):ディレクトリ内のファイル全てに処理を適用

## この記事は何
[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/2.md

“`bash
$ time ls *.png | sed ‘s/\.png$//’ | x

元記事を表示

FormObject 複雑な検索機能のカプセル化

## はじめに
チーム開発で学んだことや、アプリ開発を通して調べたこと、実装手順、またプログラミングスクールで学習した内容をまとめています。

今回は、複雑な検索機能を実装する際にFormObjectについて調べたことをまとめます。

# FormObjectとは
FormObjectとは、`form_with`のmodelオプションにActive Record以外のオブジェクトを渡すためのデザインパターンです。このパターンは、データベースと直接関係のないフォームや複数のモデルを扱うフォームを作成する際に、処理をすっきりと記述することができます。

# FormObjectにおけるカプセル化とは
フォームに関連するデータとロジックを一箇所にまとめて記述することでコードを効果的に管理し、アプリケーション全体の構造とコードの品質を向上させることができる重要な手法です。これにより、より維持しやすく、拡張しやすいコードを書くことができます。

## メリット

説明

大体0から始めるRuby入門その2  ~ゲームを作る~

この記事は[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)の2日目です。
# 簡単なゲームを作る
簡単な数あてゲームです。
数字を入力し、決められた数よりも大きいか小さいか、あるいは正解かを判断する例のあれです。
これを作るにあたって、数字を入力する部分、if文について学んでいきます。
# 数字を入力できるようにする
数字を入力するには「gets」を使うようです。
また、入力後にEnterを押した際改行がされるのを防ぐために「chomp」というのをつけるそうです。
さらに、入力した文字を数値に変えるために「to_i」を用いるようです。
全て組み合わせて、実際にやってみた結果がこちら
↓コード
“`
puts “ある人は”
getter =gets.chomp
puts “ある人は”+getter+”です。”
“`
出力
“`
C:\Users\xxxxx\Desktop>ruby Advent2023.rb
ある人は
人間
ある人は人間です。

VercelでNode.js以外のランタイムを動かしてみる(Go, Python, Ruby)

Vercel といえば Next.js なので、 Node.js を動かすものというイメージがあります。

ですが、Vercel では Node.js 以外のアプリケーションもデプロイすることができます。

想像以上に簡単にデプロイできて、すごかったです :hushed:

## 公式が対応しているランタイム

Vercel は以下のランタイムに対応しています。

– Node.js
– Edge
– Go
– Python
– Ruby

## コミュニティ・ランタイム

公式がサポートしているランタイムとは別に、ユーザが作成したコミュニティ・ランタイムも存在します。コミュニティ・ランタイムには、以下のランタイムがあります。

– Bash
– Deno
– PHP
– Rust
– Bun

コミュニティ・ランタイムは、GitHub の [Vercel Community](https://github.com/vercel-community) リポジトリで管理されているようです。

## ランタイムの比較

基本的に、サーバレスなアプリケーションを構築をする場合には No

【Rails】ActiveStorageでvariantを行うと画像が表示されない問題を解決する

現象としてlocalhost:3000/items/:idで実装している機能の動作確認を行っていたところ、variantを指定して表示したいんだけど非表示になってしまっていた。
![スクリーンショット 2023-11-26 22.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532739/02837960-4253-4832-af62-f6132dcee2ab.png)

# 原因:minimagickを明示的に指定していなかった

Gemfile.lockを確認するとmini_magickがちゃんとインストールされていることがわかりました。

問題はvariantを利用するためにmini_magickを明示的に指定していないことが問題なようです。

参考URL

[https://zenn.dev/iloveomelette/articles/76aad4d9ce86d1](https://zenn.dev/iloveomelette/articles/76aad4d9ce86d1)

【Ruby】OpenSSLライブラリでのAES-256-CBC復号化にて少し詰まった点

### 概要
Ruby on Railsを利用したwebシステムの開発において、[公式ドキュメント](https://docs.ruby-lang.org/ja/latest/class/OpenSSL=3a=3aCipher.html)を参照しつつ
OpenSSLライブラリを利用したAES-256-CBC復号化を試みた際に、鍵の設定において少し詰まってしまったためその備忘録となります。

### 要点
OpenSSLライブラリを利用してAES-256-CBC復号化を実施する際、鍵・IVは16進数の文字列ではなくバイト列として設定する必要があり、バイト列への変換は以下のような手順で可能
~~~
irb(main):028:0> key = [‘a377a0c1afb45312592296a5be06384b03adae8172248f4ab85e3b281e7b6c3c’].pack(“H*”)
=> “\xA3w\xA0\xC1\xAF\xB4S\x12Y\”\x96\xA5\xBE\x068K\x03\xAD\xAE\x81r$\x8FJ\xB8^;(\x1E{l<" ~~~

booleanはsortのキーに使えないのか

何番煎じか分かりませんが、ちょっと面白かったのでメモがてら書いてみます。

“`ruby
data = [
{flag: true, score: 30},
{flag: false, score: 20},
{flag: true, score: 10},
{flag: false, score: 40}
]

# こういうデータがある時、条件1: trueを上に、条件2: スコア順でソートしたい

data.sort_by { |item| [item[:flag], item[:score]] }
# => ArgumentError: comparison of Array with Array failed

# むむ? キーをflagだけにすると…
data.sort_by { |item| item[:flag] }
# => ArgumentError: comparison of TrueClass with false failed

# なるほど! TrueClassとFlaseClassで比較はできないよってことね

# ということは..