Skip to content

Instantly share code, notes, and snippets.

@jdh30
jdh30 / gist:92a382c6a5c1b20cc9541e0ab776860b
Created March 27, 2024 17:02
Install OpenHantek6022 on Raspberry Pi 5
sudo apt install cmake libfftw3-dev qtbase5-dev qttools5-dev libusb-1.0-0-dev
git clone https://github.com/OpenHantek/OpenHantek6022
cd OpenHantek6022
mkdir build
cd build
cmake ..
make
sudo cp ../utils/udev_rules/60-openhantek.rules /etc/udev/rules.d/
@jdh30
jdh30 / InstallOctoprint
Created December 26, 2023 03:11
Install Octoprint on a Raspberry Pi 5
python -m venv OctoPrint
OctoPrint/bin/pip install OctoPrint
wget https://github.com/OctoPrint/OctoPrint/raw/master/scripts/octoprint.service
emacs octoprint.service
sudo mv octoprint.service /etc/systemd/system/octoprint.service
sudo systemctl enable octoprint.service
sudo service octoprint start
@jdh30
jdh30 / PredatorPrey.tq
Created November 21, 2022 22:30
Simulating predator-prey dynamics
let g = 0.02 and k = 500 and t = 1500
let evolve(r, f) =
let dtrf = 0.0001 * r * f in
Some((r, f), (r + (1.0 - r/k)*r*g - dtrf, dtrf + (1.0 - g)*f))
let () =
Seq.unfold evolve (50, 10)
@ Seq.truncate 1500
@ Array.ofSeq
@jdh30
jdh30 / KMP.tq
Last active November 21, 2022 17:06
Knuth-Morris-Pratt string search algorithm
let search p =
let m = # p in
let next = Array.init m [_ -> 0] in
let rec init(i, j) =
if i >= m-1 then () else
if Array.get p i = Array.get p j then
let () = Array.Unsafe.set next (i+1) (j+1) in
init(i+1, j+1)
else
if j=0 then init(i+1, j) else init(i, Array.get next j) in
@jdh30
jdh30 / Base64.tq
Created November 21, 2022 16:39
Base64 encoder
type State =
| S0
| S1 Number
| S2 Number
let charOfNumber n =
if n<26 then Char.ofNumber(n+65)
else if n<52 then Char.ofNumber(n-26+97)
else if n<62 then Char.ofNumber(n-52+48)
else if n=62 then '+' else '/'
@jdh30
jdh30 / SuffixArray.tq
Created November 21, 2022 16:23
Compute the suffix array of an array
let suffixArray str =
let g = Array.get in
let n = # str in
let sa = Array.init n id in
let pos = Array.copy str in
let tmp = Array.init n [_ -> 0] in
let sufCmp gap (i, j) =
compare (g pos i, g pos j) @
[ Equal ->
if i+gap >= n || j+gap >= n then compare(j, i) else
@jdh30
jdh30 / MaxSumSubseq.tq
Created November 21, 2022 16:09
Maximum sum subsequence
let maxSumSubseq a =
let maxm = Array.fold [a, b -> max a b] 0 a in
let rec loop sum i =
if i = # a then sum else
let ai = Array.get a i in
if ai > 0 then loop (sum + ai) (i+1) else loop sum (i+1) in
loop 0 0
@jdh30
jdh30 / PythagorasTree.tq
Created November 21, 2022 15:25
Pythagoras' Tree
let branches m =
{ { Vec2.rotate(π/2 - asin(4/5));
Vec2.scale(4/5, 4/5);
Vec2.translate(0, -1) };
{ Vec2.translate(1, -1);
Vec2.rotate(-π/2 + asin(3/5));
Vec2.scale(3/5, 3/5);
Vec2.translate(1/3, 0) } }
@ Array.map [m2 → Array.concat{m; m2}]
@jdh30
jdh30 / InfinitePowerSeries.tq
Created November 21, 2022 15:15
Infinite power series
let toHtml f =
let x = Html "&#119909;" in
let pow = (* xⁿ *)
[ 0 → {Html "1"}
| 1 → {x}
| n → {x; Html.tag "sup" {"style", "font-size:70%"} (Html.ofNumber n)} ] in
let append(xs, x) = Array.Unsafe.append xs x in
let appends(xs, xss) = Array.fold append xs xss in
let minus = Html.of " - " in
let ellipses = Html " + &#8230;" in
@jdh30
jdh30 / NQueens.tq
Created November 21, 2022 12:43
Find solutions to the n-queens problem
let safe (x1, y1) (x2, y2) =
x1 <> x2 && y1 <> y2 && x2 - x1 <> y2 - y1 && x1 - y2 <> x2 - y1
let rec next n s =
Stack.pop s @
[ None -> None
| Some((qs, ps), s) ->
Stack.pop ps @
[ None -> if Stack.length qs = n then Some(qs, s) else next n s
| Some(q, ps) ->