Skip to content

Instantly share code, notes, and snippets.

@janpaul123
janpaul123 / find-removed-videos.sh
Created December 20, 2020 21:34
Find all Youtube videos in my archive which have since been removed
View find-removed-videos.sh
#!/bin/bash
set -Eeuxo pipefail
# Install youtube-dl
curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /tmp/youtube-dl
chmod a+rx /tmp/youtube-dl
# Create /tmp/print-missing-youtube.sh script.
echo '#!/bin/bash' > /tmp/print-missing-youtube.sh
@janpaul123
janpaul123 / reorder-rosbag.py
Created January 7, 2020 23:17
Read an "input.bag" ROS bag with messages stored in arbitrary order, and write to "output.bag" ordered by receive time (required by Webviz to read)
View reorder-rosbag.py
import rosbag
with rosbag.Bag('output.bag', 'w') as outbag:
for topic, msg, t in rosbag.Bag('input.bag').read_messages():
outbag.write(topic, msg, t)
@janpaul123
janpaul123 / FastScrollComponent-test.js
Created May 18, 2018 20:47
Copyright: Remix Software; License: MIT
View FastScrollComponent-test.js
/* eslint-disable react/prop-types */
import React from 'react';
import ReactDOM from 'react-dom';
import ReactTestUtils from 'react-dom/test-utils';
import FastScrollComponent from './FastScrollComponent';
describe('<FastScrollComponent>', function() {
const setupComponent = ({ cacheWhenNotVisible = false, height = 100 }) => {
// eslint-disable-line react/prop-types
const rowHeight = 25;
@janpaul123
janpaul123 / permutations.js
Created February 12, 2018 15:56
Number of unique corners for given color / dot schemes
View permutations.js
const uniq = require('lodash/uniq');
function permutations(n, colors, arr) {
if (!n) return [arr];
if (!arr) arr = [];
let ret = [];
for (let i = 0; i < colors; i++) ret = ret.concat(permutations(n - 1, colors, arr.concat([i])));
return ret;
}
@janpaul123
janpaul123 / SimpleBlobDetector.js
Last active May 21, 2023 09:21
OpenCV SimpleBlobDetector port to OpenCV.js
View SimpleBlobDetector.js
// Port of https://github.com/opencv/opencv/blob/a50a355/modules/features2d/src/blobdetector.cpp
// But with special `faster` option which has slightly different semantics,
// but is a whole bunch faster.
function diff(v1, v2) {
if (v1.x !== undefined) return { x: v1.x - v2.x, y: v1.y - v2.y };
return v1.map((value, index) => value - v2[index]);
}
function norm(vector) {
@janpaul123
janpaul123 / models_helper.rb
Last active December 27, 2017 01:03
Test helper for changing counts
View models_helper.rb
module ModelsHelper
# Expects that only the passed in models have counts that change. For this we
# look at all ActiveRecord models, and store their counts.
#
# Example: `expect_only_counts_changing(Trip: -1) { Trip.first.delete }`
#
# This gives stronger guarantees against future models being affected
# unexpectedly by other parts of the code base.
def expect_only_counts_changing(expected_changes)
previous_counts = ModelsHelper.counts
@janpaul123
janpaul123 / apply_diffs_to_map_document_data.rb
Created November 23, 2017 00:20
Apply diffs in Postgres
View apply_diffs_to_map_document_data.rb
module Interactors
module ApplyDiffsToMapDocumentData
def self.call(map_id:, diffs:)
return if diffs.empty?
sql = <<-SQL
UPDATE maps SET document_data =
#{diffs.count.times.map { 'jsonb_set(' }.join('')}
document_data
#{diffs.each_with_index.map { |diff, i| ", '{#{diff[:path].join(',')}}', :value_#{i})" }.join('')}
@janpaul123
janpaul123 / identity_of_model.rb
Created September 29, 2017 06:22
Fun recursive function to test if things like copying deep data structures work correctly. Done with @boconnell at @remix.
View identity_of_model.rb
def identity_of_model(model, global_excluded=['id', 'created_at', 'updated_at', 'deleted_at'])
excluded_columns = model.class.reflect_on_all_associations.map(&:foreign_key) + global_excluded
identity = model.attributes.except(*excluded_columns)
model.class.reflect_on_all_associations(:has_many).sort_by(&:name).each do |ref|
identity[ref.name.to_s] = model.send(ref.name).map(&method(:identity_of_model)).sort_by(&:to_json)
end
model.class.reflect_on_all_associations(:has_and_belongs_to_many).sort_by(&:name).each do |ref|
identity["#{ref.name}_counts"] = model.send(ref.name).count
end
identity
@janpaul123
janpaul123 / pronto.rb
Created April 8, 2017 05:30
Custom pronto matcher
View pronto.rb
#!/usr/bin/env ruby
require 'pronto'
module Pronto
class RegexWarnings < Runner
# Matchers arguments: path, text, addition, first_changed_line
def matchers
{
->(path, text, addition, _) { path.match(/\.js$/) && text.include?('http:') && addition } =>
View monorepo-tester.js
#!/usr/bin/env node
const commandLineArgs = require('command-line-args');
const { existsSync, writeFileSync } = require('fs');
const { execSync } = require('child_process');
const jmerge = require('junit-merge/lib');
const path = require('path');
const syncRequest = require('sync-request');
// Copyright Jan Paul Posma, 2017. Licensed under MIT license.