Skip to content

Instantly share code, notes, and snippets.

View julik's full-sized avatar
💭
🎺

Julik Tarkhanov julik

💭
🎺
View GitHub Profile
class ZipTricks::OutputEnumerator
DEFAULT_WRITE_BUFFER_SIZE = 65 * 1024
# Creates a new OutputEnumerator.
#
# @param streamer_options[Hash] options for Streamer, see {ZipTricks::Streamer.new}
# It might be beneficial to tweak the `write_buffer_size` to your liking so that you won't be
# doing too many write attempts and block right after
# @param write_buffer_size[Integer] By default all ZipTricks writes are unbuffered. For output to sockets
# it is beneficial to bulkify those writes so that they are roughly sized to a socket buffer chunk. This
# object will bulkify writes for you in this way (so `each` will yield not on every call to `<<` from the Streamer
@julik
julik / kelder.rb
Last active October 22, 2019 22:33
A very very very rough version. There probably will be a gem of this
module Kelder
module PrefixKeyWithToken
# Prefix all generated blob keys with the tenant. Do not
# use slash as a delimiter because it needs different escaping
# depending on the storage service adapter - in some cases it
# might be significant, in other cases it might get escaped as a path
# component etc.
def generate_unique_secure_token
tenant_slug = Apartment::Tenant.current.split('_').last
"#{tenant_slug}-#{super}"
class MultipartRangesWriter
ALPHABET = ('0'..'9').to_a + ('a'..'z').to_a + ('A'..'Z').to_a
def initialize
# RFC1521 says that a boundary "must be no longer than 70 characters, not counting the two leading hyphens".
# Modulo-based random is biased but it doesn't matter much for us
@boundary = SecureRandom.bytes(64).unpack("C*").map {|b| ALPHABET[b % ALPHABET.length] }.join
end
class NullWriter < Struct.new(:offset)
@julik
julik / csrf_adapter.rb
Created August 18, 2019 15:37
Minimum viable reuse of the Rails CSRF token in Rack
# Allows a Rack application to reuse the Rails-provided CSRF
# protection, with the same guarantees and the same token.
# Implements token unmasking and other facilties.
class Middleware::CSRFAdapter
AUTHENTICITY_TOKEN_LENGTH = 32
class InvalidOrMissingToken < StandardError
def http_status_code
403
end
@julik
julik / csrf_adapter.rb
Created August 18, 2019 15:37
Minimum viable reuse of the Rails CSRF token in Rack
# Allows a Rack application to reuse the Rails-provided CSRF
# protection, with the same guarantees and the same token.
# Implements token unmasking and other facilties.
class Middleware::CSRFAdapter
AUTHENTICITY_TOKEN_LENGTH = 32
class InvalidOrMissingToken < StandardError
def http_status_code
403
end
@julik
julik / csrf_adapter.rb
Created August 18, 2019 15:37
Minimum viable reuse of the Rails CSRF token in Rack
# Allows a Rack application to reuse the Rails-provided CSRF
# protection, with the same guarantees and the same token.
# Implements token unmasking and other facilties.
class Middleware::CSRFAdapter
AUTHENTICITY_TOKEN_LENGTH = 32
class InvalidOrMissingToken < StandardError
def http_status_code
403
end
@julik
julik / eventuality.rb
Last active June 24, 2019 23:13
Visualser for orderings of given events. When your jobs can execute concurrently and you are faced with weirdo concurrency bugs in time, this might help visualise the variants of execution order. Especially when multiple tasks might be executing at the same time but actually depend on each other's output, and your execution engine cannot enforce…
require 'set'
class Eventuality
def initialize
@events = Set.new
@invariants = []
@tasks = []
end
def add_single_event(evt)
// Find at which index an element should be inserted
// into a sorted array, using binary search
function insertionIndexUsingBinarySearch(sortedArray, value, from, to) {
if (sortedArray.length === 0) {
return 0;
}
if (typeof(from) === 'undefined') {
from = 0;
}
@julik
julik / moocom_inner_layer_swatches.jsx
Created April 26, 2019 19:43
moo.com Illustrator colors (use "File -> Run Script" to create swatches)
function addCMYKSwatch(name, c, m, y, k) {
var myDoc = app.activeDocument;
var mySwatch = myDoc.swatches.add();
var color = new CMYKColor();
color.cyan = c;
color.magenta = m;
color.yellow = y;
color.black = k;
mySwatch.color = color;
mySwatch.name = name;
@julik
julik / mrs.go
Last active January 27, 2019 23:36
Go MultiReadSeeker (for stringing together multuple ReadSeeker structs - for example for edge includes using ServeContent)
package mrs
import "io"
type multiReadSeeker struct {
Readers []io.ReadSeeker
Pos int64
BytesTotal int64
BytesRead int64
locations []location