Skip to content

Instantly share code, notes, and snippets.

@dguo
dguo / broken-instanceof.ts
Created May 12, 2021 13:56
blog - How to Fix instanceof Not Working For Custom Errors in TypeScript
class DatabaseError extends Error {}
const error = new DatabaseError("Unique constraint violation");
// prints "true"
console.log(error instanceof Error);
// incorrectly prints "false"
console.log(error instanceof DatabaseError);
@dguo
dguo / benchmark.sh
Created December 29, 2020 14:04
blog - How to Concatenate Strings in Lua
hyperfine 'lua slow.lua'
# Benchmark #1: lua slow.lua
# Time (mean ± σ): 1.287 s ± 0.115 s [User: 1.120 s, System: 0.078 s]
# Range (min … max): 1.187 s … 1.528 s 10 runs
hyperfine 'lua fast.lua'
# Benchmark #1: lua fast.lua
# Time (mean ± σ): 39.3 ms ± 3.8 ms [User: 34.6 ms, System: 2.8 ms]
# Range (min … max): 35.3 ms … 58.3 ms 48 runs
@dguo
dguo / reddit.js
Created August 16, 2020 14:23
blog - Morning Joy - reddit-aww
const got = require("got");
async function getAwwPost() {
const response = await got(
"https://www.reddit.com/r/aww/top.json?t=day"
).json();
for (const post of response.data.children) {
if (post.data.post_hint !== "image") {
continue;
@dguo
dguo / twilio.js
Created August 16, 2020 14:20
blog - Morning Joy - twilio-sms
const twilio = require("twilio")(
process.env.TWILIO_ACCOUNT_SID,
process.env.TWILIO_AUTH_TOKEN
);
async function sendText(body, mediaUrl) {
const text = await twilio.messages.create({
body,
mediaUrl: mediaUrl ? [mediaUrl] : [],
from: process.env.TWILIO_PHONE_NUMBER,
@dguo
dguo / boxstarter.ps1
Last active April 16, 2019 22:00
Boxstarter config for Windows
# Run from a PowerShell prompt with administrative privileges:
# Install-BoxstarterPackage -PackageName <url> -DisableReboots
choco install anki
choco install autohotkey
choco install firefox-dev --pre
choco install googlechrome
choco install logitechgaming
choco install steam
choco install todoist
@dguo
dguo / smart-loading.html
Last active March 24, 2019 03:37
blog - How to Add Copy to Clipboard Buttons to Code Blocks in Hugo - smart-loading
{{ if (findRE "<pre" .Content 1) }}
<script src="/js/copy-code-button.js"></script>
{{ end }}
@dguo
dguo / check-clipboard.js
Created March 23, 2019 02:46
blog - How to Add Copy to Clipboard Buttons to Code Blocks in Hugo - check-clipboard
if (navigator && navigator.clipboard) {
addCopyButtons(navigator.clipboard);
} else {
var script = document.createElement('script');
script.src = 'https://cdnjs.cloudflare.com/ajax/libs/clipboard-polyfill/2.7.0/clipboard-polyfill.promise.js';
script.integrity = 'sha256-waClS2re9NUbXRsryKoof+F9qc1gjjIhc2eT7ZbIv94=';
script.crossOrigin = 'anonymous';
script.onload = function() {
addCopyButtons(clipboard);
};
@dguo
dguo / add-copy-buttons.js
Last active March 24, 2019 03:32
blog - How to Add Copy to Clipboard Buttons to Code Blocks in Hugo - add-copy-buttons
function addCopyButtons(clipboard) {
document.querySelectorAll('pre > code').forEach(function (codeBlock) {
var button = document.createElement('button');
button.className = 'copy-code-button';
button.type = 'button';
button.innerText = 'Copy';
button.addEventListener('click', function () {
clipboard.writeText(codeBlock.innerText).then(function () {
/* Chrome doesn't seem to blur automatically,
@dguo
dguo / copy-code-button.css
Created March 23, 2019 02:42
blog - How to Add Copy to Clipboard Buttons to Code Blocks in Hugo - button-styling
.copy-code-button {
color: #272822;
background-color: #FFF;
border-color: #272822;
border: 2px solid;
border-radius: 3px 3px 0px 0px;
/* right-align */
display: block;
margin-left: auto;
@dguo
dguo / add-buttons.js
Last active March 24, 2019 03:24
blog - How to Add Copy to Clipboard Buttons to Code Blocks in Hugo - add-buttons
document.querySelectorAll('pre > code').forEach(function (codeBlock) {
var button = document.createElement('button');
button.className = 'copy-code-button';
button.type = 'button';
button.innerText = 'Copy';
var pre = codeBlock.parentNode;
if (pre.parentNode.classList.contains('highlight')) {
var highlight = pre.parentNode;
highlight.parentNode.insertBefore(button, highlight);