इं औरका आखमी च्यन एक आछते नागस प्रत्र हैं। दोँस तो आज हम च्रचा खा ہےंगे इंक बहुत फीट लाग झा चा आचढी स्झी अशी आचा जाचा बहुत ऎज दे पुर्छिल राशा प्रत्र ते कों नायathon is a very special by physics law that is known as triangle law of vector addition.  आपको मालुब होगा के जिन्ट भी ग्राफ्रिक सुफ्फर होगा आपको मालुब होगा फोटोश्प या कोरुल ड्रो पहले हूँँ अगर ता ता अभी भी है और जितने भी अदर ग्राफ्रिक सुफ्फर होते है, मूल तह जो है मैठमाटिक सी बाग्राउन में होगा है कुकी सारे कोडनेट जोमेट्री या वेक्टर आलजिब्रा केले या काल्पुलस केले सारे इनहीं आमो के प्रियोग से ही हम उन सुफ्फर्फर्ष की रचना करते हैं तो मैठमाटिकस और इनवे आर्ट is very deeply linked सो उसकी भी चर्चा हम करेंगे तो पहले जान लेते हैं कि ये वेक्टर ट्राइंगल लोग वेक्टर एडिशन है क्या तो जैसर के आपको आपको अपनी स्क्रीन पे दिख्रा होगा आबी एक वेक्टर है और बी सी तुसरा वेक्टर है जो 44 दिगरी के अंगल पे आबी से इंख्लाईंगल है तो जो इसका resultant होगा that is the sum of a, b and bc आवे हमें पता है is given by a, c अगर आबी एक वेक्टर बी सी तुसरा वेक्टर अगर एक त्रंगल के 2 पाट्स को तुसरा वेक्टर है जो तो इन दोनो का resultant या sum जो होगा वो रिप्रज़न्त होगा त्रंगल के 3 रे साएट से आबी, b, c are the two vectors whose sum or resultant is given by a, c आबी, b, c are the two vectors whose sum or resultant is the value of alpha in this case is 4 degrees and value of 5 which I have calculated geometrically it is 16.74 in this particular configuration understood so what is it once again a, b plus b, c these are 2 vectors the length of a, b the magnitude of the vector being represented the geometric length of the b, c the magnitude of the vector being represented रेट्र से यूँ आप देअगा जोद बिजके अब वेक्तर से नहींने सोगी रेट्र बिजके शुएगा और तो शो वेक्तर शुएगे यूँ बिजके आप यहने सोगी खादा है. जो फम्ट्ट्ट्ट्ट्ट्ट्टा, ईबि उसके बीज का है तो आपको पदः है खिजी वेक्तर को रिप्रज्टाड करने के लिए हमें 2 कंबाउतिस की जोडफ लब लबई है बएद्र लिए थी तो रब वेक्तार् से म Nh Firstly 1, magnitude is the motor's direction. तो आपनोग, आपनोग, आपनोग, आपनोग आपनो आसम्सदेino Let's magnitude is the motor's length. और नहां, यह सबवोग यह साथ. यह यह साथ आपनोग, अप्का।, 갑자기 the direction is from that angle. तो हैंस ये होगाया आप का ध्यामगल लोग अख्वेक्तर एदीशन ये से ब ब यही रहाँ भगे बी आब नहीं थे वेक्तर था किदी सैथ तो बगे बगे भगे बगे बगे बगे, दे आदा थे तरीज सैद ये इसो उगाए नहीं चाह खाल हैं. इसली ? खेल्डिदूरूप पब वीॐ अगी मखिल्दिडीरण च़ाको। च्छग। आप फुल्त यह असी वी-सी-गे नाप मुझाड़़ी आप पै़दा गरूषत् तरंगल लगाना उआप पै़दा गरूप उस्फॉल्ला यह नहां मुस्दर् to mod of ac that is the magnitude of vector ac is under root mod of ab square that is is ab ka length ka square plus is bck length ka square plus twice of ab and bck length into the cost of angle between ab and bc which is 44 degrees given by alpha or theta whichever way you can say it alpha is theta in this case so you can you can get what is the magnitude of ac. secondly the phi the angle between the resultant and the first vector is phi you can clearly see tan phi is c e upon a e so i am not shown those calculations i have not shown those calculations but this is not a big thing and you will get this value of phi in this case 16.74 so what happens if i change this point c. so now i am changing it and depending upon a and b and angle you can have different different locations and positions for the vectors and you can see how the resultant of the vector is dependent on these three factors. you can see if i move a then how the value of ac and phi is changing on the screen you can see if i change b then you can see the value of ac and phi is changing and same way if i change theta then it changes. now the fun fact is that now we will make some design from it. so that is the most important thing and another most important thing which you are going to discuss here. so let's see how this design will turn out and what is in this design. so let's see what i am doing that i am animating it by turning on this trace. so let's see what it is so this is making a new design here and as the value of a and b and c is changing you can see a new pattern emerge. so this is interesting. this is quite interesting and you will see a new pattern on your screen. what is that? that is the trace of point c. so one thing you will be seeing in this is that it is coming up with a symmetrical design. so hence if i change it then it will oscillate in repeat mode and you will be able to see deeper details of this design. so you can see how by changing a, b and theta we can get a very different type of use of vector algebra. isn't it? so we are also able to make a design here. so this is one pattern. if you see i will stop it now and try a new one again. and let's change the values of a and b all together and i will get some variation in size so that everything is in this screen. so let's see how this design will turn out in this case. this can also be a bad answer. so let's see if you see again you will see symmetry again. why? because this is an oscillatory system. this will continue to change. so here see a new design is coming up. interesting thing will be that on the left side of the screen what kind of design it will be. this will be interesting. and you see again in this case also a very symmetric figure is coming up. so let's take one more attempt and give it a little more variation and see what this design will turn out. so let's see this and again so i have again brought a little variation in these three parameters. and again it will turn out to be a different design. interesting thing will be to see if it can give a recognizable shape. so if you see again a symmetric figure is coming up. then you will know when it is complete. yeah so if you see now it's again very very symmetrical. again a symmetrical figure or two leaves is coming up. right? a design is coming up. so i hope you have understood that because of mathematics we can also work in the field of design. so all the design software that are utilized for different designing and for that matter even for gaming whatever you know you must have heard the name of the software like unity or blender whatever these all work on the basis of graphics and the basic work behind the graphics is of mathematics. so friends if you want to make your career in this field then it will not be without mathematics. so this is a good thing that if you are interested in mathematics and it will be very easy for you. so i hope you liked this explanation. and also that how to be designed with the help of vectors on your screen. it can be if you are interested in this then you can also do these different simulations on your screen. it's free software. learn from it and see how mathematics can be made interesting. so thanks for watching this and we'll come back again with another explanation another simulation and let's see if we have some relationship though we believe or i believe that there is but for you also to believe we have to come with more explanation as into how mathematics is very closely linked to our day-to-day life. thanks for watching see you and bye-bye


Good morning, everyone. I am Kalyan. Welcome to PyCon India 2020. Our first keynote speaker is S. Anand. Anand is a co-founder of Grammar, a data science company that believes in storytelling and its power to influence decisions. He is recognized as one of India's top 10 data scientists. Anand, I am very pleased to welcome you today. The stage is yours now. Thanks, Kalyan. I'm going to be talking about how to make apps seem faster without optimizing and to explain why this is the topic for my keynote.  This was 2008 and I had just about learned Python at that time and I was working on a project and one of our clients, he said, Anand, there's something that I'd like you to do for me. They were buying raw materials from many countries and currencies fluctuate. So he said, look, I want to figure out what my next month's cost is going to be. I know roughly how much I'm going to buy, but the currency could vary. Can you predict what that cost is likely to be overall? And they were buying from China, Mexico, Canada, India, Japan, variety of different geographies. Of course, pretty large data, not just for those days, but even in today's terms, but I had solved similar problems before. So after about 20 odd years of coding, I figured, look, optimization is the least of my problems. So I went ahead and I'm going to show you what exactly I built very briefly without going into the details. I'm going to use the modern equivalent of what I did. The code in those days, obviously, was very different. So today, I would effectively load the purchases data using a library like partners that it didn't exist then. But the data effectively said, these are the currencies that we're purchasing in. And this is the value in US dollars that we are purchasing. Then for each one of those currencies, I tried to figure out what the best model was to forecast the prices. At that time, there weren't that many fancy models. Auto regression was one of the few models that was reasonably reliable. It basically says that I can predict the price of a currency next week by looking at the price of the currency today, yesterday, day before, etc. And figure out what is the weightage I should assign to today, yesterday, day before and how many of our days of lag we use. So what this code does is effectively goes through each currency and reads the historical currency data. It goes through various possible lags. Maybe we should look at the last three days or if you want a better model, maybe the last five days, maybe the last seven days, maybe the last 10 days. And we don't really know which of these is an optimal model. If we take, for example, three years, which is 1095 days, then it's a very likely accurate model. It may overfit, but it's still likely to be an accurate model, but it will be slow. So I'd ideally like the best trade-off between speed, which is where optimization comes in, and accuracy. And then fit the model, figure out which of these seems to be the best model and use that for the forecasting. That's the same approach that I took in 2008. And then once I found out what the best model was, I then predicted for the next 30 days, figured out how much it's going to change after 30 days versus today and wrote a print statement that said the sales value will move from whatever to whatever the previous purchase sum to the forecasted value. If you didn't understand the details of it, what you need to know is basically I wrote a program fairly quickly that would tell them that there's a 4% increase in the next month's purchase price for all of their commodities. And took it to Gobi. This took about a day and a half for me to put together a test, run, build, et cetera. Let's run this. And this is exactly what I did with him as well. Here I am. I'm going to show you what this program does. It takes historical data and runs it through a forecasting pipeline and effectively while the program was running, and this is exactly how it was in the original demo, I was just saying, yeah, this is what it's doing, blah, blah, blah. And Gobi was very patiently waiting. It was actually a reasonably fast program. In the sense that it crunched a hell of a lot of data. But you don't really want to stare at a blank screen for anything more than 10 seconds or even that long. What you really want is for the results to start coming through quickly. And that's when I realized that it's not enough if I learned optimization, no matter what language it is in. What I really need to learn is also to make apps seem faster without optimizing. And that's what this talk is about. All of the slides and the code for this talk, you'll find on github.com slash srn0 under PyCon India 2020. This is the one URL that you need to know to revisit any of the contents from this talk. And if you want to catch me on Twitter, then it's srn0, that's the handle. So let's dive in. How does one go about making apps seem faster without actually doing the optimization? Well, I was doing some research at that time and over the years I've picked up a few tips around this. One of the best tips comes from a book on human-computer interaction by Alindix and others. They talk about three things that an app should have for it to be usable. Learnability, flexibility, and robustness. For my purposes, the robustness was the relevant part because that included four things that I thought were really important. The first is to prioritize. What do we want to show first? Let's make sure that people see the most important things first. If I sorted the data alphabetically. So let's take all of the currencies. All of these currencies are sorted alphabetically and I was processing the currencies in this order. But they are buying $3.4 million worth of items in Chinese Yuan and only $1,000 in Danish Kroner. Why would I ever bother processing Danish Kroner ahead of, let's say, the Mexican currency where they're spending $2.3 million? I should really sort this in descending order and predict the most important ones first so that they get the best forecast early. That's an example of prioritization. Second was just keeping them updated. What I was doing was running a verbal dialogue saying, yeah, this is what it's doing. It's a effectively entertaining copy while the program was staring at him with a blank cursor. We need to show progress. We need to tell the user what the state of the application is, how long it's going to take. We also need to recover from errors. The number of times I've pressed control C or the number of times I've had a network error or the number of times where I was writing an application, debugging it, and then I had to restart all the way from the beginning. I can't even count. What we want is an application to be robust by saying if it gets stopped or you stop it midway, you can continue from where you left off. And pre-compute. If you know that some part of the answer is not going to change, just calculate that up front. No need to recalculate it every single time. And these are four principles that go into making an application more robust, making it seem faster without actually doing any optimization. And in this talk, what I'm going to do is firstly, ask you to remember the word purple in mind. P-U-R-P. As the acronym that will help you remember that by prioritizing, updating, recovering, and pre-computing, you can help make things seem faster without actually being faster. And I'm going to go through each one of these step by step with examples to show how you can optimize the same application that I had shared. You're welcome to follow through on the code in more detail on the GitHub repo that I shared, but for now it's probably best if you focus on where I'm pointing to in the code. I'm going to start with updating users, not the first one. In fact, originally I thought of whether I should reorder it in the way in which I'm going to explain it, but then the acronym ended up being IRP, which isn't exactly a great acronym. So bear with me, please. I'm going to start with making sure that the users know what's happening. And the obvious way to do that is print statements. So in this particular piece of code, which eventually, after heaven knows how long, prints that the sales will move up, well, in this case down from 11,046 to 11,077, if we just introduced a print statement, one here, as we loop through every currency so that it prints the currency, and then as we loop through all of the lags to say, this is the lag number of days I'm computing. Let's add that. Now, if I run forecastprint.py, the good part is that at least it constantly keeps me updated on A, the fact that it's doing something, and B, what it's doing. Even printing a dot or any kind of progress is good because people know that the application is working, but printing the specific action that it's doing helps us be more informed. So in this case, I can see that it's processing Danish crores. What it doesn't yet tell me is whether it's gone far or there's still a long way to go. I don't know the percentage completion. That's a gap. Also, it's a bit difficult now to scroll through. I mean, there's a lot of printing. Maybe I don't want this level of detail. Sometimes I want this level of detail because otherwise it's not fast enough, but sometimes I don't want this level of detail. How do we solve for that? Well, the next logical step is to use a library like logging. But before we go there, the main takeaway that you should keep in mind is that if something isn't printed every three seconds, then the users are going to worry. I'm talking about console applications, but on the web, if they've started something and it's a long process and they haven't received an update in three seconds, they'll assume something is wrong and tag it to bad user experience. So what can we do that's a little bit better? Use the logging library. Now, the reason you want to use logging is, one, you can put multiple levels. So for example, let's take the currency. We can print the currency at an information level and we can print the lags at a debug level. Now, what this lets us do is, firstly, it's printing a little more detail and I've configured it to show the times and I'll quickly explain why that's important. But it segregates the prints into whether it's printing for info or for debug. Now, I can choose to say instead of logging at a debug level, just log at a higher info level. And in that case, it logs a little less. It just logs the currency that is currently being processed, not as rapidly updated, but still at least I can comprehend the progress and see what the flow is. And also I can see that it took three seconds to do this. It took three seconds to do this. So it's roughly taking three seconds per currency, which is also helpful. And that's a feature that the logging library provides by default, where you can specify a format and a daytime specification. But another reason why I always prefer logging over print of any kind when deploying in production is that it's very easy to rewrite it to log files. It's not just when running it live that we want to see what happened during in production. We usually want to save the results elsewhere too. So that's the next logical step. But remember, we still don't have a percentage completion. That's the next logical step and EQDM is a perfect library to do that. It allows you to show the percentage completion. It just requires a couple of changes. After you import EQDM from the EQDM library, take your iterable and wrap it around EQDM. All I did was put EQDM off and the original array, similarly for the list of lags. And what that does, in fact, let me start by only adding the log to the currency. So when I do that, it starts by showing me the percentage completion, which is currently 0%. And now it's moved to 6%. Now it's moved to 12%. I also know that it's taking about 3.2 seconds per iteration. And at this pace, there's still 40 seconds left. So I can use that to decide whether I want to step away from the system or I want to do an alt tab and look at something else, set a timer, whatever. I know when I need to come back. And that is very powerful. So when you're showing progress, if you show percentage complete, that gives as much information as possible to the user. So that's the next stage in updating progress. EQDM also supports this at two levels. So if you put in a EQDM under that, then what it will do is show you the progress, the first row for the first overall progress and the second row for the second. Normally it would just show two lines and the second line would constantly get updated. But on Windows and currently I think in VS Code, there seems to be a bug where it's not able to move one line above. So basically look at the bottom two lines and ignore the previous lines. The last but one line shows how many currencies it's processed and the last line shows the progress of the lags. All of this works fine when we are dealing with console applications. What if I want to create a web application in which I want to keep computing things and show progress? WebSockets are a great way to do that. WebSockets allow bidirectional communication from the server to the client and from the client to the server. So the server can, as it computes any result, push something or write a message to the client and tell the browser, this is what I've done. So let's show you an example of this in action. And then I'll explain how this was created. So I'm opening an application that prints the currency that's being processed and the lags that it's processing the calculation on. And it effectively looked like a series of print statements. Take a look at it. Looks like I have... Oh, okay, sorry. Forgot the name of the application. This is currently processing it for fewer lags than I was expecting. Let's reload that. So it's processing and effectively doing the equivalent of printing for every single currency and every single lag. The only thing that I did here was instead of print, wrote a write message. This, of course, requires a WebSocket application that handles it. Currently, I'm using GramX, which is a framework that we've built that's open source, and you can look at that on grammar.com. But you can pick either directly the WebSocket library or you can use tornado or pretty much any WebSocket library. And the important thing here is that communication with a WebSocket is simply a matter of writing a message. How exactly does that work? Let's look at this a little more closely. I'm going to go to the Network tab and select the WebSocket section here and reload this page. You'll see that a WebSocket has been opened here and this particular WebSocket, we should make it a little smaller, it's constantly sending some text. This is exactly the text that is being printed by the server using Handler.WriteMessage. And that's being received by the client. What does the client-side code look like? Very straightforward. We create a new WebSocket at whatever is the URL. What I'm doing is taking the current URL and replacing HTTPS with WS, and then changing the .html. So there's a forecastsocket.html and changing that to forecastsocket.ws instead. So the URL is simply the same as the current URL that we've got replaced with the WebSocket. And when this WebSocket is opened, we send a start message to the server. Out here, whenever a message is sent, the way GramX is constructed here, we've said whenever a message is received, run this function called forecast. And forecast gets a handler and the message. Now, we aren't really doing anything with the message. What we have to do is to the handler, just write whatever message we want. Browser then receives this in the onMessage function of that WebSocket. And what we do, taking that message, is simply take the list of messages and add to the HTML whatever is there in the message data. And what that message data has is literally whatever strings were being printed here. Now, this is an opportunity for us to make the front-end application as responsive, as console applications, in fact, potentially even more so. And we'll talk a little more about it. But so far, the one principle that I've talked about is how to update progress. There's one more thing that I'd like to highlight here, which is when doing this, set expectations well. So there was this application that we were building for the Ministry of Finance a few years ago. The data was on a really, really slow network and it was quite large. So I didn't want to take risks. So using the equivalent concept of WebSockets, what we did was set up a flow a bit fast. Now we've really optimized it, but let me pretend I'm on a slow 3G network. Reload this. And what this does is it's loading the data and it's showing the progress of loading the data. But I was worried about something and you may have also noticed that it got to about 20% and then suddenly started showing the results. This is a hack. What I said in the application was it can take up to two minutes to forecast the results. Now, in all probability, it would probably take only about 10, 15 seconds, max 20 seconds. But it set the expectation and also set the progress bar for two minutes. So people are expecting that it'll take long and then if anything, they're pleasantly surprised that it was running faster. This is one of those cases where we are actually tricking the user. We don't want the application to actually be faster. That's the topic for a different talk. That's optimization. If you want something to seem fast, one of the most powerful ways is to set low expectations and you can either set accurate expectations and take the risk of randomness or plan for a certain amount of buffer. Plan for things to take a little longer. Set expectations that it might take longer and if you beat those expectations, cool. User's happy. Let's move on to the next topic. How does one go about recovering from errors? So if we are midway through an application and we stop, we press control C, network stops, the application crashes, we have error in the code, how does one continue from where we left off? Let's look at what we've done in this application, the forecast recover application is added a library called SQLite dict. SQLite dict allows you to create a SQLite database that's persistent, in which you can store a key value pair and use it just like a dictionary. So, for example, I said Python from SQLite dict import SQLite dict, that loads the library and it should happen faster. Let's say this object is equal to a SQLite dict which I'm going to store at some test.dv and I tell it to autocomment that every time I put something in the object, it stays. So if I say x is equal to 1, y is equal to 2, treat it exactly like a dictionary, update of a is equal to 3, b is equal to 4. That's all. Now, this creates a test.dv file and this test.dv actually contains exactly the same contents that I had. Now, you could instead store this in a database. Yeah. I suspect the data is too small for you to see and I'm not able to make the screen bigger, but just recognize that this is a SQLite editor where I'm seeing the values in a pickled form. As long as the contents that you have are pickable, SQLite dict will be able to store it and what that means is that the next time you load import and then load, the obj will actually be able to access all of the keys that you had earlier. So if I converted obj into a dict, it contains x is 1, y is 2, a is 3 and b is 4 from the previous session. So that's the first thing that we're doing here. Just create a cache that we can recover from and then what we do is, if as we loop through, if the currency is not already cached, that's when we'll do all of the calculations. If the currency is cached, then just pick up the model that we want to use from the cache and in here, we take the cache, which is the place where we're saving all of these models, at least the best models, and store it if it's not already stored. That's it. We just made these four changes a bit of a error here. This should have been changed here. Now, given this set of changes, how does the application work? Supposing I run forecast recover and it's doing the first round of calculations for Australian dollar. It's doing the second round for the Brazilian, what, Canadian dollar, and let's stop it there. Now, if I run it again, it skips the first few very quickly. Australian dollar, BRL, CAD, it's already done. How does the Swiss Frank Chinese Yuan check Kronor? And if I stop it and restart, it continues from where it left off. This allows us to debug applications remarkably faster. And if there's any error midway, then we allow people to recover. This is what's called forward recovery. That is, it allows us to go forward in contrast to something called backward recovery, equivalent of undo. Undo becomes important when we have write operations, but I usually deal with data and read operations are the more powerful or more important ones. And it's forward recovery that ends up being the critical factor there. Now, the other thing is, what if there is a change midway? See, we've cached it. Now, what that means is that the next time I run it, we're just going to zoom through and say, where is all of the data? Here's the answer. In the middle of the day, supposing we got new data for the Hong Kong dollar and we want to rerun it, how are we supposed to just rerun for the Hong Kong dollar instead of having to rerun for everything? That's easy enough. We can check when the file was updated. So if the currency Excel sheet, which is where we're getting the data from, was modified at a certain time, we can see if the previously modified time, let's not worry about the exact structure of the code, was earlier or later. And if that file was modified earlier, then redo the calculation. If it was modified later, then no need to just jump to the end. The way we do this is by caching, not just the model. Last time we said cache the best fit model, but this time we're saying cache the best fit model as well as the time at which it was computed or the time at which the file was updated. The next time it's rerun, we check whether we get the model for that particular currency. It may or may not exist. If it doesn't exist, then assume that it was computed really long time ago. Get the first value, which is the file time and compare it with the new file time. How exactly does that work? This is in forecastchange.py. So the first time it runs, it does the same thing as before. It goes through every file because it hasn't yet created the cache. Now, the second time that it runs, we've cached at least a few of the values. So Australian dollar, Brazilian, whatever, and so on. The first three, it had absolutely no problem and went on to make changes. Supposing I got a new version of the BRL data. A little worrying, so Brazilian currency. What's the name? Real. Okay. The Brazilian real. So let's say we have the Brazilian real data and we have a new update. Let's say we have data as of the 30th of September, 2020. That one USD is 5.65 BRL. Oh, if we run the forecast changed application, it's actually recalculating the BRL, but not the Canadian dollar or the Swiss franc and so on. That's because the file timestamp has changed. So this is another way we can make it seem faster by just avoiding calculations that we don't need to do and recognizing that applications aren't really meant to run once. They are meant to be run multiple times. But secondly, and I think this is perhaps a more important one, there's no way I would have known this to be a scenario. Meaning I had no way of anticipating that we may get new and better currency data midway, unless in this particular case, that's what Gopi told me. He said, look, we get currency updates midday. There are corrections that happen in the market and there are human errors, there are data errors. So in the morning, the file that you get may be accurate 80% of the time. But the remaining 20% of the time we want to make this update. And that only comes through feedback from people who know the domain. So one of the really effective ways of figuring out how to make your application seem faster, more robust, more responsive is to ask people what scenarios they anticipate, what problems they face, nothing like feedback, which brings us to the third part, which is pre-computing. What we're doing here is when we are running it the first time, we are just doing the calculation at one shot and storing it. Is there a way of improving it? Again, this is one of those cases where feedback was important because when I spoke to Gopi about it, he said, look, Anand, you're ultimately using auto regression and you're trying to figure out what is the best lag for it, fair. But why do you need to recalculate what the best lag is every day? So for example, if you find that for the Canadian dollar, a two-week lag has the best prediction. That's not going to change tomorrow. It's not likely to change in the next week, two weeks, next month. The periodicity is something that generally stays stable. So this inner loop is really just doing that re-computation. Why don't you avoid that? So let's see how a program like that would work. I'm going to show you the output first and then explain how the code works. So the first time, what it's doing is going through all of the lags and trying to figure out which one is the best lag. By now, it's figured it out for at least three currencies. The next time I run it, it only runs lag five for the Australian dollar. 365 day lag for the Brazilian real and the 10 day lag for the Canadian dollar because it's already figured out that this is the best lag and we store that and there's no reason to rerun that. So now let's do the next round of computation. Since we have stored these as the most efficient lags for all of these, it just does one run. This is one of those cases where we are effectively doing the equivalent of partially training a model and doing the equivalent of temporal transfer learning. That is the learning that was valid yesterday is still valid today and will be valid until we retrain it with new data. So pre-compute things where it doesn't really change that much and the way to do that is to split the code into parts. Some parts that change often, some parts that don't change often as long as you know the difference, they're good. Which brings us to the fourth or, well, in our order, the first thing that we were looking at to make the app feel faster. Remember, I mentioned that these are currently being computed in alphabetical order and there's no reason why it should be. What I really need to do is figure out which is the most important variable and that would be the Chinese Yuan because that's where they're buying the most followed by the Mexican. This is one of those cases where I should have done some pre-computation. It's a Mexican peso. So the Mexican peso is clearly the second largest and I guess the Canadian dollar is the third largest and so on. So what if we just sorted these and put them in descending order and did that computation upfront? Of course, if you're printing the result only at the end, then there is no point because people anyway have to wait all the way to the end. But what if we could show the progress and allow them to see what the result is as the application progresses? So last month's cost was $11 million. Now we're forecasting an increase of about $7,000. Now the application's number fluctuates, but after a point it stabilizes and Gopi would say, okay, look, see by the time you got to 75%, that's good. So I don't really have to wait much longer. It's more or less stabilized. And that gives us the ability to cut it short early. Just focus on the most important bits because things like the Danish Kroner, if I'm only spending $1,000 there and who cares about that? So that's what the app that I'm going to show you now does. When I click on start forecasting, it's pulling the data from the backend and showing the progress is also a little panda that I'll talk to you about that gets happy when it gets close to full completion. And as it does it, it shows what is the change in cost that is anticipated and it stabilizes after a certain point in time. All this does is takes the data from the web socket. Let me explain how this works. We sort in this ending order and then as before we loop through all of the purchases. We compute the models, we predict what's the best result and we take the forecast for the current currency. Put in a few additional parameters such as what is the progress in percentage, what is the total value that we need to show? What is the total forecast that we need to show and send it all on a web socket? On the client side, we receive the data from the web socket and we write a little bit of code that says there is a DOM element called total value. Just put in the total value there formatting it. There's something called total forecast put it in. All of these are just coming from the JSON parsed data that we are sending from the server, which is what creates this application. Of course, the Pandas, they are mostly just for cuteness, but it's also a powerful way of seeing of indicating emotion through data. There's a library called comic gen that you can use just to do a search for comic gen and you'll find it, which has a series of characters. Some of these characters are, all of these characters are programmatically createable. So the character I used is Panda where you can copy paste this code and this character gets created. And one of the parameters is the face, which continuously goes from the Panda saying, oh, oh, to the Panda smiling. And that's all based on one parameter here, which is face is equal to. So what I did in this code here was for the comic gen character, I set the face attribute to one minus the data progress. One minus because face is equal to zero makes the Panda smile. That's face is equal to zero. And one means it's unhappy. So I had to swap it around. So the net result is that we have an application that seems fast, even though in reality behind the scenes, it's taking something like 30 seconds or 40 seconds and we also are able to stop short midway. So remember that one of the best ways of speeding up an application is optimization, but that is not enough. You've also got to make the application seem like it's optimized. And to do that, prioritize by showing the most important things first. Update the users by showing them progress. Recover from errors so that they can continue from where they left off and pre-compute so that you can calculate anything that can be pre-calculated upfront. Remember purple, that's an acronym that you can use to keep all of these items in mind. With that, I'm pretty much done with the bulk of this talk. And for you to get access to the code, you can go to github.com. Slash is on and zero. And under that, my repository for all of the files that I just showed you as well as the data is under icon India 2020. Before I go to questions, though, I did have a question actually for you. And while you ask your questions, actually I'm not entirely sure what the mechanism for questions is. So I'll let somebody in the organizers help me with that. But while the questions are coming in, I'd like you to fill in a short survey. I'm curious which of these resonated with you? Which of these four will you be using in your next application? If you had to pick one, would you pick prioritizing or updating the users to show progress, recovery, recomputing? And I'm also curious why you'd pick that. So you can go to bit.ly slash icon survey. And you'll see a survey that's bit.ly slash icon survey. And do fill in this form. I'm very curious to see what the results are. I actually will also be looking at the results live. See what exactly are people preferring. And it will be good for all of us to know whether one of these techniques resonates more with the audience compared to the others. So the link is bit.ly slash icon survey. I'm also conducting a workshop later in October. It's an open and free workshop. Anyone can join at any point. If you want to be informed of this, let me know. In this workshop, we'll be going through the same set of techniques in some more detail, but to actually help build an application that seems faster so that you can practice some of the principles that will make an application more responsive. So with that, I will open the floor to questions. Oh, I'm not sure we take questions for keynote. Oh, got it. Okay, fair enough. Well, in that case, we'll just give people a minute or two to see if the results are starting to come in. Interesting. What we see is that by far people would prefer to show progress. That's like 2x, 3x. I guess that's a principle that we are literally seeing as the screen progresses because we are seeing the progress live. Almost 50 odd people are saying they would want to show the progress. What's interesting is that the second most is recovery from errors. And that's arguably perhaps not too surprising. People I'm sure when debugging are seeing that they would want to recover from errors. But what definitely surprises me is pre-computing is coming up close to the last or actually the last. Because one of the most effective ways I've seen in the past is recalculation. It looks like an application is doing work, but in reality it's not really doing that much. It's already got the results and it's just doing the minor tweaks related to that. Prioritization is at the moment at number two. Overall, updating users, that definitely seems to continue maintaining the lead with recovery as the clear number two on this. Incidentally, if you are wondering what technology is used for this survey, you can see that it's as low-tech as it gets. All it takes is Google Forms that saves the result into a Google Sheet. And as these results come in, this chart just picks up the data and puts it in. Incidentally, I set the chart so that it stops at around 500 rows. So by the time we get to 500, we'll probably end up not updating the chart. It's good to know what people feel. Well, I am really looking forward to see how and looking forward to your users seeing how the progress of your applications can get bigger. If you have any inputs, comments, whatever, you are more than welcome to reach out to me on Twitter. I'm at sanandzero. If you have any suggestions for this talk, which I'm hoping to repeat in a few other places, please submit that as an issue or a pull request on github.com. One of the best ways to contribute back and to practice is by trying it out and learning. And I do hope you'll get an opportunity to do that. With that note, wish you all the best in making applications seem faster without optimizing. Thank you.


Trini girl natural hi everyone welcome to my channel can I do a video in pigtails yes I can I'm about to because I keep forgetting to do this video when I'm having a better year week and not doing it but I'm having a bad year week and winter is gone I'm moving further and further away so before it becomes too irrelevant I'm like let me just do this video that's my winter stash flashback aka quick review of all the new products that I use this winter so my winter stash flash is usually kind of short because I spend half of my winter not in winter as you guys know Fettin basically into that but this is just talking about the products that I use while I was actually cold this year winter 2017 2018 so let's start off with tgim I use the green tea super moist and I do have a video with a full review on but just that you know that I loved it my hair was moisturized my hair was defined it was extra creamy and stuff which is great for winter extra hydrating my hair stays soft love love love and I am gonna do some showdown videos I'm gonna show down this one with the next one I talk about which is the color region because both of them are kind of similar and I want to figure out which leave is my favorite before Black Friday so I don't have like 10 that I love I need to work it down to which ones I love the most so one of my showdowns are these two the other showdown that I have planned is the well anyway the other showdown that I have planned is the Jane Carter untangling me versus the sultanicals frizz with those are another two that are really similar I want to see which one I like best and let me know if you want to see any other side-by-sides but yeah two thumbs up so next we have the color region maracuja rich moisture milk I also have a review on this post did everything I just said for that but this has protein as well so if you need a little protein fix and you want moisture and softness and definition and slip on a great scent and everything definitely give this a try so I also love love love this two thumbs up yay color region is a new line I'm gonna be purchasing every year for sure so it's officially permanently on my list so yay for that the other product from color region that I tried and I love was the maracuja deep conditioner so like I mentioned the whole line has protein but you wouldn't even be able to tell from how moisturized your hair is so my hair was again super moisturized lots of slips and I do also have a video on that one so check out this as well this is the definitely purchase for me as well I still have to try the overnight mask which I will be trying soon but Black Friday color region you and me we'll see each other because getting this getting the hair milk I think I'm gonna do that showdown and getting the thing we're about to talk about now which is the protein treatment so I love love love the color region maracuja and quinoa damaged control reparative conditioner I have to do a video on that I haven't posted the video but when I tell you wow moisture for days slip for days and protein did the thing my hair went from my this to this and I know you're here shrinkage but I love my hair to be tight and right I'm on a protein treatment can just show me how it's doing something I love it that's my new favorite is she natural protein treatment I know my old love is the ochre constructed from she sent it and I still love that but this one has even more of a protein kick while still being super moisturizing and super hydrating so I love that definitely going to repurchase Black Friday getting at least two I'm loving coloration so far next on the list is Uncle Funky's daughter clearly magic so it's not new to me I have tried it before I just haven't used it in a long time before that video I haven't used it in a long time but I do like it the pros it's moisturizing great slip great definition just does the thing it just does the thing it's a great gel my only con would be that it seems like it just a little bit heavy like in the sense that it can leave build up which I don't get from any of the other gels that I use so that's my only con but no crunch moisturizing lots of slip great definition great hold everything good check out my full review if you want more information but if you're just looking for a quick what to try what not to try then check out my stash brushes so this was a yes as well and then special mention to this trader Joe's tea tree tangle you saw me use it for my trim video and I just use this alone but I think I use a jane kind of leaving and then this um for my twist and you would never know I just use those two my twist will moisturize for like the whole week my hair just felt super soft and moisturized and this gave me great definition so I do want to try this for wash and go this summer like just a conditionally wash and go this summer so I'm late to the party but I finally finally tried this after having it sitting in my stash for probably two years I know I know I know but it's definitely a winner and I do love it and last but not least is a laugh beer shea butter kill activating cream so I try this when I first went natural and that's when I used to do wash and goes on not soaking my hair I used these two and my hair was just dry flaky it was just one of them else but I think it was pretty much user error so recently I've been using this just to kind of beat up my pigtails when I go to the gym and as moisture and tame stress and gives you a little bit of hold and stuff so I do like this I'm not saying I'm going to repurchase it just because I have so many creams so I probably use one of those when this is done but I'm just saying it has been doing a great service for me for days when you just need a little touch up on your existing style just to slap it on and look neat again it's been doing the thing for that plus I think the things with shea butter tend to work better for me as a kind of daily cream like over moisturized hair than to moisturize my hair from the beginning you know what I mean like I need a barrier between the shea butter and my hair like some even or something it does have the agave nectar I see you agave nectar I see you raspberry extract this is found in Whole Foods by the way and they have changed the labeling because again I've had this for a while but I will say that I like it now so that's a short and sweet I actually finally got this out and got this to you because spring is here and I need to start thinking about my spring stash so I need to just get this one done in the book so thank you for allowing me to do that thank you for allowing me to share this with you let me know in the comments if you enjoyed if you like any of these products and just if you like this flash flash type videos because it does take time and effort to do them so if you guys don't even like them then I should probably not even do them but I kind of like them just to have a recap and just to give you guys a quick once over on some of the products instead of the detailed reviews that I usually do and I'm doing more of a few you can just get a quick run through so I like them for that let me know if you like them for that too and I'll see you in the next one bye


Usually, people in theater have a lot of life and you give them that latitude to do, you know, to express themselves. And the more they're together, it helps on stage, because actors feed on actors.


I, Em également foreigner working in computer science and engineering department as an assistant professor in Walter Institute of technologypeople Today we are going to discuss the topic tools and technology used for collaboration and social business Learning outcomes are at the end of this session, students will be able to describe the importance of collaboration and social business describe tools and technology used for collaboration and social business Collaboration is working with others to achieve shared and కాగలిన్లిలె. Marketing is key main action. Be否 a company.cedes Pre各位 tea ventiล decentralizedğl pani perreచిరానింత౤ారుం నిబలియిక్డమనంతి , kullabration can be short lived lasting a few minutes, long term depending on the nature of the task and the relationship among the participation. colleague can be done 1-to-1 or many two times teams have a specific mission that someone in the business assigned to them. team members need to collaborate on the accomplishments of specific task and collectively achieve team missions.  Beverages and teamworkärke of collaboration with team and collaboration are most important today than ever for a variety reasons whoa  Frameworkwork  energia Work are organized in silos एक बोज़ेत कर में अड़ ठीवगादर, औरच्यर कर precautions work can be professional jobs in service sector that require close coordination and collaboration, professional jobs require substantial education, sharing of information and opinions to get work done. the global wide with this kind of global present the need for close coordination of design production marketing distribution and service. The next one is you face on innovation although we tend to attribute innovation in business and science to great individuals. These great individuals are most likely working with the team of brilliant colleagues. Strong collaborative practices and technologies are believed to increase the rate and quality of innovation. The next is changing culture of work and business. Most research and collaboration supports the notion of diverse team produce better outputs faster than individuals working on their own. The next one is social business. Social business means the use of social networking platforms including Facebook, Twitter and internal corporate social tools to for engage their employees, customer and suppliers. These tools enable worker to set up profiles, form groups and follow each other status updates. The goal of social business is to deepen interaction with the group inside and outside the firm to expedite and enhance information sharing innovation and decision making. Customer supplier employ managers and even oversight agencies continually have a conversations about the firms. Often without the knowledge of firm they would strengthen their bonds with the customer supplier and employees increasing their emotional involvement in the firm. Applications of social business, social networks. It connects through personal and business profiles. Crowd sourcing means harness collective knowledge to general new ideas and solutions, shared workspaces, coordinate projects and tasks, co-create content etc. Blocks and wikis means publish and rapidly access knowledge, discuss opinions and experiences. Social commerce means shares opinions about purchasing or purchase on social platforms. File sharing means upload, share and comment on photos, video, audio, text, documents. Social marketing means use of social media to interact with customers, derive customer insights. Communities discuss topics in open forum, share expertise. The next is tools and technology used for collaboration and social business. Email and instant messaging. These email and instant messaging including text messaging have been major communication and collaboration tools for interacting jobs. Their software operates on computers, cell phones and other wireless devices and include feature for sharing files as well as transmitting messages. Next is wikis. Wikis are type of website that make it easy for user to contribute and edit text content and graphics without any knowledge of web pay development or programming techniques. The most well-known wikis is Wikipedia, the largest collaboratively edited reference project in the world. Wikis are very useful for storing and sharing corporate knowledge and insights. The next one is virtual world. Companies like IBM, Cisco and Intel Corporation uses the online world for meeting, interviews, guest speaker, event and employee training. The next one is collaboration and social business platform. They are now suited for software products, providing multifunctional platform for collaboration and social business among teams of employees who work together from many different locations. The most widely used are internet-based audio conference and video conferencing system, cloud collaboration services such as Google's online tool and cyber lockers, corporate collaboration systems such as Microsoft SharePoint and Sky Group video conferencing. The next one is cloud collaboration. Google tools and cyber lockers. Google offers many offline tools and services and some are suitable for collaboration. They include Google Drive, Google Docs, Google Apps, Google Sites and Google Plus. Most are free and in charge. Google Drive is a file storage and synchronization service for cloud storage, file sharing and collaborative editing. The next one is Microsoft SharePoint. It is a browser-based collaboration and document management platform combined with a powerful search engine that is installed on corporate servers. SharePoint has a web-based interface and close interaction with everyday tools such as Microsoft Office, desktop, software products. IBM Notes. IBM Notes, formerly called Lotus Notes, is a collaborative software system with capabilities for sharing calendars, emails, messaging, collective writing and editing, shared databases, access and electronic meetings. The next one is enterprise social networking tools. They create business value by connecting the members of an organization through profiles, updates and notifications. Think and write. Now I am going to ask one question to all the students. The goal of Dash business is to deepen interaction with groups inside and outside the firm. Option A social, option B private, option C formal, option D none of these. Pause the video and write the answer. You have to choose any one option among the given options. The correct answer is social. The next one is enterprise social networking software capabilities. Profiles. Ability to set up member profile describing who individuals are, education background, interest, includes work related associations and expertise, for example skills, projects and teams. Content sharing. Share store and manage content including document presentation, image and video. Feeds and notification real time information streams, status updates and announcements from designated individual and groups. Groups and teams. Work spaces establish groups to share information, collaborate on documents and work on projects with the ability to set up private and public groups to achieve conversations to preserve team knowledge. Tagging and social bookmarking. Tagging latest people and keywords to identify content they like. For example, Facebook's like button. Permission and privacy. Ability to make sure private information stays within the right circles as determined by the nature of relationship. In enterprise social network there is need to establish who in the company has permission to see the what information. These are the references. Thank you.


So, sticking on the coattails of talking about Gutenberg here, my name is Andrew Taylor, and I'm going to talk about tips for block development. So as you're starting to wrap your head around this stuff, what can really help you to learn. I'm A. Taylor M.E. on GitHub and Twitter, so I tweeted out a slide link. There's resources and stuff at the end, the quickest way to follow along, but these are lightning talks, so let's dive in and check it out, right? So, first of all, why learn block development? Just kind of talked about this, it's all about the user experience. And there's things you can do within WordPress, but it's always been extendable. So you can do a lot with WordPress Core, but there are things like custom post types that you can write your own and extend it and do all sorts of things that WordPress Core doesn't do, that's why we have plugins at all. And so when I think about custom blocks, to me it's like creating your plugin for Gutenberg, right? You're creating your custom thing that you're going to add on to whatever is there because they can't fit everything to cover every use case in core, so you're going to have to kind of create your own stuff. It's really about putting that user experience first. So, short codes was great talk leading into this because, let's speak of short code, a ton of those parameters. This is actually showing an example of a data visualization block. And if you look, imagine a short code that you're putting in all these like, oh, I have this many slices of the pie and there are these percentages and you kind of just typing in that text, you don't really get a sense of what that's going to be like until you click publish and go look at the front. This is a completely different experience and you can bring this level of great user experience to your client. So that's really kind of why we're doing this and why you would want to learn it. But, I've been kind of heads down in Gutenberg since about March and it's gone through a lot of changes and stuff. I work at Pantheon and so I know this is going to affect a lot of our agency partners and kind of trying to get ahead of it. And so, if I could go back in time before I started learning all this custom block development and give myself advice in direction, I would. But since I can't do that, I'm here to share it with you all. So, the first thing is starting with PHP. I do write in and I was like, oh, ES6 and React and all this cool stuff. Yeah, I'm going to go take a React course. Like WordPress is still a PHP CMS and there's a lot you can do with PHP. Yes, you will probably eventually write custom blocks, but you don't have to jump all the way there. There's a ton of things you can do to help your projects adopt Gutenberg without jumping straight to custom block development. So, you can add theme support for things. If you've seen a Gutenberg demo, you've probably seen the full width images. That does not come out of the box. Your theme actually has to add theme support and a little bit of CSS to make that work. But adding a few lines into our functions file to opt into that theme support in some CSS is something everyone can do without that giant learning curve. So, start with building this foundation and doing a little bit of Gutenberg adoption within your projects. You can apply block filters. So, if I look at the data visualizations block, maybe I have a finance blog or something and it makes sense on certain post types to have that. Or I have a theme that is for a recipe blog. If I create a block for ingredients, does it make sense to have that and another custom post type that's team members? Probably not, right? Team members don't have ingredients. Like, why even show that block? There's a filter for that. So, you can determine what blocks show up on what post types. And so, rather than have this big list and your users and your clients have to figure out what they should be using and shouldn't be using, you can make that more restrictive and kind of give them some guardrails. Along those same lines, there's post type templates. So, you can actually go in and rather than click create new post type. If we're talking about a recipe, you can already have a title, an image, ingredients, those blocks in there as placeholders. And you can even lock that down. So, maybe I'm doing a post type for team members. And I want an image and a bio and a job title. And that's it. You can actually lock those down so that no matter who goes in to create a team member, there's no wrong way to do it. They have to fill in these fields. They can't add a new image, block in, somebody goes in. Now the CEO's bio looks different than every other page, right? Or whatever. You can block in those couplets. So, determining what you make available to what post types and even using some of these filters, you can do that by user-roller. All kinds of different parameters is kind of put those guardrails in place. And the next thing, once you get past that, and you're gonna start actually doing block development, create a plugin. We're still working with PHP here.  You might say, it'd be cool if I could add some blocks. Do that in a plugin, still have that separation of concerns. Just like if you register a custom post type, that should be in a plugin. So, as somebody switches themes, they don't lose all of those post types. Or you don't lose all of those blocks. The theme should just handle the presentation in the styling. But actually determining what blocks are available should be done in plugins. And I prefer to register my blocks in PHP as well. That's just personal preference, you can register them in JavaScript. But if you're already creating a plugin file and you're doing everything else, just register your block there. And then have the JavaScript files focus on actually handling the editor experience. And that really plays into dynamic blocks. So you can have blocks that will go in and what's output, what's rendered on the page can get saved in the database in static blocks. And that's great for paragraphs and images and things that are pretty simple. But as you start building custom blocks, even adding a little bit of complexity saying that, hey, when this post is in an RSS feed or on mobile, the content should be a little bit different. You can't do that if you have something statically saved to the database. That needs to be done dynamically. So for me, whenever I create a block, I'm creating a new plugin, and queuing my assets, registering the block in PHP, and then I'm doing the render callback in PHP. Even if it's a simple thing I'm doing, that way I have control. And if I go make changes later, then you don't have to go resave the post to get those changes. And so that's kind of a lot of work, right? Create a plugin and then queue strips and register blocks and whatever. Don't start from scratch. A lot of people in the community have been working on this. WPCLI will allow you to scaffold a block plugin. There's Create Goon Block, which is really cool if you want to use more modern ES6 kind of react stuff that will set up Webpack and all that for you. So you don't have to go figure out how to do that. You can just spin up the project and start learning and start hacking. So that's a lot with just PHP.   JavaScript has been evolving for a while. ES6 is something you might have heard. It actually stands for ECMAScript. And that version of ECMAScript came out in 2015. And it was the first big change we really had since 2009, 2011. Kind of like there were some tweets in there. But there's been a new version every year since then. So JavaScript has really been evolving, like this big change in 2015. And that has really been more changes every single year. And so with WordPress, we've traditionally done things with JQuery where you're like manipulating the DOM directly in this. So this is a lot of new syntax and just new ways of thinking. So it's like if you're going from functional PHP to object-oriented. It's kind of this big leap and you kind of have to take that leap with JavaScript as well. So you're gonna have to learn to react in JSX. If you're gonna write custom blocks that have more advanced functionality. Like the beginning I showed kind of a Google map was one that I've developed that data visualization, those sorts of things. And it's gonna be really hard to do them with kind of the older JavaScript. You need to learn this more modern JavaScript. And part of that that was difficult for me to wrap my head around with this more modern JavaScript was using existing components. Components is a big deal and react. And it allows you to reuse things so you're not reinventing the wheel, right? We're keeping our code dry, don't repeat yourself. So if you find yourself hard coding a text input, when you're doing this custom block development in this modern JavaScript, you're doing it wrong. If you are actually hard coding a select box, there are components for select boxes and sliders and all that interface you wanna build, the pieces are there. You just need to put them together. The other thing that goes along with that is you need to change the state, not the DOMs. We're not manipulating the DOM directly anymore. State is this concept in react. Goodberg implements it as attributes. So I developed a map block, it had a location. And so I have this attribute for location and you define different states. So if the location is empty, my state is going to be an error message that says location is required. If the location has an invalid address, it will be a different error message. If it's a valid address, then my state is actually going to render the map. So you're just defining these different scenarios, but you don't actually update the DOM. So as the user is typing and location is changing, then React and Goodberg just go in and they say, locations empty. I know that it should be this, that I'm showing. And it actually handles that updating and showing the hiding messages and doing everything else. So you just define the state and kind of how you're supposed to react to it. And it takes care of actually doing all the updating. And it really helped me to review the source code of Goodberg itself. So going in and looking at how the core blocks are built was really, really useful to see, wait, am I doing things properly? Maybe there's a component I wasn't aware of that's not quite documented yet, going in and just seeing what they're doing. And then reading the handbook. So if you go to wordpress.org slash Goodberg slash handbook, there is a ton of knowledge. There's really thorough documentation on a lot of these components. And here's one that, again, you might be tempted to just hard code an SVG. There's an SVG component, but it helps make it accessible, rather than just dropping in your own SVG. So making sure you're using these components, they're well documented. Go read the documentation. There's tutorials on how to get started, creating your first block, and how to register it, and how to enqueue your CSS and JavaScript, and what all of that looks like. And this was one of my favorite parts. Their code samples had traditional JavaScript and the more modern JavaScript. And you could look at that side by side. So as I was learning this more modern JavaScript, going in and seeing what it would be like if I wrote it kind of the old way, and then what it's like, and just seeing those side by side really helped me with understanding the more modern stuff. And then the goals and philosophies. This is really important because I wish I'd read this before I even wrote a line of code, because it talks about really what's the driving force and the principles and the goals behind Gutenberg, but the design philosophies lay out like, hey, if you're doing my location, I originally had it in the advanced sidebar on the right. The user is never going to find it there. So I had to learn that this needs to be in line, like in the block. Well, should I put everything in line in the block and create my own toolbar and go crazy? But reading the design principles, I know what should go there, what should go on the sidebar. And as you're deciding how you're going to structure your block and actually design that user experience, again, you wanted to be seamless with core. So you don't want to have your block be drastically different. I know we've all seen those plugins or themes where you go to every WordPress settings page and they all are consistent. And then you go to that one, and it's completely different. Well, that is what it is. Users can get used to that, but when I go to the certain plugin, it's going to look different. But your block is going to be in the middle of the editor next to every other block. And it's going to stick out like a sore thumb. If you're doing things differently, then the way core is doing it and the way other blocks are doing it. So really understanding the principles behind how they're making decisions and why they decided that this type of input should go here. And if you're doing these things, it should go over here. And really thoroughly understanding that before you actually write code is going to help you make the proper decisions the first time. I had to go back and re-factor a bunch just because I didn't do it right the first time. And if I'd read this, I could have made those decisions properly. And then finally, be prepared for change. So we're in a beta now, but Gutenberg has had to release roughly every two weeks. And that's not going to stop after WordPress by the way it all comes out. There will be another version of WordPress. There will be more iterations on the editor. So if you're developing a custom block, don't just do this, give it to your clients, and then never touch it again. Have a maintenance plan. And know that you should be downloading those betas of Gutenberg. You should be testing your blocks before the new version comes out to make sure that they stay compatible. So this isn't like, I'm going to build something one time. You really have to be prepared to keep up with it as well. So have some resource links. Again, I tweeted out the slides. A-TaylorME on GitHub and Twitter. So please check them out. And you know how fun the links blocks. This one will be for Andrew to just spoke. This was mentioned this morning in the A11Y talk. There was a recent article talking about the failures of Gutenberg, really accessibility in A11. A11Y, and I was wondering if you could, if you know about that or if you can speak to it. You know, I'm not on the Gutenberg team or anything, obviously. I'm just developing blocks for myself and projects that I'm working on. And I haven't developed blocks for a project that has heavy accessibility requirements yet. And if such a project came up, that would be a challenge. I'd have to tackle it that fun, but I really haven't done that deep into it. If someone doesn't know any job strength that I have up close to a page beta developer, where would you start? Because you have all this old information, I have all this new information, how do you do it? I don't know. It's hard to point at Andrew's first few slides where he's talking about things you can do to work with Google where you're not actually building a block, where you're just making your sites more accessible to Gutenberg. And then also, as mentioned, you can actually register your blocks and do things with them in PHP and then slowly work up to the JavaScript part. Yeah, and with the JavaScript part, there are fundamentals you'll need to learn that ES6 wasn't that big of a chain. So figuring out how objects and arrays work in the more modern JavaScript, there's some nice array functions like map is a new one that wasn't there before. And so, but just learning the basics of arrays, you'll have to wrap your head around first and then decide if you want all of that syntactic sugar and some of the new stuff on top of it in the transpilers. Westpask has a course that's like JavaScript, like 30 for 30 or something. It's like each day you build a new app with just vanilla JavaScript. So kind of maybe build that foundation and then go look at, Mozilla has a great listing of everything that's new in ES6 and kind of shows you all the functions and walks through it. So maybe start with vanilla and then go look at the new stuff and go, oh, I wish I had that, right? So a question for Andrew, you talked about maintainability. And I was wondering if you noticed a difference between your previous workflow and your current with building blocks in terms of increased or decreased or same across the board, time investment? So time investment, like initially when building blocks, it's when you're learning something new and there's that steep learning curve, your time investment is more, right? And the more experience you have, you can kind of turn that down. I think it also depends on the complexity of the blocks and the requirements, right? So if you're building a simple block, then it's not gonna be as much to build initially and maintain, but if you have something more complex and maybe like users at different roles should have different experiences within the editor and somebody can add stuff in, but then another user will have to like, if it starts getting really complex, the more you put into it, the more time you're gonna have to spend on maintenance. And so that's just kind of the projects in general that are going to help you build blocks or anything different.