Skip to content

Instantly share code, notes, and snippets.

@mrk21
mrk21 / human_readable_number.rb
Last active August 15, 2025 08:41
Convert real number to human readable number
class HumanReadableNumber
attr_reader :b, :u_n
def initialize(b:, u_n:)
@b = b
@u_n = u_n
end
def from(a)
_E = [u_n.size-1, Math.log([1, a.abs].max, b).floor].min
@mrk21
mrk21 / 01_thread_pool.rb
Last active October 1, 2024 13:24
Simple thread pool for Ruby
class ThreadPool
def initialize(n)
@n = n
@queue = Thread::SizedQueue.new(@n)
@workers = []
end
def shutdown
@queue.close
errors = []
@mrk21
mrk21 / config-initializers-trusted_proxies.rb
Created August 31, 2019 10:07
How to get a remote ip on CloudFront + Rails
# @see https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html
# @see https://morizyun.github.io/ruby/rails-controller-get-ip.html
# @see https://dev.classmethod.jp/cloud/aws/get-ec2-public-ip-range-by-powershell/
# @see https://github.com/rails/rails/blob/c81af6a/actionpack/lib/action_dispatch/middleware/remote_ip.rb#L112-L150
Rails.application.configure do
ip_ranges_res = Faraday.get('https://ip-ranges.amazonaws.com/ip-ranges.json')
ip_ranges = JSON.parse(ip_ranges_res.body)
cloudfront_ips = ip_ranges['prefixes'].select { |v| v['service'] == 'CLOUDFRONT' }.map { |v| IPAddr.new(v['ip_prefix']) } +
ip_ranges['ipv6_prefixes'].select { |v| v['service'] == 'CLOUDFRONT' }.map { |v| IPAddr.new(v['ipv6_prefix']) }
@mrk21
mrk21 / fork_safe_proxy.rb
Last active May 2, 2024 07:17
Simple fork-safe proxy for Ruby
class ForkSafeProxy < BasicObject
class << self
def unwrap(instance)
instance.__send__(:__value__)
end
end
def initialize(&initializer)
@mutex = ::Thread::Mutex.new
@initializer = initializer
@mrk21
mrk21 / retryer.rb
Last active April 20, 2024 04:16
Exponential Backoff And Jitter for Ruby
class Retryer
class RetryError < StandardError; end
class Backoff
def call(attempt)
raise NotImplementedError
end
end
class ExponentialBackoffAndEqualJitter < Backoff
@mrk21
mrk21 / env.rb
Last active March 9, 2024 10:49
Define a method liked `ENV.fetch()` which returns specified default value even when a value of specified key was empty string. see: https://mrk21.hatenablog.com/entry/2024/03/09/190844
class << ENV
# This method behavior is almost same as `ENV.fetch()`, but it returns default value even when the value was empty string.
def fetch2(*args, &block)
key, default = args
value = fetch(*args, &block)
return value if value != ''
raise KeyError, format('key not found: "%s"', key) if args.size == 1 && !block
warn('block supersedes default value argument', uplevel: 1) if args.size == 2 && block
block ? yield(key) : default
@mrk21
mrk21 / mecab_sort.rb
Last active February 1, 2023 06:09
Sort array by Kanji using MeCab on Ruby.
# $ brew install mecab
# $ brew install mecab-ipadic
# $ gem install natto
# $ ruby mecab_sort.rb
# "シュジンコウ"
# "ジョウシャ"
# "ジョウシャ"
# "コウムイン"
# "シュジンコウ"
# "コウムイン"
@mrk21
mrk21 / simple_mutex.ts
Created November 1, 2022 02:15
Simple mutex for JavaScript
class SimpleMutex {
_lock: boolean;
_resolves: Array<() => void>;
constructor() {
this._lock = false;
this._resolves = [];
}
async synchronize(callback: () => Promise<any>) {
@mrk21
mrk21 / deepcopy.go
Created October 21, 2022 06:46
Simple deep copy for Go(reflection/generics)
package main
import (
"encoding/json"
"fmt"
"reflect"
)
// Example:
//
@mrk21
mrk21 / json_logger.rb
Created June 11, 2019 10:20
JSON logger for Rails
# This logger is having the interface is same to `ActiveSupport::TaggedLogging`.
# @see https://github.com/rails/rails/blob/master/activesupport/lib/active_support/tagged_logging.rb
class JSONLogger < ActiveSupport::Logger
class Formatter < ActiveSupport::Logger::SimpleFormatter
def call severity, timestamp, progname, message
JSON.generate({
type: severity,
time: timestamp.iso8601,
progname: progname,
message: message,