Elixir Outlaws is an informal discussion about interesting things happening in Elixir. Our goal is to capture the spirit of a conference hallway discussion in a podcast.

Episode 120: "If you heard it here first..."

September 15, 2022 39:43 38.13 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show.

Episode 119: The Eternally Nocturnal Programmer

July 28, 2022 37:43 36.21 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show. Special Guest: Quinn Wilton.

Episode 118: Who's crap is it anyway?

July 21, 2022 42:10 40.48 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show. Special Guest: Mitchell Hanberg.

Episode 117: Honey Potion and Problem Solving

June 23, 2022 33:56 32.58 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show.

Episode 116: TLA+ Catlaws

June 09, 2022 42:12 40.51 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show.

Episode 115: EMPEX, A Tale from Two Cities

May 19, 2022 46:21 44.5 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show.

Episode 114: A Conversation Continued

May 05, 2022 25:15 24.25 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show.

Episode 113: And then there were 3

April 21, 2022 1:18:12 75.07 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show.

Episode 112: “What’s in a Name?”

March 10, 2022 45:29 43.66 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show.

Episode 111: Sock it to Me, Ecto

March 03, 2022 46:35 44.73 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show. Elixir Outlaws, 02/22/2022 On today’s episode of the Elixir Outlaws, Amos and Sean are going to talk about authentication and authorization in applications as well as creating starter applications. The forms work great for air handling and everything inside of Phoenix if you are using a changeset otherwise, you got a lot of hand jamming for yourself, says Amos. Episode Highlights JavaScript has buttons to add fields or remove fields, things like that, but it is up to you if you decide that you are going to do it with live view. Changesets don’t work super well with a list. If Amos tries to put in one thing in the list, which is already in the list, it is overriding the whole list. For the invoice cases, whenever we want to add an item to the list, all those changes that are currently there will cause ripping of the form because we are affecting the changeset, says Amos. If you change one of the items in a list, you have to pull everything out, make the one change, and put everything in this change; otherwise, you are going to overwrite the whole list. So, you are going to use the get field instead of getting change, suggests Amos. Sean asks Amos, in your live view implementation, are you taking the changeset you have and trying to find a nested chainset inside it to modify it? Once I have a list, there is this extra cognitive overhead to remember that I need to grab the original fields and make sure that those end up in the changes too, because, otherwise, I am going to overwrite the whole thing, says Amos. Sean inquire from Amos, as you said, your invoice items need to be reused. Are they possible to exist on multiple invoices? Reload doesn’t put it into the changesets once you are building changesets, and that is when it becomes an issue on the front end in the database, says Amos. Amos is going to write a blog post about changeset because he could not find anything on the Internet that talked about it directly, and he is going to take another peruse through the Ecto documentation. Normally, your validations are to a single field on your changeset, and if you are writing a custom validator, use validate change, and you can pass it a function that takes the details about that change on that field, says Sean. Sean explains that all of the things we call validate those happen as soon as you call them but prepare changes like adding a function that will be called right before you call to update or insert or delete. Amos has a function for signing up that versus inviting and signing up says - I am going to create a company, which is a very common thing in web apps. You could even get a very long way into your app and only need one user per group or per team, but there is some overhead to thinking about how you appropriately hide that if you don’t need a multi-user multi-team or multi-group, says Sean. 3 Key Points If you think about the database tables, delete is like on-cast on delete cascade. There is no analog, but you need to delete the associated record if you dissociate, says Sean. When you get your response from your multi, you have to rebuild your form changeset out of that new response and send it out, which sometimes doesn’t build in the same way you want for actually displaying the first time, says Amos. If Sean was building a new web app from scratch and it had some concept of or might feet in the future need some concept of teams, he would probably go ahead and build it from the beginning. Tweetable Quotes “I spent the last two weeks on the bugs in edge cases, and I guess they weren’t really edged cases.” – Amos “When we want to remove something already existing, we have to keep changeset updated constantly with what is on the front end.” – Amos “You can use getfield whenever you are working with existing things. Get change makes sense when you only care about the things being added.” – Sean “There is some dissonance between I want to modify this one thing or I am modifying the collection and treating them as the same thing makes it complicated for you.” – Sean “When I am trying to go back to a phoenix form versus if I am using a multi with something that is not Phoenix, there is no reason to go back to a changeset, and I need to display some error the user.” - Amos Resources Mentioned: Podcast Editing Elixir Outlaws: Website

Episode 110: All the Rusty Things

February 25, 2022 1:05:56 63.29 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show. Elixir Outlaws, 19/02/2022 On today’s episode of the Elixir Outlaws, Chris Keathley and Sean Cribbs are going to talk about Embedded Systems, Microcontrollers, Rust, Raspberry Pi, Zig, etc. There is a compelling benefit of Rust, you can’t use this block of memory, and you can check that at compile time. There is a whole class of memory problems that Rust is stopping you from being able to interact with, but you kind of give it all up. If you dump the thing on a single-threaded, single-core M0 processor. Episode Highlights Zig is very appropriate for the embedded stuff, because if you are dealing with it, then you give up a lot of the benefits of Rust in an embedded context, says Chris. There is a lot to work with Rust to, like write wrappers around unsafe type things to the point where you aren’t really getting a lot of its benefits. There was a project in which Sean was working years ago that was leaning heavily on top of DPDK and which is the Data Plane Developer Kit. Basically, it lets you write network programs using kernel bypass. So, you basically get direct access to the network interface card, and it does some memory tricks and the network buffers into, huge pages that are user space rather than being, passed into kernel buffers and then hand it off with context switches into the userspace. So, you kind of gets the opportunity to do some packet-level programming there. A whole class of problems could happen in a Zig Application that just can’t happen unless you use obviously giant caveat. On the other hand, Rust is going to keep you from making those mistakes. Rust also has the notion of marking variables undefined, which was always a potential bug in C programs. For those of you who don’t know, in old versions of C, you had to declare all your variables, you couldn’t declare them in scope, you couldn’t declare them, in your FOR loop, it had to be declared at a higher scope before you could use it in at least the version of C, which was like a pre ANSI. Zig is an appropriate choice for the embedded work that Chris was doing, and he is starting to get into places where he really does want an arthouse like of some sort. We are working on an API; its job is basically to produce these ginormous JSON documents and serve them to another app that produces the front end for our customers. Sean could have switched back to Alexa or like Jason Library, but that would have made things worse, so there are still like times when you have to take that risky bet. As a leader of an organization, you choose the culture you want, and then, based on that culture, you bring together people, and you tell them to make a decision, and then all you do is ratify that decision once they’ve come to a decision. Sean recommends people to read the book “Kill It With Fire.” One of the things the author talks about is when there is a big problem, and they really want to solve it, the executives have to be into solving the problem. Sometimes they want to be to be involved, and they end up getting in the way. So, the strategy that she is picked in previous situations is they want to be involved, so they want to have a war room. Chris has been in big company land where if you do anything without asking for permission in triplicate, you get your hands slapped. There is a situation in mind where we are trying to figure out what the next major iteration of our platform is going to look like, and some of that means like questioning the assumptions that were made over the last three years building this product, and then you don’t like on the one hand we want to try things and see if they work like prototypes and whatnot and on the other hand, there is just a massive amount of functionality to figure out, says Chris Chris is building new things then trying to get to the next level of the product. Chris suggests that you can find everything you need if you search long and hard and kind of learn where it all is, it suffers mostly pedagogically like it doesn’t take you from nothing to an expert or even like semi knowledgeable. There is no path for that, and that is the thing that is really missing. For Chris, coming back to an object-oriented language after being in functional land for so long, he gets really scared when he sees those sorts of things. It is one of the few credo rules that Chris turns on from his laser stuff. He wants functions to have docs, and he wanted modules to have docs or at minimum have module block false, which is also again partially for he hides most of his internal modules. You might change memory layout like your username is different than my username, and that changes the layout of how stuff gets into RAM, and that can result in a marked speed improvement. Let’s use statistics and see our improvements are statistically relevant. Or if they are within the noise. If it is just noise, then try optimization Level 3, it is better than optimization level 2. If we can find places in code, the problem with profilers as they show you where you spend all your time. 3 Key Points Chris has written 50 to 100,000 lines of Rust at this point in various projects doing various things. Sean and Chris discuss about the common problem in C language and how Zig is the much better version. Rust is a better version of C++. C++ is a big old honking language at this point. Rust feels like that vein where it has a lot going on, setting aside the ownership stuff. Tweetable Quotes “All embedded microcontroller platform is a giant bag of global mutable state.”- Chris Keathley “Rust compile-time memory safety stuff which is very novel and cool.” - Chris Keathley “It is C that is keeping you from making some of the glaring C problems.”- Chris Keathley “Zig appeals to me on an aesthetical level that Rust does not” - Chris Keathley “Java is a safe bet because of adoption, not because of fitness to purpose.”- Sean “If you are excited about it and getting invested in it, then that means a lot. It doesn’t eliminate risk, but it certainly helps to mitigate it when you make those big choices.” - Chris Keathley “As a leader high up in an organization, you don’t make choices. You just bring together people who do make choices, and you ratify their choices.”- Chris Keathley “Our team is responsible for some of the embedded work, which is largely built around nerves.” - Chris Keathley “We have a deployment setup that’s really nice in that we can just use consistent hashing through a static cluster.” - Chris Keathley “We made the loading spinner render faster, but it didn’t make loading any faster.” - Chris Keathley Resources Mentioned: Podcast Editing Elixir Outlaws: Website

Episode 109: Bike Racks and Frameworks

February 10, 2022 36:50 35.37 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show. Elixir Outlaws, 09/02/2022 On today’s episode of the Elixir Outlaws, Amos and Sean are going to talk about what other models and frameworks are out there for building web apps. The plug has some stuff that looks like Sinatra, but the responses were not what Sean expected in some places. Many people recommended the web machine and the surprising elixir plug. A big point of a web machine is to build something that conforms to the semantics in the RFCs as much as possible. It’s kind of hard for most web frameworks Sean has used, aside from web machines. Episode Highlights In a web machine, your resources are the main thing you work with, and it is a module with a bunch of optional callbacks that you can implement. In a web machine, you have controllers, routers, and dispatch lists that you match over. If you have designed the thing right, you can do that computation at a very low cost to the server. So you are generally improving things in terms of bandwidth, but you are also improving things in terms of time spent processing the request, says Sean. The e-tags are a little bit more complicated, but you could do something like hash the contents of the record and use that as an E-tag. Sometimes you can’t, but that happens all before you even get to the point of producing content. Elli is another great Erling Web server and what’s great about it is super tiny. You can do a lot with very, very little code, and like a phoenix or plug, it will compile your routes when you define them, explains Sean. You can just give ELLI a list of functions, and it’ll run all of them and pass them whatever the output is from the previous function. The only requirement is your end handler because the thing attached to the route has to return particular keys in that map, suggests Amos. Ease is a big deal for people. If you understand any language or server, you can get into this new language or new framework pretty easily with ease. It’s hard to get started or figure out whenever you run into problems. The lifecycle stuff is spread out all over the documentation because sometimes you can change web sockets so that it’ll react, and sometimes you can’t flash messages the same way, says Amos. When you are trying to load your timeline on the big social media websites, you get some placeholder thing first, and then they load in, and it displays, suggests Sean. There are some limitations to the bandit framework yet. It’s not 100% complete, but it can probably work for most of the Phoenix things or plug things you want to do, says Sean. When Amos first started looking into Erling, they looked into Erling for a communication server, not a web server. Nitrogen hails from the days before we have WebSockets, but a lot of what it was trying to do is very much in line with things like live view things, says Sean. 3 Key Points Many people know phoenix but don’t know Elixir, and similarly mid-teen people with Ruby projects don’t know Rails or don’t use the things that the language provides. If you know Elixir well enough, the big Leap is not semantics for Erling, but the syntax. Erling doesn’t apply to Elixir because it made different choices, making the Erling web server less approachable to work on. The flip side of nitrogen is that it’s inefficient to render the tricks that EEX does. Where it’s like I’m going to read everything up until this sigil, and that’s going to be one binary that gets submitted into the compiled function, says Sean. Tweetable Quotes “With rails, It was hard to do computation because you’d have to go all the way down into the controller and do all of the work you are going to do except rendering the page.’ - Sean “If you focus on doing very little in each callback defined by the web machine, you get a snappy and compliant HTTP interface.” – Sean “If your whole page is a live view and the initial render is even really just an empty template that maybe check some authentication to make sure that you are off.” - Amos Resources Mentioned: Podcast Editing Elixir Outlaws: Website

Episode 108: Macaroons and Oreos

January 27, 2022 1:09:14 66.47 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show. Elixir Outlaws, 01/25/2021 On today’s episode of the Elixir Outlaws, Amos and Sean are going to share their technical knowledge and insight on various topics. Amos has been doing a lot of surface-ui work. The surface is a component library for live view. The surface has some excellent features built-in how they handle CSS. Sean hasn’t looked at the Template: Anchor yet, but he has heard mixed things about many people who feel like the eText templates have improved things. Episode Highlights The Troubles with form versus dot form feel like a limitation of the template language should unify those things, says Sean. JSX - React said you could use HTML moments wherever you want, but we are going to turn them into our DOM construction functions that produce the objects with assigned properties from context, says Sean. Sean recalls some web framework to underline called nitrogen used when it was called dynamic HTML, a sort of live update type stuff over Websockets. If you have six elements, six-pointers, and probably at the front of that, you have some metadata, then the thing that follows this block in the OTP case is a tuple, says Sean. A caveat is a kind of blockchain, because a caveat creates a new macaroon that wraps the old one with a new signature, and then you can add another restriction that wraps that one with a new one, says Amos. Sean asks, would it make more sense not to put any permissions in macaroons unless you are restricting them to a limited set because the absence of a caveat is access? Sean inquires, verifying a caveat is just like meeting the signature. If caveat doesn’t apply to an operation being performed, why would that be a problem in application logic? We are storing passwords in the database, which we don’t need. We can make a macaroon for it and give it a time limit like this macaroon will not be any good after this specific time, says Amos. Amos is going to store permissions in the macaroons, but he is not going to pull the list of projects out of the macaroon and then pull them out of the database. The authorization context is not the initial set of facts. It’s the thing you want to unify, especially if there is a caveat for the items. Sean asks Amos, what are your thoughts about code review, and what do you like or dislike about it? What are you trying to get out of it? Everybody tends to hit the lowest bar set on a team no matter what. So code review, to me, is a place to try to push that bar up, says Amos. Sean asks how effective is the code review itself, like the process you implement in your teams? And how often do you catch bugs? Amos says that he feels like learning happens as long as it’s communication. Typos get caught a lot, especially in the documentation, because if somebody wrote documentation, we can read it in the code review and catch typos. Reviewing something to understand how our product is put together or how our infrastructure is put together has not been that good for me, says Sean. As per Amos, if a senior asked the question, a junior will often assume that is how they should go. But once a junior person sees that they know something that you don’t know, it adjusts the power dynamic. Amos suggests that for a good team, we need vulnerability. And the hardest thing to create remotely is vulnerability because there is a lot of interaction that doesn’t happen. Amos affirms that if you can’t explain the code in the code review, you probably haven’t done it well enough for consideration. In his opinion, people don’t spend enough time on code reviews. 3 Key Points A lot of the JSX - React projects Sean had to interact with use Storybook, and Amos creates examples for each of your components, and it is a good thing that helps them with documentation. Authorization is always contextual. When you want to compare or make an authorization decision, you have to look at the context that Sean is trying to authorize and what rights have been granted. Code review is for both sides of the reviewer and the person or people whose code is being reviewed as it takes vulnerability on both sides. Tweetable Quotes “When you are a property type, and you have a component, you can define properties, and you can say whether they’re required or not.” - Amos “If I have to debug something, I look at a record. When you are debugging, it is because you don’t know what’s going on.” - Amos “If someone tried to navigate to the URL without the macaroon, they would just get denied, and that would be a perfect use case for macarons.” - Sean “With datalog in Prolog, you can declare things that look like functions in datalog, usually called facts or functors, and they have nobody.” – Sean “Celebrate failures that create learning. You don’t celebrate failures if you keep continuing to have the same one over and over.” - Amos Resources Mentioned: Podcast Editing Elixir Outlaws: Website

Episode 107: Nineteen-Something Cats

January 20, 2022 41:17 39.64 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show. Elixir Outlaws, 01/19/2021 On today’s episode of the Elixir Outlaws, Sean Cribbs and Chris will talk about WASM (Web assembly) to implement some core parts of the app and discuss the server-side too. Rusts for loop syntax is sugar for iterators, says Sean. So, you can also sort of do method chaining type thing in rust. There is an interesting proposal on the Elixir form for loops. Episode Highlights FOR loops are not loops, they are a special form in the compiler, basically a macro with special privileges that generates some code, says Sean. As per Sean, if you have a lead, then you have for loop variable, and you have to return a two-two pole that has the accumulator as the second, or if you don’t, then it is just the accumulator that becomes quite confusing. Chris says that when one uses MapReduce and has FOR loop and you want to step through something and maybe at the same time get an account and a sum, and you want to adjust the current values, then we are getting three things out in adjustment and then two other data points. It is hard to step away from an imperative mindset when you have done it forever and adding imperative things back into the language is going to make it even harder for people to step outside of that imperative mindset, says Chris. People use Monads to write things that look more imperative because it is easier for us to think that way sometimes, and it’s going to create less maintainable code. OCaml is very much like in the same syntactical flavor as Haskell. But it doesn’t have that whole lazy evaluation thing that gets so confusing at times, and it also has the much simpler type of system. Sean had tried hard to encourage his coworkers to use things like in the lists module or use list comprehensions or use fold wherever they could. But some people liked making software recursive functions that had a bunch of arguments to them. In MapReduce there is a trailing option you can put on for loops. It is like reducing given initial value of the accumulator and then you match the accumulator coming in. Using ENUM reduce, there are some tactical forms that represent something, and special form will generate, but they are not things in themselves. The things that are browser based we can’t rewrite completely in Rust. There is always going to be JavaScript at some level. Sean has seen attempts where people want to have JavaScript running the same code on the front end as in the back end. In graphic production, there are many things about memory allocators, but these are all sorts of things that we might have to think about with rust when we are trying to implement. 3 Key Points With MapReduce in the ENUM module, you can do something on each element of the collection, but you are also collecting something about the entire collection as you flow through, says Sean. The flipside of list comprehension is that you can only do so many things in the right side of the comprehension. It may be explicit what you were returning from expression because the entire expression is inside the list brackets. The biggest thing that Chris have ever had to deal with when working on stuff on the front end or on edge computing is if you don’t control the resource at the endpoint, it may be the slowest thing ever, and it may not work that well. Tweetable Quotes “I am not against pipes, and you can write non-imperative code with pipes, but it looks imperative.” – Chris “In FOR loop, FOR is an expression that returns a value. You can choose to ignore that value that’s returned, but it returns a value, usually a list.” – Sean “You can have only one let, which is the other thing that’s a little bit surprising. It works in if statements.” – Sean “Being able to have code on the back end, you control the hardware and the performance.” – Chris “The book Kill it with fire I wish I had picked up a year ago because the author worked for US digital service, updating mainframe applications, and there’s a lot of sage advice in that book.” - Sean Resources Mentioned: Podcast Editing Elixir Outlaws: Website

Episode 106: Outlaws Live at Codebeam 2021

December 23, 2021 44:40 42.88 MB Downloads: 0

The Elixir Outlaws now have a Patreon (https://www.patreon.com/user?u=5332239). If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show.