« Back to channel list

#elixir-lang - 22 April 2019

« Back 1 day Forward 1 day »
[00:01:57] mitch: has joined #elixir-lang
[00:05:53] atk: has joined #elixir-lang
[00:12:23] hypercore: has joined #elixir-lang
[00:13:30] hypercore: is there any reason phoenix+live_view can't managed what phoenix+react+graphql+apollo can for 90% of cases?
[00:13:59] mitchell: has joined #elixir-lang
[01:06:04] carldd: has joined #elixir-lang
[01:13:35] Bla[m]: nox: ooh neat, I'll be digging through your stuff a bit too
[01:15:24] Bla[m]: nox: what I was looking for is a way to dynamically define module constants to some well known atoms, sorta what BEAM does with the atom.names file but I ran into limitations in the macro system https://gist.github.com/archseer/0a0f5efaef99cb4ddfba6fb30a9a00ca
[01:15:28] Bla[m]: ^ that won't compile
[01:16:30] Bla[m]: I've been lazy and writing these out by hand for the time being, which is a bit of a mess https://github.com/archseer/enigma/blob/master/src/atom.rs#L389-L654
[01:26:35] duaneb: has joined #elixir-lang
[02:05:08] tomterl: has joined #elixir-lang
[02:17:05] Zhao: has joined #elixir-lang
[02:23:13] Zhao: has joined #elixir-lang
[03:06:28] DTZUZO: has joined #elixir-lang
[03:21:03] Saukk: has joined #elixir-lang
[03:21:28] carldd: has joined #elixir-lang
[03:55:50] harfangk: has joined #elixir-lang
[03:56:30] siwatpru: has joined #elixir-lang
[04:16:08] ariedler: has joined #elixir-lang
[04:38:36] jeffro: has joined #elixir-lang
[04:52:39] gvaughn: has joined #elixir-lang
[05:02:30] Guest97: has joined #elixir-lang
[05:15:32] Cthalupa: has joined #elixir-lang
[05:16:45] wsieroci: has joined #elixir-lang
[05:51:55] voltone: has joined #elixir-lang
[05:59:28] proteusguy: has joined #elixir-lang
[06:13:21] serafeim: has joined #elixir-lang
[06:13:27] serafeim_: has joined #elixir-lang
[06:14:12] serafeim: hello, how can I modify the messages the phoenix framework outputs for form validation errors? for example I get a "can't be blank" message for validate_required... is there a way to change that message to "This field is required"?
[06:23:13] serafeim: also is there a recommended way to authenticate phoenix users against an LDAP server ?
[06:26:03] serafeim: i've seen a bunch of elixir ldap libraries but they don't seem properly maintained. also i haven't found anything related to phoenix except a very old article
[06:26:19] DanielI: you should be able to use guardian for it
[06:26:58] DanielI: I've seen people use it together with exldap
[06:27:37] serafeim: exldap has 45 stars and more than 1 year since its last commit :(
[06:27:39] DanielI: and that in itself is just a wrapper around eldap in erlang
[06:28:19] DanielI: I suppose you could use :eldap directly if you really wanted to
[06:28:38] serafeim: probably I should try following this really old article? http://rny.io/elixir/phoenix/ldap/2016/09/20/ldap-authenication-with-phoenix.html
[06:29:29] DanielI: hm, I haven't read that one, but at first glance I see a few things that need changing to work with newer phoenix
[06:29:53] serafeim: yes definitely
[06:30:35] serafeim: oh well ok i'll try it thanks
[06:45:31] kapil____: has joined #elixir-lang
[07:03:43] Avinash: has joined #elixir-lang
[07:05:56] serafeim: how can I get the first element of a tuple using the pipe operator ?
[07:06:28] serafeim: i.e i have {:ok, foo} |> something |> i_want_:ok_here
[07:10:31] Avinash: has joined #elixir-lang
[07:11:08] wsieroci: has joined #elixir-lang
[07:37:52] wsieroci: has joined #elixir-lang
[07:39:35] serafeim_: has joined #elixir-lang
[07:40:00] wonko7: has joined #elixir-lang
[07:41:30] jeffro: has joined #elixir-lang
[07:42:11] craigp: has joined #elixir-lang
[07:52:53] lexmag: has joined #elixir-lang
[07:53:39] Cthalupa: has joined #elixir-lang
[07:55:18] Guest97: has joined #elixir-lang
[07:59:26] OliverMT: danieli: that mostly means that ldap protocol is stable
[07:59:50] OliverMT: for doing JS I'd shy away from anything not updated the last 6 months
[07:59:53] DanielI: phoenix changes a bit though, but you don't really have to change much more than the glue
[07:59:54] OliverMT: it would be a huge red flag at least
[08:00:09] OliverMT: for elixir I routinely go use libs that havent had commits in several years
[08:00:16] DanielI: JS has a way different ecosystem than erlang does
[08:00:47] DanielI: yeah, I just skim across the code looking for red flags, but usually it's pretty comprehensible stuff
[08:01:11] BitGonzo: has joined #elixir-lang
[08:01:16] OliverMT: a better metric for old erlang libs is just look at issues
[08:01:21] OliverMT: if there are 10-15 desperate issues
[08:01:24] OliverMT: then I'd shy away :p
[08:01:33] DanielI: yeah :) I'm coming from the erlang world, working on improving my elixir skills
[08:04:12] serafeim_: i'll ask again in case somebody is here now: how can I get the first element of a tuple using the pipe operator ?
[08:04:39] serafeim_: i.e I have {:ok, element} |> something |> i_want_element_here
[08:05:15] DanielI: it would be better to just do `{:ok, element} = something()` and then doing `element |> some_func()` if you really need the pipe
[08:05:22] serafeim_: is this possible or I should use the case idiom ?
[08:05:43] serafeim_: danieli, yes I know but that's two lines :)
[08:05:49] DanielI: it's possible but it doesn't seem idiomatic
[08:06:27] DanielI: LoC doesn't matter much to me if performance and/or readability is better with one more line
[08:06:27] serafeim_: ok. let's say that I want to get the head of a list through a pipe operator. is this possible ?
[08:07:03] Cthalupa: has joined #elixir-lang
[08:07:04] serafeim_: danieli, agreed I mainly want to use this for iex to save some keystrokes
[08:07:05] DanielI: Enum.at([1, 2, 3], 0)
[08:07:40] serafeim_: it works thanks !
[08:08:04] DanielI: and there's also Tuple.to_list/1
[08:08:05] OliverMT: Enum.first()?
[08:08:11] DanielI: or that, even better
[08:08:18] OliverMT: maybe thats in List
[08:08:20] OliverMT: dont remember
[08:08:27] DanielI: it's in List
[08:09:10] serafeim_: danieli, also I've found a solution for my question
[08:09:16] serafeim_: {1,2,3} |> Tuple.to_list |> Enum.at(0)
[08:09:18] OliverMT: just so its said serafeim_, unwrapping the result to massage it at the end of a long'ish pipe is not a new problem
[08:09:29] OliverMT: I still find myself writing a |> case do
[08:09:31] OliverMT: then res ->
[08:09:34] OliverMT: # use res here
[08:09:41] OliverMT: a single clause case to unwrap
[08:10:31] serafeim_: yes I understand that's the idiomatic thing to do
[08:11:23] serafeim_: however one liners have their own elegance
[08:13:06] squall: has joined #elixir-lang
[08:18:44] mbuf: has joined #elixir-lang
[08:28:35] Randyr: Perhaps a pipeline isn't the right choice here, but instead a `with` would be more appropriate?
[08:29:55] serafeim_: Randyr i'm not very familair with "with"
[08:30:23] Avinash: has joined #elixir-lang
[08:30:46] Randyr: serafeim_: It's pretty neat: https://www.openmymind.net/Elixirs-With-Statement/
[08:31:06] Cthalupa: has joined #elixir-lang
[08:31:56] serafeim_: so i'd do with {:ok, param} <- function() do use_param_here end ?
[08:34:37] serafeim_: l o l this seems to be working however I'm not sure it's really idiomatic :) (with {:ok, entry } <- Exldap.search_field(conn, "OU=People,DC=org,DC=com", "uid", "foo" ) do entry |> Enum.at(0) end).object_name
[08:35:05] serafeim_: also I guess everything would fall apart if the search didn't return
[08:35:31] DanielI: let it crash! :)
[08:35:58] serafeim_: ha ha ha ha won't this display a 500 error to the user ?
[08:36:08] serafeim_: i prefer to catch this somewhere
[08:36:42] DanielI: you could handle it gracefully and show another error instead, of course
[08:37:21] DanielI: should look nice if it's user-facing
[08:38:41] DanielI: I was of the impression this was for the interactive shell though
[08:39:49] serafeim_: danieli, yes i am testing it on iex but planning on implementing it in a module to be used in a web app
[08:41:30] Randyr: serafeim_: Rather than deconstructing the "entry" value in the do block, why not pattern match in the with? with {:ok, {result, _}} <- Exldap.search_field(...) do result end
[08:42:40] Randyr: Furthermore, if the search function returns an {:error, _} tuple, you can handle this in the `else` clause of the with. E.g.: with {:ok, res} <- Exldap.search_field(...) do res else {:error, _} -> handle_error() end
[08:49:30] serafeim_: Randyr, yes I understand this is a very elegant approach
[08:58:50] serafeim__: has joined #elixir-lang
[09:01:08] Cthalupa: has joined #elixir-lang
[09:02:22] serafeim_: has joined #elixir-lang
[09:05:23] _barcode_: has joined #elixir-lang
[09:06:09] Cthalupa: has joined #elixir-lang
[09:07:59] wonko7: has joined #elixir-lang
[09:17:03] serafeim_: the whole authentication / authorization world for phoenix seems very confusing to me. i've seen pow, ueberauth, guardian and hand-made-solutions... but I really can't understand what is the best practice for implementing authentication and authorization for phoenix
[09:17:53] serafeim_: is there a best practice? what's recommended ? should I do it by hand or not ? what do these solutions (pow/ueberauth/guardian) offer more than a hand-crafted solution?
[09:18:04] serafeim_: notice that I mainly care about LDAP authenticated users
[09:29:27] kyrylo: has joined #elixir-lang
[09:30:40] gvaughn: has joined #elixir-lang
[09:36:52] benwilson512: serafeim_: looks like guardian handles ldap per http://rny.io/elixir/phoenix/ldap/2016/09/20/ldap-authenication-with-phoenix.html
[09:37:07] benwilson512: well that isn't quite the case
[09:37:16] benwilson512: looks like that blog post talks about integrating ldap with guardian
[09:37:51] iamvery: has joined #elixir-lang
[09:39:00] serafeim_: I believe that I can implement LDAP auth myself; however I can't understand what would guardian or pow or ueberauth offer on top of that ?
[09:40:13] benwilson512: serafeim_: based on the blog post the point of guardian would be handling the session cookie, looking up users for each request, etc
[09:40:45] serafeim_: benwilson512, yes i've seen that particular post
[09:47:30] za1b1tsu: has joined #elixir-lang
[09:48:45] za1b1tsu: String.duplicate is wrapper for :binary.copy, does :binary.copy uses io lists? I can find this information
[09:52:05] benwilson512: za1b1tsu: hm not sure, it's a NIF so it's a bit hard to follow
[09:53:59] Avinash: has joined #elixir-lang
[09:54:11] benwilson512: https://github.com/erlang/otp/blob/master/erts/emulator/beam/erl_bif_binary.c#L2463
[09:54:38] benwilson512: za1b1tsu: looks like it allocates a brand new binary
[09:57:10] za1b1tsu: benwilson512, thanks bro
[10:02:20] serafeim_: I have the following objectClass = Exldap.get_attribute!(entry, "objectClass") |> Enum.join(",")
[10:02:52] serafeim_: now. the "objectClass" LDAP attribute *may* be nil. when it is nil I want objectClass to also get nil (instead of throwing). what's the most idiomatic way to do that ?
[10:05:36] Nicd-: using `with`
[10:06:49] Nicd-: `objectClass = with o when not is_nil(o) <- Exldap.get_attribute!(entry, "objectClass") do Enum.join(o, ",") end` or something like it. or since it's that short, you could also just use an `if`
[10:14:56] serafeim_: Nicd-, thanks it works with the "with" trick
[10:15:05] serafeim_: it is a little verbose though :/
[10:18:14] griffinbyatt: has joined #elixir-lang
[10:21:44] Avinash_: has joined #elixir-lang
[10:27:23] Avinash: has joined #elixir-lang
[10:30:21] lomex: has joined #elixir-lang
[10:30:42] serafeim__: has joined #elixir-lang
[10:31:12] Avinash_: has joined #elixir-lang
[10:43:56] infowolfe: has joined #elixir-lang
[10:43:56] infowolfe: has joined #elixir-lang
[10:46:31] gvaughn: has joined #elixir-lang
[11:05:49] serafeim_: has joined #elixir-lang
[11:11:45] Avinash: has joined #elixir-lang
[11:32:10] Avinash: has joined #elixir-lang
[11:35:59] netrino: has joined #elixir-lang
[11:36:59] nbg: has joined #elixir-lang
[11:38:03] serafeim_: has joined #elixir-lang
[11:38:16] serafeim_: is there a way to test in phoenix *without* creating a database ?
[11:38:35] serafeim_: i have a bunch of unit tests that i want to run quickly
[11:39:45] rawtaz: i dont suppose the sandbox featuer of Ecto can do that?
[11:40:45] serafeim_: hm never heard of that :/
[11:41:05] lauromoura: has joined #elixir-lang
[11:46:27] benwilson512: serafeim_: phoenix has nothing to do with a database
[11:46:40] benwilson512: serafeim_: are you trying to test ecto schemas w/o a database?
[11:47:02] benwilson512: or test using ecto schemas rather
[11:47:12] serafeim_: no I've implemented a module that does not have anything to do with the database and want to test it. however when I run "mix test" it tries to connecto the DB
[11:47:31] benwilson512: serafeim_: that's because you have MyApp.Repo in your supervision tree
[11:47:37] benwilson512: it tries to connect when started
[11:47:42] benwilson512: if you comment that out, it won't try to connect
[11:49:40] serafeim_: yes I see it in application.ex: children = [ Dod.Repo, DodWeb.Endpoint] so I should probably check out if the environment is test and if yes use children = [ DodWeb.Endpoint] ?
[11:49:43] benwilson512: serafeim_: mix.exs may also have an alias for test that creates the test DB if required
[11:49:53] benwilson512: serafeim_: are you never going to use the database in tests?
[11:50:17] serafeim_: not for now. also i may create a test_nodb env
[11:50:50] benwilson512: ok. You could also just allow it to create the test db and then ignore it
[11:51:41] benwilson512: you generally want to avoid Mix.env calls in runtime code however
[11:52:02] benwilson512: so I'd consider some config flag on your application like: config :my_app, database: false
[11:52:26] benwilson512: and then in your application.ex use Application.get_env(:my_app, :database) as your condition
[11:52:42] benwilson512: personally I'd just have the test database around so you can use it when you're ready
[11:53:58] Cthalupa: has joined #elixir-lang
[11:55:29] serafeim_: benwilson512, probably that's the best thing to do
[11:55:52] serafeim_: i am trying now with changing applicatiion.ex based on the env and it doesn't have a very good behavir
[11:56:41] benwilson512: serafeim_: right, the test alias and test helpers probably assume that there is a database, the generator for the project puts all that stuff in unless you do --no-ecto
[11:57:03] serafeim_: benwilson512, that probably is the case yes
[11:58:14] serafeim__: has joined #elixir-lang
[11:59:05] serafeim__: another question. how should I test an API that returns things like {:error, stuff}
[11:59:41] serafeim__: for example if I try this: case Dod.Ldap.authenticate("z", "z") do {:error, "Invalid credentials"} -> nil end
[11:59:47] iamvery_: has joined #elixir-lang
[12:00:11] serafeim__: i.e i am giving wrong credentials so {:error} should be returned
[12:00:41] serafeim__: should I use the case or do something {resp, _} = Dod.Ldap.authenticate("z", "z") assert resp == :error ?
[12:01:52] Randyr: serafeim_: you can use `assert {:error, _} = Dod.Ldap.authenticate(...)`
[12:01:53] gvaughn: has joined #elixir-lang
[12:02:27] thurloat8: has joined #elixir-lang
[12:02:34] serafeim__: Randyr, excellent that's the best way thanks !
[12:05:37] jfuavnoa: has joined #elixir-lang
[12:10:43] lauromoura_: has joined #elixir-lang
[12:24:23] DTZUZO: has joined #elixir-lang
[12:25:15] duaneb: has joined #elixir-lang
[12:35:07] Avinash: has joined #elixir-lang
[12:40:17] PragTob: has joined #elixir-lang
[12:44:11] Avinash: has joined #elixir-lang
[12:47:38] bakedb: has joined #elixir-lang
[12:48:46] tnez: has joined #elixir-lang
[12:53:27] PragTob: has joined #elixir-lang
[12:56:51] lexmag_: has joined #elixir-lang
[12:59:23] lexmag: has joined #elixir-lang
[13:00:58] either|or: has joined #elixir-lang
[13:18:46] gvaughn: has joined #elixir-lang
[13:35:49] Randyr: Question regarding auth: I have an API in which I use JWT tokens to authorize requests. Couple of downsides: 1. jwt shouldn't be stored in local storage. If kept in memory, that also means that the "session" expires upon closing the tab. 2. Invalidating sessions/tokens is a hassle, as I need to either: keep a blacklist of tokens, or validate incoming tokens every request. How do you guys deal with tokens & sessions?
[13:37:27] Randyr: I could store JWT as an http-only secure cookie, but now I've got to worry about CSRF again.
[13:48:08] gvaughn: has joined #elixir-lang
[14:00:34] kapil____: has joined #elixir-lang
[14:15:58] whoops: General recommendation is stored in a HTTP-only cookie, and yes, protect against CSRF. Browers don't really have a "secure" storage API, so cookies are the best you can really do.
[14:16:36] jeffro: has joined #elixir-lang
[14:18:50] whoops: As for revoking sessions, again, your pretty much correct their, if you need to be able to do that, you either need to maintain a token blacklist until the token expires, or track live sessions IDs. You can't really do stateless session identifiers with revokation.
[14:19:55] ariedler: has joined #elixir-lang
[14:25:18] mdbm: has joined #elixir-lang
[14:31:31] terinjokes: has joined #elixir-lang
[14:31:45] Randyr: whoops: The question remains after that though: what's the point of using JWT if we're going to maintain state on the server? At that point a regular old non-JWT session token would work equally well.
[14:37:03] proteusguy: has joined #elixir-lang
[14:42:13] DanielI: it's quite nice for SSO systems, where (for instance) app A can authenticate a user and issue a JWT that authorizes the user to access app B and C
[14:42:16] whoops: Randyr: assuming your app is a fairly typical webapp... not a lot. JWTs can be useful in distrubuted systems, where a client may talk to system A, then system B, but A and B don't have access to shared state. Or if you are willing to accept that you can't revoke sessions. Or really any time you want to store data and validate it hasn't been tampered with. But for sessions on a typical single server (or even multi-server
[14:42:17] whoops: within the same datacenter) webapp? Session IDs in a cache like Redis will do you just fine, with a similair security model.
[14:42:42] DanielI: yup! what they said :)
[14:45:32] Randyr: Thanks for the responses. Yes, it's a fairly typical web app: must support mobile/browser, monolithic (only 1 application, all Elixir), *might* require external companies to use the API later. I was thinking of keeping the sessions backed to the database and maybe keep them cached in an ETS table.
[14:50:26] craigp: has joined #elixir-lang
[14:53:46] mdbm_: has joined #elixir-lang
[14:58:01] marciol: has joined #elixir-lang
[15:06:17] Avinash: has joined #elixir-lang
[15:14:49] lexmag: has joined #elixir-lang
[15:18:16] uranoss: has joined #elixir-lang
[15:31:28] lexmag: has joined #elixir-lang
[15:52:17] paxis: has joined #elixir-lang
[15:57:09] craigp: has joined #elixir-lang
[16:01:21] dimitarvp: has joined #elixir-lang
[16:15:34] tpl: has joined #elixir-lang
[16:19:15] slashrsm: has joined #elixir-lang
[16:20:25] ariedler: has joined #elixir-lang
[16:31:38] Guest97: has joined #elixir-lang
[16:40:36] mahmudov: has joined #elixir-lang
[16:44:20] warmwaffles: has joined #elixir-lang
[16:57:19] wsieroci: has joined #elixir-lang
[16:58:13] craigp: has joined #elixir-lang
[17:08:21] inhortte: has joined #elixir-lang
[17:13:10] nineczar: has joined #elixir-lang
[17:14:19] Saukk: has joined #elixir-lang
[17:25:31] Randyr: Hey. I was wondering if anyone has some time if they could look over my "proposal" for auth and see if they find anything funny: https://gist.github.com/drtheuns/161596750a6df8339b341e5d904b8bb4
[17:39:18] Sgeo_: has joined #elixir-lang
[17:48:44] dysfun: Randyr: can't you just use a httponly cookie?
[17:50:40] dysfun: previously i've had /auth which creates a session, /token which generates a token for websocket (could be crypto or just Base.encode64(:crypto.strong_rand_bytes(16)) and e.g. stored in memcached)
[17:51:02] dysfun: if the websocket handshake failed, you can call /token. if the session is no longer valid, you direct the user to log in
[17:58:49] ariedler: has joined #elixir-lang
[18:01:51] Randyr: dysfun: This would mean keeping two tokens right? How do I expire the websocket token?
[18:04:32] craigp: has joined #elixir-lang
[18:08:52] dysfun: Randyr: if you use a non-crypto bearer token (random data), you just remove it from your redis or whatever
[18:09:04] dysfun: and why are you using a jwt for the other case? is there a good reason?
[18:09:06] dysfun: i'm not fond of them
[18:10:44] Randyr: There's no great reason for it, I'm also not a huge fan of them. I could probably get by with a smaller token that holds some simple data, encrypted on the backend. My problem is mostly with websockets and mobile clients: I don't have experience using http-only cookies for these.
[18:11:22] dtzuzu: has joined #elixir-lang
[18:30:03] dysfun: Randyr: well, you can't use http only cookies for websocket auth
[18:30:26] dysfun: Randyr: you can just generate some random data and treat it as an opaque bearer token which is checked by e.g. redis
[18:31:00] Randyr: dysfun: Yeah I saw a post about that. I don't have a need for redis/memcached. I'd probably just use a process / genserver / ets.
[18:31:18] dysfun: well yes, also options
[18:31:37] dysfun: but you see what i mean, a bearer token needn't imply cryptographic authentication
[18:32:27] dysfun: if you've only got 1 server, ets is fine. you probably want to use a library that sweeps old ones
[18:32:53] dysfun: and if you lose them all, oh well, people have to login again
[18:37:49] griffinbyatt: has joined #elixir-lang
[18:49:54] brandfilt: has joined #elixir-lang
[19:11:45] craigp: has joined #elixir-lang
[19:47:55] jeffro: has joined #elixir-lang
[19:50:11] squall: has joined #elixir-lang
[19:53:57] m1dnight1: has joined #elixir-lang
[19:56:30] tpl: has joined #elixir-lang
[19:59:33] duaneb: has joined #elixir-lang
[20:04:08] Phylock: has joined #elixir-lang
[20:12:30] lomex: has joined #elixir-lang
[20:14:21] Exuma: has joined #elixir-lang
[20:15:28] craigp: has joined #elixir-lang
[20:19:41] brandfilt: has joined #elixir-lang
[20:57:09] uranoss: has joined #elixir-lang
[20:58:01] hahuang65: has joined #elixir-lang
[20:59:55] chewbranca: has joined #elixir-lang
[21:00:11] tobias: has joined #elixir-lang
[21:01:26] mitchellhenke: has joined #elixir-lang
[21:01:33] CARAM_______: has joined #elixir-lang
[21:02:36] c355E3B: has joined #elixir-lang
[21:04:17] ytruly: has joined #elixir-lang
[21:05:44] profit_: has joined #elixir-lang
[21:06:44] reachfh: has joined #elixir-lang
[21:07:44] rfv: has joined #elixir-lang
[21:07:45] mitchellhenke: has joined #elixir-lang
[21:07:45] adulteratedjedi: has joined #elixir-lang
[21:07:46] Brend: has joined #elixir-lang
[21:07:47] pmarreck: has joined #elixir-lang
[21:07:54] tobias: has joined #elixir-lang
[21:08:07] CARAM_______: has joined #elixir-lang
[21:08:12] sickill: has joined #elixir-lang
[21:08:14] RJ2: has joined #elixir-lang
[21:08:14] c355E3B: has joined #elixir-lang
[21:08:18] bitwalker: has joined #elixir-lang
[21:08:26] rvirding: has joined #elixir-lang
[21:08:30] Net: has joined #elixir-lang
[21:08:31] gonz_: has joined #elixir-lang
[21:08:33] gen_ale_drinker: has joined #elixir-lang
[21:08:34] JSharp: has joined #elixir-lang
[21:08:34] starbelly: has joined #elixir-lang
[21:08:39] ahills: has joined #elixir-lang
[21:08:40] bbielsa___: has joined #elixir-lang
[21:09:30] hflw___: has joined #elixir-lang
[21:09:49] wojtekmach: has joined #elixir-lang
[21:11:15] uranoss: has joined #elixir-lang
[21:11:54] billstclair: has joined #elixir-lang
[21:12:47] alunduil: has joined #elixir-lang
[21:13:34] carkmorwin: has joined #elixir-lang
[21:13:52] jetpack_joe: has joined #elixir-lang
[21:14:04] Exuma: has joined #elixir-lang
[21:14:08] FMJz_: has joined #elixir-lang
[21:14:13] m0lok: has joined #elixir-lang
[21:14:19] yrashk: has joined #elixir-lang
[21:14:21] hahuang65: has joined #elixir-lang
[21:15:49] Cthalupa: has joined #elixir-lang
[21:19:12] work_: has joined #elixir-lang
[21:22:35] craigp: has joined #elixir-lang
[21:43:53] BitGonzo: has joined #elixir-lang
[21:56:46] ariedler_: has joined #elixir-lang
[21:57:37] mkaito: has joined #elixir-lang
[21:57:37] mkaito: has joined #elixir-lang
[21:57:48] lexmag: has joined #elixir-lang
[21:57:59] thurloat89: has joined #elixir-lang
[21:57:59] anykey: has joined #elixir-lang
[21:58:18] Geti_: has joined #elixir-lang
[21:58:34] celyr_: has joined #elixir-lang
[21:58:47] Scorchin_: has joined #elixir-lang
[21:58:51] rdxd_: has joined #elixir-lang
[21:58:52] reda_: has joined #elixir-lang
[21:59:21] samrose: has joined #elixir-lang
[21:59:33] Scramblejams: has joined #elixir-lang
[21:59:33] digia: has joined #elixir-lang
[21:59:33] digia: has joined #elixir-lang
[22:00:17] Exagone313: has joined #elixir-lang
[22:00:41] rhbvkleef: has joined #elixir-lang
[22:00:45] rzmt: has joined #elixir-lang
[22:00:58] comboy: has joined #elixir-lang
[22:01:04] juancate: has joined #elixir-lang
[22:01:14] Ted: has joined #elixir-lang
[22:01:29] andersju: has joined #elixir-lang
[22:02:14] bttf: has joined #elixir-lang
[22:02:15] mahmudov: has joined #elixir-lang
[22:02:17] gonz_: has joined #elixir-lang
[22:02:33] kiltzman: has joined #elixir-lang
[22:02:49] subsonik: has joined #elixir-lang
[22:03:42] noegip: has joined #elixir-lang
[22:03:55] edmz: has joined #elixir-lang
[22:03:59] jeffro_: has joined #elixir-lang
[22:04:08] cjk101010: has joined #elixir-lang
[22:04:51] digia_: has joined #elixir-lang
[22:05:00] Axsuul: has joined #elixir-lang
[22:05:55] Tobias|: has joined #elixir-lang
[22:06:11] sammysands: has joined #elixir-lang
[22:06:35] tpl_: has joined #elixir-lang
[22:07:14] craigp: has joined #elixir-lang
[22:07:21] hflw___: has joined #elixir-lang
[22:07:23] Phylock: has joined #elixir-lang
[22:07:25] Scorchin__: has joined #elixir-lang
[22:07:38] syndikate: has joined #elixir-lang
[22:07:46] lexmag: has joined #elixir-lang
[22:09:24] helpa-bot: has joined #elixir-lang
[22:09:51] netrino_: has joined #elixir-lang
[22:10:13] Poeticode_: has joined #elixir-lang
[22:10:15] bttf_: has joined #elixir-lang
[22:10:15] agit0: has joined #elixir-lang
[22:10:38] cjk101010: has joined #elixir-lang
[22:11:33] nageV_: has joined #elixir-lang
[22:11:55] helpa-bot: has joined #elixir-lang
[22:12:07] swav_: has joined #elixir-lang
[22:12:18] ephemera__: has joined #elixir-lang
[22:12:40] jeffro: has joined #elixir-lang
[22:13:13] maxvaillancourt1: has joined #elixir-lang
[22:13:38] btyler: has joined #elixir-lang
[22:13:43] akraut_: has joined #elixir-lang
[22:13:50] crnd_: has joined #elixir-lang
[22:13:56] Midderna1ht: has joined #elixir-lang
[22:14:05] saurik_: has joined #elixir-lang
[22:14:28] knight-: has joined #elixir-lang
[22:15:26] fsimon_: has joined #elixir-lang
[22:15:29] maddybut1: has joined #elixir-lang
[22:16:18] Dawgora_: has joined #elixir-lang
[22:16:35] helpa-bot: has joined #elixir-lang
[22:16:52] sammysands: has joined #elixir-lang
[22:17:06] Robdor: has joined #elixir-lang
[22:17:24] Vircung: has joined #elixir-lang
[22:17:36] b6b: has joined #elixir-lang
[22:17:36] b6b: has joined #elixir-lang
[22:17:55] lexmag: has joined #elixir-lang
[22:17:59] povilas: has joined #elixir-lang
[22:18:10] marcusr: has joined #elixir-lang
[22:18:13] phantummm: has joined #elixir-lang
[22:18:26] lemald: has joined #elixir-lang
[22:18:30] marcusr: has joined #elixir-lang
[22:19:09] helpa: has joined #elixir-lang
[22:22:00] anykey: has joined #elixir-lang
[22:22:59] irclogger_com: has joined #elixir-lang
[22:49:59] orbyt_: has joined #elixir-lang
[22:51:16] lao-tzu: has joined #elixir-lang
[22:58:27] hrubi: has joined #elixir-lang
[22:59:03] blahdodo: has joined #elixir-lang
[23:04:15] mayhew: has joined #elixir-lang
[23:24:58] lexmag: has joined #elixir-lang
[23:31:15] lexmag_: has joined #elixir-lang
[23:51:34] craigp: has joined #elixir-lang
[23:55:44] kyrylo: has joined #elixir-lang