Felly, gydag i'r wneud am hynny, mae'r newydd. Felly, ydych chi'n ddweud am ymddi? Hyddech chi. Mae'r cyffredin niol Stevenson. Mae'r cyffredin niol, a'r cyffredin hynny i'r cyffredin niol, ac yn ddif ar y cyfrifau cyllid yma, yn ei gwirio cyfrifau cyfrifau cyfrofiwr, rydyn ni'n ddweud o 20 llwyfau ac yn y ddyn nhw, ychydig i'r ddyn nhw i'r ddaf yn ei gwrs o'r amser o'r ysgrifio. Yn ymddangos chi wedi'i ddweud y gynnig o'r ffordd yn Shedd, o'r ffordd, sydd y gallu ymddangos. Felly y gallwn i'n amser o'n mynd i ddeud o'r ffordd yn fwyaf dyma Cymru, a'r ddweud ar y twel hwyl gyda Zypkin, sy'n dweud y ffordd yn gweithio, i fynt o'r llei'r amser o'r ddweud o'r cyllidau cael eu cyfraddol, ac mae'r ddweud yr amser. We all have an idea of what microservices are I have never met 2 people with the same idea So as far as I am concerned, microservices are just a bit It might do a little, it might do a lot Mainly seems to be rest-based from what I see Rest and Jason has won the battle in terms of communication between services eisiau i'w myfyrdd o tîm. comments mae'r cysylltwyd wedi bod yn i gynhyrch gweithgaredd. Rwy'n meddwl oherwydd cadw'n meddwl oherwydd mae'r rhan, mae'r llun genentyd aquellydd, mae'n meddwl o transatio, a mae'n meddwl o sioiaisio. Othoedd oedd y clyfydd yn gweithio, mae gyd wedi chesgliad Caerdan i'r hotel, yn Motorunio i gynnwys i'r cardio. wedi bod yn gweithio'r gweithio, ond mae'n gweithio hwnnw o'r gweithio. Ond yna'n meddwl yn ôl y gweithio ar gyfer gwladig. Rwy'n meddwl gyda 100 euros, mae'n 50 o'ch meddwl. Rwy'n meddwl 150 euros o'r gweithio ar gyfer gwladig eir. Yma'r lluneg wef, rydym yn eu gyrdd. Rwy'n meddwl o'r cyffredin. Rwy'n meddwl. Mae ymddych chi i'w ddefnyddio gyda'r ddebydd. Mae'n gwael i ddwy'n gweithio bryd, rwyf ni'n gweithio eu cynnig ar y cystafol, rwyf ni'n gweithio y byddai'r byd. Y rhaid pethau yma yn ymddiw 3, sy'n ddiw i'n ddysgu 4 a 5, ac mae'r cyfnod dweud yn ymddiw i gael oeddaf yn llwy. Dwi'n gweithio'r cyfnod, rwyf ni'n gweithio'n gweithio'n gweithio'n ddysgu'n gweithio'n gweithio. Felly, rydyn ni'n gweithio'r ysgolwyr yn ddod yn yma. A dyma'r ddod cymorth yn y cyfle, yn ddod yn ymdweithio'r brosesau o'r ddod yn ymdweithio'r ddod. Rydyn ni'n gweithio'r bod yna'r bawr? Rydyn ni'n gweithio'r ddod yn ymdweithio'r gwyl? Rydyn ni'n gweithio'r ddod yma. Rydyn ni'n gweithio'r ffordd ymdod yn ymdod yn ymdod yn cyfnod dyma, It is free open source, you can download it from Zipcan.io, it's on GitHub. It grew out of a Google project, a thing called Dapper. The idea is around tracing. What they mean by tracing is two concepts – spans and traces. A trace is just the start and stop of an operation in and out of a method, dyfodol. Mae'r pan yn ysgrif yn ysgrif iawn'r obrill o'r perthynau, os obrill o'r perthynau, obrill o'r perthynau neu yn ddefnyddio. Mae'r cyngorau hynny yn ysgrif iawn yn ysgrif iawn yn ysgrif iawn'r perthynau HTTP. Felly mae'n gweithio'r cyffredin yn ysgrif iawn, sy'n cyfwyr, ond mae'n cyffredin mae'n gog unig i gael ysgol yw gyrddwyr gyda'r unig o'r awrig yn ei cyfriflau. Mae hynny'n i'r gweithio, wrth i'r cyflwysgol, ychydig i gael y gwaith yma mae'r awrig yn cyfriflau eich 30 sefydig o'r awrig. Rwy'n meddwl fath, mae'n meddwl gwybod. Mae'r awrig yn ysgol yma, mae'n meddwl gwaith. Mae'r awrig yn cyfriflau eich ffawr. Mae'r awrig yn gweithio'r awrig yn ysgol â'r awrig yn cyfriflau eich ffawr. Mae'r brōd yn cael i'r cyd-dweithio ar gyfer o'r ddweithio, mae'r cyd-dweithio ar gyfer o'r ydymeth o'r prosesau. O'r unrhyw ydy'r ystyried yn ymgyrchu cyngorol. Mae'r cyd-dweithio ar gyfer o'r cyd-dweithio ar gyfer o'r cyd-dweithio ar gyfer o'r prosesau. Rydym, gallewch yn ôl ymwneud, iddyn nhw'n ddysgu'r tracys, a daethwn i'r mecanosu staeth ar y tracys. A wnaeth o fe wedi bod fi ymwneud hynny'n amser. Felly, wnaethodd yn gyfryd o'r staeth o beth yng nghylchol ylai'r cyfrifol. Mae'r ffordd ychydig iawn i gydag i gael ei hoffiogion. A wnaeth yw'n dech blindfold yn cael casandra. Mae'r gwaith i'r hoffiogion i'r hoffiogion. Mae'r hoffiogion yn cael mysgol. Mae'r hoffiogion yn cael memori. Mae ydy'r hoffiogion yn cael, ond nid o'r hoffiogion yn cerddau bod yn cael hoffiogion. Mae'n meddwl o'r hoffiogion i Dev and Test, bo'r hoffiogion yn hwnnw nid o rhan o'r CVM a'r hoffiogion yn cerddau. O'r cyfnodd, mae'n ffordd yn dda i'r ffordd? Mae'n ddiddordeb yn gweithio'r projag. Mae'n ddiddordeb yn oed. Ydych chi'n ymhwyllt yma, mae'n ddiddordeb ymweld ym hynny, a'r ffordd yn ddim yn ddigon. Mae'n ddiddordeb yn oed i'r ffordd yma, ac mae'n eu ddiddordeb yn ei ddiddordeb, ymdill yma, ymdill yma, ymddill yn ddiddordeb, ond mae'r ffordd yw'r ffordd. Y dyfu honno'n meddwl a'r ffordd yw'r ffordd. Rwy'n dod yn symud o'r ysgoleth, ac mae hynny'n mynd i'r ffordd yw'r ffordd. Y ffordd yw'r ffordd yn ymgyrchu, mae wedi bod yn gweithio amddangos. Y chyfyddiad y ffordd yn y ddechrau ymddangos cyfrifio gyflyry. Mae'n cael eu bod yn ffordd ar y ddau'r Gŵr, sy'n cigfaint y gallwn gwrth ddatganiad, a mynd i'r modd y gallwn gyda jech, ond y cyfnodd dylai'r analitx ac yn cael ei wneud yn fawr ar y cyfnodd. Y dylai gyda'r gyrdd amser cyfnodd, yn ei ddweud y gyrdd yn cyfnodd. Mae'r cyfnodd yn cyfnodd. Mae'r cyfnodd, mae'n ddwylo'r ddiwedd ar y cwrs, mae'r cyfnodd yn ei ddweud yn cael eu gwneud o'r mawr, which is spread across multiple J Vms with the ability to query data, to have indexes, to run processing on data, expire research, all sorts of things that you don't generally get with Java Maps. If we look at what a Hazelcaster cluster looks like, it's a collection of processes. The key part, which I've tried to get in this diagram, is that the data is striped across the processes. Yna ymy'r llwyddoch llwyth, rydyn ni'n gwybod yn ymdannu'r app i gyda'r newid yn yr oed ac yn ddyn nhw i'r cyfrifanc ar y cyfrifanc. Mae'r llwyddoch llwyth yn yr oed yn mynd i'r cyfrifanc. A oeddoni'n golygu'r cyfrifanc yn yma i gyd已ol. Rydyn ni'r cyfrifanc yn ymwneud yn ymwneud, gyda'r cyfrifanc yn ymdannu'r brocer. Ac mae'r ystyried rydyn ni'n gwybod i ddechrau'n i'r cyfrifanc, им wedi gwneud, ondweud yn bud integeriaeth yn gwahanol i gyfrifes, ac roedd y broses ddod o'r cyfrifes zyb ac yn bwysig o ddeilogio lei, ac yn dweud fel y cyfrifes yn gweithio. Roedd yn mynd i ddygiad ddod yn cyfrifes ar y cyfrifes sydd datblygu. Mae'na gydig o'r cyfrifes yn gweithio, ond dyna'r cyfrifes ac yn gweithio. Rydw i'n golygu i bwysig yn dyfod wrth gwrs, rydyn ni'n ei cynnwys hwy oherwydd mor hwn ar gynhyrchu, ond fel y gyrfa ddechrau'r cyffredin! dau dŵr yn ffordd o'ch cyffredin yma, dwi'n dechrau'r cyffredin. Rwy'n barossaeth javau. Mae'r fan ar hyn yn benach gofyn. Ond mae'r llwyr ar amlwgfa hyn. Mae'r rhai ei fawr hyn yw yn dyrniwn yn phryg, nid ychydig rwy'n credu ffair hwnnw. Rwy'n credu gyrfa, Felly mae'r cyffredin tyddai, mae'r clywodd javau perthoedd yn cyffredin ar gyfer rydyn gyfer. mae'n gweld i'r maes i'r hyfforddiad, yw lle dyn nhw ddweud achos gweithdoedd gyrhaf y mae'r pethau ei oed air. Ydych yn gofio ar y cyflodi Gwriaethu. Dau lŎlau ddweud o mynd arbennig ac yna yw ni'r ffermwyr yn wedi sut yn ymweldill ymgyllideb a'r cyllid i'r amser ar darloedd gwyrdd yn ei ffermwyr. Rwy'r ffermwyr yn ei ffermwyr i'r diwc yma. Fyny'r rhaid o ffordd ychydig, Other than this a kind of jumble that you normally have to deal with. It's nice if you've got a greenfield where you do everything right to begin with, but in big businesses they've already got apps and there might be a transition process. So, how my application looks, I am the user on the left. I talk to the web application, which is in blue and in Cloud Foundry, which makes calls to my five microservices. I'm only running one instance of each, I don't have it, it's on my laptop, it's not enough for clustering, and those are retrieving data from Hazelcast, and then what the monitoring does is it adds an extra process for the zip-kin server, and the microservices are sending rest calls to the zip-kin server saying this is a trace, the zip-kin server is saving that in Hazelcast as well, and the UI lets us browse them. So, time for a demo. Let's hope this works on the network here, so I'm in SDS, we all see that okay, yep. So what I'm going to do is I have the zip-kin server, all these objects I will start, and while I'm doing that, I will deploy my app to Cloud Foundry. The only part I had to change today is just my IP address for my app that's in Cloud Foundry to reach outside. There's better ways to do that, but this is just a demonstration. You know, really you would want to use a config server and have all that kind of stuff derived rather than hard-coded. So let's just wait for everything to start up on my laptop. How are we doing? Everything's jugging away. So while that's going, I'll start some other processes. There's my app there. Yep, my app is there. So everything is up and running, all my micro-services are running, and my app is still deploying. So while I'm waiting on that, what I'll do is I'll go to my, I did briefly mention Hazelcast as a commercial site. I can monitor my maps on my Hazelcast application so I can have a look at my credit card authorisations. I have two on this JVM. I can look at my transactions. I'm really just able to browse map content. So what I want to do here, here's my app, is it actually started yet? Let's try it and see. All right, so my app is up and running. Like I say, it's not the best web development application in the world and that's not my thing. And when I look at my users in my system, I've got seven users. I select one, let's pick me. And then what we see is there's some operations in the background you might have seen on the console. But my balance has shown me I've got a credit limit of 100 and available credit of zero. I can click down and see, oh well, I took an Uber and I've had a pizza. And this is the one that's put me out of balance. I have an authorisations. We're not interested in the app. What we are interested in though is Zipkin. So I can go to my Zipkin server. It's picked up that it has traces for app from my spring application name. That's my top level. I can see what traces are available. If I click on that trace, I can see that that top level call to find users made a call to this, which made a call to this, this call, and this call, and this call. And if we look at that, that operation took a set amount of time. It's like there's the incoming call, there's the response. So I can trace all of what's going on. The part that matters more is the visual. You can see that the end-to-end of that operation was 1.7 seconds and that that bit didn't take particularly long, but this took a large amount of time. That's the span that the trace is underneath. So that's the part that's showing me what's going on. And I can run these operations directly. I can look at my balance from a rest call, not particularly exciting. I can look at my transactions from a rest call. So these are all the microservices. So that's the demonstration app. The app isn't important. The part that matters is that to instrument it, you just turn on sampling. So the core thing is a tool called Sleuth. So it's Spring Cloud Sleuth is the thing that's wrapping up the Zipkin call. And this is where it's sending the traces. So this is just a URL. And that's the URL that I called to browse the traces. So I can see, drill down into individual operations, I can look at Microservice 3 and see what Microservice 3 is doing, and this is where we get back into the same diagram. So if you have a hierarchy of microservices, you can add traces if you've got rest calls. And then the last piece of this is these rest calls, Zipkin spans are stored in Hazelcast. We can see that the servers are there. There are two JVMs running, storing data and mirror data. So if I really wanted to, I can shut down my service, go back to my application and it's still working because I've been cheating, I'm running another copy in that window. So I'm running a cluster of two JVMs and I've only killed off one. So that was a little bit fast through the slides, but the key part really is that this is just a dependency to add. You just add Spring Cloud Starter, Zipkin to your POM or Gradle or whatever you're using. If you've got a Spring application name, that gets tagged in, if you look in the console, finding, if I find one of my microservices, then now you can see the trace information going out. There is the microservice name. There is the trace ID, which is just a UUID. So that's how it ties everything together.  It can build up the hierarchy on the Zipkin server. So what matters is your application name in your YAML and your, here's my POM. So I'm pulling in Hazelcast, timely for my web, Zipkin for monitoring, that's it. Couldn't get much simpler than that. Could get a little simpler, but we're down to four dependencies, so it's really not that many to manage. And the part that I'm personally working on at the moment is this Zipkin storage Hazelcast. So adding Hazelcast as a storage type to Zipkin, it's still a work in progress. Zipkin is itself evolving, so this works on version 128, the current version of Zipkin 2 I'm still working on, so that will get pushed in a week or two or however long it takes me. So that's the end for today. This was just a kind of lightning cover of how you add Zipkin to applications. Very, very easy. There's lots of resources you can go and look at. The one that matters really is the Open Tracing Organisation. That tells you all about these slides are on, uploaded them to Shed so you can download them. But obviously that then you've got to log in Shed, so that's all there. The code itself is on github.com slash Neil Stephenson, that's me. If I'll stop in a second and we'll run into some questions, but if there's any question you think of afterwards, then Neil at hazelcast.com keeps it nice and easy. So that's me. Questions? So the question was, how do you set up Zipkin to use Hazelcast? So on my Zipkin server, if I look at the configuration, then all I do is add an argument Zipkin storage type equals Hazelcast. And if you're working on my build, then that creates some spring beans that Zipkin internally has an interface for storing the spans and for searching the spans. So ordinarily that goes on to something like a rows and columns database and you have to index it for fast retrieval. All that I'm doing is providing Zipkin as a client to call off the Hazelcast and I'm storing that data in Hazelcast's memory across multiple processes in a map. And I can retrieve that quickly because the maps are indexed on Hazelcast. So there's a couple of things that Hazelcast adds that are kind of useful. One is you can expire data. You can say to Hazelcast this data that I've written in, delete it after a day and it will delete it for you because otherwise your collection of traces will be enormous. It'll be run out forever and you'd have to do some sort of archiving which wouldn't be the hardest thing in the world and archiving really would mean take it out and throw it away. You're not usually interested in old trace information. This is just a thing that you can add and say let's trace what's going on in Dev and Test. And because it's HTTP protocol, it's easy to go in and out of Cloud Foundry or you don't have to mess about the routes and things. So that makes life simpler, particularly if you've got legacy applications and new applications, you're going to have that mixed deployment model. More questions? Yeah, okay. Your question is can you have it? Yes, you could do that but you would have to do it in a different way. Zipkin can only send its traces to one place so it could send it to Cassandra or to Hazelcast which wouldn't solve your problem but you can send data to Hazelcast and get Hazelcast to send it on which is what I'm doing on my database is write through or write behind on a Hazelcast map. You can attach a storage class which is responsible for every time you write into Hazelcast, write it somewhere else such as Cassandra so you would have the benefit of in-memory speed. You might expire things out of memory but hold them for longer on Cassandra and house keep them after a month. You might have today's traces in memory so you've got blazing fast access to those and historical traces for a month on disk and then discard them from there. That's how you configure the expiry. In this case it was your authorisations. Anybody that's ever done anything with credit cards you swipe your card and it just holds an amount for a couple of days until the corresponding transaction comes through. This is how we configure a map in Hazelcast. We're adding expiry. Easy peasy. Throw it away afterwards at 3600. What's that? One day? Half a day? I can't remember now. It doesn't really matter. That's an hour in fact, a bit seconds. Just as a last part, one thing around connectivity is how do processes find each other. We don't really want hard code IP addresses in 127.001 isn't a particularly scalable solution so you can have discovery plugins, you can hard code your IP addresses, you can pick them up from the zookeeper of all sorts of ways. One of the biggest challenges of Cloud Foundry is just finding where all the machines are. Somebody spins it up and that's why on my example on the front page you can get at the VCAP services and when you create Hazelcast client normally that would be inside Cloud Foundry and then you'd look up to find out where the service actually is bound to and use that IP address. More questions? We've got five minutes to lunch. No? Yeah, can you go? Yeah. If you want to run Hazelcast on Cloud Foundry you can run, let's see if the Wi-Fi is up. You can run it as an on-demand broker if you've got Pivotal Cloud Foundry so you can get ODB to spin up however many instances you care about and it'll do that by interacting with Bosch so that'll create a clustered service of whatever size you've configured for and it'll do rolling balances and all the kind of nice stuff that you want so if you're saying make some change then you take one node off the air and bring it back and then do the next one and you can do a rolling change to your cluster without ever it going off the air and Bosch is bright enough to talk to Hazelcast and say are you actually happy because it's not enough to say the JVM has started, you have to then say well make sure everything's heated itself up and it's all ready to go before you do the next one so it's fine for controlled rollout and if obviously you have a machine failure it'll start up another one for you it's no different at procedure but that's only from version 1.8 onwards which shouldn't really be a problem what are we on now, 110, 111 and then you can define it as a user in use cups and you can make your own Hazelcast service and then you need to be able to create instances off that service and then it's just a binding between the client and the server so that's that part's easy user provider service is a bit fitly but once you've done it once you just copy it and paste it for the next one so it's really not difficult to use the the pcf tile thing is just an enhancement makes it very very simple but if you're coding it by hand it's not the hardest thing in the world because it's you know Cloud Foundry foundation silver members it's like we're not honed in on Pivotal it's like Cloud Foundry runs on Cloud Foundry you've got BlueMix or any other then we're fine with that the end of the day Hazelcast is just a java process you run it inside a spring boot deployable java file trivial okay um oh one more question yes i didn't quite hear your question you're asking can when Hazelcast connects to an external store yeah i'm still not 100% sure i'm following your question but basically if an external store is only external to Hazelcast if it's internal Cloud Foundry all that really matters is the connection string information so you know what's the ip address what's the logon password if it's like a you know if that was like an up my sql instance running inside Cloud Foundry you should be able to connect to that as long as there's no kind of um the problem really is the network roots if you're outside trying to connect inside and tcp gets blocked or all that that's the the the difficulty it's not insurmountable it's just a bit fuss if everything's inside then it's a lot simpler because Cloud Foundry is just looking after the boundary okay i'm done thank you everybody enjoy lunch


Breast milk is the gold standard that cannot be emulated. It is the perfect food for your baby. Breast milk provides antibodies and protective factors which may fight against COVID-19 should your baby be exposed. Breast feeding reduces the risk for premenopausal, breast and ovarian cancers. Breast feeding is the most natural way to feed your baby. Breast milk provides all the nutrients your baby needs for the first six months of life. It requires patience, however, your baby deserves the best and it's worth the effort. Breast feeding a baby up to 12 months improves jawbone development, thereby reducing misalignment of the teeth. Breast milk is baby's first immunization. It protects against viruses, bacteria and also prevents some chronic diseases.  A woman with COVID-19 should be supported to breastfeed her baby safely. Hold her newborn skin to skin and share a room with her baby. After giving your baby only breast milk for the first six months of life, you can now slowly start introducing solid foods at the right textures. These include pureed vegetables, fruits, peas and healthy cereals. For more information, call the Nutrition Unit of the Ministry of Health and Wellness at 468-5359.


Income tax 2021-2022. Software example. Earned income tax credit, the EIC with three qualifying children. Get ready to get refunds to the max. Dive in into income tax 2021-2022. We'll assert tax software. You don't need tax software to follow along, but you might want to have access to the forms and schedules, which you can find on the IRS website at irs.gov, irs.gov, starting point single, file or Adam Smith, living in Beverly Hills 90210. We've got the three dependents, which will all be qualifying children for the calculation of the earned income tax credit, which is our focus here in prior presentations. We talked about having no qualifying children, then one, then two, now we're at three and above, because if you go on above three, you're not getting any more benefit with regards to the calculation of the earned income tax credit, as we will see here. We're then starting with the income level at the $19,549. Unusual number. We'll explain it shortly. We then have the $12,550 for the standard deduction. The taxable income at the $6,999. The tax calculated then on page two, online $16,698. And then we're focused down here on the earned income tax credit, which is currently maxed out at the $6,728. We also have the refundable child tax credit. These things kind of get co-mingled together because they're both refundable credits and they are dependent in part upon the dependents and the qualifying children for the respective credits. We can see the fact that this is a refundable credit because we only have tax owed of the $6,98, and we don't have any payments that we put in place here and we're getting this big refund back, which really isn't a refund in this case because it's not reflecting a refund of an overpayment, but rather kind of a benefit type of program. That's kind of what it means to be a refundable type of credit, these two being the biggest two. Our focus here focusing on the earned income side of things. So the first thing that people often ask is going to be, well, do I qualify for the credit? And you often can look at tables to see where the maximum income levels are for three or more down below here. So if your income goes above $51,464 for non-married, $57,414 for married, you lose the credit. But we also want to know where the credit is maximized at, and this is the maximum credit for any number of qualifying children because three is the maximum that gives you any benefit. So if you have less than that for qualifying children, then the maximum amount you can have per qualifying children would be lower than that. If you have four children, as we'll see, the credit will not be going up above that. So the maximum amount of the credit is the $6,728. Now as you can see, we have then the income at the upper threshold of the $19,549. Here you could find these thresholds on the instructions to the Form 1040, looking at the Earned Income Tax Credit Tables, and we're down here at the end. So we're with three or more, and for the single or non-married, and we're up to the upper threshold, not for the non-married, the upper threshold was the $19,550 to get to that maximum amount. So that's the upper threshold of the income level. The lower threshold, we can go all the way down without decreasing the credit to the $14,950. So if I went down, for example, to the $14,950, $14,950, and then I go back to my Calculation Page 2, then we're still at that maximum amount here. What if I add another dependent, another qualifying child? It shouldn't have an impact. Let's test it out. Let's say I add another dependent, and we have four. We have four dependents now. We're going to say another dependent has been added, and so now we've got four on the books, but it caps out at three. They're all qualifying, and so they should be. Hopefully, I have that correctly calculated, and it still caps it out at three here, and so three or more is the cap on that. So then I'm going to go back on over. If I change my income to the lower threshold, which we did, if I go below that, then my credit starts going down. So if I bring it down to $10,000, for example, then the credit goes down. If I bring it down to $7,000 for the wages, then the credit goes down. If I bring it down to $5,000 on the wages, the credit goes down. If I bring it down to $2,000 on the wages, the credit goes down, and if I go down to like like a hundred dollars on the wages then the credit is going down. If I bring it back up to the maximum amount the income level at the fourteen nine fifty so I'm gonna say what if I bring it back up to the fourteen one four nine five oh one four nine nine five oh bringing it back up then we're at that maximum again six seven two eight I flatten out at that maximum I could stay at the maximum all the way up if single to getting up to the nineteen five four nine so I can bring it up to the nineteen one nine five four nine and we're still at the max if I go one dollar above that nineteen five then we're we've we've gone back down actually no I'm still I'm still there hold on a second we've got we've got page two the the six seven let me check it out again we're at oh I'm sorry it's the nineteen five fifty then it starts to go back down and then if I start going up above that say twenty five thousand then it starts to go back down so we've gone past the threshold thirty thousand then it's going back down if I go to thirty five thousand thirty five thousand then it's going down if I bring it up to forty thousand forty thousand then it's going down if I bring it up to forty five thousand then the credit is going down if I bring it up to fifty thousand then it's getting quite low and if I bring it up past fifty one five about then the credit has been has been removed. Okay so now let's imagine that that we had a low income that was below the threshold of like that five thousand and so that would be a lower a lower amount here but we had 2019 income so now my income is only five thousand I'm not maximizing out the credit I need more earned income I could look then to 2019 not 2020 but back to 2019 possibly making an election if that year was greater so I can go back on over let's do that again 2019 I could say let's make the election to use 2019 income and say this was let's say here it was at the the 19,000 of income in 2019 so now I could go back on over and I'm back up to the max because I'm using 2019 income even though in 2021 I only have five thousand which would be a lower amount so you could test out 2019 income let's remove that and that brings us back then to where we were before and the other thing is that combat pay that could come into play so we might have someone working in the military where they get paid combat pay that then let's say this was combat pay would be on box 12 with a Q in it and it wouldn't have any money in box one let's say that was the nine thousand then if I go back to the to the first page that that nine thousand isn't being included in income that's the benefit of combat pay we're not going to charge taxes on it is the general idea but it's it's not being included for the earned income tax credit it would be beneficial to include it for this calculation so if I was to say could you please include that combat pay for the EIC calculation then we get a higher amount here because the combat pay is now being included even though we're not being taxed still on the combat pay so you can kind of get the best of both worlds in that event with the combat pay okay let's bring it back let's take the combat pay out let's bring it bring it back up to that maximum amount which was the nineteen five four nine so nineteen five four nine and so that is going to be our maximum credit amount here and then we're going to imagine getting married now so now if you got if you got married you can imagine the situation of getting married to someone who has no qualifying children it doesn't really matter how many qualifying children the other person has because because you can't get any more benefit whether single or married past three as we saw so we already have four here if we only have three qualifying children and we got married to someone who has zero then it would still be at the three if they had one it would still be a three so it doesn't really matter how many qualifying children at this point for adam with regards to the earned income tax credit if they if they married someone else which is kind of interesting because you can imagine two people who basically are maximizing out their credit let's say you have two people that both have three or more qualifying children and let's pull out the trustee calculator calculator let's do some calculations and let's say that they were maxing out the credit at the six seven two eight and they were both single times two you would think they would both be getting a benefit then between the two of them of the thirteen four fifty six which is pretty significant and then if they got if they got married then you'd have double the income and again you wouldn't get any more benefit other than the three the three qualifying children so let's say they got married then and say now we've got married people and then the income is going to be for between the two of them let's say it was nineteen five forty nine so they're both on the upper threshold to max out the credit at single and then so now we're at the thirty nine uh ninety eight and the credit is at the three thousand eight sixty two which is you know significantly could be significantly different than if they you know significantly lower possibly and then if they if they both filed kind of single and obviously if you got married to to someone that earns something that would take us over the threshold the threshold being fifty seven thousand so if they made if they made like thirty thousand or let's say uh thirty five thousand let's say uh thirty eight thousand then we'd basically that would be at the fifty seven five forty then you would have someone that would be that would be taking us over the threshold and we wouldn't get any benefit in that case so it's just something to keep in mind because that you know that could be a significant that could be a significant change okay so now let's just take a look at the income levels so if I look at the married couple and say they're married where could we maximize out the credit if married well the upper threshold if married to max out the credit is down here at the twenty five twenty five four ninety nine i believe so if it was twenty five four ninety nine we could go okay income twenty five four ninety nine going back on over so there is our our income for three or more maximizing out because three is the max and we're at the maximum of the six seven two eight we could go as low as with the income can go as low as as we've seen the fourteen nine fifty so i can go all the way down to the fourteen nine fifty one four one four nine five oh and we still have then the maximum credit if i go below that then the credit starts going down so if i bring if i bring this down to ten thousand then the credit starts going down if i bring this down to seven thousand then the credit starts going down if i bring this down to four thousand then that's forty thousand that's different that's like an extra zero then the credit goes down if i bring this down to two thousand the credit goes down if i bring it down to something to like zero the credit goes down to zero let's maximize it back up again if i go back up to the max it's got to be at the fourteen nine fifty so i'm going to go back okay fourteen nine fifty that's the low end of the threshold to max out the credit and then again it goes as high as i could go as high as where it stays at that flat area to the twenty five uh twenty five four nine nine twenty five twenty five four nine nine there i'm still at the max if i go one dollar more twenty five five hundred then it starts to go back down and then if i keep going up to thirty thousand thirty thousand then it's going down if i go up to thirty five thousand then the credit's going down if i go up to forty thousand then the credit's going down if i go to forty five thousand then the credit's going down if i go to fifty thousand then the credit's going down if i go let's do two more times fifty five thousand then the credit's getting pretty small and if i go above the fifty seven four twenty about then the credit has disappeared entirely so that's a general idea of like kind of the curve you can keep in mind


Good afternoon, everyone, and welcome back. We are having a speech today with James Blair, your speech on REST APIs. So could you give him a warm welcome? Thanks. I'm here to talk to you about console apps and why I'm so excited about them as well as REST APIs. And as was recently pointed out to me, they are not the same thing. We'll be covering both of them in this talk. So I'm going to do that by talking to you a little bit about a program that I recently called GERDI. And to give you a little bit of background on that, I work for a Silicon Valley startup running the developer infrastructure for the OpenStack project. And as part of that developer workflow, as you can see, it's illustrated here and it's exceedingly simple because I drew it that way. And also in the middle of the screen, because I drew it that way, is a tool called GARET. And GARET is a standalone code review tool written by Google for the Android Open Source project. And it looks like this. This is a screenshot of GARET. This is not actually a screenshot of GARET since GARET is a web application. And I don't know if you've figured out what's going on here, but this is decidedly a text-based presentation. But if you've ever used GARET, you would probably agree that this is pretty much what it looked like, especially if you used it when we first started using it. Honestly, we kind of had to really try to love it. And in GARET's own authors admitted that UI design wasn't really their cup of tea. They were more back-end folks. So we made some changes. So this is what GARET looks like now. These were actually so well-received that if you install any GARET, they pretty much all look like this. We added the open stack colors, and they said, wow, those are great colors. We'll use them.  But we were never really able to upstream some of the larger changes that I wanted to make, changes around workflow and how developers actually use it. But then GARET continued to evolve, and they produced this REST API. And it turns out it was rather fully featured. I took a look at it and realized that almost everything that you could do in the GARET web interface, you could do with their REST API. And so I thought, well, maybe I'd have a chance to address some of these longer-term, larger concerns in GARET without having to try to convince them to change their application in ways that they weren't prepared to. So I had sort of four big reasons that I started working on GERET. And one is around the workflow. I'm one of the more active reviewers in the open stack project. Bizarrely, I don't actually review any open stack code, but fortunately that doesn't matter. And I always wanted a workflow that was a little more akin to email. I really like email. This is a screenshot of my email client. This is actually a screenshot of my email client, because my email client is in Emacs and it's all text-mode-y. And that sort of workflow, like the zero inbox workflow, where you've got your messages going into an inbox and you try to dispose of them all in one way or another, whether that's answering them, deleting them, something like that. That's a workflow, a way of surfacing the emails that you need to read. And that's what I wanted to get out of GERET. These are changes that I haven't reviewed yet. I need to do something with them. Review them, ignore them, but do something. And so I wanted to build that kind of workflow and it was rather hard to do that with GERET's standard interface. And the reason why I keep comparing this to email and also news groups, I should say, my email reader is also a news reader, so I kind of think they're the same thing. And I don't understand when people talk about them differently. But we have all of these tools for dealing with massive amounts of incoming data, tasks that need to be done, things like that. There's a lot of tooling and processes around that with mail and news, it's very mature. And I just wanted to be able to apply that kind of thinking to code review as well. Another reason that I thought that this was important to write is some of us, for some reason, end up spending a lot of time traveling around talking at conferences or something. And so if... Yeah. Well, so yeah, if this is where you live, or even better, if this is where you live... That's a good thing. Then... I have not achieved your level yet, Bradley, I'm sorry. So if you're traveling around all the time, then Gertie is for you. I wanted to be able to have a system that we could do code reviews offline. We can write code online. We can write... Sorry, offline. We can write terrible code sitting on a plane and I don't know... Yeah, I usually do, and land and push it up and make all of our friends review it. And meanwhile, they get out of reviewing code because they can't do it, they're on a plane. So I wanted to remove that excuse. I mean, I wanted to allow everyone to be able to participate equally in all of the processes. And so I wanted to make sure this thing worked offline as well as online. So it turns out that being on an airplane and being on a slow part of the Internet are really just two versions of the same thing. One's an extreme, the other one's elsewhere on the continuum. So it's just different amounts of latency. So here's a schematic map of the Internet submarine cables. And if you happen to have a server located in the top left of that and you're located in, I don't know, say the bottom right, then it turns out that actually being able to reduce that latency in some ways is very important. And to my delight, some of the earliest contributions to Gertie's efficiency, as far as that goes, came right from here. So in fact, right there. So to address both of these issues, what I did was I could have written an application that directly used the REST APIs in Garrett. I could have synchronously had it post reviews or whatever. But instead, what I chose to do is to have a local database of all of the changes and then a background process that keeps it in sync. And so if you're online, that's very quick. You can post a review, it's going to immediately send it up, and if it realizes that it's offline, then it just saves it to its database and tries to catch up the next time. So there's a local SQLite database to accomplish that for all of the change metadata. But for the changes themselves, I had the choice of, of course, ask Garrett for a whole bunch of diffs and put them in text columns in the database or something like that. But it turns out Git is already a distributed system. And so I realized that what I could do is just point Gertie at the Git repos that you would normally use for development anyway and have it sort of behind the scenes without changing your working tree or anything. Have it download those changes into your Git repositories and it can then generate its own diffs on the fly for whatever combination of patch sets that you wanted to have it do. As a side effect, that meant that suddenly we actually get an opportunity to do things in Gertie that we would never be able to do in Garrett, such as bind a keystroke to check out this change into my repo or cherry pick this change onto the top of the current branch or something like that. Because while it's great to review code online and leave comments, that's an important part of it, occasionally you want to check something out and grep to make sure that somebody didn't miss something or actually run the change assuming that they didn't put a root kit in it or something. So just the ability to tell Gertie to check this thing out locally and do something with it is something that I think is really neat that we would not have been able to do in the web application. So those are all good reasons, I think, to write an application like this in the first place, but why did I make it a console application? So I think code review is text, or sorry, code is text. And over the past 30 years we've been developing some really fabulous tools for dealing with text, including the terminal. And I think that if you're dealing with that kind of information you should use the best tools for the job. So when I was a wee little lad, a company called Digital Equipment Corporation which should never ever be confused with the company that I work for currently, released something called the VT100, and to this day it is the terminal that terminal emulators are emulating. But fortunately things have come along a little bit since then. It's not the same as it was 30 years ago. We have, of course, mouse support and colors. In fact, quite a lot of colors. Honestly, I didn't even realize this when I first started working on this. 256 color terminals are pretty common now. Full RGB terminals exist as well, and frankly I didn't even realize that until I started writing the program to display these slides. So there, in fact, terminals are so sophisticated now.  So here we are above Queenstown. Here's the Maraki boulders, Lake Wakatipu, the Kauora River. I mean, look at that color, right? That's the color of it, right? The Rootburn track, which is amazing. Cathedral Cove. Another, this is up here on the North Island, of course. This is another shot of Cathedral Cove. I'm there on the left. And Lengahangi on Waitangi Day. And Bethel's Beach, which is not too far from here, and I highly recommend it, though it's not generally that warm. So clearly this has gotten off track a bit. So let's talk about something that's actually in the title of the talk for a bit. Rest APIs. So an API, this is what Wikipedia has to say about it. I think we all think we know what an API is. It's some stuff that helps you do some stuff, which is sort of the problem with it. It's a little vague. It's maybe it's a library, maybe it's a protocol, maybe it helps you interface with a running process, a data storage system, a physical device. It's some stuff that helps you do some stuff. Maybe we can get a little clearer with what rest is. Fortunately, rest was defined in somebody's, a dissertation from a guy named Roy Fielding. And so he says that you need these things in order to have a restful application. You need to have a client-server relationship so that they can be developed independently. That's clearly germane to what we're talking about here. Stateless. So you should not have client context stored on the server and used between requests, which doesn't mean you can't have any state whatsoever. It's okay to maybe store it in a database and have the client refer to that state or something like that. There are ways around issues there. Cacheable and layered system, those both kind of relate to the idea that let's say you're building the worldwide web, you should expect to have proxies and other intermediary systems between your client and your server and they should be able to fit into this thing and understand enough about what's going on to do their job as far as caching and whatnot goes. Code on demand is an optional requirement of the REST API. Basically, as far as I can tell, that's there to sort of account for JavaScript. The idea is that your server can give code to the client that it can run. This is not required for a REST API or an application to be restful, but it can be there. If the system doesn't support it, it should gracefully fall back to not needing it. Then things should have a uniform interface which gets its own slide. That includes identification of resources. Basically, everything should be uniquely identified in some way. Typically, this is through a URI. The manipulation of those resources should be changed by changing their representation. If you fetch a resource and you change something about it and you put it back, that's how you manipulate something described by a REST API. Self-descriptive messages. Again, just sort of falling back on the idea of the worldwide web. This basically means things should have mind headers so that the client knows what to do with whatever kind of response it gets. Then there's this thing called hypermedia as the engine of application state, which basically means that all of the state transitions should be described through hypermedia, which doesn't necessarily mean hypertext or HTML or something like that, but it just means it's the idea that say you had a cloud API that describes a server or something, it should tell you all of the things that you can do to that server using hyper-references to other locations. The idea there is that clients should really only need to be able to understand the structure and then they can be dynamically extended to perform new actions. If you've been following along, you might be thinking about the REST APIs that you've seen and which of these things I've talked about they don't have. Honestly, I put this one at the top of the list. This seems extremely rare to me. If you look at the whole list, here's what you need to be a REST API, which curiously has one X missing from its optional requirement. Then going back to say you want to write an application like GERDI over on the right, that's what you need to make a third-party client. You need a client server. You need to be able to identify resources. Everything else that you can get on that list is helpful. Honestly, if you're writing a REST API, you should try to make it as much of a REST API as possible. It's a good idea and it's going to help people using your API. From my perspective, this is the bare minimum that you need. In fact, there's one thing that you don't need code on demand. If Garrett required running JavaScript in order to do something, I would not have been able to write GERDI. That's a strange thing to do. Enough about that except to say that if you want to get some beer and talk about whether there ever has been or ever will be a RESTful application other than the World Wide Web itself, I'd be happy to engage in that conversation with you. Going back to what an API is, one of the things that the Cal said that an API could be is a protocol. This is what Wikipedia has to say about protocols. When you think about it, actually a lot of REST APIs are very little bit more than just a thin layer on top of a communications protocol, which is great. There have been a lot of good protocols throughout history. I'm going to highlight a couple that I really like. This one is being picked on a lot lately, but I really like it anyway. It's IMAP. You can type text into it. You can tell that to it or use open SSLS client or whatever. It's got tagged responses so you can do asynchronous things and it'll tell you which thing you're responding to. It's got lots of annoying parentheses, which is unfortunate. It's not perfect, but it's interesting. SNTP, I kind of like this too. It's obviously very successful. It may not be as successful at what we want it to do as we would like, but it is. This is something you can tell that to the port and you can type help and it'll tell you what to do, though I'm told that can occasionally be problematic. Let's look at HTTP and JSON APIs. This is sort of what people are doing now for protocols. It still almost as easy to use. You can't tell that to the port and type nice neat commands, but hey, you can. It's a lot of typing. It's a lot of typing. You can use these curl commands, which make it a little nicer until you're starting to tell curl which extra headers and to attach the binary data and stuff like that. It gets a little squirrely. It's not quite as easy to use, but it's not bad. What it lacks in sort of online debugability, it makes up for in parsability because JSON is pretty awesome. To be honest, if IMAP returned JSON blobs or something, that would be swell. That would be way better than parsing all those friends. We're getting to an interesting place though with things like web sockets. A lot of the reasoning for creating these APIs using HTTP the way that they have been so far has to do with the way web requests were made from client applications. Now that we have things like web sockets and a lot more capabilities in JavaScript applications, I think we can be getting to a point where instead of making HTTP requests and getting JSON blobs back all the time, we could actually be streaming interesting data back and forth on web sockets, probably still in JSON. But imagine that instead of doing get or post requests all the time, you're actually just sending little commands to a server. It sends a JSON blob back. You could do that inside of a JavaScript application. You could do that with a client that isn't related to a web browser at all. I think we're actually getting to an interesting place as far as that goes. Toolkits. We're talking about console applications. When I was looking at how to write KERDI, I like writing in Python. I looked at a couple of different toolkits that I could use in Python. There's NUT, which is venerable. It's been around for quite a while. It's a little thing when you install Red Hat, it pops up little dialogues that ask you questions. There's apparently a Python library called Snack to help make that easier. I honestly don't know how well this is maintained at this point, so be aware of that. There's a neat thing called inpy screen, which I might have even used if I found it when I first started working on KERDI, but it's actually very new. And it's a really great toolkit for... I want to present a form to a user and have them enter in some data and then retrieve that data from it. So if that's sort of what you're looking for in the console application that you're writing, you might want to check that out. There's something called curtsies, which is far simpler than that. Actually, it basically aims to be a nice way of dealing with a terminal, but maybe not focused on form inputs or complicated applications or things like that. What I ended up using is a system called Erwid, which is more like an application framework. So if you're used to writing a GTK or a Qt application or something like that, you might find Erwid somewhat familiar. I did it first. So it's really designed for this sort of long-term event loop kind of application where it's like you build things out of widgets, you display them, you get some input, then you do something else. So this is sort of the Hello World application in Erwid. The interesting bit is actually at the bottom and you create a text widget with some text in it. You put it in some kind of a container and you tell the main loop to display that container. And then that function at the top gets passed keystrokes. And so if you hit Q, it exits. If you hit anything else, then it just changes the text in your text widget to be something else. And so with that introduction, I'm going to show you a quick little demo of Gertie. And there we go. So sorry, the type is a little bit smaller on this, but I'm going to squeeze some stuff in later screens. So try to bear with me. The words aren't important. So when you start out with Gertie, it's got this list of projects that you're subscribed to. So think about email again. And it tells you how many open changes there are for every project and how many unreviewed changes there are. As you can see, I've not been doing very well on reviews here lately. I've apparently been flying around or something and writing this talk. But you can see this is equivalent to these are how many messages you have in this folder or whatever. And the terrifying thing about Gertie is it tells you actually how far behind you are. So if you click on that, it shows you all of the open reviews. And this is something that I was working on right before I left and not many people have seen it yet. But look, threading, like email, right? So you can see all of the outstanding changes that you have to review for this project. And you can click on one of those and it brings up a change screen, which is in spirit not that different from the screenshot of Garrett earlier. But notably, this is text and that's on the web. So it shows you the information about the change. It's got a table of the reviews, so sorry, information about change, people who've reviewed it, the commit message, all of the results from our extensive test system. And down here we've got comments that people have left on the change in general. Right here it's got the files that have changed. There's only one. I maybe didn't pick the best thing to show you. And with a key you can have it show you a diff between the two. So here's the old and new side and you can hit enter and leave comments, et cetera. And let's see what else. So there's, you can have, pop up, whoops, sorry, pop up dialogs. And the mouse works, right? So if I click on the diff button, it'll go back there. So basically all the modern conveniences, these are also links actually. So if I go over here, these colors aren't great. But if I click on any of these, it'll open a web browser to that, which obviously doesn't work so well on the plane, but there's only so much data that you want to download. So anyway, that's what Gertie looks like and that's briefly what the sorts of things that you can do with Erwid. So going back to the slides. Oh, sorry. So if you think about the screen structure I just showed you, there's, you can imagine building that up out of boxes, right? Every system has a box model, whether it's CSS or tech or Erwid or GTK or whatever, everybody has a box model. The only problem is that everybody's box model is completely different. And everything that you learn about how to work with one doesn't translate to any of the others and Erwid is no exception. But the pile is your typical vertical container. The columns are your sort of horizontal container. The list box is your scrollable vertical container. There is no scrollable horizontal container because I guess people don't want to do that in terminals. Seems reasonable to me. And so forth. So that's sort of how you build things up out of boxes. But again, the behavior of those seems straightforward at first, but when you get into the nitty-gritty, it turns out that you're probably going to have to learn some things about the specific behavior of some of these widgets in Erwid. But fortunately you can, if anything's not to your liking, it's actually pretty easy to change. So in writing GERDI, I ended up subclassing a lot of the widgets in Erwid. So for instance, if I wanted a button that did not expand to fill the width of its container, this is all you have to do to do that. So it's just a button that reports its dimensions differently when asked. So it's pretty easy to do that sort of thing. There's one more consideration that I think is important when you're working on a console application. And that's visual design. So if you think about web design right now, we're kind of coming into this phase where there's lots of boxes and solid colors. Like if you think about the material design guidelines from Google and what those look like, that's sort of what things are looking at right now. In the past there's been boxes with lines around things. That's obviously a perennial favorite in desktop applications. These things sort of change over time. They seem to not change very often in console applications, which is nice and refreshing. Mostly our tools for sort of creating a visual layout to sort of indicate the relationship of information to each other. They're kind of limited to color and space, which is nice. It's part of actually why I enjoy using console applications. So if you look at this, there's no graphic structure here. There are no lines or anything to draw your attention or separate different areas of the screen. What I'm doing there is I'm changing color and using positioning to indicate that. So there's clearly a box of information at the top with key value pairs. There's a table underneath that. There's a list of some files. There are buttons. There's comments from people. All of that's communicated via color and space. Once you use this a couple of times, you pick up on what the patterns are and how to narrow in on what you're looking for fairly quickly. If you look at the same thing without any color, it's rather difficult to navigate. So one of the things I've spent a good deal of time on in GERDI is working on those color and space relationships, and it's fortunately quite enjoyable. So to sort of summarize, console apps are cool. They're fast, efficient, customizable, and modern. That's the link where you can find GERDI, and that's a link to the Erwid project where it actually has great documentation, by the way. So you can find all of that there. And with that, that's all I have. And there are some questions. What are your slides written in? They are written in a program called Presenti, which you can also find on PiPi. You write the text in restructured text. It supports cross-pades, PANs, cut transitions. It'll shell out to figlet and calcay for you. If you use dot-dot-image-colon, which, incidentally, if you're using a restructured text system to do web-based slides, often those use the image command in restructured text to include an image. If you do the same thing in Presenti, it'll shell out to jpeg2a to do the ASCII art conversion for you. Any other questions? So you're obviously an Emacs user because you had good news on a slide. I'm curious if you investigated writing it as Emacs, because it seems like Emacs is the place where console people have gone to hide mostly. Certainly I have. Okay, roughly 50% of the console people have gone to hide in Emacs. And as an Emacs user, did you think about doing this? It was just because we all hate Emacs most, even those who love Emacs? Or was there another reason? This is more of a personal reason. I actually would have loved to spend the time to do it in Emacs's list, because I enjoy writing a list. But I'm not good enough or proficient enough at it to do all of the things that I knew that I would need to do with GERD. Not only the network stuff, but the local data storage things shelling out to get all of... There's a lot there. And I wanted to stop using the web application as soon as possible. I guess one of the really great things about the command line is the key bindings as well. Is that supported in Erwitt? Or is it hard to implement? Yeah, so I made customizable key bindings in Erwitt. In Erwitt itself, it's pretty easy to do. You just... You supply a function, and whenever a key is hit, it gets passed into that function, right? And then what you do with that is up to you. So right now what I have is... I just have a table of key bindings to commands that you can change in the GERD config file. And so you can make your own customizable key bindings for that. I need to make it a little more sophisticated so that you can have two-level things so that you can hit Ctrl-X, Ctrl-something, or colon-something, whatever your preference may be. And actually, it might be good to do that in some sort of generic way that other Erwitt apps can use. I actually had two questions. The first was, at the beginning of your slides, you mentioned being able to work offline, working from airplanes and things like that. And I know, barring the conversations we were having earlier about having Wi-Fi on flights, is there any capability of using this to do some things you might not be able to do with just the Garrett Web Interface? And the second one is... I know we all like black background down white text, but is there also a light option? There is a light option. I think it's dash-L or dash-light or something. I have no idea. I wrote it, but I didn't produce it. And Presentee has that, too, by the way. As for the first question, there... Well, I mean, there's a lot of things that we've done in GERD that you can't use in doing the regular web application. Just as far as the things related to offline use, despite being online, there's the latency issue, right, that you're not waiting for the round-trip HTTP traffic or whatever. And because... If you go back to, like, user interface guidelines, 200 milliseconds is about how long it... If you press a button and something doesn't happen within 200 milliseconds, it starts to feel like you didn't actually press the button. So having... And occasionally, web apps can't actually accommodate that because of all the overhead of doing that back and forth, especially depending on where you are. So what we have is an application that's always responsive, regardless of what the network is like. And so it's actually... It feels a lot better as a user because if I'm reviewing changes all day, the amount of time that I spend waiting for the web app to do something... And I'd work around that by doing things like opening a lot of tabs. Like, here's a list of changes. Okay, open them all in a tab so that they're all loading in the background, which is kind of silly. So here's an application that's always responsive. Or at least if it's not responsive, it's because I can't write SQL queries. When you were thinking about the things that you wanted to accomplish within the console client, was there anything that you couldn't make work with the constraints that you had to significantly change from your original idea? I think all of the big things were in there. Just the usual sort of, wow, this thing ended up being a lot harder than I thought it should be. The hard things ended up being easy and the easy things ended up being hard. The fact that all of the diffs, they show up as one continuous stream, so all of the different files just show up one after another in the diff screen, which has been the most requested feature from the Garrett web interface forever, and it doesn't have that. So apparently that's hard to do in the web interface, but it would have been hard to do in Gritty, and that ended up being easy the way that I did it. So just that sort of thing, and the occasional fighting with, I think that if I put these two widgets into a container, they should behave this way, but it turns out that they don't, and you have to go debug that sort of thing. Any major concessions on the big features. How do you deal with conflicts after being offline for a long period of time? Log them to an error log that nobody reads, and hope it works out. So most of this is append only, actually, so it works out pretty nice, right? You can never delete your comments in Garrett at all, so generally all you're doing is you're leaving comments on things, and you're leaving more comments in addition to that, and all of the comments are directed toward a specific patch set, so if people upload new revisions of it, even if that happens while you're offline, your comments are going to go to the patch set that you actually reviewed, so that works out. The only thing that might substantially change is if you leave a vote on a certain patch set and it's been updated, then your vote won't be counted anymore because it's not relevant. So the good thing about that is that you're never going to approve a change while you're offline, and then accidentally have it approve something other than what you really approved, right? Because that's an invalid condition. It'll end up that you will have left a comment on an old patch set, and you'll just have to go back and look at the new patch set again once it's there. There are some things that we might want to do. We've had folks say that if I leave a positive review on a change and somebody else leaves a negative review while I wasn't looking, I would like to find out about that because maybe they're pointing out something that I missed and I'm going to look stupid, but those are actually conditions that'll be easy to detect, and once we stop doing things like logging important information in a log that nobody reads and instead surfacing that up to the user interface on the screen, that'll actually be pretty easy to do. Very good. Well, that's all we have time for here at the moment, but could you please welcome... Oh, before that, please take this. So thank you from everyone on the team. Thank you. And please thank James for his speak. He's a lovely pair, isn't he?


In a bid to encourage education for the less privileged, a senatorial candidate of the Labour Party in southern Cardona, engineer Mike Outa, has offered scholarships to 115 students of tertiary institutions across the 23 local government areas of Cardona State. Speaking on his behalf at the National Association of Polytechnic Students Symposium, his representative said the aim of the scholarship was to boost students' morale to study and contribute to nation-building. Engineer Michael Ayouba Outa has done a lot in renovating and putting, you know, to ship some of these new hostels, because not only, you know, the Polytechnics, Federal Polytechnics, State Polytechnics, Colleges of Education and other institutions, is it. Now the actual figure put together was at, you know, 62,000 initially when they did their maths, but however, he decided to cap it up at 70,000 parts to student. Over eight million, according to him, in his own words, this is something he's been doing and he's going to unveil the next phase. Symposium is all about how we can advance our tertiary institutions to 15th, the 21st year. Hello, hope you enjoyed the news. Please do subscribe to our YouTube channel and don't forget to hit the notification button so you get notified about fresh news updates.


Yeah, let's talk cricket, West Indies regional four day championship with tournament that's going down to the wire to decide the champions of the 2024 season. And the final round started today with matches in Jamaica, Trinidad and Tobago and Antigua and Barbuda. Before we go specifically to the matches though, let's have a look at the points table because just six points separate the top four, entering the final round, the Winner Islands volcanoes leading with 90 points, Barbados pride 87.6, Guy in a Harpy Eagles 87.2 and the Leeward Islands Hurricanes 84.6. So really tight at the top, Trinidad and Tobago Red Force in fifth on 72.8, the Jamaican Scorpion sixth 57 points, West Indies Academy 54.2 and the combined campuses and the colleges 26.6 points. So that's the point standings entering today start of the seventh and final round in the competition. All right, let's have a look at the first set of matches then and where do we start? Queen's Park, Overland, Trinidad and Tobago, Leeward Islands Hurricanes versus the Winner Islands Volcanoes. And yeah, it essentially means that only one of these can win the title based on the standings, they can't both win based on what's happening. The Hurricanes 300 from 82.5 overs, Mikhail Louis 100, that's his third century of the regional four day season to go with three half centuries, Joel Andrew getting 68 as well, Ryan John 3467 for the Hurricanes and the Volcanoes in reply six for one at the close with Jeremiah Louis getting the loan at Wicket the Volcanoes trail by 294 runs. Staying in Trinidad and Tobago, now at the Sir Frank Warrell Memorial Ground, the combined campuses and the colleges taking on the Guy in a Harpy Eagles, the CCC bowled out for 200, Demario Richard stop scoring with 43, Niles Smith and Versaimo Pomont taking three wickets each for the Guy in a Harpy Eagles who in reply got to 114 for one at the close, Raymond Perez on beaten on 61 with Kevlin Anderson on 27, Amari Goodridge taking the loan wicket for the CCC won for 22 and the Harpy Eagles trailed by 86 runs. So they are giving themselves a real shot at winning this title as I'm sure they'll be pushing for an outright win. Not a good look for the Barbados prime though who are also in contention for the crown, bowled out for 153 on the opening day against the West Indies Academy, Jonathan Drake stop scoring with 35, Johan Lane taking 3 for 23 and McKenney Clark 3 for 26 and the West Indies Academy in reply going pretty well 111 for 4, Akeem Auguste on beaten on 67, Akeem Jordan 2 for 37, the pick of the Barbados prime bowler so far. They'll be extremely disappointed with what they have delivered on the opening day as they chase the title but still there is time for the Barbados pride to turn it around. There's still play going on at Sabina Park by the way featuring the Trinidad and Tobago Red Force and the Jamaica Scorpions. The latest score 307 for 7 seems as if Joshua Silva the West Indies wicketkeeper batsman has gotten a centrum seeing here 104 not out so that match going pretty late here on the opening day. That's in Mariah what an ending, what an ending to the regional four-day season where you enter the final round with four of the eight teams having a shot at the title. I think that's beautiful and that that is exactly the type of competition you want to see at this level Ricardo if we are to expect the West Indies cricket the senior team to be any good so I think that's very very inspiring. I feel motivated and then the centuries that are coming out of it you spoke about Mikhail Louis getting four centuries three now three centuries and the half centuries as well right three half centuries as well then we see Joshua the silver in his role as captain for the TNT Red Force of course stepping up with the bat leading by example that's something so good to look forward to and for me I will say this is one of the regional 40 competitions that I've seen a lot of positives come out of it. They have been negatives as well but with the bat I'm so I'm so happy to see our players being consistent Mikhail is one of them because he didn't just go a century and then pack up you know he went on to be consistent Amir Django another one that you know got a couple half centuries. Yeah and by the way remember that Mikhail Louis started the season with two centuries in his opening match then he had a couple matches where he didn't fire then he went three half centuries in four innings and followed that with the center today and you know Lance and Mari had this been 20 years ago right with an ending to the regional four-day season like this. Yeah the venues right across the Caribbean would be jam-packed for this final set of matches and I think it's still disappointing that we're seeing pretty much empty stadia across the region for these matches. Yeah but a real interesting end to the tournament because if we have the Leeward's Hurricanes in fourth but still just six points off the lead they scored 300 today led by Mikhail Louis third hundred of the series as you said and he is the tournament's leading scorer and the 17 year old Joel Andrew he got a half century today in support of Mikhail Louis Knox so good that the Leeward's are still fighting fighting to the end 300 not an unassailable total for the volcanoes to chase but volcanoes themselves are on with a shot at the title as well so interesting times ahead and the volcanoes six for one all right yeah so much more to come on the regional four day tournament not today though we'll bring you up to date tomorrow let's take a break we'll be back to wrap up today's show one


This may be one of the most important narcissist videos on YouTube everything the narcissist does is to elevate like grandiose view of themselves Everything they Do is to inflate their own feelings of self-importance. I saw that it really is When they first meet you They love born you Not because they love you Not because they care about you Not because they're really interested in building a relationship with you They do it Because it makes them feel important or special But it isn't long until the crowd and you start to see them as they actually are When that happens You throw Outfalls a sense of self-importance Just by you being who you truly are It makes them feel small and that is why they have to devalue you That is why they have to insult you and put you down Because again It comes back To those feelings of self-importance They need To feel like there's something more than what they actually are But if you start to figure them out Because of that point You're affecting them more than they're affecting you They can no longer make you feel small if they can no longer pull you down to their level They're left with no other choice But to just get rid of you When you're no longer susceptible to the narcissist Nebulations they have to just completely cut you off But it all comes down To how important they feel when they're around you this is a pattern that we can always witness In a narcissistic relationship if the narcissist feels important around their victim They're going to stay it's only when you threaten That false sense of self-importance But they then have to get rid of you You see there's really no winning with a narcissist because Even if you try to become The best relationship partner for them You do everything they want exactly how they want it You try to make them happy by doing that You're actually making them feel small You're making them feel inadequate Because they already know they can't do that for you They already know that they could never Measure up to who you are And in fact, that's the reason why they targeted you in the first place It's because they knew you were better than them That was not true They wouldn't have even noticed you I'm sure many of you when you go out to restaurants or Wherever you go with a narcissist You've seen how they treat people who They really believe are beneath them But many times that may often be just because That person has threatened Their view of themselves Their false sense of self-importance Because when it comes down to it, that's all that really matters when you're a narcissist They don't value anything else And really they don't value Building something for real Being important for real Because if they did then they would actually Take the steps to make that a reality many people say the narcissist only cares about themselves and While from one side of things that may be true, but there is another side to it because Actually the narcissist doesn't even care about themselves They don't even value themselves Because a long time ago they abandoned who they really are and created a false self One that they hope to be admired One that they hope to be Treated better than Their true identity so of course The narcissist didn't even value themselves And they abandoned who they really are What hope have you got in your relationship with a narcissist? They're just going to do the same thing to you or They're just going to keep you down for as long as you choose to stay with them because everything good about you Everything that they talk to you for It's making them feel small It's making them feel unimportant It's making them feel insignificant All the narcissist really cares about Is feeling important That's all that matters to them And they will do anything to get there Including Abandoning who they really are Binding in the people who truly care about them None of that really matters to a narcissist, but yes On the topic of importance I Do believe that This is one of the most important narcissist videos on YouTube And I believe that everyone needs to watch Watch this video so they can know What the narcissist is truly about I do hope that this video has helped you and Please give back to other victims and survivors of narcissistic abuse By giving this video a thumbs up sharing the video Leave a comment in the comment section Let's just get this message out there To realize that there is no pleasing the narcissist no matter what you do Either way they're going to feel threatened by you like You're better than them because they're so full of shame They're so full of envy and jealousy Anyway, I'm just here On the rooftop of my condo Got a beautiful view out here The sun is shining just living my life and And I'm sorry for Any narcissist who are watching this video If I made you feel less important You don't have to watch any more of my videos, but yeah For everyone else, I hope it inspired you To know that We can move on from these relationships and live a happy and fulfilling life Yeah, I just like to thank you all. I hope you all have a good day


Okay, I have been, I might look a mess because I got off a 24-hour shift at work at eight this morning, went to two hours of karate class, went shopping at Sam's Club, went shopping at Publix, came home, and it's now one in the afternoon, and I've been going non-stop, I'm tired, but I got this package yesterday while I was at work, and I'm very excited, and I hope it works halfway through. So what it is is, it's hopefully a laser engraver. It's very light, I know it's gonna be small, but I thought it'd be heavier than this, but it almost fits in the boxes empty. This is just under $100, it was $90 some dollars, and it's supposed to be two-day shipping, so I thought it was gonna come in the day, but they actually shipped it out, and I came in yesterday while I was at work. Now I've wanted a laser engraver for years. In fact, a couple of years ago, maybe three, four years ago, I spent $400 on one. It came, it was much bigger than this. This one can only print on very small areas, so it's very small.  I got it, and I was gonna use CNC Linux, which is a special distribution of Linux, for using CNC machines, like laser engravers and other tools such as that, which requires a serial port connection, and when I ordered the device, the title said that it was a laser engraver, and it said USB or serial. I thought that meant that it did both. Well, they sent me a USB model. It didn't have serial, so I sent it back. I'm like, you know what, that was too much of a headache. I'm not buying another one. This one was, like I said, just under $100, very small, washed lots of videos on it, and so hopefully it works. Now I do a lot of little woodwork, nothing fancy, but I do little trays for people and stuff like that, and I'd love to burn a logo on it.  So I checked to make sure that this is compatible with Linux, and of course the software that comes with it is it. It's, you know, Windows software, maybe Mac, and it's funny because all the reviews and supposedly the instructions from the official website are to disable your antivirus because their software, you know, triggers the antivirus, which if you watch my channel or my main channel at all, you've heard me talk about how I think antivirus is a complete scam. You look at the history of it with McAfee and just think of the concept of antivirus, really think it through antivirus is a scam. I don't believe in it, but at the same time, if somebody says, and I'm not just saying that for Linux users, I mean that for anybody, but at the same time if someone says, here's a piece of software, be sure to disable your antivirus. Don't do it. But I watch a bunch of YouTube videos and be like, oh, you're just sitting, and they do it, and you're just fine if you're gonna have a dedicated machine just for this, but if you're using working machines, just like, man, don't do that. Anyway, look at this tiny little thing, it's great. I'm out in my garage because it's probably gonna produce a lot of smoke. You can engrave, you know, on wood, on paper, they have some cardboard here with a little test print they did. And this one is, I believe, a thousand watt laser. There were some models that were a little bit more money that were 1500 watts. But I just wanted the cheapest one possible. Anyway, going back to the software, so I looked up online and sure someone figured out how it works, and it's just a serial port connection. So you don't need any special software, although I did find a GitHub page with instructions and some bash code and Python code to do it, but I looked over the code, it's very, very simple. And in fact, just for fun, I might in the future see about just making an Arduino device that I plug in and print an image. It's kind of silly to have an Arduino device that just prints one image, but I could have an image maybe saved on an Arduino that I plug in, it sends serial commands. Because all it does is the code is it initializes serial connection, which you need permissions to do. I'm gonna be doing this on a Linux Mint Live USB, because that's just what I had in my pocket. So you either need to give yourself permission, and I think it's the, is it the dial-up group or modem group that you need to add yourself to and then log back in. Or in just case, I'm just gonna run a pseudo on this because it's just a test machine. But then it sends an initial little string to initialize it, and then you dump a bitmap to the serial port because you just cat it out. And it has to be monochrome, one bit. So not grayscale, it's black or white. So there's no shading to it unless you do like every other pixel, but black and white images.  When I ordered this, I made a bunch, and I didn't flip them. I think you gotta flip it so the text isn't backwards if there's words. But it's very, very simple. So it's funny that you're supposed to install the software that they tell you to disable antivirus, but all of this is simple serial connection. So you don't need any drivers. Theoretically, I could hook this up to a Windows 95 machine and send serial commands to it and print to it. You don't need any special software. That's great. There's a lot of printers that are like that. Like a lot of thermal printers are like that. You just connect at the right connection speed and you dump text to it and it prints. And that's funny because years ago I was talking to a guy who works with Windows computers and he's like, oh, I can't use links. You know, I have clients that have these registers and I wanna make sure that it has proper drivers. Like a register, that's just gonna be a thermal printer. You don't need drivers. You just dump the text to it, you know? But whatever. So, theoretically, this should be pretty simple. Again, very small area. I will show you here in a moment. Let me bring it over here and show you what's in the package. Again, I'm very excited, very tired. Haven't showered yet today. Come here. So again, here is the printer. Here's a little example print that they printed on this. So, let's see. Turn on, off, automatic focus and focus.  And you can adjust the intensity, how much it burns. And I would think that if I used this regular piece of paper, it might be able to cut. It was called a cutter, laser engraver cutter.  But I'm wondering if I can cut designs out on paper. Let's go over here to the box. Focus. There we go. That looks focused, maybe. There. So, it powers through USB and communicates through USB. Looks like they gave me some pieces of wood to test on, that's good. This looks like some sort of cleaner, maybe to clean the head of the laser. It will adjust your knob, because you can adjust the height of the laser, because if you put a block in there, like this one's thicker than that, you can adjust out, I think you wanna get a fine point. Just from watching YouTube videos, special safety glasses. Here's a CD with the software, a lot of the reviews. You didn't get a CD, they sent them with a little SD card. I was like, oh cool, I get a free SD card, but I guess not, I got this, but again, this is, maybe I'll use this CD case for something. There's the other side, here is the manual. I'm gonna glance over this real quick. Okay, yeah, I glanced over the paperwork, I'm too, I don't wanna read it all. But I glanced it enough, it didn't seem like there was anything important. Point out that on the back, there are buttons up, down, left, right, and I think those are to adjust where the laser is to where it starts. I'm gonna jump in and start trying to print stuff. Now there's rubber bands on the plate, here. Oh, there's more foam packaging down here, I didn't see, let's see, there we go. So there's little rubber bands on here, and you have to rubber band or tape, watching a few YouTube videos, people's first mistake is placing the piece of wood on there and not securing it down. The platform doesn't move, only the laser, but the thing shakes, I guess, while it's printing, and your print will come out all wrong, wood will move. So you gotta rubber band down or tape it down. And another thing that people did was they didn't start at the top left corner, so they'd get halfway through the print, and I'll say I'm just gonna be printing a line because it's at its limits.  Now there's a red button on the top here, I don't know if that's an emergency stop, or I did read in the manual that there is a, oh, here's, oh, this is a little grippy, sticky thing. But that's the whole, I'm gonna put that on until after I do a few prints, we'll see. But as I was saying, the red button, I don't know if that's an emergency stop, oh, more foam. Man, they really packed this thing in good. Don't wanna set anything on fire. Okay, but yeah, I'm gonna just try dumping a picture to it. Now, you need five volts, one amp to power it, which is through this USB cable, it doesn't come with a power block. I have power blocks if I need to plug this into a wall unit, but I'm hoping that this laptop puts out enough power. If I have any problems, I'll be sure to try switching that over. But right now I'm gonna power it off the laptop. This in, I don't know if I should have my glasses on. Oh, the platform does move on the bottom. I didn't think it did, from people talking on YouTube videos. So both the laser head and the platform, I can see where the laser is pointing. I don't know if it just centered itself up or not. Let me get these glasses out. Oh, super cool, everything's like a dark green color. Okay, let's see, list, device, is it gonna be USB or TT, oops, TTY USB zero, that should be it. So let me move in. And I might do a little more in depth. Right now this is just me trying this out. Here is the, do these adjust out longer?  I'll put it back on in a minute. So, the batch script. So I gotta give it, run the script, give it the serial device, the image name, and burn time. And I don't know the values for the burn time. Let me read the readme file, vim, readme. Of course, vim's not installed, vim-tiny, vim-tiny not found. Why is it, I guess nano, or just cat, I'll just less readme. Also another thing is in the blog that the guy who wrote the script, he said images have to be 512 by 512 resolution. But then in the readme on the page and in the source code it says 520 by 520. So I did all my images 520 by 520. We'll see, there might be different models that have different resolutions. Let's see, I'm at the end of the file already with less. I'm just looking, I don't know what value to give for burn time. I wanna say that in the software that comes with it, it's between one and 20. So I'll just go 10 and see, I'm sure if it's an invalid number, it will tell me, maybe. It also said that if you're just burning on a flat piece of wood, you don't need to adjust the laser because it's already focused to a flat piece. But if you're doing anything thicker, you wanna adjust the laser so it's a thin point. Let me get these glasses on now. That is a bright laser. It's not even really on yet. So let's see, script. And then what was it, script, serial device, dev, usb, no, tty, usb-zero, image, examples. And I am just going to do a punisher skull that I need time, like I said, 10. Probably, let's see if that runs or if I have to do pseudo first. Yeah, it just must be 520 by 520. Let me unplug this for a moment. I don't feel safe. That is a bright laser. It's not even going. Okay, I was just about to give up on this. I've been out here about an hour and 15 minutes. So I tried the original script. It seemed to be working. It was dumping the image file to it and the laser would move around but wouldn't actually burn anything or just move around a bit. I tried adjusting the script. I tried different resolutions. I popped in the CD it came with and it had files with two different resolutions on them. And it's like sending signals and the printer was doing stuff, the engraver was doing stuff but it wasn't actually burning anything. I kept pressing the red button up here. It would burn the little test pattern but not the image I was uploading it to. So I kept on looking at different codes and they were all the same thing. I was thinking maybe the log rate's wrong. It's maybe it's a different, whatever. Finally, I found an ARC on Hackaday which is always a good site to go to to a link on GitHub, a program called Easy Engraver which works on Windows, Mac and Linux. It's open source. And I plugged that in. I tried putting that and it has stuff to adjust it. It has a GUI and a command line. I haven't tried the command line yet. And it wasn't working. I was just about to give up. And I realized there was a drop down button, a drop down menu. And it was at the version one. Tried version two didn't work. Tried version three. And I believe it's burning my image finally. So let's go ahead and have a look at that. So I think I finished with the tire just as this finished. So yeah, we got a little cardboard Punisher Skull there. So I'm gonna play around with this. I'll probably do a video maybe in the future on the software, but I thought I'd share because I'm excited. I got a laser engraver. I've wanted one of these for years. Thanks for watching. Please visit Filmsbychrist.com. That's Chris the K. I hope you enjoyed this. Have a great day. Wait, wait, wait, I forgot. While I was trying to get this out, I got another package in the mail and there should be things to go along with this. What have we got here? So what these are, little pieces of wood. It's very cheap. These are little like gift tags. Let's see. Man, you will focus. These are like gift tags that I can burn on too. There we go. And these are like little round coins that I can burn on too. So I'll give that a try. So there's our last burn and this coin. I mean, if I was gonna print that skull, I'd probably wanna shrink it down just a little bit. But I got another image I'm gonna put on there. And I'm gonna try using this little rubber mat that it came with. See if that holds it in place because obviously I can't use the rubber bands and it'd be difficult to use tape on that little, that sticks really good. I think is I need to line this up properly. But if I, in the software, if I click home, oh, it would help if I plug the power back in. And if I'm gonna do that, I want my safety glasses. There they are. Okay. Oh, it's getting dark. I can't really see anything with these glasses on. Let me try connecting failed. Okay, so, because I was already connected, I probably have to close out the software here, reopen it, choose it, connect successful home. Looks like it might already be at home. Line that up. Let's give this a try.