Skip to content

Instantly share code, notes, and snippets.

View Faheetah's full-sized avatar

William Normand Faheetah

View GitHub Profile
Faheetah /
Created September 15, 2023 16:30
Install containerd and nerdctl on Ubuntu
# Note: can also just install nerdctl-full
sudo apt-get update
sudo apt-get install containerd
tar -zxf nerdctl-1.5.0-linux-amd64.tar.gz nerdctl
sudo mv nerdctl /usr/bin/nerdctl
rm nerdctl-1.5.0-linux-amd64.tar.gz
Faheetah /
Created March 15, 2022 16:29
Add Tailwind to Phoenix

Make all the changes described in these files. Delete assets/css/phoenix.css as it is no longer used.

  • config/dev.exs
  • assets/package.json
  • assets/postcss.config.js
  • assets/tailwind.config.js
  • assets/css/app.css
  • mix.exs
# set a loop for running commands, will run unit tests on enter
while read; do go test ./...; done
# set a loop that runs once a second (like watch), can be used in cases watch doesn't fit as well
while sleep 1; do ls; done
# do something with the previous command
ls $(!!) # equivalent to ls $(pwd)
Faheetah /
Last active September 29, 2021 19:26
Golang: pass in a struct and a map and retrieve values

This is handy for cases such as needing to dynamically assign structs, for example when use with marshalling or when assigning the results of a SQL query into a struct, without duplicating code for each type. This is a naive implementation as it takes absolutely no error checking into account. It is not production safe and is meant to demonstrate how to iterate through and populate a struct.

Example usage

type Foo struct {
	Int        int
	String     string
	Unassigned string
Faheetah / struct_parser.exs
Last active June 23, 2021 15:58
An example of parsing C with Elixir nimble_parsec, specifically Libvirt XDRs
defmodule StructParser do
import NimbleParsec
@space 0x0020
@tab 0x009
whitespace = utf8_char([@space, @tab, ?\n])
ignore_whitespace =
Faheetah / test_parser.ex
Last active June 16, 2021 20:08
Parsing a complex key = value structure with optional trailing comments
defmodule Test.Parser do
import NimbleParsec
# iex(9)> Test.Parser.parse """
# ...(9)> FOO = 1 (some foo)
# ...(9)> BAR = 2 (some
# ...(9)> bar)
# ...(9)> FAZ = 3 (some faz)
# ...(9)> """
# {:ok, ["FOO", 1, "somefoo", "BAR", 2, "somebar", "FAZ", 3, "somefaz"], "\n",
Faheetah /
Last active May 1, 2021 22:23
Elixir Phoenix TLDR

Generate an App

Requires, install with mix archive.install hex phx_new

mix app

Common flags:

Faheetah /
Created May 1, 2021 18:00
Log commands to a .history file for repos

A problem with repositories is sometimes you do not remember what commands you ran to bootstrap the application, or what generators were used. A history file similar to .bash_history would be handy for a per-project basis. The h command above provides a wrapper around this functionality. It should be portable across any system with bash.

Run a command and write out the command to the git project's .history file, this logs $@ to .history

$ h mix project_name
$ h mix deps.get
$ h mix ecto.create
$ cat .history
mix project_name
Faheetah / brute_force_calculate_stars.exs
Created March 23, 2021 03:47
How many permutations of rows can make 51 stars, max of 25 per row, max of 10 rows, can alternate
defmodule FlagStars do
def calculate() do
Enum.reduce(1..25, [], fn first, acc ->
acc ++ Enum.reduce(1..25, [], fn second, acc ->
acc ++ Enum.reduce(1..10, [], fn rows, acc ->
acc ++ cond do
(rows * first) == 51 -> [{first, rows}]
((div(rows, 2) + rem(rows, 2)) * first) + (div(rows, 2) * second) == 51 -> [{first, second, rows}]
true -> []