- Error Tracking https://sentry.io
- Error Tracking https://logrocket.com
- Localisation https://crowdin.com
- Localisation https://poeditor.com
- Auth https://auth0.com
- Continuous Integration https://travis-ci.org/
- E2E Testing https://www.cypress.io
- Cross Browser Testing https://www.browserstack.com
- Code Coverage https://codecov.io
- Serverless https://zeit.co/
2019 update: this essay has been updated on my personal site, together with a followup on how to get started
2020 update: I'm now writing a book with updated versions of all these essays and 35 other chapters!!!!
If there's a golden rule, it's this one, so I put it first. All the other rules are more or less elaborations of this rule #1.
You already know that you will never be done learning. But most people "learn in private", and lurk. They consume content without creating any themselves. Again, that's fine, but we're here to talk about being in the top quintile. What you do here is to have a habit of creating learning exhaust. Write blogs and tutorials and cheatsheets. Speak at meetups and conferences. Ask and answer things on Stackoverflow or Reddit. (Avoid the walled gardens like Slack and Discourse, they're not public). Make Youtube videos
// https://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/ | |
ADD VALUE (PG 9.x) | |
========= | |
# PG 9.6: works from flyway. | |
ALTER TYPE AUDIT_DATABASE_EVENT_TYPE ADD VALUE 'foo'; | |
RENAME VALUE (PG 10.x) | |
============= | |
# PG 10.+: works from flyway (not supported in PG 9.x) |
In this doc, we'll explore two popular libraries: axios
and isomorphic-fetch
.
Quick facts:
- 37,439 stars on GitHub
- 130 contributors
- most recent commit: March 8th, 2018
- created in Aug. 2014
if (process.argv.length < 3) { | |
throw `Usage: ${process.argv[1]} path_prefix` | |
} | |
const PATH_PREFIX = process.argv[2] | |
const path = require('path') | |
const AWS = require('aws-sdk') | |
const ssm = new AWS.SSM() | |
function getParametersByPath(nextToken, callback) { |
let collapseElements = document.querySelectorAll('[data-toggle="collapse"]'); | |
const CLASS_SHOW = 'show'; | |
const CLASS_COLLAPSE = 'collapse'; | |
const CLASS_COLLAPSING = 'collapsing'; | |
const CLASS_COLLAPSED = 'collapsed'; | |
const ANIMATION_TIME = 350; // 0.35s | |
function handleCollapseElementClick(e) { | |
let el = e.currentTarget; | |
let collapseTargetId = el.dataset.target || el.href || null; |
// No Security | |
{ | |
"rules": { | |
".read": true, | |
".write": true | |
} | |
} |