What's up FSE? I just wanted to say what's up to you guys. I haven't talked to you in a while. I feel like on this platform I just usually get right into the video and honestly that does better in the algorithm, but today screw the algorithm I don't care. I want to talk to you guys say what's up So I'm really excited for the videos that I've been putting out. I just feel like I'm finding that creative spark again So I hope you guys have been enjoying the things that I've been doing recently Today is just like that. So really creative cut shag haircut I feel like it's right on trend with what's going on what people are really liking so I don't want to waste your time, but I wanted to say hi I get a little FaceTime with you guys and Yeah, so enjoy the video. Let's get started here. We go All right guys, so to start off this cut We're gonna use a center parting and base everything off of that in the front of the head So we divide the head in half and now I'm gonna bring everything up over top of the forehead really working in kind of a round shape section Following the forehead and the head shape because I really want that to be at that 90 degree point which you can see here That angle that I'm going for and then I'm over directing everything using a stationary guide bringing it all to the very center Section number one So if you think about it section one is your guideline you cut it at that length that you want and then you work Your way down the head shape Section two goes to one section three goes to one section four goes to one and then once we get to about section five We leave it disconnected and the reason we do that is because I want to keep that length on the sides And I really just want to pop in a ton of layers around the front in the top of the head now This guest had a previous bang If your guest doesn't have a bang you still cut it the exact same way You just might have to trim that bang out of their eyes when you get done with it I'm basing everything kind of off the bang that she already has so really you got to make that call when that person is in Your chair That's that curve that we're talking about now I move to the left side of the head, but I keep my body in the same exact position So body position does not change. I start pulling everything towards me now This is something I want you guys to really think about in every haircut that you do You should always be pulling the hair In the same direction on both sides So I was pushing it towards the center on the when I was standing on the right side And now I'm standing on the right side still so I want to pull it to the center on the left side So my combing stays consistent I'm doing the same exact thing on both sides bring it all the way to that center number one section in the end And then you can see that's where my disconnection is going to be when I get right around that temple area Now You're gonna ask me does this haircut work on fine hair does it work on thick hair if we're basing this haircut on something We're gonna say it's on medium to thick if it was on fine hair I'd make that disconnection a little bit thicker a little bit fuller and that disconnection serves as a density saver In that temple area now we moved into the back This is gonna be concave layering or I call it concave some people would argue it's not The reason I say it's concave is because I look at the head shape is curved and how that Hair is going to fall it's gonna fall collapsed if I'm bringing it up Just like this cutting it parallel to the floor, but you can call it whatever you want You bring it again Stationary guide in the center of the head and everything gets brought to that center point That's gonna push the extra weight out to the the sides of the head But get the center of the interior of that haircut the shortest point so just again On the left side. I pulled the hair to the center on the right side now I'm pushing the hair to the center just staying really consistent with that combing throughout this entire haircut So now well we start to blow it dry You can really see those layers already coming to life This haircut looks cool already and we're not even done with it So I go through a little round brush blow dry just to get that shape started and to keep some volume in the haircut I'll show you guys you're gonna see a really cool finishing technique with a cool tool at the end But this is really just I'm gonna do a little more dry cutting now. I'm gonna use the FSC dual 20 pro This is a we call it dual because it does texturizing and blending the blending side is blade down We're gonna blend right now. I'm gonna slide that scissor in you can see how it just melts through the hair I go in cut. I'm using the six inch Dual 20 pro and just working it through the hair. We have it on our website We have both lefty and righty, but this creates it doesn't take out a ton of hair guys I want you to understand that about this scissor it doesn't take out a ton of hair But that's the reason it blends so well So when you go in the hair, you don't have to worry about taking too much out You're just softening and creating some texture and now this is my matte black white wall Scissor it's really just white inserts, but I call them white walls because they look cool We're gonna do the stroking technique. This is a six inch FSC precision elite Limited edition matte black go in the stroking technique is just coming down on the hair and closing the scissor as you get to To your hand and I just work my way through it That's just to cut the bottom of the hair and to add a little bit more layering And then I put a solid blunt line in at the bottom to make the haircut look nice and fresh Obviously and salon done Same thing here Stroking technique work it through and then I finish and cut my line. I left the disconnect That's why I clipped all that front away I wanted to leave that disconnect because I really just like the way it's looking in the haircut Sometimes you make Decisions as you're going through a haircut and you say I really like the way that looks so you just clip it away So that you don't cut it and then you can go back into it and finish it later a little bit of point cutting Again using that FSC precision elite scissor Vertical into the hair so I'm not changing my horizontal line and look at the shape in this haircut guys. It's awesome I love this cut I love the way that it turned out with the color as well And now I go in with my Dyson air wrap to flip out and create more of a modern feel to it Some might say it's it's not modern It's we did this in the past and you're right you're right, but it's modern right now And that's what people are doing So I hope you guys like the overall look at this Add in a little bit of spray wax to it You can see all those flips and the disconnects and the shag up effect on it the fringe looks super cool So I'm psyched on this haircut. What do you guys think? Let me know in the comments below Here's our end result guys. Thanks for watching So I hope you guys enjoyed this cut as much as I enjoyed doing it remember go to free salon education comm That is our online store. Use the code FSE 20 at checkout FSE as in free salon education FSE 20 at checkout you'll get 20% off your entire order of the FSE elite scissors pro series scissors Really supports the channel if you guys need a scissor or need a razor tool or combs or anything It's it's very supportive of you to go purchase there. I guess that's what I'm saying very supportive of you But thank you guys. I appreciate it Otherwise just like the video comment and please share with all your hairdresser friends out there Thank you guys so much for watching. I'll see you on the next


As I mentioned last time, I wanted to discuss binary files and direct access files. Unfortunately, I failed last afternoon and I could not complete the job. However, I have an example of a database file which will illustrate how file I will generally handle will also illustrate the requirement to write functions and organize your program in a slightly better fashion. Additionally, I wish to discuss a sample question, the like of which you will have to set and a possible answer to a different problem altogether. So what I propose to discuss is the text files with fixed size records. The student database file that we discussed last time, the need for a fixed size record so that later on we can provide a random access to files and we can actually update individual records on the disk. Today we will just re-look at the sequential reading and writing. This portion the random access files and mapping keys onto record positions. We will discuss this on Saturday. Last time we had seen the test questions and quizzes that you have to be formulated by you. I have just constructed one example of converting a two digit number into words and a slightly peculiar rule of solving that problem which we shall see. These are the standard includes. I would like you to once again look at the structure definition. Last time we had seen this in details as to how a common rate of variables could be defined as a single structure. Distruct student info defines an additional type of data and you can then define variables or even arrays containing this type of data. The difference is that structure may have components which are not identical in type. For example, the first component is a character array which can hold a 30 character string followed by backslash 0. The second component is another character array but the third component is integer variable. Remember that inside computer's memory, hostel will be stored as either a 2 byte integer number or a 4 byte integer number depending upon the representation. Now, ordinarily when we write to files and when we read from files, we are always considering reading and writing text files. Using a simple operator for c in, we are able to dissect different components typed it on a line and those components which are given in as actual strings are written, interpreted as other strings or numbers, floating point numbers, whatever and are correctly assigned after conversion into the internal memory structure. Here is a function to print students. Notice that we are printing 30 characters for name, 8 characters for row number and percent 4D which means in 4 digit you want to print the hostel number while justifying. Please note that when we print s dot hostel in this format, the internal contents of memory which are essentially using a binary representation get converted into a character string which is what you see. This is the program that we have seen last time. We open a database file which is arbitrary as database dot txt. It is defined as an IOS string file having a characteristic of input. We define student info as a list of students. Thousand elements are shown in CS1 on spoons is what we are talking about. The list size of course could be arbitrary long as long as you can contain all of it in memory. The rest of the program we have actually seen last time. So I will just glance over it. The idea here is that I want to show this is not the way to write program properly. When you write large software as I mentioned, you would like to convert practically every major operation into a separate function and call that function independent. Just going back to the previous slide, this is the function we are written for printing the student's information. In exactly the same fashion we would like to rewrite most of the functionality of our program particularly as a program becomes long into separate functions. So this is the program which we have originally written. We are just reading it and notice that it assumes that the database file contains first line which only has the number of students. And then subsequently on each line there is a record for one student. This is not necessarily an ideal way to store data in a database file. A database file typically would have records each one of which is exactly of the same length and contains same information. So number of students actually has an information which has to be actually found out by reading all the records of the file and counting the number of records that you have read till end of file. But this is an artifact that we are using for this particular program. So I am reading the number of elements in that file and for I2 to 0 to n minus 1, I will read out is not true, is not hostile. S is variable of the type structure and therefore S automatically has exactly the same three components that were described in the structure. Once we have read all the elements in S, we can simply assign S to I of element of student list. First we could also say student list I that name, student list I that name, student list I that hostel that would have been perfectly alright. Having read the database I can close the file and forget about it. And then if you recall last time we were constructed a sort of query language where you give h followed by a number. It will give you details about all students in that hostel. If you say x it will exit, if you say r followed by a number it should give you details about that particular number and so on. Now this artificial query language interpreter is what this program is all about. So this we have already seen last time. I am just recapitulating it so that when we rewrite this as functions you will be able to understand what exactly is being done here. So here is for example an option h. So if h is the option given then you have to give a hostel number and you read a hostel number. Notice that this particular c out statement is not really required because you can give h followed by a hostel number in the same line as input. In fact that is the format of the query language that we had artificially designed. Which is all right because c in is capable of reading first a character h followed by any number in respect to whether that number is written in the same line or in the next line. Having read that you will actually look for the records of the students who belong to that hostel. So if the record of a student belongs to that hostel which you check by saying s not hostel equal equal hostel number then you can include the function to print that student's record. I have introduced the additional count here. How many students have you found? Ordinaryly this is not required because if two students or five students are found they will be listed. The reason why this count is introduced is suppose you give a hostel number and the student database does not contain any record of that hostel number. In this case you would not know what has happened. So maintaining a separate count is useful in such cases where while I am implementing the count found by one every time I find a student who satisfies that query. That is when I respond then at the end the count will remain zero and I could utilize that if the count found you notice the not count found usage. Ordinaryly I would have said if count found equal to zero equal equal zero see how it is this. But count found equal to zero is effectively equivalent to not count found. Because count found equal to zero is false not count found is any not zero value is true. So there is an implicit conversion between a numerical value and a logical Boolean value. A Boolean value of zero is false. A Boolean value true is actually one. But any value numerical value which is not zero is always treated as true by the C++ compile. Now here is the actual challenge that we wish to rewrite this program organizing appropriately defined functions which are written the whole program looks organized. For example the struct that we have defined. Ordinaryly we would include it in the program itself as we have seen here. But when you have many structures many other data structures which are peculiar to your programming system such as for your course project. It is customary to create header files separately. These header files are given in extension of .h as is tradition in CC++ programming. So you would create such header files separately and just as you have includes at the beginning of your program you also ask the compiler to include that header file. Once the header file is included which is part of the pre-processing step of the compiler. Then the rest of the program is compiled assuming that all the header files you have written within your program itself. They are actually included physically and then the compiler works. So this is how we would like to organize our programs. Here is an example. First the header file. I have called it .h and this contains my structure definition. The only difference is this is a separate file now. The idea is important that all the headers for large projects such as the course project that you are doing should never be mixed within functions or within program as long as they have global declarations. So also it is global declarations which are required either within a function of your program or in the main program itself are typically separated out put into a header file. You can have more than one header file which is not a bad idea if different type of structures are put into different headers but you have to include all of them in your main program. So this is one way of doing that. This is a file called studentinfo.h. Now look at the main program. The main program has all these includes our stream, higher bandwidth, stream, system, whatever you require math depends upon your program. Using name space sd is the name space for all of these. However, notice the last statement include studentinfo.h. This forces the compiler to read up this file which we have just created, the header file and include it physically as part of the program which is being compiled. So automatically the compiler looks at all the definitions. Do you notice the difference between the way studentinfo.h has been written in double quotes versus these things which are written in less than sign, greater than sign. Any idea what is the difference in these two? This is indeed a small but important difference which is worth while looking at it. Both of these statements actually imply the same thing. Get the file that is from the desk and include it before you compile the program. So it is called the preprocessor step. The cc++ program compiler that you involve before starting compilational to invoke this. The difference is only the place of the directory in the disk in which c++ compiler will search for the header file. This particular notation and the brackets less than equal to less than and greater than where you include it. The file is searched in the standard library location. When c++ compiler system is installed on your machine, some directories are specified so that c++ compiler knows that if directories, if some header files are to be included, where to find those. Those are typically the stdlib and other library directories which are not present in your working directory. They are somewhere else because they are considered part of c++ compiler system. So ordinarily whenever you say include less than 5.h greater than, then this file will be searched only in the standard library directories which are known to the c++ compiler. However, when you write your own programming system and you write your own header files, you have no way of putting your header files into the standard libraries. Indeed, it will be detrimental if you did that because 20 different groups working on 20 different projects all trying to put their header files into the same libraries would cause a lot of confusion. There could be several different projects which may have files, header files of the same name. They must necessarily remain in different directories. Consequently, c++ preprocessor provides for this kind of notation. When you say include 5.h in double quotes, this means that it will first look into the current directory. So whatever current directory you have, which is the directory in which your actual program will be stored and other programs will be stored, that is where it will look at it. Since it is an absolute state, it is possible to give a relative path. For example, you might have directory structure like this and your program, the main program itself, will be in the source directory, which is the tradition in Linux kind of systems. However, files and such other things, you might want to keep into a system directory which is at the same level, which is say include directory. So suppose the header file, the dot-h files are kept in this directory. If this is your working directory, then your program will be inside this and when you are compiling this program from the terminal, your other symbol will actually mean current directory is this. Since the dot-h file is not in this directory, this specification alone will not work. In such cases, you simply may say, so you can actually specify a relative path to your current directory. Go to the input sub-directory and include this. It is up to you as to how you would like to organize, but larger projects will invariably be organized such that for the project directory, you will have several sub-directories, you will have a separate sub-directory for your source programs, which itself could be several files. There could be separate delivery for headers. You could also compile some of your functions into your own library. So there could be a lib sub-directory. It all depends upon how you want to organize it. So coming back to our problem now, you will notice that when I say include student info dot-h, you are essentially asking the compiler to look for this header file into your current working directory. Incidentally, the pre-compiler is small enough. If this is not found in the current sub-directory, it will automatically go and search in the standard library anyway. So for that matter, if you are going to say include iosteam in W code, obviously it will not find it in your working directory, it will go to the standard library and search it. Why then we don't write this apostrophe in all these cases? It is because we know where those are located. So we don't want compiler to waste time searching here and there. In a nutshell then, the distinction is that Angular brackets less than and greater than symbol are used for include files which are to be found in the standard library directories of C++ compiler system. And your own header files are written in double quotes so that they are served in your current working directory. Just as we have said, include something dot-h instead of clattering our main program with the complete definition of the structure, it is customary to write all function prototypes at the beginning. I will explain this concept to you where in order to facilitate the compiler to understand how functions will be referenced without necessarily writing the complete function definition, we have a provision to define function prototypes. So these are the function prototypes that I have written. Read database, print student, find hostile info, file student details, etc. I have not written all functions. I have written only the first two functions which we shall see in a moment. The advantage is not only that this prototype permits compiler to understand how these functions will be referenced, but the functions themselves need not be physically written as part of this text or this source file. The functions themselves could be written separately and those could also be included. In fact those could not only be written separately, they could be compiled separately. And the compiled programs can be put into a library of your own as I mentioned some time ago. This permits a very clean organization of your main program without cluttering other things. Notice the function parameters that are prescribed here. There is no actual parameter here. This is only a prototype. And even in a function definition, you don't have to define variables. You just have to define the types of data that comes. Student info is a list of students, list of student structures as we have seen. By just indicating this opening bracket, closing bracket, you indicate that the first parameter is an array. You need not define the size of an array obviously because the size of the array within the function definition when it is a parameter has no sense. The actual array size will be the original array size and that size is what will have to be used because you are directly operating upon that array. You must of course know what that array size is and here we have used int amp. This ampersalt operator, which is a de-referencing operator we have seen that whenever we are transferring a parameter by reference, then the reference is indicated by putting this. So when you call this function and transfer for example integer value n, its pointer will come here and you will actually be operating upon that n. Consequently, when the read database reads the data, it will find out the value of n either as stored in the file in our case or by reading all the records and counting them, it will return the value of n. Returning the value of n as a part of the parameter is not possible if you pass the parameter by value. That is why this ampersalt. Why a paid student gets only student info type? Please notice student info is not a variable. It is a type definition that we have given as part of the structure. Similarly, find hostel info. We will require an array and an integer number for the hostel. Find student details. We will require the student info for the student that we have to be passed by and care star will be a whole number. We might also want to pass the student info arrow here. I have not written the functions other than this. You might want to write those functions appropriately modifying prototype definitions if you so wish. Here is the main program now. Look at how main program gets shortened after some basic definitions such as student list, etc. I simply say read student database. So read database student list, n. A single function in location will read the database. I could then have other functions which you say read a query from the keyboard. Other functions allow a query. And within the allow a query call a function to print student data, call a function to find data about students from the hostel, call a detail about one particular, call a function to find out details about one particular student whose role number given, etc. In general, most of the functionality of your main program should be divided into functions and the main program should consist of function calls of this type or similar type written. Here is an example of reading database. So notice how the function itself is written. Why read database student info, student list, int and n. Let us go back to the previous slide to see how this function has been involved. It is invoked by saying student list which is a list of thousand main school numbers, hostel numbers, etc. Notice that nothing exists inside it. In fact read database will populate this list and send it back. The next value parameter passed is n. n appears to have been passed by value and that is another point that you should remember. When you make an invocation to the function it is not clear whether you are passing the parameter by value or passing the parameter by reference. That becomes known only when the declaration inside the function is c. Here you always say n. But if you go here int and n will mean that a pointer reference is going to be passed here. The list of it is exactly similar to the program that we had seen earlier. A steam is defined as f in. f in is open with the file and the database.txt. Student info, a variable s is defined of the type student info. And you then read n, read 1 to n. All of this, the database has been run. You close the file. There is a statement missing here which is written. You should not say return 0, you should just say return. Why you should not say return 0? Because the function has been defined to have a type void. Why do you mean it does not return any value? So just a written statement will do. In exactly the same fashion, here is another function void print student info s. So you pass to this function a single element of the type that structure s. And it will print the components of s as s.name, s.name, s.hostel, etc. I would suggest that all of you should write functions for solving this query language problem. A generalized query where the query could be of any type. And your creativity is permitted to have its own say to say that I will have this type of query, that type of query, whatever. You can actually have variety of things. You can have additional information in the database such as CPI of people or hobbies of people and find out people who play football or whatever you want. In fact you can extend it more. And this extension is that this is precisely how I would like you to organize your database about the unique ID project that you are doing. All the relevant information about the student, of course the hobby of the student etc. may not be given as you are using it in the sample application of the project. So what is sample application you have in mind? The student database must contain the information pertaining to that application. You might want to put that in a database file of this type. This study we shall see how the database files could be actually randomly read and updated in line. So you don't have to actually read, update within the iris and recreate the whole file. That can be done for a file containing 1000 students data. That cannot be easily done with a file containing 100,000 students data. That cannot be done if the number of elements in that file are 1 crore. You cannot always read the entire file in the memory. You cannot update the file in memory in terms of the large arrays and rewrite the file every time. You have to have a mechanism by which you read a specific record of the file, change it and rewrite it exactly in the same position of the disk so that any other time in future when you read the data from that disk, it is read as if it is part of that. And that is the reason why we would like records in files to be exactly of the same length. Later on as we shall see, we can count the position of the particular record in a disk file by treating the disk file as if it is an array of bytes. So imagine a disk file to be an array of bytes and you have the possibility of locating a particular byte given its position number. And either read that byte or write that byte. That is precisely what disk file systems of UNIX or for that matter of any operating system actually permit you to do and CC++ programming which exploits that. But as I said, we shall discuss these things on this Saturday lecture. So here is a question. Remember all of you have to set questions. Instantly I have modified the requirement. Instead of every team having to set a question, I am assigning the job of setting questions and setting quizzes to the entire lab batch. So the lab batch will not be setting five quiz questions and five sample test questions but instead they will be setting three questions and three quiz questions. This will reduce the burden and you can distribute the work across teams of a lab batch. So with the group of 20 to 22 students together should do this work. I will try and define the details of this work today and post it on the website. But this is a sample program. So I say write a program which reads a two digit number and translates it in words. And I have given an estimated time as 30 minutes. So this could be a half an hour exam question. Now how would you attempt to solve it? Let's look at possible attempts here. Suppose the number given is 34, then my program should output 34. Suppose the number given is 50 by program should output only 50. The number given say 12, the program should output 12. Suppose the number given is 4, what should program output? Well the problem says given a two digit number, print it in words. This is not a two digit number. So if anybody gives you a number between 0 to 9, you should say invalid number. If somebody gives you a number which is 124, you should again say it is an invalid number. Why is this relevant? Printing like this? This is relevant because one should know how to print this. You can print any number in words. Because in order to print this, let us see what you will require. The program is incapable of understanding English by the way. So you have to provide for definition as constants, several strings, which are commonly required to print any two digit number. A simple Goragiri way of solving this problem is to define an array of 100 strings and write in words 1, 2, 3, 4, 35, 36, 37, etc. And you read a number, use that as an index, go to that particular string and print it. That is hardly an elegant method. In any case, since that is not a desired answer, even if you examine, you will not get any good marks. The idea is to actually dissect the given number and print separate portions of that number in words. The different words that you will encounter will necessarily be the words which describe the digit position. 1, 2, 3, 4, 5, 6, 7, 8, 9. You obviously require these strings. The strings that you will require will also require to print the 100 of the tens position, such as 50, 34, etc. So you require 20, 30, 40, 50, 60, 70, 80 and 90. It is advantageous to include 10 also in the list of 20, 30, 40 because 10 standing alone does not have a unit digit. It is 0. And when the last digit of a number is 0, you do not want to print the digit position anything at all. Only if it is 1, 2, 3, 4, 5, 6, 7, 8, 9, you want to print any one of those words. Otherwise, if the number is 10, 20, 30, etc., right up to 90, you just want to print a single word, 10, 20, 30, 40, etc. However, if you have a digit following this, say 91, you have to print 91. Again you can combine 10, 20, 30, 40, 50, 60, 70, 80, 90 as words and 1, 2, 3, 4, 5, 6, 7, 8, 9 as words for the digit position. The only exception is what we call the teens, 11, 12, 13, 14, 15, 16, 17, 18 and 19 are very unique strings in English language. They do not follow the conventional wisdom of forming words for numbers. So you will have to store them separately. That means a number 12 will have to be stored separately as a string. What I have attempted here is to store not only 11, 12, 13, 14, 15, 16, 17, 18 and 19 as teens but also the number 10 as teens. If you consider 10 to be the first number of the teens, that is logically also okay. But that helps make the program much shorter. What you will be required to do is if you set up such a problem, then at least three members of your lab team will have to make actual attempt in 30 minutes to write this program. It is quite likely that only one of them gets the correct answer. It is quite likely that one of them gets the correct answer. Incidentally the identity of students is not important at all. So you could just say student 1, student 2, student 3. The point is that genuine attempt for 30 minutes has to be taken by the three assigned students. They should put a watch right down the program. Then type it out and submit it. The typing time is not included. The attempting time is included. These three attempts should be included along with this problem definition and additionally the whole batch together should write a decent answer. And they should also write the actual time taken to get the decent answer because the decent answer is going to be compiled, tested, run and ensure that the program runs correctly. And it doesn't matter if that effect takes one hour or one and a half hours. So I hope you understand what you have to do for every question. You have to formulate a question, estimate the time. You will be required to formulate three types of questions. Simple, medium and complex hardlers. 15 minutes, 30 minutes, 45 minutes. Each question has to be attempted by three members of your block batch by putting against the clock 15 minutes, 30 minutes or 45 minutes. Whatever they write on a piece of paper that attempt has to be typed in without the identity of the student. Just say student 1, student 2, student 3. And finally the batch as a whole has to actually write a correct answer reasonably decently written program and also indicate how long it took and how many people work together to assemble that answer. The total exercise barring those students who participate in preparing sample answers who will naturally take 15, 30 or 45 minutes plus about 15 minutes of typing out their efforts. The actual correct answer identifying, writing it down, debugging in testing may take about a couple of hours but this job has to be done by different members of the team for each of the three questions that you are required to set. Here is an answer that I have written which is based on a web resource that I have found. It's a very cute answer so you might like to see that. So here program to translate a two digit number in English words. Incidentally the final answer that you prepare, the correct answer should be properly documented program because this is not what anybody is expected to write in their exam. But this is example of a well written program to solve that problem. So this is based on a triple translated program from Danny web. The Americans typically write in words the numbers in triplets. So there are hundreds, there are thousands, there are 100,000. They don't call one law for one crore. So there are 1,000, 2,000, 20,000, 98,000, 250,000 then there are a million. After that the million becomes billion, 1,000 million is one billion. So they actually consider triplets for converting into words. I have taken the triplet program and converted it into do it sort of thing. So this is the program. It is a very concise program so it may take some effort to understand. I will just explain very briefly in the nutshell then you can look at this program on the web and analyze it further. Here is an inline function definition. An inline function definition is almost like a macro. That means within the program any way this function appears actually this whole definition replaces that function reference in the string and then the program is compiled. So here is a function to append things. There is a left hand side string, there is a right hand side string and there is a separator between the two. The general separator shown is blank. If the left hand side is not empty, this can be, this is a member function of the string class and the right hand side is not, depending upon the right hand side not being empty, the separator is either blank or whatever plus the arches. So arches plus equal to this. You actually will take some time to understand what exactly is happening. Basically there are possibly two strings. Say 20 and 1 which you want to concatenate or you want to append 1 to 20. But if the number is only 20 there is no 1 then the second string will be blank so you would like to append nothing. This is the main program. As I mentioned I am defining string constants. The first is a set of digits 1, 2, 3, 4, 5, 6, 7, 8, 9. Notice that for 0 I have put a null string basically. It contains nothing, not even a blank space, nothing. Then I have teens 10, 11, 12, 13, 14, 15, 16, 17, 18 and 19. So this is a teen string. Until I have a string called duplets. The duplets is 20, 30, 40, 50, 60, 70, 80, 90. And I have defined these to be two blanks instead of one blank here. Just as digits has one null string that duplets has two null strings. The purpose will become obvious when you look at the program. And finally I have defined integer number which has to be heard from the keyboard. The program itself is fairly straightforward once I have defined these constant strings. This is the program. I start with number in words which is defined as a string to be null string. So originally there is nothing, only null string. Then I will ask for a two digit number and read that number. Once I read that number, if the number is greater than 99 or number is less than equal to 0, I will say invalid number cannot translate sorry. Notice that I said 1, 2, 3, 4 also is not a valid two digit number. But assuming it's a two digit number which is non-zero namely 0, 1, 0, 2, 0, 3, 0, 5, I will still print it out using this program. Only if the number is negative or if number is greater than 99, this program will not print it. So if that is the real condition, I will simply return minus 1 from this main program and exit. But if I come out of this, that means I have a two digit number and it's printing is done in this fashion. I first dissect the number into left digit and right digit. So I define a left digit and a right digit. Notice that it is defined as unsigned. Why? Because I would not like to confuse between the internal signed representation for negative numbers and so on. I want a pure, pure digit. So I define it as unsigned end. Number, model 100 divided by 10. You will agree that this will give me the left most digit. So if the number is let's say 78, 78 model 100 is 70. Yes? How much is 78 model 100? 78 model 100 is 78 itself. Is this required then? Num model 100. If I just say num divided by 10, will I not get the left most digit? Be careful about such figures in a program. Do you know why this has happened? Because the original program was given with triplets. If I had a number 478, then if I were to get 78, I would have to take a model 100. Now this is a remnant of copy paste. I have copied that source, so I have this 100 here. I have very, very kept it here to indicate to you because you should actually be looking at such sources across the web. But when you decide to use any program that is published for public domain, you should be very careful in what portions that you use and how you use them. Anyway, you get the left digit here, you get the right digit here. As I mentioned to you, 20th street is a team for the simple logic. The duplex started 20, 20, 20, 22, etc. Duplex means two digit numbers beyond 20. So below 20, everything is handled especially basically. And beyond 20, everything is handled especially in simple logic. So here is the statement, append, num in words, duplex, left digit. Left digit and aisle digit. I am taking aisle digit and creating the first append. Remember the string starts with null string. So in our first appendage, the left digit will get appended. And then this will be followed by appending the right digit. Now if the aisle digit is greater than 1, then only I will append this. Because I want to append only to 20, 30, 40, etc. Otherwise, I want to append that whether it is strings or CO digits. So if it is strings, I will append this. If it is digits, I will append the right digit. It all depends upon the right digit. If the left digit is 0, that means it's a two digit number but actually only one digit number. 0, 1, 0, 2, 0, 3, 0, 4, 0, 9. Then I want to print only 1, 2, 3, 4, 5, 6, 7, 8, 9. On the other hand, if the number is 11, 12, 13, 14, then the left digit will be 1. If the left digit is 1, then teens will be printed. The right digit of aisle digit position of teens which is 11, 12, 13, 14, 15. It's a very cute logic. I would like you to look at this. But you look at the simplicity of the resulting program. Now, it is not necessary that every problem that you compose and solve should always have such a cute solution. What is most important is it should have a correct solution and the correct solution should be logically written. That is what is expected from you. But those of you who have creative talents might consider writing such programs elsewhere, not necessarily in this course. Thank you very much.


So hi everyone, my name is Adnan Hodzik or Hodzic for all the welcome people here I've been with ING for more than four years where I work as a lead side-of-the-law ability engineer as part of a public cloud team at data at a data analytics platform as part of Amsterdam this talk covers ING machine learning platform a migration journey or a battle to communities which took over two years and What initially started off with a lot of resistance that lasted throughout the process Ultimately resulted to be the only right choice for us in the end Just to set up your expectations One focus too much on technical implementation details, but will instead focus on giving a high-level overview to answer some of the questions I had that was looking for in cube cons and to provide some guidance if you're in the same situation in your company and Just so there is no confusion while I'm part of the public cloud team now This talk revolves around my time in the same role at MLP team and since I'll be saying MLP a lot MLP is an MLP is an acronym the clicker MLP is an acronym stands for machine learning platform So please keep this in mind because I'll say it a lot of times so our Premise takes place at ING ING is one of the world's biggest banks definitely the biggest banks in Netherlands it has around 60,000 employees 18,000 of them working in tech offices in around 40 countries and Serving around 38 million customers Now this is a case in many environments, but especially banks Since we work in a highly regulated environment and are subject to rigorous policies in terms of risks Security change management controls. It's not as easy to deploy or workloads to production What's even more complicated if you're a data scientist who would like to do the same without any underlying SRE or deployment or infrastructure knowledge and that's where MLP steps in as it will Allow data scientists to seamlessly deploy their machine learning model to production while abstracting all of this underlying complexity from them And it will in the end it will serve as a as a model hosting platform Set up consisted of Python ML models being wrapped into Python containers which then along with other services are part of the Docker compose files and Then these Docker compose files are deployed to various and numerous VMs using Ansible you could say that things work great But I thought the missing link in and this whole picture was that it was not running on Kubernetes as By observing how things were architected and it set up to work in existing VM setup I immediately thought we'll have a problem with scalability as in grow in its scale and Something that could be a fixed by communities of course and Since I did use quotes around work great Here's the list of the problems and annoyances we had in existing setup So IG being a bank means it has very little appetite for risk. So besides bi-weekly patching cycles We had a constant influx of of risk work maintenance work And some other things that we just had to act upon and this took a lot of our time and What made this problem even worse is that VMs were treated like pets and not like cattle So if something went wrong with one of our VMs, we could or whole environment of VMs We couldn't just get rid of it and start over for scratch because you don't want to get rid of your pets, right? joking aside due to a bit of Not being able to seamlessly reprovision our VMs from scratch made us very Well made us extremely careful not to misconfigure any of those VMs So this made the whole deployment and development process very lengthy and also error prone To combat this problem. I developed a tool tool called chameleon which allowed us to mimic broad or any other Environments target setup as part of a local container. So now we could be more creative with our code We could see certain things worked for that target environment before those changes even hit that target environment We could even adhere to infrastructure code principles also although in a very limited context But still and now instead of having to commit our changes push our changes create a pool request Wait for that pool request to be approved And then for the changes to be merged one of the pipelines to pick up those changes Just to see you have a syntax error half an hour or an hour later Now we had an immediate response loop So if something was wrong with our code we could see it immediately and this made things drastically faster at least in the terms of development and the deployment and Related to what I said in one of my previous first slides actually now It was evident to everybody if we had a exponential growth of MLP and number of models that was being onboarded we Getting all this infrastructure provision getting it all configured it would take a significant amount of our time and Now it wasn't just me saying it now. It was a known risk on the horizon and it was a fact And Then we had a large number of unplanned migrations not something that we were trying to do But it was something again that we just had to act upon in order to keep our workloads running in compliance secure matter And again, it took a lot of our time and effort And by this point I was treading very lightly to even make communities a proposal But here are some of the things that you might Think of if you're thinking of doing the same and making a Kubernetes migration a possibility So containerize everything well that you cannot containerize there are certain things that maybe you shouldn't containerize But otherwise just do it even if you're not thinking of moving to Kubernetes if you're using Containers it could make your lives easier and also by adopting microservices architecture should do the same also in the future If you do decide to move to Kubernetes is going to make your set of future proof We're not even Kubernetes to any other container Orchestrator and this is not the future. This has been the present for years now Even Linus desktop apps are becoming as Containerize workloads for example snap packages, which I also use to package one of my private Python apps because if you think about it what better way to Handle a Python application with bunch of bunch of its libraries that in this form factor will work regardless of where you ship it to or deploy it to and This should be obvious But the more open source or CNCF software you use the better for example our monitoring stack Which was using Prometheus getting this Migrated from VMs to Kubernetes was a breeze and also with open source software if you have a problem And you know how to fix it You can simply create a pull request.  So I think it's a true win-win scenario and Spread the principles of SRE and share the mall knowledge among all team members Think of this as if you are creating a soccer or football team And I know a loss half of you that I said this but please hear me out Idea here is that not one only one person can be like a striker or a goalie But that anyone in the team can come and be a striker or defend the goal in absence of another team member Or even play in a different position for the time being but while still adhering to their expertise Some people just have more affinity or experience towards kicking the ball into the goal So to join a parallel with MLP team while it mostly consisted of software engineers We worked in the same way that whatever was on the board that could be picked up by anyone But while still adhering to our expertise and some people if they have more experience in this field They could lead these stories think this is just a nice way to work regardless if you're migrating or just doing daily tasks and Document everything I used to be one of those coders are Coders are documentation people like not anymore is it proved to be very valuable to have things documented before doing it And after the whole migration process also this way besides Spreading the knowledge it allows you as an expert to move on and do other things So now a software engineer who never did disaster recovery can do a disaster recovery by following our guidelines also documenting also means that creating design pages So everybody on the team is on the same page before the big changes are even made and before you even get to coding And Since by this point we were doing all of these things and many more actually I thought why not just make a proposal that we move to Kubernetes And this is where the same comes in where an idea is only 5% and the rest of it 95% is Execution and here's why Things are probably different now if you suggest to your team Hey, we should move to Kubernetes due to reasons But when I suggested it pretty much nobody was on the board. Maybe one guy was on the board this guy But the main reason was that things just worked in current setup and then we wouldn't really benefit by my by moving to Kubernetes So while I was definitely bummed by just what happened here to say the least I thought it didn't happen due to some 11 malevolent reasons people now liking Kubernetes or whatnot It was just simple fact. They didn't understand Kubernetes well enough or knew its Architecture so idea instead of giving up it was just to I Need to move closer Idea was that through research POC's demos show why this would be a good idea for everyone to adopt So please note. I don't have any dedicated move or migrate to Kubernetes time at this point I'm busy with many other things So luckily for me and I and G we have something that's called mastery or study days where Every two weeks we get to spend one day working on an idea or a concept that you could maybe use Maybe use your work in future and this is where I would for example do a research and POC and demo of MOP V2 Working on Argo CD and how that would look like or if we were using a helm charts or if we were using Ansible Customized instead of Ansible or that we didn't even need Ansible in the new setup and I also used every opportunity to demonstrate how existing problems can be fixed with Kubernetes I distinctly remember how around this time a lot of team members including myself were bothered by containers crashing and then Remaining in that fail in failed state until you literally went there manually and brought him back up To the point that we are about to start working on something that could represent Developing something that could represent Reconciliation loop for Docker and I remember saying like but this is already a feature in Kubernetes like what's going on here and Then we had a big one at least for me, which was attempt to go to the public cloud Now as you might have had a chance to hear from I and G colleagues today Diana and tie stock Things are in very desirable state in ICHP or I and G container hosting platform Which we did evaluate as as one of our targets and back in 2020s and some things were still rough around the edges We didn't like the whole namespace as a service concept We thought it was very limiting to us as a platform and that it was more tailored toward Applications also some of the features which I demoed like Argo CD. That was not possible Due to compliance issues, but regardless all of these things didn't necessarily make it our first choice target Which is a shame because that was our only Target that we could go back in I and G at the time So when out of a blue eyes a lead SRE I'm given a choice one day Hey, if we're going to Kubernetes, where are we gonna go? I see HP or cloud I said cloud and as part of this decision Within a single spread I created a fully working POC of MLP working on GKE Google Kubernetes engine Everything worked we could call models everything was encrypted on GKE side everything There are stateless workloads, so no data persist anywhere on the Google infrastructure even the in in transit traffic is encrypted I Documented a whole thing if anyone in IG wanted to recreate it for their setup Documented to my team a document. It's I Demoted to a bunch of other teams and interested parties and just when I was ramping up to make this a success story Whole thing was Forced to be shut down So why well since our in POC we used dummy data and in production we would be using actual IG customer data and even with everything being encrypted a law dispute called sherms 2 is what stopped us in our tracks I won't get too much into it but the gist of it is that it makes handling data between EU and EU S companies a lot more complicated and Well, some other Dutch and European banks don't have problems with sherms 2 Customer data remaining in compliance secure hands remain number one priority for on G which meant public cloud was a no-go Please note this was Back then things are now better back then we didn't even have a public cloud team now I'm part of this public cloud team things have and are moving towards a better Especially as with each passing day It's becoming inevitable that more and more people are realizing that public cloud being part of our future is just inevitable But but that's another topic for another discussion And why what just happened here was definitely a breaking point for me And I was literally this close to to give up on the whole idea I Thought instead of giving up again was the best thing I could do is just keep pushing on this idea Give more reasons because now people could see how easy was and how fast you could deploy with with communities and whole thing was now generating a lot of traction and Those are by the way like some of the reasons that I use so for example Nobody on the team like doing any VM or any other Maintenance or risk work. So when I demonstrate it to the team how if we went for a managed Kubernetes solution We don't need to do any of these things. This guy likes from everybody on the team It's also worth mentioning that Kubernetes comes with a lot of great features out of out of box like HPA horizontal part out of scale VPA vertical part out of scale plus or out of scale in service discovery Great conciliation loop I was talking about before and these are basic features. This is not advanced stuff Which means that then you don't need to spend time creating your own tooling Because we are going as a platform just around this time. We realized that We need a service discovery and even creating your own was in the cards But we ended up going for an existing solution But this still took a lot of our time and we had to do a lot of re-architecting to make it part of our setup and with Kubernetes services discovery is just there One of Angie's global ambitious is to go green I would even use this as an example in current VM setup We had VMs running on servers which are on all the time in Kubernetes You could scale up and down depending on the workloads So you're gonna consume less energy your whole energy for a pen is gonna be smaller Even the costs are be gonna be less and Then we as a team also had these discussions like hypothetical situations if we went for public cloud How would that work just for us to realize that we're not very mobile in an existing VM setup and with Kubernetes once All the deployment services are part of the ML files or health charts in this form factor We could move everywhere anywhere on prem to on prem or cloud to cloud This was a big positive realization for the whole team Excuse me So parallel to all of this what's happening here as part of my private life Auto CPU frack one of my open source tools is trending as number one on hacker news pretty much the whole day So happy days Well sure but under the load my private blog went down because people are coming to see what the project is about And why why am I even talking about this now? Well, because Yearly enough my private setup was very similar to what we had in MLP where I had container as workloads with bunch of services Part of the Docker compose files, which are then deployed to VMs using Ansible and although I was using AWS Which is like synonym with scalability since I was using a the AWS light sale I didn't have this feature even in cloud. I couldn't I couldn't scale and At the time I was working on the WP cage project an open source project That offers you prod ready fully scalable and highly available WordPress for Kubernetes Because fun fact WordPress by default is a stateful workload as such is not going to scale on Kubernetes at all So this is something I was working on if I ever wanted to move to two Kubernetes So since I had a project that was almost finished since I had a cluster that was shut down I thought what better time to prove the proof is in the pudding to myself to my team to everybody I simply started the cluster backup simple DNS change and since WP case project had horizontal part auto scale a cluster auto scaling It automatically scaled a cluster and pods to accommodate the all the incoming traffic automatically the scaling issue was fixed within minutes Result of that was WP case project, which was targeting GKE at the time Just something to help people get started with WordPress on Kubernetes with being fully scalable and highly available if you're interested take a look Of course when I realized how much this is going to cost me to run a private blog in GKE and said it said I had like two Synology NAS with around 48 terabytes of data I thought why don't I just get a couple of Raspberry Pi's and I make my own little private cloud as part of my home And that's what I ended up doing. I extended the WP case project to also Private Kubernetes offering I extensively document at everything from which UPS I bought which Raspberry Pi's about which SD cards Why I chose Ubuntu and microcades because idea was here that I don't want to maintain this thing that it runs as automatically as it can and Yeah, and if you go to that blog post right now It's being served for my home and depending on how many you go there. It will automatically scale and Since you're in Amsterdam and you might enjoy a beer to highly recommended by the way another workload another project that's hosted on the same cluster is Answered and toilet urinal Finder available on ATUF app just something to keep our city clean. All right So back to reality. I went to the team. I shared the news I think it does even happen over the weekend and they were impressed with what ease I fix the scalability issue But all of it still remain to be one of those like cool story, bro And that was it the decision in this time and point in time is that we still remain running on in current setup Meanwhile the platform is growing more and more time is needed to keep the lights on in the old setup to the point that The tenant features are not getting developed How much time it took cut to maintain the old setup? And then we had an influx of a lot of a lot and a lot of big models They requested a lot of our time in terms of hardware resources and just engineering effort And that's when we hit our old nemesis, which is an ability to grow in current setup To keep growing as a platform and to keep scaling Options were simple one We hire more people just so we can scale or number two We hire more we move to Kubernetes And then we don't have to do half of the things that we're doing now and this is when it was Like this is when it was clear crystal clear for everyone on the team Migration to Kubernetes is just inevitable and that's how our decision was made. So let that sink in Once the decision was made as it was as simple as creating a design page with acceptance criteria Scope of work what we want with this migration what we don't want with this migration what can be done now what can wait for later and Big part of it was concluding research where we want to migrate So public cloud was still still not an option so and that this consisted of Creating a big research Document or a confluence page which extensively compared to both options that even had a pros and cons list between between them so Options were ICHP which we evaluated in the past and a new kid on the block Which is a DAP Kubernetes cluster, which is now the biggest cluster in ING the biggest Kubernetes cluster in ING So option one was DAP which had vanilla Kubernetes So it meant that we could have any feature that we wanted It had dedicated Nvidia GPU core So if we had a model that was onboarded that requested custom GPU support we could give it to them It was part of our area So it meant that we could develop it or heavily influence the the direction of its development So match made in heaven well not really because us taking part in its development meant that we would have to continue to Do maintenance and development work on this which is something we were trying to avoid Also this cluster all the biggest cluster in ING is Only targeting the dev workloads and for us to keep our integrity rating as a platform We will need to be running in two zones So if something goes wrong that we could just have a an active failover an Option two was ICHP, which we thought was not a good option for us in the past now after we had a acceptance criteria Because it didn't have some of the features we wanted now we figure we don't even need those features for now It was stable. It was running in multiple zones It handled huge portion of our risk and maintenance work And it simply came down to taking more of the checkboxes on our acceptance criteria and was the option we went for in the end and At this part it was just do it because everything that was was demoed or or researched as part of the mastery days We knew exactly what we wanted and now we just put it in all all together So some of the takeaways from the whole journey As with every migration The best approach is to keep running into setups in parallel So don't try to extend your existing environments. This is going to be a completely different landscape Just start from scratch once you verify that everything is working in an old setup simply switch the traffic over and shut the lights off in the old setup and Monitoring good monitoring and alerting will go a long way I'm saying this because this is easily put aside Besides being alerted if something goes wrong in your old environment You also want to know if something went wrong in your new environment, especially in your new environment So you don't just keep building on top of something. That's already broken at its core And be brutally pragmatic and stick to the vision and what was decided Once the migration started we had all kind of crazy ideas But we also for example wanted to rebase all of our Container base images to a different distribution Don't do this because when things fail and they will fail you want to blast radius to be as small as possible so you can debug it easier and I'm also saying this because trust me There were a lot of options that we could have went for and if we did I wouldn't be here given the stock we would still be busy doing the migration and Journeys will take time to over two years is what took for us And I don't think our setup is that complicated So depending on the amount of the complexity of your setup and the size of your environments might take even longer That it just do it step in the previous slide took like three months. So please note good things will take time and Perseverance and not giving up there are so many ways to just give up in the whole process It was it was very tempting even But while adhering to this not giving up and persevering you also need to keep Re-evaluating the landscape but with an open mind So you don't miss certain opportunities because your view was too narrowly scoped perfect example is ICHP Which we thought was not a good option for us. Now it was the best option this point in time Even with the private cluster. I tried doing the same thing with raspberry pies before It was just not a good experience the hardware was not up for a job and now it was and Maybe that's one of my biggest takeaways from all of this that keep in mind that everything changes certain ideas along with certain circumstances Will match the changes in the landscape and in my lead to a perfect storm as it did in MLP's case so that was our journey and Why for all of those of you still running in VMs why I think with Kubernetes resistance is futile. So thank you


For the safety of your smile, use pepsidon twice a day, see your dentist twice a year. Leverbrothers Company presents the pepsidon program. The adventures of Philip Marlowe starring Van Heflin. Philip Marlowe, the screened most famous private detective created by Raymond Chandler, brought to you on the air by pepsidon and starring MGM's brilliant and dynamic young actor Van Heflin. All families all over America have named their favorite toothpaste. New pepsidon with earium. New fresh tasting pepsidon with a new cool netty flavor. Yes, in a recent test, new pepsidon was preferred three to one over any other toothpaste. It's true. With families all over America, new pepsidon is a favorite three to one. Families from coast to coast recently compared new pepsidon with a toothpaste they were using at home. They preferred new pepsidon by an overwhelming average of three to one over any other brand they tried. These families, three to one, said new pepsidon tastes better, makes breath cleaner, makes teeth brighter. Yes, in a recent survey, families three to one said new pepsidon tastes better, makes breath cleaner, makes teeth brighter. Yes, new pepsidon toothpaste for your family right away. Now the adventures of Philip Marlowe, starring Van Heflin. The moment old man Jeter came into my office, I made up my mind not to vote for him if he ever ran for president. He was tall and thin with straight compressed white lips. He wore a neat pinstripe flannel suit with a small rosebud in the lapel. He carried an ebony cane and he wore spats. He looked as smart as 60 and unless he's got nasty, I gave him another 15 years, which was pretty big of me. He sat down, speared me with those barbed gray eyes and came right down to business. Mr. Philip Marlowe, I believe. That's right. My name is Walsworth Jeter. How do you do, Mr. Jeter?  Well, why not? Frankly, sir, I'd expected the Hollywood detective's office to be somewhat more glamorous or rather more elegant, shall we say? No, fellow Vance has a branch office here on the fourth floor if you're shopping around here. No, no, no. You'll do, I'm sure. My rate is 25 bucks a day, plus expenses. Money is no object, except when you don't have much of it. That seems to be the motivating philosophy where Miss Harriet Huntress is concerned. Who or whom is Miss Harriet Huntress? A rather standard, rather obvious gold digger who wishes to marry Grover. You want to tell me who Grover is? Grover is my adopted stepson, my late wife's son. Next year he will inherit a million dollars left him by his mother. Which explains Miss Huntress' interest in Grover. Precisely. Well, Mr. Jeter, am I being hired to smear Miss Harriet Huntress? Not at all. Nearly to disillusioned Grover about her. Well, that's the same thing. I think you'd better find yourself another boy. Wait, wait. There's more. Okay, let's hear it. Do you know a man named Marty Estelle? Sure, he's a big-time gambler out on Sensex Strip. Why? Mr. Estelle claims my son Grover owes him $50,000. Well, then Grover'd better pay up if I know Marty Estelle. But suppose my son doesn't really owe Estelle the money? Does he or doesn't he? Mr. Estelle supplied photostat copies of Grover's notes with Grover's signatures. I thought they might be forged, so without Grover's knowledge, I took them to a handwriting expert named John Arbogast, a sort of detective. No. He's not sure. He wants more time. I'd like you to take over the case. Harriet Huntress and all. Miss Huntress, as you may know, is associated with Mr. Estelle. Well, that's incidental. I'll handle the forgery case and not the slander job. Now, where does this Arbogast have his office? Son, son, set me a river. Okay, I'll look it up. Miss Huntress, she lives at the El Milano on North Sycamore. I'll look her up, too. Arbogast and Huntress in the order named. There was no snooty secretary to prevent me from walking right into John D. Arbogast's extremely fat presence on sunset near Ivar.  He wore a wrinkled dark suit that needed cleaning and some reweaving where it had some small holes in it. Arbogast just sat and stared at me with the whites of his eyes because those three holes that needed reweaving were bullet holes. And John D. Arbogast was dead, very recently dead. I left in a hurry and as far as I could tell nobody saw me come, nobody saw me go. My next stop was the Swank El Milano Hotel on North Sycamore. Just a second, mister. Something you want? Yeah, yeah, who are you? I'm the house detective. Well, I'm looking for a Miss Harriet Huntress. Miss Huntress ain't seeing anyone. You can tell her it's Marty Estelle. Are you Marty Estelle? I'm from him. That's different, ain't it? That's none of your business, is it? Whatever you're up to, you're not playing it very smooth. Well, some days I feel like playing it smooth, some days I feel like playing it like a waffle iron. Well, if you must know I'm one of the boys. Philip Marlowe, Private Eye. Yeah, that's my card. Well, that's another story. I'll phone up to Miss Huntress. Yeah, say I'm from Marty Estelle, and that make it convincing, huh? How much convincing? Oh, well how much do those cigars your smoking cost you? $22.50, box of it. That much convincing? Well, that's cute. You and me are going to get along. I'll phone Miss Huntress, but you go right on up. Room 814. I just know it'll be all right. Harriet Huntress was too tall to be cute, too beautiful to be really cheap. Her green eyes were wide-set and there was plenty of thinking room between them. Her hair was a dusty red, like fire seemed to a haze. Her green eyes were that much green ice as she sized me up in the doorway. Well, what's the big message, Sonny? That could come in. I never could speak very well in public. Come in. Never could speak very well on a dry throat either. There's a scotch. Help yourself. Thank you. So you're from Marty himself? No, not strictly not even loosely. Not at all, in fact. What's your racket? No racket. Marty loves to know you used his name. I'm shaking you in my shoes.  Yeah. Pardon. Philip Marlowe. It's good to catch you. I'm glad you like it. Now, what's your business? All right. How much will you take to give up Grover?  Oh, man, Jeter's pretty tough. His idea is that you get nothing. You get smid. I don't see it that way. How much? How about $50,000? How about $500? How about talking about the effect of the rain on the rhubarb? Now, look, sister, suppose we skip the footwork considering the sobering fact that a man named John D. Obigast has already been murdered in this little case. Does that have anything to do with me? I don't know. He was hired to analyze some notes Grover gave Marty Estelle. He just killed just after I took over the case. Do you think Marty Estelle works that way? You know him better than I do, does he? Have you told the police yet? No, I thought I'd see if I could make a deal with you first. I'm going to tell you something. My people were nice people who never got involved and murdered. Old Jeter ruined my father. My dad shot himself and my mother died of the shock. I'm going to fix Jeter for that someday. Even if I have to marry his son to do it. And after Stepson really has no relation at all. You'll hurt Jeter just as hard. And the kid will have a million dollars next year. I could do worse, even if he does bring too much. You wouldn't want Grover to hear that now, would you? No. Turn around and have a look, gum shoe. I turned fast and he stood about four feet from me.  I can say anything I want around Grover, it's all right with him. Isn't it Grover? That's right, Harry. He's trying to break us up, Grover. What do you think of that? Maybe I better break him up. That's what I think good. She laughed and that made me mad. I turned the cow at her. It was a dirty look. It was the look of the month. That was the mistake. The big guy hit me. I went over sideways. It wasn't a hard punch, but my head hit a desk. Going down on the desk got the decision. It gets dark fast in Southern California, but seldom that fast. When I came out of at Grover, the lawn sucker puncher and Harriet Huntress were gone. But the bottle of scotch was still there, so I took that for souvenir and stuffed it in my pocket and floated down the elevator into the street. It was dark by the time I got back to my apartment on Hobart Avenue in Hollywood. I turned on the light and there stood a big guy, another big guy. This was National Big Guy Week. This one had a big nose, the dead color of wax, and he had a .22 caliber of Colt Woodsman pointed straight at me. Close the door and reach. Come on. I turned a little to close the door. I got my hand under my coat. Then I turned back to wax nose fast. I had my lager out. We stood there facing each other. Wax nose didn't seem at all impressed with my automatic. I just came to tell you to be smart. You're looking at a lager, mister. I know. Men of distinction carry lagers. Me, I pack this small, boy, because I can shoot. If you think you can take me, go to it. Oh, look, what's the game? Maybe you can take a hint and maybe you can. Maybe, maybe not. What is it? Lay off old cheaters, boy. Well, I wouldn't think of contradicting anyone who uses that Colt Woodsman .22 with the front sight file. Love must think he's pretty good. I am good. Yeah, and that's why I say OK, pal. We'll see. Speaking of .22, do you know anybody named John Arbogast? I meet such a lot of people.   So long, Chum. Remember what I told you. Lay off, Grover. So long, Chum. Yeah. Well. Ah, shut up. Yeah. Mr. Marlowe? Oh, Mr. Jeter.  He is both my stepson and my adopted son. Well, both of them poked me in the jaw. My word, where? In Miss Huntress's apartment. You spoke to her? What did she say? She wants 50 grand and no dice. 500. This is a gag. Just as a gag? Mr. Marlowe, perhaps you underestimate the importance of this message. Listen, Mr. Jeter, there are some very unusual angles to this case. For example, a gunman just stuck me up in my own apartment and told me to stay off of this case. What? I don't see why this case should get so tough. Good heavens. Listen, Mr. Marlowe, my chauffeur, Waldo, will pick you up in my limousine. I want to talk to you. All right. Well, tell Waldo to park on Hobart facing Franklin. He'll be around for you in 20 minutes. Good. Just give me time to drink my dinner. Bye-bye. I sat next to Waldo, the chauffeur, as he tooled the big Jeter limousine through Hollywood. Along the glitter of the sunset strip, out past Beverly Hills toward Bel Air. At Cabello Drive, we swung left for a couple of hundred yards and left again, aiming for a driveway flanked by 12-foot wrought-iron gates. Then something happened. Someone was standing in the glare of our headlights. Waldo swore and slammed on the brake shelf.  Man stepped toward it. In the next minute, there was that same colt-22 staring to my face again. All right, this is a heist. Get out of the car, both of you. Look, Waxknows, haven't you had enough fun for one night, fuzz off, bum?  I have to think some more on that, Buster. I'm warning you. I'll let you have it.  All right, you ass-ported. Hey! Oh, you shot the guy. Yeah, I shot him. It was this. All in fun.  It did the work. That is Jeter's house is right ahead. You sound as if you just shot a nickel and a pinball machine instead of a man. Now listen, turn off those lights and let's get out of here, but fast! You are listening to the Adventures of Philip Marlowe starring Van Heflin. Yes, family, it's all over America. I have named their favorite toothpaste. New pepsidon with invigorating earlium foam. New fresh-tasting pepsidon with a new cool minty flavor. In a recent test, new pepsidon was preferred three-to-one over any other toothpaste. It's true. Families all over America say new pepsidon is their favorite three-to-one. The William Kilpatrick family, 212 South Missouri, Claremont, Oklahoma, preferred new pepsidon on every single count. The Kilpatrick's say, new pepsidon taste best of all, makes breath cleaner, makes teeth brighter. On all these counts, by an overwhelming average of three-to-one, families prefer new pepsidon over any other toothpaste they tried. It's a fact. Families three-to-one say new pepsidon taste better, makes breath cleaner, and makes teeth brighter. Remember, this is not just our opinion. It's the honest conviction of the Kilpatrick's and other families who are asked to compare new pepsidon with the toothpaste they were using at home. Get new pepsidon, the only toothpaste containing earium. Get it for your family without delay. We continue with the adventures of Philip Marlowe, starring Van Heflin, who affairs by arrangement with Metro Golden Mare, producers of the romance of Rosie Ridge, starring Van Johnson.  We went back to my place to start all over again, over what was left of my perlouin scotch. Yeah, it's a good scotch you've got here, Marlowe. Pinch bottom. Not this, sure. Pinched it from the apartment of Harriet Huntress. Well, bottoms up. Well, though, do you think that gunman was there to scare young Grover into realizing Marty's tell-me-s-business? Could be. I always drove Grover home around that time. I think it doesn't sound like Marty is still to pick that sort of a helper. Well, sure. Maybe that's why he picked him. Because it didn't seem like Marty is still. Yeah, that's good thinking, Walter. Dartmouth, 37. Rah, rah, rah. That would be either the cops or Mr. Jeter. Hello? Mr. Marlowe? Yes, Mr. Jeter. And the reason we're not in your study now is lying outside of your front gate. What's that you're saying? Somebody jumped us outside of your gate and Walter shot him dead. Good Lord. Yeah. Listen, Marlowe, come here at once. Do you hear that once? I'll send Waldo, Mr. Jeter. I want to see you, you. Waldo will tell you all about it, Mr. Jeter. Marlowe. Good night, Mr. Jeter. After Walter the chauffeur had left, I went back to the El Milano Hotel. Hawkins, the house stick, was all smiles and open palms. I placed no confidence in his smile and $20 bill in his palm. Are you at Hunter's again? Yeah, what's the matter? Just take me up to her apartment. That's all, huh? Yeah, sure. Right this way, fella. Hawkins took me to the eighth floor, room 814 and opened the door. There was someone in the room waiting. Here's company for you, Mr. Estelle. Beat it, Hawkins. Yeah, this is the guy who was telling you about Mr. Estelle. Come in earlier today. He said he was familiar. Oh, sure, sure. Come on in, Marlowe. I came to see Miss Hunter. It's not you, Estelle. Well, first of all, Harry, it's not home. I came to tell her what happened outside of Jeter's game. So you keep informed. I can't wait for any longer. Gotta get back to the casino. Well, then, what did you come back for, Marlowe? I'm looking for the Jeter boy. After what happened during the night, he needs somebody to walk behind him. You think I'd play games like that? All I know is we were shot at. I asked you a question. I answered it to the best of my knowledge. What knowledge, for example? Well, for example, you hold $50,000 worth of Grover's notes for gambling debts. I've got $50,000 invested in that kid. Would I be likely to bump him off? Ah, that makes sense, all right. I always make sense. I'm bullied for you. When I have 50 grand invested in a guy, I'm up to find out all about him. Like about old Jeter hiring a man named Arbogast to work for him. Arbogast was shot today. You know it. I know because I had you followed. You didn't tell the law, Marlowe. That could be very hard on you. Well, it could. Does that make you and me friends? A little blackmailer? Not much. We'll call it a tattletail grail mail. Now, when do you stop bothering Miss Huntress? Hey, you win, Marty. Well, that's all. I've got to go. Well, I'll just wait around for bed, OK? Well, Harriet Scott is in that cabinet, then. Thanks. I'll roll up my pants and go waiting in it.  You're cute. It's a long shot, but... Marty Estelle was right. He wouldn't kill anybody who owed him money and was soon to come into a lot of it. Now, I was in bed with the police for not reporting Arvigas' murder. Well, I looked around Harriet's apartment vaguely, walked into the bedroom, and stopped. Because mixed with the fragrance of good perfume and good cosmetics was the plain, ordinary, home-spun odor of gunpowder. I walked across the room and yanked open the closet door and stepped back. They're just as big as life, but as dead as they ever come was young Grover Jeter. And at Grover's feet, among the graceful shoes in Harriet's closet was a tiny pearl-handled automatic. I felt bad about that. Because I guessed that the dainty holes and bullets from that dainty gun would fit the two dainty holes over Grover's heart. I put the neat little pistol in my pocket. I thought old man Jeter ought to know about his son. I didn't expect to find Waldo the chauffeur and Harriet Hunter's with old Jeter in Jeter's big study, but there they were. I missed him, Marlowe. And I've given up hoping to see you tonight. Well, I changed my mind about coming out again, Mr. Jeter. Uh-oh, Waldo. Hi, Marlowe. Didn't expect to see you here, Miss Hunter. Didn't you? Did you expect to see me here? Never mind that, Marlowe. I want to know where my son is. What do you mean, Mr. Jeter? He's missing. That's what I mean. Oh. He's missing and no one knows where he is. I know. What's that? Where, Marlowe? Miss Huntress, where did you and Grover go after Grover took that sucker punch at me in your apartment? We went out together in a taxi. During the ride, I had a change of heart. I didn't want Grover or Grover's money. I told Grover to find another playmate, and I got out in Beverly Hills. Grover went on in the taxi. Where did you go? Back to my apartment. Later, I got out my car to come down here to Jeter. I decided to forget the whole thing. For him to call off his dime novel sleuth. A dime will no longer buy a novel of any description, but that is beside the point. You said you knew where Grover is. That's not beside the point, is it, Mr. Marlowe? He's back in Harriet's apartment. Why didn't let him in? How on earth could he be? Hawkins, you're out. Detective, let him in. The last I saw of Grover, he's dead. Oh, what? What's that? Dead. Dead, shot with a small caliber gun. I can't believe it. I can't. It's... Grover's dead? Ms. Huntress, this 25 caliber pistol was on the floor, Grover's feet. Can you take it? Look it over, will you? Mine. You're murderous. You... Enough. You cold-blooded murderer. Oh, stop that! Stop it, both of you. It could have been suicide. Suicide? Well, yes. That's a possibility, of course. I see you like that idea, Jeter. But it wasn't suicide. Then she did it. The murderous, the scheming contempt of her. It was murder, and it's fairly obvious who did it, Jeter. Eh? Maria Stell is my guess. Well, guess again, Waldo. Stell had $50,000 invested in Grover.  And Waxnode didn't do it because he was dead thanks to Waldo here. That leaves her. She did it. There had to be a motive and an opportunity. Well, it was her apartment, after all. Correct, Waldo. But Grover was Jeter's adopted stepson. Oh, like a real son he was to me. A real son. Yeah, yeah, yeah. But did you lovely people know that in the state of California, a man can inherit from an adopted son who has money and who gets dead? Did you know that, Mr. Jeter? Why, what do you mean? You're inheriting Grover's million dollars would be a motive for killing him, wouldn't it? Mr. Marlowe. That was the motive, Jeter. And it was Waldo's job to find the opportunity to murder Grover for you. All right, Marlowe. That'll be all for you. Well, Waldo, the darkness gun fanner. Drop that gun, Waldo.  I said drop it. Hey, that's nice shooting, eh? My hand, my hand. Well, Papa, we'll put a little band-aid on for you, Waldo. Waldo, you could have gotten to my apartment wearing that chauffeur's uniform. You could have gone into the garage entrance and up the back way. Sure. When Grover let him in, he backgrove rang as they roamed with his gun, but he shot him with yours. How much was Jeter going to pay you for this job, Waldo? Don't talk, Waldo. He's bluffing. You're telling me he's bluffing. Nice kids, these college boys. Tell me, was it darkness or Danimora, Waldo?   Then you hired Waxnose to fake a holdup on Grover. Why? Again, to throw suspicion on Marty Estelle. To make it look as though Estelle was trying to scare Grover into paying his gambling debts. If I hired Waxnose, why would I have shot him tonight?  When I was brought out here tonight, Waxnose thought I was Grover in the car. He began to fake his holdup. But you just couldn't resist taking one of your snappy snapshots at Waxnose, could you, Waldo?  Next, Mr. Wadsworth Jeter. Look here, Malo. You can't accuse me of... Doctor, be sick. Call a doctor. It's his heart. If Jeter dies, it's your fault, Malo. Okay, Waldo. Tell you what I'll do, Waldo. If Jeter dies, he doesn't have to pay me my fee or even. Okay, Waldo? Harriet Angel, listen, go call the doctor.  His heart was as good as mine, if you want to make anything out of that. The law had Jeter and Waldo cold, and I mean cold. Me? Well, I went out a couple of times with Harriet, as I sat home with her a couple of times drinking her scotch. It was nice, all right, but I didn't have the money or the clothes or the manners. Still, I was sorry when she went to New York to live. She had absolutely the best scotch I ever tasted, maybe because it was free. I don't know. You have just heard Van Heflin, starring in the mystery series Raymond Chandler's The Adventures of Philip Marlowe, brought to you by the Lever Brothers Company, Makers of Pepsidon. Van Heflin will return in just a moment. Have you tried, have you tasted the new Pepsidon toothpaste? Its lingering, minty flavor is so fresh and inviting, families prefer it by an overwhelming average of 3 to 1 over any other toothpaste they tried. In a recent nationwide test, these families said New Pepsidon tastes better, makes breath cleaner, and makes teeth brighter. Remember, New Pepsidon gives you more invigorating earium foam. It sweeps dulling film away. No wonder it's the 3 to 1 favorite with families all over America. Get New Pepsidon with earium for your fun. Get New Pepsidon with earium for your family right away. Now here's our star, Van Heflin. The need for food in Europe tonight is desperate. Starvation faces a multitude of our fellow men. There's a way you can help. For $10 a package containing 21 and a half pounds of food will be sent for you to a friend or a relative or any member of an organization you designate in Europe. Simply say to a little French girl or to a Belgian war widow, your order will be strictly respected and you will receive a signed receipt from the person who received your gift. Send $10 now. Send all you can. Send your $10 to CARE, C-A-R-E, CARE, New York. Help keep America the hope of the world. Tonight's story was adapted by Milton Geiger from the story Trouble Is My Business by Raymond Chandler, creator of Philip Marlowe, the screened most famous private detective. The original music was composed and conducted by Lynn Murray. This is Wendell Niles inviting you to listen again next week at the same time to another exciting mystery of the adventures of Philip Marlowe, starring Van Heflin with a distinguished cast. This is NBC, the national broadcasting company.