So I think we'll go ahead and start. First, thank you so much for coming. I really appreciate your choosing to spend your time here with me, coming to see my talk. There's a bunch of fantastic talks that are going on. So thanks so much for choosing this one. And thanks also to RubyConf, to our sponsors, to the venue, to New Orleans. Thanks to everyone who helped make another RubyConf possible. As always, I'm super delighted to be here and I'm delighted to have you here. I apologize that I can't really see any of you. It is unbelievably bright up here. But, you know, well, you'll see in a minute why I do need to see at least some of you. So this talk is called, What If Ruby 3? But it's also known as, The Future of Ruby. Part 3, The Future. So this is designed after one of Justin's slides. So this is the third part of a three-part talk track sequence on The Future of Ruby. So we've sort of seen the past, we've seen some of the present and apocalyptic visions. And now we're gonna talk a little bit about what Ruby could have been like or what it still might be like. And we're gonna do things a little bit differently than the way I normally do talks. I normally rely very heavily on presenter notes. I oftentimes will inadvertently read rather than talk to all of you. So on Justin Searles' advice, I'm forgoing presenter notes entirely and we'll see how that goes. Yeah! Yay! Also, that's actually excellent. If at any point I just start trailing off or lose my space, just start applauding. That would be really helpful for me. It'll give me a minute to reorient. But I'm delighted not to just be friends with Justin. I'm also a client. And what that means is Justin has to buy me fancy dinners now. So... Ha ha ha ha ha ha ha! Anyway, so this is a computer talk, it turns out. And that means you have to start with zero. So hello, my name is Eric. I tend to speak very quickly, particularly when excited and I find talking about Ruby and the future possibilities that Ruby and the community have to be really exciting. So if at any point I start to go off the rails, not intended, and speak way too fast, and this is why I kind of need to see some of you, especially those of you closer to me in the front, just kind of like, or maybe something to give me a sense of ease it back a bit. And I will slow down. I'm gonna talk for between 35 and 40 minutes. If we come closer to 35, we'll have a couple of minutes for questions. If we come closer to 40, then I won't have time for questions, but please feel free to stop me after and ask me any questions or we can chat about anything that you would like. So like I said, my name is Eric Weinstein. I am a director of engineering at Fox Networks Group in Los Angeles. We're currently building a platform and a team around the content APIs, around our television content, which includes The Simpsons, Archer, National Geographic, which a lot of people don't know, Fox Sports and more. So we are hiring. Please feel free to ask me about that as well. All of my information is in this human hash I felt compelled to make. I write a lot of JavaScript and Node at work, but I write Ruby in my, well, not as much free time as I would like to have. I've been writing Ruby for several years now, and I recently wrote this book, Ruby Wizardry. I've been saying recently, I guess it's not so recent now. It's about three years ago, which means we're due for an update. But it's hard to see at the bottom, but there's a 30% off promo code, rubyconf30. If you go to nostarch.com, that's the publisher's website, and you enter that promo code, you would get 30% off the book. So if you're interested, please go ahead and do that. And thanks so much to the folks at nostarch for setting that up. The book teaches Ruby to eight to 12 year olds, but if you have questions about that, please do come find me after the show. This is not a long talk, but I do think we benefit from having a roadmap. So I'm gonna start by talking a little bit about Marvel's What If comics, then the power of narrative and meta narrative, and we'll finally look at some of the possible futures of Ruby through three What If stories. What if Ruby had a static type system? What if Ruby ran in the browser? And what if Ruby did not have a global VM block? So like I said, I'm gonna do my best not to read to you. Small classes, small methods, small slides. And hopefully the meta narrative component, which you'll see in a minute, is entertaining and not like Clint Eastwood yelling at an empty chair. So what if, so if you're not familiar, the What If comic line from Marvel, they did two separate runs, are basically non-canonical stories about the Marvel universe. What if the X-Men had been founded by Professor X and Magneto together? What if Jessica Jones had joined the Avengers? What if the Avengers defeated everybody? Which I feel like is maybe not the most interesting question, but I would read that. I would definitely read that comic book. So actually I probably did. So basically, what if things were different than they are now subject to the rules of the universe? Like what if the history and the potential futures were different? And what if is a powerful question that is deserving of powerful music? And I had wanted to use Marvel's fanfare, the, no, no, no, no, no, no, no. Like the really, someone's mutant powers are activating or they've put on their costume for the first time. But then I remembered that this talk will be on YouTube and I did not want Marvel to yell at me. So I've picked a different music. I'm actually gonna play that one more time just because I like it so much. Does anyone happen to know off the top of their head what that is? And again, apologies for not being able to see you. I can't tell hands are raised so just feel free to shout if you know. If you don't, it is actually the Bloopsophone theme song. So if you're not familiar with Bloopsophone, it was a project by Why the Lucky Stiff. You know, there's been a lot of good content today about the history of Ruby and our community. Why was a very big part of that? His projects were a very big part of it so I'm delighted to be able to share a little bit of his content and if you have questions about why, I'd never met him but I've studied him. Or if you have questions about how things used to be or Bloopsophone or whatever, please do come find me or another grumpy old person. So Ruby three by three. So Matt said this morning, the goal for Ruby three is to be three times faster than Ruby two. And I do think that we will get there but there's also a question of what else we'll get. We saw there are gonna be some new features in Ruby two five. Every Christmas we get a new version of Ruby. It's exciting to think about what could ship in Ruby three. And so as I said, we have these three what if scenarios focused around types, around Ruby's execution environment and around its concurrency model that I think could be really interesting. And it's possible that people will look back on this talk and say this was truly the beginning of Ruby three. Good, I'm glad this part works. Feel free to read that and run Howard's voice if it helps you. It helps me. And thank you for laughing. Also if it helps, if this seems a little bit new and weird and strange because this is gonna be Ruby that doesn't quite look like Ruby, feel free to think of it as a different programming language. I don't know how many of you know this but back in the day when Matz was selecting the name for Ruby, he'd narrowed it down to two and the other was Coral. So if you want to pretend you're at Coralcon for the next 33 minutes, if that helps please do. So let's start by talking about Ruby's type system and what if Ruby had a static one? So static and dynamic type systems differ in the fact that a static type system, in a static type system, all the variable types are known at compile time. So whether you have a fixed num or a string or a symbol, when you compile it you know you're not going to have something not responding to a particular message or method at runtime because you know what type it is and you know what methods it responds to and what messages it will accept. This may or may not make use of type inference so if you've written a lot of Java you'll see you're constantly indicating what type everything is. If you've written Go then you're aware that you have a powerful type system that doesn't require you to specify the type. Sometimes the compiler won't quite know what you mean and you'll tell the compiler when I'm doing this, here's the type that I mean, but generally speaking it's smart enough to figure out what you want. This is in contrast to dynamic type systems where the variable types are not known until runtime. So you can have something blow up because you've tried to call each on it and it's not enumerable or you've tried to add two things together that don't respond to the plus operator, things like that. And further, there's this notion of weak versus strong typing. This one is much more contentious than static and dynamic typing so please don't add me to tell me that I've aired totally in my distinction. So the idea here is that for the purposes of this talk weak typing does not secretly do the wrong thing instead of throwing an error, JavaScript, and strong typing throws an error rather than secretly doing the wrong thing. So according to these definitions Ruby would be strongly and dynamically typed. And to understand what we sort of mean when we think about Ruby types, I'm just gonna do a quick crash course through YARV yet another Ruby VM which is the VM that modern Ruby uses. And the steps, broadly speaking, are tokenizing and lexing, picking apart your string of code to figure out what pieces are in it, parsing it to figure out the grammar and what should happen, compilation to bytecode so we convert from human language to machine language for some definition of machine language and then we execute. You type 10 times do a thing and we do that thing. I apologize, this is a tiny bit hard to read, but at the top you have 10 dot times do n, we puts n and we end. So we'll just print out the numbers one through 10. And here, you can see below, this is the result of calling the, I wanna say it's the lexing, lexer method. So Ripper is a tool that ships with Ruby, you can use it to pull your Ruby code apart and sort of see how it's built and what it does under the hood. And so here you've got not just tokenization where you can see all the way on the right, you know you've got 10 and then dot and then times, but you also have this metadata associated, it's that middle column on int, on period, on ident. And so this is what Ruby has, this is what YAR has seen when you've typed 10 times do n puts n. The parser in Ruby, as far as I know, uses the LALR or I think look ahead, left reversed, right most, derivation parser, which effectively says go from left to right, look a little bit ahead if you need to disambiguate what rules you're going to apply from I think it's the parse.y file. You can actually see what the parser is doing if you pass the y flag to the Ruby interpreter. So if you do Ruby-y, example.rb or whatever your file is, you'll get a lot of output indicating what the parser is doing. And both of these examples come from Pat Shaughnessy's book, Ruby Under a Microscope, which if you have not read it, I cannot recommend highly enough. Is this speed? Okay, great. And then if you want to look at the YAR bytecode, you can call RubyM colon colon instruction sequence.compile, pass in your string of code, and then call disassemble on that. And again, apologies if this is a bit hard to read, but you get your bytecode instructions. Now the interesting thing here is there is really not a lot of type information. Ruby is not statically typed as we were going to Ruby bytecode. There's really nothing that will prevent you from calling a method on something that doesn't respond to that method at runtime.  Things will just blow up at runtime. Now there are ways to fix this. I don't know if any of you are familiar with this logo. I think by itself it's a little bit enigmatic. This is absolutely not something that you should do. You can do the second one if you want. I actually don't know if you can brew install Ruby. But so Crystal is the language that has that logo. And Crystal is very, very similar to Ruby syntactically, but it is statically typed. And I think it's fast as C, slick as Ruby, is the tagline for the Crystal language. So if you're interested, I think it's crystallang.org, but if you just search Crystal language, you'll find it. And this code actually works both in Ruby and in Crystal. So the Crystal compiler and the YARV virtual machine will both understand what you want and will create accounts for you. The interesting thing here is that Crystal does leverage that type inference that I talked about. So you occasionally have to tell Crystal, like I mean this, when I tell you this variable is used in this context, it has this particular type, but oftentimes you can omit the type annotations. And one of the things that I think is really interesting is that you can have something that is statically typed that looks just like Ruby. So we could, if we wanted, create a Ruby compiler and have statically typed Ruby. We would give up some metaprogramming magic. We would give up some of our rapid prototyping loop. We would be sort of sacrificing programmer speed for execution speed. And whether or not that's antithetical to the core tenets of Ruby, I think is something that is up for debate. Certainly I think there's a role for more complex type behavior. And so what I'm thinking of here is a language called Idris that I have contributed a little bit to. Idris is a dependently typed language written in Haskell, based on Haskell. And what I think is really cool about its type system is, so I've just made up this getTransactions method or function, just gives you a list of NATs. And that might not be a type you've seen before. And that is just a natural number. You know, it's a non-negative integer. I don't know why I said getTransactions and picked these numbers. It just came to me. But the interesting thing is that you have this list of natural numbers. And so if you call getTransactions with these numbers, everything is fine and Idris does not yell at you. If you use these numbers, starting with the negative four, Idris does yell at you and says, I was checking the right-hand side of getTransactions and I was told that this would be a list of natural numbers. But I don't have an implementation for negative natural number. So the interesting thing about dependent types is a dependent type also has an understanding of the values. So it's not just list of A, but you can have list of A in this range of values. List of integer greater than zero. List of string with length three or more. You can't count the number of times you've written tests for the password part of your website where you're like, oh, the password has to be at least eight characters. You can actually encode this in Idris's type system and say this has to be a string and it has to be at least this many characters long and if it's not, your code does not compile. So catching that at compilation time rather than at runtime, which I think is extremely interesting. So interesting in fact that I wrote some not very good Ruby code to emulate it. So I can share the gist after this talk. The part I kind of want to call your attention to, this is identical to the account code from before, except I've added this type method that says, look up this method, it should return a natural number and if it does not, throw an error. Deposit should take a natural number and give you a natural number. Withdrawal should do the same thing. I don't know why you would pick natural numbers because you probably want to be able to overdrive or you don't want to overdrive, but you would like to have that opportunity or you might want to, I don't know, have decimals or something, but if you pretend that your account always has seven or 10 or 15 or however many integer dollars, natural number dollars, this will catch it for you. So again, this is not any modification to the Ruby language, so there's no compilation step. This is really just enforcing pre and post conditions to say, hey, time out. You told me that this would be a natural number and you gave me a negative number or float or string, et cetera. If we did want to modify Ruby's core language, we can change the way we do type annotations and we could say, hey, you know, this is an amount and it's of type natural number or we can kind of go more Java, E route and say natural number is the type and the argument is amount. Or we can say it's a float or we can kind of take a page from Crystal's book and say, you know what, the interpreter, the compiler is smart enough to figure out what this is. Let's just use type inference and really only disambiguate when we need to. So the question here then is, is this a good idea or a bad idea? I happen to think that having stronger static types is a good idea. I catch a lot of errors at compilation time and the number of times something has blown up at runtime because something was new or I was not thinking about the shape of the data or the correct type. I do think that there's room to make these kinds of improvements. So Matt's talked this morning about good changes and bad changes and I guess the question here is really about trade offs. If we keep dynamic typing, we trade execution speed for programmer speed, potentially developer happiness. We lose some flexibility and we lose some metaprogramming magics if we get rid of dynamic typing. We keep those with the Ruby that we have now. Static typing means that our programs will run faster but we give up some flexibility for the safety of compile time checks and knowing that something is going to be a particular type at runtime no matter what. And with dependent typing, the kind that we saw with Idris and with my example of the account, we trade flexibility for sort of these ultra powerful compile time checks which may be unnecessary, may mean we write a few fewer tests. Again, it's a trade off and I think that the answer is going to be somewhere in here. So that's what if Ruby had a static type system. I suspect something like gradual typing could sort of ease its way in a future version of the Ruby language. So now we'll kind of pivot and say, okay, well, types aside, what if Ruby ran in a different environment? What if Ruby were to run in the browser? That's good enough. For those of you who don't remember, this is Netscape Navigator and this is what the internet used to look like and in some places still does. Such as on the about me pages of computer science professors everywhere. But this would be cool, right? Like this would be amazing. We could pop open the console and not have to do a bunch of hacky editing in preview and get, so for those of you who are not familiar with the magic of percent W, we get an array of strings, the strings one, two, three. We call map and we say, I actually want all those to be integers and integers come back out. For those of you who have written JavaScript, this is more along the lines of what happens. We try the first one and it doesn't work and actually I did not understand why this doesn't work for a long time. It turns out in JavaScript, if you call a method on an array and it's supposed to have two arguments but you only pass one, it will use the index as the second one. So what it's saying is I have one. I'm gonna parse int that with a radix of zero. That's basically like not passing radix. So we get 10, which gives you one, which is the right answer. The second one is two, but we're using base one, which is not a valid base. So we get not a number, which is a numeric value. That is not a number. And then for three, we get the same thing, but two, three is not a valid value for a base two system. So we get not a number again. So basically the way to fix this is to pass an anonymous function and say I actually want you to parse this number and use 10 as your radix. Now you probably could get away with writing your own parse int that kind of partially applies parse int and just automatically says, if there's no radix, it's 10, but that's a lot of work. It would be really nice if we could write Ruby in the browser. And the question is, why isn't that a thing? Why doesn't that exist? And technically it does, sort of. So for those of you who have not seen this logo before, this is Opal. Opal is a source to source compiler for JavaScript. So it converts Ruby to JavaScript and then executes the JavaScript in the browser. And we can imagine a world where we have tools like this, but we don't actually have to go through the pain of JavaScript. We can actually just write Ruby and run it in Chrome, Safari, Firefox, whatever browser you like. But I think the question we should think about is, if we had Ruby in the browser, would we all be a lot happier or would we complain about Ruby the way we sometimes complain about JavaScript? Would we, you know, what is this language? Why is it dynamically typed? Like, how come this happens and how come this, really, is it the environment or is it the language? How different would Ruby be from the beginning? It were designed to run in the browser and deal with HTML and be sort of this asynchronous first language. How different would their concurrency primitives be and how different would parallelism be in Ruby if you had to live in the browser? If you're curious about what that would look like, we can chat later on. There's another talk that I think is very interesting and this one is sort of the, it's similar to this talk in the sense that there are a lot of imagined futures and some true history. And this is a fantastic talk if you haven't seen it. This is also Gary Bernhardt. It's called The Birth and Death of JavaScript. You can find it on destroyall software. I recommend all of you watch it. And the idea here is to kind of trace the history of JavaScript and then go into this sort of fictional future where everybody writes JavaScript and nobody writes JavaScript. And one of the ways that you can accomplish that, and this is through a project that I think is maybe two years old now, it's called WebAssembly. So the idea is you have an assembly-like language in the browser that other languages can target. So JavaScript can target WebAssembly or Ruby could target WebAssembly or Haskell or Idris or whatever language you would like. And this raises the possibility that in the future, Ruby could come in a form that not only will allow you to compile to YARV bytecode, but you can actually compile to WebAssembly. And if there are multiple backends for the Ruby virtual machine or a different virtual machine that Ruby can leverage to create browser-compatible code, then we could have Ruby in the browser. And we could have our Ruby methods and classes and we can share code between the client and the server the way we're supposed to now with JavaScript, but somehow don't. And we can have all the problems of JavaScript and Ruby and everything will be great. So again, is this a good idea or a bad idea? In terms of the server side, we sort of keep control over the environment if we stay where we are, but we still have to write JavaScript. If we allow Ruby into the browser by compiling to JavaScript, this seems almost to be like the worst of both worlds, where we get the Wild West of the browser and potentially a lot of headaches of JavaScript in its environment, and we still have to read JavaScript because something will go wrong with the compilation, the source-to-source compilation. We will have to understand what JavaScript Ruby generated through Opal or whatever project, and we're still gonna have to look at JavaScript. Or potentially, we could use WebAssembly and we sort of mitigate the JavaScript part. We still have the Wild West of the browser and we may have to learn WebAssembly, but we no longer have that source-to-source headache. The sort of thing that I don't know if this happens to you, but this is actually apropos. Whenever I write CoffeeScript, I write maybe two lines of CoffeeScript and then something blows up. I'm like, oh, nope, not Ruby. And then I change it and I'm like, oh, nope, not JavaScript, back to Ruby. Nope, and then I end up just going to Coffee2.js or JS to Coffee or whatever the URL is. Just pasting CoffeeScript in to see what JavaScript is coming out. And then reverse engineer it with the JavaScript that I want until I have the CoffeeScript that I'm supposed to have. And I would like to avoid that. So again, there are trade-offs involved and certainly we don't necessarily wanna go down that route, but I do think that the WebAssembly project, Wazm as it's sometimes called, has a lot of promise and could potentially be another environment for Ruby to target in the near future. So that was our second scenario of three and our last one is what if Ruby had no global interpreter lock? And I call this part like what if Ruby had no GIL, but it's really, what if Ruby's concurrency story were different? What if the rules of Ruby's concurrency and parallelism primitives were not the way that they are today in terms of threads and new dexes and locks and things like that? So I know it's not a GIL anymore. It's not a global interpreter lock since we moved away from Matz as Ruby interpreter to YARV. It's now a global VM lock. Again, there's no need to add me about these things, but please add me if you have questions or if you wanna talk more about all the cool stuff that's in this talk. I make this joke. I don't think this has ever happened to me at a Ruby conference. I think it's other conferences where someone at the very end gets the microphone and then asks a question that is actually a demonstration of how smart they are. But again, Matz is nice and so we are nice and like I said, I have not seen that. It's another reason I'm delighted to be part of the Ruby community. So what is the GVL? The GVL is a global VM lock. Again, formerly a global interpreter lock. It's a mutual exclusion lock that the currently executing thread has. It's like the talking stick. When you have the talking stick, nobody else is talking. When you have the VM lock, no other thread can execute. This is for a couple of reasons. There are some classes in Ruby like array and hash that are not actually thread safe. There's the potential for race conditions and data corruption to occur and anything that calls out into C-Land. If you've ever installed Nokogiri then you know this is the thing that happens and Ruby sometimes compiling native extensions and things like that. It's even scarier than the browser in terms of the Wild West. So you wanna be very careful that you're not corrupting data, that you don't have race conditions and the GVL is meant to mitigate that. And not all Ruby's have the GVL. C-Ruby does, J-Ruby does not. I actually don't, I don't think Ruby needs does. C-Ruby might be the only one that has the global lock. But there are other scripting languages like Python that do have a GIL or a GVL in order to protect you from the terrifying world of C. No, nobody wants to, okay. So that one I should be nice. Just channel maths and be nice. But concurrency is a historically difficult problem in Ruby and concurrency and parallelism and I apologize if I'm sort of beating a dead horse are different and I think the takeaway is concurrency is do one thing at a time but you constantly switch among those things so you kind of make progress on all of them. So you're kind of round robbing.  And it happens so quickly that to us it appears to be happening in parallel but it's really in sequence. And parallelism is truly doing multiple things at once. You have multiple cores or multiple machines and you have a problem that can actually be split apart, solved in parallel with those pieces and not talking to each other or potentially talking to each other in terrifying ways. And then you have a result at the end, right? And as I mentioned, thread safety is an issue here. The GVL's job is to avoid race conditions and data corruption, it's meant to protect you, especially for things like arrays and hashes that are not necessarily thread safe. And it's important to also note that we could just pull the GVL out of Ruby and accept this lack of safety and really this discussion of concurrency primitives is sort of separate from the GVL. You can have the GVL and have different concurrency primitives, you can get rid of the GVL and keep threads. It's sort of, they're sort of separate questions but they're really, I think, intimately tied together. I think the shared concern here, the culprit is shared mutable state. That's what these concurrency primitives we're gonna talk about, that's what the GVL are meant to mitigate is you have some state, it is mutable and you're passing it around. And generally if you talk to people from other backgrounds or who have strong functional backgrounds, you can either have mutable state and it's local, or you can share state and it's immutable but it's when you try to change stuff and pass it around that things become really difficult. So how are we potentially gonna solve this problem in Ruby 3? This I stole from Olivier Lacarne who I think also got it from, I think it was Koichi's talk a couple of years ago. And this is the notion of guilds. And I would refer you to Olivier's blog post on this topic or if you just search Ruby guilds, you'll get a whole bunch of resources. But the idea here is to have sort of a concurrency primitive where you separate out what can be done safely done in parallel safely done concurrently and what can't. And so if you have threads that are running in the same guild, they are not able to run in parallel but threads from different guilds can. And so the idea here is sort of tackling that problem of shared mutable state by limiting how mutable state can be shared. And I apologize if it's a little bit tough to read on the dark background. But basically the idea here is that you create a new guild and you have that guild running separately so that when you call Fibonacci, you can rely on the guild to sort of manage parallel execution for you. This is not necessarily separate from the GVL, it's not necessarily going to save us from it. In fact, if I recall correctly, you do have a GGL which is a different lock for the guild. And so really what we want is something that gets us away from locks where we say we don't actually want to restrict access to something, we just want to be able to safely do things at the same time. Turns out Matz has a thought on this and this is a little unfair because this tweet is from three years ago. But I found this very, very interesting. He says, my vague plan is add more abstract concurrency such as actors, add a warning when you're directly using threads and then eventually take the gil away. If you're not familiar with the actor model, the idea is that actors are kind of this primitive thing in your universe and they can make local decisions. They can create a finite number of additional actors, they can send messages around, but basically you have actors that communicate through message passing and they can determine how to respond to messages and things of that nature. They can modify their private state but they can only communicate through message passing. And if you've used celluloid, I think celluloid is a Ruby gem that's a very good example of the actor model used in the Ruby universe and this alleviates a lot of problems that we have with locks because we no longer need them if we say you can modify your own private state but if you want to change something else you have to send a message and so we no longer have to lock or restrict access because we've already fundamentally said you can't change anything that doesn't belong to you. And if you've come from a Rust background or you've started working with Rust, then there's also this notion of borrowing and the borrow checker. And again, you have this notion of ownership where like this belongs to you and you can change it. If it doesn't belong to you, you can't. And it's just interesting to me that we have these things where you have like Google docs where some people can edit things and some people can't. We have things like GitHub and Git where these massively distributed systems where people manage to collaborate all the time and not really tread too hard on each other's toes and it would be really delightful to have this in the core Ruby language. So how do we get these new concurrency primitives? This is going to require changes to Ruby. So I said we can look at guilds, we can look at implementing actors along the lines of what we saw in celluloid. We can steal things from Go because Go has been stealing things from us so it's only fair. And so you can kind of have this fetch method and if Lycos go get it, makes any sense to you, then congratulations, you are one of the grumpy old people that I was talking about and we can all hang out later on. And then you have this notion of okay, for each of these URLs, I'm going to go fetch and do something with them. So if I'm going to go fetch them, these are actually happening concurrently. There's no explicit spawning of a new thread. There's no explicit locking or anything like that. We just rely on the virtual machine to do this correctly for us. We could steal from Clojure. Clojure has this notion of software transactional memory where the software actually says if you try to do something and two of you are trying to change the same thing at the same time, somebody quits and tries again. You do get a little bit of overhead from these aborted and then retried operations but it turns out the performance here isn't that bad and you do get safety when you're working concurrently and so there's a method or function rather in Clojure called PMAP which is parallel map. There is some overhead because underneath the hood it's creating a thread pool and stuff like that and doing all kinds of dark Java magic. But again, this has abstracted the concurrency story away from you. You don't have to create threads manually. You don't have to create fibers manually. You don't have to think about it. You just know when I call this method or use this function, I'm going to have a concurrent. Basically, I'm gonna be doing a lot of things all at the same time and I as a programmer don't have to worry about that. So I think that definitely does. I said earlier, I was not sure if static types were in some way antithetical to Ruby's core message but I do think that this kind of borrowing new concurrency primitives from other languages is not in the sense that we definitely get developer benefit and we definitely maintain developer happiness because we don't have to think about threads. We just write code and it works. If you are actually interested in Clojure, I'm happy to talk about that later. If you're interested in how talks get written, this little bit of Clojure will tell you and even if you don't read Clojure, I think you'll get the idea. You pretty much just alternate between these two things and then at the end you have a talk. Although actually now that Matz has noted that we have Unicode, you can actually do it this way. And this is actually a lot more concise. So yeah, pretty much you drink coffee and freak out and drink coffee and freak out and then you stand up here. Yeah, it's as easy as that. I do, yay! Nearly done. So again, is this a good change or a bad change? If we keep the GVL then we maintain thread safety. We have all the protections that we have now at the cost of performance and we're probably going to start to see an asymptotic increase in performance where we start kind of hitting up against a ceiling. If we get rid of the GVL and we adopt another concurrency primitive or another way of handling shared mutable state, then we get true parallelism and a significant performance gain. Especially for CPU intensive work where you wanna be able to use all of your cores and do things at the same time. Again, this could be at the cost of safety. If you look into closure software transactional memory or I think there was a Watson paper a couple of years ago about hardware transactional memory actually relying on the processor to protect you. And they did it with Ruby and Rails and they saw substantial performance increases and I think they were actually in the process of looking at hotspots and they were gonna get an even better story together. I'm not sure if they published a new paper, but if you search I think Watson, Ruby, HTM or hardware transactional memory, you'll find that paper, it's not too long, it's very interesting. All right, so we're at the TLDPA which is the too long didn't pay attention. So if you just came in or you weren't paying attention, you can now get the whole talk in about 30 seconds. So types, there are a lot of different ways of handling static typing versus dynamic typing. What if Ruby had static types? I think what we're gonna shake out is there might be something to be gained by coming to gradual typing. Having the option to put type annotations into your code. In terms of the environment, there might be something to be gained by targeting WebAssembly. I hesitate to recommend source to source compilation although projects like Opal have been doing fantastic work and the sort of the less frequently you have to dig through the trans-compiled code, the better it is, I think. Though I'm really curious to see where WebAssembly goes. And then parallelism, I think there's room in Ruby 3 for all kinds of new concurrency primitives, whether we pick actors, whether we modify the threading story for guilds, whether we pick software, hardware transactional memory, but there's a huge number of opportunities and possibilities available to us. And I'm just really excited to see where it goes. So having said all of that, thanks so much for your time. I really appreciate it. Thank you.


The use of computer simulations in the training of electromechanical engineers is an important component of their professional development. Despite the widespread use of mobile internet devices, mid, few studies have examined how these devices can be used in the training process. This paper outlines the components of the methods of using MID in the formation of the information and communication technology, ICT, component of the competency of electromechanical engineering bachelors. These include acquiring basic knowledge in computer science and modern ICT, as well as developing skills and programming systems, math packages, subroutine libraries, and more. For handling tabular data, free software such as Google Sheets, Microsoft Excel, or Quick Text Editor can be used. For handling text data, Google Docs or Microsoft Word can be employed. Finally, Autodesk tools can be used for 3D modeling and viewing design and technical documentation. This article was authored by Yaviniai Omodlo, Serhi Osamerikov, Pavlo Pinikipurenko, and others. We are article.tv. Links in the description below.


So I'd like to welcome Brian from Grafana Labs. So we're going to talk about how Prometheus has its memory usage. We have a welcome applause to Brian. Well, hello. So a little bit similar to RID1 earlier, I asked the AI to illustrate my talk. I pasted the title of the talk into the AI, and this is what it came up with. And I have no idea what this has got to do with Prometheus or memory. But it's a nice picture. OK, so this is roughly the agenda. Who runs Prometheus? Oh, like quite a lot of people. OK, who's got a big Prometheus, like 10 gigabytes? Yeah, you got it. You got the joke. Yeah. OK, 100 gigabytes. 200? Still going? OK, who's I don't know. We could have a contest who's got the biggest Prometheus. Well, so the talk is about making it smaller. Who's kind of new to this? Who has no idea what Prometheus is? Yes, I thought there might be a couple. OK, not very many, but so I drew you a picture. So this is the basic idea. It's Prometheus is self-contained. It takes metric time series data in from a whole bunch of things.  It'll store them on disk, but it doesn't rely on another database or another key value store or whatever it's self-contained. And then it can connect up to things that are going to display the data. Draw some kind of wiggly line, which we like to look at. Oh, yeah. Who am I? So my name was on the slide earlier. My name's Brian Borum. I work for Grafana Labs. So I guess most people know about Grafana, the dashboard, which draws the wiggly lines. But we also have a bunch of people working on storing data. And I work on that. I work on storage of metrics, logs, traces, profiles. And a lot of that is using Prometheus code. So I'm a Prometheus maintainer. I am the ninth biggest contributor to Prometheus, apparently. So mostly in the last couple of years. But I have been working on this stuff for about six years. I have been optimizing programs for, like, 40 years. So I do this a lot. So let's get into it. OK. Oh, by the way, this is an observability day talk, right? So I'm not going to talk about the code. This kind of occurred to me halfway through preparing this talk. I should do another talk, like GopherCon or something, where I talk about the code. But this is not about the code. This is about, well, so we're going to start with, like, how do you observe memory usage? Well, metrics is one way. So which memory metrics should we use? I went and looked up. So these are all the ones you can get out of CAdvisor if you're using containers. Or these come out of Kubelet if you're running Kubernetes. There's a few more you can get out of Prometheus Client Library from the operating system. Prometheus is written in Go. There's some more you can get from Go. And I could have gone on for a couple more pages. So who knows the right answer? Always there's one person who gets all my jokes. We should meet. You want to tell me the right answer? RSS, OK. There's a vote, OK. Oh, I put this up to indicate that it's something you need to think about. So I put them all on one dashboard just in case maybe that's the right answer. Like, look at all of them. It's a little hard to figure out what's going on. So you can Google this. You can get people's opinion on the internet. And so we had a vote for RSS. I actually decided to focus on working set, which is nearly the same thing. So there's a metric called container memory working set bytes. So you can look at that. People will recommend that. And I also want to stress, why do we care about memory usage? So one answer is you've got to pay for it. You've got to pay for more memory if you're using more memory. But probably the most vital reason is if you run out, it goes bang, right? It goes, ooh, you're out of memory error. Your program crashes. So we can look at the peak on this particular time period with 17.7 gigabytes. So this is me running Prometheus 2.27 from two years ago. I decided arbitrarily I would take that as my starting point for the halving in memory.  It's running in a dev environment. It's scraping about 600 targets running under Kubernetes. There's about 2 million time series. And it peaked here at 17.7 gigabytes. So mostly you will have a limit of memory. You can set it in Kubernetes. If you change the limit, it restarts the process. That's what that kind of dip in the picture is. But a little bit interesting, it was peaking above 17 gigabytes. I put the limit to 17 gigabytes. And it just runs smaller. So that's kind of weird. Well, let's bring some more data into this picture. Prometheus is written in Go. And we can ask to see the Go heap memory with this metric. Go mem stats heap in use bytes. And this is by far the biggest component of memory usage in Prometheus, the Go heap. It's kind of waving up and down a lot on that picture. So I drew another one. Simplified view. So this is kind of what's going on inside. The memory sort of builds up.  And it comes down again. And then it builds up. So you get this sort of sawtooth pattern, right? And this is happening quite fast. I mean, in this particular Prometheus, it's like every 10 seconds or something like that. So this is why on this picture, it's kind of waggling around rapidly. Because it's actually faster than we're sampling the data. So it's kind of random. Somebody should look up Nyquist or something like that. So you could learn things. Anyway, so what I like to do is bring in this different metric, which is next GC bytes. So this is essentially the top of the sawtooth, the crests of the waves. So this darker color here is the peak of the heap usage, if you like. So this is getting a bit closer. There's still a gap, though. But I mean, take it from me. If this one hits the limit, it'll go bang. So that one, a little tip for me, if you're looking at a Go program, you're going to have to look at a Go program. So a little tip for me, if you're looking at a Go program, this number is kind of more dependable. Let's try and understand what is in that gap. So it's really hard to get into all the detail. But basically, it's the kernel cache memory that's in the gap. And I kind of appeal to you to believe me, because it never goes above the limit when you add those two up. So it's IO, right? Prometheus is writing to disk. Everything that it writes to disk then sits in the cache for a bit. Everything it reads from disk sits in the cache for a bit. And that includes the memory mapped IO that Prometheus does a lot of. If you're looking at a program that doesn't do a lot of disk IO, it won't look like this, right? Because it just won't have, there's no reason for the memory to be in the cache if it's not doing a lot of disk IO. But in the case of Prometheus, that's kind of the bulk of the difference between the working set and the heap memory is in cache. And because it's in cache, we don't really need it. It can go back to the disk and get it. As you get closer and closer, the limit comes down closer to what's really needed. The program will slow down a bit, but it won't crash until they kind of touch. OK, so this is my kind of biggest takeaway. Sorry, it was a trick question. There is no single metric for memory. I interact with a lot of people on Slack or whatever, and they say, oh, my memory is this. And I always say, well, which metric are you looking at? And then the next thing I usually say is, well, you should look at these three other ones. Because one metric will never tell you the complete picture. So I really want to stress that for observability day. Oh, yeah, so I reduced the limit. So it was at 17 gigabytes. I took it down to 16 gigabytes, and it went bang. It didn't go bang straight away, but it did go bang. And so a little bit more detail inside Prometheus, what's going on here. It's building up this data structure we call the head block, which is the most recent data. And by default, it's two hours of data that it builds up in memory. And then it writes that to disk in a process called compaction. And because we don't want to lose two hours of data if it does crash, it also writes all the data to another thing on disk, which is called the write ahead log. So I go back to this picture. So what happens this? Probably it was doing a compaction here, because that uses a little bit extra memory, and that's when it went bang. So it goes down to zero. It starts up again. It reads all the data back in from the while. And it gets going again. And there's a real problem here that Prometheus only tidies up and makes everything neat and tidy and truncates the while after a compaction. So it crashed again, and it started up again. Now the while's a bit bigger, because it had been running for another two or three minutes. So now it needs more memory. So it crashed again, and again, and again, and again. This is a pattern that some of you will be familiar with. I thought it'd be nice to explain it. If you get into this state, the main thing you can do is give it a lot more memory so that it can get out of this state and recover. But I kind of promised in the title of this talk that the memory usage had halved. And this is running 2.29 from two years ago. So I showed you that. I will come back to that. OK, I want to talk about profiles first. Yeah, how did I make it smaller? How did we know where all the memory is going? Well, a profile is a good tool for that. I skip exactly how you get hold of a profile. Go has, in its runtime, built-in profiler. And you can ask it for all the memory and all the CPU usage as well. But we're focused on memory here. And you can visualize it in this what's called a flame graph view. The width of the blocks is the proportion of how much memory is being used. So what's called the root, the top of everything, that's 100%. And it's 6.7 gigabytes. This is basically the bottom of that sawtooth. The Go memory profiler reports the memory usage as at the last garbage collection.  A lot of people think that it's probably mostly garbage. I don't need to think about it. This is never garbage. When you look at a profile from Go, this is the bottom of the sawtooth. This is what could not be discarded. Anyway, so the process of making it smaller starts with saying, well, what is making it so big? And I added up these various bars. So I'm running some queries in my test system that turned out to be about 9%. The metadata, if you like, for the series, 14%. The samples themselves, you'd think that would be the biggest thing. But they're very, very highly compressed in memory. The metadata to with scraping, getting the metrics in, that was pretty big. But the winner overall, and this is as at two years ago, pretty much a third of all the memory inside Prometheus was taken up in labels, so strings. What do I mean by labels? Well, every series in Prometheus is uniquely identified by this name value pair set. And if you have another series, which is kind of related, and this is the only difference there is between the method, you actually get a whole new set of strings, and on, and on, and on. So you look at this, and you say, well, that's dumb. Just have one copy of the strings. But it's not as simple as that. So this is showing you the kind of data structure inside. And I don't want to get deeply into the goal programming details. I put a link on there if you want to go look. But basically, the thing called the slice header that's pointing to all the labels, that's 24 bytes. And every string has a string header, which is 16 bytes. It's a pointer to the contents and a length. And if you add all them up, it turns out that all of these pointers in the data structure are way bigger than the strings themselves. So I did this. So this is Prometheus PR 10991. And I put all the strings in a single string. And I kind of encoded them with the length. So you can sort of walk down the string and find the one that you're after. And this is a little bit exaggerated because the strings are really small. But most of the strings that people use in Prometheus are small. There are things like namespace and cluster and job. And so there's a lot of small strings in there. Anyway, this shipped in 2.44. It took a year. 2,500 lines of code changed because there was a huge amount of code that just assumed that it knew what that data structure was like. There's lots of projects that use this code which had knock on it. They needed basically 1,000 line changes to react to this. And also I want to give credit to the Prometheus team that put up with this. I did a lot of the typing. But they were reviewing these changes and helping with testing and all kinds of things like that. So shout out to them. Right. So I didn't add any more memory. I started up. So the previous one that was crashing at 17 gigabytes, I ran 2.47.2, which is the most recent released version of Prometheus as of today. It's not half. 13.1. Result? It's not half. OK, carry on. Oh, I wrote this up in detail. Yes, great. Oh, but maybe I can explain this because we added out-of-order handling of samples. We added native histograms that Richie was very pleased about earlier. Maybe they used up all that. No, they didn't really use up all that. No. OK, so this is conference-driven development. This is I'm preparing for this talk. I said it was half. Well, maybe there's another thing I can talk about. This was a bug that was fixed in 2.39, where for really big Prometheus, the transaction isolation ring used to get enormous under certain conditions. I did the math. It's still not half. What are we going to do? So I went back. I did the thing that everyone said I should have done in the first place, which is to have only one copy of every string. So this was April. I did a version of that. It is quite complicated for a couple of reasons. Well, first of all, it's a lot smaller, because the only thing that we're storing is indexes into a table. So we have a thing that is technically a string in Go, but it's actually just a list of numbers. We have a table index by those numbers, and we need to point to that. And the thing that makes it really complicated is we don't just want to have one of those tables. If I just have one table for the entire program, it's a bottleneck. Basically, the entire program becomes single threaded on this one table where all the strings live. So it's a very intricate change, and we have multiple of these symbol tables. That took us down to 10 gigs. So this is like about a month ago, because I submitted that PR in April. 10 gigs. Still not half. OK. So I carried on. I did. I mean, basically, the process, you get the profile, you pick the biggest number, you work on that, find some inefficiency in it if you can, do it again. And now what was the second biggest number is now the biggest number. And you do that a few times, and numbers that were really not that big to begin with are now big numbers. So it's a nice self-reinforcing process. Anyway, running low on time here, this is 2.47 plus all of those PRs on the previous page. 8.6 gigabytes. Are we at half? Nearly. I don't know. I think that's pretty good, though. OK. Tough audience. One more thing. There is a parameter in the Go runtime called GoGC. And it defaults to 100. And basically, the size that this sawtooth, the size it grows to is 100% of the size at the bottom of the sawtooth. So in Prometheus, that's, in my little test one here, that's six, seven gigabytes. And in those of you who have 100 gigabyte Prometheus, that it's kind of growing by 50 gigs, basically for housekeeping purposes, you don't need 50 gigs of garbage to run an effective heap. So you can tune that number. It's an environment variable you can set. It will grow to whatever percentage you set it to over what it went down to as the minimum. And it will garbage collect a bit faster.  But like I say, if it's enormous, if it's garbage collecting really slowly, because it's got to grow to 50 gigs. And I worked on that as well. Worked on optimizing the amount of garbage being created. This can work out. So anyway, I did that. So this is the Prometheus 2.47 plus the 8 PRs on the previous page, plus gogc equals 60. And it's running with a memory of eight gigabytes. And I'm done. So yeah, there's the takeaways. I really love feedback. If you go to the page for the talk, you can download the slides. And you can tell me what you thought. And I have some time for questions. Thank you, Brian. If you have any question, please approach here the microphone. I have the first person. Yeah, thanks. Great talk. I'm just curious, normally when you get that much memory improvement, you're paying for it in some other way. Do you have a summary of the CPU impact from all these changes? Yeah. Well, that's OK. OK, so yeah, engineering is all about trade-offs. Were you over there? So it is quite likely that when we squeeze down on one thing, that something else goes up. Memory is kind of an interesting one, though, because the way your CPU works, it's working in a lot of the time, 4K pages. And so it's kind of spending a lot of time in housekeeping. And it's got a, I mean, your cache on your CPU is probably something like 10 gigs, sorry, 10 megs. And we've got 100 gigs. So basically, if you reduce the amount of memory being used by your program, it might go faster, because more of it might fit in the cache. More of it might not cause what's called a TLB miss. Don't have time to explain that, sorry. Anyway, so the very last thing that I did push the CPU utilization up a bit for everything else that I talked about, it goes down. Yes, it is nice, yes. When evaluating the performance improvements that you went through, do you have any general framework for deciding if the development effort to implement it is worth the performance optimization? Oh, yeah, that's a good question. Oh, this is the when do you stop question. Well, I recommend having a talk deadline. Yeah, more seriously, I mean, yeah, it is good if you can somehow work out. And Richie was actually talking about our, I work for Grafana Lab, same place, sending out these weekly stats about what we're spending in the cloud. And memory in CPU is a part of that. And so you can literally put a dollar amount on what is hard is to predict what the improvement's going to be, right? So I think realistically, you have to get the data, get the metrics, get the profile. And you get some kind of idea like, I mean, a profile that is really attractive to optimize is one where there's one big bar. Like the one that I showed you, there was a lot of kind of evenly sized bars. That means people have already optimized it quite a lot. Anyway, yeah, it's really hard to predict what a benefit you're going to get out of it. So you kind of have to say, well, I'll give it three weeks or something like that. And that's worth so much of my time. And I'm hoping to get this much drop in my cloud bill. But if I don't get anywhere by three weeks, I'm just going to have to drop it because it didn't work out. I sad, I don't have a better story than that. Just kind of time box it. Yes? Hey, great talk, thanks. That resonates a lot with our experience with Prometheus. So it's great to see the memory being there. My question is about the agent config. What is it? Is it an agent mode? Does it change the situation? If you use the Prometheus as the agent, is the memory usage lower? OK, yeah. So there's a mode you can run Prometheus in called agent mode. That's what you're asking about. And essentially, it does not build TSDB in that mode. But you still have to write the headlock, right? You still have those towers. Yeah, so it'll be a little bit different. But in my tests, I did have remote write turned on. That's hard. Takes a lot of memory. Yeah, I think there are some specific fixes in there. And yeah, so basically, the labels as string table thing was not particularly helpful for Prometheus agent. The next one, the labels as symbol table will be. Great, thanks. Thank you so much, Ryan. I appreciate it. Thank you.


So we didn't want to limit that fear to you that they could be theater. Just saying. Should we practice this? Okay, okay, this is perfect. This is exactly what it is. No, go ahead, come here first. There's something that was really primitive for me. I'm from West Virginia, and after the 19-line disaster, it was six years ago, until West Virginia was gone. All right, there was a place you're picking apart. And so she was flashed in the memorial for the many minors who were killed. Hi, my name? So it was just like, it wasn't about us at all, but in some ways it was our journey together. So it was like art validated in this very, you know, description of it. Something that defined your sense of character. Because it's for yourself. Oh yeah, do that. So come here. All right, why don't both of you go with that? Yes, I love it. I mean, one of my most recent memories was being back in Hawaii and being amongst the holocausts, which are like the beautiful dresses. He's still honored today. And now as an adult, you need friends with him. But he's my hero. Whatever, it just flowers. Oh, how does it feel like the work of the design and the inclusion of nature through this music. Everybody is singing along, screaming along. I'm going to rock it like the way people rock it. It's amazing. It's so cool. And just when you understand what it means, it's like the craftsmanship. Exactly.  I want to wear dark finds. Just like not coming back. I think what it was was he had artistry that he brought to a specific moment. He said, I see how this applies. He just got back. Actually, we were there. Yeah, he met my dad. He met my dad. And he met all the aunties. There are a few people that have definitely worked with my dad, whatever. He doesn't have that kind of experience. Especially around challenging situations. So cool. And then we met that way too soon. So I speak about it occasionally in terms of life. And so they really, like, my father really couldn't stop it if they could. So he met all of them. And it was the first time I saw my father. Yeah, very smart. All of that. I was at a bowl of tea. So David, do you have an aesthetic moment that you would like to share with the people sitting next to you? Very attractive Asian man. I never knew that I could be attracted to. So it was just one of those things that Besides those pictures of your little granddaughter, which I might hear done, David. I'm like, that's a wrap. That's a wrap. In Newton. And then we saw the new project. Was it a critical mass that you felt like there were Asian guys working? Actually, no, I did have a crush on him once. I did go to Chinese school. But it was not normal. I thought he was the exception. I had a crush on him. But it was an actual actor. Speaking English, not Bruce Lee. He was sitting by himself. Because I was part of another work. And they were living in New York. But also living very much a bicultural experience which I felt like I lived in New York. But we were trying to tell the time. And so I just, it was just sort of like, it started, it was like little fire in me. Which I can only look back on it now that I'm older. Realizing it was that moment that I had always searched for moments like that. As I got into like my 20s. At the end of the show, I kind of made my way over to him. It was very hard to find him. And I said, I'm sorry that I didn't see it. That I didn't say Toronto. Yeah, I shared one. I actually said, when I saw you last week it was Lynette and me watching. A show I worked on. A transgender musical I worked on in New York. And I've been working on it for six weeks as an artist. And that's art, sorry. That's art. And then we saw the opening together. And I was so speechless that I left the theater. And just sat and wept through the whole thing. And I didn't watch it. I didn't want anybody to get into my brain. I couldn't have a transgender person. And I looked at his face. And just being able to just sit in the word. And let the art tell the emotional journey in a way that we can't do just the two of you talking it out. Yeah, yeah, yeah. It's like you're too in it, you know. So you can't, I don't need art as that. OK. Oh. So it was like that. Oh. So. Yay. Absolutely. Wait here. I'll text it to say it gets me out at night. So it goes up there. So it's literally the field feeding back on itself. Because it's all practitioners and audience talking about the work. Can everybody hear me? That's good. Is that better? OK. My name is Lucien. So moment for me that really changed was not long ago actually two or three weeks ago I went to Hawaii. And I've really changed my, like what I want my final destination to be. You know I, one of the, one of the small memory that I have about that, that vacation was I was sitting on the beach next to a beautiful mermaid and then the two guys will walk on the beach and it seems like there was a tiny piece of paper on the sand.   It's so beautiful. The culture of people just like good food, inviting. We went to see a guy that was like as big as a house but he was gentle as a puppy. And it's just like, it changed my vision of when I came back, when I left I had a plan. When I came back that's it. That was, that was, I'm going there. So that was my moment. I love words, I love plays, I love stories but I'm taken a reinterpreted by Soledad Barrios in Flamenco Dance. And seeing a play that I am familiar with re-infused with a new energy with a woman no longer in the peak of a young beauty usually think of as beautiful and this woman that was a little bit older her passion, her zest and her drama written on her body was so transporting. I felt I am in the hands of a master and I am watching, I am honored to watch this transformative moment. And it was in this not fancy, you know, hall it was in a theater and it felt all over better in the sense that it felt like a discovery. My name is Harvey Leong and I'd like to say that my life in China which is a movie that Kenneth Ang made a documentary about his dad and his journey from China to Boston and how he raised his sons and how he dedicated his whole life to his children and it was quite a movie. And his trip back to China and then the irony that well maybe I should have stayed because Cousin Joe was doing so well Cousin Lu and so it was quite memorable, very good. My name is Melissa Nussbaum Freeman and what was very striking in our conversation was the importance of silence and listening. There were several examples for me the strongest, most important example during intensive at Shakespeare and Company is anybody going to go, I don't want to ruin it for you. Spoiler alert. Spoiler alert. It's called Elizabethan World View Day. All the students are gifted with a day where all the teachers and the TAs create an incredibly precious space where hundreds of books, the world and theater and art are laid out and you walk into the space and the teachers are all reading and it's just this beautiful music and before you enter the space someone touches your heart and welcomes you home and then we all share our silence. Hello. My name is Igor Goliak and I came in late and we were just exchanging our inspirations with David here and we actually, one of the things that we exchanged was the Art Samaritan presentation of Lev Doden's Three Sisters and it moved. It was also just so strange it was kind of surreal for me because seeing Lev Doden here and seeing him in St. Petersburg it's quite a, you know, when you replant a plant an exotic plant from its word origin and replanted in Boston and it starts blooming here too so that's the bloom that we agreed on and thank you. Beautiful. That's a great note to end on. I heard a theme, I heard a little bit a theme of home and that a sense of people want to feel like they are connected to something I mean home is like the deepest connection whatever that means for people and so that people picked experiences that whatever home meant they gravitated towards aesthetic experiences but also interesting this notion of mastery I heard that the difference between mass others I was trying to, you know I was trying to really get how that sounds great. That's so beautiful I think this was kind of sad already I don't know if anybody used the word where but everyone in one part or another what they talked about, talked about where and it seems like it sometimes matters more than we give it credit for we're honored to have been asked to mark so that we'll keep up with which is hearing from you as much as we've addressed some of this beginning exercise but I think that what you probably saw is that each of these people up here this is what they do for a living is they think about what am I in a city with them so it's a privilege to be up here I'm going to read bios if that's okay I also want to continue as you all think use yourselves too I'm trying to moderate I would do a short film so not what's written because it's so long at least a couple of lines I can inside joke I'll just answer all the magnificent awards I am obviously the first sentence and that'll be good so Susan Shinton while serving on the board of the Asian American Resource Workshop yes, love that established the annual Boston Asian American Film Festival yes, in 2008 so it was a platform to elevate community stories and issues and has since hosted Susan has hosted special guests including George Takei I was there, that was amazing and on Lee definitely, all right, go for it okay, anyway that's the end of the first sentence so I'll stop there Malia is next on the paper that's what matters, right so upon completing a two-year fellowship at MIT Malia wants to return to Boston what, across the river across the river to build non-profit models for the 21st century and I'm going to read another sentence with over two decades of experience establishing grassroots involvement in political advocacy and civic engagement Malia felt the non-commit industry was too dependent on money, goddammit and was in need of disruption thank you, Malia oh, that's what you wanted to ask okay, disruption okay, David Dower is the... oh, I didn't say, by the way Malia is the executive director of the epicenter community which is a new name David Dower is the co-artistic director of ArtsEmerson David, before joining ArtsEmerson in the spring of 2012 David spent six seasons as associate artistic director at a Rina stage where he directed the artistic development team and founded the American Voices Youth Plan this is a long sentence tell me there's a period coming who's saying it's like on the next page or something go forward just to set me up just wrote that by all okay, Holly Holly Carle is the co-artistic director of ArtsEmerson where the program A. Breibach is a trashy Jewish Communist safe sex formula fabulous I'll just go with that you asked okay no, that's all you need to know I suppose like that or different from that and I just said it with an attitude because I want to make fun of it a little but it's also okay to like that sometimes so how are you like that or not you're really intentional about the in-person experiences that we provide we want them to be safe spaces we want them to be a place where people's culture and cultural experience is presented with love and respect and we want it to be a place where when people walk out they have a certain amount of awareness you feel like you're a part of this but you also understand who created this place to make and so our intentionality goes a lot around us saying to your point of hey we know some really great things that like we want you guys to know and then also saying and what do we need to do so that you feel safe walking so one of the curations that I want to talk about that I think we're the most part of that we've been doing over the last few years is we've been doing a Juneteenth celebration at the Museum of Fine Arts so here you have the blackest holiday being celebrated at the whitest institution in Boston but what you see with that is that the black people are like oh shit I didn't know they knew about Juneteenth you know what I mean so like all of a sudden they know like this is for us right they're not saying like oh this is the Martin Luther King Day thing right like it's Juneteenth it's something that we do that y'all don't know about and then it's at the MSA so then the white people are like oh well it's Juneteenth but it's at the MSA so we won't get shocked thank you so much for asking sir it doesn't happen in February it does not happen in February Juneteenth is actually a fabulous lie that we celebrate so Juneteenth is supposedly the day that a northern soldier found a group of slaves in Galveston, Texas who didn't know they were free and so he went to this plantation and he said ignorant slaves you're free but as we talked about at our first Juneteenth celebration the slaves were a part of their own freedom so they knew when the war was over they knew they were free but it's one of the stories that America likes to tell so that we make sure our history sounds right so thank you so much for asking and what Juneteenth has really become and folks who know about it to get together barbecue in Boston it was a kite festival so what we do now is we bring this year it's going to be all around fashion design but we bring together 6th applicant highlighted at the Museum of Fine Arts white people feel comfortable because they don't feel like oh I'm going to walk in and say something like they feel comfortable this is our space right we're comfortable here but also the black community also feels comfortable because they know well we know about Juneteenth so we can bring a true value add there and we bring about 2,500 people a year there so I think that's an example of how we go on here ever vintage has been or to any of the other things that epicenter community or future Boston have done let's raise our hands for those of us who have been lucky enough to do but does anyone want to say anything about how what Melisa said resonates for you I happen to have so you can follow us at www.epicenter.com epicenter.com.org you can find us on the web and I definitely have cards that I can give you most of our work that we do is done through social media we don't do any general advertising it's all through creative networks the word intentionality is going to be shared with other people there is some expertise involved and you're trying to be transparent about that there's what we've learned this idea of expertise that sharing is that that resonates and does not resonate and you have blinders on what's your hit on that because you were saying you just went into this position there at all what's their agenda for the culture that they think is most important and so when you start from a duration of listening you're actually suing these hearings what's ours to do with Melia make the space available Melia what are you feeding code words like about rigor for instance but I think it leads to a little more literal you know what happens to rigor looks like somebody works really hard so what are your thoughts and all of your thoughts on this question of the curatorial eye towards excellence there's this moment where the cast sitting along if you know this song and I'm sitting there on my hand and the song starts and the signers are going look at the audience of people I had no idea were the people I thought I was the person I curated but I heard the whole room full of people who sang along and so afterwards I talked to people because I get it we get challenged so on which they were working sat there going well clearly you're not only curating the work you're also curating the audiences that you're trying to reach because you're just listening to some of the examples that are being given from the stage you're talking about reaching an Asian American audience you're talking about reaching an African American audience you're talking about in some cases reaching lesbian, gay, transgender that audience and the question I have is to what extent when you curate are you curating a portfolio of audiences how do you think about the mix of audiences that you try and put together when you curate that's the social justice state is how we're going to get through this and how we're going to find it the organizers space the audience has always been also thinking about in certain ways some of the most nuance of our audience because the worst thing that we can do is common denominator if we were to say we need to get black people and it's great that we need basketball and fried chicken no that's going to get some white girls who want to affect a black man but not much more we're just fine too that's my mom and that's fine there's an authenticity in there it's not just going to be this is Juneteer.DMFA so there's going to be or there's going to be lengths and fumes we have the Roxbury, New Yorkers and we have a diverse group of black, brown, Asian youth playing spirituals it's in finding those unique nuances that gives nods to whatever community we're working with to be like this isn't just some lowest common denominator you're going to feel safe I do think for us the curation of the audience is much more important than that's going to lead anything that we exactly what's repressive I mean if we're talking about getting culture out there having another group with the same agenda that has provided it's like how important is that this fresh agenda approach to it does anyone want to speak to that or does this hear those whispers as yells and hear these yells as whispers it's right because they always yell and one of my experiences with our this did in this world thank god you put on some earrings that I was like this man's mom I was like I love him I'm wearing earrings I heard that but what was so amazing was here theater has always been this thing privilege do you have money or you and your friends wear your mom's clothes and putting on a little play the idea of the accessibility of theater and here were two of you making theater very expensive so we decided to delve in the first time we were promoting with our community and we couldn't give away the theater tickets that we had and we literally had giveaways and not enough people applied for the contest so make it a contest and one of them was the editor of Boston magazine so I was like do they even get the free tickets they have see people emailing we had to put a cap on it and be like okay wait we don't have this theater arts emerson bean has been really willing to have this dialogue we're bringing it to the streets like guess what you are theater and if you're not it's been beautiful to see as I said we couldn't give away the tickets and now when we put it out we actually end up emailing some of our best volunteers or whatever because we know if we put it out to like the public that we're going to get a whole bunch of responses and so I think for us that's just shown impact of people talk on and this piece of my talk on is David said our industry is about elitism the more you give you eventually have one name you want to get your name on the brick and eventually you have your name on the theater and it's a counter to everything that we're talking about now and I think that theaters like arts emerson we still make fun of it and we'll still like to see it new plans Derek so hi I'm Derek from Boston so Susan and Malia have actually started to touch upon some of what I was going to say because I raised my hand 10 minutes ago so it's kind of moved on but what I was thinking was that I really am glad that Susan mentioned the word not curate what was the other word you said convene because my impression of what Susan and Malia do is not so much curating because the conversation for a little bit was talking about curators and them as the audience but my experience with your events isn't so much in us and them it's more of an us it's more of a we are them there's that sense of this fluidity of curators and audience and we kind of all move back and forth between that space and when I think about Juneteenth I think about it not so much as you have this black audience coming to a white institution just for this particular event but you're also opening space for the black community to express itself in different ways or just to express itself in places that it doesn't normally do that and what I love about the Asian American Film Festival is that it totally removes the whole black-white paradigm that most of this country operates on and despite that I still feel very much at home at the theaters, at the shows I get something from all the films that I go to and I really enjoy that sense of still being in community even though people might not visually look at me and say oh visually I mean I still feel very much a part of it so that sense of us not so much in us and them but we are them and we're all in this together I wonder if this shows I'm curious whether it's different for each of you where do you go to listen I do it on planes, I do it in restaurants I do it on my wife we don't even talk to each other and then we get home and we go wow did you hear that and so really it's a life style you want to do what? that's a challenge that's a challenge in listening I said I listen it goes to the e-dropping the more ratchet the better and I know that's not my style but I will if I'm getting my nails done I will get into it there's something about a storytelling I would rather hear two sisters sitting at a nail salon talking about that no good whatever because it is good and then they drop certain things in and if you're willing to explore or ask or engage in conversation they'll take you there and I think for me everybody for it we're quite big ask about their pieces or their work or people just want to talk you know and people are just getting through and in that I'll hear certain things or I'll be like oh we're all trap queens now got it that's how we're moving forward because I'm of the age now where being a trap queen is none of my friends are going to tell me that it is rough to and go back to you because before we end we're supposed to wrap it up but I can't see if you can have it under 5 minutes or so thanks what I can tell here is that this intention is genuine what I also know from my own experience anyway it's like for me it's a constant struggle to stay genuine in this listening and to not want to pull power to not want to figure out what status quo sorry there's not a lot of memes that's why I rest the series no no it stops I can get started on the dirty part a little bit but then everyone jumps in to back me up so I'll say you were the brave one so I'll say that every time that we haven't listened no one's coming so I think for us even though I'm hella smart and sometimes I'll find myself quoting Henry Ford which is if I asked my consumer what they wanted they would have said a faster car or faster horse and I'll find myself quoting that and be like obviously our consumer does not know they would have asked for a faster horse you know you have to get them to wanting the car your job and I think the older I get the easier it gets and this goes to where I think there is an arrogance in being an organizer there is an arrogance in saying you're going to be a leader there isn't when I'm doing my meditation and when I'm walking my path like I'm going to get it rocked naturally just because I'm a human being and they're proud of me and I'm all of those things and I think that when I'm on the TV to y'all can see but the older I get the easier it gets because I get to this point I'm like oh they don't like it and I don't take it personal anymore where I think like 10 years ago I did make it more personal because it was a great idea because I had it and now I'm just getting to the point where I'm like listen no one's liking it and if they're not going to like it then they're not going to come so let me just go home yeah so others where's the messing part here I'm just looking for a story with a happy ending yeah like no one coming yeah we get it about the happy ending so part of this whole thing when you talk about it this way is that it leads to a sense of lack of aid it leads to a sense of well they said that so that's what I said that's actually also an application of responsibility but what happens is once and it comes in a lot of ways people will always they're always sending me like do this play or when we first said that we were making spaces available people were saying well do my son's play and that's really hard when you said we want these spaces to be accessible and all that's offered is you do my granddaughter and why becomes a conversation I would say that the that's the messy part it's the juicy part it's the hardest part it's not necessarily a happy ending but it's also not necessarily a bad ending we wind up in real conversations we wind up in real distinctions about making real distinctions about what is an institution versus what is a we wind up in conversations about what is the art's role in society and what is society got to do for itself and what can we how can we enter that and so we wind up in these conversations that I learned from always and so then you have to go pass people who have walked away so yeah you're like you're living in Tennessee and I think that that's also important that sometimes because there's now finally a place where I can talk whatever it might be right this black space not being black enough and so I and so even though black people might be complaining or trying you know it's that we're finally here now that's actually now how I would have done it and even though it's hurtful and whatever it's like wow like we're actually finally in a place where we're where we can have that critique of how if for many of us and for many of our community that's a revolutionary space and an important space as well Thank you Maria because my god I was suspecting you were hearing me all talking all the talking about intention all these things that's coming through and really important but I think definitely getting to the actually the part where regardless of arrogance or whatever you're called on say it's your art form and inspiration and that's another debate for another day but how much I admire the work that you do and thank you for sharing and then also all you folks here thank you for taking part in this


And we are back with the look at the probables for Thursday's finale as Yankees go for the sweep. Jordan Montgomery gets the ball for New York, he has a sub four ERA, he's up against Chris Ellis who makes his fifth start of the season. Now note the unusual start time for 30 for our coverage with first pitch just after five o'clock. There's going to be a concert in Baltimore Camden after that game. Now a Yankee win, their third in a row, music to the ears of Yankee fans and now they just have to keep the momentum going, things very tight in that wildcard race. And Jordan Montgomery has to be a big part of that. He needs to bounce back from his last start against the Mets, probably his worst start of the season, didn't last through four innings. The Yankees were trailing eight to two after four. He just was in search mode, Michael, throughout that start, couldn't find any of his pitches that worked properly. Before that he had been one of the better pitchers in the American League through about a two month period, so he can come back and help the Yankees out a lot. And I think the other thing that's important for the Yankees is remember you're playing the Orioles, remember that you do not want the Orioles to disrupt what you're trying to accomplish. There are 11 and 7 against the Orioles this year, you want to finish strong, so it's up to the offense to do a little more damage. Two runs today against Means that ended up becoming a problem when the bullpen had an issue with Green.


Prisoners released in exchange for joining the army created real chaos in Russia. Igor Sofanov, who was recruited to fight in Ukraine from a Russian penal colony where he was serving a sentence on drug charges, returned to civilian life this spring after he was pardoned as a part of a deal with the Russian military. Sofanov's acquaintances told the Moscow Times that his military service had changed him for the better. But his time out of prison and the army would not last long. Sofanov, 37, was arrested this month alongside another ex-convict Maxim Bochkarev, 38, on accusations of stabbing at least six people to death and setting the victims' homes ablaze in a village in the Northwestern Republic of Karelia. The widely reported killings have sparked fierce debate about whether ex-convicts should be pardoned in exchange for their military service and highlights the challenges of integrating these men into society when they return home. Russia, in particular, the Wagner mercenary group run by Kremlin-linked businessman Yevgeny Prigoshin launched an illegal prisoner recruitment campaign to boost Moscow's military presence in Ukraine starting last summer. In exchange for their military service in Ukraine, prisoners are promised to be pardoned and their criminal records expunged. According to leading prisoners' rights activist Olga Romanova, the total number of convicts recruited for the war could be up to 80,000 in total, with at least 20,000 ex-convicts from Wagner already returned to civil life. Another Wagner fighter, Ivan Rusomahin, who was serving 14 years in jail for murder and robbery, was freed this spring after fighting in Ukraine, commuting his sentence by 10 years. In March, he was arrested on suspicion of killing an 85-year-old pensioner in the Kirov region village of Novibarets. Residents from other Russian regions where ex-prisoners are returning from the frontline have also voiced fears about the potential impact of freed convicts. Meanwhile, Russia continues its efforts to recruit prisoners for the war, activists warn. It opened a Pandora's box that will have an impact on generations to come, Romanova said.