Well hello my friends and welcome back to my channel. Today we are going to be doing a request video from you guys and this is my Christian Designs binder. I have now condensed it down to one binder and people have been asking for a Christian Design sticker collection. I did do a sticker collection recently with all my like envelopes and stuff and talked about where I got everything so this might be a long video. I'm gonna try for it not to be but I don't know every time I say that it ends up being like 45 minutes and it's like insanity. So I want to just talk about my categories really quickly or talk about it at least in a timely manner and then like how I kind of have these organized. So in the front I've got two sticker sheets that were part of the go wild I believe and then in here I've just got some other like random samplers and this was from go wild as well and then in the very very front category which this is event stickers but they're not all event stickers I'll show you everything in a minute but these were all from go wild go wild and these are just like some little extra things that I have that are Christian Designs so I just put those in there and then I actually just got these not too long ago these are like some transparent stickers from her and I don't know I just really like them. So we get into my event stickers I also have half boxes full boxes flags and arrows holiday sets oh this should actually be up front so I will put that up front too but this is what it looks like. Awareness stickers I've got monthly stickers I've got quotes icons functional strips health and wellness and then I used to have hexagons I don't have them anymore but they're still in my little thing here so anyway I've got these cute little boxes if you guys want to like I know not gonna say every single like KAD number but feel free to screenshot it and zoom in if you want to I'm gonna try to not put my finger there so let's just flip through these I've got lots of different half boxes I'm not half boxes I'm sorry these are all event stickers but these are one of my like ultimate favorites these stickers right here I don't use them as often as I feel like I should I kind of forget that I have them if that makes any sense ooh this one I only have two left of I get very excited when I am like finished with a sticker sheet so that's exciting I need to use that but yeah so I'm trying not to put my finger over these in case you guys want to screenshot those but yeah I don't even really know if she has all of these on her website I started collecting Chrissy and design stickers back when I first started planning this was like before she had her shop full-time and would only come out with just like a select few things once in a great while and yeah so I just really love her stuff her paper is really nice if you do want to write on her paper I'll leave a link below to these is the pilot ultra fine point permanent that's what I like to write on my sticker sheets with so that's just my jam but permanent is what stays on if you use like a gel pen or something it just doesn't work it just kind of slides right off the paper because it's kind of more of a like a vinyl-y it's not vinyl but it's vinyl-y type of a paper which is really really nice so I actually just got these recently and these this kind of a color way which I really like so yeah so and I do have some that are just have like I put these strips on them a long time ago oh here's another one that's down to sweet um so I kind of made my own sticker strips to like put them in before she had pages that were formatted like this where you can actually get them punched I believe that they're not any additional like cost to get them punched to have them like binder ready if I want to say so yeah but I don't know I just love her stuff so much okay so now we are into the half boxes and there's lots of really pretty ones in here lots of different color ways the things that are empty used to be gold just like this one right here this is one of my first sticker sheets I ever got were these ones and love them so much again I just don't use them as much as I should I really should use these a lot more I use Chrissy and Design stickers the most recently for like some of the icons which we'll get into in a little bit when I did have two binders one was all functional stuff and one was all like decorative icons and like different things like that but then as I kind of used up some of my collection and got rid of some of the collection then I kind of freed up a bunch of space for me so now we're into full boxes and yeah so it freed up a bunch of space and then I was like you know what I just want one really big fat binder so yeah but I love these little scallops I think these are really cute too oh here's a different one more scallops these scallops I have I didn't even like remember by anyway okay so here's all my flags and arrows love these little tiny flags or little arrows I don't know why I haven't used these oh you know why because on some of the samplers which I'll show you in a minute they have little arrows on like like some of these samplers like this one doesn't have it but there's a lot of them that have them on them on them on there and then like some little banners more of these little banner flags super cute and these ones are really fun too and I've used up a lot of these sticker sheets like over the years clearly but yeah I just think those are so nice and these are holiday sets I don't know what she has on her website and what she doesn't anymore but yeah lots are really cute little things here for like kind of red and green this one actually was like a monthly kit that said like December on it but I just kept it because why not and then there's like a Thanksgiving themed set and I've used some of these but usually when I buy them I usually buy two because I feel like I go through them and then these are some awareness stickers so I have like a breast cancer one which I don't even think no I've never used one of these maybe I should like make it a point and use this and then also there was some Texas themed stickers from the hurricane that happened last year in Houston and some of the pros I believe don't quote me on this but I'm pretty sure some of the proceeds of these these stickers went to some sort of charity that was helping out with the victims of the Houston hurricane that happened last year so anyways so yeah this is that and then here's monthly stuff well monthly oh and this then this one says decoration I don't know having an identity crisis over here so yeah these are kind of like more deco type stickers so this has just like a bunch of different icons for the holidays and another one and then this is like a Thanksgiving one that I've used this not out of they only have a couple of things left on this one I'll probably you know maybe use some of these this upcoming year we'll see and then I have these really cute quote ones and most of these I think yeah I think these are all Cindy stickers and she does this really pretty lettering so this says make pretty things and I just actually got these not this like sheet not too long ago I just thought this was really pretty with like the scalloped edge I think this was so nice I'm not like a big hand-drawn sticker person if you will I like things that are a little bit more symmetrical but there's something about this Cindy's writing that just like gets me every time and then also I have a bunch of different laundry stickers so these are in the pastel version and then I have the bold version as well so I've got more bold I like the pastel but I just don't use it as often and then I've got this one that says snow day and then I've got this one that says lazy day and then this one says sick day with like a little box Kleenex which is cute and then this one's one of my favorites it's planner friends make the best friends I've got a couple of sheets of those and then this one says planner meetup and then wake up kick ass and repeat because we all need to do that on a daily basis and I love this one go the fuck to sleep yep I need this a real reminder for myself too because I get so caught up with like doing things especially on the internet like I just I get in the zone you know and it's just like oh no I need to go to bed all right so here's a bunch of icons so here is like some mowing grass situations got some lobsters and some colorful eggplants regular egg plants and got some little like I don't know circular icons that don't have anything in them and then we start like our actual like little I don't know like little coin icons like little circular icons I got a bunch of those I've got some like hangers and I've got lots and lots and I've used several sheets of these the cameras because of you know the YouTube and vlogging situation love these little mini printers I remember when these came out and I was like I need all of those the TVs to be honest I really don't use these too often I should use them more but I don't watch a lot of television so my life is kind of on the internet I also love these little cars and love little car washes I've only used one I don't wash my car that often I need to that's like a goal for 2019 is to like wash my car more often which is odd and then we've got these little laundry stickers and light bulbs I actually just got these not too long ago and I've actually used quite a few of them and it's like little power drills because you know I need to put in my planner when Emily's being too handy and then I have these really cute little scissors and musical notes some pills and then some little clocks with little reminders and then also some travel stickers and then we're into a functional and then these are some payday stickers which I love I also have a couple of different sheets of these and these are all of the like I use them as like dinner stickers or like out to eat stickers so I just write either where I went or who I went with or something like that I actually use these in the last couple of plan with me's so yeah and then these are one of my all-time favorite I've used several sheets of these and these are like the little movie placard stickers I use these to like denote all my YouTube videos like this here I'll put this one up here like this one I did like a YouTube thumbnails video and this one I like posted a vlog so I don't know I just really like to put them in so I know when I'm posting things I've got several more of these but yeah I always have a lot and then this is like kind of a grayscale one which I love I've got another grayscale one and then I've got little skinny home stickers which are awesome you know I've never used these ones yet but yeah they have the bigger ones and I've used some of the big ones already which are awesome and these are just some strips so there's like these cute little military strips and then little like ones that just say weekend really really tiny and I actually have used up a couple of sheets of these over the years here's some health and wellness ones and then these are like the little cross and then I've got little like more like longer-haired like more female like nurse or doctor and then like more of them like a male nurse or doctor and I can actually get rid of this one because I did get rid of all of my little hexagons I had these little tiny hexagons which were really really nice but I never found like a really good use for them so I just decided to get rid of those in my collection so this is actually where this thing should go oh no it shouldn't because I actually have haha I like when things are punched already makes my life easier so very cool so that is my entire Chrissy and the designs collection I hope that the video wasn't too incredibly long for you guys I kind of wanted to like speed it up a little bit clearly you can go on their website and check out all of the beautiful things the sticker paper is amazing like I said if you do want to write on something make sure to use a permanent marker I know like the Sharpie permanence work there's also like the microns that are the permanent ones work there's lots of other ones that will work for you but these are just my favorite is the pilot ones and these come in a variety of colors I think it's the black blue red and green if I want to say right but I've had them and I have them in black and then I have them in blue as well but just love these and that just goes really really well it just takes a moment to dry on the paper and then you can peel it off very very easily but yeah that is it I hope you guys enjoyed feel free to leave any comments down below with questions clearly Chrissy and designs is one of my favorite sticker shops and I will keep buying from her over and over and over again and then she's just got beautiful quality items which I absolutely love and I believe that her stickers some of them not the ones that she sells in her stop in her stop in her shop but very soon if not already I'm not really sure when this video is going up but she is going to be in Michael's stores which I'm so so excited about so as soon as she hits Michael's stores I'm gonna go check out her stuff see what's there I believe she's still gonna have a similar vibe but if I remember right I think she announced that all of her regular stickers are staying the same in her shop but she's doing exclusive items just for Michael's but don't quote me on that I think that's how it's gonna go that the items are gonna be different like Michael's is gonna have different items on her website and vice versa that'll be so exciting for her to have her items in a nationwide store like that's just so awesome so anyway that is gonna be it thank you guys so much for watching I really really appreciate it if you do like this video make sure to give it a thumbs up and feel free to subscribe if you'd like to see more and I will catch y'all in the next video bye guys well folks it's time to kick it old school


So welcome to Jenkins Platform Special Interest Group. It's the 11th of February, 2022. Topics we've got on the agenda include open action items, require Java 11 or newer, Linux operating system support policy, switching Linux packages from System 5 in it to System D, and an exit lifecycle change. Sahitya, any other topics you'd like to put on the agenda? No, sir. Okay, great. Well, thank you for joining. So I'm just going to go through these. I think the meeting will be relatively brief. So we've still got the open action item on plugin installation manager documentation. That's one that I need to take action on. It's just lower priority given other things are much more pressing. The most interesting one for today's session is that we're laying out plans for when we will make the transition to no longer use Java 8 as a working choice for the Java version used by Jenkins. And so this Jenkins enhancement proposal that is on screen right now is proposing what the steps are we should take in order to switch from Java 8 to Java 11 as the primary JVM. So let's get that visible. And it talks about the plan. It talks about which changes need to be made, why, et cetera. So, so encourage people to review it. Welcome them to review it, et cetera. Okay. There are, there is an Epic in Jira that is tracking this. And it's got four or five items right now. There are a number of candidate issues that need to be reviewed. And there are, there's the Java 11 Epic whose its issues also need to be reviewed. So there are a number of places where we can use help as people look at this to see are there other problems that we may confront as we drop support for Java 8 and make Java 11 our new minimum. Yes, sir. Then the next that any questions on the Java 11 change. I am new to this open source organization. So I want to know how I will, you know, contribute the course. Oh, good. And I am happy to help you with that. That you with that, Sahitya, let's, let's plan a time when we could do some, some, some mentoring and you could join us for Google summer of code office hours, for instance, or documentation office hours and happy to give you help getting started there. Definitely. Great. So if you want to just ping me separately as Mark dot Earl dot wait at Gmail dot com on email, I'll be happy to schedule a time with you to help you get started. Yeah, yes, sir. Yes. All right, thank you. So then on Linux operating system support policy, we've not had an explicitly declared support policy in the past. So this document is adding an official support policy. And it talks about why we want this policy, what the platforms are that will support, etc. This was opened about a month ago and recently was revised. Look forward to people doing further review of it before we before we merge it. Okay. The last topic is on the Linux installer packages so the RPM for red hat the RPM for Susie and the Debian package are currently using system five in it as their as their initialization manager. We're going to switch that to the more modern system D as part of a poll request that's been submitted by Basel Crow. That poll request needs much more testing. It needs more documentation. So if you'd like to contribute to Jenkins this is actually it might be an interesting place to help us with performing tests and exploring it. Yeah, if you refer to this poll request here, you can see some guidelines on how to test it, the kinds of things to be tested, some of the bugs that are being fixed by it, etc. We'd love to have your help there if you've got Linux experience. Yeah, or if you're interested in developing having Linux experience. Yes, this is sure. Great. All right, thank you. And then we've got a some changes that are have recently merged to Jenkins core that first became available in Jenkins to dot three hundred thirty three. That will first be visible in a long term support release in June of twenty twenty two. So this change won't be fully implemented until at least June of twenty twenty two based on current plans. Yeah, those are the topics that we wanted to cover today. Any other topics. Other than you and I scheduling a separate session for some, some onboarding. Sir, I want just to know how to contribute. Just that's the main topic. Great. And I am happy to help you with that. We'll, we'll, if we can do that in a separate session, just send me an email message and we'll do some planning for that. Yeah. All right. Thank you. Then I'm going to go ahead and call this meeting done. And thanks very, very much. And we'll meet again in two weeks. Definitely.


Welcome back everyone. Today, we're going to talk about Linux memory analysis using volatility and specifically about building Linux profiles for volatility. This process, it's not very difficult, but if you don't do it, then you might have trouble, you're very likely to have trouble using volatility to analyze a Linux memory dump. So the first thing I'm going to do is actually collect a dump of memory from my own system running Ubuntu Linux. And I'm using LIME to acquire a memory image. So LIME, I need to first build LIME. So whenever you look into the LIME folder, you should see something like this. And basically what this does is LIME is a kernel object that we load into a Linux system and download, gets access to memory, we can download memory using LIME. So the first thing we have to do is actually make it or build it for the suspect system. So the issue with LIME or the difficulty with LIME and especially on Linux systems is that you have to build for the exact system that you're going to use it on. So if the suspect system is a Ubuntu desktop using a very old kernel version and you want to use LIME, you have to build LIME for that specific kernel version. So you need to do a little bit of research on the suspect device, what kernel is it running, and you have to compile specifically for that. I'm just going to compile for my system directly, which is using the 4.4053 generic kernel right now. So if you're compiling on the suspect system or on the device that you're looking at, it's much easier to compile, but obviously it's going to make a lot of changes to the system, especially to RAM. And since we are wanting to acquire memory in this case, we don't want to make those changes to memory. Okay, so now that I have the kernel object, I can see this .co, I have the kernel object, and if I load that into the system, then I should download the device. So whenever I need to run this command to load it, sudo insmod or insert mod, and then the LIME kernel object, the full, in this case, the full name. And then I have to give it the command path. And this is the path where I want to save it to it. So I'm going to save it to a different disk. And I'm going to name it linux.mim, okay. And then next I wanted to give the format equals LIME. And I had issues earlier, let me see if I can bring that up. I had issues earlier. Whenever I was trying to use volatility to analyze a raw memory image from my system, I kept getting this no suitable address space mapping found error. But whenever it's a LIME formatted image, I don't get, let's say, as many errors. I don't get that specific error. So in this case, I'm going to collect it with LIME, or as the format LIME, because I know that volatility can use LIME. So while that's acquiring, I will skip ahead. Okay, so now that that's finished, I have my memory image in Media Joshua Storage testlinux.mim. So the next I'm going to go into where I have volatility downloaded. So I have the volatility get repository basically downloaded. And what I need to do is go into tools and Linux, we're going to build a Linux profile based on my system. So tools, Linux and then do LS. And I want to make clean because I've already added in there. So make clean. And then you should basically have a make file. So what you need to do is download or install. If you're on Ubuntu, you can do pseudo apt install dwarf dump dwarf dump, or the, what was it, apt lib dwarf tools. So basically, you can either download dwarf dump or lib dwarf tools. I already have dwarf dump installed pseudo apt install dwarf dump. Okay, it's already the newest version. Okay, that looks good. And then the next thing we need to make sure we have I'm sure you already have it if you've ever if you've ever worked on this before but we need to install build essential in Ubuntu so pseudo apt install build essential. And this is basically compiling tools tools to be able to compile software. And then we might also need to get Linux headers. So for in Ubuntu, we can do pseudo apt install Linux headers generic, or whatever, whatever headers we actually have. So this actually downloaded 40077. But I'm pretty sure we don't need headers in this case. Okay. So once we have that, then we want to just run make. Notice it's building for 44053 generic. Okay, that looks good. And then we have this module dot dwarf should be created. Okay, once the module dwarf is created, then we want to run. We need to check and see if we have So we need this system map for the kernel version that we have so system map 44053 generic in this case because this particular computer is running that particular kernel version. So once we know where the system map is, which is usually in slash if you do ls slash boot, you should see all of the available kernels and we're specifically looking for the system map, then run pseudo zip.  Where am I at? Oh, sorry. Instead of being inside the tools Linux folder, go up to two, two directories, two folders, and then do pseudo zip volatility plugins, overlays, Linux. And then we want to save it as a bun to a bun to and this is 14 04.  Okay, so a bun to 14 04 440 dot zip. The reason I call it 440 is because that's the particular kernel version. And there's already a bun to 14 04 available. But I think it's for a the kernel version three. So I'm going to call it 440 just to kind of differentiate and make sure that I know the difference between the different plugins we're essentially creating the plug in right now, then do tools Linux module dot dwarf. And that's our door file that we created. And then we want to add boot system system map for our particular kernel. Okay, if you do that, then we get adding tools Linux module dwarf and adding adding boot system map 440 53. So now we have a module volatility module created specifically for a bun to Linux kernel version 440 dash 53 generic. Okay, now will this work on other Linux platforms, probably not right and you have to make it specifically for the kernel version of the suspect system that we're analyzing. Okay, then the next thing I want to do is Python, make sure it's actually installed so Python dot pi dash dash info, and then I want to grep grep for Linux with a capital L. So here I have Python, vol dot pi this is running volatility and I'm getting the info out the information for Python for volatility, and then grep is just a search like a keyword search, just show me everything that contains the word Linux. Okay, so if I hit enter. Then we see this Linux Linux Ubuntu one is one that I created before. And then we have the one that we just created Linux Ubuntu 14 04 440 x 64. And this is the one that we just created. So this is now our profile name Linux Ubuntu 14 04 dash 440 x 64. Okay, so I'm going to copy that. And then what we need to do now is figure out some commands that this version of volatility includes. So I'm going to do Python, vol dot pi dash dash info, and then grep for grep dash I and Linux with a capital L, or lowercase l and then underscore. So what this does is again, looking at the information for for volatility as as whatever plugins or profiles are available show them to me. And then I'm using grep to search in a not not case sensitive way for anything called Linux underscore. And what that should show me is all of the different commands that are the plugins that are available for Linux. And we have a lot of them in here. So you can go through and check whatever you want to check, I'm going to run PS scan, because that usually works right So some of these will not work, just because volatility does not have the correct parser for our the version of our kernel, even though we basically say, you know, what the what the data structures are in memory by creating our profile. That doesn't mean that all of the parsers that have been written actually work for our version of the kernel. Okay, so just because we've created a profile doesn't mean that all of these things will work but PS scan usually does work. So I'm going to now run Python vol dot pi. And then the file is media Joshua storage test Linux dot mim. And this is our lime formatted memory image from this Linux system. And then the profile prof dash dash profile equals and then paste our new profile that we created. And then I want to run Linux PS scan, Linux PS scan. Okay, and there we go. We're getting the basically a process list. So all of the processes processes that are working running in the system and then their process ID. So this is actually parsing out or we're scanning through.  If I look again. So the thing about this is whenever I create plugins or profiles for the newest kernel versions, then a lot of things don't work or I can't get them to work. So it really depends on, let's let's just try CPU info, for example, I kind of doubt it's going to work. CPU info. Okay, so running CPU info against it. And, okay, so it actually did find the CPUs at least but it didn't see if it saw how many we have, but it didn't see like vendor or model, right. So what that most likely means is that for version 4.40 of the Linux kernel, most of these parsers need to be updated and told what's going on. If we look at the volatility website, we can see that the newest version of Linux kernels that it supports is 32 and 64 bit Linux kernels up to 423. So that means that up to 423, these plugins likely work pretty well. But we just created a profile for 4.4, so now we have to go through and potentially manually update a lot of these profiles.


Sondra van der Berg talking to us today about deploying NPM packages with the NICS package manager. Okay, thank you for the introduction. So this presentation will be about something that I've been working on for quite a while for about two years. And this project isn't actually something I really like that much doing. There's actually another reason why I'm doing this. And by basically making the NPM and NICS integration possible, you can do lots of cool things. So by the way, before I start my presentation, how many of you have heard of the NICS package manager or NICS OS? Oh, that's actually quite a few. So I'm a NICS developer since 2007. I'm using it in my daily work, also my home computers and pretty much everything else I could run it on. And the purpose of the NICS package manager is basically the NICS project is a family of deployment tools. And what they all have in common is that they support declarative deployment. So the idea is you write what you want to declare the specification. And from one single specification, you automate the full deployment process. And the basis of everything is the NICS package manager. But we have other sub-projects as well, like NICS OS, which is a Linux distribution build around that concept. We have something called HYDRA, that's a continuous integration server built on the same concepts. We have this NICS, that's also a project that I've been doing since 2008. You can use that to model distributed systems consisting of microservices or other web services and deploy them automatically to a network. There's also NICSops, which you can use to deploy a network of NICS OS machines into the cloud, such as Amazon EC2. So besides automated deployment, the tools in the NICS project also have a number of interesting non-functional properties. So one of them is that all the NICS solutions are generic solutions. So that means it shouldn't really matter what technology you use. If you use the C program language, C++ program language, make files, Perl, Python, Ruby, Java, it shouldn't really matter. You can use the NICS package manager for all these technologies. Also another important property of the NICS package manager is reproducible deployment. So what NICS tries to do is it tries to hide as many impurities that will potentially influence package builds as possible. And that typically means that if the inputs of a certain build are the same, then it doesn't really matter where you perform the build. The builds should always yield the same result. Another property of the NICS project is reliable deployment. So in order to support reliable deployment, NICS, for example, ensures that dependencies are always complete and also offers things like almost automatic upgrades and rollbacks. And another thing that NICS tries to do is it tries to be efficient in the sense that it only carries out the activities that it needs to do and nothing more trying to make deployment process not unnecessarily long. So if you, for example, take any sub-project in the NICS project like NICS OS, if you want to install NICS OS on your machine, then this is the typical workflow. So it looks a bit odd compared to conventional Linux distributions. What you do in NICS OS is you provide a declarative specification of your machine structure. So, for example, this configuration in this slide could represent my laptop's configuration. So you can describe things like I want to use the Grub Bootloader. I want to use these file system partitions. I want to use these swap partitions. As a system server, I want to run open SSH. I want the Xserver running the KDE4 desktop. I can also provide all the end-user packages that I want such as the Firefox web browser and the Midnight Commander. And what you then typically do is you run one single comment line instruction, NICS OS RebuildSwitch, for example. And what happens is NICS OS RebuildSwitch will deploy the entire machine configuration from scratch. So it will obtain all the necessary dependencies packages. It will build everything from source code if it's required. It will also generate all configuration files. And the end result is you have a running system with all your system services, your desktop, and everything else that you want. What you can also do is you can change this specification to have different properties. And if you run NICS OS RebuildSwitch again, then it will upgrade the system. And upgrades are always safe. So NICS will never overwrite anything. So you can always, for example, if you break your system, switch back to any previous configuration. And that's also, for example, something you can see in the Grub Bootloader. You have a question? Yeah, why did they always? Well, that's because, for example, if we upgrade the system, we use, for example, system D to manage system services. And they need to be stopped and restarted. And then you still observe a bit of downtime. And that's, yeah, system services are unavailable for a while. So from a static point of view, your system is upgraded atomically. But because you still need to change things at runtime, yeah, there's still observable side effects. And that prevents it from being truly atomic. So this is what the Grub Bootloader looks like. So if you boot NICS OS by default, it boots your latest configuration. But all previous configurations that you have garbage collected yet, you can also pick them. So if after an upgrade, for example, you suddenly have no display anymore because your display driver broke, you just pick an older configuration and then you're safe again. So the basis of the NICS project and knowledge sub-project is the NICS Package Manager. So the idea of the NICS Package Manager is actually its package organization, which looks a bit scary if you look at this slide. And the scary part is actually the file names. So the NICS Package Manager stores everything in a so-called NICS store in isolation. And as you can see, the first component of each path is a hash code. And we derived that hash code from all involved build time dependencies to build a package. So for example, the source code, the versions of the compilers, linkers, the build scripts, all these properties are reflected in the hash. And if I would, for example, upgrade GCC to a newer version and I would compile Firefox again, then it will yield a different hash code. And because every package has a hash prefix and a unique name, we can easily store multiple variants of many packages safely next to each other without any interference. Another property of the NICS Package Manager is the NICS Package Manager, like NICS, so as is also declarative. So it uses so-called NICS expressions to build packages from source code and its dependencies. And in this slide, this NICS expression is used to compile open SSH from source code and its dependencies. So a NICS expression, for example, the expression shown in this slide, is basically a function definition in a purely functional programming language. And the first line is basically the function arguments of that function. And they correspond to the build time dependencies that you need to build the package. So the first two arguments, the STDN, that's a standard UNIX environment providing common UNIX utilities like CAT and LS and MAKE. FATUREL is something that can be used to download files from external locations. And open SSL and ZLIP are required library dependencies of open SSH. And what we do in the body is we call the MAKE derivation function. That's basically the NICS way of saying I want to build something from source code. We provide some metadata parameters, like the name and version. And we download the open SSH star above from the open SSH server. And what we do in the body is we provide a number of build instructions to build open SSH from source code. So open SSH uses an auto-tools-like build procedure. So that basically means untar the tar ball and run configure, make and make install. So there's one practical issue with this expression. So this expression basically describes how to build a package from source code and its dependencies. But we also, for example, need to know which version of ZLIP do we want to use and which version of open SSL. And that's actually done in a second expression. So the first expression here is basically a function definition. But you need to invoke a function with function arguments. So what I do in this expression here, for example, is I import my expression in the previous slide. And as function parameters, I provide the build time dependencies that I want to use at that moment. So that means a specific version of open SSL and a specific version of ZLIP. And also, all the other packages, open SSL, ZLIP, Perl and even G-Lap C, are composed in a similar way. And if you would run, for example, in the command lines instruction, this command line, this instruction here, what it will do is it will build all the build time dependencies first and then the package itself. And the end result would be a NIC stored path corresponding to our open SSLH build. So using hash codes to isolate packages, that's quite nice. But the inconvenience is if you're an end user and you want to start, for example, Firefox installed by NICs, there's no way that you can remember a hash code. So you need some kind of mechanism built around it to make packages more accessible. So for this, NICs introduces the concept of user environments. So the idea is if you, as an end user, install packages, what happens is it will compose a user environment, as you can see in the top, and that's basically a symboling tree, basically synthesizing the contents of all the packages into one huge symboling tree so that it becomes accessible from one single location. And it also uses a number of indirections. So each time you install software, there's a generation symboling created that refers to our user environment. And there's also a current symboling referring to our current set of installed packages. And by adding the location to that symboling in the user's path environment variable, if you would, for example, type Firefox on the command line because it indirectly results to the user environment, you can start Firefox. So with a number of indirections, you can circumvent users from remembering hash codes. What you can also do at some point is you may want to update OpenSSH to a newer version, for example. What would happen is if you run this command line instruction, it will install a new OpenSSH version next to the existing packages so nothing will be overwritten. And then it generates a new user environment with a new version of SSH inside it. And then it creates a new version symboling for D3, and finally it flips the current symboling to the latest generation. And flipping a symboling is actually an atomic operation on Unix. And because a flipping symboling is atomic, also package upgrades with Nix are atomic. Then there's another thing you might also want to get rid of obsolete packages. I can imagine that you want to get rid of this old OpenSSH version that's highly insecure. So in Nix you never directly remove packages. What you do instead is you simply remove it from your user environment. And the Nix package manager sees which paths are still reachable from a generation symboling. And by removing the old symbolings, for example by executing this command line instruction, that removes the symboling 42, Nix sees this path is no longer reachable. And if you're in the garbage collector, then it safely removes all the packages that are no longer in use. And also besides user generation symbolings, open files and running processes are considered garbage collector routes. So that means if your program happens to be running, Nix will not remove it. So you can basically always run Nix, collect garbage at any point in time without being afraid that something that you might use is accidentally deleted. So I've shown you this expression for OpenSSH.  But I think that is basically a mistake. Nix is actually not building anything. What it actually does is it complements existing build tools with a pure environment. But in that environment you can basically run whatever you want. You can run make, but you can also run other build tools like CMake, SCONS, and you can build any kind of software in it. So to make builds pure, Nix basically takes a number of precautions in the build environment to take as many side effects away that will potentially influence the build reproducibility. So for example what Nix does is it clears almost all environment variables or it sets them to dummy values. But it also does with search environment variables like path or Python path. It configures them in such a way that they only contain the Nix store paths of the packages implementing them. So you can't use global dependencies. You can only use the Nix packages that you have specified. And if you forget to specify for example dependency then the build might fail. But that's actually a good thing because if you would silently allow a build to succeed because of a global dependency that means it might work on my machine but it might not work on another machine. It also does some other tricks. So for example it only allows packages to write in designated output folders. So if you build a package on your machine it isn't allowed to pollute your file system. It can only write in one designated output folder and that's it. It also does things like resetting time step to one and it can optionally use crude environments to even reduce the amount of side effects even further. And it also restricts network access while doing a build. And that's also a good thing because if you would for example download a file from a remote server you don't really know for sure what you get unless you for example provide an output hash allowing you to validate the end result. So in Nix network access is allowed except if you provide a build with an output hash against which we can validate. So what I basically explained is that Nix has all kinds of nice features right. So reproducibility, reliability and you can also use it for many kinds of software. But what about Node.js? Is here anyone using Node.js by the way? So quite a few. So it would be nice that we can also have best of both worlds right. So we use Node.js but we also at the same time want to profit from Nix's nice deployment properties. But there's one problem. If you use Node.js you basically can't get around NPM. Is there anyone using Node.js without NPM? Which package manager are you using? How do the geeks important? Oh okay. That's interesting. Yeah. Does it yarn? Yarn yes. Yeah and IED that's another project I'm aware of. But yeah most people are using NPM so there's basically no way around it. But the problem with NPM is NPM isn't a build tool. It's also a dependency manager. And that actually conflicts with Nix's dependency management features. And also Nix gains arch potential benefits from the way it organizes the dependency management. And if you would bypass that then there's no point in using Nix right. So this is basically how you would normally I guess most of you probably already know. For example if you're a development project what you typically do is you provide a packageization file that might look like this. You provide some metadata and for example you provide the dependencies that you want. And what you then do is you run NPM install in the command line. And what NPM does is fetches all the dependencies and puts them into the node folders of the same project. Now how can we deal with this conflict? The solution is actually quite simple from a theoretical perspective at least. You just substitute the conflict in the dependency manager by doing the dependency management yourself in the Nix environment. And if you somehow fetch the dependencies yourself first then node NPM doesn't have to install them anymore. That sounds very simple. So basically you could do something like this. So this is the NPM install instruction that I run in the Nix expression. And before that I somehow obtain the node dependencies I want and I put them in the node modules folder. What I can even do is if you take a closer look at this expression here and the packageization you see that they capture quite similar properties. So I could even automatically generate the Nix expression. So everything appears to be quite straightforward right? But is it really that straightforward? I have to tell you it's actually much more complicated than just that. And there are actually many reasons for that. The first reason is if you would look at for example the packageization documentation then you'll see that NPM has many kinds of dependencies. For example it has a concept of dependencies corresponding to runtime dependencies. But also it has a notion of development dependencies. In Nix there is no notion between runtime dependencies and build time dependencies in the sense that you just provide dependencies to build their environment and the builder should figure out what to do with it. NPM also has peer dependencies that's basically used as a conflict resolution mechanism. But the NPM authors don't seem to know themselves even what it's supposed to mean because in older versions peer dependencies were also automatically installed but later they changed this behavior to purely a check. So you also have to cope with that difference in generating an expression for example. And also it has bundle dependencies. Bundle dependencies are basically node modules already in the package that you don't have to download again. And also it supports optional dependencies in the sense that optional dependencies are allowed to fail. And if they fail then the package installation still succeeds. And that's also somewhat incompatible with the Nix deployment model especially if these failures are non-deterministic for example because of a network failure or something. But if you want to create a generator what we basically only have to do is we only have to look at the dependencies and development dependencies if they have been requested and we have to subtract the optional dependencies. And peer dependencies for example we don't have to do anything with them because they're merely a check. Then there's another thing. So version numbers in NPM are basically semantically versioned so that means they consist of three version components having a specific meaning. And these version numbers are typically used to refer to packages in the NPM registry. But you can use this, you can use precise version numbers. They refer to one specific version in the NPM registry but you can also use version ranges so you can specify things like I want the version of this package to be 1.0.1 or higher or something like that. You can also use tags and tags indirectly resolved to version numbers. But besides NPM, packages that come from the NPM registry you can also use your own external location so you can also refer to dependencies in your own home directory. You can refer to Git URLs, you can refer to repositories on GitHub and Bitbucket and so on. Now if you want to make a translation so in NICS we use hash codes to identify packages and in NPM they use a name and a version number. So how can we make a translation between these two means of specifying versions? And there's only one solution from my perspective. So for example converting a specific version is easy because you know what you get from the NPM registry but if you have a version range for example any version higher than 1.0 that's incompatible with NICS because if for example you would relate a hash code to a version range that means if I would download the package today I might get version 1.0 and tomorrow I get version 1.1 and I still get the same hash code so I lose the ability to reproduce. So the only solution to cope with this is you snapshot basically the version that you want to use. So you basically look at where does that version range resolved to today and I use that version and I generate an output hash for that and that's what I use for my packages. Then there's another challenge and I have to admit that this is actually quite difficult to explain because the first time I studied this I think it baffled me at least 10 times and if you don't understand what I'm explaining in the next two slides I forgive you because it's still baffling me in some sense still and also feel free to ask questions about it. So in Node.js you have the common JS module loader system so if you would for example refer to a module that's provided as a package for example the slash package that's one of my own modules but it basically uses some kind of lookup strategy so it will first consult the Node.js folder of the project but if the package isn't in there it will consult the parents Node.js folder and will recursively look upwards until the dependency has been found and this has all kinds of implications so this is also for example how private and shared dependencies are implemented in NPM so a private dependency is basically just a dependency residing in a package Node.js folder and any package that can be reached through a parent Node.js folder is a shared dependency now this having shared dependencies and private dependencies is nice but there are some things you may probably not know about NPM so if for example you have a package that declares a version range like I want a package that's 1.0.0 higher and there's a shared dependency that's older than the newest version it will use that shared dependency instead of downloading the latest dependency from the NPM registry so in certain scenarios it might happen that you don't use the latest version while you might expect that you have and I think this is really really bad because you might reintroduce security flaws for example of which you probably have expected them to be resolved and the same thing is also cycles are allowed and there are actually quite a few Node packages depending on packages with cyclic dependencies but NPM, I don't think it's the intention to permit cyclic dependencies but because they use this strategy in which they don't install shared dependencies again they break the cycle but for a generator we have to simulate that kind of odd behavior because in NICS you can't support it so if you would for example use any version of NPM lower than 3.0 what happens is if you're an NPM installed then all packages are installed privately by default unless there is a shared dependency already satisfying any of the versions of SFIRIS so what you can see here for example is an example of that application that depends on express and EJS and these are accepts and array, flatten, content disposition are installed privately for the express package what happens in the newer NPM, so in 3.0 and higher everything is shared by default so what would happen is it will move all the library dependencies as high in the Node modules here as it possibly can until a conflict has been encountered so what you see for example here is that the dependencies of express, so accepts array, flatten and content disposition are in the same folders express itself that's also quite strange the first time I saw this I sort of had a headache like oh man how am I going to deal with this I don't know what to do anymore also the NPM developers realized that they made the mistake because what for example happens is if you have a project and you run NPM install and at some point you change the packages and you run NPM install again then the resulting Node modules tree is different than a fresh NPM installation so the order in which you install packages suddenly matters so NPM installers isn't deterministic anymore by introducing flat module installations so in my generator because of all these properties the node modules dependency tree is an imperative operation that means after I have built packages I need to modify the dependency tree in such a way that it becomes flat again but NICS packages can never be changed after they have been built so I have to find for another solution in the generator to deal with that and the only option I see is I need to compose the entire dependency tree ahead of time so instead of translating an NPM package to NICS package I basically translate an NPM package and all its dependencies to one single package and that's basically the only option I can think of and then something else so in my presentation I had this theory that if I would provide the dependencies of NPM myself and I run NPM install then I don't have to download anything anymore but it is also not entirely true if you use for example the git URLs in your package then for each NPM install run NPM will always try to remotely connect to the repository to see to what version it resolves so I need to bypass that and what I do currently is I bypass the version number by a star but that's not really a nice solution because sometimes NPM gets confused by it but better would probably be to fake the git process to always give a deterministic result but that's still a work in progress because I'm thinking about so the solution so if I would take all my lessons into account that I've described previously and I create the tool out of it which I actually did then I can use nix to deploy node packages so I have the solution well sort of the solution I mean there are still some flaws in it but it works we can actually get quite far with it so how can you use node to nix you can use it on project level so it's particularly useful if you're doing development I can actually show you how it works so for example this is the node to nix generator tool that I've created it's a node project itself what you would normally do in development mode is you run NPM install to get the dependencies what I can also do instead is I run node to nix to generate nix expressions instead maybe I should do this better so I already generated the expressions in order to save time but this is what you get what I can then do for example is I can run the nix package manager to build my project and this should be relatively fast let's see how much time this takes okay I already pre-built the package but this is the resulting package as you can see it also has a nix store pad with a hash prefix and I can simply run my tool like this and it should work just fine what I can also do is what I just did is I created the package that you would normally use as an end user but what you can also do is you can start an interactive shell session like this and that's really useful while actually coding so if you're coding you also need all NPM dependencies to present in order to run your tool in this shell basically the node path environment variable so as you can see the node path environment variable has been configured to contain all the node dependencies that I need and also in this shell I can for example run my tool like this and because the node path environment variable has been set to the dependencies obtained by the nix package manager it works another use case is this is particularly useful for end user packages so if for example you want to run Bower on the command line or the Grunt CLI you can also specify in an array the packages you want and you can use any version specifier that NPM supports and from this JSON file you can also create a nix expression allowing you to deploy any package from the package set like node to nix so typically you would use npm install dash g and this is actually a nix alternative for npm install dash g and there's also a third use case so there are also some tools using npm as a plugin manager for example Grunt is a build tool and it uses npm to obtain the Grunt plugins and what you typically do is you define them as development dependencies what you then do is you run npm install after you do npm install and this workflow is also supported by node to nix so what you can do is you can provide the global packages that you want in a supplemental json configuration and if you generate an expression like this so you provide the package json file but also the supplemental json configuration then you can fully automate for example Grunt workflow so what I for example specify the expression here is I overwrite the early expression and I state here that run after npm install run grunt and then I can build grunt projects in a nix environment and you can also use this for other builders so for gullop and eslint this also should work fine so yeah that basically concludes my presentation so what I've been trying to explain in this presentation is the difference between nix and npm's deployment concepts I've also shown you node to nix which you can use to generate nix expressions you can use the nix package manager to deploy npm packages and why is this useful so besides having the nix package manager to deploy node packages you can also for example include node packages in your nix OS configuration and deploy it as part of an entire system and you can even deploy entire networks of machines with node processes inside them and that's actually why this node to nix generator is such a great thing to develop it but the potential applications that you can build on top of that is awesome I think and then there are some lessons I learned from this experience so if you for whatever reason need to develop a language specific package manager self I would advise first of all think about how to name packages so I would say naming a package by a name and a version only that typically doesn't suffice so in nix we use hash codes for that reason but also if you take a look at Microsoft for example they use for the .NET global assembly concept called strong names which includes cryptographic keys also organization is important so isolate your dependencies well don't put them in some kind of global name space and also cyclic dependencies disallow them I see this quite a lot but packages are supposed to be units of reuse and if two packages are mutually dependent on each other then it's no longer reuse anymore they should ideally belong together so if you want to know more this is not node to nix is not the only generation attempt there's also npm to nix which is actually older than node to nix it's actually much faster because it actually constructs packages for each npm dependency but it's less compatible and there's also a Haskell implementation called nix from npm that implements the same concepts but they also support partial regeneration to make things faster and then there's also some npm alternatives so there's yarn for example the main difference between npm and yarn is that yarn for example supports a lot of parallelization to improve the speed of deployment and it also supports version blocking so whenever you install a version from a version range yarn will create a yarn lock file pinpointing your installation to that version so that you can reproduce an installation elsewhere and there's also IED and IED I think that's a really nice effort because the author first of all says I draw I basically use nix as my inspiration source for developing this package manager and also he supports things like content addressable store, atomicity and maximal sharing of dependencies so if you want to know more so here are some references the nixOS website a link to the nix package manager and of course the note to nix generator itself so that you can start using the nix package manager for deploying your npm packages so that's it any questions? yeah you explained that A the build inputs are used to manage and B that the build is to be deterministic so what happens if I have a C program that uses a timestamp at which it is built to display the front time if I build it twice it will have the same harsh bits that's a very good question so in an earlier slide I've shown you some of the precautions that nix takes I think they're here but this is not sufficient there are still ways to cheat and get impurities sneaked in and timestamps the ones you refer to like if you would for example use a C call to obtain the time then you have an impure build that's not something nix would guard you against so nix has lots of means to guard you against certain things but by no means it's enough and timestamps is actually still the biggest source of impurities but we're working on that do you guys have similar models when building a cabal to nix and is there a pip to nix as well there is pipi to nix but I have to admit that I haven't used it myself that much and there's also cabal to nix and cabal to nix I must admit it's been over 10 years ago that I did Haskell development so I'm probably not the best person to ask but we have a very mature generation tool already supporting actually quite a few packages so there's actually a developer spending a significant time a significant portion of his spare time in making that generator other questions I couldn't hear you but it was about hashes right what is actually included in the hash you mean which properties the question is which properties are included in the hash so hashes are actually computed recursively in nix if you want to know more about it but for example if you take this expression here as you can see on top that's a function decoration the function header is the first line what you basically do in the body is you invoke the make derivation function all properties to the make derivation function all function parameters are except for the meta property but that's not used in the slide is basically used to compute the hash yes well actually the output hash of the tar file is used and the same thing for example with the dependency so open as a zl and zlib are basically nix store paths having own unique hash code as well so hash codes are computed recursively so that also means for example if you use another zlib function you have a zlib with a different nix store path and as a result the hash of the corresponding build will also be different yeah do you know if there were experiments to run the nix package manager on other distributions nix OS? that's also an interesting question yes so the nix packages the basis of nix OS but it can also be used as an independent package manager in other systems and besides linux also you can use conventional linux distributions of course OS x is quite well supported some people want to make it an alternative to homebrew and there's also some limited success with nix on free bsd and sikwin and open bsd and several other unix clones about the darwin support for OS x i mean it's part of the nix OS 3.0 stuff could you repeat so it's about darwin yeah so from the nix yeah yeah i still don't know what the question is maybe because you're in the back oh okay sorry never mind but it's great that contributing to nix that's awesome i appreciate it very much other questions so the nix command line that's sometimes a bit difficult to use mostly for established reasons and there was a bit of issue or pro request about free implementing of the whole command line system but i think there's not so much progress so yeah there's indeed so nix and for example was historically inspired by rpm and also the command line options that it implements are similar to it yeah there's indeed a new effort i think it's already in progress for a year or something like that but i believe there are many more big things on going in the nix code base for example also reorganizing substitutions and stuff like that and i think it will still take a while before that completes but you have to ask the nix maintainer he's doing most of the development work on it so are you trying to distinguish between already compiled and minified javascript do you try to build javascript packages completely from source or do you download the minified you mean as an npm dependency or in general well we just we try to mimic whatever npm does in certain scenarios so if that happens to be a minified version of javascript then that's also what you get there's no specific objective besides mimicking what npm does because i also would like to change many things to npm besides but yeah i'm afraid i can do that so yeah other questions you have certain packages i think like fibers when you install them and the binary will be compiled how do you handle that you mean how to handle software that isn't available in source form or yeah that's also a very good question so in principle nix is a source based package manager it supports binary deployment for example by its reproducibility properties and the hash codes for example if you install nix os and you compile a package a package yields a hash code and it also for example she says there's a build server remotely with an identical hash code so i can download that instead but there's also indeed software that doesn't exist in source form to make them work that's quite tough actually in nix there's actually a tool called patch elf that you need to use for that purpose because for example binary is compiled elf executables compiled in the nix environment have the patch to the libraries that you need hardwired into the rpath header and for pre-built binaries there is no rpath header with the locations to the libraries so if you would run a pre-built executable on the nix os then it won't work but there's a tool called patch elf that you can also run in nix expression to provide the missing build paths and then the patch executable will run without problems on nix os other questions i guess that's it


Internal medicine can be one of the most overwhelming rotations to do well on, but if you want that coveted honor, here's how to do it. Hey friends, welcome back to channel. Before we get into all the tips for today's episode, make sure if you do enjoy the content today, then check out our other episode on all of the best resources for the internal medicine rotation as well. I'll link that down below, but let's get into it. Number one is to get into the management ASAP and fire your reporter. One of the biggest issues with medical students, particularly on rotations, and I know now because I've been working with them for three years, is that I can easily tell this difference between a student who's gonna get honors on one of my internal medicine rotations and the one who's not based off of simply how they approach problems. The typical average medical student is going to be comfortable with what was taught during the first two years of medical school, being how to essentially take a very good subjective and objective data. On the other hand, the student who's much more likely to get honors spends much more time focusing and flexing their muscles on practicing the assessment and plan and management of the individual patient. And so one of the best things you can do for yourself while you're on the rotation is regardless if it's a brand new patient or if you're seeing a patient on a following day that's already been admitted, is to think about them based off of their top three to four problems and what you want to do to work up things as well as treat things. So to give you an example of a brand new patient, usually the typical medical student is going to dive into the notes and want to know the history of the patient, if they're smoking, you know how long they have high blood pressure, they come out with chest pain, they want to know all the things that medical school teaches you about. But in reality, the bottom line is that most medical students can do that. So to help yourself stand out, you have to think differently. And so whenever I have a student on my rotation or have a subline rotation, the first thing I tell them to do is to look for the problems they're going to cover. An approach tip on how to do this if you're admitting a new patient is to not go to the notes first is usually a national inclination, but instead to go to the other objective data. And then I may actually dive into their history and their past notes and their medications to get an idea of who this patient is. But by doing so, I'm essentially trying to create a big list of problems. And then eventually I should be able to group three to four of them together and saying, oh, their fever, their hypotension and their high white count is actually from the infection. Their urine looks dirty. This patient looks like they have a UTI. Cool. That is one problem. You're essentially starting to manage this patient and diagnose them without diving into the reporting phase of what most medical students do. And on a similar note, if you're taking care of a patient who's already been in the hospital and you're about to think about writing your progress note or present them as an update, then always think about what are the main things that we'll be doing to this patient today to help them get closer to home or to discharge. So what are their main problems? Ideally, find three to four things. Ask yourself, do I need to work up anything more? Do I need to change my treatment plan? And then focus on your subjective and objective. If you can do that, you're already starting to think as a future physician, much less of a third year medical student, that's as much easier to get on her. So again, fire the reporter, focus on the management. Number two, and this goes without saying, make sure that you're an authentic team member. Now I say authentic because I have a lot of medical students on my rotations or personally that I worked with at medical school. I try to force the fit. They essentially try to look more impressive than they are actually trying to be helpful.  So usually on your first day of the rotation, try to simply ask like, what do you expect me to be doing and what can I do to best serve you, the team, the patients and as well grow so I can get the best results possible. If you have a quality group of residents and attendings, then they will tell you what their expectations are. But whatever they tell you kind of think of that as like the bar of just doing good enough. Your plan should be to become phenomenal, to be memorable and to leave a difference not necessarily a mark. And so one of the best ways you can do that on your team is saying, cool, if you expect me to see four patients on a daily basis, I don't need to like flex and try to do five, but I'm going to take care of those four patients as best as I can. One pro tip that I will give to students on rotations is that you should know your patient better than I do and they should know you better than they know me. So if you can go into a room with your entire team, the patient looks at you first, that already gives me a good impression that you built a good report and that you've worked to try to see that patient multiple times. An easy way to do this is to focus on the rule of three. Try to see your patients at least two to three times a day, whether it be number one during your pre-routing when you're in the hospital, number two when you go with the entire group again to see the patients, ideally a third time once in the afternoon to make sure that the patient's doing okay, particularly if you've made any change to their management. They have pain early in the day and you try to make a change to it. Go back and say, oh, this patient is now not in pain or they're nauseous or this treatment is still not working. Maybe we should do X, Y, and Z. Going back to number one, you're giving a management suggestion of what to do next now that the original plan didn't work out. I'm being very careful to highlight that being a good team member doesn't just mean you're doing work or trying to find old records from hospitals or doing busy work that is in the way of your other team members. Sometimes you can do the same quality of care that your interns, your residents are providing but just because you'll be able to see less patients, ideally you should have quality rapport and relationships with those people so then you can practice making true management decisions as if they were your own patients because they really are. Tip number three is to keep a daily to-do list for the entire team. One thing that I found to be very successful when I was a sub-byte particularly on a cardiology rotation is that although I only had four to five patients of my own the team had 14, usually for every patient I was paying attention to what was going on with them as well as what type of things needed to be done. Now not everything was something that I could actually do but because I had that list I could easily look at my interns and say, hey, you have a lot of patients today. I can easily help you something with Mr. Johnson, Mrs. Evans and blah, blah, blah. Even though they're not my patients there's something that I could easily take care of and if I have any questions I can ask you, is that okay? Any intern or resident who hears that understands that one, you were paying attention to rounds to patients that weren't even yours but two, you actually are giving a really wholehearted desire to help them without any strings attached. If you do that you will realize your rapport between your interns particularly and your upper level residents will start to shine and they'll start to basically speak your praises without you really having to do so in front of your attendings. And on the flip side one benefit that I found from this daily to-do list is when I transitioned to my early years in residency my work that I had as an intern didn't feel that much different than a sub-byte because I was almost kind of mini managing whatever tasks were left for my interns after I was done with my own tasks. So because I already had some experience of doing more than a sub-byte level but less than an intern, the transition was a lot more natural. Number four is to do your daily U-world practice and review. Now most students know that U-world is going to be the king of all resources when it comes to step two setting and particularly shelf exams like internal medicine. But when you deal with a rotation and a topic as broad as internal medicine you really need two things. One, you need enough consistency and number two, you need to make sure that you review your mistakes as much as possible. And so depending on how long your internal medicine rotation may be the main recommendation I would give you is to find amount of questions that you have to do on a daily basis to ideally get all of the questions that you've all done within about two thirds of your rotation. So for example, if you have six weeks try to finish all of the U-world questions in internal medicine within four weeks. So then you have two weeks to essentially do other practice exams as well as go and review your mistakes. Now once again, this is a minimum bar of doing well but again, if you want to increase your chances of doing well on your rotations as well as remembering things for yourself and actual rotation, then the next thing I would tell you to do and this actually worked well for me is whenever you take a question if you miss it just blatantly or if you guessed what you guessed correctly but you didn't actually understand the connections between ideas and U-world or whatever practice questions you were doing then make sure that you collect those into some kind of system. If you're interested, you guys can check out some of the programs that we have down below either the question clinicals or the level of your studying or we talk about essentially good ways to collect your mistakes. Regardless of what method you use whether it is a Word doc or an Excel document writing them down or using flashcards again, we recommend a bunch of different options down below in any of those programs. Regardless of what you do make sure you do it consistently. So you may decide for example to have an eight week rotation and thus to do all of your questions between six to seven weeks you wanna do about 30 to 40 questions a day that may be your situation. Also make sure you give yourself a dedicated time where you're reviewing the mistakes from the past few weeks. And so if I had a notebook where all my missed questions were there or an Excel document I would make sure that would take about 10 to 15 days and go through those mistakes and essentially move on to the next one. That way again, I'm not likely to make the same mistakes on my shelf exam, step two but I'm also learning for the rotation itself. Tip number five is to be interested and most importantly in your personal growth. Obviously it's important to be interested in our rotation but I find that most students will try to force this particularly if they're not interested in internal medicine. If you're trying to go into surgery like you're not offending me by choosing a different field I actually don't care and I'm actually encouraged to try to teach you things practically that I know that you may have to know as a surgeon and then try to make the rotation as useful as possible.  In the flip side doing things like taking care of your patients and actually just wondering like where am I on different levels of patient care? Where am I on presentation? Where am I on patient interaction? Where am I on management decisions?  If that's the case then go ahead and read about those situations ask yourself like what type of things that I not do that my patients and my residents ended up recommending maybe my attendings added to the patient's care that I can now add to my future patients. If you focus on your growth and specifically if you're asking feedback from your residents and saying how are my presentations? How is my management skills? What type of things would you do differently if you were me? And working on those on a week to week basis if you had an eight week rotation that is a lot of room for growth but the only way you can actually have consistent growth is by asking for feedback being reflective on your own skills and most importantly working on them. One thing that I don't share enough on the channel is while I'm an internal medicine physician now there is a part in the middle of my internal medicine rotation I actually considered not doing the field because I didn't think that I was good enough I didn't think that my knowledge base was good enough I didn't feel like my management skills were good enough but because I reflected on that fact and the fact that I also had three weeks left I made small adjustments into my management my patient interactions as well as just focusing on what I was doing and what I wasn't doing to take care of the patients that my upper levels and my attendings were. But this tip goes for any single rotation to be interested you don't have to force it you don't have to bring journal articles take care of your patients understand what parts of their care you don't understand ask questions about those read about those come the next day take care of that patient even better and most importantly if you have a patient with the same problem really make sure that you can actually dominate it it's almost like if you had a same test question presented to you every single week you want to make sure you don't miss it over and over again so take those opportunities find those signs of progress I promise you you will do well and most importantly you'll actually be noticeable without forcing it and if these tips on how to do well and I am rotation were helpful then make sure you check out all the resources that can help you get those honors as well as checking out the crushing clinicals program down below on how to get honors on every single rotation but as always my friends thanks for being a part of my journey hopefully I was a little helped you guys on yours and I'll see you guys in the next one peace