Skip to content

Instantly share code, notes, and snippets.

View nilp0inter's full-sized avatar

Roberto Abdelkader Martínez Pérez nilp0inter

View GitHub Profile
@nilp0inter
nilp0inter / README.md
Created March 9, 2026 15:42
Stochastic Gherkin Extension

Stochastic Testing Framework: Roulette Implementation

This repository contains a reference implementation of a Domain-Specific extension to Gherkin (BDD), designed to automate the testing of non-deterministic and stochastic systems.

Problem Statement

Standard BDD frameworks (such as Behave, Cucumber, or Pytest-BDD) are designed for deterministic testing. They evaluate a single execution path and return a tri-state result (Pass/Fail/Error).

However, when testing stochastic systems (e.g., Random Number Generators, Machine Learning models, or complex behavioral economies), a single execution is insufficient to determine system correctness. System validation requires evaluating the statistical distribution of outcomes over $N$ iterations.

@nilp0inter
nilp0inter / censurar-dni.md
Created October 10, 2025 17:32 — forked from jmalarcon/censurar-dni.md
Casos prácticos y dictámenes APD sobre entrega del carnet

A raíz de mi vídeo sobre la censura del DNI para entregar en hoteles y en otros sitios, como por ejemplo tiendas de móviles, bancos y demás, han surgido dudas respecto a sí siempre es necesario censurarlo y que lo admitan, o si es posible que en algunos casos haya que entregarle de verdad la copia o que no haya que entregarle absolutamente nada.

Vaya por delante que el vídeo es sobre todo una llamada de atención para que no demos copias del DNI alegremente por ahí al primero que nos las pida, sobre todo porque la mayor parte de las veces no tienen derecho a hacerlo. Pero lo que cuento en el vídeo, como todo en la vida, no es una regla general y para todos los casos. Habrá situaciones en las que esté justificado dar una copa completa del DNI, y es lo que analizo en este documento.

En la Agencia Española de Protección de Datos (AEPD) tienen varios dictámenes y notas en los que aclaran algunas de estas cosas. Los voy a comentar a continuaci

Keybase proof

I hereby claim:

  • I am nilp0inter on github.
  • I am nilp0inter (https://keybase.io/nilp0inter) on keybase.
  • I have a public key ASCWHPy74-j6RBcLmM5GKoWVhhEtQjocncvd4I45XV45lgo

To claim this, I am signing this object:

There are 24 handle(s) keeping the process running
# TTYWRAP
(unknown stack trace)
# DNSCHANNEL
(unknown stack trace)
# TickObject
/home/nil/Project/nixpkgs/node_modules/readable-stream/lib/_stream_readable.js:905 - process.nextTick(resume_, stream, state);
from experta import *
import types
class ReturningEngine(KnowledgeEngine):
def run(self, steps=float('inf'), generate=False):
if not generate:
to_return = list()
for rhs in self._run_activations(steps=steps):
res = rhs()
@nilp0inter
nilp0inter / fizzbuzz.rkt
Last active February 10, 2025 08:30
The first beautiful implementation of FizzBuzz?
#lang 2d racket
(require 2d/match)
(define (fizz? n)
(= 0 (modulo n 5)))
(define (buzz? n)
(= 0 (modulo n 3)))
@nilp0inter
nilp0inter / workon.fish
Last active March 31, 2016 10:28
fish function compatible with virtualenvwrapper's workon function
function workon
. ~/Envs/$argv[1]/bin/activate.fish
if [ -f ~/Envs/$argv[1]/.project ]
cd (cat ~/Envs/$argv[1]/.project)
end
end
@nilp0inter
nilp0inter / lefinale.py
Created February 26, 2016 16:09
Non blocking file reader for python asyncio
import asyncio
import sys
import os
LOOP = asyncio.get_event_loop()
class AsyncFile:
def __init__(self, filename):
self.filename = filename
@nilp0inter
nilp0inter / diagmagic.py
Last active April 8, 2018 15:29 — forked from dorneanu/diagmagic.py
Embed blockdiag into IPython using ipython-diags
# -*- coding: utf-8 -*-
"""magics for using blockdiag.com modules with IPython Notebook
The module provides magics: %%actdiag, %%blockdiag, %%nwdiag, %%seqdiag, %%packetdiag, %%rackdiag
Sample usage (in IPython cell):
%%blockdiag
{
A -> B -> C;
class Gray:
def __init__(self, length):
self.length = length
def _gen(self, start, end, n):
if n == 1:
yield (start, )
yield (end, )
else:
for s in Gray(n-1):