Skip to content

Instantly share code, notes, and snippets.

View okuramasafumi's full-sized avatar
:octocat:
Hire me!

OKURA Masafumi okuramasafumi

:octocat:
Hire me!
View GitHub Profile
@okuramasafumi
okuramasafumi / icloud_imap.rb
Last active February 21, 2024 07:16
iCloud IMAP
# Simple script to fetch IMAP data from iCloud
# Set ICLOUD_EMAIL and ICLOUD_PASSWORD to environment variables
require 'net/imap'
require 'active_support'
imap = Net::IMAP.new('imap.mail.me.com', 993, true)
imap.login(ENV['ICLOUD_EMAIL'], ENV['ICLOUD_PASSWORD'])
imap.select 'INBOX'
@okuramasafumi
okuramasafumi / fzf-git.zsh
Last active January 18, 2024 14:32 — forked from junegunn/functions.sh
Key bindings for git with fzf (https://junegunn.kr/2016/07/fzf-git/)
# GIT heart FZF
# -------------
is_in_git_repo() {
git rev-parse HEAD > /dev/null 2>&1
}
fzf-down() {
fzf --height 50% --min-height 20 --border --bind ctrl-/:toggle-preview "$@"
}
@okuramasafumi
okuramasafumi / main.rb
Created May 30, 2023 08:32
RSpec documentation without executing
require 'syntax_tree'
class RSpecEnvironment
def initialize
@contexts = []
@results = []
end
def klass(k)
@contexts << k
@okuramasafumi
okuramasafumi / string_scanner.rb
Created May 27, 2023 16:33
Pure Ruby implementation of StringScanner
class MyStringScanner
class ScanError < StandardError; end
attr_reader :string, :captures
attr_accessor :pos
def initialize(string, _obsolete = false, fixed_anchor: false)
@string = string
@fixed_anchor = fixed_anchor
@pos = 0
@previous_pos = 0
@okuramasafumi
okuramasafumi / included.rb
Created April 17, 2023 13:27
Tell me if this module is included by the same class more than once
def self.included(base)
base.instance_variable_set(:@count, 0) unless base.instance_variable_defined?(:@count)
base.instance_variable_set(:@count, base.instance_variable_get(:@count) + 1)
puts base.name if base.instance_variable_get(:@count) > 1
end
@okuramasafumi
okuramasafumi / hash.rb
Last active April 2, 2023 11:56
[Proposal] Hash#transform in Ruby
class Hash
def transform(&block)
new_hash = {}
each_pair do |key, value|
rtn = block.call(key, value)
case rtn
in nil | true then new_hash[key] = value
in false then next
in Array[[_, _], *]
rtn.each do |k, v|
@okuramasafumi
okuramasafumi / hash_vs_case.rb
Created August 11, 2022 10:01
Performance comparison between hash lookup and case lookup
MAPPING = {
a: 1,
b: 2,
c: 3,
d: 4,
e: 5,
f: 6,
}.freeze
def method1(key)
@okuramasafumi
okuramasafumi / ice.rb
Created March 26, 2022 15:54
Ice feature from zinit in Ruby
module Kernel
def ice(key, value, on: Object)
if on.instance_methods.include?(key.to_sym)
prev = on.instance_method(key)
on.define_method key do
on.remove_method key
on.define_method(key, prev)
return value
end
else
@okuramasafumi
okuramasafumi / define_mixable_method.rb
Created March 25, 2022 16:16
Mixable method where we can sort method call sequence
class Module
def define_mixable_method(name:, calls:, main:)
define_method(name) do |&block|
method_candidates = calls.map {|name| method(name) }
block.call(main, method_candidates).each do |m|
m.call
end
end
end
end
@okuramasafumi
okuramasafumi / each_with_effect.rb
Created March 22, 2022 13:42
EachWithEffect module for Ruby
module EachWithEffect
DEFAULT = Object.new.freeze
def each_with_effect(effect_handlers = {}, &block)
effect = catch(:effect) do
block.call(self.peek)
end
if effect
handler = effect_handlers.find{ |k, v| k === effect }&.last || effect_handlers.fetch(DEFAULT)
alternative = handler.call(effect) if handler