Skip to content

Instantly share code, notes, and snippets.

View draffensperger's full-sized avatar

Dave Raffensperger draffensperger

View GitHub Profile
@draffensperger
draffensperger / keybase.md
Last active August 29, 2015 13:58
keybase.io Github verification Gits

Keybase proof

I hereby claim:

  • I am draffensperger on github.
  • I am draffensperger (https://keybase.io/draffensperger) on keybase.
  • I have a public key whose fingerprint is 11AD 4270 6B18 7B21 BDCF 7A62 66E0 7480 D06A 9FE6

To claim this, I am signing this object:

@draffensperger
draffensperger / job_duplicate_checker.rb
Created March 31, 2015 16:48
Sidekiq job duplicate checker
module JobDuplicateChecker
def duplicate_job?(*args)
job_in_retries?(args) || older_job_running?(args)
end
private
def older_job_running?(args)
workers = Sidekiq::Workers.new
self_worker = workers.find { |_, _, work| work['payload']['jid'] == jid }
@draffensperger
draffensperger / explanation.md
Last active October 9, 2015 20:14
Why find_each(batch_size: 1) is helpful if objects reference lots of memory and operations are long.

In MPDX, the Google Contacts sync job takes a long time and the google accounts loop to sync each job could benefit from find_each(batch_size: 1). Basically it seems likes find_each pulls in the records in batches and then saves them in an array to enumerate through. Here's a comparison of the memory results with different batch_sizes that I did using a similar, but contrived MemHungry model. To setup, first do 6.times { MemHungry.create }.

Using the default batch_size of 1000 the memory at the end reflecs all 6 objects and the RAM they hold onto:

[1] pry(main)> MemHungry.all.find_each { |m| puts m.id; m.eat_memory; }
  MemHungry Load (0.5ms)  SELECT  "mem_hungries".* FROM "mem_hungries"   ORDER BY "mem_hungries"."id" ASC LIMIT 1000
1
Memory before GC: 112.63671875
Memory before allocation: 159.90234375
Memory after allocation: 1759.90234375
@draffensperger
draffensperger / GetGCalData
Created May 14, 2013 01:08
This is a Google Apps Script for a Google Spreadsheet which gets events from a Google Calendar and loads them into the spreadsheet.
function getGCalData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var inSheet = ss.getSheetByName("GCalParams");
var id = inSheet.getRange("B1").getValue();
var startDate = inSheet.getRange("B2").getValue();
var endDate = inSheet.getRange("B3").getValue();
var cal = CalendarApp.getCalendarById(id);
var events = cal.getEvents(startDate, endDate);
@draffensperger
draffensperger / People Busy, Google Spreadsheet
Last active December 22, 2015 11:09
Google Apps Script, number of people scheduled
function peopleBusy(people, startRow, startCol, endRow, endCol) {
startRow = startRow || 2;
startCol = startCol || 2;
endRow = endRow || 40;
endCol = endCol || 9;
people = people.split(",");
var ss = SpreadsheetApp.getActiveSpreadsheet();
var n, i, j;
@draffensperger
draffensperger / Rakefile
Last active January 2, 2016 08:29
The Octopress Rakefile I use for my blog at davidraff.com. It serves CSS Source Maps under the :preview task.
require "rubygems"
require "bundler/setup"
require "stringex"
## -- Rsync Deploy config -- ##
# Be sure your public key is listed in your server's ~/.ssh/authorized_keys file
ssh_user = "user@domain.com"
ssh_port = "22"
document_root = "~/website.com/"
rsync_delete = false
@draffensperger
draffensperger / s3_deply_snippet.rb
Created January 26, 2014 00:49
S3 Deployment Code (initial start)
def each_file()
Dir.glob("**/*") do |file|
yield file unless File.directory? file
end
end
def file_md5_name(file)
ext = File.extname file
digest = Digest::MD5.base64digest File.read file
@draffensperger
draffensperger / google_sheets_task_scheduler.js
Created April 19, 2016 00:52
Task scheduler code for Google sheets
function onInstall(e) {
onOpen();
}
function onOpen(e) {
SpreadsheetApp.getUi().createAddonMenu()
.addItem('Recalculate schedule', 'use')
.addToUi();
}
@draffensperger
draffensperger / WORKSPACE
Created December 5, 2018 02:36
Minimal example of Go import conflicts for `go_proto_library`
workspace(name = "test_proto")
@draffensperger
draffensperger / EXAMPLE.md
Last active December 7, 2018 15:16
Tsickle intersection type unknown this

We have some code that does a monkey-patch of a library function (maybe a bad design, but there may be other better examples of a similar pattern). The structure of the code looks about like this:

// This is code in a library
class Printer {
  value = 'b';

  print() {
    console.log(`value is ${this.value}`);
  }