DHH's keynote at RailsConf 2014
A series of videos with well-respected programmers debating TDD with DHH
import java.io.IOException; | |
import java.io.InputStream; | |
/** | |
* An input stream capable of reading individual bits from an underlying input stream. | |
* | |
* EN 605.421 Foundations of Algorithms | |
* Johns Hopkins Engineering for Professionals | |
* Summer 2017 | |
* |
require 'parallel' | |
require 'thread' | |
# The asset preloader is designed to precompute and cache all precompilable | |
# assets in parallel to avoid doing it in serial on the first request. As of | |
# Sprockets 3, all assets on the precompile list (i.e. config.assets.precompile) | |
# are compiled on the first request whether the current page has asked for them | |
# or not. Obviously such behavior can mean a very slow initial request (we were | |
# seeing load times on the order of 10-11 minutes). By preloading, or warming the | |
# sprockets cache, initial page load times can be reduced to ~15 seconds (with |
#! /usr/bin/env ruby | |
ENV['TXGH_CONFIG'] = "file://#{File.expand_path('../../config/txgh-config.yml', __FILE__)}" | |
require 'bundler' | |
Bundler.setup | |
require 'txgh' | |
config = begin |
#! /usr/bin/env ruby | |
ENV['TXGH_CONFIG'] = "file://#{File.expand_path('../../config/txgh-config.yml', __FILE__)}" | |
require 'bundler' | |
Bundler.setup | |
require 'txgh' | |
config = begin |
require 'digest/md5' | |
# The AssetFingerprinter calculates a digest hash of all the app's assets. It is | |
# used to avoid precompiling assets if none of them have changed since the last | |
# precompilation. This is done by generating a list of all assets from the list | |
# of configured asset paths and throwing all their contents through a digest | |
# algorithm. The result is a unique asset "fingerprint" that can be compared to | |
# other fingerprints to determine if any assets have changed. | |
# | |
# The fingerprinter also allows adding any additional files that should be used |
# name: human-readable name | |
# point_value: number of points earned | |
# priority: how likely the score is to actually happen | |
ScoreType = Struct.new(:name, :point_value, :priority) | |
SCORE_TYPES = [ | |
ScoreType.new('safety', 2, 5), | |
ScoreType.new('field goal', 3, 2), | |
ScoreType.new('touchdown', 6, 3), | |
ScoreType.new('touchdown with extra point', 7, 1), |
require 'yaml' | |
require 'optparse' | |
require 'set' | |
$options = { keys: [] } | |
$executable_name = 'envize.rb' | |
OptionParser.new do |opts| | |
opts.banner = "Usage: #{$executable_name} [options]" |
Yep, it's time for some cool Ruby trickery.
At their core, Ruby strings are just sequences of bytes. How you or your computer chooses interpret and display those bytes can mean the difference between legible text and complete garbage. Consider UTF-8 text for example. We now have great Unicode support in Ruby (as of 1.9) via the String#encode
method and its friends, but again, strings are really just bytes.
Telling Ruby your string is encoded in UTF-8 tells it how to print your string on the screen or in your web app. For example, let's say you have a string that contains Japanese text (says 'arigato') "ありがと"
. Furthermore, let's pretend Ruby thinks the string is encoded in ASCII, which doesn't support Japanese characters. If you tried to print your string in the terminal, you might see something like this: "\xE3\x81\x82\xE3\x82\x8A\xE3\x81\x8C\xE3\x81\xA8"
. What you're seeing
require 'find' | |
def provide(*requires, &block) | |
modules = requires.map do |req| | |
Module.new do | |
file_fragment = "#{req}.rb" | |
file = Find.find(*($: + ['.'])) do |f| | |
break f if f =~ /#{file_fragment}\z/ | |
end |