Skip to content

Instantly share code, notes, and snippets.

@moreati
moreati / tracerealpath.py
Created September 25, 2024 18:53
tracerealpath - Like traceroute, but for symlinks
#!/usr/bin/env python3
# Copyright (c) 2001 - 2023 Python Software Foundation
# Copyright (c) 2024 Alex Willmer <[email protected]>
# License: Python Software Foundation License Version 2
# Derived from https://github.com/python/cpython/blob/v3.12.6/Lib/posixpath.py#L423-L492
"""
Show the route taken through symlinks to a resolved file path
@moreati
moreati / stringio_2x_demo.py
Created September 24, 2024 11:59
Python 2.x StringIO.StringIO vs io.StringIO
#1/usr/bin/env python2
import StringIO
f1 = StringIO.StringIO()
f1.write(u'unicode string')
f1.write(b'byte string')
f1.close()
import io
@moreati
moreati / ansible_playbook_keywords_table.rst
Last active September 15, 2024 12:13
Table showing Ansible playbook keywords that can be used at play, role, block, or task level

Generated using development version of Ansible on 15 Sep 2024. Details may differ from released versions.

@moreati
moreati / issue905.ini
Created September 5, 2024 12:18
Reproducer for Mitogen issue 905
[issue905]
ssh-args ansible_ssh_args="-o PermitLocalCommand=yes -o LocalCommand='touch {{ ssh_args_canary_file }}'"
ssh-common-args ansible_ssh_common_args="-o PermitLocalCommand=yes -o LocalCommand='touch {{ ssh_args_canary_file }}'"
ssh-extra-args ansible_ssh_extra_args="-o PermitLocalCommand=yes -o LocalCommand='touch {{ ssh_args_canary_file }}'"
[issue905:vars]
ansible_host=u2204.mynet
ssh_args_canary_file=/tmp/ssh_args_{{ inventory_hostname }}
@moreati
moreati / popen_resourcewarning.py
Last active August 28, 2024 22:07
Demonstration of Python subprocess.Popen() ResourceWarning
import os
import subprocess
import sys
import warnings
# By default ResourceWarning output (and other) is hidden.
# Setting environment variable PYTHONWARNINGS=default will
# show them, similar to the below.
if not sys.warnoptions:
warnings.simplefilter('default')
@moreati
moreati / tree_layers.py
Created May 31, 2024 15:50
Calculate required layers of a tree for given number of leaf nodes
import math
def tree_layers_count(leaf_nodes_count: int, degree: int) -> int:
r"""
Return the number of layers required for a given number of leaf nodes,
if each node can have degree children & nodes are filled depth first.
E.g. to have 5 leaf nodes, a degree 4 tree requires 3 layers
*
_______________ _|_ _
@moreati
moreati / locals.yml
Created May 15, 2024 10:25
Different ways to execute Ansible tasks on the controller
- hosts: targets
gather_facts: false
vars:
ansible_python_interpreter: python3
tasks:
- command: echo hello
delegate_to: localhost
- command: echo hello
connection: local
@moreati
moreati / fromisoformat.md
Created April 8, 2024 15:51
Python 3.11 datetime.datetime.fromisoformat()

In Python 3.11+ datetime.datetime.fromisoformat() accepts any number of decimal places for the seconds component. If there are more than 6 then the resulting datetime object is truncated (not rounded) to microsecond precision.

Python 3.11.8 (main, Feb  6 2024, 21:21:21) [Clang 15.0.0 (clang-1500.1.0.2.5)] on darwin
>>> import datetime
>>> datetime.datetime.fromisoformat('2011-11-04T00:05:23.12345Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, 123450, tzinfo=datetime.timezone.utc)
>>> datetime.datetime.fromisoformat('2011-11-04T00:05:23.1234567Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, 123456, tzinfo=datetime.timezone.utc)
@moreati
moreati / macos.nix
Created March 3, 2024 21:24
My first baby steps with Nix on a macOS machine
# To apply changes run
# nix-env --install --remove-all --file ~/macos.nix
# nix-env -irf ~/macos.nix
#
# Notes
# - Binaries are made available in ~/.nix-profile/bin/
#
# TODO
# - Install ~/.nix-profile/bin/{python,python-config}{3.8,3.9,3.10,3.11,3.12},
# but *not* .../{python{,3}
@moreati
moreati / issue115911_mp.py
Last active February 29, 2024 13:54
importlib PathFinder monkeypatch for Python issue 115911 (getcwd() EACCESS)
# Monkeypatch that replaces the importlib PathFinder in sys.meta_path
# with one that handles EACCES returned by libc getcwd() on macOS.
# Workaround for https://github.com/python/cpython/issues/115911
import errno
import sys
try:
import _frozen_importlib_external
except ImportError:
pass