I have been investigating category theory. I find the Elixir pipeline operator a|> b to be far more readable than the Haskell equivalent b ° a
Author: chriseyre2000
Docker Postgres for Ecto
This is the trick to get this started:
docker run –name postgres \
-e POSTGRES_PASSWORD=postgres \
-p 5432:5432 -d –rm postgres
Also
docker run -d –name postgres -v my_dbdata:/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_PASSWORD=”postgres” postgres:11
Experimenting With Elixir in Docker
I am working on my book Elixir Function Guide. Having noticed that there are a lot of mix tasks that I did not know about (and some that my exercism.io students don’t) then I thought that I would add some details at the start of the book.
I started using mix help to list the available functions:
mix # Runs the default task (current: "mix run")
mix app.start # Starts all registered apps
mix app.tree # Prints the application tree
mix archive # Lists installed archives
mix archive.build # Archives this project into a .ez file
mix archive.install # Installs an archive locally
mix archive.uninstall # Uninstalls archives
mix clean # Deletes generated application files
mix cmd # Executes the given command
mix compile # Compiles source files
mix credo # Run code analysis (use `--help` for options)
mix credo.gen.check # Generate a new custom check for Credo
mix credo.gen.config # Generate a new config for Credo
mix deps # Lists dependencies and their status
mix deps.clean # Deletes the given dependencies' files
mix deps.compile # Compiles dependencies
mix deps.get # Gets all out of date dependencies
mix deps.tree # Prints the dependency tree
mix deps.unlock # Unlocks the given dependencies
mix deps.update # Updates the given dependencies
mix do # Executes the tasks separated by comma
mix escript # Lists installed escripts
mix escript.build # Builds an escript for the project
mix escript.install # Installs an escript locally
mix escript.uninstall # Uninstalls escripts
mix format # Formats the given files/patterns
mix help # Prints help information for tasks
mix hex # Prints Hex help information
mix hex.audit # Shows retired Hex deps for the current project
mix hex.build # Builds a new package version locally
mix hex.config # Reads, updates or deletes local Hex config
mix hex.docs # Fetches or opens documentation of a package
mix hex.info # Prints Hex information
mix hex.organization # Manages Hex.pm organizations
mix hex.outdated # Shows outdated Hex deps for the current project
mix hex.owner # Manages Hex package ownership
mix hex.publish # Publishes a new package version
mix hex.repo # Manages Hex repositories
mix hex.retire # Retires a package version
mix hex.search # Searches for package names
mix hex.user # Manages your Hex user account
mix loadconfig # Loads and persists the given configuration
mix local # Lists local tasks
mix local.hex # Installs Hex locally
mix local.phx # Updates the Phoenix project generator locally
mix local.public_keys # Manages public keys
mix local.rebar # Installs Rebar locally
mix new # Creates a new Elixir project
mix phx.new # Creates a new Phoenix v1.4.0 application
mix phx.new.ecto # Creates a new Ecto project within an umbrella project
mix phx.new.web # Creates a new Phoenix web project within an umbrella project
mix profile.cprof # Profiles the given file or expression with cprof
mix profile.eprof # Profiles the given file or expression with eprof
mix profile.fprof # Profiles the given file or expression with fprof
mix release # Assembles a self-contained release
mix release.init # Generates sample files for releases
mix run # Starts and runs the current application
mix test # Runs a project's tests
mix xref # Prints cross reference information
iex -S mix # Starts IEx and runs the default task
It was only then that I realised that I have a number of mix extensions installed.
I need to start with what comes out of the box.
At this point I have three choices:
- Uninstall the extensions (these are usefull .)
- Manually edit out the extensions (error prone)
- Use docker
The docker option is appealing as it will allow me to test using different versions of Elixir.
Here is the simple option that allows the use of docker:
docker run -it elixir:1.10 /bin/bash
This downloads the image and runs up the container. Note that this starts with bash, rather than the default iex.
From this mix help gives the more useful list:
mix # Runs the default task (current: "mix run")
mix app.start # Starts all registered apps
mix app.tree # Prints the application tree
mix archive # Lists installed archives
mix archive.build # Archives this project into a .ez file
mix archive.install # Installs an archive locally
mix archive.uninstall # Uninstalls archives
mix clean # Deletes generated application files
mix cmd # Executes the given command
mix compile # Compiles source files
mix deps # Lists dependencies and their status
mix deps.clean # Deletes the given dependencies' files
mix deps.compile # Compiles dependencies
mix deps.get # Gets all out of date dependencies
mix deps.tree # Prints the dependency tree
mix deps.unlock # Unlocks the given dependencies
mix deps.update # Updates the given dependencies
mix do # Executes the tasks separated by comma
mix escript # Lists installed escripts
mix escript.build # Builds an escript for the project
mix escript.install # Installs an escript locally
mix escript.uninstall # Uninstalls escripts
mix format # Formats the given files/patterns
mix help # Prints help information for tasks
mix loadconfig # Loads and persists the given configuration
mix local # Lists local tasks
mix local.hex # Installs Hex locally
mix local.public_keys # Manages public keys
mix local.rebar # Installs Rebar locally
mix new # Creates a new Elixir project
mix profile.cprof # Profiles the given file or expression with cprof
mix profile.eprof # Profiles the given file or expression with eprof
mix profile.fprof # Profiles the given file or expression with fprof
mix release # Assembles a self-contained release
mix release.init # Generates sample files for releases
mix run # Starts and runs the current application
mix test # Runs a project's tests
mix xref # Prints cross reference information
iex -S mix # Starts IEx and runs the default task
Installing Lumen
Lumen is an alternative BEAM Implementation.
Warning that this is still at a very early stage. It promises the ability to build WebAssembly
I am not currently interested in using Rust to build it from sources, but there are now images published here
https://github.com/lumen/lumen/releases
I used the following to install the tarball (I use a mac):
sudo tar xf lumen-0.1.0-nightly-x86_64-apple-darwin.tar.gz -C /opt
This deploys the bundle to: /opt/lumen
The compiler is now available at: /opt/lumen/bin/lumen
Here are more details on lumen: https://getlumen.org/
On having a Useless Superpower
I am going to admit to having a minor superpower. I can hear high pitch sounds that most people can’t.
This is not at all useful as it results in me getting a headache in lots of shops or museums (and in one especially annoying instance a job interview). It’s typically a 50hz signal.
Elixir in Docker
This is a great introductory article: https://www.poeticoding.com/running-elixir-in-docker-containers/
Minimalist Clustering Demo
This is based on code from a video that I have previously linked to.
However Elixir has made a few breaking changes since then.
This is going to demonstrate how to cluster two local Elixir nodes, deploy code from one to the other and then upgrade it while it is running.
You need to put the following code in a file called blabber.ex
defmodule Blabber do
def start do
spawn(fn -> loop(0) end)
end
def loop(uptime) do
receive do
:stop ->
IO.puts "Shutting blabber down ..."
exit(:normal)
after 1000 ->
IO.puts "Nice! #{uptime} seconds of bgu-free uptime on #{node()}."
end
Blabber.loop(uptime + 1)
end
end
Next you need to start iex with a name and a cookie (in the same folder as blabber.ex):iex --sname cat --cookie super-secret
In a second terminal start another iex session
iex --sname dog --cookie super-secret
From the first terminal connect the two nodes together:
Node.connect :"dog@MacBook-Pro"
Compile the code in the cat node:
c ("blabber.ex", ".")
We need to use this version of the compile function as by default since Elixir 1.5 the beam file is not output by default.
The process can be started on the cat node with:
Blabber.start
Now you can transfer the compiled beam file to all linked nodes using:
nl Blabber
Now from the dog node you can start the process:
Blabber.start
At this point we notice the typo in the code. It say bgu-free rather than bug-free.
Edit the source file save the change.
On the cat node recompile this:c ("blabber.ex", ".")
This will immediately fix the problem on the cat node (and leave the count updating).
If you use:nl Blabber
then the solution will be moved to the other node as well.
This demonstrates the simplest possible Clustering arrangement. It is simple to extend this to a move sophisticated service.
Iex Documentation
Here is is: https://www.mankier.com/1/iex
Essential Elixir Videos
Twitter For Tech Support
Sometimes a companies official Tech Support channels can be a little slow.
If the official channels don’t work then you can turn to twitter. Raising a support issue on a social media site can cause the company to take action. Sometimes a DM to them will enable action that a support ticket does not.