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

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

SQL 入門

## SQLとは?
Structured Query Langageの略称。
Controller ⇄ DB 間 バックグラウンドで実行されているプログラミング言語です。
Railsでは、ActiveRecordがSQLに翻訳・変換しています。

## 概要
本投稿は、リレーショナルデータベースの事を説明しているので、あしからず。
SQLは主にデータベースの作成・編集・削除を行っています。Railsのコマンドを打てば自動生成
される為、影の薄いSQLにスポットライトをあてたいと思います。

SQLは2つの機能を持っています。
   
 **DDL(Data Definition Langage) ‥ データベースを定義する機能**
 **DML(Data Manipulation Langage) ‥ データベースを操作する機能**

上記の機能にできる役割がそれぞれ割り当てられています。

DDL
├ - CREATE(DB・テーブルを作成する)
├ - ALTER(DB・テーブルを更新する)
└ - DROP(DB・テーブル

元記事を表示

RubyMine + Docker でデバッガーが使えなくなった時に行なったこと

# 状況

RubyMine + Docker でデバッグモードを起動しようとしたら
「Cannot start debugger. Gem ‘ruby-ide-debug’ isn’t installed」と表示される。

# 環境

RubyMine 2019.3.3
Docker desktop 2.2.0.3
macOS Mojave 10.14.6

Ruby 2.6.3
Rails 5.2.3
bundler 2.0.1

ここではDocker環境やRubyMineのリモートデバッグの環境構築方法は述べない。
(リクエストがあれば書こうかな)

# 原因

RubyMineのどこかのバージョンから ruby-debug-ide のバージョン0.7.0以上でないと動作しなくなった模様。

Gemfileでruby-debug-ideのバージョンを指定しないと0.6.1がインストールされる。

# 簡易な対応

基本的にはruby-debug-ideのバージョン0.7.0以上にするだけで良いはず。

### Gemfile修正

“`ruby:Gemfile
gem ‘

元記事を表示

rails generateで自動生成されるファイルの設定

## この記事は
`rails generate …`は必要な関連ファイルを自動生成してくれる便利なコマンドですが、「このファイルは不要だな」というものがあった場合、生成する度に削除していては手間がかかります。

そこで、自動生成するファイルを設定する(不要なファイルは生成しない)方法について書いています。

参考までに環境はこちら。

– Ruby 2.5.7
– Rails 5.2.3

## generateコマンドで自動生成されるファイル

まず、どのコマンドでどのファイルが自動生成されるかを次の一覧にまとめています。

| コマンド名 | コントローラ | ビュー | モデル | マイグレーション | アセット | ルート | テスト | ヘルパー |
|:–|:–|:–|:–|:–|:–|:–|:–|:–|
| scaffold | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| scaffold_controller | ○ | ○ | × | × | × | × | ○ | ○ |
| controller | ○ | ○ |

元記事を表示

【Rails】CarrierWaveとRMagickでいい感じにサムネイルをつくる

#はじめに
CarrierWaveとRMagickで画像を指定したサイズでいい感じ(中心をくり抜く)に
トリミングしてサムネイルにするやり方についての記事です。
参考となるサイトは複数ありましたが、初学者である自分はその内容の解釈に苦労し、
かなり時間を使ってしまいました。
(今回参考とさせていただいたサイトは記事の最後にまとめております)
僕と同じ初学者の方の参考になりましたら幸いです。

#バージョン
Ruby 2.7.0
Rails 6.0.2.1
carrierwave 2.1.0
rmagick 4.0.0

#やり方その1 メソッドを作成するパターン
ちなみにやり方その2の方が簡単です。
自分はまずこちらのやり方にいきついたので、一応残しておきます。

アップローダーに下記のとおり記載。

“`ruby:image_uploader.rb
def create_thumb(width, height)
manipulate! do |img|
narrow = img.columns > img.rows ? img.rows : img.col

元記事を表示

Knock gemを用いてJWTで2種類のユーザーを認証する方法

RailsのAPIでJWTを使って単一のuserの認証システムを作っていましたが、途中でuser -> workerとなり、新たにrecruiterというのが出てくることになりました。
JWTの認証にはKnockというgemを使っていましたが、単一のuserに対して認証することが前提に作られていたので、少しカスタマイズします。

https://github.com/nsarno/knock

## modelの変更点

新たに出てきたrecruiterに関しても公式の手順に従ってtoken controllerなどを作成しておきます。
公式ページにも載っているように、カスタマイズするにはこの2つのmethodをいじればいいです。

まずKnockが生成するJWTの形を変更します。
defaultではsubというkeyにidが入っていますが、さらにclassを追加してあげることで、JWTを持っているのがworkerなのかrecruiterなのかという判別ができるようになります。

“`ruby

class User < ActiveRecord::Base def to_tok

元記事を表示

ImpressionistでPVランキング機能を作った時のメモ

# 概要
インプレッション(ブラウザに表示を要求する)を記録してくれるGem「Impressionist」を利用し、
ip_addressでビュー(インプレッションの数)をカウント、
ビューが多い順でランキング表示する機能を作成した際のメモ

※MVCをある程度理解したぐらいの初心者ですので、
 間違いなどあったらご指摘いただければ幸いです…。

# 環境

– Ruby 2.5.3p105 revision 65156
– Rails 5.2.2
– Gem : [Impressionist v1.6.1](https://github.com/charlotte-ruby/impressionist)

# Impressionのインストール

まずは、impressionistのGitHubで説明されている通り、
railsアプリにGemをインストールする。

“`cmd:Gemfile
gem ‘impressionist’
“`
“`cmd:ターミナル
$ bundle install
“`

###マイグレーションファイルのジェネレート
“`cmd:ターミナル
$

元記事を表示

Ruby FizzBuzz

IT未経験のスクール生が学んだことをアウトプットします:sunglasses:

FizzBuzzは非常に有名なプログラミングの問題です。
プログラミング初心者の方は特に覚えておきたい問題です。

#FizzBuzz問題

1〜100までの数字をターミナルに出力してください。ただし、「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzz、両方の倍数である「15の倍数」のときはFizzBuzzと出力してください。

####1から100までの数字を出力させる

1〜100まで出力させるからといって以下のように順番にputsで出力しようとしては効率が悪すぎます。

良くない例

“`saple.rb
def fizz_buzz

puts 1
puts 2
puts 3
(中略)
puts 99
puts 100
“`
一定の処理を繰り返す時には***while***文を使います。

##while文

while文は繰り返し処理を行う文法の1つです。

“`sample.rb
while 条件式 d

元記事を表示

Ovtoにミドルウェア機能を追加しました

先日[Ovto](https://qiita.com/tags/ovto)の新バージョン0.6.0をリリースしました。本稿では0.6の目玉機能「Ovto::Middleware」について解説します。

## Ovto::Middlwareとは

昨年のアドカレで[書いた](https://qiita.com/yhara/items/01d0b4938d7b86d320d9)ように、これまでのOvtoはstateとactionの名前空間が1つしかなく、ある機能を複数のアプリ間で使いまわそうとしたときに取り回しがあまり良くありませんでした。

Ovto::Middlewareはこれを解決するためのもので、あるまとまったState, Actions, Componentの組を「ミドルウェア」として切り出すことができます。

## ミドルウェア

– 各ミドルウェアは名前を持ちます。名前に使える文字はRubyのメソッド名と同じです(つまりハイフン等は不可)。
– 各ミドルウェアはアプリと同様、State, Actions, Componentを持ちます。ただし名前空間はミドルウェアごとに固有な

元記事を表示

【Ruby】スレッドID(tid)を表示する

## メモ

### スレッドIDを取得するシステムコール
スレッドIDを取得するシステムコールがある(gettid)。
で、これはシステムコール番号186(64bitの場合)。

Man page of GETTID https://linuxjm.osdn.jp/html/LDP_man-pages/man2/gettid.2.html

Syscall Number for x86-64 linux (A) https://www.mztn.org/lxasm64/x86_x64_table.html

### システムコールを実行するRubyのメソッド
で、Rubyにはシステムコールを実行するメソッドがある( `Kernel#syscall` )ので、これで上記のシステムコール番号を指定する。

Kernel.#syscall (Ruby 2.7.0 リファレンスマニュアル) https://docs.ruby-lang.org/ja/latest/method/Kernel/m/syscall.html

## サンプル

“`ruby:irb
puts syscall(

元記事を表示

【条件指定】RubyでDBから特定のidかつ最新のデータを取得する

1.特定のidを持つ投稿を指定

“`
where(location_id: 1)
“`
2.最新のデータを持つ投稿を指定

“`
order(updated_at: :desc).limit(1)
“`

3.つなぎ合わせる(特定のIDかつ最新)

“`
@posts = Post.where(location_id: 1).order(updated_at: :desc).limit(1)
“`
完了

元記事を表示

画像内に配列があるとき、どうやってeach文を書いたらいいの?

## きっかけ
carrierwaveを使い複数の画像表示をできるようにしました。
詳細ページへもDBからデータを取ってくるためにif文を使用し表示もできていたのですが
メンターから指示のあったif文での書き直しが全てエラーになり、だったら
eachに書き直せとの切り返しがあったため、泣き泣き変更することとなりました。
もしも、そんな変更を余儀なくされ、必要とされる方がおりましたら、
少しでもこちらの記事が参考になればと思います。

## 最初の記述

“`ruby:haml
= image_tag “#{@item.images[0].src}”
“`
こんな感じで画像表示されておりました。
以下がif文

“`ruby:haml
.box-photo__thumbnail
-if @item.images[1].present?
%div.brand-item
= image_tag “#{@item.images[1].src}”, alt: ‘brand-item’
– else

元記事を表示

寿命を予測してカウントダウンするだけのクソアプリ作ったwww

# 0.目的
大目標はRuby on Railsの勉強。
一応チュートリアルを一周したのですが、やっぱり自分で何か作ってみないと畳水練です。
なので、何でもいいからWebアプリを一個でっち上げる事を小目標にしました。
# 1.企画
**オーッ! ノーッ**
**俺の好きな言葉は一番が「怠慢」で二番目が「先延ばし」なんだぜーっ**(画像略)
筆者は絵に描いたようなダメ人間。締め切りが迫ってこないと1ミリたりとも動けません。
そこで、寿命という絶対に逃れられない締め切りを活用するアプリを構想しました。
**あんたアホか! 残りの人生で今この時が常に一番若いねんでっ!**(画像略)
と実感させてくれるWebアプリとして「余命が一秒ずつ減っていくのを表示するアプリ」を計画します。

「Railsを勉強するという大目標に対して、この企画は選択ミスだったんじゃないか?」と気付くのはまだ先の話。
# 2.使用技術
Ruby:Ruby-Gtkでデスクトップアプリを作ろうとして挫折した経験あり。
Rails/HTML/CSS/JavaScript:Railsチュートリアルを一周しただけ。

Rubyは半

元記事を表示

【Ruby】ハッシュ

#Hash
オブジェクトが1つである配列に対して、オブジェクトが「キー」と「バリュー」の2つであることが特徴。

“`rb
fruits = {“apple”: “100円”, “orange”: “80円”, “melon”: “500”}
p fruits

【実行結果】
{:apple=>”100円”, :orange=>”80円”, :melon=>”500″}
“`
上記のコードではapple,orengeが「キー(key)」、100円、80円が「バリュー(value)」にあたる。
ハッシュの利点としては`apple=>”100円”`の様に各要素に意味やつながりをつけることができる。

##Hashの基本機能

###Hashの要素を取得する

“`rb
hash = {ruby:”rails”,python:”Django”,php:”cakePHP”}
p hash[:ruby]

【実行結果】
“rails”
“`

###fetchメソッドでバリューを取り出す

“`rb
hash = {ruby:”rails”,python:”Django”,php:”c

元記事を表示

【Ruby】シンボル

#シンボル
コロン記号「:」を文字列に前置して定義したもの。

“`rb
sym = :symbol #シンボル
“`

###後置コロン
シンボルをハッシュキーとして使用する際や、キーワード引数を使用する場合に後置する。

###オブジェクトの1つ
シンボルは文字列とは別物。
メソッド等の名前を識別するためにラベルをオブジェクト化したものになる。

##文字列との違い

###シンボルは値をもたない
シンボルは値をもたないため、文字列そのもののデータを必要としない場合にシンボルが使用される。

###データに特定の意味を持たせる
文字列とはRuby内部での動きも違う。

文字列では宣言されるたびに文字列の領域が生成されるのに対して、
シンボルは1度生成されるとポインタとなり、複数回使用しても同じ領域で使用される。

以下、サンプルコード例)

■文字列

“`rb
str1 = “samurai”
str2 = “samurai”
p str1.object_id
p str2.object_id
p str1.equal?(str2) #同じオブジェクトならtrue、別

元記事を表示

EC2(Amazon Linux2)へRubyのインストールするよ2020

ServerSpecを使用するためにEC2インスタンスへRubyをインストールする必要があったのですが、思いの外てこずったので手順をまとめてみました。(主に備忘録として。)
引っ掛かりなく、サクッとインストールできると思います!

## サーバー環境
– EC2インスタンス
– Amazon Linux2
– t2.micro

## 手順
EC2が起動したらSSH接続します

### rbenvのインストール
rbenvはRubyのバージョン管理ツール

1 ひとまず更新

“`
$ sudo yum update -y
“`
2 gitのインストール

“`
$ sudo yum install git -y
“`
3 rbenvをリポジトリからクローン

“`
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
“`

4 クローンしてきたらrbenvのPATHを通す

“`
$ echo ‘export PATH=”$HOME/.rbenv/bin:$PATH”‘ >> ~/.bash_pro

元記事を表示

gemspecのadd_development_dependencyではなく、Gemfileを使う?

久しぶりに、`bundle gem` で gem を作ったら、rake や rspec が、gemname.gemspec ではなく、Gemfile に記載されるようになっていたので、調べてみました。

調べた結果、Gemfile のほうが柔軟性があり、実際のユースケースでも gemspec の `add_development_dependency` だけでは対応できないことがある、そのため Bundler では Gemfile の使用を奨励するために修正した、ということのようです。

なお、この記事は、「こういう理由でこうした方が良い」というものではないです。

# 経緯

久しぶりに `bundle gem` コマンドで gem を作りました。

“`sh
bundle gem gemname –test=rspec
“`

いつも通り、自動生成された gemname.gemspec を TODO 部分を置き換えるために開いたら、`add_development_dependency` がありませんでした。

“`sh
$ grep -e “dependency” gem

元記事を表示

users_controllerでbinding.pryを使用した時になぜユーザーidが取得できているのか

# users_controllerでbinding.pryを使用した時

“`users_controller.rb
def show
binding.pry
user = User.find(params[:id])
@nickname = user.nickname
@tweets = user.tweets.page(params[:page]).per(5).order(“created_at DESC”)

“`

【質問】
binding.pryを入力し、ターミナルにparamsを入力するとしっかりユーザーidが取れて来ている。
user = User.find(params[:id])より前にbinding.pryを使用しているのに
なぜユーザーidが取れているの?という質問に対して即答できませんでした。。。

【答え】
前提としてログインしている時点でユーザーidの情報は持っているし、
マイページに飛ぶ際にリクエストで、current_user.idを記載しURLと一緒に飛ばしている。

“`application.html

元記事を表示

ZoomAPIを使ってミーティングを作成しよう 〜Slackに送るまで〜

# コロナの影響でZoomを使うことが増えました
最近猛威を奮っているコロナの影響で弊社でもリモートワークが導入されました。

現在は無料アカウントを使っているのですが、40分ごとにミーティングが切れる ⇨ 手動で立て直す、作業が非常にだるいです。

そこで、実行するとZoomURLを作成し、Slackに投げよう!という話になりました(課金しろ)

ZoomAPIの備忘録も兼ねて記事にまとめます。

# この記事で出来ること

・ rubyファイルを実行するとZoomのミーティングが作成され、URLが発行される
・ Slackと連携し、SlackのBotからミーティングURLをチャンネルに送信する

# ZoomAPIのミーティングを作るドキュメント
ここにZoomAPI(ミーティングを作る用)のドキュメントがまとまっています。

https://marketplace.zoom.us/docs/api-reference/webhook-reference/meeting-events/meeting-created

# ミーティングの作成は1日100リクエスト(POST)まで

元記事を表示

Ruby on Rails チュートリアルを一休み。【プロになるためのWeb技術入門】で知識の補完をしてみる。

【プロになるためのWeb技術入門】を読み進める。

#はじめに
・Webアプリケーションシステムは複雑化しているため、習得に膨大な時間がかかる。
・一方で、日本のIT技術者は即戦力を求められるため、フレームワークの使い方をメインに学習させられる。
⇒Webアプリケーションシステムは複雑化しているが、日本のIT技術者はうわべだけの学習にとどまっているため、根本の仕組みを理解していない。
⇒世界規模のWebアプリケーションが日本から生まれない原因となっている。
⇒筆者は上記課題を解決するため、本書で第一線のエンジニアとして活躍するための基礎技術を教える。

#目次
LESSON0:プロローグ
LESSON1:Webアプリケーションとは何か
LESSON2:Webはどのように発展したか
LESSON3:HTTPを知る
LESSON4:CGIからWebアプリケーションへ
LESSON5:Webアプリケーションの構成要素
LESSON6:Webアプリケーションを効率よく開発するための仕組み
LESSON7:セキュリティを確保するための仕組み

#LESSON0
・インターネット上で利用できる「ネ

元記事を表示

【Application Error】Herokuでアプリをリリースしたらエラーが出た件 #1(備忘録)

# 【Application Error】Herokuでアプリをリリースしたらエラーが出た件(備忘録)

“`terminal:terminal
> git push heroku master
“`
を打ち、Deploye… doneと出るにも関わらず、
アプリのURLを叩いても、Application Errorとでる!
やってらんない!

上記のコマンドを打った際に、複数あるWaringの中に以下のようなことが記載

“`terminal:terminal
You have the `.bundle/config` file checked into your repository
It contains local state like the location of the installed bundle
as well as configured git local gems, and other settings that should
not be shared between multiple checkouts of a single repo. Ple

元記事を表示

OTHERカテゴリの最新記事