Skip to content
View summary.md

My summary of https://www.youtube.com/watch?v=IqrwPVtSHZI

TL;DR:

Rails has a library, ActiveSupport, which adds methods to Ruby core classes. One of those methods is String#blank?, which returns a boolean (sometimes I miss this convention in Rust, the ?) if the whole string is whitespace or not. It looks like this: https://github.com/rails/rails/blob/b3eac823006eb6a346f88793aabef28a6d4f928c/activesupport/lib/active_support/core_ext/object/blank.rb#L99-L117

It's pretty slow. So Discourse (which you may know from {users,internals}.rust-lang.org) uses the fast_blank gem, which provides this method via a C implementation instead. It looks like this: https://github.com/SamSaffron/fast_blank/blob/master/ext/fast_blank/fast_blank.c

For fun, Yehuda tried to re-write fast_blank in Rust. Which looks like this:

View bm_throw_raise.rb
require 'benchmark/ips'
Benchmark.ips do |x|
x.report(:raise_rescue) do
begin
raise ArgumentError
rescue ArgumentError
end
end
View fix_n_plus_one_queries_on_accepts_nested_attributes.rb
# We noticed that adding `accepts_nested_attributes_for :comments, allow_destroy: true`
# caused extra queries to be run when serializing comments in a post
# and including the post name in each comment resource object (this is JSON API, names changed):
#
# blog_id = params.permit(:id)[:id]
# Blog = Blog.where(id: blog_id).includes(posts: [:comments]).first
# comments = blog.posts.flat_map(&:comments)
# comment_fields = {comments: [:id, :title, :body, :post], posts: [:name]}
# comment_includes = [:post]
#
View rails_rendering_stack.txt
#<Class:ActionController::Parameters>#always_permitted_parameters=:126 ([[:req, :obj]])
ActionDispatch::Http::ParameterFilter#initialize:6 ([[:opt, :filters]])
ActionDispatch::Http::ParameterFilter#initialize:6 ([[:opt, :filters]])
ActiveSupport::Callbacks::ClassMethods#normalize_callback_params:594 ([[:req, :filters], [:req, :block]])
ActiveSupport::Callbacks::ClassMethods#normalize_callback_params:594 ([[:req, :filters], [:req, :block]])
ActiveSupport::Callbacks::ClassMethods#normalize_callback_params:594 ([[:req, :filters], [:req, :block]])
#<Class:ActiveModelSerializers::SerializableResource>#_render_callbacks=:83 ([[:req, :val]])
ActiveModelSerializers::Logging::ClassMethods#instrument_rendering:18 ([])
ActiveModelSerializers::Callbacks::ClassMethods#around_render:50 ([[:rest, :filters], [:block, :blk]])
ActiveSupport::Callbacks::ClassMethods#normalize_callback_params:594 ([[:req, :filters], [:req, :block]])
View irb3.rb
#!/usr/bin/env ruby
# encoding: utf-8
# irb3 - Runs an IRB-esque prompt (but it's NOT really IRB!) over multiple
# versions of Ruby at once (using RVM)
#
# By Peter Cooper, BSD licensed
#
# Main dependency is term-ansicolor for each impl:
# rvm exec gem install term-ansicolor
View dl.sh
#/usr/bin/env bash
json_url() {
local base="https://m.guidebook.com/api/v1/public_event/?guide__id=64858&limit=0&start_time__year=2016&start_time__month=5"
local day="$1"
local url="${base}&start_time__day=${day}"
echo -e "$url"
$url
}
for day in 4 5 6; do
curl -XGET $(eval "json_url $day") -o "may_${day}.json"
View autodoc_config.diff
diff --git a/Gemfile b/Gemfile
index f34a069..cb26600 100644
--- a/Gemfile
+++ b/Gemfile
@@ -100,6 +100,8 @@ group :test do
gem 'rspec', '~> 3.3'
gem 'rspec_junit_formatter', '~> 0.2' # per https://circleci.com/docs/test-metadata#automatic-test-metadata-collection
gem 'rspec-rails', group: :development
+ gem 'autodoc', require: false
+ gem 'redcarpet', require: false
View video_to_gif_osx.sh
for f
do
# Change this value to increase maximum size
GIF_MAX_SIZE=480
dir="$(dirname "$f")"
name="$(basename "$f")"
cd "$dir"
View 20160307172445_change_paperclip_attachment_path.rb
class MoveAttachmentsToNewLocation < ActiveRecord::Migration
def initialize(name = self.class.name, version = nil)
access_key = Rails.application.secrets.g3_access_key_id
secret_key = Rails.application.secrets.g3_secret_access_key
storage = Fog::Storage::Google.new google_storage_access_key_id: access_key,
google_storage_secret_access_key: secret_key
@bucket_name = Rails.application.secrets.g3_bucket
@bucket = storage.directories.get(@bucket_name)
super(name, version)
View README.md

Let's say you have a model, with an files attached, using Paperclip. You have a couple millions of those files and you're not sure that every one of them (and all its thumbnails) are still used by a database record.

You could use this rake task to recursively scan all the directories and check if the files need to be kept or destroyed.

In this example, the model is called Picture, the attachment is image and the path is partitioned like images/001/412/497/actual_file.jpg

The task is going down the path. Each time the path ends with 3 triplets of digits ("001/412/497" for example) it looks for a record with the ID 1412497. If such a record doesn't exist, the whole directory is moved to a parallel images_deleted directory. At the end you can delete the files if you like, or move them to an archive location.

You can use the "dry run" mode : to print which files would be removed

Something went wrong with that request. Please try again.