Skip to content

Instantly share code, notes, and snippets.

View julien-f's full-sized avatar

Julien Fontanet julien-f

View GitHub Profile
@julien-f
julien-f / createSelector.mjs
Created November 17, 2022 17:28
Simple JS create selector
const UNINITIALIZED = {}
export function createSelector() {
const nInputSelectors = arguments.length - 1
if (nInputSelectors <= 0) {
throw new Error('invalid number of inputs')
}
const transform = arguments[nInputSelectors]
@julien-f
julien-f / multiGroupBy.mjs
Created November 10, 2022 15:50
Multiple group by
function groupBy(iterable, prop) {
const dict = { __proto__: null };
for (const item of iterable) {
const group = item[prop];
(dict[group] || (dict[group] = [])).push(item);
}
return dict;
}
export function multiGroupBy(iterable, props) {
@julien-f
julien-f / deprecate.js
Created March 9, 2022 07:52
Deprecate function
"use strict";
exports.deprecate = function deprecate(fn, message) {
let warned = false;
return function deprecated() {
if (!warned) {
warned = true;
console.warn(new Error(message));
}
return fn.apply(this, arguments);
@julien-f
julien-f / prepend
Created February 22, 2022 11:44
CLI to prepend a string to a file (compatible with POSIX shell, Bash or Dash)
#!/bin/sh
set -eu
if [ $# -eq 0 ] || [ "$1" = -h ] || [ "$1" = --help ]
then
cat <<EOF
Usage: $0 file prefix
Add a prefix to a file.
@julien-f
julien-f / MultiKeyMap.js
Created December 20, 2021 13:56
MultiKeyMap using serialization
const ensureArray = (value) =>
Array.isArray(value) ? value : value === undefined ? [] : [value];
exports.MultiKeyMap = class MultiKeyMap {
#data = new Map();
#objects = new WeakMap();
get size() {
return this.#data.size;
}
@julien-f
julien-f / MultiMap.js
Created April 26, 2021 11:49
MultiMap implementation for ECMAScript/JavaScript
export class MultiMap {
#entries = new Map()
#size = 0
get size() {
return this.#size
}
clear() {
this.#entries.clear()
@julien-f
julien-f / Queue.js
Last active December 24, 2021 14:11
// based on implementation in https://github.com/ForbesLindesay/throat
export class Queue {
#head // stack to push to, reverse order
#tail = [] // stack to pop from
get size() {
return this.#head.length + this.#tail.length
}
constructor(iterable) {
@julien-f
julien-f / xenstore-read
Created August 1, 2020 07:19
xenstore-read work-around for VMWare
#!/bin/sh
case "${1:-}" in
vm)
uuid=$(cat /sys/devices/virtual/dmi/id/product_uuid)
echo "/vm/$uuid"
;;
*)
echo 'xenstore-read error: ENOENT' >&2
exit 1
@julien-f
julien-f / README.md
Last active January 25, 2021 12:53
Principes scientifiques
  • La charge de la preuve incombe à celui qui avance une hypothèse.
  • Une affirmation extraordinaire requiert des preuves extraordinaires.
  • Une déclaration sans preuve peut-être rejetée sans preuve.
  • Il faut d'abord mettre en évidence un phénomène avant d'en rechercher les causes.
  • Rasoir d'Ockham ou principe d'économie : l'hypothèse la plus simple doit être préférée car elle est la plus probable.
  • En science on est révolutionnaire que si la nature nous force à l'être. (https://youtu.be/rAvj7VEBDN0?t=4240)
  • Un énoncé est tenu comme vrai s'il n'a pas pu être réfuté.
  • « La science est un jeu dont la règle du jeu consiste à trouver quelle est la règle du jeu. » François Cavanna
@julien-f
julien-f / show-cert
Last active February 27, 2020 14:44
Show TLS/SSL certificate (node)
#!/usr/bin/env node
const [, , host, port = 443, ca] = process.argv;
require("tls")
.connect(
{ host, port, rejectUnauthorized: false, servername: host },
function() {
console.log(this.getPeerCertificate());
this.destroy();