For a basic discussion and demo, see https://www.postgresql.org/docs/current/explicit-locking.html#id-1.5.12.6.8.2
My own demo follows.
Create two tables with unique indexes:
-- (This code was run in PostgreSQL 9.6.1) | |
-- Demonstration of how serializable isolation for PostgreSQL, which detects possible | |
-- interference between concurrent transactions, can produce false positives | |
-- in psql, create the following table | |
CREATE TABLE users( | |
id SERIAL NOT NULL PRIMARY KEY, | |
username VARCHAR NOT NULL | |
); |
# Exponential backoff in Ruby | |
begin | |
make_request | |
rescue RequestError => e | |
if retries <= max_retries | |
retries += 1 | |
sleep 2 ** retries | |
retry | |
else | |
raise "Timeout: #{e.message}" |
For a basic discussion and demo, see https://www.postgresql.org/docs/current/explicit-locking.html#id-1.5.12.6.8.2
My own demo follows.
Create two tables with unique indexes:
# Script to delete all but a specified list of tags | |
# from a git repo, both locally and remotely | |
# Run like `mode=test ruby git_tag_cleanup` to test; | |
# use 'execute' mode to actually delete the tags | |
mode = ENV['mode'] || 'test' | |
tags_to_keep = %w[v2.0.0 v2.0.1] | |
tags_to_delete = `git tag`.split("\n") - tags_to_keep |
class Person < ActiveRecord::Base | |
# This manual SQL query... | |
scope :allowed_to_eat_cheese, joins( | |
<<-SQL | |
INNER JOIN cities ON people.city_id = cities.id | |
INNER JOIN states ON cities.state_id = states.id | |
SQL | |
).where('states.allows_cheese_consumption' = 'Yeppers') |
def factorial(n) | |
(1..n).reduce(:*) | |
end | |
SECONDS_PER_STEP = 0.001 | |
def total_seconds(n) | |
factorial(n) * SECONDS_PER_STEP | |
end |
ruby -rpry some_script.rb
- the r means require. If there's a binding.pry
there, you'll be on it.
Pry gives you a graphical look at your program in progress, lets you cd
among objects, ls
to see available variables, etc. You can't step, though; just explore a snapshot at that moment.
Must install debugger gem for your version of Ruby (1.9 is 'gem install debugger'). Doesn't play well with Spork.
Quote from Elixir Mix 63 - "063: Designing Elixir Systems With OTP with Bruce Tate and James Gray", starting at 01:03:13
"I've worked at a bunch of companies building web apps for a long time, and I keep seeing this same pattern, and it haunts me. In the web world, all we want is these long interactions with people, and we live in this stateless world. So what we do is, the first part of every request, we do thirty queries to re-establish the state of the world that we just forgot a few seconds ago after the last request. And then we go forward and make one tiny step forward, and then we forget everything again, so that when the next request comes in we can do thirty queries to put it all back and make one more tiny step. And I kept thinking, "there has to be a better way than this, right?"
And if you look at web advancements over the years, most of the things we're doing are
Based on my reading and listening, observability is the ability to answer a wide range of questions about a system's behavior based on previously-captured data. Ideally, it lets you see how a system is performing for various use cases and users in real time, and watch how that changes as new code goes into production.
Observability folks like to talk about it as "testing in production", to which they add that everyone does this, like it or not, because only in production can we see the kinds of edge cases that happen with real data, real traffic, real network conditions, etc. Observability's goal is that when we test in production, we can get much more detailed information than "it works" or "it doesn't work", and thus find and fix problems much more easily.
For example, a user emails and say "doing X in the system is slow for me this morning." With poor observability, you might be able to look at the system's overall latency, or the overall CPU load of the se
# Scopes that make use of the index | |
def self.within_distance_of(lat:, lng:, meters:) | |
where(%{ | |
ST_DWithin( | |
ST_GeographyFromText( | |
'SRID=4326;POINT(' || #{table_name}.longitude || ' ' || #{table_name}.latitude || ')' | |
), | |
ST_GeographyFromText('SRID=4326;POINT(%f %f)'), | |
%d | |
) |