Skip to content

Instantly share code, notes, and snippets.

View cometkim's full-sized avatar

Hyeseong Kim cometkim

View GitHub Profile
@cometkim
cometkim / dns-healthcheck.sh
Last active May 5, 2024 04:05
Healthcheck an anycast DNS
#!/bin/bash
function healthcheck() {
local domain=$1
local total_tests=$2
local total_failed_count=0
local ip_list=()
for ((i = 0; i < total_tests; i++)); do
@cometkim
cometkim / node-pm-globals.md
Last active May 1, 2024 18:11
How package managers dealing with binaries from transitive dependencies
$pm add vite

# should be success
$pm run vite --version

# shoud be fail
$pm run esbuild --version
@cometkim
cometkim / curl-bench.mjs
Last active April 19, 2024 14:29
HTTP protocol version test via cURL (not a good way)
import { parseArgs } from 'node:util';
import { spawn } from 'node:child_process';
import { setTimeout } from 'node:timers/promises';
import prettyBytes from 'pretty-bytes';
import prettyMilliseconds from 'pretty-ms';
let { values, positionals } = parseArgs({
args: process.argv.slice(2),
allowPositionals: true,
@cometkim
cometkim / report.mjs
Created April 11, 2024 07:04
Analytics GitHub billing by SKU and repository name
#!/usr/bin/env node
import * as fs from 'node:fs';
import csvParser from 'csv-parser';
const [csvFile, sku] = process.argv.slice(2);
if (!fs.existsSync(csvFile) || !sku) {
console.error('Usage: ./report.mjs [CSV file] [SKU]');
process.exit(1);
}
@cometkim
cometkim / progress.ts
Created March 28, 2024 06:53
Fake progress number, use the number with spring animation
const nextProgress = (progress: number) => {
switch (true) {
case progress < 40: {
return progress + 40 + Math.random() * 10;
}
case progress < 60: {
return progress + 8 + Math.random() * 2;
}
case progress < 80: {
return progress + 3 + Math.random() * 2;
@cometkim
cometkim / index.mjs
Created March 25, 2022 16:55
Search all packages that doesn't support ESM from node_modules directory
import * as path from 'node:path';
import * as fs from 'node:fs/promises';
const nodeModules = path.resolve('node_modules');
let moduleNames = await fs.readdir(nodeModules);
moduleNames = (await Promise.all(
moduleNames.map(async name => {
if (name.startsWith('.')) {
return [];
@cometkim
cometkim / convert.mjs
Last active July 21, 2023 12:36
Convert Wikipedia page-articles data (XML) into a text dataset (NDJSON)
// Convert Wikipedia page articles dump (XML) into a stream of JSON
// { id: 0, "title": "...", "text": "..." }
// The "text" field format will also be converted into plain text
import * as path from 'node:path';
import * as fs from 'node:fs';
import XMLParser from 'node-xml-stream';
import ndjson from 'ndjson';
import instaview from 'instaview';
import htmlEntities from 'html-entities';
@cometkim
cometkim / index.html
Created May 24, 2023 06:18
Is growable SAB GC-able?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>SharedArrayBuffer GC test</title>
</head>
<body>
<div id="root"></div>
<script type="module">
@cometkim
cometkim / index.html
Last active April 4, 2023 10:00
Injected setup to Facebook's playable ads runtime
<!-- The script is injected to the `<head>`, so prevent possible network access from the content script. -->
<script type="text/javascript">
if (
!Boolean(navigator.userAgent.match(/android/i)) &
Boolean(navigator.userAgent.match(/Chrome/) ||
navigator.userAgent.match(/Firefox/) ||
navigator.userAgent.match(/Safari/) ||
navigator.userAgent.match(/MSIE|Trident|Edge/))) {
window.FbPlayableAd = {
onCTAClick() {
@cometkim
cometkim / temp.html
Created November 9, 2022 09:40
7GUIs temperature converter example in ReScript
<div>
Celcius: <input id="ce" type="number">
Fahrenheit: <input id="fa" type="number">
</div>
<script type="importmap">
{
"imports": {
"rescript/": "/node_modules/rescript/"
}