Skip to content

Instantly share code, notes, and snippets.

View mahmoud's full-sized avatar
🚢
Shipping mode

Mahmoud Hashemi mahmoud

🚢
Shipping mode
View GitHub Profile
@mahmoud
mahmoud / 20250918_voice.json
Created September 18, 2025 23:39
Easy Effect preset to get my Audio Technica AT-2020USB to sound about right for recording/streaming/podcasting.
{
"input": {
"blocklist": [],
"compressor#0": {
"attack": 10.0,
"boost-amount": 6.0,
"boost-threshold": -72.0,
"bypass": false,
"dry": -100.0,
"hpf-frequency": 10.0,
@mahmoud
mahmoud / fuji_xt4_ubuntu.sh
Last active September 19, 2025 23:32
Using a Fuji XT-4 as a webcam for streaming/recording. Working in 2025 on a Thinkpad T14s Ryzen via USB-C, running Ubuntu 22.04 LTS. Read the comments for details. Latency is reasonably low, better than the cheap capture cards often recommended online.
#!/bin/bash -xe
# --- Fuji XT-4 Webcam Startup Script ---
# This script sets up the Fujifilm XT-4 as a webcam from a clean slate.
#
# USAGE:
# ./fuji_xt4_ubuntu.sh (Starts in default mode, full visible frame)
# ./fuji_xt4_ubuntu.sh --letterbox (Starts in 16:9 letterbox mode)
#
# hit ctrl-c to restart the stream (and refocus), hit ctrl-c twice in quick succession to stop the stream.
from boltons.iterutils import is_scalar, remap
garbagey = {'attributes':
{'vars':
{'network':
{'addresses': []}},
'characteristics':
{'chars': 'abc',
'misc_obj': {},
'others': [1, 2]}
@mahmoud
mahmoud / glom_post_data_trace.py
Created January 13, 2023 21:14
Contrasting Python default stack trace vs Glom data trace
# python 3.10 with glom 23
>>> import glom
>>> target = {'planets': [{'name': 'earth', 'moons': 1}]}
>>> spec = ('planets', ['rings']) # a spec we expect to fail
>>> glom.glom(target, spec)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/mahmoud/projects/glom/glom/core.py", line 2297, in glom
raise err
glom.core.PathAccessError: error raised while processing, details below.
@mahmoud
mahmoud / conftest.py
Last active March 10, 2021 08:51
Excerpted tidbits from our Django app's conftest during the Django 1 to 2 and Python 2 to 3 migration ("TR" stands for "Tech Refresh", circa mid 2020), with parts related to wrapping the test session in a DB transaction, and other parts related to bulk-skipping functionality. Tested on py2.7/3.6, Django 1.11/2.0.x, pytest 4.6.11.
# -*- coding: utf-8 -*-
"""
Common test fixtures for pytest
"""
from __future__ import print_function, unicode_literals
import os
from itertools import groupby
import pytest
@mahmoud
mahmoud / design.py
Last active July 28, 2020 08:05
improved branched glom error ascii design
before = \
'''
Traceback (most recent call last):
File "tmp.py", line 9, in _make_stack
glom(target, spec)
File "/home/mahmoud/projects/glom/glom/core.py", line 2024, in glom
raise err
glom.core.PathAccessError: error raised while processing, details below.
Target-spec trace (most recent last):
@mahmoud
mahmoud / py3_except.py
Created June 26, 2020 07:08
python3 exception var deleting
$ python3
Python 3.7.7 (default, Mar 10 2020, 17:25:08)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> e = 'hi'
>>> try:
... 1/0
... except Exception as e:
... pass
...
@mahmoud
mahmoud / py3_partials.py
Created March 17, 2020 06:56
TIL py3 partials don't mind multiple values for arguments
>>> def f(a, b):
... return a, b
...
# py27
>>> partial(f, b=1)(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'b'
@mahmoud
mahmoud / basic_argparse_framework.py
Last active May 1, 2019 00:56
(based on years of argparse experience, also serves to demonstrate why argparse is not so good)
def create_parser():
root_parser = ArgumentParser(description='article fetch operations')
root_parser.add_argument('--list_home', help='list lookup directory')
add_subparsers(root_parser.add_subparsers())
return root_parser
def add_subparsers(subparsers):
parser_list = subparsers.add_parser('list')
parser_list.add_argument('target_list', nargs='?',
>>> x = [1]
>>> y = (2, 3)
>>> x + y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list
>>> x += y
>>> x
[1, 2, 3]