text:
May 28, 2021 by Graeme MacKay
Editorial Cartoon by Graeme MacKay, The Hamilton Spectator – Friday May 21, 2021
Golf, tennis, other outdoor sports to open across Ontario as part of 3-step reopening plan
Golf, tennis, basketball and other outdoor sports are set to reopen across the province on Saturday as part of a three-step plan aimed at gradually allowing for more indoor and outdoor activities to resume by the end of summer.
Ontario Premier Doug Ford announced details on Thursday as Ontario continues to see signs that point to the devastating third wave of COVID-19 in the province receding.
Under the new plan, restrictions will be eased gradually through June, July and August based on vaccination rates and key public health and health-care indicators.
The current stay-at-home order will remain in place until June 2, with the exception of these newly announced changes to some outdoor activities.
Ford said the changes are the result of current restrictions.
"These measures have worked," he said. "We are seeing increasingly positive trends in key public health indicators."
The three phases of the province's plan are:
Phase 1: An initial focus on resuming outdoor activities with smaller crowds where the risk of transmission is lower. This includes allowing outdoor gatherings of up to 10 people, outdoor dining with up to four people per table and non-essential retail at 15 per cent capacity.
Phase 2: Further expanding outdoor activities and resuming limited indoor services with small numbers of people. This includes outdoor gatherings of up to 25 people, outdoor sports and leagues, personal care services as well as indoor religious services, rites or ceremony gatherings at 15 per cent capacity. All indoor gatherings in this phase will require face coverings.
Phase 3: Expanding access to indoor settings, with restrictions, including where there are large numbers of people and where face coverings can't always be worn. This includes indoor sports and recreational fitness, indoor dining, museums, art galleries, libraries, casinos and bingo halls, with capacity limits. (CBC)
Posted in: Canada Tagged: 2021-18, bomb, celebration, COVID-1, Dom Perignon, Doug Ford, fourth wave, lockdown, Ontario, pandemic, reopening
Editorial Cartoon by Graeme MacKay, The Hamilton Spectator – Saturday November 16, 2019
Trump impeachment: Stunning scenes as witness applauded after seeing off real-time 'intimidation' by president
Career diplomat Marie Yovanovitch received a rare, emotional standing ovation after she testified about Donald Trump's threatening intimidation over Ukraine, and fended off in real time a stunning Twitter attack from the president.
As Ms Yovanovitch delivered her testimony on Capitol Hill, providing a damning portrait of a "smear campaign" against her led by Rudy Giuliani, Mr Trump's personal lawyer, Democrats accused the president of seeking to intimidate witnesses, and said his words could be included in any articles of impeachment.
At the conclusion of Ms Yovanovitch's evidence, congressman Adam Schiff, the Democratic chair of the House intelligence committee underscored the historic nature of the day. He said Mr Trump's attack on the diplomat had been "just appalling".
"But as we have observed so often, appalling in this administration is not the least bit surprising," he added. "Nonetheless, she endured the attack and went on. We are grateful for that."
Asked about suggestions from several members of his party that the president's tweet could form part of an article of impeachment, he said they were "part of a pattern to intimidate witnesses. It's also part of a pattern to obstruct the investigation".
For her part, Ms Yovanovitch received loud applause from many of those watching, when she concluded almost five hours of testimony. In unusual scenes, spectators spontaneously started clapping when Mr Schiff gavelled the hearing closed, then stood and cheered for her as she left the room.
Ms Yovanovitch, 61, was not considered the Democrats' star witness. As Republicans pointed out, the party first chose to call William Taylor and George Kent to deliver the opening public testimony on Wednesday.
The two men, like Ms Yovanovitch long-time career professionals who had served presidents of both parties, detailed how Mr Trump apparently placed his own political needs ahead of the security of Ukraine, by making military aid and a state visit to Washington dependent on Kiev announcing an investigation into Joe Biden and his son. Republicans have long accused the Democratic former vice president of improperly using his position to oust a prosecutor who threatened the business interests of his son, though there is no evidence to support the claims.
Ms Yovanovitch's manner and demeanour were similar to those of her colleagues – methodical, logical and stressing service of country over partisan politics. She reminded her audience that diplomacy was not just about cocktail parties, and that US diplomats had died while working to represent the nation, most recently in the 2012 attack on a compound in the Libyan city of Benghazi.
Yet, the words of Ms Yovanovitch, who was recalled in May from her position as the US ambassador to Ukraine at the behest of Mr Trump and Mr Giuliani, carried more power for several reasons. Firstly, in her prepared remarks, she referred to discovering the president had been using been discussing her removal. (The Independent)
Posted in: USA Tagged: 2019-40, architecture, bomb, Capitol, Donald Trump, social media, twitter, USA
September 6, 2019 by Graeme MacKay
Editorial Cartoon by Graeme MacKay, The Hamilton Spectator – Friday August 30, 2019
Trump floated the idea of using nuclear bombs to stop hurricanes headed for US
President Donald Trump has floated multiple times the idea of thwarting hurricanes headed for the US by bombing them, including by dropping nuclear bombs on hurricanes to disrupt their course, Axios reported Sunday, citing conversations with sources who heard Trump's comments and were briefed on a National Security Council memo that recorded the comments.
In an early Monday tweet, Trump denied the Axios' report, claiming that he "never said" what was in it. CNN has not been able to independently verify the report.
According to Axios, the President has suggested the idea several times to senior Homeland Security and national security officials that they look into the idea of using nuclear bombs to stop hurricanes from hitting the US. A source who was at a hurricane briefing at the White House told the outlet that the President once said of hurricanes, "I got it. I got it. Why don't we nuke them?"
The source, who paraphrased Trump's remarks to Axios, said that the President said, "They start forming off the coast of Africa, as they're moving across the Atlantic, we drop a bomb inside the eye of the hurricane and it disrupts it. Why can't we do that?" Asked by Axios how the briefer responded to the President's suggestion, the source said he "said something to the effect of, 'Sir, we'll look into that.'"
The President then asked how many hurricanes the US may be able to stop and reiterated his suggestions, according to the source, which caused the briefer to be "knocked back on his heels."
"You could hear a gnat fart in that meeting. People were astonished. After the meeting ended, we thought, 'What the f—? What do we do with this?'" the source told Axios.
According to the outlet, Trump also raised the idea of using bombs to stop hurricanes during a 2017 conversation with a senior administration official. A source briefed on a NSC memo describing that conversation told Axios that the document does not contain the word "nuclear." According to sources the outlet spoke to about that conversation, despite Trump's interest in the idea, it "went nowhere and never entered a formal policy process."
The idea of using nuclear bombs "to counteract convection currents" was floated during the Eisenhower administration, Axios reported, and has continued to resurface even though government scientists have said it will not work.
According to the National Oceanic and Atmospheric Administration in an online fact sheet titled "Tropical Cyclone Myths Page, detonating a nuclear weapon over a hurricane "might not even alter the storm," and the idea "neglects the problem that the released radioactive fallout would fairly quickly move with the tradewinds to affect land areas and cause devastating environmental problems." (CNN)
Posted in: USA Tagged: 2019-30, Amazon, AOC, bomb, Brazil, China, Donald Trump, Federal Reserve, Hurricane, media, Nancy Pelosi, nuclear, problems, squad, USA
August 23, 2017 by Graeme MacKay
Editorial Cartoon by Graeme MacKay, The Hamilton Spectator – Thursday August 24, 2017
Canada won't join U.S. missile defence, send troops to Afghanistan, Trudeau says
Prime Minister Justin Trudeau has thrown cold water on suggestions the Liberal government wants to sign onto continental ballistic missile defence, or that it might send troops back into Afghanistan.
The question over whether Canada should be part of the U.S.'s continental missile-defence shield has been rekindled in recent days amid concerns about North Korea's growing nuclear arsenal.
Canada opted out of ballistic missile defence in 2005 following a divisive national debate, but many defence experts and parliamentarians, including some Liberals, want the issue reopened.
Meanwhile, U.S. President Donald Trump's plan to send thousands more troops to Afghanistan has also resurrected questions about whether Canada will be asked to follow suit.
Speaking in Montreal on Wednesday, however, Trudeau appeared to close the door on both ideas.
"On those cases, we will always take the decisions in terms of what is the best interests of Canadians," Trudeau told reporters after a meeting with federal and provincial immigration officials.
"And our long-standing positions on those two issues are not going to be changed any time soon."
The comments on ballistic missile defence were the strongest yet from the Liberal government, which had largely sidestepped questions about its intentions in recent weeks. (Source: Toronto Star)
Posted in: Canada Tagged: Afghanistan, bomb, bunker, Canada, diplomacy, Donald Trump, Justin Trudeau, NAFTA, USA, war
Editorial Cartoon by Graeme MacKay, The Hamilton Spectator – Thursday May 18, 2017
Here's how Trump could survive — even if we learn the worst
Washington is abuzz with what we might call "tipping-point talk" — the idea that this time, really and truly, Republicans are on the verge of breaking with President Trump. The latest revelation stoking that chatter is the New York Times's report that a memo by former FBI director James B. Comey indicated that Trump privately asked him to quash the probe into former national security adviser Michael Flynn's Russia ties.
Yes, some Republicans are speaking out more forcefully. Sen. John McCain (R-Ariz.) now says that the scandals enveloping Trump are reaching "Watergate size and scale." Other top Republicans are now calling for an independent commission or special prosecutor. And many analysts are discussing ways in which the latest Trump revelations — combined with Trump's alleged demand for Comey's loyalty — amount to obstruction of justice, a potentially impeachable offense.
But even if we do establish clear evidence that Trump obstructed justice, it is easy to discern, based on what we are already seeing, a way that Republicans ensure that Trump survives this.
The wiggle room in proving obstruction of justice could end up meaning that, even if we come a lot closer to establishing that Trump did interfere in the manner reports have indicated, we could still genuinely fall short of proving his clear intent. More cynically, even if that standard is reasonably cleared, Republicans could take refuge in this murkiness and then buttress this position by arguing that we should not re-litigate the election simply due to Democratic sour grapes.
Remember, Trump has been assaulting our democracy on multiple fronts since the beginning, and Republicans have mostly looked the other way. There is an unfortunate tendency to cover these various stories as separate from one another, but Trump has abused his power in multiple ways that, ultimately, all trace back to the same autocratic impulse. In addition to the Russia affair, there's also the unprecedented, middle-finger-brandishing lack of transparency around his tax returns, even as he backs tax reform that would deliver his family a massive windfall ; the laughably substandard ethics arrangement for his businesses and the perpetuation of likely emoluments clause violations; and the continued use of diplomatic business to promote Mar-a-Lago and steer cash into his pockets.
All of these — taken along with the alleged interference in ongoing probes — add up to a level of autocratic, above-the-law contempt for our democracy that is larger than the sum of its parts. And Republicans have effectively shrugged off most of it for as long as possible. So it's plausible that even if obstruction of justice were reasonably well established, they'd find a way to evade taking it to its logical conclusion. (Source: Washington Post)
Posted in: USA Tagged: administration, bomb, crisis, Donald Trump, leadership, leaks, politics, scandal, USA


Anyone who has been keeping up with the blog will understand how our East Coast trip has been labelled the "worst ever." Somehow, we managed to do everything wrong. We had fun, that's undeniable, but it felt more like smiling through adversity than pleasure for pleasure's sake. More than once, Sarah turned to me and said, "Are we being tested?" If we have been, we must have passed, since the rewards of the past few days have wiped any misery from our minds and put the adventure back into high gear.
Neither Sarah nor I count ourselves as major gamblers. In fact, Sarah has never been to a casino before and my experience is limited to cruise ships and a very poor run at Casino Niagara (not even the beautiful Fallsview casino, but the other one.) Nevertheless, we decided to treat ourselves with one night out at the awe-inspiring Crown Casino in downtown Melbourne. We ate dinner in one of the bistro-style restaurants there and were feeling lucky. We entertained the idea of winning enough money to buy us last minute tickets to the Australian Open Men's Final (about $250/each) and headed straight to the slots. Five minutes later and twenty dollars poorer, we abandoned slots as a slippery slope into debt. Instead, we decided to try our hand at blackjack. After watching a couple of rounds, we each put in twenty dollars and made the attempt. We just managed to crack even and decided to call it a night. But is it ever easy to call it a night in a Casino? With one last vain hope, we sat down at a different table. Now our luck really changed! When we finally decided to finish "for real," we were up $200 and feeling good. It wasn't enough for tickets, but it would cover our grounds passes, dinner and a taxi home. We were happy.
As a huge tennis fan, I've been following the Australian Open with something bordering on religiousity. I've found TV's or bars at every hostel in order to keep up with the scores, especially concerning my favourite player, Roger Federer. Naturally, I was really disappointed by his loss to Djokovic in the semi-finals, but I was excited to be in the same city as a Grand Slam final. On the evening of the men's final, we decided to go down and watch it from the big screen TV on the grounds and support underdog Jo Tsonga. Armed with facepaint and matching Australian Open t-shirts, Sarah and I descended on Melbourne Park.
Only a couple of minutes into our stroll to find the big screen TV, but two men approach us asking about our facepaint. Sarah and I bought the facepaint for $2 at a dollar store, so we offer to paint their faces (on the condition that it be French flags) instead of them waiting in line at the official face paint booth. After chatting for a bit about how we are poor tennis-loving backpackers with only lowly grounds passes, they offer to try and sneak us into their superbox. An offer we can't refuse! With a little help from their wives and families up in the box already, they manage to procure a couple of passes for us to use in the elevators passed the tight security. Once up there, we don't dare to venture down again – but there was really no need! We had unlimited food and drink and the best seats in the house. We got to watch the mixed doubles final and the men's final and both games were incredible. An experience we will never forget.
All down "Steve Irwin Way," Steve's permanently surprised face greets us as we head to Australia Zoo. The zoo is his legacy, and its reputation precedes it – Lonely Planet hypes it as a "world top ten," and that's not just for zoos, but for destinations. It has a lot to live up to, but it succeeds – and in many ways it surpasses our expectations.
What is the main attraction for a zoo owned by the Crocodile Hunter family? Alligators of course! Jokes aside, crocodiles are everywhere. Huge, pristine enclosures hold one or two crocodiles each; it is a startling change from the croc enclosures in Botswana and Tanzania where hundreds of crocs swarmed en masse in dirty water. The crocodile show is exciting and different. No matter how long these massive reptiles have been in captivity, none of them seem remotely tame, and the trainers are clearly nervous and treat these animals with respect. Even though "Graham" the croc is being gentle today, the few strikes he makes at the trainer (who is bravely dangling what looks like a rasher of bacon in front of Graham's jaws) clearly showcase their enormous power. Three hundred pounds of pressure is contained within those torpedo-like bodies.
Mixed with the displays of power is a discussion on how to deal with crocodiles in the bush. It's scary to think about how some of the world's most dangerous animals are a part of daily life for some families, especially in the Northern Territories and outback Queensland. In fact, as I wander through the "Venomous Snakes" enclosure, I overhear a conversation between a man and his son. They are looking at the taipan, one of the most venomous snakes in Australia. The man turns to his son and says, "Now see what I told you? Next time you see one of those on the farm, you stay away." Scary.
The other main focus of the Australia Zoo is conservation. Throughout the day, Bindi, Robert and Terri Irwin deliver TV messages about the importance of preserving the planet. As visitors to the Australia Zoo, we have all been entered into the league of "Wildlife Warriors." Some of the videos play like the Irwin family home movie time, but you can't help but be caught smiling at their slightly off-kilter, over-the-top Ozzie antics. And their intent is better than good. Allow people to interact with animals, fall in love with them and then want to help them. It works with us. We are in line for the koala photos, the bird of prey shows, the elephant feedings and the tiger temple. We are spending our hard saved backpacker dollars, and anything that makes a traveller part with their dough must be worth it. The Australia Zoo is.
My favourite animal? Why, the little echidnas of course! Half-hedgehog, half-duck, they are the weirdest, wackiest animal in Oz. And pretty darn cute as well.
Brisbane has seemed this impossible goal, but finally we have made it. It has probably been the most harrowing few days of my life so far. We were stranded in Airlie Beach for one night and fortunately were able to make a break for it by tagging along with Rob and Kara, the Canadians we met on the Anaconda III. We ended up in Rockhampton, a small town about halfway between Airlie and Brisbane. After many fruitless calls to Greyhound, we soon realized we weren't going to be getting to Brisbane any time soon – all the buses were completely full from the backlog at Airlie Beach.
Instead we decided to rent a car to take us the rest of the way. Unfortunately I ended up in a car accident after one of the back tires skidded off the road. Sara and I both walked away with scratches and bruises but no major injuries. We were lucky.
I am so grateful to my friends Chris and Hilary for coming to pick us up from Brisbane. I don't know what we would do without such amazing support over here. So a huge THANK YOU to them, and a huge sigh of relief that we are finally in Brisbane… safe and sound.


Dan Perkins lives and works in Brooklyn, NY. He received his MFA from American University in 2013, and completed a Hamiltonian Fellowship from 2014 – 2016. His paintings play in the space between the natural and the digital, using tight geometries to activate planes, textures, and images. Recent exhibitions include: Best Kept Secret at the Geoffrey Young Gallery (2017), Romantic Destinations, curated by Charlotte Hallberg, at Crush Curatorial (2017), and Spring/Break Art Show: To See the Moon Fall from the Sky, curated by Will Hutnick & Mark Joshua Epstein (2017). His work is held in the collection of the Capital One Corporate Art Collection, the DC Commission on the Arts and Humanities, the Katzen Museum of American University, as well as in many private collections. His work has been reviewed in Two Coats of Paint, Artsy, Bmore Art, the Washington Post, the Washington City Paper, and the Baltimore City Paper.
"In my process, I make digital and physical collages, and drawings as references for my paintings. The moments of representation present in the paintings come from a catalogue of images: some physical, some personal, many digital, both my own and from others. All the images and sources reference the natural world in some way. Often these images are edited or abstracted to a point of non-figuration.
The act of making these sources provides me a space to reflect on the nature of sharing and reproduction that the internet makes possible. For me, the paintings become playful meditations on how the internet is collapsing traditional spatial hierarchies: creating spaces that are often difficult to articulate, and strange to inhabit. These spaces have the ability to range through many different feelings of experience simultaneously: mundane, sublime, seductive, shallow, arresting, playful, etc.


May the M'm! M'm! Good!® Be With You.
Your kids will love Campbell's® Star Wars varieties because they contain all of their favorite characters. You will love them because your kids will stay entertained. This season, discover the force of Campbell's® and Star Wars in a supermarket near you.
We make our Star Wars varieties without preservatives or artificial flavors, so parents like our soups as much as kids love their taste.
*Except for the small amount naturally occurring in yeast extract.
No artificial flavors. Lots of fun.
Be sure to collect all 6 limited edition Star Wars varieties made with ingredients you can trust in playful shapes your kids will love.
Kids will delight in the fun pasta shapes and delicious taste.
Explore your favorite flavors from a galaxy far, far away.


text:
View all in Money
Crypto banking
Alternatives to Starling: A list of alternative banks and apps
Starling is certainly not the only digital bank out there, so we've compared it against the competition to see what the best option is.
Try Monese
Instant spending notifications
Trusted No proof of address or credit check
Valentina Cipriani
Navigate Digital Banking
Top alternative banks and apps to Starling
Banks like Starling for day-to-day banking
Alternatives to Starling for saving
Digital banking intro
This month's top 10 banking apps
A guide to Open Banking
Banking apps for travelling
A – Z list
Best apps for
Replacing your bank
Digital banking alternatives
Alternatives to N26
Alternatives apps to Plum
Alternatives to Revolut
Alternatives to Monzo
Alternatives to Starling
Alternatives to gohenry
{"menuItems":[{"label":"Top alternative banks and apps to Starling","anchorName":"#top-alternative-banks-and-apps-to-starling"},{"label":"Banks like Starling for day-to-day banking","anchorName":"#banks-like-starling-for-day-to-day-banking"},{"label":"Alternatives to Starling for saving","anchorName":"#alternatives-to-starling-for-saving"}]}
The main alternatives to Starling Bank are Monzo and Revolut. Cashplus and Monese are a bit smaller, but should fill that gap in the market.
Monzo: Good for travelling
Revolut: Good for banking
Cashplus: Good for improving your credit score
Monese: Good for opening an account
Curve: Good for connecting apps
Starling is a challenger bank offering digital-only current accounts (and a bunch of related services) to its 2 million UK customers. If you've checked it out but for some reason were unimpressed, fear not, there are other digital banking brands for you to consider.
While you can also read Finder's individual reviews of Atom bank, Monese, Monzo and Revolut, this article looks at them all together, to help you figure out which is best for what.
Challenger banks don't offer a broad range of services yet, but they all provide fee-free digital-only current accounts that can be opened in a few minutes, and that can easily function as main current accounts as long as you have fairly essential banking needs. With all of them you can expect a free current account, card and app, and free bank transfers and card payments within the UK.
If you rule Starling out, your main options are:
Monzo. The most popular challenger bank in the UK with its two-million-strong user base, Monzo is probably the most similar to Starling, and ticks most of the boxes (you can set up direct debits, use Google Pay and Apple Pay, and ATM withdrawals are free). You can also deposit cash on your account at PayPoints for £1 a transaction, and is the only one apart from Starling that's offering overdrafts (you can go overdrawn up to £20 for free, and it's 50p a day after that).
Revolut. Revolut was born as a multi-currency card more than as a bank account, and it shows when it comes to some basic day-to-day banking: in the UK, you can't set up direct debits yet and free cash withdrawals are limited to £200 a month.
Monese. Monese is another option that's been providing basic banking on smartphones since 2015. The unique thing about Monese is the ability to open an account anywhere in the UK or Europe without an address, without credit history and without a fixed income.
Day-to-day banking: The verdict
As we said, Monzo is the most similar to Starling and the one with the broadest range of features for day-to-day banking. However, you could also give Revolut a shot. Revolut has a tonne of features and is constantly adding. Recently it's opened up a trading option to buy and sell shares. It could also be a good shout if you're interested in a premium option with more benefits (see our review of Revolut Premium).
Cards like Starling for travelling
Generally speaking, challengers will treat you better than traditional banks when it comes to doing all things money out of the country. Depending on whether you're a serial travel, only have the occasional trip or mostly stay in the UK but need to send money to someone who doesn't, some will be more suitable than others:
Card payments. Apart from Monese (which charges a 2% currency exchange fee unless you upgrade your account to a Plus or Premium option), you can use your card abroad for free with all the others. At weekends, Revolut charges a 0.5% markup fee.
ATM withdrawals. Both Monzo and Revolut allow them for free but they're limited to £200 a month (after that, Monzo charges a 3% fee, Revolut a 2%).
Euro accounts. Together with Starling, Monese is the only challenger offering a free euro account together with your regular sterling one.
Money transfers. Revolut is in for an easy win here – the others all charge a fee, while with Revolut you can transfer money in 29 currencies at the interbank rate for no fees, up to £5,000 a month.
Travelling: The verdict
Let's face it, if you're looking for a card that will give you great freedom abroad without charging any fees, you should probably reconsider your reluctance over Starling – it's the only one that offers free ATM withdrawals in another currency with a limit of £300 a day.
However, Revolut makes for a good alternative that has reasonable fees and if you also need money transfers, it definitely stands above the competition.
Challengers are still at the beginning of the journey when it comes to savings accounts, so if putting money aside and earning interest on it is your main goal, you may also want to have a look at what traditional banks have to offer.
Starling is the only challenger that pays an interest on current account balances (0.05% on up to £85,000), but you can't open a separate savings account. Among the others, Atom is the only one that offers savings accounts, with a good range of fixed-term options that pay decent rates. However, it offers no easy-access savings accounts.
Monzo is currently working on a savings market place, and currently has three different partners that offer both easy-access and fixed-term accounts. The rates aren't half bad, but you can still get better ones if you go to the source and open an account directly with the provider.
Finally, Monzo and Revolut all categorise your spending in the app and allow you to put money aside in separate sub-accounts (respectively known as Pots, Spaces and Vaults) to save towards a goal. Monzo and Revolut also have a feature that automatically rounds up and saves your spare change, functioning as a digital piggybank.
Savings: The verdict
If you're only looking at how much money your savings can earn you, Atom is competitive for fixed-term accounts, while the others still have quite a long way to go.
On the other hand, if you find organising your budget and saving money challenging, both Revolut and Monzo have slick apps with loads of useful features that can help you organise your money and save.
Are challengers safe?
The short answer is yes – all the challengers we've mentioned are registered with the Financial Conduct Authority (FCA) and fully authorised to do what they do. However, there is a slight difference when it comes to how your money is protected:
Financial Services Compensation Scheme (FSCS). It protects all deposits up to £85,000 and applies to institutions that have a full banking licence. That is: Monzo, Starling and Atom Bank.
Segregated accounts. Institutions that only have a licence for dealing in electronic money have to keep all clients' money in segregated accounts, from where it can't be used to pay the company's debt and is thus safe in case of bankruptcy. That's the case for Monese; Revolut recently got a European banking licence, but until it's fully finalised, deposit protection doesn't apply and client money will still be kept separate from company money.
We show offers we can track - that's not every product on the market...yet. Unless we've said otherwise, products are in no particular order. The terms "best", "top", "cheap" (and variations of these) aren't ratings, though we always explain what's great about a product when we highlight it. This is subject to our terms of use. When you make major financial decisions, consider getting independent financial advice. Always consider your own circumstances when you compare products so you get what's right for you.
Valentina Cipriani is a writer at Finder UK. She writes news, features and guides about banking and credit cards, helping people to improve their financial lives. She holds an MA in International Journalism and loves taking complicated topics apart and giving them back to the readers in a clear and easy fashion.
Revolut alternatives including banks, apps and competitors Alternatives apps to Plum
Compare self invested personal pensions (SIPPs)
Saving enough money to guarantee yourself a comfortable retirement can be complicated. If you're thinking of investing, a SIPP can be a viable option.
Top ethical credit cards
Learn more about how ethical credit cards work and whether they are right for you.
What is day trading?
We examine the pros and cons, and who day trading is (and often isn't) right for.
Best bank account switching deals in the UK 2022
We look at switching bonuses, what they are, how they work and which banks offer the best ones. If you're fed up with your current bank, you could switch accounts and get a nice little cash bonus as an extra perk.
Winners of the Finder Banking Innovation Awards 2021 announced
Now in their second year, these awards recognise the banking and money management providers displaying the best innovations in their field.
The winners of the annual Finder Banking Innovation Awards announced
Running for the second year in a row, Finder's Innovation Awards series recognises financial providers that are innovating in their chosen field, by bringing new and impactful features to the market and delivering unique and beneficial services to their customers.
Motor legal protection
We explain what motor legal expenses insurance does and doesn't cover, and when you might need it.
Opening a bank account in Italy
Learn more about opening a bank account in Italy as a foreigner.
Opening A Bank Account In France
Learn more about opening a bank account in France as a foreigner.
Opening a bank account in Singapore
Learn more about opening a bank account in Singapore as a foreigner.
By submitting your comment or question, you agree to our Privacy and Cookies Policy and Terms of Use.
Finder UK
Level 2, 20 St Thomas St, London, SE1 9RS
Singapore United States Other Regions
How we fund this site
Finder.com Comparison UK Limited (company number: 10482489) is authorised and regulated by the Financial Conduct Authority (firm reference number: 786446). We are a credit broker and not a lender and offer credit facilities from a panel of lenders. Our address is Level 2, 20 St Thomas St, London, SE1 9RG. Data Protection ICO registration number: ZA227007. VAT number: 259751759.
finder.com is an independent comparison platform and information service that aims to provide you with the tools you need to make better decisions. While we are independent, we may receive compensation from our partners for featured placement of their products or services. We may also receive compensation if you click on certain links posted on our site.

redpajama_set_name: RedPajamaCommonCrawl


text:
Lonchophylla fornicata is een vleermuis uit het geslacht Lonchophylla die voorkomt in de laaglanden van Zuidwest-Colombia (de Chocó) en Noordwest-Ecuador, op 75 tot 500 m hoogte. Deze soort lijkt het meeste op Lonchophylla concava. De soortaanduiding fornicata betekent in het Latijn "van een boog voorzien" en verwijst naar de verwantschap met L. concava.

L. fornicata is een middelgrote soort met een lange, bruine rugvacht en een vrij korte voorarm. De voorarmlengte bedraagt 33,0 tot 35,6 mm, de kop-romplengte 52 tot 62 mm, de staartlengte 7 tot 12 mm, de achtervoetlengte 10 tot 12 mm, de oorlengte 11 tot 15 mm en het gewicht 8,7 g.

Literatuur
Woodman, N. 2007. A new species of nectar-feeding bat, genus Lonchophylla, from western Colombia and western Ecuador (Mammalia: Chiroptera: Phyllostomidae). Proceedings of the Biological Society of Washington 120(3):340-358.

Bladneusvleermuizen van de Nieuwe Wereld
Dier uit het Neotropisch gebied
IUCN-status onzeker

redpajama_set_name: RedPajamaWikipedia


text:
Les Misérables in Wermland Opera: Addendum
Last weekend, it was time for the year's second musical trip to Sweden!
Also time for the year's second trip to see Les Misérables in Wermland Opera in Karlstad, since I have a bit of a fixation like that.
I saw Wermland Opera's Les Mis first time this July. It filled me with the special glee only a fantastic production of this musical can inspire. Afterwards, I wondered if it's maybe the very best production of Les Misérables I've ever seen.
Having now seen it for the second time, let's take a short look at the experience. How did the production hold up?
Best things first.
In my original review, I said the following about Christer Nerfont's Jean Valjean:
"In short, I have never seen this thoroughly thought-out, three-dimensional, human portrayal of Jean Valjean's character. This is the first time the character has felt truely relatable to me."
Having seen the show for the second time, that is more true than ever. Nerfont's Jean Valjean is everything I could hope for the character to be.
Les Misérables is based on a 19th century novel with 19th century storytelling and Big Emotions – our hero essentially dies of a broken heart. It's no wonder Jean Valjean often feels a bit unrealistic and distant. Nerfont's Valjean, though, is none of that. He is a real person through and through, every action justified, every detail thought out (seriously, pay attention to his hands whenever he is trying to keep his calm while confronted by Javert). I couldn't bear to take my eyes off him whenever he was onstage, afraid I would miss some interesting nuance if I did!
I'm also glad I went for the second round since it gave me a chance to properly appreciate Cecilie Nerfont Thorgersen as Fantine.
I think I have found my dream Fantine. Nerfont Thorgersen's take is very angry and not fragile at all. This is a woman who has been let down by everybody, but even so, she refuses to break and keeps on fighting. The most important of all, she is a mother who loves her daughter with every fibre of her being. She doesn't feel regretful at all – it's all been for Cosette, so what would there be to regret? Nerfont Thorgersen's I Dreamed a Dream is especially impressive. It's such a journey through emotions, from hurt to longing and anger, I completely forgot how overdone the song is. I just listened and felt for the character.
Photo source: Facebook
In the role of Javert, we saw understudy John Alexander Eriksson. I liked him better than principal Philip Jalmelid. Jalmelid's out-of-this-world gorgeous singing remains unparalleled (though Eriksson's great!), but acting-wise, I prefer Eriksson's calmer, more stoic approach.
Eriksson is a very young Javert. Discussing the matter, me and my friends came to the conclusion it actually adds to the character. Maybe the Javert we see in the musical's prologue is an insecure young man who hides his self-doubts behind a harsh facade – and takes the hardships that come his way too personally, dwelling upon his mistakes until they turn into obsessions. By the time Javert and Valjean meet on the barricade, it's just been way too long for Javert to let go anymore. Eriksson does a great job highlighting the character's black-and-white worldview in Stars, making even a hardened Les Mis fan like me to stop and really listen to the lyrics for once!
It's a shame, however, that in James Grieve's direction, Javert is quite simply the villain of the piece. While Javert and Jean Valjean's scenes together are wonderfully intensive, our antagonist is still presented as a baddie who dies a horrible dark death all alone, and yet, is not worthy an absolution. I understand where that interpretation is coming from, but personally, I prefer a take with more shades of gray.
Watching the show for the second time highlighted the problems I have with the direction, but on the flip side, the good parts shone even brighter. The story flows forward with a flawless pace, the sets and lights are gorgeous, the orchestra is lush and the vocal performances top-notch. Many of the characterisations – the Thénardiers, Gavroche, Marius – are spot-on. Overall, the production is very refreshing to watch.
So, my sentence? Not quite as good the second time as it was the first, since the special magic of not knowing what you're going to get is gone... But let's be real here. The return trip would have been worth it for Jean Valjean alone. The rest is bonus goodness on top of that.
Les Mis is playing in Karlstad until April 2017. Catch it while you can!
Photos by Mats Bäcker.
Tunnisteet: Les Mis, musical review, Nordic countries
Unohdetut nuoret naiset


text:
Home Sport Gaa "It'll all came down to who wants it more" | Cappamore manager...
"It'll all came down to who wants it more" | Cappamore manager Declan Deere on what it will take to earn promotion
Benjamin Geary
CAPPAMORE are preparing for their second ever Premier Intermediate Hurling Final.
This Sunday, Cappamore face Mungret St Pauls with promotion to the top tier on offer in the TUS Gaelic Grounds. Cappamore, in their second year back at the grade, have won three of their four games this year with manager Declan Deere outlining that there's work yet to be done.
"About 13 days out now, a good bit of work to be done on the training field and we're all looking forward to the big day at the Gaelic Grounds."
"There's always areas to improve on especially in club hurling, when we sit down and reflect about certain performances there's a couple of wides or a couple of frees you'd given away, maybe a couple of goal scoring opportunities that you'd want to take on a day but look, we're happy enough."
The game that Cappamore failed to win was against this weekend's opponents with the City coming away with a two point win in the group stages.
But Deere will pay little heed to that result with every game a new one, especially a final.
"Everyday you go out, especially in hurling, it's a new game, it's gonna take on a new life of it's own as well, we can look back and reflect on the last day but as I said it's gonna be a new game and a new challenge"
"Both teams are gonna bring different things to the table, both teams are gonna try improve things, both teams are gonna try counteract what other teams are doing but at the end of the day it'll all came down to who wants it more"
The East side recovered from the loss to mungret with a three point win over Murroe Boher to book their place in the semi-finals. And while they just got over the line against Murroe, they were at their best as they put the Intermediate champions Newcastle West to the sword with a 1-18 to 1-6 win, with the youth in particular playing their part.
"From the Newcastle West game I think our average age was 23 or 24, but saying that I think seven of them played in the premier intermediate final five years ago, it is a good makeup between experience and youth"
"Youth tend to play with a good bit of freedom and then we have the experienced boys as well, they have their cool head when it counts."
And overall, everyone within the team is excited to play in the Gaelic Grounds with a return to the senior ranks only an hour away.
"Everyones excited to be going into the Gaelic Grounds on Senior final day and representing Cappamore, the lads are very proud to be doing that."
Watch the interview in full with Deere below.
Mungret St Pauls take on Cappamore in the 2021 Premier Intermediate Hurling Final on Sunday October 24 in the TUS Gaelic Grounds.
Watch live on Limerick GAA TV
The post WATCH: "It'll all came down to who wants it more" | Cappamore manager Declan Deere on what it will take to earn promotion appeared first on Sporting Limerick.
Cappamore
Gaelic Grounds
Keeping Limerick Posted
Limerick Post
Mungret
Murroe Boher
Previous articleVaradkar launches €14 million UL dairy research project
Next articleGAA players turning to cocaine for kicks
Service shortcomings put 140 mentally ill children at serious risk in Limerick region
Cross border orchestra concert series kicks off in Limerick
UHL PROTEST MARCH: It's time for people to stand up and demand something better
177 new jobs in firms supported by Limerick Local Enterprise Office
Out Of Place set for Belltable screening
Limerick woman will celebrate a century at Comhaltas golden jubilee


text:
package org.apache.phoenix.compile;

import static org.apache.phoenix.coprocessor.BaseScannerRegionObserver.SCAN_ACTUAL_START_ROW;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.io.TimeRange;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.phoenix.filter.SkipScanFilter;
import org.apache.phoenix.query.KeyRange;
import org.apache.phoenix.query.KeyRange.Bound;
import org.apache.phoenix.query.QueryConstants;
import org.apache.phoenix.schema.RowKeySchema;
import org.apache.phoenix.schema.SaltingUtil;
import org.apache.phoenix.schema.SortOrder;
import org.apache.phoenix.schema.ValueSchema.Field;
import org.apache.phoenix.util.ByteUtil;
import org.apache.phoenix.util.ScanUtil;
import org.apache.phoenix.util.ScanUtil.BytesComparator;
import org.apache.phoenix.util.SchemaUtil;

import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;

public class ScanRanges {
    private static final List<List<KeyRange>> EVERYTHING_RANGES = Collections.<List<KeyRange>>emptyList();
    private static final List<List<KeyRange>> NOTHING_RANGES = Collections.<List<KeyRange>>singletonList(Collections.<KeyRange>singletonList(KeyRange.EMPTY_RANGE));
    public static final ScanRanges EVERYTHING = new ScanRanges(null,ScanUtil.SINGLE_COLUMN_SLOT_SPAN,EVERYTHING_RANGES, KeyRange.EVERYTHING_RANGE, KeyRange.EVERYTHING_RANGE, false, false, null, null);
    public static final ScanRanges NOTHING = new ScanRanges(null,ScanUtil.SINGLE_COLUMN_SLOT_SPAN,NOTHING_RANGES, KeyRange.EMPTY_RANGE, KeyRange.EMPTY_RANGE, false, false, null, null);
    private static final Scan HAS_INTERSECTION = new Scan();

    public static ScanRanges createPointLookup(List<KeyRange> keys) {
        return ScanRanges.create(SchemaUtil.VAR_BINARY_SCHEMA, Collections.singletonList(keys), ScanUtil.SINGLE_COLUMN_SLOT_SPAN, KeyRange.EVERYTHING_RANGE, null, true, -1);
    }

    // For testing
    public static ScanRanges createSingleSpan(RowKeySchema schema, List<List<KeyRange>> ranges) {
        return create(schema, ranges, ScanUtil.getDefaultSlotSpans(ranges.size()), KeyRange.EVERYTHING_RANGE, null, true, -1);
    }

    public static ScanRanges create(RowKeySchema schema, List<List<KeyRange>> ranges, int[] slotSpan, KeyRange minMaxRange, Integer nBuckets, boolean useSkipScan, int rowTimestampColIndex) {
        int offset = nBuckets == null ? 0 : SaltingUtil.NUM_SALTING_BYTES;
        int nSlots = ranges.size();
        if (nSlots == offset && minMaxRange == KeyRange.EVERYTHING_RANGE) {
            return EVERYTHING;
        } else if (minMaxRange == KeyRange.EMPTY_RANGE || (nSlots == 1 + offset && ranges.get(offset).size() == 1 && ranges.get(offset).get(0) == KeyRange.EMPTY_RANGE)) {
            return NOTHING;
        }
        TimeRange rowTimestampRange = getRowTimestampColumnRange(ranges, schema, rowTimestampColIndex);
        boolean isPointLookup = isPointLookup(schema, ranges, slotSpan, useSkipScan);
        if (isPointLookup) {
            // TODO: consider keeping original to use for serialization as it would be smaller?
            List<byte[]> keys = ScanRanges.getPointKeys(ranges, slotSpan, schema, nBuckets);
            List<KeyRange> keyRanges = Lists.newArrayListWithExpectedSize(keys.size());
            KeyRange unsaltedMinMaxRange = minMaxRange;
            if (nBuckets != null && minMaxRange != KeyRange.EVERYTHING_RANGE) {
                unsaltedMinMaxRange = KeyRange.getKeyRange(
                        stripPrefix(minMaxRange.getLowerRange(),offset),
                        minMaxRange.lowerUnbound(),
                        stripPrefix(minMaxRange.getUpperRange(),offset),
                        minMaxRange.upperUnbound());
            }
            // We have full keys here, so use field from our varbinary schema
            BytesComparator comparator = ScanUtil.getComparator(SchemaUtil.VAR_BINARY_SCHEMA.getField(0));
            for (byte[] key : keys) {
                // Filter now based on unsalted minMaxRange and ignore the point key salt byte
                if ( unsaltedMinMaxRange.compareLowerToUpperBound(key, offset, key.length-offset, true, comparator) <= 0 &&
                     unsaltedMinMaxRange.compareUpperToLowerBound(key, offset, key.length-offset, true, comparator) >= 0) {
                    keyRanges.add(KeyRange.getKeyRange(key));
                }
            }
            ranges = Collections.singletonList(keyRanges);
            useSkipScan = keyRanges.size() > 1;
            // Treat as binary if descending because we've got a separator byte at the end
            // which is not part of the value.
            if (keys.size() > 1 || SchemaUtil.getSeparatorByte(schema.rowKeyOrderOptimizable(), false, schema.getField(schema.getFieldCount()-1)) == QueryConstants.DESC_SEPARATOR_BYTE) {
                schema = SchemaUtil.VAR_BINARY_SCHEMA;
                slotSpan = ScanUtil.SINGLE_COLUMN_SLOT_SPAN;
            } else {
                // Keep original schema and don't use skip scan as it's not necessary
                // when there's a single key.
                slotSpan = new int[] {schema.getMaxFields()-1};
            }
        }
        List<List<KeyRange>> sortedRanges = Lists.newArrayListWithExpectedSize(ranges.size());
        for (int i = 0; i < ranges.size(); i++) {
            List<KeyRange> sorted = Lists.newArrayList(ranges.get(i));
            Collections.sort(sorted, KeyRange.COMPARATOR);
            sortedRanges.add(ImmutableList.copyOf(sorted));
        }

        // Don't set minMaxRange for point lookup because it causes issues during intersect
        // by going across region boundaries
        KeyRange scanRange = KeyRange.EVERYTHING_RANGE;
        // if (!isPointLookup && (nBuckets == null || !useSkipScanFilter)) {
        // if (! ( isPointLookup || (nBuckets != null && useSkipScanFilter) ) ) {
        // if (nBuckets == null || (nBuckets != null && (!isPointLookup || !useSkipScanFilter))) {
        if (nBuckets == null || !isPointLookup || !useSkipScan) {
            byte[] minKey = ScanUtil.getMinKey(schema, sortedRanges, slotSpan);
            byte[] maxKey = ScanUtil.getMaxKey(schema, sortedRanges, slotSpan);
            // If the maxKey has crossed the salt byte boundary, then we do not
            // have anything to filter at the upper end of the range
            if (ScanUtil.crossesPrefixBoundary(maxKey, ScanUtil.getPrefix(minKey, offset), offset)) {
                maxKey = KeyRange.UNBOUND;
            }
            // We won't filter anything at the low end of the range if we just have the salt byte
            if (minKey.length <= offset) {
                minKey = KeyRange.UNBOUND;
            }
            scanRange = KeyRange.getKeyRange(minKey, maxKey);
        }
        if (minMaxRange != KeyRange.EVERYTHING_RANGE) {
            minMaxRange = ScanUtil.convertToInclusiveExclusiveRange(minMaxRange, schema, new ImmutableBytesWritable());
            scanRange = scanRange.intersect(minMaxRange);
        }

        if (scanRange == KeyRange.EMPTY_RANGE) {
            return NOTHING;
        }
        return new ScanRanges(schema, slotSpan, sortedRanges, scanRange, minMaxRange, useSkipScan, isPointLookup, nBuckets, rowTimestampRange);
    }

    private SkipScanFilter filter;
    private final List<List<KeyRange>> ranges;
    private final int[] slotSpan;
    private final RowKeySchema schema;
    private final boolean isPointLookup;
    private final boolean isSalted;
    private final boolean useSkipScanFilter;
    private final KeyRange scanRange;
    private final KeyRange minMaxRange;
    private final TimeRange rowTimestampRange;

    private ScanRanges (RowKeySchema schema, int[] slotSpan, List<List<KeyRange>> ranges, KeyRange scanRange, KeyRange minMaxRange, boolean useSkipScanFilter, boolean isPointLookup, Integer bucketNum, TimeRange rowTimestampRange) {
        this.isPointLookup = isPointLookup;
        this.isSalted = bucketNum != null;
        this.useSkipScanFilter = useSkipScanFilter;
        this.scanRange = scanRange;
        this.minMaxRange = minMaxRange;
        this.rowTimestampRange = rowTimestampRange;

        // Only blow out the bucket values if we're using the skip scan. We need all the
        // bucket values in this case because we use intersect against a key that may have
        // any of the possible bucket values. Otherwise, we can pretty easily ignore the
        // bucket values.
        if (useSkipScanFilter && isSalted && !isPointLookup) {
        	ranges.set(0, SaltingUtil.generateAllSaltingRanges(bucketNum));
        }
        this.ranges = ImmutableList.copyOf(ranges);
        this.slotSpan = slotSpan;
        this.schema = schema;
        if (schema != null && !ranges.isEmpty()) {
            if (!this.useSkipScanFilter) {
                int boundSlotCount = this.getBoundSlotCount();
                ranges = ranges.subList(0, boundSlotCount);
                slotSpan = Arrays.copyOf(slotSpan, boundSlotCount);
            }
            this.filter = new SkipScanFilter(ranges, slotSpan, this.schema);
        }
    }

    /**
     * Get the minMaxRange that is applied in addition to the scan range.
     * Only used by the ExplainTable to generate the explain plan.
     */
    public KeyRange getMinMaxRange() {
        return minMaxRange;
    }

    public void initializeScan(Scan scan) {
        scan.setStartRow(scanRange.getLowerRange());
        scan.setStopRow(scanRange.getUpperRange());
    }

    public static byte[] prefixKey(byte[] key, int keyOffset, byte[] prefixKey, int prefixKeyOffset) {
        if (key.length > 0) {
            byte[] newKey = new byte[key.length + prefixKeyOffset];
            int totalKeyOffset = keyOffset + prefixKeyOffset;
            if (prefixKey.length >= totalKeyOffset) { // otherwise it's null padded
                System.arraycopy(prefixKey, 0, newKey, 0, totalKeyOffset);
            }
            System.arraycopy(key, keyOffset, newKey, totalKeyOffset, key.length - keyOffset);
            return newKey;
        }
        return key;
    }

    private static byte[] replaceSaltByte(byte[] key, byte[] saltKey) {
        if (key.length == 0) {
            return key;
        }
        byte[] temp = new byte[key.length];
        if (saltKey.length >= SaltingUtil.NUM_SALTING_BYTES) { // Otherwise it's null padded
            System.arraycopy(saltKey, 0, temp, 0, SaltingUtil.NUM_SALTING_BYTES);
        }
        System.arraycopy(key, SaltingUtil.NUM_SALTING_BYTES, temp, SaltingUtil.NUM_SALTING_BYTES, key.length - SaltingUtil.NUM_SALTING_BYTES);
        return temp;
    }

    public static byte[] stripPrefix(byte[] key, int keyOffset) {
        if (key.length == 0) {
            return key;
        }
        byte[] temp = new byte[key.length - keyOffset];
        System.arraycopy(key, keyOffset, temp, 0, key.length - keyOffset);
        return temp;
    }

    public Scan intersectScan(Scan scan, final byte[] originalStartKey, final byte[] originalStopKey, final int keyOffset, boolean crossesRegionBoundary) {
        byte[] startKey = originalStartKey;
        byte[] stopKey = originalStopKey;
        if (stopKey.length > 0 && Bytes.compareTo(startKey, stopKey) >= 0) {
            return null;
        }
        boolean mayHaveRows = false;
        // Keep the keys as they are if we have a point lookup, as we've already resolved the
        // salt bytes in that case.
        final int scanKeyOffset = this.isSalted && !this.isPointLookup ? SaltingUtil.NUM_SALTING_BYTES : 0;
        assert (scanKeyOffset == 0 || keyOffset == 0);
        // Total offset for startKey/stopKey. Either 1 for salted tables or the prefix length
        // of the current region for local indexes. We'll never have a case where a table is
        // both salted and local.
        final int totalKeyOffset = scanKeyOffset + keyOffset;
        byte[] prefixBytes = ByteUtil.EMPTY_BYTE_ARRAY;
        if (totalKeyOffset > 0) {
            prefixBytes = ScanUtil.getPrefix(startKey, totalKeyOffset);
            /*
             * If our startKey to stopKey crosses a region boundary consider everything after the startKey as our scan
             * is always done within a single region. This prevents us from having to prefix the key prior to knowing
             * whether or not there may be an intersection. We can't calculate whether or not we've crossed a region
             * boundary for local indexes, because we don't know the key offset of the next region, but only for the
             * current one (which is the one passed in). If the next prefix happened to be a subset of the previous
             * prefix, then this wouldn't detect that we crossed a region boundary.
             */
            if (crossesRegionBoundary) {
                stopKey = ByteUtil.EMPTY_BYTE_ARRAY;
            }
        }
        int scanStartKeyOffset = scanKeyOffset;
        byte[] scanStartKey = scan == null ? ByteUtil.EMPTY_BYTE_ARRAY : scan.getStartRow();
        // Compare ignoring key prefix and salt byte
        if (scanStartKey.length > 0) {
            if (startKey.length > 0 && Bytes.compareTo(scanStartKey, scanKeyOffset, scanStartKey.length - scanKeyOffset, startKey, totalKeyOffset, startKey.length - totalKeyOffset) < 0) {
                scanStartKey = startKey;
                scanStartKeyOffset = totalKeyOffset;
            }
        } else {
        	scanStartKey = startKey;
            scanStartKeyOffset = totalKeyOffset;
            mayHaveRows = true;
        }
        int scanStopKeyOffset = scanKeyOffset;
        byte[] scanStopKey = scan == null ? ByteUtil.EMPTY_BYTE_ARRAY : scan.getStopRow();
        if (scanStopKey.length > 0) {
            if (stopKey.length > 0 && Bytes.compareTo(scanStopKey, scanKeyOffset, scanStopKey.length - scanKeyOffset, stopKey, totalKeyOffset, stopKey.length - totalKeyOffset) > 0) {
                scanStopKey = stopKey;
                scanStopKeyOffset = totalKeyOffset;
            }
        } else {
        	scanStopKey = stopKey;
            scanStopKeyOffset = totalKeyOffset;
            mayHaveRows = true;
        }
        mayHaveRows = mayHaveRows || Bytes.compareTo(scanStartKey, scanStartKeyOffset, scanStartKey.length - scanStartKeyOffset, scanStopKey, scanStopKeyOffset, scanStopKey.length - scanStopKeyOffset) < 0;

        if (!mayHaveRows) {
            return null;
        }
        if (originalStopKey.length != 0 && scanStopKey.length == 0) {
            scanStopKey = originalStopKey;
        }
        Filter newFilter = null;
        // If the scan is using skip scan filter, intersect and replace the filter.
        if (scan == null || this.useSkipScanFilter()) {
            byte[] skipScanStartKey = scanStartKey;
            byte[] skipScanStopKey = scanStopKey;
            // If we have a keyOffset and we've used the startKey/stopKey that
            // were passed in (which have the prefix) for the above range check,
            // we need to remove the prefix before running our intersect method.
            // TODO: we could use skipScanFilter.setOffset(keyOffset) if both
            // the startKey and stopKey were used above *and* our intersect
            // method honored the skipScanFilter.offset variable.
            if (scanKeyOffset > 0) {
                if (skipScanStartKey != originalStartKey) { // original already has correct salt byte
                    skipScanStartKey = replaceSaltByte(skipScanStartKey, prefixBytes);
                }
                if (skipScanStopKey != originalStopKey) {
                    skipScanStopKey = replaceSaltByte(skipScanStopKey, prefixBytes);
                }
            } else if (keyOffset > 0) {
                if (skipScanStartKey == originalStartKey) {
                    skipScanStartKey = stripPrefix(skipScanStartKey, keyOffset);
                }
                if (skipScanStopKey == originalStopKey) {
                    skipScanStopKey = stripPrefix(skipScanStopKey, keyOffset);
                }
            }
            if (scan == null) {
                return filter.hasIntersect(skipScanStartKey, skipScanStopKey) ? HAS_INTERSECTION : null;
            }
            Filter filter = scan.getFilter();
            SkipScanFilter newSkipScanFilter = null;
            if (filter instanceof SkipScanFilter) {
                SkipScanFilter oldSkipScanFilter = (SkipScanFilter)filter;
                newFilter = newSkipScanFilter = oldSkipScanFilter.intersect(skipScanStartKey, skipScanStopKey);
                if (newFilter == null) {
                    return null;
                }
            } else if (filter instanceof FilterList) {
                FilterList oldList = (FilterList)filter;
                FilterList newList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
                newFilter = newList;
                for (Filter f : oldList.getFilters()) {
                    if (f instanceof SkipScanFilter) {
                        newSkipScanFilter = ((SkipScanFilter)f).intersect(skipScanStartKey, skipScanStopKey);
                        if (newSkipScanFilter == null) {
                            return null;
                        }
                        newList.addFilter(newSkipScanFilter);
                    } else {
                        newList.addFilter(f);
                    }
                }
            }
            // TODO: it seems that our SkipScanFilter or HBase runs into problems if we don't
            // have an enclosing range when we do a point lookup.
            if (isPointLookup) {
                scanStartKey = ScanUtil.getMinKey(schema, newSkipScanFilter.getSlots(), slotSpan);
                scanStopKey = ScanUtil.getMaxKey(schema, newSkipScanFilter.getSlots(), slotSpan);
            }
        }
        if (newFilter == null) {
            newFilter = scan.getFilter();
        }
        Scan newScan = ScanUtil.newScan(scan);
        newScan.setFilter(newFilter);
        // If we have an offset (salted table or local index), we need to make sure to
        // prefix our scan start/stop row by the prefix of the startKey or stopKey that
        // were passed in. Our scan either doesn't have the prefix or has a placeholder
        // for it.
        if (totalKeyOffset > 0) {
            if (scanStartKey != originalStartKey) {
                scanStartKey = prefixKey(scanStartKey, scanKeyOffset, prefixBytes, keyOffset);
            }
            if (scanStopKey != originalStopKey) {
                scanStopKey = prefixKey(scanStopKey, scanKeyOffset, prefixBytes, keyOffset);
            }
        }
        // Don't let the stopRow of the scan go beyond the originalStopKey
        if (originalStopKey.length > 0 && Bytes.compareTo(scanStopKey, originalStopKey) > 0) {
            scanStopKey = originalStopKey;
        }
        if (scanStopKey.length > 0 && Bytes.compareTo(scanStartKey, scanStopKey) >= 0) {
            return null;
        }
        newScan.setAttribute(SCAN_ACTUAL_START_ROW, scanStartKey);
        newScan.setStartRow(scanStartKey);
        newScan.setStopRow(scanStopKey);
        return newScan;
    }

    /**
     * Return true if the range formed by the lowerInclusiveKey and upperExclusiveKey
     * intersects with the scan ranges and false otherwise. We cannot pass in
     * a KeyRange here, because the underlying compare functions expect lower inclusive
     * and upper exclusive keys. We cannot get their next key because the key must
     * conform to the row key schema and if a null byte is added to a lower inclusive
     * key, it's no longer a valid, real key.
     * @param lowerInclusiveKey lower inclusive key
     * @param upperExclusiveKey upper exclusive key
     * @param crossesRegionBoundary whether or not the upperExclusiveKey spans upto
     * or after the next region.
     * @return true if the scan range intersects with the specified lower/upper key
     * range
     */
    public boolean intersects(byte[] lowerInclusiveKey, byte[] upperExclusiveKey, int keyOffset, boolean crossesRegionBoundary) {
        if (isEverything()) {
            return true;
        }
        if (isDegenerate()) {
            return false;
        }

        //return filter.hasIntersect(lowerInclusiveKey, upperExclusiveKey);
        return intersectScan(null, lowerInclusiveKey, upperExclusiveKey, keyOffset, crossesRegionBoundary) == HAS_INTERSECTION;
    }

    public SkipScanFilter getSkipScanFilter() {
        return filter;
    }

    public List<List<KeyRange>> getRanges() {
        return ranges;
    }

    public List<List<KeyRange>> getBoundRanges() {
        return ranges.subList(0, getBoundSlotCount());
    }

    public RowKeySchema getSchema() {
        return schema;
    }

    public boolean isEverything() {
        return this == EVERYTHING || ranges.get(0).get(0) == KeyRange.EVERYTHING_RANGE;
    }

    public boolean isDegenerate() {
        return this == NOTHING;
    }

    /**
     * Use SkipScanFilter under two circumstances:
     * 1) If we have multiple ranges for a given key slot (use of IN)
     * 2) If we have a range (i.e. not a single/point key) that is
     *    not the last key slot
     */
    public boolean useSkipScanFilter() {
        return useSkipScanFilter;
    }

    /**
     * Finds the total number of row keys spanned by this ranges / slotSpan pair.
     * This accounts for slots in the ranges that may span more than on row key.
     * @param ranges  the KeyRange slots paired with this slotSpan. corresponds to {@link ScanRanges#ranges}
     * @param slotSpan  the extra span per skip scan slot. corresponds to {@link ScanRanges#slotSpan}
     * @return  the total number of row keys spanned yb this ranges / slotSpan pair.
     */
    private static int getBoundPkSpan(List<List<KeyRange>> ranges, int[] slotSpan) {
        int count = 0;
        boolean hasUnbound = false;
        int nRanges = ranges.size();

        for(int i = 0; i < nRanges && !hasUnbound; i++) {
            List<KeyRange> orRanges = ranges.get(i);
            for (KeyRange range : orRanges) {
                if (range == KeyRange.EVERYTHING_RANGE) {
                    return count;
                }
                if (range.isUnbound()) {
                    hasUnbound = true;
                }
            }
            count += slotSpan[i] + 1;
        }

        return count;
    }

    private static boolean isFullyQualified(RowKeySchema schema, List<List<KeyRange>> ranges, int[] slotSpan) {
        return getBoundPkSpan(ranges, slotSpan) == schema.getMaxFields();
    }

    private static boolean isPointLookup(RowKeySchema schema, List<List<KeyRange>> ranges, int[] slotSpan, boolean useSkipScan) {
        if (!isFullyQualified(schema, ranges, slotSpan)) {
            return false;
        }
        int lastIndex = ranges.size()-1;
        for (int i = lastIndex; i >= 0; i--) {
            List<KeyRange> orRanges = ranges.get(i);
            if (!useSkipScan && orRanges.size() > 1) {
                return false;
            }
            for (KeyRange keyRange : orRanges) {
                // Special case for single trailing IS NULL. We cannot consider this as a point key because
                // we strip trailing nulls when we form the key.
                if (!keyRange.isSingleKey() || (i == lastIndex && keyRange == KeyRange.IS_NULL_RANGE)) {
                    return false;
                }
            }
        }
        return true;
    }

    private static boolean incrementKey(List<List<KeyRange>> slots, int[] position) {
        int idx = slots.size() - 1;
        while (idx >= 0 && (position[idx] = (position[idx] + 1) % slots.get(idx).size()) == 0) {
            idx--;
        }
        return idx >= 0;
    }

    private static List<byte[]> getPointKeys(List<List<KeyRange>> ranges, int[] slotSpan, RowKeySchema schema, Integer bucketNum) {
        if (ranges == null || ranges.isEmpty()) {
            return Collections.emptyList();
        }
        boolean isSalted = bucketNum != null;
        int count = 1;
        int offset = isSalted ? 1 : 0;
        // Skip salt byte range in the first position if salted
        for (int i = offset; i < ranges.size(); i++) {
            count *= ranges.get(i).size();
        }
        List<byte[]> keys = Lists.newArrayListWithExpectedSize(count);
        int[] position = new int[ranges.size()];
        int maxKeyLength = SchemaUtil.getMaxKeyLength(schema, ranges);
        int length;
        byte[] key = new byte[maxKeyLength];
        do {
            length = ScanUtil.setKey(schema, ranges, slotSpan, position, Bound.LOWER, key, offset, offset, ranges.size(), offset);
            if (isSalted) {
                key[0] = SaltingUtil.getSaltingByte(key, offset, length, bucketNum);
            }
            keys.add(Arrays.copyOf(key, length + offset));
        } while (incrementKey(ranges, position));
        return keys;
    }

    /**
     * @return true if this represents a set of complete keys
     */
    public boolean isPointLookup() {
        return isPointLookup;
    }

    public int getPointLookupCount() {
        return getPointLookupCount(isPointLookup, ranges);
    }

    private static int getPointLookupCount(boolean isPointLookup, List<List<KeyRange>> ranges) {
        return isPointLookup ? ranges.get(0).size() : 0;
    }

    public Iterator<KeyRange> getPointLookupKeyIterator() {
        return isPointLookup ? ranges.get(0).iterator() : Iterators.<KeyRange>emptyIterator();
    }

    public int getBoundPkColumnCount() {
        return this.useSkipScanFilter ? ScanUtil.getRowKeyPosition(slotSpan, ranges.size()) : getBoundPkSpan(ranges, slotSpan);
    }

    public int getBoundSlotCount() {
        int count = 0;
        boolean hasUnbound = false;
        int nRanges = ranges.size();

        for(int i = 0; i < nRanges && !hasUnbound; i++) {
            List<KeyRange> orRanges = ranges.get(i);
            for (KeyRange range : orRanges) {
                if (range == KeyRange.EVERYTHING_RANGE) {
                    return count;
                }
                if (range.isUnbound()) {
                    hasUnbound = true;
                }
            }
            count++;
        }

        return count;
    }

    @Override
    public String toString() {
        return "ScanRanges[" + ranges.toString() + "]";
    }

    public int[] getSlotSpans() {
        return slotSpan;
    }

    public boolean hasEqualityConstraint(int pkPosition) {
        if (isPointLookup) {
            return true;
        }

        int pkOffset = 0;
        int nRanges = ranges.size();

        for(int i = 0; i < nRanges; i++) {
            if (pkOffset + slotSpan[i] >= pkPosition) {
                List<KeyRange> range = ranges.get(i);
                return range.size() == 1 && range.get(0).isSingleKey();
            }
            pkOffset += slotSpan[i] + 1;
        }

        return false;

    }

    private static TimeRange getRowTimestampColumnRange(List<List<KeyRange>> ranges, RowKeySchema schema, int rowTimestampColPos) {
        try {
            if (rowTimestampColPos != -1) {
                if (ranges != null && ranges.size() > rowTimestampColPos) {
                    List<KeyRange> rowTimestampColRange = ranges.get(rowTimestampColPos);
                    List<KeyRange> sortedRange = new ArrayList<>(rowTimestampColRange);
                    Collections.sort(sortedRange, KeyRange.COMPARATOR);
                    //ranges.set(rowTimestampColPos, sortedRange); //TODO: do I really need to do this?
                    Field f = schema.getField(rowTimestampColPos);
                    SortOrder order = f.getSortOrder();
                    KeyRange lowestRange = rowTimestampColRange.get(0);
                    KeyRange highestRange = rowTimestampColRange.get(rowTimestampColRange.size() - 1);
                    if (order == SortOrder.DESC) {
                        return getDescTimeRange(lowestRange, highestRange, f);
                    }
                    return getAscTimeRange( lowestRange, highestRange, f);
                }
            }
        } catch (IOException e) {
            Throwables.propagate(e);
        }
        return null;
    }

    private static TimeRange getAscTimeRange(KeyRange lowestRange, KeyRange highestRange, Field f)
            throws IOException {
        long low;
        long high;
        if (lowestRange.lowerUnbound()) {
            low = 0;
        } else {
            long lowerRange = f.getDataType().getCodec().decodeLong(lowestRange.getLowerRange(), 0, SortOrder.ASC);
            low = lowestRange.isLowerInclusive() ? lowerRange : safelyIncrement(lowerRange);
        }
        if (highestRange.upperUnbound()) {
            high = HConstants.LATEST_TIMESTAMP;
        } else {
            long upperRange = f.getDataType().getCodec().decodeLong(highestRange.getUpperRange(), 0, SortOrder.ASC);
            if (highestRange.isUpperInclusive()) {
                high = safelyIncrement(upperRange);
            } else {
                high = upperRange;
            }
        }
        return new TimeRange(low, high);
    }

    public static TimeRange getDescTimeRange(KeyRange lowestKeyRange, KeyRange highestKeyRange, Field f) throws IOException {
        boolean lowerUnbound = lowestKeyRange.lowerUnbound();
        boolean lowerInclusive = lowestKeyRange.isLowerInclusive();
        boolean upperUnbound = highestKeyRange.upperUnbound();
        boolean upperInclusive = highestKeyRange.isUpperInclusive();

        long low = lowerUnbound ? -1 : f.getDataType().getCodec().decodeLong(lowestKeyRange.getLowerRange(), 0, SortOrder.DESC);
        long high = upperUnbound ? -1 : f.getDataType().getCodec().decodeLong(highestKeyRange.getUpperRange(), 0, SortOrder.DESC);
        long newHigh;
        long newLow;
        if (!lowerUnbound && !upperUnbound) {
            newHigh = lowerInclusive ? safelyIncrement(low) : low;
            newLow = upperInclusive ? high : safelyIncrement(high);
            return new TimeRange(newLow, newHigh);
        } else if (!lowerUnbound && upperUnbound) {
            newHigh = lowerInclusive ? safelyIncrement(low) : low;
            newLow = 0;
            return new TimeRange(newLow, newHigh);
        } else if (lowerUnbound && !upperUnbound) {
            newLow = upperInclusive ? high : safelyIncrement(high);
            newHigh = HConstants.LATEST_TIMESTAMP;
            return new TimeRange(newLow, newHigh);
        } else {
            newLow = 0;
            newHigh = HConstants.LATEST_TIMESTAMP;
            return new TimeRange(newLow, newHigh);
        }
    }

    private static long safelyIncrement(long value) {
        return value < HConstants.LATEST_TIMESTAMP ? (value + 1) : HConstants.LATEST_TIMESTAMP;
    }

    public TimeRange getRowTimestampRange() {
        return rowTimestampRange;
    }

}

redpajama_set_name: RedPajamaGithub


Below is the information for Brooklyn Badminton Club.
Details: Brooklyn Badminton is one of the oldest badminton clubs in the greater New York area. It started as a group activity for John Dewey High School students who loved the sport of badminton, more than 12 years ago. Most of the current members have been in the club for more than ten years, many of them continued from high school into adulthood. Brooklyn Badminton has one of the finest badminton facilities in the New York area. Not only do we have 8 beautiful badminton courts, with magnificent lighting, but also a huge, free parking spaces with an excellent safety record. Brooklyn Badminton has some of the best badminton players in the area. Beginners learn from many excellent, experienced players, and all different level-players have the enjoyment of playing this sport in our club. Brooklyn Badminton is opened to all, and it won't take you long to find this as the home of badminton for you.


text:
Mońki (polaco: Gmina Mońki) é uma gminy (comuna) na Polónia, na voivodia de Podláquia e no condado de Mońki. A sede do condado é a cidade de Mońki.

De acordo com os censos de 2016, a comuna tem 15 077 habitantes, com uma densidade 93 hab/km².

Área
Estende-se por uma área de 161,56 km², incluindo:
 área agricola: 79%
 área florestal: 13%

Demografia
Dados de 30 de Junho 2004:

De acordo com dados de 2002, o rendimento médio per capita ascendia a 1107,22 zł.

Subdivisões
 Boguszewo, Ciesze, Czekołdy, Dudki, Dudki-Kolonia, Dzieżki, Dziękonie, Hornostaje, Hornostaje-Osada, Jaski, Kiślaki, Koleśniki, Kołodzież, Konopczyn, Kosiorki, Kropiwnica, Krzeczkowo, Kuczyn, Kulesze, Lewonie, Łupichy, Magnusze, Masie, Mejły, Moniuszeczki, Oliszki, Ołdaki, Potoczyzna, Przytulanka, Pyzy, Rybaki, Sikory, Sobieski, Świerzbienie, Waśki, Wojszki, Zalesie, Zblutowo, Znoski, Zyburty, Żodzie.

Comunas vizinhas
 Goniądz, Jaświły, Knyszyn, Krypno, Trzcianne

Ligações externas
 Sítio Oficial

Comunas da Polônia
Comunas mistas do condado de Mońki


International award-winning printmaker Sumi Perera RE subtly fuses the expertise of traditional printmaking techniques with contemporary production processes. She creates beautifully constructed images and assemblages with architectural precision, incorporating processes such as stitching, laser cutting, folding, sandblasting and engraving as additional modes of drawing to open up new ideas beyond the perceived boundaries of print.
Perera's career backgorund working as a doctor and a scientist feeds into her artistic practice and is reminiscent of the Renaissance's idiosyncratic integration of the Arts and Sciences; the resulting work is a studious examination of the visual world, eminating an experimental, research-like quality with an exacting eye for detail.
Perera's work is a visual exploration of constructed space, which sometimes conjurers a sense of urban or geographical mapping. Having spent time growing up in both Sri Lanka and the UK, much of her work is influenced by the idea of blurring the restrictiveness of boundaries. Clean, symmetrically considered interlocking edges gives her work a delicate sense of temporality. This air of ephemerality is important for Perera as she notes that, for her, the allure of printmaking lies within the stream of possibilities and variables presented by a set of processes. She will quite often rework old printing plates and use discarded materials to build new work, questioning the label of a 'finished' piece of work set within the flux of the ever developing contemporary world.
Perera has won countless prizes for her work and exhibits worldwide. She is a fellow of the Royal Society of Painter-Printmakers and a member of the Society of Designers Craftsman. Her international award-winning work is held in prominent public collections including Tate Britain, V&A Museum, Ashmolean Museum, Yale Centre for British Art, USA and has recently been short listed to be included in the Smithsonian Museum collection, USA.


The Naturally Purest Spring Water on the Face of the Planet Directly from the Source in Pristine Maine!
What is it about Tourmaline Spring and Why is it so unique?
The water is bubbling up of its own accord through gemstone-lined vaults in one of the most ancient mountain ranges of North America. The taste profile and sensation it creates in your being will prove to you how rare this substance is. Mosts hydrogeologists cannot definitively explain how such a perfect drinking water is created.
Our water, by contrast, is literally gravity fed to our bottling facility...which is located only 50 feet away! That means that the water only touches stainless steel from the time it leaves the spring to the time it's bottled - it actually never sees sunlight until it's bottled!


The Flare Combination Mill is a pepper and salt mill in one – perfect for keeping by the hob top to allow you to easily season your cooking.
It stands 12cm tall and has a ceramic mechanism which is sharper and harder than steel.
Fully adjustable from coarse grind to fine, the mechanism carries a manufacturers lifetime guarantee.


text:
Pontus Joakim Gårdinger (born 20 July 1964 in Enskede) is a Swedish television presenter show host, producer and actor who has, among other things, hosted Melodifestivalen 1996. He also hosted the short lived reality show Miljonärerna on Kanal 5. He has also produced the Swedish TV show Grattis världen and his comic speeches "Tal till nationen" is among many considered to be his most important works.

Gårdinger won the Poker Million competition 2007, where the first prize was SEK 1 million.

Since 2014, he has presented the Swedish version of Jeopardy!

Selected filmography
2002 – The Dog Trick
2001 – Pusselbitar (TV-series)
2000 – Naken
1995 – NileCity 105,6 (TV-series)

References

External links

1964 births
Living people
Swedish television personalities
Entertainers from Stockholm
Swedish television producers
Swedish male television actors


Crude prices spiked above $102 a barrel for the first time yesterday, then retreated after the government reported the nation is greased with more oil and gasoline than expected.
Prices nonetheless stayed within range of Tuesday�s record close as the dollar tumbled to fresh lows against the euro and U.S. economic worries drove more money into energy futures as a hedge against inflation.
Light, sweet crude for April delivery fell $1.24 to settle at $99.64 on the New York Mercantile Exchange, after surging as high as $102.08 a barrel in electronic trading earlier. On Tuesday, the contract jumped $1.65 to settle at a record $100.88 a barrel.
At the pump, gasoline prices added a penny overnight, rising to an average of $3.152 from $3.142, according to AAA and the Oil Price Information Service. At this time last year, drivers were paying an average of just $2.37 a gallon. Industry observers say prices will likely top last May�s peak of $3.23 a gallon as stations begin to switch to more expensive summer-grade fuel.
The report by the Energy Department�s Energy Information Administration showed U.S. crude oil inventories rose by 3.2 million barrels, or 1 percent, to 308.5 million barrels. Although that number is slightly lower than levels a year ago, it is well ahead of the 2.4 million barrel gain analysts had been expecting, according to a survey by Dow Jones Newswires.
It was the seventh straight week the report showed a rise in crude inventories, suggesting the U.S. at least has more than enough oil to meet demand. Data showed gasoline inventories also jumped more than expected � by 2.3 million barrels to 232.6 million barrels; analysts had expected a more modest rise of 400,000 barrels. Refinery activity also increased much more than expected.
Jim Ritterbusch, president of energy consultancy Ritterbusch and Associates in Galena, Ill., said the report offered the market a number of bearish signals. But, he noted, traders of late have focused on other factors than just supply in deciding whether to buy or sell.
The 15-nation euro jumped to a record $1.51 against the greenback, meaning that crude remains a relative bargain for buyers overseas. Gold � another commodity seen as a hedge against inflation � also struck a record high.


It was Amy's (and her class's) end-of-school party yesterday; their elementary school years will be over in two and a half weeks and then it'll be off to secondary school for the children.
While I was playing "keep the balloon in the air" with Amy, Dilara from her class came up to me and asked me whether I was Amy's father and whether I speak English with her.
I said yes, and added, "Ve sen, Türkçe konuşabilir misin?" (And you, can you speak Turkish?). She was surprised and asked me where I knew that from :) (I'm learning Turkish now; started about five weeks ago.) She said that she's a Turkish Kurd and knows five languages: German, Turkish, Kurdish, English, and Arabic. Not bad.
Arabic she says she only knows a bit in, just some sentences, and I'm guessing that English also refers to 4th grade school English rather than a fluent command. But still; I was impressed.


text:
Q: REINDEX takes significantly more time on production system than on local snapshot We have a table with time-series-like data (~200million rows, 30GB data size + index) in a PG 11 database, and for the first time since we started writing into it, we have to delete from it (~30%).
To keep things performant after the delete we want to

*

*rebuild the indexes

*run a full vacuum on it

To get a better understanding of how much time this will take I have created a dump of the given table, loaded it into a local database, deleted the data, rebuilt the index, and ran a full vacuum:
REINDEX TABLE my_schema.my_table;
VACUUM (FULL, VERBOSE, ANALYZE) my_schema.my_table;

To my surprise, both finished quite fast (2 x 30min).
I know to get the exact time required to run these commands on the server I need to backup the filesystem to get the exact same local snapshot as the server and run it on the same hardware. However from my limited understanding because we have never deleted or updated rows in the table the restored local snapshot should be physically very similar to the table on the server. So the operations on the server should take a similar amount of time to finish.
This is not what I observe currently. I have deleted the data and re-indexing took 6x more times than on the local system. Similarly, the vacuum took around 6x times more as well. This is a significant difference that I would have never expected.
My local hardware is similar to the server (16GB vs 20Gb), but with more CPU cores (2vCPU vs i7 8vCPU). I have SSD on my local machine and I don't know what storage the server uses but I would be surprised if it was non-SSD (We are using Azure Single Server for PostgreSQL).
The CPU utilization was below 10% on the server all the time so I think the operation was not CPU bound. (I am just guessing here.)
The table contains 4 indexes: 3 of those a single-column BTREE index with mostly even distribution (date-time, synced source file ID, consumer ID) and a compound index for these 3 together.
Why the difference is so big? Was my local testing flawed?

A:
we have never deleted or updated rows in the table

Then there is typically no reason to run VACUUM FULL at all. Maybe VACUUM (without FULL) is useful. But, typically, that's covered by autovacuum.
REINDEX may be useful. Consider the scenarios listed in the manual here and here. If you create the index after filling the table, REINDEX is certainly wasted.
Not exactly sure where the observed difference comes from. (A hosted service is always a bit of a blackbox.)
Either way, VACUUM FULL rebuilds table and indexes from scratch. An additional REINDEX adds nothing useful over just VACUUM FULL. See:

*

*Do I need to reindex after vacuum full on Postgres 9.4

redpajama_set_name: RedPajamaStackExchange


text:
At Hillary's Request, NY Times Rewrites Story on Calls for Criminal Investigation Over Emailgate
24 Jul, 2015 by	Dave Blount
Looks like Shrillary's sneering contempt for the law might finally catch up with her. But at least she still has the New York Times on her side — to an extent that seems to appall even Politico:
The New York Times made small but significant changes to an exclusive report about a potential criminal investigation into Hillary Clinton's State Department email account late Thursday night, but provided no notification of or explanation for of the changes.
The paper initially reported that two inspectors general have asked the Justice Department to open a criminal investigation "into whether Hillary Rodham Clinton mishandled sensitive government information on a private email account she used as secretary of state."
That clause, which cast Clinton as the target of the potential criminal probe, was later changed: the inspectors general now were asking for an inquiry "into whether sensitive government information was mishandled in connection with the personal email account Hillary Rodham Clinton used as secretary of state."
The Times also changed the headline of the story, from "Criminal Inquiry Sought in Hillary Clinton's Use of Email" to "Criminal Inquiry Is Sought in Clinton Email Account," reflecting a similar recasting of Clinton's possible role. The article's URL was also changed to reflect the new headline.
As of early Friday morning, the Times article contained no update, notification, clarification or correction regarding the changes made to the article.
One of the reporters of the story, Michael Schmidt, explained early Friday that the Clinton campaign had complained about the story to the Times.
"It was a response to complaints we received from the Clinton camp that we thought were reasonable, and we made them," Schmidt said.
The Times deserves some credit for at least reporting on the growing scandal. No doubt they would prefer to ignore the story altogether, but this is too big to keep a lid on.
Shrillary can expect even more favorable treatment from the Injustice Department. Otherwise she might have to conduct her presidential campaign from inside a federal prison — which could jeopardize the follow-through on Obama's fundamental transformation of America.
Via 22Moon.com.
On tips from J, Stormfax, and DinaRehn. Cross-posted at Moonbattery.
Dave Blount
More articles by Dave Blount