On today's Visual Studio Toolbox, Phil Jepixi is here to kick off a series on how to use Entity Framework Core. Hi, welcome to Visual Studio Toolbox. I'm your host, Robert Green, and joining me today is Phil Jepixi. Hey, Phil. Hey, Robert. How are you? Great. Welcome back to the show. Thanks. Good to be back. It's been a while. Phil Jepixi is my guest. That means we're doing a multi-part series. Absolutely. We've done some Epic ones. We did an eight-parter on design patterns a while back. Yeah, still get lots of great feedback on that series. Yes, I loved that one. Also did one on unit testing. Was that like four episodes or something? Or five. I don't know. It all runs together when you're having so much fun. I know. Today, we're going to kick off, and we're going to take a different approach to our series this time. We're going to do Entity Framework Core, but we're going to start from the beginning. This is going to be a introduction to Entity Framework Core. Correct. Just if you're watching this and you've been using Entity Framework Classic, or if you've been tinkering with Entity Framework Core, you might want to just double the speed on this one. Later in this series, we'll do a deep dive into all the awesome sauce that is in Entity Framework Core, but we want to get people up to speed on ORMs in general, and of course, specifically in these first few episodes. This is part one of a multi-part, and is it safe to say that Entity Framework Core is to Entity Framework as ASP.NET Core is to ASP.NET? So it is the version that is aimed at the.NET Core runtime? Yeah. So if you want to make that analogy, it is important to note that both ASP.NET Core and EF Core are complete rewrites of their classic versions. So they are similar in name, they are similar in goal, but under the covers they're vastly different. But the way you use them is more the same than different. Is that correct? That's correct. Yeah. There's a lot of new features that came in EF Core that we'll cover in later episodes, but from the general perspective of an object relational mapper, which is what EF is, the general concepts are the same. Okay. So I guess that's a great place to start. Because anytime I see a technology, I like to ask what is this thing? Why was it invented? What problems is it trying to solve and then how do you use it? So what is an object relational mapper? What is entity framework? So databases tend to store their data very relationally, hence the name relational databases. So you have a customers table, you have a products table, you have very specialized, it's called normalized tables based on the data. Problem is our applications don't work that way. We tend to work with domain objects. So if you're looking at a customer, you're also going to want to see that customer's orders and their order details and their products related. So we have this disparity between what our application needs and what is optimized for the database. So that's where the ORM or the object to relational mapper comes in. So it enables us to very, very simply convert what is good for the database into what is good for the application. Okay. So it's not about how you talk to the database because we've been able to talk to the database for a very long time. In fact, before entity framework came on the scene, we were using ADO.net and before that we're using ADO and before that other thing. So it's less about the underlying talking to the database and more about how you get to work with the data in your apps. Yeah, correct. In any framework in any framework core, both use ADO.net or ADO.net core now, I guess you would call it under the covers. Okay. So they're still using data providers, they're still using connections, command objects and things like that. It just extracted away from you. So I look at it this way. Everybody really appreciates indoor plumbing. We don't have to walk out to the outhouse, we don't have to dig a hole if we have to go to the restroom. Data access, I consider analogous to plumbing. Almost every application needs it, but I don't have customers coming up to me saying, hey, I need you to build a data access layer for me. I have customers coming up saying, I need an app that does this. Data access is part of that. So there's not a perceived value add into data access. So anyway, we can streamline that process to provide more functionality for the business and spending less time on the plumbing. So I look at any framework core as the plumbing that every application needs, but we don't necessarily want to build. So in days past and we'll see demos of this, we would have to create a command object, open a connection, write the query somehow to get data from the database, pull that back into either a data set, if you're looking at the older technology, or a data adapter, and read through that data and populate models. Well, there's not a whole lot of business value add to that. It's a requirement, it's a necessity. That's plumbing code. That's plumbing code. Right. Okay. So the goal as always is to spend less time writing plumbing code and more time writing the logic that's useful for the app, business logic. Okay. So that sounds like a good overview of what it is. Let's see how it works. Sure. So I have some pre-built code here, but most of it we're going to be typing live. So that's always comical, but it'll work. So one thing I want to point out before we dive into the code is there's two different paradigms that you can use with Entity Framework Core. The first paradigm, which is what a lot of people who aren't using it will come into, is you have this existing database, and you want to start using Entity Framework Core to query the data and to work with the data, but how does that work? Because we only have this thing called Code First, and Code First in my mind is one of the worst names that Microsoft Marketing came up with, because what we really mean is Code Centric. So in EF6 or EF Classic, we had four ways of talking to a database. We had with a designer from an existing database, a designer with no database, and then what they called Code First with an existing database and Code First with no database. So I want to stress that when we talk about Code First, we're really talking about Code Centric. So what I have here is a very simple project. Now I'm using the preview of EF Core 5. We can switch that back to 3.1. And the way we would do that very simply is Microsoft Entity Framework Core in the NuGet packages. We go down here to SQL Server, or Microsoft Entity Framework Core SQL Server, and we can roll back to what is the actual supported release, and then we click on update. And this is how you would install Entity Framework Core into your project. You pick the version. We can also use the command line for this, but Entity Framework Core different than prior versions of ORMs is very modular. So we just pull down those bits that we need. So what I have pulled down here is Entity Framework Core SQL Server, and then we're going to change the version of Entity Framework Core design, which allows us to do things like migrations and scaffolding. So this is how we set up our original project. It is just a concept. So for the purposes of what we're doing in these intro episodes, we're going to do stuff that's in 3.1.3, right? We are going to do stuff in 3.1, yes. So there's no reason not to use the stable version. Yeah, the EF-5 at the time of this recording is very, very early, and I don't want to confuse people with things that might be changing as it gets farther in the release cycle. Okay, okay. Okay. All right, so now we've got our project set up, and what I want to do is I want to take AdventureWorks, which I have installed to local DB, and I want to run a command line interface process that will then take the existing database and create all of the Entity Framework Core objects that I need to work with it. So this is called scaffolding. We can also do the reverse, which we'll see in a later episode where we actually build our database from code. But we're going to start with the existing database and we're going to then create all of the objects that we need, and then we'll talk about what those objects do and see examples of that. And does this have to be a command line thing? Are there tools that make this easy? There is an add-in that was written by, and I don't remember his name, somebody on the EF Core team, but it's not built individuals to you out of the box. And the reason for that, and this is probably important to point out in all of .NET Core, the command line interface is the queen of the root. So you can do everything that you need to do with .NET Core and EF Core from the command line, and you can do most of what you need to do through Visual Studio. The reason that the team is focusing on a command line is not everybody's using Visual Studio. I could be developing this in Visual Studio Code, or I could be using Rider by JetBrains, or I could use any host of IDEs, notepad if I was really not into productivity, and then do everything from the command line. So the command line comes first, and then Visual Studio follows. Okay. All right, so if I go to a command line, which I happen to have right here, the first thing that we have to do is install the .NET Core global tool, and I've already done this. And what global tools are in .NET Core, it's similar to, if you're familiar with the old .NET classic, putting something into the GAC, so you can access it from anywhere. To run any of the command line tools in EF Core, we actually have to install the global tool for EF Core, and there are now tools that run similar to how it was with .NET classic of putting things into the GAC or global assembly cache. So it's .NET tool, and we want to install it globally, and then the tool is called .NET-EF. Now, I already have it installed, and that should probably type in the word install. That's what we get for, and it says it's already installed, but you're gonna have to run this command, and what I'll do is I'll copy it into this file that is coming with the show notes right here. And so we've installed the tool that we need, and now that we have the tool installed, we have a host of things that we can do with the tool. So we run .NET, which is a command line interface for all .NET Core, and we type EF. We get the magic unicorn, and then here are some of the options that we can do. So we are going to create a DB context in all of the pieces and parts, and then this will give us a good vehicle to talk about what the pieces and parts of EF Core are, why they're used, and see how they use them. Now, I have pre-baked this command, it's a little lengthy. So let me clear the screen, we'll go into here, and I'm going to do the .NET EF, so that's the EF Core command line tool. I'm gonna create a DB context, and we're done. So what has this done for us? So all of AdventureWorks is now here with different models and a DB context. And the DB context is what? Yep, so great segue, thank you, my Ed McMahon. So the DB context is like the Master Control Program if you're a Tron fan, right? It's MCP, it is the heart and soul of how Entity Framework Core works. It derives from DB context. It contains a mechanism to tie into the database to open connections and do things like that. It works very closely with the change tracker which we'll talk about very soon. It holds all the DB sets, which we'll also talk about, and then it has a relationship with a database provider. So when we installed the package, Microsoft.EntityFrameworkCore.SQL server, we were adding the SQL server data provider into our installation. So let's talk about the pieces and parts of the DB context. We first have a DB set or a whole series of them, and these are specialized collections that wrap our tables. Now, the way that I have built this and the way the scaffolding works right now in 3.x is we have table per class. So every table in the database is represented by a DB set. So we have address, address type, et cetera, et cetera. And that's the object relational mapping because you have an address object which is mapping to the address table in the database. Correct. And the mapping comes in when we look at the table itself. Now, this is just one to one, but it has a schema and a table. Now, I would typically have called this address says in the SQL server side in address. So you can see that we can map our class to a table called foo if we wanted to. It wouldn't be very good for follow-on developers, but we can. We can also change the column names. Now, these are just here because of capitalization, right? So in .NET, we like to have i lowercase d in SQL server. They tend to do i uppercase d in a case sensitive. So you can see how we're mapping columns to different columns in the database. So the column in the database is state province ID and in your object, in your class, it's called city. No, it's attributes rolled down. So let me do this, create a little space to make it more readable. Oh, there we go. Right, so SQL server is not case sensitive unless you specify that during the install. C sharp is case sensitive. In C sharp land, we like to have, we don't like to have two capitals together. Yeah, okay, I see. The scaffolding then changes that for us. We can also change column types. So we're specifying the SQL server column type of date time so that we are very specific in what type of date com because there are options in SQL server and we only have to date time in C sharp. So if you wanted to rename a column, you would just change the property name in the class. You wouldn't touch that column attribute because that has to be what's back in the database. Correct, I could call this foo. Right. All right, so let's go back into the DB context. Now, this is particularly huge because of course I picked adventure works. Right here is how we configure the DB context. Now, this is different than prior versions of NED framework but of course this episode is for people who haven't used it. A key tenant throughout all of .NET course depends the injection. So we're actually going to configure connection string and other options by injecting them into the DB context. So we have the full power of that. If we scroll down a bunch, we have this on configuring. A lot of people brand new to EF and EF core will use this. I'm gonna tell you don't. We're actually going to delete this. What the on configuring method does is it provides a fallback mechanism to say that if you haven't configured this class, then we'll go ahead and configure it for you. So what we have here is a hard coded connection string. So if you roll this into production and you forget to configure it, now you're trying to connect to your development database. So we don't like to use this. So instead of deleting it, I'll just comment it out so that people who are looking at the code can see what we were talking about. The other thing that the DB context does for us is provides a mechanism to further shape our database. So this is more of that mapping. So you saw how you can change the table names, the schema, the data type of a column, the column name. This is where we go into much more detail of how we want that database shaped. So for the address entity, and we just call the C sharp objects entities, typically, we're going to in the database, provide a comment. We're now gonna provide a unique index for the row GUID. We're also adding an index for state province ID. Here's a multi-column index. Now we can talk about whether multi-column indexes make sense or not. I didn't build this database as just an example. That's an important point though, that all of this stuff is coming out of the database. Yes, so we scaffold this from the database into our C sharp project. So on the flip side, if you need to add these things into your database and you're building your model from code when we do a migration, which is the reverse process, which we'll talk about in a later episode, this is how you would configure a database. The beauty of this whole process is what I call the Homer Simpson button, right? So if I want to get everything from the database into code, I just run the scaffold command and I have everything in there. If I need to get my project, if I'm doing true code first, I have migrations and either way with these commands, I have a new developer who starts on the project, all they have to do is run this command line interface for .net CLI command and they have everything they need. So we don't have to have a build document and all this stuff to get developers up and running. Right. All right, so that is the DB context and DB set. Let's look a little more about how the DB sets work because what I want to talk about is foreign keys and relationships. So databases and tables have foreign keys. So for example, this is the person, no, I wanted to go to person because all my examples are on person. So here's a person object. And a person object has a foreign key out to this thing called business entity. There's also a business entity context that has a foreign key back to person. So how do we represent those?  Let's look at this first. So we have this business entity, which is the one end of the many. So person is on the many end of a one to many relationship between person and business entity. So from person, we have a navigation property that goes to business entity, but we have to tell entity framework core what the foreign key value is. So we have this business entity ID field that's in the table, and that is the foreign key out to the business entity table. Now there are conventions that I don't wanna go into, but for example, based on name structure in other things, entity framework core will figure some of this stuff out for you. The problem with conventions, you have to know them. And so if I didn't have this here, entity framework core would still pick up that the business entity ID is the foreign key based on the name convention. But Robert, if you're coming and following me and trying to understand this code and you didn't know those conventions, you'd be like, well, how does this work? So I am always very specific and explicit in foreign keys on navigation properties. And thankfully the people who built the scaffolding feel the same way. Now inverse property just is another helper that says, hey, entity framework core. On the other end of this, the business entity, we have this person object right here. So that is the other end. That's the inverse property. Okay. We can also be on the one end of a one to many. And the person in this database example is at the one end of a one to many relationship between the person table and the business entity context. So what we get here is a collection of business entity contacts that we can then navigate to. So these are again referred to as navigation properties on both sides. But if you think of it in terms of SQL Server, this is like saying, select star from person, inner join a business entity contact on a business entity contact.person ID equals ID. Right, this is how we would write to SQL. And this is how we're telling entity framework core how to join those things together. We'll see examples of how this works. So these properties here are collections, right? So, so they, should they be pluraled? Yeah. So this is person.business entity contact, which then represents a collection of all the contacts for that person. You bring up a great point. I hate the naming comments, the naming conventions that they use. So let's just real quickly talk about how we do it in real life. So let's use a rename function. I would call this business entity navigation. And it's going to refactor everything. Hopefully this works without breaking the example, but I have the finished product in the oven if I need to pull it out. Okay. So let's talk about this. We had a property called business entity, which is also a class. Anytime you have a property on an object the same as a class, the same as a namespace, right? You start running into name conflicts and tele-sense tries really hard to help you out. It will shoot you in the foot if you have all these names that are the same. Likewise, this should be plural. So great point. That is there's one thing I don't like about the out-of-the-box scaffolding is you can plug in your own code to change these rules. I didn't bother to do that. That's a little complex. It's easy enough just to go in and rename things. Right. Okay. Okay. So that's the DB set. And DB set has, if we just look at the DB set, let me save all this. What does a DB set give us? It gives us, in addition to being a collection, it derives from I async enumerable, I queryable, et cetera, et cetera, but we get a bunch of methods here that help us. So we have find, let's do, where are you? Here's add range, right? So we have add, add range, update, update range, remove, remove range. So these are our crud features that we can do. So if we want to add a person, we would call context variable dot person dot add and we'll see how this works. So that's what the DB set gives us. So last thing I wanna talk about before we, we're coming up against the wall time-wise here, but the last major piece of the EF core components is the change tracker. And the change tracker is what really provides the power to using entity framework core. So anytime you add data into these DB sets and you start working with them in code, the changes are tracked and that is used to build very efficient queries. That's a core of any framework core, no pun intended. Come on, you worked on that one. All right, all right, so I had that saved up. Pun intended. Next episode, we're going to dive into code to show how all this stuff works. Great, all right. So that's a good introduction to entity framework core. Just to recap, we took an existing database, ran one line of scaffolding code after installing some global tools and we now have a class or object for all of the tables and all of the underlying relationships are represented. So at this point, we'd be ready to start working with the actual data. Correct. All right, and we will do that in part two and so we will see you next time on Visual Studio Toolbox.


Here's another arcade game I had no idea existed until recently. This one made by Capcom, and it's a Mega Man boss gauntlet. Man, where has this been all my life? It's called Mega Man Power Battle, featuring one-on-one fights with Robot Masters, with the art style, settings, and music done in the same style as Mega Man 7 for Super Nintendo, with Mega Man Power Battle being released only a few months after that game. The structure is of a one-on-one fighting game, and you can play as three different characters, Mega Man, Protoman, and Bass, and just like Monster Mahlers, this is another fighting game where you can play with two players, which is awesome. The game is divided up into three paths. The first path has you fight six Robot Masters from Mega Man 1 and 2, the second path features six robots from Mega Man 3, 4, 5, and 6, and the third path is six robots from Mega Man 7. You can select the first boss you want to fight in each, but after that the order is randomized. In the first two paths, after defeating all six Robot Masters, you unlock two more fights, the first being against the Yellow Devil, also known as the Rock Monster, before you fight two different forms of Dr. Wily. What's cool here is that the Rock Monster will take a different form depending on which path you take, and that thing is really tough to beat on both paths. In the Mega Man 7 path, you fight that goofy jack-o-lantern thing from Mega Man 7 instead, before fighting Wily. Now, on the surface, this game may look pretty easy. I mean, it's a fighting game where you shoot a projectile, and each character can charge their weapons as well, so you can keep your distance and focus on dodging it just blindly fire away. But man, oh man, this one gets really tough, especially the Mega Man 7 path. Even just the regular Robot Masters are brutal. Thankfully, this game includes one of the main mechanics that makes Mega Man fun, and that's the boss weapons. That's right, you still collect boss weapons in this game, and the same Rock Paper Scissors logic still applies here. For example, Ice Man is weak to Guts Man's weapon, Heat Man is weak to Ice Man's weapon, you get the idea, and that helps with the difficulty a little bit. And yeah, even playing with the second player, you both get the boss weapons, so that's pretty cool. Unfortunately, you can't charge the boss weapons, so keep that in mind. There are a few things I have to point out here that feel like missed opportunities. One is that there really isn't much difference between the three playable characters. Sure, base can jump slightly higher, and Proto Man is kinda sorta barely a little bit quicker, or maybe that's just my imagination. But yeah, it really doesn't matter who you pick the play as. You can press down and jump to do a slide or a dash, but while it may look like Proto Man has a shield, he doesn't, it's just cosmetic. Each character does feature a different ending, so that's a nice bonus. Another thing I should point out is that there are no platforming stages here at all. Don't get me wrong, I like the fighting game structure, but it does get a bit old after a while, and I start to miss what Mega Man does best.  On the positive side, I mean just look at this game. It looks freaking awesome. It is so dang cool to see the older bosses like Cut Man and Gemini Man and the like, all get tweaked, not just with a more polished design, but with extra frames of animation too. The backgrounds also look great with all sorts of stuff going on. They even revamped the music for each Robot Master, but there are some instances where they just use someone else's music for some reason. Like for example, Ice Man's theme is actually Freeze Man's music? It still sounds cool, but it's just kind of a weird decision. But yeah, the overall point I'm trying to make is that this game is made for Mega Man fans, and if you love the series, you'll get a huge kick out of the look and sound of this game. Even better is that there is a sequel to this one, Mega Man 2 The Power Fighters, which came out a year later, and it's really just more of the same. You get Duo as a playable character in addition to the original three, and there's more Robot Masters to fight, and this one's a bit more story-driven, with Dr. Light showing up to give you hints about which boss weapons work against which Robot Masters. So how do you play these? Both games were ported to home consoles in North America in 2004 as part of the Mega Man Anniversary Collection for PS2, GameCube, and Xbox, although they do have to be unlocked, but hey, that's better than nothing. So yeah, if you're a huge Mega Man fan and you haven't played this, well, what are you waiting for? Yeah, it's pretty limited, and there's no platforming action here, but both Mega Man Power Battle and Mega Man 2 Power Fighters are such a blast to play, especially if you're familiar with the source material and have played the older Mega Man's to death like I have. It's just fun seeing these old bosses reinvented with new sprites and new animation, and the music is awesome too. And of course, it's that much more fun with a second player. Alright, I want to thank you for watching, and I hope you have a great rest of your day!


and I suppose they're just interested in coming together to learn how they can collectively work together to create a more inclusive society for people living with sight loss. And as you say, tomorrow we're in the latter Kenny area in the library from 11am to 3pm. And it's to overcome what sort of challenges? Well, I suppose it's presently, as I said, we do have these groups scattered across the country and there's different issues being raised by the different groups depending on their local issues. It can be things as simple as engaging the county council to ensure that there's audio signals on pedestrian crossings, those kind of things. It can be linking in with local reckless collection companies to ensure that free events are pushed back in against the footpaths as much as possible. It really depends on the issues and those are the issues that are coming from the individuals themselves and we're there to bring them together and to support them to kind of execute these campaigns. I suppose, in a lot of cases too, it's about awareness and also making sure that resources go to the right place. Yes, it is. That's it and I suppose it's to continuously put the issues affecting people who are blind or vision impaired constantly at the forefront of people's minds because they might not even consider it and it's things like reminding businesses, for example, to ensure any outdoor dining areas they use are clearly cordoned off. It's things, as I said, making sure that audio signals are operational on local bus transport systems. So these are everyday occurrences but they can be serious obstacles to people when they can't navigate the virtual world or the real world when you're blind or vision impaired. And it's important to make sure that if policy is to be changed or if there's a chance to change policy that your voice is heard. Very much so and I suppose the community of people who are blind or vision impaired in the latter Kenny and Donegal area have been quite vocal in the past around the need for appropriate treatment and services to be within the county as opposed to having to go down to Sligo for treatment. And that is a constant issue and I suppose it would be great to work together with those individuals to ensure that there is a continuity of service provided locally. Because that is genuinely a real issue when you're trying to cope with treatments and assessments and having to go all the way down to Sligo, it's a long journey. So the purpose tomorrow as I said is to bring people together and identify these issues and kind of support them in trying to progress them. I know that your office in Donegal is here in Neda Kenny on the High Road but this is a good chance as well to mention that you've got two shops in the county, one in Donegal Town and one here in Neda Kenny and they're vital fund raisers and they're open through the year. That's true yes and they're part of our chain of 130 right across the country and making us the second largest retailer of charity shops. And I suppose without the charity shops we genuinely wouldn't be able to deliver our frontline services to the maximum effect. We're presently funded maybe about 60% from the state so that 40% deficit is made up from revenue raised in the shops and the different bingo initiatives that we run with yourselves and others. So I suppose it's a crucial need for us to make up that deficit. Well just to remind people that the advocacy day is on tomorrow and it's in the library in Neda Kenny and it is from 11 to 3 and I presume that if people want to find out more about the advocacy groups that they can get informed on the website. Yeah I mean to register for tomorrow you feel free to jump on to our website or you can just turn up on at the day. There's also we can also cover some of the costs associated with traveling to get there and as I said more information about the advocacy networks in general are also on our website ncdi.ie. 11 to 3 tomorrow in the library in Neda Kenny. Jim Tillsley thank you very much for joining us. Appreciate it. Thank you.


So today I'm sitting there and David is talking about this new innovative idea about transforming people in real time using the technology everybody have in their hand. I'm talking about your cell phone. I can now use your cell phone and send you frequency that helps you transform your life in real time. One of the most amazing technology companies leveraging artificial intelligent is going to be world changing class. I'm talking about beautiful amazing opportunity for us to change the lives of our family our friends and our loved ones especially they have the phone this is just a phone I'm telling amazing.


Here's the standard model with all the stable fermions. If we add the excited state versions of these fermions, we get the full view. All of space is filled with matter fields that can spawn fermion particles as waves. This includes all the leptons and the corks. These particles carry one or more charges, color charge, electromagnetic charge, and weak hypercharge. Particles with a charge fill the space around them with a force field that can spawn force particles when excited by particles that carry their charge. These are the bosons. The bosons are the force carriers or mediators of all fermion particle interactions. This model has had great success in explaining observed natural behavior at the quantum level. But there was one serious problem that had to do with the mass of the particles. One way to look at it is that it didn't explain how elementary particles acquire mass. Or, given that we know that confined energy generates mass, another way to look at the problem is that the standard model did not explain how photons, no matter how much energy they have confined, do not have mass.


11 Area Law Enforcement Personnel will pack their bags and head to Washington, D.C. to be recognized for saving an abducted five-year-old girl. The National Center for Missing and Exploited Children each year recognizes law enforcement personnel who have gone above and beyond the call of duty. Members of the Bemidji Police Department, the Minnesota Bureau of Criminal Apprehension, and a Deputy Fire Marshal will all be awarded the Hero Award for their work in rescue of a five-year-old girl in the recently concluded Jacob Kincase. This is the first time Area Law Enforcement have received this top honor, and the Bemidji Police Department credits its success to teamwork. Our local law enforcement works as an amazing team. It's not just one individual, it's not just one individual agency, but because of the teamwork that we had that day and the teamwork that we continue to have, we can have resolutions like this. The awards will be presented Tuesday, October 3rd. If you'd like to view the award ceremony, video will be available online at hero.missingkids.org. If you've enjoyed this segment of Lakeland News, please consider making a tax-deductible contribution to Lakeland Public Television.


Biofuels are renewable energy sources derived from organic matter such as plants or animals. Ethanol is one of the most popular biofuels, produced from fermenting sugars in plant material like corn or sugarcane. First generation biofuels are made from edible crops, but they cannot meet the global demand for ethanol. Second generation biofuels can be made from non-edible lignocellulosic biomass, while third and fourth generation biofuels can be made from algae and other microorganisms. Biorefining is the process of converting biomass into useful products, including biofuels. This article was authored by Richard Ahorsu, Francesca Medina, and Magda Constanti.


Good morning. I'm really excited to do this talk because it's actually the first time I can give a talk about Elixir and assume that the audience know what Elixir is. So that's really great. It's really a change in pace because usually I'm going to other conferences and I'm always giving the introductory talk, what Elixir is about, what are the language goals. So this talk is not about that. This talk is about Elixir, past and future. I think it's kind of expected to exactly talk about from where the language came because now we are close to each one, right? And then there will be a lot of, and I think there are important lessons, things that happen throughout this process that we could share that will help the community grow together. So if we want to talk about Elixir past, one thing that we could do is that we could go to Elixir timeline. So this, I got it from GitHub. So on the vertical we have the number of comets. And I think it's kind of per week and then we have the whole year of 2011 in there. And the first commit was right at the beginning of 2011. It was like 9th January or something like that. But I actually want to rewind a little bit more. I want to go a little bit back before 2011. But not too much. It's not about my birth or anything like that. So I'm going back to 2005. And I choose this article, The Free Lunch is Over, because it was about this time that I was personally starting to get aware of the changes that are happening. So The Free Lunch is Over is a paper from Herb Sutter. And basically what he's referring to Free Lunch is not about this conference. They still have Free Lunch, so don't worry. But basically what he was talking about is that throughout the previous two decades or even more, you wrote Sutter. And then you could just wait like two years. And your Sutter would run twice faster. That was amazing, right? You didn't need to do anything. Just wait. And damn, it's faster. But when we heard this story already a couple times now, it's almost 10 years since that article, that our machines are not getting any faster now in terms of we don't have machines with 8 gigahertz, the CPUs. And we're starting to have more and more cores. So if we actually want to leverage all the capacity of the machine, it's not just waiting anymore. We need to change the way we write Sutter. So The Free Lunch is Over. And then other important things happened. For example, in 2007, we had the Programming Airlang book published by Pragmatic Programmers by Joe Armstrong, which is one of the creators of the language. And I have it here because it was when I first started to hear about Airlang. It brought Airlang into other communities. And in particular, it brought it to communities I was involved with. And then another event that happened in these timelines that in 2009, we had a Rails release that said that Rails was thread safe. And the reason why they did that is the Rails cartoon they did that is because if you were around Rails community at that time, there was a pressure at that time on the Rails cartoon that we need to make Rails thread safe, exactly because Rails developers wanted to leverage the ability of using all the cores on the machine and use the machine efficiently. And one year later, I joined the Rails cartoon. And I actually found out that Rails was not really thread safe. That's why I put in between quotes, because I was constantly fixing bugs. And there was actually many reasons not going to go into the tales that Rails was not actually thread safe. So I was working on fixing those bugs. And it was kind of frustrating. It was kind of hard. And it was about that time that I started to put the pieces together. So if I'm doing this work and it feels hard, it feels frustrating, but I know that concurrency is becoming more and more important. And I know that there are languages, like Erlang and many other languages, that solve this concurrency well. I need to do something. I don't want to, we need to see ways that I can make this situation better. And then I started to study, learn, play with other languages. And for all this process, so I was reading many books, trying to get ideas from different places, I came, I found this book, Seven Languages in Seven Weeks, by Bruce, who will be speaking later today. And I was actually familiar with the majority of the language in the book. But the thing that really stood out in that book is that it got language like Haskell, Scala, Clojure, Erlang, and a few other more. And it was talking about those languages and also their concurrency models. But it was, to me, the book really put them in separate places and had, OK, so these advantages of the approach followed by this language, here are the disadvantages, here are the tradeoffs. And after I read the book, what really stood out was the Erlang Brutal Machine. I was saying, I want to write software that's going to run on this runtime, on this ecosystem. And so that's the lesson I got from it. And the way I like to say is that I liked it. So I went, bought more books on Erlang. I actually also really liked Clojure after I read the book. So I went to study Clojure too. It kind of shows later in the language some of our features. And the way I like to say about when I was studying Erlang, writing software in Erlang now, trying to put some things in production, is that I liked everything I saw, but I hated the things I didn't see. And at first, the things I didn't see, it was a little bit unclear. But I decided, OK, so I want to try my own language, just for fun, to see if I can get some of those ideas, some of those things that I'm missing, if I can get it there and see how it's going to play out. So that's how I got the first commit. And it was quite active. You can see the first four months into April, it was actually very active development. OK? And so here's the interesting thing. So I think very few people know about this, probably two or three, is, so here's how Elixir was as of April 2011. You could actually define objects with something called death object. It had a prototype-based object model, like JavaScript or self. And because I wanted, one of the things that I was missing was metaprogramming. I actually had metaprogramming with eval everywhere, or just passing strings and evaluating them. Like, say it's evil, evalware. So because of how it was designed, it was like slow, extremely slow, because every time we wanted to call any function, we basically had to go through the whole prototype chain. And I was even able to broke some of our link features, like hot code swapping, the ability to upgrade code live in production. And so this was my spike, right? This was the end result of formal work. And then you can see here that after April, there was no more commits, right? Because I was in the Depression Valley. I was looking at my code and say, well, this sucks. It's really horrible, formal work. It's not good. And then there was a period of one last hope where I thought, well, I can make this work. And then you can see that, nope, I cannot. But the good things that I knew, it sucked, right? That it was not good. And the reason for that is because this is what I built, right? I was basically trying to get the ideas I was familiar with and just bring them over and try to slam them whatever way I could, right? So, oh, I guess I can fit it here, bam, right? Just try to make those things fit. And that's why we got a bad result, right? So, but the good thing is that when I was doing this process, I was actually learning the shapes, right? I was smashing, and then I noticed that, well, this doesn't work quite expect, right? And I was learning the shapes, and maybe, oh, maybe there could be something else that I can put here. And it was from this process that we came up with the language goals, OK? So it was from this process that I stopped and I said, OK, I want to have, I'm doing evolve strings. Why do I want that? Oh, I want it because it's metaprogramming. I can write code that writes code. And why do I want that? Well, because it can make me more productive, right? I'm having code that's doing work for me, that's generating code, OK? So I think productivity is one of the language goals. That sounds reasonable. So why do I want objects? It's because I like to design myself with objects, or there is one property from objects that I'm really interested in. And then I found out that I was actually interested in polymorphism. I really like the idea of being able to say, you can give me any object. That's what we do in object-oriented languages, right? You can give me any object. And as long as it implements those methods or those contracts, OK, it's going to work just fine. So OK, I want polymorphism. And why do I want polymorphism? Oh, because I can write extensible software, right? I can write a software that can work with huge variety of objects or data structures. And it's going to be extensible. And then I came out with the goal of compatibility because it doesn't make sense to build a language in Jardin Virtual Machine if I'm going to make it extremely slow, or I'm going to break important features provided by the environment and the ecosystem. So what happens is that after I had those goals, I had a tinkering period. And this is the period that because I would not be able to sit on a desk and say, OK, I'm going to design this thing now and it will be ready in eight hours. So you have to read something, and then you're excused. So it's the tinkering period where you do some research, and then you completely let go of the subject. You don't think about it. And then you're reading something, and then that idea comes back up and say, oh, this could lead us somewhere, right? And then you do a prototype. And then it doesn't work, but it's OK. You just let it go. You go to sleep. A lot of rest is extremely important. And so I had all this tinkering period. And then we see a small spike in October. And this is where we had Lago Lang. Basically, it was just a specification. It was not a language that was implemented. I was traveling. I was visiting a friend, a hood of cats. And then I was telling him what I was thinking about a language design. And then we sat down and tried to do a couple of things together and experiment with a couple ideas. And what we wrote as Lago Lang came to be the basis, the foundation for Alex here. So basically, what happened with Lago Lang is that the conversation I was having with Yehuda was basically, OK, I want to have a language where I can do metaprogramming. And I found out that macros are extremely flexible. And I would like to play with this idea of having macros in a language. And those macros, they are Lisp macros. And because they are Lisp macros, we see them in Lisp language. But how can I have the question of how can I combine Lisp macros with a natural syntax? And even after that, how can I guarantee explicitness? So how can I make metaprogramming? It can be very flexible. And because it's flexible, we want it to make as explicit as possible. So the idea that we came out was basically, and you can see it's the foundation for Alex here, that we came up with an extremely regular syntax. So everything was a function call. So add one and two. And so we have the function call, and below we have the representation of that function call. So we have function calls and things that are literals, like numbers, right? One and two, they are literals. And OK, and then everything was written in this way, like think everything. If you defined that module, you would have parenthesis in there, parenthesis in if, everything. You had to have parenthesis everywhere. And then we wrote the call and say, OK, the syntax is extremely regular, right? The representation is extremely regular. But it needs to look more natural. So what can we do? So OK, let's make parenthesis optional, right? Because now I can define a module without having parenthesis around. I can call if without having parenthesis around, case and so on, OK? And you can see that we added this syntax sugar, right? But the representation for the code stays the same. It didn't change. So in the next steps, like OK, let's add operators, because I don't want to be writing them in the prefix notation. So we have operators in the language, but the representation doesn't change, right? This is to the function name, which in this case is the operator plus, right? And the arguments, which is one and two. So after we had this foundation, right, we could think about metaprogramming. And that's why today we're able to write a code like this. I can have quoted expressions, right? That returns me the code representation. And I can basically generate all sorts of things in there. And here we can already start to see some of the explicitness, because quote and unquote is very explicit. If you ever use some list, you actually quote and unquote. And it has shortcut syntax, right? Sometimes it's a back tick, sometimes a comma, just one character. And I said, no, I want to have it explicit, right? I want to know exactly where the quote starts. I want to know exactly where I'm quoting to not send the underlying message that macros are flexible. And because of that, we need to use them very responsibly. I don't want to have a shortcut syntax to send a message that you just type that on a whim and let it go. So it needs to be explicit. And then we took it even further, right? So now every time you want to use a macro from another module, you need to require that module before. And when you require the modules, always going to be visible in that same context. So we'll never have a way, we'll never have a way in a language where you can actually inject macros globally. You cannot say you could go to your mixed file and say, OK, I want to have this macro that's going to run on all modules. We had a discussion for that. We are never going to have that. They'll always be explicit. I can always see the require or a use in that module or in the import. I can always see that I am depending on that particular module that provides macros. And I think we are able to reach a very reasonable set of trade-offs. I like to contrast this, for example, with parse transforms that we have in Erlang, for example. Because in Erlang, the parse transforms, you can, for example, inject them globally. You can go through the command line and say, when I'm compiling all this code here, I wanted to go through this parse transform. And the parse transform actually receives the code of the whole module. So after you add a parse transform, you don't know where it's working, what part of our code it's changing. And then there is a explicit, and the macro can only change its argument. It cannot change the surrounding environment. So we've got a very good set of trade-offs. And I was very happy with the result. And that's why we have this spike. So wait, now I think we define the basic syntax. And now I think it will work. And the nice thing is that since then, we never had another depression valley. So this is from 2012 forward. We probably just have now all committers are ethylxerconf valleys. So it's a really good valley to have. And then, so code-wise, we are still working actively on the language. And we can see from this graph, but not code-wise. A bunch of interesting happens since 2011. So for example, in January 2012, right after that spike, that spike happened on my holidays mostly, the end of their holidays. So that's the advantage of living in Poland, because the winter, at the end, they are so cold that you don't want to live home. And then you can cold a lot. So after that spike, I went to my company co-founders, and I did a presentation to tell them, you know, you should let me work on this project full-time. And they bought it, right? And yes, the biggest prank I ever pulled. It's less than two years and a half already. So but basically what I said that, what I did in this presentation, is that there was, in my opinion, just one language that had everything I was planning and I could see in Alex here. And this language was closure, basically, because for good or for worse, closure is a dynamic language. It focus on productivity. It focus on extensibility. And it focus on concurrency. So those are the four things, right? And it's exactly Alex here, right? Alex here is a dynamic language. It focus on productivity, extensibility, and concurrency. So I told them we have just one language going into this action. And it's running on the Java virtual machine. So we've got to have another option that works on, not on the Java virtual machine, in other places, right? And the other virtual machine is an excellent candidate for that. So that's basically what I told them. And they said, yeah, definitely. Let's try this, right? So the company came behind the project. We did the beautiful logo. Our designer did the logo. I got some WordPress templates and did the website. And then we launched it. And it's the website we had today. We improved with time. But it's basically the foundation for our website. And still that year, it wasn't we launched the first Alex here version, right? So we got about May 2012, Alex here is 0.5. And then in September 2012, I did the first Alex here presentation at the Emerge Language Camp that happens in Strangeloop. And it was really good, because at the beginning of the year, I set that as a goal. I wanted to take the language to some place. And then I would go there and talk about it and get some feedback. And actually, there was someone that heard about Alex here in this event from me, OK? Yes, and it's really nice. Did someone can remember watching this presentation or hearing about Alex here from back then, OK? Yeah, so it's really cool, because I did the presentation there, and I got really good feedback. And then I was, OK, I'm going, this is working well. And then in the next year, two really important entries in the timeline, which is basically in May 2013, Dave Thomas announced programming Alex here. And right after, Simon St. Lawrence, he announced introducing Alex here by O'Reilly. And this was really big, because it was at that point that to me, the language, it gained critical mass in the literal meaning of the word, which is there was enough happening in the community and around to justify the language itself, OK? Because up to that point, we were already as a company with, I guess at the time, was between 20 and 30 employees. We were investing already in this project for a year and a half, right? It's a huge investment. And I was uncertain, right? Is this really going to go somewhere, right? It's one year and a half of my work, and it may not go anywhere. But when I saw that there were people like Dave and Simon and that they were betting on the language and they were writing about it, OK? I said, yes, this is working, right? And then we had, since then, a lot more books were announced. We get screencasts now, later, a little bit later, Eric joined the language and is helping build the language, too. We had a whole track at AirLink Factory. We are having Elixir Conf now. So it's going really, really well, right? And the nice thing is that after all this time, OK, we are two years after the first release at 0.5, two years and a little bit. The language goals, they didn't change. The language goals, they are exactly the same. We kind of change what we use to represent the language goals. So now when we talk about productivity, I don't like, I say now that productivity is first class documentation, for example, because you're not going to be productive if you are in an environment where nothing is documented, OK? So that's why documentation in Elixir is easy to read. It's easy to access, easy to write, because we want an ecosystem that's really focused on documentation because that brings productivity at the end of the day, OK? It's a very good tooling, right? I want to install Elixir and be ready to start working on my project right now. I don't want to have extra steps. Good test framework, good interactive Elixir shell, OK? And now we have Hex packages, Eric did the presentation, which are extremely important for productivity. I want to depend on something. I just add a tuple with two elements in your mix file and run a comment, and it is there, right? You are ready to work. So extensibility, I move with macros from productivity to extensibility because I think having macros in productivity can kind of send the wrong message that macros are to remove code duplication. And that's not what they are about. Actually, if you are thinking on code duplication, probably the best solution to that is a function. You don't need macros to reduce code duplication, OK? So macros is about extending the language. It's getting the language from and bringing it, extending it to a particular domain, right? That the language is not aware at first. Like testing is a good example, or Acto, which is a tool that can communicate with databases. It's basically extending the language to domains and being able to write our own data types and extend those data types with protocols, right? Which is how we have polymorphism. And compatibility, right? So after that shock, after that LXDA that had the object and things are really, really slow, at first I was like, OK, we don't touch things related to the virtual machine, right? That's sacred. We're not going to touch that for now. But with time, we got the maturity to say, you know, we had the concurrency there, we had the distribution, but we're not only going to embrace it, we're going to extend it, OK? So the goals are the same, but we kind of evolved in that areas and came up with our own ideas to represent that goal as a community. So today, where are we today, right? So that was the past, where are we today? We are at Alexer Conf. The current version is 0.14.3. And it was a very important release because it said there are no more planned backwards incompatibilities. But the keyword here is planned, OK? Because we may have unplanned backwards incompatibilities. And we kind of, I think, in the next release, are going to have two small deprecations, but they are quite small. And the next release, we plan to be exactly Alexerio 0.15 because it's going to introduce the logger. So today, when you are building stuff with OTP using the GIL server, sorry, using GIL server in an event when you create a process and it crashes, it prints everything in Erlang terms, right? So with the logger, we are going to have a very good logging API. And not only that, all the reports that come from Erlang, they'll be translated into Alexerio. And we have a couple of penny issues left that we'll probably fix through 0.15.0, 0.15.1. They are minor ones. And then we'll go to 1.0, right? My current time frame is that we have 1.0 now in August, which me now is the best time to jump in, right? We are almost there, OK? So that was the best. And then today, so let's talk about the future, OK? And this future is exciting because it's the no future. It's not about 1.0 because everything that had to be discussed about 1.0, we already did, right? We already, we have the Alexer core manilins where we discussed the language development and for a year or even more, the majority of the language features, they are discussed with exhaustion in there, OK? So everything is planted. There is nothing really unknown to 1.0, OK? Just 1.0, it's just about getting there. So this is the unknown one. There are about features that may be in Alexerio in a month, in a year, in five years, or never, OK? And the nice thing about this unknown future is that all the progress and research that happens into Erlang, we can use it, right? We'll get it for free. So I want to start with the Erlang part just to give an idea of what is happening there and things that we could explore. And the interesting thing is that we don't need to necessarily wait for the future because there are a lot of interesting features in there today that we don't use fully. For example, tracing, OK? So Erlang provides two functions called Erlang Trace and Erlang Trace Pattern. And the thing is that when you are in production, we have a bunch of processes, right? Exchanging and sending messages to each other. And if something is going wrong and you kind of want to see what is happening there, we can't use debugging tools in the traditional sense because as soon as you pause a process to see what is happening there, right? The whole road around it continues running. So we can have other processes sending messages. But because you paused it, it's not going to get a reply. So this process is going to crash. We can make other things crash. And then by the time you get to see what is happening in this process, the whole environment in the runtime changed completely. So what we do is that we do tracing, right? And tracing Erlang is really, really powerful because you can trace function calls. You can trace things related to the process life cycle, which process died, which process was created, how the processes are interacting with each other. So it's a really powerful tool. And I think that we can explore this in a lot of wonderful ways. And there is already a tool that is starting to do that, which is one called DBG by James. So I recommend everyone to try it out because not that you reach one node and we aim more towards a fully software production, those tools are going to be very, very important. And I'm confident we can come up with a very interesting ways of exploring those tracing mechanisms. Okay, so this is a tool that it's there for a while, but we haven't used it fully yet. But there are things that are there in Erlang and we use it and maybe we should not. So for example, IX, IX is an interactive shell, okay? And don't get me wrong, IX is fantastic, right? They have fantastic helpers. We can do remote shells. We have Pry, which is useful for debugging in development and during testing and a bunch of other stuff. We can access the documentation and so on. But IX is also, it uses Emacs mapping and it's poorly customizable. So for example, and that's because it runs on top of the DLing shell mechanisms, okay? Which is great because it could bootstrap really, really fast, right? I can just use it and then we can have a very good tool really, really fast. But it has its advantages too. So for example, if I type to get the documentation of a module, it's going to print the whole thing and then I need to scroll back up. I would like to have a page, right? Or it's navigate the documentation. Maybe if we, depending on how we're doing, we could even have links working between the documentation. It could be a lot of interesting things. Something else is that there are some times that because you're using the DLing shell, it kind of leaks. So for example, if you hit Ctrl G or Ctrl C, you're going to get different menus and you need to write everything there in DLing terms, okay? I would like to be able to write and see those things in Alexa terms, okay? So this is something we could explore and we could explore in a lot of different ways. Maybe one way to explore is to extend the shell that comes with our DLing and OTP to allow us to customize those books, right? And to give us a little bit more flexibility. If we say that the shell is so important for our daily workflow, it doesn't make sense to be constrained to one editor, right? So we should have maybe customizable mappings and things like that. So it's a really nice place that we could explore and increase even more the productivity because they're going to make the tooling better. And so those are the things that are there and we can explore and change, but there's a lot of interesting research coming from Erlang. My favorite is a tool called Conqueror, okay? Already heard of Conqueror, okay? So it's amazing because imagine this, imagine you have like two processes, okay? So you have a client and you have a key value server that receives a key that you store and then you can read this later. So you can send in a message, okay? I want to put this key and this value and then later you can say, oh, I want to get that key I stored and it's going to return the key to you, okay? So this we write this code today and it's fine and then you put it in production and then you say, wait, this key value server is actually a bottleneck in production because there's a lot of people reading all the time and then, okay, I want to do something and then you say, you know what I'm going to do? I'm going to use a ETS table, right? So now every time I want to write a key, I'm going to send it to the server because I still want to serialize the writes through the server and then the server writes to the table. But now every time I want to read, okay, I'm going to read it directly from the table and then you do this optimization, right? And then you put it into production and your code is going to fail, right? Things are not working as expected and the reason for that is because you're not acknowledging the writes, right? So what could happen is that you're expecting exactly this case to happen, you write and then you read, but the key value server, it could be busy doing other stuff, okay, and then the write's going to happen just after the read. So now when you read stuff, it's going to crash.  Okay, it doesn't make sense. So what Conqueror does is that instead of you waiting these to happen in production, Conqueror can actually find this stuff during development stage, okay? So basically what Conqueror is, is systematic concurrency testing. Basically what it does is that every time you have communication or points where you're sharing, kind of sharing state like ETS, you, it instruments those points and it generates all possible combinations this code could execute systematically, okay? And then that's how it's able to tell you that wait, this flow can happen too and the result you expect is not going to happen in this inter-living, in this combination of events. So you can check more about Conqueror, right? There is this website and the nice things that we could have it in Alexia. So one of the ways we could benefit from Conqueror in Alexia is that every time something goes wrong, it prints a report, so we could start by having reports written in Alexia terms, okay? But we could also think of X-Unit integration. You could think that we could write a test and then you just put on top of it tag Conqueror, right? And when you do that, it's going to automatically run Conqueror in that particular test and that would be really, really, really awesome because we can do more systematic tests, concurrency tests in our software, okay? And there are a bunch of other initiatives in inter-living, right, so you can, and Francesco and Robert, they are here, they're going to speak after and then if you want to know more about the things, you can ask them. Robert is involved in another very interesting project which is SD Erlang, Scalable Distributed Erlang. So it's always a good place to explore, okay? So that's a very exciting future already, right? But we are also going to write our own future, right? What we want. And to show some ideas, so I have some ideas but there are just ideas, okay? Of what we can do, what we can explore. For example, we could have discriminated unions in the language. So imagine that you're implementing a calculator, right? And then you type and then the calculator put one plus two and then you need to parse that output and then at some point to have those tokens, right? I have the token plus with the left number and the right number. I have the minus token with the left, right and the left number and the right number and so on. And that's when we do the calculation, right? The, of those operators that we have. And imagine that there are a couple other places like two workplaces where you need to repeat and match in those exactly same tokens, right? You need to match on them. So what happens is that in the future we want to add exponentiation, for example. What's going to happen here is that when you add exponentiation, you can add to one but forget to add it in the other places where you're matching, right? So you have a bug and it would be nice if the language could actually tell you, hey, you forgot to check this case, right? That's what discriminated unions are about. You could define a union called the calculator operators and then you have plus that receives after right and so you'll define exactly, right? What you want to match and what is the representation of those things that you want to match and now when we go back to that code every time you want to match you can match it like this matching on the discriminated union. So now in the future if you want to add a new operator you just add it to the discriminated union and then you compile our code and it's going to say you forgot to handle this case here, you forgot to handle this case here and you forgot to handle this case here. And the nice thing is that if you have like complex patterns that suppose you want to match that on all of them that left and right there are also integers, right?  And the nice thing about this is that because the language was built with macros and much of the quality language is built with macros itself, we don't need to wait, right? We don't need to wait about this being implemented in the language. We could go home and write this code today. There is no need to fork the language or anything, it can start as a separate project. So I like to say that from now on, right? The language development is decentralized, okay? Because we can all play and explore if the ideas we want, okay? And we don't need to wait for anything to happen. The foundation is there. For example, another interesting idea is fork comprehensions, we could extend them more. So the way fork comprehensions works today, so here I am saying for every user in users, right? If the user has aged more than 18, I want to get the favorite drinks for that user and return a list, right? With those stopos containing the username and the favorite drink, okay? So this is a very powerful construct. And the way comprehensions work is that we have generators. So this one has two generators, okay? And we have filters, that's filter on what you are iterating, okay? And this is how it works today. And it's, so we had old comprehensions style. The fork is relatively new. And the reason we did that is because we really want to make it powerful. So the users can be any innumerable, right? So you can pass sets there. You can pass lists, dictionaries, and they would all work. You can all, you can all, you can comprehend them, okay? And when we did this new fork comprehension style, we also added a new key, which is into. So let's suppose that to you, this is a set, right? The user will be its favorite drinks. So it can actually say, I want to get this result and put into a set. And you're going to get a set out of it. And this works today, okay? So basically say that everything that you can pass in into, you can pass anything you want as long as a collectable. So a generator is kind of the art of taking values out of things while the collectable is about collecting those values and put it into somewhere. And you can pass files in there. So you can have loops that are right into files. So for example, you can pass you can do into the standard output. And then you have strings coming from the block, right? So in this case, for every liner say, this user likes this drink, okay? And it's printing every time something new comes or every time something is there into the standard output, okay? So this is basically how it works today, but as I said, we can extend, we can take the next level. So for example, we could have ordering, okay? So I actually want to order my results by the user age. And this is expressive because you can see that I'm ordering by age, but the age is not in the final result. Try to imagine how you would write this code if age, if you didn't have this construct, right? You would have to put age in the result and then you would need to sort and then we need to take age off the result. So it adds more steps. And here it's expressive and we can actually optimize and try to figure out the best way of doing this operation. And since I already had order by, well, not group by two, right? It's the next logical step into this. So we could group by the drinks, okay? And this is nothing really new, okay? We can look into, it reminds everyone of SQL, right? Which is a query language with exactly what we are doing here. We're crying the data structures and trying to get information out of it. But we have a bunch of interesting implementations of the same ideas in other languages. So there is a paper from Haskell called Comprehensive Comprehensions that explores the same ideas. Common Lisp has a loop macro that can do all sorts of stuff, like the documentation is like five to 10 pages, really, of all the possible combinations of what you can do. We don't need to go that crazy, but it shows the different ways to approach and there is a more recent package from Common Lisp called Duplas, which again, same ideas, right? So, and again, we don't need to wait, right? We could go home and let's build this new comprehension and see how those new ideas work. Are they really useful? And so you could go home today and say, okay, I'm going to implement my for comprehension and then we'll start to write this code and then figure out that you cannot actually write this. Because in Anexier, we don't have variable arguments. You cannot have a macro that receives whatever number of arguments because here we can have like, or two generators or you can have 10 generators, right? You can have one filter, you can have 10 filters. So this doesn't work, but there is an easy cheat, which is basically to remove the my underscore four. We can just take the underscore out and write it like this and now it works. And the reason for that is because this code is the same as this, right? So now what you're doing is that you're calling my with just one argument, which is the whole for expression and you can transform it to something else and then you can transform it into the actual code that's going to execute, okay? And if we explore this idea, right? If you go into this direction, there are a lot of interesting concepts that we can do. We can do a stream for today. Every time we have a comprehension, the results, they come right away, but it could have a comprehension that returns a stream and the comprehension is going to execute just when you want to actually get the values or even more interesting, it could have a parallel for, right? It's basically you can say, so in this case for every user and if the user is an investor, I want to fetch its profile, okay? And the fetch can be a long operation, right? You can need to reach another service. So this is just going to create the process for you and do everything in parallel and give you the result back. And then there are many different things you can explore if you go into this direction, right? And that's when we are, so this remembers us of the compatibility goal because you're going to be using the foundation for concurrency and distribution of virtual machine to explore those very powerful concepts, okay? And then we can talk about should this unbound, like if I have 100 users, should I create 100 processes or should I have a pool of processes that is asking for users to calculate the profile? How can I have pipelines of data, right? Just going through and calculating things in parallel, okay? And I could go on when original world is talked was almost two hours of talk because I just put all the ideas that came to my mind. But that's not the message here, okay? The message is that everyone here, right? You have your own ideas too of what things you would like to see in the language or what you would like to see in the ecosystem, your own projects, okay? And this is great and that's exactly the idea, right? We are going to decentralize now the language development, the system development, the foundation is there. And the message here is that because we are new as a community, we are going to build a lot of those, okay? We are going to try a lot to bring the ideas you're most familiar with, okay? And you're just going to try to smash that, right? But that's fine as long as you remember that we are doing this to fill the shapes, right? It's a learning process and we need to be careful in this process, right? To not bring, so we need to be careful to bring the good ideas, to find the good ideas, right? But leave the bad ideas out. And for that, right, we need a tinkering period, okay? So let's not forget about this period where we do research and then we completely let it go of the problem because it's not banging your head against the desk that are going to come up with a solution, okay? So there's the sleep, there's the fun parts, there are the prototypes, okay? So we need the tinkering. And yeah, so happy tinkering for everyone. Thank you. I noticed you didn't reference Link from C-Sharp, which seems really similar to the comprehension syntax you propose. In Link, for Link, C-Sharp lets you do it both for SQL, XML, and datasets, which I guess would just be innumerable. So if we had the new comprehension of syntax, would it make sense to change or either wrap Ecto syntax to use the comprehension syntax instead? So the thing about Link, and I discuss a lot with Eric when we were working on the Ecto project, a lot of the criticism against Link is that you cannot actually write a query that is going to be good for data structures and good for going to the database. There will always be semantic issues and you can write a query that's going to be very fast in one extremity is low in the other and vice versa. So where we wrote Ecto, which is about writing cross-interactive to the database, we explicitly said we are not going to have a way to work with data structures. And the reason I mentioned the Haskell comprehensive comprehensions paper is because a lot of people that worked, so Microsoft, they have fantastic research, right? Fantastic research team. And a lot of people that work on the Link, they got the idea from Link and said, okay, how can we add this back to Haskell, for example? So that is the inspiration, is to do the same process they did of taking the ideas out of Link and put into the language. Thank you. No, I just wanted to make Jim run back and forth up the room. So every good community needs a great origin story and we got 90% of it here. What we need is the name. Why is the name? Where'd it come from? Oh, I have absolutely no idea. I have absolutely no idea. Really, it's, yeah, it just appeared and then, well, sounds good. I'm sorry. Yeah. It's easier to Google than Go, that's for sure. One of the things that I always struggle with is we're all good at using and consuming the things that you put so many blood, sweat, and tears into. How can we help grow the community? And I know it's, there are a lot of things that can be done, but is there one place where we can go that it says, here's where we need help. Documentation, anything to get involved and try to push it forward. So, yeah, so this is exactly how, one of the ways you can help, if you're thinking about code, right, is exactly go put values on your ideas, explore it. And if you're always feel a little bit lost, remember the language goes, right, while you're focusing on. So if I start a new project, remember that documentation is extremely important, right? And that's one of the things, remember that macros, they're not your API, so they are flexible, right? They are good to extend the domain, but they're not their API, they're just an expression level. And then we can build the ecosystem around these ideas and I think are going to get a very powerful result of our very flexible, expressive community, a fun community. So that's one of the ways to help. And then there are all the other ways that as you said, right, like code documentation. So how can we make the documentation more accessible? So one of the challenges that, if you go to functional programming language conferences, right, one of the challenges is that, how can we get people to think functionally? And so these there are, we can, how, okay. Yes, we, this is something that we need to answer to, right, it's our problem too. Okay, so we can think about all those ways, how can we think concretely, concretely, functionally? So let's write materials on that, have meetups and all the other ways that we can help the community grow, make more accessible materials and so on. So yeah, at this point, the language itself, it's really, we are getting 1.0 and it's exactly the point that the, because 1.0 can mean a lot of things, right? It can mean, okay, disease, we're not going to change this, but for us 1.0 is like, we got the core to really grow, right? And yeah, so that's how we can spread. This is kind of a question for you and Eric both. Where do you guys see Ecto going? Do you see adding like support for React and other databases and what do you see in the future for Ecto? So yeah, we want to add support for other, other adapters. The things that right now we are both focused strongly on Elixir and Erich Nohex, which are more, are higher in the priority list. But my plan is exactly after 1.0 is out, I can focus more on those tools that I really would like to, we just, we don't have the time right now. And then we hope we can bring Ecto to 1.0, not too far from now. Hey, so I followed the mailing list. It seems to be a little high traffic lately. And then sometimes I hang out on IRC in the ElixirLang channel. I'm wondering if it's time to maybe open up a forum, like discourse or something like that. So it's easier for people to kind of follow with the language and its developments at their own pace. Definitely, I'm not familiar with discourse, but just go to the mailing list that we have there and spin the idea around and let's see because I really not familiar to give an answer what is best or worse, but the point is exactly to, if everyone says it's the best way to consume the information, I don't care for what means, as long as everyone's consuming it in a very good way. Hi, I'm curious about what you think are some of the major parts of the OTP that have not been wrapped for Elixir yet and maybe should be. Oh, that's a good question. So there's this tracing thing that we really could explore. There are releases which already have a tool that is being, yeah. So there's already, and there are releases and there is a tool which everyone should use and try. So we still talk about using it to build RPM packages. And yeah, there's really a lot of stuff. And so for example, testing coverage. So today, so it was one of my original slides. For example, today, if you run mixed test cover, it's going to generate a coverage report, but the HTML for that was probably written in the 80s. So we can really purify and we can probably actually do this contribution back to OTP and have nice reports with consolidated pages. So there's really a lot of things in there that we can explore and try to integrate more. And it also goes on cases per need, right? So I've heard some people that are actually using the telecommunication specific stuff that comes with OTP. And when you have this need, you can go there and learn it and try to expose it to different way in elixir and so on. So yeah, many, many options. I don't have a concrete answer. On the topic of coverage, I just discovered last week that there's bindings for coveralls.io. And so coveralls.io is a website where it's free for open source. So I would cover most of our stuff. Okay. Where it'll, it has mixed tasks for coverage and there'll be, there's HTML reports that posted to coveralls.io that are very nice because I use coveralls for my Ruby projects. Oh, that's nice to hear. It's not built in and it's built on top of the cover library from Erlang, but the reports are very nice. So that could be an alternative to a better reports that we develop. Yeah. Thank you. I recently read through an interview with one of the main developers on Rust. I know you know Steve. But he was talking about one of the things that excited him the most about Rust was the fact that it made use of a lot of fairly recent academic research into language theory. And I think you've done an amazing job at making Elixir a really modern language with really modern features. But Erlang itself, I'm not as familiar with as I am with Elixir. And I know that Erlang dates back to I believe the 80s when they developed it originally and it was open source later. But do you think that going forward Elixir will be able to take advantage of as many things as you would like given the fact that it's still very tightly coupled to some of the things that Erlang itself chooses to implement or not implement? So there could be some constraints. So for example, when we're talking about Parallel 4, there are some Parallel-ize algorithms that would benefit of not copying the data, for example. But I don't think it's... So it could constrain in that way, but there are alternatives. And I would, 99% of the case is to take the alternative and live with the constraints I have today than the opposite, right? To be able to escape the constraints and everything that it guarantees just because I want that 1% to do that. And so, and yes, and there is a bunch of, that's what I said about Erlang. There's a bunch of interesting research happening in there too. It's interesting also because we have RIAC, the database that runs on the Erlang return machine as well. And they do a bunch of, they are very close to, so we have the recall event with RIAC. There's a bunch of distributed research happening in there as well, which I believe that, so I have slides for that in my thought, that's why it was almost two hours long, but that we could actually use on our workflows as well, incorporate some of that research nicely into Elixir, right, exactly because of the expressivity that we can have in the language. Cool, thank you. You're welcome. All right, that's all the time we have. Let's give him a big hand. Thank you.


Today, I have the pleasure of speaking to Dustin Angelo from Anaconda Mining. How are you? I'm good. How are you doing, Tracy? Investor Intel audience. Everyone says to me they're looking for gold projects that are actually, you're actually producing. You have been for five years. Is that correct? That's correct. And you're out of debt now. Is that correct? We've been out of debt for over three years now. So we have a company here who's producing gold, and now it looks like with your latest resource update, we're looking at extending your mine production 10 years Is that correct? Well, that's the goal right now. We've got off to a good start with the resource estimate on Stalker Tite. It's my understanding that this resource update, which conforms to the NI-43101 standards, was very exciting on a number of fronts. Can you kind of give us more of a detailed update on this? Sure. You know, one of the most important things that we've been facing and one of the biggest challenges for Anaconda is the fact that we have our current pit, the pinecone pit, that has got a life of about three years left on it as we know it today. And the challenge of the market is the fact that they think that the project itself is going to wrap up in three years. But we feel as a company that the life of the project is much longer. We have a lot of property, a lot of exploration potential. And the Stalker Tite deposit, which we just announced the resource on, is the first step to demonstrate the fact that there is a longer life to the project. Of course, Anaconda has been exceeding expectations ever since you came on board. You've been achieving benchmarks to understand you've increased property claims ten times, tenfold. That's correct. Okay, so obviously there's a lot of evidence to support that you're going to achieve these goals. So for our audience that may not understand and understand the Point Roos project in Newfoundland, can you give us a bit of an overview? Sure. So the Point Roos project, we control the entire Ming's Bight Peninsula, which is on the north-central part of the island in the Bavorite Mining District. It's a historical mining district, goes back over a hundred years. We control 6,300 hectares of property, the entire peninsula. There's about 20 kilometers of strike length for gold trend. So there's a lot of prospectivity. There's five deposits that we control right now and then a lot of prospects and showings. So it's been explored in the past, but it's never been under one umbrella, all under one company. We've consolidated the whole area not only from a geographic perspective, but from a data information perspective. So we feel like we're in the best position right now to optimize the ability to find more gold on the peninsula and we're targeting a pretty lofty goal of trying to find about a million ounces. Well, speaking of efficiency and optimization, I know you've done a lot of work with automation in your mill. Including drones. Did I read that correctly? Yes, yes. Well, we use drones for surveying and it helps to more efficiently for the miners to survey the pits and all that. But the automation in the mill is a project that's been going on for a couple months now and it should finish up by about December basically to help create more efficiency in the mill, increase recovery and reduce cost. I often recommend when people talk to me about what companies I follow to always take a look at the background of your CEO, management team and board of directors. Of course, you have a stellar team, a stellar board. I noticed you also won an award recently or recognized for the top 100 entrepreneurs in an MBA magazine. Can you tell us a little bit more about this? So we don't normally hear about CEOs being recognized as entrepreneurs. I like that personally. Yeah, well, it was a diversity award, so it was top 100, 150 and I was recognized a couple months ago. We, you know, at Anaconda, we try to, you know, it's the mining industry is, I guess, is not typically very diverse, but we have a lot of women that are in senior leadership roles and because of that, I think, you know, the company itself got recognized and as a CEO, I guess I got the award. So what should we as interested investors anticipate, say, for the next couple of quarters? Well, I think we're going to continue to demonstrate there is a longer life to the project. You know, we just came out the resource estimate. We're following up right now as we speak with doing some drilling on the southern part of the Pine Cove pit and we're doing some trenching around another area that steps out further the main deposit at Stoggartite. So our goal in the next couple quarters is to demonstrate that there is a much longer life to the project via Stoggartite and an extension of the Pine Cove pit. So that's pretty much what we'll be working on. Now Anaconda Mining, of course, is in a very mining friendly jurisdiction. I don't think some people understand how exciting Newfoundland is for many of, for instance, technology metals you can find in Newfoundland as well. Would you consider acquisitions? Are you looking in that direction? Yeah, it's part of our strategy. We haven't been able to find an acquisition just yet, but we've looked all through Atlantic Canada and we looked through the other parts of North America. So yeah, we want to grow not only the project, but we want to grow the company. So we're looking for other assets to put on the Anaconda umbrella. Well, I'd like to just thank you for joining us today and giving us such a great update. Oh, thanks for having me.


Hello friends. I am Sanjay Gupta. I welcome you on Sanjay Gupta Tech School. In this video I am going to explain how you can copy a string into another. So we will be copying the content of one string into another as it is with the help of loop. So I am not going to use any predefined function. So we have one predefined function as skrcpy. So this is a predefined function which is available in skrcpy.h. So I am not going to use that predefined function. Instead I will be telling you how you can write your own logic so that you can copy one string into another. Before start I just want to share my information. If you go to detail or description of this video you will find links of videos, playlist related to C language so you can watch them too. So now first I am going to create one string. So let's say its name is s1. These are the indexes. And it is having these as values. India. And after this last A it is having null character which is end of this string. Then I have one more string. So this is blank. These are the indexes and total size of both the strings are 10. So I need to copy all the contents which are available in this first string into second to a loop. So now I am going to write a program so that you can understand how this will work. So first I am declaring two character arrays. So s1 size 10, s2 size 10. I am declaring one variable i that is of integer type. Then this printer will print the masses. Enter a string and getters will be reading the content into s1. So now I am going to iterate a loop on s1 which will copy the content into s2. So this is the loop i equals to 0. So s1 of i not equals to null character and i plus plus. And inside this loop I need to write s2 of i equals to s1 of i and I am closing this loop. So the contents which are available in s1 string will be copied into s2 string with this loop. So now I am going to iterate this. So initially i is 0. So let's say value of i is 0. Check this condition s1 of i. So i is 0. So s1 of 0 position is having this capital i. So capital i is not equals to null. So this condition is true. Both are unequal. So this s1 of i position value that is capital i will be stored into s2 of i position. So for this string i is also 0. So its 0 position will be having i as a value. Then i will be incremented. So this time it is having value as 1. So check s1 of 1. It is having capital and which is not equals to null. Again condition is true. So s1 position 1 index value and will be copied into s2 at i index. So i is 1. It will be having n at 1 index. Then d will be copied, i will be copied and a will be copied. So when i is 2, d will be copied. If i is 3, i will be copied. If i is 4, a will be copied. And if i, this loop counter value is 5. So here you can see at 5th position or 5th index. At 5th index you can see null is available. So null not equals to null. This condition is false because both are equal. So this loop is terminated. So now you can see s1 is having null at the end of all the characters. But s2 is not having null character at the end of all the characters. So it means right now s2 is not considered as string because it is not having null. So after completion of this loop, we need to put this. Why so? Because when we are reaching on null position for s1 string, then this loop is terminating. This condition is making false. So it is terminating. So a loop is not copying null character to this s2 string. So after completion of this loop, we need to do it manually. So we are copying null. So put null in single quotes because it is a character constant. And it will be copied into s2 of i position. So after termination of this loop, you can see value of i is 5. So s2 5th index, this will be having null copied with this manual step. So it will come after completion of this loop. Now you can print string 2 equals to percent s and s2. So with this print s, all the contents of s2 will be printed on output string. So remember that if your string is not having null character at the end, then it is not treated as string. It will be treated as a character array only. So you need to put a null character manually if your loop is not putting that automatically. So remember this thing and also this percent s will print the string till this null character. If it is not available, so it will print all the characters which are available in this planned positions.  So don't forget to put null character explicitly if your automated process is not capable to put that. So I hope you understood how we can copy a string into another with the help of this loop. And I didn't use this sqrcpy because it is predefined function. So I explained you how you can implement a loop which will work similar to sqrcpy. So I hope you understood whatever I explained in this video. If you want to watch more programming related videos, you can go to my channel, go to playlist. Or you can go to description or detail of this video where you can find all the links related to C language playlist. So watch them and thank you for watching this video.


Medical 3D printing has become increasingly popular due to its ability to provide doctors with customized solutions for their patients. Desktop inverted VP 3D printing is one of the most accessible and versatile technologies available, allowing for the production of high quality parts quickly and easily. Many studies have been conducted on the potential benefits of using 3D printing in medicine, including improved patient outcomes, reduced costs, and increased efficiency. This review provides an overview of the current state of desktop inverted VP 3D printing in medicine, highlighting its advantages and challenges. This article was authored by Paramu Patel, Kashish Daal, Raju Gupta, and others.


And now, for your strong Europe spotlight. Oberammergau, Germany was the destination for the recent semiannual combined training conference hosted by U.S. Army Europe and the NATO Allied Land Command. None of us can afford to do big exercises by ourselves. And since we're not going to fight that way or operate that way, it makes no sense to train that way. The combined training conference is the best place to coordinate and synchronize exercise and training activities between the Allied and partner nations in Europe. There is no other forum where 37 nations turn up, put their own national imperatives on the table, fuse those with the alliance imperatives, and come up with a collective plan so that we can have the most effective, efficient and progressive deterrent effect to keep our alliance and our partners safe and secure. For more information on the Army in Europe, go to eur.army.mil.


Estonia has begun initial operations to send one million artillery shells to Ukraine. The government of Estonia has approved a decision to send a batch of large caliber artillery ammunition to Ukraine. A new batch of assistance from Estonia includes 155mm ammunition. In addition, Estonia will provide the armed forces of Ukraine with night vision devices and ammunition for small arms. The Defence Ministry of Estonia said, Estonia's initiative to send one million shells to Ukraine has been approved by the EU with unprecedented speed and now Ukraine needs prompt practical decisions from European allies. Defence Minister of Estonia Hanno Pefkor said, He also announced a meeting with Ukrainian Defence Minister Olexiy Reznikov at a meeting with the Ramstein format to discuss how else Estonia can support Ukraine. Currently, air defence systems and ammunition are the most pressing needs of Ukraine, the Minister said. To solve this problem, Estonia proposed the EU member states at the February summit to purchase together at least one million 155mm ammunition. On March the 20th, at a joint meeting of the EU Defence and Foreign Ministers, it was decided to supply one million artillery ammunition, including 155mm ammunition to Ukraine within 12 months until March the 20th, 2024. This decision was also approved by the heads of states and governments at the EU summit on March the 24th.