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
#!/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)
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
/* 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
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
// 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
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
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.
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
#!/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 } =>
#!/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.