- 1. 【Ruby】freezeを使用してオブジェクトを凍結させる。
- 2. 【Ruby】nestingについて
- 3. [rails] graphql-rubyでどこが遅いのかわからない場合
- 4. Ruby と Python で解く TOTO くじ 削減
- 5. 【個人開発】ランダムでカラオケで歌う曲を決めてくれるサービス「PICKUP TRACK」をリリースしました!
- 6. 【個人開発】『書くこと(ジャーナリング)?』をもとに、感情の分析や習慣化サポートするアプリをリリースしました!!??
- 7. 新人がよくやる間違い(MVCの領域侵犯編)
- 8. 本日の基礎練習問題(22/3/19)
- 9. Better ErrorsとBinding_of_callerを導入する(Rails+Docker環境)
- 10. Ruby 3.1.1 インストール(Windws)+ AtomでRubyを実行する方法
- 11. LoadError: cannot load such file — coffee_scriptをRails.application.config.assets.precompile = []で対応しました。
- 12. Socket 通信の基本をメモる
- 13. deviseのログイン後、ログアウト後のリダイレクト先を設定する方法
- 14. cancancanのテストをRSpecで書く
- 15. Deviseで特定のステータスのユーザーにログインさせない方法とエラーの日本語化(Rails)
- 16. rails6 Bootstrapテンプレートでのエラー
- 17. 【Ruby】each_charメソッドについて
- 18. annotate_modelsを導入したのにアノテーションが動かなかった
- 19. rspecの導入手順 json コントローラテスト
- 20. バージョン指定で”rails new”したら”Gem::GemNotFoundException”でコケたとき用
【Ruby】freezeを使用してオブジェクトを凍結させる。
## freezeについて
Rubyにはfreezeというインスタンスメソッドがあるらしい。“` ruby
array = [“a”, “b”, “c”].freeze
array = array.map!{|content| content.succ}p array
“`“`
can’t modify frozen Array: [“a”, “b”, “c”] (FrozenError)
“`
このようになる。このfreezeメソッドを使用すると、オブジェクトを凍結させることができるらしい。
凍結 = 変更が効かなくなるらしい。だから、“array = [“a”, “b”, “c”].freeze“こうすることで配列を凍結することができる。
そのため、次の行の処理“array = array.map!{|content| content.succ}“はエラーとなる。### 参考
https://docs.ruby-lang.org/ja/latest/method/Object/i/freeze.html
【Ruby】nestingについて
nestingというものがあるらしい。
いつどんなときに使うのかわからない。“` ruby
module Gorira
module Saru
module Tanuki
p Module.nesting
end
end
end
“`
“`
[Gorira::Saru::Tanuki, Gorira::Saru, Gorira]
“`
このnestingを使用すると、クラス・モジュールのネスト情報を配列にして返してくれるらしい。なにで使うのかはわからない。笑
### 参考
https://docs.ruby-lang.org/ja/latest/method/Module/s/nesting.html
[rails] graphql-rubyでどこが遅いのかわからない場合
# 問題
graphqlを使ってると、model側で遅いのか?graphqlのタイプ側で遅いのか?更に階層が深いと検討がつきにくい。
# 解決
https://graphql-ruby.org/queries/tracing
公式ドキュメントには丁寧な説明がないけど、
https://thecodest.co/blog/graphql-ruby-what-about-performance
ここのブログでいい感じにログに出せるようなコードがあった。
`platform_trace`で実行時間を計算して`observe`に渡してるんで、そこでログに吐くなりできる。
“`rb:app_schema.rb
class MyCustomTracer < GraphQL::Tracing::PlatformTracing self.platform_keys = { "lex" => “graphql.lex”,
“parse” => “graphql.parse”,
“validate” => “graphql.validate”,
“a
Ruby と Python で解く TOTO くじ 削減
# はじめに
高橋君は、少ないお小遣いで`TOTOくじ`を楽しもうと思っています。
高橋君が楽しいとは、1等もしくは2等が当たることです。
高橋君が楽しむために最適な戦略を取った場合、合計金額の最小値を求めなさい。
# TOTOくじ
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%84%E6%8C%AF%E8%88%88%E3%81%8F%E3%81%98ここでは、組合せの少ない`totoGoal3`で計算を進めます。
https://www.toto-dream.com/toto/about/index.html
# 例1
一番シンプルな例は、3ダブルです。http://www.01senmonten.com/com/home/toto5.html
2の3乗なので本来8通り(800円)必要ですが、2通りで楽しめます。
“`rb:ruby
def check(i)
f = false
[‘000’.to_i(2), ‘111’.to_i(2)].each do |x|
f |
【個人開発】ランダムでカラオケで歌う曲を決めてくれるサービス「PICKUP TRACK」をリリースしました!
# はじめに
皆さんはカラオケに行った時、歌う曲に困った経験はありませんか?最近はこのご時世なのでなかなかカラオケにも行きづらい状況ですが、私自身そういったことがよくありました。
また、私は一緒に行った友人の歌を聴くのも好きなので少しでも歌う曲に悩む時間を減らしたいとも思っていました。そんな経験から自分と同じような悩みを持つ人に、よりカラオケを楽しんでもらいたいと思い、「PICKUP TRACK」を作成いたしました。
URL: https://pickup-track.com
GitHub: https://github.com/junjunpei/pickup_track
[](https://pickup-track.com)# サービス概要
※パソコン、スマホどちらからでも使用できますが、カラオケで使っていただくこと
【個人開発】『書くこと(ジャーナリング)?』をもとに、感情の分析や習慣化サポートするアプリをリリースしました!!??
# ? はじめに
『書くこと(ジャーナリング)』をデジタルで実現し,感情の分析や習慣化しやすいようにサポートするサービス【Mikke(ミッケ)習慣ジャーナリング】をリリース致しました。
本サービスへの概要や想いなどを書きましたので、よければ最後までご覧ください。:::note info
ジャーナリングとは…
「書く瞑想」とも呼ばれ, **頭に浮かんでいることを一定の時間内でただ紙に書いていく**というものです。
:::【サービスURL】
https://a-mikke.com# ? サービスを作った背景 / ✨ サービスに込めた想い
**自分の感情を言語化したり、思考の癖を理解することが苦手なこともあり、人と1対1で話すのが苦手でした。**ある本をきっかけに **『書くこと(ジャーナリング)』を毎日するよう
新人がよくやる間違い(MVCの領域侵犯編)
Railsを使ったアプリケーション制作を始めて2ヶ月ちょっと…。
こんな↓コードを書いていたら、先輩から「それはやばいよ」と指摘を受けました。
“`ruby
<% @users.each do |user| %>
user_type = UserType.find(user.type_id)<%= user %>
<%= user_type.type_name %>
<% end %>
“`なにがやばいのかわかりますか?
まあ、タイトルでネタバレしているのですぐわかってしまうと思うんですけど、**ViewでSQL文を書いている**んですね。端的に云うと、「それコントローラーでやれよ」ってことです。(さら言うとN+1問題も発生しているんですが、今回は割愛)
サンプルではリレーションのあるわかりやすい2つのモデルなので、コントローラーでらくらく書けるんですけど、
例えば直接的なリレーションのない2つのモデルを扱わないといけなかったり…
複雑な関係をもつ3~4つのモデルを同時に扱わないといけなかった
本日の基礎練習問題(22/3/19)
**問題**
以下の配列に任意の値が存在するかどうか、そして何番目に存在するのか、検索するコードを作成しましょう。
添字が0の要素、つまり以下の配列における「1」は「配列の0番目に存在する」と表現します。
“`
array=[1,3,5,6,9,10,13,20,26,31]
“`
任意の値が配列内に存在しない場合は、「値は配列内に存在しません」と表示し、
存在する場合は、配列の何番目にあるかを表示してください。
※配列の上限である32以上の値による検索は想定しないものとします。
検索はバイナリーサーチ(2分割検索)を使用して行います。ヒント
まず.lengthメソッドを使用して配列の要素数を取得し、変数number_of_elementsとします。
binary_searchメソッド内で配列の要素数を半分にしたものを変数centerとしましょう。
while文を使用して、当てはまるまで計算を繰り返します。出力例:
“`
検索したい数字を入力してください
5
5は配列の2番目に存在します
“`
“`
検索したい数字を入力してください
7
7は配列内に存在しません
`
Better ErrorsとBinding_of_callerを導入する(Rails+Docker環境)
## Better ErrorsとBinding_of_callerとは?
Railsのgemの一つでBetter_Errors gemを使うと便利で高機能なエラー画面が表示されます。
Binding_of_callerはブラウザ上でirbを使えるようになるgemです。
### Better Errorsとbinding_of_callerの導入
Gemfileに以下を記述します↓
“`Gemfile
group :development do
gem ‘better_errors’ #追加
gem ‘binding_of_caller’ #追加
end
“`次にdocker-compose buildでコンテナをビルドします。
“`
$ docker-compose build
“`**/config/environments/development.rb**に以下を追加します↓
“`
if Rails.env.development?
BetterErrors::Middleware.allow_ip! “0.0.0.0/0”
e
Ruby 3.1.1 インストール(Windws)+ AtomでRubyを実行する方法
Rubyの現時点(2022/3/19)での最新版を入れる機会があったのでメモ。
Atomの拡張機能「atom-runner」のインストール手順も記載。# 端末とかRubyのバージョンとか
– Windows 10 64bit
– Ruby 3.1.1
– 因みに、WindowsでRails開発を行うならWSL上で構築したほうがよい(らしい)# Rubyインストール
### ダウンロードページ
[Downloads (rubyinstaller.org)](https://rubyinstaller.org/downloads/)
64bit版をダウンロード
※ 純粋にRubyだけを実行する場合は、**WITHOUT DEVKIT** の方でよかったらしい。
### rubyinstaller-devkit-3.1.1-1-x64.
LoadError: cannot load such file — coffee_scriptをRails.application.config.assets.precompile = []で対応しました。
# LoadError: cannot load such file — coffee_script
## 概要
Herokuへのアップロードをした時に、下記エラーが発生しました。
ログを見てみますと、を`LoadError: cannot load such file — coffee_script`が発生しております。“`bash
remote: —–> Preparing app for Rails asset pipeline
remote: Running: rake assets:precompile
remote: rake aborted!
remote: LoadError: cannot load such file — coffee_script
remote: /tmp/build_17b86f88/vendor/bundle/ruby/2.6.0/gems/activesupport-6.1.5/lib/active_support/dependencies.rb:332:in `re
Socket 通信の基本をメモる
Rubyの自作非同期タスクスケジューラーを作るにあたり、ネットワーク通信、特にソケットについて理解を深めておきたいと考えた。
経験上まずは手を動かしてみるのがベストだと考えている。以下の素晴らしい記事が見つかったので自分でもやってみる。
https://qiita.com/MikuriyaHiroshi/items/b0a40f5e7b7be1ef327c
手を動かした中で個人的にメモっておきたいところを残す。
## Socketとは
Socketは、ネットワークはプログラムが外部のネットワークと通信する際のインターフェイスとして使われるもの。ファイルとして抽象化される。
## Socket通信の種類の例
– インターネット通信
– UDP (dgram型)
– TCP (stream型)
– プロセス間通信(UNIX domain socket通信)
– UNIX domain socket dgram (dgram型)
– UNIX domain socket stream (stream型)dgramとs
deviseのログイン後、ログアウト後のリダイレクト先を設定する方法
# 環境
Ruby 3.0.2
Rails 7.0.2.3# コード
“`ruby: app/controllers/application_controller.rb
class ApplicationController < ActionController::Base private # ログイン後のリダイレクト先 def after_sign_in_path_for(resource_or_scope) root_path #ここを好きなパスに変更 end # ログアウト後のリダイレクト先 def after_sign_out_path_for(resource_or_scope) new_user_session_path #ここを好きなパスに変更 end end ``` これだけです。 # 余談 ログアウト後の遷移先は設定必要だと思いますが、 ログイン後の遷移先は、例のように `root_path`にするならば、そもそも `config/routes.rb`で設定してあるので不要だと思います。 ```r
cancancanのテストをRSpecで書く
cancancanを使った際、テストに学びがあったので投稿します。
# 前提:cancancanとは
権限による制御が簡単にできるgemです。
– [cancancan](https://github.com/CanCanCommunity/cancancan)
– [Rails|CanCanCanの使い方解説](https://weseek.co.jp/tech/1211/)
↓私も1つ記事を書きました。
– [cancancanでモデル名に紐づかない制御をする方法](https://qiita.com/m-ito27/items/784f22bec151cc2f1e28)# cancancanのテスト
requestスペックなどで特定の権限が各アクションを実行できるかどうかをテストする方法もあると思いますが、今回はcancancanが用意しているmatcherを使ってテストする方法を紹介します。– 参考
https://github.com/CanCanCommunity/cancancan/blob/develop/docs/testing.md“`ruby:a
Deviseで特定のステータスのユーザーにログインさせない方法とエラーの日本語化(Rails)
Deviseを使っていたRailsアプリケーションで、ログイン情報としてIDとパスワードとは別に、**特定の条件をユーザーが満たす場合にそのユーザーのログインを許可したくない**場面があり、その際の制御と日本語表示を学んだので備忘として記載します。
# やりたいこと
ユーザーはメールとパスワードでログイン可否の認証を行なっている。
しかしながら、ユーザーテーブルにはロック状態かどうかを判定するカラムがあり、ユーザーがロックされている場合にはログインさせたくない。
また、エラーメッセージを日本語化したい。## 1. ユーザーにログインさせない方法
結論:Deviseが用意している[`active_for_authentication?`メソッド](https://github.com/heartcombo/devise/wiki/How-To:-Customize-user-account-status-validation-when-logging-in) を使う
“`ruby:user.rb
def active_for_authentication?
super &
rails6 Bootstrapテンプレートでのエラー
こちらは、私がBootstrapのテンプレートを使用した時につまづいたエラーについて紹介します。
# 環境
ruby 3.0.2
rails 6.1.4
bootstrap 5.0.0-beta3
popperjs 2.10.2
webpacker 5.0# エラー内容
bootstrpのテンプレートをインストールし、ダウンロードしたフォルダやファイルを自分のアプリに組み込んでいきます。
その時に、stylesheetsフォルダーに必要なcssやscssのファイルも一緒に移行しました。
そして、ローカルにアクセスして見たところ、
“`
Sprockets::DoubleLinkError
“`
こちらは、「同じ出力パスを持つ複数のファイルをリンクできない」というエラーのようでした。# つまづいたポイント
Rails6からwebpackerがデフォルトでインストールされるようになりました。
webpackerでは、cssファイルではなくscssファイルを使用することでスタイルの編集が可能になります。
なので、stylesheetsフォルダー中にcssファイルかscssファイ
【Ruby】each_charメソッドについて
## each_charメソッドについて
“`ruby
“hello世界”.each_char {|c| print c, ‘ ‘ }
“`
“`
h e l l o 世 界
“`
このように表示されるらしい。### 参考
https://docs.ruby-lang.org/ja/latest/method/String/i/each_char.html
annotate_modelsを導入したのにアノテーションが動かなかった
# 環境
Ruby 3.0.2
Rails 7.0.2.3# Annotate models
モデルファイルなどに、↓のようなマイグレーションの内容を自動で書いてくれるツール
“`ruby
# == Schema Info
#
# Table name: line_items
#
# id :integer(11) not null, primary key
# quantity :integer(11) not null
# product_id :integer(11) not null
# unit_price :float
# order_id :integer(11)
#class LineItem < ActiveRecord::Base belongs_to :product . . . ``` [ここ](https://github.com/ctran/annotate_models#install)を参考
rspecの導入手順 json コントローラテスト
## 序文
RSpecを初めて使ってみましたので手順を残します。
## Gemfileにrspecを入れましょう
“`
group :development do
gem ‘rspec-rails’
end“`
## specファイルを作りましょう
“`
rails g rspec:controller the_dog“`
## テスト環境設定
テスト環境の設定ができているか見直しましょう
例)
– config/database.ymlにテスト用のDBを指定
– config/test.yml.encの追加
– config/settings/test.yml
– rails db:environment:set RAILS_ENV=test“`
require ‘rails_helper’RSpec.describe Api::V1::TheDogController do # コントローラ名
render_views
describe “GET /index” do
it do
request.env[“
バージョン指定で”rails new”したら”Gem::GemNotFoundException”でコケたとき用
# そもそも
– 現場Railsの3章、”taskleaf”アプリケーションの準備段階で躓く(バージョン指定でnewが出来ず)
– バージョン指定での”rails new”以外の方法があるっぽいので実践してみたログ# 手順
#### アプリのディレクトリを作成する
“`
mkdir hoge
“`#### ディレクトリに移動
“`
cd hoge
“`#### bundle initする
– (これ要るのか?要調査)
“`
bundle init
“`#### できたGemfileにRailsのバージョンを書き込む
“`rb:Gemfile
gem “rails”, ‘5.2.1’
“`#### bundle installする
“`
bundle install
“`#### Rails new(質問にはYで答える)
“`
$ rails _5.2.1_ new . -d postgresql –skip-bundle
“`#### Gemfileのsass-railsのバージョン指定を外す
– 次にbundle installす