Ruby関連のことを調べてみた2022年12月25日

Ruby関連のことを調べてみた2022年12月25日

Ruby: 入れ子の配列だけをパースできるパーサを作る(手書きの再帰下降パーサ)

たとえば `((), (), (()))` という文字列を入力として与えると

“`ruby
p parse(“((), (), (()))”)
#=> [[], [], [[]]]
“`

このように入れ子の配列を出力する(入れ子の配列に変換する)パーサを作ります。

入力文字列として使える文字は `(`, `)`, `,`, 半角スペースの4つだけとします。

いきなり全部やろうとすると大変なので、4つのステップに分けましょう。
以下、「配列」と書いているところは Ruby の配列のイメージで大丈夫です。

– (1) `()` をパースできる
– 空配列
– (2) `(())` や `((()))` をパースできる
– 配列の入れ子
– (3) `(要素, 要素)` や `(要素, 要素, 要素)` をパースできる
– 配列の要素のくりかえし
– (4) `((), (()))`
– 入れ子とくりかえしの組み合わせ

# (0) 全

元記事を表示

ruby 練習問題43 (アウトプット用)

以下の条件を満たすコードを記述する問題。

・Bookクラスを作成する
・Bookクラスは@titleと@priceをプロパティとして持っている
・attr_readerを使用する
・Bookクラスのインスタンスを作成する(タイトル、価格は任意)
・作成したインスタンスから、タイトルと価格を取得し画面に表示させる。
以下、模範解答
“`ruby
class Book
attr_reader :title, :price

def initialize(title, price)
@title = title
@price = price
end
end

book = Book.new(“プロを目指す人のRuby入門”, 3218)
puts book.title
puts “#{book.price}円”
“`
以下、解説
まず、attr_readerメソッドとはインスタンス変数を呼び出すメソッドを定義するメソッドである。主に記述する量を減らすために使われるとの事。
attr_readerを使用しないコードだと
“`ruby
class Book

元記事を表示

【Ruby】selfでinitializeメソッドからセッターメソッドを呼び出す

# 概要
メタプログラミングの学習を進めてて、つまずいたのでメモ程度に残していきます。
initializeメソッドとセッターメソッドを深掘りします。

# initializeメソッドとセッターメソッドの定義

initializeメソッドを定義しセッターメソッドを定義すると次のようになります。

“`ruby
class Car
attr_accessor :name
def initialize(name)
@name = name
end

def say
“私の車は#{name}です”
end

end

my_car1 = Car.new(“toyota”)
p my_car1.name
p my_car1.say

# =>”toyota”
# =>”私の車はtoyotaです

“`

通常ですと、変数の受け渡しにインスタンス変数(@name)を使用しますが、
これをローカル変数に変えてみます。

“`ruby
class Car
attr_accessor :

元記事を表示

【Ruby】initializeメソッドとattr_accessorメソッド

# initializeメソッドとは

classがnewメソッドによりインスタンスを作ったときに、インスタンス変数の情報を持たせることができます。特に、classを使用して違う値のインスタンス変数を設定するために、値を初期化したい場合にinitializeメソッドが必要となります。

“`ruby
class Car
def initialize(name)
@name = name
end
end

my_car1 = Car.new(“jeep”) # =>
my_car2 = Car.new(“benz”) # =>
“`

# ゲッターメソッドとは
`my_car1`には`jeep`というインスタンス変数が定義されています。これを取り出してみたいと思います。

“`ruby

class Car
def initialize(name)
@name = name

元記事を表示

Steepを使ってRubyの型検査に入門する

リンクアンドモチベーションでソフトウェアエンジニアをしているkoboriです。
何の記事を書こうか考えた時に、少し前に話題になった、Rubyで型検査ができる話を思い出しました。気になりつつも全然触れていなかったので、この機会に触ってみました。

# Steepとは
Steepとは、RBSを使ってRubyの型検査をしてくれるライブラリです。

https://github.com/soutaro/steep

RBSとは何かについても触れておきます。

> RBS is a language to describe the structure of Ruby programs.

https://github.com/ruby/rbs

RBSとは、Rubyのプログラムの構造を記述するための言語のようです。

つまりSteepを使った型検査とは、プログラムの構造をRBSで表現し、それをもとにSteepを使って検査していく、と説明できそうです。

# なぜ型があると嬉しいのか
一般に言われている静的型付け言語のメリットをざっと挙げてみます。

1. 実行速度が速い
2. コンパイル時にエ

元記事を表示

SET1年目の新卒が、ヒィヒィ言いながら社内の自動テストツールを改善した話

# はじめに
22年度新卒で株式会社LIFULLに入社した[Yamashita-Taiki](https://qiita.com/Yamashita-Taiki)です。

最近35インチのモニターを導入して仕事の質が爆上がりです(してますよね???)

今回は内製OSSの自動テストフレームワークであるBucky-core、その結果レポートを担当しているBucky-managementのUIを改善したので、そこで学んだことを書いていこうと思います。
Bucky-coreやBucky-managementについては以前社員の方が詳細について投稿してくださっているので[その記事](https://qiita.com/rueyjye/items/570ce17d698819f99091)を見ていただければと思います。

# 今回挑戦したこと
実行されたテスト結果を表示するページのUIを改善しました。
まずbeforeとafterの画像を添付します↓

## before(実際には30件並んでいます)
![スクリーンショット 2022-12-22 17.33.03.png](https://q

元記事を表示

Mapbox Style API を使って画像を登録する

この記事は、[YAMAPエンジニアAdvent Calendar 2022](https://qiita.com/advent-calendar/2022/yamap-engineers) の12月25日の記事です。

# はじめに

YAMAPにはMapboxを使って地図を表示する機能があり、地図上にサービス独自のアイコンを表示するためにはアイコン画像をMapbox Styleに登録する必要があります。

アイコン画像はMapboxのダッシュボードを使うと登録できますが、アイコン画像のオリジンは我々のサービス内で管理されているので二重管理はしたくありません。

そこでサービス内で管理されているアイコン画像を [Mapbox Style API](https://docs.mapbox.com/api/maps/styles/) を使用してMapboxと同期することを考えます。

YAMAPのバックエンドシステムはRubyで実装されているため [mapbox-sdk-rb](https://github.com/mapbox/mapbox-sdk-rb) を使うことを第一に検討しました

元記事を表示

飲食店横断検索サービス「おうだん君」を作って公開してみた?

## 完成品
https://www.restaurant-search.net/

出来上がったものがこちら!!

## 概要
アドベントカレンダーで色々tipsを書いていたのですが、最終成果物として1つwebアプリケーションを作ってみたのでそれの紹介

## なぜ?
アプリケーションを作ろうと思ったきっかけは以下の2つ
– アドベントカレンダーを埋めるにあたって最終的に何かを目指して開発をしていったほうがネタが集まりやすそう
– 最近新しいサービスを作れてなかったから作りたかった

## 「おうだん君」とは?
![スクリーンショット 2022-12-24 23.07.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/b3a4f08f-be58-4773-e287-7e9f6c206622.png)
おうだん君とは、タイトルに有るように**飲食店横断検索サービス**です。
皆さんお店を探す際にGoogleMapだったり食べログだったりRettyだったりいろんなサイトを見て判断の材料にして

元記事を表示

入緑(予定)記事?

## はじめに
この記事を書いている現在(11/30)は入緑をしておらず、おそらく公開される時にも入緑はしていません!

入緑した(してない)ことよりも、競技プログラミングを通して、アルゴリズムを学ぶことにはとても価値があるということを伝えたいです。

https://atcoder.jp/users/apierce

## 何が嬉しいか
僕が競プロをしていてよかったなと思うことはざっとこんな感じです。
– 楽しい
– 言語に対する理解が深まる
– エスパー力がつく
– ロジカルに考えられるようになる
– コーディングテストに受かりやすくなる

#### 楽しい
まずなんと言っても楽しいです。
解けるか解けないかレベルの問題が“`WJ“`から“`AC“`に変わる時の脳汁は半端ないと思います。

#### 言語に対する理解が深まる
僕はRubyで競プロをしているのですが、競プロを始める前に比べるとRubyに対する理解が深まったように感じています。

“`
[ [12, 33], [100, 20], [88, 0], [2, 11], [550, 1] ]
“`
上記

元記事を表示

Stimulus リファレンス: TypeScriptを使う

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://stimulus.hotwired.dev/reference/using-typescript

Stimulus自体は[TypeScript](https://www.typescriptlang.org/)で記述されており、そのパッケージ上で型を直接提供します。以下のドキュメントはStimulusプロパティの型を定義する方法を示しています。

# コントローラー要素型の定義

デフォルトではコントローラの要素は`Element`型です。コントローラー要素の型を[ジェネリック型](https://www.typescriptlang.org/docs/handbook/2/generics.html)として指定することでオーバーライドできます。たとえば、要素の型が`HTMLFormElement`であると予想される場合:

“`typescript
import { Controller } from “@hotwi

元記事を表示

RubyだけでJSXチックに仮想DOMをかけるようにした

## はじめに
Qiitaのアドベントカレンダーで前回↓のような記事を書きました。

https://qiita.com/getty104/items/410448f7e7a20737c811

今回は仮想DOMをJSXライクにかけるようにしてみた、という記事です。

## 挑戦したこと
前回の記事では、↓のような記述をするだけで、ぬるぬる動くUIが実現できるようになりました。

“`rb
state = {
url_name: ”,
}

actions = {
update_url_name: ->(state, value) { state[:url_name] = value }
}

view = ->(state, actions) {
isvalid = state[:url_name].length >= 4

h(:form, { class: “w-full max-w-sm” }, [
h(:label, { class: “block mb-2 text-sm font-medium text-700 dark:text-500” }

元記事を表示

【Ruby】Prawn で生成した PDF に旧字体が含まれていると文字化けしてしまう場合の対処法

## 背景

タイトル通り、[Prawn](https://github.com/prawnpdf/prawn) で生成した PDF に旧字体が含まれていると文字化けしてしまう現象が発生。

ex. 「高瀬 真守」という名前のユーザー情報を PDF 出力(※「瀬」は旧字体)

![スクリーンショット 2022-12-25 5.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/9746f1cf-e65b-0d61-9e72-fa5e99eacc6f.png)

ご覧のように上手く出力ができていません…。

## 原因

フォントの設定に問題がありました。

“`ruby
class PdfeGenerator < Prawn::Document def initialize super(page_size: "A4", margin: 20) font Rails.root.join("app/assets/fonts/mplus-2p-regular.t

元記事を表示

[Fediverse]テーマ鯖構築のススメ

この記事は [Fediverse (2) Advent Calendar 2022](https://adventar.org/calendars/7719) の24日目の記事です。

今年のFediverseアドベントカレンダーは2件登録させていただきました。
書きたいことが多くてまとめきれなかったり、自宅鯖のリプレース作業で1回目に登録した日じゃ間に合わなそうだなってなったり。師走を師走らしく、わすわすと慌ただしい日々を送っている今日この頃です。

さて、この記事も当日ギリギリになって書いているわけではありますが、前回の題名「 [\[Fediverse\]テーマ鯖運営のススメ – Qiita](https://qiita.com/guskma/items/846909cc2930d234d9eb) 」とあるように、シリーズ記事となっております。ただ、あちらはお気持ち表明的な記事で、 **今回はどちらかというと技術的な話** がメインです。前回記事を読まなくても大丈夫ですが、読んでもらえると今回の記事で僕が取り上げることの想いが理解してもらえると思います。知らんけど。

# 本日の

元記事を表示

test投稿(すぐ消します)

[test](https://different-tarsal-671.notion.site/597747e9f7b3401bb5c8977de895cead)

元記事を表示

git revert(間違ったコミットを打ち消したいとき )

## 経緯 
railsにてログイン機能を実装していた時、うっかりdevelopブランチのまま作業をしていた…!

“`
% git branch
* develop
main
“`
それに気づかないまま、**git add .** し、 **git commit** してしまった。(コミット名は、**login_user** としていました)

## やったこと
コミットを取り消したいということで、**git revert <commitID>** コマンドを使いました。
“`
git revert
“`
commitIDは、後述の**git log** コマンドを入力して確認できます。

>既存のコミットを取り消すためのコマンドです。
>「取り消したいコミットを打ち消すようなコミットを新しく作成する」という処理によって、既存のコミットを取り消します。
>新しくコミットを追加しているだけなので、既存コミットの履歴が消えるわけではありません(コミットログをみると残っています)。
どんな変更があった

元記事を表示

【Ruby】andと&&は優先度の影響で振る舞いが変わる

例として以下のような `test.rb` を作成する

“`ruby:test.rb
def hoge(val)
p val and return
p “end of hoge”
end

def fuga(val)
p val && return
p “end of fuga”
end

hoge(“hoge”)
fuga(“fuga”)
“`

期待される出力として

“`ruby
hoge
fuga
“`
が出てきてほしい

しかし実行結果は
“`shell
$ ruby test.rb
“hoge”
$
“`
という出力になる

このような出力になる原理として、
` and は && に比べて優先順位の低い演算子` と説明がある

> 左辺を評価し、結果が偽であった場合はその値(つまり nil か false) を返します。左辺の評価結果が真であった場合には 右辺を評価しその結果を返します。 and は同じ働きをする優先順位の低い演算子です。 [- 演算子式 (Ruby 3.1) – and](https://docs.ruby-lang.org/

元記事を表示

【Ruby】「puts、print、p」の違いについて

## puts

– オブジェクト出力後に改行して、メソッドの戻り値を出力する
– putsメソッドの戻り値は「`nil`」になる
– 配列を渡した場合、要素ごとに改行して出力する
– 文字列以外のオブジェクトは、to_sメソッドによって文字列に変換される

“`ruby
> puts 123
123
=> nil

> puts ‘foo’
foo
=> nil

> puts “foo\nbar”
foo
bar
=> nil

> puts [1, 2, 3]
1
2
3
=> nil
“`

## print

– オブジェクト出力後に改行されない
– printメソッドの戻り値は「`nil`」になる
– 配列を渡した場合、配列をそのまま出力する
– 文字列以外のオブジェクトは、to_sメソッドによって文字列に変換される

“`ruby
> print 123
123=> nil

> print ‘foo’
foo=> nil

> print “foo\nbar”
foo
bar=> nil

> print [1, 2, 3]
[1, 2, 3]=> nil
“`

元記事を表示

Hash.new([]) の挙動にハマった

## はじめに
`Hash.new([])` を使用して処理を書く場面があったのですが、
その際の思わぬ挙動にハマった話とその対処方法について記事にしました

## 問題のコード
“`ruby
processed_ids = ::Hash.new {[]}

# user からは group_id と user_id を参照できる
users.each do |user|
next if processed_ids[user.group_id].include?(user.user_id)

processed_ids[user.group_id].push(user.user_id)
end
“`

processed_ids にキーとして group_id を指定し、それに対して配列で user_id を追加していき、
既に group_id に対応する配列に user_id が追加されていたら、処理をスキップする、という処理を書いています。

上記のような記述で動作する…と思っていたのですが、
実際に動かしてみると想定した通りに動きません。

実際にコンソ

元記事を表示

ruby 練習問題42 (アウトプット用)

問題
ユーザーが数字を2つ渡すと、それらを掛け算した結果を返すプログラムを作ってください。

定義する変数
2つの数字を、それぞれnum1, num2という変数にgetsメソッドを利用して定義してください。
という問題。
下記、実行結果の例。
“`
#デスクトップに移動
$cd Desktop
#Rubyファイルを実行
$ruby argument_test.rb
最初の数字を入力してください
5
2番目の数字を入力してください
6
5と6をかけた答えは30です!
“`
以下、模範解答
“`ruby
def multiplication(num1, num2)
puts “#{num1}と#{num2}をかけた答えは#{num1 * num2}です!”
end

puts “最初の数字を入力してください”

num1 = gets.to_i

puts “2番目の数字を入力してください”

num2 = gets.to_i

multiplication(num1, num2)
“`
以下、解説
今回は基本的なdefメソッドとgetsメソッドの使い方の復習問題のようだがポイ

元記事を表示

Rubyでスクレイピングしてみた

# はじめに

[RUNTEQ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/runteq)の24日目の記事です。

プログラミングスクールRUNTEQ内でチームメンバーを募り、東京都オープンデータハッカソンに出場して[pluspo](https://pluspo.magia.runteq.jp/)というサービスを開発中です。
サービス内でスポーツ施設のHPに載っているデータを使用しているのですが、現在のデータは手打ちで入れています。
さすがにこのままじゃあこの先厳しいので、後々スクレイピングでデータを入れようと考えています。

しかし、、、チーム内にスクレイピングに知見のあるメンバーがいません…!(もちろん校長を除いて)

ということで初スクレイピングしてみました!
(pluspoのレイアウトが崩れていますが突っ込まないでくださいw)

※ スクレイピングは法に触れる場合があるみたいなので諸々確認してから行ってください。

# 早速スクレイピングする
簡単にできそうな[mechanize](https:/

元記事を表示

OTHERカテゴリの最新記事