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

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

Seleniumでnavigator.webdriverの対策をする

# enable-automationとかuseAutomationExtensionは期待通りの動作しなかった

とある理由でスクレイピングしたいけど、`navigator.webdriver=true`なブラウザだとNGなサイトだった。
対応したい。できるらしいので。
参考:[navigator.webdriver=trueだとロボットだとバレる。その回避法はあるか?puppeteerなら出来そう
](https://cfautog.tokyo/2020/03/04/navigator-webdriver-delete/)
でもSelenium使っているしpuppeteer使ったことないし、どうにかできないものか。。

## 動かなかったときの設定

どうやらSeleniumでもできるらしい記事をいくつか見つけた。

参考1:https://stackoverflow.com/questions/53039551/selenium-webdriver-modifying-navigator-webdriver-flag-to-prevent-selenium-detec

参考2:

元記事を表示

ruby 定数 変数

小文字は変数

大文字は定数

元記事を表示

アプリのテストについて RSpec(単体テスト)

# RSpec
Rubyを元に作成されたテストに特化した言語です

#テストコードの基本
スクリーンショット 2020-06-30 22.09.20.png

## describe
1行目のdescribeは、直後のdo ~ endまでのテストのまとまりを作ります。describeの後に続く””の中にはそのまとまりの説明を書きます。

## itとexample
2行目のitはexampleと呼ばれる実際に動作するテストコードのまとまりを表します。itの後に続く””の中にはそのexampleの説明を書きます。

## エクスペクテーション
実際に評価される式のことです。it do ~ endの間に書きます。上記の式ではexpect(1 + 1).to eq 2の部分がエクスペクテーションです。

## expe

元記事を表示

【Rails】lightbox2を用いて画像拡大機能の実装

# 目標
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/dcff8276-d5e5-df0b-fafb-712e8fd860fc.gif)
# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[Slim導入](https://qiita.com/matsubishi5/items/b639ffddecc626856039)
・[投稿機能実装](https://qiita.com/matsubishi5/items/1a5aeab651b5822d1f2c)

# 実装

## 1.`application.html.slim`を編集

“`slim:application.html.slim
doctype html
html
head
title
| Book

元記事を表示

APIについて噛み砕く

## 近況報告
 **実務経験を積みたい!**

 これにつきます。ツイッターでテックの先輩のつぶやきをみても,独学と実務では圧倒的に差があることが伺えます。どのくらい差があるのかは日を追うごとに興味が増します。私の周りにwebエンジニアがいないため,現状を聞くとなるとやはり面接先のPM・CTOが多くなります。ただ,「実務って独学で得られる経験となにが違いますか」なんて質問落とされそうだから言えないよねw 私が考える限りでは,納品スピード,瞬時にメソッドなど使用するものを決める能力,ggr力なのかな。ただ,やはり現場で肩を並べて経験しないと実感はできないでしょう。

# 本日のお題  
**「API」**
 テックキャンプに参加していた時さっぱりわからずスルーしていた単語。ただ,就活をしていると多々現れる単語。「API」について噛み砕く

## API
[参考](https://wa3.i-3-i.info/word12428.html)
API・・・ Application Programing Interface

 アプリケーションのプログラミングの表面。。。直訳しても意味が分か

元記事を表示

【Ruby】Hash#has_key? がまた一歩、公式のdeprecatedに近づいた?

`Hash#has_key?` は、Matz さんから、

> “has_key” has already been deprecated by “key?”

と[宣告](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/43765)されて早8年、いろんな Style guide で、 `deprecated` だと指摘されています。例えば、

* [RuboCop](https://rubystyle.guide/#hash-key)
* [Airbnb](https://github.com/airbnb/ruby#deprecated-hash-methods)

しかし、公式には、`Hash#has_key?` は今なお、`Hash#include?` や `Hash#key?`、`Hash#member?` を抑えて、唯一サンプルコードで用いられているメソッドであり、全く `deprecated` さを感じさせない活躍ぶりです。

[日本語版](https://docs.ruby-lang.org/ja/

元記事を表示

MySQLの稼働が安定しない…Railsアプリが起動していない。

### 発生した背景
MySQLサービスがまたもやエラー。何回も発生すると、流石に時間の浪費に怯えてしまいます。以下エラー内容になります。

“`
Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’
“`

### 環境
| 項目 | 内容 |
|:—————–|:——————:|
| OS.Catalina | v10.15.4 |
| Ruby | v2.5.1 |
| Ruby On Rails | v5.2.4.3 |
| MySQL | v5.6 |

###

[Ruby] CSVファイルをYaml(Yml)に変換する方法

#### 手順

1、requireメソッドでRubyの標準ライブラリの[csv](https://docs.ruby-lang.org/ja/master/library/csv.html)と[yml](https://docs.ruby-lang.org/ja/master/library/yaml.html) を読み込む。

“`
require ‘csv’
require ‘yaml’
“`

2、`CSV.read(path_to_csv, :headers => true)`を実行すると、CSV::tableクラスのインスタンスが返ってくる。
`map`メソッドで要素(CSV::Rowクラスのインスタンス)を一つずつ取り出し、その要素を`to_hash`メソッドでハッシュ化する。mapメソッドの返り値は配列となるため、ハッシュを要素とした配列が作成される。今回`:header => true`オプションを付け加えたことでハッシュのkey名がCSVのカラム名になっているところがポイント。

“`
hash_arr = CSV.read(path_to_csv, :he

ブラウザが認識できる言語に変換する仕組み

##高級言語と低級言語

**・高級言語**
高級言語は、機械よりも人間が理解しやすいように設計されたプログラミング言語のことです。
また、「高級」とは優れた言語という意味ではなく、機種やOSなどに固有の要素を抽象度の高い記述が可能であることを表しており、アプリケーションソフトの開発などに用いられる言語の多くは高級言語に分類されるから「高級」という表現を用いています。

**・低級言語**
機械が認識しやすい言語は低級言語と呼ばれます。
「低級」とは劣った言語であることを意味するのではなく、ハードウェアに近いことを意味
することから「低級」という表現を用いています。

ファイルをブラウザに表示させるには、高級言語で開発したあとに、それを機械が認識
できる低級言語に翻訳する必要があり、その翻訳の事を**コンパイル**と呼びます。

##コンパイル
プログラミング言語を、動作する機械が理解できるように翻訳する作業のことです。
コンパイルは、**コンパイラ(機会にやさしいプログラミング言語のこと)**と呼ばれる
プログラムによって行われます。
もしコンパイラで認識できない言語があれば、あら

レコードの新規追加時に登録データにMAX+1のIDを付与する方法

Railsでレコードの新規追加をする際に、自動的に独自IDの付与をしたいケースがあると思います。
例えば、my_idフィールドの最大値+1を付与するなど。

部屋(room)の名前を登録したときに、独自id = my_id を付与するサンプルを書いてみました。

## 成功例

“`ruby
def assign
my_id = -1
room = Room.find_by(room: params[:room])
if !room.nil?
my_id = room.my_id
else
Room.connection.execute(
“INSERT INTO rooms (my_id, room, created_at, updated_at) SELECT COALESCE(max(my_id), 0)+1, ‘#{params[:room]}’, ‘#{Time.now}’, ‘#{Time.now}’ from rooms”
)
my_id = Room.find_by(r

【整理】render&redirect_toが、ごっちゃになってしまうあなたへ

#対象者
なんかredirect_toとかrenderとかそれぞれどんな違いあるんだっけ?使い方は?と、知ってるけど頭の中で整理できていない方

#前提知識
Railsのコントローラにおけるアクションでは、最終的にrenderされてビューを返す仕組みになっている。
つまり、**1アクションにつき、1render**が必ず起こる。

“`
def index
end
“`

これは、render ‘index’が発動していることと同じことである。

##エラー例
renderが2回処理されてしまう時

“`
def show
~~
if ~~
~~
render ‘index’
end
render ‘show’
end
“`

解決策としては、returnをしてあげる

“`
def show
~~
if ~~
~~
render ‘index’
return
end
render ‘show’
end
“`

#render
アクション内で、呼び出すビューを指

【Ruby+Nokogiri】でyahooニュースをスクレイピング→CSV保存

以前Pythonの**BeautifulSoup**を使ってスクレイピングをしたことがあったのですが、Rubyでも**Nokogiri**というライブラリで実現できるということで試してみました。

でまずは完成コード、完成品から

“`ruby:scraping.rb

require ‘nokogiri’
require ‘open-uri’
require “csv”

require “byebug”

url_base = “https://news.yahoo.co.jp/”

def get_categories(url)
html = open(url)
doc = Nokogiri::HTML.parse(html)
categories = doc.css(“.yjnHeader_sub_cat li a”)
categories.map do |category|
cat_name = category.text
cat = category[:href]
end
end

@cat_list = get_categories

Rubyスクレイピング-VPSでSeleniumをHeadlessに動かす。

#開発環境
ruby2.7.1
centos7

#手順

###①Gemを追加しよう
`gem install gem install selenium-webdriver`
###②GoogleChromeをインストール
インストールする
`yum install google-chrome-stable`
バージョン確認しておく
`google-chrome -version`
###③GoogleChromeをインストール
http://chromedriver.chromium.org/downloads からgoogle-chromeと同じバージョンのChromeDriverをダウンロードする

下記はGoogleChromeがバージョン83.0.4103.39のコマンド
`wget https://chromedriver.storage.googleapis.com/index.html?path=83.0.4103.39/`

展開
`unzip chromedriver_linux64.zip`
移動
`sudo mv chromedriver ~/usr/loc

消せないプロセスID(PID)の消去方法!(Vim、Viでの操作不能の対処)

**$ sudo visudoのコマンド入力できなくなり凄く困ったので解決方法を記載します!**

 何かの不具合で、`.ssh % `の状態もしくは`[ec2-user@ip-xx-x-x-xxx] $`から強制終了されるとターミナルでのコマンド入力ができなくなる時があります。

 私も、過去に似たような経験をしたことがあり、多分**プロセスID**が正常に切られなかったため、`ec2-user `にログインした際、`$ sudo visudo`が入力できないと予測しました。
**発生したエラーは下記です**

“`言語:エラー文
visudo: /etc/sudoers がビジー状態です。後で再試行してください
“`

 この問題を可決するのに凄く時間を費やしたので、プロセスID(PID)の**一般的な消去方法**と**プロセスID(PID)が無限に増殖する際の消去方法**について記載したいと思います。

# 1. 基本のプロセスID(PID)の消去方法!

**1. ターミナルでルートディレクトリーに移動する。または、`.ssh % `の状態もしくは`[ec2-user@ip

[RubyOnRails]テーブルデータを基にform_withにプルダウンを実装する方法

# 内容
form_withにプルダウン選択を導入しようと思い実装していく中で、何個かトライアンドエラーを繰り返した所があったので、備忘として残しておくもの。

# 環境
・Ruby 2.6.5
・Rails 6.0.3

# 前提の状況とやりたいこと

### 状況
飲食店の情報を登録するshopテーブルがある。
山手線の駅データをリストとして入れたstationテーブルがある。
二つのテーブルは多対多の関係にあり、中間テーブル(shop_stationテーブル)を介してアソシエーションを組んでいる。

### やりたいこと
以下の機能を実装したい。
**①shopデータ作成時に、最寄り駅をプルダウンで選択し登録したい。**
**②最寄り駅の登録は任意で登録しなくても良い。登録できるのは最大で2駅まで。**
**③当然、一回のフォーム送信で一度に全ての最寄り駅を登録したい。**

上記の実装手順を備忘として残していく。

※ちなみに、静的なデータを登録する場合はテーブルをいちいち作るのではなくアクティブハッシュでリストを生成することがベターという記事をいくつも読んだのですが、

数値を使わず 3 で割った余りを求める

# お題

0 以上の整数が**文字列として**与えられ,それを 3 で割った余りを返す関数なりメソッドなりを定義せよ。この記事では Ruby を使うので,メソッドですね。

ただし,数値は一切使わないこととする。つまり,処理の途中で数値オブジェクトを使ったりしない。当然ながら返り値も文字列とする。

組込みのメソッドが内部で数値オブジェクトを生成していないか分からないので,自分で書いたコードが途中で数値オブジェクトを作っていなければよいことにする。

メソッド名を `remainder_modulo_3` と名付けよう。英語が合ってるかよく分からんけど,remainder は剰余のことで,modulo 3 は「3 で割ったときの」という意味[^modulo3]。

[^modulo3]: modulo 3 は,正式な数学の用語では「3 を法として」と言う。

以下のようになればいい:

“`rb
p remainder_modulo_3(“0”) # => 0
p remainder_modulo_3(“8”) # => 2
p remainder_modulo_3(“12”

Kinx ライブラリ – JIT ライブラリ

# Kinx ライブラリ – JIT ライブラリ

## はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、(安定感は AC/DC)」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。JIT コンパイルのためのライブラリを作ってみました。

* 参考
* 最初の動機 … [スクリプト言語 KINX(ご紹介)](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
* 個別記事へのリンクは全てここに集約してあります。
* リポジトリ … [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
* Pull Request 等お待ちしております。

JIT やりたいよね。今回は [Kinx – native](https://qiita.com/Kray-G/items/66257e4cca0ad6dd7636)

【Ruby on Rails】レイアウトテンプレートの備忘録

初稿です。不備がありましたらご指摘いただけると幸いです。

Ruby on Railsを勉強中です。ビューファイルでコーディングした内容が、なぜDOCTYPE宣言やHTMLタグで囲ってないのにブラウザできちんと表示されるか不明だったのですが、レイアウトテンプレートを理解してスッキリしたので備忘録として残しておきます。

# レイアウトテンプレートとは?
railsでアプリケーションを作成した際に、以下のディレクトリに自動で作成されるファイルです。
**app/views/layouts/application.html.erb**

通常、コントローラーで定義したアクションから、ビューファイルがある場合はそのファイルが呼ばれているように見えますが、実際はレイアウトテンプレートの中に作成したビューファイルが埋め込まれて返しているとのこと。

例)postsというコントローラーを作成した場合
app/controllers/posts_controller.rb

“`ruby:posts_controller.rb
class PostsController < Application

【Rails】画像プレビュー機能の実装

# 目標
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/1dd19b79-c7b2-21c0-b120-d4f9645018e6.gif)

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[Slim導入](https://qiita.com/matsubishi5/items/b639ffddecc626856039)
・[Bootstrap3導入](https://qiita.com/matsubishi5/items/b117c95f4dd71340cc80)
・[Font Awesome導入](https://qiita.com/matsubishi5/items/a4c72f436e64ad106ee8)
・[ログイン機能実装](https://qiita.com/mats

【RSpec】stub_request(:post)でスタブ化したGoogle APIへのリクエストのレスポンスを実際と同一の形式にする

タイトルが長い

RailsアプリケーションからGoogle Calendar APIでカレンダー上のイベントに対して更新処理を行い、そのレスポンスから特定の属性を取り出して取り回すような処理を追加した。
レスポンスで受け取ったJSONをgoogle-api-ruby-clientがGoogle::API::V3::Eventクラスのオブジェクトに変換してしまうため、スタブリクエストのレスポンスもruby-clientで変換させるか同様の構造を持ったオブジェクトにする必要があった。

# TL;DR

– google-api-ruby-clientを利用してGoogleAPIにリクエストした場合、レスポンスはJSON形式で返ってきたあとgoogle-api-ruby-clientで変換される
– stub_requestからの戻り値のヘッダーに `’X-Goog-Upload-Status’: ‘final’` を加えると実際のAPIからのレスポンスと同様の形式になる

# スタブ化したリクエストと実際にAPIにリクエストした場合のレスポンスの違い

下記のコードはgoogle-ap