- 1. rubyでの正規表現問題の解説
- 2. コードを書けない人が0からコードを書くための3ステップ
- 3. キレイなMonkeypatchを書きましょう!(Gemの内容を別のGemでMonkeypatchした話)
- 4. 更に Ruby で pagepank をやってみた
- 5. 三項演算子で条件式が複数あるとき
- 6. オブジェクト指向とruby on rails
- 7. integerを足し引きする方法【Rails】
- 8. paizaレベルアップ問題を紐解く① 文字と整数の組のソート2 Ruby編
- 9. 僕も Ruby と Python で pagepank をやってみた
- 10. 【厳選】Railsで管理画面開発をする時のおすすめライブラリ集
- 11. 【Ruby】attr_accessorってなんや
- 12. && || & |の使い方
- 13. [py2rb] Ruby#Array -> Python#Tuple
- 14. [個人開発]コンビニ食品でダイエットできるサービスを作りました
- 15. ダークモード対応のsvg(favicon)を簡単に作れる「Hybrid SVG Maker」を作りました(技術編)【結局JS】
- 16. [py2rb] len(np.array(…).shape)
- 17. 【RSpec】テスト後に画像ファイルを削除したいとき
- 18. [Ruby]ありえない分岐には雑にraise NotImplementedErrorを置いておくと便利
- 19. 自作アプリ 作成 AccountActivationsリソース
- 20. 【Ruby】条件演算子
rubyでの正規表現問題の解説
rubyシルバーを勉強していくなかで、rubyの正規表現についてわからなかったので、解説していこうとおもいます。
今回は問題をもとにして、解説していこうとおもいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/73888b2b-db40-569c-ce28-830c28ad3642.png)
この問題を解く上で、必要になる知識が
➀破壊的メソッド
➁正規表現##➀破壊的メソッド
破壊的メソッドとは、オブジェクト自体を変更してしまうメソッドのことです。
破壊的メソッドがあるなら、非破壊的メソッドもあります。
言われてもピンとこないとおもいますので、この2つを比較しながら実際にコードを見ていきましょう“`
##非破壊的メソッド
string = ‘abcdefgh’
string.delete(‘a’)
=> “bcdefgh”
p string
=> “abcdefgh”##破壊的メソッド
string = ‘abcdefgh’
string.de
コードを書けない人が0からコードを書くための3ステップ
#今回の記事の想定
***⚫︎プログラミング学んだけど0からコードが書けない人***向けです。
下の動画をベースに記事を書いて行きます。#参考動画
この動画をベースに描いて行きます。#なぜ手が動かないか
理由は***いきなり大きなことをやろうとして何をしたらいか整理できていないことです***。これを解決するためには?
1.“`日本語でやりたい処理を言語化“`
2.“`言葉にしたことをコードに置き換える“`
3.“`小さく動かす“`
上の3つができれば書けるようになるみたいです。
#実際のコードでやってみる
動画もRubyでやっていますが自分もRubyでやって行きます。
まず以下の前提でコードを書いて行きます。“`rb
#次のFootball_playerクラス内にdataメソッドを追加し、期待する出力結果になるようにする
class Football
キレイなMonkeypatchを書きましょう!(Gemの内容を別のGemでMonkeypatchした話)
# RubyのMonkeypatchとは?
身近な言葉のモンキー・パンチ、ではなく、パッチですね。
MonkeypatchはRubyでクラス・モジュールを開いて、その一部・もしくは全部を書き換えるということです。
Rubyの最大の魅力点でもありながら、あまりやらない方がいいとも言われています。実はRailsに入っているActiveSupportというものがあって、その中にはMonkeypatchがいっぱい集まっています。
Twitter上でこれがいいことかどうかについて時々炎上しています。### Stringクラスで簡単な例
“`ruby
class String
def neko
replace “cat”
end
end
cat = “neko”
cat.neko
cat
# => “cat”module CatHelper
def neko
replace “neko”
end
endString.prepend CatHelper
cat = “neko”
cat.neko
cat
# => “neko”# String
更に Ruby で pagepank をやってみた
# はじめに
https://qiita.com/superrino130/items/e3fb622718f0e4c2cf1c前回の記事を投稿後、Ruby版networkxがあったので、更にやってみた。
https://rubygems.org/gems/networkx/versions/0.1.0?locale=ja
# 問題の整理[再掲]
ノード数`N`の有向グラフがある。
高橋くんはノード1からスタートして100回ランダムな遷移を行います。
遷移後、高橋くんがどのノードにいるかを答えてください。“`
入力
N M
A1 B1
.
.
.
Am Bm
“`
“`
入力例
5 7
1 2
1 3
2 4
3 4
3 5
4 5
5 1
“`
# Ruby版networkx
“`ruby
require_relative ‘./networkx_graph’
require_relative ‘./networkx_pagerank’n, m = gets.split.map(&:to_i)
g = NetworkX::Graph.new
m.times d
三項演算子で条件式が複数あるとき
##そもそも三項演算子とは?
if文が複数行にわたるとき、一行でそれを記述できるのが三項演算子です。“`
条件式 A ? Aがtrueのときに出力する値: Aがfalseのときに出力する値;
“`
が基本形です。実際に具体例を見ていきましょう。“`
a = 10
a > 10 ? ‘hoge’: ‘fuga’;
=> “fuga”
“`
aには10が格納されます。これは10より大きくはないので、falseです。つまり、fugaが出力されます。これをif文で書くとどうなるでしょうか?
“`
a = 10
if a > 10
puts ‘hoge’
else
puts ‘fuga’
end
=> “fuga”
“`
このように6行で書かれるものが、2行で書けるというのが三項演算子のスゴイところですね。##三項演算子の条件に複数あった場合はどうすればよいのか?
以下のようなコードがあるんです。“`
a = 条件式1 ? 条件式2 ? “A” : “B” : “C”;
“`
このとき、以下の表にまとめたものが役に立ちます。| 条件式1 | 条
オブジェクト指向とruby on rails
#はじめに
この記事ではオブジェクト指向とかruby on railsの関係を個人的に整理します。#オブジェクト指向
ググると以下のページがわかりやすかったです。
>[ロボットプログラミング教室](https://robo-done.com/blog/2021/04/doneship_object_oriented/#:~:text=%E3%80%8C%E3%81%82%E3%82%8B%E5%BD%B9%E5%89%B2%E3%82%92%E6%8C%81%E3%81%A3%E3%81%9F,%E3%82%92%E6%84%8F%E5%91%B3%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82)
>◆オブジェクト指向とは?
「ある役割を持ったモノ」ごとにクラス(プログラム全体の設計図)を分割し、モノとモノとの関係性を定義していくことでシステムを作り上げようとするシステム構成の考え方のこと。>・オブジェクト:直訳すれば「物」「対象」という意味。プログラミングにおいてはデータと処理の集まりを意味している。
integerを足し引きする方法【Rails】
レコードの値を足し引きするmethodを紹介します
テーブル構造
“`rb
create_table :tests do |t|
t.integer :score
end
“`### increment(足す)
“`rb
Test.first.score
-> 50# 50に20を足す
Test.first.increment(:score, 20)Test.first.score
-> 70
“`## decrement(引く)
“`rb
Test.first.score
-> 50# 50から20引く
Test.first.decrement(:score, 20)Test.first.score
-> 30
“`## まとめ
足す時は`increment` 引く時は`decrement`です
便利なmethodなので使う時があったら参考にしてみてください〜
paizaレベルアップ問題を紐解く① 文字と整数の組のソート2 Ruby編
#はじめに
現在積み上げ学習の一環として、paizaのレベルアップ問題に取り組んでいます。
今回は、連想配列に対してソートをするという実装につまづいたので備忘録としてまとめて見ます。#問題内容
問題内容は以下のとおりです。**文字と整数の組のソート**
「1行目に行数を表す整数 n、続く n 行の各行で「文字」と「整数」の組が空白区切りで入力されます。
n 個の組について、「文字」の値が同じ組同士の数値を足しあわせてまとめ、まとめた数値の降順で、文字とまとめた数値の組を出力してください。
この際、まとめた数値は重複しません。」**入力例**
7
A 1
D 6
C 2
G 4
B 70
A 10
B 5**出力例**
B 75
A 11
D 6
G 4
C 2問題文は以上です。
簡単に要約すると
「入力された値を、降順で並べ替える。(同じ文字の場合は数値を加算する)」という問題です。#つまづいてしまった要因
今回つまづいてしまった大きな要因としては、連想配列について知識が足りていなかったからです。
具体的には
・連想配列についての知識(格納の仕方、加算
僕も Ruby と Python で pagepank をやってみた
# はじめに
https://en.wikipedia.org/wiki/PageRank上記URLにあります、PythonのコードをRubyでやってみようと思います。
“`python:result.py
M = np.array([[0, 0, 0, 0, 1],
[0.5, 0, 0, 0, 0],
[0.5, 0, 0, 0, 0],
[0, 1, 0.5, 0, 0],
[0, 0, 0.5, 1, 0]])
v = pagerank(M, 100, 1)
print(v)# output
[[0.26658293]
[0.13322816]
[0.13322816]
[0.20009761]
[0.26686313]]
“`
ここでは、ダンピング・ファクターを`1`とします。
# 問題の整理(AtCoder風)
ノード数`N`の有向グラフがある。
高橋くんはノード1からスタートして100回ランダムな遷移を行います。
遷移後、高橋くんが
【厳選】Railsで管理画面開発をする時のおすすめライブラリ集
管理画面をさくっとつくる場面が増えてきました。
その際に高頻度で使うおすすめのライブラリをまとめてみました。
なので、便利だけど管理画面に限らず使われるようなものは省略します。
正直、オススメ上位は超ド定番です。# オススメ度: ★★★★★
## 【[ransack](https://github.com/activerecord-hackery/ransack)】 検索
検索を秒殺してくれるすぐれものです。有名すぎるので説明は不要ですが。。。
これ無しで検索をつくろうとすると、model層はかなり肥大化するのではないでしょうか。
まずは、ransackの機能で収まる範囲の検索をつくるのが吉だと思います。https://github.com/activerecord-hackery/ransack
## 【[kaminari](https://github.com/kaminari/kaminari)】 ページネーション
ページネーションをviewも含め簡単に実装できます。
ransackを入れるなら迷わず入れておきましょう。
bootstrapなどのUIフレームワークに
【Ruby】attr_accessorってなんや
#はじめに
物の本によると、「attr_accessor」とはインスタンス変数へのアクセスを可能にするメソッドだそうです。
いまいちピンとこなかったので、順を追って復習しました。
ちなみに「attr」は「attributive」という単語の短縮系のようです。
意味は「属性」や「性質」といった感じです。# インスタンス変数とは
そもそもの話です。
インスタンス変数とは、クラス内の全メソッドで共有できる変数のことです。
変数名に「@」をつけます。
原則として、クラスの外から操作することはできません。“`rb
#インスタンス変数は外部から呼び出せない
class User
def initialize(name) #インスタンス変数を定義
@name = name
end
enduser = User.new(‘taro’)
p user.name
# => undefined method ‘name’
“`外部から呼び出すには、呼び出すためだけのアクセサメソッドを作る必要があります。
“`ruby
class User
def initiali
&& || & |の使い方
##よく使われる&&と||の違い
この2つの違いは右辺が実行されるかどうかが重要なんです。
まず、&&演算子は左辺がtrueのとき、右辺が実行されるんです。
対して、||演算子は左辺がtrueのとき、右辺は実行されないんです。そして、最後に実行されたコードの値を返すんです
論より証拠ということで、実例を見ていきましょう##具体例
###&&
“`
If user_signed_in? && user.name == hoge
puts “fuga”
end
“`このコードでは&&が使われています。先ほども述べたように、&&は左辺がtrueなら右辺を実行します。
このコードでいえば、ユーザーがログイン中であるなら、左辺のuserインスタンスのnameがhogeであるかを調べるんです
そしてuser.name == hogeがfalseなら、falseが返ってきて、trueならfugaが返ってくるんです
user_signed_in?がfalseなら右辺のコードは実行されません
###||
“`
If user_signed_in? || user.nam
[py2rb] Ruby#Array -> Python#Tuple
# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# どうすRuby
`Ruby`の配列から、`Numpy.array`を作成します。“`ruby
dtype = [[‘score’, Numpy.int8], [‘label’, Numpy.str_, 1], [‘pep’, Numpy.float64], [‘is decoy’, Numpy.bool_]]
psms_ = Numpy.array(PSMS.map{ |s, l, p| [s, l, p, @is_decoy.call([s, l, p])] }, dtype: dtype)# error
RuntimeError: Wrapped undumpable exception for: PyCall::PyError:: Field elements must be 2- or 3-tuples, got ‘[‘score’, ]’
“`
`tuble`で渡せと。https:/
[個人開発]コンビニ食品でダイエットできるサービスを作りました
# はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702672/8be19d8c-bad9-5fa5-eb5b-6b8fed5ca043.png)普段みなさんはどれぐらいコンビニを利用しますか?
[ある統計](https://vropencafe.video-research.jp/figures/figureofmonth-29.html)では、1ヶ月に1回以上コンビニを利用する人は94.6%という結果が出ていました。最近は「たんぱく質が摂れる」といった、健康志向の高まりに合わせた食品が出ている印象を受けますね
中には、**「たんぱく質が摂れる食品を選べば痩せられる!」**という人もいるでしょう
ただ、みなさんご自身に適した摂取カロリーはご存知ですか?
健康的な食品を選択しても、ご自身のカロリーを上回る量を摂取していたら台無しです
そこで、**Macro Store(マクロストア)**というサービスを開発しました。
**※スマートフォン推奨**htt
ダークモード対応のsvg(favicon)を簡単に作れる「Hybrid SVG Maker」を作りました(技術編)【結局JS】
## きっかけ
先日、IEがお亡くなりになるのを期にし、ダークモード対応のSVGを作ろうと思い、[ライダーロゴメーカー](https://pexr.net/fonts/maker.html?font=KHONGO&text=%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%BC)というのを作る機会がありました。(ロゴメーカーを作りたいのではなく、faviconをやってみたいがためにロゴメーカーを作ったわけです。)
その時、ふと思ったのはこの作業はいずれ『**デザイナーとエンジニア(特にフロントエンド)との戦争になるなぁ**』と。
だた、それを見過ごすのも『ダサいなぁ』と思い[Hybrid SVG Maker](https://pexr.net/hsm/)なるものを作りました。こんな感じの↓ツールです。
![hsm.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1043424/add9f2fd-2dad-dd98-31cf-eafff8ab0056.gif)
[py2rb] len(np.array(…).shape)
# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# numpy (Python)
“`python
len(np.array(x).shape)
“`
配列の次元を取得します。
# どうすRuby
“`ruby
np.array(x).shape.sizeNoMethodError: undefined method `size’ for (3, 2):PyCall::Tuple
“`
`len`だから`size`と単純に変換するとエラーになります。
`PyCall`では、`Ruby`で直接取り扱えないオブジェクト?を`@__pyptr__`として保持します。“`ruby
np.array(x).shape.to_a.sizenp.array(x).mean(axis: 0).to_a # mean:平均 の例
“`
したがって必要に応じた変換を行います。
# メモ
+ Python の numpy を学習した
+ 百里を行く者は九十里を半ばとす
【RSpec】テスト後に画像ファイルを削除したいとき
CarrierWaveを使用していてRSpec実行した後のアップロードファイルを削除したいとき
下記を追記すればいいという記事をいくつか見かけた。“`spec/rails_helper.rb
config.after(:suite) do
FileUtils.rm_rf(“#{Rails.root}/public/uploads”) #←ファイルがアップされるパス指定
end
“`.gigtinoreにパスを追記するだけで上記は必要なくなる。
“`
public/uploads
“`
[Ruby]ありえない分岐には雑にraise NotImplementedErrorを置いておくと便利
下記の実装を見てください。
type1、またはtype2の2種類のタイプを持つhogeインスタンスがあり、タイプごとに処理を分岐しています。“`ruby
case
when hoge.type1?
# type1の処理
when hoge.type2?
# type2の処理
end
“`タイプが2種類なのでこの実装で問題はないのですが、私はこういう分岐のelseに`raise NotImplementedError`を書いておくことが多いです。
“`ruby
case
when hoge.type1?
# type1の処理
when hoge.type2?
# type2の処理
else
raise NotImplementedError
end
“`こうしておくと何が良いのか?
のちにtype3というタイプが増えたとします。
その時にtype3のテストパターンを追加すると思いますが、type3の場合はelseに入るためここを修正しないとテストが必ず落ちます。
最初の実装ではcase文がスルーされるのでテストの書き方次第ではここを修正しなくても
自作アプリ 作成 AccountActivationsリソース
“`
ubuntu:~/environment/my_app (account-activation) $ rails generate controller AccountActivations
Running via Spring preloader in process 7329
create app/controllers/account_activations_controller.rb
invoke erb
create app/views/account_activations
invoke test_unit
create test/controllers/account_activations_controller_test.rb
invoke helper
create app/helpers/account_activations_helper.rb
invoke test_unit
invoke assets
【Ruby】条件演算子
※初心者向け
※アウトプット練習の為
※学習の復習開発環境
rails 6.0.4.4
ruby 2.6.5##問題内容
3桁の正の整数を入力します。その整数の「百の位・十の位・一の位の和」について、
10の倍数(0,10,20,30…)からの差が
・2以内であるときは”True”
・それ以外は”10の倍数との差は○です”
と表示されるようにしましょう。**出力例:**
near_ten(117)→True
near_ten(123)→10の倍数との差は4です
near_ten(111)→10の倍数との差は3です
0も10の倍数に含むものとします。百の位・十の位・一の位の和が6などの時に、「10の倍数との差は6です」と出力せずに、「10の倍数との差は4です」と10の倍数から近い方の差を出力するようにしてください。
##解答
“`ruby
def near_ten(num)
total = (num/100) + (num/10 % 10) + (num % 10)
remainder = total % 10
if remainder <= 2