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

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

[py2rb] 多重継承の4

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 多重継承 (Python)
https://qiita.com/superrino130/items/89b58bfb4e89500a8e7c

前回の記事で、多重継承は表現できたものの、継承の継承は表現できていなかったので、やってみた。
# delegate (Ruby)
“`ruby
require ‘delegate’

class Fi
def original_method(*args, **kwargs)
‘original’
end
end

class Se1
def method_missing(method, …)
‘dummy’
end
end

class Se2
def initialize(…)
@c = SimpleDelegator.new(Fi).new(…)
@k =[@c]
end

def method_missing(method, …)
@k.each do

元記事を表示

ActiveModelSerializerで発生したN+1問題を解決

##前提

UserとPostは1対Nの関係

“`ruby
class Post < ApplicationRecord belongs_to :user end ``` ```ruby class User < ApplicationRecord has_many :posts, dependent: :destroy end ``` ##解消前 テストログを見るとserializerが走ったときにN+1問題が発生していた。 ```ruby def index posts = current_user.posts render json: posts end ``` ##解消後 ```ruby def index posts = current_user.posts.preload(:user) render json: posts end ``` scopeに切ると他でも使えてベター ```model.rb scope :preload_user, -> { preload(:user) }
“`

“`ruby
def inde

元記事を表示

海賊版サイト問題で”CDN事業者” が提訴されたので技術的にCDNを考える

# はじめに

出版物の海賊版をネット上で公開したとして逮捕された”漫画村”の事件はみなさん記憶に新しいかと思います。
昨今、ネット上で動画や音楽などさまざまなものを楽しめる時代です。出版物のサブスクというのもくるのではないかといわれています。

以下”海賊版”のWikipediaより一文引用します。

>海賊版(かいぞくばん)は、法律上の権利を無視して諸権利を有しない者により権利者に無断で発売または流通される非合法商品である。

権利の生じているものを無断でネット上に公開することは確かに問題だと思います。

ただ、この問題はここで止まりませんでした。
まずは以下の記事を読んでみて欲しいです。(無料公開部分だけでも良いかと思います。)

https://www.asahi.com/articles/ASQ2J4FDJQ2BUTIL068.html

“小学館、集英社、講談社、KADOKAWAの大手出版4社”がCDN事業者を提訴するに至りました。今回、この問題を技術的に考えてみたいです。

# モチベーション
背景として、私はインターン生時代にCDNを使って某コンテンツを配信しておりま

元記事を表示

アプリの新規作成~ GitHubへの反映まで

目的

1. コマンドでアプリケーションを作成する

“`
% cd ~/projects
% rails _6.0.0_ new reizoko-app -d mysql
“`

ここで、database.ymlの「encoding: utf8mb4」を「encoding: utf8」へ変更する。

“`
% cd reizoko-app
% rails db:create
“`

2. GitHubで管理する

GitHubで管理するために、新規アプリケーションのリポジトリを作成する。

① GitHub Desktopを用いてローカルリポジトリを作成する
② first commitというコミットメッセージでcommitする
③ アプリケーションと同名のリモートリポジトリを作成する
(publicにすると、他社がコードレビューできる。「Keep this private」のチェックを外すとできる。)
④ pushする

元記事を表示

attr_writter, attr_reader, attr_accessorについて

まず、この3つのメソッド話題のときに理解していないといけないのはインスタンス変数です。
インスタンス変数とはその名の通り、インスタンスを格納している変数です。(説明になってないので、[こちら](https://qiita.com/wangqijiangjun/items/787c956dab02e516eab9)の記事をご覧ください。)

インスタンス変数というのはクラス外からは参照できないんです。
実際にコードを書いていきます。
“`
class User
def initialize(name)
@name = name
end
end

user = User.new(“John”)
p user.name
=> NoMethodError (undefined method `name’ for #)
“`

上のコードを見ていただくと分かるのですが、インスタンス変数はクラス外部からは参照できないんです。

## attr_reader
そこで、クラス外からインスタンス変数を参照した

元記事を表示

Susan Donovan

https://susandonovan.com/

元記事を表示

ActiveStorageでアップロードしたファイルの名前と拡張子を取得したい

## 前提
– `ActiveStorage`を利用しファイルをアップロード後

※ `Active Storage`使用していなくてもOK

## やること
– アップロードしたファイルの拡張子を表示
– アップロードしたファイル名を表示

## 拡張子の取得
※(今回は`User`モデルに`has_one_attached :avatar`を記載した例です)
### 手順
“`.rb
# アップロードしたファイルのurlを取得
avatar_url = rails_blob_path(@user.avatar)
# => “/rails/active_storage/blobs/xxxxxxxxxxxxxxx/ファイル名.jpg”

# ファイルの拡張子を呼び出す
File.extname(avatar_url).downcase
# => .jpg
“`

## ファイル名の表示

“`.rb
# アップロードしたファイルのurlを取得
avatar_url = rails_blob_path(@user.avatar)
# => “/rails/active

元記事を表示

Ruby – Hash を使った文字列のフォーマット

Ruby のコードをレビューしてるときに、文字列とHashを演算子`%`で処理しているコードに出会い、意味が理解できなくて苦労した。
具体的にはこんなコード。

“`
$my_preference = {
“seafood”.to_sym => “salmon”
}

my_cheese = “I love %{cheese} cheese.”
my_cheese %= $my_preference
“`

おそらく、この `X %= B`は `X = X % B` の代入演算子なんだろうけど、それでは % は何をするのかと思って調べた。
この場合、`X`は文字列で`B`はHashなので、当然ながら整数除算の「あまり」の計算じゃないし…、Ruby って不思議すぎと思ったら、[Help and documentation for the Ruby programming language.](https://ruby-doc.org/)の[Class: String – str % arg → new_str](https://ruby-doc.org/core-2.5.1/

元記事を表示

Ruby1.9のハッシュロケット記法{ :key => value } を{ key: value } に修正する方法(erubis, hamlも含む)

## Rubyファイル

Rubyファイルの場合、rubocopのコマンドで一気になおせます
(rubocop のインストールは `gem install rubocop`)

`rubocop –only Style/HashSyntax -a`

`-a` オプションが自動適用なので、これを外すとどのように修正されるかを確認することができます

## erubis ファイル

erubisファイルの場合、[erb-lint](https://github.com/Shopify/erb-lint)を使う必要があります。
(インストールは `gem install erb_lint`)

以下のような yaml を `~/.erb-lint_only_hash_syntax.yml` として定義し

“`yaml

glob: “**/*.{html,text,js}{+*,}.{erb,erubis}”
EnableDefaultLinters: false
linters:
Rubocop:
enabled: true
only:
– S

元記事を表示

Model.model_name.humanなどについて

## いつ使うのか
Model.model_name.humanはいつ使われるのかというとI18nと呼ばれる国際化をする際に使われます。
実際にこのように書かれています。
config/locals/ja.yml
“`
ja:
activerecord:
errors:
models:
user:
attributes:
name:
blank: “が空になっています。入力してください。”
email:
blank: “が空になっています。入力してください。”
models:
user: “会員”
attributes:
user:
name: “名前”
email: “Eメール”
“`
このようにすることで、エラーメッセージ等の文言を日本語化することができるんです。
models階層の文字列を取得するには、
“`
User.model_name

元記事を表示

【Rails】has_manyにデフォルトでorderを設定する

## 実装方法

UserモデルにPostモデルが紐づくとします。
並び替えは作成日時の降順(新しい順)です。

“`ruby
class User
has_many :posts, -> { order(created_at: :desc) }, dependent: :destroy
end
“`

注意いただきたいのは、`dependent: :destroy`はorderの後ろに書くということです。

元記事を表示

Basic認証を実装する

目的

閲覧できるユーザーを制限するために、Basic認証を導入する。

Basic認証とは、HTTP通信の規格に備え付けられている、ユーザー認証の仕組み。
ユーザー名とパスワードを知っているユーザーのみが、アプリケーションを使えるように、制限をかけるために実装する。

1. Basic認証を導入する

① Basic認証の記述を、application_controller.rbに書く

Basic認証によるログインの要求は、全てのコントローラーで行いたい。
そのため、一まとめで命令できるよう、application_controller.rbに処理を記述する。

“`
class ApplicationController < ActionController::Base before_action :basic_auth private def basic_auth authenticate_or_request_with_http_basic do |username, password| username == ENV["BASI

元記事を表示

Rails6系+Vue3系で”Hello, Vue3!”

###はじめに
当方初記事となりますが、今回は私が一週間くらいハマりにハマってしまったRail6でのVueの導入、そしてブラウザに”Hello,Vue3!”を表示するところまでの手順を記したいと思います。

Rails6+Vue3に関する記事はQiitaをはじめとする各Q&Aサイトで多くの方が取り扱っていらっしゃいますが、私はどうにも要領が悪いのか、うまくいきませんでした。なぜかって?こっちが聞きたいです。

Vue.jsを初めて触るという方は、先にVue.js公式にてVue.jsについて確認しておくことを推奨致します。
https://v3.ja.vuejs.org/

##本記事のゴール
表題の通り、ブラウザ上で”Hello, Vue3!”です。
![スクリーンショット 2022-02-16 21.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494809/913305ad-7b41-f899-441a-7a8381307435.png)
ね、簡単そうでしょ?

##環境(コマンド:バ

元記事を表示

画像ファイルが JPEG 2000 形式かどうかを簡易的に判別する

# やりたいこと

画像ファイルが JPEG 2000 形式かどうかを判別したい。本来は JPEG 2000 形式の画像ファイルは拡張子が .jp2 である。しかし、拡張子が .jpg だったり MIME タイプが image/jpeg だったりしても、実際は JPEG 2000 形式である場合がある。そこで、バイナリデータを確認して判断する。

# 方法

[マジックナンバー (フォーマット識別子)](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_%28%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E8%AD%98%E5%88%A5%E5%AD%90%29) で判断する。[RFC 3745 – MIME Type Registrations for JPEG 2000 (ISO/IEC 15444)](https://datatracker.ietf.org/do

元記事を表示

[Ruby]インスタンス生成していないクラスが実行?

Ruby環境設定後、スクリプトファイルを試験動作させて素朴な疑問がわいたので記録しておく。
内容がほぼ個人的備忘録であり、疑問レベルも恐らく初歩も良いところと思う。
しかし、同じ疑問で躓く人が他に居るかもしれず、何かの役に立てれば幸いだと思う。

#疑問に思ったこと
インスタンス生成していないクラスが、なぜ実行されているのか?

#用意した環境

* Windows 10 Pro / 21H2
* RubyInstaller 3.1.0-1 released

#用意したファイル
標準出力へ文字列を出力クラスを定義しただけのスクリプトファイル。
メソッドもなし。

“`test1.rb
class Foo
p “PUT TEST”
end
“`

#想定していた実行結果
「p “PUT TEST”」は、クラス「Foo」内にメソッドも実装せず記述しただけなので、
Rubyインタプリタから実行しても、標準出力に”PUT TEST”は出てこないはずと思っていた。

……正直言うと上のスクリプト「test1.rb」は、単にメソッドを記述忘れで出来たミス産物なので、
本当は「p “PUT

元記事を表示

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

#発展的なログイン機構
■第9章
`remember me`というブラウザを再起動した後でもすぐにログインできる機能を備えていることが一般的になってきた。
永続クッキー (permanent cookies) を使ってこの機能を実現していく。

##9.1 Remember me 機能
本節では、ユーザーのログイン状態をブラウザを閉じた後でも有効にする [remember me] 機能を実装していく。この機能を使えば、ログアウトを実行しない限りログイン状態を維持できる。
YahooとかTwitterみたいな感じなのかな?

###9.1.1 記憶トークンと暗号化
セッションの永続化の第一歩として記憶トークン (remember token) を生成し、`cookies`メソッドによる永続的cookiesの作成や、安全性の高い記憶ダイジェスト (remember digest) によるトークン認証にこの記憶トークンを活用。

`cookies`メソッドに保存する情報は自動的に安全に保たれるようになっていない。cookiesを永続化するとセッションハイジャックという攻撃を受ける可能性があ

元記事を表示

blastengineを使ってRubyでメールを送信する

[blastengine](https://blastengine.jp/)はシンプルに使える開発者向けメールサービスを提供しています。何かと面倒なメール配信をシンプルに、かつ確実に送信先に届くようになります。

今回はblastengineを使ってRubyでメール送信を行うまでの流れを解説します。

## ユーザ登録する

blastengineにユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします(ユーザIDは後で使います)。

![getting-started-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/f9e553b4-6322-4219-db91-a28f2a88e280.jpeg)

## 送信元ドメインのSPFを設定する

送信元として利用するドメイン(自分で持っているもの)の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。

“`
txt @ v=spf1 inclu

元記事を表示

rails consoleでActiveRecordの検索メソッドを実行するときに注意するべきこと

前提知識

ActiveRecordの検索メソッドは、`DBアクセスの有無`という点で大きく分けると以下の2種類がある。

– DBアクセスを行うメソッド
– `ActiveRecord::FinderMethods`のメソッド
– `find, find_by, take, first, last` など
– すぐにクエリを発行し、データベースにアクセスし、レコード(Modelのインスタンス or インスタンスの配列)を返す。
– DBアクセスを行わず`ActiveRecord::Relation`のオブジェクトを返すメソッド
– `all, where, limit, eager_load, preload, joins`など

問題

上記の通り`all`や`where`はそれ単体ではDBへのアクセスは発生しない。
そこで実際に`rails console`で`where`を実行してみる。

“`ruby
pry(main)> User.where(id: 1)
User Load (3.6ms) SELECT “users”.*

元記事を表示

Dockerのlocalhostが突然、接続されなくなる問題を解決しました。

# 起きていた問題
突然ブラウザ上にて、localhostが接続されなくなる。
![スクリーンショット 2022-02-11 11.10.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525372/37a5b636-d34b-954e-96a0-f4e14b78f381.png)

“` c
keitaromasuda@KeitaronoMacBook-Pro WebApp % ./vendor/bin/sail up -d
[+] Running 0/1
⠿ laravel.test Error 31.2s
[+] Building 28.1s (3/3) FINISHED

元記事を表示

rubyにおける::(ダブルコロン、コロンコロン)スコープ演算子

rubyではスコープ演算子というのがあります。::っていうやつです。
これを使うと、クラスやモジュールで定義されている定数を外部から参照することができます

“`
module Test
HOGE=20
FUGA=30
end

class Hogehoge
hoge = Test::HOGE
p hoge
end
=> 20
“`
こうすることによってmoduleで定義されている定数を参照することができるんです。

今回はメモ書き程度に終わらせようとおもいます
以上です。何か間違いがございましたら、ご教示いただけますと幸いです。

元記事を表示

OTHERカテゴリの最新記事