- 1. いいね機能の非同期化
- 2. Seleniumを用いてkindleハイライトを取り出す。(未完成)
- 3. optparseについて
- 4. Ruby Dateクラス
- 5. 【Ruby】File.joinを使用してリンクの結合をする
- 6. 【Ruby】指定のディレクトリ配下にあるディレクトリ/ファイルをリストに格納する方法
- 7. 【Ruby】PDFをzipファイルに圧縮する方法
- 8. フィボナッチ数を高速に計算する
- 9. Ruby7
- 10. Ruby6
- 11. Ruby5
- 12. 【Ruby】数値の0埋めをする方法
- 13. Ruby4
- 14. webrick を 1.8.0 に上げたら死んだ件
- 15. [Rails7]でcredentials.yml.encをVSCodeで開けなかったので、その解決法
- 16. railsで住所の自動入力について
- 17. 部分テンプレート
- 18. 正規表現の否定先読み、OR条件
- 19. Ruby 引数
- 20. 配列をactiverecordへ変換する
いいね機能の非同期化
# 1.非同期機能とは
– 画面全体を更新せずに、一部だけ更新すること
– Ajaxという手法が使用されます。# 2.実装
### 2−1.リンクに`remote: true`を追記する
– これにより、リクエストがhtml形式からjs形式になる
“`:app/views/posts/show.html.erb
<% if current_user && @post.favorited_by?(current_user) %>
<%= link_to post_favorites_path(@post), method: :delete, remote: true, class: "favorite_btn" do %>
♥<%= @post.favorites.count %> いいね
<% end %>
<% else %>
<%= link_to post_favorites_path(@post), method: :post, remote: true, class: "favorite_btn" do %> #ここ
♡<%= @post.favor
Seleniumを用いてkindleハイライトを取り出す。(未完成)
## はじめに
amazon kindleで本を読んでいる方なら、highlight(強調線)を引くことがたまにあると思う。
rubyにおいてのkindle-highlights関連ライブラリは、スクレイピングするためにMechanizeを用いているが、 個別で本の情報を取り出そうとなるとasin(アマゾン独自の商品識別番号)が必要となる(多分)。これを改良したいと思い、コードを書いた。
スクレイピング用ライブラリとしてSeleniumを用いてkindleのhighlightを取り出すことが出来たので、皆さんの参考になればと考えている。今回は、すべての本のhighlightを取り出ところまで出来た。今後、書籍名か作者名だけで書籍を特定し、その書籍のhighlightだけを取り出すように改善したい。## 早速ソースコード
~~~kindle_highlights.rb
require ‘selenium-webdriver’require ‘dotenv’
Dotenv.load
EMAIL = ENV[‘KINDLE_ID’]
PASSWORD = ENV[‘K
optparseについて
# 経緯
Rubyでカレンダーアプリを作成する際に,引数に任意の数値を渡すことでmacの`cal`コマンドで表示されるようなカレンダーを表示したかったのでoptparseを使用しました。そこで私なりに`optparse`について調べてみました。# 役割
– コマンドライン引数
コマンドライン引数は、ターミナルから実行時に引数を渡して読み込める仕組みです。
– 引数は文字列として出力されます
### OptionParser
以下
“`
require ‘optparse’opt = OptionParser.new
#aに渡ってきた引数をvに格納
opt.on(‘-a’) {|v| p v }
# 真偽値を表示。
opt.parse!(ARGV)
p ARGV$ ruby sample.rb -a foo
# この場合aに引数が渡っていますのでtrueを表示。そしてfooを表示
=> true
[“foo”]
“`
– 引数が2つの場合
“`
require ‘optparse’opt = OptionParser.new
opt.on(‘-a’
Ruby Dateクラス
# Dateクラス
Dateクラスは、Rubyの標準ライブラリの機能です。
これを使うには、下記一文を記述する必要があります。“`ruby
require “date”
“`# Dateクラスを使ったプログラムの例を紹介
“`ruby
require “date”
day = Date.today.wday
puts day
“`“`
0
# ターミナル出力例
“`***wday***は、曜日を0(日曜日)から6(土曜日)の整数で取得する、Dateクラスに用意されているメソッドです。
上記の記述を実行すると、その日の曜日に合わせた数字がターミナルで出力されます。
今日が日曜日だったら、0が出力されます。## 0から6の整数ではなく、日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日 で取得したい場合はどうする?
“`ruby
require “date”
day = Date.today.wday
days = [“日曜日”, “月曜日”, “火曜日”, “水曜日”, “木曜日”, “金曜日”, “土曜日”]puts day
【Ruby】File.joinを使用してリンクの結合をする
# 前提条件
– Ruby 3.1.0
# 背景
file.txtのフルパス(dir/dir2/dir3/file.txt)を表示させたい。
“`
└── dir
└── dir2
└── dir3
└── file.txt
“`
しかし先頭・末尾の/(スラッシュ)有無が変数間で様々である場合、正常にリンクを結合できないことがある。“`ruby:変数代入
dir1 = “dir/dir2/dir3″ #末尾に/(スラッシュ)なし
dir2 = “dir/dir2/dir3/” #末尾に/(スラッシュ)あり
file1 = “file.txt” #先頭に/(スラッシュ)なし
file2 = “/file.txt” #先頭に/(スラッシュ)あり
“`
“` ruby:コンソール
irb(main)> dir1 + file1
=> “dir/dir2/dir3file.txt” #結合失敗
irb(main)> dir2 + file2
=> “dir/dir2/dir3//file.txt” #結合失敗
【Ruby】指定のディレクトリ配下にあるディレクトリ/ファイルをリストに格納する方法
# 前提条件
– Ruby 3.1.0
# やりたいこと
dir1配下のディレクトリ/ファイルをリストに格納する。
“`
└── hoge
└── hoge2
├── dir1
│ ├── file1
│ ├── file2
│ └── dir3
│ └── file3
└── dir2
“`
# 方法
### Dirクラスのglobメソッドを使う
“` ruby:実装
files = []
Dir.chdir(“hoge/hoge2”) do
Dir.glob(“dir1/*”).each do |item|
files.push(item)
end
end
# => files =[‘dir1’, ‘dir1/file1’, ‘dir1/file2’, ‘dir1/dir3’, ‘dir1/dir3/file3’]
“`
**-詳細-**
リストを用意し変数に代入する。
“` ruby:詳細1
files = []
“`
カレ
【Ruby】PDFをzipファイルに圧縮する方法
# 前提条件
– Ruby 3.1.0
– gem ‘rubyzip’
# やりたいこと
PDFファイルをzipファイルに圧縮する。
# 方法
### 1. rubyzipのGemをインストールする
Gemファイルに以下を追加する。
“` ruby:Gemfile
gem ‘rubyzip’
“`
コンソールからGemをインストールする。
“` ruby:コンソール
bundle install
“`
### 2. rubyzipを使用してプログラムを作成する
“` ruby:pdf_to_zip.rb
require ‘zip’module ABC
class PdfToZip
class << self def exe #zip化するPDFが格納されているディレクトリ pdf_folder_path = "”
#zipファイルを出力するディレクトリ/ファイル名
zip_folder_name = “
フィボナッチ数を高速に計算する
# はじめに
巷では、フィボナッチ数の計算がお手軽なベンチマークとして扱われているようです。フィボナッチ数の計算方法を調べると、とても遅いアルゴリズムが多数ヒットしてしまいます。
このままでは、フィボナッチ数を高速に計算したい人が途方にくれたり、この程度の計算量だと勘違いするかも知れません。なので、フィボナッチ数を高速に計算するアルゴリズムを紹介することにしました。# ビネの公式
フィボナッチ数とは、フィボナッチ数列のn項目の数$F_n$を指し、一般項は以下の式で表すことができます。$$F_n = \frac{\phi^n – \bar{\phi}^n}{\sqrt{5}} \tag{1} $$$$
\phi = \frac{1 + \sqrt{5}}{2}, \bar{\phi} = \frac{1 – \sqrt{5}}{2} \tag{2}$$上記の式はビネの公式と呼ばれています。
気が早い人は、下記のように式をそのままプログラミングに突っ込んでしまうかも知れませんね。“`ruby
def fib(n)
sqr5 = Math.sqrt(5)
phi =
Ruby7
問題
今日の曜日を表示するコードをDateクラスを使用して記述してください。ただし、金曜日だった場合だけ以下のように表示の内容を変えてください。
(出力内容)
「今日は月曜日」
「今日は金曜日だ !!!」?ヒント?
Dateクラス
Rubyの標準ライブラリの機能です。“`Ruby:Dateクラスを使うには必ずこの一文を記述します
require “date”
“`
“`Ruby:Dateクラスを用いて「今日の曜日」を取得する場合はこのように記述する
Date.today.wday
“`wdayは曜日を0(日曜日)から6(土曜日)の整数で取得することができるDateクラスに用意されているメソッドです。
“`Ruby:例
require “date”day = Date.today.wday
puts day
“`これを実行すると、曜日に合わせた数字が出力されます。
“`Ruby:模範解答
require “date”day = Date.today.wday
days = [“日曜日”, “月
Ruby6
問題
“晴れ” という文字列を引数で渡した時に明日の天気は晴れです
とターミナルに表示されるようなメソッドを作成してください。
呼び出し方:get_weather_forecast(“晴れ”)
“`Ruby:模範解答
def get_weather_forecast(weather)
puts “明日の天気は#{weather}です”
endget_weather_forecast(“晴れ”)
“`【解説】
「明日の天気は〇〇です」の「〇〇」に任意の文字列を表示したいので、引数を使用します。
「〇〇」にはメソッドの呼び出し元の引数に渡した文字列が表示されます。
今回は呼び出し方が指定されているのでそちらを使用します。“`Ruby:メソッドの呼び出し
get_weather_forecast(“晴れ”)
“`そして、文字列を出力するためのget_weather_forecastメソッドを定義します。
引数で渡した文字列を表示させたいので、文字展開を使用します。“`Ruby:get_weather_forecast
Ruby5
問題
以下のプログラムを実行するとエラーが起きます。
①エラーが起きた原因
②正しいソースコード(引数を用いたコードにしましょう)
をそれぞれ答えてください。“`Ruby
price = 300def calculate_price_with_tax
tax = 0.1
return price + price * tax
endcalculate_price_with_tax
“`①エラーが起きた原因
メソッドの外側で定義した変数は、メソッドの内側では使えない。
そのため、1行目のpriceはcalculate_price_with_taxメソッドの中では使えずにエラーが起きてしまった。②正しいソースコード
“`Ruby:模範解答
price = 300def calculate_price_with_tax(price)
tax = 0.1
return price + price * tax
endcalculate_price_with_tax(price)
“`【解説】
メソッドの中と
【Ruby】数値の0埋めをする方法
# 前提条件
– Ruby 3.1.0# やりたいこと
出力値を8桁固定にし、頭は0埋めで表示する。
(例)
| 現状の出力値 | 理想の出力値 |
|:———–|————:|
| 1234 | 00001234 |
| 12345 | 00012345 |
| 123456 | 00123456 |# 方法
### Formatメソッドを使う
“` ruby:書き方
format(“%<桁数>d”, <出力する数値>)
“`
今回は桁数が8桁、出力する数値が1234なので以下のようになる。
“` ruby:実装
format(“%08d”, 1234)
# => “00001234”
“`
他の例も同様である。
“` ruby:実装
format(“%08d”, 12345)
# => “00012345”
“`
“` ruby:実装
format(“%08d”, 123456)
# => “00123456”
“`
# 参考https://remoter.hatenablog
Ruby4
問題
“`Ruby
class Articledef initialize(author, title, content)
@author = author
@title = title
@content = content
endend
“`上記のコードに追加を行い、以下の出力結果を得られるようにしてください。ただし、クラスとインスタンスを使用するものとします。
“`Ruby:ターミナル
著者: 阿部
タイトル: Rubyの素晴らしさについて
本文: Awesome Ruby!
“`“`Ruby:模範解答
class Articledef initialize(author, title, content)
@author = author
@title = title
@content = content
enddef author
@author
enddef title
@title
enddef co
webrick を 1.8.0 に上げたら死んだ件
webrick を使ったウェブアプリを多数保守してるんだが,先日(2023 年 1 月 27日),webrick の 1.8.0 がリリースされたので早速アップデートしたところ,
“`
FrozenError: can’t modify frozen String: “”
“`が出て,軒並み死んだ。
当初,原因が分からず困っていたが,その日のうちにバージョン 1.8.1 が出て解決した。
1.8.0 で `frozen_string_literal: true` にしたのに
“`rb
@body = ”
“`を修正してなかったバグだったぽい。
[Rails7]でcredentials.yml.encをVSCodeで開けなかったので、その解決法
# はじめに
credentials.yml.encをVSCodeで編集しようとした際に、開けなかったのでその解決法です。
【環境】
-ハードウェア情報
MacOS Monterey(version: 12.6.2)-ソフトウェア情報
・Ruby Version: ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-darwin21]
・Rails Version: 7.0.4.2# 発生した問題
“`bash
% EDITOR=”code –wait” rails credentials:edit
File encrypted and saved.
“`と表示されて、ファイルが開かないという状況。
# 解決法
結論、VSCodeのパスが通っていないことが原因でした。
確認のため、プロジェクトフォルダでcodeコマンドを実行しても認識してなかったら同じ現象だと思われます。
“`bash
% code .
zsh: command not found: code
“`VSCode内でパ
railsで住所の自動入力について
# 全体の流れ
1. jQueryプラグインのインストール
2. gemfileにライブラリのインストール
3. colmnを追加
4. modelの編集
5. controllerの編集
6. viewの編集
7. application.jsの編集
8. エラーについて## 1. jQueryプラグインのインストール
[jpostal](URL “https://github.com/ninton/jquery.jpostal.js”)
![スクリーンショット 2023-01-28 18.31.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115929/441e44c8-861c-b4ce-54a7-f467f973fcf0.png)
![スクリーンショット 2023-01-28 18.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115929/fe9ac471-5fbe-a79b-7bc0
部分テンプレート
# 部分テンプレートとは
– 繰り返し使用するコードを取り出してひとつのファイルで管理できる仕組み# 部分テンプレートの作成
– 部分テンプレートとして運用するファイル名の先頭に_(アンダースコア)をつけるだけ
“`
_〇〇.html.erb
“`
### 部分テンプレート内の記述について
– 部分テンプレート内では、インスタンス変数を使用するのは適切ではないためローカル変数で記述する。# 使い方
“`
# 基本の記述
<%= render [部分テンプレートファイルの指定], [ローカル変数]:[渡す値] %>
# 使用例
<%= render partial: "ディレクトリ名/〇〇", locals: { post: @post } %>
# これで部分テンプレートのなかで、postのなかに@postを格納できる
“`
– renderメソッド
部分テンプレートを呼び出すメソッド– partialオプション
renderメソッドで使用
オプションで部分テンプレート名を指定して、部分テンプレート呼び出せる。– localsオプション
renderメソッド
正規表現の否定先読み、OR条件
“`
/\A(?!.*(\.{2,}|\.{1,}@)).*\z/
“`
文中に連続の.(ドット)または@(アットマーク)前に一回以上の.(ドット)が来ると否定できるようになった。
以下の出典先を真似して書いてみた。# OR条件
“`ABC|DEF のように書くと、「文字列ABC、または文字列DEF」という OR条件 の意味になります“`# 出典
https://qiita.com/jnchito/items/6f0c885c1c4929092578#:~:text=ABC%7CDEF%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E6%9B%B8%E3%81%8F%E3%81%A8%E3%80%81%E3%80%8C%E6%96%87%E5%AD%97%E5%88%97ABC%E3%80%81%E3%81%BE%E3%81%9F%E3%81%AF%E6%96%87%E5%AD%97%E5%88%97DEF%E3%80%8D%E3%81%A8%E3%81%84%E3%81%86%20OR%E6%9D%A1%E4%BB%B6%20%E3%
Ruby 引数
# 引数とは
メソッドに渡すことができる値のこと。# 実引数と仮引数
“`ruby
def メソッド名(仮引数)
# 処理
end# メソッドの呼び出し
メソッド名(実引数)
“`
メソッドを定義したときに()内に記述しておき、処理に利用するときは***仮引数***。
メソッドを呼ぶときに()内に渡す値を記述するのが***実引数***があります。“`ruby
def メソッド名(第一引数, 第二引数)
# 処理
endメソッド名(第一引数, 第二引数)
“`
引数は複数利用されることがあります。
そんなときは、()内、左から順に第一引数、第二引数、第三引数…と呼びます。例
“`ruby
def get_weather_forecast(weather)
puts “明日の天気は#{weather}です”
endget_weather_forecast(“晴れ”)
“`
“`
# ターミナル出力
明日の天気は晴れです
“`– この例の場合、実引数=”晴れ”、仮引数=weatherですね。
–
配列をactiverecordへ変換する
# はじめに
find_in_batchesメソッドはactiverecordに対してのみ使用できるので配列をactiverecordへ変換したい# 方法
配列に格納されたデータのidのみを別の配列に格納する
(push・・・配列に要素を追加)
“`
@channel_ids = []channels = user.channels
channels.each do |channel|
@channel_ids.push(channel.id)
end
“`idのみを格納した配列をwhere句へ指定して、再度データを取得することでactiverecordへ変換したデータが取得できる
“`
target_channels = Channel.where(id: @channel_ids)
“`# 参考文献
もっと簡単に書けました
“`where(id: user.channels.map(&:id))“`– [Railsで配列をActive Record Relationに変換したい](https://qiita.com/fgem28/items/25