頭の中は異空間

頭の中は異空間

ものづくり中心

【Sinatra】migration実行なしでdelayed_jobを使いたい

~ワーカ起動まで

delayed_jobsというテーブルを用意すれば大丈夫です。今回はSQLite3を使用
以下sqlファイルを作成し、

CREATE TABLE IF NOT EXISTS "delayed_jobs" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "priority" integer DEFAULT 0 NOT NULL, "attempts" integer DEFAULT 0 NOT NULL, "handler" text NOT NULL, "last_error" text, "run_at" datetime(6), "locked_at" datetime(6), "failed_at" datetime(6), "locked_by" varchar, "queue" varchar, "created_at" datetime(6), "updated_at" datetime(6));
CREATE INDEX "delayed_jobs_priority" ON "delayed_jobs" ("priority", "run_at");
sqlite3 sqlite3のdbファイル < sqlファイル

を実行
Windowsの場合はsqlite3.exeのあるディレクトリまで移動してから実行すること

エラーなく実行完了すると、新規テーブルとしてdelayed_jobsができている。

更に、Rakefileも用意する

# Rakefile
require 'rake'
require "sinatra/activerecord/rake"
require 'delayed_job_active_record'

namespace :jobs do
  task work: :environment do
    Delayed::Worker.new.start
  end
end

task :environment do
  require './app'
end

上記ファイルが準備できたら、

bundle exec rake jobs:work

を実行してワーカを起動する



Jobの登録

呼び出し元

require_relative './job' # jobのクラスが記述された呼び出し先

# delayedjobに登録
  Delayed::Job.enqueue jobのクラス名.new

呼び出し先(job.rb)

class AAA
  def perform
    # jobsの中身を記述
  end
end


ここまでで最低限ジョブ登録できるようになりました


Q. なんでこんな意味不明なことやってるの

A. なぜかpsychをインストールできない環境でアプリ開発する必要が出てきたため(正確にはpsychというよりはlibyamlが入らなかった。そしてpsychに依存しているrailsがmigration実行に必要だった)
こんなん書いても誰が見るんだって話。
マイグレーションありのスタンダードなやり方の方がいいですよ

Windows上でRails7で開発する時の書き方覚書(続き)

notwodaily.hatenablog.com

の続き

今回はJSの読み込ませ方について。

Rails7からImportmapという新しい概念が登場しています。

このあたりがわかりやすいか。
Rails 7.0 で標準になった importmap-rails とは何なのか?


新規作成したJSを読み込ませるには、以下に記述すればおk

import "index" // 作成したファイル名
  • app/javascript/controllers/index.js (自分で作成したファイル)
何かしらのコード
  • config/importmap.rb
pin_all_from "app/javascript/controllers", under: "controllers"
pin "index", to: "index.js"
  • app/views/コントローラ/index.html.erb
<%= javascript_include_tag 'controllers/index', type: "module", "data-turbo-track": "reload" %>

CSS含め、rails assets:precompileでアセットのコンパイルが可能

RAILS_ROOT\tmp\cache以下にキャッシュが生成される


10年前からRailsでの開発を業務でやってはいたんだが、急に最新版に触ったものだから良くわからん機能に泣かされるのは割とあるある
正直、調べても正解の記法になかなかたどり着かず、結局chatGPTに泣きつく羽目に…
使わなければ良かった(^o^)

あと、書いてて気づいたけど、このトピックならWindows限定じゃないのでタイトルは少し考えものかも?

LPICの問題の出題傾向について

バージョンが変われば傾向も変わるかもしれないので眉唾もの程度に思ってください

記述問題

コマンド、ディレクティブ、ファイルパスやディレクトリを書かせる問題
→コマンドを書かせる場合は、コマンドのパスやオプションを記載せず、コマンド名だけを書かせるもの
→ディレクティブを書かせる問題はhttpd.conf等の設定ファイルに記述するもの
→ファイルパスはフルパスでの記述を要求される。ディレクトリの場合は、最後に/があってもなくても良い(はず)

暗記力が試される問題。知ってりゃボーナス問題、知らなきゃ飛ばしておk
ここでちゃんと得点できるかが合否を分ける、とまでは言わないが正直記述問題で落とすのはもったいない

  • ファイルパスを答える問題は、LPIC1で出題される可能性が高く、2や3ではあまり出ませんでした
  • コマンドを答える問題については、LPI公式の試験範囲で「用語とユーティリティ」にあるコマンドを押さえておけば問題ないです

選択問題

すべて選択、2つor3つ選択

全部選択はLPIC1のときしか見たことないです。
明らかに間違った選択肢については見て即分かるレベルなので、仮に記憶があやふやでも間違った選択肢を排除していけばよくわからん問題でも得点できる可能性が高くなる


LPIC2以降はコマンドのオプションについて細かく問われる問題は殆ど出ず、代わりにそのコマンドの特徴について聞かれる可能性が高いです。具体的には、一般ユーザで実行できるかroot権限必要か、出力内容についての出題、エラーが起きた時の原因、pamなど事前に必要なライブラリや準備についてなど。
→手元の実行環境で試していると理解が早い

また、用語の意味を問う問題も出題されます。これは消去法で答えるよりも一発で正解を選べないと逆に混乱させられるかも。

Windows上でのRails7を使った開発と詰まったところ

前提としてRuby等はどれも最新バージョンを用いることとします。

ソフトウェア バージョン
rbenv v1.5.1
Ruby 3.3.5-1
Rails 7.2.1.2
bundler 2.5.22

流れ

1. PowerShellインストール

github.com

C:\Users\ユーザ名>winget search Microsoft.PowerShell
'msstore' ソースでは、使用する前に次の契約を表示する必要があります。
Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
ソースが正常に機能するには、現在のマシンの 2 文字の地理的リージョンをバックエンド サービスに送信する必要があります (例: "US")。

すべてのソース契約条件に同意しますか?
[Y] はい  [N] いいえ: Y
名前               ID                           バージョン ソース
------------------------------------------------------------------
PowerShell         Microsoft.PowerShell         7.4.6.0    winget
PowerShell Preview Microsoft.PowerShell.Preview 7.5.0.5    winget

C:\Users\ユーザ名>
2. rbenv for Windowsインストール

ここ
からFor common usersに従い、rbenvのインストールを行う

PS C:\Users\ユーザ名> $env:RBENV_ROOT = "C:\rbenv"
PS C:\Users\ユーザ名> iwr -useb "https://github.com/RubyMetric/rbenv-for-windows/raw/main/tool/install.ps1" | iex


    ディレクトリ: C:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/10/26     11:24                rbenv
Cloning into 'rbenv'...
remote: Enumerating objects: 1658, done.
remote: Counting objects: 100% (491/491), done.
remote: Compressing objects: 100% (190/190), done.
remote: Total 1658 (delta 294), reused 474 (delta 285), pack-reused 1167 (from 1)
Receiving objects: 100% (1658/1658), 454.85 KiB | 6.23 MiB/s, done.
Resolving deltas: 100% (1070/1070), done.
Downloading pre-compiled binaries from GitHub... Finished
Checking rbenv-binary-version.txt from GitHub... OK
Update the local rbenv-binary-version.txt
rbenv-installer: Installation complete!

PS C:\Users\ユーザ名>
3. プロファイルに追記
PS C:\Users\ユーザ名> Test-Path $profile
False
PS C:\Users\ユーザ名>


Falseの場合

PS C:\Users\ユーザ名> New-Item -path $profile -type file -force


    ディレクトリ: C:\Users\ユーザ名\Documents\WindowsPowerShell


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/10/26     16:00              0 Microsoft.PowerShell_profile.ps1


PS C:\Users\ユーザ名>


Trueの場合

PS C:\Users\ユーザ名> Test-Path $profile
True
PS C:\Users\ユーザ名>
PS C:\Users\ユーザ名> notepad $profile

編集後にターミナル再起動して反映


===このシステムではスクリプトの実行が無効になっているため、ファイル~~とか出た場合===

PS C:\Users\ユーザ名> Get-ExecutionPolicy
Restricted
PS C:\Users\ユーザ名> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
PS C:\Users\ユーザ名> Get-ExecutionPolicy
RemoteSigned
PS C:\Users\ユーザ名>
===

※次回起動時に以下のように自動DLが始まる

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新機能と改善のために最新の PowerShell をインストールしてください!https://aka.ms/PSWindows

Seems you have just installed rbenv, auto install MSYS2 for you
MSYS2 is must-have if you want to install gems with C extensions
Begin downloading ...
=> https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.3.5-1/rubyinstaller-devkit-3.3.5-1-x64.exe
rubyinstaller-devkit-3.3.5-1-x64.exe (130.8 MB) [=============================================================] 100%
Installing rubyinstaller-devkit-3.3.5-1-x64.exe(MSYS2) ...
Moving the shared MSYS2 ...
rbenv: Rehash all 13 executables in '3.3.5-1'
rbenv: Remove version 3.3.5-1 registry info
rbenv: The shared MSYS2 was installed successfully!
rbenv: In addition, the newest version '3.3.5-1' was installed for you!
rbenv: Change to global version '3.3.5-1'
rbenv: Rehash all 13 executables in '3.3.5-1'
パーソナル プロファイルとシステム プロファイルの読み込みにかかった時間は 70544 ミリ秒です。
PS C:\Users\ユーザ名>
4. Rubyとrbenvのバージョンを確認
PS C:\Users\ユーザ名> ruby -v
ruby 3.3.5-1 (set by C:\rbenv\global.txt)
PS C:\Users\ユーザ名>

rbenvからも確認できる

PS C:\Users\ユーザ名> rbenv version
3.3.5-1 (set by C:\rbenv\global.txt)
PS C:\Users\ユーザ名>
  • rbenv
PS C:\Users\ユーザ名> rbenv -v
rbenv v1.5.1
PS C:\Users\ユーザ名>
5. SQLite3のインストール

SQLite Download Page
からPrecompiled Binaries for Windowssqlite-tools、sqlite-dllのzipをDLし、解凍して中身の
sqlite3.dll

sqlite3.exe
をC:\rbenv\バージョン\bin
以下に移動

6. Railsインストール
PS C:\Users\ユーザ名> gem install rails
Fetching webrick-1.8.2.gem
Fetching rackup-2.1.0.gem
Fetching rack-3.1.8.gem
Fetching thor-1.3.2.gem
Fetching zeitwerk-2.7.1.gem
Fetching concurrent-ruby-1.3.4.gem

...

Done installing documentation for zeitwerk, thor, webrick, rack, rackup, concurrent-ruby, tzinfo, i18n, connection_pool, activesupport, useragent, nokogiri, crass, loofah, rails-html-sanitizer, rails-dom-testing, rack-test, rack-session, erubi, builder, actionview, actionpack, railties, marcel, activemodel, activerecord, globalid, activejob, activestorage, actiontext, mini_mime, mail, actionmailer, actionmailbox, websocket-extensions, websocket-driver, nio4r, actioncable, rails after 38 seconds
39 gems installed

A new release of RubyGems is available: 3.5.163.5.22!
Run `gem update --system 3.5.22` to update your installation.

PS C:\Users\ユーザ名>

バージョン確認

PS C:\Users\ユーザ名> rails --version
Rails 7.2.1.2

ここまでで一通りの環境構築は完了している

Windows特有のエラー等

1. インストールしただけだとrails g new等が使えない

すげえ致命的☹️
そのまま実行すると、以下のようなエラーが出る

PS C:\Users\ユーザ名\Desktop\work\csvtest\csvtest> rails new csvtest -G
Based on the specified options, the following options will also be activated:

  --skip-decrypted-diffs [due to --skip-git]

      create
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  Gemfile
      create  app
      create  app/assets/config/manifest.js
      create  app/assets/stylesheets/application.css

...


Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
C:/rbenv/3.3.5-1/lib/ruby/gems/3.3.0/gems/psych-5.1.2/ext/psych
C:/rbenv/3.3.5-1/bin/ruby.exe extconf.rb
checking for pkg-config for yaml-0.1... not found
checking for yaml.h... no
yaml.h not found
*** extconf.rb failed ***

...

To see why this extension failed to compile, please check the mkmf.log which can
be found here:

C:/rbenv/3.3.5-1/lib/ruby/gems/3.3.0/extensions/x64-mingw-ucrt/3.3.0/psych-5.1.2/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in
C:/rbenv/3.3.5-1/lib/ruby/gems/3.3.0/gems/psych-5.1.2 for inspection.
Results logged to

...

An error occurred while installing psych (5.1.2), and Bundler cannot continue.

In Gemfile:
  debug was resolved to 1.9.2, which depends on
    irb was resolved to 1.14.1, which depends on
      rdoc was resolved to 6.7.0, which depends on
        psych
         run  bundle lock --add-platform=x86_64-linux
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
Writing lockfile to C:/Users/ユーザ名/Desktop/work/csvtest/csvtest/csvtest/Gemfile.lock
         run  bundle binstubs bundler
Could not find importmap-rails-2.0.3, turbo-rails-2.0.11, stimulus-rails-1.3.4,
debug-1.9.2, rubocop-rails-omakase-1.0.0, web-console-4.2.1, irb-1.14.1,
rdoc-6.7.0 in locally installed gems
       rails  importmap:install
Could not find importmap-rails-2.0.3, turbo-rails-2.0.11, stimulus-rails-1.3.4, debug-1.9.2, rubocop-rails-omakase-1.0.0, web-console-4.2.1, irb-1.14.1, rdoc-6.7.0 in locally installed gems
Run `bundle install` to install missing gems.
       rails  turbo:install stimulus:install
Could not find importmap-rails-2.0.3, turbo-rails-2.0.11, stimulus-rails-1.3.4, debug-1.9.2, rubocop-rails-omakase-1.0.0, web-console-4.2.1, irb-1.14.1, rdoc-6.7.0 in locally installed gems
Run `bundle install` to install missing gems.
PS C:\Users\ユーザ名\Desktop\work\csvtest\csvtest>

mkmf.logを見ろと書いてあるので確認すると、以下のメッセージがあった


pkg_config: checking for pkg-config for yaml-0.1... -------------------- not found

これに関してはまんまぴったりの解決策があった
bundle install の際 psychのインストールに失敗する 【Windows + Ruby3.2以降 + Rails7】 | RYOZEN - Creative Studio

上記リンクに従い、
C:\rbenv\バージョン\lib

libyaml.a

libyaml.dll.a
を配置すればOK

再度rails new すればうまくいく

2. bin/delayed_jobコマンドが使えない
PS C:\Users\ユーザ名\Desktop\work\csvtest> ruby bin/delayed_job start
C:/rbenv/3.3.5-1/lib/ruby/gems/3.3.0/gems/daemons-1.4.1/lib/daemons/daemonize.rb:10:in `fork': fork() function is unimplemented on this machine (NotImplementedError)
        from C:/rbenv/3.3.5-1/lib/ruby/gems/3.3.0/gems/daemons-1.4.1/lib/daemons/daemonize.rb:10:in `safefork'


代わりに、以下コマンドを使う

rake jobs:work
3. Wheneverが使えない

Rake Task作成後に定期実行するやつ。crontabがWindowsにないのが悪い
代わりに、clockworkを使う

clockwork .\config\clock.rb

もしくは、Rake Taskを作成したうえでタスクスケジューラに登録する

Ruby技術者認定試験Silver version3.1受けてきた

学習期間とか教材

教材は

単純に勉強した期間は10日ほど、ただ1日あたり平均2hもやってないです
Version3.1で評価の良い教材がろくにないのが最大の問題で、私はVersion2.1対応を購入したものの自力で3.1までの追加メソッドや仕様について調べる必要がありました。早く誰か本出してよ☹️

勉強の仕方は、教本を一通り読んだ後Rexを繰り返しやって、その後公式模擬試験(github)と教本の演習、模擬試験をやる
→また空き時間にRexやって、不安なところは前日と当日に教本で再確認、プラスでVersion3.1の記法や追加されたメソッド確認
更にchatGPTにVersion3.1で追加されたメソッド教えろとか言っていくつか問題出してもらったり...

色々試したけど、結局教本をちゃんとやったほうが得点できる出題形式でしたね

スコアはこんな感じ

所感

試験そのもの
  • テキストに書いてあることは単純だけど、試験では暗記力が試される問題やかなり意地の悪い問題が出る。事前対策として模擬試験は必須
  • そもそも模擬試験にしたってテキストの端っこに書いてあるような知識を問われたりするので丸ごと暗記してないと意外と得点できない
  • 教本は古いが要点をしっかり押さえており、何よりサンプルコードがわかりやすい。プログラミング言語自体が初めてって人でも試験勉強しながらすんなり習得できると思う
予約が面倒過ぎる
  • 休日は予約が埋まりすぎてて相当前から抑えないと希望の時間帯は殆ど取れない&そもそもの選択肢が少ない。一方で平日は割とスカスカ
  • 場所の選択肢が都内以外はあんまない。私は千葉で受けたかったが2箇所しかなかった

勝浦とか館山とかのあたりに住んでたら試験のためだけに半日失うぞ

  • オンライン試験の仕組みがない。LPICはあるのだから技術的に問題なくできるはず
その他
  • 学習中はそんなに辛くなかったけど、いざ問題を解くタイミングで引数なしのデフォルト値ってなんだっけ?とか返り値の型どうだっけ?とか細かいところがわからなくなりがち
  • たまに書籍等の問題のコードの解答通りに実行しても動かないことがある。間違った知識をつけないためにも、問題を解き終わったら一度コードは実際に動かすべき
  • 実は合格したのは2回目。1回目はGoogleMapがバグり散らかしてたせいで集合時間に30分遅れで行ったこと、それが休日だったために代わりの時間が埋まってて受験できなかった

→でも試験官は話が分かる人でなんとかしてくれそうだったので平日だったらワンチャン時間帯1個ズレで行けたかも?
多少遅刻したからって行きもせずに帰らない方が良いと思いましたまる
これが国外の試験会場だったら即門前払いだろうなあ

LPICのコマンド、設定ファイルの暗記方法について

クソだるい試験のために覚えること覚えないといけないので、ちょっとしたコツを伝授します

設定ファイルパスにはある程度法則がある!
  1. 設定ファイルはGRUB関連以外は/etc以下
  2. 設定ファイル名はほぼすべてが~~.conf

例えば202試験範囲のSambaの設定ファイルは/etc/samba/smb.confだし、102の範囲のDNS問い合わせ先の書いてあるファイルは/etc/resolv.conf
例外的に名前が違うのはGRUB設定ファイルで、GRUB Legacyなら/boot/grub/grub.conf、GRUB2なら/boot/grub2/grub.cfg。Postfixのパラメータ設定ファイルは/etc/postfix/main.cf

設定ファイルはパスを聞かれる問題よりもその中身について出題される方が多かったです。中に何が書いてあるのか、書式はどうなるか、そのあたりを理解したほうがいいです。もちろんフルパスで言えるようにしたほうがいいのは言うまでもない

コマンドのオプションは省略形だけでなく正規形でも覚えるべし

理由は単純、省略形だと逆に覚えづらいから。-cより--create、-dより--deleteの方が何やるか明快でしょ
それにコマンドごとに指定されるオプションが同じでも内容が違ったりするので、覚えれば覚えるほどごっちゃになる罠がある
しかしそんなオプションにもある程度、以下のような傾向があります

  • cは作成(create)…-Cの場合もある
  • dは削除(delete)
  • rは再帰(recursive)
  • uはユーザ関連(user)
  • vは詳細表示…ほぼ出題されないから覚えなくていいです笑

これはほんの一例で、もちろんこれに当てはまらないパターンも多くあります。あくまで傾向の話
他にも、ネットワーク関連のコマンドの場合、-nでDNS問い合わせをしない(引数をIPアドレス表記)ことが多いです(例: netstat, ifconfig, ping)

あとは同じような処理のコマンドでも使い方や出力が異なるものが複数あったりします(例:dig, host, nslookup)
こういう厄介な引掛け問題にいきなり出くわすと正答し辛いので、模擬試験で消化しておきたい

LPICの合格体験記

201の合格体験記を書いたら、当方学易を使っていることもあってそのことをそのままping-tに書いたら規約違反的なメッセージが来たので、ここに書きます。せっかくなのでLPIC1~2の計4つ
まあ競合する他所サイトを紹介するのがご法度っていうのはわからなくもないんだけどさ、、事実としてLPIC2の合格を目指すなら学易は外せないんだよね。許して☹️


対策方法

サクッと終わらせたいなら…

  1. 合格したいなら教材選びを誤るな
  2. 短期集中でやれ

これだけ。手元の環境構築とか一切やらなくても大丈夫
費用対効果ならぬ時間対効果が最大になる方法でやれば結果的に合格率が上がりますよ

教材選び

101と102はping-tのみでおk
201はping-tと学易(ping-tのみでいいって言ってる人もいる)、202はスピマスと学易
特に202は出題内容の的中率が異常すぎて試験のときマジで感謝しました。個人的にこれは1万出しても買う価値ある
学易だけでもいけるかもしれないが基礎力つけたいならスピマスは買っとけ案件
参考までに、ping-tの他人の合格体験記は読んでおいたほうがいいと思います。短期でそこそこ高得点で合格できている人(当然一撃)のものは読む価値が高いです

短期集中

覚えることが多いからと言ってだらだらと数ヶ月もかけると時間の無駄だしそれだとかえって忘れまくるので逆効果。
学習期間について、参考までに私の場合は仕事終わりの空き時間や祝日休日の時間を使いながら、1日あたり平均2~3h程度で101,102,201は1ヶ月、202は約3週間でケリを付けましたが、もっと速く終わらせることもできたはずです
1つずつそれぞれ2~3週間で合格するのが標準、意味不明に速い人だと1週間で1つ終わってたりしている(まあこれはやりすぎ)

問題に関して

101と102はコマンドとオプション、設定ファイル名を暗記する必要があります。GRUBとかその辺はつまらないと思うだろうけどping-tの解説見たりしてなんとか理解しよう。コマ問は暗記できてればただのボーナス問題なので恐れるべからず!
201からは細かい仕様の話とか実際の出力内容から読み取れる内容を答えろだの、出題内容に変化が見れます。たぶん適当に学習してぶっつけ本番で試験受けると死にます

試験だけ受かるのってどうなの?実務で使うために沢山覚えたほうがいいはずでは?

断言しますがこれは誤り。試験に受かりたいならそのための、試験に特化した対策をしてください
ぶっちゃけ実務で使う知識は実務でつくし、必要に応じて細かいことまで調べたり聞いたりする(ことになる)ので、自然と知識が洗練されていきます。LPICに限って言えば試験対策のために覚えた知識のうち一部しか使ってないなんてザラだからね。仕事でカーネルとかGRUB周り触ってるエンジニアなんて全国に何人いんだよって話
敢えて言うなら201のキャパプラは実務でもそこそこ使うコマンド(vmstatとかsar)や考え方が出題されるから理解できるまでやるべし


追記:
303 security version3に合格しました。


ネットワークセキュリティボロボロで草


教材はping-tのみ。丁度3週間学習して受験、目標通り一撃で取りました

version2を受けたことがないので、3になってどれくらい変わったかは正直感覚がわかりません。ただ公式と学易の比較したところ大きくは変わっていなそうなのと、新規に出た脆弱性ペネトレーションテスト周りははっきり言ってボーナス問題なのでむしろ点を稼ぎやすくなった説、あると思います


これで自分の今年の目標は達成したわけだが、まだ他にも今後取ろうと思っている資格があるため、一旦はそちらに注力したいですね。LPICの資格は有効期限5年と決まっているため、それまでにまたLPIC3のどれかを取ればいいわけで。たぶん次取るとしたら仮想化かな…?
混合環境はなんか大変そうなのでやらないです