<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tils on Seiichi Yonezawa</title><link>https://paper.seiichiyonezawa.com/til/</link><description>Recent content in Tils on Seiichi Yonezawa</description><generator>Hugo -- gohugo.io</generator><language>ja</language><atom:link href="https://paper.seiichiyonezawa.com/til/index.xml" rel="self" type="application/rss+xml"/><item><title>Cuprite</title><link>https://paper.seiichiyonezawa.com/til/cuprite/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paper.seiichiyonezawa.com/til/cuprite/</guid><description>RailsのシステムテストでChromeを操作させるドライバのFerrumを使いやすくしたのがCuprite。 イメージとしてはNode.jsのPuppeteerに近くて、CDPプロトコルというものを利用しているのでSeleniumに比べて挙動が軽いのだとか。
インストールについて 実行環境にchromeのバイナリが必要。 Google Chromeをインストールしたくはなったので、Chromiumで代用する。 Ubuntu DesktopであればSeleniumはSnap経由でダウンロードできる。 Google Chromeは別途debパッケージをダウンロードする必要がある。
$ sudo snap install chromium group :development, :test do gem &amp;#34;capybara&amp;#34;, &amp;#34;~&amp;gt; 3.39&amp;#34; gem &amp;#34;cuprite&amp;#34;, &amp;#34;~&amp;gt; 0.14.3&amp;#34; gem &amp;#34;rspec-rails&amp;#34;, &amp;#34;~&amp;gt; 6.0&amp;#34; end 今回使うgemはこれ。
Systemテストのgemはわけもわからずたくさん入れてしまいがちだが、cupriteとcapybaraさえあれば動かせる。
TL;DR Capybara.javascript_driver = :cuprite # スクリーンショットの保存先を指定できる Capybara.save_path = Rails.root.join(&amp;#34;tmp/capybara/&amp;#34;) # ChromeのコンテナからRailsサーバーにアクセスするための設定 if ENV[&amp;#34;CHROME_URL&amp;#34;].present? ip_address = Socket.ip_address_list.find(&amp;amp;:ipv4_private?).ip_address # app host Capybara.app_host = &amp;#34;http://#{ip_address}&amp;#34; # server host Capybara.server_host = ip_address end # rspec settings RSpec.configure do |config| # 前回のスクリーンショットファイルは残さない config.</description></item><item><title>Kredis</title><link>https://paper.seiichiyonezawa.com/til/kredis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paper.seiichiyonezawa.com/til/kredis/</guid><description>Web Workerにも書いているが、Sidekiqのジョブに進捗を表示したいと思っている。 例えばNode.jsのBullというライブラリではあらかじめプログレスの表示機能が利用できる。 良くも悪くもSidekiqにはそこまで親切な機能はないため、自分で足りない機能を実装しなければならない。
一度だけやったことはあるのでできなくもないのだが、RailsでRedisのクライアントを直接呼び出すのは少々無骨すぎる。
そこで少し調べると、Railsがリリースしているkredisというライブラリがあるようだ。 今回はこのライブラリについてまとめていく。
余談だがGo Railsのビデオを見る限りでは*K-Redis(ケーレディス)ではなくKredis(クレディス)*と発音していた。
基本 まずはkredisをインストールする。 この投稿時点では以下のバージョンで進める。
kredis (1.5.0) READMEにも記載があるが、./bin/rails kredis:installコマンドを実行して生成されたYAMLファイルを編集する。
# config/redis/shared.yml production: &amp;amp;production url: &amp;lt;%= ENV.fetch(&amp;#34;REDIS_URL&amp;#34;, &amp;#34;redis://127.0.0.1:6379/0&amp;#34;) %&amp;gt; timeout: 1 development: &amp;amp;development url: &amp;lt;%= ENV.fetch(&amp;#34;REDIS_URL&amp;#34;, &amp;#34;redis://127.0.0.1:6379/0&amp;#34;) %&amp;gt; timeout: 1 # You can also specify host, port, and db instead of url # host: &amp;lt;%= ENV.fetch(&amp;#34;REDIS_SHARED_HOST&amp;#34;, &amp;#34;127.0.0.1&amp;#34;) %&amp;gt; # port: &amp;lt;%= ENV.fetch(&amp;#34;REDIS_SHARED_PORT&amp;#34;, &amp;#34;6379&amp;#34;) %&amp;gt; # db: &amp;lt;%= ENV.fetch(&amp;#34;REDIS_SHARED_DB&amp;#34;, &amp;#34;11&amp;#34;) %&amp;gt; test: &amp;lt;&amp;lt;: *development db: &amp;lt;%= ENV.</description></item><item><title>NFS</title><link>https://paper.seiichiyonezawa.com/til/nfs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paper.seiichiyonezawa.com/til/nfs/</guid><description>私はそれぞれHomeとWorkのUbuntuを使っている。
これらのアカウントは両方同じユーザーネームとパスワードなのだが、仕事用のディレクトリとそれ以外のディレクトリはできればわけていたいもののこの2つでファイルをそれぞれ共有したいと思った。 その場合単純にSAMBAを使っていたのだけれども、もっとLinuxフレンドリーなNFSを使うことにしてみた。
NOTE: サーバー側の設定は今回割愛する。
インストール $ sudo apt install nfs-common サーバーのマウントを確認 この例ではmyshareというディレクトリを使用する:
$ sudo mkdir /mnt/myshare $ sudo mount 192.0.2.0:/mnt/myshare /mnt/myshare $ df -h | grep myshare 192.0.2.0:/mnt/myshare 100G 1.8M 100G 1% /mnt/myshare ここでディレクトリがマウントできれば確認完了。
fstabの編集 192.0.2.0:/mnt/myshare /mnt/myshare nfs auto,nofail,noatime,nolock,tcp,actimeo=1800 0 0 参考にしたURL How to Install and Configure a Network File System (NFS) Server and Client on Ubuntu Server How To Set Up an NFS Mount on Ubuntu 22.04</description></item><item><title>Rclone</title><link>https://paper.seiichiyonezawa.com/til/rclone/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paper.seiichiyonezawa.com/til/rclone/</guid><description>Railsなどでアップロードしたファイルを別のコンピュータへ移動したい場合はdocker cpコマンドなどを利用していたのだけれども、ようやくRcloneというコマンドに落ち着いた。 これは複数のクラウドサービスに対応しており、Minioのクライアントとしても使えるようだ。
インストール $ sudo apt install rclone rclone config $ rclone config n/s/q&amp;gt; n name&amp;gt; minio Storage&amp;gt; 4 provider&amp;gt; 7 env_auth&amp;gt; 1 access_key_id&amp;gt; USWUXHGYZQYFYFFIT3RE secret_access_key&amp;gt; MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03 region&amp;gt; 1 endpoint&amp;gt; http://192.168.1.106:9000 server_side_encryption&amp;gt; 1 sse_kms_key_id&amp;gt; 1 Edit advanced config? (y/n) y) Yes n) No (default) y/n&amp;gt; n 出力をだいぶ省略しているが、対話的な処理で入力していけばよい。 Storageを4にしてproviderが7になっていればあとはデフォルトで適当に進めていくだけだ。
rclone config showコマンドで設定ファイルの内容を確認できるようだ。
$ rclone config show [minio] type = s3 provider = Minio env_auth = false access_key_id = USWUXHGYZQYFYFFIT3RE secret_access_key = MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03 endpoint = http://192.</description></item><item><title>Ruby on Rails</title><link>https://paper.seiichiyonezawa.com/til/ruby-on-rails/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paper.seiichiyonezawa.com/til/ruby-on-rails/</guid><description>Rails全般
field_with_errorsクラスを消す フォームでvalidationエラーが出ると新しいdivで囲われてしまう。
レイアウトが崩れるのをとりあえず防ぎたい:
ActionView::Base.field_error_proc = Proc.new do |html_tag, instance| html_tag.html_safe end 参考URL: Remove Rails field_with_errors wrapper
Rails Console(IRB)の候補を表示しない Ruby 3系だと、Rails Console(IRB)の入力中に候補が表示されるようになった。
APP_PATH █ ARGF █ ARGV █ AbstractController █ ActionCable █ ActionController █ ActionDispatch █ ActionPack █ ActionView █ ActiveJob Addrinfo 候補表示そのものは必要だと思うのだが、タイピングの途中に出す必要はないと思う。
それどころかIRBの表示もどこかバグっぽくて、この表示のせいで入力している文字が消えるという致命的なバグがある。 こういうのはPRYとかのgemでオプトインするべきであって、IRBは可能な限り単純でいてほしかった。 とはいえ、カスタマイズが可能なのでホームディレクトリに.irbrcを作成する。
IRB.conf[:USE_AUTOCOMPLETE] = false とてもよくなった。
一応環境変数でも変更できるようだ。
export IRB_USE_AUTOCOMPLETE=false Rails Console(IRB)のプロンプトをカスタマイズする方法 せっかく.irbrcを作ったので、古き良きIRBにする。
# シンプルなプロンプトを使う IRB.conf[:PROMPT][:MY_PROMPT] = { :PROMPT_I =&amp;gt; &amp;#34;&amp;gt;&amp;gt; &amp;#34;, :PROMPT_S =&amp;gt; &amp;#34;?&amp;gt; &amp;#34;, :PROMPT_C =&amp;gt; &amp;#34;-&amp;gt; &amp;#34;, :RETURN =&amp;gt; &amp;#34;=&amp;gt; %s\n&amp;#34; } IRB.</description></item><item><title>SQLite3</title><link>https://paper.seiichiyonezawa.com/til/sqlite3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paper.seiichiyonezawa.com/til/sqlite3/</guid><description>DBは普段GUIでしか扱わないのだけれども、バックアップとリストアについて調べておく。
参考URL: How To Use The SQLite Dump Command
インストール sudo apt install sqlite3 データベースのdump SQLite version 3.37.2 2022-01-06 13:25:41 Enter &amp;#34;.help&amp;#34; for usage hints. sqlite&amp;gt; .output db/dump.sql sqlite&amp;gt; .dump sqlite&amp;gt; .exit 特定のテーブルをdump SQLite version 3.37.2 2022-01-06 13:25:41 Enter &amp;#34;.help&amp;#34; for usage hints. sqlite&amp;gt; .output db/videos.sql sqlite&amp;gt; .dump videos sqlite&amp;gt; .exit これひょっとすると対話型のコマンドで実行しなくてもいけるのではという気持ちもある。
特定のテーブルをdb:seedでリストア ここからが本題である。
先程のコマンドでdump.sqlあるいはvideos.sqlが取得できた前提で実行する。 まずはテーブル全体を初期化する:
rails db:drop db:create db:migrate Dropped database &amp;#39;db/development.sqlite3&amp;#39; Dropped database &amp;#39;db/test.sqlite3&amp;#39; Created database &amp;#39;db/development.sqlite3&amp;#39; Created database &amp;#39;db/test.</description></item><item><title>Terraform</title><link>https://paper.seiichiyonezawa.com/til/terraform/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paper.seiichiyonezawa.com/til/terraform/</guid><description>Terraform関連。
Error: vm '100' not found terraform planを実行したとき、上記のようなエラーが表示されることがあった。 おそらく現在のディレクトリとは別のディレクトリ上でVMの削除をしたのだと思う。
$ terraform state rm &amp;lt;VM&amp;gt; Removed &amp;lt;VM&amp;gt; Successfully removed 1 resource instance(s). 単純にterraform state rmというコマンドを実行すればよいみたいだ。 terraform planを実行するとエラーが表示されなくなった。
参考にしたURL Vm &amp;lsquo;cloudinit-ubuntu&amp;rsquo; not found</description></item><item><title>Ubuntu Desktop</title><link>https://paper.seiichiyonezawa.com/til/ubuntu-desktop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paper.seiichiyonezawa.com/til/ubuntu-desktop/</guid><description>Ubuntu全般について
ImageMagickを消す $ sudo rm /usr/share/applications/display-im6.q16.desktop 謎の白いアイコンが消える。 実行してみてもよくわからない画像が出てくるだけ。 imagemagickをインストールするともれなくついてくるが消して問題なさそう。
nip2を消す $ sudo apt purge nip2 こちらはlibvips-devをインストールすると一緒にインストールされるGUI版?のプログラム。 アイコンが微妙なのでプログラムごと消す。
mpvを消す $ sudo apt purge mpv yt-dlpをインストールしたときにインストールされているようだった。 そもそも起動すらしない。
ゲーム全般を消す Ubuntu 23.10をインストールしてみたのだけれども、ソリティアの起動がこれまでに比べて遥かに遅くなってしまった。 さすがに気軽に遊べなくなってしまったのでもったいないけれども消す。
$ sudo apt purge aisleriot gnome-sudoku gnome-mahjongg gnome-mines</description></item><item><title>Unison</title><link>https://paper.seiichiyonezawa.com/til/unison/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paper.seiichiyonezawa.com/til/unison/</guid><description>2つのローカルディレクトリを同期するのにrsyncを使っていたのだが、よくも悪くもUnix的なプログラムなのでパスの指定でうまくいかないことがあった。 あとから気づいたのだが、同期したいディレクトリの中にまるまる同名のディレクトリができていた。 もう少しユーザーフレンドリーなプログラムがあれば好ましいと思ったが、たまたまunisonというプログラムがあることを知った。 試していないがこのプログラムはマルチプラットフォームで動作するようだ。
インストール $ sudo apt install unison コマンドの実行について $ unison /home/nzwsch/Public/ /mnt/myshare/ 初回はプログラムを実行すると対話形式だった。 同期するディレクトリに含めたい、あるいは含めたくない場合はここで選択できる。
自動実行 $ unison --batch=true /home/nzwsch/Public/ /mnt/myshare/ --batch=trueを追加するだけでディレクトリ間を同期してくれるようになった。
同期元にファイルを追加削除したり、同期先にファイルを追加削除しても想定したとおりに動作している。 これを使えば1対多の同期ができると思う。 あとはcrontabに追記すればよい。</description></item><item><title>Web Worker</title><link>https://paper.seiichiyonezawa.com/til/web-worker/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://paper.seiichiyonezawa.com/til/web-worker/</guid><description>Web Workerを使うユースケースがなかなか見いだせずにいたので、興味はあったのだがなかなか使う機会がなかった。 現在作成しているアプリケーションでは、というか大抵はSidekiqのジョブで非同期に処理することが多いので進捗を表示したいと思っていた。 いずれはWebSocketも使ってみたいのだが、まずはLong Pollingで実装してみようと思う。 最初はSSE(server-sent events)も使ってみたのだが、どうも安定しないのがあってLong Pollingにした。
まずWeb Workerにはおおまかに2種類のWorkerがあるようだ。
1つは専用Worker(DedicatedWorker)と共有Worker(SharedWorker)に分けられている。 若干使い方が異なるが、専用Workerはスクリプトファイルに紐付いていて、共有Workerはブラウザで共通のインスタンスを利用できるイメージ。 サンプルを試してみると専用Workerの方はセキュリティ系の拡張機能で無効にされていて、ひょっとすると共有Workerの方がいつでも使えるという意味ではいいかもしれない。 といっても自分で使うだけのアプリケーションなので今回は専用Workerを使う。
基本 Create a Web Worker File:
// polling-worker.js self.onmessage = function (e) { // This function will handle messages sent to the worker. // You can start the polling process here. poll(e.data.url, e.data.interval); }; function poll(url, interval) { setInterval(async () =&amp;gt; { try { const response = await fetch(url); if (response.ok) { const data = await response.</description></item></channel></rss>