Skip to content

Instantly share code, notes, and snippets.

View zmej-serow's full-sized avatar

Andrey Serov zmej-serow

View GitHub Profile
@zmej-serow
zmej-serow / dot_notation.py
Created August 22, 2023 18:11
Dot notation access for dicts
class DotNotation(dict):
"""
Access dictionary attributes via dot notation
"""
__getattr__ = dict.get
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
@zmej-serow
zmej-serow / retry_deco.py
Last active June 14, 2023 23:19
Retrying decorator with customizable delay between attempts
from functools import wraps
from random import randrange
from time import sleep
def retry(retry_limit=3, delay=None, max_random_delay=600):
"""
Retrying decorator with simple backoff logic.
:param retry_limit: amount of retries before throwing exception
@zmej-serow
zmej-serow / minesweeper.py
Created November 5, 2021 18:28
Minesweeper field generator
from random import shuffle
def mine_field(size, mines_amount):
"""
в Revolut оч. любят давать эту задачу (на питоне) на собеседованиях:
Create func/class to print matrix size X/X
Fill it with Y mines (mark is as 'x') in random way (remember game minesweeper from windows?)
mark empty as 0
@zmej-serow
zmej-serow / build_multiple_from_query.py
Created March 27, 2020 10:43
IMAP multiple FROM query builder
def build_multiple_from_query(emails: List[str]) -> str:
# IMAP query composition: (OR (OR (FROM a@a.ru) (FROM b@b.ru)) (FROM c@c.ru))
def gather(a: str, b: str) -> str:
if 'FROM' not in a:
return f'OR (FROM "{a}") (FROM "{b}")'
else:
return f'OR ({a}) (FROM "{b}")'
return f'({reduce(gather, emails)})' if len(emails) > 1 else f'FROM {emails[0]}'
@zmej-serow
zmej-serow / fetch-answer_flipflop.py
Created November 4, 2019 00:14
Asynchronous updating server mock
import asyncio
import random
async def fetching(q):
while True:
print("i'm fetching...")
d = random.random()
print("done fetching, got", d)
await q.put(d)
await asyncio.sleep(1)
@zmej-serow
zmej-serow / thread.py
Created August 22, 2019 09:22
Background task running in separate thread
from time import sleep
from queue import Queue
from threading import Thread
# create a consumer
def consumer(input_queue):
while True:
# retrieve data from queue (blocking)
data = input_queue.get()
@zmej-serow
zmej-serow / singleton.py
Last active August 23, 2019 07:46
Singleton pattern realization via metaclass
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
@zmej-serow
zmej-serow / HTTP_request.sql
Created August 18, 2019 21:12
HTTP POST request on T-SQL
DECLARE @authHeader NVARCHAR(64);
DECLARE @contentType NVARCHAR(64);
DECLARE @postData NVARCHAR(2000);
DECLARE @responseText NVARCHAR(2000);
DECLARE @responseXML NVARCHAR(2000);
DECLARE @ret INT;
DECLARE @status NVARCHAR(32);
DECLARE @statusText NVARCHAR(32);
DECLARE @token INT;
DECLARE @url NVARCHAR(256);
@zmej-serow
zmej-serow / aws-authorizer-request.py
Last active August 9, 2019 21:16
Request-based AWS Lambda authorizer
def lambda_handler(event, context):
principalId = 'me'
tmp = event['methodArn'].split(':')
apiGatewayArnTmp = tmp[5].split('/')
awsAccountId = tmp[4]
headers = event['headers']
queryStringParameters = event['queryStringParameters']
pathParameters = event['pathParameters']
@zmej-serow
zmej-serow / com_objects_list.ps1
Created July 16, 2019 20:06
Get list of available COM objects
Get-ChildItem HKLM:\Software\Classes -ErrorAction SilentlyContinue |
Where-Object { $_.PSChildName -match '^\w+\.\w+$' -and (Test-Path -Path "$($_.PSPath)\CLSID") } |
Select-Object -ExpandProperty PSChildName