Skip to content

Instantly share code, notes, and snippets.

@timoschinkel
timoschinkel / entry.ts
Created January 11, 2024 15:51
Generalized HTTP handling for TypeScript
/* eslint-disable max-classes-per-file */
/*
* An experiment about how we can structure this codebase
*/
/*
* Request handling infrastructure
*/
@timoschinkel
timoschinkel / README.md
Last active September 22, 2023 07:08
Accolade matching regular expressions

Assume a template syntax where you can use {x}, {{x}}, and {{{x}}}. How can we leverage regular expressions for this?

Example snippet:

{b} c {{d}} e {{{f}}} g

Option 1 - using JavaScript

@timoschinkel
timoschinkel / APIGatewayHandler.ts
Last active March 17, 2023 12:22
AWS lambda generic middleware enabled handlers
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
export class ApiGatewayCorrelationContextMiddleware implements IMiddleware<APIGatewayProxyEvent, APIGatewayProxyResult> {
public async process(event: APIGatewayProxyEvent, next: Handler<APIGatewayProxyEvent, APIGatewayProxyResult>): Promise<APIGatewayProxyResult> {
return next(event);
}
}
class SomeMiddleware implements IMiddleware<APIGatewayProxyEvent, APIGatewayProxyResult> {
public async process(event: APIGatewayProxyEvent, next: EventHandler<APIGatewayProxyEvent, APIGatewayProxyResult>): Promise<APIGatewayProxyResult> {
@timoschinkel
timoschinkel / middleware.ts
Created August 30, 2022 07:40
LambdaMiddleware
import { Context } from 'aws-lambda'; /* npm install @types/aws-lambda */
export interface IMiddleware<E, R> {
process(event: E, context: Context, next: IHandler<E, R>): Promise<R>;
}
export interface IHandler<E, R> {
handle(event: E, context: Context): Promise<R>;
}
@timoschinkel
timoschinkel / README.md
Last active April 2, 2021 08:12
MP3 and cue file joining

I wanted to combine some old fashioned MP3 files and I did not want to download a separate application. Only thing necessary when combining MP3 files is stripping the ID3 tags - if present.

php -f join_mp3.php {destination} [{source}]

Edit: Turned out I has some multidisc mixtapes with .cue files lying around as well. So I wrote a joiner script for that as well:

php -f join_cue.php {destination} [{source}:{duration_of_source}]
@timoschinkel
timoschinkel / install_unreal_tournament_goty_on_macos.txt
Last active February 6, 2023 08:11
Installing Unreal Tournament GOTY on MacOS Catalina and up
# Installing Unreal Tournament GOTY on MacOS Catalina and up
- Buy game on GoG via https://www.gog.com/game/unreal_tournament_goty
- Download archive set up - Not the download the GoG installer, but download the Unreal Tournament installer (302MB).
- Unpack with `innoextract` (`brew install innoextract`) - Move installer to folder first for scoping.
- Install [UnrealTournamentPatches](https://github.com/OldUnreal/UnrealTournamentPatches/releases) - don't forget to drag the executable to Applications
- In Finder, go to Applications, right click `UnrealTournament` and click `Show package contents`
- Inside the package contents navigate to `Contents` > `MacOS`
- Copy the folders `Maps`, `Music`, `Sounds` and `Textures` from the unpacked Unreal Tournament installer and paste them in the `Contents` > `MacOS` folder.
- Profit!
// This is very, very heavily inspired by the [video](https://www.youtube.com/watch?v=8OK8_tHeCIA) and
// [code](https://github.com/OneLoneCoder/videos/blob/master/OneLoneCoder_Tetris.cpp) of One Lonely Code.
// Big thanks to him.
import { stdout, stdin } from 'process';
import { WriteStream } from 'tty';
const keypress = require('keypress');
class PlayingField {
private readonly width: number;
<?php
// In the current solution we have three separate interfaces. This allows for a clean separation of functionality:
interface QueryExecutorInterface
{
public function execute(QueryInterface $query): array;
}
interface QueryMetadataServiceInterface
@timoschinkel
timoschinkel / ApiKeyMiddlewareTest.php
Created July 3, 2019 13:34
Testing with immutable PSR-7 objects and Prophecy
<?php
declare(strict_types=1);
use PHPUnit\Framework\TestCase;
use Prophecy\Argument;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
final class ApiKeyMiddlewareTest extends TestCase
@timoschinkel
timoschinkel / prophecy_cheatsheet.md
Last active April 5, 2024 11:31
Prophecy cheatsheet

I typically find myself struggling when doing some more complex expectations using Prophecy. To make things easier for myself I decided to create this cheatsheet.

Type agnostic checks

Check for exact value

$ObjectProphecy->method(
    'value'
);