Skip to content

Instantly share code, notes, and snippets.

View mgwidmann's full-sized avatar

Matt Widmann mgwidmann

View GitHub Profile
@mgwidmann
mgwidmann / day1.go
Last active December 3, 2019 06:38
2019 AOC - golang
package main
import "fmt"
var allMasses []int = []int{
147308, 51605, 71317, 110882, 92545, 126856, 104937, 92433, 107850, 119538, 82733, 52216, 105704, 123682, 105919, 136265, 100540, 84245, 72006, 111652, 85116, 85841, 71374, 144196, 125493, 113529, 64637, 87489, 138161, 120897, 53384, 83310,
120672, 126144, 107681, 101369, 77469, 141056, 140426, 114920, 124454, 130867, 64611, 104813, 138808, 114234, 148654, 59031, 91367, 83316, 106192, 127495, 139980, 119024, 149567, 57007, 61075, 65637, 75293, 61670, 104044, 77230, 80201,
137094, 99733, 50801, 68922, 148404, 79980, 62716, 67666, 72694, 81951, 108427, 111721, 55532, 94442, 88562, 101088, 111656, 111649, 92085, 91730, 114744, 59355, 55842, 100926, 146370, 147829, 62160, 91447, 115745, 141815, 106837, 68151,
89077, 60357, 89856, 75040, 139131,
}
@mgwidmann
mgwidmann / task_async_stream.ex
Last active February 14, 2019 05:24
Example usage of Task.async_stream/3
# Take all numbers from 0 to 50 million and sum every number from 0 to that number and sum those numbers
:timer.tc fn ->
1..50_000_000
|> Enum.map(& Enum.sum(0..&1))
|> Enum.sum()
end
# Takes almost 2 minutes to run and returns the value 20,833,345,833,335,000,000
# => {108521694, 20833334583333350000000}
# Using task async stream, this can be done concurrently easily by just
@mgwidmann
mgwidmann / wat.scala
Last active March 6, 2018 17:33
Scala's violations of the principle of least surprise
{} + "" == "()" // true
pow(2, 31).intValue + 1 > 0 // false
Set(1,2,3).sameElements(Set(3,2,1)) // false
Some(null).get // No exception :(, Some(null) should result in a None IMO
// Option objects might be null!!!
def safeOption(shouldBeSafe : Option[String]) : String = {
# prices = [11, 7, 5, 8, 10, 9]
# => 5
# ALGO 1: BRUTE FORCE
# for each map to profit, find biggest number
# 11 => [-4, -6, -3, -1, -2]
# 7 => [-2, 1, 3, 2]
# 5 => [3, 5, 4]
# 8 => [2, 1]
# 10 => [-1]
#
@mgwidmann
mgwidmann / ecto_polymorphism.ex
Last active September 29, 2020 14:45
Ecto Polymorphism
defmodule Ecto.Polymorphic do
defmacro __using__(_) do
quote do
require Ecto.Schema
import Ecto.Schema, except: [belongs_to: 2, belongs_to: 3]
import unquote(__MODULE__)
end
end
@mgwidmann
mgwidmann / with_and_dialyzer.ex
Created June 23, 2016 20:08
Showing an example of using the with keyword & usage/output of dialyzer
# Assuming we have some code like this
defmodule Processor do
# A lot of code uses the following format, and its a good way to write code
# However, when we have potential failures at each step things get complicated
def process(user, meta) do
user
|> verify_authenticity(meta[:credentials])
|> process_payment(meta[:charges])
|> issue_resource
|> generate_response
$ mix new policy_enforcement_playground
$ cd policy_enforcement_playground
# Make a new file lib/authorization.ex
defmodule Authorization do
def authorize_first_thing(_user, resource) do
# Do some authorization here, modifying what gets returned based on the
# authorization level of the user
resource
end
@mgwidmann
mgwidmann / twitter_stream.ex
Last active November 29, 2022 20:35
Infinite Streams with Elixir
# Elixir has lazily evaluated enumerable objects that allow you
# to work with enumerable objects like lists either only as needed
# or infinitely.
# Start up iex to play around
$ iex
# Typical enumeration is done eagerly where the result is computed ASAP
iex> Enum.map(1..10, fn i -> i * 2 end)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
@mgwidmann
mgwidmann / supervisor.ex
Last active September 25, 2022 19:58
Overview of the Supervision system
# The golden trinity of Erlang is the secret sauce behind what makes
# Elixir a strong choice for any backend application and/or system.
# https://tkowal.wordpress.com/2015/10/20/failing-fast-and-slow-in-erlang-and-elixir/
# The supervision and worker system, commonly referred to as OTP (Open
# Telecom Platform, which has nothing to do with telephony), is what
# gives Erlang/Elixir applications them a robust "self-healing" type
# property that makes them extremely fault tolerant.
@mgwidmann
mgwidmann / hotcode.ex
Last active September 25, 2022 19:57
Hot code swapping
# To show hot code uploading, we first need to build a simple phoenix project so we can see it happen in real time.
# Start by making a new phoenix project
$ mix phoenix.new hotcode
# Go into the directory
$ cd hotcode
# Add exrm dependency to mix.exs file
{:exrm, "~> 1.0.3"}