text:
The Best Royal Family Moments Of 2018
From weddings and babies, to royal tours and adorable portraits, it's been a big year for the royal family. Here, we break down the top 28 moments
By Lauren Sheffield
Prince Harry & Meghan Markle's Royal Wedding
With an estimated 29.2 million people tuning in to Prince Harry and Meghan Markle's royal wedding on May 19th, it was a day that people all over the world will never forget. From Meghan's stunning Givenchy gown and the royal couple's kiss, to sweet moments from Prince George and Princess Charlotte, the long-awaited nuptials were a major moment for the royal family.
Prince Louis Is Born
Kate Middleton gave birth to Prince Louis on Monday, April 23, which is just two days after Queen Elizabeth's birthday (April 21). In typical royal fashion, the Duke and Duchess of Cambridge debuted their new baby on the steps of Lindo Wing, with the Duchess making a sweet tribute to Princess Diana in her red and white dress.
Doria Ragland Becomes a Part of the Royal Family
As the royal family gained a new family member through Meghan Markle, they also received a new in-law: Meghan's mother, Doria Ragland. As viewers watched the royal wedding unfold, many were taken aback with how regal Ragland was, and how much the royal family seemed to welcome her. A sweet moment between Ragland, Prince Charles, and the Duchess of Cornwall as they exited St. George's Chapel showed the two families becoming one.
The Duke & Duchess of Sussex Announce Their Pregnancy
Just five months after Prince Harry and Meghan Markle tied the knot, the couple announced that they were expecting their first child together. The Sussex's had just arrived in Sydney for the first day of their royal tour, when an unexpected tweet went out from Kensington Palace stating: "Their Royal Highnesses The Duke and Duchess of Sussex are very pleased to announce that The Duchess of Sussex is expecting a baby in the Spring of 2019."
Princess Eugenie & Jack Brooksbank's Royal Wedding
Marking another wedding for the royal family, Princess Eugenie married Jack Brooksbank at St. George's Chapel in Windsor on October 12, 2018. The bride wore a gorgeous gown by Peter Pilotto, along with an emerald tiara borrowed from her grandmother that dates back to 1919. From the star-studded guest list to the candid moments that made hearts everywhere melt, it was another royal wedding for the books.
Prince George & Savannah Phillips Become Our Favorite New Duo
After their adorable antics at the Trooping the Colour ceremony, Prince George and his cousin Savannah Philips quickly become a hilarious duo that stole the show at every royal event they attended together. From Savannah savagely pushing George down a hill at a polo match, to their mimic trumpet playing and stifled giggles at Princess Eugenie's wedding, we can't get enough of these playful royal kids.
Princess Charlotte Attends Her 1st Day of School
In honor of Princess Charlotte's first day of nursery school, Kensington Palace shared two adorable photos of the little royal captured by the Duchess of Cambridge. The two-year-old was all smiles in a red coat, matching Mary Janes, and pink scarf as she headed off to her big day. Many royal fans also couldn't get over how much Princess Charlotte resembled a young Queen Elizabeth and Princess Diana in the photos.
The First Same-Sex Royal Marriage Takes Place
In a historical moment we wish would have come sooner for the royal family, Queen Elizabeth II's cousin Lord Ivar Mountbatten became the first royal to have a same-sex wedding as he married his now-husband, James Coyle. While the intimate nuptials took place out of the public eye, he shared sweet photos of the ceremony on Instagram.
The Fab Four Solidifies
While Prince Harry, Meghan Markle, Prince William, and Kate Middleton did all appear together for the first time at Christmas, the Fab Four made their first official joint appearance at the inaugural Royal Foundation Forum. Aside from speaking about the foundation's various initiatives like mental health, United for Wildlife, and the Prince Harry-hosted Invictus Games, they also joked about the struggles that arise when working with family.
The Trooping of the Colour
Just a few weeks after the Duke and Duchess of Sussex's wedding, the whole royal family appeared together again for the Trooping of the Colour, which marked the Queen's 92nd birthday with a military parade and RAF flyover in London. With Kate and Meghan both stunning in colorful looks for the occasion, and all the royal tots joining in on the fun, the annual celebration didn't disappoint.
Meghan Markle's First Solo Event with the Queen
Just about a month after her wedding to Prince Harry, Meghan Markle stepped out for her first solo event with Queen Elizabeth II. Aside from being the first of the Fab Four to ride overnight on the Queen's private train, the two shared so many sweet bonding moments as they opened Mersey Gateway Bridge. While Meghan sported another custom Givenchy dress, she also wore a stunning gift from the Queen: a set of pearl-and-diamond earrings.
Pippa Middleton Gives Birth to Her 1st Child
Days after she stepped out to attend Princess Eugenie's wedding, Pippa Middleton and husband James Matthews welcomed a baby boy at Lindo Wing in London, where Kate Middleton also gave birth to her three children. It was later revealed that the couple had given their son a fitting regal name: Arthur Michael William.
A Sweet Photo of Prince Louis & Princess Charlotte Is Released
In a moment that made hearts melt around the world, Kensington Palace released new photos of Prince Louis taken by the Duchess of Cambridge. One photo was particularly adorable, showing new big sister Princess Charlotte giving him a tender kiss on the forehead.
The Duke & Duchess of Sussex's Royal Tour
Embarking on a 16-day tour of Australia, Fiji, Tonga and New Zealand, the Duke and Duchess of Sussex's first major royal tour was already newsworthy. However, on the morning of their first stop, news broke that the couple was expecting their first child and excitement around the royal tour skyrocketed. From swoon-worthy PDA on Bondi Beach, to romantic moments caught in the rain, there was no shortage of adorable moments from the soon-to-be parents.
Camilla and Meghan Form a Close Friendship
As Meghan officially became part of the royal family, there was one member she seemed to immediately bond with: the Duchess of Cornwall. The two were spotted giggling and bonding at a garden party for Prince Charles' 70th birthday, and continued to share affectionate moments at royal events to follow.
Meghan Markle Launches Her First Solo Project
For her first solo project as a royal, the Duchess of Sussex announced that she would be releasing a cookbook, Together: Our Community Cookbook, to support a group of women affected by the Grenfell Tower fire. To celebrate the launch of her solo project, Meghan (joined by Prince Harry and her mother, Doria Ragland) invited the women to Kensington Palace, where they enjoyed recipes from the cookbook.
Princess Charlotte Masters Her Royal Wave
We've seen Princess Charlotte grow up right in front of our eyes, and 2018 saw the little royal step into the spotlight more than ever. From serving as a flower girl at both Prince Harry and Princess Eugenie's weddings, to making appearances at her new little brother's birth and christening, she completely stole the show at every royal event she attended. However, the one thing that became clear over the past year was that she has her royal wave down pat.
Kate & Meghan Have a Wimbledon Date
The Duchess of Cambridge and the Duchess of Sussex had their first duo outing together, where they attended the 2018 Wimbledon finals. Both royals stepped out in their tennis best, Kate wearing a chic polka-dot dress and Meghan choosing a crisp, striped button-down and white trousers. The stylish pair chatted, laughed, and cheered on Serena Williams during what looked like one epic afternoon.
Prince Charles' 70th Birthday Portraits Are Released
In honor of Prince Charles' 70th birthday, a series of candid portraits were released that showed a more relaxed side of the royal family. Photographed by Chris Jackson, the royal family posed in the Clarence House gardens and coordinated in their white and blue looks. The photos also showed an adorable new look at the growing Prince Louis.
Queen Elizabeth Checks Her Watch Waiting for Donald Trump
As Queen Elizabeth II was awaiting Donald Trump's arrival at Windsor Castle, viewers noticed the monarch look down and check her watch as minutes passed and Trump had yet to arrive. As Twitter jumped on the moment and memes ensued, one thing became clear: never keep the Queen waiting.
Kate Middleton Receives a Royal Family Order from the Queen
As the Duchess of Cambridge attended a state dinner at Buckingham Palace, all eyes were on her stunning ensemble: an Alexander McQueen gown, the famous Lover's Knot tiara, and a diamond and pearl necklace first owned by Queen Alexandra in 1863. However, the most important part of her regal look was what was pinned to her dress: the Royal Family Order of Queen Elizabeth II. Featuring a portrait of the Queen surrounded in diamonds and pinned to a yellow ribbon, the honor is given by the Queen to members of the royal family as a reward for their service.
Prince George's 5th Birthday Portrait Is Released
Ahead of Prince George's 5th birthday, the Duke and Duchess of Cambridge released a new portrait of the young royal that was too precious for words. Photographed by Matt Porteous, Prince George posed in a white shirt and his famous go-to shorts and showed off his massive grin.
Meghan Markle Attends Her First Royal Ascot
Exactly a month after her royal wedding to Prince Harry, the Duchess of Sussex attended her first Royal Ascot. Arriving by carriage with Prince Harry, Meghan looked nothing short of stunning in a belted white Givenchy dress and Philip Treacy hat.
Prince Louis' Christening Portraits Are Released
In honor of Prince Louis' christening, a series of royal portraits were released sharing the adorable family moment with the world. While Prince George was all smiles, Princess Charlotte couldn't take her eyes off her new baby brother, as she sweetly held his hand.
Zara Tindall Gives Birth to Her 2nd Child
Marking another addition to the royal family, Zara Tindall, Queen Elizabeth II's granddaughter, gave birth to her second child, a baby girl, in June. The little royal, which Tindall and her husband Mike named Lena Elizabeth, became the fourth grandchild for Princess Anne (Zara's mom), and the seventh great-grandchild for Queen Elizabeth II.
The Fab Four Celebrates the RAF's 100th Anniversary
To mark the Royal Air Force's 100th anniversary, members of the royal family—including the Duke and Duchess of Cambridge and the Duke and Duchess of Sussex—stepped out for the celebrations. While both Kate and Meghan looked regal in Alexander McQueen and Dior looks, the Fab Four shared some laughs as they watched the flypast on the balcony of Buckingham Palace.
The Duke & Duchess of Cambridge Stun at the BAFTAs
Becoming frequent attendees of the BAFTA awards over the years, the Duke and Duchess of Sussex made another stunning appearance at the 2018 ceremony.
The Duke & Duchess of Cambridge Meet the Swedish Royal Family
On a four-day royal tour of Sweden and Norway, the Duke and Duchess of Cambridge met their Swedish counterparts, Princess Victoria and Prince Daniel. Making many stylish outings together, we couldn't help but love when two royal words collide.
With three royal births, two stunning royal wedding gowns, and one big baby announcement, 2018 was a major year for the British royal family. From Meghan Markle's new role in the royal family, to watching all our favorite little royals grow, these are the top 28 royal moments of 2018.
This article originally appeared on Harper's Bazaar US.
Kate Middleton Gives A Sweet Update About How Prince Louis Is Doing
Meghan Markle Makes TIME's Person Of The Year Shortlist In 2018
These Are The World's Longest-Reigning Royals
Tags: British Royal Family, Camilia Parker-Bowles, celebrity, Celebrity News, Doria Ragland, Jack Brooksbank, Kate Middleton, Lord Ivar Mountbatten, Meghan Markle, Pippa Middleton, Prince Charles, Prince Daniel, Prince George, Prince Harry, Prince Louis, Prince William, Princess Charlotte, Princess Eugenie, Princess Victoria, Queen Elizabeth II, Royal Fab Four, Savannah Phillips, Swedish Royal Family, Zara Tindall
BAZAAR Most Stylish Women 2018: Valli Muthiah
Kim Kardashian Shared The Sweetest Family Photos From Saint's Birth...
The Duchess Of Cambridge And The Duchess Of Sussex Attend Wimbledon 2019 Together
30 Things You Never Knew About Princess Diana
Kim Kardashian West Is Unrecognisable In Her New KKW Beauty Campaign
Wimbledon 2019: All The Celebrity Style
Rihanna Fronts Harper's Bazaar China's ...
Beyoncé And The Duchess Of Sussex Final...
Heidi Klum Secretly Married Tom Kaulitz...
The Duchess Of Cambridge And The Duches...
The Most Popular Airbnb In The World Is...
30 Things You Never Knew About Princess...
Kylie Jenner Faces Major Backlash For S...
Serena Williams And Naomi Osaka Sent Ea...
Hungry? Here Are 15 Places You Can Eat ...
Watch Now: Korean Superstar Suzy Bae Talks Exclusively With BAZAAR
Jennifer Aniston Reveals Exactly What She Eats On A Daily Basis
Avenue Singapore Is Set To Open Its Doors This Week


text:
Northern Ireland: Golf at its pinnacle
By Todd Staszko With a smattering of some of the most...
Baku – Sporting Stay and Play Paradise on UAE doorstep
By Scott Grayston Baku, Azerbaijan, is a place I've always wanted...
Saudi Arabia – A golfing destination awakens
With a world-class, internationally renowned professional golf tournament on a stunning...
Constance Lemuria in the limelight as the Staysure Tour arrives at the Seychelles
The stunning 18-hole Championship course at European Tour Destination Constance Lemuria...
Perfect Stay and Playcation Al Hamra Golf Club, Ras Al Khaimah
JUST under an hour's drive from Dubai International Airport, and away...
Ras Al Hamra Golf Club, Muscat – It's a no brainer!
Big things are happening in Oman. The Sultanate has been on...
Get close to the DP World Tour Championship action at Ghaya Grand Hotel
The 11th edition of the European Tour's season-ending DP World Tour...
Verdura Resort and Masseria Torre Maizza: World-class golf in idyllic Italy
One lucky guest at the DHL Open in May was the...
Cyprus: Golf Travel's hidden gem
By Richard Bevan Cyprus is astonishingly 'under the radar' in terms...

redpajama_set_name: RedPajamaCommonCrawl


text:
Military veterans in Wales turn to beekeeping to tackle war traumas
Bee Free Project aims to help 15 ex-servicemen cope with Post Traumatic Stress Disorder
Andrew ForgraveRural Affairs Editor
Rhodri Owen (left) and Richard Jones at their Cilgwenyn Bee Farm in Carmarthenshire
Welsh war veterans are turning to the gentle art of beekeeping to cope with Post Traumatic Stress Disorder (PTSD).
Former soldier Richard Jones, who served in Bosnia, Kosovo, Afghanistan and Iraq, believes the pastime can help ex-servicemen who are affected by the debilitating disorder.
After being diagnosed with PTSD several years ago, he found that beekeeping helped with flashbacks and memory loss – both common symptoms.
Richard has now launched the Bee Free Project to teach the hobby to fellow veterans so that they can deal with the effects of PTSD.
Military veterans' charity aims to raise £750,000 to tackle Post Traumatic Stress Disorder
And on Friday he will be outlining his plans at a beekeeping workshop near Newtown, Powys.
"One of the difficulties with PTSD is concentration – short-term memory loss is also quite common, as is difficulty with taking on board new information," he said.
"Other factors, such as not wanting to socialise, means that joining a traditional beekeeping association may not be suitable for this target group.
"Beekeeping certainly focuses the mind – especially when the prospect of getting stung is a factor!"
Mold veteran who confronted Tesco knifeman hailed at Pride of Britain Awards
Project targets 15 ex-servicemen
Next year Richard aims to teach at least 15 ex-service personnel, each of whom will introduce around 2.5m bees to their local areas if they progress with the hobby.
Fascinated by bees since a child, Richard runs Cilgwenyn Bee Farm near Llangennech, Carmarthenshire, with his partner Rhodri Owen.
They say the exact mechanisms by which beekeeping can help ex-soldiers cope with PTSD is still unknown.
Bee thieves in North Wales strike for third time in six weeks
Sufferers should follow professional medical advice, they said.
However the pair say beekeeping may help with those with nightmares, insomnia, aggressive behaviour and relationship problems
Distrust, misuse of alcohol and drugs, isolation and suicidal thoughts are other possible PTSD symptoms.
"What we offer here at the Bee Free Project is a complete understanding of the situation, having had these experiences myself," said Richard, originally from Llanelli.
Gwynedd orchard aims to establish up to 20 beehives
"I can still experience difficult days and if anything these have added more humour to the lessons – in typical military fashion."
Plans outlined at Cywain Bee workshop
Richard and Rhodri are being supported by Cywain Bee – a project that encourages farmers and landowners to place beehives on their land and increase the production of Welsh honey.
It is organising Friday's day-long workshop at Gregynog Hall, near Newtown, which aims to show Welsh beekeepers how to get the most out of selling honey direct to the public.
Plea to turn derelict Wrexham properties into homes for military veterans
Cywain Bee development manager Haf Wyn Hughes said: "We are delighted to be part of Richard's initiative and see the difference it's made to other ex-servicemen.
"The specialist mentoring Richard has provided shows that, due to special circumstances, not all individuals feel comfortable joining beekeeping groups.
"Thanks to the link between Cywain Bee and Richard they can still become involved in beekeeping."
Patriotic Flint pays tribute to servicemen with pub mural
The Bee Free Project needs to raise almost £30,000 to achieve its ambitions.
Details: 07988 874608 or fundraising@beefreeproject.org.
Country and Farming
CourtsDrink driver crashed van - then called police to tell them what he had donePhillip Mills, from Buckley, was in his works vehicle when he crashed into a wooded area after misjudging a bend


text:
Boca Raton Football Club to Field Team in Beaches Adult Soccer League
BOCA RATON, FL — Today, Boca Raton Football Club continues its commitment to growing soccer in Palm Beach County by proudly announcing that the club will now field a team in the Beaches Adult Soccer League (BASL) starting immediately.
A non-profit organization founded in 1989 by a group of individuals who wanted regional soccer to be played at the highest levels possible, BASL is the number 1 amateur soccer league in all of Florida today and has grown to be able to manage more sanctioned games per year than any other adult league.
"We want to continue to grow that game in Palm Beach County," said club president, Douglas Heizer. "We are 561 Pride, and to have a team in the BASL is the epitome of Local Soccer. Our brand is known worldwide, and to place a team in Palm Beach County's best adult league is something we have been working for for a long time, we are glad the day is here."
Boca Raton FC looks for key partnerships among locals and teams to operate teams outside the two main NPSL and APSL clubs that Boca Raton FC manages.
In BASL, Boca Raton FC has reached a partnership with Nick Rasek, who had a team in BASL last year named West Palm FC.
Rasek will continue to run his team, and will rebrand his club as Boca Raton FC, and will now have access to Boca Raton FC's players poll, as well as assistance from Boca Raton FC's media department to promote BASL games, as well as Boca Raton FC vendors.
"We aren't able to own and operate every single team in every single league we want to join," added Heizer. "Key partnerships like the one with Nick will help us put our brand into teams that would like to be affiliated to the Boca Raton FC brand and have exclusive access to Boca Raton FC partners, departments, and more."
In the 2018 BASL Summer Championship, under Rasek's leadership, his club defeated the top two BASL teams, Gold Coast Inter AFC, and Shocker FC to earn the 2018 BASL Summer Championship after coming in 4th place in the regular season.
With a extensive knowledge of the game, Rasek holds a US Federation C License, and was an assistant coach on Lynn University's 2011 National Champion Runner-Up and 2012 Championship teams. Currently Rasek runs the Lake Worth Youth Soccer programs, something he's been going since 2012.
With its announcement of the BASL team, Boca Raton FC now boasts teams four leagues, all with different levels of play, and a bigger chance for local players to be seen and become part of the Boca Raton FC family.
Boca Raton FC's BASL team will take the field again on Sunday, September 23 at 7pm as they take on Palm Beach Flames at Marisol Park in Palm Beach Gardens.
For more information on the BASL or Boca Raton FC's BASL team, please visit: bocaratonfc.com/basl
◂ Boca Raton Football Club Joins Florida Gold Coast League for 2018 Fall Season
Boca Raton FC Forms 7v7 Adult Soccer League Formed in Partnership With BASL ▸


I was searching for a Property and found this listing (MLS® #218083613). Please send me more information regarding 584 Banyan Blvd, NAPLES, FL, 34102. Thank you!
I'd like to request a showing of 584 Banyan Blvd, NAPLES, FL, 34102 (MLS® #218083613). Thank you!


Hey all today I wanted to share a festive spring recipe going into the weekend. Introducing the bramble cocktail which is a classic cocktail made with gin, lemon juice, sugar, and topped with Créme de Mûre which is a blackberry liqueur.
I didn't have any blackberry liqueur and wanted to add a fresh taste to this cocktail so I opted to top this cocktail with a fresh strawberry and blackberry puree. For this puree I blended berries with a bit of lemon juice and sugar to taste then strained it. You could also use frozen berries and the best thing about making this puree is that it can be used in all kinds of cocktails like margaritas or you can use it to top your favorite ice cream. This is a perfect recipe to get a head start on fresh berry cocktails for spring. Top your weekend off with this fresh and springy gin cocktail!


text:
package butterknife.internal;

import com.google.common.base.Joiner;
import com.google.testing.compile.JavaFileObjects;
import javax.tools.JavaFileObject;
import org.junit.Test;

import static butterknife.internal.ProcessorTestUtilities.butterknifeProcessors;
import static com.google.common.truth.Truth.ASSERT;
import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;

public class OnClickTest {
  @Test public void onClickInjection() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick(1) void doStuff() {}",
        "}"));

    JavaFileObject expectedSource = JavaFileObjects.forSourceString("test/Test$$ViewInjector",
        Joiner.on('\n').join(
            "package test;",
            "import android.view.View;",
            "import butterknife.ButterKnife.Finder;",
            "public class Test$$ViewInjector {",
            "  public static void inject(Finder finder, final test.Test target, Object source) {",
            "    View view;",
            "    view = finder.findRequiredView(source, 1, \"method 'doStuff'\");",
            "    view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "      @Override public void doClick(android.view.View p0) {",
            "        target.doStuff();",
            "      }",
            "    });",
            "  }",
            "  public static void reset(test.Test target) {",
            "  }",
            "}"
        ));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .compilesWithoutError()
        .and()
        .generatesSources(expectedSource);
  }

  @Test public void onClickMultipleInjections() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.view.View;",
        "import android.app.Activity;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick(1) void doStuff1() {}",
        "  @OnClick(1) void doStuff2() {}",
        "  @OnClick({1, 2}) void doStuff3(View v) {}",
        "}"));

    JavaFileObject expectedSource = JavaFileObjects.forSourceString("test/Test$$ViewInjector",
        Joiner.on('\n').join(
            "package test;",
            "import android.view.View;",
            "import butterknife.ButterKnife.Finder;",
            "public class Test$$ViewInjector {",
            "  public static void inject(Finder finder, final test.Test target, Object source) {",
            "    View view;",
            "    view = finder.findRequiredView(source, 1, \"method 'doStuff1', method 'doStuff2', and method 'doStuff3'\");",
            "    view.setOnClickListener(",
            "      new butterknife.internal.DebouncingOnClickListener() {",
            "        @Override public void doClick(",
            "          android.view.View p0",
            "        ) {",
            "          target.doStuff1();",
            "          target.doStuff2();",
            "          target.doStuff3(p0);",
            "        }",
            "      });",
            "    view = finder.findRequiredView(source, 2, \"method 'doStuff3'\");",
            "    view.setOnClickListener(",
            "      new butterknife.internal.DebouncingOnClickListener() {",
            "        @Override public void doClick(",
            "          android.view.View p0",
            "        ) {",
            "          target.doStuff3(p0);",
            "        }",
            "      });",
            "  }",
            "  public static void reset(test.Test target) {",
            "}"));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .compilesWithoutError()
        .and()
        .generatesSources(expectedSource);
  }

  @Test public void findOnlyCalledOnce() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import android.view.View;",
        "import butterknife.InjectView;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @InjectView(1) View view;",
        "  @OnClick(1) void doStuff() {}",
        "}"));

    JavaFileObject expectedSource = JavaFileObjects.forSourceString("test/Test$$ViewInjector",
        Joiner.on('\n').join(
            "package test;",
            "import android.view.View;",
            "import butterknife.ButterKnife.Finder;",
            "public class Test$$ViewInjector {",
            "  public static void inject(Finder finder, final test.Test target, Object source) {",
            "    View view;",
            "    view = finder.findRequiredView(source, 1, \"field 'view' and method 'doStuff'\");",
            "    target.view = view;",
            "    view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "      @Override public void doClick(android.view.View p0) {",
            "        target.doStuff();",
            "      }",
            "    });",
            "  }",
            "  public static void reset(test.Test target) {",
            "    target.view = null;",
            "  }",
            "}"
        ));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .compilesWithoutError()
        .and()
        .generatesSources(expectedSource);
  }

  @Test public void methodVisibility() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import android.view.View;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick(1) public void thing1() {}",
        "  @OnClick(2) void thing2() {}",
        "  @OnClick(3) protected void thing3() {}",
        "}"
    ));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .compilesWithoutError();
  }

  @Test public void methodCastsArgument() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import android.view.View;",
        "import android.widget.Button;",
        "import android.widget.TextView;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick(0) void click0() {}",
        "  @OnClick(1) void click1(View view) {}",
        "  @OnClick(2) void click2(TextView view) {}",
        "  @OnClick(3) void click3(Button button) {}",
        "}"
    ));

    JavaFileObject expectedSource = JavaFileObjects.forSourceString("test/Test$$ViewInjector",
        Joiner.on('\n').join(
            "package test;",
            "import android.view.View;",
            "import butterknife.ButterKnife.Finder;",
            "public class Test$$ViewInjector {",
            "  public static void inject(Finder finder, final test.Test target, Object source) {",
            "    View view;",
            "    view = finder.findRequiredView(source, 0, \"method 'click0'\");",
            "    view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "      @Override public void doClick(android.view.View p0) {",
            "        target.click0();",
            "      }",
            "    });",
            "    view = finder.findRequiredView(source, 1, \"method 'click1'\");",
            "    view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "      @Override public void doClick(android.view.View p0) {",
            "        target.click1(p0);",
            "      }",
            "    });",
            "    view = finder.findRequiredView(source, 2, \"method 'click2'\");",
            "    view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "      @Override public void doClick(android.view.View p0) {",
            "        target.click2((android.widget.TextView) p0);",
            "      }",
            "    });",
            "    view = finder.findRequiredView(source, 3, \"method 'click3'\");",
            "    view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "      @Override public void doClick(android.view.View p0) {",
            "        target.click3((android.widget.Button) p0);",
            "      }",
            "    });",
            "  }",
            "  public static void reset(test.Test target) {",
            "  }",
            "}"
        ));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .compilesWithoutError()
        .and()
        .generatesSources(expectedSource);
  }

  @Test public void methodWithMultipleIds() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import android.view.View;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick({1, 2, 3}) void click() {}",
        "}"
    ));

    JavaFileObject expectedSource = JavaFileObjects.forSourceString("test/Test$$ViewInjector",
        Joiner.on('\n').join(
            "package test;",
            "import android.view.View;",
            "import butterknife.ButterKnife.Finder;",
            "public class Test$$ViewInjector {",
            "  public static void inject(Finder finder, final test.Test target, Object source) {",
            "    View view;",
            "    view = finder.findRequiredView(source, 1, \"method 'click'\");",
            "    view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "      @Override public void doClick(android.view.View p0) {",
            "        target.click();",
            "      }",
            "    });",
            "    view = finder.findRequiredView(source, 2, \"method 'click'\");",
            "    view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "      @Override public void doClick(android.view.View p0) {",
            "        target.click();",
            "      }",
            "    });",
            "    view = finder.findRequiredView(source, 3, \"method 'click'\");",
            "    view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "      @Override public void doClick(android.view.View p0) {",
            "        target.click();",
            "      }",
            "    });",
            "  }",
            "  public static void reset(test.Test target) {",
            "  }",
            "}"
        ));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .compilesWithoutError()
        .and()
        .generatesSources(expectedSource);
  }

  @Test public void optional() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import butterknife.OnClick;",
        "import butterknife.Optional;",
        "public class Test extends Activity {",
        "  @Optional @OnClick(1) void doStuff() {}",
        "}"));

    JavaFileObject expectedSource = JavaFileObjects.forSourceString("test/Test$$ViewInjector",
        Joiner.on('\n').join(
            "package test;",
            "import android.view.View;",
            "import butterknife.ButterKnife.Finder;",
            "public class Test$$ViewInjector {",
            "  public static void inject(Finder finder, final test.Test target, Object source) {",
            "    View view;",
            "    view = finder.findOptionalView(source, 1);",
            "    if (view != null) {",
            "      view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "        @Override public void doClick(android.view.View p0) {",
            "          target.doStuff();",
            "        }",
            "      });",
            "    }",
            "  }",
            "  public static void reset(test.Test target) {",
            "  }",
            "}"
        ));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .compilesWithoutError()
        .and()
        .generatesSources(expectedSource);
  }

  @Test public void optionalAndRequiredSkipsNullCheck() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import android.view.View;",
        "import butterknife.InjectView;",
        "import butterknife.OnClick;",
        "import butterknife.Optional;",
        "public class Test extends Activity {",
        "  @InjectView(1) View view;",
        "  @Optional @OnClick(1) void doStuff() {}",
        "}"));

    JavaFileObject expectedSource = JavaFileObjects.forSourceString("test/Test$$ViewInjector",
        Joiner.on('\n').join(
            "package test;",
            "import android.view.View;",
            "import butterknife.ButterKnife.Finder;",
            "public class Test$$ViewInjector {",
            "  public static void inject(Finder finder, final test.Test target, Object source) {",
            "    View view;",
            "    view = finder.findRequiredView(source, 1, \"field 'view'\");",
            "    target.view = view;",
            "    view.setOnClickListener(new butterknife.internal.DebouncingOnClickListener() {",
            "      @Override public void doClick(android.view.View p0) {",
            "        target.doStuff();",
            "      }",
            "    });",
            "  }",
            "  public static void reset(test.Test target) {",
            "    target.view = null;",
            "  }",
            "}"
        ));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .compilesWithoutError()
        .and()
        .generatesSources(expectedSource);
  }

  @Test public void failsInJavaPackage() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package java.test;",
        "import butterknife.OnClick;",
        "public class Test {",
        "  @OnClick(1) void doStuff() {}",
        "}"
    ));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .failsToCompile()
        .withErrorContaining(
            "@OnClick-annotated class incorrectly in Java framework package. (java.test.Test)")
        .in(source).onLine(4);
  }

  @Test public void failsInAndroidPackage() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package android.test;",
        "import butterknife.OnClick;",
        "public class Test {",
        "  @OnClick(1) void doStuff() {}",
        "}"
    ));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .failsToCompile()
        .withErrorContaining(
            "@OnClick-annotated class incorrectly in Android framework package. (android.test.Test)")
        .in(source).onLine(4);
  }

  @Test public void failsIfHasReturnType() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick(1)",
        "  public String doStuff() {",
        "  }",
        "}"));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .failsToCompile()
        .withErrorContaining("@OnClick methods must have a 'void' return type. (test.Test.doStuff)")
        .in(source).onLine(6);
  }

  @Test public void failsIfPrivateMethod() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick(1)",
        "  private void doStuff() {",
        "  }",
        "}"));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .failsToCompile()
        .withErrorContaining("@OnClick methods must not be private or static. (test.Test.doStuff)")
        .in(source).onLine(6);
  }

  @Test public void failsIfStatic() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick(1)",
        "  public static void doStuff() {",
        "  }",
        "}"));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .failsToCompile()
        .withErrorContaining("@OnClick methods must not be private or static. (test.Test.doStuff)")
        .in(source).onLine(6);
  }

  @Test public void failsIfParameterNotView() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick(1)",
        "  public void doStuff(String thing) {",
        "  }",
        "}"));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .failsToCompile()
        .withErrorContaining(Joiner.on('\n').join(
            "Unable to match @OnClick method arguments. (test.Test.doStuff)",
            "  ",
            "    Parameter #1: java.lang.String",
            "      did not match any listener parameters",
            "  ",
            "  Methods may have up to 1 parameter(s):",
            "  ",
            "    android.view.View",
            "  ",
            "  These may be listed in any order but will be searched for from top to bottom."))
        .in(source).onLine(6);
  }

  @Test public void failsIfMoreThanOneParameter() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import android.view.View;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick(1)",
        "  public void doStuff(View thing, View otherThing) {",
        "  }",
        "}"));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .failsToCompile()
        .withErrorContaining(
            "@OnClick methods can have at most 1 parameter(s). (test.Test.doStuff)")
        .in(source).onLine(7);
  }

  @Test public void failsIfInInterface() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import butterknife.OnClick;",
        "public interface Test {",
        "  @OnClick(1)",
        "  void doStuff();",
        "}"));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .failsToCompile()
        .withErrorContaining(
            "@OnClick methods may only be contained in classes. (test.Test.doStuff)")
        .in(source).onLine(3);
  }

  @Test public void failsIfHasDuplicateIds() {
    JavaFileObject source = JavaFileObjects.forSourceString("test.Test", Joiner.on('\n').join(
        "package test;",
        "import android.app.Activity;",
        "import butterknife.OnClick;",
        "public class Test extends Activity {",
        "  @OnClick({1, 2, 3, 1})",
        "  void doStuff() {",
        "  }",
        "}"));

    ASSERT.about(javaSource()).that(source)
        .processedWith(butterknifeProcessors())
        .failsToCompile()
        .withErrorContaining(
            "@OnClick annotation for method contains duplicate ID 1. (test.Test.doStuff)")
        .in(source).onLine(6);
  }
}

redpajama_set_name: RedPajamaGithub


I am passionate about narrative and colour and love the idea that people will find their own stories and fairy tales in my work.
I paint mainly in acrylics and have a surrealist theme to my paintings. I also draw scenes from every day life and my imagination. I like to explore different styles to create a variety of effects.
I have also recently started making candles.
I have always marveled at how a painting can capture a mood, steal a moment which would otherwise be private or create something new out of what might in fact be in front of you. My current work is a mixture of portraits and city scenes, all oil on canvas.
My first inspiration is nature especially plants, the way they look, how and where they grow and our homes within the landscape. I paint using water colours, acrylics and oil sticks. Each medium brings it's own discipline. Oil sticks encourage me to explore more abstract images and physical ways of working with colour and texture.
Watercolour paintings. I paint landscapes which include buildings and still life.
My work consists of Abstract paintings and Surrealist sculpture, all with a post-apocalyptic tone and rich range of marks. Mark making and method are central to the work, along with the use of non-traditional materials.
Getting inspiration from the natural world, either animals, people or nature and amalgamating these in a meaningful and dynamic way, I hope to reflect the beauty of the world around us and how we relate to it. I have also recently moved into creating pet portraits, which I enjoy immensely.
Lino prints, oil paintings and drawings.
Mostly self taught I began painting for my own enjoyment but soon people started asking to buy my work. I decided to start exhibiting my work and really enjoy meeting the interesting mix of people that visit and talk art, whether it be theirs, mine or someone else.
I love using vibrant colour to lift the mood, capturing on canvas all things in nature and love nothing more than when someone tells me how much my pictures cheer them when they see them in their homes each day.
I am inspired by nature and enjoy landscape painting but also enjoy still life, while boats and "all-things-sea" is a bit of a passion. I work mainly with watercolours and also other mediums like collage, gouache and pen & ink. Another favourite pursuit is creating unique colourful bookmarks using crystal, glass and metal beads.
I am an Argentine artist now living in Bristol. I have also studied Drama, Music, Trapeze and published a book with my poems and lithographs called "Resabio de las Fiestas".
I'm now working on a new series of acrylics, oils, drawings, art jewellery and dolls, apart from dedicating time to the trapeze and to my new book. Most of my inspiration comes from my travels around the world, people, poetry and the circus.
My work is mainly acrylic on canvas, but I have also produced some mixed media pieces. I regularly exhibit in Bristol and have had work featured in the R.W.A. Autumn Exhibition.
Terry Burke collects images from a variety of sources including landscapes, stone carvings, and ancient artefacts. Many of her images deal with ideas of timelessness, the changing world, balance and dreams. This series was developed from a 9th century stone carving and reworks the traditional view of angels. Her preferred materials are acrylic paint and pastel on textured paper.
I work mainly in pencil and watercolour, and also pen, ink and wash, with my specialities being architecture, figure, floral and animals. My main body of published work is Architectural Illustration and Greetings card designs. In addition to this I publish my own greetings cards, and carry out many private commissions which include architecture,landscape, pet portraits and still life.


text:
Japan: Where Conflict Is Harmony
Japan's landscape is often seen as one made up of numerous conflicting elements. Is this really the case?
By for The Diplomat
In this third in a series exploring Japanese aesthetics, The Diplomat looks into the popular notion that the 'Land of the Rising Sun' is also a land of opposites.
What is it that makes Japan's landscape so visually distinctive? And is the answer to this question the key to defining the 'Japanese aesthetic'?
Drawing on insights from scholars, authors and architects on Japan's contemporary landscape, this series aims to answer these questions. So far, to better understand the concept of Japanese aesthetics, I've zeroed in on two specific, common landscapes in the country—its streets and gardens—and looked at the historical modernism and eclectic nature of its unique urban landscape. Today I'm going to take a look at the well-worn idea that Japan's landscape is comprised of numerous conflicting elements. Is this really the case? Or is there actually harmony rather than conflict in the diversity?
Land of Opposites?
The idea that Japan is a country made up of opposing characteristics is a popular one. Even online travel resource Wikitravel introduces Japan as, 'a study in contrasts and contradictions.' The popular travel database goes on to say it's a land where 'the past meets the future,' and describes the landscape as one where 'cities are as modern and high tech as anywhere else, but tumbledown wooden shacks can still be spotted next to glass fronted designer condominiums,' and 'beautiful temples and gardens which are often surrounded by garish signs and ugly buildings.'
Architect Julian Worrall too, in his book, 21st Century Tokyo: A Guide to Contemporary Architecture, calls Tokyo 'at this moment' a city that's 'advanced yet modest, tightly ordered yet insouciant, complete yet ever new, strange yet comfortably familiar.' Worrall and co-author Erez Golani Solomon's description of Japan's capital appear to lend weight to the notion that contrasting forces define the nation.
And according to Gordon Kanki-Knight, author of several Wallpaper* guides to Japanese cities, old vs. new is a theme played out across all of Japan's urban centres. 'The tension between the effort to modernize and the desire to retain something of the older, pre-war Japan that was very sure of itself is played out in every city,' he told me. 'Japan's cities are…while appearing "modern," actually full of contradictions, fortuitous mistakes, and successful new concepts.'
But while this idea of contrasting forces could imply a kind of chaotic, urban mess, there is another perspective.
Battling Forces or Perfect Harmony?
Yoichi Kubota, a professor at Saitama University, veteran engineer and the chairman of the design committee of a major (still to be named) bridge currently under construction in Tokyo Bay, told me that diversity doesn't have to mean conflict.
Kubota told me that in his view, while man and nature are pressed together in Japan, there's a distinct lack of the man vs. nature concept so prevalent in the West. 'Modern technology propagated in the Western world has sustained a basic idea of human versus nature,' he explained. Pointing to Europe as an example, he said: 'Italian cities and gardens are artefacts derived from the idea of humanizing the environment by controlling nature, (an idea) which has been handed down for many centuries in the Western world.' Kubota suggests that the visual environment that was formed in the West 'according to rational reasoning,' is very different from Japan, where 'some part of human action' has always been 'open to nature, welcoming the effects coming out as the interaction between artefact and nature.'
He explained to me also that the huge bridge he had a hand in creating, which will have a major impact on Tokyo's landscape, was designed with this harmonization in mind: '(The bridge) is on the sea with the sky in the background, thus the viewer will experience the interaction among (the man-made and nature) through undulating colour and light.'
Kanki-Knight, now based in Australia, recalls certain experiences from years living and writing in Japan, that also point to contrasting forces coming together in a uniquely positive way: 'I once asked design great Naoto Fukasawa how he dreamt up his ideas. I had imagined he would sit before a wide-screen Mac in a pristine white office. But he told me that he trekked to a mountain cabin without electricity to ponder his next pared-down kettle or toaster—I shouldn't have been surprised to learn that he incorporates asceticism in his quest to find answers to his design quandaries.'
In 2009, Kanki-Knight also met young, creative designer Hiranao Tsuboi, who happens to be a Buddhist monk who also designs 'cell phones, furniture and electrical goods.' He explained to me that while 'that combination might seem odd in the West, in Japan the old and new, tradition and modernism are entirely compatible—indeed they are virtually one.'
Kanki-Knight pointed out certain examples of well-known Japanese structures that successfully 'incorporate elements of modernism but retain something of the pre-Meiji era,' such as the works in Tokyo of Kenzo Tange—the Yoyogi National Gymnasium in Shibuya, or the late Kisho Kurokawa's Nakagin Capsule Tower in Ginza—through which he dares you to try passing 'without pausing to give it a second and third look.' He also mentions 'Japanese design greats' like Ikko Tanaka, Kenya Hara, Rikki Watanabe and Sori Yanagi, who have all in his opinion an 'ability to drawn on and improve on Japan's modern yet traditional design history.'
'Old and new coexist in Japan, this is what sets design apart in the country,' he added.
Worrall told me he believes there's something else at play in Japan—the large numbers of people that subscribe to a unique way of thinking that he calls naïve naturalism: 'a child's world of harmonious environment where man and nature are not at war with each other.' Citing the worlds created by animation legend Hayao Miyazaki as an example of this aesthetic, he explained that this sort of ideal is reflected in Japan's contemporary visual landscape thanks to renowned architect Teranobu Fujimori and others like him.
Worrall explained that contrary to 'the stuff that sells very well to a foreign audience of a cool contemporary Japan—that kind of pristine white clean look,' the Fujimori look is something quite different: 'It's basically like gingerbread houses made out of wood and plaster and tree branches that haven't been touched in any way, that kind of thing. Fujimori's kind of naturalism references a Japanese tradition…the tradition of the teahouse, for example.'
He went on to suggest that through his architecture, Fujimori not only takes traditional Japanese elements that themselves contrast, like inside a teahouse where 'it's about the contrast between sharp and smooth, between natural and artificial, between dark and light…bitter and sweet,' but combines that with his own contemporary ideas, putting all these contrasting elements in. And it works.
For Japan, diversity is a strength of its landscape, not a weakness. Friday, I'll continue to explore the concept of 'Japaneseness' and the Japanese aesthetic, before finishing off the series next week, with a look into the possible future for Japan's landscape.
Images: Marunouchi business district by Shiny Things / Flickr (top), Terunobu Fujimori's Takasugi-an Teahouse by japanese_craft_construction / Flickr (bottom).
Japanese Aesthetic
Sapporo, Japan: Worth a Visit
This often forgotten Japanese city to the north is surprisingly modern, friendly and design-savvy — and well worth a visit.
Japan's Future Look
With new challenges ahead, will the country's landscape be able to hold onto its distinctively 'Japanese' look?
What is 'Japaneseness'?
What does it mean to say that a building or a piece of culture is Japanese? Defining 'Japaneseness' is no easy feat.
One-of-a-Kind Japan
What makes Japan's landscape unique? The answer may lie in its centuries-old traditions and eccentric cities.
China's Navy, the West Pacific and the Role of Okinotorishima
By TSURUTA Jun
Philippines Refuses to Cooperate With 'Unacceptable' ICC Drug War Investigation
By Sebastian Strangio
Last week, the International Criminal Court ordered the restarting of its investigation into former President Rodrigo Duterte's violent "war on drugs."
Marcos and the Philippines at Davos
Since taking office in July, President Ferdinand Marcos Jr. has undertaken eight trips abroad, with a ninth to come next month.
Repression, Debt, Corruption and Human Trafficking: Hun Sen's Cambodian Legacy
By Sam Rainsy
The Cambodian leader's goal is to establish a North Korean-style dynasty under which his descendants will continue to hold power indefinitely.


The Exiles by Hilary McKay. Margaret K. McElderry Books, a Simon & Schuster imprint. 1992. Review copy from library; review originally appeared at The Edge of the Forest.
In classic tradition that dates back at least to Little Women , The Exiles is about four sisters, the Conroys: Ruth, 13; Naomi, 11; Rachel, 8; and Phoebe, 6. I'm not sure why four is the magic number; but it's proven true as recently as The Penderwicks .
The girls are unique, independent and delightfully real in their sense of honor and morals. Early on, one of their younger sisters has gotten in trouble for something and is obediently waiting to get punished. Her older sisters "looked at her in despair. They believed in behaving as though they were innocent at least until they were proven guilty, and quite often even after that." Ruth and Naomi are not saying to lie or be obstinate; rather, they are saying why give in so easily? Why, just because you're the child, accept the adults' version? Why not stand up for yourself and your view of events? They despair not at their sister's obedience, but rather at her not asserting herself and her voice.
The Conroys have real sister dynamics: there is love, companionship, and affection, but also arguments, selfishness, snark, and even fistfights. These are not idolized or glorified children. They delight in each other, and a good story.
The girls are quite content at home, and as can be imagined by their motto of "behave as though innocent," get into some interesting situations. Then comes one of the more innovative "get the parents out of the picture" devices; no dead mom this time, rather, the parents get an unexpected inheritance, decide to remodel, and send the girls to their grandmother's for the summer. It's an indication of how well the girls think of themselves and their place in the family that each girl assumes that she will get a share of the inheritance and each is bitterly disappointed and betrayed to discover that their selfish parents don't intend to share it.
The girls are in for a surprise; "Big Grandma" has decided that the girls read too much, live too much in the world of books, so for an entire summer has banned the books. She insists she has none of her own. This would have been a nightmare for me, as a child and now; and I sympathize with the girls who have nothing to read. "Big Grandma" has decided that she can "fix" the girls; but the girls prove too creative and innovative. Despite the initial antagonism, the girls and their grandmother grow close; eventually, "Big Grandma's cooking stopped tasting like an outsider's cooking and became ordinary."
McKay does a great job of capturing childhood and children with all their warts; the girls continually assume that they are right and correct about everything. They are casual about the truth, especially when it serves a greater good. In supporting their attempts at fire-building, they make a casual lie about having learned how in the Girl Guides. Casual, because they are convinced that having read about it in books, they can in fact build a fire. So it's not really a lie. It is perhaps this belief in "If I read it, I can do" that has inspired "Big Grandma" to do away with books for the summer.
The Conroys' stubborn insistence that they are in the right can lead to adventures; but these are not over the top adventures. They are summer time adventures: a visit to a neighbor, swimming at the beach, gardening, hiking. The adventure comes from the imagination learned from books combined with confidence that it will all work out the way they want it to. This can be for the good or the bad. The girls go to visit a cave, and Naomi freezes on the way up the side of a cliff, afraid she'll fall. Later, determined to do what her sisters did, Naomi visits the place on her own, determined to conquer her fear. She does so; but she also falls. As she falls, "she felt vaguely triumphant; she'd known she would fall and she had fallen, so she had been right all along."
The brilliance of McKay is that a less honest writer would have had Naomi conquer a fear of heights; instead, Naomi discovers that her fear was not unfounded or silly. Not only that, but Naomi is triumphant in that knowledge. The Conroys remain, as ever, confident in their knowledge that they are right; so continue to behave as though innocent.
It's the fishing in a bucket scene that keeps me recommending this book (and its sequels). I laugh out loud every single time and look around desperate for someone to read it out loud to.
I came to leave a comment about the fishing in the bucket bit too! I love that bit with all my heart.
I loved The Exiles right up until the horrifying disaster at the end. I was heartbroken. I can't reread it. Instead I go straight to The Exiles at Home.
You'd think with her Casson family books doing well, they'd come up with some new covers for this series. I'm convinced they're the reason the books don't get checked out as often as McKay's others. Sigh.


text:
GloPID-R 2021 Highlights and Season's Greetings
As 2021 draws to a close, we would like to thank all our members, observers and partners for their participation and support during what has been another very active year for GloPID-R. The global community of funders has participated in an unprecedented response to the COVID-19 pandemic, and our efforts will continue in 2022.
Here are some of our activities and accomplishments over the past year.
With best wishes for a happy and healthy holiday season.
Charu Kaushic, GloPID-R Chair
A year of growth
32 members & 5 observers
In 2021, we welcomed 3 new members:
FONRID (Burkina Faso)
FONSTI (Côte d'Ivoire)
NCST (Rwanda)
We have 2 new observers, and we are now observers of:
ESSENCE on Health Research Initiative (WHO/TDR)
GOARN (Global Outbreak Alert and Response Network)
The challenges facing funders
The need for coordination among funders of research is greater than ever in the face of the ongoing global health crisis. In 2021, GloPID-R worked with members and partners to identify and address the most urgent research priorities. These are the initiatives we undertook:
We organized the Long COVID Joint Research Forum with our partners ISARIC and the Long Covid Support Group.
Following this online forum, The Lancet Infectious Diseases published a letter authored by the GloPID-R Long COVID Forum Working Group and ISARIC.
The Long Covid Forum Group published Research Priorities for Long COVID in BMC Medicine.
Research Project Tracker
Developed by UKCDR and GloPID-R, the COVID-19 Research Project Tracker includes over 13,000 funded projects across 160 countries as of November 2021. We are exploring ways to expand and adapt this live database in 2022.
In a blog post, Alice Norton, Head of the GloPID-R Scientific Secretariat, described the value of the Project Tracker and associated Living Mapping Review for funders and researchers.
COVID-19 research in LMICs
Thousands of researchers and funders attended our online event, COVID-19 research in low- and middle-income countries, organized with partners UKCDR and COVID-19 Clinical Research Coalition.
The GloPID-R & UKCDR COVID CIRCLE Lessons for Funders report about funding and undertaking research during the first year of the COVID-19 pandemic explores lessons learned especially in LMICs.
A virtual dialogue, "What have we learned from funding COVID-19 research across the globe?" was co-hosted by UKCDR and GloPID-R to coincide with the release of this report.
Marie Staunton (UKCDR) and Charu Kaushic (GloPID-R) reflect on lessons learned in "Getting COVID-19 research to the right places".
Scientific Advisory Group (SAG) Report
Recommendations and guidance for funders
Using a highly innovative scenario-planning methodology, the GloPID-R Scientific Advisory Group outlined research priorities through 2023 in its report Recommendations & Considerations for GloPID-R.
Based on the SAG's findings, the GloPID-R Co-Chairs Recommendations provided succinct guidance from our leadership for our members.
GloPID-R communications
New initiatives with our members
With our one-on-one meetings and the recently launched Member Focus and News & Events Round Up we are stepping up communications with our members.
GloPID-R news is being amplified via social media, especially Twitter.
The revamped GloPID-R website will be launched early in the new year.
New directions in 2022
Plans and projects in the pipeline
GloPID-R is hard at work preparing initiatives to expand in new directions:
Exploring ways to implement the regional hub strategy with a pilot project underway in Asia Pacific.
Continuing to work with GloPID-R members to establish similar pilot projects for regional hubs in Africa and Latin America.
Reforming the Clinical Trials Network (CTN ) working group and establishing a globally-representative CTN & Funders working group to align regional and global approaches.
Expanding the Research Project Tracker as a broader tool for research funders, covering a wider range of diseases with epidemic and pandemic potential.
Developing a joint funding call for research preparedness.
Advancing coordination and cooperation with WHO.
Creating a joint 'One Health' working group with OIE/STAR-IDAZ.
Further expanding our membership.


text:
package org.apache.druid.sql.calcite.schema;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.common.net.HostAndPort;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.inject.Inject;
import org.apache.calcite.DataContext;
import org.apache.calcite.linq4j.DefaultEnumerable;
import org.apache.calcite.linq4j.Enumerable;
import org.apache.calcite.linq4j.Enumerator;
import org.apache.calcite.linq4j.Linq4j;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.schema.ScannableTable;
import org.apache.calcite.schema.Table;
import org.apache.calcite.schema.impl.AbstractSchema;
import org.apache.calcite.schema.impl.AbstractTable;
import org.apache.druid.client.ImmutableDruidServer;
import org.apache.druid.client.JsonParserIterator;
import org.apache.druid.client.TimelineServerView;
import org.apache.druid.client.coordinator.Coordinator;
import org.apache.druid.client.indexing.IndexingService;
import org.apache.druid.discovery.DruidLeaderClient;
import org.apache.druid.indexer.TaskStatusPlus;
import org.apache.druid.java.util.common.RE;
import org.apache.druid.java.util.common.StringUtils;
import org.apache.druid.java.util.common.parsers.CloseableIterator;
import org.apache.druid.java.util.http.client.Request;
import org.apache.druid.segment.column.ValueType;
import org.apache.druid.server.coordinator.BytesAccumulatingResponseHandler;
import org.apache.druid.server.security.Access;
import org.apache.druid.server.security.Action;
import org.apache.druid.server.security.AuthenticationResult;
import org.apache.druid.server.security.AuthorizationUtils;
import org.apache.druid.server.security.AuthorizerMapper;
import org.apache.druid.server.security.ForbiddenException;
import org.apache.druid.server.security.Resource;
import org.apache.druid.server.security.ResourceAction;
import org.apache.druid.server.security.ResourceType;
import org.apache.druid.sql.calcite.planner.PlannerContext;
import org.apache.druid.sql.calcite.table.RowSignature;
import org.apache.druid.timeline.DataSegment;
import org.apache.druid.timeline.SegmentId;
import org.jboss.netty.handler.codec.http.HttpMethod;

import javax.annotation.Nullable;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;

public class SystemSchema extends AbstractSchema
{
  public static final String NAME = "sys";
  private static final String SEGMENTS_TABLE = "segments";
  private static final String SERVERS_TABLE = "servers";
  private static final String SERVER_SEGMENTS_TABLE = "server_segments";
  private static final String TASKS_TABLE = "tasks";

  static final RowSignature SEGMENTS_SIGNATURE = RowSignature
      .builder()
      .add("segment_id", ValueType.STRING)
      .add("datasource", ValueType.STRING)
      .add("start", ValueType.STRING)
      .add("end", ValueType.STRING)
      .add("size", ValueType.LONG)
      .add("version", ValueType.STRING)
      .add("partition_num", ValueType.LONG)
      .add("num_replicas", ValueType.LONG)
      .add("num_rows", ValueType.LONG)
      .add("is_published", ValueType.LONG)
      .add("is_available", ValueType.LONG)
      .add("is_realtime", ValueType.LONG)
      .add("payload", ValueType.STRING)
      .build();

  static final RowSignature SERVERS_SIGNATURE = RowSignature
      .builder()
      .add("server", ValueType.STRING)
      .add("host", ValueType.STRING)
      .add("plaintext_port", ValueType.LONG)
      .add("tls_port", ValueType.LONG)
      .add("server_type", ValueType.STRING)
      .add("tier", ValueType.STRING)
      .add("curr_size", ValueType.LONG)
      .add("max_size", ValueType.LONG)
      .build();

  static final RowSignature SERVER_SEGMENTS_SIGNATURE = RowSignature
      .builder()
      .add("server", ValueType.STRING)
      .add("segment_id", ValueType.STRING)
      .build();

  static final RowSignature TASKS_SIGNATURE = RowSignature
      .builder()
      .add("task_id", ValueType.STRING)
      .add("type", ValueType.STRING)
      .add("datasource", ValueType.STRING)
      .add("created_time", ValueType.STRING)
      .add("queue_insertion_time", ValueType.STRING)
      .add("status", ValueType.STRING)
      .add("runner_status", ValueType.STRING)
      .add("duration", ValueType.LONG)
      .add("location", ValueType.STRING)
      .add("host", ValueType.STRING)
      .add("plaintext_port", ValueType.LONG)
      .add("tls_port", ValueType.LONG)
      .add("error_msg", ValueType.STRING)
      .build();

  private final Map<String, Table> tableMap;

  @Inject
  public SystemSchema(
      final DruidSchema druidSchema,
      final MetadataSegmentView metadataView,
      final TimelineServerView serverView,
      final AuthorizerMapper authorizerMapper,
      final @Coordinator DruidLeaderClient coordinatorDruidLeaderClient,
      final @IndexingService DruidLeaderClient overlordDruidLeaderClient,
      final ObjectMapper jsonMapper
  )
  {
    Preconditions.checkNotNull(serverView, "serverView");
    BytesAccumulatingResponseHandler responseHandler = new BytesAccumulatingResponseHandler();
    final SegmentsTable segmentsTable = new SegmentsTable(
        druidSchema,
        metadataView,
        jsonMapper,
        authorizerMapper
    );
    this.tableMap = ImmutableMap.of(
        SEGMENTS_TABLE, segmentsTable,
        SERVERS_TABLE, new ServersTable(serverView, authorizerMapper),
        SERVER_SEGMENTS_TABLE, new ServerSegmentsTable(serverView, authorizerMapper),
        TASKS_TABLE, new TasksTable(overlordDruidLeaderClient, jsonMapper, responseHandler, authorizerMapper)
    );
  }

  @Override
  public Map<String, Table> getTableMap()
  {
    return tableMap;
  }

  static class SegmentsTable extends AbstractTable implements ScannableTable
  {
    private final DruidSchema druidSchema;
    private final ObjectMapper jsonMapper;
    private final AuthorizerMapper authorizerMapper;
    private final MetadataSegmentView metadataView;

    public SegmentsTable(
        DruidSchema druidSchemna,
        MetadataSegmentView metadataView,
        ObjectMapper jsonMapper,
        AuthorizerMapper authorizerMapper
    )
    {
      this.druidSchema = druidSchemna;
      this.metadataView = metadataView;
      this.jsonMapper = jsonMapper;
      this.authorizerMapper = authorizerMapper;
    }

    @Override
    public RelDataType getRowType(RelDataTypeFactory typeFactory)
    {
      return SEGMENTS_SIGNATURE.getRelDataType(typeFactory);
    }

    @Override
    public TableType getJdbcTableType()
    {
      return TableType.SYSTEM_TABLE;
    }

    @Override
    public Enumerable<Object[]> scan(DataContext root)
    {
      //get available segments from druidSchema
      final Map<DataSegment, SegmentMetadataHolder> availableSegmentMetadata = druidSchema.getSegmentMetadata();
      final Iterator<Entry<DataSegment, SegmentMetadataHolder>> availableSegmentEntries =
          availableSegmentMetadata.entrySet().iterator();

      // in memory map to store segment data from available segments
      final Map<SegmentId, PartialSegmentData> partialSegmentDataMap =
          Maps.newHashMapWithExpectedSize(druidSchema.getTotalSegments());
      for (SegmentMetadataHolder h : availableSegmentMetadata.values()) {
        PartialSegmentData partialSegmentData =
            new PartialSegmentData(h.isAvailable(), h.isRealtime(), h.getNumReplicas(), h.getNumRows());
        partialSegmentDataMap.put(h.getSegmentId(), partialSegmentData);
      }

      //get published segments from metadata segment cache (if enabled in sql planner config), else directly from coordinator
      final Iterator<DataSegment> metadataSegments = metadataView.getPublishedSegments();

      final Set<SegmentId> segmentsAlreadySeen = new HashSet<>();

      final FluentIterable<Object[]> publishedSegments = FluentIterable
          .from(() -> getAuthorizedPublishedSegments(
              metadataSegments,
              root
          ))
          .transform(val -> {
            try {
              segmentsAlreadySeen.add(val.getId());
              final PartialSegmentData partialSegmentData = partialSegmentDataMap.get(val.getId());
              long numReplicas = 0L, numRows = 0L, isRealtime = 0L, isAvailable = 0L;
              if (partialSegmentData != null) {
                numReplicas = partialSegmentData.getNumReplicas();
                numRows = partialSegmentData.getNumRows();
                isAvailable = partialSegmentData.isAvailable();
                isRealtime = partialSegmentData.isRealtime();
              }
              return new Object[]{
                  val.getId(),
                  val.getDataSource(),
                  val.getInterval().getStart().toString(),
                  val.getInterval().getEnd().toString(),
                  val.getSize(),
                  val.getVersion(),
                  Long.valueOf(val.getShardSpec().getPartitionNum()),
                  numReplicas,
                  numRows,
                  1L, //is_published is true for published segments
                  isAvailable,
                  isRealtime,
                  jsonMapper.writeValueAsString(val)
              };
            }
            catch (JsonProcessingException e) {
              throw new RE(e, "Error getting segment payload for segment %s", val.getId());
            }
          });

      final FluentIterable<Object[]> availableSegments = FluentIterable
          .from(() -> getAuthorizedAvailableSegments(
              availableSegmentEntries,
              root
          ))
          .transform(val -> {
            try {
              if (segmentsAlreadySeen.contains(val.getKey().getId())) {
                return null;
              }
              final PartialSegmentData partialSegmentData = partialSegmentDataMap.get(val.getKey().getId());
              final long numReplicas = partialSegmentData == null ? 0L : partialSegmentData.getNumReplicas();
              return new Object[]{
                  val.getKey().getId(),
                  val.getKey().getDataSource(),
                  val.getKey().getInterval().getStart().toString(),
                  val.getKey().getInterval().getEnd().toString(),
                  val.getKey().getSize(),
                  val.getKey().getVersion(),
                  Long.valueOf(val.getKey().getShardSpec().getPartitionNum()),
                  numReplicas,
                  val.getValue().getNumRows(),
                  val.getValue().isPublished(),
                  val.getValue().isAvailable(),
                  val.getValue().isRealtime(),
                  jsonMapper.writeValueAsString(val.getKey())
              };
            }
            catch (JsonProcessingException e) {
              throw new RE(e, "Error getting segment payload for segment %s", val.getKey().getId());
            }
          });

      final Iterable<Object[]> allSegments = Iterables.unmodifiableIterable(
          Iterables.concat(publishedSegments, availableSegments)
      );

      return Linq4j.asEnumerable(allSegments).where(Objects::nonNull);

    }

    private Iterator<DataSegment> getAuthorizedPublishedSegments(
        Iterator<DataSegment> it,
        DataContext root
    )
    {
      final AuthenticationResult authenticationResult =
          (AuthenticationResult) root.get(PlannerContext.DATA_CTX_AUTHENTICATION_RESULT);

      Function<DataSegment, Iterable<ResourceAction>> raGenerator = segment -> Collections.singletonList(
          AuthorizationUtils.DATASOURCE_READ_RA_GENERATOR.apply(segment.getDataSource()));

      final Iterable<DataSegment> authorizedSegments = AuthorizationUtils.filterAuthorizedResources(
          authenticationResult,
          () -> it,
          raGenerator,
          authorizerMapper
      );
      return authorizedSegments.iterator();
    }

    private Iterator<Entry<DataSegment, SegmentMetadataHolder>> getAuthorizedAvailableSegments(
        Iterator<Entry<DataSegment, SegmentMetadataHolder>> availableSegmentEntries,
        DataContext root
    )
    {
      final AuthenticationResult authenticationResult =
          (AuthenticationResult) root.get(PlannerContext.DATA_CTX_AUTHENTICATION_RESULT);

      Function<Entry<DataSegment, SegmentMetadataHolder>, Iterable<ResourceAction>> raGenerator = segment -> Collections
          .singletonList(AuthorizationUtils.DATASOURCE_READ_RA_GENERATOR.apply(segment.getKey().getDataSource()));

      final Iterable<Entry<DataSegment, SegmentMetadataHolder>> authorizedSegments =
          AuthorizationUtils.filterAuthorizedResources(
              authenticationResult,
              () -> availableSegmentEntries,
              raGenerator,
              authorizerMapper
          );

      return authorizedSegments.iterator();
    }

    private static class PartialSegmentData
    {
      private final long isAvailable;
      private final long isRealtime;
      private final long numReplicas;
      private final long numRows;

      public PartialSegmentData(
          final long isAvailable,
          final long isRealtime,
          final long numReplicas,
          final long numRows
      )

      {
        this.isAvailable = isAvailable;
        this.isRealtime = isRealtime;
        this.numReplicas = numReplicas;
        this.numRows = numRows;
      }

      public long isAvailable()
      {
        return isAvailable;
      }

      public long isRealtime()
      {
        return isRealtime;
      }

      public long getNumReplicas()
      {
        return numReplicas;
      }

      public long getNumRows()
      {
        return numRows;
      }
    }
  }

  static class ServersTable extends AbstractTable implements ScannableTable
  {
    private final TimelineServerView serverView;
    private final AuthorizerMapper authorizerMapper;

    public ServersTable(TimelineServerView serverView, AuthorizerMapper authorizerMapper)
    {
      this.serverView = serverView;
      this.authorizerMapper = authorizerMapper;
    }

    @Override
    public RelDataType getRowType(RelDataTypeFactory typeFactory)
    {
      return SERVERS_SIGNATURE.getRelDataType(typeFactory);
    }

    @Override
    public TableType getJdbcTableType()
    {
      return TableType.SYSTEM_TABLE;
    }

    @Override
    public Enumerable<Object[]> scan(DataContext root)
    {
      final List<ImmutableDruidServer> druidServers = serverView.getDruidServers();
      final AuthenticationResult authenticationResult =
          (AuthenticationResult) root.get(PlannerContext.DATA_CTX_AUTHENTICATION_RESULT);
      final Access access = AuthorizationUtils.authorizeAllResourceActions(
          authenticationResult,
          Collections.singletonList(new ResourceAction(new Resource("STATE", ResourceType.STATE), Action.READ)),
          authorizerMapper
      );
      if (!access.isAllowed()) {
        throw new ForbiddenException("Insufficient permission to view servers :" + access);
      }
      final FluentIterable<Object[]> results = FluentIterable
          .from(druidServers)
          .transform(val -> new Object[]{
              val.getHost(),
              extractHost(val.getHost()),
              (long) extractPort(val.getHostAndPort()),
              (long) extractPort(val.getHostAndTlsPort()),
              toStringOrNull(val.getType()),
              val.getTier(),
              val.getCurrSize(),
              val.getMaxSize()
          });
      return Linq4j.asEnumerable(results);
    }
  }

  static class ServerSegmentsTable extends AbstractTable implements ScannableTable
  {
    private final TimelineServerView serverView;
    final AuthorizerMapper authorizerMapper;

    public ServerSegmentsTable(TimelineServerView serverView, AuthorizerMapper authorizerMapper)
    {
      this.serverView = serverView;
      this.authorizerMapper = authorizerMapper;
    }

    @Override
    public RelDataType getRowType(RelDataTypeFactory typeFactory)
    {
      return SERVER_SEGMENTS_SIGNATURE.getRelDataType(typeFactory);
    }

    @Override
    public TableType getJdbcTableType()
    {
      return TableType.SYSTEM_TABLE;
    }

    @Override
    public Enumerable<Object[]> scan(DataContext root)
    {
      final List<Object[]> rows = new ArrayList<>();
      final List<ImmutableDruidServer> druidServers = serverView.getDruidServers();
      final int serverSegmentsTableSize = SERVER_SEGMENTS_SIGNATURE.getRowOrder().size();
      for (ImmutableDruidServer druidServer : druidServers) {
        for (DataSegment segment : druidServer.getSegments()) {
          Object[] row = new Object[serverSegmentsTableSize];
          row[0] = druidServer.getHost();
          row[1] = segment.getId();
          rows.add(row);
        }
      }
      return Linq4j.asEnumerable(rows);
    }
  }

  static class TasksTable extends AbstractTable implements ScannableTable
  {
    private final DruidLeaderClient druidLeaderClient;
    private final ObjectMapper jsonMapper;
    private final BytesAccumulatingResponseHandler responseHandler;
    private final AuthorizerMapper authorizerMapper;

    public TasksTable(
        DruidLeaderClient druidLeaderClient,
        ObjectMapper jsonMapper,
        BytesAccumulatingResponseHandler responseHandler,
        AuthorizerMapper authorizerMapper
    )
    {
      this.druidLeaderClient = druidLeaderClient;
      this.jsonMapper = jsonMapper;
      this.responseHandler = responseHandler;
      this.authorizerMapper = authorizerMapper;
    }

    @Override
    public RelDataType getRowType(RelDataTypeFactory typeFactory)
    {
      return TASKS_SIGNATURE.getRelDataType(typeFactory);
    }

    @Override
    public TableType getJdbcTableType()
    {
      return TableType.SYSTEM_TABLE;
    }

    @Override
    public Enumerable<Object[]> scan(DataContext root)
    {
      class TasksEnumerable extends DefaultEnumerable<Object[]>
      {
        private final CloseableIterator<TaskStatusPlus> it;

        public TasksEnumerable(JsonParserIterator<TaskStatusPlus> tasks)
        {
          this.it = getAuthorizedTasks(tasks, root);
        }

        @Override
        public Iterator<Object[]> iterator()
        {
          throw new UnsupportedOperationException("Do not use iterator(), it cannot be closed.");
        }

        @Override
        public Enumerator<Object[]> enumerator()
        {
          return new Enumerator<Object[]>()
          {
            @Override
            public Object[] current()
            {
              final TaskStatusPlus task = it.next();
              final String hostAndPort;

              if (task.getLocation().getHost() == null) {
                hostAndPort = null;
              } else {
                final int port;
                if (task.getLocation().getTlsPort() >= 0) {
                  port = task.getLocation().getTlsPort();
                } else {
                  port = task.getLocation().getPort();
                }

                hostAndPort = HostAndPort.fromParts(task.getLocation().getHost(), port).toString();
              }
              return new Object[]{
                  task.getId(),
                  task.getType(),
                  task.getDataSource(),
                  toStringOrNull(task.getCreatedTime()),
                  toStringOrNull(task.getQueueInsertionTime()),
                  toStringOrNull(task.getStatusCode()),
                  toStringOrNull(task.getRunnerStatusCode()),
                  task.getDuration() == null ? 0L : task.getDuration(),
                  hostAndPort,
                  task.getLocation().getHost(),
                  (long) task.getLocation().getPort(),
                  (long) task.getLocation().getTlsPort(),
                  task.getErrorMsg()
              };
            }

            @Override
            public boolean moveNext()
            {
              return it.hasNext();
            }

            @Override
            public void reset()
            {

            }

            @Override
            public void close()
            {
              try {
                it.close();
              }
              catch (IOException e) {
                throw new RuntimeException(e);
              }
            }
          };
        }
      }

      return new TasksEnumerable(getTasks(druidLeaderClient, jsonMapper, responseHandler));
    }

    private CloseableIterator<TaskStatusPlus> getAuthorizedTasks(
        JsonParserIterator<TaskStatusPlus> it,
        DataContext root
    )
    {
      final AuthenticationResult authenticationResult =
          (AuthenticationResult) root.get(PlannerContext.DATA_CTX_AUTHENTICATION_RESULT);

      Function<TaskStatusPlus, Iterable<ResourceAction>> raGenerator = task -> Collections.singletonList(
          AuthorizationUtils.DATASOURCE_READ_RA_GENERATOR.apply(task.getDataSource()));

      final Iterable<TaskStatusPlus> authorizedTasks = AuthorizationUtils.filterAuthorizedResources(
          authenticationResult,
          () -> it,
          raGenerator,
          authorizerMapper
      );

      return wrap(authorizedTasks.iterator(), it);
    }

  }

  //Note that overlord must be up to get tasks
  private static JsonParserIterator<TaskStatusPlus> getTasks(
      DruidLeaderClient indexingServiceClient,
      ObjectMapper jsonMapper,
      BytesAccumulatingResponseHandler responseHandler
  )
  {
    Request request;
    try {
      request = indexingServiceClient.makeRequest(
          HttpMethod.GET,
          StringUtils.format("/druid/indexer/v1/tasks"),
          false
      );
    }
    catch (IOException e) {
      throw new RuntimeException(e);
    }
    ListenableFuture<InputStream> future = indexingServiceClient.goAsync(
        request,
        responseHandler
    );

    final JavaType typeRef = jsonMapper.getTypeFactory().constructType(new TypeReference<TaskStatusPlus>()
    {
    });
    return new JsonParserIterator<>(
        typeRef,
        future,
        request.getUrl().toString(),
        null,
        request.getUrl().getHost(),
        jsonMapper,
        responseHandler
    );
  }

  private static <T> CloseableIterator<T> wrap(Iterator<T> iterator, JsonParserIterator<T> it)
  {
    return new CloseableIterator<T>()
    {
      @Override
      public boolean hasNext()
      {
        final boolean hasNext = iterator.hasNext();
        if (!hasNext) {
          try {
            it.close();
          }
          catch (IOException e) {
            throw new RuntimeException(e);
          }
        }
        return hasNext;
      }

      @Override
      public T next()
      {
        return iterator.next();
      }

      @Override
      public void close() throws IOException
      {
        it.close();
      }
    };
  }

  @Nullable
  private static String extractHost(@Nullable final String hostAndPort)
  {
    if (hostAndPort == null) {
      return null;
    }

    return HostAndPort.fromString(hostAndPort).getHostText();
  }

  private static int extractPort(@Nullable final String hostAndPort)
  {
    if (hostAndPort == null) {
      return -1;
    }

    return HostAndPort.fromString(hostAndPort).getPortOrDefault(-1);
  }

  @Nullable
  private static String toStringOrNull(@Nullable final Object object)
  {
    if (object == null) {
      return null;
    }

    return object.toString();
  }
}


NoMoR Research GmbH, in collaboration with its partners, is working for some time in various 5G research projects. Among others, within the 5G NORMA (5G Novel Radio Multiservice adaptive network Architecture) project, part of the 5G-PPP initiative, NoMoR develops a 5G software prototype. NoMoR, that also offers 3GPP standardisation services, welcomes and officially supports the approval of two new 5G study items in 3GPP. At the 3GPP SA and 3GPP RAN meetings, in held in Sitges, Spain in December 2015, SA plenary approved the Study on Architecture for Next Generation System and the RAN plenary approved the Study on Scenarios and Requirements for Next Generation Access Technologies.


text:
Podium behaviour poll
Do you think Sagan's behaviour on the podium wrong?
No - I like him even more after this.
pdluz7
2, imbecility, but I still like the rider.
bissib
Cowgirlup said:
I love to see other men, his team mates, friends etc say to him "Dude, what you did was crappy, you shouldn't ever do that mate"
I like to see other men in general (eg this forum) see his behaviour as crappy and not a joke and not "boys being boys" and not make excuses for him.
Why are you suggesting that women are so weak that they can't stand up for themselves when someone is mistreating them and need other men to protect them? How sexist is that?
I'd just like to him to not ever do it again. I'd like him to really sincerely apologise and truly understand that he has no right to do what he did. I mean, not just apologise because the public is in an uproar, but really see that what he did was a ****ty thing to do.
To facilitate change, you just need people to stand up and say "stop doing that, it is inappropriate" and not think it is a joke.
it's easy, just don't pinch a womens **** unless she gives you direct permission. How hard is that?
You realize that it is unlikely you will know how sincere he is wrt apologizing (unless he keeps doing it, in which case he is clearly not).
There will also always be sexists, as well as trolls on forums trying to get a rise out of folks.
None of this is meant to suggest such behaviour is acceptable. It is just that it might not be worth getting too worked up over, especially on a bike racing forum.
phanatic
saunaking said:
Question: At what age does one stop being a 'kid' and become an adult?
About 27, by most men's experience I think.
movingtarget
willbick said:
Kinda depressing that anyone showing signs of having a personality nowadays is castigated, mainly in the name of hyping up a 'news story'/'controversy'. Celebrate victory in a silly fashion? Disrespecting the opposition. Playfully pinch a podium girl's ****? Disrespecting the female gender. Its a wonder anyone does anything...
Well said. The culture of complaint. She makes a complaint, he faces the music. Maybe he apologised after the podium ? Maybe she saw it as a bit of silliness and was not offended ? Personality, what is that ? It is so rare to see it these days in public that when you do see or hear something genuine, it is startling. The guy has always been a prankster. Yawn. Maybe this will make someone's Years Most Shocking list or some such along with Celebrity Sweat Marks On The Red Carpet. Life in the 21st Century........
Just to silence some white knights, these are the female responses on Peter's facebook (and before you accuse me of it, yes, I actually spent the last 15 minutes collecting all posts by women on FB):
Women envied her )))))
seconded, Helen!!!
I am 54,I would like it from peter
I definitely wouldn't complain
you can grab mine anytime xx
The look on Peter's face while he was doing that is priceless!!!!
In my opinion it was not necessary to apologize for that! It was so obvious a joke! Btw, I'm a girl, married, a mum, and I have a great sense of humor! You did not do anything wrong!
You're young and it was funny
It was good !
Peter you are #1!
You really entertained me Congratulations
You make me proud to be Slovakian- don't worry about what others say!
U are awesome .... as well as your jokes!
Don't apologize! I am always like you Peter!! Always funny!!!!!! )))
Peter you are simply the best!
Lighten up. Probably the same people complained who complained at the TDF last year
Hahahahahaa sei grande......
Forget what others think your amazing well done today we love you
I Think she like it Also and jou are I young Guy!
I had a good laugh )
Peter you are the man! Screw the others!
It was funny, don't care what people say
That was unprofessional but totally funny
Oh, o, Peter. Remember to keep your hands to yourself : )
This was amazing haha. Don't change anything, remain your funny self. And win Amstel Gold ofcourse
I don't know I think it's funny. Maybe she liked the attention?
I still like you anyway...
Oooh, if only I could stand there, I would love it! It was cute, don't worry Peter!
Really, the only girl that could complain is the podium girl involved and she didn't. I don't really understand why some other women (or men for that matter) feel like they have to "defend her honor" when she doesn't feel that way herself.
If Cavendish had done this some of you chaps would be worked up into such an outraged frenzy this topic would already have got to 50 pages.
jens_attacks
happychappy said:
cav is married and has a baby at home
i would still laughed though
AussieGoddess
Caruut said:
The fact that she's being paid to be there makes it all the worse. If it's, say, at a bus-stop or in a shop then she can reasonably turn around and say "Get your hands off me, you ****". In this situation, she's essentially powerless to do anything at all at the time.
I voted option 2. Even though I think it's really not okay to do that, I think it's worth noting that Sagan is relatively young, lives a pretty sheltered lifestyle and has got where he is because of his legs, not his head. The way we talk about him sometimes, it's no wonder the guy acts like he's not in the real world once in a while.
It reminds me of something the often offensive and occasionally incredibly perceptive comic Frankie Boyle said about Cristiano Ronaldo: "Of course he lacks perspective. He's been treated like he's better than everyone else since the age of about 8 simply for having incredibly well-coordinated feet. It's a wonder he hasn't killed someone."
Yes, it's inappropriate, but people are a product of the societies they are in. In Peter Sagan's world he's treated like royalty, he probably has quite a lot of success with women when he's not groping them in public and he also, by winning lots of bike races, ends up spending a lot of time around podium girls who are treated like pieces of meat, not good for anything but looking pretty.
I think that's the real issue that this has raised. Why are we so surprised that, when we maintain a tradition like having podium that looks at those girls as nothing but objects, someone ends up treating them like objects? In my opinion, podium girls don't really belong in the 21st century, and when things like this happen the culture that tolerates them is more to blame than the individual.
Back to the individual in question, it's worth noting that he almost certainly didn't mean any harm. The fact that a guy can do that and think it's harmless fun is, in my view, a problem with society, but Peter Sagan is not to blame for all of society's ills, no matter how silly you think he finish-line celebrations can be.
Firstly - wow Caruut - you made me post here
secondly - how many times can I agree with this? incredibly well worded, and exactly right.
Cowgirlup
The stupid hurts
Thank you for such an enlightening answer. You truly opened my eyes.
HiCadence
Oh i think we all know where i stand on this topic of discussion.
Yingge
Voted #2 - stupid, hope he learns.
No doubt others have done similar things in the past, perhaps not so widely reported.
Occupational hazard for podium girls unfortunately.
rainman
Cancellara showed him how to win a Ronde and how to behave on the podium. That said, she might welcome a date with Peter Sagan.
I do think Sagan deserves to be admonished though.
10 char
saganftw
soooo in the light of recent events i suggest a measure of podium girl hotness to be a "Sagan"
blond is not my kind of woman,so id give that podium girl 5 Sagans tops
saganftw said:
How many sagans does a perfect woman score?
bissib said:
to make it simple 10 is a good number with possibility to be off scale if you are reeeeeealy into her
pugdog
I wonder what the reaction would have been if the podium girl had turned around and slapped him?
I assume she would have lost her job.
pugdog said:
I consider what Sagan did funny, but had she slapped him, it would have been much much funnier. He deserved it too.
spalco
I think less of everyone who voted for one of the bottom two options. Just disgusting.
Maaaaaaaarten
Well, I'm usually not with the feminists, but in this case it's just plain stupid and immoral what Sagan did.
hrotha said:
Honestly I'm more appalled by those who defend him than by what he did.
I agree. What Sagan did was just stupid and childish. But then people come with replies like this:
Kinda depressing that anyone showing signs of having a personality nowadays is castigated,
Seriously? Groping a women is showing a sign of having a personality? Quite the opposite as far as I'm concerned.....
spalco said:
Some guy on an Internet forum thinks less of me? Oh sh*t... I really screwed up this time, didn't I?
K Teams & Riders Vuelta 2018 podium three years later Professional Road Racing 46 Sep 6, 2021
Tour de France 2021 Tour de France: Who will finish on the podium below Pogačar? First rest day poll Professional Road Racing 45 Jul 4, 2021
Teams & Riders Vuelta 2018 podium three years later
Tour de France 2021 Tour de France: Who will finish on the podium below Pogačar? First rest day poll