All right, just that's everyone hear me all right. How's everyone doing this morning? No good? All right, we're gonna go ahead and get started. I am James Snell. I am head of research at Neoform. Also a Node Core contributor. I've worked on quite a bit of things within Node. Right now, the thing I'm working on is the quick implementation that Trevecom was talking about yesterday. But at Neoform, one of the things that we do is, we have a lot of customers that come to us and ask us, hey, our stuff is slow. Come help us figure out why our code is slow. And over the past couple of years, we've come to ask one very specific question when a customer comes to us and says, hey, our stuff is slow. The first question is, are you using promises? All right, and if they'd say yes, our response right away is, you're using them wrong. Well, you haven't even looked at our code yet. We don't have to. You're using them wrong, right? So what we have found in the overwhelming majority of cases when anybody is using promises, they are, in some way, at some level, using them incorrectly. So that is the inspiration of this talk is basically all the ways that we have seen customers using promises incorrectly and kind of breaking down why it's incorrect, kind of how to avoid those issues.  I decided to do a 30-second benchmark on one path of their code, right? So we're basically just sending the same request over and over and over again against their server, executing a single branch, a single path. Within that 30-second benchmark, they were allocating 30,000 promises. Okay, I'll explain why in just a little bit. But there are a few other examples like that that I will share with you, all right? So promises are powerful. Yes, they're in the language. You really have to understand how they function and what their purpose is, right? When to use them and especially when not to use them, right? Everything that I'm gonna show you is based on what we have seen actual customers do in production code, right? So some of the examples, I've simplified the examples, I'm not gonna say what customers and what companies are doing what, right? So I've completely anonymized it. Some of the examples may look a bit contrived, but they are based on stuff we've actually seen in the real world. But first, I wanna do a puzzle. I've done this a few times. This code prints a message, it's a secret message, right? Without running the code, try to figure out what the message is. You could, you know, without trying to copy down here, you can scan the QR code. I'll also post this on my Twitter feed after this. But, you know, the task is try to figure out what the message is without running it, all right? What this code is doing is using all the various ways you can schedule asynchronous activity in Node. So we have next ticks, we have immediate, we have some promises in there, qmicrotask, right? So this will print a message out. If you figure it out, again, without running the code, let me know, all right? So I'll give you a moment to scan the QR code there. The reason I like to start with this particular example is because it emphasizes the fact that you really need to understand when code is being executed within Node, or within JavaScript in general, all right? So we all know Node is a JavaScript platform, right? Is JavaScript running all of the time in Node, right? No, all right? So let me show you a quick example of this. So if I do a set interval, right? I'm gonna set it for about a second. Actually, let me change this a little bit. We're gonna set it to run every 500 milliseconds and we're gonna have this thing do a for loop and then do a console log. Very, very simple application. So I'm gonna run this. I'm gonna turn on trace events and we're gonna turn V8 and async hooks. This is basically gives some insight into what is happening under the covers on this.  So it's just gonna iterate through five times. That's gonna end up creating this file, this Node trace dot one file. Let's pop back over. Chrome tracing is, it's a utility built into Chrome browser allows you to view trace event log generated by Node or by the browser. So let's load this thing up. This file that we just created, this Node underscore trace, might be a little bit hard to read there from the back, but these pink boxes right here are the times when Node and V8 are actually executing JavaScript. The blank spaces between are times when Node JavaScript is being run. That is times when the Node event loop is doing other things. In this case, it's waiting for that timer to fire. So within that time, the event loop is actually spinning. But while the pink boxes are executing, the event loop is not spinning. The event loop is completely blocked. Now, when we say schedule asynchronous activity, what we're talking about is in one of the pink boxes, triggering some action that is not gonna complete until another pink box starts. On this. So basically, like we wanna do a file read, right? File reads in Node happen in a thread pool. So we trigger the file read. It's gonna go off and read the file in a separate thread when that file, the data is available after the event loop turns, right? It'll see, okay, that data is available now. Then it'll start executing JavaScript again, all right? With a promise, you never ever want to create a promise that resolves within the same execution block that it was created, if you're gonna avoid it, all right? When I say you can avoid it, if you're using like promise.resolve, right? That is explicitly a synchronous promise, right? With promises that you don't ever use them where they resolve in the same block. You wanna use it when we need to create it. You're scheduling some asynchronous activity. It's happening off the main event loop. And then it's gonna come back and execute later on, right? That's key, that's number one. And I'll get into a little bit about why that is a little bit later. Okay, so people do weird things with async functions and promises. They pass them to functions that don't expect them. So creating an immediate timer with an async function or setting a recurring timer with an async function. What happens in this case if this throws? What happens to that error? Yeah, I'm gonna get a support email. That's basically what you do. What ends up happening in this case is this error catchable in any way?  You can't bubble it out anywhere, right? So with this case, what you end up with is an unhandled rejection. You can't actually catch any errors thrown within that async function outside of that function, right? We see this in all kinds of places. So if we take a look at event emitter, people love passing async functions to handle events. Now, just recently within NodeCore, I'll show an example of this later, we just had a new feature landed called capture rejections that makes event emitter aware of promises. But most cases, if you're talking about event emitter, if you're talking about callback functions, these things are not expecting promises. They are not expecting async functions, and they do not know how to handle them correctly. And what you're gonna end up with are cases where you are either, at the best case, you have an unhandled rejection. At the worst case, you have memory leaks, resource leaks. In this case, we would be leaking a file descriptor, all right, that would never end up getting closed if there's an error somewhere in here. You end up with async in its context, it's not propagated properly down through all of your callbacks or all your promises, right? You can end up with orphaned promise chains, they have, you have no way of handling, right? And all kinds of other kind of nastiness. And we actually get into debates with this, you know, Mateo Collina's gotten on Twitter and said, don't mix callbacks and promises together. And then we actually end up with debates on this, on this stuff's like, no, it's no problem. We can show specific examples here of memory leaks happening, right? I have one in here, let me look at this. Okay, so right here, we open a file, and it's just kind of the local file, we read it, we open the file descriptor, we have some error handling in there, right? Then let's call a function, happened to be something that, the reference is not resolved, right? In this case, that async function is gonna throw with an unhandled rejection and that FS close is never gonna fire. Now, a lot of times we'll have a promise or a process on unhandled rejection to do some logging, right? So maybe you'll see an unhandled rejection or an error in your logs, but the actual file descriptor itself never actually gets closed. We see this all of the time. Now it's possible to get around this, you use try catch in this function, you can use a finally in here to close it, but most of the time developers completely forget to do that, right? This is one of the most common issues that we see. All right, so this is, and these are things that are easily checked. The simple rule on this, don't pass an async function or promise to a callback that does not expect it, period. Just don't do it, all right? Now another weird one that we've been seeing lately that's just bizarre are people mixing new promise and async functions, right? The oddest one of this that I've seen recently was await new promise that was passed an async function. And then to resolve, it was resolve await something. I still don't quite know what they were trying to accomplish, right? It was not what they expected, all right? Let me ask you this. If I have a regular function like this, a new promise, and I throw in here, right? What's gonna happen? Is that gonna get caught or is it gonna be thrown immediately? It's immediately thrown. A lot of folks think anything that's any error that's within a promise is gonna get caught by the catch handler. It is not, right? It is only caught if it happens in a dot then or dot catch, right? In one of the chain. The function that is passed to the promise itself that will throw immediately. When is this function executed? Immediately, right? There is a common misconception particularly among developers that are coming from Java and .NET environments that new promise is equivalent to new thread, right? There is, you know, it's a very common misconception. I had to sit down and prove it for I think it was about 45 minutes. Go through a proof for customer that we were at with the velprincy. They were absolutely convinced that new promise was running in parallel, right? Just kind of magical new threads. There's a huge amount of misconception out there about how this works, right? So this error is gonna get thrown immediately. What happens if I do this? If we pass an async function and we throw that error. Again, where we're gonna end up with is an unhandled rejection, all right? Now, do you think the catch handler is gonna catch it? Let's just console log it, right? Console log the message, right? You think that's gonna handle it? There's a common belief that, yeah, if you pass a promise to this thing, you're worth it in promises, it will not catch it. You get an unhandled rejection. The catch handler cannot see this in any way, but we are seeing this more and more and more. I think we've seen this in, I think, three or four customer projects just over the past couple of months, right? And this is based on a belief that, hey, async functions are great, let's use them everywhere. No, just no at all, all right? So we have that one. Very important, you have to be very careful about where promises are actually being used. They are a very specific tool. They're used only for scheduling asynchronous activity and waiting for the results of that activity, right? But as we'll see as we go along, there's lots of other ways that people are abusing these things, all right? So let's move forward here. All right, so if we're not going to be passing an async function to a callback, if we are not supposed to be mixing these things, how do we actually get by it, all right? The answer is if you're going to be using promises, go all in on promises. If you're going to be using callbacks, just do everything callbacks, right? If you're going to be mixing them, it actually gets very complicated. I'll show you an example of kind of doing it right, and I'll show you how complicated it gets. This, in this case, we're using promises throughout the entire thing. So we're using the promised-fied version of the FS module, right, so we have a promised-fied version of Open that we can await. What this version of Open gives you is a file-handle object that will automatically close if you forget to do it. Now, it'll give you a warning, but it will go ahead and clean up after itself if you forget to do it, to avoid that memory leak, but it'll be noisy when it does it. It'll say, hey, you should be explicitly closing this thing, do that next time, all right? So this is a much safer way of doing this. Error handling is consistent throughout, and we're properly propagating errors in context here, all right? So just as a general rule, do not mix callbacks and promises. Do one or the other, all right? Now, it is possible, like I said, to combine them, but it becomes much more complicated, all right? So in this particular case, I'm creating the promise, I have to resolve reject, I have two callbacks, two nested callbacks that are happening, right? I'm having to propagate the reject through those different levels. So this is, if you've heard of callback hell, this is callback end promise hell, and it just gets even nastier, right? And the problem, the reason this is nasty is that promises and callbacks operate on two completely different abstraction models, right? Yes, both involve scheduling async activity, but how they are resolved, and the execution model are entirely different and incompatible with one another. So you have to kind of munch them together in order to get them to work. Now, utilities like utill.promisify, which will take a callback function and wrap it, it does quite a bit of work under the covers to make sure this is done correctly, right? So make use of utill.promisify. I have a few examples of that in here. This, like you can do, you want a promisified version of set timeout, and you can do, let's say sleep equals utill.promisify set timeout, right? And then from there, sleep actually becomes promisified, right, you can do whatever, right? And that actually, it won't block the event loop, it's just a timer that's happening under the covers, but it's been wrapped in a way that does proper propagation of errors, all right? Event emitter. This was mentioned in Joe Sepe's talk earlier. If you wanna create an event emitter that understands proper error handling with async functions, you can do, let's see, if you pass in the capture rejections. Now, this isn't in a node release yet. So it's not gonna work with the version of node I'm using here, because I'm using a release version. So this will error, it won't work properly if I run the example, but what this will do is it can pass an async function in, if it errors, it will cause a error event to be emitted properly, right? It won't be hidden by the promise chain, okay?  So it's very difficult to do this consistently, and we have seen this time and time and time again. We're especially with people not handling errors correctly that it just falls down, okay? So, all right, so let's move on. Let's see, here's the event emitter. All right, so in order to do it correctly without Matteo's fix, by the way, if you're on a version of Node that's not, that doesn't have to capture rejections yet, you can do it, but what you have to do is, within a try-catch and you're erasing function, you catch the error, and then you have to make sure you emit that in a process next tick. The reason we have to do that in a process next tick is because emit is a synchronous function. When it is operating, when you call it in this context from an within an async function, its error handling is bound to that promise, right? So if you throw, it's just gonna be part of the same caught throw, right? And you'll end up with an unhandled rejection. So next tick allows you to escape that, right? Allows you to escape the promise, right? So if you're within that and you absolutely want to get out of the promise error handling, you can always use next tick to do so. It's ugly, it's nasty, but it works, all right? Okay, let's move on a little bit more here. So the other, this one's fun. How many of you have seen long then chains in your code? All right? Dot then, dot then, dot then, dot then. The worst one of these that I've seen was about 15 or 16 of these chained. It's in a module that's actually pretty popularly used. We recommend now if we see it, just don't. Just don't, don't use it. And what we typically find when people have these long dot then chains is that they're being used or basically make the code readable, right? And they're typically end up being used for flow control of synchronous code. So in this particular case, we see, and this one's pretty contrived, but it's, you know, again, see this all the time. Yeah, we have two upper, two lower, reverse. We're basically just isolating functionality into individual functions, and then we're gonna chain them together, you know, with dot then. This is absolutely pointless. All of this code is resolved synchronously, right? It's all gonna be executed synchronously. It's all gonna be blocking the event loop in one turn, right? These promises are gonna get resolved in the micro task queue. That's the part of all this that executes the dot then and dot catch handlers will actually be executed synchronously immediately following the resolution of these promises. There is no asynchronous activity happening here at all. All you're doing is taking a block of code that executes right now in the event loop and moving it, okay, right here in the event loop, but with a whole bunch of promised allocations on top of it, right? Do not do this. Don't ever wrap, use a promise to wrap purely synchronous code. This is probably cardinal sin number one with promises, all right, but we see this all of the time and every single time it's because it makes it more readable, right?  We've seen this code like this, we've seen it take code down maybe 60, 70% performance wise just because they're doing this kind of stuff, all right? To make it even worse, people will do things like make these async functions which just causes even more promise allocations. When you await an async function, do you know how many promises are created? Just by, you know, if it's just an empty async function that does nothing else, if you await that function, it creates three promises every time, no matter what else it's doing, right? Every time you await an async function, all right? So you need to be aware of what you're actually allocating here and for what purpose you're actually allocating those for. All right? So for this, you know, it's simple. If you absolutely need that get dated of return of promise, right? Go ahead and resolve the promise synchronously, right? Use promise.resolve, that's what it's there for. That's the intent. Run your code synchronously and save yourself the trouble of all those additional promise allocations, all right? There's no other correct way of doing this, right? Do not wrap purely synchronous code in a promise. In a promise chain of .dense, the only place you should have purely synchronous code is in the final then handler. That is the only place, all right? All right, let's keep going.  Passing an async function to a functional loop, like for each or map or filter, all right? The example I told you at the beginning where the people were creating 30,000 promises, this is how they were doing it. They were parsing a one meg JSON file, iterating synchronously over every field in that file, creating a promise for every field, not just a promise, a promise chain for every field, and a majority of those promise chains were resolved synchronously. So JSON parsed the synchronous code, iterating through the synchronous loop, allocating thousands of promises in a synchronously, and then resolving them all synchronously. Now, let's see why this is a bad thing. Let me show you. So we're gonna go ahead and run node again with our trace events, and then this one is, so we're gonna let this run for a bit, and all this code is taking, setting a series of numbers and then inverting the values, right? We've got about a thousand of them in there. All right, so it's gonna create that trace event file again. So how many promises do you think were created during that operation? Let's see, no, let's see. Why didn't that go? All right, hold on a second, yeah, make sure my, all right, so how many were created during that loop? Why is this not coming up with all the information? I think I'm specifying something wrong here. Oh, yeah, no, it's no dotties and cooks. So how many promises do we think? We said five, actually there's about 8,000, and we can see that here. Every single one of these lines is a promise, several promises. So these are all being created in a synchronous loop, right, the iteration was a thousand iterations, right? So we have about 8,000 promises that were created over that synchronous iteration. Now how do we know it was all synchronous? Let's go all the way down here at the bottom, and we see this V8 execute block, right? So this is synchronous code. If we go back to the trace event log, every single one of those promises was allocated synchronously within the exact same block, right? Now in these particular promises, we do have a timer, right? So it is, they are scheduling asynchronous activity, but we're still allocating all those promises all at once. And there's code running in those, synchronous code running in each of those, that is causing this massive event loop block. So during this time, that event loop can't do anything else, right? We have one example of a customer. Their system was receiving a whopping four requests per second. What was it doing? They were parsing very complex GraphQL queries that on the back end, we're talking about 10 or 15 back end services, right? The way the GraphQL implementation in Apollo works, it's very promise heavy. It uses these long promise chains. It goes off and parses the query, walks the query, figures out an execution plan for the query, right? And then kind of goes through and executes the back end queries and then reassembles the data, right? Well, they were receiving a large number of timeout errors as they were running this thing. And that's actually why it was killing their throughput. What was happening is the back end services were receiving their queries and they were returning data back, right? Now the way that the event loop works, when there's data that's been returned, it sits in a queue until the event loop turns and it can say, hey, there's data available, I'm gonna go ahead and fire off the callbacks associated with those, right? But timeout timers fire first, okay? So the event loop was being blocked long enough, it was sending a request, the back end servers were returning the data, but by the time the event loop turned over, it's like, oh, it took too long. So even though the data is sitting there, the system would crash and they were only getting four requests per second through and their solution to that was to throw a thousand more servers at it, okay? That works, I guess. But whenever you're creating promises in a synchronous loop, just don't, or keep your iterations very, very small, right? There's an old rule, don't create a closure, right? Limit the number of allocations you're doing in a loop, same thing here. Every time you create a promise, right? You're allocating something on the heap, right? So we just created 8,000 objects on the heap, right? In a synchronous loop, it's just not something you wanna do. You have to be aware of what's happening when you're creating these promises. All right, so another interesting, this one just qualifies under, I don't have any idea what they're doing, or why, right? Return, await, new promise, async, resolve, resolve first, await. This was based on a real customer example we got like two weeks ago, right? Now what they're doing here is assembling an object over time, right? And these await are actually going off and doing database queries, right? And what they wanna do is if one of them dies, they don't wanna continue, right?  They do wanna do them one at a time. So they figured, let's spread it out this way. Where they came up with this, return, await, new promise, async? I have no idea. There should be a lint rule against this and it should just reach out and slap you every time you do it, right? So what's the correct way of doing this? There's a couple of ways. Let's take a look at one. Like, well, that's when we're doing it in parallel. All right, so if we really wanted to wait on it, right? And do these things the way that they said, we just do this, right? It's much more readable. It actually makes sense. You're not using strange syntax that should get you slapped and it just works. Now in this case, you're still waiting for 600 milliseconds for everything to complete, right? You're still waiting for one to finish first and if it fails, then you'll stop, right? If you wanted to do it, if you really did wanna do it in parallel, then you could use promise all and goes off and executes these things, all right? Quick comment on promise all and then I'm coming up to, you know, running out of time here. Promise all waits for everything to finish, right? Kinda, it'll short-circuit at the first rejection, right? What happens to the other promises? If one of those rejects, what happens to the other promises? They continue. A lot of folks don't know that, all right? Especially bad when they use promise race, right? Promise race is the first one, you know, the one that finishes first is the winner. What happens if the other one is taking a very long time to finish? It still goes and still blocks your event loop, right? So, using promise race actually doesn't actually buy you very much. There are use cases for it in the browser.  So, let me see, yeah, yeah, that's essentially it. I can go back here to the slides. We have some basic rules to follow. Know when your code is being executed, right? Use trace events. If you use the dash dash trace event categories and turn on the V8 category, you will see exactly when JavaScript is running, right? You will know when it's not running, right? You want to make sure that if you are making use of promises that you are spanning those barriers. Your promises should not be resolving within the same event loop, the same V8 execution, right? If they are, go back and figure out what's wrong or don't use a promise there, all right? Don't use unexpected promises. Just don't, right? If a function does not, if you do not know that it is designed to take an async function, do not pass an async function. Yeah, again, avoid mixing promises and callbacks. Use one or the other, all right? Don't create promises in loops. Again, synchronous promises are just useless and do not use long then chains. Just avoid it as much as you possibly can, all right? So that's it, thank you.


Hey, this is Gabrielle with Oxmoor Auto Group. I'm here at Oxmoor Toyota today We've had a lot of people ask about vehicles under $10,000. So today I've picked out three vehicles I want to show you guys. So the first one is a 2013 Scion IQ It has Bluetooth. It is a clean Carfax. It's black sand pearl exterior with black interior It only has 28,954 miles on it. Our Facebook price is 9,900. This is one of the lowest priced vehicles like this within 150 miles. So our second vehicle is a 2013 Toyota Yaris L. It has Bluetooth. It also has a clean Carfax It's a white exterior with ash interior. This vehicle has 95,270 miles Our Facebook price is 7,700. This is one of the lowest priced vehicles like this within a 500 miles And our third one which is definitely a vehicle. It is one of a kind It is an O5 Cadillac DeVille. This vehicle has under 100,000 miles It has 80,190 which is amazing for this year. It is leather and sunroof It is a completely clean Carfax. It's white exterior with beige leather interior Our Facebook price, which is crazy, it's $5,600. So you guys if you have any questions or would like to come out take one of these vehicles for a test drive Give us a call at<PHONE_NUMBER> Or visit our website at oxmortoyota.com and we also are going to have the links attached right at the bottom Thanks you guys. See you soon


Good morning. It is 10 o'clock and we are Tuesday, so it's our second edition of Science at 10. Today we have Dede Rwadi. Dede is for the seconded scientist in C4 and he's going to talk about value chain and how to improve the value chain related to timber in Indonesia in how many? Seven districts? Five. Five districts? Yes. And this is an ongoing research and I'm sure that Dede will be interested by any suggestion you can make to him, so please. Thank you, Rubens. Good morning, everyone. I'm honored to be here and to give some talks to you. I'm going to deliver some of the key findings of the ongoing nearly complete research project actually funded by ACR. It's about the community-based commercial forestry and when I mean with the community-based commercial forestry in practice is the small-holders plantations, small-holders timber plantations and mainly in their private lands. Although this project actually cover all other community forestry schemes like Hutan Kemasa Rakatan in Indonesian terminology, but since they are not currently produced timber commercially so most of the data that I want to present now is based on the private-owned small-holders plantations and this project will be completed by the end of this year and there are some activities but I would like to focus on the value chains on this aspect and first I think I need to read this what I mean with the value chains is we use the terminology that's developed by DFID. It's a context range of activities carried out by various actors so it's include the timber growers, windowmen, processors to produce raw materials, logs and to transform these the final product that is sold to consumer. So my research mainly focus on the small-holders so the timber growers and then to middlemen and to processors of course if you are looking if you are trying to understand about the value chain it could be unlimited up to the exporter but I'm focused on the small-holders because what we are going to do is how can we improve the constraints that can be still faced by small-holders. If you look at in Indonesian situations there are lots of small-holder plantations but they still have serious problems so they are not not really moved towards the commercial plantation due to various problems because of limited market information because of weak bargaining positions of farmers when they are building in timber marketing transactions. So we did the research in five districts in Indonesia two in Java in Gunung Kidul in Patti we are dealing with ticks the valuable timber species slow growth and the other one is Sengon Paraseriantes vulcateria it's in Patti it's fast growing species and in outside Java we collected data from Zumbawa in West Nusrat Tenggara and also in two in two districts in Sulawesi one in South Sulawesi and one in Konawa Selatan in Southeast Sulawesi. So when we are studying the value chains we are studying about the actors who are the market players on the value chains and what are their sellings what is the price the volumes and what is the relationship between the small-holders the timber growers and the middlemen and also with the processors like sawmills either in the village level and the district level. We did the data collection with partners from various institutions from University of Gajamada and Forda in Makassar and also in Bogor and also from Australian National University so I with my colleagues from NU lead the project we set together the questionnaires the methodology and then our partners did the data collections I must have also visited some of the places and then we convened the workshop to verify and validate the result. So this is some of the key findings from our study first if you look the if you look the timber markets small-holder timber market in the regions they are various price according to quality for example for TIC we can have the price starting from about 500 000 per cubic up to 5 million per cubic so it's very huge variations and this is due to quality which is mainly based on the diameter the size and also the timber quality. Similarly in Saigon in in Paracir into Spakateria the price start from 400 000 cubic up to more than 1 million so actually they are the potential for small holders to get the better price if they could do that but if you are looking the current situations most of farmers their the selling price is 10 toward the lower price for example TIC in the five regions the range between 800 to 850 000 per cubic and why because first because the timber quality usually low diameter usually small and they have a lot of defects that's in in terms of the quality and second in most situations farmers sell timber not in the form of logs but they sell trees so it means that also they have some limitation on estimating the the volume of the trees so they they are much rely on the middlemen to measure the trees and the third because the the way the farmers now in their business they selling timber when they need urgent forecast so that wise in in the sentiment we call that the typical system for small holders is the bang butuh the bang butuh it means they cut the trees where they need money or maybe you can say less forecast and that's weakening the bargaining positions of farmers because in practice when when farmers want to sell the timber they don't really care about the price they don't really care about the quality but they really care about the money that they will need and then they counting which timber they are going to sell to the middlemen so that's the situations uh what the consequences now if we are looking the timber business in small holders they plan in java for for example actually the the area is expanding the timber growth is expanding it means that the benefit is there for the small holders but actually they can do better they can get more profit if they have more little bit about the market orientations so this is the the the point that we would like to to rise to the farmers because we want farmers to invest more in timber plantation there are a lot of land to be planted and there are a lot of opportunity of market we are also studying the market structure in if we compare in java in outside java there's very big difference in java most more or less the the the market is established so we can see we can find a lot of buyers middlemen at the village level but in sumba for example maybe we can only have two or one middlemen in the village so also let's reduce the the option for for small holders to sell their the timbers so that's why uh market is more competitive in java compared to outside java uh maybe that's also why even though the government of indonesia already introduced various schemes on timber plantation like htr the government set aside five million hectares for htr but there are almost very limited area really planted by small holders one of our case study in konawa islawan for example in 2009 the community granted about 4 000 hectares of happy air that's for plantations for productions but up to now maybe only 25 hectares already planted and that also due to assistance from ngo's not really started by the small holders so i think there is something there that the timber business is not really okay not really uh interested by the farmers and there are also uh some regulation that may hindrance the small holders due to timber transaction cost timber transport documents because they have to provide that although it is uh government not not really taking money from that but the they go aside for showing the timber transport document uh rise the transaction cost for farmers so i think uh the conclusion that we we could find we can address here uh we can help actually small holders to improve the benefit uh from timber plantation business from the current situation if we can convince farmers to improve the management in timber uh plantation for example uh they can do thinning for example they can do pruning because they are a lot of timber uh actually uh the time for for prune but they are not not really care about pruning uh because they they don't really think that market will respond positively to the to the airport so uh this is what we're trying in the project we are trying to convince small holders bringing them to to sawmills directly and to show this is the price differences this is the quality differences and you can do this you can produce clear timber bigger size diameter timber if you can do thinnings pruning et cetera so we also introduce this very small and practice tools this is the tape with this we can measure diameter height and we can also determine the basal area different little bit different with the uh method that usually used by academicians but from these tools we can uh teach farmers they can select which timber they are going to uh to maintain for for bigger size and then from that point they can start uh that determine the basal area then can decide which timber that should be thin and i think it's it's very practical tools and that's maybe one of the recommendation to the extension agency in Indonesia if you can convince farmers by by uh bringing them to market and also teach them how to improve their timber management thanks thank you the main message


Have you created a formal contract using Word and want to make it professional and official by adding signature lines to it? This is the right short video to watch to learn how to do so in a couple of minutes using method 1 of signature lines in Microsoft Word. Welcome to Burn to Learn, Arlene here. So here we have an important contract and we want to make it official by adding signature lines for the parties implied to sign. How do we do so? We scroll down to the end of the contract, place our cursor there, and up in the insert menu in the text area, we'll click the Signature Line button. A signature window will open where we can fill out the desired boxes, such as who's designer, designer's title, and email address, as well as instructions to designer. You can still add just a signature line without filling out any of these. Let's do that. We'll just click OK. And a nice straight signature line has been added to our contract. But what about when we need another line for the third party to sign? Why don't you please take a second after watching this video to subscribe to our channel and feel free to leave a comment. So we want an extra line and we want it to be right next to this one. To do so, we can use a spacebar to add a few spaces or press the tab key a couple of times. Click the Signature Line button again and this time we'll fill out the window. The suggested signer is Burn to Learn and the suggested signer's title is Marketing Manager. And we'll click OK. As you can see, this time the descriptions have been added below the signature line. Honey, huh? But what if you don't really like those big looking X's on top of the signature lines? On part two of this video, we'll show you a second method to add signature lines using Microsoft Word 2016.


In today's video, I want to show you how to create this really quick and easy look. I feel like this is great for this time of year where you want to feel put together. You want to feel a little bit glam, but you probably don't have all the time in the world to do that. So here's a really quick and easy look. We're only using one eyeshadow, which is even better, and it probably takes me about five minutes. So hopefully this will help some of you out when you want to feel glam, but you don't have too much time. Now if you're new here to the Make Your Chair channel and you enjoy tutorials like this, then I might suggest hitting the subscribe button below. It's totally free. And if you're already subscribed, then thank you and welcome back. Now let's get started with this really quick and easy makeup look. So as always, we're going to start by priming the lids. Now because I want to keep this really really simple, I'm not going to use an eyeshadow primer. I'm just going to use whatever I'm going to be using on my face. So I'm going to grab my favorite concealer. Yes, I know, please don't judge me too harshly. But I'm going to grab my favorite concealer, something that's a little bit on the dry side. And I'm going to use this as my base because I can use this all around my face and it just takes up a lot less time. So when I'm applying concealer to other areas, I just pop a little bit on my lid and blend it out using my sponge. And as I always say, try using a sponge to blend out your concealer or your primer on your lid. And the base is so much smoother and much more even. Give it a try. So what that concealer is going to do is cover up the natural discoloration that we can have on the lid. So now we're just going to set it in place because concealer tends to have a little bit of an oily texture. So I'm just going to apply my translucent powder or my face powder, whatever you like to use all over the lid to set that concealer in place. This is just going to prevent any of those creases and any of those kind of little oiliness can come through, while also creating like a really smooth base for us to blend over as well. And I'm using a blending brush to apply this powder and we're going to continue to use this blending brush as we go. Now to keep this really easy, I'm going to apply the same bronzer or contour that I'm going to be using on my face, on my eyes. If you want a warmer look, go for your bronzer. If you want a cooler look, go for your contour. Now I'm sticking with that same brush and I'm just going to work this into the crease of the eye. And then blending upwards and blending downwards. Basically, it should fade out from the crease line. So that's where the eye kind of creases into the eye shape. That should be where we have the most amount of depth. And then it is blended slightly downwards and slightly up. Try keeping your eyes open. This actually really helps to see the shape that you're creating. Also, the reason I picked this brush is because I can use it horizontally, but also vertically. And this is going to allow for a different type of blend. So when I went to get it deep in the crease, I'm going to use it horizontally. And then I can turn it on its side and I can blend over and back. And this is just going to give me a little bit more height in my blend. Absolutely love this brush. It's one of my favorite blending brushes. Highly recommend it. So I'm just going to very softly blend this all over the eye shape. Basically, imagine that you're kind of contouring your eye shape. So just follow your natural eye shape, making sure to leave a small gap underneath the brows and also at the lash line. Now the reason I've left this gap at the lash line is for our next step. So basically we're just going to coat this with a little bit of pencil. So grab your favorite pencil or gel liner. I'm going to be using a pencil because I like how creamy pencils can become. So I can kind of blend and blur this out. So I'm just going to do a simple line of pencil right at the lash line. Get as close as you can. Make sure you're really saturating right at the lash line. But it doesn't have to be perfect because we are going to be smudging this. So don't worry about getting the perfect line. Just get a nice even line right across the lash line.  As I mentioned before, I like using black browns because they add a little bit more warmth to the eyes. They're not as harsh as using a true black. I also love applying this right in between the lashes and on the upper waterline as well. So I kind of look down in a mirror and I push this upwards and it coats this area. And what this does is adds a lot more depth to the eyes without them to work too hard. Remember, this look is all about being quick and easy. So this adds the drama without adding extra steps. And then you should end up with something that looks like this. So just a nice even line right across the lash line.  Now warming up your hands will just create a little bit more of that warmth to melt the product. So taking your pinky, you're going to kind of smudge this out. So I don't want you to rub this because basically that will just erase it. What you want to do is you want to do a little smudging motion. Smudging is like pressing into the product and then pulling slightly up. And this will do that little smudge and kind of blur and blend out the edges. Now over the top of the smudge liner, we're going to apply a kind of a deep rich shade with a shimmer or a metallic finish. Try choosing a shade that's going to bring out your eye color. That's a really great way to make this more glam. So say if you have green eyes, go for a purple. If you have blue eyes, go for more of a golden shade. Or if you have brown eyes like me, go for something with maybe a silver. And I'm going to be using a pencil brush to apply this, but you can use your fingertips again kind of doing that same pressing and smudging motion. But I'm just going to use a pencil brush because it's so much easier. I'm going to curl my lashes and apply some mascara, but we are actually going to go back in and do a second layer of eyeshadow in a second. Take a little bit more of the liner, take a little bit more of the eyeshadow, and just keep smudging until you get the depth that you like. But it's a really good idea to apply mascara in between just so you can see how dark you want to go. And there you go. That is the finished look. You should be able to recreate this look in about five minutes. Depends on how quickly you can apply falsies though. I have seen some people apply their falsies and it takes them about 10 seconds, which I'm like, wow. So I'm pretty impressed with those people. If you have any little quick tips or maybe an eyeshadow or a lipstick or something that you apply that makes you feel really glam instantly, I want to hear about it. So definitely let me know. We don't have much time in our lives. So sometimes it's just nice to have something really quick and easy that we can put on in a hurry and then head out and feel super glam and confident. And that's what this look is all about. So definitely share any tips that you have as well. As always, my friends, be kind to yourself. Be kind to others. Particularly at this time of year, it can be kind of tricky. We're almost at December. The year is almost over. I can't believe how quickly this year has come by. But this is when we have to be super kind to ourselves and super kind to others because it can be a difficult time. It can be very stressful, be very hectic. There can be a lot of emotions. So let's just share a little bit of love and support and kindness. As you guys always do, and I always really appreciate it. I love seeing your interactions with each other and the love and support that you share. It's just so beautiful. So let's keep it going till the end of the year and I will see you guys in a video really soon.