Skip to content

Instantly share code, notes, and snippets.

@laundmo
laundmo / dragino_NBSN95.py
Last active December 7, 2021 16:01
Dragino NBSN95 decoder, all payloads.
"""
MIT License
Copyright (c) 2021 Laurin Schmidt laurinschmidt2001@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
@laundmo
laundmo / lerp.py
Last active May 12, 2024 11:48
lerp, inverse lerp and remap in python
def lerp(a: float, b: float, t: float) -> float:
"""Linear interpolate on the scale given by a to b, using t as the point on that scale.
Examples
--------
50 == lerp(0, 100, 0.5)
4.2 == lerp(1, 5, 0.8)
"""
return (1 - t) * a + t * b
@laundmo
laundmo / private.py
Last active March 8, 2023 00:36
Challenge where i tried to make something in python inaccessible, only edit the evaluate method. Rules at the bottom of the file.
class Private:
def __setattr__(self, name, value):
raise RuntimeError("Attribute setting disabled.")
def __call__(self, f):
super().__setattr__("f_code", f.__code__)
def wrapper(*args, **kwargs):
f.__code__ = self.f_code
if self.code == __import__("inspect").currentframe().f_back.f_code:
@laundmo
laundmo / docker-compose-aliases.bashrc
Created March 15, 2021 19:51
my docker compose aliases
alias dc='docker-compose'
alias dcl='dc logs -f --tail="100"'
alias dcb='dc build --parallel'
alias dcu='dc up -d'
alias dcx='dcb && dcu && dcl'
alias dcd='dc down'
alias dcr='dcd && dcu'
@laundmo
laundmo / traverse.py
Last active March 8, 2023 00:56
Recursively get values from a dict/list structure by either key or value
"""
Copyright 2020
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALING
@laundmo
laundmo / jinja_property_error.py
Last active November 28, 2020 05:15
Jinja 2 will sometimes hide exceptions thrown in properties behind "Class has no attribute property_name" due to the way the jinja2.Undefined works. This is a way to forcibly throw the underlying exceptions.
class JinjaPropertyErrorReporting():
def __getattribute__(self, name):
if isinstance(getattr(type(self), name, None), property): # TODO: could be done using hasattr?
try:
return super().__getattribute__(name)
except Exception as e:
raise Exception(f"Jinja would have accidentally hidden this error: {type(e).__name__}: {str(e)}") from e
else:
return super().__getattribute__(name)
@laundmo
laundmo / attributes.py
Created November 16, 2020 19:25
mixin that allows instances to access other instances attributes directly
class OtherInstancesMixin():
def __getattribute__(self, name):
try:
return object.__getattribute__(self, name)
except AttributeError as e:
for instance in object.__getattribute__(self, "_related"):
try:
return object.__getattribute__(instance, name)
except AttributeError:
pass
@laundmo
laundmo / main.py
Created October 28, 2020 21:52
Flask create views at runtime
from flask import Flask, request, render_template
from flask.views import View
app = Flask(__name__)
view_list = [
("/main", "main.html.jinja2", "main"), # assumes the templates exist in a ./templates subdir
("/main2", "main2.html.jinja2", "main2"),
]
class GenericView(View):
@laundmo
laundmo / Detect.py
Last active August 15, 2020 20:59
How to detect APNGs sent in Discord using discord.py
import io
def is_apng(a: bytes) -> bool:
acTL = a.find(b"\x61\x63\x54\x4C")
if acTL > 0:
iDAT = a.find(b"\x49\x44\x41\x54")
if acTL < iDAT:
return True
return False
@laundmo
laundmo / readme.md
Last active March 28, 2020 21:31
test for pickle

Testing whether pickling works with PySide2

spoiler: it does