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

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

[py2rb] re.compile

# はじめに
移植やってます
# re.compile (Python)
“`python
import re

msg = ‘電話番号は080-111-9999です!’
pattern = re.compile(r'(\d{2,4})-(\d{2,4})-(\d{4})’)

print(pattern)
print(pattern.search(msg).group(0))

# re.compile(‘(\\d{2,4})-(\\d{2,4})-(\\d{4})’)
# 080-111-9999
“`
`compile`関数は正規表現オブジェクトを返します。
この例ではピンときませんが、`compile(pattern, flags=0)`で正規表現オプションを利用することにより複雑な正規表現を簡単にすることも可能です。

[re — 正規表現操作](https://docs.python.org/ja/3.7/library/re.html#module-re)
# `//` (Ruby)
“`ruby
msg = ‘電話番号は080-111-9999です!’

pa

元記事を表示

ラクラク!Sorceryを用いたゲストログインの実装

## 概要
本記事は RUNTEQアドベントカレンダー 2021 の16日目の記事となります!

RUNTEQに入学して約1ヶ月が経った段階で、学習の振り返りとして簡易的なアプリを作りました!

あの頃の夏の思い出を共有して、ノスタルジックな気分になれるアプリです。
(モチーフは、井上陽水の「少年時代」)

**今回は、このアプリで実装したゲストログインの方法を紹介します。**

作成したアプリを気軽に使ってもらうためにゲストログインを実装しようと考えていらっしゃる方は多いのではないのでしょうか?
是非参考にしてみてください。

https://otonanonatsu.herokuapp.com/

## 前提
– gem ‘sorcery’ をインストール済み
– ruby 2.6.3
– Rails 5.2.6

## ルーティング
“`ruby
# routes.rb
post ‘/guest_login’, to: ‘user_sessions#guest_login’
“`
guest_loginというパスを受け取ると、
user_sessionsコントローラーの

元記事を表示

[py2rb] __getstate__

# はじめに
移植やってます
# `__getstate__` (Python)
“`python
def __getstate__(self):
“`
`シリアライズ`って何?

“`python
try:
import dill
except ImportError:
dill = None
try:
import cPickle as pickle
except ImportError:
import pickle
serializer = pickle
else:
serializer = dill
“`
`pickle`って美味しいの?
# どうする? (Ruby)
“`ruby
“`
もちろん`Ruby`にもシリアライズの機能はある。
同実装するかは、要検討。
# メモ
+ Python の `__getstate__` を学習した
+ 道のりは遠そう

元記事を表示

[py2rb] setattr

# はじめに
移植やってます
# setattr (Python)
“`python
for attr in [‘delimiter’, ‘label’, ‘block_size’, ‘label_group’]:
if attr in kwargs:
setattr(self, attr, kwargs.pop(attr))
“`
“`python
self.attr = kwargs.pop(attr)
“`
`self`の属性を設定。
# eval (Ruby)
“`ruby
[‘delimiter’, ‘label’, ‘block_size’, ‘label_group’].each do |attr|
if kwargs.include?(attr)
eval(“@#{attr} = #{kwargs.delete(attr)}”)
end
end
“`
無理矢理感が凄いんですけど。
# メモ
+ Python の setattr を学習した
+ 道のりは遠そう

元記事を表示

[py2rb] 可変長引数

# はじめに
移植やってます。
# * ** (Python)
“`python
class A:
def init(*args, **kwargs):
print(args)
print(kwargs)

a = A
a.init(‘dog’, ‘pet’, name=’poti’, age=10, sex=’male’)

# (‘dog’, ‘pet’)
# {‘name’: ‘poti’, ‘age’: 10, ‘sex’: ‘male’}
“`
argsはタプル、* -> ** の順にする。
# * ** (Ruby)
“`ruby
class A
def init(*args, **kwargs)
p [args, kwargs]
end
end

a = A.new
a.init(‘dog’, ‘pet’, name: ‘poti’, age: 10, sex: ‘male’)

# [[“dog”, “pet”], {:name=>”poti”, :age=>10, :sex=>”male”}]
“`
Ru

元記事を表示

RubyのC拡張はなぜ難しいのかー初心者を阻む2つの壁ー

## はじめに

Rubyにはじめて触ってから、もう10年近い月日が経とうとしています。月日の速さが信じられない思いです。
Rubyに触れている中で、なかなか突破できなかった一つの壁がRubyのC拡張の作成でした。

それでも[FFI](https://github.com/ffi/ffi)の使い方は覚えて、C言語の関数をRubyから呼べるようになりました。いつかはC拡張を作りたいなと考えていましたが、先週ようやくはじめて[lib2bit](https://github.com/dpryan79/lib2bit)というライブラリの[バインディング](https://github.com/ruby-on-bioc/twobit)をPythonから移植することができました。

そのなかで、なぜ初心者がC拡張を作るのか難しいのか壁が見えてきたので、記録に残しておきたいと思います。
(こういうのは一旦できるようになってしまうとすぐに忘れてしまうものなので)

## 理由その1 C言語の関数と、Rubyのメソッドの対応関係はCファイルの一番下に記載されている

はい。**これ**です。

これが

元記事を表示

日本の時刻に合わせる rails

#設定する場所

config/application.rb

“`
config.active_record.default_timezone = :local
config.i18n.default_locale = :ja
“`
この2行を付け足すだけです。

今作っているアプリで最後の投稿からの日付を出したくて導入しました。
カラムの型はdatetimeです。

元記事を表示

【Ruby のまずいコード】文字列の先頭から n 文字を取得する

# お題

ローカル変数 `str` に文字列が代入されているとして,先頭から高々 10 文字までを `puts` で表示してください。
「高々 10 文字」というのは,`str` が 10 文字に満たないときはすべて表示する,という意味です。

次に,高々 `n` 文字までを同様に表示してください(`n` は正の整数とする)。

話を簡単にするため `str` は改行を含まないと仮定します。

# コード

“`rb
puts str[0..9]
“`

“`rb
puts str[0..(n – 1)]
“`

# 改善

10 文字表示させたいのに,配列式の終端に `10` ではなく `9` を指定しなければならない,というのは混乱の元ですね。
変数で与えたときも余計な計算式が必要になって面倒です。
こういう書き方はバグを誘う悪い習慣です。

あるいは `..` の代わりに `…` を使って

“`rb
puts str[0…10]
“`

“`rb
puts str[0…n]
“`

と書くこともできますが,もっと素直なのは

“`rb
puts

元記事を表示

僕のポートフォリオ!Untangled_pasta_treesの仕様や技術について(jqueryでの動的な要素追加について詳しく書きます!)

## はじめに
RUNTEQ19期生のヨシダです!
バリバリの初心者です!
好きな食べ物は地獄ラーメンです!
今日はいつも説明するたびによくわからないと言われる、よくわからないポートフォリオ
「[Untangled_pasta_trees](https://untangled-pasta-trees.herokuapp.com/)」についての説明や仕様、技術その他諸々について語っていこうかなと思います!(ポートフォリオまだ作りかけなので仕様等はコロコロ変わるかもしれません。)
あと、読み直したらすごくふざけた記事になってました。
書き直そうと思ったんですが、大変なので止めました。(すいません)
ちなみに名前長いので略称は『pasta trees』 や『PT』でいこうと思ってます。
[githubでコード見れますがまだぐちゃぐちゃです。処理はほぼ全部 app/views/layers/indexにあります。](https://github.com/yoshidashota0328/Untangled_pasta_trees)

# 参考時間
記事だけなら10分
ぶっちゃけリンク先の引用

元記事を表示

AWS上にRe:VIEW環境を構築する (Ubuntu20.04 + Re:VIEW5.3)

「AWS上にRe:VIEW環境を構築する」
https://qiita.com/nanbuwks/items/da9136f1b6f789aaffcf
では、Ubuntu 16.04 AMD64 上に Re:VIEW Ver.2系をインストールしました。

今回は、2021年12月14日現在に使える組み合わせで構築を試しました。

# 環境

– AMAZON AWS t2.micro
– 1VCPU
– 1GIB
– EBS のみ
– Ubuntu 20.04 AMD64
– Ruby 2.7

# Ruby インストール

Ubuntu 付属の Ruby と Rails をインストールします。

“`

$ sudo apt install ruby-full
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following additional packages will be installed:
fonts-

元記事を表示

Railsで「複数カラム」かつ「共通テーブル」にアソシエーション(1対多・多対多・自己結合)

# はじめに
最近`Ruby on Rails`を勉強していて,アソシエーションについての知見が増えたので,せっかくなので共有したいと思います.
テーブルの複数カラムから共通のテーブルを参照するときや,別名主キーを設定したテーブルに対してアソシエーションを張る方法について紹介していきます.

今回紹介するアソシエーションをすべてまとめると以下の図のようになります.
![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506931/ba1dc171-7269-f7fe-40a0-7663eb5d0012.png)

同じものを作る場合上から順に実装を進めていけばうまくいくと思います.


※なぜその実装なのかという詳しい説明などはあまりしません.
※めちゃ長いです。すみません。

# もくじ
– [複数カラム・共通テーブル・1対多](#複数カラム共通テーブル1対多)
– [テーブルの作成](#テーブルの作成)
– [アソシエーシ

元記事を表示

[py2rb] cls

# はじめに
移植やってます。
# cls (Python)
“`python
class WritableIndex(object):
@classmethod
def load(cls, fp):
inst = cls()
“`
`@classmethod`はRubyでいうところの特異メソッドで行けそうな気もしますが、`cls`は厄介そう。
上記ですと、`cls()`を呼んだとき、現在のクラスがインスタンス化されます。
# どうする? (Ruby)
“`ruby
class WritableIndex
def self.load(fp)
inst = self.new
inst.myprint(fp)
end

def myprint(args)
print(args)
end
end

WritableIndex.load(“cls”)

# cls
“`
取り敢えず`self.new`で。
ちなみに30箇所で使用されている様子。
# メモ
+ Python の cls を学習した
+ 道のりは遠そう

元記事を表示

[py2rb] 多重継承の2

# はじめに
移植やってます。
# 多重継承 (Python)
[[py2rb] 多重継承 – Qiita](https://qiita.com/superrino130/items/364d856e08cff0e501d3) 再び
![20211214a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/3fa34096-d7dc-4801-7615-51f37f17be14.png)

“`python
class A(object):
def myprint(self):
print(‘A’)

class B(A):
def myprint(self):
print(‘B’)
super().myprint()

class C(B):
def myprint(self):
print(‘C’)
super().myprint()

class D(A):
def mypr

元記事を表示

[py2rb] @staticmethod

# はじめに
移植やってます。
# `@staticmethod` (Python)
“`python
@staticmethod
def _get_time(scan):
raise NotImplementedError
“`
`Python`のデコレーターは便利そうですが、移植は厄介。

こちらに、[Pythonで classmethod、staticmethod を使う – Qiita](https://qiita.com/msrks/items/fdc9afd12effc2cba1bc)詳しい解説があります。

こちらは、[クラスメソッドとスタティックメソッドについて – Qiita](https://qiita.com/1plus4/items/b37ec6ea90569ffdebfe) `Python`と`Ruby`と`Java`を比較されています。
# どうする? (Ruby)
“`ruby
#staticmethod
def _get_time(scan)
raise NotImplementedError
e

元記事を表示

[py2rb] __getitem__

# はじめに
移植やってます。
# `__getitem__` (Python)
“`python
def __getitem__(self, key):
if isinstance(key, (int, float)):
if isinstance(key, Sequence):
if isinstance(key, slice):
“`
`__getitem__`についての詳しい解説は、こちらの [Pythonの __getitem__ に与える引数やスライスについて調べてみた – Qiita](https://qiita.com/gyu-don/items/bde192b129a7b1b8c532) にあります。

誰だっ、`Python`が初心者向けって言ったの!
# どうする? (Ruby)
“`ruby
class Getitem
def [](*args)
if args.size > 1
puts args.class
else
puts args[0].class

元記事を表示

【Jbuilder】DBに直接紐付かないモデルクラスのjbuilderの書き方

##今まで
partialでファイル指定

“`user_infos/show.json.jbuilder
json.user_info do
json.partial! ‘user_infos/user_info’, user_info: @user_info
end
“`

“`user_infos/_user_info.json.jbuilder
json.extract! user_info, :id, :name
“`

##これから
DBに直接紐付かないモデルクラスに“`ActiveModel::Model“`を“`include“`する。
>ActiveModel::Modelをincludeすると、以下のような機能を使えるようになります。

>- モデル名の調査
– 変換
– 翻訳
– バリデーション

今回は“`ActiveModel::Model“`がモデル名の調査をしてくれるのでファイル名を指定しなくてもよくなる。

“`models/user_info.rb
class UserInfo
include ActiveModel::

元記事を表示

Railsで指定していないはずのコールバックメソッドが動作してしまう

# はじめに
現在、Ruby on Railsにて睡眠を記録するアプリを作成しています。Userモデルの管理機能を追加しようとした際に、**指定していないはずのコールバックメソッドが動作してしまう**という現象に陥りました。備忘録として残すため、記事にすることにしました。

## 開発環境
Mac OS Big Sur 11.6
VSCode
Ruby 3.0.2p107
Rails 6.1.4.1
MySQL 8.0.27 for macos11.6 on arm64 (Homebrew)

# 原因
結論を先に述べます。原因はルーティング(routes.rb)でした。

>Railsのルーティングは、ルーティングファイルの「上からの記載順に」マッチします。このため、たとえばresources :photosというルーティングがget ‘photos/poll’よりも前の行にあれば、resources行のshowアクションがget行の記述よりも優先されますので、get行のルーティングは有効になりません。これを修正するには、get行をresources行よりも上の行に移動してください。

元記事を表示

[py2rb] sliceクラス

# はじめに
移植やってます。
# slice (Python)
“`python
s = slice(0, 10, 3)
print(type(s))

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10][s]
# a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10][s.start:s.stop:s.step]
print(a)

#
# [1, 4, 7, 10]
“`
`Python`って`slice`クラスがあるんですね。
3つの数値を持ったタプルなんだと思いますが。
# どうする? (Ruby)
“`ruby
slice = Struct.new(:start, :stop, :step)
s = slice.new(0, 5, 3)
puts s
puts s.class
puts s.instance_of?(slice)

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10][s.start, s.stop]
print(a)

# #

元記事を表示

Rails Googleフォント 使い方(初心者)

#Google Fontとは
Googleが提供するWebフォントのサービスです。
基本無料で使用できます。
下記GoogleフォントのURL

https://fonts.google.com/

###Webフォントとは
Webフォントはネットワーク上からフォントデータを読み込みWebサイトやブログに表示する仕組みを利用しています。
異なるデバイスで見ても意図したWebフォントを表示することが可能。
##実装の手順
①使いたいGoogleフォントを探す( link と CSS rules to specify familiesをコピー)
②app/views/layouts/application.html.erb のheadの中にlinkを貼り付ける
③app/assets/stylesheets 内にある使いたいscssにCSS rules to specify familiesを貼り付ける

###①
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2274768/5c3dcc3

元記事を表示

[py2rb] for のスコープ

# はじめに
移植やってます
# for (Python)
“`python
for item in (1, 10, 2):
if item is not None:
break
print(item)
“`
見た瞬間、`item`って未定義?と思いましたが、ちゃんと数値を返します。
# for (Ruby)
“`ruby
for item in [1, 10, 2]
break if !!item
end
puts item

item = [3, 10, 2].find{ !!_1 }
puts item
“`
`Ruby`はそんなことないだろうと思っていましたが、ちゃんと数値を返します。
普段、`for`って使用しませんので思い込みでした。
# メモ
+ Python の for を学習した
+ 道のりは遠そう

元記事を表示

OTHERカテゴリの最新記事