Skip to content

Instantly share code, notes, and snippets.

View jhurliman's full-sized avatar
🐨

John Hurliman jhurliman

🐨
View GitHub Profile
@jhurliman
jhurliman / LruCache.ts
Created September 28, 2022 20:55
LRU cache in TypeScript
class LruCache<T> {
private values = new Map<string, T>();
constructor(private maxEntries = 10) {}
public get(key: string): T | undefined {
const entry = this.values.get(key);
if (entry != undefined) {
this.values.delete(key);
this.values.set(key, entry);
@jhurliman
jhurliman / ros2-galactic-src.Dockerfile
Created September 13, 2022 16:51
Build ROS2 Galactic from source in an Ubuntu 20.04 container
FROM ubuntu:focal
ARG USER=jhurliman
ARG BASE_DIR=/home/$USER/Documents/Code/ros2/ros2_galactic
SHELL ["/bin/bash", "-c"]
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y locales
RUN locale-gen en_US en_US.UTF-8
@jhurliman
jhurliman / SettingsManager.ts
Last active June 16, 2022 19:29
Foxglove Studio high-level settings API
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/
import { produce } from "immer";
import {
SettingsTreeAction,
SettingsTreeNode,
SettingsTreeRoots,
@jhurliman
jhurliman / Dockerfile
Last active May 9, 2022 23:20
Build depthai-ros from source (OAK-D Luxonis DepthAI)
FROM ros:noetic-ros-core-focal
# Install dependencies for depthai, ros, and build
RUN apt-get update && apt-get install -y \
build-essential \
cmake \
git \
libjpeg-dev \
libopencv-dev \
libpng-dev \
@jhurliman
jhurliman / IndexedInstancedMesh.ts
Created March 17, 2022 00:44
Extends THREE.js InstancedMesh with the ability to reference instances by a string key and add/remove instances with dynamic buffer resizing
import * as THREE from "three";
type UserData = { [key: string]: unknown };
const INITIAL_SIZE = 4;
const tempMat4 = new THREE.Matrix4();
const tempColor = new THREE.Color();
/**
@jhurliman
jhurliman / ros2-topic-pub-examples.sh
Created March 7, 2022 22:37
ros2 topic pub examples
# volatile, no history
ros2 topic pub -r 0.5 --qos-durability volatile --qos-reliability reliable /chatter std_msgs/msg/String '{data: hello}'
# transient_local, history of 5
ros2 topic pub -r 0.5 --qos-durability transient_local --qos-reliability reliable --qos-depth 5 --qos-history keep_last /chatter std_msgs/msg/String '{data: hello}'
# foxy compatible transient_local
ros2 topic pub -r 0.5 --qos-durability transient_local --qos-reliability reliable /chatter std_msgs/msg/String '{data: hello}'
# /tf_static
@jhurliman
jhurliman / proposal001.ts
Created June 15, 2021 22:11
proposal001.ts
import { PanelExtensionContext, Topic, MessageEvent } from "@foxglove/studio";
import { useLayoutEffect, useState } from "react";
import ReactDOM from "react-dom";
function ExamplePanel({ context }: { context: PanelExtensionContext }): JSX.Element {
const [topics, setTopics] = useState<readonly Topic[] | undefined>();
const [messages, setMessages] = useState<readonly MessageEvent<unknown>[] | undefined>();
// We use a layout effect to setup render handling for our panel. We also setup some topic subscriptions.
useLayoutEffect(() => {
@jhurliman
jhurliman / utm.ts
Created May 10, 2021 19:25
Latitude/Longitude conversion to UTM in TypeScript
export type UTM = {
easting: number;
northing: number;
zoneNumber: number;
};
export function LatLngToUtm(
lat: number,
lng: number,
zoneNumber?: number,
@jhurliman
jhurliman / RosTcpMessageStream.ts
Created March 12, 2021 08:22
RosTcpMessageStream.ts
import { TransformStream, TransformerTransformCallback } from "web-streams-polyfill/ponyfill";
class TcpMessageStreamImpl {
private _inMessage = false;
private _bytesNeeded = 4;
private _chunks: Uint8Array[] = [];
transform: TransformerTransformCallback<Uint8Array, Uint8Array> = (chunk, controller) => {
let idx = 0;
while (idx < chunk.length) {
@jhurliman
jhurliman / nvtxrange.h
Created February 8, 2021 21:54
RAII wrapper for NVIDIA nvtxRangePush/nvtxRangePop
#pragma once
#include <nvToolsExt.h>
#include <string>
struct NvtxRange {
NvtxRange() = delete;
explicit NvtxRange(const std::string_view name) { nvtxRangePush(name.data()); }