Rails is the well known and popular web framework built upon ruby. Ruby’s Exceptional Creatures is a resource from HoneyBadger that documents common ruby exception.
Improving Ruby Test Performance particularly RSpec test suites.
speedscope is a flamegraph tool
Improving Rails Performance
bootsnap improves rails application boot times through caching
Fixing implicit declaration error during ruby gem build1
gem install mailcatcher -- --build-flags --with-cflags="-Wno-error=implicit-function-declaration"Getting the memory size of an object hacks
puts RUBY_VERSION #=>1.9.3
 
require 'objspace'
 
p ObjectSpace.memsize_of("a"*23)    #=> 23
p ObjectSpace.memsize_of("a"*24)    #=> 24
p ObjectSpace.memsize_of("a".*1000) #=> 1000
h = {"a"=>1, "b"=>2}
p ObjectSpace.memsize_of(h)         #=> 116- Note that this doesn’t do anything for finding the references of an object
Delegation
Memory bloat and management
- get_process_mem gem
- jemalloc is an alternate implementation of malloc that emphasizes fragmentation avoidance
Halve Your Memory Usage with these 12 Weird Tricks is a conference topic by Nate Berkopec on rails app memory techniques
Setting up a Ruby Gem
As of early 2024:
- bundle gem <NEW GEM NAME>will create the new gem folder with rspec setup properly.
- Add a CHANGELOG.mdfile.
- Create a new github repo matching the gem name, set it in the gemspec and then use that to set subsequent links
- Create a LICENSEfile and set the license in the gemspec
- Add CI with github actions
- Add Coverage with coveralls and CI
- Setup gem publishing with github actions
Better command line option parsing in rake tasks hacks
When passing args to a rake you end up with positional args being your only option, and you have to do some escaping in zsh, so a rake task call looks like this:
bundle exec rake some_task\[1\]If you would like to use named args, you can use ARGV and make a call like this:
bundle exec rake some_task -- post_id=1In your rake task you parse these args:
parsed_args = ARGV.filter_map do |a|
  if /^[A-z_]*=([0-9]*|true|false)/.match?(a)
    k, v = a.split('=')
    v = case v
        when /[0-9]+/
          v.to_i
        when /true/
          true
        when /false/
          false
        else
          v
        end
    [k.to_sym, v]
  end
end.to_hThis will give you an array like:
{
  post_id: 1
}Warning!
This will do some strange things to
gets. The solution here is to call$stdin.getsrather than the nakedgets
1. Amiridis, P. Fixing the implicit declaration of function error when installing ruby gems. https://petros.blog/2020/10/02/fixing-the-implicit-declaration-of-function-error-when-installing-ruby-gems/ (2020).