text:
Pioneers go 1-2 at Algona quad (High School Sports ~ 01/09/19)
The Okoboji wrestling team went 1-2 at a quadrangular hosted by Algona on Tuesday. The Pioneers defeated Estherville Lincoln Central, but fell to Blue Earth Area (Minnesota) and Algona. Okoboji earned six individual wins to top the Midgets 51-18. At 152 pounds, Jacob Bockman pinned ELC's Chase Budach in 4 minutes, 34 seconds. At 160 pounds, Izaac Ramirez-Woodley pinned Eli Hanson in 3:25. At 113 pounds, Jesse Bockman earned a 6-2 decision over Quintin Marquez...
Spirit Lake girls edged by Rock Valley at home (High School Sports ~ 01/09/19)
The Spirit Lake girls basketball team played well but did not do enough down the stretch to come away with a win Tuesday evening, as the Indians fell 44-41 to Rock Valley. Neither team led by more than six points in the back-and-forth contest. "Rock Valley is a good, physical basketball team who hit some big shots when they needed to," Spirit Lake coach Naet Hoaglund said. ...
Indians earn bounce-back win over Rockets (High School Sports ~ 01/09/19)
After starting the second half of the hoops season with back-to-back road losses to Storm Lake and Waverly-Shell Rock, Spirit Lake bounced back in a big way with a 14-point home win over Rock Valley on Tuesday. The Indians topped the Rockets 68-54 in non-conference boys basketball action...
No. 3 Mustangs too much for young Wolves (High School Sports ~ 01/09/19)
The young Harris-Lake Park boys hoops squad took a moral victory away from a Thursday matchup with third-ranked (1A) George-Little Rock, but the Mustangs came away with the win, topping the Wolves 64-37 in Lake Park. Harris-Lake Park trailed by just one point after one quarter, but George-Little Rock was just too much to handle in the final three periods...
Wolves fall behind early in loss to Mustangs (High School Sports ~ 01/09/19)
Harris-Lake Park struggled early in its first action of 2019, as the Wolves fell behind in a 20-point home loss to George-Little Rock Thursday. The Mustangs trampled the Wolves 63-43 in non-conference girls hoops action in Lake Park. "George-Little Rock played very tough defense against us with good press," Harris-Lake Park coach Andy Irwin said. ...
Pioneers suffer narrow road loss to E-Hawks (High School Sports ~ 01/09/19)
Okoboji battled but ultimately fell in a non-conference boys basketball road trip to Emmetsburg on Thursday. The E-Hawks edged the Pioneers, 59-55. "I think credit needs to be given to Emmetsburg for hitting some outside shots throughout the course of the game and taking advantage of some good looks around the hoop tonight," Okoboji coach Ryan Stumbo said. ...
No. 10 Pioneers extend win streak in Emmetsburg (High School Sports ~ 01/09/19)
Okoboji extended its winning streak to six games Thursday, as the 10th-ranked (3A) Pioneers topped Emmetsburg 52-40 on the road in non-conference girls hoops action. "We were really pleased with how the girls got after it on the defensive end of the floor tonight and, like we always talk about as a team, defense is what will win games for us," Okoboji coach John Adams said. ...
Pioneers win 3 at Lake View quad (High School Sports ~ 01/09/19)
The Okoboji wrestling team picked up a trio of convincing victories Thursday at a quadrangular hosted by East Sac County. The Pioneers defeated Pocahontas Area, Manson-Northwest Webster and East Sac County in Lake View. "We ended our first half of the season before Christmas with some outstanding performances at our home invite," Okoboji coach Nate Dau said. "Tonight, we saw the same intensity and a lot of our kids picked up right where they left off. Great effort all around."...
Rieck sets career milestone in win over Tornadoes (High School Sports ~ 01/09/19)
Spirit Lake Park senior wrestler Kyler Rieck set yet another career milestone Thursday in his team's 42-33 dual meet win over Storm Lake. The top-ranked wrestler at 152 pounds in Class 2A and returning state runner-up secured the 150th win over his prep career by pinning Storm Lake's Tegan Mattson in 54 seconds...
Sunscreen and sunglasses go hand-in-hand — even in winter (Outdoors ~ 01/09/19)
We've had a really nice stretch of weather to begin the month of January. Warm temperatures and sunny conditions make us all yearn to be outside. However, when we do spend extended periods of time in the sun, don't forget the sunscreen and the sunglasses...
Wild Game Feed benefit set for Saturday, Jan. 12 (Outdoors ~ 01/09/19)
Mark this date and location on your calendar: Saturday, Jan. 12 at Haggy's in Royal for the annual Iowa Great Lakes Fishing Club (IGLFC) Wild Game Feed. All proceeds will go to benefit the Jim McDonnell Scholarship for seniors that will be awarded out later this spring...
Mid-season ice fishing tips (Outdoors ~ 01/09/19)
In many areas where anglers fish through the ice this time of year, we are at about the midway part of the season. Most lakes have a good cover of ice as well as some snow. We also have cold weather, lots of it. There are a number of things we can do to catch more fish through the ice this time of year, but you've got to go fishing to catch'em. ...
One in a million (Outdoors ~ 01/09/19)
If you happened to watch any college football games from the mid-60s through 2006, you probably listened to the great voice of Keith Jackson, who was one of the most famous play-by-play announcers in history. One of his often-remembered exclamations was the phrase, "Whoa Nellie!" When emphatically said, listeners knew that they had just witnessed something truly significant...
IWCOA announces first interscholastic Iowa High School Girls Wrestling Championships (High School Sports ~ 01/09/19)
The Iowa Wrestling Coaches and Officials Association (IWCOA) is pleased to announce its first interscholastic Iowa High School Girls Wrestling Championships Saturday, Jan. 19, at Waverly-Shell Rock High School.
The 2019 championship event conducted by the IWCOA marks the end of the second season in which Iowa High School Athletic Association member schools offered females the opportunity to compete in girls' divisions. ...
Wolves snap 3-game skid with win over Generals (High School Sports ~ 01/09/19)
The Harris-Lake Park girls basketball ended a three-game losing streak with a dominant 64-37 non-conference road win over Sibley-Ocheyedan on Monday. The Wolves outscored the Generals 15-9 in the first quarter and 26-10 in the second to take a commanding 41-19 lead at the half...
Spirit Lake boys struggle at Waverly (High School Sports ~ 01/09/19)
Coming off of a tough loss to Storm Lake the night before, the Spirit Lake boys basketball team struggled mightily in a 41-27 road loss to Waverly-Shell Rock at Wartburg College on Saturday. "We did not play well Saturday against Waverly, and I think a little of that came from a hard-fought battle against Storm Lake the night before," Spirit Lake coach Paul Brown said. ...
Okoboji wrestlers place 3rd in Graettinger (High School Sports ~ 01/09/19)
Okoboji placed third as a team Saturday at a wrestling tournament hosted by Graettinger-Terril/Ruthven-Ayrshire. The Pioneers had one champion and five third-place finishers in Graettinger. "We battled back from a tough semifinal round," Okoboji coach Nate Dau said. ...
Comets snap No. 10 Pioneers' win streak (High School Sports ~ 01/09/19)
For the second time this season, the Okoboji girls basketball team saw its win streak snapped by an unranked — though talented — Siouxland Conference team, as the 10th-ranked (3A) Pioneers fell to Boyden-Hull on Friday. The Comets topped the Pioneers 71-66 in Hull, snapping a six-game win streak...
Comets pull away late in win over Pioneers (High School Sports ~ 01/09/19)
Okoboji stuck around for three quarters Friday evening, but host Boyden-Hull pulled away in the fourth quarter to edge the Pioneers by nine in Siouxland Conference boys hoops action. The Comets topped the Pioneers 79-70 in Hull. "We were proud of our guys' decision this game to play with more energy on both sides of the ball, similar to how we did just prior to the holiday break," Okoboji coach Ryan Stumbo said. ...
Indians struggle late in road loss to Storm Lake (High School Sports ~ 01/09/19)
Spirit Lake started the second half of the boys' hoops season with a 63-55 road loss to Storm Lake Friday despite playing three quarters of solid basketball, according to first-year coach Paul Brown. "I was really happy with how our guys played through three quarters of the game," Brown said. ...
Gehlen opens huge lead in win over Wolves (High School Sports ~ 01/09/19)
Gehlen Catholic outscored Harris-Lake Park 21-2 through one quarter of play Friday in a 23-point road win in Lake Park. The Jays topped the Wolves 69-46 in War Eagle Conference girls hoops action. "We had a slow start to the game," Harris-Lake Park coach Andy Irwin said. "If you take out the first quarter, we played a good game against a good opponent. After a 21-2 deficit after the first quarter, our girls didn't give up and played hard the rest of the game."...
Wolves surrender early lead in home loss to Jays (High School Sports ~ 01/09/19)
Harris-Lake Park jumped out to an early lead Friday, but could not maintain their offensive pace in a loss to Gehlen Catholic in Lake Park. The Wolves fell 58-46 to the Jays in War Eagle Conference boys basketball action. "I thought we had a great finish to the first half, outscoring Gehlen 11-3 the last 4 minutes of the second quarter," Harris-Lake Park coach Jeff Sohn said. ...
Indians earn road rout over Tornadoes (High School Sports ~ 01/09/19)
A second-half scoring surge led to a Spirit Lake road rout of Storm Lake Friday evening. The Indians topped the Tornadoes 55-22 in Lakes Conference girls hoops action to open the second half of the basketball season. "I'm proud of the effort our girls put forth tonight," Spirit Lake coach Naet Hoaglund said. ...
ON A ROLL (High School Sports ~ 01/09/19)
Spirit Lake Park went undefeated Friday to keep its dual record unblemished with a first-place finish at the Jerry Hentges Dual Tournament in Spirit Lake. The eighth-ranked (2A) Indians defeated Sibley-Ocheyedan, MOC-Floyd Valley, Sioux City North and West Lyon on the day...


text:
Brooks: Porous border is Congressional Democrats' betrayal
Brooks: Porous border is Congressional Democrats' betrayal
National News State
Elections National News State
Bill Britt Featured Columnists National News Opinion State
Opinion | It's time for criminal justice reform
Featured Columnists Josh Moon National News Opinion State
HRC denounces Merrill's anti-LGBTQ comments
16 States, including Alabama, still have no anti-FGM laws
Ivey said "world stood still" when man first walked on the moon
Tuesday, Congressman Mo Brooks (R-Huntsville) cosponsored two bills that promote border security by funding the U.S.-Mexico border wall, H.R. 7059, the Build the Wall, Enforce the Law Act of 2018, and H.R. 7073, the 50 Votes for the Wall Act. Brooks said that Democrats in Congress, "Betray America by failing to secure the border."
"Congress, generally, and open border Democrat Congressmen and Senators, in particular, betray America by failing to secure our border," Rep. Brooks said in a statement. "In 2016, Sixty-three million Americans voted to secure America's borders. The concept and reasoning is simple. A country that cannot defend its borders is no country at all. Americans do not want their future degraded to that of a two-bit, third-world nation. Yet, that is where we are headed if we do not act soon to enforce America's already very generous immigration laws."
"Consistent with my loyalty to America, I've cosponsored Majority Leader Kevin McCarthy's Build the Wall, Enforce the Law Act of 2018 and Alabama Congressman Bradley Byrne's 50 Votes for the Wall Act," Brooks added. "Both enhance America's national security by protecting America's borders."
"The Build the Wall, Enforce the Law Act of 2018 provides full border wall funding, supports federal immigration enforcement officers, defunds sanctuary cities, stiffens sentences for criminal illegal aliens who reenter the country, and expedites deportation of dangerous illegal alien criminals," Brooks continued. "The 50 Votes for the Wall Act neuters open borders Democrat Senator obstructionism by allowing a majority vote to pass legislation (rather than the 60 vote passage threshold normally required). Let me be very candid, illegal aliens are a plague on America. Illegal aliens take American jobs and suppress American wages. Too often, illegal aliens live off welfare and taxes paid by American families and commit crimes that hurt or kill Americans. Far too often, illegal aliens vote in American elections, each time cancelling the lawful vote of an American citizen. Each illegal alien vote is a direct threat to our Republic's democratic process. With a caravan of thousands brazenly hell bent on illegally crossing our border and assaulting our national sovereignty, now more than ever is the time to secure our border. Congress must act. Failing that, President Trump must fulfill his commander-in-chief duties and employ America's military to protect American lives, America's sovereignty, and America's southern border."
Build the Wall, Enforce the Law Act of 2018 includes: $23.4 billion in appropriations for Trump's Border Wall, with $5.5 billion provided in FY19 and the remainder spread through FY20-25; the recent House passed resolution in support of ICE (H.Res. 990); cuts off funding for certain grants to states and localities that fail to comply with detainer requests from ICE; raising the maximum sentence for criminal alien reentry from 10 years to 25 years in federal prison; and H.R. 3697, the Criminal Alien gang Member Removal Act, which expedites detention and removal proceedings for those illegal aliens found to be participating in gang activity.
The 50 Votes for the Wall Act includes $25 billion in appropriations for Trump's Border Wall and uses the budget reconciliation process to pass the bill in the Senate with 50 votes.
Congressman Brooks has sponsored the House companion legislation (H.R. 2186) to Senator Ted Cruz's EL CHAPO Act, which would fund the border wall using assets forfeited to the United States Government as a result of the criminal prosecution of El Chapo, the former leader of the Sinaloa drug cartel, as well as other drug lords.
Congressman Brooks has been very outspoken about the need to control immigration and dramatically improve border security.
Brooks is seeking his fifth term representing the Fifth Congressional District.
Brooks faces Democrat Peter Joffrion in the November 6 general election.
Related Topics:2018 election50 Votes for the Wall Actbetrayalborder securityborder wallBradley Byrnebuild the wallCongressDonald TrumpEl Chapo ActEnforce the Law Actfifth congressional districtH.R. 7059H.R. 7073illegal aliensimmigration reformKevin McCarthyMo BrooksTed Cruzundocumented immigrants
Palmer campaigns in Gardendale
Judge Roy Moore weighs in on attorney general's race

redpajama_set_name: RedPajamaCommonCrawl


text:
Monte Pittman: Pain, Love & Destiny
Destiny takes a strange path sometimes. When Monte Pittman quit his job at an LA music store in 1999 to become a guitar tutor, his third student was none other than movie director Guy Ritchie.
Madonna (Ritchie's wife at the time) had bought him a guitar and when Ritchie returned the compliment and bought one for Madonna, Monte was on hand to show her the ropes.
She must have been impressed with his skills as he's been an ever-present in her live band since and has co-written several tracks with the star.
Monte is not one to rest on his laurels though, and any time off is poured into other musical projects. Whether it be writing and performing with metal band Prong, writing with American Idol star Adam Lambert OR performing his new record 'Pain, Love & Destiny' (loosely inspired by the movie Watership Down) with his own band (including Randy Rhoads's brother Kelle on piano), his passion for music is unsurpassed.
We caught up with him on a rare day off…
How does it feel to be the centre of attraction as apposed to being part of the backing band?
It's a lot more work. Right now, Kane Ritchotte and Max Whipple from the band Vas DeFrans are playing with me and they are incredible musicians. No matter what you are doing live, you have to have a great team behind you.
Did you always plan to become a solo artist?
Yes, in between playing for others. To have my own band of some sort is something I can always do and it's great to be able to do whatever I want with, plus I've always had a really amazing singer in the bands I started.
Where did you record Pain, Love & Destiny?
White Buffalo Studios in the Bedrock Studio complex in Echo Park.
Would you call Pain, Love & Destiny a 'concept' album?
I didn't create it that way but it could be taken that way. Everything together tells a story from front to end but some of the music was written over ten years ago and some was written just before being recorded.
Have you seen the movie Watership Down?
Yes! It's awesome. That's a movie that I wouldn't mind seeing a remake of. I'm sure it's just a matter of time. Watership Down is one of my favorite stories. It tells you to follow your heart.
Was it easy to teach Madonna how to play guitar?
She's hard working at everything she does. It's been a lot of fun and a really cool experience.
Do you have any advice for someone just starting to learn the guitar?
Learn your chords and scales. Don't just learn songs. You have a window of opportunity when you first start playing because it's new and fresh to you.
What is your favorite chord?
C# minor 9
How do you manage to juggle touring with spending time with your kids?
You have to find the balance somewhere. Sometimes one or the other suffers..
Were you also in a band with Adam Lambert before he was on American Idol?
Yes. We were called The Citizen Vein. It had Tommy Victor on bass and Steve Sidelnyk on drums. We played off and on around Los Angeles for a year or two. Different people were out of town at different times so it made it tricky getting everybody together sometimes.
I heard you have your own signature guitar coming out?
Yes, it's by a new guitar maker, Jarrell Guitars. It's called the MPS. The idea behind it is that can cover a wide variety of sounds. I could play an entire Madonna show with it or I could play an entire Prong or Adam Lambert show with it.
What is your favourite guitar pedal?
At the moment my old Electro Harmonix Memory Man.
What are your plans for the rest of the year and 2012?
To keep getting the word out about Pain, Love & Destiny and playing anywhere and everywhere.
For more info on Monte visit www.montepittman.com
This entry was posted in Music and tagged Dec11, Music, Music Interview, UK.
City Reign: Booted and Suited
Deers / The Olympians: Waterfront Studio Norwich


text:
Mirror From Stone
By Kourosh Keshavarz
Mirror From Stone is the memoir of Kourosh, as he adjusts to post revolution life in Iran before and during the war. More
Having spent his early childhood in Sydney, Kourosh and his family return to Iran at the height of the Islamic Revolution in 1979. Their attempt to settle into family life is disrupted as the country changes government, sets in reforms and is plunged into a war with Iraq which eventually drives the family to attempt to return to Australia. Mirror From Stone is the memoir of Kourosh, as he adjusts to post revolution life in Iran before and during the war. It then follows him as he crosses the border into Pakistan, with people smugglers to re-unite with his family. It is the story of a family's struggle to adapt to a different culture, stay together and above all, find peace.
Category: Nonfiction » Biography » Historical biography
Category: Nonfiction » Biography » Autobiographies & Memoirs
Tags: memoir war biography autobiography revolution immigration iran iranian persia persian
About Kourosh Keshavarz
I was born in Iran in 1970 and spent the first 7 years of my life in Sydney while my father completed his PHD.
We returned to Iran at the height of the Islamic Revolution in 1979 and was there till the war finished in 1988.
Since then I have been living in Sydney and working in anything from Computers to Network Management to Project Management in Telecommunications.
For the last five years or so I have been dabbling in video editing, photoshopping and 3d graphic development. I have also began writing in 2000 and have now published my first book "Mirror From Stone" which is available on Amazon.
Learn more about Kourosh Keshavarz
Nonfiction > Biography > Religious biography
Nonfiction > Biography > Celebrity biography
Nonfiction > History > American
Nonfiction > Biography > Military biography
Nonfiction > Biography > Personal memoir
At www.amazon.com
You have subscribed to alerts for Kourosh Keshavarz.
Would you like to favorite Kourosh Keshavarz?
Yes, add Kourosh Keshavarz to my Favorites
You have been added to Kourosh Keshavarz's favorite list.
You can also sign-up to receive email notifications whenever Kourosh Keshavarz releases a new book.


I have posted my sales list for anyone looking for a few good quality sheep to add to their flock. A few lambs and a few proven adults. I sold 9 before my sales list was even posted, so if something appeals to you, let me know right away.


Heart shaped suckers with a swirl of red and white colors. These are perfect for your Valentine classroom exchange. The youngsters will be thrilled to find a heart shaped sucker along with there valentine card.
22 Valentine Suckers per bag.


Celebrate the delicious flavours of autumn with a Michelin starred Pumpkin Afternoon Tea at Bohemia restaurant in Jersey.
Priced at just £19.95 per person, new Pastry Chef Ellen de Jager has created an exquisite tea featuring delightful autumnal themed treats such as a Pumpkin Cake made with butternut squash, walnut and cinnamon. The cake is then delicately finished with a frosting of reduced butternut squash with coco butter, sprayed on to achieve the look of a realistic mini pumpkin.
The tea also features a Spiced Blackcurrant & Liquorice Delice layered cake, made using enticing autumnal spices such as cloves and star anise. Jersey Black Butter (a unique Jersey Apple Conserve from the cider making process) is served with the freshly baked scones, offering another rich autumnal flavour.
The Pumpkin Afternoon Tea also includes a delightful mix of: Bohemian Tea Sandwiches; Traditional Scones served with Strawberry Jam, Jersey Black Butter and Jersey Clotted Cream; and a delicate selection of fine Cakes & Fancies.
All Afternoon Teas are served with a collection of Loose Leaf Teas and Herbal Infusions from Jersey's own Cooper & Co, including refreshing flavours such as: Jamaican Rum; Funky Flower Garden; and Moroccan Mint Tea.
The Afternoon Tea is served from 2.15pm until 5.30pm and can be enjoyed in Bohemia Bar & Restaurant, on the Roof Terrace, and even the poolside ivy clad Terrace.


text:
namespace Mews.Eet.Dto.Identifiers
{
    public class PremisesIdentifier : IntIdentifier
    {
        public PremisesIdentifier(int value)
            : base(value, 1, 999999)
        {
        }
    }
}

redpajama_set_name: RedPajamaGithub


Czy kiedykolwiek patrzyłeś na proces developmentu i myślałeś "Musi być lepszy sposób"? Jeszcze półtora roku temu też tak myślałem. Wraz z moim zespołem od ponad roku niemal codziennie odkrywamy kolejne zalety pracy z Trunk-Based Developmentem, tak jak zespoły Facebooka i Google'a. O nim w tym artykule.
Jakie zalety niesie ze sobą Trunk-Based Development oraz jak zaimplementować go w waszych projektach? Na to pytanie postaram się odpowiedzieć. Poniższą treść przygotowałem w języku angielskim.
Kamil Mówiński. Full-stack Developer w STX Next. Swoją zawodową karierę rozpoczynał dobrych kilka lat temu, realizując projekty związane z PHP-em – zamiłowanie do Pythona przyszło nieco później (i tak już zostało). Początkowo pracownik Wrocławskiego Centrum Sieciowo-Komputerowego, później przez chwilę wrocławskiego Techlandu. Od prawie 2 lat współpracuje z STX Next, zawsze zwracając uwagę na wysoką jakość kodu. Prywatnie miłośnik jazdy konnej i motorów. Gdyby nie wybór ścieżki developerskiej, prawdopodobnie wybrałby karierę naukową na kierunku związanym z robotyką.
What you see above is an example flow of just one developer's work. Could you image how many branches we would have if our company grew to 100 developers? And what would happen if the number of teams grew to 100?
There would probably be continuous merging development. And any merges often would end with conflicts. In other words, you'd be facing merge hell. No one likes a merge conflict. When it occurs, one needs to focus both on his/her part of the code as well as the code of another developer.
There is a rescue for merge hell. But changes can take some time. Trunk-Based Development rejects any feature branches, hotfix branches, parallel release branches. There is only one branch available to the developers—the Trunk.
4. Commits should be reviewed and tested and must not destroy the mainline.
After planning, our board should be filled with tasks. They should be quite small and provide a good description of new features. Now, we must remember that every piece of code we write should be well-tested, which is a great opportunity to introduce TDD in your work.
We have only 3 components which depend on Memcached in our system, but in reality, it is possible that the number of components will be huge. The first step is to create an abstraction layer between one client (e.g. LastUploadedChunk) and Memcached (please remember that in everyday committing we must not break the trunk). The current situation is illustrated in the picture below.
1. Create an abstraction layer for one client using the old component.
2. Redirect all clients to use the abstraction layer.
3. Create a new component for only one client and connect them via the abstraction layer.
4. Develop the new component and test it.
5. Redirect the abstraction layer to use only the new component.
6. Remove the old component.
One of the most common arguments for Feature Branch Development is that some features are developed longer than one day, over multiple commits, even if they are intended for one release. So how do you bring it together with TBD?
check that all toggles on, even in unfinished features.
1. Create a new flag in a config file or a database.
2. Hide a new feature behind the flag.
3. Develop the new feature as long as it is required (it is still covered by the flag).
4. Prepare a list of flags for the current release.
5. Remove flags of features which are in production from the config file/the database.
As Cory House once said: "Code is like humor. When you have to explain it—it is bad". Following this rule, the best judge of the clarity of your code will be a code review (or peer review).
This aspect of TBD is pretty simple. We must cover our feature with tests. There are two possibilities of testing. In the first one, we deliver unit tests for a newly created method or function. Remember, unit tests should cover only the tested function, other functions should be a stub or mock.
Another group of tests covers the integration process. At some point, we might write code which uses functions from a separate module. This connection should also be tested. For a moment, let us try to look at testing from the perspective of a tester. We have a bunch of flags so we can easily turn a feature on and off. It is a great opportunity to introduce A/B testing to our company.
I have intentionally skipped the word "branch" in the section title. Why? There are two options how to properly create releases in Trunk-Based Development. A choice should be based on how frequently the releases are made.
Artykuł został pierwotnie opublikowany na blog.livingstone-game.com. Zdjęcie główne artykułu pochodzi z unsplash.com.


text:
package io.hawtjms.provider.failover;

import io.hawtjms.jms.JmsSslContext;
import io.hawtjms.jms.message.JmsDefaultMessageFactory;
import io.hawtjms.jms.message.JmsInboundMessageDispatch;
import io.hawtjms.jms.message.JmsMessageFactory;
import io.hawtjms.jms.message.JmsOutboundMessageDispatch;
import io.hawtjms.jms.meta.JmsConnectionInfo;
import io.hawtjms.jms.meta.JmsConsumerId;
import io.hawtjms.jms.meta.JmsResource;
import io.hawtjms.jms.meta.JmsSessionId;
import io.hawtjms.provider.AsyncProvider;
import io.hawtjms.provider.AsyncResult;
import io.hawtjms.provider.DefaultBlockingProvider;
import io.hawtjms.provider.DefaultProviderListener;
import io.hawtjms.provider.ProviderConstants.ACK_TYPE;
import io.hawtjms.provider.ProviderFactory;
import io.hawtjms.provider.ProviderListener;
import io.hawtjms.provider.ProviderRequest;
import io.hawtjms.util.IOExceptionSupport;

import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;

import javax.jms.JMSException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A Provider Facade that provides services for detection dropped Provider connections
 * and attempting to reconnect to a different remote peer.  Upon establishment of a new
 * connection the FailoverProvider will initiate state recovery of the active JMS
 * framework resources.
 */
public class FailoverProvider extends DefaultProviderListener implements AsyncProvider {

    private static final Logger LOG = LoggerFactory.getLogger(FailoverProvider.class);

    private static final int UNLIMITED = -1;

    private ProviderListener listener;
    private AsyncProvider provider;
    private final FailoverUriPool uris;

    private final ExecutorService serializer;
    private final ScheduledExecutorService connectionHub;
    private final AtomicBoolean closed = new AtomicBoolean();
    private final AtomicBoolean failed = new AtomicBoolean();
    private final AtomicLong requestId = new AtomicLong();
    private final Map<Long, FailoverRequest<?>> requests = new LinkedHashMap<Long, FailoverRequest<?>>();
    private final DefaultProviderListener closedListener = new DefaultProviderListener();
    private final JmsSslContext sslContext;
    private final JmsMessageFactory defaultMessageFactory = new JmsDefaultMessageFactory();

    // Current state of connection / reconnection
    private boolean firstConnection = true;
    private long reconnectAttempts;
    private long reconnectDelay = TimeUnit.SECONDS.toMillis(5);
    private IOException failureCause;
    private URI connectedURI;

    // Timeout values configured via JmsConnectionInfo
    private long connectTimeout = JmsConnectionInfo.DEFAULT_CONNECT_TIMEOUT;
    private long closeTimeout = JmsConnectionInfo.DEFAULT_CLOSE_TIMEOUT;
    private long sendTimeout =  JmsConnectionInfo.DEFAULT_SEND_TIMEOUT;
    private long requestTimeout = JmsConnectionInfo.DEFAULT_REQUEST_TIMEOUT;

    // Configuration values.
    private long initialReconnectDelay = 0L;
    private long maxReconnectDelay = TimeUnit.SECONDS.toMillis(30);
    private boolean useExponentialBackOff = true;
    private double backOffMultiplier = 2d;
    private int maxReconnectAttempts = UNLIMITED;
    private int startupMaxReconnectAttempts = UNLIMITED;
    private int warnAfterReconnectAttempts = 10;

    public FailoverProvider(Map<String, String> nestedOptions) {
        this(null, nestedOptions);
    }

    public FailoverProvider(URI[] uris) {
        this(uris, null);
    }

    public FailoverProvider(URI[] uris, Map<String, String> nestedOptions) {
        this.uris = new FailoverUriPool(uris, nestedOptions);
        this.sslContext = JmsSslContext.getCurrentSslContext();

        this.serializer = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {

            @Override
            public Thread newThread(Runnable runner) {
                Thread serial = new Thread(runner);
                serial.setDaemon(true);
                serial.setName("FailoverProvider: serialization thread");
                return serial;
            }
        });

        // All Connection attempts happen in this schedulers thread.  Once a connection
        // is established it will hand the open connection back to the serializer thread
        // for state recovery.
        this.connectionHub = Executors.newScheduledThreadPool(1, new ThreadFactory() {

            @Override
            public Thread newThread(Runnable runner) {
                Thread serial = new Thread(runner);
                serial.setDaemon(true);
                serial.setName("FailoverProvider: connect thread");
                return serial;
            }
        });
    }

    @Override
    public void connect() throws IOException {
        checkClosed();
        LOG.debug("Performing initial connection attempt");
        triggerReconnectionAttempt();
    }

    @Override
    public void start() throws IOException, IllegalStateException {
        checkClosed();

        if (listener == null) {
            throw new IllegalStateException("No ProviderListener registered.");
        }
    }

    @Override
    public void close() {
        if (closed.compareAndSet(false, true)) {
            final ProviderRequest<Void> request = new ProviderRequest<Void>();
            serializer.execute(new Runnable() {

                @Override
                public void run() {
                    try {
                        IOException error = failureCause != null ? failureCause : new IOException("Connection closed");
                        List<FailoverRequest<?>> pending = new ArrayList<FailoverRequest<?>>(requests.values());
                        for (FailoverRequest<?> request : pending) {
                            request.onFailure(error);
                        }

                        if (provider != null) {
                            provider.close();
                        }
                    } catch (Exception e) {
                        LOG.debug("Caught exception while closing connection");
                    } finally {

                        if (connectionHub != null) {
                            connectionHub.shutdown();
                        }

                        if (serializer != null) {
                            serializer.shutdown();
                        }

                        request.onSuccess(null);
                    }
                }
            });

            try {
                if (this.closeTimeout >= 0) {
                    request.getResponse();
                } else {
                    request.getResponse(closeTimeout, TimeUnit.MILLISECONDS);
                }
            } catch (IOException e) {
                LOG.warn("Error caught while closing Provider: ", e.getMessage());
            }
        }
    }

    @Override
    public void create(final JmsResource resource, AsyncResult<Void> request) throws IOException, JMSException, UnsupportedOperationException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws Exception {
                if (resource instanceof JmsConnectionInfo) {
                    JmsConnectionInfo connectionInfo = (JmsConnectionInfo) resource;
                    connectTimeout = connectionInfo.getConnectTimeout();
                    closeTimeout = connectionInfo.getCloseTimeout();
                    sendTimeout = connectionInfo.getSendTimeout();
                    requestTimeout = connectionInfo.getRequestTimeout();
                }

                provider.create(resource, this);
            }
        };

        serializer.execute(pending);
    }

    @Override
    public void start(final JmsResource resource, final AsyncResult<Void> request) throws IOException, JMSException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws Exception {
                provider.start(resource, this);
            }
        };

        serializer.execute(pending);
    }

    @Override
    public void destroy(final JmsResource resourceId, AsyncResult<Void> request) throws IOException, JMSException, UnsupportedOperationException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws IOException, JMSException, UnsupportedOperationException {
                provider.destroy(resourceId, this);
            }

            @Override
            public boolean succeedsWhenOffline() {
                // Allow this to succeed, acks would be stale.
                return true;
            }
        };

        serializer.execute(pending);
    }

    @Override
    public void send(final JmsOutboundMessageDispatch envelope, AsyncResult<Void> request) throws IOException, JMSException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws Exception {
                provider.send(envelope, this);
            }
        };

        serializer.execute(pending);
    }

    @Override
    public void acknowledge(final JmsSessionId sessionId, AsyncResult<Void> request) throws IOException, JMSException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws Exception {
                provider.acknowledge(sessionId, this);
            }

            @Override
            public boolean succeedsWhenOffline() {
                // Allow this to succeed, acks would be stale.
                return true;
            }
        };

        serializer.execute(pending);
    }

    @Override
    public void acknowledge(final JmsInboundMessageDispatch envelope, final ACK_TYPE ackType, AsyncResult<Void> request) throws IOException, JMSException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws Exception {
                provider.acknowledge(envelope, ackType, this);
            }

            @Override
            public boolean succeedsWhenOffline() {
                // Allow this to succeed, acks would be stale.
                return true;
            }
        };

        serializer.execute(pending);
    }

    @Override
    public void commit(final JmsSessionId sessionId, AsyncResult<Void> request) throws IOException, JMSException, UnsupportedOperationException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws Exception {
                provider.commit(sessionId, this);
            }

            @Override
            public boolean failureWhenOffline() {
                return true;
            }
        };

        serializer.execute(pending);
    }

    @Override
    public void rollback(final JmsSessionId sessionId, AsyncResult<Void> request) throws IOException, JMSException, UnsupportedOperationException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws Exception {
                provider.rollback(sessionId, this);
            }

            @Override
            public boolean failureWhenOffline() {
                return true;
            }
        };

        serializer.execute(pending);
    }

    @Override
    public void recover(final JmsSessionId sessionId, final AsyncResult<Void> request) throws IOException, UnsupportedOperationException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws Exception {
                provider.recover(sessionId, this);
            }

            @Override
            public boolean succeedsWhenOffline() {
                return true;
            }
        };

        serializer.execute(pending);
    }

    @Override
    public void unsubscribe(final String subscription, AsyncResult<Void> request) throws IOException, JMSException, UnsupportedOperationException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws Exception {
                provider.unsubscribe(subscription, this);
            }
        };

        serializer.execute(pending);
    }

    @Override
    public void pull(final JmsConsumerId consumerId, final long timeout, final AsyncResult<Void> request) throws IOException, UnsupportedOperationException {
        checkClosed();
        final FailoverRequest<Void> pending = new FailoverRequest<Void>(request) {
            @Override
            public void doTask() throws Exception {
                provider.pull(consumerId, timeout, this);
            }
        };

        serializer.execute(pending);
    }

    @Override
    public JmsMessageFactory getMessageFactory() {
        final AtomicReference<JmsMessageFactory> result =
            new AtomicReference<JmsMessageFactory>(defaultMessageFactory);

        serializer.execute(new Runnable() {

            @Override
            public void run() {
                if (provider != null) {
                    result.set(provider.getMessageFactory());
                }
            }
        });

        return result.get();
    }

    //--------------- Connection Error and Recovery methods ------------------//

    /**
     * This method is always called from within the FailoverProvider's serialization thread.
     *
     * When a failure is encountered either from an outgoing request or from an error fired
     * from the underlying Provider instance this method is called to determine if a reconnect
     * is allowed and if so a new reconnect cycle is triggered on the connection thread.
     *
     * @param cause
     */
    private void handleProviderFailure(final IOException cause) {
        LOG.debug("handling Provider failure: {}", cause.getMessage());
        LOG.trace("stack", cause);

        this.provider.setProviderListener(closedListener);
        try {
            this.provider.close();
        } catch (Throwable error) {
            LOG.trace("Caught exception while closing failed provider: {}", error.getMessage());
        }
        this.provider = null;

        if (reconnectAllowed()) {
            ProviderListener listener = this.listener;
            if (listener != null) {
                listener.onConnectionInterrupted();
            }
            triggerReconnectionAttempt();
        } else {
            ProviderListener listener = this.listener;
            if (listener != null) {
                listener.onConnectionFailure(cause);
            }
        }
    }

    /**
     * Called from the reconnection thread.  This method enqueues a new task that
     * will attempt to recover connection state, once successful normal operations
     * will resume.  If an error occurs while attempting to recover the JMS framework
     * state then a reconnect cycle is again triggered on the connection thread.
     *
     * @param provider
     *        The newly connect Provider instance that will become active.
     */
    private void initializeNewConnection(final AsyncProvider provider) {
        this.serializer.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    if (firstConnection) {
                        firstConnection = false;
                        FailoverProvider.this.provider = provider;
                        provider.setProviderListener(FailoverProvider.this);

                        List<FailoverRequest<?>> pending = new ArrayList<FailoverRequest<?>>(requests.values());
                        for (FailoverRequest<?> request : pending) {
                            request.run();
                        }
                    } else {
                        LOG.debug("Signalling connection recovery: {}", provider);
                        FailoverProvider.this.provider = provider;
                        provider.setProviderListener(FailoverProvider.this);

                        // Stage 1: Recovery all JMS Framework resources
                        listener.onConnectionRecovery(new DefaultBlockingProvider(provider));

                        // Stage 2: Restart consumers, send pull commands, etc.
                        listener.onConnectionRecovered(new DefaultBlockingProvider(provider));

                        listener.onConnectionRestored();

                        List<FailoverRequest<?>> pending = new ArrayList<FailoverRequest<?>>(requests.values());
                        for (FailoverRequest<?> request : pending) {
                            request.run();
                        }

                        reconnectDelay = initialReconnectDelay;
                        reconnectAttempts = 0;
                        connectedURI = provider.getRemoteURI();
                        uris.connected();
                    }
                } catch (Throwable error) {
                    handleProviderFailure(IOExceptionSupport.create(error));
                }
            }
        });
    }

    /**
     * Called when the Provider was either first created or when a connection failure has
     * been connected.  A reconnection attempt is immediately executed on the connection
     * thread.  If a new Provider is able to be created and connected then a recovery task
     * is scheduled on the main serializer thread.  If the connect attempt fails another
     * attempt is scheduled based on the configured delay settings until a max attempts
     * limit is hit, if one is set.
     */
    private void triggerReconnectionAttempt() {
        if (closed.get() || failed.get()) {
            return;
        }

        connectionHub.execute(new Runnable() {
            @Override
            public void run() {
                if (provider != null || closed.get() || failed.get()) {
                    return;
                }

                reconnectAttempts++;
                Throwable failure = null;
                URI target = uris.getNext();
                if (target != null) {
                    try {
                        LOG.debug("Attempting connection to: {}", target);
                        JmsSslContext.setCurrentSslContext(sslContext);
                        AsyncProvider provider = ProviderFactory.createAsync(target);
                        initializeNewConnection(provider);
                        return;
                    } catch (Throwable e) {
                        LOG.info("Connection attempt to: {} failed.", target);
                        failure = e;
                    }
                }

                int reconnectLimit = reconnectAttemptLimit();

                if (reconnectLimit != UNLIMITED && reconnectAttempts >= reconnectLimit) {
                    LOG.error("Failed to connect after: " + reconnectAttempts + " attempt(s)");
                    failed.set(true);
                    failureCause = IOExceptionSupport.create(failure);
                    if (listener != null) {
                        listener.onConnectionFailure(failureCause);
                    };

                    return;
                }

                int warnInterval = getWarnAfterReconnectAttempts();
                if (warnInterval > 0 && (reconnectAttempts % warnInterval) == 0) {
                    LOG.warn("Failed to connect after: {} attempt(s) continuing to retry.", reconnectAttempts);
                }

                long delay = nextReconnectDelay();
                connectionHub.schedule(this, delay, TimeUnit.MILLISECONDS);
            }
        });
    }

    private boolean reconnectAllowed() {
        return reconnectAttemptLimit() != 0;
    }

    private int reconnectAttemptLimit() {
        int maxReconnectValue = this.maxReconnectAttempts;
        if (firstConnection && this.startupMaxReconnectAttempts != UNLIMITED) {
            maxReconnectValue = this.startupMaxReconnectAttempts;
        }
        return maxReconnectValue;
    }

    private long nextReconnectDelay() {
        if (useExponentialBackOff) {
            // Exponential increment of reconnect delay.
            reconnectDelay *= backOffMultiplier;
            if (reconnectDelay > maxReconnectDelay) {
                reconnectDelay = maxReconnectDelay;
            }
        }

        return reconnectDelay;
    }

    protected void checkClosed() throws IOException {
        if (closed.get()) {
            throw new IOException("The Provider is already closed");
        }
    }

    //--------------- DefaultProviderListener overrides ----------------------//

    @Override
    public void onMessage(final JmsInboundMessageDispatch envelope) {
        if (closed.get() || failed.get()) {
            return;
        }
        serializer.execute(new Runnable() {
            @Override
            public void run() {
                if (!closed.get()) {
                    listener.onMessage(envelope);
                }
            }
        });
    }

    @Override
    public void onConnectionFailure(final IOException ex) {
        if (closed.get() || failed.get()) {
            return;
        }
        serializer.execute(new Runnable() {
            @Override
            public void run() {
                if (!closed.get() && !failed.get()) {
                    LOG.debug("Failover: the provider reports failure: {}", ex.getMessage());
                    handleProviderFailure(ex);
                }
            }
        });
    }

    //--------------- URI update and rebalance methods -----------------------//

    public void add(final URI uri) {
        serializer.execute(new Runnable() {
            @Override
            public void run() {
                uris.add(uri);
            }
        });
    }

    public void remove(final URI uri) {
        serializer.execute(new Runnable() {
            @Override
            public void run() {
                uris.remove(uri);
            }
        });
    }

    //--------------- Property Getters and Setters ---------------------------//

    @Override
    public URI getRemoteURI() {
        AsyncProvider provider = this.provider;
        if (provider != null) {
            return provider.getRemoteURI();
        }
        return null;
    }

    @Override
    public void setProviderListener(ProviderListener listener) {
        this.listener = listener;
    }

    @Override
    public ProviderListener getProviderListener() {
        return listener;
    }

    public boolean isRandomize() {
        return uris.isRandomize();
    }

    public void setRandomize(boolean value) {
        this.uris.setRandomize(value);
    }

    public long getInitialReconnectDealy() {
        return initialReconnectDelay;
    }

    public void setInitialReconnectDealy(long initialReconnectDealy) {
        this.initialReconnectDelay = initialReconnectDealy;
    }

    public long getMaxReconnectDelay() {
        return maxReconnectDelay;
    }

    public void setMaxReconnectDelay(long maxReconnectDelay) {
        this.maxReconnectDelay = maxReconnectDelay;
    }

    public int getMaxReconnectAttempts() {
        return maxReconnectAttempts;
    }

    public void setMaxReconnectAttempts(int maxReconnectAttempts) {
        this.maxReconnectAttempts = maxReconnectAttempts;
    }

    public int getStartupMaxReconnectAttempts() {
        return startupMaxReconnectAttempts;
    }

    public void setStartupMaxReconnectAttempts(int startupMaxReconnectAttempts) {
        this.startupMaxReconnectAttempts = startupMaxReconnectAttempts;
    }

    /**
     * Gets the current setting controlling how many Connect / Reconnect attempts must occur
     * before a warn message is logged.  A value of {@code <= 0} indicates that there will be
     * no warn message logged regardless of how many reconnect attempts occur.
     *
     * @return the current number of connection attempts before warn logging is triggered.
     */
    public int getWarnAfterReconnectAttempts() {
        return warnAfterReconnectAttempts;
    }

    /**
     * Sets the number of Connect / Reconnect attempts that must occur before a warn message
     * is logged indicating that the transport is not connected.  This can be useful when the
     * client is running inside some container or service as it gives an indication of some
     * problem with the client connection that might not otherwise be visible.  To disable the
     * log messages this value should be set to a value @{code attempts <= 0}
     *
     * @param warnAfterReconnectAttempts
     *        The number of failed connection attempts that must happen before a warning is logged.
     */
    public void setWarnAfterReconnectAttempts(int warnAfterReconnectAttempts) {
        this.warnAfterReconnectAttempts = warnAfterReconnectAttempts;
    }

    public double getReconnectDelayExponent() {
        return backOffMultiplier;
    }

    public void setReconnectDelayExponent(double reconnectDelayExponent) {
        this.backOffMultiplier = reconnectDelayExponent;
    }

    public boolean isUseExponentialBackOff() {
        return useExponentialBackOff;
    }

    public void setUseExponentialBackOff(boolean useExponentialBackOff) {
        this.useExponentialBackOff = useExponentialBackOff;
    }

    public long getConnectTimeout() {
        return this.connectTimeout;
    }

    public long getCloseTimeout() {
        return this.closeTimeout;
    }

    public long getSendTimeout() {
        return this.sendTimeout;
    }

    public long getRequestTimeout() {
        return this.requestTimeout;
    }

    @Override
    public String toString() {
        return "FailoverProvider: " +
               (connectedURI == null ? "unconnected" : connectedURI.toString());
    }

    //--------------- FailoverProvider Asynchronous Request --------------------//

    /**
     * For all requests that are dispatched from the FailoverProvider to a connected
     * Provider instance an instance of FailoverRequest is used to handle errors that
     * occur during processing of that request and trigger a reconnect.
     *
     * @param <T>
     */
    protected abstract class FailoverRequest<T> extends ProviderRequest<T> implements Runnable {

        private final long id = requestId.incrementAndGet();

        public FailoverRequest(AsyncResult<T> watcher) {
            super(watcher);
        }

        @Override
        public void run() {
            requests.put(id, this);
            if (provider == null) {
                if (failureWhenOffline()) {
                    requests.remove(id);
                    watcher.onFailure(new IOException("Provider disconnected"));
                } else if (succeedsWhenOffline()) {
                    onSuccess(null);
                }
            } else {
                try {
                    LOG.debug("Executing Failover Task: {}", this);
                    doTask();
                } catch (UnsupportedOperationException e) {
                    requests.remove(id);
                    watcher.onFailure(e);
                } catch (Exception e) {
                    // TODO Should we let JMSException through?
                    LOG.debug("Caught exception while executing task: {}", e.getMessage());
                    triggerReconnectionAttempt();
                }
            }
        }

        @Override
        public void onFailure(final Throwable result) {
            if (closed.get() || failed.get()) {
                requests.remove(id);
                super.onFailure(result);
            } else {
                LOG.debug("Request received error: {}", result.getMessage());
                serializer.execute(new Runnable() {
                    @Override
                    public void run() {
                        handleProviderFailure(IOExceptionSupport.create(result));
                    }
                });
            }
        }

        @Override
        public void onSuccess(T result) {
            requests.remove(id);
            super.onSuccess(result);
        }

        /**
         * Called to execute the specific task that was requested.
         *
         * @throws Exception if an error occurs during task execution.
         */
        public abstract void doTask() throws Exception;

        /**
         * Should the request just succeed when the Provider is not connected.
         *
         * @return true if the request is marked as successful when not connected.
         */
        public boolean succeedsWhenOffline() {
            return false;
        }

        /**
         * When the transport is not connected should this request automatically fail.
         *
         * @return true if the task should fail when the Provider is not connected.
         */
        public boolean failureWhenOffline() {
            return false;
        }
    }
}


text:
Kilburn News
Kilburn Times > News > Crime
Wembley man left brain damaged after being knocked over awarded seven-figure compensation payout
Gavin Lawson needs 24-hour care after he was hit by speeding car in Forty Lane
A Wembley man left severely brain damaged and confined to a wheelchair after he was knocked down by a speeding driver has won a multi-million pound compensation payout.
Gavin Lawson, now 43, suffered severe bleeding to the brain, a fractured spine, ribs and pelvis, and numerous broken bones after he was hit while crossing Forty Lane near his home on March 23, 2007.
Following a five-year battle, the High Court today (Monday) awarded Mr Lawson a lump sum of �1.8m to provide him with the specialist care and necessary adaptations to allow him to move back home with his family.
He will also receive �180,000 per year for the rest of his life which has been specifically awarded to pay for his carers.
His Honour Patrick Curran QC approved the settlement with the insurance company of driver Mayuk Modessa based on the complex nature of Gavin's injuries.
Modessa was convicted of speeding and ordered to pay a �90 fine, was given three penalty points and mad to pay �70 in court fees in 2008.
1 Two arrested in connection with fatal Neasden stabbing
2 Third stabbing in Neasden as murder investigation under way
3 Fundraiser launched after beloved mum found collapsed in Barham Park dies
4 Wembley drug dealer jailed for biting, scratching and pushing police
5 Man dies after stabbing in Brent
6 Fourteen fined for lockdown breach after car meet in Park Royal
7 Brent councillor calls for improved social distancing in supermarkets
8 MP Dawn Butler: Support available to get through lockdown
9 Wembley tutor takes to Instagram to help with homeschooling
10 Woman dies after she was found collapsed in Barham Park
An interim payment secured by lawyers last year was used to pay for support and treatment that has seen Mr Lawson make a significant improvement
Scott Lawson, the victim's brother, said: "Nothing will ever bring back the life Gavin had before this terrible accident but it is a huge relief knowing he will receive the best possible care for the rest of his life.
"When the driver got away with nothing more than a fine and some points on his licence, we were appalled as he was able to drive again but Gavin's life was changed forever. It was no justice. Before the accident Gavin was a very caring man, caring for his mum and working in a nearby warehouse to provide for her. We're pleased that now, with the necessary support, we can return the favour and see him get the care he needs.
"Initially Gavin made no progress from his brain injury because the nursing home couldn't give him the specialist therapy he needed.
"Once liability had been settled, Irwin Mitchell could arrange funds for Gavin's care and rehabilitation which meant he was appointed a specialist support worker, dedicated physiotherapist and occupational therapist.
"He's made huge improvements since then and occasionally shows signs of the old Gavin. He's now aware of what's going on around him and can participate in a range of activities.
"He can communicate his likes and dislikes, and enjoyed his time with his support worker. For instance, she takes him to a day centre once a week where he watches films and enjoys art and dance. We never thought we'd see him improve this far and hope once he is in his own home he'll improve even further."
Colin Ettinger, from Irwin Mitchell represented the family, he said: "This is a horrendous case that due to the complex issues surrounding Gavin's injuries has taken some time to resolve.
"Gavin is cared for in a nursing home but his family, social worker and the staff at the home agree that Gavin would be better cared for in his own adapted accommodation, with specialist carers, with a Case Manager to supervise the therapies and other treatment that he needs.
"The settlement agreed today means Gavin can now move into his own home to live with his dedicated brother and mum and ensures he will have all the support he needs as well as specialist therapists to help him achieve the best quality of life possible."
'We need you to stay at home' - Northwick Park Hospital
André Langlois
Dozens 'found breaching Covid restrictions' at shisha cafe
'It was horrendous': Brent leader speaks of coming down with Covid
Adam Shaw LDRS
'Distress' as eggs thrown at ambulances in Neasden


First time here? Watch this video!
Sign up for a free user account and to receive our newsletter with updates on the latest research and resources.
Get informed, stay smart, stay safe!
Get notified about the latest research!


text:
Special Session: Senate and Assembly leaders introduce redistricting plans
The Legislature on the final day of the 81st session, Monday, May 31, 2021, in Carson City.
Photo: David Calvert / The Nevada Independent
Published: Friday, November 12, 2021
Updated:Saturday, November 13, 2021
Legislative Democrats introduced their redistricting plans for the coming decade Friday as the 33rd Special Session of the Nevada Legislature opened for business.
And Republicans in the minority cried foul saying it's the most partisan set of maps ever, a plan designed to ensure a Democratic super majority through 2030.
Democrats also served notice they plan to move their plans quickly, suspending the rules that are designed to slow the passage of legislation so that everyone has time to absorb what's in the measures. That would enable them to pass the redistricting bills in a day instead of three or more days.
Assembly Minority Leader Robin Titus of Smith Valley pointed to the map of Congressional District 4 which includes a hook that puts her in CD4 almost entirely surrounded by CD 2.
They also charged that Democrats packed a bunch more D's into Sen. Heidi Seevers Gansert's Reno district, turning it from a 2 percent GOP advantage district into a 4 percent Democratic advantage.
Assemblyman Jim Wheeler, R-Gardnerville, described the maps as blatant gerrymandering that not only treats Republicans unfairly but nonpartisan voters as well.
After the two floor sessions adjourned, the 11 Assembly member and seven Senate members of the joint committee on redistricting met to hear testimony on the non-controversial two subjects before them in the special session — a temporary shift in the dates for judicial office filings to accommodate county voting officials and the new district boundaries for the Nevada Board of regents. Both those issues are contained in Assembly Bill 1.
NSHE General Counsel Joe Reynolds told the joint committee the regents fully support the plan. He said it is consistent with what the regents voted for in September. With a total population of 3.1 million, he said the ideal population in each district is 238,316. He said the maps contained in the plan all come within a quarter of a percent of that number.
Major changes in the plan include extending Jason Geddes District 11 into Humboldt County and moving District 8 more south into Clark County.
Because of its population, 9.5 of the 13 regents' districts are in Clark.
Election officials wanted the filing dates moved from January to March for the 2022 election cycle saying otherwise they would have to interrupt redistricting to file those candidates, then resume redistricting afterward.
Lawmakers in the joint committee plan to reconvene at 10 a.m. Saturday they will deal with SB1 containing the Senate and Assembly maps along with the congressional maps. They will first deal with SB1 containing the Senate districts. The Assembly has yet to file its Democratic redistricting bill.
The Senate will reconvene at 9 a.m. and the Assembly at 9:30 a.m.


text:
M3 Seminars
International artists | Individual attention
Renée Tatum
"Renée Tatum was superb as Amahl's mother, with fine diction and a rich mezzo sound. She brought out the human quality in the drama."
— Steve Cohen, The Cultural Critic
Parsifal, Kundry — Indiana University Opera Theatre (role debut)
The Magic Flute, Third Lady — The Metropolitan Opera
Giulio Cesare, Cornelia — Boston Lyric Opera
Noted for her "commanding and dramatic presence" (Opera News), mezzo-soprano Renée Tatum is rapidly gaining critical acclaim on the most prestigious opera stages in the United States. Tatum begins the 2019-20 season as Flosshilde in Wagner's Götterdämmerung with The National Theater in Taiwan, followed by her role debut as Kundry in Parsifal for Indiana University Opera Theatre. She also returns to The Metropolitan Opera as the Third Lady in The Magic Flute, makes her role debut as Azucena in Il trovatore with Pensacola Opera, and joins Boston Lyric Opera for Giulio Cesare. On the concert stage, she joins the South Bend Symphony Orchestra for Mahler Symphony No. 2 and The Masterworks Chorale for Beethoven's Missa Solemnis.
In the 2018-19 season Tatum returned to The Metropolitan Opera for Nico Muhly's Marnie, for the Waltraute and Flosshilde in Robert LePage's famed Der Ring des Nibelungen, with the Savannah Philharmonic for Mahler's Resurrection Symphony and The Ceclia Chorus of New York City in Brahms' Alto Rhapsody.
She has recently been heard as Flosshilde and Waltraute in San Francisco Opera's Der Ring des Nibelungen, Flosshilde in Das Rheingold at The Tanglewood Festival, Francisca in West Side Story at Grand Tetons Music Festival with Donald Runnicles, Jenny in Threepenny Opera for Boston Lyric Opera, and as a Flower Maiden in Parsifal at The Metropolitan Opera with new Music Director Yannick Nezet-Seguin. Concert performances included Penderecki's Credo with Indianapolis Symphony, Durufle's Requiem with Back Bay Chorale, Bach's Christmas Oratorio with The Cecelia Chorus of NYC. She was also heard in concert with Warren Jones at Manchester Music Festival and in a concert presentation of Das Rheingold with New York Philharmonic. Other recent performances include the role of Gabriele Bertolier for the Romanti Century's production of Van Gogh's Ear a The Pershing Square Signature Center in New York City and a concert entitled "Opera Italiana Forever Young" for Central Park Summer Concerts.
Previously she was heard as Flosshilde in Gotterdammerung in her return to Houston Grand Opera and at National Taichung Theatre; Olga in Eugene Onegin with Boston Youth Symphony; Handel's Messiah with Pacific Symphony; Beethoven's Missa solemnis with Pacific Chorale; Mozart's Requiemwith Omaha Symphony and Rochester Philharmonic; and Beethoven's Symphony No. 9 with San Diego Symphony. Additionally, she has been heard as Suzuki in Madama Butterfly with Toledo Opera, Flosshilde and Waltraute for Washington National Opera, Flosshilde in Gotterdammerung with Teatro Massimo di Palermo, Second Lady in Julie Taymor's Magic Flute at The Metropolitan Opera, Third Lady in Magic Flute and Grimgerde in Die Walkure at Houston Grand Opera. Ms. Tatum also joined an international cast in Japan as Flora in Verdi's La traviata, sang in Mahler's Resurrection Symphony and Mozart's Requiem with The Eastern Music Festival, and in Beethoven's Symphony No. 9 with The Boston Symphony Orchestra at The Tanglewood Music Festival.
Additional concert appearances include Salome with Andris Nelsons and the Boston Symphony Orchestra, Mozart's Requiem with Music Director Daniel Stewart and Santa Cruz Symphony, and Beethoven's Symphony No. 9 with conductor Daniel Wachs and Orange County Philharmonic Society.
Jeffrey Larson
o: +1 (212) 419-2986
m: +1 (917) 225-5894
reneetatum.com
Download Headshot
L2 Artists LLC
106 West 32nd Street, Floor 2
Copyright © 2016-21 L2 Artists. All rights reserved. Site design and construction by Ronin Studio, LLC.


Is your garage a disaster waiting to happen? Those piles of sports equipment, lawn tools, and seasonal decorations are more than an eyesore. They also create a safety hazard and a potential breeding ground for rodents and pests.
If you want to protect your home's value in preparation for your big move, you might want to organize your garage. Don't worry; a messy garage happens to the best of us. Fortunately, with a little effort, you can have a clean, safe, and organized garage.
If you often find yourself wasting time while searching for something in your garage, it's time to invest in garage cabinets. Cabinets hide clutter and create a clean, streamlined look in a garage. Garage cabinets are a step up from freestanding shelving because they are secured to the floor.
Freestanding shelves create a topple hazard, and your clutter will still be on display. Homeowners with children can install locking cabinets to store toxic chemicals.
Are you having trouble finding room in your garage to park your car? Overhead shelving will double the amount of floor space you have. Use clear plastic bins to protect your belongings from dust and water. While you're organizing your garage, get rid of clutter you don't need by throwing out any items you no longer use or donate them to a local charity.
It's difficult to get any work done when your workbench is covered in tools. Attaching pegboard to the walls provides a convenient way to keep your tools organized.
Pegboards are inexpensive, and most home improvement stores sell add-ons that will keep the messiest of workbenches organized. Cabinets installed under your workbench are great for storing larger power tools and wood scraps.
Clutter in your garage is an open invitation to rats and mice. Rodents are skittish creatures, and they love cozy hiding spots. Boxes, cans, and piles of junk in your garage are ideal nesting places for rats and mice. These rodents carry diseases, and they also like to chew on everything including the wires in your vehicle.
Another common home invader is the cockroach. Roaches love clutter and cardboard. Cockroaches communicate by excreting pheromones, and cardboard holds their scent longer than other materials. Clean up clutter and use plastic bins to keep roaches from showing up in your garage and making their way into your house.
You can have a clean and organized garage in less than a day with a little elbow grease. A little effort goes a long way when it comes to keeping your life organized.


text:
Ha vinto la Coppa Intercontinentale e la Coppa Libertadores con la maglia del Boca Juniors. È morto prematuramente a causa di un arresto cardiaco occorsogli durante una partita di beneficenza con alcuni ex calciatori argentini.

Carriera

Club
La carriera di Bordón si è sviluppata quasi esclusivamente in Argentina; fanno eccezione le brevi esperienze in Messico nell'Atlas, e in Colombia nell'Atlético Nacional.

Fa il suo esordio nel San Lorenzo de Almagro, con cui disputa 3 partite. Si trasferisce poi al Club Atlético Nueva Chicago: in tre stagioni scende in campo in 94 incontri, riuscendo a mettere a segno 20 reti. Nel 1977 cambia ancora, passando al Chacarita Juniors: con la maglia dei Los Funebros colleziona 128 presenze (sarà il suo record di presenze con la stessa maglia) e 28 gol.

Dopo una breve esperienza (6 partite) al Talleres di Córdoba, nel 1978 firma con il Boca Juniors, toccando l'apice della propria carriera. Con gli Xeneizes disputa 82 partite in campionato, e vince la Coppa Intercontinentale e la Coppa Libertadores 1978; proprio nelle semifinali di Libertadores contro l'Atlético Mineiro mette a segno la doppietta che vale il 2-0 finale.

Nel 1981 viene ceduto all'Argentinos Juniors, insieme con Salinas, Santos, Zanabria e Randazzo, in cambio di Diego Armando Maradona. Nello stesso anno si trasferisce in Messico all'Atlas de Guadalajara, e l'anno seguente passa all'Atlético Nacional di Medellín.

Rientra in Argentina e nel 1985 gioca nell'Huracán Las Heras, passando poi al Temperley. Chiude la carriera vestendo le maglie del Colón, San Telmo e Deportivo Maipú.

Nazionale
Bordón ha giocato in Nazionale nel 1979, anno in cui è stato convocato da Menotti per la Copa América; in Albiceleste ha disputato le 4 partite della competizione.

Palmarès

Boca Juniors: 1977

Boca Juniors: 1978

Note

Collegamenti esterni

Calciatori della Nazionale argentina

redpajama_set_name: RedPajamaWikipedia


"Affair between you and me" is in art display based on "Un Point" picture book that was published in July 2015. Its main message is "yourself as you are".
"Un Point" - a picture book consisting of series of paintings, a story of two sleeping dogs – black and white pugs was adapted as a interactive video installation. When the viewer approaches the installation, dogs notice the presence and react in various ways. The installation main concept is: a painting that communicates with its audience. The concept of the book is used as a basis for the animation. To achieve the real time interaction, a sensor camera "BLASTERX SENZ3D" was used. Both video and sound is used to create communication with the viewer. The goal of the installation is to create a feeling of relief and healing through communication with the painting.


text:
Domestic Violence, Crime and Victims (Amendment) Act 2012
There are currently no known outstanding effects for the Domestic Violence, Crime and Victims (Amendment) Act 2012.
1.Causing or allowing child or vulnerable adult to suffer serious physical harm
2.Evidence and procedure in cases of serious physical harm
3.Consequential amendments
4.Short title, commencement and extent
Consequential amendments
Criminal Justice Act 1982
1.In Schedule 1 to the Criminal Justice Act 1982 (offences...
Coroners Act 1988
2.(1) The Coroners Act 1988 is amended as follows.
Law Reform (Year and a Day Rule) Act 1996
3.In section 2 of the Law Reform (Year and a...
Criminal Justice and Court Services Act 2000
4.(1) In Schedule 4 to the Criminal Justice and Court...
5.In Schedule 5 to the Sexual Offences Act 2003 (offences...
6.In Part 1 of Schedule 15 to the Criminal Justice...
Domestic Violence, Crime and Victims Act 2004
7.The Domestic Violence, Crime and Victims Act 2004 is amended...
8.(1) In section 6 (evidence and procedure: England and Wales),...
9.In section 8 (evidence and procedure: the Court Martial), after...
10.In section 62(4) (extent of section 8), after "section 6"...
Armed Forces Act 2006
11.In section 51 of the Armed Forces Act 2006 (jurisdiction...
Coroners and Justice Act 2009
12.In paragraph 1 of Schedule 1 to the Coroners and...


For every clutch purchased, a percentage goes to the Surfrider Foundation. Surfrider has been protecting our waves, sea-life and beaches since 1984.
Each piece is one of a kind! (Patterns will vary slightly from piece to piece).
** Note to self: Since each piece is handmade, please allow extra time for item to ship.


3 tier bowl serving set tiered food network 3 tier bowl serving set. . . . . . . . . . . . . . .
ac dc led lighting factory solar ac dc ac ceiling fan with led lights manufacturer from china fob price is piece ac vs dc led strip lights ac dc converter for led lighting. . . . . . . . . . . . . . .
wall bookshelf plans free bookshelf plans free easy plans bookshelf babychildplans. . . . . . . . . . . . . . .
counter beverage refrigerator beverage refrigerator under counter under counter beverage fridge great sub zero center model house home interior mini countertop beverage refrigerator countertop locking. . . . . . . . . . . . . . .
individual candle holders extra tall silver plated candlestick holders. . . . . . . . . . . . . . .
antique brass door numbers 2 numbers customize doorplate vintage brass copper house home number personalize door plates apartment script antique brass front door numbers. . . . . . . . . . . . . . .
fiberglass air duct if ac duct board how to cut best price for glass wool heat insulation materials air fiberglass insulated air duct are fiberglass air ducts safe. . . . . . . . . . . . . . .
wall internet adapter hidden camera wall charger audio video covert spy recorder socket ac plug adapter wall socket internet adapter internet wall plug wiring. . . . . . . . . . . . . . .
dewalt metal cutting wheel x metal cutting discs available online industrial dewalt metal cutting disc dewalt 355mm metal cutting disc. . . . . . . . . . . . . . .
build a frame kit download by diy picture frame kits uk etag 007 timber frame building kits. . . . . . . . . . . . . . .


text:
Merkel: No Astana Summit Without Ukraine Progress
German Chancellor Angela Merkel has told Russian President Vladimir Putin that a four-way summit on the Ukraine crisis will not be held until progress has been made on the Minsk peace plan.
Russia May Demand Kyiv Pay Loan Early
Russian news agencies quoted Finance Minister Anton Siluanov as saying that Moscow had "every reason" to demand repayment, as Ukraine's public debt has exceeded 60 percent of gross domestic product, violating the terms of the bond issue.
Gorbachev Warns Of Russia-West Danger
Former Soviet President Mikhail Gorbachev has warned that the Ukraine crisis could lead to a major military conflict between Russia and the West and criticized economic sanctions against Moscow.
Poroshenko Says Ukraine Shares France's Pain
Ukrainian President Petro Poroshenko says his country shares France's pain following a deadly attack against the satirical newspaper Charlie Hebdo two days ago.
Russia Puts Ukraine's Savchenko In Solitary
Ukrainian military pilot Nadia Savchenko has been placed in solitary confinement at a pretrial detention center in Moscow.
A Family Copes With Tragedy In Wartorn Donetsk
In December, a family in eastern Ukraine was torn apart by conflict. Baby Nika and her brother Vitya lost their mother and their home in a shell attack. The children's aunt is now taking care of them and her own young children as they struggle to put their lives back together.
EU Offers Ukraine $2.12 Billion Loan
The European Commission has offered to lend Ukraine a further 1.8 billion euros ($2.12 billion) in medium-term loans to help the country's beleaguered economy.
News Analysis: Bombing Campaign Opens New Front In Battle For Ukraine
A low-level, but frightening bombing campaign is being waged across Ukraine, with the cities of Odesa and Kharkiv particularly in the crosshairs. Dozens of explosions are testing the abilities and will of the state and the resilience of the Ukrainian people.
Ukraine: Russia Must Remove 'Bandits'
Ukrainian Prime Minister Arseniy Yatsenyuk says Russia is still sending military forces into Ukraine despite a September 5 deal on a cease-fire and steps toward peace.
U.S. To Return 15 West European Bases
The Pentagon announced on January 8 that it is returning 15 bases that it now operates in Western Europe back to their host nations.
Lavrov, French And German PMs Discuss Ukraine
Russian Foreign Minister Sergei Lavrov has discussed the conflict in Ukraine with his French and German counterparts by telephone.
Latvia Says Russia 'More Open' To Ukraine Solution
Latvia, the holder of the EU presidency, says it sees an opportunity for Russia to agree to a negotiated settlement of the Ukraine crisis.


In his private diary which would later become published, Samuel Pepys with good reason described the English "Public House" (Pub) as, "the heart of England". It was often the case that the pub was the focal point of the community. This was not due to some pleasant accident or by way of chance. The history and necessity of the pub has ancient roots and served as the sustaining and revitalizing blood that built the most dominate military machine the world had ever seen at the time. Over some 2,000 years ago the juggernaut that was the Roman Republic and eventually the Empire built roads to more easily transport their military forces to ensure and maintain their dominance won through endless conquests. So prolific and pervasive was their road system that the phrase, "All Roads Lead to Rome" was coined.
To address the common travel that would take place on these roads and highways it became law that houses along the pathways provided lodging for those requesting it, thus the first inn's were born providing shelter, food and drink. From these sprang a long history of establishments (Inns, Taverns, Pubs, Saloons, Taprooms, Beer Halls, Ale Houses etc.) all designed with the purpose of providing a place to rest, drink and enjoy a meal. These locations quickly evolved into meeting houses for common folk to socially congregate. It's noteworthy to recognize that a common center piece of this hospitality was the availability of beer.
The Wandering Tortoise stands out as something very special here in Phoenix. It's not just another craft beer bar for the sake of being a craft beer bar. What sets it apart is it's genuine quality, from ownership to how each employee demonstrates being personable and down to earth to the incredible and carefully curated selection of available beer.
Like the pubs and inn's of old The Wandering Tortoise is always abuzz with some form of traffic: regulars stopping in for happy hour, people coming in for the first time to experience what has over the last year been raved about through social media or any of the impossibly awesome special events where the draft board reads like a bucket list of all-time greatest beers. The Wandering Tortoise has risen as a leader in the Valley of the Sun showing what could be with the right oversight and that just because it's available to offer to the public doesn't mean it should be. Teaching the lesson that to deliver quality involves having to say no often and being brave enough to face any backlash from setting a new standard that will probably upset a few people trying to get their beer in the doors.
The next phase of the craft beer industry is going to play out much like a professional wrestling match in that competition breeds excellence and many will rise to the occasion. However, someone has to be thrown from the ring. If beer is the wrestler then The Tortoise would be the arena. Trust me you don't wanna this match!
I love beer. Specifically Arizona craft beer. Oh yea, my family is pretty awesome too. An amazing wife and 2 awesome little girls make my life great. And did I mention beer?
BeerDoir You Ready For This?!?!


text:
KJZA 89.5 Community Radio & The World's News
In Partnership with PRI Member Station KAWC FM, Yuma
Why Public Radio
Listener Profile
FCC Renewal
Thank you for your interest in the K-JAZZ radio network, serving all of north-central and western Arizona with studios in Prescott, Kingman and Flagstaff.
As a community group made up of dedicated public servants, advisors and experienced broadcasters, the Board of Directors and staff of SPBC Broadcasting carries out it's mission of service to the community from a foundation of four basic principles; Service, Value, Quality and Integrity. The purpose of our mission as broadcasters is to serve the public interest, need and necessity. We pledge as community leaders and citizens to be productive, to have what we do make a difference, to leave a legacy, and to use our vision and collective talents for the betterment of others.
We hope you will join us in this effort by supporting the K-JAZZ radio network as an underwriter. Thank you in advance for helping us produce and provide Public Radio programs of significance. Local programs that inform, entertain, educate and enlighten.
SPBC Broadcasting
Now streaming live!!! Click here to listen now!
We're working on providing an on-line player that's independent of your Windows Media Player, WinAmp, etc, but for right now... it's live!
Convert your pledge!
The K-JAZZ Radio Network in partnership with PRI Member Station KAWC serves rural Arizona with community news and programs of local interest.
Put your pledge to work on the Public Radio Stations that serve YOU. Click on the link below and pledge now.
Locally Produced Weekend Programming
The Mountain Gardener
with Ken Lain
Saturday: 10am - 11am
Sunday: 10am - 11am
Computer Talk Radio
with Benjamin Rockwell
Healthy Medicine
with Dr. Robert Zieve
The Janis Best Show
with Janis Best
Saturday: 11am - 11:30am
Sunday: 12:30pm - 1pm
Value This!!
with Leon Kastner & Brian Kathenes
Sunday: 11am - 12pm


It's obvious that the modern family is on a generational slide. What was once considered culturally-moral is now considered old-fashioned.
When my grandmother went to the beach, she wore a dress in the water. My mother's generation came along and wore a modest one piece. My sister wore a two piece. Soon, the next generation will go back to wearing a one piece bathing suit, it's just that I'm not sure which piece the next generation will choose to wear… the top or the bottom!
Scriptures warn us that sins of the previous generation will pass down all the way to the fourth generation. Most parents wonder why their children don't learn from the mistakes of their parents. They do! Children learn the mistakes of their parents and then amplify them.
But, God promises that this generational slide can be broken when Christ is invited into the family. The Scripture says that the power of sin lasts 4 generations, but the power of God's love lasts for a 1,000 generations.
If you are a first-generation Christian family, you might not see much difference between your Christian family and a non-Christian family, but there is a major difference. Because when you invited Christ into your family, you've stopped the slide. You are now leaving a godly legacy. Your children's lives will be better than yours. If your children then choose to follow Christ, your grandchildren's life will be better than your children's. Instead of sliding down, your legacy is getting morally stronger. And every generation will get better and better for the next 1,000 generations… And by choosing Christ, you began that legacy.
My wife comes from 10 generations of Christians. I am a second generation Christian. If my children choose to continue to follow Christ, their children's lives will be even better than their own.
So today, I challenge you… choose Christ for your home.