- 投稿日:2020-02-14T23:49:57+09:00
 
rbenvの新環境にgemをインストールしようとしてもパスがシステムのもののままになっている場合の対処法
- 投稿日:2020-02-14T22:42:29+09:00
 
fish3.1.0でpyenvの初期化失敗の対処方法
tl;dr
~/.config/fish/config.fishのpyenv(rbenv)の行を以下の用に変更すると問題が起きなくなります。before
. (pyenv init - | psub) . (rbenv init - | psub)after
source (pyenv init - | psub) source (rbenv init - | psub)発生する問題
fish3.0.2までは
.コマンドを使うことができたのですが、どうやら fish3.1.0から使うことができなくなったようです。
これは元から予告されていたこと ではありますが、. (a single period) is an alias for the source command. The use of . is deprecated in favour of source, and . will be removed in a future version of fish.ついになくなってしまったんですね(泣)
bash系のコマンドを使っていたり、
.コマンドをなんとなく使っていたという方はこれを機に設定ファイルを見直す必要があります。pyenv(rbenv)の初期化の構文でも
.コマンドを使うことが一般的ですが、fish3.1.0で動かすと以下のようにエラーメッセージが発生してしまいます。source: Error encountered while sourcing file '/var/folders/yv/0npp741974sgp79671hf_48c0000gn/T//.psub.pxGqFIeIaF': source: No such file or directory source: Error encountered while sourcing file '/var/folders/yv/0npp741974sgp79671hf_48c0000gn/T//.psub.VyHOD74WrY': source: No such file or directory終わりに
このようなエラーが出たら冒頭で紹介した通り、
sourceコマンドを使うようにすれば問題なく動くようになります。
僕も今朝この問題に悩まされたので、他に困っている方がいたら参考にしてください〜〜
- 投稿日:2020-02-14T22:05:52+09:00
 
RubyでS3内の5GB以上のファイルをコピーする
S3で5GB以上のファイルをコピーするには、普通のコピーでは出来ずMultipart Copyを使う必要があります。
RailsサーバからS3内の5GB以上のファイルを同じS3内にコピーする記事が無かったのでやり方を書きます。gemのインストール
gem 'aws-sdk'コピー処理
Aws::S3::Resourceのcopy_toを使用します。
Aws::S3::Clientのcopy_objectだと恐らくMultipart Copyが出来ません。s3 = Aws::S3::Resource.new( region: 'reagion_name', access_key_id: 'access_key', secret_access_key: 'secret_key', ) bucket = s3.bucket('bucket_name') object = bucket.object("src/file") # コピー元のobject key object.copy_to(bucket: 'bucket_name', key: "target/file", multipart_copy: true) # コピー先のobject key参考
https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Object.html
- 投稿日:2020-02-14T18:36:16+09:00
 
RailsでFontAwesomeの導入〜大きさを変えるまで
はじめに
railsでFontAwesomeを使いたいと思い調べていたところ、
大きさまで変える記事が見当たらなかったため投稿してみました。実行環境
Ruby : 2.6.3
Rails : 5.2.4
slim : 4.0.1
font-awesome-sass : 5.12.0
上記の環境で実装いたしました。FontAwesomeの導入
Gemfileに以下を記述
Gemfilegem 'font-awesome-sass'gemをインストール
bundle install/app/assets/stylesheets/application.css
を
/app/assets/stylesheets/application.scss
に変更するmv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss/app/assets/stylesheets/application.scssに以下を記述
application.scss@import "font-awesome-sprockets"; @import "font-awesome";上記の順番通りに記述したことで、FontAwesomeが使えるようになった。
実行結果
font-awesome-sassがインストールされたことにより、ヘルパーメソッドが使えるようになりました。
このメソッドを使うことでアイコンを表示させます。~.html.slim= link_to "#" do = icon 'fab', 'amazon-pay'これでアイコンが表示されました。
今回使用したアイコン大きさを変更する
上記で用いたヘルパーメソッドを用いることによって好みの大きさに変更することも可能です。
~.html.slim= link_to "#" do = icon 'fab', 'amazon-pay fa-3x'このメソッドは次のように構成されています。
icon 'スタイル名', 'アイコン名 (大きさ指定)'大きさの指定をしない場合は、アイコン名のみを記述し、
大きさ指定をする場合は、アイコン名の後にスペースをあけ、'fa-(サイズ)'で好きな大きさに変更することができます。サイズに関しては公式サイトをご覧ください。
Font Awesome最後に
初めて記事を投稿してみました。
分かりやすい記事になったかは不安ですが、誰かの助けになれば幸いです。
- 投稿日:2020-02-14T17:57:56+09:00
 
Middleman ローカル環境の立ち上げ方 流れ
- 投稿日:2020-02-14T16:28:31+09:00
 
renderメソッドについて
初めまして、久保雄貴と申します。
今回はrenderメソッドについて自分が知ったことについて書いてみようと思います。
間違っている点や「こういう風に書いたらいいよ」などアドバイスがありましたら、コメントください。renderメソッドについて
1. レンダリングとは?
renderメソッドについて記述する前に、レンダリングという言葉について説明します。
レンダリングとは、ビューファイルから最終的にHTMLにコンパイルされたものをブラウザで読み込んで表示させる一連の流れのことを言います。ビューファイルにはコードが書かれていますが、ただ文字列が並んでいるだけでそのまま表示してもただ文字が表示されるだけです。
しかし各ブラウザが、そのコードを読んでそのコード通りに表示画面を作成して表示してくれているのです。ここで重要なのは、Ruby on Railsでは、コントローラーでアクションを起動して一連の動作を行った後、コントローラーと同じ名前のビューファイルを自動的にレンダリングしてくれるということです。
こちらで何か指示を書く必要はありません。createアクションを起動
↓
メソッド内の命令を実行(自分で記述)
↓
create.html.erbをレンダリング(自動でするよう定義されている)2. renderメソッドとは?
renderメソッドとは、レンダリングする元のビューファイルを直接指定することができるメソッドです。
さて、復習ですが、Lesson7の作業中に「render」というメソッドを使いましたね。
何をしたかというと、
① 違うファイル(index.html.erb と show.html.erb)に書かれている全く同じコード切り取る。
② 新しく作ったファイルにペーストする。
③ 使いたいファイルの中でrenderメソッドを使って呼び出す。というものでした。(部分テンプレートの実装)
renderメソッドを使うことで、指定した別のビューファイルを読み込んで実行してくれるわけです。
メリットとしては、同じコードを別のビューファイル(index.html.erb や show.html.erbとも違う)でも使用できることです。
その時の書き方は
<% render partial: "post", locals:{post: post}%> でした。
partial: → 部分テンプレートのファイル名を指定する
locals: → 部分テンプレートのファイルで使用したい変数を定義する(左側のpost)
しかし、renderメソッドはオプションを使うことでこの他にも使い方があるようです。
その一つが
render action: :アクション名
です。例えば、トップページに行って欲しい場合、
render action: :indexと記述します。
どういう時に使うかというと、
上に書いた通りRailsではデフォルトで、コントローラーと同じ名前のビューファイルをレンダリングしてくれるのですが、それをさせずに、こちらで指定した別のビューファイルを指定してレンダリングさせるように設定したい時です。例えば、投稿フォーム(new.html.erb)のページで「タイトル」と「内容」を書いて、投稿ボタンを押すと、「投稿が完了しました。」と表示する、投稿完了ページ(create.html.erb)が表示されますね。
そうではなくて、トップページを表示したい時に使います。どこに記述するかというと、コントローラー内のcreateアクションが定義されているところです。
このように記述するとcreateアクション内で、データベースに投稿内容が保存された後にトップページを表示してくれます。
3. 疑問
さて、ピンときている方もいらっしゃるかもしれませんが、私たちは、すでに自動的にレンダリングをさせずに、トップページを表示させる方法を学んでいます。
redirect_toメソッドです。
redirect_to '/' (もしくは root_path)と記述するとトップページを表示してくれます。
ここで疑問です。
redirect_to メソッド render action: メソッドを使うと、それぞれどのような動き、結果になるのでしょうか。
4. 実験
今回は、以下のようにcreateアクション内に両方を記述して、動きを見てみましょう。
def create Post.create(post_params) redirect_to root_path enddef create Post.create(post_params) render action: :index end
- redirect_to メソッドの場合
 
1. postscontrollerのcreateアクション内に記述
- render action: メソッドの場合
 
1. postscontrollerのcreateアクション内に記述
内容は、
「eachメソッドを起動しようとしたら、インスタンス変数@postの中身がnilになっていて使えません。」
ということです。ここで、index.html.erbを見てみましょう。
確かに、@postの中身をeachメソッドを使って内容を表示させてますね。
ではこの@postはどこで定義されているかというと、def index @post = Post.all endここです。
postscontrollerのindexアクション内です。
5. 4.の実験でわかったこと
redirect_toメソッド
ルーティングにリクエストを送り、postsコントローラーのindexアクションを起動させるため、@postの中にデータベースの内容がコピーされる。その後、index.html.erbがレンダリングされる。
結果として、トップページが表示される。render action: :index
ルーティングを介さずに直接index.html.erbを指定してレンダリングするため、index.html.erb内の@postの中身がからのままになっている。(@postに渡すインスタンス変数をcreateアクションが持っていない。)
結果として、エラーが表示される。6. 結論
render action:メソッドでトップページを表示させることはできるが、トップページの内容が書かれた、ビューファイル(index.html.erb)にインスタンス変数がある場合はそのインスタンス変数をなんとかしてあげないと、エラーが起こる。
何か特別な事情がない限りredirect_toを使った方がいいのかな?と思いました。何か、特別な恩恵をうける場面があれば教えてもらえると勉強になります。
P.S.
ちなみに、こうすると、トップページを表示できます。
無駄な記述ですね。
ということで、初投稿は以上です。
ありがとうございました。<参考>
- 投稿日:2020-02-14T16:22:25+09:00
 
RSpecでFactoryBotから複数のインスタンスをまとめて作成する【create_listを使用】
RSpecテストを書いているときに、複数のインスタンスをまとめて作れる便利メソッド
create_listをご紹介します。
例えば下記のように
noteのファクトリが定義されているとします。factory/notes.rbFactoryBot.define do factory :note do title { 'sample-note' } description { 'sample-description' } end endテストで
noteインスタンスを5つ作りたいと思ったとき、下記のように1つずつ作るのは大変です。spec/system/xxx_spec.rbRSpec.describe 'yyyy' do let(:note1) { create(:note) } let(:note2) { create(:note) } let(:note3) { create(:note) } let(:note4) { create(:note) } let(:note5) { create(:note) } ... endここで登場するのが
create_listです。
これを使えば、まとめてnoteインスタンスを作成することが可能です。spec/system/xxx_spec.rbRSpec.describe 'yyyy' do notes = create_list(:note, 5) ... end第1引数に元になるファクトリ、第2引数に作成する数を指定します。
(notes =の部分は無くても可)ちなみに属性の一部を上書きして作成することも可能です(下記参照)。
spec/system/xxx_spec.rbRSpec.describe 'yyyy' do notes = create_list(:note, 5, title: 'Hello, World') ... end
以上です。
- 投稿日:2020-02-14T16:11:39+09:00
 
Middlemanでコマンド 打っていたらiTerm2が止まった
$ bundle exec middleman server
== The Middleman is loadingここまで来て、止まりました。5分くらいこのまんま。
他はサクサク動いていたのに。Middleman関連ではない時にコマンドを使っていたときもこんなことがあったので、おそらく私の使っているパソコンが遅いからだと思います。
早くパソコン新しいのに買えましょう・・・・・。高いw
- 投稿日:2020-02-14T11:59:32+09:00
 
【Rails】Modelで定義した定数に他クラスやViewからアクセスする方法
表題の通り、定数にアクセスできずに困った人のための記事です。
結論
Model名::定数名とすればOKです。
解説
下記のUserクラスがあるとします。
models/user.rbclass User < ActiveRecord::Base MAX_NUMBER = 10 ... endViewから参照するには、下記のようにします。
views/xxx.html.erb最大値は#{User::MAX_NUMBER}です。
これが下記のようになっていると、views/xxx.html.erb最大値は#{MAX_NUMBER}です。↓
uninitialized constant ActionView::CompiledTemplates::MAX_NUMBERそんな定数は無いと怒られてしまいます。
以上です!
- 投稿日:2020-02-14T11:59:32+09:00
 
【Rails】Modelで定義した定数にViewからアクセスする方法
表題の通り、定数にアクセスできずに困った人のための記事です。
結論
Model名::定数名とすればOKです。
解説
下記のUserクラスがあるとします。
models/user.rbclass User < ActiveRecord::Base MAX_NUMBER = 10 ... endViewから参照するには、下記のようにします。
views/xxx.html.erb最大値は#{User::MAX_NUMBER}です。
これが下記のようになっていると、views/xxx.html.erb最大値は#{MAX_NUMBER}です。↓
uninitialized constant ActionView::CompiledTemplates::MAX_NUMBERそんな定数は無いと怒られてしまいます。
以上です!
- 投稿日:2020-02-14T11:52:35+09:00
 
ActiveRecordのトランザクションのネストに気をつけること
- 確認した環境
 
- Ruby 2.5.1
 - Rails 5.2.1
 - MySQL 5.7.27
 腕試しに以下のスクリプトを実行した場合、最終行の
User.first.nameは何が得られるか考えてみてください.User.first.update!(name: 'Alice') ActiveRecord::Base.transaction do User.first.update!(name: 'Bob') ActiveRecord::Base.transaction do User.first.update!(name: 'Carol') raise ActiveRecord::Rollback end end User.first.name
正解はここをクリック
User.first.nameの結果は Carol になります.
正解しましたか?
正解する人もいると思いますが直感と違うかと思います.
TL;DR
- 可能ならトランザクションをネストしない設計する
 - トランザクションをネストする設計の際は
 requires_new: trueを使う
- 付けないと思いのよらないゴミができる可能性がある
 検証
分かりやすくするため、SQLをコメントに加えました.
User.first.update!(name: 'Alice') # BEGIN # UPDATE `users` SET `name` = 'Alice' WHERE `users`.`id` = 1 # COMMIT ActiveRecord::Base.transaction do # BEGIN User.first.update!(name: 'Bob') # UPDATE `users` SET `name` = 'Bob' WHERE `users`.`id` = 1 ActiveRecord::Base.transaction do User.first.update!(name: 'Carol') # UPDATE `users` SET `name` = 'Carol' WHERE `users`.`id` = 1 raise ActiveRecord::Rollback end end # COMMIT User.first.name # => 'Carol'requires_new を使った場合
いくつかのRDBにはトランザクションにSAVEPOINTをサポートしているものがあります.
このSAVEPOINTを利用するにはrequires_newを指定することで有効になり直感に近い挙動をする様になります.User.first.update!(name: 'Alice') # BEGIN # UPDATE `users` SET `name` = 'Alice' WHERE `users`.`id` = 1 # COMMIT ActiveRecord::Base.transaction do # BEGIN User.first.update!(name: 'Bob') # UPDATE `users` SET `name` = 'Bob' WHERE `users`.`id` = 1 ActiveRecord::Base.transaction(requires_new: true) do # SAVEPOINT active_record_1 User.first.update!(name: 'Carol') # UPDATE `users` SET `name` = 'Carol' WHERE `users`.`id` = 1 raise ActiveRecord::Rollback end # ROLLBACK TO SAVEPOINT active_record_1 end # COMMIT User.first.name # => 'Carol'
- 投稿日:2020-02-14T11:15:45+09:00
 
ルーティングを設定してCSVデータをダウンロードする方法
目的
- Qiitaの記事に大まかな流れをテンプレート化しておき、作業効率を上げる。
 - 今までの実装では
 send_dataしか使ったことなかったのでメモ前提条件
- ruby 2.6.0
 - ruby 5.2.2
 手順
- routes.rbにCSVダウンロード用のルーティングを設定する
 - コントローラーに変数を定義、その他諸々を設定
 - 出力データを作成(アクション名.csv.ruby)
 - CSVダウンロードボタンを設定したいviewファイルに書く
 ※コード内容は適当
1. routes.rbにCSVダウンロード用のルーティングを設定する
config/routes.rbresources :card_infos do collection do # デフォルト形式をcsvに設定 get :csv_download, defaults: { format: 'csv' } end end
Helper HTTP Verb Path Controller#Action csv_download_card_infos_path GET /card_infos/csv_download(.:format) card_infos#csv_download {:format=>"csv"} 2. コントローラーに変数を定義やその他諸々を設定
app/controllers/card_infos_controller.rbclass CardInfosController < ApplicationController def csv_download @cards = CardInfo.all # CSVダウンロードファイルのヘッダーを生成する create_csv_file_header("card_info_#{ Time.zone.now.strftime('%Y%m%d') }") end end共通化メソッド# CSVダウンロードファイルのヘッダーを生成する def create_csv_file_header(file_name) file_name = ERB::Util.url_encode(file_name) if (/MSIE/ =~ request.user_agent) || (/Trident/ =~ request.user_agent) headers['Content-Disposition'] = "attachment; filename=\"#{file_name}.csv\"" end3. 出力データを作成(アクション名.csv.ruby)
※viewディレクトリ配下に設置する
app/views/card_infos/csv_download.csv.rubyrequire 'csv' columns = %w( 番号 会社 子会社 カード種類 カード会社 管理区分 ) # encoding等のoptionは仕様によって変えてください CSV.generate(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true) do |csv| csv << columns @cards.each_with_index do |card, number| csv << [ number + 1, card.company.parent_company.company_name, card.company.company_name, card.card_type.card_type_i18n, card.card_type.card_company.card_company_name, card.management_type_i18n, ] end end4. CSVダウンロードボタンを設定したいviewファイルに書く
(例)app/views/card_infos/index.html.erb<%= link_to csv_download_card_infos_path, class: "btn_blue btn_big csv_dl", download:"", style: "padding: 8px 25px; font-family: Arial;" ) do %> <i><img src="<%= asset_path 'icon_download.svg' %>" alt="CSVダウンロード"></i>CSVダウンロード <% end %>??変更するファイル
. ├── app | ├── controllers | | | | | └── card_infos_controller.rb ②アクションを設定 | | | | | | | └── views | | | └── card_infos | | | └── csv_download.csv.ruby ③出力ファイルを設定 | | ├── config | | └── routes.rb ①ルーティングを設定 ④ViewファイルにCSVダウンロードボタンを設置関連URL
- 投稿日:2020-02-14T11:15:45+09:00
 
ルーティングを設定してCSVデータのダウンロード(出力)を実装する方法
目的
- Qiitaの記事に大まかな流れをテンプレート化しておき、作業効率を上げる。
 - 今までの実装では
 send_dataしか使ったことなかったのでメモ前提条件
- ruby 2.6.0
 - ruby 5.2.2
 手順
- routes.rbにCSVダウンロード用のルーティングを設定する
 - コントローラーに変数を定義、その他諸々を設定
 - 出力データを作成(アクション名.csv.ruby)
 - CSVダウンロードボタンを設定したいviewファイルに書く
 ※コード内容は適当
1. routes.rbにCSVダウンロード用のルーティングを設定する
config/routes.rbresources :card_infos do collection do # デフォルト形式をcsvに設定 get :csv_download, defaults: { format: 'csv' } end end
Helper HTTP Verb Path Controller#Action csv_download_card_infos_path GET /card_infos/csv_download(.:format) card_infos#csv_download {:format=>"csv"} 2. コントローラーに変数を定義やその他諸々を設定
app/controllers/card_infos_controller.rbclass CardInfosController < ApplicationController def csv_download @cards = CardInfo.all # CSVダウンロードファイルのヘッダーを生成する create_csv_file_header("card_info_#{ Time.zone.now.strftime('%Y%m%d') }") end end共通化メソッド# CSVダウンロードファイルのヘッダーを生成する def create_csv_file_header(file_name) file_name = ERB::Util.url_encode(file_name) if (/MSIE/ =~ request.user_agent) || (/Trident/ =~ request.user_agent) headers['Content-Disposition'] = "attachment; filename=\"#{file_name}.csv\"" end3. 出力データを作成(アクション名.csv.ruby)
※viewディレクトリ配下に設置する
app/views/card_infos/csv_download.csv.rubyrequire 'csv' columns = %w( 番号 会社 子会社 カード種類 カード会社 管理区分 ) # encoding等のoptionは仕様によって変えてください CSV.generate(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true) do |csv| csv << columns @cards.each_with_index do |card, number| csv << [ number + 1, card.company.parent_company.company_name, card.company.company_name, card.card_type.card_type_i18n, card.card_type.card_company.card_company_name, card.management_type_i18n, ] end end4. CSVダウンロードボタンを設定したいviewファイルに書く
(例)app/views/card_infos/index.html.erb<%= link_to csv_download_card_infos_path, class: "btn_blue btn_big csv_dl", download:"", style: "padding: 8px 25px; font-family: Arial;" ) do %> <i><img src="<%= asset_path 'icon_download.svg' %>" alt="CSVダウンロード"></i>CSVダウンロード <% end %>??変更するファイル
. ├── app | ├── controllers | | | | | └── card_infos_controller.rb ②アクションを設定 | | | | | | | └── views | | | └── card_infos | | | └── csv_download.csv.ruby ③出力ファイルを設定 | | ├── config | | └── routes.rb ①ルーティングを設定 ④ViewファイルにCSVダウンロードボタンを設置関連URL
- 投稿日:2020-02-14T11:08:59+09:00
 
[Rails] scriptタグ内でRuby/Railsのメソッドを使用する際のescape_javascriptについて
この記事を書くきっかけ
jQueryを書いていると、scriptタグ内でRailsのメソッド(正確にはapplication_helper内のメソッド)を使用したいときがあります。
正しい書き方をしないと正確に呼び出せないため、失敗した書き方と成功した書き方をまとめます。前提
current_userの属性によってpathを切り替えるメソッドを
def hogehoge_path_forとし、application_helper.rbに定義します。application_helper.rbdef hogehoge_path_for if ... hoge_path else hogehoge_path end endこれをとあるviewのscriptタグ内で呼び出します。
let path = hogehoge_path_forの返り値
としたいです。失敗例1
あるview<script> let path = <% hogehoge_path_for %>; </script>普通はこう考えるはずですが、これだと呼び出せません。
失敗例2
あるview<script> let path = <% hogehoge_path_for %>; </script>これも呼び出せません。
失敗例3
escape_javascriptというメソッドを使用します。
なお、これはaliasとしてjの使用が許されています。あるview<script> let path = <% escape_javascript hogehoge_path_for %>; </script>上記は下記と同じです。
あるview<script> let path = <% j hogehoge_path_for %>; </script>どちらも失敗します。
失敗例4
=をつけます。
あるview<script> let path = <%= escape_javascript hogehoge_path_for %>; </script>上記は下記と同じです。
あるview<script> let path = <%= j hogehoge_path_for %>; </script>これもどちらも失敗します。
失敗例5
=を外して、
''で囲います。あるview<script> let path = '<% escape_javascript hogehoge_path_for %>'; </script>上記は下記と同じです。
あるview<script> let path = '<% j hogehoge_path_for %>'; </script>これもどちらも失敗します。
成功例
=をつけて''で囲います!あるview<script> let path = '<%= escape_javascript hogehoge_path_for %>'; </script>上記は下記と同じです。
あるview<script> let path = '<%= j hogehoge_path_for %>'; </script>
これで無事呼び出すことができました。
- 投稿日:2020-02-14T10:18:56+09:00
 
Ruby コーティング規約について コレクション編 1
はじめに
命名規則編 2 はこちらをクリック願います。
レイアウト編 3 はこちらをクリック願います。過去記事リンクあり。
構文編 2 はこちらをクリック願います。過去記事リンクあり。
Rubyの基礎を学習中の方に向けて記載致します。
私自身これからチーム開発を行う上で大事にしたい。知っておきたいことをOutputします。① 配列やハッシュを生成する時はリテラル記法を使う。
qiita.rb# 悪い例 arr = Array.new hash = Hash.new # 良い例 arr = [] arr = Array.new(10) hash = {} hash = Hash.new(0)単語(空でなく、スペースを含まない文字列)の配列を生成する時は %wリテラルを使う。
※ 配列の要素が2つ以上の場合に限り。
qiita.rb# 悪い例 STATES = ['draft', 'open', 'closed'] # 良い例 STATES = %w[draft open closed]さいごに
毎日更新します。
皆様の復習等にご活用頂けますと幸いです。
- 投稿日:2020-02-14T09:01:04+09:00
 
Ruby初心者の「結局インスタンスメソッドって何ですか?」にエンジニア歴30年のベテランさん超絶わかりやすいアンサー!!!
結論
インスタンスメソッドとは:インスタンスが(に)使えるメソッド(にくっつくメソッド)
助詞に関しては、インスタンスを主語として考えるか目的語として考えるかの違いです。図で表すとこんな感じ
インスタンスはいわゆる勇者。その勇者の剣がメソッド。つまり「勇者の剣」=インスタンスメソッドなわけだ!
僕の誤解を招いた表現その1
インスタンスメソッドとはインスタンスを含む変数である。*間違い
僕の誤解を招いた表現その2
インスタンス変数にくっつくメソッドである *惜しい、変数ではなくインスタンス自身にくっつくのがインスタンスメソッド
そもそもインスタンスって?
インスタンス化
クラス(クラスがわからない人は下に説明あります!)はnewすると初期化(インスタンスを作成する方法は他にもあるが基本はnew)し、実体化することができます。実体化したものをインスタンスと呼びます。
インスタンス変数
インスタンスは自身の中に複数の値を所有することができます。Rubyでは @ で始まる名前がインスタンスが所有する変数、インスタンス変数です。インスタンスが持つというニュアンスが大切。インスタンスを指し示す変数ではないですよ!
そもそもクラスってなんぞや?
1と2どちらも同義ですが、自分にわかりやすい方で構いません!
1. 新しい型を作る方法(型ってのは設計図みたいなものですね。)
2. データと処理のまとまりを部品としてわかりやすく定義する方法
- 投稿日:2020-02-14T02:06:25+09:00
 
Rails初心者が知っておきたい基礎知識|gem、Bundler など…
この記事では、《Rails初心者が知っておきたい基礎知識》について、
僕が学習した内容をまとめています。
- gem とは…?
 - Gemfile とは…?
 - Gemfile.lock とは…?
 - Bundler とは…?
 こういった疑問についてまとめています。
※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。gem とは…?
『gem』は・・・
Rubyのライブラリ(パッケージともいいます)です。
『ライブラリ』とは…
プログラムの部品で、便利な機能をひとまとめにしたものです。ライブラリを利用することで、自分で1からコードを書くことなく機能を実装することができるので、効率的に開発することが可能です。
Rubyのgemには便利なものがたくさんあり、例えば…
- Rails(Webフレームワーク)
 - Devise(ログイン機能)
 - Kaminari(ページネーション)
 - unicorn(アプリケーションサーバ)
 - Active Admin(管理画面)
 などがあります。
gemを使うことでログイン機能やページネーションといった機能も、簡単に実装可能です。Gemfile とは…?
『Gemfile』は・・・
gemをインストールするための『設計書』のようなもので、基本的にこの
Gemfileに自分のアプリケーションに必要なgemを記述します。Gemfile.lock とは…?
『Gemfile.lock』は・・・
gemをインストールした後の『ログ、記録』のようなもので、インストールしたgemの一覧とバージョンが記載されています。
【比較】Gemfile と Gemfile.lock の違い
Gemfile Gemfile.lock 更新方法 手動 自動 更新タイミング コマンド実行前 コマンド実行後 内容 インストールするgem インストールしたgem 【余談】なぜ Gemfile.lock が必要なのか…?
gemは、インストールした時期によってバージョンが変わってしまう可能性があるため…
例えば、本番環境と開発環境でインストールされるgemのバージョンが異なってしまう可能性があります。しかし・・・
Gemfile.lockが使用するgemのバージョンを管理してくれるため、仮にgemがアップデートされても、使用するgemのバージョンは変更させないということが可能になります。ちなみに・・・
Gemfile.lockを更新したい時は、bundle updateを使います。Bundler とは…?
『Bundler』は・・・
gemを管理するためのgemで、Bundlerを使用することで…
bundle installbundle updateなどのコマンドが使用できるようになります。
gem同士は関連し合っていることが多いので、実際は
Gemfileに書いてあるgemの他にも、gemが必要になります。そこで・・・
Bundlerは、それらも自動でインストールし、Gemfile.lockに記述してくれます。
Bundlerは、特定のRailsアプリケーションに必要なgemパッケージをリストアップし、複数のコンピュータ間で簡単に同期が取れるようにするものです。例えば・・・
上記の図のように開発者Bさんが、開発者AさんからRailsアプリのソースコードを受け取ったとします。
この時、Bさんは
bundle installを実行するだけで、必要なgemをインストールすることができ、簡単に環境を構築できます。【一覧】 よく使う Bundlerコマンド のオプション
コマンド 概要 bundle init Gemfileを生成 bundle install Gemfileに記述したgemをインストール bundle update インストール済みのgemのバージョンを更新 bundle list インストール済みのgemを一覧表示する bundle exec Bundlerでインストールしたgemを使用して、 
コマンドを実行【コマンド】 bundle install とは…?
bundle install上記を実行すると・・・
Railsは、
Gemfile.lockを元にgemのインストールを行います。この時…
『
Gemfile.lockに記述されていなくて、且つGemfileに記述されているgem』がある場合、『該当するgem』と『該当するgemに関連するgem』をインストールした後、
Gemfile.lockを更新します。反対に、
Gemfile.lockに記述されていれば・・・そこに記述されたgemを見て、それがGemfileの内容に矛盾していない限り、
Gemfile.lockの内容に従いインストールします。【コマンド】 bundle update とは…?
bundle update上記を実行すると・・・
Bundlerは、
Gemfileを元にgemのインストールを行い、その後Gemfile.lockを更新します。【余談】上記2つのコマンドの使い分けを少し解説
bundle updateは・・・その言葉通り、gemのバージョンを更新する時に使用します。
なぜなら・・・
bundle installコマンドでは、条件に矛盾が生じない限りGemfile.lockに存在するgemに関しては、更新作業を行わないからです。※
bundle updateは、本番環境で安易に実行しないように注意しましょう。場合によっては、gemのバージョンにズレが発生し、クラッシュする可能性があります。ですので・・・
bundle updateは、必ずローカル環境で実行してください。また、
bundle installに関しては・・・
Gemfileに新しくgemを記述した際に使用します。
- 投稿日:2020-02-14T01:31:00+09:00
 
Rubyで固定長ファイルを楽しく扱う
はじめに
ホストコンピュータ(死語?)から吐き出されたような超長い固定長ファイルが好物です。嘘です。
1行が数百バイト以上(2500バイトとかのファイルあるからね!)、数十から数百項目のExcelの定義書をもらったら時に、私がいつもやっているやり方です。準備
固定長ファイルなので、定義書は神Excelです!
まずはExcelからキーと1カラムの長さの列を取得して、ペアを作ります。column_def.rbColumn_def =%w[ any_id 10 any_field1 2 cyclic_1 4 cyclic_2 4 cyclic_3 4 ] # キーと列長のペア Columns = Hash[*Column_def] # => {"any_id"=>"10","any_field1"=>"2","cyclic_1"=>"4","cyclic_2"=>"4","cyclic_3"=>"4"} # 一行のサンプル input_sample = "0123456789xx12345678abcd"分解
column_def.rb# unpackが有能なのでunpackのパターンを作る column_def = Columns.values.map{|c| "a#{c}"}.join #=> "a10a2a4a4a4" arr = input_sample.unpack(column_def) #=> ["0123456789", "xx", "1234", "5678", "abcd"]この通り綺麗に分解してくれます。String#unpack有能。
構築
column_def.rb# Columnを再利用して、さらに扱いやすく any_item = Hash[Columns.keys.zip(arr)] #=> {"any_id"=>"0123456789","any_field1"=>"xx", "cyclic_1"=>"1234", "cyclic_2"=>"5678", "cyclic_3"=>"abcd"}zipした2重配列を連想配列にしてくれるHash有能。
これならjsonや欲しい形に変換して使いやすい。ですよね?column_def.rbrequire "json" any_item.to_json #=> "{\"any_id\":\"0123456789\",\"any_field1\":\"xx\",\"cyclic_1\":\"1234\",\"cyclic_2\":\"5678\",\"cyclic_3\":\"abcd\"}"まとめ
このやり方でいろんな固定長ファイルをサクッと片付けてください。(もっといいやり方、教えて・・・)
CSVでも連想配列にするところは使えますよ。(CSVのクラスはよく使い方忘れるので、ただのArray、Hashが好き)
固定長ファイルは正規化されていないことが多いから、group_byも有能である事はまた今度書こうかな。
Ruby有能。String#unpack有能。Hash有能。
・・・本当はPythonで同じことをやりたい・・・けどRuby以外書けないのです。
- 投稿日:2020-02-14T00:41:03+09:00
 
敢えてRubyで学ぶ「ゼロから作るDeep Learning」閑話 Numo::GSLの導入と正規乱数
第4章に正規(ガウス)分布の乱数を生成するコードが有る。
擬似的に正規分布の乱数を最も簡単に作る方法
-0.5~0.5の乱数の12回の平均。
def norm_rand random = Random.new() result = 0 12.times do result += random.rand(-0.5..0.5) end result / 12 endとはいえ、色々面倒だし、これを使って行列を作るのもなんとも不便。
そこで、乱数を生成してくれるライブラリ、Numo::GSLを導入する。Numo::GSLの導入
基本的にはDockerのRuby上で行っています。
環境構築に関しては、敢えてRubyで学ぶ「ゼロから作るDeep Learning」Docker環境構築編をご確認ください。# まずは元となるGSLを導入 $ apt install -y gsl-bin # 次にNumo::GSLのgemを導入 $ gem install numo-gslNumo::GSLでの正規乱数の生成
require 'numo/gsl' # 標準正規分布のrow * colの行列を作る def randn(row, col) r = Numo::GSL::Rng::Rand.new r.gaussian(1, col * row).reshape(col, row) end
- 投稿日:2020-02-14T00:13:50+09:00
 
ruby で公開鍵の文字列から public key オブジェクトを作成する方法
概要
公開鍵の文字列から public key オブジェクトを生成する方法について少しはまったので、共有します。
コード
下記のような公開鍵があるときは
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0bXcnrheJ2snfq1wv6Qz 8+TEPDGKHCM0SsrQjxEFpXSEycL2/A+oW1ZGUzCuhz4HH4wkvc4CDJl25johSIUT Vyo4mrFrJ0ab0QAhrWE7gMyWFIfraj9cksPAGyVAiXLCN9Ly2xuoJxFjCAZXw1VO 8i7RTYK8ZP6dhcosiyzdhYt7C/65B5ikmCS4AymXIa83QQanCtjoGiwy4Cf2pLnn 9zXMZEnqQ+wwSoGn32YExmap7GAtjOwHNWU5zpW3dwNMq+zkcln3ICEBwxDpWJhE ZHZPBpPWgN+dQZDR2FiGHJgUFE3EM+CIcwxekrRBP+R3xEUeMFf5z1HeQNK8sjZe RwIDAQAB -----END PUBLIC KEY-----「-----BEGIN PUBLIC KEY-----」の後と「-----END PUBLIC KEY-----」の前に改行記号を入れた文字列を作ります。改行記号の前後にスペースがあるとエラーが出ます。
str = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0bXcnrheJ2snfq1wv6Qz 8+TEPDGKHCM0SsrQjxEFpXSEycL2/A+oW1ZGUzCuhz4HH4wkvc4CDJl25johSIUT Vyo4mrFrJ0ab0QAhrWE7gMyWFIfraj9cksPAGyVAiXLCN9Ly2xuoJxFjCAZXw1VO 8i7RTYK8ZP6dhcosiyzdhYt7C/65B5ikmCS4AymXIa83QQanCtjoGiwy4Cf2pLnn 9zXMZEnqQ+wwSoGn32YExmap7GAtjOwHNWU5zpW3dwNMq+zkcln3ICEBwxDpWJhE ZHZPBpPWgN+dQZDR2FiGHJgUFE3EM+CIcwxekrRBP+R3xEUeMFf5z1HeQNK8sjZe RwIDAQAB\n-----END PUBLIC KEY-----"その文字列を OpenSSL::PKey::RSA に渡します。
public_key_object = OpenSSL::PKey::RSA.new(str)















