What's up, my curly people? I'm Bianca Renee, and you're watching Bianca Renee Today, and today I will be reviewing the Denman brush. Now, this brush seems to be very popular in the curly hair community, so I was like, you know what? I should probably try it. I saw it so often that it got to the point where I just thought it was a brush for black people, made by black people, for people with curly hair. But when I bought this brush, the box says it's the UK's number one professional hairbrush brand, British Made, and there's this white lady on here with straight hair. So, uh, I was wrong. This brush right here cost me $13. I did end up buying it from Sally's Beauty, and then I later found out that I could have bought it for cheaper, like $7.99 cheaper if I would have So the brush itself does look very nice. It has a sleek, shiny black handle. The bristles are very hard, like straight-up pieces of plastic, and then it has this red rubber, you know, bottom to it.  I could not for the life of me get this through my hair, and I'm looking at the brush thinking like, why is this happening? Are my curls just very tangled today, to the point where I grabbed my old faithful brush, but then I got through it with ease. So now I'm looking back at this brush, and I'm looking at these long bristles, and because they're so long, my hair would be so far into it that it was hard for it to pull it down to create that detangling motion, and it would just get stuck in there. I don't get it. I was ready for this brush to blow me away. So after I got out the shower, you know, feeling kind of defeated, my hair is now detangled, not thanks to this brush. I decided to use it again while I put on my deep conditioning treatment, so maybe this brush is going to be good for like distributing the product evenly through my hair, and probably even creating some good curl definition, which it did after it was detangled. So when I go through my hair, I know the product was really getting on every strand because I'm brushing it through, and I'm getting very tight spiraled curls, which is cool and all, but I don't personally want a brush that I can't use to brush my hair. If a brush can't detangle my hair, I'm really not interested. I decided to go online and do some more research about this brush, and a lot of girls say that they don't use this for detangling. They use it just to get really good curl definition. So you want me to buy one brush for detangling and then one brush for curl definition? All that tells me is that this brush is for different people. Who it's not for is for me. But this brush is for someone who wants a more curl definition, someone who doesn't mind getting shrinkage because once you have tighter curls, they will shrink up. So my hair went from looking like at this length to going like up here, like it really shrank up.  Because this brush is known to be a little bit hard to detangle, many curly girls make a modified Denman brush. So that means that they took out every other row of the brush and took out these plastic bristles. I'm guessing this thing will pop out. Okay, I think it slips out. Ah, I scratched myself. And now I think you could open this. Oh, you can. This is interesting. So when you pop this open, tada, there are all of the bristles. So if you push it out, I just took out one row of the comb. The popular thing to do is to take out every other row and it should be a little bit easier to use. I obviously haven't tried brushing it modified yet because I think I'm just over this brush, you know, to be honest. And I don't want to spend $13 to have to then tear apart my brush. And then you just slide it back in the DM. It goes down in the DM. So overall, I mean, I'm not going to say this brush doesn't work because I've watched several videos where girls love this brush and I've seen it work in their videos on their hair. It's just not a brush that I will be continuing to use. Curl definition is not something that I strive for via my brush. I usually use styling products to get the curl definition that I want. And this is the definition that I want. I don't want it to be any tighter than this or it will shrink up. But if you have this brush, I want to know your opinion. Do you love it? Do you hate it? Do you use it to the tangle? Do you use it out of the shower in the shower? Do you use it for a curl definition? Let me know. Leave me a comment. We're all curious. Before you go, make sure you follow me on Instagram, Twitter and Snapchat at MsBeyondGrenet and hit that subscribe and that little bell button so you don't miss any more of my videos. I post new videos every Friday and Sunday. So I will see you next week right here on Beyond Grenet today.


Hello, everyone. My name is Kiran. I am a compiler engineer working at ARM in the Manchester office in UK, basically working on the Fortran front-end for our compiler. And the topic for my presentation today is flang, the Fortran front-end of LLVM. This is basically a summary of the contents of this presentation. First of all, I mentioned a word about Fortran. I wasn't sure how many people here will be familiar with it. Why is it still important? Then there was a similarly named project that I call it old flang. Then I come to the new flang project, which is the subject of this presentation. I discussed the various compiler stages giving a bit of details about how things are implemented. Then I talk about how OpenMP is handled in this compiler. Then I talk about how, very briefly, about the driver, the plans for the driver, how the driver is interfaced with current LLVM. Then I talk some of the details about what is the process and what is the status of the submission of this project to the LLVM repository. I then give a few information about how to contribute if someone is interested in contributing to this project. I then give a brief status of where we are with the implementation, what are the tentative timelines for this project. Finally, I conclude. Whenever people talk about Fortran, they think that it's a very old language and they don't tend to understand the importance of it. It was probably the first high-level programming language, but it still continues to be popular, particularly in the HPC community. I have a sentence here from Steve Lionel, who is also the chair of the Fortran Standards Committee. He gives a bit of reasons about why Fortran continues to be popular, mainly because there is actually a source of over 40 years old, which still continues to compile because of the standardization of Fortran. Then Fortran has strengths in floating point computation, array processing, and all that. It's actually now a modern language with support for object orientation, modules, and parallelism. Old Fortran tended to have this, you know, that you have to write things in fixed columns and all that, but new Fortran is free source, free form. You can write it anywhere and it does not matter. It continues to be used in the real world, particularly in applications like weather forecasting, numerical simulation, modeling, and also in very important libraries like LAPAC, SciPy, and all that. It also continues to be standardized on a regular basis. The latest standard for the Fortran language, which came out, was in 2018. And the next standards are in the works, 22x and 22y, expected to come in this decade. So to give one more slide about the popularity of Fortran, in the UK there is a supercomputer called Archer, and they give some statistics of what are the kind of applications that generally run on this supercomputer. So this graph on this right side is based on languages. So we have C++, Python, C, and Fortran. And there is one bubble for each application that is run on that supercomputer. The size of the bubble represents the amount of time that is spent on the supercomputer. The darkness refers to the number of users that use it. So you can see that on that supercomputer a lot of the applications that are run continues to be Fortran, more than 60% of the application continues to be Fortran. So it's very important in the HPC community that you have Fortran compiler and you are able to generate high performance code for that. Now we come to the old flank project. So old flank project was a project that was designed to generate LLVM IR and to interface with the LLVM infrastructure. It was a project that was sponsored by the US Department of Energy and its national labs. So they signed a contract with PGI or NVIDIA and PGI was to take out the front end of their compiler, make it generate LLVM IR and then open source it using some license. So they open source it to the NAPASHA2 license and they recently switched to the LLVM license. Now this project was available since May of 2017. It runs on various platforms, ARX64, X8664 and PowerPC. And with the availability of this compiler, it filled the key gap in the LLVM story for HPC. Previously LLVM did not have a front end for Fortran. So if you have to use it you would have to either use G Fortran or some other compiler. There was no free alternative that generated LLVM IR for HPC. So this was the first one which filled that key gap for HPC. Now this was not just a project which was to demonstrate that it's possible. It was adopted by many companies and it became the Fortran front ends of their compilers. PGI compiler obviously because of the source it was adopted by ARM compiler for the Fortran front end and also it was the front end for the AMD optimizing compiler. Now it was not just a compiler, it's also a very performant compiler. So I have two graphs here. This is taken from Steve's calcone of N Media from his presentation in Euro LLVM. So I have several benchmarks here. Pauli had run various versions of spec and spec coins with parallel benchmarks. And the last one shows the geomene of all these benchmarks. The light blue color shows for flang. The dark blue is for G Fortran and the yellow line is the PGI compiler. So as you can see from this geomene this flang is actually better in performance compared to G Fortran and approaching the performance of the PGI commercial compiler. The one on the right side is basically a comparison of all the Fortran benchmarks in spec 2017. Again it's the same story here that flang is better than G Fortran but it's a bit slower than the PGI commercial compiler. So I'm showing this slide basically to show that it's actually a performant compiler. So currently the latest standards in Fortran are Fortran 2003, 2008 and 2018. Flang did support a good amount of these standards. So when it came out it supported Fortran 2003 mostly. Coming to Fortran 2008 it was mostly partial but as years progressed or in a couple of years more features were added. The only important omission is that there's no plan for co-arrays. Co-arrays is a parallel feature that is embedded into the language. But other than that most of the features were supported in the flang compiler. But coming to Fortran 2018 there is no plan in the whole flang compiler to support that. Now although this flang compiler is a performant compiler and it was adopted by many companies as they're frontend it still had a lot of issues and these are some of the issues that became the reasons why the new flang compiler is necessary. So the first one was that it was not a pure open source project in the sense that it was actually ripped out of a commercial compiler. And the way it was open sourced there is no way to actually make submissions to that project and then get it accepted. Only a handful of pull requests were accepted over a period of two years. The reason was that any pull request that you submit had to go into their PGS or NVIDIA's commercial compiler and then it runs through all the CEI and goes through the reviews there and then and then if it's all fine it has to come back to flang and then finally get approved. And there were no developers assigned for this and it was the managers who were doing this and you know so that did not work out very fine. The other reasons were that the code is very old. The PGI or the flang project was open sourced. It had a code history of almost 30 years. So you can imagine that over 30 years you know a lot of rotting has happened. The original people who implemented that compiler are no more there. And there are a lot of other things like you know they used flags which are new numbers. There are a lot of global variables and things like that and typically when you try to fix something here then something breaks there. So it had all these old issues. So its code is all difficult to maintain and the entry bar is high. The error messages provided with compiler usually gives only the line number. There's no column number so it is not high quality error messages. It was also when they approached the LLVM community it was mentioned that no we cannot accept it as our frontend due to some of these reasons and also that it's trying to see. It generates LLVM IR but it does not use the IR builder. It generates IR using print of statements and all that. It cannot be used as a library which is one of the you know cornerstones of LLVM that things could be used as libraries. Because of all these issues it never became the frontend of LLVM. So now there are two options. One you can try to improve the existing flank compiler or try to write something new. So work started on trying to improve the old one but that did not go that well. So you know people desired that okay let's write something new for the next 30 years and that's a new flank project. So the new flank project or F18 that was a name that was initially given but in the community when it was accepted as the frontend of LLVM people decided that flank is the right name for that project so that rhymes with Clang also. It was accepted as a frontend somewhere in the middle of last year. It uses the LLVM license, Apache with LLVM exceptions. PGI or NVIDIA continues to be the lead developer of this project. ARM, AMD and people in the US National Labs are contributing. Everyone else is also allowed to contribute. The project is being developed in the open in GitHub. And the main initial features of this project was that it uses the Fortran 2018 standard as the primary reference for implementation. It is very standardization friendly. We will see that in the next few slides. It is written in modern C++. It's actually written C++17 existing LLVM code base in C++14. So it's a step up from there and they got a specific exception for this project. Yes, it's written as C++ classes. It's only lowered after doing all the semantic checks. Old flank was lowered early. It has high quality social equations can be used for tooling and somebody in NVIDIA has already written some portion of a flank detool for that. So now we come to the various stages of this compiler. Particularly, I'll be in the next few slides. I'll be looking at the preprocessing, the parsing and the semantic analysis. So there is a stage called the preprocessing is composed of two things. One is pre-scanning and preprocessing. So the whole idea of this stage is that Fortran is actually a very difficult language to parse. It has a lot of contact sensitivity there. White space are not important and a lot of things like that. So what the pre-scanner does is that it tries to remove as much of these issues as possible. It normalizes the source, expands the macros, changes all the case to lower case and then what the output is a cooped source and also a provenance is generated. So all the next stages look at the cooped source rather than the original source. And the provenance is basically that it maintains maps to the existing source, the original source so that if a later stage comes up with an error message you can always map it to the original source. The next stage is parsing. It is basically a recursive descent parsing that is used. There are no tables or anything that is there. The parser is written in a declarative fashion. It's a bit of a stone on the right side example which we come to. The grammar is taken from the standard left recursion and all those things that hurts recursive descent parser are removed. It basically uses the idea of parser combinators. There are various token parsers that are written and then there are functions and combinators to combine these to form more complicated parsers. The parse tree actually follows specification of the standard. So that's why one of the points that I mentioned earlier is that this is very standards friendly. So I have different entries on the right hand side. The first one is the original FORTRAN source which says integer x is equal to 1. So I am concentrating on that x is equal to 1 part. Next when we come to the standards document, what the standards document says is that an entity declaration contains an object name that is x here. It can be an array so that means it will have an array spec. It can be a co-array which is a parallel feature in FORTRAN or it can be a character then that information has to be there or it can contain an initialization. So this array spec, the co-array spec, the character length and initialization are all optional. So the parser that's written also follows from that. So the parser basically says that you generate an entity declaration and it should have an object name, maybe an array spec, maybe a co-array spec, maybe a character length, maybe an initialization. So where the parser is written, it follows what is written in the standard and when you come to the parse tree node also you can see that it's basically a tuple which contains an object name followed by an optional array spec, a co-array spec, a character length and an optional initialization. So all these things follow the standards very closely so that if someone wants to add a new feature it's probably easier to do that.  So the basic job of the semantic analysis is to do that whatever code that passes through this stage conforms to the standard. So there are a lot of error checks and all that happens at this stage. So it's composed of many things. So first is that it does label resolution so there are a lot of jump statements and all that with labels and all that. So it goes ahead and checks that all these labels are valid, they are in the correct scope and all that. Then it does name resolution basically it constructs, go to these declarations, tries to fill in a symbol table and tries to assign scope for all these. Now the problem with Fortran is that because as I said it's difficult to parse it can be the case that the parse tree is ambiguous so you might actually have to modify the parse tree based on new information that became available as part of the name resolution. So this stage does and goes and changes it. So one of the things that is at the array the way you call the way an array is written and a function called they look very similar. So there can be mispasses there and once the parse tree is modified then a constant expression evaluation happens and then this checks for expression and statement semantics are done and then a module file is generated if it's a module. So that is a matter of this slide. So it basically describes a module format. So I have some Fortran source code here. Basically it has a module variable. It has a module called module wars. It has two declarations for an integer and a real. It contains subroutine called add valet which basically takes in a parameter x and adds that to the variable a which is part of this module. Now there are various ways. So the idea is that once you have this as a module other place in the code can use this module to access the variables here or the functionality here. So once you process this file it's written as a module file and other portions of the code can read it and do whatever they want. So how do you represent this? Various compilers do this in different ways. You can actually dump it as an internal format and then read it back. But the new flank does is that it actually dumps it as a Fortran source itself. And then you can read it back and then the pass or pass it and constructs a tree and all that fast. So one of the reasons that it can do this fast is that you don't have to do preprocessing or anything. All that has already been done. And the parser is very fast so that it can read this and then create the internal structures. So the module file basically contains the name of the module, the version of this module. It contains a checksum and all the publicly visible variables and functions that are part of this module. Now we come to the optimizer. So once the semantic checks are all done then you can either generate LLVM IR or you can have an intermediate high-level IR to do some high-level optimizations. So that's the approach that the new flank compiler does. And it uses the ML IR framework to, it defines a new IR called FIR or Fortran IR and the AST is lowered to that IR and then a lot of optimization passes are done there. So the reason it does is that sometimes Fortran requires a lot of information that requires knowledge of the Fortran language and only with the presence of that you can actually do these optimizations. So I'm not going into the details of this. There was a talk at LLVM Dev. If you're interested you can go to that. So I missed a point. So I said that you generate the ML IR dialect of Fortran. So there is also an LLVM dialect in ML IR. So what finally happens is that the ML IR dialect of Fortran FIR is finally lowered to the LLVM dialect in ML IR and there exists code in ML IR which translates the LLVM dialect down to LLVM IR. So they will use that to generate the LLVM IR. So that's how the LLVM IR is generated. So the next slide discusses how OpenMP is handled in this compiler. Now it should be noted that OpenMP is standardized for both C and C++ and Fortran. So there exists a lot of code in the LLVM compiler which generates code or the generates LLVM IR for various OpenMP constructs. So the design is such that we should be able to reuse some of this information that's already there in the LLVM infrastructure. So to do this we have two components. One is ML IR again and the second one is the OpenMP IR builder. So we define a new dialect for OpenMP called the OpenMP ML IR dialect and then so the reason is that because Fortran although the Fortran FIR dialect is there it only represents the Fortran language constructs. It does not represent anything in OpenMP and to just restrict the FIR dialect only to Fortran language there is no OpenMP in that. So we have this separate dialect for OpenMP. The second component is the OpenMP IR builder. So OpenMP IR builder is basically a project which is started by Johannes. So what this does is that it takes out all the code which generates LLVM IR for OpenMP constructs in Clang and moves it into the LLVM directory. So there will be functions like create a barrier which will go and generate the code for the barrier construct. So now in Flang project also we can call create barrier using the OpenMP IR builder to generate LLVM IR for that. So that's basically what is summarized here. So you have the Fortran language the pasta generates the AST and when it comes to lowering a mix of FIR and OpenMP MLIR is generated and then it's finally transformed into a state where the OpenMP MLIR will exist together with LLVM MLIR and when it's translated the translation library will call the OpenMP IR builder to generate LLVM IR for each of these OpenMP constructs. It can be barrier for the parallel region and all that and the outlining and all those things will actually happen at this layer. So I'll just look at a couple of examples. The first one is the parallel construct. So you have this Fortran code here which has a parallel construct and has an assignment and an addition there. So this complicated thing in the middle is basically a representation of the AST. You can see that it's similar to Clang but it's Fortran specific and the one generated by the Flang compiler and on the right here you can see that you have actually generated OMP.parallel which is an operation the OpenMP dialect and this add up is actually something but a standard dialect but there could be more FIR dialect sitting around this and in the next step or in the final step you will have the OpenMP dialect sitting with the LLVM dialect and then you will use the OpenMP IR builder to generate the outline function and the Fort call which calls it outline function. So it's not necessary that we will always use the OpenMP IR builder. It could be that things can be handled completely inside the MLIR layer itself. So this is an example for that. You have the OpenMP collapse construct which basically says that collapse the two loops in a single loop. So that's the example that we have here. You have two loops, two do loops inside an OpenMP parallel region with collapse set to two which means that collapse the next two loops in a single loop. So in the first stage there will be an OpenMP operation sitting together with FIR do loops and it will be converted into another dialect called the loop dialect with loop.for and the loop dialect has some coalescing already implemented. So you'll use that to convert those two loops into a single loop and so now that collapse operation is actually fully handled inside the OpenMP in the MLIR layer itself so that for that particular operation you don't have to use the OpenMP IR builder for that. So next we come to the driver. So when we have a new front-end that has to be integrated to the existing driver. So the approach that is being taken is to create a new binary called bin slash flang. It will reuse the lib flang driver and the options file that's options.td. So the sample invocation would look like bin flang-fu bar, fu bar.f90 and it will call bin flang-fc1. So just like clang if you call clang then it's actually internally calls clang-cc1.  So it has to be noted that most of the many HPC applications are mixed source programs. It is a mix of cc++ as well as Fortran. So it's important that the compilers are aware of each other. So this flang compiler can also be called with driver mode set to Fortran with clang and then it will call flang. So the initial plan is through, so currently clang has a feature to call gfortran if you call it with a Fortran file. So that will stay for now but if you call it with driver mode is called Fortran then the flang compiler will be called. I have put a pointer to the RFC if anyone is interested in the details. So next we talk about the submission to LLVM project. So as of now this project still exists as a GitHub project somewhere. It's not yet part of the LLVM although it has been accepted as the front end of the LLVM compiler for Fortran. So we made an initial submit, initial attempt to submit this to the LLVM project and then we got some feedback. So the initial attempt was to submit the master and semantic analysis checker. So it seems that at that stage there is not much of LLVM that is used. So that's still modern C++ using standard libraries. It does not use LLVM API, it does not use some of the LLVM data structures. So the community came back with some suggestions saying that you have to use these LLVM APIs, confirm more to LLVM practices and all that. So some of these are listed here. So some of these are already done like moving the public headers to include folder, renaming CC files as CPP files. Although this project used Clang format it had a few more additional settings. So we are seeing whether we can remove all those and also these other things like file system handling, it uses used standard all stream and all that but LLVM has its own stream handling. It also used some scripts to do the testing. It has to be ported to use LIT for testing and also finally to use LLVM data structures wherever applicable. So you can use dense map or small vector and all that wherever it's possible to use. So one of my colleagues David Truby is actually working on all these things to try to get it so that you know it's more suitable or it looks more LLVM friendly. So in this slide I basically mentioned the status of this project. The password work is completed. This project passes for TRAN-28 in completely and also open mp4.5. The semantic checks are mostly complete. Work is in progress on the MLI based of optimizer. Work is beginning on the runtime. Some portions of so basically the initial plan was to use the old flying projects runtime for IO but finally it was decided that we will rewrite it now then reuse it. The math library will continue to be PG math. So there's a PG math library which is the math library for the old flying project. So this project will also continue to use it and work has also begun on doing the implementing the open mp portion. So I have also given a tentative timeline for this project. Moving to the LLVM project report should happen in one or two months. Serial code gen by middle of this year. Parallel code gen with open mp4.5 early next year and open mp5 with co-arrays which is the parallel feature embedded in the language by end of 2021. I have a slide about contribution if someone is interested in contributing to this project. This project welcomes contribution. Code is out there currently in GitHub. You know you can submit code or even bug reports. There is a documentation directory which has a lot of documentation. For people concerned with C++ style there's a C++ style and if someone is not familiar with Fortran there is actually a guide for Fortran for C programmers. It's basically lists the differences in Fortran compared to someone who is used to C or you can start with the overview documentation also. There's a project page which has a list of various items in progress, things which are completed or things which are going to start or you can pick up issues from the GitHub issue tracker. Basically if you want to contribute something it will be good to send a mail to flying dev so that you're not duplicating someone else's work. Code reviews happen in GitHub itself. There is a file called pull request checklist. You can read that. That's also in the documentation directory if you it's basically a checklist before you make a pull request but it should be noted that once this project makes it to LLVM some of these things things will change. Basically it will not be pull requests will not be in GitHub reviews will happen in fabricator basically. So in conclusion all Flang demonstrated that an industry strength high performance LLVM based Fortran compiler is possible. The new Flang or the FITN project addresses the deficiencies of the old compiler. The new Flang is accepted as the front Fortran front end of LLVM. Submission is expected to happen soon. It fills a key gap in the HPC story for LLVM. It did not have a native front until now. It's written in modern C++ uses MLIR shares code with LLVM wherever possible particularly in open MP driver etc. As I mentioned it also is very friendly with standard so it aspires to be the platform where people will come and code and check whether you know this is a new feature that can be taken up in the next standard. It's act under active development and you can contribute if you're interested. Thank you. WRF which is a weather forecasting application from the Americans. They state please compile with Intel because it's 30 percent faster. I didn't see in the Intel compiler results in your benchmark comparisons. I don't know whether WRF is there and there it's part of spec also. No none of them is Intel. It's Flang. It's PGI and the GCC compiler. Makes me buy 800 euro CPUs. But so I was wondering is there in the future plans is there like a performance review of an optimization. Is that there or So basically the question is that for applications in weather forecasting like WRF the suggestion is used to use a proprietary platform dependent compiler like Intel and is there a plan in the new Flang project to do a performance review at some stage. So as I have mentioned there is actually a high level optimizer as part of this project. So when you even when it reaches maturity and when it generates LLVM IR and you can actually run executables these things will be checked to see whether it's as good as the Intel compiler or the other compilers and to be honest to so I am working for ARM if we finally decide to have this as our forefront and it should be at least as good as the old one and preferably it should be as good as the Intel compiler also same with PGI also. So they are all you know performance is very important for all of us and that will definitely be a strong check that will be applied before this replaces the current Flang compiler in the commercial products. You mentioned that a lot of HPC code is a mix of Fortran C and C++. I know like for Rust the Rust developers worked on being able to do like cross-language LTO between like Rust and C++ and they have that working. Is there any plans or was a state of interop between doing LTO between C++ and Fortran with Flang? So if my understanding is correct I am not an expert in this area but once you generate LLVM IR so once you generate object code it should not I don't know how much language specific is or things at that stage so I have actually seen examples where LTO works fine with Fortran as well as a mixed Fortran so I think it should work fine. So the basically the question was whether LTO will work with Flang with Fortran and C or C++ applications. We'll go this okay sorry. So the question is have we started testing this against Fortran reference test suite? So do you have a particular reference you would in mind? So there are some test suits out there but the one which is popular with companies at least is the NAG compilers for Fortran reference test suite. So that is something that people test it against but the problem is that when you if it's error messages and all it's different compilers provide error messages in different ways right the text is not the same sometimes the line numbers are the same but it can also be actually a bit different so that comparison is actually a bit hard to do but we will do that check you know and we do actually run a lot of Fortran reference codes like already we have run it as part of many applications and also some other tests that are part of the whole flying project as well as internal tests that are part of various companies and it seems to be doing a good job and that's why the semantic that's why I mentioned that semantic analysis checks is almost complete because you know it actually finds a lot of issues that are out there also another thing that is being done is that whenever there's a restriction that is mentioned in the standard that check is developers write tests for each of those checks and there is someone who is actually always going and reviewing if anything is missed so so yeah a lot of emphasis is placed on those things sorry someone at the back had raised the hand so the question is that there are two compilers called flang one is the old one and the other is a new one and which one is this performance results so this performance results is for the old one reference see it's not for the new one the new one does not a might just be able to generate lvm ir in some branches but but even the mainstream master branch does not generate lvm ir so it's not in a state where you can actually run code so we have not reached that stage for the new f a new flang compiler yeah so it's being currently merged into the master branch so somebody has gone and done that on a branch uh so and it's still a work in progress so we are not at so and it's not just that also you have to have the libraries fortran has a big library runtime library so that has also to be done so there's still a lot of portions that are not yet complete so these timelines are all tentative and i have seen that these are missed also so uh for open mp 4.5 early next year or middle of next year is the plan that's a current plan yeah so the question was when is open mp 4.5 uh what is the timeline for that


A mobile home fire about 20 miles northwest of Bemidji claimed the life of a 56-year-old man. According to the Biltrami County Sheriff's Office, the fire happened yesterday morning at about 6 a.m. in Buzzel Township. Neighbors tried to put out the fire with garden hoses after they realized someone was still inside the home. Deputies arrived on scene and found the mobile home fully engulfed in flames. Officials say the fire started in the living room where the body was found. After Solway Fire was able to knock down the fire and get inside, they did discover the deceased individual who the coroner's office did determine. The identity was Mr. Eric Shishing, if I'm pronouncing that correctly. The cause of the fire is yet to be determined. The Biltrami County Sheriff's Office and State Fire Marshal are still investigating. If you've enjoyed this segment of Lakeland News, please consider making a tax-deductible contribution to Lakeland Public Television.


I see the comments. I see all of them. Everybody's asking me. You stop reacting to JoJo, it's been like two weeks! The day I dropped JoJo is the day I dropped dead. And even then, I would find a way to react to it. I took a little break, but now I'm back. And we're gonna finish this sh**. No more breaks. In fact, I'll act as if I'm employed by MAPPA. Alright, this episode's called A Hundred Against Two. Wow, on earth could that mean? By two, I'm guessing they mean JoJo's biceps. So let's just get straight into this. Alright, they already mourned Caesar's death. Now it's back to being JoJo. Damn right, he'd go down without a- She could do that. Not the clackers. This doorknob really grossed me out. It's a hand, JoJo. You have like five of them. Maybe you are. It's gonna move. Is this door- The door is attacking JoJo right now. Wired Beck? I killed my lover, but escaped from prison. But then Lord Kars made me part of his gang with a mask. What kind of f**king story is that? Why are you standing like that? You know, maybe I should have read into this show. Yo, she ain't f**king around now. Let me drink your life through that skin. F**king murder him. I'm in a bad mood. Oh god, that's hot. She put her sunglasses on.  Oh god. JoJo, this is not the most bizarre thing you've seen on this adventure.  I'll give you a squeeze. It's anti-man. What is she doing? You do the move already. Mikasa's scarf. She's an acrimon. Oh, that's it. Throw a scarf on your enemy. I don't know what's going on. I don't know what this move is. The process of it confuses me. She flows like silk. Get it? Like the silk scarf? Oh my god, bro. What did they do to the guy in the studio? They set him on fire. Look how happy he is. They accepted Caesar's death real fast. Oh god, he brought the cockering back out. Yeah. It's a promise to... Fight! Look at that shot. I want to jump through that ring. Oh, why?  Why did you say that? Is right. Oh god, the narrator. Whenever this narrator talks, it spells bad.  So Caesar did nothing. Yeah, he was walking in the room. Yo, look at this pair. Yeah, look at that face. You've grown quite a lot in the past three episodes. Oh. Yeah, Lightning McQueen's here. You left his trail. Damn, Lisa. Lisa has time to look like that. What? What is she? Pick us up that up? Oh, it's her. He knows her. Uh-oh. Yeah, who's Lisa? Lisa? Who's Lisa, Lisa? Oh my god. Let's go.  Imagine a answer. Yes, we are. No response. That's creepy. Did you expect them to answer? You've been in this anime long enough to know that. Oh my god, not this guy again. Oh god. Now they talk.  Oh my god. It's a hundred against two. It could be a million against two. I would really see no difference. Kars is just going to sit this one out. He's going to watch the anime like us. Oh no, no, no, no. Stop with the promises and ACDC. ACDC. No, no, no. Now they want the one again.  What's with this way of fighting? What are you doing? What are you serving a towel? What are you doing?  Your best friend just died. Oh god. What is he doing? What are you doing? Oh wait. Oh. All right. He was being smart. Okay. I was being dumb. What's this woman? He said damn. Okay. Tate. Here we go. Tate. I thought he's in jail. He's in Rome. Is she going to Hickey? Oh my. How's your hair moving? They're in a mansion. In a hotel. There's no window. Where's the window open? Don't try to back at me, woman. Where's Hitler? When we need him. Never thought I'd say that sentence. Wow. Take that out of context. I'd get canceled in a second. Are they really sanctioning things off? Jojo, you'll fight him one-on-one. I'll fight him one-on-one. The vampire will be the background. She set up a tournament. Just kill each other. Yeah. Let's just set up a tournament. These two could just murder us. But I'll set up a tournament. Oh, they're all doing the admin in the left. I like this face. 50 kilometers southeast of here. I'll give you the exact coordinates. I'll actually ping you.  Y'all do not have to have this tournament. You could just kill them right here. I don't want that venue. Bring it back to New York. That's sexual. I mean, tension. I felt that. Damn. She's throwing demands at everybody. Making a tournament. Telling them what to do. I'm feeling this energy. Oh, no. Revisiting the site with this song. This OST fucks me. You know what I mean? You know when a song is that good? That's what it does to me. It's the best.  That the guy he looks like to everyone when he said that with his blue eyes. What a perfectly normal suitcase. I love how even the clothes are side characters in the suitcase. Like, you know what the main thing is. I would never guess. I wonder what you'll take. Is this the time to be on the tie? Is that her? Is that Lisa Lee? Oh, it's Irina. Aw, Guany. Maybe Lisa Lisa knew her. Lisa Lisa is...  Look, he's even staring in the... I mean, that's what you're supposed to do in a picture. But that's literally all he does.   I could guess. Guany. Streisos holding a baby. Oh, we're about to learn. We're about to learn. It's because she was involved somehow. Nicky, think your reactions. You could have never guessed that. I swear, sometimes I want to take y'all and...   Oh my god. Want it? We're gonna fight for it.  She's the man. Where's the rest of the world? Like, how is anybody missing this? We're doing this now. No, no, no, no. I just washed that out of my brain. Who was the baby girl? No!  Now we know what y'all meant.  She's 50? 50 years old. This is what 50-year-olds look like in Italy.  Yeah, let's just have this conversation. Let's explain our backstory while there's two ants... God's waiting to fight us one-on-one for some reason. They even got the whole venue. Wait, don't tell me they actually have the vampire. I swear to God, I was so... I was joking! Are they gonna fill the stands with the vampire? Oh, God, please don't do this. Now that's a backstory. She was meant to be an anatomy. What a bizarre relationship. He's talking about bizarre. I kind of miss him shooting up a diner in New York. I want to go back to that. The rumbling's coming! Don't worry, it's just that the referee's coming. They actually are about to partake in the tournament right now. Are these people here to watch? Are they gonna wager? It's... Wait, what?  No, it's a horse, right? Is that a d-d-d-dinosaur? It's a horse! It's a horse, you dumbass! For I know, dinosaurs exist too!  The vampire horses. You know what, man? All right, I accept it. All right, they're just gonna... They're gonna joust! I feel bad for whatever poor vampire horse soul has to have Jojo sitting on it. The beasts have 150 horses. How are their horses? I'd hope so! Now they're normal horses. Just put a little ham on the horse, and it'll behave. Now I know what to do.  He chose an ancient form for this battle, an ancient pose. Only the ancients do this. What would my ancient form be? Be like...  Did he unlock new bones in his body? You know what, man? I joke about him getting bigger and bigger every episode, but nah, nah, he got bigger this episode, trust me. Now he's super Jojo.  Oh my god. That's actually beautiful. Yeah!  He's riding a vampire horse! With a bandana on! I can't even imagine what's gonna happen in this episode. We have horses.  This is the most Jojo-style fight I've seen. You were at work while we looked up at the moon. Yeah, yeah, pardon me. I want to look at the moon. Can you give me 20 minutes? Oh, this isn't a porn episode! Look at this animation! I'd break every rule if I didn't have to pay for it. You even got the horses CGI'd, man! This is important! And that's good CGI! I can't believe they're actually spectating. Sheesh! He doesn't have to spectate! I know it's all about honor, but come on. I'm surprised Speedwagon's not in the crowd. Be honest with you guys.  What are the odds? Look, he even looks like Thor saying that. I wouldn't be surprised if Thor just walked in. He's probably in the arena too. I'm watching a fight. Meanwhile, I could have just killed him. Oh, he had oil in his pocket. I forgot. They stole it from the restaurant. They're just standing next to each other. Like, they're not enemies. You know what I mean? Like, they're just right there. It looks like he's surfing. Which I wouldn't be surprised about if he started doing. What's he gonna grab? I'm sure that's against the rules. Close lining a pillar.  Yeah, what's up, kids? There was a spectator on the pillar! Imagine that.  Hey, it's over. I guess the fight's over. Not like there's like 20 minutes left in the episode. It's over.   Let's see. 90% chance he'll be crushed. I'm amazed how we processed the calculations in his head.  I'm surprised he didn't punch the horse in the face. I would have preferred that. Now he's riding the horse. Now he's surfing on the horse. There's somebody hiding in the horse. I should have thought that. Don't worry, Jojo. You're not crazy, but not thinking that. Imagine sending me this picture like 10 episodes ago that Jojo would be riding on a vampire horse. No, no, no. Surfing on one. My bad.  Disgusting. The horse is getting fisted, and it's still running. How much pain has it endured?  Is this the season for now? Why is the animation so good? Cars, cars, cars. You need to get back on the road, bro. He doesn't even need a horse. He'll turn into a car. Watch. Yep, it's over. You're right, cars. You're right. Meter made one. I prefer not to fight women.  I find it even more impressive. Lisa's doing all of this in heels. She's still wearing sunglasses. It looks like it's pitch black out. What do you mean? What do you mean? There's a whole half of the episode left. What? There goes a glass of wine that was just bored.  He's having a seizure. That's what you get for killing Caesar. Massacre. Now she did the anime live.  I'm going to do it. This guy got all comfortable with his glass of wine. Now look at him.  He wrapped his hand around his arms. I should have seen that. These horses. No wonder why they're dead. Look how long they're running for. He's coming. I'm surprised they don't have announcers. Would they have like two dead beavers announcing this? There goes Wamuu. You were just about to celebrate where you're at.  I thought that was a ninja turtle. Oh my god. I wouldn't be surprised either.  Now he's sitting down again. Let's bring the wine bag so we can waste another glass. Oh, okay, okay. They have a tatakai switch in their head. That's what I need. I feel like I have that already. All right, he's back to normal. He flipped it. Don't tell me he just ate the horse. Imagine I did that just mid reaction.  I relied on my eyes. Stay betrayed me. Let me rip them out of my head. Oh, I forgot. You rip your eyes out. A drill comes out of you. I gotta try that. Well, where's the knife? Pussy eyes.  He's a unicorn. That's what happens. You rip your eyes out.  You should have just ripped the pillar off like Wamuu did. I'm gonna send this to Peter. I'm gonna screenshot this and just send it to them on Twitter. Tell them I love this show so much. Somebody do it and tag me in it. It's the burst of dubstep for no reason. I don't think he's underestimating Wamuu. I think he's learned.  My God, they went all out on this one. Look at this. That's what happens when you rip your eyeballs out.  Try it. I endorse it. The doctor asked you why you did that. She said Wamuu did it. Wamuu taught me. As he said, a trap.   How much bigger are they to prepare to him? I didn't know they were that big. He's joking. Throw a rock at the horse. Throw a rock at Wamuu. That's his weakness. Oh, Jojo's thinking OST is on. I love how he tells him what he's about to say, and then he says it anyways. I mean, of course he's going to say it now. You just told him what he's going to say. What? Fuck. We're playing pinball now. This is where we went from Caesar dying and emotional death of rocks falling on him to fighting two vampire horses with a Wamuu that turned into a unicorn and then we're playing pinball now in front of a crowd. Out of respect, no one was saying nani. There wasn't even a moan.  Imagine? Oh, I thought a jack-o'-lantern was coming out of him. Imagine Easter Bunny just jumps out of his chest. Why does he even need hands at this point? He doesn't need arms. He's going to rip those off next, isn't he? That's not that deep of a fall. He just fell off a horse and it looks like he's falling for like 10 minutes now. It's not that deep of a fall! Ooh, I love the silence of the scene. And here comes the music. Re-buff over. Finally fell off the horse because the horse was was a thousand feet tall apparently. It was taller than the mountain. He threw his arms at JoJo. Why did I think of that? He fired his 7-4 arms from the hole in his chest. That's what I'm going to do. Whenever I need a buff, I'm going to get my chainsaw. Saw my arms off and throw it at somebody. Don't worry, knives will grow out of me too. I forgot about that one. Atmospheric rifts? Oh, so self-destruct. Wamosen, why do I need this body?


Hello friends and welcome to a well, it's a bit of a new one for us We're gonna do a live reaction to the new DLC news that we're about to get in the Pokemon Direct that is happening like in One minute, so we're just waiting For things to kick off my name's Lee also known as Osiris of course if you knew that the channel do subscribe because we do news updates You do guides we do VG content all that sort of stuff So do join the clan if you are around and I hope you're all well having a good day and Looking forward to this. I am so excited for this news. I can't wait. It's gonna be a lot of fun and Yeah, hopefully well, it should like I say it should drop any minute now So we'll we'll just sit tight and wait for it to see I don't really Know what to expect. I hope we get loads of information on Potentially the new Pokemon that are coming into the DLC that will be amazing I'm just gonna refresh it is it is two o'clock. It doesn't look like the video is dropped yet though Okay, I found it. I found it. I found it. I found it finally It's not showing up on the official Pokemon website yet, but here we go. So get into it. Oh Look it's glaring slow, bro. It looks kind of cool It's got to be a poison type, right? Absolux ray Okay, okay It looks kind of big doesn't it? It looks kind of big Like I'm hoping we get a big area. Oh Tangela and execute and poly wrath. There we go poly toad confirmed. I've got it Gang is gone like and rock. Oh, we got all the goodies What was that? What was that? There he is there is No way. No way can't oh g max daughters Blast always looks so badass. Oh my gosh. Did you see blast toys in venus or wow? Those things are cool. There's cup food So cute so cute cup food Polly right there we go. So there's a confirmation again that we need. Where's my poly toad? I Looks proper badass doesn't it? It's a Look so cool. It must be it's gigantic max form, right? I'm guessing and now we've got some crown tundra stuff. I Can never remember the name of that that legendary, but I guess yeah, it's there. It's there. Here we go Who's that dude? It looked like Rose didn't it a kind of kind of maybe a little bit Reggie's here we go We're gonna get some new Reggie forms. It's what we want So the Reggie's are they gonna be crown tundra because this is crown tundra now. I'm guessing What is this me too? Oh? They're restricted The super legendaries awesome and the new Reggie I Love that little red and black one. It looks so cool and the kanto glaring kanto birds Glaring kanto birds Does that even make sense? I don't know but yeah, you see Zapdos Articuno on what we presume is Maltres and now The sword and shield starters with their G max forms This is a nice teaser trailer isn't it? It really is Kingdra Magnazone There's some newbies We've got any come on give us another glaring form or if I just missed it 17th is the release date 17th of June. There we go. We've got it. Awesome. Okay Information you got more we got more we got more we got more. It's all Japanese. I have no idea There's a stuff about crown tundra there We get new gear I guess pre-ordering This new gear that we're gonna get I wish I could read Japanese but there we go Very cool That was amazing. I really enjoyed that I really enjoyed that. I hope you guys did as well I mean, let's just kind of go back through it and kind of dissect it a little bit So yeah, it like straight away opens with Glaring slo-bro, which is very cool It doesn't look what I kind of expected it to look like now I think because in some of the previous trailers, there's like a tiny glimpse of As in the art work when they're going through all the artwork of the crown tundra and isle of armor And you see what looks like a slo-bro with kind of like a cape on So that might be slo-king and this is obviously slo-bro It's got the shell on its arm now So and it kind of looks like a poison type, right? It's got to be a poison type And it's it's cool. It looks it looks cool. I'm a big fan of slo-bro. So yeah, I mean can't can't complain about that. Let's just It's always good to dissect and have a look. So this is this is obviously isle of armor here And it looks it looks a decent size like you've got the the battle tower over here in the corner Obviously, here's the gym where you go and you get your cup food And there's the other tower if you can see over the the left top hand corner. So that's that's kind of yeah It doesn't look tiny But it's not it's obviously not as big as the original games, but it's just it is an add-on of course. So Where else we got Kangas Khan? Executor what else we got there? Something in the background. I think so polytod. There he is. There he is. We spot him He is confirmed. Sorry. Sorry. I'm just like I'm just looking forward to having a really viable rain user again in competitive play. So polytod is amazing So we got we're Lord Kangas Khan Kanga What else have we missed I'm sure this stuff that like we missed the talent flame obviously confirmed Like the big big pots of curry are gonna be a thing There's that like new rivals. I think okay. Let's stop here That that is I don't know if it's Gigantamax slobbrough obviously Dynamax slobbrough Which is kind of cool and then we're gonna get some sneak peeks of there. We go now. Look at these bad boys. Look Yes, this is what we're after. Okay, Gigantamax Venus all looks awesome But look at Gigantamax blast toys. Look at those cannons on his back Oh There's this G max move and blast toys Shoot out from the back with it's like a million cannons. So that's kind of cool. Okay. We know most of the stuff about kubfu kubfu very cute And there's one of the battle towers and I think you enter it with just your kubfu and depending on which Tau you enter is which earth you feel you get which is one fighting water and then Fighting dark is the other one. I think so and then there's their potential G max forms I would imagine their G max forms because if you look at their their regular forms They're not colored. So it probably indicates that their G max forms and then crown tundra stuff So shame we haven't got a date about that


Hello, this is Laptop Media, and today, we will show you how to open the HP Elite Book 830G7 and what's inside of it. This is an incredibly easy laptop to disassemble. Just undo 5 captive Philips head screws, and pop the bottom panel with a plastic pry tool. Please remember, it would be of great help to us if you just hit the like button and subscribe to our channel. That would motivate us to make even more and better videos for you. Here, the cooling solution consists of a single heat pipe and an average sized fan. Interestingly, the CPU has a metal bracket covering it, so it will dissipate some residual heat, not being caught by the heat pipe. What we see next is that this notebook is an upgradeability champion. Despite its small size, HP was still able to fit two RAM Sodom slots, which are located beneath a metal shroud. To access them, just remove the shroud by pulling the tab on the right. The total amount of memory it supports is 64GB of DDR4 in dual channel. Additionally, there is 1 M.2 PCI-EX4 slot for storage, also covered by a metal shroud. And for battery, you get a 53W unit. If you'd like to see more disassembly videos of the latest notebooks we would highly appreciate if you hit the like button and subscribe to the channel.


Hey, sect-goers! Are you a parent? If so, you probably know lots of things you can do to help kids become the best they can be. But even if you aren't a parent, the info in today's video doesn't only apply to kids, but everyone, so keep watching. No one is born knowing how to be a parent, and parenting can be difficult sometimes. Some parents even focus so much on what they should be doing that they forget about what they shouldn't be with their kids. So here are 7 things parents should never do to a child.  A healthy parent-child relationship involves quality time, even if it's just 20 minutes. Spend some time with your child. Studies show that if you're distracted when spending time with your child, children are more likely to act out and behave poorly.  Even if you mean to encourage them, you shouldn't compare them to others. Drawing comparisons between them or their achievements and someone else hurts their self-esteem.  It might be difficult to quell the curiosity of knowing what your child is doing. And there may be times where you want to know more about their life or what they're up to. But invading your child's privacy is not the way to go. It shows that you don't respect their privacy and you undermine their agency. The best way is to talk to them. They may not tell you everything, and that's okay. They're allowed to keep certain things to themselves, but by opening a space for dialogue and conversation, you give them the freedom to choose what they want to share with you. To create conversations with your children, lead with positive uplifting questions and ask questions to gain awareness. One mistake that parents can make is being overly permissive. In an attempt to befriend your child, you might forget that you are their parent. While you want to create a space for them to approach you, you also need to provide guidance and correction. Letting your child do anything they want is not okay. You should establish clear boundaries, and by doing that, you're helping your child understand what is acceptable and what is not, a skill that will help them later in life. Another mistake some parents make is pointing out your child's flaws too quickly. While the intention may be geared towards improvement, solely pointing out your child's flaws makes them incredibly self-conscious.  A person's mental health is also part of their general well-being. So, as the parent and guardian, you should consider your child's mental health as important as their physical health.  Parenting is difficult, and it's easy to forget to take care of yourself while taking care of others. But as much as possible, you should try to take care of yourself as well. Your child is dependent on you, and they need you to take care of them. To do this well, you should be healthy too. Remember, no one is in a position to judge your parenting. But there are certain things that you should never do to your child, and hopefully these tips have helped you learn some of them. Can you relate to any of these points? If so, let us know in the comments, and please remember to like and share this video with people who might find it helpful. As always, the studies are shown in the description below. Until next time Psych2Goers, take care, and thanks for watching.


So let's start. I'm Tomak, and I'm working at Allegro, which is one of the biggest e-commerce solution in Central Europe. We have been using Mesos and Marathon since 2015 on a production. And today, I want to share our insights of why you should consider writing your custom Mesos executor to obtain cloud-native application ecosystem. So if you are not familiar with a Mesos executor, I strongly encourage you to see the Mesoscon Asia talk by Vinod and Greg about deep dive for the Mesos executor. They're talking about more technical details of the Mesos executor and how they work and the authentication and stuff like this. Today, I will focus only on functionality without code. Just we will focus only what Mesos executor could give us in terms of building a better ecosystem for our applications. So just a quick recap to share the same standpoint. Executor is a process that is launched on agent in order to launch a task. It works for frameworks. It just get a task info or executor info, in fact, from Protobuf and start the task that is defined there. So I hope you are familiar with this image. This is the architecture of Mesos. And today, we will be talking about these guys. They are the custom executor for different frameworks like Hadoop, MPI, and what they are working. They are getting information from a framework that are passed by master and works on agents and starts the tasks. And executor is responsible for maintaining the whole task lifecycle. So there are four types of executor. There is a command executor that is probably the most known and used executor in the market. It's using the V0 API of Mesos. It's bind to libmesos native library. It has the capability of running only one task. And there is a Docker executor that is really similar to a command executor, but it's running Docker. There is a default executor that was introduced in Mesos 1.0. It's using V1 HTTP API, so there is no native binding. It has capability of running pods and multiple tasks. And what we are talking about today is a custom executor. So it can be written whenever you like. You can use deprecated API if you like, or I strongly encourage you to use an HTTP V1 API for writing your custom executor. To build a cloud native applications, we need some guides. At Allegro, we follow 12-factor apps. If you are not familiar, it's something like a manifest of how to write a cloud native application designed by Heroku. It consists of the 12 factors that need to be fulfilled in order to say that application is cloud native. And what does it mean to be cloud native in a Mesos ecosystem? It means it's not only bind to a Mesos. When the application is cloud native, it has a really small contract that need to be fulfilled in order to run that application in different schedulers. So if you have a cloud native application, there is no worry to switch between Marathon, Mesos, Kubernetes, whatever scheduler you like. There are no dependency in app, so there is no problem with starting it up or upgrading your ecosystem because application has a small contract that need to be fulfilled in order to application to run. So let's walk through these 12 factors. The code base application should be built from one single repository. So executor will not help us here. Dependencies, this means that applications should have all its dependencies in the application. So it should not rely on a system. So if your application has a dependency to Java, it probably should have embedded Java inside the application package. If it needs a Tomcat to run, the Tomcat should be there or any other HTTP server runtime, like Nginx or stuff like this. Everything should be in a single package that could be run just with a single command or in a container if you can't statically link your application. Configuration. Configuration should be stored in an environment variables. And this is the place when executor can help us. I will talk about it later. Bucking services, this means that if you need to some other services, for example, application require Tomcat to be run in, it should be embedded within an application. Built, released, and run, it's pretty simple. So the steps should be separated. Executor will not help us here. Processes, application should use one or more processes. And it depends on your workflow. There are some applications that are single-threaded. And in theory, executor could help us scale them by running another processes. But currently, marathon does not support changing the resources on the fly. Portminding, pretty easy. Applications should expose services. Some services bind it to a port. So it is easy to achieve in the method ecosystem. Concurrency, we are scaling up the process by adding more applications, more instances of the same application. Disposability, this is interesting. Our application should be available to start and kill at any time. And we should provide a graceful way of starting the application up and a graceful shutdown. Devpro priority, so your DevOps team should have the same environment or as close as possible in terms of configuration and use the tools. Logs, application should stream the logs to standard output. And it should not have dependency on some Kibana on EL cast stack to get to know where to send the logs just standard output or standard error. And ecosystem should take care of where the logs are putted. Admin processes, run management tasks is a one-off task, so executor is not helpful there. So to sum up, there are three factors that we can fix with a custom executor. Confix, disposability, and logs. Let's talk about configs. So the 12-up source configuration in environment variables. What does it mean? There shouldn't be any config files that are stored in a repository. There shouldn't be some magical endpoint to download configuration from. Application should start up with the environment filled with the proper configuration. How it's working at Allegro. We have a certificate authority, which is signing a certificate obtained by Messos agent. We have written a Messos hook that is generating certificates for an application before it starts. Then Messos agent starts an executor. Executor gets the certificate in the environment and call the configuration store to get some configuration. Configuration store keeps the encrypted version of the configuration. And it need to be authenticated and decrypt with a certificate obtained by certificate authority. So the Messos agent is a single point of trust because it has some token to talk with the certificate authority. And then executor take this configuration from the config store and fill up the environment variables for the task and task runs. And it just read the environment and set up accordingly to the configuration. Yesterday was a talk about secrets. And you may wonder why we haven't used the secrets. Because when we started about more than two years ago, there was not that feature in Messos. Secrets are available in, I think, 1.4. So it is pretty new feature. That's why we built something like this. And why we are not filling up the configuration in a hook, like a Messos hook? Because the certificate obtained from a certificate authority is used also to communicate between the applications. So if the application needs some stronger security due to our compliance, they authenticate using this certificate. OK, second thing, disposability. So the application can be started at any time. What does it mean? It should try to minimize startup time just in order to be able to scale fast or if there is an outage to quickly minimize the outage consequences. And it should support shutdown.  Graceful shutdown means that the application will try to finish all the transactions and operations that were started before, but do not accept any incoming traffic. So take a look at an application lifecycle. When the application is started, it's fetching its dependencies, like packages. It's done by Messos Fetcher. Then the health checks start checking application. And application is starting, booting up, like loading dependencies, and stuff like this. Then it has some time to warm up caches. And then it answered to a health check that, OK, I'm healthy. I can get incoming traffic. So what happens here? When application is healthy, we should plug it into our discovery service solution, into load balancers, external caches, like varnish, into monitoring, and stuff like this. So this is hard to obtain with events sent from a framework. Hm.  So when the application gets a sick term, it should be removed from the discovery service and every place that it was plugged during the startup. And then it moved to a killing state.   So why we can't rely on events delivered by frameworks? If you remember the message architecture, the communication between tasks and framework comes by the number of hoops. So when the instance is started and it's healthy, message executor is sending the event of task is running and it's healthy to a message agent. Messos agents send the information to Messos master. And Messos master informs the framework, hey, that instance is healthy. So there's a huge delay between when the application is healthy and when the framework gets that information. What's more, the framework will send an event when it gets that information. And it gives us our events delay. So the time difference between when frameworks send an event or created an event and when our config service discovery solution got it. So as you can see in the peak, it's about 30 milliseconds. And in our scale, that means that some people will get a blank page when it comes to Allegro. And it's not acceptable for us to have errors just by design. So that's why we moved to monitor application lifecycle in Messos executor. So here is a diagram of a task lifecycle in Messos. It's simplified. There are not all connections that should be here. And there are a couple of tasks of statuses missing. So I will describe what is here. The gray circles are managed by Messos. So you have no control in an executor over that statuses. The double circle are the terminal states. The task could not be recovered from that state and probably died. And the dashed circle are optional. For example, command executor does not send starting information, prior to 1.5, I believe. And so let's take a look how the lifecycle looks. So the first task is staging. At that moment, Messos is trying to find a place to set up the task. So there's no instance running. In fact, nothing happened. It could finish in a terminal state if that task has the wrong configuration. It could finish with error or it could be dropped. And then there is a starting phase. As you can see, in the starting phase, Messos executor is started. It registered to a Messos agent. And then it should start the task. So when task is in the starting phase, it's all dependencies. In our case, it's just starting. And then we start health checking that service. So when the service is started and the health checks are running, it moves to a running state. The running state could have set a healthy state. That's why the task could have multiple running statuses, one after another, because it could be healthy, unhealthy, and it works in a loop. And from the running state, when task is in the running state and for the first time is healthy, we register the task in Discovery Service. In our case, it's a console and also with some load balancer if it's exposed to the rest of the world. Then when task is going to kill, it should be moved to a killing state. So before sending a SIG term to an application, we remove the instance from Config Service Discovery and from load balancers. So in this state, application has some time to finish its job. And then it gets moved to be killed. It happens when it's like a regular upgrade. Failed if it was killed by a messes health check, or finished if it's just a simple finish. So why do we need a messes executor right here? Because you can say, OK, but default executor also has a property called graceful startup shutdown and grace period. And in fact, it's not working with the command executor. Why? Because the command executor started a command with a shell. So it started with SH minus C and then some command to run.  And when it sends a SIG term to a shell, shell immediately goes down. Then the messes executor captured the event, the SIG child signal and see, oh, that application is no longer running. But in fact, the application is running underneath, but the only shell goes down. So there is no real grace period in a command executor. Second thing that we find when working with messes health checks, in a messes UI, messes startup time was wrong. And we accidentally fixed it by introducing the starting phase. Default executor does not use a starting task status. So there is only a task running. And because of how messes is handling the same task statuses, sometimes application keeps the last health check timestamp as a task starts it. It was not the big issue, but it could be problematic when you go to UI and see that your task started like a couple of minutes ago while they're working for a week or something like this. OK, so here is an example of graceful shutdown of one of our biggest application that is handling the traffic from our customers. What you can see here, at 3.15, we enable executor. So this is the regular deployment. There was no graceful startup nor graceful shutdown at that time. As you can see, we have over thousands of errors. Then we do a couple of restarts. And you can see that with a graceful shutdown, the errors has reduced to less than 500 and, in fact, about 200. And in the last at 3.15, we disable executor. This means we disable the graceful shutdown of the application and do, again, the couple of restarts. And when you sum up that bars, it's returned to the previous state when there are thousands of errors during the deployment. Yeah, so that's how it helps us. Why there are errors, even when the application has a graceful shutdown, we suspect that the application needs some time to warm up and that was not implemented at that time. So I haven't got a fresh metrics for the applications because it's pretty expensive to perform that type of test to just restart applications. And some users may be complaining that they've got 500 on telegrow.pl. OK, logs. Application should write its logs to a standard output. So there should mean no log files, no need to manage log rotating and stuff like this. When we started, most of our application had a dependency to a Kibana and all of our application were sending logs directly to a Kibana. This means when we want to change the URL or anything related to a logs, every application in our ecosystem needs to be updated. For example, when we want to add some new field in metadata, each application in our ecosystem needs to be updated. And this is hard to obtain when you've got more than 100 services because you need to ask the personal people that are responsible for a given services, hey, could you update that dependency? They probably said, oh, no. We have some business to do. We don't have time to do it. So remove any dependency that is not needed from the application perspective. So how it's working? Executor launches tasks. And because it launches the task, it has control over the STD out and STDR of that task. So it can manage to send the logs to some central log store and also to write them to a file. Executor has all metadata about the task. It's running. So the whole executor info that contains command info, container info about the task. So there is no problem to add information for services so the Kibana can know in which bucket put the log. You may wonder why we haven't used container logger for this because, in fact, the container logger is an interface that has the same capability. You just implement one abstract class from the message. And it gets the same information as executor. So there is executor info. And you can write your logic what should happen with the logs. The problem with the container logger is that you need to write it in C++. And it's strongly related to a message. So whenever you want to update a message, you need to recompile your container logger and see and check if your dependencies has the same version as the message. And if everything was compiled and linked properly and everything is working. So that's why we prefer to use an executor because it has an HTTP API. And there is a guarantee that whenever we update the message, the executor will still work. So finally, who is using this approach? Because I've seen that the Marathon community is not using custom executors. There are some code related to a custom executor in Marathon. But it looks like it's not maintained from the couple of years. Like code is untouched from two or more years. And we have some troubles when it started using custom executor starting from the UI that was completely unaware of the executor thing and some configuration options in Marathon. So Aurora is the best example of a custom executor. I think it's used from the beginning, but I'm not sure. In Aurora, executor is called thermos. And the similar thing that we are doing, as Aurora does, is registering in our case, it's a console. So executor takes care of registering in the service discovery, performs self-checking, the same as our executor. And we do not have some custom DSL like Aurora. So it does not have this feature. And the second popular executor is a singularity executor. It supports custom fetcher. I don't know why they need it, but it uses some fancy S3 downloader. Probably something works better or faster. It supports log rotation. So it helps you manage the logs and stuff like this and support the graceful task killing. So two of the three factors from 12 Factors App are covered by a singularity executor. And the third, I have heard about this executor yesterday. So there are other companies that are investigating. In fact, I think this is OVH that are considering using a custom executor. This GoMessage executor is similar to our other executor built on Go, built on top of the MessageGo library. Internally, we are not using Docker so much, but this has support to the Docker and has a similar approach. So I think you should start using executor just. And here's a quick recap. Why we need it? Control over application lifecycle and environment without the need to query scheduler, muscles, waiting for events, and stuff like this.  And when it's healthy or not, and when it's starting, killing, or anything. So it's a replacements for framework events. So this means your framework can do less because it will not have to send any events. And there is some space for work runs and hacks, as I showed you before, that Messos could have some bugs like this graceful shutdown, or not necessary bugs, but could not work in a way that you expect, and you can fix it with a Messos executor. So that's all. And I will be happy to take some questions. OK, no question. So thank you.