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

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

ソースコードを読むための技術(チートシート)

# 1 概要
聞くところによると業務の8割がソースコードを読む時間らしい。しかし、8割という規模感の割には世間でソースコードの読み方についての議論が活発にされている印象はない上に、体系的かつ順序立てたソースコードの読み方をまとめたWebサイトや書籍も少ない。疑問に思いながらもそれなりに長いことデバッガーを使った読み方・リーダブルコードの内容・Web記事を参照にしてソースコードを読んでいた。

しかし、ソースコードリーディングの方法についての情報がメモアプリ内で散らかってしまい、いつまで経ってもソースコードリーディングの技術が体系的に身についていないと感じたため、本稿では本・Web記事・YouTubeなど媒体を問わず、様々な文献からソースコードを効率的に読む方法をチートシートにしてまとめた。チートシートにする目的は見返して反復し長期記憶化しやすいようにするためと、ソースコードリーディングについての知識を体系的にまとめ、情報を一元化することで情報の取り出しを容易にするためである。また、本稿で想定している言語は私に馴染みのあるRubyとする。

# 2 コードリーディングにおける階層

元記事を表示

[Rails] webpackerでCSSを読み込みたい

railsのver.6以上を使うなら `asset pipeline` ではなく `webpacker` でCSSを読み込みたいと思い、実装したのでメモです。

## ディレクトリ構成
[webpacker](https://github.com/rails/webpacker) のREADME.mdより。

“`
app/javascript:
└── packs:
# only webpack entry files here
└── application.js
└── application.css
“`

# 手順
`rails new` は完了しているものとします。
rails6より下のversion使ってる人はwebpackerもインストールしましょう。

## 新規フォルダ・ファイル作成
↑のディレクトリ構成に従う。
app/javascript/packsに `application.css` ファイルを作成

## エントリーポイント
エントリーポイントは packs/application.js なので、applicat

元記事を表示

ジャンル別に投稿・チャットできるようなアプリ作ってみた〜苦労したところ〜

一つ前の記事にアプリの概要を投稿しました。
ここからアプリ作成時の苦労したところなどを、記事にしたいと思います。

#### :star:大体がジャンルページから始まる
1. まず、このアプリはジャンルを選択、または自分で作成します
2. ジャンルを選択することで、ジャンルページが開きます
3. ジャンルページの右側で投稿ができ、左側でジャンル内のチャットグループ検索ができるようになっています
**つまり大体のページ移行、データ送信に置いてgenru_idが必要になるのです**
**これは大体のものがジャンルを親として紐づいている(ジャンル内にある)ことを意味します**
![個人アプリQiita用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573113/5e0ad494-1cb5-1a8f-6f32-faccd60c3201.png)

これが色々と邪魔をされました
色々やり方を検索するのですが、そのページ単体だったら簡単にできたものも、ジャンルページを挟

元記事を表示

第4章 Rails風味のRuby

#4.1 動機

■ヘルパー
view内でちょっとした処理をやりたい時に呼び出すもの。
実体はmodule。app/helpersで定義する。
使いたいとき<%= 〜%>で呼び出す。

■組み込みヘルパー
ある動作を処理する場合にメソッド化して扱えるようにRailsにあらかじめ組み込まれた機能。
helpersで定義しなくても使える。

#4.2 文字列とメソッド
【演習】
1.city変数に適当な市区町村を、prefecture変数に適当な都道府県を代入してください。
city = “Yokohama”
prefecture = “Kanagawa”

2.先ほど作った変数と式展開を使って、「東京都 新宿区」のような住所の文字列を作ってみましょう。出力にはputsを使ってください。
puts prefecture+”県” + city + “市”

3.上記の文字列の間にある半角スペースをタブに置き換えてみてください。(ヒント: 改行文字と同じで、タブも特殊文字です)
やってみて

4.タブに置き換えた文字列を、ダブルクォートからシングルクォートに置き換えてみるとどうなるでしょうか?

元記事を表示

array.map(&:method) を使って簡単に

#array.map(&:method) を使って簡単に

##例

下のような式があるとする。
ブロック内で各要素を大文字に変換してそれをarrayに格納する。

“`ruby
[‘a’, ‘b’, ‘c’].map{|s| s.upcase } #=> [“A”, “B”, “C”]
“`

##array.map(&:method) を使って簡単に
array.map(&:method)を使って上の例のしきを簡単にできる。

“`ruby
[‘a’, ‘b’, ‘c’].map(&:upcase) # => [“A”, “B”, “C”]

“`

##適用条件
1. ブロックの引数が一つだけ
2. ブロックの中で呼び出すメソッドには引数がない
3. ブロックの中では、ブロック引数に対してメソッドを呼び出す以外の処理がない

元記事を表示

docker環境で遅いbundle installを劇的に早くする

## 目的
newsdict.io(docker環境上のrails)でbundle installの時間を早めたい

## 方法
– あまりバージョン変更がない最も重たいgemをベースのdocker imageに入れて置きgemを流用できるようにしておく
– nokogiriを使っていたので、[–use-system-libraries]を使う
– bundle install を並列で実行する

## 実際のコード

#### – あまりバージョン変更がない最も重たいgemをベースのdocker imageに入れて置きgemを流用できるようにしておく

https://github.com/newsdict/docker_rails/blob/master/Dockerfile#L70

#### – ベースとして使ったdocker image
https://hub.docker.com/repository/docker/newsdict/rails

#### – nokogiriを使っていたので、[–use-system-libraries]を使う

https://gi

元記事を表示

Railsにおけるsessionについて整理してみた

railsチュートリアルをもりもりとやっております。
第8章にて取り扱われている「session」について、今回は自分の理解のために整理したいと思い記事を書きました。
初心者なため、なにか間違いなどあればコメントにてご指摘いただけると嬉しいです。

そもそもsessionって何?

(答え)
“statefullな通信”を実現する”仕組み”のこと。

ステートフルとはなにか?

私たちが普段使っているHTMLは、statelessな通信を行っています。
*state (状態) less(ない)= 1回1回が独立したやりとり

この通信は、ブラウザ⇄サーバ間のやりとりは1往復ごとに独立しており、
以前の情報などは引き継ぐことはできません。

ただ、この話を聞いた時に疑問に思うかもしれません。
HTMLの通信は全て独立したやりとりならば、例えば、ショッピングサイトなどで、
カートに買いたい商品を入れていく際、情報は引き継がれないため、
ページ遷移するとカートは空になってしまうはずです。

なので、**ステートレスなHTMLの通信を”ステートフル”にする

元記事を表示

ジャンル別に投稿・チャットできるようなアプリ作ってみた〜アプリ概要〜

個人アプリでジャンル別に投稿・チャットができるようなアプリを作成してみました。
下記の文章はこのアプリのREADMEに載せているものです。
概要として、この記事も投稿したいと思います。

## Ota-Chat
### :sunny:アプリ内容
– どんなアプリか
趣味が同じ人同士でTwitterのような投稿をし合い、その中でグループを作って趣味が合う人同士でチャットができるようにしたアプリ
– このアプリでできること
– ジャンルでの投稿のみをすることもでき、また、その中でグループを作成し、決まったメンバーとチャットすることもできます
– グループ作成では、グループにランク(ライト・ミドル・ハード)を選択でき、メンバーの趣味の度合いによって選択できるようになっています
### :sunny:URL(デプロイ済)
https://ota-chat.herokuapp.com/

### :sunny:開発環境
– Ruby
– Ruby on Rails
– VSCode(Visual Studio Code)

### :sunny:制作背景

元記事を表示

【Ruby on Rails】条件合致する時のみ機能するバリデーションの実装

Ruby on Railsにおいて、ある条件に合致する時のみ機能するバリデーションを記述したい場面があり、解決するまでに時間がかかったため、ある条件に合致する時のみ機能するバリデーションの記述方法を下記に示します。

#### 概要
登録したいレコードのカラムXの値がaの時のみ有効になるバリデーションの記述

#### 具体例
下記例は、products tableのカラムpublic_flag(型:integer)の値が1の場合、
products tableのカラム商品名(name)、商品説明(description)、商品価格(price)の値が空では登録できないという制約を付与している例である。

下記の場合、public_flagの値が0の場合、商品名(name)、商品説明(description)、商品価格(price)の値が空でもproducts tableへ登録が可能である。
 ※public_flag 1: 公開情報、0: 非公開情報

model(product.rb)

“`ruby
with_options presence:true, if: :isPro

元記事を表示

Ruby 数値参照プログラム

自分用です
簡単な数値参照プログラムを作りました。
下記コード

“`ruby:qiita.rb
m = gets.chomp
n = gets.to_i

room = []

n.times do
count = gets.chomp
room.push(count)
end

a = 0
count = n

while n > 0

if ! (room[a]).include?(m)
puts room[a].to_i
else
count -= 1
if count == 0
puts “none”
end
end
n = n – 1
a = a + 1
end
“`

最初に変数mに参照元となる数値を入力。(文字データになってますけど)
それをもとに数値入力して当てはまらない数値だけ出力しています。

全てあてはまらなかった場合”none”と返します。

今回のif文は”あてはまらない”場合なので if !という形で作りました。
又、文字列の方がinclude?で簡単に参照できると思ったので

元記事を表示

Rubyのformatメソッドで名前付きのフォーマットを使う

Rubyには、いわゆるフォーマット指定と呼ばれるやつに従って文字列を整形するメソッドがいくつかあります。

※ これらの書き方をするとRuboCopに怒られてしまったので、経緯をまとめました。

“`ruby
# どれも “hoge = 1 + 2” と評価される
sprintf(‘hoge = %s + %s’, 1, 2)
format(‘hoge = %s + %s’, 1, 2)
‘hoge = %s + %s’ % [1, 2]
“`

`format`と`sprintf`はどちらもKernelのメソッドで、名前が違うだけのエイリアスです。
https://docs.ruby-lang.org/ja/latest/method/Kernel/m/format.html

三番目の`String#%`は少し毛色が違いますが、self側をフォーマット指定の文字列とみなして`format`を呼んでいるだけで、実質的には同じことができるようです。
https://docs.ruby-lang.org/ja/latest/method/String/i/=25.html

## 推

元記事を表示

FakerGemで作るポケモンGo

# 経緯
プログラミング学習を進める過程で様々なGemを使う。Gemの理解を深めるためにGitHub上の元データを眺めていると、面白いものが見つかった。

># Faker::Games::Pokemon
>Faker::Games::Pokemon.name #=> “Pikachu”
>Faker::Games::Pokemon.location #=> “Pallet Town”
>Faker::Games::Pokemon.move #=> “Thunder Shock”

なんとポケモンの名前をランダム表示する機能がある。FakerGemを理解するなら、使ってみるのが一番!ということで、ポケモンの遭遇と捕獲を行うアプリケーションを作成してみた。

# コード

“`ruby:application.rb
# FakerGemの読み込みと日本語設定
require “Faker”
Faker::Config.locale = :ja

# ポケモンクラスとプレイヤークラスのファイル読み込み
require “./pokemon”
require “./player”

# ポ

元記事を表示

駆け出しエンジニア「サーバーサイド言語を勉強したら、何ができるようになるの?」

# 登場人物
**駆け出しエンジニア(以下、後輩? と呼ぶ)**
やっとの思いでHTML/CSS/JavaScriptを習得した、駆け出しエンジニア。
JavaScriptのライブラリやフレームワークも経験して、
とりあえずイメージしたWEBアプリを作成できるレベル感に達成した。
使っているブラウザはGoogle Chrome。

**駆け出しエンジニアの友人(以下、先輩? と呼ぶ)**
駆け出しエンジニアと同じカリキュラムで勉強をした後、
駆け出しエンジニアよりも1年早くサーバー関連の仕事を経験してきた、彼の友人。

# あらすじ

**後輩?** :
サーバーサイド言語を学ぶべきなのはわかるけど、これを学んだら何ができるようになるんだろう?

オンラインサービスが作れるようになる、というのはわかるんだけど、それだけなのかな?
なんかパッとしないな〜。

**先輩?** :
おっ、後輩。
なにやら勉強のモチベーションに行き詰まっているようだね?

**後輩?** :
先輩!
そうなんだよ〜。サーバーサイド言語がとっても大事な知識だというのは理解してるんだけど、
JavaScri

元記事を表示

動的計画法について(トップダウン方式、メモ化、一次元)

paizaとかAtCoderとかやっていると、プログラムとして書けているはずなのに処理時間が遅くてアウト、というのが結構あって、この動的計画法について学んで、処理速度の向上を図ろうと思っているのですが、なかなかに理解しづらいので、少しずつ言語化していきます。

# 動的計画法の定義
– 帰納的な関係の利用
– 計算結果の記録

を満たすアルゴリズムの総称だそうです(Wikipedia)。とりあえずは適用条件等は省略します。
もう少しわかりやすくいうならば、漸化式の形で帰納的な関係を記述し、ここの計算結果について記録しておいて、その結果を参照しながら計算することによって、計算量を減らす手法ですね。

うん、全くもってわかりやすく言えてない。具体例(ベタなフィボナッチ数列)いきましょう。
フィボナッチ数列とは、a[0]=a[1]=1,a[n]=a[n-1]+a[n-2]で表される漸化式の一般解ですね。
(前二つの和によってその項の値が決まる)

#普通に書いた時
“`ruby:fib.rb
def fib(n)
if n <=1 return 1 else fib

元記事を表示

PAIZAのDランクで使ったメソッド一覧

# はじめに
大前提として答えを掲載することは禁止となっている為、あくまでも参考程度でお願い致します。配列やハッシュは使わなくてもクリアできる為、詳しい説明は致しません。なお投稿者は駆け出しバリバリの実務未経験で、現在Bランクでありまだまだ知識不足が否めません。詳しいメソッドの説明は省くのでご了承をお願いします。

# 入力値の取得

“`ruby
入力例1(input)
10

## 10を数値として取得
input = gets.chomp.to_i
=> 10

## 10を文字列として取得
input = gets.chomp.to_s
=> “10”

## 10を分割して数値として取得
input = gets.chomp.split(“”).map(&:to_i)
=> [1, 0]

## 10を分割して数値として取得
input = gets.chomp.split(“”).map(&:to_s)
=> [“1”, “0”]

入力例2(input)
10 20

## 10, 20を数値として取得
input = gets.chomp.split.map

元記事を表示

クリックイベントでタブの切り替えをするときにハマったこと

#背景
クリックしたときにタブの切り替えはできたが、肝心な内容がもともと両方とも表示されてしまっている
タブの切り替えだけ反映されても意味がないのだ…。?

#仮説
jqueryの記述に問題があると仮説を立てた。

#実装開始
調べてみると、show、hide、toggleというものを見つけた。

でも、よくよく考えてみるとこれらはクリックしたときに起こるイベントだから意味ないような…。

ということで、もっと調べてみると、cssのdisplay:none;と言うものを発見。

“`haml

%ul.container-body
%li.container-body__item.show
%p お知らせはありません
%li.container-body__item
%p やることはありません
“`

“`scss
.container-body {
width: 100%;
&__item {
display: none;

元記事を表示

【Ruby/Rails】スレッドエラー(ThreadError)をリトライする機構

# 概要

`Thread.new()`を使いマルチスレッド処理してたところ、Herokuにてリソース不足エラーが発生。

“`
can’t create Thread: Resource temporarily unavailable (ThreadError)
“`

スレッドエラーのハンドリングと、ベストエフォートでスレッドを使うリトライ機構を作成した。

ちなみにHerokuで実行できるプロセス・スレッド数はかなり限られているので、ローカル環境との差異に注意。

https://devcenter.heroku.com/articles/limits#processes-threads

2020/08現在

“`
free, hobby and standard-1x dynos support no more than 256
standard-2x and private-s dynos support no more than 512
performance-m and private-m dynos support no more than 1638

元記事を表示

paramsを設定するときの自分用メモ

プログラミングを学び始めた初学者です。自分用のメモと、とりあえずQiitaを使ってみるという試みです。

controllerのコード

“`ruby
class PostsController < ApplicationController def index @posts = Post.all end def new end def create Post.create(memo: params[:memo]) end end ``` createメソッド:```モデル.create(カラム名:保存する値)``` viewのコード ```ruby

トップページ

<%= link_to "投稿ページ", '/posts/new'%>
<% @posts.each do |post|%>

<%= post.memo %>
<%= post.created_at %>

<% end %>
“`
フォームの入力内容をデータベースから引っ張ってきて表示する部分“`<%=

元記事を表示

Ruby 得点計算プログラム

簡易得点計算のプログラムを書いたので自分用備忘録

まずは下記コード

“`ruby:qiita.rb
k,n = gets.chomp.split(” “).map{|i| i.to_i}
a = []
d = []

k.times do
d_1,a_1 = gets.chomp.split(‘ ‘).map{|i| i.to_i}
d.push(d_1)
a.push(a_1)
end

num = 0
check = []

while k > 0
if d[num].between?(1,9)
check.push(((a[num].fdiv(n) * 100) * 0.8).floor)
elsif d[num] >= 10
check.push(0)
else
check.push((a[num].fdiv(n) * 100).floor)
end

if check[num] >= 80
puts “A”
elsif check[num] >= 70
puts “B”
elsif ch

元記事を表示

【Ruby基礎】ブロックを使う頻度の高いメソッド

ブロック構文を使う頻度の高いメソッドを使用例と一緒にまとめます。

## map(エイリアスメソッドはcollect)
**各要素に対してブロックを評価した結果を新しい配列にして返す**
空の配列を用意して、他の配列をループ処理した結果を空の配列に詰め込んでいくような処理の
大半はmapメソッドに置き換えられる。

“`ruby:コンソール

irb(main):026:0> numbers
=> [1, 2, 3, 4, 5]
irb(main):027:0> new_numbers = numbers.map {|n| n * 10}
irb(main):028:0> new_numbers
=> [10, 20, 30, 40, 50]
irb(main):029:0> numbers
=> [1, 2, 3, 4, 5]

“`

## select/find_all/reject
**selectメソッドは各要素に対してブロックを評価し、その戻り値が真の要素を集めた配列を返すメソッドです。**

“`ruby:コンソール

irb(main):003:0> numbe

元記事を表示

OTHERカテゴリの最新記事