@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

Ruby

ActiveRecordからカラムの型情報を得る

次のスクリプトで、テーブル定義とActiveRecordクラスを用意します。 ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") ActiveRecord::Schema.define do create_table :employees do |t| t.string :name t.integer :age …

ActiveRecordのcreated_at, updated_atの時刻を固定値にするモンキーパッチ

class ActiveRecord::Base def self.current_time_from_proper_timezone Time.local(2008, 9, 1, 10, 5, 0) end end https://github.com/rails/rails/blob/817148a7472413b31b3334c20fc08c6da5ffc68a/activerecord/lib/active_record/timestamp.rb#L77-L79 …

ActiveRecordインスタンスのInteger型カラムのデフォルト値のbefore_type_castは文字列

require "active_record" ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") ActiveRecord::Schema.define { create_table(:users) { _1.integer :age, default: 20 } } class User < ActiveRecord::Base; end u = User.n…

RDBを使わずにActiveRecordのインスタンスをつくる

ActiveRecordのソースコードを読みたいです。 プログラムのソースコードを読むときは、実際に動かしてみて、動きを追っていくと理解が早いです。 ActiveRecordはデータベースのスキーマ情報を元にインスタンスをつくります。 単にPost.newを実行しても次のよ…

bootstrap_views_generatorをつかう

Railsのジェネレーターはscaffoldテンプレートをlib/templatesに作成したテンプレートファイルで上書きすることができます。 ここにBootstrapのクラスを追加したテンプレートファイルを置けば、scaffoldである程度見た目が整った画面を作れます。 github.com…

-Jをつけて作成したRuby on Rails 6プロジェクトにJavaScriptを導入する

簡単なアプリケーションを作るのにWebpacker使いたくないと思いました。 rails newコマンドに、雑に-Jオプションをつけました。 すべてのJavaScript機能をOFFにしてRuby on Railsアプリケーションを初期化しまいました。 しかしscaffoldで作成する削除機能で…

Ruby on Rails 6にBootstrap 5を導入する

Before Bootstrap5適用前のテーブル After Bootstrap5を適用したテーブル コミット feature: Add Bootsrap style · ledsun/pc_management_desk@e314d8a · GitHub 全画面に手を入れないといけないのは面倒でした。 感想 いまのところ削除機能が動いていないこ…

Ruby on Railsでサクサクとアプリケーションのプロトタイプを作る練習

お題を PC管理台帳とします。 ごくごく簡単なリリースが一つだけの一覧画面を作ろうと思います。 プロジェクトの初期化 bundle init Gemfileからrailsのコメントアウトを外します。 bundle bundlerってnpx的なテンポラリーな実行コマンドってないんでしたっ…

FactoryBotのふたつのストラテジーをお絵かき

読んだソースコードを図解する練習です。

CVE-2015-9284 と OmniAuth 2.0.0 と Devise 4.8.0 の歩み

2019/04/26 OmniAuthに脆弱性が発見されます。 NVD - CVE-2015-9284 2020/12/11 上記の脆弱性に対応した、OmniAuth 2.0.0 RC1がリリースされます。 github.com 2020/12/12 OmniAuth 2.0.0 RC1がリリースへのフィードバックが求められます。 github.com 2021/…

ActiveRecordのソースコードを読む

Ruby on Railsを使ったアプリケーション開発で、DBにMySQLを使いカラムの型定義がIntegerの時にデフォルト値が文字列で設定される現象を観測しました。 デフォルト値だけ見て型をみないことに疑問を感じました。 そこでActiveRecordのソースコードを読みまし…

FactoryBotのソースコードを読んだ

背景 最近、コードリーディングが話題になりました。 note.com blog.riywo.com ソースコードが読めることは武器になるようです。というわけでソースコードを読みます。 お題 MySQLのカラムの型によって、FactoryBot.buildでSQLが発行されるときとされないと…

RubyMineからappディレクトリが消えたときに

現象 .gitignoneに.ideaディレクトリを追加せずにgitブランチをガチャガチャやっていると、.ideaディレクトリの中のファイルが消えることがあります。 このとき次のようにProject tool windowからファイルは見えるがディレクトリが見えない状態になります。 …

Ruby3.0でunicornをunicorn_railsコマンドから実行するとセグフォする

rails newだけしたアプリケーションで次の感じでセグメンテーション違反が発生します。 ~ bundle exec unicorn_rails I, [2021-03-30T14:17:52.498866 #98882] INFO -- : listening on addr=0.0.0.0:8080 fd=13 I, [2021-03-30T14:17:52.498987 #98882] INFO…

bundle outdatedに35分掛かる

次のリポジトリで、bundle outdatedを実行すると35分掛かりました。 github.com ~ time bundle outdated Fetching https://github.com/plataformatec/devise Fetching https://github.com/jdkim/stardog-rb.git Fetching gem metadata from https://rubygems…

Ruby 2.5とRails3.2のときrake db:createでString can't be coerced into Integerが発生する

現象 ~ bundle exec rake db:create Deprecation warning: Expected string default value for '--quiet'; got false (boolean). This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_…

またまた Gitのdiffを振り返る

ふたたび Gitのdiffを振り返る - @ledsun blog で日単位で集計しました。 週、月、年単位の集計結果も見ていきましょう。 週 gnuplot> set xdata time gnuplot> set timefmt "%Y-%m-%d_%H:%M:%S" gnuplot> plot 'all_log_week.dat' using 1:2 w i title 'ins…

ふたたび Gitのdiffを振り返る

続々 Gitのdiffを振り返る - @ledsun blogでコミット単位でのファイルの変更行数の遷移をふりかえりました。 コミット単位では列間が詰まりすぎてグラフが見にくいです。 特に、Gitのコミット数を振り返る - @ledsun blog で見たように、2020年9月以降コミッ…

続々 Gitのdiffを振り返る

続 Gitのdiffを振り返る - @ledsun blog で1000行以上の変更があるコミットはツールによるフォーマット変更であることがわかりました。 また、日付でまとめてしまうと一日の変更行数が2000を超えます。 これはgit rev-listのbeforeやafterの挙動によるもので…

rbenvでRuby 3.0を使う

Homebrewをインストールし直す - @ledsun blogでrbenvをgitから入れました。 git pullします。 ~ cd .rbenv/ ~ git pull --ff-only Already up to date. んー、rbenv install --list-allしても3.0.0が出てきません。 cd ~/.rbenv/plugins/ruby-build ~ git p…

続 Gitのdiffを振り返る

Gitのdiffを振り返る - @ledsun blog でGitの記録から、約2年間の毎日のファイルの変更行数を見ました。 1日に4000行の人力では不可能に思える変更が見つかりました。 今度は巨大な変更を含むコミットを探してみましょう。 次のRubyスクリプトを使います。 r…

Gitのdiffを振り返る

Gitのコミット数を振り返る - @ledsun blogで、Gitのコミット数をふりかえりました。 今年はコミットの粒度を変えたためコミット数が増えています。 その結果、作業効率は上がったのでしょうか?今度はGitのdiffをふりかえってみます。 日付単位でgit diffの…

Gitのコミット数を振り返る

次のRubyスクリプトを使って、あるリポジトリの2020年のGitコミット数を月単位で集計します。 require 'date' 1.upto(12) do |i| start_date = Date.new(2020, i, 1) end_date = (start_date >> 1) - 1 commits = `git log --oneline --since #{start_date} …

Legacy on Rails

最近古いバージョンのRailsに触ることが多かったので、二度と使わないで済むことを祈りつつ、得た知見をメモします。 Ruby 2.4 と PostgreSQL と Rails 3.2 Rails 3.2 と PostgreSQL とRuby 2.4で rake db:create だけコケるおもしろ現象に出会いました。 ht…

React on Ruby on Railsの素振り

Ruby on RailsとReactの連携の仕方がイマイチ理解できていないので、簡単なアプリケーションを作って勉強します。 4月生まれのホットな動画を見つけたのでこちらを参考にします。 www.youtube.com 動画でなくテキストがお好みの人は、GitHub - zayneio/open-…

一度moveしたオブジェクトは移動先のRactorが死んでも帰ってこない

moveしたオブジェクトを参照するとRactor::MovedError 次のRubyスクリプトがあります。 dead = Ractor.new {} dead.send STDIN, move: true STDIN.gets RactorにSTDINをmoveしてから、STDINを使います。 するとRactor::MovedErrorが起きます。 ~ ruby dead_a…

sjisの文章をShift_JISとして読むとEncoding::UndefinedConversionError

Rubyの話です。 ‘Ⅸ’(ローマ数字の9) を含むsjisの文章をShift_JISとして読むとエラーが起きます。sjisとして読むとエラーが起きません。 たとえば、 'Ⅸ'.encode('sjis', 'utf-8').encode('utf-8', 'Shift_JIS') はエラーが起きて 'Ⅸ'.encode('sjis', 'utf-…

rbenvでのバージョン指定が効かなくなりました

~ rbenv version 2.5.5 (set by /Users/shigerunakajima/pubannotation/.ruby-version) ~ ruby --version ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin18] ruby のバージョンが上がっている。パスが上書きされたのでしょうか? ~ echo $P…

gem install libxml-ruby -v '3.1.0' に失敗します

Building native extensions. This could take a while... ERROR: Error installing libxml-ruby: ERROR: Failed to build gem native extension. current directory: /Users/shigerunakajima/.rbenv/versions/2.5.5/lib/ruby/gems/2.5.0/gems/libxml-ruby-3…

切符を通したときだけ通れる改札口Ractor

前回、Ractor.selectでtakeとrecvを両方待てることがわかりました。 これを使って切符を通したときだけ通れる改札口を作ります。 完成形 キーボード入力を待つRactor = Ractor.new { loop { Ractor.yield gets.chomp } } 改札口Ractor = Ractor.new(キーボー…