Skip to content

Instantly share code, notes, and snippets.

@keithrbennett
keithrbennett / chg-screenshot-filenames
Created February 18, 2024 13:49
Renames Mac screenshot files using a more command line friendly format.
View chg-screenshot-filenames
#!/usr/bin/env python3
# This script reads the filespecs in the current directory, collects names of files
# in the default screenshot file name format, converts the names to lower case
# with spaces converted to hyphens, and removes the "at" to produce a command line friendly filespec;
# for example, "Screenshot 2024-02-18 at 21.06.31.pdf" becomes "screenshot-2024-02-18--21.06.31.pdf".
#
# It ignores but preserves the extensions, so if you have changed the screenshot file type with, e.g.:
# defaults write com.apple.screencapture type pdf && killall SystemUIServer
# then it will rename those PDF files too.
@keithrbennett
keithrbennett / 2023-12-09-chiang-mai-ai-meeting-notes.md
Last active December 10, 2023 05:45
2023-12-09 Chiang Mai AI Meeting Notes
View 2023-12-09-chiang-mai-ai-meeting-notes.md
View class_and_module_methods.rb
def modules_including_module(target_module)
ObjectSpace.each_object(Module).select do |object|
# All Class'es are modules, but we are not interested in them, so we exclude them.
!object.is_a?(Class) \
&& \
object.ancestors.include?(target_module) \
&& \
!object.equal?(target_module)
end
end
View modules_needing_included_method.rb
# Any module (not class) that includes SemanticLogger::Loggable must also implement an
# `included` method that gets the including class to also include SemanticLogger::Loggable.
# This is because the module's instance method `logger`, when it becomes part of the including
# class, will look for `self.class.logger` when called, and `self` will evaluate to the instance
# of the class and not the module. Having the class include `Loggable` will cause a class method
# `logger` to be created so that this will work.
#
# This method returns the modules that have included Loggable but do not have an `included`
# method implementation. This is an imperfect test since we are not testing the content of that
# implementation, but I don't know a better way.
@keithrbennett
keithrbennett / module-method-doesnt-override-class-instance-method.rb
Last active September 18, 2022 07:54
Shows that a module instance method will not overwrite a class instance method of the same name if `include` is used, but *will* if `prepend` is used.
View module-method-doesnt-override-class-instance-method.rb
#!/usr/bin/env ruby
module M
def foo
puts 'I am a module instance method.'
end
end
# Class whose foo instance method is defined *after* the include.
class C1
@keithrbennett
keithrbennett / force_class_inclusion_of_module.rb
Last active September 15, 2022 15:01
Illustrates forcing inclusion of a module by another included module in Ruby.
View force_class_inclusion_of_module.rb
#!/usr/bin/env ruby
# From solution at https://stackoverflow.com/questions/73676857/guaranteeing-that-module-includer-classes-include-another-module-in-ruby.
module M1
def m1; puts 'M1 was included by M2.'; end
end
module M2
def self.included(including_class)
View semantic_logger_trap.rb
#!/usr/bin/env ruby
# Illustrates cycling through the SemanticLogger log levels with signals.
# For reference by https://github.com/reidmorrison/semantic_logger/issues/231.
require 'semantic_logger'
# Redefine add_signal_handler to output to STDERR (omit TTIN behavior for brevity):
module SemanticLogger
def self.add_signal_handler(log_level_signal = "USR2", thread_dump_signal = "TTIN", gc_log_microseconds = 100_000)
@keithrbennett
keithrbennett / trap_user_signals.rb
Created July 28, 2022 04:56
Illustrates the use of 'trap' in Ruby for crude interprocess communication
View trap_user_signals.rb
#!/usr/bin/env ruby
# Author: @keithrbennett (Github)
# Illustrates how to respond to Unix signals in a Ruby program, using SIGUSR1 and SIGUSR2
# for user-defined signals, and SIGINT for trapping Ctrl-C.
require 'awesome_print'
require 'json'
require 'yaml'
View xml.rb
#!/usr/bin/env ruby
require 'nokogiri'
def process_example(message, xml_text, use_noblanks_option)
puts message
puts "XML text: #{xml_text.inspect}"
doc = Nokogiri::XML(xml_text) { |config| use_noblanks_option ? config.noblanks : config }
puts 'Resulting XML document:'
puts doc.inspect; puts; puts
@keithrbennett
keithrbennett / rfg-set-up-repos.rb
Last active September 23, 2021 00:50
Installs all repos needed for Ruby for Good 2021.
View rfg-set-up-repos.rb
#!/usr/bin/env ruby
REPO_URLS = %w{
https://github.com/rubyforgood/casa
https://github.com/rubyforgood/cep-backend
https://github.com/rubyforgood/cep-ui
https://github.com/rubyforgood/circulate
https://github.com/rubyforgood/human-essentials
https://github.com/rubyforgood/shelter-assist