Skip to content

Instantly share code, notes, and snippets.

View dkam's full-sized avatar

Dan Milne dkam

View GitHub Profile
@dkam
dkam / oshash.rb
Last active May 28, 2024 04:36
Open Subtitles Hash in Ruby
# https://trac.opensubtitles.org/projects/opensubtitles/wiki/HashSourceCodes#Ruby
# https://github.com/trytriangles/oshash/tree/master/test
def oshash(filename)
mask = 0xffffffffffffffff
readsize = 64 * 1024
filesize = File.size(filename)
hash = filesize
File.open(filename, 'rb') do |f|
hash = f.read(readsize).unpack("Q<*").inject(hash) {|h, v| h + v & mask}
@dkam
dkam / free.rb
Created May 19, 2023 04:10
Get free disk space
#!/usr/bin/env ruby
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'json'
gem 'sys-filesystem'
end
@dkam
dkam / valid_json.rb
Last active April 23, 2023 07:43
Check JSON is valid
def valid_json?(string)
result = JSON.parse(string)
result.is_a?(Hash) || result.is_a?(Array)
rescue JSON::ParserError, TypeError
false
end
def valid_json(string, default: [])
result = JSON.parse(string)
@dkam
dkam / curlr.rb
Last active April 24, 2023 06:44
Basic http client which can process html and xml
#!/usr/bin/env ruby
require 'open-uri'
require 'nokogiri'
VERSION = 0.1
def getter(url)
URI.open(url, "User-Agent" => "Curlr/#{VERSION}")
rescue OpenURI::HTTPError => e
e.io
@dkam
dkam / humanize_number.rb
Created April 5, 2023 00:14
Print numbers nicely
# https://stackoverflow.com/questions/1078347/rails-is-there-a-rails-trick-to-adding-commas-to-large-numbers
an_integer.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
an_int_or_float.to_s.split(".").then {|a| a[0] = a[0]&.reverse&.gsub(/(\d{3})(?=\d)/, '\\1,')&.reverse; a[1].nil? ? a[0] : a[0] + '.' + a[1] }
@dkam
dkam / lazy_select.rb
Last active April 2, 2023 04:44
Lazy select in ruby
def select_items(count:, items:)
items.lazy.select { |item| item.matchs?(/some filter/ }.take(count).to_a
end
# Other example : https://stackoverflow.com/questions/34787811/short-cutting-version-of-select-for-no-more-than-n-matches
@dkam
dkam / main.rb
Last active March 9, 2023 23:44
def tick args
player = {x: 576, y: 280, w: 20, h: 20, path: 'sprites/circle/red.png'}
args.outputs.sprites << { **player,angle: angle_to_mouse(player, args) }
end
def angle_to_mouse(player, args)
args.geometry.angle_to(player, [args.mouse.x, args.mouse.y])
end
@dkam
dkam / isbns.jsonl
Created March 7, 2023 04:39
From Wikipedia
{"prefix":"0","value":"English","value_type":"Language area"}
{"prefix":"1","value":"English","value_type":"Language area"}
{"prefix":"2","value":"French","value_type":"Language area"}
{"prefix":"3","value":"German","value_type":"Language area"}
{"prefix":"4","value":"Japan","value_type":"National"}
{"prefix":"5","value":"former USSR","value_type":"Regional"}
{"prefix":"7","value":"China","value_type":"National"}
{"prefix":"65","value":"Brazil","value_type":"National"}
{"prefix":"80","value":"Czechoslovakia","value_type":"Regional"}
{"prefix":"81","value":"India","value_type":"National"}
@dkam
dkam / dice.rb
Last active March 5, 2023 05:52
Generate word based passwords using EFF's list of words
#!/usr/bin/env ruby
require 'open-uri'
# From https://www.eff.org/dice
count = ARGV[0]&.to_i || 6
total = ARGV[1]&.to_i || 3
dice = URI.open("https://www.eff.org/files/2016/07/18/eff_large_wordlist.txt").read.split("\n").map(&:split).to_h
@dkam
dkam / classes.rb
Last active February 22, 2023 23:22
Ruby class example
class Person
def initialize(name)
@name = name
end
def greet
puts "Hello #{@name}"
end
end
dan = Person.new('Dan')