Skip to content

Instantly share code, notes, and snippets.

View jcheng5's full-sized avatar

Joe Cheng jcheng5

View GitHub Profile
@jcheng5
jcheng5 / extract_depth.sh
Created September 10, 2025 19:45
Extract depth from HEIC
#!/bin/bash
# extract_depth.sh - Extract depth map from HEIC files
# Usage: ./extract_depth.sh input.heic
# Check if argument was provided
if [ $# -ne 1 ]; then
echo "Usage: $0 <heic_file>"
exit 1
fi
@jcheng5
jcheng5 / .env
Created August 21, 2025 17:27
LiteLLM otel
OTEL_SERVICE_NAME=litellm-test
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318/v1/traces
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
@jcheng5
jcheng5 / README.md
Last active October 1, 2024 15:44
elmer/shinychat assistant
@jcheng5
jcheng5 / index.md
Last active September 3, 2024 22:16
Resources for "Shiny × AI" by Joe Cheng, at posit::conf(2024)

Experimental function to concatenate lots of HTML dependencies' JavaScript files into one single one.

A number of caveats apply:

  1. Strict mode: Many JavaScript files contain "use strict"; at the top of the file. This causes slightly different behavior in the JS engine. If the concatenated JS files have different expectations regarding strict mode, there could be problems.
  2. Hosted scripts: This script does not attempt to concatenate JS files that are hosted on CDNs. Instead, they're left in their original form. It's possible that files we do concatenate, either assume that a CDN-hosted script is loaded before it itself is, or, the opposite. combine_js has a parameter that lets you decide whether to put the combined script first or last, there's no way for us to decide automatically (assuming there's even a right answer).
  3. ES6 modules: We leave type="module" alone, because for ES6 modules the file boundarie
@jcheng5
jcheng5 / app.R
Created April 5, 2024 18:34
crew + ExtendedTask while keeping track of who requested each result
library(shiny)
library(crew)
library(promises)
library(bslib)
run_task <- function(model, n, delay_secs) {
Sys.sleep(delay_secs)
model(n)
}
@jcheng5
jcheng5 / app.py
Created March 8, 2024 03:14
Color blindness helper in Shiny Express
# Live demo at https://shinylive.io/py/app/#code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACABQEkAZJgSxlWLpkmbGFADmcADoRe-QUwgBXPtiZQAzgtTTZAoSQA2A9dnXTp9Rk3UALbhFW75dOFEJluANzh4mLgI4WDMy29tgYcAAeqC7qmk5C9qiKZL4uEAAmcHS+itzmStwYSSkA+jTcBnAAFJK0lVL4THUi4nBMFVV1AJTSecUQyWSl6gbcWXS1YDaKjb51ABKz1nY0ZHW+AAy+AEwArHtbvRAFAALpE1hG65lwNCvca3AZ1d2I0kyfTADETBzEUAyTDINnavDaHy+4IkTAAvMJRBIMMRUJRqgFqiUyBhOjVut1gJsALrAOoZKBkNAUmx1IndDAkCDeQTVADkACUAOIAIVZxy+zQgAt+AGFSMyhCCwYj2mRiAplDg1HQ6FBVDQBExRDJkgYKdxSJDPtC4KVBnCtBgoCq1ZiZfyvkaeDLSjZ1J4LYMrTbsNVgIZjKYMHQxAAjUpy13u6qobiROAGQlEgD0+0OTFj8cTAEYU2nfJmE8AdnmDt0OprCwYeEKTWbMLEbGgagBabO+ADM3TpBWFTAAyqshDMpEKoS63Z5gIgtkSLXa2lGpzOmMSmABqJiYwYpDAj15MZNMNP4pgAUiY2adTtF4uyQgW-YAakxQ24ANbA+Vc7lOush0NPUwa1VV9f1iCMOgTHUPd3QjYhSgAmM4yLYkCxQnMiXQrNizpCs6AzDCa2dRdJx7MdPhvJh2TgWxmzUTJrEIKAqiYRRUC-Y8Dj-F0AMQ2im1RIF4QXCRELDYMBObUTTS9OjUXLAAqLi9npDQyGwVFqi9PJyAADgdSiKJ+JgxSZe8FRUZVQNfD9OPYLhWgkHjF2IFIhgtJy4BxYIQNtf8w34+TnmOJ0XDIRQ6FrF03LIIZpDAABfIkgA
from PIL import Image
import nump
@jcheng5
jcheng5 / app.py
Last active February 2, 2024 16:24
Shiny for Python module for console you can write to
from shiny import App, reactive, render, ui, module
from shiny.session import Session
from contextlib import redirect_stdout, redirect_stderr
import asyncio
from shiny_console import Console, console_ui, console_server
# == Example usage =======================================
app_ui = ui.page_fluid(
@jcheng5
jcheng5 / app.R
Last active June 23, 2024 18:51
Extended task example app
library(shiny)
library(bslib)
library(future)
library(promises)
future::plan(future::multisession)
ui <- page_sidebar(
sidebar = sidebar(
numericInput("x", "x", 5),
@jcheng5
jcheng5 / README.md
Last active July 20, 2024 03:12
Debounce and throttle for Shiny for Python

Sketch of debounce/throttle decorators for Shiny for Python

Drop ratelimit.py into your app directory to use in your own Shiny for Python app. See app.py for an example of these decorators in action.

Why is this a gist instead of a PR? Because to implement this "properly" for Shiny for Python, this would need to be beefed up to include type annotations, support for async, and unit/integration tests, which would all be more effort than this has taken so far. (To be clear, we want to do all that, but in the meantime, here's this gist.)