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

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

flattenメソッドについて

##flattenメソッド
flattenという英単語は、均す(ならす)という意味です。
flattenメソッドとは、多次元配列を1次元配列に変えるメソッドなんです。
実際にコードを見ていきましょう

“`
arr = [1, 2, 3, [6,8], 9]
arr.flatten
=> [1, 2, 3, 6, 8, 9]
“`
上記の例をみると、多次元配列が、1次元配列になっています。

このメソッドは配列だけでなく、ハッシュでも使われます。ハッシュで使われると、1次元配列にしてくれます。
実際にコードを見ていきましょう

“`
hash = { ‘hoge’: 100, ‘fuga’: 200 }
hash.flatten
=> [:hoge, 100, :fuga, 200]
“`
このようにハッシュでも1次元配列にしてくれるメソッドなんですね。

多次元配列じゃない配列に破壊的メソッドであるflatten!を適用すると、nilが返ってくるんです。

“`
[‘hoge’,’fuga’,’hogehoge’,’fugafuga’].flatten!
=> nil
`

元記事を表示

Rubyの自己代入(||=)について

実務をこなしていく中で、自己代入を使ったコードをよく見るので、それを解説していきます。

例えばこんなコードです。

“`
a = ‘hoge’
b ||= ‘fuga’
b
=> “fuga”
“`
このコードでは自己代入が使われています。この自己代入とは
**左辺の変数が、nilもしくはfalseのとき||=の右辺にある値を代入する**という意味です。
上記のコードでいえば、変数bがnilもしくはfalseのときfugaという文字列を変数bに入れてくださいね、という意味になります。
変数bはそれに当てはまるので、bにはfugaという文字列が入ります。

下記のようなコードを書いて見ましょう

“`
a = ‘hoge’
a ||= ‘fuga’
a
=> “hoge”
“`
上記のコードでは、aはfalseでもnilでもないのでfugaはaに代入されません。

“`
a ||= 10
“`
上記のコードは、

“`
a || a = 10
“`
このように論理演算子で考えると分かりやすいとおもいます。論理演算子の理解があやふやな方は、[こちら](https://qi

元記事を表示

public_sendとsendの違い

実務をしていく中で、public_sendとsendというメソッドが出てきたので、詳しく調べたので、記事にしようとおもいます。

結論からいうと、privateメソッドを呼び出せるか否かの違いなんです。
詳しく解説していきます

##privateメソッドとは
privateメソッドと普通のメソッド(クラスメソッドやインスタンスメソッド)の違いは、他のクラスで使えるかどうです。
実際に具体例を見ていきましょう

“`
class Test
def public_method
puts ‘publicメソッドだよーん’
end

private

def private_method
puts ‘privateメソッドだよーん’
end
end

class Test2
def public_method2
puts ‘これもpublicメソッドだよーん’
end

test = Test.new
test.public_method
=> publicメソッドだよーん

 test.private_method
 =>

元記事を表示

Ruby Threadについて

##Threadとは?

メインのプログラムを読み込む作業と並列して実行されるrubyのプログラムのことです。
実行したいプログラムを分担するようなイメージですね。

その並行して実行させているプログラミングのことを並行プログラミングといいます。

##Threadの種類と、それの作り方
Threadには、プログラムが開始されたときに実行されるmainThreadや、現在実行されているcurrentThreadなどがあります。

実際にそのコードを打ってみましょう

“`
p Thread.main
=> #

p Thread.current
=> #
“`
自分の実行環境では、スレッドを作ってないため参考にならないかもしれませんが、違う数字が返ってくることもあります。

では、実際にあらたなスレッドを作ってみましょう。
スレッドの作り方はnew, start, forkを使って、その後ろにブロックをつけてあげることで生成することができます。

“`
Th

元記事を表示

【Ruby】クラスの継承とモジュールのmixinについて

# はじめに
クラスの継承とモジュールのmixinについてまとめてみました。

# クラスの継承
飲み物の種類を管理するシステムがあるとします。
お酒には「名前」「価格」「アルコール度数」という属性を、コーヒーには「名前」「価格」「サイズ」という属性を持たせます。
しかし、お酒とコーヒーでは「名前」「価格」という属性が共通しています。

“`ruby
class Osake
def initialize(name, price, alcohol)
@name = name
@price = price
@alcohol = alcohol
end
end
osake = Osake.new(‘beer’, 350, ‘5%’)
osake.name #=> beer

class Coffee
def initialize(name, price, size)
@name = name
@price = price
@size = size
end
end
coffee = Coffee.new(‘hot_coffee’

元記事を表示

sortメソッドと<=>の解説

##sortメソッド
sortとは、日本語で「並び替える」という意味です。つまり、sortメソッドとは、ある一定の基準で並び替えるメソッドです。
実際に具体例を見てみましょう

“`
ary = [4, 2, 9, 8, 3, 16, 10]
p ary.sort
=> [2, 3, 4, 8, 9, 10, 16]
“`
sortメソッドは、デフォルトで昇順に並び替えるメソッドです。上記の例では、配列の中身が昇順で並び変わっています。

降順で並び替えるには、2つの方法があります。
➀reverseメソッドを使う
➁<=>演算子を使う
順に説明していきましょう

##➀reverseメソッド
reverseとは「反転する」という意味です。つまり、reverseメソッドは、配列やハッシュなどの値を反転させるメソッドなんです。
実際にコードを書いてみると以下のようになります。

“`
ary = [4, 2, 9, 8, 3, 16, 10]
p ary.sort.reverse
=> [16, 10, 9, 8, 4, 3, 2]
“`
このように書けます。個人的にはメソッドを

元記事を表示

Ruby Hanamiでguard-rspecを使うときのGuardfileの参考例

これで良さそう

“`ruby
directories(%w[apps lib config spec].select { |d| Dir.exist?(d) ? d : UI.warning(“Directory #{d} does not exist”) })

guard :rspec, cmd: ‘bundle exec rspec -c -fd’ do
require ‘guard/rspec/dsl’
dsl = Guard::RSpec::Dsl.new(self)

# RSpec files
rspec = dsl.rspec
watch(rspec.spec_helper) { rspec.spec_dir }
watch(rspec.spec_support) { rspec.spec_dir }
watch(rspec.spec_files)

# Hanami files
watch(%r{^lib/(.+)\.rb$}) { |m| “spec/#{m[1]}_spec.rb” }
watch(%r{^apps/

元記事を表示

Ruby on Rails チュートリアル第2章をやってみて 

#Toyアプリケーション

■第2章
大量の機能を自動的に生成するscaffoldジェネレータというスクリプトを使ってアプリケーションを作成する。それを元に、RailsプログラミングとWebプログラミングの概要を学んでいくそう。

## 2.1 アプリケーションの計画
まず、Toyアプリケーションをどのようなものにするか計画立てをする。

Railsのバージョン指定をして、アプリケーションの骨組み作成から始める。

“`
$ cd ~/environment
$ rails _5.1.6_ new toy_app
$ cd toy_app/
“`

その後はGemfileの中身を書き換えて、本番用のgemを除いたローカルgemをインストールする。

“`
$ bundle install –without production
“`

IDEでのRailsのバージョンと、Gemfileでのバージョンが違っていたせいでうまくできなかったです。自分でエラーが解決できるとなんか嬉しいですね。

最後に、GitでこのToyアプリケーションをバージョン管理下に置きます。

“`

元記事を表示

【Serializer】ActiveRecordを継承していないモデルのJSONレスポンスを整形したい

###返したいレスポンス

**本のタグ一覧API**

“`json
{
“book_tags”: [
{
“id”: 1,
“name”: “芥川賞受賞”
},
{
“id”: 2,
“name”: “ベストセラー”
},
{
“id”: 3,
“name”: “映画化決定”
}
]
}
“`

ActiveRecordを継承していないBookTagモデルのJSONは整形しないとこうなる。

“`json
{
{
“id”: 1,
“name”: “芥川賞受賞”
},
{
“id”: 2,
“name”: “ベストセラー”
},
{
“id”: 3,
“name”: “映画化決定”
}
}
“`

###Serializerを使わずにコントローラーでJSONを整形

“`ruby
class BookTagsController < Api::ApplicationCon

元記事を表示

電話帳作成問題を解いてみた

# はじめに

[Ruby初心者向けのプログラミング問題を集めてみた](https://blog.jnito.com/entry/2019/05/03/121235)から、今回は電話帳作成問題を解いてみました。
自分が書いたソースコードと、先輩にいただいた回答例を紹介していきます。

以下の`IN`のような名前の配列を渡すと、`OUT`のように50音の音別にグループ分けされた配列が返るようにします。

– IN: `[‘キシモト’, ‘イトウ’, ‘ババ’, ‘カネダ’, ‘ワダ’, ‘ハマダ’]`
– OUT: `[ [‘ア’, [‘イトウ’]], [‘カ’, [‘カネダ’, ‘キシモト’]], [‘ハ’, [‘ハマダ’, ‘ババ’]], [‘ワ’, [‘ワダ’]] ]`

## 要求仕様

– カタカナ文字列の配列を渡すと、ア段の音別にグループ分けした配列を返すプログラムを作成すること
– 各要素は 50 音順にソートもすること

# 自分が書いたソースコード

“`ruby
class NameIndex
KANA_GROUPS = [
(‘ア’..’オ’).to

元記事を表示

【RSpec】インスタンス変数よりletを使う理由

そういえばRSpecではインスタンス変数使ってるのほとんど見かけたことないなと思ったことがきっかけで調べた。
その中でももっともらしいなと感じた理由のみ抜粋。

##インスタンス変数よりletを使う理由
(詳しいことは参考記事に)

– typoにすぐ気づける

letはtypoした場合“`undefined local variable or method“`のエラーがでる。
インスタンス変数の場合“`nil“`と評価されるため、インスタンス変数をtypoしたことにすぐには気づけない可能性がある。

####ちなみに
**let!** は即時にデータ作成される。
**let** は呼ばれて初めてデータ作成される。(遅延評価)
テストによって意図的に**let**を使って、呼ばれるまでデータ作成を行わない遅延評価を使うほうがいい場合もある。
「**let!**と**let**は使い分けずに、**let!**のみを使用したほうがよい」みたいな意見も見たことがあるけど、
脳死せずにそのときは何がベストなのかを考えて使い分けたい。

##参考

https://qiita.com

元記事を表示

インストール済みgemの特定ファイルの絶対パス確認方法

例: vendor/bundleをパスとしてbundle installしたrailtiesの特定ファイルのパスを確認したい

“`
$ bundle exec gem contents railties | grep rails/commands.rb
/home/yu_uchida/my_app/vendor/bundle/ruby/2.6.0/gems/railties-5.2.4.3/lib/rails/commands.rb
“`

 
 
 
comannds.rbの中身を見たいときは

“`
$ cat `bundle exec gem contents railties | grep rails/commands.rb`
# frozen_string_literal: true

require “rails/command”

aliases = {
“g” => “generate”,
“d” => “destroy”,
“c” => “console”,
“s” => “server”,
“db” => “dbcon

元記事を表示

【Rails】過去一週間でいいねされた数を多い順でソートする

#初めに
プログラミング初学者2ヶ月目です。
今回が初投稿となります。
自身の忘備録として記事を更新していこうと思いますので、もし間違いなどありましたらご指摘頂けると幸いです。

#アソシエーション
“`ruby:user.rb
has_many :books, dependent: :destroy
has_many :favorites, dependent: :destroy
“`

“`ruby:book.rb
belongs_to :user
has_many :favorites, dependent: :destroy
has_many :favorited_users, through: :favorites, source: :user
“`

“`ruby:favorite.rb
belongs_to :user
belongs_to :book
“`
userモデル,bookモデル,favoriteモデルのアソシエーションが完成しました。
has_many :favorited_users, through: :favorites, source: :

元記事を表示

Carrierwaveでヘッダー指定のURLから画像を取得して保存する

# 概要
Carrierwaveを使用して外部サイトもしくはS3などから画像をダウンロードして保存する。
その際にヘッダーを指定する(今回はRefererのみ)

# 試したけどうまくいかなかったパターン
## open-uriでopenした画像を保存する
“`ruby
image_url = URI.parse(uri) # uriを直接openするとセキュリティ的に問題があるためURI.parseする
file = image_url.open(“Referer” => “https://…”)
user.avater = file
“`
値が入らず断念。tmpファイルに書き出してから行えばうまくいけるかも。

# 上手く行ったパターン
## carrierwaveのremote_#{column}_request_header=(header)とremote_#{column}_url=(url)を使用する
carrierwaveのソースを読むと以下のようなメソッドが定義されているので利用する
columnの部分はモデルの`mount_uploader`で指定したカラム

元記事を表示

先週の振り返り2022/1/30 〜 2/4 (言語化のための記録)

#行ったこと
・Railsでログインユーザーidをデータベースに保存
・BootStrap5の導入のサインアップ画面の調整

#躓いた点
・サーバー側、event_controlle.rbの create でuser_idを保存したいが、CSRFトークンチェックでエラーになる。

#どのように解決したか
devise_token_authを使いトークン認証を通すことで解決できるが、
今回はskip_before_actionをコントローラーに記述し、エラーをのがれた。

#問題点
skip_before_actionだとセキュリティ上好ましくないので、改めて改修する。

元記事を表示

paizaレベルアップ問題を紐解く② アルファベット探し (paizaランク C 相当)

#はじめに
 現在paizaのBランク問題突破を目指して学習中です。今回は、アルファベット探しという問題に関して勉強になったので解法ををまとめておきます。
記述方法によってコードが大幅に削減されるという事を実感しました。

こちらの問題です↓↓
https://paiza.jp/works/mondai/prob60/alphabets_large_or_small_9

#問題文
 1行目の英大文字 X から、2行目の英大文字 Y の範囲に3行目のアルファベット C が含まれていれば”true”, そうでなければ”false”と出力してください。
X が Y よりもアルファベット順で後ろになる場合(X = ‘G’, Y = ‘F’のときなど)も”false”と出力してください。

入力例1
A
D
C

出力例1
true

問題を要約すると
「1行目と2行目の文字の間に、3行目の文字が含まれていれば”true”と出力させる」
という内容です。

#自分の解答
 まずは自分の回答をまとめます
回答の方針としては

“`
①まず3行の標準出力を変数に格納する(その際にordメソッド

元記事を表示

[py2rb] Pandas.DataFrame

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# pandas (Python)
“`python
import pandas as pd

val = [[1,2,3],[4,5,6],[7,8,9]]
df = pd.DataFrame.new(val, index=[0,2,4], colums=[‘d’,’e’,’f’])

print(df)
print(df.loc[2])
print(df.iloc[2])
print(df[‘e’])
“`
https://www.shoeisha.co.jp/book/detail/9784798160672

現場で使える!pandasデータ前処理入門 機械学習・データサイエンスで役立つ前処理手法 – 148p
# どうすRuby
“`ruby
require ‘pandas’

val = [[1,2,3],[4,5,6],[7,8,9]]
df = Pandas.DataFrame.new(val, index=[0,2,4], colums=[‘d’,’e’,’f’])

元記事を表示

sprintfフォーマットの解説

##そもそもフォーマットとは?
フォーマットとは書式のことです。つまり、文字列や数値をどんな形式で表示させるかというのをきめるんです。
具体例を見ていきましょう

“`
n = 10
sprintf(‘%f’, n)
=> “10.000000”
“`
指示子に、%fをいれると、浮動小数点数(float)を出力します。他にも指示子があるので、[こちらの記事](https://k-koh.hatenablog.com/entry/2019/12/16/105428)を参考にしてみてください

##実際に問題を解いてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/15264d1a-91d7-e9ec-90bf-15fd1cd88349.png)

問題で出されているコードでは、% 5とあります。これは、指示子ではないので、% 5は無視されます。
そのため、表示されるのは、Helloと表示されるため、選択肢➁が正解です。

###選択肢➂
これは先ほどの説明から不

元記事を表示

Ruby on Rails チュートリアル第1章をやってみて 

#自己紹介
はじめまして。

  
現在情報系の大学2年生で、とある会社で長期インターンをさせてもらえることになりました。プログラミングに関しては、CやPythonなどの基本を触ったことがある程度で、自分で何かを作るなどは特にやったことがないです。
      
  
一応、大学の授業でCSをやったり、去年応用情報を受けたりはしたので(不合格)、簡単な知識はあります。将来の目標としては、ドイツの大学院を出て、ドイツで働けたらなあとは思っております。

今回はインターン先の方から、「これやっとけば、だいぶいい感じだよ!」と言われたので、Ruby on railsのチュートリアルをやってみたいと思います。

■第1章
Railsチュートリアルの流れとしては、実際にWebアプリケーションを開発する流れのよう。章を追っていくほど、機能を増やした物を作れるそうだ。面白そう。

  
RubyやRailsさらに必要なツールをすべてインストールするには、ベテランであっても苦労するそう。たしかに、自分で何かインストールする時、サイトによりけりで結構困るイメージ。
  
##実践していく
Rails

元記事を表示

Kernel#loadは何をしているのか

# loadの使い所ってどこなの?

いろいろあって気づいたら年が明けてしまいましたが、Ruby3.1出ています。
関連記事でもいろいろと紹介されている通り、irbやデバッガ周り、ハッシュの省略記法などが入ってますね!

遅ればせながら[プロと読み解く Ruby3.1 NEWS](https://techlife.cookpad.com/entry/2021/12/25/220002)を見ている時に、ふとこの仕様が目に止まりました。

> Kernel#loadの第二引数で任意のモジュールを指定できるようになった
>
> Kernel#load now accepts a module as the second argument, and will load the file using the given module as the top-level module. [Feature #6210]

へえ、このオプション、なぜloadだけに入ってrequireには入らないのだろう?
そもそもどういうユースケースのために作られた機能なの?

そんな疑問をかかえながら、動作を確認し

元記事を表示

OTHERカテゴリの最新記事