Thanks for making it to today's talk, last day after lunch. So thanks. In this talk, I would be sharing a story with you about my experience and my team's experience on writing Kubernetes operator, what were the challenges that we faced, and how we overcome that. So the content of this talk would look something like this. I'll be sharing the problem context where we started off with what were the alternative solutions apart from writing Kubernetes operator for us, how they did not work for us, and how we transitioned into writing a Kubernetes operator. This was just the half story of finding the right kind of solution for us. But the technical challenges started coming after we started implementing the operator and making it productionized. We would also go ahead and see what are the good resources that are already available, which you can look into if you want some additional resources, or you are just starting out in this space. Apart from that, we will do the recap of what we looked today and any questions that you guys have. Feel free to stop me in between if you have some questions and something is not clear. So yeah, let's understand what kind of application I and my team were working on. The application would process lots of messages in a day, and it would be of multiple kinds. I cannot go into the details or architecture of the application, but you can understand something like a message processor, and it could process the events ranging from a simple OTP message to some email content that the marketing team would use. And once these messages would be processed, these would be sent to different business applications. So application who wants to send the marketing content or wants to process the credit card transactional statements. So such kind of applications would consume these events based on category and configuration. So maybe a transactional statement would want to read a message immediately. And even if the communication between my application and that business application fails, they want it to be read immediately for 10 times. But that might not be the case with notifications team who wants to read marketing messages and all. Now, these configurations that we would manage throughout the presentation I would refer to as states. So there were around 15 to 20 such fields which would contribute to a state. And we were managing it in a centralized way. So one team would manage all these states. And these states would be actually replicated in multiple zones for multiple tenants. So only my testing zone would have somewhere around 5 to 10 tenants, which would be growing based on the business needs. Now, mainly, we say that a team would be managing it. But behind the scenes, there was an SRE who would manage it. And our SRE is Anand. Anand would, on a day apart from handling incidents and other issues, he would just manage 15 to 20 tickets on good days. And on bad days, he would take 50 plus tickets at night if there is any specific requirement from the business application. So the state of the entire operations was not super good. And Anand was stressed out. We needed a solution which could help out Anand lessen his burden, which would ensure that security is not compromised, which would help us move from this centralized solution to a decentralized solution. And hopefully, it could be done in an automated way. So these were the solutions that we tried. We thought, OK, maybe giving a helping hand to Anand would help us out. But as I mentioned earlier, transferring the knowledge of what our application was doing was pretty complex. And the time we invested in training a new resource was not yielding a satisfactory result. So we thought maybe, OK, we can try out some automated solutions. We tried to build a Jenkins pipeline and a UI which could just decentralize it. And we could just give it to the business application owners that you have your parameters, manage them. And we don't want to do that repetitive task for you. But that led to issues that we were not able to properly do the authentication and auditing of the resource changes that were happening. We had a lot of duplication. So what we did was to offload the burden from Anand to other teams. This did not look like a solution that would help us in a long run. So that is when we transitioned into writing a Kubernetes operator. I would emphasize here that when we started writing an operator, we were not the team who would know a lot about Kubernetes or writing the operator. And we just knew that what we wanted to do, what were our requirements, and how it could roughly be solved with the operator. We were trying to manage the states. We were doing some repetitive tasks all along. We knew that we could easily convert our problem into a declarative model. We researched a bit and found that none of the existing controllers available could solve our problem. And the mistake that we made or the inaccurate assumptions that we made were that there wouldn't be much learning curve for us or there wouldn't be much resource overhead, which we found out that caused the issue to us later on. So once we knew, OK, we are going with the Kubernetes operator approach, we started out with finalizing what our CRDs would look like. And just writing a boilerplate code with those CRDs or custom resource definitions using the CubeBuilder framework, if anyone of you is looking to write, you guys can choose the framework based on your use case and feasibility. We wrote some basic custom logic and validations based on our use cases. And then we tested it in local environments. How many of you are aware of what CRDs or custom resource definitions are? OK, quite a lot. So just in case if someone doesn't know what a CRD is, you can loosely relate it to something like a contract between your operator and what it would read. So you can specify what kind of fields would be present and what kind of version your CRD would use. One of the mistakes we did as a newbie when we were starting out was not understanding the importance and of deciding what our scope would be. We were an infrastructure team, so we had lots of permission and we started out with the scope of cluster. And we didn't realize at the time what security risks it could possess and how it could be a road blocker for us to serve a complete self-served solution to our users. The second mistake that we made was that we did not maintain the status of our CRs, which blocked us into understanding the insights of how our CRs were performing. Getting the alerts on time and maintaining them, maintaining our application stability. So before I move on to the challenges that we encountered during this process, this is how a custom operator might work. I, as a user, might create some YAML file or something similar which would act as my custom resource. My operator would have a reconciliation loop which would keep on reading for any of the updates that are happening in the CR and try to make my actual state similar to what the desired state should be. And then maybe a verification that we would talk about how to do it in the later slides. So we moved on from phase one where we did a basic setup of our Kubernetes operator to the phase two where we were testing and trying to see if we were able to make some updates to our CRs and maybe CRD. So we are testing with 5,000-plus CRs in our pre-prod environment, which looked much more similar to what my production environment would look like rather than the case was with the local testing. And as I said earlier, we were testing with the scope of cluster. While we were testing it and we reached out to multiple different teams who were using our operator, we realized most of the teams were not having the permission to access the cluster-scoped CRDs and use their CRs properly. And then we explored, OK, like there were some security risks involved there. So we were having no other option than to migrate our CRs and CRD. For us, this was the case. But for others, the case could be pretty different that maybe you are not making some state which is backward compatible and you might be forced to migrate. And for us, we were also using Helm. And Helm doesn't support any upgrade or deletion of CRD. So we were forced to execute the steps manually to update our CRDs. Now this is what we wanted to avoid. We wanted to avoid the cluster going down. And this is what exactly we faced. The split-brain problem. So while we were upgrading our CRDs, we later on realized that most of our CRs which should have been deleted were not deleted. And the entire cluster just got down due to the state difference that we had. I have a demo on this, but I don't have it in slides. If anyone requires it, I can give it offline. So this was our first lesson that any changes we make after we go to production, we shouldn't be making any of the migrations as long as possible. And if we are actually planning for migration, it should be like each and every step should be thoroughly thought through.  So try to avoid it. And if you are doing it, just plan it well. Apart from that, one mistake we did not realize was that playing around with the finalizers of custom resources. I would say not just custom resource, don't play around with any of the Kubernetes finalizers you have. So we were done with this. We understood what we shouldn't be doing. And we recovered soon from this problem. And then we had our backups in place. So we were good to go to production. Once we got into production, we started having issues related to how we get the insights and how we make it fully self-served. The operator was working fine. We had resolved our technical issues. We had validations in place. But most of the people were not able to understand how they would move on to the new process of maintaining these states. Now, when I say this, we had a basic documentation in place, but we were not having the documentation which would serve two different personas. And I think having that was the most critical part to making it self-serve. After we had a proper documentation, we moved on from having daily around 15, 20 tickets to two, three tickets. And it was a great savior for us. Later on, we realized that as people started using this process and as custom resources increased in our cluster, we realized that most of people were complaining the state difference was not getting reflected on time. And this was because we were not handling concurrency well for the needs of different zones. So we realized, OK, we should have something which makes it configurable. And with the growing tenants, we should be able to handle it well. We realized it later on as well that because we were not having alerts on time, the issues became critical. And if we had metrics and alerts on what was the RQ size, what was the lack that each, what was the latency that each of the CR took to get into a reconciled loop would have helped us tremendously. So setting up the observability in the process of maturing your operator could play a big role. Apart from that, we realized that we had high latency. We resolved the issue of high latency, but that came with us processing lots of CR. Now, with this, we observed that a couple of downstream applications that we were having were actually not implementing rate limiting up to the mark. And that made those applications go down and created a bigger issue for us. So if you are having any of the applications which is not able to handle these scenarios well, then make sure that you have configurable concurrency and rate limiting in place. Apart from this, we also understood that most of this overload was coming from the stale resources. So stale resources were not only using the resources in our cluster, but also making the entire process slow. So having a systematic approach to cleaning up these resources on time could lead to greater advantages in terms of latency and resource saving. Then we were able to achieve this systematic cleanup observability because we were able to maintain the status of each CR. So make sure that initially you might not need it, but as you go to the higher zones, you might want to make sure that your status of your CRs is in place. And then in the last, we also added end-to-end testing, which helped us make sure that our entire pipeline was not breaking due to any of the changes that we make in downstream applications. So this is how we achieved the stability of our Kubernetes operator in all the production zones. And currently, we are running this in around five different production zones we have with each having somewhere around 3 to 5 tenants. What I found useful in this entire journey were these talks. Why you shouldn't be writing the Kubernetes operator in the first place, avoiding any of the changes. First, figure out whether it's necessary for you or not. If there are other alternatives, go with it first. Else, if you don't have, just go through the checklist of what ever would be required in writing a Kubernetes operator, then bit on what CRDs are and how it could be useful for you and why and how not to play with your finalizers. You can go through them. These are pretty good. So just recapping through all the things that we went through. First, explore all the alternatives you have before diving into writing a Kubernetes operator. Try to make as accurate estimations as possible while you plan to write a Kubernetes operator. Make sure that you are making correct considerations when deciding on writing CRDs. This could create real big issues if you don't plan it well. Have a thorough documentation for each and every persona you have. Manage the concurrency of your operator properly. Have effective observability before the issues become big. Make sure that you are able to catch them. Do the proper resource cleanup and have a systematic approach to it. And make sure that you have end-to-end testing in place. Thank you. Feel free to give any feedbacks you have on the slide. Any questions? Hi, great talk. This is Shidon from University of Illinois. I'm not able to hear, sorry. Oh, sorry. How about now? Yeah. I'm Shidon from University of Illinois. And I'm in particular curious about the split-bring problem you mentioned in the talk. Could you elaborate a little bit more how does this happen? What is exactly the split-bring here? And how do you address that? So are you asking that how the split-bring problem occurred for us? Yes. OK. So as I mentioned, we were actually running our CRDs with a scope of cluster. Now we actually manually went and changed all the required CRDs to the namespace scope. And we were having, in thousands, we were having our CR instances, which were running with that cluster scope. So when we moved our CRD, most of our CR instances were not moved to the namespace. So we actually, what was expected or desired result was expecting the scope of cluster while most of our CRs were running in the namespace scope. And that was the time we made a mistake while we were using Finalizer. It did not work as expected. And due to the state difference, it led to split-bring problem. And actually, our entire free-brought cluster went down. But yeah, once we fixed that, instead of playing around with the Finalizers, we patched the CRs. And then we were working fine. We did it for all of our prod zones as well, like a few of the activities. And it was working fine. So it's basically because you are trying to change the scope from cluster to namespace. Yeah. And it's not necessarily that this was the case with us. We were trying to make sure that the scope was migrated. But it could be with any of the state that you are trying to manage. And it's not backward compatible. So yeah, I think what we learned was planning your CRDs well is super helpful. OK, thanks. Yeah, so on the CRDs with Helm slide, we ran into something similar. We have several custom CRDs internally that we upgrade regularly. And we ran into this attempting to write a Helm chart to deploy our Coup Builder operator. Upon some research, it's actually a little misleading. You can upgrade CRDs with Helm, absolutely. You just have to not put them in the CRD folder. If you treat them just like any other manifest, they will apply an upgrade just like you would expect. This is the approach that several large operators, certain manager being one of them, follow. You just lose the support for deletion. Because if you delete your CRD, you delete every CR as well. So you can upgrade. You just have to take the risk of, if I uninstall this, I'm going to uninstall everything else. So was it for Helm 3 or Helm 2 that you explored? I also saw that. But at the time, we were using Helm 2. So we had our restrictions there. What was the Helm version I'm asking for you? This is recent, so this would be Helm 3. Yeah, OK. Yeah, we were running Helm 2. And we had our restrictions. Yeah, Helm 3, it's standard. Yeah, they are considering other options going forward with the Helm upgrade. So it should be easier. Thanks for the session. It's helpful. So these operators, until they run into issues, they are great. Once you hit the issues, you get into all sorts of troubles, as I understand. So my question to you is, one, you mentioned end-to-end testing. Could you explain what kind of end-to-end testing that you have done in a second? How did you handle the errors, right? If it runs successfully, no issues, right? When there are errors, it's hard to debug or troubleshoot. Yeah, yeah. So I'll start with the second question that you asked on how to handle errors, right? For us, we figured out three set of scenarios that we would run into, one. So our operator would call external API. And based on that, it would create the states, right? Now, for us, there were three scenarios. One was success. If it runs fine, we are good. The second was that if there is an error, it could be either a retryable error or it won't be retryable error, right? If it's not retryable error, we just want to discard it. And we want to make sure that the status of what kind of error is maintained. And for us, we were OK to retry it 10 times. So when you write the operator, it has the custom logic of exponential backoff. So if we wanted to retry them 10 times, if they were successful, then good. Otherwise, we won't retry them. So I think you can play around with your retry logic. But having that distinction between what is retryable and non-retryable is important. And for end-to-end testing, so we were actually managing multiple applications at the same time. And few of them were getting updated pretty quickly, right? So in the end, what happened that while creating the state, we were calling a couple of APIs for authentication and then for state creation. We realized that if we were playing around with those APIs or those contracts, we were actually facing the issue with the operator. Because once your operator is stable or any application is stable, you don't want to touch it. And you tend to forget that something might be causing problem. So because we had alerts in place and we had lots of traffic, if there would be any failure, we would get the alerts pretty quickly. So that is how it helped us do the testing whenever we made changes in any of the downstream applications. Got it. Thank you. Helpful. Split brain. So one thing I want to bring up is the way we look at CRDs is basically we're extending the API layer of Kubernetes by introducing new domain objects, right? And that's what the definitions are. Wouldn't it be because if you think about it, like those attributes and those contracts are always going to be changing, right? Now, I know you said try not to change it. But wouldn't it have been a version control on the CRD, something that if you're doing a modification of, let's say, scope changing? Well, you could have easily just bumped the version of the CRD. And you're treating it just like an API. It is literally the API layer, right? So the new version of your API is now going to be supported on a namespace scope versus your previous version is on a cluster scope. And so your controller is now looking at the new version of the object via the API, right? Wouldn't that fix maybe the split? So for us, the issue was that we wanted to manage these states, right? So any of the CR instances that we had, right? We wanted to make sure that if we are upgrading it. So either the option was that we patched all the CR instances that were present to use the upgraded CRD version, right? We thought that wasn't a good option for us to go ahead. And that is why we had to migrate. So we did consider moving the version, but that was not useful for this use case. The other thing is what I'm trying to look at is would there be, because what we do like in a normal microservice development, right, is you have a request ID for requests, right? Normally like a UUID that gets passed on, and then you use a context object throughout to know how you correlate that inside your logs for debugging. When it comes to, again, the operators and everything, again, we're going through the Kubernetes APIs, right? So, assumably, if there is a request ID or an ID that's associated with that request with the CRUD action that's happening against the object, do you know if there is a way we can grab that insight, like the reconciliation inside the controller so that we can have that inside the context object, pass through the execution of business logic, and that way we're actually storing it in logs and standard out so that when there is the request comes in, on that object, we have an associated correlation ID that we can then track if there is a failure or whatnot. Does that make sense? I couldn't actually follow it entirely. So is it that you are asking for a particular request? Are we able to follow what are the errors? And this request is actually the CR, right? Is it? I mean, you do the request for, like, apply, right? Either it's a create, update, or delete of a CR object, right? So again, that request is literally an API call that's happening, right? Now through the kubectl or what have you, right?  And do you know if there is, like, a request ID, if there is an ID of some sort for that request, that we can use as a correlation ID in our logs? Because when you go inside the reconciliation, right, we're logging what's happening. And those are either it's Kubernetes logs or it's a log risk that you're using and you're sending that onto, like, a centralized logging, right? If we have that request, we can use it as a correlation so that if anything does happen, right, inside our central log, we can always refer to it. I don't know if you guys look into that or not. I'm not pretty sure about the entire, like, I'm not sure about the question itself. Well, I just wanted to know if there is a request ID that you knew about that comes down into the reconciliation or not. Yeah, so, like, the CR name that we were using, that is what we were using to actually search for any of the errors that would come in the logs. So, for us, at least, that did solve our problem. Okay, so the name. The CR name itself. And we had the name of what our, like, state name was, right? Like, each state had a unique ID as well, right? So, the CR name was also similar to it. So, we were pretty well able to, like, actually follow the entire trace of, like, if it's going into reconciliation loop, how many times it's going into reconciliation loop and if there are any downstream errors that we encounter. Okay, thank you. Thank you. Any other questions? Okay, thank you.


Singin' in the rain. Just singin' in the rain. And we'll be paintin' in the rain, too. I just had to start this off with that because that's what it was running through my head while I was painting this card. It's a new stamp set from Colorado Craft Company with the art of Anita Jerome. Jerome, Jerome, I don't know how she pronounces it. My apologies if I'm screwing that up, but I mixed a very, very thin cobalt background for this because it's a rainy day. It's not gonna have like bright white highlights, but you'll be surprised at how light it ends up looking when it's all finished. But I use a lot of water and a little bit of paint to make a very, very pale wash of color. And then I added a little bit more to it while it's still wet so I could add a little bit of darkness at the bottom because I had this real vision in my head for having a strong color at the bottom and then lighter up at the top. So after it's all dried and flat, I went in with a little bit thicker watercolor and started painting in the bottom section, going around the puddles. But you can also create more puddles in this if you want. There's only some of them that are drawn into the stamp set. And I'm leaving some openings in a variety of places. That's going to help me as I try to create more of a look of puddles and realistic puddles, realistic rain down here at the bottom. And one of the things that's going to happen with rain is you're going to get some solid area right under where the reflection of the bunny rabbit is. There's all kinds of fanciness you can get into with the reflections, but for now we'll just go with the simple idea that you want more solid color there. And the highlights are going to be off to the edges where you're not getting a reflection because you'll be reflecting against the sky, which will be lighter. So I'm mixing a thinner and thinner bit of watercolor by adding more water to it so that I can add lighter and lighter marks in that background because it's kind of going off into the distance. I want the stronger color in the foreground and I'm not making straight lines. I'm just kind of making all different size and shape lines, but kind of horizontal ish and then I'm going to just take this paint and make some splatters all over the place to give it that feel of crazy chaotic rain. You can also do that if you've got too much color on there, you can also do that with water and that'll add some water droplets kind of in the paint and stuff and can create some really interesting effects. So next I took a dark blue. This time this time it is indenthrone blue and I'm going to add some into this paint that's already still damp. I didn't dry any of this down here and as it's drying, you can see I'm getting more of a dry brush look because the paint I'm using is really thick compared to what was down there and I'm also trying to use a quick motion across the surface because that gives me that kind of quick dry brush look where the brush is skipping across the textured surface of the paper and that's what gives it that sort of really rough edge look and I'm slowly trying to build up the color that's in that center section. Remember where I said the bunny rabbit's going to be darker underneath of him and all the light color around the outside. I'm mixing a thicker cobalt blue, so I'm filling in a few more areas, taking out some of those whites and I'm being a little more careful as I move into finer details, finer lines. And I'm trying to make sure that any of my shapes have a point on the left and right side so that they look kind of flat as opposed to looking like they're a chunky brush stroke. So now I've added some pains blue gray to it so I can get a nice really dark color and the reflection really starts to appear from the bunny rabbit. I'm expanding the real estate of that really dark color down in the foreground because that's going to make it feel more like the foreground and pull you into the picture, but doing it with less on the outside edges. So I'm starting to get little dry brush marks out to the left and right and alternating it then a little bit with the cobalt to take away some of the white. I was just trying to squint at it and make sure that it looks the way I wanted it to come out because I I just wanted this really nice heavy dark color at the bottom. Now remember, we painted right through the whole stamp the first time. So there is some light blue color underneath of that yellow, which is OK, you know, you can see the yellow is a little dollar than it would be if you paint it around it, but it is really hard to paint a nice consistent background wash over something and go around a stamped edge that is just really difficult. So it's if you can use a really light color, if your your first wash is going to use that really pale pale tone, then you can paint right over top of it, as long as the colors on top are going to be darker. So it just requires a little thinking ahead and planning to see what kind of colors you're going to use for the rest of the image. So all of the browns from the bunny are going to be right on top. And that's just a mixture and that's just a mixture of yellow ochre and a little bit of burnt umber, but you can mix it a bunch of different ways. And then I'm even using a little bit of that blue mixture that's left over to add some dark shadows because that's going to tie the bunny in with the background a little bit by just adding a little bit of neutralizing to that brown so that it kind of fits in with the rain at the bottom. But the umbrella, I wanted to make that really pop. So I made it, you know, bright yellow, bright pink, even though they're not as bright as they would be if they were on pure white. They're just on this very pale blue, but they're nice bright colors, which kind of has some symbology that the rainbow colors are what's saving the bunny from getting soaking wet. Although his little feet are getting wet, he doesn't have any boots on. So then I decided to add a second layer of each one of these colors and leave just a little lighter space. So I'm not covering the whole thing, just leaving a little bit of lighter color so that it looks like there's little highlight, but it's not necessary. You could just make those flat. If you're coloring something like a background that looks super realistic, you can let everything else go. There's there's a lot that the brain will fill in when looking at it and will make it into something realistic just by the fact that in your brain, it just does that automatically. Now, I've squeezed out some white paint. This is titanium white that I happen to be using here. And I don't keep it in my palette because it gets dirty really quickly. So I squeeze some out just on the the tape on the side of my painting so that I can use just a little bit of it. Now, depending on how much you plan to use, you can squeeze out less than this and throw away less paint, but it's going to dry and be hard. So if I were to leave it in my palette, then it would be hard to scrape out of the palette and everything. So just putting a little dot of it so that I can paint using that is really helpful. But notice that I'm not using it really thin. I'm using it almost like acrylic paint. And that gives me the chance to do some stuff that some strokes that look like dry brush on the surface. So it's giving me a little bit of texture and broken lines so that I end up with something that looks very much like water this way. Now, you can also use a white gel pen and add some of that. But this is going to give you dry brush that gel pen will never give you. So with gel pen, you're going to get actual lines created.  I also used the white paint to add a few drops in front of the umbrella and tried to space them and make them look like they were about the same size as the little drops that I had sprayed and splattered around the rest of the painting. And if there were any that were on the edge of the umbrella, I tried to continue them so it made it look like it continued from the background on top of the umbrella using the white paint. I used the same white paint, of course, to make a few drops of water across the water and, you know, a couple on the bunny, not a whole lot, but enough to make it look like there's still water splashing around all over the place. And the moment of the great reveal peeling off the tape. Then all it took was trimming it down so I could add it on to a card base using some dimensional adhesive to pop it and stamping the sentiment. No matter the weather, we are friends forever. So hopefully you will go around for the rest of your day singing, maybe a little Jean Kelly singing in the rain and dancing in the rain and painting in the rain. All righty, I'll see you guys again very soon with another video. Links for all the supplies are in the doobly-doo and I'll talk to you again soon. Bye.


Chapter 27 of Famous Men of Greece. This is a LibriVox recording. All LibriVox recordings are in the public domain. For more information or to volunteer, please visit LibriVox.org. Famous Men of Greece by John Herron and A.B. Poland. Chapter 27, Demosthenes. Roman Numeral 1. In the city of Athens, about 25 years after the Peloponnesian War, there lived a delicate boy named Demosthenes. His father was a manufacturer of swords and made a great deal of money. But when Demosthenes was only 7 years old, his father died. Guardians had charge of his property for 10 years. They robbed the boy of part of his fortune and managed the rest so badly that Demosthenes could not go to school to the best teachers in Athens because he had not money enough to pay them. One day, when he was 16 years old, a great trial was going on at Athens and he strolled into the court. There were 1,501 diecasts or, as we call them, jurymen in their seats and the court was crowded with citizens who, like Demosthenes, had gone in from curiosity. A lawyer named Calistratus was speaking. He did not finish his speech for nearly four hours, but no one left the court until he ceased to speak. Then hundreds of people went out and hurried home. Demosthenes waited to see the end. When each of the jurymen had thrown a voting pebble into a basket, the clerk of the court counted the pebbles and told the result. Calistratus had won the case. Demosthenes went home determined to become a lawyer and public speaker. In one year from that time, he brought suit against his guardians, delivered four orations against them and won his case. He recovered a large part of the property which his father had left to his mother and himself. After this he entered public life, but the first time he made a speech in the public assembly it was a complete failure. He stammered and could not speak loud enough, and in trying to do so he made odd faces. People laughed at him and even his friends told him that he could never be a speaker. So he went home greatly cast down. Then an actor who was a great friend of his family went to see him and encouraged him. He asked Demosthenes to read to him some passages of poetry. Then the actor recited the same passages. The verses now seem to have new meaning and beauty. The actor pronounced the words as if he felt them. The tones of his voice were clear and pleasant and his gestures were graceful. Demosthenes was charmed. You can learn to speak just as well as I do, said the actor, if you are willing to work patiently. Do not be discouraged but conquer your difficulties. I will, said Demosthenes, and he did. It is said that to improve his voice he spoke with stones in his mouth and to become accustomed to the noise and confusion of the public assembly he went to the seashore and recited there amid the roar of the waves. To overcome his habit of lifting one shoulder above the other he suspended a sword so that the point would prick his shoulder as he raised it. He built an underground room in which he could study without interruption and practice speaking without disturbing anyone. He had one side of his head shaved so that he would be ashamed to leave this retreat. Then he remained there for months at a time engaged in study. One thing that he did while there was to copy eight times the speeches in the famous history of Thucydides. This was to teach him to use the most fitting language. Besides all this he took lessons of an excellent speaker named Isias who taught declination. In this way the awkward boy who had been laughed out of the assembly became in time the greatest orator of Athens. Not only was Demosthenes a graceful orator but he was wise and patriotic. He soon acquired great influence in Athens and became one of the ten official orators. At this time Philip of Maston had organized a strong army and was beginning those conquests which in the end made him master of Greece. Demosthenes from the first regarded him with suspicion but said nothing until convinced that Philip was threatening the liberty of Athens and of all Greece. Then he urged the Athenians to fight against Philip as their forefathers had fought against the Persians at Marathon, at Solemus and at Platia. Philip he said is weak because he is selfish and unjust. He is strong only because he is energetic. Let us be equally energetic and being unselfish and just we shall triumph. Philip's victory at Caronia completely disheartened the Athenians and Demosthenes had to use all the power of his eloquence to rouse them. In his speeches he showed how the success of Philip and the failure of Athens were not due to the advisors of the people or to the generals who led their army but to the Athenians themselves. You idle away your time said he going into barbers shops and asking what news today while Philip is gathering forces with which to crush you and the rest of Greece with you. Philip tried to bribe Demosthenes but the order was absolutely incorruptible and to the end of his life he raised his voice and used his influence for the cause of freedom against both Philip and Alexander. He delivered twelve orations on this subject. Three of these orations were specially directed against Philip and are known as the Philippics. They are so bitter in their denunciation of Philip that today any speech which is very bitter and severe against a man or a party is called a Philippic. The most famous speech that Demosthenes ever made was in defense of himself and is known as the speech on the crown. He had advised the Athenians to unite with the Thebans against Philip. His advice was followed and a victory was won. The Athenians were so much pleased that it was proposed to crown Demosthenes with a golden wreath at one of the great festivals. Now this proposal had to be voted on by the people and some of Demosthenes enemies objected. If the people refused to vote the crown it would have meant disgrace for Demosthenes and so he was obliged to go before the assembly to speak in defense of himself and to show that his advice to his countrymen had been correct. It was true that the Athenians had not been able to destroy Philip's power or free the states of Greece from his control. But said Demosthenes, I insist that even if it had been known beforehand to all the world that Philip would succeed and that we should fail not even then ought Athens to have taken any other course if she had any regard for her own glory or for her past or for the ages to come. By this he meant that it was the duty of her people to fight for what they believed to be right even if in the very beginning they had known that they could not succeed. Grander words than these never fell from human lips and when the vote was taken the people decided that he should receive the crown. Roman numeral 2 When news reached Athens of the murder of Philip Demosthenes rejoiced and placed a wreath upon his head as if he were at a feast. He even persuaded the Athenians to make a thank offering to their gods. Alexander soon placed the Greek cities at his mercy. Then he demanded that Demosthenes and eight other Athenian orators should be delivered up to be punished for treason. Demosthenes told the people of Athens the story of the wolf and the sheep. Once on a time he said the shepherds agreed with the wolf that henceforth they should be friends. The wolf promised faithfully never again to attack the sheep but he said he thought it would be only fair that the shepherds should cease to keep dogs. The shepherds agreed and gave up their dogs. Then the wolf ate up the sheep. The Athenians knew what Demosthenes meant and heeded the lesson. They kept their watchdogs. Demosthenes and the other orators safely at home. Alexander at length withdrew his demand and treated the Athenians with kindness. However, this did not win the favor of Demosthenes who continued to oppose the Macedonians at every step. After some years one of Alexander's satraps stole a large treasure, fled to Athens and begged for protection. Demosthenes was unjustly accused of helping him and was condemned to pay a fine. He could not pay it and so went into exile. When Alexander died, the orator returned to Athens. The Athenians sent a man of war to bring him to the Piraeus. The magistrates, the priests and all the citizens marched out to welcome him and escort him to the city. Demosthenes now made a last effort to free Athens but Macedonia was still strong and Athens and those who loved her were weak. In a short time the demand was again made that the orators be given up to be punished and Demosthenes again had to flee for his life. He sought refuge in a temple of Poseidon on an island near the coast of Greece. The sacredness of the temple ought to have protected him but he was not allowed to escape. The captain of the soldiers who were sent to kill him told him that if he would come out of the temple he should be pardoned. Demosthenes knew well that this promise would be broken. He asked to be allowed a few moments in which to write a letter and his request was granted. He wrote and then placed the end of his writing-quill in his mouth. Those who were watching saw him grow pale. He tried to reach the door but fell dead near the altar. He had taken poison which he had long carried in the end of his writing-quill for he feared that if he ever fell into the hands of the Macedonians he would die in prison or by torture. 1. While Alexander was conquering the world there lived in Athens a man whose work survived hundreds of years after the conqueror's empire fell to pieces. Indeed, it exists today. This man was Aristotle the great philosopher at one time Alexander's tutor. After Alexander became king Aristotle went to Athens and established a school of philosophy. His fame grew and he was called the man of wisdom. He spent much of his time in writing and wrote about almost everything that men thought of in his time. Some of his works are studied in our colleges today. Like all other great men of Greece Aristotle had enemies. Some of them accused him of not having respect for the gods he therefore fled from Athens in order as he said to keep the Athenians from sinning against philosophy by banishing him. He died in exile. It is said that for about two hundred years after his death people did not know what had become of his writings. The men to whom they were left had buried them in an underground chamber for fear the king of Pergamos who was very proud of his library would get hold of them. When the manuscripts were at last found they could still be read. For hundreds of years after that Aristotle's writings were more widely studied in Europe than almost any other books. Two. Another great philosopher who lived during the time of Alexander was Zeno. He was born in Cyprus but came to Athens in his youth. He gave his lectures in a porch called in Greek a stoa from which he and his followers are called stoics. He taught that men should live simply and learn to be neither fond of pleasure nor cast down by sorrow. Today we call people stoics who endure pain and misfortune without complaining. One of Zeno's rivals was a philosopher named Epicurus. He founded a school in Athens and taught there for thirty six years. His enemies accused him of teaching that pleasure was the only thing to live for and many people still have this idea. We call a man an Epicurus who is very fond of high living. Epicurus, however, really used the word pleasure to mean peace of mind not the mere satisfaction of eating and drinking. Both he and his pupils lived in a very simple way. One of the oddest of Greek philosophers was Diogenes. He used to stand in the public places of the city and ridicule the follies of his fellow citizens. Because of this habit he and his disciples were called cynics or growlers from a Greek word which means dog. It is said that he lived in a tub. Many stories are told of the curious doings and sayings of Diogenes. Once in broad daylight he walked through the streets of Athens carrying a lighted lantern. What are you about now Diogenes? asked one man who met him. I am looking for a man sneered Diogenes. Once when he was on a voyage the ship in which he was sailing was captured by pirates. The passengers and crew were taken to Crete and sold as slaves. The auctioneer who was selling them asked Diogenes what he could do. I can rule men, was the answer. Sell me to someone who wishes a master. When the great Council of the States of Greece honoured Alexander by asking him to lead their forces against Persia the young conqueror visited Diogenes. The philosopher was then living at Corinth in the house of the man who had bought him as a slave. He was in the garden basking in the sun when Alexander visited him. Can I do anything to help you Diogenes? asked Alexander. Nothing but get out of my sunshine replied Diogenes. As Alexander was leaving this man a few wants he said if I were not Alexander I should wish to be Diogenes. It was as though he had said if I were not going to conquer the world I should like to have the power which Diogenes has to conquer self. Three. A number of celebrated painters lived during the reign of Alexander. The most famous was Apelles. Alexander would allow no one else to paint his portrait. Apelles had talent but he became a great artist as much by his patient industry as by his talent. His motto was Never a day without a line. Once he painted a horse and exhibited it in a contest with some of his rivals who also had painted pictures of horses. He saw that the judges were not going to give the prize to his picture so he requested that all the pictures should be shown to some horses. This was done and the animals paid no more attention to the pictures of Apelles' rivals than they would have paid to blank boards. But when Apelles' horse was shown to them they naved as though they had seen a friend. End of Chapter 28 Chapter 29 of Famous Men of Greece This is a LibriVox recording All LibriVox recordings are in the public domain. For more information or to volunteer please visit LibriVox.org Recording by Christine Famous Men of Greece by John H. Harn and A. B. Poland Chapter 29 Ptolemy One of Alexander's favorite generals was Ptolemy. In the division of the Empire Egypt was placed in his charge. Other parts of the empire were entrusted to other generals. One had Macedonia, another Thrace, another Syria. At first they ruled as governors for Alexander's young son but after a while they became independent and were called kings. Ptolemy and his descendants ruled Egypt for more than 350 years. They were a great line of sovereigns and did much for the good of the country. We are accustomed to think of them as Egyptians but really they were Greeks living in Egypt. One of Ptolemy's first acts and one which shows that he was a man of affectionate feeling was to bring the body of Alexander from Babylon to Egypt. It was first buried in Memphis but afterwards removed to Alexandria because, as you remember the city was founded by Alexander and named after him. Ptolemy made Alexandria his capital and did a great deal to beautify the city. He founded a museum and began collecting books for a library. His son, Ptolemy Philadelphus carried on his work and made the library the largest and best in the world. Most of the books were made of the piss of the papyrus or paper plant in the story of Pisistratus. They were written in Greek and Latin. Ptolemy appreciated the intelligent and learning of the Jews and treated them with so much kindness and gave them so many liberties that great numbers of them settled in Egypt. Two things that Ptolemy Philadelphus did are especially worth remembering. One was to call the Bible of the Jews to be translated into Greek. The other was to open again a great canal which had been dug many centuries before from the Nile to the Red Sea but had long been filled up by the drifting sand of the desert. This was something like the cutting of the Suez Canal. Ptolemy's canal connected the Atlantic with the Indian Ocean. Ships could sail from the Atlantic across the Mediterranean then through the canal and the Red Sea and on to India. At that time Egypt raised more wheat than any other country in the world so she had a great commerce. In exchange for her wheat she bought the products of Europe and Asia and Alexandria became the richest city of the world. But more than that the Ptolemy's, especially Philadelphus invited learned men to their court and gave them support so that they might carry on their own studies and teach others. At one time there were 14,000 students receiving instruction in the city. Thus Alexandria became the home of learning. It was there that pupils were first told that the earth is round and one of the great astronomers who lived there found out very nearly the length of the earth's circumference and diameter. The people of Alexandria knew more about these things 200 years before Christ than the people of Europe 200 years after. The science of today about which you hear so much is only the continuation of what was begun by the wonderful Greeks whom the Ptolemy's gathered about them in Alexandria. One of the Ptolemy's line was the celebrated Cleopatra an able ruler and the most fascinating woman of her time. You will read something of her history in famous men of Rome a companion volume to this book. End of Chapter 29 Chapter 30 of Famous Men of the Greece This is a LibriVox recording all LibriVox recordings are in the public domain. For more information or to volunteer please visit LibriVox.org Recording by Christine Famous Men of Greece by John H. Haran and A. B. Poland Chapter 30 Pyrrhus A prince named Pyrrhus lived in the state of Epirus not far from the home of the great Achilles. At 12 years of age he became king but the government was carried on for him by a guardians. About that time he read the story of Alexander the Great and determined to be like him a great conqueror. While he was dreaming of victories in foreign lands war came to him in his own country Ptolemy of Egypt helped him to defeat his enemies and regain his throne. Then he resolved anew to conquer as Alexander had conquered and he began with Alexander's own Macedonia. After a war that lasted several years he got possession of one half the country. One of Alexander's generals took the other half. However the people in Pyrrhus half preferred the old general as a ruler and in seven months Pyrrhus had to give up his Macedonian kingdom. He reigned quietly in Epirus for a few years. Then a chance came to try and conquer the Romans who lived just across the Adriatic sea. Pyrrhus was delighted. Ruling Epirus was a dull business. In the south of Italy great many Greeks had settled. Greek was the language of the people who lived there and the region was called Great Greece. Rome wished to rule all Italy but those Greeks were not willing to be under Roman rule. So they sent word to Pyrrhus that they were in trouble and would like him to help them. Preparations for war were at once made and as soon as possible Pyrrhus landed on the shores of Italy with an army of about 30,000 men and 20 elephants. A great battle was fought and Pyrrhus won the victory but the loss of life was dreadful. As he walked among the dead after the battle he said another such victory and I shall have to go home alone. Half his men were slain. However the Greeks of south Italy furnished him with fresh soldiers and he gained a second victory. The war came to an end in a very curious way. One of the servants of Pyrrhus deserted to the Romans and offered to poison his master for the consuls. The consuls sent back the deserter to Pyrrhus under guard and with a message that they scorned to gain a victory through treason. Pyrrhus does show his gratitude then sent back to Rome all the prisoners whom he held without asking any ransom. This made the enemy's friends and a truth was concluded. It was one of the terms of the truth that Pyrrhus should leave Italy. A large number of Greeks lived in Sicily. They had built Syracuse and other large cities and towns. At the time Carthage in Africa was a powerful city and the Carthaginians were trying to conquer the Sicilian Greeks. Pyrrhus crossed to Sicily to help his countrymen. But his Italian friends got into trouble with the Romans again and begged him once more to help them. Accordingly he left Sicily and went back to Italy. Now, however, his good fortune foresoaked him. He was totally defeated by the Romans and forced to leave Italy. He now returned to Epirus but as he was no lover of peace he soon went to war a second time with Macedonia. Again he conquered the land of Alexander but again the king of Macedonia again the kingdom. Not content to rule Epirus Pyrrhus next went into the Peloponnesus and fought against the Spartans but they drove him from their territory. Finally he went to Argos and fought in a civil war which was going on in that state. A fight took place in one of the streets of Argos and during it a woman threw a tile from the roof of her house. It stuck Pyrrhus upon the head and stunned him and some of the soldiers of the party against whom he was fighting run up and killed him. 287 BC 2. Sicily about whose struggle you have just read was the home of a famous mathematician named Archimedes. He was born at Syracuse in 287 BC and was only a boy when Pyrrhus was in Sicily helping the Cartagenaeans fight the Sicilians. Many years later Syracuse was besieged by another enemy, the Romans. Archimedes then an old man proved of great help to his countrymen. He invented engines for throwing stones on the enemy. By using these engines the Sicilians kept the Romans at bay for a long time. It is said that Archimedes set fire to the Roman ships with powerful burning glasses. At last, however, Syracuse fell and Archimedes was put to death by a Roman soldier contrary to the order of the Roman commander. End of chapter 30 Chapter 31 of Famous Men of Greece For more information or to volunteer please visit LibriVox.org Recording by Christine Famous Men of Greece by John H. Harn and A. B. Paul Chapter 31 Cleomines III About 100 years after the death of Alexander the Great lived a young prince named Cleomines. His father was one of the kings of Sparta and bore the name of one of the greatest of Greek hero, Leonides the famous defender of Thermopylae. One day, when the prince was about 18 years old, he start from home to go hunting. He had not gone far from the city gate when one of his father's slaves overtook him and handed to him a writing tablet. On its vexed surface Cleomines read the words Leonides the king took Cleomines. Come back to the palace the moment you have read this note. Cleomines turned and went back towards the city. Late in the afternoon he reached the palace. The gateway was hung with a garland of flowers and entering he found the woman busily arranging roses and lilies in every room. As soon as he saw his father he asked, is anyone going to be married? replied his father. This evening I wish you to marry Agiatis the widow of King Agis. I am having the palace decorated for the wedding. She is beautiful and good and the heroes of one of the richest men in Sparta. But, said Cleomines, how can she ever be willing to marry your son? I am the king, replied Leonides, and she is bound to obey me. Since you wish it, I will marry her of Cleomines. But I never can hope that she will love me. Cleomines had good reason for saying this. For Leonides had caused his fellow king Agis the husband of Agiatis to be murdered. Agis had been one of the best and greatest of Sparta's kings. He had been distressed at the state of his country when he came to the throne. The old customs of Lycorgos had been set aside. Since the close of the Peloponnesian when Sparta had proved more than a much for Athens, a great change had come over the kingdom. Her men were no longer warriors. The hope of Agis was that he might persuade the people to live according to the old laws which no one now obeyed. But Leonides, his fellow king, did not wish to return to the old ways of living and the five Ephors, or magistrates of Sparta, were friends of his. They determined to put Agis to death. The Ephors seized him upon the street and carried him to prison. And for no other reason than that he had tried to carry out the laws of Lycorgos and restore the glory of Sparta. He was put to death. This had been done at the orders of Leonides. Cleo-men therefore had reason to think that Agiatis never would marry him. However, the marriage took place as Leonides wished. And although Agiatis hated Leonides and feared her husband, she soon learned to love Cleo-menes who was manly and true and who devoted his life to making her happy. She talked to him of Agis and what he had wished to do for Sparta. As Cleo-menes listened, he made up his mind to do just what Agis had wished to do. He saw that luxurious ways of living had beaten Sparta and destroyed her influence. And he saw also that his father's friends were not so few good and brave men still left in Sparta. But rich men who cared for nothing but money and pleasure. 2. Leonides died a few years after the murder of Agis and then Cleo-menes became king. At this time a great general named Aratus was at the head of the league of Greek cities called the Achaean League. It seemed likely that it would soon control all the Peloponnesos. Cleo-menes therefore persuaded the Spartans to go to war against the Achaeans. In several battles he defeated Aratus and won for himself great fame as a soldier. This made the Spartans very fond of him and he thought that the time had arrived when he might persuade them to obey once more the old laws and customs. But the efforts were opposed to the changes which he wished to make and so he boldly put them to death. Next day he banished 80 citizens who were opposed to his plans. He then explained to the people why he had done this and why he had put the efforts to death. If without bloodshed he said, I could have driven from Spartan luxury and extravagance debts and usury, the riches of the few and the poverty of the many I should have thought myself the happiest of kings. He declared that the laws of Likurgus must be enforced to the land we again divided among the citizens. The people who had delighted when they heard all this and much more were they pleased when Cleo-Mins and his father-in-law were the first to give up their lands for division. The rest of the citizens did the same and so 600 years after Likurgus there was a new division of property and once more every Spartan had land enough to raise wheat and oil and wine for his family for a year. Against the citizens dying at public tables on simple Spartan fear and the youths were trained and reeled as Likurgus had ordered. The Pyrrhic dance which trained soldiers in quick movements was revived. Against the army was well disciplined and the soldiers of Sparta became as long ago the best among the Greeks. The king himself set his people an example of simple living. Some of the Greeks had loved when Cleo-Mins is said he would tread in the steps of Likurgus and Solon. But when they saw Sparta victorious on the battlefield and the city prosperous and happy once more they could not help admiring the men who had brought the change about. But in time a dreadful disaster befell Cleo-Mins and Sparta. The Achaian League invited the Macedonian king Antigonus to bring an army to help them against Cleo-Mins. And in a single battle the Spartans lost almost everything that they had gained. The other king who was Cleo-Mins own brother was killed and out of 6,000 men whom he commanded only 200 survived. Cleo-Mins made his way to Sparta and advised the citizens to submit to the Macedonians which they did and the independence of Sparta was gone forever. Cleo-Mins had hopes of getting help from Ptolemy king of Egypt so he sailed to that country and he was promised assistance. But unfortunately Ptolemy died and the next king made Cleo-Mins a prisoner because an enemy of the great Spartan had said that he was plotting against the Egyptian king. Cleo-Mins saw no way of escape and so put an end to his life. He was one of the greatest men of the last days of Greece. End of the chapter 31 Chapter 32 of Famous Men of Greece This is a LibriVox recording All LibriVox recordings are in the public domain. For more information or to volunteer please visit LibriVox.org Recording by Christine Famous Men of Greece by John H. Haran and A. B. Poland Chapter 32 The Fall of Greece The States of Greece tried again and again to throw off the Macedonian yoke. Unfortunately, however, they often quarreled with one another and were not ununited against Macedonia. For this reason the kings of that state kept their place as masters of Greece for another hundred years. Then the Romans invaded the country and in a battle fought near a town called Pidna, the Macedonians were defeated and their king Perseus was taken prisoner. This brought the Macedonian kingdom to an end. Macedonia was made part of the Roman Empire and men were sent from Rome to rule it. Epirus was next captured. 150,000 of its inhabitants were sold into slavery and the state was made a Roman province. After the fall of Macedonia, the other states of Greece still continued fighting with one another. So in about 20 years in 1846 a Roman army was sent against them. A battle was fought near Corinth in which the Greeks were completely defeated. Corinth at that time was one of the richest and most beautiful cities in the world. After the battle the Roman general led his soldiers enter the houses and take what they pleased. Pictures, marbles, statues and jewelry were taken and shipped to Rome. It is said that two of the rough Roman soldiers played a game of dice on one of the finest pictures. So little did they value works of art. 2000 of the men of Corinth were put to death by the Romans and the women and children were made slaves. After the buildings of the city had been plundered they were set on fire. And now Athene, Thebes, Sparta and other Greek states became like Macedonia the Empire of Rome. From the rule of Rome Greece passed in the Middle Ages under the rule of Turkey and it was only about 75 years ago that she revolted from Turkey and became once more an independent country. If ever you go to Greece a thousands of people do to visit the places where her great men lived you will see little but ruins. The columns of the temples are broken the stones of their walls lies scattered on the ground and yet Greece even amid ruin and decay is still teaching the world. Many of the words that stand for branches of learning in our language today are Greek words. Such words are arithmetic and mathematics. They show plainly that the first teachers of mathematics in Europe were Greeks. Gymnasium and athletics are also Greek words. They show that the Greeks set as the example running races, wrestling, jumping throwing words and doing other such things to make our body strong. Poet too and poem are Greek and remind us that the Greeks taught us how to write poetry. Grammar, rhetoric and geography are Greek words so are logic, astronomy and surgery. These and hundreds of other words in daily use show how much we have inherited from the Greeks. Although the old-time glory of Greece has waned the light of art and science which she kindled in the world grows brighter as time rolls on. End of the chapter 32 End of the famous man of Greece by John H. Haran and A. B. Poland


In 1854, a case report was published in the precursor of the British Medical Journal, suggesting 2 to 3 tablespoons of Brewer's yeast every day could cure diabetes within six weeks. But it took another 150 years before it was finally put to the test. Now randomized, double-blind, controlled clinical trial of about a half of a teaspoon of Brewer's yeast a day for three months. What happened? A significant drop in fasting blood sugar and hemoglobin A1c, as well as an improvement in insulin sensitivity. What do these numbers mean, though? Hemoglobin A1c is a measure of how higher blood sugar has been over time. Under 6 means you've been having normal blood sugar. Between 6 and 6.5 means you have pre-diabetes, and anything over 6.5 means you have diabetes. Now you can have well-controlled diabetes, or way out of controlled diabetes, but anything over 6.5 is considered diabetic. In the study, the placebo group started up at around 9, stayed up around 9, but the Brewer's yeast group dropped from 9 to 8. So the placebo group was stuck up at 9, and the yeast group dropped from 9 down to 8. So they weren't cured, but in three months' time, they were able to achieve significantly better diabetic control, just eating a half a teaspoon of Brewer's yeast a day, which would cost about four pennies a day, four cents a day. What about for just seven weeks? Again, a total of about a half a teaspoon of Brewer's yeast a day. Started out with an A1c level of 8. The placebo appeared to help a bit, but the yeast even more. From 8 down to an almost non-diabetic 6.6, that's amazing. How could it be? Well, the drug industry has been trying for decades to discover the so-called glucose-tolerance factor in yeast. After all, no shareholder is going to be happy with the therapy you can buy for only four cents a day. We know that whatever it is in yeast that's doing, it contains the trace mineral chromium. Well, can you just give chromium supplements alone? Just giving straight chromium does not appear to be particularly effective. Might the special fiber in yeast, the beta-glucans, play a role? Supplementation with the amount of beta-glucan found in 2 to 3 teaspoons of Brewer's yeast a day did result in a slimmer waist and a drop in blood pressure within six weeks. They trimmed about an inch off their waist, despite no significant change in caloric intake. Blood pressures were significantly reduced as well, in effect also seen with whole Brewer's yeast. Just a half teaspoon of Brewer's yeast a day led to a significant drop in high blood pressure, which, incidentally, is a key contributor to the cardiovascular and kidney complications of diabetes.