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

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

Rubyでの終了判定処理

paiza様の問題集の課題から記事にします。

>2 以上の整数N, Kが与えられます。
>「Nを 2 倍した数でNを更新する」という操作を何度か繰り返すことを考えます。
>このとき, ちょうどある回数 M で N の値は K 以上になります。この時点で操作の繰り返しを終>了することにします。ただし100回を超えることはできません。

Rubyで書いたコードです

“`Ruby
#標準入力
input_line = gets
#文字列を「 」で区切って配列に格納する
array1 = input_line.split(‘ ‘)
#与えられた数
n = array1[0].to_i
#超えてはいけない数
k = array1[1].to_i
#回数
s = 0
#最大計算できる回数
c = 100
#ループ処理
for i in 1..c
#NがK以上になったらループを抜ける
if n >= k then
break

元記事を表示

MySQL カラム エラー

# はじめに
deviseを用いてユーザー管理機能の実装中にエラーが発生しました。

# エラー内容
`migrateファイル`にてテーブル作成中。
↓以下のようにカラムの設定を実装した。
~~~ruby
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: “”
t.string :encrypted_password, null: false, default: “”
t.string :name, null: false, default: “”
t.text :profile, null: false, default: “”
t.text :occupation, null: false, default: “”
t.text :position,

元記事を表示

【Ruby】reduceメソッド(injectメソッド)の簡単なまとめ

使い所が掴めなかったので、簡単にreduceメソッドについてまとめます。
別名でinjectメソッドとしても使えますが、今回はreduceメソッドとして統一しておきます。

# reduceメソッドとは
たたみ込み演算を行うメソッドです。
初期値と最初の要素をブロックに渡して実行します。

# 使い方
先頭の要素と引数の値をブロック内で処理して、繰り返し処理することで結果を返します。
 “`ruby
p [2,3,4,5].reduce(0) { |sum, i| sum + i } #=> 14
“`
この場合では、sumに引数の`0`が入り、iに最初の要素`2`が入ります。
その後、sumに最初の処理した結果が入り、iには次の要素`3`が入ります。
これを繰り返すことで結果の`14`が出力されます。

“`
((((2) +3) +4) +5)
“`
というイメージです。

また、初期値が`0`である場合は省略が可能です。
“`ruby
p [2,3,4,5].reduce { |sum, i| sum + i } #=> 14
“`
さらに、シンボルと演算子で省略し

元記事を表示

Rails(Ruby)でPDFを作成、圧縮、S3にアップロード

# TL;DR

“`rb
# PDFをインラインで作成
require ‘wicked_pdf’
pdf = WickedPdf.new.pdf_from_string(
“Lorem ipsum ロレム・イプサム 呂礼無・維風沙夢” * 500,
return_file: true,
)

# Tempfileの作成&圧縮
require ‘tempfile’
require ‘zlib’

tf = Tempfile.open([‘foo’, ‘.pdf.gz’], binmode: true)
Zlib::GzipWriter.wrap(tf, Zlib::BEST_COMPRESSION) do |gz|
gz.print(pdf)
end

# AWS S3アップロード
require ‘aws-sdk’

client = Aws::S3::Client.new(
access_key_id: ENV[‘AWS_ACCESS_KEY_ID’],
secret_access_key: ENV[‘AWS_SECRET_KEY_ID’],
regi

元記事を表示

Rails学び まとめ

新しい環境で仕事を始めてみて、学生時代ぶりにRails, Ruby, MySQLを触ったので、学習メモとして雑多に残す。

– [Struct](https://qiita.com/k-penguin-sato/items/54189d5ed4e5f7463266)
– RubyにおけるStruct(構造体クラス)は簡易的なクラスのようなもの
– 利用ケース
– まとまったデータを扱いたいが、クラスを作るまでもない場合。
– クラス内で特定のデータのまとまりを表現する場合。
– 通常のクラスとの違い
– 継承、メンバの追加・削除ができない。
– 明示的にアクセスメソッドを定義しなくても、構造体クラス外でメンバの参照・更新が可能。
– scope
– データアクセスの際の条件式に名前をつけて、メソッドチェーンみたいな感じで繋げてかける。
“`ruby:scopeの定義例
class Blog < ApplicationRecord scope :published, -> { whe

元記事を表示

作曲サークル内に音楽配信サービスを作った

## はじめに
 本記事ではコサメガが作成した作曲サークル内音楽配信サービス「Kitchotify」について、作成動機、サービス概要などを説明します。ソースコードをGitHubで公開しています。

https://github.com/kosamega/Kitchotify_app

## 作成の動機
### サークルの状況
 私が所属している作曲サークルでは、2ヶ月に1回会員達がオリジナル曲を提出し、提出された曲を皆で聴き、提出された曲でアルバムを作ってデジタルリリースしています。またコロナ以降全ての活動が基本的にオンラインで行われています。
### 問題
 コロナ以降全体的にコミュニケーションが減っていたこともあり、会員がそれぞれの曲を1度聴いてそれで終わりという状況がありました。お互いの曲をじっくり聴いて感想・アドバイスを言い合うことや、軽く感想を言い合うことなどは、曲作りがうまくなるために、また会員同士の仲を深めるために重要なことなので解決したいと考えていました。
### 解決策
 提出された曲を聴きにくいことが原因であると考え、会員の作った曲が聴きやすくなるサービスを作りまし

元記事を表示

bitnamiのRedmine(5.0.4)で管理者ログインする方法

# はじめに
AWSのEC2でbitnami Redmineを構築しました。

ネットで調べると、ログイン画面でログインID/パスワードともに `admin` で管理者ユーザーとしてログインできると書かれていたが、これではログイン出来なかった(おそらく以前のversionの話)。

**Redminのversion 5.0.4** では以下の方法で管理者ログイン可能でした。

# 管理者ユーザーのcredential

まず、構築したRedmineのEC2へSSHする。
※通常のEC2であればユーザーを`ec2-user`でsshログイン可能であるが、ユーザーを`bitnami`にする必要がある。

sshログインした直後のカレントディレクトリの `bitnami_credentials` ファイルに
管理者ユーザーのユーザー名(ログインID)とパスワードが用意されています。

![スクリーンショット 2023-01-11 17.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251648/

元記事を表示

Ruby 入力のループ

1行ずつ10個のデータを入力し、出力するRubyプログラムを作りました。

“`Ruby
for i in 1..10 do
#標準入力
input = gets
#標準出力
puts input
end
“`

元記事を表示

Rubyで高速に任意のリファレンスゲノムの特定のポジションの配列を取得する

RやPythonであれば、さまざまな洗練された既存のライブラリの使い方について記載することになると思うけれども、Rubyでは既存のライブラリが多くないので、もっぱら自分でC言語のライブラリのバインディングを作成し、それを使う感じになる。

## 2bitファイルを使う場合

UCSCのサイトから[.2bitファイル形式](http://genome.ucsc.edu/FAQ/FAQformat.html#format7)のゲノム配列を入手することができる。たとえば、
https://hgdownload.soe.ucsc.edu/goldenPath/hg38/bigZips/
から `hg38.2bit` をダウンロードすることができる。

bio-twobit というライブラリを作成したのでそれを使う。これはC言語のライブラリ [lib2bit](https://github.com/dpryan79/lib2bit) のバインディングであり高速に動作する。

https://github.com/ruby-on-bioc/bio-twobit

“`ruby
require ‘

元記事を表示

薄いコントローラ、分厚いコントローラとは何か

MVCモデルを用いて開発をしている際、「薄いコントローラ」や「分厚いコントローラ」という言葉をよく聞くかと思います。
薄いコントローラとはなんでしょうか?分厚いとどうなるのでしょうか?
コントローラの整理をキッチンの棚の整理に例えて説明していきます。

# コントローラってどうやって書いたらいいんだっけ?
Railsの生みの親であるDHHは下記のように言っています。

>コントローラが元々持っているRESTアクションやデフォルトの5つの機能にはないメソッドを付け加えたいと思ったら、いつだって新しいコントローラを作る。それだけでいいのです。

https://postd.cc/how-dhh-organizes-his-rails-controllers/

5つの機能って何?という方は、ぜひ調べてみてくださいね。
7つのアクションと言われていることの方が多いかもしれません。

https://qiita.com/morikuma709/items/5b21e9853c9d6ea70295

7つのアクションを用いたコントローラの作成方法について少しだけ解説すると、、、
ある機能を実

元記事を表示

seed_fuでYour seed constraints contained unknown columns: `id`.と言われたのはそのテーブルのプライマリキーがidではなかったから

Fusicの賀来という者です。

https://fusic.co.jp/

## 解決したい問題

ある日、Railsアプリでseed_fuというgemでseedを流したところ、怒られました。

“`terminal
rails aborted!
ArgumentError: Your seed constraints contained unknown columns: `id`. Valid columns are: `user_id`, `group_id`, `group_uid`, `created_at`, `updated_at`.
“`

gemはこちら。

https://github.com/mbleigh/seed-fu

バージョンの確認です。
古くてちょいアレですが…。

“`
ruby:2.3.4
Rails 5.1.7
“`

seedファイルはこうなっています。

“`ruby
UserRegistration.seed do |ur|
ur.user_id = user.id
ur.group_id = group.id
end

元記事を表示

RubyでPythonみたいな文字列スライスがしたい

Pythonでは文字列`s`に対し`s[a:b:n]`とすると`s`の`a`番目から`b`番目の1個手前まで`n`個飛ばしで文字が取り出される。

一方Rubyの文字列クラスにも[`slice`]()メソッドがあり、
“`rb
‘abcdefg’.slice(1…5)
“`
または
“`rb
‘abcdefg'[1…5]
“`
はPythonの
“`py
‘abcdefg'[1:5]
“`
と同様であるが”n個飛ばし”はできない。

## 考えた強引なやり方
– まず`a`番目から`b`番目の1個手前までの部分文字列を取り出す
– 部分文字列から`インデックス%n==0`となる文字を取り出して繋げる(mapとjoinを使う)

例えばPythonでの`’abcdefg'[1:5:3]`はRubyでは以下のように書ける。
“`rb
‘abcdefg'[1…5].each_char.with_index.map { |c, idx| c if idx%3==0 }.join
“`
`idx%3==0`は`(idx%3).zero?`でも可。また、2つ飛ばしなら`

元記事を表示

【Ruby】で配列に複数入ったオブジェクトを一つだけ消そうとしたら失敗した

こんにちは
Rubyでアプリを作っていたんですが
終盤になってデバッグに悩まされたことをまとめておきました。
もしも同じエラーで悩んでいる方がいて、参考になれば幸いです。

## 事の発端

「あれ、さっきまでエラーじゃなかったのに」

知り合いとバグを探していたところ、エラーが解決したのにエラーが同じところで再発したのが事の発端でした。

目的は **配列の中から指定した条件で一つのオブジェクトを削除する** でした。

### 配列.select!で行うとclassが異なる

目的はシンプルなものなので、オブジェクトが複数格納された配列の中から条件に見合ったものを抜き出して、
プログラムが実行されると**一つだけ**削除する。
なので、配列の入ったものに対して破壊的メソッドを定義しようとこのときは`select!`を使用しました.

“`ruby: test_program.rb
@ary = [1,2,3,4,5]
@ary.select!{|n| n == 2}.shift
“`
シンプルに書き直すとこんな感じでしたが、エラーで撃沈します。
そもそもshiftはArry

元記事を表示

【Rails】画像アイコンを作ってみよう!【画像表示、加工】

## はじめに
どうも、春からエンジニア転職予定のkazuhiroです。
文系職からの転職であり、プログラミングは未経験ですが、
初学者目線で疑問に思った点などを、アウトプットしていきたいと思います。
※間違いや改善点などありましたらコメントいただければ幸いです。

## 本題
転職先のBossより、このような練習問題が出された。![スクリーンショット 2023-01-04 1.18.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/585419cf-e369-c754-7f01-065d661ba97a.png)

やってやんよ、と。
ユーザー一覧画面については、以前掲示板一覧画面を作成していたため、
同様の手順で作成することができたが、画像の表示方法で引っかかってしまう。
![掲示板.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/c8c22586-d21a-7a7a-8830-8d0

元記事を表示

Rails devise パスワードリセット後のリダイレクト先の指定

# 何がしたい?
ログイン画面の「パスワードを忘れた方」よりパスワードをリセットした場合に特定のページへリダイレクトしたい。
(deviseのデフォルトの場合はログイン画面へ遷移します。)

# 何が難しかったのか
なんといってもdeviseは簡単にログイン回りの機能を全て実装できる代わりに何が起きているのかわからないブラックボックス状態じゃないですか?
少なくとも僕は完全に理解したとは言い難いです。
今回パスワードリセットのメールを送った後に遷移するページを指定したいだけなのに異常に難しかったので記事にしておきました。

# 結論
いいから教えろ!

## 1. routesに追加
“`ruby
devise_for :users, controllers: {
passwords: ‘users/passwords’,
}
“`

## 2. Users::PasswordsControllerを作成
Devise::PasswordsControllerの継承を忘れずに。

“`ruby
module Users
class PasswordsController

元記事を表示

【Ruby】Array.newを迂闊に使ってはいけないワケ…

(これに2時間気づかず時間を浪費した腹いせに、記事を書いています。)

# 配列内のオブジェクトを1つだけ変更したつもりが全部変わっている罠

“`ruby
nested_array = Array.new(2, [])
pp nested_array
# [[], []]
“`

なんてことはない、二重配列ですね。この1つ目の子ども配列に適当な値をpushしてみます。

“`ruby
nested_array = Array.new(2, [])
pp nested_array
nested_array[0].push(‘テキスト’)
pp nested_array
# [[], []]
# [[“テキスト”], [“テキスト”]]
“`

ちゃんと1つ目の子ども配列を指定したにも関わらず、両方の子ども配列に要素が追加されてしまいました。

### Array.newで複数作るオブジェクトは同じオブジェクトとして扱われる

“`ruby
nested_array = Array.new(2, [])
pp nested_array[0].object_id
pp nest

元記事を表示

RubyOnRailsでGoogleTextToSpeechを使う。

GoogleTextToSpeechに関する記事は、いくつかあるが、Rubyに絞ると良い記事がなく、比較的ハマったので、備忘録として、記録しておく。

## 結果として、こうなります。

“` Gemfile *.rb
gem ‘google-cloud-text_to_speech’, require: false
“`

“`*.rb
require “google/cloud/text_to_speech”

def self.generate_speech
# client生成
client = Google::Cloud::TextToSpeech.text_to_speech do |config|
# サービスクライアントを作成し、ダウンロードした秘密鍵を指定する。
config.credentials = “config/xxxxxxxx.json”
end
  # 設定値はこちら
speech = {
audio_config: {
audio_encoding: “M

元記事を表示

xcodebuild で躓いた時の解決方法(備忘録)

## 環境
Mac
Ventura

## やったこと
Xcode コマンドラインツールの version を確認しようとするが、以下の error が表示される。
“`
$ xcodebuild -version
xcode-select: error: tool ‘xcodebuild’ requires Xcode, but active developer directory ‘/Library/Developer/CommandLineTools’ is a command line tools instance
“`

Path がおかしいのかも?と思い、Path を確認。

“`
$ xcode-select -p
/Library/Developer/CommandLineTools
““

以下に変更する。
“`
$ sudo xcode-select -s /Applications/Xcode.app
“`

再度 version を確認

“`
$ xcodebuild -version
Xcode 14.2
Build version 14C

元記事を表示

Ruby 日付と曜日を出力する

今日の日付と曜日を出力するコードを作りましょう

“`ruby:出力例
現在は西暦2020年5月27日(今日の日付が入ります)
水曜日です(今日の曜日が入ります)
“`
ヒント
Time.newメソッドを使用しましょう

### Timeクラスとは
TimeクラスはRubyの標準ライブラリにある。時刻を表すクラス。

“`ruby:使用例
# 現在時刻
now = Time.new
puts now
“`

“`ruby:自分の解答
now = Time.new
week = [“日曜日”, “月曜日”, “火曜日”, “水曜日”, “木曜日”, “金曜日”, “土曜日”]
week[now.day]

puts “現在は西暦#{now.year}年#{now.month}月#{now.day}日”
puts “#{week[now.wday]}です”
“`
“`:ターミナル
現在は西暦2023年1月10日
火曜日です
“`

“`ruby:模範解答
now = Time.new
puts “現在は西暦#{now.year}年#{now.month}月#{n

元記事を表示

(備忘録)Java概要

# Java
* 私の住んでる地域では、Javaによる開発需要(求人)がとても高く、それに合わせてJava学習の必要性を感じた。
* Javaは、求人数でもJavaScriptと並ぶほど多く、今後開発者として学んでおく必要性が高い言語だと思う。(PAIZA基準)
* そのJavaの特徴を、Rubyと比較しながら、覚えていきたい。

# Ruby on Railsの特徴

* 短期間でプロダクトのリリースが可能
* 言語学習のコストが低い
* スタートアップでよく使われる(リリースが早い為)
※Ruby on Railsの開発者であるDHHは、Ruby on Railsに関して、”Javaの典型的なフレームワークより10倍以上の生産性がある”とアピールしてた。

# Javaの特徴

* アプリケーションの仕様変更を行いやすい
* セキュリティが強固である
* 長期間にわたる保守・運用がしやすい
* 実行速度が速い
* 大手企業の基幹システムなど大規模開発に適した言語

# Rubyと比べてJavaが難しいと言われる理由

## ①覚えるルールやコードの記述量が多い
* Railsは、ア

元記事を表示

OTHERカテゴリの最新記事