Skip to content

Instantly share code, notes, and snippets.

View iximiuz's full-sized avatar
🪲

Ivan Velichko iximiuz

🪲
View GitHub Profile
@iximiuz
iximiuz / walkdir.js
Created March 13, 2019 13:43
Tiny recursive walkdir (aka readdir) in JavaScript
const fs = require('fs');
const path = require('path');
async function *walkdir(dir) {
const stack = [dir];
while (stack.length) {
const filename = stack.pop();
const stat = await fs.promises.stat(filename);
if (stat.isDirectory()) {
const files = (await fs.promises.readdir(filename))
@iximiuz
iximiuz / keep-me-alive.js
Last active February 6, 2025 15:16
Node.js http server keep-alive behaviour test
const http = require('http');
const log = console.log;
console.log = (...args) => {
log.apply(console, [new Date().toISOString()].concat(args));
};
const port = process.argv[2];
const server = http.createServer((req, res) => {
console.log('Incoming request');
i => j1 = 2*i           0 => 0     1 => 2    2 => 4
     j2 = 2*i+1         0 => 1     1 => 3    2 => 5

i = j//2                0 => 0     2 => 1    4 => 2
                        1 => 0     3 => 1    5 => 2


i => j1 = 2*i + 1       0 => 1    1 => 3    2 => 5
 j2 = 2*i + 2 0 => 2 1 => 4 2 => 6
@iximiuz
iximiuz / README.md
Last active July 6, 2023 11:52
execve() file descriptors sharing example

Description

As everybody knows, execve() system call replaces a calling process image with a new process image. At the same time the file descriptors table remains the same.

The idea of this example is to show how launched via execve() processes can access file descriptors from their parent.

The parent process creates 4 pipes (unidirectional data flows) for stdin/stdout streams of its two children. Then the parent forks itself twice to spawn its children. Each child process binds corresponding pipes to its stdin & stdout and then runs child executable via execl(). To simplify the example, child processes also explicitly shares their stdin file descriptors between each other via command line argument. In the end parent is able to read from children stdouts and write to their stdins, while children are able to write to sibling's stdins (see the schema below).

@iximiuz
iximiuz / rvo_bench.cpp
Last active August 19, 2016 13:14
C++ Return value optimization benchmark
#include <chrono>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define SIZE_MEDIUM 4096
#define SIZE_LARGE 16*4096
#define ITER_COUNT 100000
using namespace std;
using namespace std::chrono;
@iximiuz
iximiuz / binomial_coefficients.py
Created June 8, 2016 16:40
Calculate binomial coefficients via Pascal's triangle
def next_row(prev_row):
row = [prev_row[0]] * (len(prev_row) + 1)
for idx in range(len(prev_row) - 1):
row[idx + 1] = (prev_row[idx] + prev_row[idx + 1])
return row
def binomial(n, k, cache=None):
""" Calculates binomial coefficients using Pascal's triangle.
0 1
@iximiuz
iximiuz / diff.txt
Created May 19, 2016 11:27
Python 2 vs Python 3 division operator
Input | Py2 | Py3
----------+-----+-----
5/2 | 2 | 2.5
----------+-----+-----
5//2 | 2 | 2
----------+-----+-----
5.0/2 | 2.5 | 2.5
----------+-----+-----
5.0//2 | 2.0 | 2.0
----------+-----+-----
@iximiuz
iximiuz / goaccess.md
Created May 16, 2016 11:57
Analyze Nginx access log with GoAccess

Run:

grep "07/May/2016" app_access.log | goaccess -a --log-format '%h %^[%d:%t %^] "%r" %s %b "%R" "%u"' --date-format '%d/%b/%Y' --time-format '%H:%M:%S' > goaccess_may07.html

More here

@iximiuz
iximiuz / mean_median_mode_stddev.py
Last active August 15, 2018 09:45
Mean, median, mode and stddev calculation in Python 3
sample = [5, 3, 1, 2, 4]
n = len(sample)
mean = sum(sample)/n
median = (sample[n//2 - (n + 1)%2] + sample[n//2])/2
stddev = (sum((e - mean)**2 for e in sample)/n)**0.5
cnt = {}
for e in sample:
cnt[e] = cnt.get(e, 0)
cnt[e] += 1
mode = sorted(cnt.keys(), key=lambda e: (cnt[e], -e))[-1]
@iximiuz
iximiuz / delayserver.py
Created March 25, 2016 11:41
Simple async HTTP server to emulate long request processing
import sys
from asyncio import coroutine, sleep
from aiohttp import web
@coroutine
def handle(request):
seconds = float(request.match_info.get('seconds', 1))
yield from sleep(seconds)
text = "You've been waiting for {} seconds".format(seconds)
return web.Response(body=text.encode('utf-8'))