Welcome back to our lecture series Math 12-10 Calculus 1 for students at Southern Utah University. As usual, I'll be your professor today, Dr. Andrew Misseldine. This is the first video for Lecture 32, which is going to be very theoretical in its approach. That is, we're going to be talking about some theorems and proofs that are going to be important for our study of the derivative, and particularly we want to build up to the so-called mean value theorem, which is one of the most important results from differential calculus. Before we state the mean value theorem, we actually are going to prove a state and prove a stepping stone to get to the mean value theorem, what's known as Roll's theorem. Roll's theorem is named after the French mathematician Michel Roll, who proved this result in 1691. Basically, it kind of makes sense, but it does require an argument to establish why this would hold for every single differentiable function. Roll's theorem, if f is some function that satisfies the following three conditions. So the first condition is that we want f to be continuous on the closed interval a to b. Second, we need that f is differentiable on the open interval a to b. And thirdly, we want that f of a equals f of b. Let's try to unwrap this a little bit. The last assumption, f of a equals f of b, this just means, kind of like we have depicted on this picture on the right here, f of a equals f of b just means that at the start of the end point and at the end of the, excuse me, at the start of the interval and at the end of the interval, we have the same y-coordinate. So this function starts and stops at the same y-value, although the x-coordinates are certainly different from each other, a and b do not equal each other. All right, that's what the third condition says. It starts and stops at the same y-value. Continuous, right? A function is continuous. Essentially, if you can draw it without picking up your pencil or pen, more specifically, a function is continuous of every place in its domain. The function evaluation agrees with the limit. Differentiable. Differentiable means that the derivative exists everywhere, that the tangent line exists everywhere in these domains. And you will notice a slight difference in the intervals. We expect that f is continuous on the closed interval a to b, but only has to be different, but it's differentiable on the open interval a to b, which is a slightly weaker statement. Now, one has to be careful, right? Because differentiability actually implies continuity. Differentiable is a stronger condition. Every differentiable function is, so why do I need to state both things? Well, that's because that we'll be differentiable between a and b, but at the end points, a and b, we don't make any assumptions about differentiability, but we do still require that it's continuous on the end points. So everywhere between a and b, it needs to be differentiable, but at the end points, it needs to be at least continuous. If it's differentiable at the end points, that's even better, but that's to satisfy Rohl's theorem here. So in summary, if we have a function which is continuous from a to b, inclusive, because again, the brackets mean that a and b are included in the interval there. If f is continuous from a to b inclusive, if f is differentiable between a and b and if f of a and f of b are the same thing, then there exists some number c, where c is going to live between a and b, although we do know that c will not be a, nor will it be. So c will be in the open interval, it won't be in the closed interval necessarily. That is, it won't be the end points. If under these assumptions one, two, and three, then we know there's some point c such that f prime of c is equal to zero. That is, we're guaranteed at some point, the derivative, now the derivative of zero, that would suggest the function has a horizontal tangent line at that point. And so when you look at this diagram here, that intuitively seems to make sense from a geometric point of view. It kind of, the idea is the following. If you have some point over here and some point over here, if I'm drawing a, if I'm drawing some type of continuous differentiable function, basically what goes up must come down. If there's no breaks or sharp corners in the graph, then yeah, there's gonna have to be some place where there's a horizontal tangent line. You could interpret this, not just as functions, but also in physics, right? You could think of this as f is the motion function, the position function of some particle that's moving. If ever there's a moment where the particle has the exact same position at different points of time, mind you, but if there's some point t equals a and t equals b, it has the exact same position function that is f of a equals f of b here, where a and b are time stamps, time t here. Then Rolls-Therm says that there is some instance, some instance between the two at time equals c. Again, this is between a and b such that f prime at c is equal to zero, which if this is our position function, the derivative of position is equal to velocity. So we see the velocity of c is equal to zero. So the only way that a object can move from a position back to itself, assuming it left that position, it would have to at some point have zero velocity. There's some point where it comes to a pause.  At some moment in that trajectory, the ball has no motion. It stops. It has no velocity. All right. So again, intuitively Rolls-Therm seems to make sense, but let's this logically speaking, that is, let's consider the proof of Rolls-Therm. And it turns out it's really not so bad based upon essentially the discussion of critical that we saw in the previous lecture. So the first situation is what if our function's a constant? If it's a constant function, then it's flat. This is our function f right here. Well, the derivative of a constant function is exactly zero. And so Rolls-Therm says there's at least one point where the derivative would be zero. If your function's constant, then every point between a and b will have zero derivative. So you have lots of options for c. That's an important case to mention here because when we talk about Rolls-Therm or the subsequent mean value theorem, these theorems guarantee the existence of certain points with conditions, but it doesn't say that point's unique. There could be, right? It could be that our function goes up and goes down a couple of times, right? There could be multiple horizontal tangent lines between these points that have the same y value. That's okay. For a constant function, every point would have a derivative equal to zero. All right. The second case is a little bit more interesting. Let's suppose, much like I'll try to keep it on the screen for a little bit longer, let's suppose like our picture suggests, let's suppose that there's some y value between a and b so that it's bigger than f of a. Okay. So let's draw that picture for a moment. Let's say that we have here our f of a. We have our f of b. And again, these have the same y value. So this is a horizontal line right here. Let's suppose there's some point, some point f of x where x is between a and b, that f of x is bigger than f of a and necessarily larger than f of b, which is perfectly fine. So there's something that gets above this horizontal line here. Well, by the extreme value theorem that we saw previously, this is why continuity is important. Coming back to our assumptions, we're assuming that f is continuous on the closed interval a to b. This is exactly the setting where the extreme value theorem applies that we talked about in the previous lecture. The extreme value theorem says if you have a continuous function on a closed interval, at some point on the interval a to b, you will obtain an absolute maximum value. Likewise, they'll be about the maximum right now. So the extreme value theorem guarantees there exists some c, which obtains the absolute maximum of that interval. So f of c is greater than equal to all of the f of x's in the situation. Well, since there's some f of x that's larger than f of a, then it turns out that f of a cannot be the absolute maximum because there's something bigger than it. And since f of b is equal to f of a, then f of b cannot be equal. And so we see that this c value cannot be equal to a, cannot be equal to b. It's got to be something strictly between f of a and f of b. And so that's what we're going to take here, this absolute maximum. We'll say right here, this is our f of c value. It's our absolute maximum. And it's distinct from the a and from the b because they can't be equal to that. Well, we also want to apply Fermat's theorem. Fermat's theorem says that if you have an extremum such as an absolute extremum, then one of two things must happen. The extremum must be at an end point, but nope, it's not at f of a, it's not at f of b. Or if it's not an extremum, then it has to be a critical number, which a critical number means that the derivative at c is either undefined, d and e, or it's equal to zero. But the derivative is defined because the function is differentiable between all points a and b. Therefore, f prime of c exists. And so by Fermat's theorem, we see that it's going to have to equal zero. So there has to be a horizontal tangent line at this value x equals c. Now similarly, if f of x is, if there's some f of x that's less than f of a, a similar argument can be used here. The latter phrase is mutatis mutandis, which basically just says change the appropriate parts. So the main difference is when we invoke, we look for a absolute minimum as opposed to an absolute maximum. And then you apply Fermat's theorem, which will then show that the absolute minimum would have to be equal. So Roll's theorem is then essentially just a consequence of the extreme value theorem and Fermat's theorem. In the next video, we'll modify Roll's theorem to give us the mean value theorem.


Warning! Don't allow spiritual laziness to rob you of spiritual growth. The flesh fights against the spirit. The spirit says pray, but the flesh says not right now. The spirit says read the word, but the flesh says scroll through social media for hours and hours. The spirit thrives in stillness. The flesh craves noise and distraction. The spirit is willing, but the flesh is weak. In your everyday life, you'll notice the pool of the flesh. You'll notice how the flesh tenses up and squirms when you try to pray. You'll notice how the flesh tries to stay distracted when you attempt to read the word or to worship. The key is choosing to do what the spirit wants. At first, if your flesh is strong, this will be a battle. But every day that you choose spiritual discipline, the flesh gets a little weaker. So say yes to the spirit, say no to spiritual laziness by saying no to the flesh.


Hello, we'll give everyone a few more minutes to join. I don't. We'll give everyone a few more minutes to join. Yeah, sure. The agenda. Hi, Simon. Hello. We might kick off in like. One more minute. Again, by my clock, that's one moment. I will start. So I am already showing my script. Yes. Agenda housekeeping. First off, the antitrust notice. Everyone on the call should be already familiar with that. If you're not, there's a link. Mini is being recorded. Meet. Just. I don't think we need to worry about the raise hand. It was only a handful of people on the call. Feel free to interrupt me if you have a question or comment. General announcement. I don't have any. Does anyone on the call have any general announcement? Okay. The roadmap. I think at the moment we're all about cancun and my driving. And. Yeah, I think that's fairly up to date. Even though it hasn't been updated since February. Okay, release updates. We might actually. I was going to say skip that and move on waiting for Stefan who's doing the burn in, but. We can probably. Do the update anyway. So 2342. Started burning on Friday. As I understand it, there was an issue with the flat database. New feature. So there was a null point exception. A fix has already gone in for that this morning. So the plan is to. Restart. Like start a new burn and basically. Because. My understanding is that we really weren't flat database to be the. Sort of. Key feature in this new release. So without the flat database. Even though it's behind an experimental feature. We kind of want that in the release. So we're starting a new burn in. Today. Any comments on that. I think it's. I'm not too familiar with the PR, but I think it's. It's the heel mechanism for the flat database. Rather than. Well, so it's like. I think we've always had the flat database, but it's. I guess. Filling. Filling it to. Be complete. I think is what this is doing. Right. But yeah, it looks like it was. Some kind of refactoring was done. It is feature toggle, but there was some. Refactoring done. That affected the, when the feature toggles off as well. And that was where the bug was. And I think it was. I think there's a point around this. Around how we. Like reviewing tests PRs, especially big ones. I think what might have happened here is that. It was like all tested third tested and reviewed and stuff, but then changes were made as a result of the review. And some of the retesting was missed. I with the featured flag off. So I think. I mean, ultimately he kind of ties in with. The proposal about. The change to the release process, but it's. I think it's very onerous to have to retest everything like that. Yeah. Yeah. So. I think one, one thing we could do in the short term is. Maybe we do most of the code review before most of the testing, if that makes sense. You're probably always going to have to do some, some manual tests to make sure you think you're ready. But maybe we should kind of default to like getting the code ready to review before we do like the most extensive. Portion of the tests. That might help. I mean, this is all kind of some ad hoc and there's no. Very official process around it anyway, but it's just worth probably mentioning in chatting about really. So like, I guess it's relevant if like, if you're reviewing PR and asking about the testing and stuff like this. Which I've done before, like. I think it's probably worth bearing in mind, but maybe we should test at the end. Just before merge. Because one, one small line could break everything. Yeah. Yes, it's a fair point. I'd really like to see more of this automated because I feel like as long as it's manual and we're relying on, you know, individual individuals to, to always do the right thing, it's just, it's your own. Yeah. And this is how I guess might as well talk about it now. It's kind of related to. What I'm trying to get up with the burning process, changing the burn process that we like. We're, we are effectively relying on the burning process to catch things like this, which it did, which is good. But what that means is, especially the fact that it was on the weekend. Means that I feel like a release cycle. Well, the time was the word like lead time for, for completing a piece is actually really long because of that. And I think we got quite lucky with this one and it was really obvious which committed. It was because of the stat trace. But I think if you had, you know, multiple commits. Or maybe doing, you know, you know, big changes and they're all relying on the burning.  And it can be quite difficult to, to find the issue. So basically. The long-winded way of saying, I'm agreeing with you, I think we should put time into. That's a regression test. Which is kind of the point of my proposal as well. So the proposal you're talking about is this one. So, yeah. Maybe I should wait until we get to that to carry on. No, I think you're right. It's definitely related. Yeah. Basically, I think where we are with this is that. I don't think there's too much push, push back around. Replacing the quarterly releases with a deprecation policy. I agree. So I think. I'd be happy to kind of do the final call for that bit and, and start actioning that after maybe the next. One of these calls in the other time zone. Yeah. Just give one final chance. That piece of it, I think is, is good to go. And then I was also suggesting about effectively. Well, keeping the main batch release below that says that, which would mean. Like. You don't really need a burn in because all the testing has happened before main. Now that is not really, we can't obviously do that right away. I think it's too error prone to rely on the testing and retesting and stuff in PRs to happen. Yeah. I do agree. There was some pushback about not removing the burning process. I do agree with that. But I think it'd be good to get like a commitment. But the direction we want to move in is to replace the burning with regression tests. Yeah. I like the idea of having the regression tests. That would be run on every PR that would make sure. Yeah. There's no regressions basically. And then that would definitely reduce the number of errors that the burning might catch. And maybe, maybe we would totally do away with the burner. I don't know. I feel like they're kind of two different questions. But yeah, I. Yeah. Yeah. It's all about speed of the feedback loop really. And the burning is very slow on, but it is quite reliable and catching some. A lot of bugs. Yeah. And when something does happen like this, then need to see how kind of painfully slow it is because it's going to be, you know, basically a week it's taken, it will have taken us to release by the end of the second round of burning. Yep. Yes. You don't find anything else. Yes. So then what are the next steps? So yeah, it would be good to get kind of like. A verbal agreement by people who are interested about. Working towards. We better regression tests and like. Getting that in the roadmap, I guess, would be the end goal with that. And yeah, we could trial the defecation noticing. As soon as kind of everyone agrees, I guess. I guess the next step is to not do the next quarter of the release. And maybe update the changelog with any breaking changes that would have gone in there. And decide how long they need to be. We need to wait. I think it's what I put in the suggested policies that we wait. You know, it's leader up to the developer to decide how long we should wait for their change that they want to make. So yeah, so formalizing the suggested policy, I guess would be kind of the next step in that. Okay, so. Sorry, did I miss any next steps? I think it would be good to sort of. I think that captures it. Yeah. Okay, cool. Awesome. Okay, we might go back up to release. Okay, any, any more comments on the release? Simon, you did the last release. Do you know, can we update the 2342 release that we already sort of started? Or do we need to, does the next one need to be 2343? Like, can we, can we patch this release or do we need to just go the next one? Good question. I think technically you can. I think maybe when this is happening in the past, we can just bump the version. Yeah, I feel like it's clear out if we just bump the version. And we say 2342 by odd burning. The next one's 2343. Yeah, it wouldn't have worried any, any issues for sure. Yeah, it's not too much. Yeah, I want to take that upline and double check. But yeah, I don't know if it's really a huge issue if we didn't announce it, but it's, you know, technically people might have pulled the code already. Yeah, exactly. Maybe especially on the docket. Yes. Okay, cool. Thank you. Yeah, I will confirm offline. Okay, so next item on the agenda is about 244. Gabriel, do you want to give a quick update on that? Yeah. The major job desks are implemented like the outstanding desks that we had for DevNet 6. And the PR is marked as ready for reveal. I think the goal is to merge that into main. And DevNet 6 doesn't seem to be as smooth as it was supposed to be. There are some issues there and apparently they're kind of different for clients are following different forks. But that's being investigated. And the, it's not just basic, right? I don't think it's just so yes. Yeah, cool. So we're keeping up sort of. You know, we're on par with the other clients at the moment. Yeah, yeah, we are. Yeah, cool. Okay, so. Yeah. Justin is going to investigate and when he's back tonight. Okay, cool. So other business, we kind of covered the cherry pick. Avoid cherry pick release process. So the next one on the agenda is the debug login program proposal. Yeah. So this one is just about basically making debug level logging use actually useful for people who are trying to debug stuff, right? Yeah. That's right in a nutshell. Yeah. I mean, this agreement with this in principle, like, they might be, I just kind of repeating this here to, to, in case more people see it and basically shout if you got any objections and shout if you agree as well. And hopefully we can make this the kind of the official policy and then we kind of try and stick to this. Yeah, I think. There's quite to do still to the old existing books, but that's just, yeah, that's the separate thing really. Yeah. So what's kind of underway on that, right? There's already some PRs. And I guess if people develop as users notice things that are, you know, too noisy at the debug level, we could raise issues. Yeah. I mean, it just, I just wanted to kind of, I guess get agreement and socialize the thing to aim for for debug and then hopefully it'll get picked up in reviews and things. Yeah. And when you say the next steps after that one as well. Well, I'll, I can't remember if I put it on the agenda for the other time zone. Well, I'll do it at least once more there and. Yeah. If no one can object about it. What's the best place for people to give it? Like if someone says, yes, I agree. What's the best place to do that? I guess it's easy to track it. It's on the proposal itself. On the actual proposal. I'll be watching discord anyway. So discord would work as well. But yeah, I haven't particularly mentioned it in discord. I will do before kind of finalize it. Just to make sure everyone's seen it. Okay. That's everything that's on the agenda. Anything else anyone wants to raise? No. Awesome. Let's call it done. Thanks all. Thank you.


Okay, I'm going live in 10, 9, 8, 7, 6, 5, 4, 3, 2, 1. Good afternoon, everybody. I'm delighted to welcome you today to the IINA webinar this afternoon, and we are very pleased to be joined today by Madame Nathalie Noiseau, who is a member of the European Parliament and Chair of the Subcommittee on Security and Defence, who has been generous enough to take time out of her schedule to join us this afternoon. Madame Noiseau will speak for about 20 minutes, and then we will go to questions and answers with our audience. You will be able to join the discussion using the Q&A function on Zoom, which you should see on your screens, and please feel free to send your questions in throughout the session as they occur to you, and we will come to them once Madame Noiseau has finished her presentation. We would appreciate if you could give your name and affiliation when you're putting forward your questions. And just a reminder that today's presentation and Q&A are both on the record, and please feel free, of course, to join the discussion on Twitter and using the handle at IIEA. So now may I formally introduce Madame Nathalie Noiseau, MEP. She is currently serving as a member of the European Parliament, and she is the appointed Chair of the Subcommittee on Security and Defence, and is also a member of the Committee on Foreign Affairs. And prior to joining the European Parliament, Madame Noiseau led the Resistance List, a campaign initiative of French President Macron during the 2019 election, European elections. And previously, Nathalie Noiseau served as Minister for European Affairs in the French Government from 2017 to 2019, in the course of which she visited Ireland. And prior to this, she was Dean of the École Nationale d'Administration, for five years, and a diplomat within the French Foreign Ministry. So the world has seen two major political events in the past three months, change of president in the United States, and the final act of the Brexit decision of 2016. So in her address, reconfiguring security and defence post-Trump and post-Brexit, we will hear a very timely assessment of these events. And Madame Noiseau, we look forward to your address with considerable anticipation. And the virtual floor is yours. You're most welcome. Well, first of all, I would like to thank IIEA and you personally for having me today. It's a real pleasure to be with you virtually, even if I would have preferred to come back to Ireland, a country which is dear to my heart. I will immediately start in order to give time for questions and answers after my introductory remarks. I would like to start by mentioning that in Europe, we pride ourselves for an impressive achievement. We are in peace in the European Union for a number of decades, and we are proud about it. But is it really peace? And this is what I would like to question to begin with. Just to mention our neighbourhoods, all of them have become unstable. We do remember that since 2014, we know because of the annexation of Crimea by Russia that our Eastern partnership is fragile. It faces threats which all concern us. And recently, we saw frozen conflicts experiencing global warming, if I may say so, including in Nagorno-Karabakh last year. Western Balkans, they are in the heart of Europe, and a number of disputes are still unsettled between Serbia and Kosovo, inside Bosnia, Herzegovina, or even between two members of the EU, Croatia and Slovenia, there are still territorial disputes which are not really settled. If we look south, Syria, it's a sad anniversary. The demonstration started 10 years ago and repression immediately after. And we were notable, we in the EU, to participate decisively in a political settlement, although there are consequences for Europe, be them the number of refugees coming from Syria, but also terrorist attacks, which have been plotted in Syria. Libya is another conflict next to our shores, which is still ongoing with absence of state and presence of foreign actors, Russia and Turkey in particular, and this is a pattern that we see elsewhere. I should mention the Middle East peace process, whether it's really a process and whether it leads towards peace, is now questionable. And further down south, Sahel is a challenge for all the European countries, and Ireland knows it quite well because there have been, for quite a long time, Irish troops in CSDP missions. So our neighbourhoods are fragile. Multilateralism is a principle in which we strongly believe, and it has been more and more threatened in recent years. You see the United Nations Security Council very often blocked by vetoes. You see international organisation, WTO, WHO, UNESCO, where an American withdrawal leaves more room to non-democratic actors. It's not only that the US is not present, is that others have more weight. I would also mention the international arms control architecture, which is shaken. The INF Treaty is no longer in place. Open skies is in shambles. We don't know what will take place with New START, and we are of course very concerned by the status of GCPOA with Iran. We are also facing less conventional warfare, and on this we are not in peace. Hybrid threats do target European countries. Cyber attacks are numerous, and we saw plenty of them since the pandemic started. The same for disinformation, which has never been that harsh towards European countries and the European Union itself. And of course terrorism, I speak from a country which was hit several times by terrorist attacks. So the notion of borders is less and less relevant, and we have to rethink our security, our defence, and how we get organised. We also know that some countries have become more and more assertive, if not aggressive. It has been the case of Russia for quite a long time, and Russia is not cooperating with the West. It's more and more the case with China distancing itself from a more traditional foreign policy of non-aggression and looking inward. More and more you have an assertive China. You see what's taking place in Hong Kong. You see the number of threats towards Taiwan or assertiveness in South China Sea are concerns. You see Turkey closer to our borders, whose behaviour has changed quite a lot and not in a positive manner. For a number of years, Turkey was the country without foes. To nowadays, Turkey is more and more a country without friends, having an aggressive approach towards Syria, towards Libya, towards Eastern Mediterranean, Greece and Cyprus, and taking part in a conflict like Nagorno-Karabakh and being more and more present in Lebanon. You see a NATO member buying Russian military equipment. This is quite a new pattern of behaviours. Russia, China, Turkey, what they have in common is that they might be rivals, they might be competitors, they might not agree on everything, but they seem to be agreeing on one thing, joining forces to weaken the West. So this is also new to our security environment. All of this has been accelerated by the erratic foreign policy of Donald Trump. What he called America first or make America great again, turned into America alone and made the bad guys strong again. We are facing more assertiveness from rogue states or countries which don't behave the way they used to behave previously. There is a huge loss of leadership from the United States on the global stage. So how easily will it be overturned by a Biden administration remains to be seen? There are reasons for optimism. We have heard what Biden said already about his trust in multilateralism, his willingness to go back to the Paris Agreement, to go back to the World Health Organization, his willingness to lead by example, to go back to DCP OA and to lead an alliance of democracies. All this is positive and we should support this trend. But we don't know yet whether we will see a Biden administration or if I was a little bit provocative, an Obama three administration. When you look at the appointments being made, very competent, very brilliant people, they were all in place during the Obama administration were already this notion of non-intervention in global affairs, of pivoting towards Asia, of less commitment to Europe or to European security was already in place. That might still be something to discuss quite soon with the U.S. administration. There are many reasons to believe that this American administration will be inward looking, trying to heal the wants of a divided nation and what took place in the capital two weeks ago cannot be underestimated and rightly so. And then you also have to ask yourself whether the Democrat in Washington want an alliance between equal partners between Europe and U.S. or simply ask the Europeans to align with American positions and our priorities or objectives might differ with the United States. They might not contradict, but they might differ in terms of what is really a security priority for the EU compared to what is really a security priority for the U.S. In the middle of all this came Brexit and Brexit in foreign policy. First of all, we have to admit that as regard the participation of the UK into CSDP, there is the losses are small. CSDP was never something that the UK really owned and really valued that much. There were few staff or military from the United Kingdom in CSDP missions. There were reluctance towards efforts like European defence fund or PASCO. I'm pretty certain that we have made progress on European defence because the UK was leaving the European Union. But there is a lot that remains to be done because the UK is a key partner in terms of defence, in terms of foreign policy, and we have to find ways to work together. I am really disappointed that the British government was not interested in having foreign policy and defence included in the partnership agreement which was concluded on December 24th. They had agreed in the political declaration in 2019 but then they went back and they said that they were not interested. To my view, this is something that has to be complemented the sooner the better because when we work in the European Union on sanctions or when the UK works on sanctions toward a third state, we should work together. We should harmonise our decisions. We should keep on discussing in the UN Security Council about oppositions. I remember vividly when I was in the government, it was the moment where there was the Salisbury incident, chemical attack against two people in the United Kingdom. The unity of the European Union, where the UK was still a member state at the time, was impressive and probably impressive enough for Moscow to convince the Russian government to exercise restraint. So we have to get back this capability to work together to exchange intelligence or to decide to send troops together in the future and I do hope that the British government will change its mind. But in this context, what should the EU do? There have been dozens of seminars and discussions about strategic autonomy and I would like to go back to it for a moment. What does it mean, strategic autonomy? It doesn't mean that we are turning all back from a traditional allies. It means that we work in a framework of alliances when we can, but that we also act autonomously when we have to, when there is something that needs to be fixed and partners or allies are not interested. Let's take a look at NATO. Not all member states are members of NATO and speaking to an Irish audience, it seems obvious, but you have to remind it to other member states which are members of NATO. I was mentioning the issue with Turkey. When you have a country like Turkey member of NATO, it means that for the time being, until the Turkish authorities go back to a more friendly behavior, there are things that will not be dealt with within NATO because there is a problem of trust and of diverging interests and priorities. Very often the EU has wider competences than NATO to face hybrid threats. You need to have competences on health, on logistics, on cyber, things that are not always comprehensive when you talk about a military alliance like NATO or when you work in Sahel, you have to have a continuum between development assistance, support civilian missions and military missions. This is something that the EU is able to do, not NATO. If you look at NATO by itself, commitments by member states in terms of defence spending and equipment have not been met yet. The magical word or the magical one is not NATO. European defence efforts are not against NATO. They are a complement and they are also an acknowledgement. With COVID, we know better than before the price of dependency. Not only at the military or purely security level, but we saw that being dependent on medical equipment from third states was a weakness. We know by experience that the EU has to focus on its sovereignty. We know that the definition of strategic autonomy is wider than only security and military. The good news is that we have started enhancing our efforts towards European defence. We have started with CARD, a way to coordinate our efforts in terms of capabilities to know more what others are doing, where are the loopholes, where are the redundancies and where effort should be made. Then we have PASCO, commitments made by member states to work together on enhancing capabilities, on making operational interoperability a reality. You have 25 member states, member of PASCO. That's a lot. That's very inclusive. Maybe this doesn't help making it very ambitious but we have to learn by doing. Then we have, since the beginning of this year, the European Defence Fund. For the first time, there is money coming from the European budget dedicated to support efforts among member states to finance research and development for military capabilities. All of this makes it a toolbox. We have a toolbox in front of us. That's good news. The toolbox is fine but it's not enough if there is not common will and this is political will. We have to work to make sure that we see the word in a shared manner. It has started last year with what was called the strategic compass and the results of these efforts should be evaluated in 2022. It started by a shared assessment of threats coming from intelligent services from all over the European Union, bringing together in the same basket what they know about the outside world, how they see it, what sort of information they have. What is very interesting is that it was not agreed by the heads of state and government. It was simply put together in order for people to know how the word looks like seen from Dublin or seen from Tallinn or seen from Lisboa or seen from Ljubljana. It brings us more knowledge, more common strategic culture which should make things easier in the future in order to take decisions because we've talked to talk but now it's time that we walk the walk. We already see the results of these efforts. When you see that there are French troops in the Baltic states in Lithuania, in Estonia, under NATO command in an effort to face a Russian threat, believe me, that was not a natural trend of French military to begin with. They were not used to be present in this part of Europe. They didn't know that much of the current level of Russian threat. Now that they are sent there, they express a lot of interest about what they are learning, the experience they are making and vice versa. When you see that there are Estonian troops in Mali or Czech troops or Swedish troops under French command in Barkan, Sahel was not immediately on the radar of public opinion in these countries. But now there is this common acknowledgement that a terrorist threat or failed states in Africa are a concern for all European countries. So this is working progress. This will obviously remain complex. We are talking about competencies which belong to governments. They are national competencies and governments are jealous to keep their competencies. We know the rule of unanimity for foreign policy and defence decisions in the Council which sometimes prevented us from being speedy enough or sometimes is used by third states to try to divide and slow down the processes in the European Union. It happens. We have to agree with it. We are to admit it. There are specificities within the Union, neutral states, NATO states. We have to take it into consideration and that everyone feels comfortable with the way we are making decisions and implementing decisions. So they are opt-outs, they are constructive extensions as we have just did with European peace facility. The presence of troops underground in CSDP missions is only made on a voluntarily basis which allows for the EU to have a foreign policy and a defence policy. Whether it's enough is debatable but for the time being it makes things easier for a number of member states and we have to value it. We shouldn't be afraid of using different formats. We should not be too French. French like very classical patterns where everybody is involved and everybody abides by the same rules. In defence and security issues this is not the most operational way of doing things. This is why there was for several years this European intervention initiative which was put forward by France actually saying to countries if you are interested, if you are able and willing we can join forces, we can meet more often than not, we can exchange experiences, we can exchange information, we can exercise together so that we know each other better, so that we are trained together in order to be able if need be to act together smoothly without discovering who are the others and what are their habits on the ground. And it has provided with the possibility for instance to have European special forces in Sahel working together in a very demanding environment because they trusted each other because they get used to each other and they are able to act. But then again we have to include the UK and this was the idea of the European intervention initiative from day one to say to the United Kingdom you are welcome. It's not because you're not a member of the European Union that you cannot participate. It's the same with Norway, it's the same with other countries which have common threats, common challenges, a comparable strategic culture and with which we have to continue to work together. We have to explain it to American friends, we did it and we managed it with the Trump administration. I remember having been in a mission to Washington explaining the European Defense Fund to a super reluctant Trump administration. At the end of the day we made it so it will of course be easier with a Biden administration but let's always remember that America has its priorities which might not always be ours and we should not blame the Americans for what they do or what they don't. We should think of what we do and what we don't do and we have to be relevant partners of the United States. To this extent I do view Ireland as a very important bridge, a bridge with the United Kingdom and a bridge with the United States because you are a valued partners of both and a strong member of the European Union. So I do look forward to more cooperation with Ireland on these topics because I think it's really a priority for us in the present and in the near future.


Topsy to two harbors, facing second seeded Greenway Nashwank Hewatton. On the first drive of the game, Titans with the ball and Eli Conaway with room to run. Brakes tackles, gets to the second level, but the Agates will force a fumble and recover. Seven to nothing, two harbors in the second. They pitch to Joey Marker, heads to the left side and down the near sideline. He wins the foot race. Going the distance, it's 14th nothing. But the Titans respond, Conaway again with a carry. At the end of the run here, the ball comes loose again. It squirts ahead into the end zone and Matt Jessica recovers for the touchdown. GNK down 14 to 6 at the break, but they would end up falling 26 to 18 in the section final. If you enjoyed this segment of Lakeland News, please consider making a tax-deductible contribution to Lakeland PBS.


Hi there and welcome to my channel. So in today's video, we are going to start some cucumbers indoors using the Krakki hydroponic method. As you can see, we have a lot of roots coming out of these cucumbers. They're getting towards that past that two-leaf stage where they're shooting out some more leaves, and I think they are ready to get into some nutrients so they can keep growing. So let's get started. So before we get planting up our cucumbers, I just wanted to give you a little update on what's happening in my arrow garden here today. So I was using this not only to start some tomatoes right into the arrow garden system, but also as a seedling starter for my lettuces. And as you can see here, we have some good sprouting happening with my lettuces. And I'm going to keep them under here for another week or so until they get a good root system. And just stay tuned for an upcoming video on planting up lettuces using the Krakki method. These are the two tiny stems that I have planted in the arrow garden. And as you can see, they already have some tiny little roots popping through the rock wall. They should be reaching that nutrient water that I have set up in the arrow garden container here. And they should really start taking off. A couple things I need to do though first is cut out one of the plants because they're two, both of these sprouted. And also I need to do something to stop the algae growth here on this rock wall, which I'll show you here in a minute. Here is the other tiny tim that I have started. Both of the seeds I put in here sprouted. So I'm going to have to cut one of them out. I'm just not sure now which one of them has sent out this beautiful root here. So before I cut one away, I want to make sure they have a lot more roots growing into the water first just so I don't kill the strongest one of the two. So in order to kind of keep that algae under control, I'm just going to cut some squares out of some recycled paper here that I have. Hope that size big enough to cover up the area around the plant. I'm just going to take a hole punch and punch a hole here in the middle. Cut another line here to the center of that circle. That way you have a little thing that you can wrap around the plant and cover up the rock wall and hopefully keep that algae under control until the plant gets a little bigger. Because these are just delicate little seedlings still, we don't want to do any damage to the to the plant. So that's why I'm just using this paper right now. As you can see that gives it some good coverage. Keep the algae at bay and the plant can still continue to grow and flourish. So we're going to be using these containers here to plant up the two cucumber seedlings that I have going. As you've seen maybe in previous videos, I really like the Folgers coffee containers. I've spray painted them just to kind of make them more aesthetically pleasing with just some spray paint, but you can leave them as is. They're easy to cut out to fit your net cup into. They have this kind of nice little handle. It's easy to put them under the lights and pull them out and you can easily check your root system. So this is what we're going to use today, but first I want to just talk about the hydroponic nutrients that I use. So I have two different kinds of hydroponic nutrients that I've been using on my indoor growing and this one here, the only difference with the haul in secret is it's a three part formula. The root farm is a two part formula. So both of these are available from Walmart. I've seen them in Canadian Tire. I will leave the links to them below to Amazon so you can look them up. My preference is to use a four liter jug such as this vinegar jug here. The reason being is when you look at the measurement table at the back of these nutrients, they base it on a four liter container. So it just makes it easier to mix everything up in a four liter jug and then pour it into your container. So rather than figuring out how much this container holds as far as water and figuring out the measurements into this container, I recommend premixing right into this four liter jug and go from there. So the nutrient table on the back of this one has three stages that you follow to mix up your nutrients, those being the seedling stage, the early growth stage. So kind of the mid stage and then also a mature stage. So when your plants are starting to bloom and flower and produce fruit or vegetables, I do find the root farm to be the easiest one to follow because it has you know two parts to it and as far as your measurements there's kind of three different stages to follow. So this is the one we're going to use today to measure up and make our batch of hydroponic nutrients. So as I mentioned, the root farm just has two parts to the to the formula that they have here. The one that you will need is the base, part one. You'll see that on here, part one. It also has two different part twos that you can use. So they have the all purpose that you can use as part two and they also have one called which is called a tomato and veggie nutrient. I have used both of these part twos for all different varieties of fruit and vegetables that I have been growing. I haven't really noticed too much difference. So I would say if you want to just have something that should cover all the kinds of fruits and vegetables you're growing, the all purpose part two works good. So to mix up a four liter batch of nutrients for the seedling stage, it tells you to use five mils of the part one and five mils of the part two. So very easy. I found that the lids from these containers actually works out to be five mil. So that's what I normally use to measure into my water. You can also of course get a measuring spoon. This one is a five mil measuring spoon. So you'd always shake it up really good before putting it into your water. As far as water that I use, I just use normal tap water and have found that it works good. I fill up large jugs in my shower down here in the basement and just let it sit for 24 hours or more just to let it settle. Up into this point, I have not been doing a ph test on my water. I think that so far it's been working good. It's something that I am researching though and may be looking to purchasing some ph testing meters and using that to adjust the ph. So stay tuned for that. I will do some more research before showing any videos on that process. So we're going to pour in part one of the nutrients here. It's a very dark color as you can see and the NPK on this base nutrient is four to zero to one. I should always shake it before adding part two. This part two NPK is two to three to seven. So I like to pour my nutrients into the container before I plant it up and I pour the water in so that it is just coming above the bottom of the net cup so that the roots will be able to reach that nutrient water but I won't drown them because they do need some air. So you can see here that these have a really nice root growth happening already right through the rock wall. So I just want to gently pull them down and set it up here in the net cup so that the roots will find their way through the holes here and reach the nutrient water. I'm going to put a few of the hydrogen clay balls here in the bottom just to kind of give it some stability to sit on and those roots will work their way down through the net cup and then just surround the rock wall with more of these clay balls so that keeps it stable. They also help keep the light out so that no algae will grow in your water or around roots.  The root system is very close to the bottom here so I'm going to submerse it into the container and the water will sit right about here and hopefully those roots will start to work their way towards those nutrients and the plant will really take off from there. So I just compress it in there and from there you can see it has reached the water. So these are ready to go under the lights. So I have two led lights set up here so that they're about two or three inches away from the plants. I have timers set up for my grow lights right now so that everything turns on for 16 hours and off for eight. So the cucumbers are planted up in their permanent space. Hopefully we will see some growth happening here over the next few weeks and at some point fingers crossed some cucumbers. So if you found this video informative and want to see more please don't forget to click on the subscribe button and that notification bell so that you're notified when the next video is up on the channel. Thank you for watching. Have a great day. Bye.


All right, hey, everyone. I'm Derek. You can catch me on Twitter at Derekco. So before we start, let me just tell you a bit about myself. I've been building web products for over 10 years. I did my first startup in PHP. Then after that tanked, I went. I perhaps joined the only startup which uses .NET. That didn't work out so well. And then I saw the live with Ruby. Shortly after that, I joined Pivotal Labs, a consultancy you guys are probably familiar with. And after spending some time there, I left at the end of last year, and I joined Kixend as your first employee. So at Kixend, I work on product. And I do full stack web development. That's the front of our office in Mountain View. We'll talk more about Kixend in a bit. But first let's look at some trends that's happening on the web right now. User experience is a differentiating factor nowadays. This is evident by heavy emphasis on design and user interaction. This has spent a whole pattern of single-page apps with snappy performance. Users just expect that now. Apps are also increasingly incorporating real-time elements, things such as updates, notifications, as you see on Facebook, Quora, and Twitter. These kinds of real-time features increase user engagement as well as just overall experience. Products also now have to think about having multiple clients. Like now, if you talk about consumer app, you almost suddenly have to consider having an offering on the iPhone and the Android and even tablets nowadays. So the market has responded to these trends with a slew of new frameworks and platforms. Adobe, Meteor, Firebase are real-time backends with some even provide front-ends. Meteor and Firebase combined have raised over $10 million in cash, so it just goes to show how hot this market is right now. Amber and Smine are relatively new popular JavaScript frameworks that help build these kind of rich front-end client apps. And there are many more great ones out there. So back to Kixend. At Kixend, we make it easy to send photos and videos privately from any device to anyone. We have apps across every platform, and we deliver files in real-time. So all these trends, which I mentioned just now, also apply to us. And here's a breakdown of what we use, Rails. Whatever you say about Rails, it still makes a solid API server to a rich client app. Our web front-end uses the very same API that our Android app uses and that our desktop app uses and our iPhone app uses. So there's no difference, and it keeps things consistent. Backbone is the most established front-end web framework out there. It adds structure to your JavaScript code while being lightweight, easily customizable, and flexible. Here's a rough comparison between components of Rails and Backbone for people who are not too familiar and see how the template maps to view, view, and routers to controller models, kind of like that. Backbone isn't really MVC. It's just a backbone way. Probably the closest thing to a backbone view is probably like the iOS view controller. We use handlebars on top of Backbone, which are logicless templates. They're compiled, which makes them very performant on the client side. And since they're logicless, it forces us to decouple our view logic from the actual presentation layer. We use XMPP, which is a popular short form for extensible messaging and presence protocol. Why do we use it? Well, it's performance. The server that we use is called eJab ad. It's IO bound and not CPU bound, which is what we want from a scalability perspective. It also uses presence-based delivery, which handles load really well. It's also one of the most mature real-time technologies out there. But you don't have to use XMPP. There are other services. So the quickest one to hit the ground running is Pusher, which runs on WebSockets. And a slightly less than one is called HTML5 server-side events. This has support in Rails 4 and in most proper browsers. So you should check them out. Coffee script. I know there's a lot of debate about this, but hear me out first. Coffee script is a syntax layer on top of JavaScript. It hides the quirks and nuances of JS, and it prevents common mistakes. Much like Ruby, it's fun to write in, and it focuses on developer productivity. I personally like the idea of an intermediary layer that compiles down to optimize JavaScript, which is especially useful as JavaScript itself evolves. So let's dive into some concepts and best practices that we use. We'll be looking at a lot of Rails and Backbone code, but many of the principles that I will speak of today hold regardless of the framework that you're using. A list. A list in Kixson helps you quickly send photos to groups of people you care about the most. Very simple concept. A list is backed by an API call with a simple response. It just contains a name and a whole collection of members. So when creating API endpoints like this, all your best practices still apply. They don't change. So we're talking about thin controllers, fat models, restful routes. And this even applies to your views. Your API responses are your views, and you should treat them as such. So you should have a presentation layer. In other words, don't use to JSON to generate your responses. It's like HTML in your models. It's just that don't consider using it. That means using things like JBuilder, which is included in Rails, or Rable, which is what we use. Having a layer helps you eventually. So let's say you decide to change your response down the road from, let's say, JSON to XML, or even to message pack. This layer helps you abstract that final response format. It's also really simple. This is an example, Rable response. It's pretty straightforward. Essentially, I'm declaring model attributes that I want to be included in the JSON response that's passed on to the client. All right, back to our lists. In the browser, we hit this page with a URL, much like the one you see. Note the URL fragment, list slash one slash edit. This fragment is processed as a route through the backbone router. A backbone router is very similar to the Rails RRB and that route to method map. And in our edit list route handler, we instantiate a list model with a pass in ID. This is then used to form a REST URL, which the model will point to. A backbone model basically encapsulates and abstracts all these data and interactions of your server-side API. Here's how a backbone model operation all the methods mapped to corresponding REST calls. So it's very straightforward. It's like what you'd expect. All right, as seen, a list can have many members. So we'll set up an instance variable on the model that will contain this collection of members. Backbone has no concept of relations, built-in relations, at least. So this is a technique that we use. When members get loaded into the list model, a change event is fired. We bind the load member's event handler to it, which loads the members into the member's collection instance variable. But stop for a bit and explain what the collection is. So this is a collection. It's very simple. A collection basically contains many models which you specify. You just point to the API endpoint, and it does the appropriate fetching and initialization of the internal models. A good practice is to have base collection and base models, such as you have your application controller, which you inherit all your other controllers from. And that's also where you include any helper methods. As you can see, our collection inherits from KS Collection, which in turns inherits from the backbone collection. Here's how the methods map. Again, it's really straightforward. After instantiating a model, we pass it into the view to get it rendered. Note that how we decouple our view from the model itself. Views control the interaction and state of what the users see based on the model data. They have a direct correspondence to a DOM element on the page. We like to keep our views self-contained, so they will know the ID of the DOM element. They'll know the templates that it's used to render it out. So keeping your views self-contained makes it easy for them to be reused, especially if you're nesting views. OK, so we're ready to render out our list view. And this likely depends on a couple of service-like calls in order to populate the entire page as you see here. So we want to load the whole interface progressively. On first hitting the page, we render out static non- data-binded sections of the view. In other words, just the chrome of it. We use a views render method as such, basically just dumping HTML into the page. And once the list request is completed, we fill in the list name onto the page. So basically, we bind this render list info method on the models change event, which is triggered the moment the list has been fetched from the server. And just like just before, we fill in the DOM element off the list name with the actual list name. Let's look at populating the view with list members on the left and possible list members, in other words, your friends on the right, once all the requests are complete. As seen earlier, members are collections. Collections trigger a reset event when they're loaded. So we bind them to the relevant render methods as well. As you can see here, for example, when possible members is completed, render list possible members is triggered. And our render methods are very straightforward and atomic as well. We just iterate through the collections and pendent for the page. So we'll do a quick recap of what we have covered. On the server side, Rails best practices still apply. We use a presenter layer like Ravel or JSON builder. On the front end, we talked about subclassing backbone-based objects, keeping your views atomic and decoupled, and rendering your views progressively as data comes in. So we've rendered a view as such. But how do we load it cleanly into our whole page? So for kicks and at least we have a main container, which changes during the lifetime of the app, depending on where you click. So if you click on inbox, you just fill in this main container, single-page app. As seen in our router, we load the view by just passing a view manager object, passing the view into a view manager object. So we use a view manager to manage the application view state. For starters, a view manager adds a close method to all our backbone views. What it does is it removes the content from the page and unbinds all events. It also triggers a callback on the view if one is specified. So this is where we put any view-specific cleanup logic. Every time a new view is loaded, the view manager destroys the previous view and replaces it with the one that you're trying to load. This prevents any stray bindings and any memory leaks, which are often caused by circular references in JavaScript callbacks. All right, now that we have the basics of a rich app in place, let's talk about improving performance. But take a break from our list and look at one of Kixen's main views, which is the inbox grid. You log into Kixen, and this just displays all the photos that you have received. This view is backed by the API-slash-deliveries endpoint. Each delivery pulls from multiple tables and gets rendered to JSON. You multiply this out, it becomes a really expensive call just to render this whole page. And this is only the top half. We pulled 20 of these at one time. But that said, our average response time is about 100 milliseconds. So how do we do that? Simple, we cache aggressively. We achieve that by having two levels of caching. We use, basically, memcache hooked up to Rails, very typical sec. And the higher level caching that we use is action caching. Over here, we are caching the index method, the one that you saw earlier, which is based on the current user's deliveries. We have a helper that helps us generate a custom cache key. This custom cache key is based on ActiveRecord's cache key attribute. It's available in all models, and it's basically based off the updated at timestamp. This lets us do something called key-based cache expiration, which essentially means that objects are cached based on their cache key. We then rely on memcaches sweepers to remove unused keys. We generate our custom cache key based on this on ActiveRecord's cache key of the most recently updated record, plus a total count of the collection in that query. So two index queries like this and a cache hit, and so being a lot faster than loading the entire payload from the database. The next type of caching that we use is view caching. In our case, all views are rabble templates. This is a template of a single delivery. And here is its representation in rabble, which gets generated in JSON. We specify the attributes we want to use in the delivery model. So you see like receiver type, item type, and so on. The sender, the receiver, and item are nested objects in ActiveRecord. So rabble allows us to render them in with nested templates, which is very good for code reuse. We have a deliveries template, which renders a collection of deliveries based on an individual delivery template that we specified above. Note, if you were looking carefully, you'll see that we declared our delivery as cacheable. Rabble will cache this generated response based on the delivery object's cache key. We applied the same kind of caching treatment to the user and photo templates. So every time there's a cache hit, we don't hit the database, and rabble doesn't waste time generating a response from scratch. In some cases, we have uncacheable data. So we just wrap them in another rabble object. And the static part is put from cache, as you can see, delivery base. And the dynamic part gets generated as usual. So there's still a net gain of it. If this looks familiar, it's also called a Russian doll setup to code DHH. So we'll see it in action right now. This is a fully abstracted cache state of our delivery's API endpoint. Each component of the response is cached, starting from the photo, the sender, which combined together forms a delivery. And finally, many of these cache deliveries then forms the action cache. So if one sender gets updated, its cache key gets updated, and there's a cache miss. Since the cache key of the sender object touches other objects it's related to, it expires all the related objects up the chain. Everything else is left intact. So in this case, it expires the delivery that references it and action cache that references the delivery. So basically, then closing circles. And let's say you introduce a new delivery, only the action cache expires. Rabble can then build up the action cache response based on the deliveries, the blue ones that are already encached, and saving time overall. So even if we optimize for a server side, there's still lag due to round trips from the client to the server. So we'll look at improving perceived performance, which goes a long way in terms of user experience. We always assume success. So I'll show you a quick demo. This is how you add friends to a list. As you can see, it adds really quickly, even with this conference Wi-Fi. And we can remove really quickly as well. So that's a very short demo. And I'm lucky that nothing happened. So we'll head back to the slideshow. How do we do that? So first, we bind the events to the right elements. In this case, add and remove buttons that you saw earlier. So once you click Add, we immediately add that member to the member's collection. And we bind the add event to a render, which immediately renders it before the server's call is completed. So in other words, like I said just now, we always assume it's going to succeed. So to the user, it's immediate. But we only enable the member for further interaction, like, for example, removing it from the list, only once the request is completed. So in backbone, this is determined by the sync and destroyed events. And in the rare event of an error, we have a handler to roll back the changes. So in the end, to a user, it's just a really seamless, fast experience. Moving on, it should also be greedy about loading data, especially data that users will potentially use. Let's look back at our example of a list. So when we first load the list on the page, we make a call to retrieve this individual list. We then load all the lists into an AdWide collection, since we expect users to perhaps browse back and look at the other lists. And lastly, we get all the collections that you'll use, such as your friend's list, your inbox. And that way, when you navigate to other parts of kick-send, you get a super snappy experience. In order for this to happen, you need to keep all your data in sync. So between step one and step two earlier, you have two copies of list two in your whole runtime. One as a standalone model, and one in the AppWide collections of lists. Since this global AppWide collection is used by other views, that's the master copy that we need to sync to. And we do so with a little helper that we write called sync to collection. We bind change events of the local model to the associated model in a specified collection. In this case, it's the AppWide collection. In our case, as you see here, it's just declaring the model and syncing it to the AppWide collection. All right, so recap. We improved performance both on a server side through aggressive caching, and through tricks on the client side to make things smoother for the user. At this point, we have created a really snappy front and back end for the app. And let's talk about layering on real time. We start with the XMPP server of choice. In our case, it's eJobity, which is written in O-Lang. On the front end, we have Strofe. It's an XMPP library in JavaScript. The X is an entry point to our backbone client. It communicates via Bosch, or bi-directional streams over synchronous HTTP. It's a long name. Bosch is a transport layer, which is commonly used for XMPP. The XMPP connection is open via HTTP long polling, where it essentially types messages or an XMPP language stanzas from one client to another. By the way, I just read yesterday that long polling is broken on iOS 6 Safari. So if anyone out there is using it, just find a backup. Bosch streams, which XMPP users have to be authenticated. This authentication process takes about five round trips to a server, which is extremely heavy for any client, especially if you talk about mobile clients. So a trick that we use is to pre-auth them. Using a library called Ruby Bosch, we create a pre-authenticated stream between our servers, basically our real server and the XMPP server. Since it's on the server side, and they're probably of a very fat pipe, there's very low round-trip latency. So the client then receives these authenticated credentials from the real server. And the client then hands it over to Strofe, and it uses these credentials to open a Bosch connection with eJabity. So then it's only one round-trip for client, and it also saves us from exposing the XMPP credentials on the client side. So if anyone tries to snoop around with Firebug, they can't find anything. Ruby Bosch is really straightforward to use. We expose it as an API call that the client calls synchronously, sorry, asynchronously. It's actually written by the co-founder of Kixend, and you can check it out at this GitHub URL. So once our stream is established, we must handle all these real-time events in our client app. So we do so with a real-time handler object. To get one going, we really just need two libraries, Strofe, as I mentioned just now, and XML to JSON. Unfortunately, XMPP handles everything in XML, so we need this library to help us convert into JSON so we don't become insane. Our real-time handler class is functionally similar to a backbone router. As the main real-time entry point to the app, it establishes the XMPP connection. As you can see here, session ID, session JID, all these are part of the auth credentials which I spoke of earlier. And we've gotten it earlier from our pre-auth dance. Just as we would with backbone route handlers, we attach event handlers to the appropriate types of XMPP messages. In this case, we are handling a message-type stanza called DeliveryReceived. These deliveries get rendered immediately into our views because we'll be listening on them for ad events. And so the effect is the moment the client receives delivery message received, stanza, it would just render it straight in. So that's how you get that real-time effect. And this concept of a real-time handler whether you're using XMPP or any other real-time service. So we use pre-auth boss streams. And we have a dedicated router-like interface as a real-time handler. So moving forward, there are various ways you can improve this entire stack. As a pure API server, rails can get loaded. So there are ways of simplifying your backend stack, for example, building upon Sinatra. I think Sprite is taking that approach. And the entire backbone front-end is essentially static code with static assets. We could use a static site generator like middleman, compile it down, and serve our front-end assets over a content delivery network like CloudFront, which really speeds it up for your users around the world. Another front-end optimization is to split our JavaScript into modules and load them on-demand using a library like RequireJS. But unless you have an extremely large front-end, this would likely be an overkill, which brings me to my final point. Use the solutions that work best for you. So at Kixen, we use technologies that allows us to move fast while meeting our product requirements. And when you're building a rich real-time app, don't over-engineer, pick and choose wisely. So thanks a lot, and I'm open for questions right now.


This paper proposes a novel facial expression recognition system called Distract Your Attention Network, DAN. It uses a combination of feature clustering, multi-head attention networks, and attention fusion networks to achieve state-of-the-art results on three public datasets. This article was authored by Zhenya One, Wenzheng Lin, Tao Wang, and others.