## #elixir-lang - 18 April 2019

[00:05:28] neena: has joined #elixir-lang
[00:10:06] pera: starbelly ?
[00:10:22] starbelly: pera: Dreams and wishes :)
[00:11:31] pera: what's wrong with rebinding?
[00:12:37] gvaughn: has joined #elixir-lang
[00:12:38] wyzzard: has joined #elixir-lang
[00:12:42] b6b: has joined #elixir-lang
[00:12:42] b6b: has joined #elixir-lang
[00:15:50] Cthalupa: has joined #elixir-lang
[00:30:01] wyzzard: has joined #elixir-lang
[00:49:54] ariedler: has joined #elixir-lang
[00:53:05] nickjj_: has joined #elixir-lang
[00:54:07] Siyo_: has joined #elixir-lang
[00:54:38] pmarreck_: has joined #elixir-lang
[00:54:38] bgmarx_: has joined #elixir-lang
[00:54:43] Ted4: has joined #elixir-lang
[00:54:44] lpil0: has joined #elixir-lang
[00:55:01] dch_: has joined #elixir-lang
[00:55:08] eproxus_: has joined #elixir-lang
[00:55:11] sasajuric_: has joined #elixir-lang
[00:55:11] jpinnix_: has joined #elixir-lang
[00:55:11] manveru_: has joined #elixir-lang
[00:55:11] DavidAntaramian_: has joined #elixir-lang
[00:55:12] whatyouhide_: has joined #elixir-lang
[00:55:12] bcavileer_: has joined #elixir-lang
[00:55:16] danmcclain__: has joined #elixir-lang
[00:55:17] mnemon: has joined #elixir-lang
[00:55:23] reem____: has joined #elixir-lang
[00:55:25] DanielI: has joined #elixir-lang
[00:56:25] joshproehl_: has joined #elixir-lang
[00:56:46] esainane_: has joined #elixir-lang
[00:57:44] thecatwa1not: has joined #elixir-lang
[01:00:07] slashrsm_: has joined #elixir-lang
[01:00:28] noegip_: has joined #elixir-lang
[01:00:52] grg_: has joined #elixir-lang
[01:01:10] LnL7: has joined #elixir-lang
[01:01:10] agit0: has joined #elixir-lang
[01:01:11] anykey_: has joined #elixir-lang
[01:01:21] chairos: has joined #elixir-lang
[01:01:23] nextloop_: has joined #elixir-lang
[01:01:39] Fire-Dragon-DoL-: has joined #elixir-lang
[01:02:07] duoi_ghost: has joined #elixir-lang
[01:06:07] carldd: has joined #elixir-lang
[01:07:33] mcspud: has joined #elixir-lang
[01:07:43] cjk101010: has joined #elixir-lang
[01:07:46] Lyubo1: has joined #elixir-lang
[01:08:31] mim7: has joined #elixir-lang
[01:08:53] mclee: has joined #elixir-lang
[01:09:10] xtsee: has joined #elixir-lang
[01:09:49] Bla[m]: has joined #elixir-lang
[01:10:29] Ablu: has joined #elixir-lang
[01:10:34] rassilon[m]: has joined #elixir-lang
[01:11:26] tomterl: has joined #elixir-lang
[01:23:47] starbelly: pera: IMO it doesn't had anything to this mix, no pun intended and it negates the safety of immutable variables provided by erlang... Most elixir folk will strongly disagree, but I dunno why *shrug*
[01:26:03] starbelly: Some people say that cucumbers taste better pickled.
[01:28:35] duoi: has joined #elixir-lang
[01:31:47] wyzzard: has joined #elixir-lang
[01:36:22] greengriminal: has joined #elixir-lang
[01:36:37] Saukk: has joined #elixir-lang
[01:51:20] _spork: has joined #elixir-lang
[01:52:00] _spork: Is the elixir-mode package for emacs maintained?
[01:54:27] _spork: It seems pretty broken at handling indentation.
[02:06:13] neena: has joined #elixir-lang
[02:16:18] sevenseacat: has joined #elixir-lang
[02:20:56] KeyJoo: has joined #elixir-lang
[02:40:18] DTZUZO: has joined #elixir-lang
[02:58:22] pera: _spork: yes it is, are you using melpa?
[02:59:05] mim7: has joined #elixir-lang
[02:59:08] pera: I am pretty happy with elixir-mode and alchemist
[03:11:39] nikhilmore54: has joined #elixir-lang
[03:16:40] iamvery_: has joined #elixir-lang
[03:20:42] wyzzard: has joined #elixir-lang
[03:21:02] carldd: has joined #elixir-lang
[03:26:25] lauromoura_: has joined #elixir-lang
[03:33:47] gvaughn_: has joined #elixir-lang
[03:41:10] conceivably: has joined #elixir-lang
[03:48:30] pera: has joined #elixir-lang
[03:51:55] b6b: has joined #elixir-lang
[03:52:00] b6b: has joined #elixir-lang
[03:54:17] _spork: pera: I tried both the latest melpa version and the last release (from 2016). It breaks hard on maps and structs. Literally typing "%{<enter>a: 5,<enter>" does the wrong thing.
[04:07:11] neena: has joined #elixir-lang
[04:22:07] mdbm: has joined #elixir-lang
[04:23:53] wsieroci: has joined #elixir-lang
[04:30:26] neena: has joined #elixir-lang
[04:32:43] sevenseacat: has joined #elixir-lang
[04:33:41] mdbm: has joined #elixir-lang
[04:46:49] josevalim: The implicit matching in Erlang requires developers to keep more context in their had
[04:49:59] josevalim: Plus for macros we do need rebinding as certain macros may assign to the same place as you call them different times
[04:50:43] mim7: has joined #elixir-lang
[04:50:46] josevalim: So a case could be done for explicit rebinding, but rebinding is necessary. As a case can be done for explicit matching (instead of implicit as in Erlang)
[04:52:49] gvaughn: has joined #elixir-lang
[05:06:02] gonglexin: has joined #elixir-lang
[05:15:51] neena: has joined #elixir-lang
[05:16:00] ur5us_: has joined #elixir-lang
[05:20:05] squall: has joined #elixir-lang
[05:22:13] josevalim: i have personally spent some time chasing rebinding bugs but i have also spent time trying to figure out why a case was not being invoked in Erlang because the variable was already bound
[05:31:50] kapil____: has joined #elixir-lang
[05:37:58] voltone: has joined #elixir-lang
[05:39:35] gde33: has joined #elixir-lang
[05:41:35] iamvery: has joined #elixir-lang
[06:14:57] serafeim: has joined #elixir-lang
[06:16:04] nikhilmore54: has joined #elixir-lang
[06:39:08] mkaito: has joined #elixir-lang
[06:39:08] mkaito: has joined #elixir-lang
[06:41:08] mim7: has joined #elixir-lang
[06:43:09] Sigma-: has joined #elixir-lang
[06:44:29] gvaughn: has joined #elixir-lang
[06:53:51] mdbm: has joined #elixir-lang
[07:06:45] neena: has joined #elixir-lang
[07:22:19] nikhilmore54: has joined #elixir-lang
[07:35:51] lexmag: has joined #elixir-lang
[07:36:40] PragTob: has joined #elixir-lang
[07:38:02] snapet_: has joined #elixir-lang
[07:43:18] mkaito_: has joined #elixir-lang
[07:47:13] LnL7: has joined #elixir-lang
[07:58:22] nikhilmore54: has joined #elixir-lang
[08:01:40] proteusguy: has joined #elixir-lang
[08:02:42] serafeim: is there a way to allow auto-complete in iex when running in windows ?
[08:18:52] mdbm: has joined #elixir-lang
[08:18:55] serafeim: is anybody actually using elixir with windows ?
[08:20:02] voltone: has joined #elixir-lang
[08:25:20] josevalim: Serafeim: you can do iex —wel
[08:29:48] serafeim: josevalim i get unknown option
[08:29:52] serafeim: what's wel ?
[08:30:17] josevalim: iex —werl
[08:30:51] zakora: has joined #elixir-lang
[08:32:06] serafeim: josevalim yes it works thank you !@
[08:34:18] josevalim: there is an environment variable flag you can set so you always use werl
[08:34:40] josevalim: IEX_WITH_WERL=1
[08:34:47] josevalim: i don't know the exact place to set it though
[08:54:00] kyrylo: has joined #elixir-lang
[08:58:46] serafeim: josevalim excellent thank you
[09:11:50] griffinbyatt: has joined #elixir-lang
[09:15:59] serafeim: what's your opinion on elixir macros? I am trying to understand Ecto and the whole thing with the macros that define fields etc seem like *way too much* magic for me
[09:16:08] serafeim: the same with plugs
[09:17:51] serafeim: i really hate magic :(
[09:18:40] neena: has joined #elixir-lang
[09:30:32] mdbm: has joined #elixir-lang
[09:32:59] blahdodo: has joined #elixir-lang
[09:32:59] Gazler: Serafeim: What part of plugs are you struggling with?
[09:41:55] serafeim: no it's no the plugs that I have the problem with, its the funny macro syntax
[09:43:09] serafeim: for example this magic: schema "users" do
[09:44:55] lexmag: has joined #elixir-lang
[09:45:28] dysfun: that isn't funny syntax any more than def is
[09:45:43] gvaughn: has joined #elixir-lang
[09:45:55] dysfun: you know how elixir lets you elide parens when calling functions? well guess what's happening
[09:46:41] dysfun: this is the massive hack upon which elixir 'ruby style' syntax is based
[09:47:13] nox: And going away for nullary functions, right?
[09:47:29] dysfun: going away?
[09:51:26] nox: dysfun: Something about parens for nullary calls being mandatory, but maybe I dreamt that.
[09:52:23] dysfun: i think there's a warning about it
[09:55:47] serafeim: dysfun yes I understand that however the biggest problem with ruby is the amount of magic it has; why should elixir also have that kind of magic ?
[09:57:23] dysfun: well, that's what jose wanted. but to his credit, there is less magic than ruby
[09:57:56] dysfun: basically if you want macros to work properly you have to build a lisp. as you will have noticed, elixir is not a lisp, so you're in the realm of compromises already
[09:59:34] dysfun: this is the smallest change that permits you to 'naturally' define 'def' and such
[10:15:42] craigp: has joined #elixir-lang
[10:19:21] micmus: Serafeim: the big difference is that Elixir macros are compile-time only and always have to be explicitly enabled with require/import/use, they can't just "appear" in your code out of nowhere. In practice this limits the "magic" aspect tremendously while retaining most of the flexibility
[10:20:57] dysfun: and it's one mechanism instead of 600
[10:21:38] nox: micmus: A use can very well use unrelated macros though, right?
[10:22:32] za1b1tsu: has joined #elixir-lang
[10:22:44] micmus: nox: any macro can do whatever, but there's always an explicit path
[10:22:57] nox: Fair enough.
[10:31:56] griffinbyatt: has joined #elixir-lang
[10:32:45] lpil: Bring back method missing, that's what I say
[10:33:14] dysfun: i look forward to seeing your safe by construction method missing :p
[10:37:17] wonko7: has joined #elixir-lang
[10:39:51] dysfun: i look forward to seeing your safe by construction method missing :p
[10:40:36] rawtaz: big oops there, dysfun
[10:41:47] Sentreen: has joined #elixir-lang
[10:41:59] nox: i look forward to seeing your safe by construction method missing :p
[10:45:16] Sentreen: has joined #elixir-lang
[10:46:36] micmus: lpil: we have it and it's called :"$handle_undefined_function"/2 :P [10:48:03] lpil: I know! My favourite forbidden magic. [10:52:56] gvaughn: has joined #elixir-lang [11:01:12] Phylock: has joined #elixir-lang [11:17:17] josevalim: i look forward to seeing your safe by construction method missing :p [11:17:42] nox: Your favourite forbidden magic? [11:17:43] nox: So casul. [11:18:03] netrino: has joined #elixir-lang [11:18:22] josevalim: serious question though, since modules are first class, you can do safe by construction method missing, can't you? [11:20:56] nox: I still don't know what we are talking about, tbh. [11:23:43] lpil: Yes I did think about that josevalim. Module inheritance effectively? [11:24:00] lpil: nox Jose is asking about my typed Erlang like language, Gleam [11:24:16] nox: I don't understand what method missing is then. [11:24:21] josevalim: given that the method missing in erlang was added to mimic inheritance like featurers, then very plausible [11:24:35] josevalim: nox: it is$handle_undefined_function/2
[11:24:50] lpil: There's a function you can define in any module that will be invoked if an undefined function is called on that module
[11:24:57] josevalim: it is called method_missing in ruby, which is probably the language that most (ab)uses the feature
[11:25:55] lpil: It's great for DSLs and job security
[11:27:08] nox: josevalim: Oh ack.
[11:27:24] nox: lpil: I don't understand how that relates to typed languages, now.
[11:27:43] lpil: with typed you can safely use it in some situations
[11:28:07] lpil: I could use it to have one module inherit from another, like OOP with prototypes
[11:28:12] lpil: I'm not sure it's a good idea
[11:28:51] lpil: with types*
[11:29:52] nox: That seems at odds with the type system in Gleam.
[11:30:00] neena: has joined #elixir-lang
[11:30:30] nox: OOP vs prototypes vs ML style type system.
[11:30:38] nox: lpil: Why Rust for the compiler btw?
[11:30:59] dysfun: dependent types would make a method missing safe
[11:30:59] josevalim: well, doesn't OCaml have inheritance in the object parts?
[11:31:04] lpil: I think in practice it'd end up like OCaml's functor modules. "make me a module that is like that one but with these extra functions"
[11:31:33] josevalim: dysfun: if the function/method you are calling is known at compile time, then you don't need dependent types
[11:31:53] lpil: The Rust rewrite was because I needed to do a major refactor of the Erlang one and I thought a rewrite would be a good chance to undo some mistakes I made in the first version.
[11:31:56] dysfun: josevalim: how are you going to support different arities and argument types?
[11:32:03] lpil: And using Erlang was slowing me down a lot
[11:32:18] nox: lpil: Will you self-host it at some point?
[11:32:20] josevalim: dysfun: you would fail to compile
[11:32:28] lpil: I wanted to use a typed language and Rust seemed suitable
[11:32:36] dysfun: josevalim: lol. this is why some people think types suck
[11:32:57] josevalim: i mean, all the scenarios need to be specified in your method missing
[11:33:12] josevalim: method missing definitioin
[11:33:19] josevalim: you would be able to implement ruby's builder with that, no problem
[11:33:36] lpil: nox I would like to but I'm unwilling to give up the speed of the Rust version. Gleam would need to compile to native first. I also don't want to spend another year making the compiler again :P
[11:34:37] nox: Compiler and speed don't go together with Rust in my world, but I'm biased.
[11:34:50] lpil: Not the speed of the Rust compiler. The speed of the compiler I've written in Rust
[11:34:53] dysfun: some compilers solve a harder job than others
[11:34:59] nox: If I was still doing Erlang stuff, I think I would avoid languages that require me to have another toolchain to do my stuff.
[11:35:13] nox: lpil: I understand that, but your compiler still needs to be built.
[11:35:33] lpil: Not by the user it doesn't, we will distribute binaries like Elixir does
[11:36:18] dysfun: elixir distributes binaries?
[11:36:30] lpil: Yes, the elixir modules are precompiled beam binaries
[11:36:40] lpil: Don't need to compile them
[11:36:57] nox: When people say binaries, they usually mean native code.
[11:37:50] lpil: I didn't on this occasion. Sadly Elixir doesn't yet compile to native
[11:37:57] lpil: That would be very cool though
[11:38:10] nox: That wouldn't.
[11:38:15] dysfun: no, it wouldn't
[11:38:53] lpil: Sure it would. Open up the problem space a little
[11:38:59] lpil: Small CLI tools, etc
[11:39:36] nox: You can do that without compiling to native.
[11:40:03] lpil: You can, but the boot time and means of distribution leaves a lot to be desired
[11:40:29] lpil: Same way you could write web services in Ruby. It's just not great for it
[11:40:31] dysfun: nah. even java is just about usable for cli tools, so long as you don't try and load clojure or something
[11:41:00] lpil: It's totally down to personal preference but I'm much happier when I don't have to wait for the JVM or the BEAM
[11:41:09] josevalim: It is fine for CLI tools for devs in elixir / erlang
[11:41:16] lpil: Bit spoilt by Rust and Go
[11:41:27] josevalim: But if you want to write a general CLI tool, I wouldn’t use erlang nor java
[11:42:05] lpil: I don't want to write go but I'm happy to use things written in it :)
[11:42:14] josevalim: The best part about compiling to native is that the code would be natively compiled
[11:42:30] dysfun: i'm not. i'm wary of any software written in a language that aims to defeat abstraction
[11:42:55] lpil: Most my CLI tools are written in C. I think it fails that test too
[11:43:21] dysfun: ironically, c compilers will catch some errors the go compiler won't
[11:43:27] dysfun: so in some ways, go is worse than c
[11:43:59] lpil: Still, nice and fast
[11:43:59] dysfun: (can you tell i've been bitten by some of these?)
[11:44:01] lpil: I dig it
[11:44:14] lpil: perfect happy to apt-get something-in-go
[11:45:00] josevalim: Alanis Morisette will include that verse in the updated lyrics
[11:45:30] josevalim: “It is like wriiiiiting goOooOOOOOo, and getting errors you don’t get in C”
[11:46:22] lpil: Suddenly I want to see karaoke at the next elixir conference I go to
[11:46:23] josevalim: I am just doing my best to distract everyone so the conversation doesn’t get too serious :P
[11:47:09] dysfun: god josevalim you're such a golang fanboi :p
[11:47:33] dysfun: when are you rewriting elixirc in golang?
[11:48:16] josevalim: When we are done with the type system
[11:48:53] dysfun: i thought we were done with it
[11:49:00] lpil: software is never done
[11:49:15] dysfun: yeah tell me about it, with my failing tests
[11:49:27] Nicd-: we should write BEAM in Elixir
[11:49:55] nox: Are you all trying to piss me off or what
[11:50:10] nox: josevalim: Any news on targeting Core, btw?
[11:50:20] dysfun: nox: i can't speak for everyone, but i'm certainly trying to piss you off :p
[11:51:58] josevalim: Nox: the only news is that we have no new news
[11:52:00] nox: dysfun: Hah.
[11:52:03] nox: josevalim: Fair enough.
[11:52:18] nox: josevalim: I was wondering, given dialyzer and whatnot can work without an Erlang AST now.
[11:52:26] nox: (Right?)
[11:52:37] josevalim: There are still other things, cover, debugger
[11:52:44] josevalim: So more foundational work needs to happen
[11:52:54] josevalim: Someone should write a better cover though
[11:52:57] nox: lpil: Btw do you use Rayon?
[11:53:03] nox: josevalim: Amen to that.
[11:53:10] nox: josevalim: Anyone carrying my diagnostics shit, btw?
[11:53:50] josevalim: nox: my kids use crayons, not sure if it helps
[11:54:00] nox: josevalim: Heh.
[11:54:06] josevalim: nox: diagnostics?
[11:54:26] nox: josevalim: column numbers in erlc + range information + printing lines of source code on compile errors.
[11:54:57] nox: (Diagnostics because that's how clang calls that.)
[11:55:03] lpil: nox No, not yet. All single threaded at the moment
[11:55:14] nox: josevalim: Ok, if you manage to nerd snipe someone about that, feel free to ping me if they need help.
[11:55:31] nox: lpil: It's trivial to use if you have .map.collect stuff. :)
[11:56:04] lpil: Sadly I don't really. It's more about traversing a dependency graph. I had a look but couldn't obviously see anything in there
[11:57:03] lpil: All the Gleam code in the world atm compiles in about 300ms so I'm ignoring it for now
[11:58:26] nox: lpil: Looked at salsa, if you want to get really fancy?
[11:59:35] lpil: That's a good idea. I may look into that in future
[12:00:18] nox: 👍🏻
[12:00:33] lpil: thanks :)
[12:01:12] kapil____: has joined #elixir-lang
[12:09:01] lauromoura: has joined #elixir-lang
[12:13:06] mdbm_: has joined #elixir-lang
[12:20:18] voltone: has joined #elixir-lang
[12:29:16] kyrylo: has joined #elixir-lang
[12:30:18] nox: lpil: Last suggestions of things to look at: rayon_adaptive, and rayon_croissant (shameless plug).
[12:35:32] nox: Nicd-: Can only have so many memes per crate, sorry.
[12:35:48] nox: Nicd-: The crate made me found a bug on lib.rs, which I have to report or fix.
[12:36:11] nox: https://lib.rs/crates/rayon_croissant The "<lqd>" part is stripped from the short summary.
[12:36:56] nox: And I also forgot to escape the "<" in the readme file, damn it.
[12:38:22] Nicd-: lazy XSS protection?
[12:41:52] craigp: has joined #elixir-lang
[12:44:58] gvaughn: has joined #elixir-lang
[12:46:13] voltone: has joined #elixir-lang
[12:47:29] nox: Nicd-: Filtering instead of escaping yeah.
[12:48:44] nox: That makes me think, GH has a blacklist of HTML elements when rendering Markdown, I wonder if they use custom elements somewhere on the site and if those are properly filtered from Markdown files.
[12:54:28] either|or: has joined #elixir-lang
[12:55:01] josevalim: boom, done with config providers. just waiting for CI
[13:01:48] helpa: has joined #elixir-lang
[13:02:04] helpa: has joined #elixir-lang
[13:02:21] tallysmartins_: has joined #elixir-lang
[13:05:44] Voxxit: has joined #elixir-lang
[13:06:14] josevalim: really hard to track on linux systems
[13:06:36] josevalim: even on windows, there is the installer, but also chocolatey and what not
[13:17:14] OliverMT: you need to add phone home telemetry
[13:17:24] OliverMT: just do it without telling users, so no one complains
[13:17:39] OliverMT: tbh, it would be natural for hex to have opt-out telemtry on platform you're using it from
[13:28:56] lpil: Isn't there an Elixir survey thing?
[13:29:26] lpil: State of Elixir
[13:31:06] nox: I don't remember if Rust stuff has client-side telemetry.
[13:32:14] gonz_: lpil: I don't know that these kinds of surveys are useful in communities filled with people who only regurgitate what they hear 2-3 people say. Elm, for example, seems like a community it would be largely useless in.
[13:32:41] gonz_: Elixir seems to me to lean more towards that as well.
[13:33:01] gonz_: Fundamentally it's a good idea, though.
[13:33:03] lpil: "what kind of computer are you using?" is probably not that easy a question to influence
[13:33:31] lpil: so still some interesting data to gather I think
[13:33:54] gonz_: Yeah, you're right.
[13:34:37] gonz_: There are lots of things not pertaining to deficiencies in the ecosystem and language that might be interesting to know about.
[13:34:55] __charly__: has joined #elixir-lang
[13:34:59] lpil: I'd like to know what proportion of the ecosystem uses released when deploying
[13:41:02] neena: has joined #elixir-lang
[13:44:01] umamaistempo: has joined #elixir-lang
[13:44:12] starbelly: josevalim: Yeah, that article came up... and I remember reading it when I started off in Elixir and did agree with it :) In the case expr scenario, well, hopefully the author wrote a good test :) Other than that, I prefer fail fast. Also, on the case expr example, I don't think too many people would set a value, then try to use that in a match. I mean, it could happen, but I don't think I've ever done that.
[13:47:56] josevalim: starbelly: i definitely did "accidental matches" in erlang
[13:48:10] josevalim: IMO it wouldn't be such a big problem if the error messages better
[13:48:33] josevalim: (in both cases)
[13:48:51] josevalim: in the case of case, there is no error, so even that could not help
[13:49:07] starbelly: josevalim: Well, if I was going to make things better it would be that + not allow an already defined var to be used in matches in a different lexical scope.
[13:49:12] josevalim: a good IDE that shows which variables have been bound would also solve the issue in both
[13:50:06] starbelly: josevalim: Yeah, but personally, I don't like to rely on that. But fair.
[13:51:18] starbelly: ACTION is always concerned about marrying tools 
[13:52:39] tristanm_: afraid of commitment?
[13:53:11] starbelly: No, afraid that if you took said tool away... I'd become unproductive.
[13:53:25] starbelly: Maybe even inoperable.
[13:54:27] gvaughn: has joined #elixir-lang
[13:55:11] josevalim: and the other thing that makes it more likely to trigger accidental matching in Erlang is that there is only a single scope
[13:55:35] nox: *per function clause
[13:55:51] starbelly: Also, I've been given time by weedmaps to hack some on ecto... I'm gonna send up a proposal on the mailing list... TL;DR better error handling for deferrable constraints, maybe options for deferrable constraints, both on Repo.transaction/2
[13:56:33] josevalim: starbelly: ah, fantastic
[13:56:35] starbelly: josevalim: yeah that's why I was saying a different lexical scope when your in a case expression might be very cool.
[13:57:01] josevalim: starbelly: we most lkely can't add the deffered constraint error back to the changeset though
[13:57:11] josevalim: but we may be able to return them as something more palatable
[13:57:35] starbelly: josevalim: Exactly. An error tuple vs raising provided a constraint option was given in transaction/2
[13:57:47] josevalim: starbelly: SGTM
[13:58:14] josevalim: so the windows bug is that apparently some commands accept paths with forward slashes foo/bar/baz but some do not :(
[13:58:36] josevalim: so i converted everything to foo\bar\baz and we should be good now
[13:58:59] nox: josevalim: wat
[13:59:29] josevalim: nox: i am working on releases sso i ahve to write some .batch files
[13:59:32] josevalim: for windows
[13:59:51] nox: josevalim: RIP yoiu
[14:00:08] josevalim: tristan__: i just finished. i am hoping i will never have to touch them again but who am i kidding
[14:00:12] starbelly: There's another windows bug that needs to be addressed. not a bug per se, ... need to make the tty win32 driver handle "no echo mode", for great security
[14:00:42] tnez: has joined #elixir-lang
[14:00:48] tristanm_: yea, I don't touch them in relx, so they just wait until someone who uses windows sends patches to keep them up to date with the regular one
[14:01:26] nox: josevalim: Pff, https://github.com/servo/servo/pull/8041/commits/13ea3ac413c511872784ccde416956217746553c
[14:01:51] tristanm_: huh, differnet syntax than https://github.com/erlware/relx/blob/master/priv/templates/extended_bin_windows
[14:02:17] tristanm_: why does ours have so many @!
[14:02:24] nox: Wow my first PR is #5xxx and now we are in #23xxx.
[14:02:41] starbelly: https://stackoverflow.com/questions/9217908/how-to-disable-echo-in-windows-console <--- can be done, tty win32 driver in erlang needs to be updated/hacked
[14:02:51] josevalim: tristan__: you should do echo off
[14:02:58] josevalim: then you don't need the @ everywhere
[14:03:22] tristanm_: is that reverse set -x?
[14:03:42] tristanm_: so it by default prints each line it is excuting/
[14:03:54] josevalim: tristan__: yes!
[14:04:22] tristanm_: actually makes way more sense to do it that way so it can easily be enabled
[14:04:37] tristanm_: I have to do that all the time in the other script to get a print out
[14:05:01] josevalim: tristan__: most of my time working on releases was actually spent on sh + batch
[14:05:13] starbelly: evil windows batch scripts... the problem I was referring to is more complicated and affects both erlang and elixir :( Specifically rebar3_hex and mix/hex
[14:05:23] starbelly: but, I don't care enough about windows :p
[14:05:31] josevalim: and googling the posix compliant implementation of thingss
[14:05:34] tristanm_: josevalim: oh, make sure you don't have ~/.erlang.cookie files being created willy nilly
[14:05:39] josevalim: tristan__: btw, did you get stuff running on that new CI thing?
[14:05:50] nox: My one mistake going into desktop apps is that Windows now matters.
[14:06:09] starbelly: nox: :( true story
[14:06:28] josevalim: tristan__: wouldn't it create it only if no cookie is given when you start distribution?
[14:06:48] starbelly: nox: And there are more and more people wanting to do erlang and elixir on win32, so can't ignore that problem now I suppose
[14:07:04] tristanm_: josevalim: right, I recently tracked down a few spots in ours that screwed that up. main one being nodetool escript
[14:07:09] wonko7: has joined #elixir-lang
[14:07:18] josevalim: what is the nodetool escript?
[14:07:19] nox: I don't particularly bash it as a platform though, I'm just entirely unfamiliar with it.
[14:07:41] starbelly: yeah, you'll bash it if you become more familar :p
[14:07:54] josevalim: some things were orders of magnitude in batch compared to sh and others the opposite
[14:07:57] tristanm_: josevalim: how rpc is done basically, and to call release handler
[14:08:16] nox: josevalim: Couldn't you use PowerShell scripts?
[14:08:23] josevalim: tristan__: ah, i see. because i can assume people are using elixir i have those directly in the code
[14:08:29] tristanm_: josevalim: and yea, we have cirrus for relx and rebar3 now
[14:08:41] josevalim: tristan__: are you running FreeBSD builds?
[14:08:49] tristanm_: josevalim: oh, in elixir itself?
[14:09:03] tristanm_: na, probably should
[14:09:19] josevalim: tristan__: if you try it, please let me know. it is my main motivation to move there, so i can cover more OSSes
[14:09:28] josevalim: and given you have a bunch of scripts, it will give you more coverage too
[14:09:29] tristanm_: and the windows one fails for some unknown reason in rebar3 https://cirrus-ci.com/build/5159990007431168
[14:10:44] josevalim: tristan__: yeah, for rpc for example, i added elixir --rpc-eval NODE CMD
[14:10:51] tristanm_: heh yea just found that
[14:11:03] tristanm_: hm, maybe I should PR tat to erlang
[14:11:10] josevalim: so the feature is now part of Elixir itself and i can just rely on it
[14:11:47] josevalim: as part of the release work i added a bunch of flags to elixir to keep the release scripts themselvess more contained: [CLI] Add support for --boot, --boot-var, --erl-config, --pipe-to, --rpc-eval, and --vm-args options
[14:11:53] starbelly: nox: In particular ... not being able to turn go in no echo mode... even in a terminal emulator
[14:12:00] josevalim: --pipe-to is run_erl/to_erl
[14:12:35] tristanm_: would be great to get rid of nodetool, should have thought of this earlier, haha
[14:12:40] starbelly: nox: So in hex and rebar_hex we do a hack to clear the screen every 1ms on password input :(
[14:12:51] josevalim: CI on windows is green! now waiting for travis
[14:13:02] nox: Amazing.
[14:14:07] josevalim: tristan__: besides the windows failure, everythign is good with cirrus-ci?
[14:14:16] starbelly: ^^^ good question
[14:15:01] starbelly: nox: Re-pasting, but the solution to do away with the hack is here: https://stackoverflow.com/questions/9217908/how-to-disable-echo-in-windows-console
[14:15:06] tristanm_: yea. has taken longer than travis at times which is surprising since travis is slow as fuck most the time
[14:15:29] starbelly: Handling growth right now perhaps?
[14:15:50] starbelly: I still say... there needs to be a ci service in mfing erlang
[14:15:59] starbelly: It's a no brainer
[14:17:02] gvaughn: has joined #elixir-lang
[14:17:14] nox: One where "only ever merge stuff that has been tested with *current* master" is the default mode.
[14:21:10] starbelly: ACTION goes back to waiting on fishcakez talk to be uploaded 
[14:21:20] netrino: has joined #elixir-lang
[14:21:44] nox: Stop reminding me that I have a talk to prepare ( ._.)
[14:22:37] starbelly: nox: Is it the "Starbelly is an asshole... here is why..." talk?
[14:22:43] ankhers: starbelly: I haven't been keeping up on conferences and talks lately. What the topic of that one?
[14:22:55] nox: starbelly: If I were to make a talk about an asshole, it would be about myself obviously.
[14:22:59] starbelly: Ankhers: I have no idea... that's why I'm waiting lol
[14:23:58] duaneb: has joined #elixir-lang
[14:24:00] starbelly: but all the codebeam SF videos are worth your time IMO
[14:24:35] voltone: has joined #elixir-lang
[14:24:46] ankhers: That one I saw. I'm exceited about it.
[14:24:55] ankhers: If only I could spell...
[14:27:48] starbelly: yeah, EEF ❤️ but I think I linked to the play list, if not, I meant to.
[14:28:08] sparogy: has joined #elixir-lang
[14:28:55] tristanm_: stop reminding me I have to do something with working groups
[14:29:37] jeffro: has joined #elixir-lang
[14:30:37] starbelly: ACTION keeps reminding people of things they don't want to be reminded of
[14:31:22] starbelly: something something rebar3_hex issues that need to be closed... la la la la
[14:31:36] flaviodesousa: has joined #elixir-lang
[14:34:05] milisarge: has joined #elixir-lang
[14:35:14] drincruz: has joined #elixir-lang
[14:44:29] njoseph: has joined #elixir-lang
[14:44:30] PragTob: has joined #elixir-lang
[14:46:22] mdbm_: in that book I'm reading it goes: "In Elixir, if and its evil twin, unless, take two parameters:"
[14:46:25] mdbm_: why it says evil?
[14:48:10] rawtaz: if nothing else, for fun? :)
[14:48:18] rawtaz: drama llama likes it, ya know.
[14:49:28] duaneb: has joined #elixir-lang
[14:50:03] starbelly: mdbm_: It can be said that the cake here is a lie... or that it's "imperativeish"
[14:50:56] starbelly: all opinion though.
[14:53:31] ariedler: has joined #elixir-lang
[15:01:10] jeffro_: has joined #elixir-lang
[15:20:21] either|or: mdbm_: I read that book as well -- I took it to mean that unless can be a confusing command to work with especially if it is followed by an else. It's like if except it means the opposite. It's evil in the way sinister is the word for lefty in many Latin languages -- confusingly the opposite of what you're used to working with.
[15:21:06] mdbm_: either|or, alright, when he said "if and his evil twin unless", not sure he meant both were evil or specifically unless
[15:21:49] either|or: mdbm_: I took it to be referring only to unless, but that was my reading of it.
[15:22:35] mdbm_: either|or, are you satisfied about the book? what do you recommend to do after?
[15:23:53] either|or: I read so many, I don't remember which that was in, but my favorites are "Functional Web Development with Elixir, OTP, and Phoenix" and "Elixir in Action"
[15:25:21] either|or: Especially Functional Web Dev with Elixir and OTP -- it really helped clarify for me where OTP stands in relation to Phoenix and the front-end. I found it easier than trying to learn Phoenix first then throw in OTP on top.
[15:26:44] either|or: Then I would do the Phoenix book from Chris Mccord, Bruce Tate, and Jose Valim.
[15:30:39] njoseph: has joined #elixir-lang
[15:30:47] njoseph: has left #elixir-lang: ()
[15:51:19] neena: has joined #elixir-lang
[15:53:38] greengriminal: has joined #elixir-lang
[16:05:24] ariedler: has joined #elixir-lang
[16:07:27] hypercore: has joined #elixir-lang
[16:09:58] squall: has joined #elixir-lang
[16:14:27] nineczar: has joined #elixir-lang
[16:16:37] MissingNoIOI: has joined #elixir-lang
[16:35:03] tpl: has joined #elixir-lang
[16:36:02] wsieroci: has joined #elixir-lang
[16:36:49] mdbm_: has joined #elixir-lang
[16:47:04] proteusguy: has joined #elixir-lang
[16:50:46] lucus16: has joined #elixir-lang
[16:57:15] assemblyman: has joined #elixir-lang
[17:07:48] DarkSeid: has joined #elixir-lang
[17:22:44] mahmudov: has joined #elixir-lang
[18:00:35] kapil____: can i setup ftp server in phoenix app?
[18:01:12] kapil____: for image trasfer from client application
[18:01:13] lexmag: has joined #elixir-lang
[18:01:53] neena: has joined #elixir-lang
[18:13:01] dysfun: ftp is insecure
[18:27:41] phryxam: has joined #elixir-lang
[18:34:23] nageV: Question about tuple memory usage: If I have a bunch of inter-related tuples like this, do the larger/outer tuples use pointers to the smaller/inner tuples (memory is reused) or do they make inline copies of the smaller/inner tuples (memory is NOT reused)? Example: a = {:a}; b = {a, :b}; c = {a, b, :c}; d = {b, a, :d}
[18:41:36] nageV: The reason I'm asking is because I recently switched a memory-sensitive portion of my program (has to keep ~60 million items in memory) from using structs (92 bytes per instance) to using records (48 bytes per instance) in order to reduce my program's peak memory usage. However, the space savings have resulted in a time penalty: I have to update a few fields in my records frequently, and since Erlang
[18:41:42] nageV: creates a new copy of the tuple during each update, I'm wondering how heavily the resulting calloc()/memcpy() are penalizing my program's performance.
[18:45:13] nageV: The closest I got to answering this question myself is this explanation of BEAM's memory layout for tuples, which hints at the "outer tuples store pointers to inner tuples" outcome but I just want to make 100% sure that's the case. 8-) http://beam-wisdoms.clau.se/en/latest/indepth-memory-layout.html#tuple-arityval-0
[18:47:30] work_: has joined #elixir-lang
[18:47:46] benwilson512: nageV: outer tuples store pointers to inner tuples
[18:47:49] micmus: nageV: it's all tuples. Though depending on some other factors there are other things going on that might make the memory use smaller - if you had literal code like what you showed, it would actually not allocate anything since all values are known at compile-time
[18:48:02] micmus: it's all pointers is what I wanted to say :P
[18:49:24] micmus: nageV: because of those other optimisations structs usually use only 3 + n words and tuples 1 + n, for n elements, so the difference is not that big.
[18:50:18] nageV: oh wow, that's great to hear!
[18:53:10] nageV: Do you also know if there's a frequent update penalty for maps/structs like there is for tuples/records? as described here http://erlang.org/doc/efficiency_guide/commoncaveats.html#setelement-3
[18:54:39] micmus: yes, though you can update multiple fields at once with maps
[18:54:59] micmus: how are you storing them? ets?
[18:55:48] nageV: I was storing them in a Map originally but later switched to ETS and saw a big perf improvement :)
[18:57:14] micmus: hmm... I think ets is unfortunately storing maps without the constant keys optimisation, so it would be 4 + 2n for structs, records should be better
[18:58:20] micmus: nageV: also - have you tried updating them inside ets in place with :ets.update_element? It might not reallocate, but I'm not sure
[18:58:29] nageV: Oh, by "constant keys" do you mean the sharing of common sets of keys? as described by Joe Armstrong in "Different maps can share key descriptors" at https://joearms.github.io/published/2014-02-01-big-changes-to-erlang.html
[18:58:34] Benjojo: has joined #elixir-lang
[19:00:22] nageV: Ah cool, I haven't yet tried that: I was using a delete(old_value) followed by insert(updated_value). I'll try your suggestion today, thanks!
[19:00:40] micmus: nageV: more or less. The optimisation is more general - any compile-time constant parts of any data structure are allocated just once per module. Since data is immutable, you don't need to copy them. Small maps are implemented conceptually similarly to two tuples - one for keys, one for values - for structs the keys tuple is always constant
[19:03:20] nageV: Great analogy! So that's where the 2n in your "4 + 2n for structs" penalty comes from (having to store n values and n keys per struct in order to house them in ETS)
[19:03:26] serafeim: has joined #elixir-lang
[19:03:41] Arich: has joined #elixir-lang
[19:04:25] serafeim: one funny thing for me is that phoenix has a convention to use the same RDBMS for dev and prod (with the name foo for prod and foo_dev for dev)
[19:04:32] serafeim: isn't this a little unusual ?
[19:04:41] benwilson512: serafeim: what do you mean same?
[19:05:18] serafeim: the same server hosting two databases with a different name
[19:05:25] serafeim: or i've understood wrong ?
[19:06:00] serafeim: if that's the case why the 'dev' database has by default a foo_dev name ?
[19:07:52] benwilson512: serafeim: the suffix is to distinguish between the test and dev database which usually are local
[19:08:14] benwilson512: the production config usually points to your production database which is elsewhere and really shouldn't even be on the public internet
[19:08:28] serafeim: benwilson512, thanks for clarifying
[19:09:03] serafeim: so should I keep the _dev suffix for my dev database or it doesn't matter ?
[19:09:32] benwilson512: serafeim: how do youw ant to distinguish it from the test db?
[19:11:01] serafeim: i'm not sure where is the configuration for the test db :/
[19:11:36] benwilson512: serafeim: inside test.exs
[19:11:48] serafeim: let me take a look
[19:11:52] benwilson512: serafeim: my point is you usually have a locally running postgres against which you run both your development stuff and your test stuff
[19:11:56] benwilson512: you need two different database names for that
[19:12:06] benwilson512: so by convention you have my_app_dev and my_app_test
[19:12:20] benwilson512: you can eliminate the _dev, it doesn't matter, phoenix is quite explicit, it will use whatever you have inside your config
[19:12:26] serafeim: benwilson512, thank you very much I understand
[19:12:47] dysfun: for many cases, one database for dev and test will do
[19:12:47] serafeim: Django just appends _test to the default database
[19:21:43] dysfun: i prefer the phoenix approach of just generating the config with a _test suffix
[19:21:50] dysfun: less magic to remember/learn
[19:23:55] aert: has joined #elixir-lang
[19:26:40] Poeticode: let's say I'm doing a put_assoc with an array album_changeset.put_assoc(:songs, songs_array). Will they be associated in their array order?
[19:26:56] wonko7: has joined #elixir-lang
[19:27:13] serafeim: has joined #elixir-lang
[19:27:17] dysfun: i think you mean list, not array
[19:27:51] Poeticode: s/array/list
[19:35:14] serafeim: ok i also saw that the prod configuration is in prod.exs and prod.secret.exs
[19:35:49] serafeim: and it seems from confix.exs that you need to set an env var to select each environment ?
[19:41:16] dysfun: when you run mix, you pick an environment
[19:41:28] dysfun: (or take the default)
[19:42:08] dysfun: remember that your config is read when you run mix, so if you're using distillery to build releases, that'll be when you build the release
[19:42:12] OliverMT: Poeticode: it depends on the underlying db... but yes, as a general case you can expect that
[19:42:29] OliverMT: but, you can be more explicit on it, and put a sort on the relationship
[19:42:36] OliverMT: so it's sorted on the way out
[19:42:50] OliverMT: (which would require you to put an explicit sort key on there, be it an int or whatever)
[19:42:58] serafeim: which is the default? i can't understand from config.exs... it just says this: import_config "#{Mix.env()}.exs"
[19:43:14] dysfun: serafeim: dev, unless you're running mix test
[19:45:05] Poeticode: I see. Thanks OliverMT. so far the albums_songs join table has the fields album_id, song_id, track_number, where track_number is :integer & :serial. my queries might not be sorting by that field correctly?
[19:45:23] OliverMT: track_number can be used yes
[19:45:44] serafeim: ok I tried running Mix.env() from iex -S mix and actually saw ":dev"
[19:46:17] OliverMT: huh, it seems you cant put sorting in a has_many, maybe I am mixing that up with hibernate
[19:46:44] nickjj: chrismccord, i like how this time around you had 3 mics active https://www.youtube.com/watch?v=8xJzHq8ru0M
[19:47:48] serafeim: ok I then set MIX_ENV=prod and it seems to be trying to connect to the prod db
[19:49:29] za1b1tsu: has joined #elixir-lang
[19:50:37] serafeim: so to deploy I set MIX_ENV=prod and then I run mix compile ?
[19:52:55] rambocoder: has joined #elixir-lang
[19:56:54] gabrielpoca: has joined #elixir-lang
[20:01:19] serafeim: and then just run mix phx.server ?
[20:02:05] serafeim: should the phx.server run behind a reverse proxy or it doesn't matter ?
[20:06:31] gabrielpoca: has joined #elixir-lang
[20:08:24] gamache: serafeim: most people recommend building and deploying "releases" rather than running mix phx.server in production. Basically a release is a copy of your code, a copy of Erlang (and Elixir), and your configs bundled into a .tar.gz
[20:09:21] gamache: Check out https://github.com/bitwalker/distillery, which is a tool for building releases, and https://github.com/edeliver/edeliver, a tool for deploying releases
[20:09:24] serafeim: so i'll just put that tar.gz in my prod server and run it ?
[20:09:35] serafeim: gamache, thanks !
[20:09:36] gamache: serafeim: exactly, your prod server doesn't even need Erlang installed
[20:09:52] gamache: you just need to make sure you build on the same platform you deploy to
[20:10:15] serafeim: oh so i can't build on windows and deploy to linux
[20:10:37] gamache: you could if you used Docker to match the linux deployment environment
[20:10:51] gamache: but mostly people just set up a build server of the same OS they run in prod
[20:11:26] serafeim: thanks for clarifying
[20:11:35] gamache: np, good luck!
[20:12:29] neena: has joined #elixir-lang
[20:12:30] serafeim: thank you very much
[20:16:45] Arich: has joined #elixir-lang
[20:21:11] gvaughn: has joined #elixir-lang
[20:31:13] terinjokes: has joined #elixir-lang
[20:32:54] nageV: micmus: building on your previous statement of structs using 3 + n words and tuples 1 + n, is it correct that records use 2 + n words? (it adds 1 extra word, compared to plain tuples, for the "tag" of the record)
[20:33:54] nageV: similarly, maps should use 1 + n words, and structs use 3 + n because it adds 2 extra words (one for the __struct__ key and another for its corresponding value), correct?
[20:35:03] micmus: nageV: almost correct. maps are 2 + n and structs 3 + n - because we don't need to count the keys, but need to count the value of __struct__
[20:35:22] micmus: that is true for maps of up to 32 keys. After that it gets a bit more complex
[20:36:00] nageV: awesome, thanks! :)
[20:36:57] kapil____: has joined #elixir-lang
[20:37:46] nageV: micmus: breaking down maps further, are they: n (pointers to values) + 1 (pointer to keys) + 1 (the top-level boxed pointer)?
[20:38:24] nageV: "boxed pointer" being the top-level term that represents the entire map
[20:40:46] micmus: nageV: Now that I think about it I think I was wrong. it's 3 + n for a map and 4 + n for struct:
[20:40:47] micmus: header + size + ptr to keys + n slots
[20:41:43] micmus: no need to count the "top level" pointer, because it's embedded in the parent
[20:43:14] nageV: interesting, so size isn't part of the header? e.g. tuples have their size stored in the "arity" portion of the header, per http://beam-wisdoms.clau.se/en/latest/indepth-memory-layout.html#tuple-arityval-0
[20:45:19] nageV: oh i see, it's not a requirement for the arity portion of a header to always store the size. http://beam-wisdoms.clau.se/en/latest/definitions.html#def-header
[20:45:44] micmus: the header stores size + 2 (so the flat size in heap including size word and keys). And yeah, it could be omitted, but it's not now. It's on my list of things to optimise :P
[20:46:03] micmus: I mean the size word could be omitted
[20:48:24] netrino_: has joined #elixir-lang
[20:49:43] mim7: has joined #elixir-lang
[20:49:43] mim7: has joined #elixir-lang
[21:12:03] mim7: has joined #elixir-lang
[21:35:39] duaneb: has joined #elixir-lang
[21:53:09] __charly__: has joined #elixir-lang
[21:59:04] tnez: has joined #elixir-lang
[22:11:19] SirFunk: has joined #elixir-lang
[22:13:58] Arich: has joined #elixir-lang
[22:14:12] aert: has joined #elixir-lang
[22:15:00] mim7: has joined #elixir-lang
[22:16:11] gvaughn_: has joined #elixir-lang
[22:23:18] neena: has joined #elixir-lang
[22:25:17] aert: has joined #elixir-lang
[22:26:33] aerth: has joined #elixir-lang
[22:27:12] aert: has joined #elixir-lang
[22:30:49] duaneb: has joined #elixir-lang
[22:31:19] ariedler: has joined #elixir-lang
[22:36:55] nineczar: has joined #elixir-lang
[22:47:00] ailo_: has joined #elixir-lang
[22:51:15] ailo_: Why are String. functions take so much time to load?
[22:51:21] ailo_: Consider the following test
[22:51:22] ailo_: https://hastebin.com/itarimisoj
[22:52:14] ailo_: When I run it, test trace shows ~150ms
[23:07:07] blahdodo: has joined #elixir-lang
[23:17:28] notzmv: has joined #elixir-lang
[23:25:41] nageV: ailo_: String.first() does UTF8 parsing, which is more expensive than a plain old binary match: assert <<"X", _::binary>> = "XYZ"
[23:34:18] ailo_: ACTION Surely it can't be this much expensive to parse three letters.
[23:35:36] ailo_: I'm getting strange test timings, first call to some functions in String takes a really long time , and all subsequent calls are instant. This does not seem to happen with other modules, like Map and Enum.
[23:35:51] ailo_: https://hastebin.com/osemoqabob
[23:38:27] ailo_: So this can't be related to utf parsing. I'd like to know how elixir loads functions, and how can I get tests to show more precise time.