Skip to content

Instantly share code, notes, and snippets.

@algal
algal / PrintToStdErr.swift
Last active July 27, 2022 06:47
print to stderr in Swift 3
// known-good: Xcode 8, Swift 3
import Foundation
var standardError = FileHandle.standardError
extension FileHandle : TextOutputStream {
public func write(_ string: String) {
guard let data = string.data(using: .utf8) else { return }

24 bit color in emacs, under Blink.sh

What's the problem?

The normal way to enable 24 bit color on a recent emacs (27.1) and a recent OS distribution (one which already has the terminal type definition xterm-direct), is just to set TERM=xterm-direct before running emacs.

But this does not work with blink.sh, probably because of some incompatibility in its underlying library, hterm.

What's the solution

/**
Gets and sets to this dictionary-like type are atomic.
Does not fully implement correct value semantics for copy
operations, since the contained queue is a reference type
and will be shared among copies of this object
*/
struct AtomicDictionary<KeyType:Hashable,ValueType>
{
@algal
algal / HTTPBasicAuthenticationSessionTaskDelegate.swift
Last active October 6, 2021 07:33
HTTP Basic Authentication in iOS
/*
Everyone on Stack Overflow does HTTP Basic Authentication on iOS by manually
building the HTTP headers.
This amounts to re-implementing HTTP.
Why? The Cocoa Touch URL Loading System aleady knows HTTP, and you can
configure your URLSession to supply HTTP Basic Authentication credentials
like so.
@algal
algal / binomial.py
Created May 29, 2021 22:42
binomial coefficients with dynamic programming
# binomial coefficients
"""
Recurrence relation:
C(n,k) is the count of all k-subsets in a set of n items.
C(n,k) = C(n-1,k-1) + C(n-1,k)
Intuition underlying the relation:
1. pick any item from the n-set, call it the special item.
2. Every k-subset either includes the special item or does not.
@algal
algal / isSubcollection.swift
Last active March 13, 2021 18:37
Look for a subarray in an array in Swift
extension Collection {
/// True if `self` is a range within `collection`
/// - Parameter collection: a `Collection` like `Array`
/// - Returns: true or false
///
/// Since this works with `Collection` it works with `Array`, `ArraySlic`, etc..
func isSubcollection<U>(of collection:U) -> Bool
where U:Collection, U.Element == Self.Element, Self.Element:Equatable
{
let (a,b) = (collection,self)
@algal
algal / join_pdf.bash
Last active February 16, 2021 02:00
join PDFs on macOS from the command line with zero dependencies
#!/bin/bash
if [ "$#" -lt 2 ]; then
echo "usage: $0 output_pdf_path input_path1..."
echo
echo "This script joins the PDFs at input_path1, input_path2, etc."
echo "into one pdf at output_pdf_path"
echo
echo "Known good: macOS 11.1, and below for many versions"
echo
exit 1
@algal
algal / mdfindfile
Last active November 12, 2020 01:09
Easily search for files based their names or glob patterns, by wrapping Spotlight.
#!/usr/bin/env bash
# case-insensitive search for $1, maybe in dir $2
case "$#" in
0) echo "usage: $(basename $0) PATTERN [DIR]"
echo ""
echo " Lists paths of files matching PATTERN in DIR or below"
;;
1) exec mdfind "kMDItemDisplayName == '$1'c"
;;
*) exec mdfind "kMDItemDisplayName == '$1'c" -onlyin "$2"
@algal
algal / SFUSDCalendar.md
Created August 29, 2020 20:20
To use an SFUSD Gmail account to subscribe to a non-SFUSD Google Calendar

Subscribing to a Google Calendar from an SFUSD Google Account

SFUSD Google accounts can only send and receive emails from SFUSD teachers, so they cannot receive calendar invitations from normal gmail accounts, like the gmail accounts of their parents. So you cannot invite them to join a calendar as usual.

Here's a workaround.

In the normal gmail account:

  1. Create the calendar to share from a normal gmail account.
  2. Go to Calendar Settings / General
/**
Returns an array of vertex positions.
- precondition: the geoemetry must have vertices which are 3-vectors with floating point component values
*/
fileprivate func vertices(source:SCNGeometrySource) -> [SCNVector3]
{
precondition(source.usesFloatComponents == true, "I can only handle three-vectors whose components are floating-point values, i.e., floats or doubles")
precondition(source.componentsPerVector == 3, "I can only be used for three vectors")