I know I don't normally do video introductions, but just for this one, especially because it's very long, and I would like people who aren't familiar with the IDA community to watch this. I've been developing an IDA for about 14 years now, and this video covers my development history and just sort of how the community and how the leading IDA vendor is, how it's like to be an IDA developer, and why you don't want to be an IDA developer. There's better languages to learn. There's really only one benefit that IDA really provides, and not two benefits, and you can usually implement them in other languages a little bit differently, but you can still get them. So if you're interested in IDA, please watch this video and reconsider. So I know it's been quite a while since I've really done any kind of update, any kind of content, really. For many months I really didn't know what I wanted to do with the channel or exactly what direction I was taking with programming, and a big part of that wound up being because I just had enough with the IDA community. I detailed that in another video, and I just want to say that that was definitely not an emotional reaction. I still strongly feel that way, and it was a while feeling that leading up to eventually making that decision. That was something I mulled over for several months before finally deciding that. So I want to give a little bit of backstory about me as a developer and the sort of my experience with two very different worlds, because this isn't and has never been an argument about how things should be, but an argument about how things can be better. Which to be fair, they still should be, but it's not just like an ideal, they definitely can.  Nothing really that special, because we're talking very basic games with an engine that provides almost everything for you. That's where I first got exposed to programming. Now I've always been quite a bit of a gamer. The interest in it has died down a bit, but I still love the media.   Different strokes, different folks though. So that started when I was about 14 and it died off pretty quickly. I sort of realized that I still have on the back burner just this ideal of I would like to develop a game at some point, but realistically it's probably not going to happen because there's a lot of work, a lot more work than people think that actually goes into it. For good one. But I realized through that I do enjoy programming quite a bit and from there I decided that I wanted to learn to program. So I dabbled a bit with some languages and one of the ones that I found that actually resonated with me was Aida. I really liked the syntax for the most part. I really liked a lot of the design goals of the language. Now with my experience I don't think a lot of those design goals were met very well. But overall I still think it's a great language. But that's...  At the time there was pretty much nothing. And I have a video detailing this as well, but it was overwhelmingly just books and memorizing shit from the Aida Reference Manual. Which that'd be like going to the ECMA standard for C-sharp and that being how you learn C-sharp. That's really not an ideal way to do it. I mean you're going to wind up knowing a hell of a lot about the language and its intricacies. As you learn a language it's certainly a good idea to reference that for some of the specifics. But that shouldn't be your primary mode of learning. That's a really bad way to learn. So this pretty much started happening around the time where I was 15. So that means as of now I have about 14 years of experience working with Aida. But since it was so difficult to learn I would get frustrated and I kept dabbling in other languages. Like I'd said there was always something about the language that resonated with me. So I kept going back to it, but I dabbled in other languages. And I do wind up thinking that was highly beneficial because I wound up seeing concepts from other languages and what they did well. It's a big reason why I stand by my attitude of there are different tools for different jobs, not one superior language. That's okay. But one of the other languages that I had dabbled with that resonated with me was C-sharp. Now I really didn't start to take C-sharp seriously until I was about 16. Yeah. No. 17. That was later in that school year. I would have been 17. So that puts that at about 12 years of experience, possibly 13. So those two largely wound up being what I focused on. Still found myself very interested in language in and of itself. So I periodically check out languages, new stuff that had cropped up, extensions of other languages. For a while, like numeral was a sort of extension of C-sharp where it was basically C-sharp but added some stuff. Not in the same vein as typescript, which is more seriously of an extension. There were incompatibilities between numeral and C-sharp, but that idea or just radically different languages. That was how I got exposed to Snowball and the ICON group of languages, specifically Unicon. But again, IDA and C-sharp were largely the ones that I focused on. Now, as I had said, IDA always kind of resonated with me, so that was the one I had focused mostly on. And that was the one that I had done the majority of my development in. And, well, look, I deleted the ripos. I don't have the code anymore. I'll talk a little bit more about that in a bit, but you'll unfortunately have to take my word from it unless somebody wants to dig up the posts from Twitter or Facebook. I don't use Facebook anymore, but they were up on there. So there is proof out there on the internet, but it's not in the ripos anymore. The performance of some of the things I had written, especially the containers library, outperformed edicors in most situations. The performance of it was really, really good. While also providing just some nice features, like some basic support for queries. IDA doesn't have a nice language-integrated query link. It doesn't have to specifically be C-sharp's link, but that kind of concept. But did have some of the methods required, they don't call them methods in IDA, but the functions required to do some basic queries. And it's useful to have, but performance was good. I had also, the code quality of this one was absolutely terrible, but I had written a standards passing IDA compiler. Again, the performance was absolutely abysmal. At the time, I didn't know some of the stuff I know about good language, good parser design, good synthesizer design, and stuff like that. I had to pick recording back up on another day, so hopefully things aren't too broken as far as the flow goes. I think I pretty much got where I left off. So it was with containers and how the containers performed well. There were other utility libraries that I had worked on.  It was about how in IDA it's quite easy to make. Multi-target isn't quite the right word, although sort of, but package variants, I took to calling them. Where the specification is exactly identical, but the body is different. And as long as you're using a standalone library, you can just sort of swap them out. The thing I had mentioned is that a lot of the stuff that I had been doing is rewrites of old libraries. Those old ones I'm keeping closed source, I'm going to... The plan was to discard the old stuff once the new stuff was rewritten. But yeah, we'll get to that. The old stuff used some manual build scripts. That's how that worked. And that's what the IDA tools project basically was. Just taking a lot of the advanced logic in those build scripts and automating it. But one of the things, like the mathematics library, could have a normal implementation that did array or vector arithmetic. The way you would expect without any specialized support, so that it is iterate over the arrays and perform the operation element by element. But there was an implementation for the 80686, as long as it had... Well, actually it varied, but the various SSE instruction sets, for the most part, there were some additional stuff. But as long as it supported those, would actually break the thing into appropriate units that the vector component could work with and send it off to that and have it do it. But the interface was exactly the same.  That happens to be, really I would say the biggest focus for me as a developer is making things that are very usable. Performance is probably second. It's way up there, but I would say usability is my single biggest concern as a developer. If it's not usable, people aren't going to use it. I mean, it's a tautology, but for some reason that needs to be reminded to a lot of people. This stuff has to be usable. People forget about user experience. A lot. So, I'm not sure what more I really want to say there. The disappoint is that I had done quite a bit as far as developing things for the community to use. And it definitely was used by the community. Not to a huge extent, all the awareness I had to basically do myself.  I'm trying to keep this to not be a negative video. Oliver Henley, him and I definitely don't get along. But to be fair, my stuff was up on Isada. Awesome Isada repo. That was basically the extent of any kind of acknowledgement from the community. Never anything in the complying Isada Usenet group. I could try, but me posting anything there kind of got... Went south a while ago. Older email account, if anybody is interested in checking on that. It's not the current email account I use now. I used to go by a different name and I'll... We need to talk about that. This will come up. This will come up, so I'll talk to about that when I get there. Those libraries really aren't the only thing I've done as far as the community goes. Obviously, if you're watching this, you're aware of the YouTube channel. But one of my earlier software projects was with the Aurora UX project. I found it quite neat at the time because I shared one of the unfortunately toxic attitudes that a lot of the ad community has in that Isada is somehow superior language and that other things could benefit by being written in Isada. Now, that's not true. Certain things that Isada excels at will obviously be better if written in Isada over a language that does not excel at those things. If it happens to already be written in a language that excels at the things it needs to excel at, rewriting it in another language that also excels at those things won't actually improve anything. But really, the thing that matters is your... a combination of company culture and engineering principles. Good engineering principles will lead to a well engineered design that, again, is basically a tautology but that needs to remind people of that. There's actually some things that, contrary to the... how it's sold, that Isada really needs some extra special care because it's vulnerable, very vulnerable to certain problems. So, good engineering principles, regardless of the language, are really what saves you. But also company culture. How much focus... how much resources do you really put towards dealing with bugs and stuff like that? No language will save you from no quality control. No language will save you from really no bug testing, no unit testing, no integration testing. You need these things. But also... no, there is no also. It was working on the Aurora UX project during some of the earlier stages. And specifically, the thing that I was focusing on was... and keep this in mind because this is going to come up later. I was one of the initial people working on taking Nat and Giggy, yanking it off, basically rewriting Giggy for something else. We were looking at LLVM and basically porting Nat onto a different synthesizer. So that is... When it's picking up, I'm going to move just in case. Porting Nat onto a different synthesizer. That is the component of a compiler that does the code generation. The other side being the analyzer, which is sort of the combination of the parser and lexer. Obviously, these things can vary a bit. But I had decided the project was kind of horribly mismanaged. One of the big things was that we had changed the source control management system. We were using three times before I had even finished planning. Yeah, that was bad. But inevitably, I did stick through long enough to get the plan down, get enough stubbed so that Nat and Giggy could be built independently. And then I abandoned the project. I was one of the original guys working on that. It's going to come up later, I promise. So, is there anything else I needed to touch on from my past? I guess not really. I'll mention it just because it'll be real quick. I've worked on other projects a bit, although not really all that much. I found that I really interacted quite a bit and did some minor bug fixes with Plan 9 and a little bit with Haiku OS. Some stuff here and there with some, I guess we'll call them indie compilers, small independent compilers. Sometimes for more major languages, sometimes unique languages. SEED 7 is one of those, although other than some very minor stuff, like two bug fixes, I don't think I really did much. Most of my stuff with SEED 7 was definitely just studying it. Oh no, I almost forgot one of the most important parts. Okay, so another one of those things that I did privately, and there were numerous revisions of this, more as learning experiences than anything else and is why I happened to know quite a bit about compilers and language and stuff like that, that one of the projects, what I'm talking about right now, obviously, was on an Aida compiler. A standard passing Aida compiler.  Even the second revision of it was just bad. It's actually really difficult to write a compiler, not so much the working, although that depends on the language and Aida's a complicated language, so in that case, yes. But it's really, really difficult to write a compiler that performs well and generates code that performs well. If you think you're going to do it as part of like, hey, let's just do this for fun, please don't do it. Please don't. Literally the only reason I stuck with it for long enough to do that was just because I happened to... I mean, that was how I found out I really like working with language stuff. Well, the thing I've definitely found is I'm better, considerably better with the analyzer side than the synthesizer side. So in the future, if I do something, it's going to be building just the analyzer and attaching it to a synthesizer like GCCs or LLVMs, just building the front end. But I have a working Aida compiler. Again, it's bad. But clearly that's enough to demonstrate a substantial knowledge of the language. And again, from anybody watching this channel, you're not surprised by that at all. One of the things I had decided when I had decided that I had basically done with the RREX project was that it wasn't that NAT needed to be yanked off GCC and put on to LLVM because LLVM was somehow superior. I do think it is, but as far as code generators go, they both produce remarkably good code that is very competitive with each other, and you really have to benchmark your stuff, both of them, to know if your specific use case is faster in one than the other, because they are highly competitive with each other in that regards. The advantages of LLVM are elsewhere. They both have excellent synthesizers. Now, what I had felt after doing all that work was that it was NAT and GIGI that were the problems, that what really needed to be done is write a new front-end for Aida, not put NAT on to a different back-end. That's because of a lot of the ways they work internally. There's a lot of duplicated work. There's a lot of odd behaviors. One example of duplicated work, which happens to be a very easy one to investigate, which is why I'm bringing it up, strings, null-terminating strings. There are functions to do this inside of NAT. They work, they do the null-termination, but you don't need to. They're used extensively throughout NAT and GIGI already null-terminates strings. What you generate is actually a string with two null characters at the end of it. I'm not kidding. Run, like, attach a debugger to the actual GCC synthesizer and you'll wind up seeing that. That's fun. Now, when you pass those into the various C functions, and if you're using NAT's text.io stuff, you are still using the C functions as much as that's going to trigger some of you Aida people who despise C for some bizarre reason. You're still using that underlying behavior. So it gets written properly, but for a while there's two null characters that don't need to be there. But it's... NAT and GIGI are filled with those kinds of things that are just bizarre and... I think really demonstrate a lack of understanding for the people who are developing them. Oh, I need to partially rephrase that. I mean, lib NAT. There's a function to add null terminators to strings inside of lib NAT, and then that function is called extensively in... Oh, God. Freakin' wasps. And then that function is called repeatedly inside lib NAT. Not inside of the... Well, actually, I don't know. It might be inside of the NAT analyzer as well. I don't know. But I know it is definitely one of those cases where work is being duplicated still. I'm just trying to be as accurate as possible here. Because there's going to be some people picking this video apart. I don't know what to say now. So I had done this development for a while, gotten the... decent amount of libraries up. This was before any of them were open source. This wound up consisting of collections library or containers library which had stack queue, 40 queue, singly linked list, doubly linked list, both of which could polymorphically be referenced by just the list. So you could swap out implementations but not have to change your code. The only time you'd need to use specifically the doubly linked list as the actual value type is if you needed some of the specific enhancements. There was a skip list again would polymorphically be swapped out. I didn't get into trees. I'd wanted to but I didn't get into trees. That largely had to do with me not finding a good starting point. Because there's a lot of different types of trees. A lot, a lot. And then a few others. Ring buffers and stuff like that. There was the mathematics library which had general functions, trigonometric functions with a polymorphic array type. So that is you had an array type but then initialized it using like a degree type or gradient type or radian type basically to implement units inside of a language that doesn't have support for units. This wound up using some trickery with a base number that was actually an integer of a very specific range where it would convert cleanly into both degrees and gradients so that you didn't have any rounding errors. And it was specifically an integer one so that the rounding errors didn't happen but two for performance reasons but it happened to be a very large integer doing that whole trick that older games and stuff used to use where you'd have like an integer of range I don't know, zero to I don't know, 100,000 because it was intended to represent zero to 100 you actually had four extra digits that would be essentially the decimal place or the fractional part after the decimal place. I made use of a lot of little trickery where things would superficially be what you wanted and expected them as but for performance reasons you weren't doing the better things you know, the balance between usability and performance. There was the arrays and matrices combining them to get the entirety of vectors linear algebra and like I had said there was a patch gauge variant for that. There was a color model library so that I'd never gotten around to implementing color space support but the models were all polymorphic on a base color type with no actual representation but I'd implemented grayscale, RGB, HSL, HSV, HC, HCI or HCL, I don't remember actually on HEV and what is this one, RGBOG? RGBO red, green, blue, orange, cyan, magenta, whatever that last one was I don't remember anymore with all the appropriate conversion so that all of the properties that they had could be referenced so that even includes things like having just an RGB type and getting the orange channel as if it had the orange channel console library for convenience although that got a lot better in the rewrite the original one is kind of crafty but to be between that things that actually performed really well and the compiler which didn't perform well but was good learning experience and importantly demonstrated a very good grasp on the language I thought, I really like this language I want to contribute to it I want to be a professional programmer and try to get a job at ATACOR oh boy, that did not go well I got the interview, I got to that point I got told we don't think we can't see you as ever being a developer I led to a suicide attempt which obviously was not successful along with about a week in the mental ward a lot of therapy after that definitely one of the worst times of my life and eventually got to the point where it was like, alright, let's make him move on if they don't want me then they don't think I can be a good developer despite the proof, despite the benchmarks then I guess I'd do this on my own I guess, and I could try for one of the other Aida vendors but I really don't think it's appropriate to charge for your compiler charge for some of the additional stuff, sure, but your compiler and your IDE, I really don't think it's appropriate to charge for those you want people to use your language if there's a startup cost to just learning the language to decide if you even want to use it, that's rough and that's why certain languages just don't really catch on, that needs to be free I didn't really want to work for those companies, I didn't want to support that because that's something I fundamentally disagree with well, after that where I had sort of obsessively been going over everything that I had written trying to refine it, trying to learn as much as possible about performance improvements further performance improvements and really trying to educate myself as much about design principles the benefits of object oriented design and where you really benefit from that versus situations where you don't want to use that same with like fluent design and functional programming and so on and so forth I learned a lot during that period, definitely couldn't squeeze too much more performance out of the stuff that I had written but I'd still learned a lot of very useful stuff during that time so then after a bit of that what I had sort of switched to sort of not switched to focused on was they don't know what they're talking about, I have found all of these bugs in the past that I've sent patch reports not patch reports, I've filed bug reports and sent patches in fixing the problem for them and they tell me that oh that's not really a problem it's like well if it's not a problem how the fuck did I fix it that kind of thing I have a video on my biggest pet peeve on that one which was the Unicode support for Windows and I fixed that throughout the entirety of Libnat and got told that I didn't understand what I was fixing that you still can't get Unicode support on Windows even though I had fixed it even though I had demonstrated in that video that I can and even though Microsoft does it you think they know their own product if they can get it working then clearly you can get it working whatever, I guess Idacore knows more about Windows than Microsoft does that's not arrogant or anything they're gonna be like that they're gonna constantly reject these fixes I don't know if it's more arrogant but either way whatever, fuck them then I'm going to try to build up my own stuff whether it's my own company software solutions company or consulting service or something try that and I'd actually still really like to do that it just won't wind up being without it it's still windy out here I want to sit outside because it's nice but it's windy and microphone tends to pick up really badly for you guys I don't know, I have a new camera or new phone using as a camera so it might be better for that I know the video quality definitely is I don't know when it comes to picking up the wind how it would be with that obviously if you're going more the independent route you need to bring awareness to your stuff and so that's where I started working on getting everything that I wanted to be open source and took the opportunity to go through and audit all of it forcing myself to rewrite every single part so that I don't get lazy so that I absolutely am thinking about every single thing and if it could be designed better or should be renamed or whatever rather than just throwing it in a get hub repo there you go it's public actually that was originally up on chisel app which is for Fossil I think Fossil was actually the overall better source control manager but get hubs definitely the more popular one still keep using Fossil for internal stuff for stuff that I don't plan on sharing with everybody at least the source code doesn't get shared with everybody but the public stuff I mean it's not like it's bad because it's definitely not bad it works it definitely works even at scale the Linux project uses it to great success um so during it up on gay hubs fine it's not my preference but it's fine so that's how that started and from there most of you probably have an idea about the rest of this unfortunately this was where a lot of the recognition from newcomers and absolute hatred from existing members started and I'm not the only one who have experienced this I have received numerous comments over the two years I think two years pretty much all detailing the same kind of thing that I've encountered now some of these I'm not going to link to largely to protect the identities of the people that sent them because there's some stuff in the messages that are just give an idea of who said it but hopefully I haven't forgotten and have been linking or inserting some of the more public ones like if it was something somebody set up on YouTube obviously that's public I don't mind sharing it because they obviously decided that they were okay with it being public um you know I'm not the only person that's noticed toxicity in the community and the thing is I haven't really encountered that with other communities like I had said I have been programming in C sharp for almost just as long I really haven't encountered the problems in the overall dot-net community like I have with Ida I develop something even if it's basically competing and reforming something Microsoft has had and I actually have in one instance a team at Microsoft reaching out to me offering me help if I want it look at the difference in that for almost two years in development Ida Cork had never offered help even if it's just like hey I'm having some trouble figuring out how to use this there doesn't seem to be much documentation can you give a little snippet or explain something nah nah they won't do that they're trying to play a little bit of the good victim right now I'll say this first actually one of the other things and I had alluded to this was that there really hasn't been much shout out from the community and there is a community run twitter page it's not and to be fair it says in the bio but it's general presentation not really that it's run the Ida programmers twitter it's it's closes it is run by some Ida Cork employees but it's easy to miss that if you don't go and look at the twitter bio I definitely met some people who didn't realize that was the case they thought it was just general community members and I have it's been more than one or two people so there's definitely a misconception going on rather than somebody just being a little stupid um never a shout out from those guys I know recently and I'll fully admit I blew up I still think I'm in the right that being said I probably could have handled it better but I will admit that I blew up when they had said that they had implemented the first Ida in spark extension for VS code what the actual fuck no you haven't the first one was I believe his name was Alessandro Del Sol employee at Microsoft this is not an officially endorsed project at Microsoft it was probably like one of the Microsoft garage projects or something he just did in his own spare time um but he had done an Ida extension for VS code I had done it quite a while before mine and definitely before Ida core as far as I can tell his was the very first extension now there's also one from Luke guest or Lucrezia a guy I don't like but in being fair he had an extension out before Ida core his is not up on the VS code marketplace and I think that's a mistake on his part but again there is an extension that exists for it before Ida core that's three right there that's a three extensions for Ida right there this is not the first and it seems like they're trying to whitewash history a little bit using their sheer size and shitting on the community now I lost it a bit because they have a particular history of doing that that I have developed just a few weeks ago maybe months they announced hey guys we have ported NAT to LLVM are you fucking serious this video is already quite long and I don't want to put tons of these examples in there but so far I have counted seven of those and so help me fucking god if I find any of my code in there from anything other than the VS code extension because that one is public domain if they want to use that they can I'm a little salty about how they presented it but if they want to use my syntax highlighter they can and they probably should because there's really bad any indication of my code existing in their stuff I know it is not a license that they can integrate with that initial work I was doing was under the CDDL which is not compatible with anything that Idecor has used before so either they released that under the CDDL which I'm pretty sure they didn't none of my stuff better be in there but the amount of times that this has happened before makes me think that it probably is so the conclusion I have come to and it's before the shit today Idecor and the Ida programmers twitter for months now I've been mulling over whether I even really want to be an Ida developer anymore not a developer, I still love programming but whether I want to be an Ida programmer do I want to spend large amounts of my time contributing to a community that clearly does not respect me who has a company that is completely willing to copy things that I have done without giving me credit for or at least a nod willing to pretend that a prior work from myself and others doesn't even exist that they are somehow this saviour and the only ones doing anything and community members who are willing to do things like insult me from my race insult me for disabilities that I've had can't put a link for that one because I reported the comments in YouTube strip them I didn't want to screenshot them as reminders of what was said but it's happened all the while having programmed in C-sharp for almost just as long and never encountering any of this well no no I don't want to keep doing that so over the past few months I had ported pretty much all of those libraries to C-sharp there's still some finishing touches I'm making has to do with making sure that I don't reimplement anything that is already in the CLR without good reason so that means that my containers implementations are actually not getting implemented in C-sharp in any of the .NET languages because they don't really need to be Microsoft happens to already be using quite good performing collections and that's surprising to say because this is Microsoft but no they actually really are I'm sure some improvements could still be made maybe what I'll do is add in some of the missing collections some things that they didn't implement do my own approach to that but I really have no need to implement that because they're I benchmarked them extensively they're performing basically the same as mine some minor performance differences but not anything that I can say mine has a good use case for compared to theirs, theirs does really well so there was one exception my stackout performed theirs but for one container nah, it's not really worth it now that's not to say everything that Microsoft does is phenomenal the last video was stringier, an alternative approach to pattern matching parser generation stuff it's complicated because it's an engine and because it's an engine that can be used for different things but it really gave I mean it outperformed Microsoft's regex implementation in most situations and now the situations where I lost don't even matter because I have a regex adapter so yeah, the few times that Microsoft wins out well let's just use their implementation anyways because that's cooperation we can work together I don't mean to shit on them at all some of the stuff that I had uncovered when extensively benchmarking them they actually did a pretty goddamn impressive job seriously, it's surprising no, ultimately I think the regex approach in general has some faults but they did a really good implementation of all things considered so I know this isn't an issue with me and I know that because again I haven't encountered this at all in other communities, a lot of the criticisms that the EIDA community has levied against me are not criticisms that I have ever encountered in school, in the workplace or in other programming communities only from them, specifically now, if it was something like oh why does every girl I date got to be such a whore well that's probably because of me something about me I don't know, this is sort of an example because I like to watch a lot of the r slash nice guy and r slash nice girl compilation so that's just like the first thing that popped into my head but you know what I'm talking about if it's only happening in a very specific case it's not you, because it's not happening all the time, and I can further back that up because it's not just me having the same things to say about the general community nor about how EIDA core handles bug reports or handles criticisms of their product and so on there's a very large amount of consistency in the EIDA community very clear pattern very long video and for those of you who don't like very long videos I'm sorry but there was a lot that needed to be said because this is sort of a major deal but I feel it's for the best I really really do the stuff that I've been doing in .NET have been going over really well and honestly it gets a lot more criticisms than it really should, especially when it comes to performance because I think a lot of people look at those toy benchmarks and take them more seriously than they should it's toy benchmarks and there have actually been problems pointed out with a lot of the way the benchmarks are taken for many languages and much evidence from journals or just measure the specific thing don't look at toy benchmarks though I am still not entirely sure what I want to do with videos going from here there happens to be a lot of very excellent people doing videos on C-sharp and Visual Basic and F-sharp there just really isn't a need for another person doing those so I may still do videos for that with some of the oddities some of the unique approaches to things that really haven't been covered before I've got one on enum structs and enum classes that has not been covered I don't think I did that video maybe I did but there's others on how to get structural inheritance working because that's something you can do it's a little weird and there are some pitfalls but it's just like how you can get structs with reference semantics you can't use them exactly like classes but you have the reference semantics same idea you can get everything that you get from classes but you can get an inheritance and polymorphism setup with structs so I think maybe some advanced topic videos would be good to do because again I don't want to dilute the video ecosystem when there's already excellent videos from various .NET programmers they don't need more of that I'm getting much views anyways although they probably get more views than the other ones because oh boy is Aida shooting itself in the foot but one thing I also want to do because I'd be lying if I said I wasn't a bit salty and I know that's come across a few times in this video something I would like to do is a small little video series on Aida just to finish this up on pitfalls in Aida severe vulnerabilities it has and design decisions that make you feel good about your code but are actually very prone to bugs because those actually exist in either the big areas there's a lack of ceiling for classes for tag records that's really bad actually that you tend to design things thinking you're in a sealed environment and somebody can easily go and inherit it and inherit your type well because there's also fine grained visibility accessibility you have free access to everything inside that record once you've inherited it and oh boy you can break things you can really break things and then there are problems with how switch case statements they don't actually require you to have a default they go oh hey I checked this for every valid value and it looks like you handle all of them what about the invalid values because you can pass invalid values through it a lot of bad decisions a lot of really good decisions too again don't get me wrong I really like the language I would like to point out that it's not anywhere near as perfect as some members of the community think it is because at this point I'm done with the community so my last hurrah can be let's draw some attention to some of its problems until the next video have a good one guys


So we do want to take off the training wheels and start talking about angles in radians. And the reason is that while practical trigonometry often measures angles in radians, every use of trigonometry in advanced mathematics uses radians. And in fact, after this course, you will never use degrees again. At least not in mathematics.  But for those of you who are continuing to take mathematics, the reason that you'll never use degrees again will become apparent in calculus. Now, remember, if our angle is in standard position, the radian measure of an angle corresponds to the distance along the unit circle from the positive x-axis to the point where the terminal side of the angle meets the unit circle. And there are some important benchmarks. If we go all the way around, that's 2 pi radians. If we go halfway around, that's pi radians. And if we go one-quarter of the way around, that's pi over 2 radians. So let's try to find the exact value of sine, cosine, and tangent of pi over 6. And remember, you don't have to specify that we're using radian measure. So here, because we're given the angle pi over 6, and we're not told it's in degrees, we should assume that this is an angle in radians. Now, because we're used to degrees, we might begin by finding the corresponding angle in degrees, but you should eventually learn to think in radians. So we might start out with the following idea. A full turn is 360 degrees. That's the same as 2 pi radians. And since we want pi over 6 radians, we'll take one-twelfth of 2 pi. And so that gives us pi over 6 radians is the same as 30 degrees. So the sine, cosine, and tangent of pi over 6 radians is the same as the sine, cosine, and tangent of 30 degrees. Now, it's traditional to remember the exact values for sine and cosine of a number of angles, but if you don't remember them, here they are. And so we can read off our values of sine and cosine, and tangent, remember, is sine over cosine. Now, since we know the exact values of sine and cosine for angles of 0, 30 degrees, 45 degrees, 60 degrees, and 90 degrees, this means we can find the exact values of sine and cosine for angles of 0 radians, pi over 6 radians, pi over 4 radians, pi over 3 radians, and pi over 2 radians. And these are, and tangent you can figure out once you know the values of sine and cosine. What about the cosine of 7 pi over 6? So remember that pi is halfway around, so 7 pi over 6 is a little bit more than halfway around. We'll draw a picture, we'll do a little bit of arithmetic, and note that we have 7 pi over 6 is pi plus pi over 6, so our reference angle, this bit, is pi over 6. Now our table tells us that cosine of pi over 6 is square root of 3 over 2, so that's our x-coordinate, but since we're in the third quadrant, cosine of 7 pi over 6 will be the negative of this value, and so that gives us cosine of 7 pi over 6 equals negative square root of 3 over 2.


Good evening and welcome to this last session of today. My name is Bastian Hofmann and my name is Simon Pierce Bastian and I both work for a company called sys 11 Sys 11 is a full managed provider based in Berlin. We've been with a strong focus on managed hosting We've been offering managed hosting now for our clients for the last 11 years And one product that we started this year is also managed Kubernetes on open stack And today we want to talk about how UN can scale and autoscale these Kubernetes clusters on open stack The good thing about Kubernetes as a container orchestration platform is that it makes it very easy to scale your applications and services Why do we want to scale? Yeah, why do we want to scale on the first place? There's many answers to this question and one of the answers could be to handle increased workload Some of you may have encountered this Unfortunate event that one of your marketing guys sets up a big campaign and forgets to tell this is our department What is going to happen? Most probably your application is going to crash This is one of the reasons where autoscaling and Kubernetes can help you Another reason is maybe your financial department You only really want to pay what you actually get and what you actually need to use Resources are expensive on public clouds, and you probably don't want to book too many Another reason could be you may want to help save the environment So if we want to know now that scaling is very important to reduce costs to reduce energy consumption We have to think about how we can scale our application And there are two ways the first one is horizontal scaling Horizontal scaling means that you either increase or decrease the amount of instances Of your application that are running or the amount of nodes in your cluster The second one is vertical scaling Vertical scaling means that you either increase or decrease the CPU or memory usage of One instance of your application or that you increase or decrease the capacity in CPU and memory of one node in your cluster If you want to do this on your bare metal Infrastructure the thing you have to do is first you have to probably order in your server Probably write a ticket to your data center and then a couple of weeks later if you're lucky you have a new server delivered Next you have to put the server into a data center somewhere via all the cables Install an operating system on them hopefully not Windows 95 and Then after that is done You can start provisioning all the servers all the necessary Dependencies with puppet or chef or any kind of other things to get the Java version on it or whatever you need for application to run And only then you can go to the fun part deploying your actual service and your code to this new server and Probably also reconfiguring the load balancer to get new traffic to this node and to this instance that you added these are a lot of steps and These steps also take some time sometimes days in between and if you want to scale up very quickly Because we have a TV commercial coming up. This is like a way to slow So next we would like to look at the cloud provider approach What is this process gonna look like if we're using one of the public clouds? We could maybe start off with creating VM from an OS image could be something that's pre-configured by your cloud provider and already there Then we would also need to provision the server with the necessary dependencies that are needed to run my application So same step again, and we also need to deploy these services to the new server Reconfiguring the load balancer also needs to be done So we still got a lot of steps that we need to perform before we can actually get to our end result Of course then Cloud providers say yeah, we have these things called auto scaling groups Which are kind of nice and in theory can help us with doing that by automatically booting up new VM images if the load increases The problem with that is a lot of these auto scaling group APIs are very proprietary That means they are different for every cloud provider And if you're an AWS for example, and you now want to move to open stack Or you move want to move some of you were close to open stack. You have to implement that again and again Kubernetes makes this a lot easier by just standardizing the APIs for that So in to show you a bit more on also in demonstration later on how this works Let's talk a bit how Kubernetes actually works internally So to start off with this, it's quite important that we're talking about the same Terminology that we all understand the Kubernetes basics that we're talking about so to start off with I would like to explain what is actually a container a Container normally runs a docker image. It doesn't have to there are other container runtime interfaces around That can be used Normally a container as a good standard practice should run one process one process only There are of course child processes, which is processes gonna fork, but otherwise we should be talking about one process There are a lot of bad examples around on duck up, which maybe some of you have encountered But this is normally the way it should be done In the Kubernetes terminology, we often come across something called a pod a pod can be one or multiple containers Normally we assume that we share certain things like networking for instance because we need the same networking We could also share the same storage if you wanted to Not necessary though Here's an example of what a pod could look like so if you look on the Left-hand side we have the PHP FPM container which is in front of it is our engine X container running our web service. So the PHP FPM would typically connect to the engine X container and send its pre-compiled PHP data and Just to make sure that we've got a logging facility We now have a sidecar which also belongs to this pod Which is used to send on our logs to a log stash for instance So just to give you a short overview of what a Deployment YAML file may look like in Kubernetes. This is the kind is a deployment We've got the API version We've got the metadata of what we're actually going to deploy and the actual container Which is going to be pulled is the engine X demo in Version 0.2 if we don't state anything at all here this image will automatically get pulled from Docker up If we now have this deployment and we want to scale this horizontally we can use a feature in Kubernetes called a replica set So in this case here we have One pot running here and we want to have this three times in our cluster So in a replica set we can define hey Kubernetes. Please run it three times and Kubernetes will then ensure that it's running in the cluster three times And even if a note goes down where these containers would be running on it will then reschedule the containers on some other note Where there's available space To give you an idea how this looks in code we have our deployment and Basically this deployment includes a replica set which includes a port definition and with this replicas count We can now tell Kubernetes. Hey run it three times So the next thing we would like to talk about is vertical scaling How can I use a vertical scaling for all my containers? So we're normally talking about one container which we need to scale up because the process probably needs more CPU or more memory maybe So in general we're looking at a few fields which Kubernetes use for scheduling We'll come back to this later on in one of our demonstrations that we're going to show you today and one of the Important fields we're talking about here is the actual resource request the resource request request is something that Kubernetes uses for its scheduling decision. That's important so Before a pod is actually scheduled It checks the CPU and also the RAM that's been added to these two fields and looks for a node Which has that capacity? If it doesn't find anything then it will not be able to schedule that container or pod so limits Limit the container to use more CPU and memory So it will not be able to use over that. These are values that can be changed manually So you can basically edit your deployment, which we'll show you later and you can change these Of course changing this manually is nice that you can decide this at some point Yeah, I need like three replicas or I need like five CPUs for the service But what you actually want to do is you want to change this also automatically based on usage based on Traffic that your services are getting so that you don't have to get up at night When there is like a spike in traffic and also that you don't pay too much if you don't need it In the end this is all about focusing on what's really important and what's really important It's not your infrastructure, but the applications that you're running on because that's what's making money So let's show this in a live demo. So number one we need a few preparations to get this demo up and running So to do this, we're gonna need a Kubernetes cluster Which we're gonna try and get up and running in a few moments and we would like to Show you the difference between doing yourself via a managed Kubernetes solution Setting up and maintaining Kubernetes is hard Who of you has set up Kubernetes themselves like really the hard way? Okay, keep your hands up who liked it Okay, that's what I expected It's definitely a difficult and a very tedious Pastime and most people forget a lot of crucial components as well Or they do not back up the DCD correctly and find themselves through Certain problems at the end of this monitoring can also be a crucial component that you're gonna need a Managed offering hopefully takes care of a lot of these and gives you a certain amount of carefree usage and a certain amount of Take away certain jobs You just don't want to do because who actually wants to focus on Kubernetes most people don't most people want to focus on their application To name a few of the popular Kubernetes managed offerings. We could talk about GKE With one of the first managed offerings on the Google cloud Amazon with EKS Sys11 with meta cube So what are the advantages of having a managed solution? One of them definitely should be having easy upgrades if you try and Run your chef or your ans will playbook to try and upgrade your Kubernetes cluster You're probably gonna be sitting there with sweaty hands hoping that everything works and that your containers are still running afterwards And I've definitely broken a few clusters trying to do this Easy scaling should also be something that you should take into consideration You don't have to go to the rack like bassin was telling us earlier Or maybe you have to pre-order a serve or something because your capacities have run out on most public clouds You can just receive more resources when you need them Also load balancing is a big thing that people need to take into consideration You need to be able to expose your services to the outside world because what are your services worth if they're just inside a Kubernetes cluster So you're gonna need some form of load balancing which you probably also do not have if you don't run on some form of managed offering Distributed persistent storage. So you're talking about okay You need to manage all these hardware nodes the Kubernetes installation and now on top of that I need a persistence layer, which I also need to take care of We're talking about a lot of things to manage and one of the last things that people often forget is Backup and even worse than that recovery. Do they actually test their backups? Do they actually work? We've done a lot of this for you Premium support is also something which can take away a lot of pain If anything goes wrong with your application or you would need to talk about Scaling how things are done properly best practices. You can come to us and we can talk about these sort of things And mostly we have answers to Monitoring is also one of the key things that you need to actually properly Set up and maintain a Kubernetes cluster if you're not looking at your KPIs and you're not looking at certain Things going in and out of your cluster Then it's just not going to work and are you actually receiving these alerts? You're getting paged correctly when things get triggered So basically the key message is you can focus on what is important So just to give you an idea how this can look like in a managed offering to set up a Kubernetes cluster Instead of doing it the hard way with a thousand steps and lots of documentation. You can just log in and Sign in and then create a new cluster Give it a name Choose the Kubernetes version Click next one time choose the region you're running in provide your open stack credentials Choose the open stack project where your nodes should be running in choose how many nodes in which flavor should be running Add an ASXH key maybe to it to be able to connect to them later on manually if you need it Click create and then a few minutes later You have the nodes up and running which is a lot less than this Kubernetes the hard way So if you have a Kubernetes cluster now, let's talk about how we can scale our workflows of that And the first thing is what we want to do is I want to show you how we can scale a pot a single instance With a replica set manually in a horizontal way Okay to do that. We're gonna switch to our first demo hopefully Okay, and our first demo is we would like to show you how you can basically scale up a deployment So let's see if we can yeah No, not delete So what we have already here and while Simon's typing we are showing here on the top right side The pots we are running in our namespace of one deployment instant at the moment. We have one instance on The lower right side. We are showing the CPU and memory usage of every pot that is automatically measured with Kubernetes, okay, and yeah, so we could see our deployment here. We basically got a deployment with One replica at the moment and we should also have a service if we have a look So if we look at the service, we have also a service with a type load balancer The type load balancer should automatically give us a public IP. We can quickly check this and we should have this public IP I'm running here But you also can see that the server name is automatically here the name of the pot So it's actually like a live running demo. We are not faking it So if we want to scale this up now, we can use the cube CTL scale command Okay, so we can still this deployment fairly easily from one replica up to three replicas So what you're gonna see now is you should see new New containers or new parts getting spawned on the right hand side What's happened? Let's copy and paste this. Okay. Sorry about that Okay, okay, that's it. Okay, so you can see the containers coming up here on the right hand side and Now we should see that our deployment should have a desired state now of three Current containers, which is now running or pots and we could also scale that back down at any time We wanted to we could also edit this deployment So Yep, edit the deployment. Hello world. So if we look through this yaml We should have our replica count which we saw earlier, which has now been set to three the Scaler has done nothing else than to edit this so we can now change this number to one again Edit it save the file and then we should see the parts getting terminated again Yeah, that's happening so This was manual scaling Which is already very nice scaling of pots The next thing we want to show you is how you can actually do this automatically if the load on the server Or on the pots are being increased so So to do this we can use something which is basically already built into Kubernetes the HPA the horizontal pod autoscaler The pod autoscaler can be set to Check certain metrics the Standard is to look for CPU The standard is to look for CPU basically we're going to set this to a very low value now to 5% for Demonstration purposes, of course you would not do this in production, please We're gonna do this and then we're gonna create some load with AB with a benchmarking tool from Apache on this pod And hopefully the metrics API should pick up the increased workload Which should fairly quickly hit the 5% target that we're looking for once this happens We should see the horizontal pod autoscaler kick in on the left hand side in the bottom We're running a describe on that HPA and you should fairly easily quickly see that this is gonna start happening hopefully So it takes it takes a few seconds for that to happen because it needs to get the metrics data and It's still at zero. So hopefully this will happen shortly Let's Let's see what happens Because we're trying to to run this over mobile connection. So it could be Let's try the Wi-Fi. Okay. We'll just try the Wi-Fi For was that it's always like mobile connection something could limit the amount of requests we are getting doing in parallel Yeah, so to one host. So we need to get a certain amount of requests to that It's okay connected to the Wi-Fi Okay, that's what go then Yeah, we can see the CPUs cores have already got increased so you can see there's already a certain amount of load Which is over our 5% and you can see on the other Side that the first parts are already in a state pending. So they are they're running now So we've already increased the number of connections that we'd be able to accept for application without really doing anything And set setting up the HPA to a certain CPU limit Okay, so this is horizontal pod autoscaling the next thing we want to show you What if we actually vertically want to scale a process because it needs more resources because we are getting Oh and all the time and one of our containers needs definitely more memory For that we need manual vertical scaling. Yep So what we can do is we can edit the deployment again And if we look down here to the pod definition, we see resources for requests for CPU and memory and we can just increase it So let's see That's a request that we were talking about which Kubernetes of course uses for its scheduling decision So if we edit those and increase the CPU to use half a CPU and the RAM to 700 megabytes per container We should find a certain amount of containers stuck in pending state Yeah, so what we need is now trying to do it does a rolling deployment of these containers from the specification with less CPU and memory requests to the specification is more and Now we see for this new Replica set here all these containers are in pending if we say keep CTL describe pot and then this pot here. We also see why because It actually can't schedule these pots because there are insufficient memory and insufficient CPUs available in the cluster So at the moment in the current state of our cluster Kubernetes of course will not be able to solve this problem because we have unscheduled resources so we actually need to add more nodes to our Cluster to schedule additional pots So what we could do is we could manually add more VMs to the cluster This is of course a bit cloud provider dependent At Swiss 11 meta cube you can either do this over CLI or you can also do this in the nice interface We can say hey add a note and the amount of notes and what flavor there What we're actually using under that is the Kubernetes cluster management API which defines how you can interact with nodes in a cluster and abstracts the cloud provider specific things away and With the ecometric machine controller that knows then how to talk to open stack we can provision VMs on the fly easily So what we are going to show you in a minute is that we have a machine deployment there The machine deployment manages rolling updates on a machine set in The machine set that is defined how many instances of Notes we want to have in our cluster and every instance is the machine resource in Kubernetes And then we have the machine controller that listens on these machine resources and then on demand creates or deletes open stack VMs provisions Kubernetes on it and Makes them join the Kubernetes cluster as a node So you could of course do this manually again But also we want to show you how to do this automatically With not auto scaling. Yeah So in also a meta cube for open stack We have implemented and extended the Kubernetes cluster auto scaler to talk with this cluster management API this is Ready in a way that we can show it to you now. It's not ready yet that we can actually open sources We hope to do this like next week or so. So this will be available soon at least as a pull request to the auto scale So Let's so what we're going to show you next is we're going to show you how we can try and get these parts out of its pending state and Deliver enough resources for our Kubernetes Scheduler to be able to actually schedule this. So what is the node auto scaler doing? It's looking for exactly this It's looking for parts in a pending state which do not have Sufficient resources to be scheduled once it finds these parts. It will try and provide us with some new machines so on the left side here, we have a watch on all the machines in our current is cluster that also then Correlate to nodes in our current is cluster and now we are adding a new machine deployment We can say with annotations what the minimum size and maximum size of this deployment is for the auto scaler So in this case we have a minimum of zero nodes in this deployment and a maximum of 15 nodes and We can also define drawing update strategies like how many of these nodes should be maximum unavailable if I change the flavors for example to it and Also, I can define all the necessary fields like what operating system image I want to run what flavor of of the M. I want to run here What's network and security group these nodes should be in and so on So if we apply this So once we apply this we'll have a new machine deployment created which then in turn will watch for this group this replica set and Once it's needed it will start spawning new machines, which is already done because we already left An amount of pods in pending state So what you can also see of course booting up a new VM That's quite fast for a creating you them from the image provisioning it with a new cupler It means up get install of a couple packages installing. I think Python and other things. So this is going to take like two to five minutes Depends on where you also can see if we now run here open stack server list That there are in my project already The first machine the VMs already there and they got public IPs and I know just waiting to join the cluster Yeah, so that might take a while to actually provision to everything's up and running and they've actually joined the master So we're finished off with our slides first and then we'll come back to this Demonstration at the end. We saw the cluster management API and the demo Okay So we'd like to give you a brief summary to wrap up what we were talking about today So that you've got a fair understanding when you leave our talk about what is all about so with auto scaling you can Save valuable resources if you need to and most people will want to do that. You can maybe even Help save our environment and make this place a better planet Kubernetes makes auto scaling a lot easier because it has all the things on board that you actually need We saw the horizontal part auto scaler. We saw vertical scaling And we also saw the node auto scaling which can easily be integrated into a new cluster and One of the best things about it all is you may save yourself from getting up at night because one of your applications is Not working as it should be Thank you very much So we have a couple minutes for questions and we definitely can go also to the nodes later on and see them up and running If you wonder if questions now that free free and you can also join us in our Since 11 lounge for beers later on and we also have a booth outside there We can also answer you any questions and you can also send us emails and reach a little Twitter And yeah, if you have questions now for free Okay, so if anyone would like to answer any questions later on please drop by a booth will be offered some beers later on So just here just come around. Thank you