DinosaurDance

74 Followers
108 Following
28 Posts
Long-time programmer and newbie Elixian wending my way through the Elixir / Phoenix / BEAM environment.
Websitehttps://rgacote.github.io/dinosaurdance/
AgeCretaceous

Based on new data, I've changed my mind about the belief that "People don't change their minds based on new data."🙂🙃

My previous belief was based on the great research on the "backfire effect," done by Brendan Nyhan in 2010. But in 2020, Brendan did new research, showing that he was wrong about people not changing their minds.🙃🙂
https://www.pnas.org/doi/10.1073/pnas.1912440117

He showed that presenting the right data the right way, does cause people to change their minds. This was the right data and way for me.

1/N

Fault Tolerant Basics Elixir in Action Chapter 8. A walk through run-time errors and Supervisors.

“Instead of obsessively trying to reduce the number of errors, your priority should be to minimize their effects and recover from them automatically.”

#Learning Elixir #MyElixirStatus #ElixirInAction

Dinosaur Dance

Dinosaur Dance

Building a Concurrent System Elixir in Action Chapter 7. The GenServer handle_call function returns state to the GenServer, which messages it back to the caller. You can also spawn a worker process, return state to the GenServer instructing it not to message back to the caller, then send a message directly from the spawned worker function.

#LearningElixir #MyElixirStatus #ElixirInAction

Building a Concurrent System

Elixir in Action: Chapter 7

Dinosaur Dance

GenServer Powered Todo Server Elixir in Action: Chapter 6 Exercise

  • Functions are applied to data.
  • Functions are applied to data.
  • Functions are applied to data!!

My Python-brain still sees TodoList.add_entry(todo_list, new_entry) as an object method call and not a Module.function to modify todo_list.

Additionally, when inside a GenServer cast or call I’m thinking, “Where did the todo_list come from?” It came from the GenServer and is the GenServer’s state.

Brain is slowly switching to functional mode.

#LearningElixir #MyElixirStatus #ElixirInAction

GenServer Powered ToDo Server

Elixir in Action: Chapter 6

Dinosaur Dance

Generic Server Processes Elixir in Action: Chapter 6.

I knew about the GenServer handle_call function for synchronous message handling and handle_cast for async, and learned about handle_info for “non-GenServer-specific” message handling.

The chapter provides a clean-up timer as an example.

Implements a simple GenServer which is a big help in understanding the internals.

#LearningElixir #MyElixirStatus #ElixirInAction

Generic Server Processes

Elixir in Action: Chapter 6

Dinosaur Dance

Just watched an excellent interview with Hayleigh Thompson the developer of the Lustre Web Framework for Gleam.

Lustre moves the functional message-passing actor model to the browser. A particularly exciting feature is that since message passing is used, the actors can be running (fairly transparently) either in the browser or on the server.

When you control the full stack communicating between the browser and the server is done without an API, simply a message transport.

#Gleamlang

Designing The Lustre Web Framework (with Hayleigh Thompson)

YouTube

Concurrency Primitives Elixir in Action: Chapter 5.

Though primarily about processes, messages, and servers, another thing I found significant in this chapter is the liberal use of lambda functions. Many places where I would tend to create a new function and then call are it replaced with lambda functions. Need to become more comfortable with this.

Concurrency Primitives

Elixir in Action: Chapter 5

Dinosaur Dance

[Data Abstractions(https://rgacote.github.io/dinosaurdance/posts/elixir-in-action-3rd-edition/chapter-04/).

I found that typing and testing all the small code snippets added to my Elixir “muscle memory” and seeing what standard practices look like. For example, when updating the todo list example, I would not have thought of passing a lambda function for the update vs. just passing new data. The lambda function provides much more flexibility at the cost of some slight complexity increase (at least I’m still seeing it as a complexity increase at this stage).

I need to remember that anonymous functions don’t need to be simple one-liners.

#LearningElixir #MyElixirStatus #ElixirInAction

Data Abstractions

Elixir in Action: Chapter 4

Dinosaur Dance

Control Flow Elixir in Action: Chapter 3 opens with an introduction to pattern matching, with details on tuples, lists, maps, bitstrings, binaries, and of course functions, then delves into function guards to implement extended pattern matching in functions.

Multi-clause anonymous functions were new to me:

test_num = fn x when is_number(x) and x < 0 -> :negative x when x == 0 -> :zero x when is_number(x) and x > 0 -> :positive end

Started working more with the Stream module.

#LearningElixir #MyElixirStatus #ElixirInAction

Control Flow

Elixir in Action: Chapter 3

Dinosaur Dance

Building Blocks Elixir in Action: Chapter 2 dives into the nitty gritty of what you need to know to get started programming Elixir. From IEx and code organization to variables, types, operators, and the runtime.

I finally clicked on the use of & in lambdas. The syntax always looked foreign to me and I kept thinking there was somehow more magic going on. I think The Erlangelist macro articles helped clear that up for me.

The following are equivalent:

lambda = fn a, b, x -> a + b - c lambda = &(&1 + &2 - &3)

#LearningElixir #MyElixirStatus #ElixirInAction

Building Blocks

Elixir in Action: Chapter 2

Dinosaur Dance