Skip to content

Instantly share code, notes, and snippets.

View davidmurdoch's full-sized avatar
💭
Building

David Murdoch davidmurdoch

💭
Building
View GitHub Profile
@davidmurdoch
davidmurdoch / ini.ts
Created March 5, 2024 21:22
A TypeScript generator function that parses the given ini file (as a buffer) into sections, keys, and values (not tested, just for fun)
/**
* Enum representing the possible states of the parser.
*/
enum State {
Start,
Key,
Value,
Comment,
}
@davidmurdoch
davidmurdoch / getLastCommitDatetimeUtc.ts
Last active December 15, 2023 15:17
A Node.js function to get the latest commit's authorship timestamp in UTC (millisecond precision)
/**
* Retrieves the datetime of the last commit in UTC for the current Git branch.
*
* The author timestamp is used for its consistency across different
* repositories and its inclusion in the Git commit hash calculation. This makes
* it a stable choice for reproducible builds.
*
* @returns Millisecond precision timestamp in UTC of the last commit on the
* current branch. If the branch is detached or has no commits, it will throw an
* error.
@davidmurdoch
davidmurdoch / typesafe-hex-strings.ts
Last active September 29, 2021 07:04
Typesafe, `0x` prefixed, hex strings up to 32 bytes long
type Cast<T, U> = T extends U ? T : U;
type Prop<T, K> = K extends keyof T ? T[K] : never;
type HexChars = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" | "d" | "e" | "f";
type HexPairs = `${HexChars}${HexChars}`;
/**
* returns a Tuple of hex pairs (bytes), or `never` if the input doesn't contain an even number of hex characters
*/
type Hex<S extends string> =
S extends "" ? [] :
@davidmurdoch
davidmurdoch / hex-to-dec.ts
Created September 11, 2020 16:02
Convert hexadecimal string into decimal array in typescript
// requires the types from: https://gist.github.com/davidmurdoch/3145903f3a267543568225c68dcc325b
// this is *very* limited in string size at the moment
type Data<T extends string> = {
value: DATA<T>,
// @ts-ignore: Ignore type instantiation depth errors as we have already limited our depth
toBuffer: () => ToUInt8<Hex<Trim<T, "0x">>>
}
type HexLookUp = {"00": 0, "01": 1, "02": 2, "03": 3, "04": 4, "05": 5, "06": 6, "07": 7, "08": 8, "09": 9, "0a": 10, "0b": 11, "0c": 12, "0d": 13, "0e": 14, "0f": 15, "10": 16, "11": 17, "12": 18, "13": 19, "14": 20, "15": 21, "16": 22, "17": 23, "18": 24, "19": 25, "1a": 26, "1b": 27, "1c": 28, "1d": 29, "1e": 30, "1f": 31, "20": 32, "21": 33, "22": 34, "23": 35, "24": 36, "25": 37, "26": 38, "27": 39, "28": 40, "29": 41, "2a": 42, "2b": 43, "2c": 44, "2d": 45, "2e": 46, "2f": 47, "30": 48, "31": 49, "32": 50, "33": 51, "34": 52, "35": 53, "36": 54, "37": 55, "38": 56, "39": 57, "3a": 58, "3b": 59, "3c": 60, "3d": 61, "3e": 62, "3f": 63, "40": 64, "41": 65, "42"
@davidmurdoch
davidmurdoch / test.ts
Last active September 10, 2020 17:06
Typesafe Ethereum Transaction hash
type Cast<T, U> = T extends U ? T : U;
type Prop<T, K> = K extends keyof T ? T[K] : never;
type HexChars = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" | "d" | "e" | "f";
type HexPairs = `${HexChars}${HexChars}`;
type Hex<S extends string> =
S extends "" ? [] :
S extends `${HexPairs}${infer R}` ? S extends `${infer C}${R}`
? [C, ...(Hex<R> extends infer X ? Cast<X, string[]> : never)]
: never : never;
@davidmurdoch
davidmurdoch / using.js
Last active July 11, 2020 01:34
C#'s using in JS, ish
const fs = require('fs');
const {promisify} = require('util');
const open = promisify(fs.open.bind(fs));
async function using(closable, fn) {
const fd = await closable;
try {
await fn(fd);
} finally {
closable && typeof closable.close === "function" && closable.close();
@davidmurdoch
davidmurdoch / HackyBigDecimal.js
Created May 3, 2019 17:26
Hacked together an implementation of big decimals using `BigInt`. Doesn't do division very well. Lots of issues.
function getDecimalSeparator(locale) {
const numberWithDecimalSeparator = 1.1;
return Intl.NumberFormat(locale)
.formatToParts(numberWithDecimalSeparator)
.find(part => part.type === 'decimal')
.value;
}
getDecimalSeparator();
const RADIX_PREFIX = {
@davidmurdoch
davidmurdoch / frame-buster-buster
Created May 26, 2011 22:14
Frame buster Buster
(function(){
var preventBust = 0;
window.onbeforeunload = function () {
preventBust++;
};
setInterval(function () {
if (preventBust > 0) {
preventBust -= 2;
window.top.location = "/statuscode/204";
}
@davidmurdoch
davidmurdoch / snippet-deflator.aspx.cs
Created October 9, 2013 12:25
The code behind my snippet deflator (http://www.vervestudios.co/projects/compression-tests/snippet-deflator). Original written sometime in 2009.
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Form != null && Request.Form.Count > 0 && Request.Form["text"] != null)
{
var text = Request.Form["text"];
byte[] byteArray = Encoding.ASCII.GetBytes(text);
using (var stream = new MemoryStream())
{
using (var strm = new zlib.ZOutputStream(stream, zlib.zlibConst.Z_BEST_COMPRESSION, false))

JavaScript Code

var str = "hi";

Memory allocation:

Address Value Description
...... ...