C++Now 2018: Mateusz Pusz “Git, CMake, Conan: How to Ship and Reuse our C++ Projects”

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
- mottos push I work at IBM systems and I must have an independent C++ trainer and today I would like to share with you my findings regarding package management and build systems unfortunately for this talk I requested 90 minutes I got only 45 so I had to remove a lot of material but still have quite a lot to cover so I would like to ask you if it's possible to postpone longer discussions until the end of the talk if we have time or otherwise it doesn't just catch me on the break or something like this okay so to not waste time let's continue and when I was trying to submit this talk to ACC you I've got a feedback that maybe whether I should consider such a subject Mercury our medicine made some Coenen and I said no no way we just already standardized something let's say in our environment we use git we'll see Mike let's not try to different our environment anymore so I would stay with git and and then see Mike maybe this is not our favorite - but but but it seems to be established and already by the way can I see a show of hands who like see Mike and who use a similar work maybe who is a Simic all of you and who have you liked see Mike in fact oh there are quite a few people here liking see Mike ok so this is what we have right now in my opinion we have a say something like quite an established standard for from having get as a version control system see Mike for building stuff and for package managers we don't have anything right now as a standard thing that every project supports but I would say that Connor is a really strong contender here and I would like to introduce it to for it it to you today I am in anyway not not related with current project I just have some visual experience with that I found it working for me so that's why I selected it to to show it for you today first of all I would like to maybe a list typical ways of handy dependencies in our projects maybe once again a quick show of hands if you use external third-party director is in your in your soul tree to store external dependencies yes like quarter of the room maybe you are doing get sub-modules for the same using out subdirectory the same quarter exactly the same people it seems so okay external project act in Simic did you use it on a few people okay and maybe you are down logic and is telling is dependency by hand and then using fine packaging Simic to find them yeah again courtroom I think that this side this is like more active you can also try guys okay and maybe you try it using other languages too such like maven no get in other projects to handle dependencies this is this also happens yes and this last one is have you an expressive Conan already I assume you have at least a few of you but this is a new tool on the market and I would like to talk a bit more about this ok so a few words about outside subdirectory approach let's assume we have some lip I that uses detest for its internal unit test and exports boost as an interface of its in of of its library we are using boost 166 and it as one eight zero for this lip and we have two lips like this we have another library that has another boot version and its sub modules for example or in the sauce tree it has open SSL and it different detest we may have a bunch of those but for the sake of the slides let's have on the two I'd have a project that uses them and of course also has its detest version but its uses the latest one from the from from from the git repo it uses different open SSL and what's now you have Inc boost by system from one boost boost by system from another boost in the same libraries how do you handle that yes that doesn't scale at all and if you can imagine that you have not - but like 20 libraries use in many layers it doesn't scale and even if you have this as a one report you may have another report on the other side and or freemore and you can end up with this approach having like 10 or 12 different boost comp compilations on your one machine and you are probably out of disk space already so so this is one of the biggest problems I see with this approach it doesn't scale and doesn't provide the coherency between between between between dependencies because you're using different of master cells different boost and it may be hard to make this work together ok so let's talk about see make a bet she'd make a snotty bit system is a cross-platform C++ build generator basically this is how you use this tool in GCC and Visual Studio these are only the examples because you can use of course different compilers but basically you can use only Simek and seeta's to do everything you don't have to use and make and make and and other things you can just say C make a build target to install it the important part here is that you can see that you for GCC clunk and and other compilers you put may provide built type during the confusions of configuration stage of this image but for IDs that allow you to switch the debug release mode in some combo box you provided this in not only not in the configuration but than in the build test and and maybe install stage this is important difference between those different targets I would not talk much about C make as a model to make there was a great talk last year here by Daniel Pfeiffer I will just maybe refer to some things that he already told you but if you are looking for more hints on how to use see Mike in a modern way just go in there it's really great talk and everyone using she makes should see it basically the outcome from from from his talk is that built flags don't scale that exchange in public flux has to be propagated upwards it's not possible to my time those flags the large scale and that different projects may may contain under or require different conflicting flags for example we can think that something that unique name like verbals as a preprocessor define can have a word project like values from zero to free from another project from values from 1 to 5 and when you make them global how you want to configure those two projects in your in your source tree for example if this is made global use and to use verbals or or debug level or anything called log level in many projects the same name mother's you make is about targets and not properties to create the target use those comments you have added execute able to create executable you have add library with different options to create shared static object interface libraries there is also specific option for also called Aaliyah's we'll talk about this a bit later and also there is a possibility to create a few of those with an as an imported target meaning that the Simek will not try to build it it will just reuse what's already built and make it a target in a Simic also if you not provide any static concert here for a library it will depend on the build shell Clips option of C make and and based on this it will either be short or static so if you will leave this and not provide anything you can then from external source just configure in the project you can say if you want to build it in a short way or in a static way so I would assume if you are linking static stuff into a large library just mentioned it's a static if something has to be shared just make it short but the final result of your library probably shouldn't have anything there just for the user tool to allow that to allow the user to specify which kind of library he wants to build okay so modern C make it's like from 2013 I specified target xxx commands for example this target link libraries it what's new in there in this model C make is that you can provide private public and interfere modes for dependencies so basically how it works if I need it and my defenders users need it it should be public if if it's needed only by me but the dependence doesn't use it because it's only my implantation detail I use private and what it's not needed by me by the defenders needed for example it's a rather on library the euro provided as an interface of course the fourth option is trivial here if no one's needed you just don't care what's important here is that interface and public dependencies are transitive while private are not what I mean by that is that if you will provide something here in library and it has exam library total link and it has some flags and properties set and they were public this one will also have them in its interface for interfacing public thanks that it makes C make code much simpler much easier much much shorter because you don't have to remember about dependencies all the way I will show you an example here on the graph it turned out that I worked on quite a big project in my company it had like 360 C make files and this is only a part of it and it was not written in a modern way so basically you can see here that everyone depended on everything downwards this is basically the linking diagram generated by C Mike grabbed this option so let's assume that this of Frank got boost as a dependency with fine package it turned out that then every other library and nearly every blackberry here uses it had to find package again has to define all the headers again and has to link directly with the lips again in every C make file here moreover it turned out that the pen that the because of debts use use it sometimes for example this library could use headers from this library because someone just provided directory into the include directories face and the compiler didn't complain about this and you had some some problems with the with the architecture of your application that you didn't know about it anyway I would like you to I would suggest you to play with grab this option of CMake if you are using C making modern wine because it can help you a lot if as you will see in the another graph one of important things maybe here you can see that this library hanging without anything it didn't link with anything actually but it worked because everything was global and linker did the magic for this so it officially didn't have any dependencies but it had after my cleanup the same graft looked like this this is modern C make with with targets it turned out that I have to introduce here some some feedback loops let's say or our subsequent dependencies because as I said this library used headers from this library it was not visible in the previous graph we have some cyclic loops here this is a problem and now is visible on this on this architecture diagram generated by C Meg and it's much easy right now because if this one uses boost then all those others don't have to bother they are just trosset if we progressed to the all the users of this and you can see that right now there is a layered security of the of the libraries which was not the case here it was a mess right now Simic actually provides you the D layers by itself yes question yes so the question is if the lower level here uses boost then if we have to mention about this up in the higher layers layers no we don't have if you are using boost as a public dependency of your library then all the other modules let's say of C make obtaining it or linking of it will have the same the same property will we'll know about all the header files about all the leaves they have to do computer link in order to be linked to a view library so the have to repeat yourself all the time it's make it match it makes it much much cleaner yeah basically I think that it's like okay so the question here is if if I'm using boost directly here should I mention that I'm using boost or just depend that that one will import it yes I think it depends if you are using this directly and you depend on both in this library for example you could depend here on file system here you could depend on the trade for example then you can of course include different boost libraries here at different headers and that's also useful but if you are just using the interface of this library we've maybe five system being exported in energy interface then just use this Libre didn't have to link with boost anytime anymore yes but as escondido beginning let's keep the local discussions at the end because we have a lot of material and I really have only half of time for my presentation and and yeah and now we can see the real design problems yes following don't like us don't do sake dependencies being in your modules and components are your targets I said we'll come to back to the subject and we are back basically what it does it allows you to have a different name for the same library and what it helps you with is that this is the typical name you obtain from find from five package function of CMake and it allows you if you have different Simic files just to refer to this in that way and you don't care if it was just included from an others he make what it was obtained from find package comment it's the same you don't have to have different if devs or something like this to verify if I'm building it from fine package I have to use this name and or this name if I'm doing this directly with including of other Simic files I have to just use the target name so it's good practice to use Aaliyah's that will look exactly the same as your file package exports link and then we use it and another release to option for for package management are the generate X expressions they may be not looked to user friendly but they are really powerful the difference between this and let's say this preprocessor ifs is that people sister each works in the configure face so this first line we've shown in the user cases of CMake and this one is using is being used in the build phase where you are the configurations already done and when you're building you can build as you see for for visual studio in village and in debug mode and this is visible only in the built face for example for visual studio and this is exactly the case here this is bad this is wrong you shouldn't never use C make built type and if because as you've seen it depends on the compiler you are targeting for DCC clonk it will work for visual studio it what instead just use those generate expressions for debug use this one for for release use this one and it will work correctly for your builds another use case is when you are having library that will be installed on the on the on the file system that during build phase you have to find in clip directory and your file tree that you are building they did in the directory but the users of a library when they install it would like to find those in cloud files and on the I don't know your instant live director director yes so this is not the use case for the for the rhetoric generate expressions you say that for bit interface you used victories and for Easter interface you're using Inglot in the InStyle instant directory and this is good to remember about this because otherwise we have problems after installation this is typical modern library example you have introduction saying what version you're using dynamic of the version of the project and maybe version if you want to share it with someone you are having some dependencies find a good fine package you are defining you library you can specify which which version of standard you are using you have some Intel directories but per target not globally provided which liberals do your link with and then you can provide this alias as I told you following Daniels recommendations from last year please have avoided custom variables in the arguments you can see there are no set here and everything works fine set is wrong because it has many many issues for example it's case sensitive and if you will have some typos it will just compile silently without expanding your things you thought you are expanding and so on to use this library you can have for example unit tests or tests I see make module that you depress similar prefix just enable testing for cities to work can you are doing fine package for G test this is how you are you may use your libraries please note that this specific if not target think I will refer to it later and then I do using fine package and you can define your tests and link privately with your with your library for testing this is how I organize my my file tree in the projects basically I have two directories one for sources another one for tests and what's important here is that this source have a standalone see make list file I'm instead alone that it may work that you may go to the directory and just build it from this place and this file never come changes the compiler warnings please do not play with compiler flags in this thing because then if I will include your library in my project and I have different compiler version maybe two years later that has better Diagnostics and you enabled me wo I don't care about your buxom that are only warning Cena in a compiler I don't want to find in your C makes places where you enabled me the highest level warnings possible in GCC it just has to come by for me as it's a dependency I don't care about those problems do not play with warning flags in this file there's another doesn't stand alone directory here test and you can also got into the sector and build sinston and build the project and there's a rapper at the top that just includes those two it's being used mainly for the development for for IDs like sea lion or or or Visual Studio to enable you to open this as AB one big Fink and don't have to install stuff in order to test this is how good this wrapper can look so it's basically just a sub project here and here and you have to enable testing again because it has to be on the highest level of C make in order to work for C test okay how are we doing on time and following Daniels recommendations don't use this and don't glop files avoid variables don't pay six flags directly and a few more things I will not cooperate now because we have really we are real tight of time okay so we compile stuff and we are done yes this is how many library outers think about their projects if it compiles that it's fine I have my project running great no this is a social code as David Sanger said a few years ago here and we shouldn't think only about ourselves we should start our project and make it easy to obtain by others this is the file tree I would like to have it instead in my for example local directorial I would like to my headers being exported and all this email configuration for the targets being exported and of course the binaries and this is how I do it basically this is the abbreviated version of the C make we had earlier with the most important part and parts here and you have to provide install with targets my library and provide Rd and directories you would like to install and you build basically this exports here then you can say that this exports has to be exported to the specific directory and specific file configuration for this and the next place this one that you use in a Lea's to yes and this is a lot of boilerplate I I admit I don't like it but it's needed for the project work properly I hope it will be make a bit easier made a bit easier for later I did some macros for me Toto to play with it and make it easier you can find it to my github repository but I didn't put it here then you also have to copy all your public headers from project and you also have to provide the version file and install everything with your configuration to specific location a graphic file may be really trivial setting just you want to find the potential for version 1.0 and just include this targets file that was created on the previous slide ok so what is the workflow I would like to substitute for for testing of this go to the source build directory and build your library and install it yes so your instant built a kinky phase built correctly you are installing it and then go to the test directory that is also standalone as I said built and install my Susan sorry use this installed location for ant test so basically what it does it used it builds at instant stuff to your disk and then check if the package is correctly installed and test run with it so this is another approach all rather than using this global standalone at highest Simek that is being used for development on every ability as you use on your machine where you are just building and using unit tests on at the same moment your other may also test your installation stuff that way and that's in fact by the way why it was so important to have this if not target in one of the SIMEX because at some point sometimes if you're using this higher levels he make the target is already defined between because it was created by add subject to subdirectory to source but in this case you will not have this target created you have to find it by find dependency find packages in order to make it work so this white this was there there if in the in the previous slides however Simek is not the final solution for for our package handling and end dependencies you have to build each repository in isolation generate and install thanks to your disk and and then find package for all of it there are problems if you want to recoup PI stuff or you want to support different versions or different compilers for example you want to build it for GCC for Visual Studio for crank at the same machine for debug for release for and it's all relative depth at nip info maybe you would like to use different runtime libraries in Visual Studio or different package configurations with exceptions without exception sponsor Pacific debug warning levels or whatever you have as a preparatory commands all of this makes different options and installing this on your machine and then referring to add them with file package will be really really hard if you have like 20 different configurations for each package and I think these are the things that every one of us would like to have a talk about the package management one built based projects and all the dependencies only things that are required are being rebuilt if needed we use pre-built binaries wherever possible no need to manually download stuff built and install it should be done by the package manager yes a possibility to use our own versions so if you have some sleep or or or boost in installed on your file system you want to use maybe your own version that is much much newer or older for some dependency or compatibility checking than the one that is installed on the system and with that I think that current addresses all of those features that is why I wanted to show you that that too today Coenen first of all is open-source software and it's for free so you can use it and anywhere you want it's decentralized like git it's it's huge advantage here and servers are dummy they are just the package stores they do nothing interesting there they are just keeping the data the or the logic is done in the client it's responsible for pre building binaries for building from sources and so on it's portable it's it can be used wherever Python can be used it also uses Python for its scripting language it works with any built system see make is one of the possibilities here iscope once you make here because I said it's the facto standard right now in our environment but you can use it wave with pure mic or other things and it's easy to coast this is basically how : service looks and we have three possibilities here we have either simple application column server that is also open sourced or we can use a different artifactory or refried beans way to store things those are open those are available for open source software for free at least bean tray but also as I mentioned here a day forecast factory Community Edition was released like I think in February this year for C++ and you can just use it in your company this is high quality server food : for free we are using this already atiba I'm basically to start working with : you have to understand how the identifiers looked and works first part of the net fire is a package name usually is a project or library you pack there is another part is a package version it can be any string but it's recommended that it's typical string with dots of numbers with dots because then you can use like ranges of versions but you can type things like our c1 or something like this if you if you need user is the next part here it means who is the owner of the package you may use for example official content packages then this user will be Conan but you can build your own and then it will be like your companion name or your private name you have you may have your own alternative versions if needed and channel it means the different streams of the of the same package for example it may be different maturity level of the package not the library itself for example you might just create this package like two or three days ago and you don't know if it's stable you can say it's testing phase of the package it may say for example that is built with some specific options for some specific project this is the specific branch of this of this build yes using this channel this is basically how the package should look on the artifactory basically it has export directory where you can find Conant file Python or takes that depending on dip on the package mmm probably Python for those installed on the quartz factory and you have different packages for different configurations when you download it or install to your disk as it looks similarly but you can find that only one version of gee test was installed because I needed only one it's not that I'm downloading everything that's on the server is on the things that that are needed are being downloaded and installed on your filesystem they're stored globally in one cannot directory so all the projects will reuse the versions if they will have to use the same version so you will not end up with ten versions of the same boost version in different size in different repos you have one centralized place to store the sources and binaries for the same version of course because if you'd like to have different versions then you will have different hash hashes here for each version or for each configuration if needed or here here will be version story and here will be configurations at work with : you can do current search to find local cache and and serve and list all the libraries you have right now in the local cache by saying local cache I mean that you can work offline with : as long as it's already download on you disk you can rebuild stuff you can install stuff and it works you don't have to act you have to access the internet they can inspect the inspected the details of this I will show you in the next screen is how it looks and yeah you can expect also dependencies of cover of current project I will also show you how it looks and you can also generate graphs which you make of dependencies or of configurations you support this is how could an info looks basically it provides you information for open SSL that was import most most important here that this open SSL requires the leap and then automatically this leap is printed and downloaded and installed on your system because it's a next level dependency on your project that you even don't care about and this is how Colin search looks for specific project it was information that this hush that we've seen earlier is built for specific options these are basically like purposes or plaques let's say or this this is the C make shirt option for libraries and settings meaning what compiler and what configuration you want to use H if you change anything here you have a different hash and it would be different package on your on your disk so everything makes another copy and you can store them in parallel and come on really nicely handles that for you to East a specific package back-end you can just say cannot install and provides the identifier sign which you want to delete for example for C make files and everything will be download that compiled if if it isn't if it is not compiled for a specific category and files for Simic will be generated and but it's not user friendly this so basically you can provide two different files either current file txt or Python version of this file with all the dependency and configuration you require for your project and you just basically pry the path to this file from Build director in C make and it will install all the dependencies for you you can also provide the profile you use so basically we have profiles for different compilers for debug for release or specific build types on your disk then you don't have to put any flags on the command line by yourself and it will provide built missing or based Pacific project name like detest if it will build this project from sources if it's not built otherwise it will just exit the installation process I think that cannot find pre-built binaries for this project okay this is how color on files looks it takes the version of it you have three base groups here you have requires saying what are the requirements of your of your project specific options and it will refer you on the next slide and generators will scope one Simek only here because we care about Sameach so as I said at the very first slide in Kannada file Python it's really the same it said maybe a bit complicated but it applied the same information it requires closed and in generators here when you want to place the options likes I think you want to build it as in a short version you just provide here the option here or or here and then those labels will be built that way or don't know that that way if available on the server or you can also provide those options from the command line we have specific syntax you can also build all the dependencies as short with with star you will find out when using short versions that you're sometimes will have problems with linking and execution execution saying that you cannot find dll's needed to execute this library so there are specific impulse close and imports function here saying that you want to copy all dll's to your current binary director in order for the dependencies to be found I cannot fight Python in Python version provides you more power than the text file for example you can add here somatic as the module provide configurations you would like to be able to build with CMake and provide simple procedure how to build so this creates he makes object and configure step by step in step and then you can just build all the project with all the dependencies with this tool to come online you don't have to use any sim a common common common ties then just use cannot install stuff and cannot build and everything is done for you also for example you can say that you have to specify the options like testing shuffles and the default default option for your package is testing equals false and then for example we may provide the method requirements here saying that if you are testing stuff you may want to try this dependency but for stable builds just use the previous one that was that was already checked so this basically makes the some of the requirements dependent on the configuration that you can provide easily as we seen in in the drink build and there are many many more features here's for codified by Python version but we don't have time to cover that current profile face looks like this they have settings options environment variables and maybe some built requirement stuff there are stored on the default in the default profile or anywhere in the project so you can either have it on your a global platform directory or in a project source files and basically this is how it looks for my block 2017 you have to measure that's windows 64 bits version 15 release 64 bits here again for this is for cross compiling basically and maybe you can paper maybe price for SAP environment variables environment variables are most useful for for example for clunk to specify which binary of clock you would like to use you can easily overwrite those things like you can provide it this is my profile for for Visual Studio but as you can see it's for release but you can say build type debug and you have debug or you can create another profile for debug dedicated for this specific purpose you can also include some some profiles from another profile so it you can make them like depending on each other as you can see they can be put on the on the disk and then in the project and then you can refer to them in that way ok so how to use it whoopsie make how we are on time basically how I use it I try to use it transparent in the transparent wave right now as Colin is not as an established standard yet on our in our environment then I assume that the kana specific part is only used in Simek when this specific file is generated by the qanun it's found on the disk if it's not found I just assume that someone configured stuff in the environment that fine package will just work so you know for example D test route was provided to the environment settings and it will just work for me Coenen in this file actually provides you the path to complete this route and this is the the power of this file so that have to provide it it will just provide you the link to or path specific version of the data that you want to use and that specific configuration there are some specific options that you could use here you can either use things that are referred in the documentation so can build basic set up target to create targets with definitions all of all the packages we have in kernel package name space and then you have things like G test boost and so on and but this makes things a bit repetitive which I will mention next slides so you can use also cannot set find pups only here that will just make defined package to work and don't create any targets for you or just directly said see make module path from the qanun variable is created in this file running both five package G test and current basic set up targets duplicate Argos because as I said already the column will create those those for you and of course find package will create those and you end up with two targets for G test which is a bit problem right now as I see with this solution and there is always a question which one to use and this basically depends in general five package are more mature because they are on the on the on the market like for many years right now but they also have some some issues and sometimes my package basically is really hard to to address transitivity but there is working progress stuff I implied you the link for this I saw in Louis was active der wien destroyed and but maybe we'll discuss this later on if unit and does not support multi configuration in fine packages so if you are using fight package you cannot easy switch in Visual Studio release to debug to work with you know that either Visual Studio working in in C make mode will create you two directories separate or you generate all also specific solution file for specific configuration you cannot easily switch from debug to release issues with from file package are sometimes exist for example you cannot build the latest G test with the authorities the latest or the latest release of the D test that by the way was released like nearly two years ago it's I don't know it if it this position is maintained or not anymore but but there are no releases at least public once great so I hope it will build fine on Visual Studio done but anyway a 5 package has those problems and for example then Konan recipe fixes it in such a way that in packaging for of qualified Python if this Visual Studio and version bigger than 17 or equals a 17 the specific flux are appended to the compilation so in such cases you may want : targets for example rather than than the French package ones to use : package if there is current variable you can use this this if statement here or with latest image 3.11 you can use such an approach of interface libraries for for imported targets it also works fine right now with the latest Simic I had to skip the subject sorry so I will not talk about package creation I can talk like can happen aware what already becames or critic a package under see make under : sorry I wanted to show you this having 90 minutes but we had only 45 so for now peace refer to the current documentation it is really great and you can find a lot of information there and hopefully see you and CP pecan where I will have maybe more time to describe it and maybe do some some hands-on stuff there also to show you how it works on the platform as a summary many projects they'll do not use to make at all it's a problem right now right now as you may guess establish standard in my opinion many projects do not use to make in a modern way and even if they do they do not try to means to install stuff and then to reuse them so please think about this and and if possible update used to make files in order to to be compliant to be social and to and to work with that regarding : it seems that is a production quality package manager' already it is it has version 1.0 release last last winter it's free for use quite easy to use documentation is really good give it a try yes I do there's a lot of people who are saying like we're not doing this great but no one is actually going out and saying yeah so basically the question is is there any linter for somatic and the command that we should have here oh budgets for for those that are doing this great I don't know about any leader for Simek but I would really recommend you using this workflow as I shown you so please if you are doing everyday build during development use this top level see make it's convenient it's easy to use but please consider making your team extend the loan for the library and send the load for testing and use it in your CI builds for example to verify if you package installed correctly and it is being imported directly later later on by the by the defenders so you are sure that it's easy to use your social and and and it's really good quality package then this is my recommendation if one is someone would like to create a linter for it it would be great yes question and the question is that or the comment maybe is that right I mean come on we don't have many packages being parked by the icon on team yes this is true but there are other also repositories from bin crafters and there is also content community you can find most of the packages there if there are some missing you can either create your own package for Conan or you can still use it as Simic base or a solution base that that's that that's the the legacy stuff but it's I think it's much better if you find this that this can be used by someone else just to contribute this package to kind of community and then it will be put to Comicon Center it's pretty easy to create those packages I hope to project it becames maybe in City pecan we'll see yes question so just to rephrase it and then if I forgot you you'd like to install make : install stuff to your local director in a project rather than to some global stuff yes yes the comment from Louie here is that if you're using the same options for the for building the project you should end up with the same binary it it might be true in many cases but sometimes the recipes are are being developed and they are not stable sometimes or they're in testing phase so maybe maybe this this will be a bit different built but if you are using a stable already package of Koenen then it shouldn't change it to be exactly the same configuration for the same compiler because as you see in the configuration provides you all the information about the compiler version compiler kind of kind of the compiler compiler version configuration of this compiler there so I assume it will be exactly the same built for you I'm I'm sorry but it is we are all the time we can discuss this after was it God because we said like for a few minutes to switch to another presentation so with that thank you very much hey if you have any questions just contact me during the break or later on [Applause]
Info
Channel: CppNow
Views: 12,485
Rating: 4.9587631 out of 5
Keywords: Mateusz Pusz, C++Now 2018, Computer Science (Field), + C (Programming Language), Bash Films, conference video recording services, conference recording services, nationwide conference recording services, conference videography services, conference video recording, conference filming services, conference services, conference recording, conference live streaming, event videographers, capture presentation slides, record presentation slides, event video recording, video services
Id: 6sWec7b0JIc
Channel Id: undefined
Length: 48min 37sec (2917 seconds)
Published: Thu Jun 07 2018
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.