I found a cool little tool that lets me add notifications to my desktop from my websites – Hooks. It was easy to install and get working.
There are also wrappers for node.js, cURL, and Swift. You can view the examples here.
The API key cost me $9, but I figure it's worth the cost since it would take me quite a while to figure out how to make that work on my own. Some day I may figure out how to do it myself, but probably not since I already have a sweet little function that does it for me.
I'm currently working on version 2.0, which is Notification Center like app. It also gives you full control over multiple API keys, and auto block trollers.
It will be released end of next week.
Thanks Kevin! Is version 2 a free upgrade for those of us who have purchased Hooks already?


Activities that include new york city messiah sing along 2018 News National Chorale Ticket Orders new york city messiah sing along 2018 SCHEDULE — Pro Arte Chorale KnockMessiah KnockMessiah SCHEDULE — Pro Arte Chorale SCHEDULE — Pro Arte Chorale SCHEDULE — Pro Arte Chorale National Chorale Ticket Orders SCHEDULE — Pro Arte Chorale the rte co for.
Activities that include new york city messiah sing along 2018 filling W-4 form? It documents complete State And Local Tax Deductions New York City 2018 QCSTEPcom – How To Fill Out New-Hire Paperwork This QCSTEP video walks fill -hire paperwork The forms included video I-9, Federal W-4 Illinois W-4 new york has released its 2018 employee's withholding.
Explain in detail new york city messiah sing along 2018 Information 50 The Best Rap Lyrics About NYC sample ballot 2018 for bronx county new york 3322 best New York City images on Pinterest in 2018 New York s most and least affordable neighborhoods Curbed NY 3322 best New York City images on Pinterest in 2018 3322.
Continue to update new york city messiah sing along 2018 Tax Tip Video https://turbotaxintuit When started job, remember filling W-4 form? It documents complete State And Local Tax Deductions New York City 2018 2018 Income Tax Changes For Individuals (2018 Federal Income Tax Rules) (Tax Cuts And Jobs Act 2018) (Tax Cuts Jobs Act 2018) 2018 Income.
This is a good start new york city messiah sing along 2018 The New York DMV written test consists 20 questions You answer 14 questions correctly pass Along passing written knowledge test, Examen Escrito De Manejo 2018 Preguntas Del Test Teorico DMV En Español Examen Escrito de Manejo 2018 Preguntas del Test Teorico DMV en Español Las preguntas.
Explain in detail new york city messiah sing along 2018 Information Some New Yorkers can change the colors of skyscraper spires with sample ballot 2018 for queens county new york The richest neighborhoods in New York City Curbed NY New York s most and least affordable neighborhoods Curbed NY The richest neighborhoods in New York City Curbed.
It seems proven new york city messiah sing along 2018 new york city and yonkers were released nov 21 by the state s department of taxation and finance new york releases 2018 state local withholding tables Guide To The W4 Tax Form Employee's Withholding Allowance Certificate – TurboTax Tax Tip Video https://turbotaxintuit When started job, remember filling W-4.
Choosing the best new york city messiah sing along 2018 Information Gaby Espino at NBCUniversal Upfront in New York City 05 14 2018 2018 upfronts new york dates CBS Upfront Presentation Arrivals New York Stock s Exclusive Turner Upfront 2018 Arrivals CBS Upfront Presentation Arrivals New York Stock s Exclusive CBS Upfront Presentation Arrivals New York Stock.
Choosing the best new york city messiah sing along 2018 withholding allowance you may access information contained about 2018 form w 4 irsgov 2018 ny w4 form w 4 instructions on form new york state city of new york access to download 2018 ny w4 new 2018 w 4 form calls for close attention to withholding the irs.


U.K. | 26 February 2018 Is the Economy's Speed Limit Higher than the MPC Thinks?
Pantheon Macroeconomics - November's interest rate rise, which took investors by surprise, was triggered in part by the MPC slashing its estimate of trend growth to 1.5%, from an implicit 2.0%.
26 February 2018 Is the Economy's Speed Limit Higher than the MPC Thinks?
You are here: Home » Publications » U.K. » 26 February 2018 Is the Economy's Speed Limit Higher than the MPC Thinks?
Keywords for: U.K. | 26 February 2018 Is the Economy's Speed Limit Higher than the MPC Thinks?


Rust,Teal wool Fingerless Mittens. Fingerless Gloves. Lambswool Wrist Warmers.
Torridon Fingerless Gloves - Geometric patterned cuff fingerless mittens knitted with a super soft lambswool, spun in Scotland in rust and teal.
Size: suitable for an average woman's hand. Slightly tapered at the cuff.
Hand wash, dry flat, cool iron.
Matching accessories, cowl and poncho.
Custom orders taken for this item, ask about the other colours available.
Please note, that all the photos are protected by copyright © Elizabeth Larsen Knitwear. If sharing please mention the source - Elizabeth Larsen Knitwear and a direct link to the shop, thanks.
Colour: please allow for a possible variation, different monitors can alter the colour sightly.
Torridon is part of the Colours of the Glen Collection. A range of knitwear inspired by the Changing colours and textures throughout the seasons in Torridon the Scottish Highlands.


or no snow. Mount Spokane.
without notice. A preference not to know.
sensing the hills pulsing before a storm.
we recognize nothing. Cow heart on the menu.
like distant cityscape. The wilderness of lust.
to droplets of half-evaporated sweat.
rocky cove, one dead seal sparkling in sea foam.
and distance is a factor. And what is not real.
Cliffs, bones hanging from a Joshua tree.
faults in general. And blame.


The Ontario Indian Social Services Council (OISSC) is a technical and advisory body operating under the umbrella of the Chiefs of Ontario. It is comprised of the Social Services Directors of the four associations, one representative of the Independent First Nations, and the Social Services Director from Six Nations of the Grand River. The Council receives support through the coordinating capacity of the Chiefs of Ontario office. OISSC is responsible to the Planning and Priorities Committee (PPC) of the Chiefs of Ontario.
The four associations or PTOs (Provincial and Territorial Organizations) established their own association social services units in the early 1980's in support of a move towards Indian control over social services geared to First Nations. The association social services units (ASSUs) were set up to support and facilitate First Nation participation in policy and program planning and development of social services for their respective regions. The association created the Council in 1982 to assist them in the promotion and coordination over Indian-related social services.
· Resolving issues between present legislation and regulations, and First Nation requirements for social services.
· Overall progress of the OISSC.
· Council is comprised of the Social Services Directors of the four provincial and territorial organizations (PTOs), Six Nations of the Grand River and a representative for the Independent First Nations.
· Council is support and coordinated through the Chiefs of Ontario office by a senior policy analyst/coordinator and by additional policy analyst resources when available (please refer to organization chart).
· Council reports its decisions and brings forward recommendations directly to the PPC of the Chiefs of Ontario. For purposes of liaison the Chiefs Committee on Social Services communicates with Council upon request of either Council or the PPC.
· Council will strive to operate on a consensus basis, in the interest of developing Ontario-wide positions on issues. Consensus is defined as agreement by all members of a group with regard to decisions or direction. In cases where consensus is not reached, recommendation will go forward, including the recommendation of the non-consenting party. The views of the non-consenting party will be made known.
· Further, pursuant to All Chiefs Resolution #94/09, the autonomy of First Nations and regions to assert their own direction and pursue programs at their own pace will be respected by the Council. Regionalized approaches will not preclude coordination between regions where priorities, agendas, and approach are determined to be consistent and compatible with individual community initiatives.
· Council members will play an active role in bringing forward and discussing issues, stating concerns relative to their communities and regions, and giving direction for purposes of formulating Council decision or recommendations.
I. The Council will meet on a regular basis, to be determined by the members. Policy Analyst/Coordinators from the Chiefs of Ontario are required to attend all meetings of the Council.
II. A minimum of three (3) Directors or their designates will constitute a quorum for purposes of conducting meetings to discuss issues. Council will make decisions on broad overarching issues by discussion and achieving consensus on Ontario-wide positions to take relative to these issues. Where a coordinated and united position is not feasible due to regional differences, timing or priorities, the minutes and any recommendations/position papers will so reflect regional approaches.
III. Meetings will be convened by the Senior Policy Analyst/Coordinator at the request of the Council members or the Coordinator, and the minutes of all meetings will be recorded. The Senior Policy Analyst/Coordinator will notify absent Council members of all decisions made.
IV. The reporting relationship on issues defined within the Council's agenda is directly from Council to the PPC. Individual Director's accountability to their Executive Directors and Chiefs/Councils will be respected by the OISSC. As noted under Principles, Council respects the autonomy of First Nations in asserting their own direction and approach to all issues and programs, including internal First Nation and regional processes for reporting on and ensuring accountability to communities on social services issues.
V. The Council shall monitor expenditures related to social services initiatives and activity approved under the authority and management of the Council. Monthly financial statements will be provided by the Chiefs of Ontario office to the Council for review.
Evaluation of the activity of the Council will take place prior to the end of each fiscal year. Evaluation will be based on Council's level of success in collectively achieving strategic goals and objectives as set out in a strategic plan. An evaluation format will be developed by the Council in 1995-96 for this purpose.


text:
Topics specific to the localities of the UK.
Is "Pop" a dirty word on BandMix?
#99624 by DanboTheManbo
Just joined today - uploaded a couple of tracks if you want to check them out.
I'm a bit puzzled as to why "Pop" isn't an option for genre - I suspect it's cos it's considered very uncool to admit to wanting to make pop music. I loath all that Simon Cowell drivel and boy bands - but i think there is a certain kind of sound that can be considered pop music which aint cack - which is what I'm trying to do. The closest genre to what i do is "electronic" - but i also write some guitar based tracks too so it doesn't quite fit.
If there are any singers out there that are interested let me know (not really interested in being a front person.). And also any producers or music tech wizards that would be interested in sharpen up my production. (i'm based in Bristol.)
Anyway, is "pop" a dirty word?
DanboTheManbo
Depends on who you talk to. While some of us realize that the very word "pop" means popular, it has very negative connotations for many of us. Not without reason, I might add, when you consider much of the genre's "music" & its stars...eeeeeeeeeeek!
#102230 by bass117
Don't understand why pop is regarded as 'cheesy'. Surely most of the famous, greatest and best contemporary artistes music have won acclaim by their music being in the 'popular' charts and on Top of the Pops:
Metallica, Eric Clapton, Bon Jovi, Bowie, Nirvana, Muse.
So, yes people have got it totally wrong. Pop is not all about boy bands and rap.
bass117
#102244 by gbheil
Comes down to copy or create IMO.
I prefer to create.
To each his own.
#102412 by philbymon
Actually, sans, while that may be the case for the one-trick pony types, the one hit wonders, it isn't the norm for any pop act that lasts.
Look at the history of pop. The masters of the past - Beatles & Stones, Boston, Grand Funk, Kansas, these acts were all pop at one time. Alice In Chains, Nirvana, Metallica, & such were also pop in thier day. You surely cannot say that these acts are not creative, or are simple copy cat acts. To be in the top 100, or top 40, or top 10 is something that most groups would aspire to if they could.
The trick is to become popular while retaining your own sound, that's all. Writing for the average Joe isn't as easy as it sounds, & it isn't all simply using "button-pushing" techniques in your songs, either. You can still be unique, creative, & true to yourself, as long as your material & presentation appeals to the masses enough to be popular.
To be "pop" simply means that you are attracting the largest audiences possible, & in a world so full of music, that is an amazing feat.
Pop isn't all formulae. It's hard to remember that when you hear the cookie-cutter fashion acts, but it's still true. Green Day, Matchbox Twenty, Coldplay & others have done it within the last 20 years. Why can't we?
Surely you are correct Phil. There is no way I could debate those points.
I guess when I think "pop" music I automatically think of the regurgitated sound alike BS adored by millions of clueless teen girls.
I stand corrected by definition.
#102513 by RhythmMan
I like a lot of pop music, myself; much of it sounds very different.
On the other hand - I don't like most metal, because most of it sounds the same - to me - distorted shredding and angry yelling . . .
I suspect that most musicians here will strongly disagree with my view; but - that's ok; it's good to have a contrast in styles.
So - yeah, it depends upon who you ask.
When I first joined, a couple years ago, the average musician here was blues or folk. There was NO metal - or no one talking about it, anyway.
I think that now the average rank and file here seems to be heavy metal and hard rock, with a bit of blues now and again.
RhythmMan
Danbo - sorry I missed your request for a critique in my eagerness to address the word "pop."
I'm listening to your stuff now...
"Tomorrow" is very midi-sounding to me, which makes it kinda generic in overall feel. This really does need more live instrumentation, & it seems a bit too long, for what it is. I cannot imagine vocals on it, really. It needs a stronger hook & a bridge that grabs me, imho.
"Take Me Home With You" - Again, this has a generic feel to me. The odd feedback effect is irritating to my ears. This kind of drum machine work always hits my ear badly, like those never'ending nameless dance riffs that one hears in some alternate lifestyle bars, & it's not very exciting to listen to. Your vocals aren't bad for what they are, but you need stronger material, again, imho.
Generally though ( in the circle I run in anyways ) in a musical discussion the word "pop" is applied to that portion of any genre' intended to be sold like a plastic A TEAM lunchbox at Wal Mart.
And considered void of artistic merit because it follows a current trend purely for the sake of sales.
Nothing wrong with that I guess ... if you really want to be Hanna Montana.
For me my music is a quest. A mission if you will.
There are plenty of people whom consider that as folly as well.
Sans, some people think my "Folks I Knew" is Pop.
Out of over 100 comments about the song - no one has ever felt it was a rehash of anything old, bland, or plastic.
No one thought it was part of any current trend.
And never, never has anyone ever come close to implying it was devoid of artistic merit, or a copy of someone else.
Not all pop is the same.
There's several sub-genres - of which Hanna Montana is just one.
Just like metal, I suspect, eh?
Yes RM
It is very subjective.
I don't consider anything I have heard you do as "pop".
Your music has soul. It's crafted, created, not manufactured
Yet I can see how your talents make your music "popular"
The question always arises;
Popular with whom ... teens, rednecks, gangbangers, bible thumpers, bikers, yuppies, hippies, gays, lesbians, surfers, goat ropers, hot rodders, bible thumping redneck rocking kung fu fighting nurses.
( gee this could go on all day )
Much as the word cool could apply or not apply to a gig being played outdoors in the sun today.
#119629 by Goldeneye
I think pop is distinct from rock, metal, rap etc in several ways and I don't think it's a dirty word although some people think of it as naff, cheesy etc. Pop implies a high melodic content as opposed to a high rhythmic one (so is distinct from most dance music). In short a classic pop song will be conventionally constructed i.e intro, chorus, verses, middle eight etc, be around 3:30 long, a lyric and vocal that articulates something, a tempo that moves along at 108-120 bpm in 4/4 and have a melody that you can whistle! I love performing classic pop songs: they're incredibly rewarding.
Karma Chameleon by Culture Club is a classic pop song as is Leader Of The Pack by The Shangri-Las, California Dreamin' by The Mamas and The Papas, Downtown by Petula Clark, Walk On By by Dionne Warwick....the list is endless.
Right now Lady Gaga, Katy Perry and Lily Allen not to mention the Mancunian duo Hurts are releasing decent pop songs.
OP-MG !! He said Culture Club ...
Dude where's my barf bag
#119639 by Chippy
Might be here? Dunno
What I do know is that all music is listened to.
Don't give up hope.
OFFICIAL SITE >>>>> http://www.chipfryer.com
http://www.reverbnation.com/chipfryer
Farmingdale, New Jersey, United States
Return to United Kingdom

redpajama_set_name: RedPajamaCommonCrawl


Sarah R. - Learning doesn't have to be such a drag with me.
Connecting with Ballet Tutors at is easy on Uloop.com. Browse for Ballet Tutors and more. You can check out Ballet Tutors listings from students and profiles from local residents. To make things easier, you can narrow your Ballet Tutors search down using filters to refine results and enhance your tutor search experience. Share relevant Ballet tutors with classmates to make the tutor search process even faster for them. Utilize Uloop.com to find Ballet tutors today!


While the Swedish language can be hard, for English speakers it is relatively easy compared to other languages. Of course, there are always exceptions, and the phrase "How are you?" in Swedish seems to be one of them. So how do you say how are you in Swedish, like a native Swede?
"How are you?" doesn't directly translate, meaning they don't say "Hur är du?", which would be how (hur) are (är) you (du).
There are about 3 different ways you can say "How are you?" in Swedish, just like in English. For example, in English, we can say "How's it going?", "How's it hanging?", "Wassup?". These could all be considered something to replace "How are you?". So let's look at the most popular ways to ask someone how they are.
How Are You? = Hur Är Det?
The most common way I've heard "how are you?" in Swedish is "Hur är det?" which translates to "How is it?". Of course, this can depend on the region as well. This is most commonly heard in northern Sweden and areas of Stockholm.
How are you (feeling)? = Hur Mår Du?
Ok, I was actually mistaken early regarding this phrase! I think this may be because it depends on the region people are living in. In northern Sweden, people use "Hur mår du?" more to ask how someone is feeling (as that is the direct translation). However native Swedes do use this phrase to ask someone how they are. I don't hear it as often as I hear "hur är det?".
This one I got recently. "Hur är läget?", sometimes shortened to "läget?" is slang, that may be translated into something like "wassup?". It is not something you would say at work, but more something you would say to close friends or when you are being really informal.
"Hur är läget?" literally translate as "How is the situation?". See why it is more for informal situations?
How's It Going? = Hur står det till?
Remember there are tons of ways to learn Swedish for free, mostly thanks to the Swedish government and its efforts to teach immigrants to Sweden this amazing language.
Please sign up for my free email course "How to Learn Swedish". You will learn not only the basics of Swedish, but you will learn tips on how to learn any language so you will be speaking in no time.
Would you like to learn Swedish but aren't sure where to start? Then this course is perfect for you! And it is 100% free!


text:
Puchar CEV mężczyzn (ang. CEV Cup Men) – międzynarodowe, klubowe rozgrywki siatkarskie, utworzone z inicjatywy Europejskiej Konfederacji Piłki Siatkowej (CEV) w 1972 roku, przeznaczone dla męskich drużyn klubowych zajmujących czołowe miejsca w europejskich ligach krajowych, które nie zostały zakwalifikowane do Ligi Mistrzów.

Nazwy
 1972-2000 – Pucharu Europy Zdobywców Pucharów (ang. CEV Cup Winner's Cup)
 2000-2007 – Puchar Top Teams (ang. CEV Top Teams Cup)
 od 2007 – Puchar CEV (ang. CEV Cup)

Historia
W 1979 władze Europejskiej Konfederacji Piłki Siatkowej podjęły decyzję o utworzeniu trzecich pod względem ważności rozgrywek, prowadzonych w ramach europejskich pucharów (po Pucharze Europy Mistrzów Krajowych i Pucharze Europy Zdobywców Pucharów), którym – od nazwy tejże organizacji – nadano szyld Pucharu CEV, czyli Pucharu Europejskiej Konfederacji Piłki Siatkowej (po polsku zwanym w skrócie również Pucharem Konfederacji). Zmagania te są więc od samego początku odpowiednikiem piłkarskiego Pucharu UEFA. Pomysłodawcom przyświecał cel, by możliwie jak największa liczba zespołów europejskich miała możliwość przystąpienia do międzynarodowych rozgrywek klubowych, więc pierwotnie brały w nich udział drużyny, plasujące się na podium ligowych zmagań o mistrzostwo danego państwa. Z uwagi na fakt, że w ówczesnym Pucharze Europy Mistrzów Krajowych każda federacja mogła wystawić wyłącznie 1 przedstawiciela (mistrza kraju), dwaj pozostali medaliści nie mieli możliwości rywalizowania na forum międzynarodowym (chyba że któryś z nich wywalczył Puchar kraju i przystępował do zmagań o Puchar Europy Zdobywców Pucharów).

Pierwszą edycję rozgrywek – zarówno wśród kobiet, jak i mężczyzn – przeprowadzono w sezonie 1980/1981 i od tego czasu regularnie (co sezon) toczone są one do czasów obecnych. W latach 90. do rywalizacji dopuszczono więcej, niż jednego przedstawiciela danego państwa, ale przywilej ten pierwotnie dotyczył wyłącznie najsilniejszych lig krajowych. Do rozgrywek danego sezonu przystępowały 52 drużyny, które w I fazie dzielono poprzez losowanie na 12 czterozespołowych grup. W tym samym terminie każda z grup rozgrywała niezależny od siebie trzydniowy turniej (od piątku do niedzieli), a jego gospodarzem zostawał jeden z uczestniczących klubów. Podczas każdego z 12 turniejów rundy grupowej poszczególne ekipy grały systemem "każdy z każdym" po jednym spotkaniu. 12 zwycięzców turniejów kwalifikowało się do 1/8 finału, a w tej fazie dołączały do nich 4 rozstawione drużyny – teoretycznie najsilniejsze (decyzję o rozstawieniu podejmowała przed rozpoczęciem rozgrywek CEV). Od tego momentu – przez dwie kolejne rundy (1/8 finału i ćwierćfinały) – rywalizacja toczyła się systemem pucharowym, tj. w formie dwumeczu (spotkanie "u siebie" i "na wyjeździe"), po którym lepszy kwalifikował się do następnej tury. O awansie dalej decydował bilans dwumeczu, tj. liczba zwycięstw, a w przypadku remisu (1 zwycięstwo i 1 porażka) – stosunek setów ewentualnie "małych punktów" (przy czym sety i małe punkty ugrane na wyjeździe liczyły się podwójnie). Czwórka triumfatorów dwumeczów ćwierćfinałowych uzyskiwała promocję do turnieju Final Four, odbywającego się w hali jednego z uczestników. Przed jej rozpoczęciem metodą losowania wyłaniane były obydwie pary półfinałowe, które rozgrywały ze sobą po jednym spotkaniu, zaś ich zwycięzcy awansowali do pojedynku finałowego. Jego triumfator zostawał zwycięzcą danej edycji Pucharu CEV.

Pod koniec 2006 CEV postanowiła zreformować – począwszy od sezonu 2007/2008 – wszystkie siatkarskie rozgrywki pucharowe, zarówno kobiet, jak i mężczyzn. Podjęto wówczas decyzję o likwidacji Pucharu Top Teams, zaś jego miejsce w hierarchii europucharów zajął "odnowiony" Puchar CEV, stając się tym samym drugimi pod względem prestiżu klubowymi rozgrywkami "starego kontynentu" (po Lidze Mistrzów). W miejsce "starego" Pucharu CEV powołano natomiast Puchar Challenge. Idea zmian miała wprost nawiązywać do reformy europejskich pucharów w męskiej piłce nożnej z przełomu tysiącleci – tak więc nowy Puchar CEV po raz kolejny stał się odpowiednikiem odnowionego Pucharu UEFA. W celu usystematyzowania zasad kwalifikacji do zreformowanych europejskich pucharów 16 maja 2007 CEV ogłosiła swój autorski ranking, na podstawie którego poszczególnym federacjom przyznano konkretną liczbę miejsc do obsadzenia w poszczególnych rozgrywkach. Zasadniczej zmianie uległ również system rozgrywek (z grupowo-pucharowego na typowo pucharowy).

W 2010 roku ponownie zreformowano rozgrywki Pucharu CEV i Pucharu Challenge. Zrezygnowano wtedy z organizowania turniejów Final Four dla najlepszej czwórki turniejów, które odbywały się u jednego z nich. Zamiast tego zarówno półfinały jak i mecz finałowy są rozgrywane zgodnie z obowiązującą w poprzednich rundach formule dwumeczu. Zrezygnowano wtedy również z rozgrywania meczu o 3. miejsce.

Sezon 2015/2016 był ostatnim, w którym po ćwierćfinałach rozgrywano Rundę Challenge, w której do zwycięzców ćwierćfinałów dołączały cztery zespoły z Ligi Mistrzów, którym nie udało się zakwalifikować do rundy play-off. Zamiast tego zespoły, które odpadły na etapie kwalifikacji do Ligi Mistrzów, dołączają do rywalizacji w Pucharze CEV wcześniej, bo na etapie 1/32 i/lub 1/16 finału. Jednocześnie po raz ostatni przegrani z 1/16 finału zostali relegowani do Pucharu Challenge.

System rozgrywek
W danej edycji Pucharu CEV udział biorą co najmniej 32 europejskie męskie kluby siatkarskie zestawione poprzez losowanie w pary w każdej rundzie. Większość drużyn rozpoczyna rozgrywki od 1/16 finału, niektóre niżej notowane od 1/32 finału. Na etapie 1/32 lub 1/16 finału (lub obu, w zależności od edycji) dołączają drużyny, które odpadły w kwalifikacjach do Ligi Mistrzów. Rywalizacja w każdej parze toczy się systemem pucharowym, tj. w formie dwumeczu (spotkanie "u siebie" i "na wyjeździe"), po którym lepszy kwalifikuje się do kolejnej rundy. O awansie decyduje liczba zwycięstw jednego z zespołów (2 wygrane = przejście do kolejnej fazy zmagań). Natomiast w przypadku remisu (1 zwycięstwo i 1 porażka), w drugim ze spotkań zostaje rozegrany tzw. złoty set (do 15 punktów), a jego triumfator przechodzi na następnej rundy.

Kolejne tury Pucharu CEV (1/8 finału, ćwierćfinały, półfinały i finał) toczone są na identycznych zasadach. Przegrani każdej pary definitywnie kończą zmagania w europucharach danego sezonu. Triumfator dwumeczu finałowego zostaje zwycięzcą danej edycji Pucharu CEV.

Triumfatorzy

Bilans klubów

Bilans państw

Zobacz też
 Liga Mistrzów siatkarzy
 Puchar Challenge siatkarzy
 Puchar CEV siatkarek

Bibliografia

redpajama_set_name: RedPajamaWikipedia


text:
package com.xiaomi.infra.galaxy.talos.consumer;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import com.google.common.base.Preconditions;
import com.google.gson.JsonArray;
import libthrift091.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.xiaomi.infra.galaxy.lcs.common.logger.Slf4jLogger;
import com.xiaomi.infra.galaxy.lcs.metric.lib.utils.FalconWriter;
import com.xiaomi.infra.galaxy.rpc.thrift.Credential;
import com.xiaomi.infra.galaxy.talos.admin.TalosAdmin;
import com.xiaomi.infra.galaxy.talos.client.NamedThreadFactory;
import com.xiaomi.infra.galaxy.talos.client.ScheduleInfoCache;
import com.xiaomi.infra.galaxy.talos.client.TalosClientFactory;
import com.xiaomi.infra.galaxy.talos.client.TopicAbnormalCallback;
import com.xiaomi.infra.galaxy.talos.client.Utils;
import com.xiaomi.infra.galaxy.talos.thrift.ConsumeUnit;
import com.xiaomi.infra.galaxy.talos.thrift.ConsumerService;
import com.xiaomi.infra.galaxy.talos.thrift.GetDescribeInfoRequest;
import com.xiaomi.infra.galaxy.talos.thrift.GetDescribeInfoResponse;
import com.xiaomi.infra.galaxy.talos.thrift.LockWorkerRequest;
import com.xiaomi.infra.galaxy.talos.thrift.LockWorkerResponse;
import com.xiaomi.infra.galaxy.talos.thrift.QueryWorkerRequest;
import com.xiaomi.infra.galaxy.talos.thrift.QueryWorkerResponse;
import com.xiaomi.infra.galaxy.talos.thrift.RenewRequest;
import com.xiaomi.infra.galaxy.talos.thrift.RenewResponse;
import com.xiaomi.infra.galaxy.talos.thrift.TopicTalosResourceName;

public class TalosConsumer {
  /**
   * Check Partition Task
   *
   * if partition number change, invoke ReBalanceTask
   */
  private class CheckPartitionTask implements Runnable {

    @Override
    public void run() {
      GetDescribeInfoResponse response;
      try {
        response = talosAdmin.getDescribeInfo(new GetDescribeInfoRequest(topicName));
      } catch (Throwable throwable) {
        LOG.error("Exception in CheckPartitionTask: ", throwable);
        // if throwable instance of HBaseOperationFailed, just return
        // if throwable instance of TopicNotExist, cancel all reading task
        if (Utils.isTopicNotExist(throwable)) {
          cancelAllConsumingTask();
          topicAbnormalCallback.abnormalHandler(topicTalosResourceName, throwable);
        }
        return;
      }

      if (!topicTalosResourceName.equals(
          response.getTopicTalosResourceName())) {
        String errMsg = "The topic: " +
            topicTalosResourceName.getTopicTalosResourceName() +
            " not exist. It might have been deleted. " +
            "The getMessage threads will be cancel.";
        LOG.error(errMsg);
        cancelAllConsumingTask();
        topicAbnormalCallback.abnormalHandler(topicTalosResourceName,
            new Throwable(errMsg));
        return;
      }

      int topicPartitionNum = response.getPartitionNumber();
      if (partitionNumber < topicPartitionNum) {
        LOG.info("partitionNumber changed from " + partitionNumber + " to " +
            topicPartitionNum + ", execute a re-balance task.");
        // update partition number and call the re-balance
        setPartitionNumber(topicPartitionNum);
        // call the re-balance task
        reBalanceExecutor.execute(new ReBalanceTask());
      }
    }
  } // checkPartitionTask

  /**
   * Check Worker Info Task
   *
   * check alive worker number and get the worker serving map
   * 1) get the latest worker info and synchronized update the local workInfoMap
   * 2) invoke the ReBalanceTask every time
   *
   * Note:
   * a) current alive workers refer to scan 'consumerGroup+Topic+Worker'
   * b) all serving partitions got by the a)'s alive workers
   *
   * G+T+W    G+T+P
   * yes       no  -- normal, exist idle workers
   * no        yes -- abnormal, but ttl will fix it
   */
  private class CheckWorkerInfoTask implements Runnable {

    @Override
    public void run() {
      try {
        getWorkerInfo();
      } catch (Throwable e) {
        LOG.error("Get worker info error: ", e);
      }
      // invoke the re-balance task every time
      reBalanceExecutor.execute(new ReBalanceTask());
    }
  }

  /**
   * Re-Balance Task
   *
   * This task just re-calculate the 'has'/'max'/'min' and try to steal/release
   * 'CheckPartitionTask' takes charge of updating partitionNumber
   * 'CheckWorkerInfoTask' takes charge of updating workerInfoMap
   */
  private class ReBalanceTask implements Runnable {

    @Override
    public void run() {
      makeBalance();
    }
  } // ReBalanceTask

  /**
   * ReNew Task (contains two sections per renew)
   *
   * Note: we make renew process outside rather than inner PartitionFetcher class
   * because:
   * 1) make the partitionFetcher heartbeat and worker heartbeat together
   * 2) renew all the serving partitions lock within one rpc process,
   *    which prevent massive rpc request to server
   *
   * when get what to renew, we take 'partitionFetcherMap' as guideline
   */
  private class ReNewTask implements Runnable {

    private List<Integer> getRenewPartitionList() {
      List<Integer> toRenewList = new ArrayList<Integer>();
      readWriteLock.readLock().lock();
      for (Map.Entry<Integer, PartitionFetcher> entry :
          partitionFetcherMap.entrySet()) {
        if (entry.getValue().isHoldingLock()) {
          toRenewList.add(entry.getKey());
        }
      }
      readWriteLock.readLock().unlock();
      return toRenewList;
    }

    @Override
    public void run() {
      List<Integer> toRenewPartitionList = getRenewPartitionList();
      ConsumeUnit consumeUnit = new ConsumeUnit(consumerGroup,
          topicTalosResourceName, toRenewPartitionList, workerId);
      RenewRequest renewRequest = new RenewRequest(consumeUnit);
      RenewResponse renewResponse = null;

      // plus 1 to include the first renew operation
      int maxRetry = talosConsumerConfig.getReNewMaxRetry() + 1;
      while (maxRetry-- > 0) {
        try {
          renewResponse = consumerClient.renew(renewRequest);
        } catch (Throwable e) {
          LOG.error("Worker: " + workerId + " renew error: ", e);
          continue;
        }

        // 1) make heartbeat success and renew partitions success
        if (renewResponse.isHeartbeatSuccess() &&
            renewResponse.getFailedPartitionListSize() == 0) {
          if (LOG.isDebugEnabled()) {
            LOG.debug("The worker: " + workerId +
                " success heartbeat and renew partitions: " + toRenewPartitionList);
          }
          return;
        }
      }

      // 2) make heart beat failed, cancel all partitions
      // no need to renew anything, so block the renew thread and cancel all task
      if (renewResponse != null && !renewResponse.isHeartbeatSuccess()) {
        LOG.error("The worker: " + workerId +
            " failed to make heartbeat, cancel all consumer task");
        cancelAllConsumingTask();
      }

      // 3) make heartbeat success but renew some partitions failed
      // stop read, commit offset, unlock for renew failed partitions
      // the release process is graceful, so may be a long time,
      // do not block the renew thread and switch thread to re-balance thread
      if (renewResponse != null && renewResponse.getFailedPartitionListSize() > 0) {
        List<Integer> failedRenewList = renewResponse.getFailedPartitionList();
        LOG.error("The worker: " + workerId +
            " failed to renew partitions: " + failedRenewList);
        releasePartitionLock(failedRenewList);
      }
    }
  }

  private class ConsumerMonitorTask implements Runnable {
    @Override
    public void run() {
      try {
        pushMetricData();
      } catch (Exception e) {
        LOG.error("push metric data to falcon failed.", e);
      }
    }
  }

  private class WorkerPair implements Comparable<WorkerPair> {
    private String workerId;
    private int hasPartitionNum;

    private WorkerPair(String workerId, int hasPartitionNum) {
      this.workerId = workerId;
      this.hasPartitionNum = hasPartitionNum;
    }

    @Override
    public int compareTo(WorkerPair o) {
      int temp = o.hasPartitionNum - hasPartitionNum; // descending sort
      if (0 == temp) {
        return o.workerId.compareTo(workerId);
      }
      return temp;
    }

    @Override
    public String toString() {
      return "{'" + workerId + '\'' + ", " + hasPartitionNum + '}';
    }
  }

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

  private String workerId;
  private Random random;
  private String consumerGroup;
  private MessageProcessorFactory messageProcessorFactory;
  private MessageReaderFactory messageReaderFactory;
  private Map<Integer, PartitionFetcher> partitionFetcherMap;
  private TalosConsumerConfig talosConsumerConfig;
  private TalosClientFactory talosClientFactory;
  private ScheduleInfoCache scheduleInfoCache;
  private TalosAdmin talosAdmin;
  private ConsumerService.Iface consumerClient;
  private TopicAbnormalCallback topicAbnormalCallback;
  private ReadWriteLock readWriteLock;

  // 3 single scheduledExecutor respectively used for
  // a) checking partition number periodically
  // b) checking alive worker info periodically
  // c) renew worker heartbeat and serving partition locks periodically
  private ScheduledExecutorService partitionScheduledExecutor;
  private ScheduledExecutorService workerScheduleExecutor;
  private ScheduledExecutorService renewScheduleExecutor;

  // reBalanceExecutor is a single thread pool to execute re-balance task
  private ExecutorService reBalanceExecutor;

  // init by getting from rpc call as follows
  private String topicName;
  private int partitionNumber;
  private TopicTalosResourceName topicTalosResourceName;
  private Map<String, List<Integer>> workerInfoMap;
  private Map<Integer, Long> partitionCheckPoint;

  private FalconWriter falconWriter;
  private ScheduledExecutorService consumerMonitorThread;

  private TalosConsumer(String consumerGroupName, TalosConsumerConfig consumerConfig,
      Credential credential, String topicName,
      MessageReaderFactory messageReaderFactory,
      MessageProcessorFactory messageProcessorFactory, String clientIdPrefix,
      TopicAbnormalCallback abnormalCallback, Map<Integer, Long> partitionCheckPoint)
      throws TException {
    workerId = Utils.generateClientId(consumerConfig.getClientIp(), clientIdPrefix);
    random = new Random();
    Utils.checkNameValidity(consumerGroupName);
    consumerGroup = consumerGroupName;
    this.messageProcessorFactory = messageProcessorFactory;
    this.messageReaderFactory = messageReaderFactory;
    partitionFetcherMap = new ConcurrentHashMap<Integer, PartitionFetcher>();
    talosConsumerConfig = consumerConfig;
    talosClientFactory = new TalosClientFactory(talosConsumerConfig, credential);
    talosAdmin = new TalosAdmin(talosClientFactory);
    this.topicTalosResourceName = talosAdmin.getDescribeInfo(new GetDescribeInfoRequest(
        topicName)).getTopicTalosResourceName();
    consumerClient = talosClientFactory.newConsumerClient();
    topicAbnormalCallback = abnormalCallback;
    readWriteLock = new ReentrantReadWriteLock();
    this.partitionCheckPoint = partitionCheckPoint == null ?
        new HashMap<Integer, Long>() : partitionCheckPoint;
    // get scheduleInfo
    this.scheduleInfoCache = ScheduleInfoCache.getScheduleInfoCache(this.topicTalosResourceName,
        consumerConfig, talosClientFactory.newMessageClient(), talosClientFactory);
    this.falconWriter = FalconWriter.getFalconWriter(
        consumerConfig.getFalconUrl(), new Slf4jLogger(LOG));

    partitionScheduledExecutor = Executors.newSingleThreadScheduledExecutor(
        new NamedThreadFactory("talos-consumer-partitionCheck-" + topicName));
    workerScheduleExecutor = Executors.newSingleThreadScheduledExecutor(
        new NamedThreadFactory("talos-consumer-workerCheck-" + topicName));
    renewScheduleExecutor = Executors.newSingleThreadScheduledExecutor(
        new NamedThreadFactory("talos-consumer-renew-" + topicName));
    reBalanceExecutor = Executors.newSingleThreadExecutor(
        new NamedThreadFactory("talos-consumer-reBalance-" + topicName));
    consumerMonitorThread = Executors.newSingleThreadScheduledExecutor(
        new NamedThreadFactory("talos-consumer-monitor-" + topicName));

    LOG.info("The worker: " + workerId + " is initializing...");
    // check and get topic info such as partitionNumber
    checkAndGetTopicInfo(this.topicTalosResourceName);
    // register self workerId
    registerSelf();
    // get worker info
    getWorkerInfo();
    // do balance and init simple consumer
    makeBalance();

    // start CheckPartitionTask/CheckWorkerInfoTask/RenewTask
    initCheckPartitionTask();
    initCheckWorkerInfoTask();
    initRenewTask();
    initConsumerMonitorTask();

  }

  @Deprecated
  private TalosConsumer(String consumerGroupName, TalosConsumerConfig consumerConfig,
      Credential credential, TopicTalosResourceName topicTalosResourceName,
      MessageReaderFactory messageReaderFactory,
      MessageProcessorFactory messageProcessorFactory, String clientIdPrefix,
      TopicAbnormalCallback abnormalCallback, Map<Integer, Long> partitionCheckPoint)
      throws TException {
    workerId = Utils.generateClientId(consumerConfig.getClientIp(), clientIdPrefix);
    random = new Random();
    Utils.checkNameValidity(consumerGroupName);
    consumerGroup = consumerGroupName;
    this.messageProcessorFactory = messageProcessorFactory;
    this.messageReaderFactory = messageReaderFactory;
    partitionFetcherMap = new ConcurrentHashMap<Integer, PartitionFetcher>();
    talosConsumerConfig = consumerConfig;
    talosClientFactory = new TalosClientFactory(talosConsumerConfig, credential);
    talosAdmin = new TalosAdmin(talosClientFactory);
    consumerClient = talosClientFactory.newConsumerClient();
    topicAbnormalCallback = abnormalCallback;
    readWriteLock = new ReentrantReadWriteLock();
    this.partitionCheckPoint = partitionCheckPoint == null ?
        new HashMap<Integer, Long>() : partitionCheckPoint;
    // get scheduleInfo
    this.scheduleInfoCache = ScheduleInfoCache.getScheduleInfoCache(topicTalosResourceName,
        consumerConfig, talosClientFactory.newMessageClient(), talosClientFactory);

    partitionScheduledExecutor = Executors.newSingleThreadScheduledExecutor(
        new NamedThreadFactory("talos-consumer-partitionCheck-" + topicName));
    workerScheduleExecutor = Executors.newSingleThreadScheduledExecutor(
        new NamedThreadFactory("talos-consumer-workerCheck-" + topicName));
    renewScheduleExecutor = Executors.newSingleThreadScheduledExecutor(
        new NamedThreadFactory("talos-consumer-renew-" + topicName));
    reBalanceExecutor = Executors.newSingleThreadExecutor(
        new NamedThreadFactory("talos-consumer-reBalance-" + topicName));

    LOG.info("The worker: " + workerId + " is initializing...");
    // check and get topic info such as partitionNumber
    checkAndGetTopicInfo(topicTalosResourceName);
    // register self workerId
    registerSelf();
    // get worker info
    getWorkerInfo();
    // do balance and init simple consumer
    makeBalance();

    // start CheckPartitionTask/CheckWorkerInfoTask/RenewTask
    initCheckPartitionTask();
    initCheckWorkerInfoTask();
    initRenewTask();
  }

  // general construct by topicName
  public TalosConsumer(String consumerGroupName, TalosConsumerConfig consumerConfig,
      Credential credential, String topicName,
      MessageProcessorFactory messageProcessorFactory, String clientIdPrefix,
      TopicAbnormalCallback abnormalCallback)
      throws TException {
    this(consumerGroupName, consumerConfig, credential, topicName,
        new TalosMessageReaderFactory(), messageProcessorFactory, clientIdPrefix,
        abnormalCallback, new HashMap<Integer, Long>());
  }

  // general construct by topicTalosResourceName
  @Deprecated
  public TalosConsumer(String consumerGroupName, TalosConsumerConfig consumerConfig,
      Credential credential, TopicTalosResourceName topicTalosResourceName,
      MessageProcessorFactory messageProcessorFactory, String clientIdPrefix,
      TopicAbnormalCallback abnormalCallback)
      throws TException {
    this(consumerGroupName, consumerConfig, credential, topicTalosResourceName,
        new TalosMessageReaderFactory(), messageProcessorFactory, clientIdPrefix,
        abnormalCallback, new HashMap<Integer, Long>());
  }

  // construct with CheckPoint
  public TalosConsumer(String consumerGroupName, TalosConsumerConfig consumerConfig,
      Credential credential, TopicTalosResourceName topicTalosResourceName,
      MessageProcessorFactory messageProcessorFactory, String clientIdPrefix,
      TopicAbnormalCallback abnormalCallback, Map<Integer, Long> checkPointMap)
      throws TException {
    this(consumerGroupName, consumerConfig, credential, topicTalosResourceName,
        new TalosMessageReaderFactory(), messageProcessorFactory, clientIdPrefix,
        abnormalCallback, checkPointMap);
  }

  // null credential
  public TalosConsumer(String consumerGroup, TalosConsumerConfig consumerConfig,
      TopicTalosResourceName topicTalosResourceName,
      MessageProcessorFactory messageProcessorFactory,
      TopicAbnormalCallback topicAbnormalCallback) throws TException {
    this(consumerGroup, consumerConfig, new Credential(),
        topicTalosResourceName, messageProcessorFactory, topicAbnormalCallback);
  }

  // null clientIdPrefix
  public TalosConsumer(String consumerGroup, TalosConsumerConfig consumerConfig,
      Credential credential, TopicTalosResourceName topicTalosResourceName,
      MessageProcessorFactory messageProcessorFactory,
      TopicAbnormalCallback topicAbnormalCallback) throws TException {
    this(consumerGroup, consumerConfig, credential, topicTalosResourceName,
        messageProcessorFactory, "", topicAbnormalCallback);
  }

  // for test
  public TalosConsumer(String consumerGroupName, TalosConsumerConfig consumerConfig,
      TopicTalosResourceName topicTalosResourceName, String workerId,
      TopicAbnormalCallback abnormalCallback,
      ConsumerService.Iface consumerClientMock, TalosAdmin talosAdminMock,
      Map<Integer, PartitionFetcher> fetcherMap) throws Exception {
    this.workerId = workerId;
    random = new Random();
    consumerGroup = consumerGroupName;
    partitionFetcherMap = fetcherMap;
    talosConsumerConfig = consumerConfig;
    talosAdmin = talosAdminMock;
    consumerClient = consumerClientMock;
    topicAbnormalCallback = abnormalCallback;
    readWriteLock = new ReentrantReadWriteLock();
    this.scheduleInfoCache = ScheduleInfoCache.getScheduleInfoCache(topicTalosResourceName,
        consumerConfig, null, null);

    partitionScheduledExecutor = Executors.newSingleThreadScheduledExecutor(
        new NamedThreadFactory("talos-consumer-partitionCheck-" + topicName));
    workerScheduleExecutor = Executors.newSingleThreadScheduledExecutor(
        new NamedThreadFactory("talos-consumer-workerCheck-" + topicName));
    renewScheduleExecutor = Executors.newSingleThreadScheduledExecutor(
        new NamedThreadFactory("talos-consumer-renew-" + topicName));
    reBalanceExecutor = Executors.newSingleThreadExecutor(
        new NamedThreadFactory("talos-consumer-reBalance-" + topicName));

    LOG.info("The worker: " + workerId + " is initializing...");
    // check and get topic info such as partitionNumber
    checkAndGetTopicInfo(topicTalosResourceName);
    // register self workerId
    registerSelf();
    // get worker info
    getWorkerInfo();
    // do balance and init simple consumer
    makeBalance();

    // start CheckPartitionTask/CheckWorkerInfoTask/RenewTask
    initCheckPartitionTask();
    initCheckWorkerInfoTask();
    initRenewTask();
  }

  // get current committed offset of every serving partition
  public Map<Integer, Long> getCurCheckPoint() {
    Map<Integer, Long> curCheckPoint = new HashMap<Integer, Long>();
    readWriteLock.readLock().lock();
    for (Map.Entry<Integer, PartitionFetcher> entry :
        partitionFetcherMap.entrySet()) {
      if (entry.getValue().isHoldingLock()) {
        curCheckPoint.put(entry.getKey(), entry.getValue().getCurCheckPoint());
      }
    }
    readWriteLock.readLock().unlock();
    return curCheckPoint;
  }

  private void checkAndGetTopicInfo(TopicTalosResourceName topicTalosResourceName)
      throws TException {
    topicName = Utils.getTopicNameByResourceName(
        topicTalosResourceName.getTopicTalosResourceName());
    GetDescribeInfoResponse response = talosAdmin.getDescribeInfo(
        new GetDescribeInfoRequest(topicName));

    if (!topicTalosResourceName.equals(
        response.getTopicTalosResourceName())) {
      LOG.info("The consumer initialize failed by topic not found");
      throw new IllegalArgumentException("The topic: " +
          topicTalosResourceName.getTopicTalosResourceName() + " not found");
    }
    setPartitionNumber(response.getPartitionNumber());
    this.topicTalosResourceName = topicTalosResourceName;
    LOG.info("The worker: " + workerId + " check and get topic info done");
  }

  private void registerSelf() throws TException {
    ConsumeUnit consumeUnit = new ConsumeUnit(consumerGroup,
        topicTalosResourceName, new ArrayList<Integer>(), workerId);
    LockWorkerRequest request = new LockWorkerRequest(consumeUnit);
    LockWorkerResponse lockWorkerResponse = null;

    int tryCount = talosConsumerConfig.getSelfRegisterMaxRetry() + 1;
    while (tryCount-- > 0) {
      try {
        lockWorkerResponse = consumerClient.lockWorker(request);
      } catch (Throwable e) {
        LOG.error("The worker: " + workerId + "register self got error: ", e);
        continue;
      }
      if (lockWorkerResponse.isRegisterSuccess()) {
        LOG.info("The worker: " + workerId + " register self success");
        return;
      }
      LOG.warn("The worker: " + workerId +
          " register self failed, make " + tryCount + " retry");
    }
    LOG.error("The worker: " + workerId + " register self failed");
    throw new RuntimeException(workerId + " register self failed");
  }

  private void getWorkerInfo() throws TException {
    QueryWorkerRequest queryWorkerRequest = new QueryWorkerRequest(
        consumerGroup, topicTalosResourceName);
    QueryWorkerResponse queryWorkerResponse = consumerClient.queryWorker(
        queryWorkerRequest);

    // if queryWorkerInfoMap size equals 0,
    // it represents hbase failed error, do not update local map
    // because registration, the queryWorkerInfoMap size >= 1 at least
    // if queryWorkerInfoMap not contains self, it indicates renew failed,
    // do not update local map to prevent a bad re-balance
    if (queryWorkerResponse.getWorkerMapSize() == 0 ||
        (!queryWorkerResponse.getWorkerMap().containsKey(workerId))) {
      return;
    }
    readWriteLock.writeLock().lock();
    workerInfoMap = queryWorkerResponse.getWorkerMap();
    readWriteLock.writeLock().unlock();
  }

  private void calculateTargetList(int copyPartitionNum, int workerNumber,
      List<Integer> targetList) {
    if (workerNumber == 1) {
      // one worker serving all partitions
      targetList.add(copyPartitionNum);

    } else if (copyPartitionNum < workerNumber) {
      // per worker per partition, the extra worker must be idle
      for (int i = 0; i < copyPartitionNum; ++i) {
        targetList.add(1);
      }

    } else {
      // calculate the target sequence
      int min, remainder, sum = 0;
      min = copyPartitionNum / workerNumber;
      remainder = copyPartitionNum % workerNumber;
      // add max by remainder
      for (int i = 0; i < remainder; ++i) {
        targetList.add(min + 1);
        sum += (min + 1);
      }

      // add min by (workerNumber - remainder)
      for (int i = 0; i < (workerNumber - remainder); ++i) {
        targetList.add(min);
        sum += min;
      }
      Preconditions.checkArgument(sum == copyPartitionNum);
    }

    // sort target by descending
    Collections.sort(targetList, Collections.reverseOrder());
    LOG.info("worker: " + workerId + " calculate target partitions done: " +
        targetList);
  }

  private void calculateWorkerPairs(Map<String, List<Integer>> copyWorkerMap,
      List<WorkerPair> sortedWorkerPairs) {
    for (Map.Entry<String, List<Integer>> entry : copyWorkerMap.entrySet()) {
      sortedWorkerPairs.add(new WorkerPair(entry.getKey(), entry.getValue().size()));
    }
    Collections.sort(sortedWorkerPairs); // descending
    LOG.info("worker: " + workerId + " calculate sorted worker pairs: " +
        sortedWorkerPairs);
  }

  private void makeBalance() {
    /**
     * When start make balance, we deep copy 'partitionNumber' and 'workerInfoMap'
     * to prevent both value appear inconsistent during the process makeBalance
     */
    int copyPartitionNum = partitionNumber;
    Map<String, List<Integer>> copyWorkerInfoMap = deepCopyWorkerInfoMap();

    /**
     * if workerInfoMap not contains workerId, there must be error in renew task.
     * the renew task will cancel the consuming task and stop to read data,
     * so just return and do not care balance.
     */
    if (!copyWorkerInfoMap.containsKey(workerId)) {
      LOG.error("WorkerInfoMap not contains worker: " + workerId +
          ". There may be some error for renew task.");
      return;
    }

    // calculate target and sorted worker pairs
    List<Integer> targetList = new ArrayList<Integer>();
    List<WorkerPair> sortedWorkerPairs = new ArrayList<WorkerPair>();
    calculateTargetList(copyPartitionNum, copyWorkerInfoMap.size(), targetList);
    calculateWorkerPairs(copyWorkerInfoMap, sortedWorkerPairs);

    // judge stealing or release
    List<Integer> toStealList = new ArrayList<Integer>();
    List<Integer> toReleaseList = new ArrayList<Integer>();

    for (int i = 0; i < sortedWorkerPairs.size(); ++i) {
      if (sortedWorkerPairs.get(i).workerId.equals(workerId)) {
        List<Integer> hasList = getHasList();
        int has = hasList.size();

        // workerNum > partitionNum, idle workers have no match target, do nothing
        if (i >= targetList.size()) {
          break;
        }
        int target = targetList.get(i);
        if (LOG.isDebugEnabled()) {
          LOG.debug("Worker: " + workerId + " has: " + has + " target: " + target);
        }

        // a balanced state, do nothing
        if (has == target) {
          break;

        } else if (has > target) {
          // release partitions
          int toReleaseNum = has - target;
          while (toReleaseNum-- > 0 && hasList.size() > 0) {
            toReleaseList.add(hasList.remove(0));
          }

        } else {
          // stealing partitions
          List<Integer> idlePartitions = getIdlePartitions();
          if (idlePartitions.size() > 0) {
            int toStealnum = target - has;
            while (toStealnum-- > 0 && idlePartitions.size() > 0) {
              int randomIndex = random.nextInt(idlePartitions.size());
              toStealList.add(idlePartitions.remove(randomIndex));
            }
          }
        } // else
        break;
      } // if
    } // for

    // steal or release partition lock or reached a balance state
    Preconditions.checkArgument(!(toStealList.size() > 0 &&
        toReleaseList.size() > 0));
    if (toStealList.size() > 0) {
      stealPartitionLock(toStealList);
    } else if (toReleaseList.size() > 0) {
      releasePartitionLock(toReleaseList);
    } else {
      // do nothing when reach balance state
      LOG.info("The worker: " + workerId + " have reached a balance state.");
    }
  }

  private void stealPartitionLock(List<Integer> toStealList) {
    LOG.info("Worker: " + workerId + " try to steal " + toStealList.size() +
        " partition: " + toStealList);
    // try to lock and invoke serving partition PartitionFetcher to 'LOCKED' state
    readWriteLock.writeLock().lock();
    for (Integer partitionId : toStealList) {
      if (!partitionFetcherMap.containsKey(partitionId)) {
        // Note 'partitionCheckPoint.get(partitionId)' may be null, it's ok
        PartitionFetcher partitionFetcher = new PartitionFetcher(consumerGroup,
            topicName, topicTalosResourceName, partitionId, talosConsumerConfig,
            workerId, consumerClient, talosClientFactory.newMessageClient(),
            messageProcessorFactory.createProcessor(),
            messageReaderFactory.createMessageReader(talosConsumerConfig),
            partitionCheckPoint.get(partitionId));
        partitionFetcherMap.put(partitionId, partitionFetcher);
      }
      partitionFetcherMap.get(partitionId).lock();
    }
    readWriteLock.writeLock().unlock();
  }

  private void releasePartitionLock(List<Integer> toReleaseList) {
    LOG.info("Worker: " + workerId + " try to release " + toReleaseList.size() +
        " partition: " + toReleaseList);
    // stop read, commit offset, unlock the partition async
    for (Integer partitionId : toReleaseList) {
      Preconditions.checkArgument(partitionFetcherMap.containsKey(partitionId));
      partitionFetcherMap.get(partitionId).unlock();
    }
  }

  private void initCheckPartitionTask() {
    // check and update partition number every 1 minutes delay by default
    partitionScheduledExecutor.scheduleWithFixedDelay(new CheckPartitionTask(),
        talosConsumerConfig.getPartitionCheckInterval(),
        talosConsumerConfig.getPartitionCheckInterval(), TimeUnit.MILLISECONDS);
  }

  private void initCheckWorkerInfoTask() {
    workerScheduleExecutor.scheduleWithFixedDelay(new CheckWorkerInfoTask(),
        talosConsumerConfig.getWorkerInfoCheckInterval(),
        talosConsumerConfig.getWorkerInfoCheckInterval(), TimeUnit.MILLISECONDS);
  }

  private void initRenewTask() {
    renewScheduleExecutor.scheduleAtFixedRate(new ReNewTask(),
        talosConsumerConfig.getReNewCheckInterval(),
        talosConsumerConfig.getReNewCheckInterval(), TimeUnit.MILLISECONDS);
  }

  private void setPartitionNumber(int partitionNum) {
    readWriteLock.writeLock().lock();
    partitionNumber = partitionNum;
    readWriteLock.writeLock().unlock();
  }

  private List<Integer> getIdlePartitions() {
    readWriteLock.readLock().lock();
    Preconditions.checkArgument(partitionNumber > 0);
    List<Integer> idlePartitions = new ArrayList<Integer>();
    for (int i = 0; i < partitionNumber; ++i) {
      idlePartitions.add(i);
    }

    for (List<Integer> valueList : workerInfoMap.values()) {
      for (int partitionId : valueList) {
        idlePartitions.remove(new Integer(partitionId));
      }
    }
    readWriteLock.readLock().unlock();
    return idlePartitions;
  }

  private List<Integer> getHasList() {
    List<Integer> hasList = new ArrayList<Integer>();
    readWriteLock.readLock().lock();
    for (Map.Entry<Integer, PartitionFetcher> entry :
        partitionFetcherMap.entrySet()) {
      if (entry.getValue().isServing()) {
        hasList.add(entry.getKey());
      }
    }
    readWriteLock.readLock().unlock();
    return hasList;
  }

  private void cancelAllConsumingTask() {
    releasePartitionLock(getHasList());
  }

  private void shutDownAllFetcher() {
    for (Map.Entry<Integer, PartitionFetcher> entry :
        partitionFetcherMap.entrySet()) {
      entry.getValue().shutDown();
    }
  }

  public void shutDown() {
    LOG.info("Worker: " + workerId + " is shutting down...");
    shutDownAllFetcher();
    partitionScheduledExecutor.shutdownNow();
    workerScheduleExecutor.shutdownNow();
    renewScheduleExecutor.shutdownNow();
    reBalanceExecutor.shutdownNow();
    consumerMonitorThread.shutdownNow();
    scheduleInfoCache.shutDown(topicTalosResourceName);
    LOG.info("Worker: " + workerId + " shutdown.");
  }

  private Map<String, List<Integer>> deepCopyWorkerInfoMap() {
    readWriteLock.readLock().lock();
    Map<String, List<Integer>> copyMap = new HashMap<String, List<Integer>>(
        workerInfoMap.size());
    for (Map.Entry<String, List<Integer>> entry : workerInfoMap.entrySet()) {
      copyMap.put(entry.getKey(), new ArrayList<Integer>(entry.getValue()));
    }
    readWriteLock.readLock().unlock();
    return copyMap;
  }

  private void initConsumerMonitorTask() {
    if (talosConsumerConfig.isOpenClientMonitor()) {
      // push metric data to falcon every minutes
      consumerMonitorThread.scheduleAtFixedRate(new ConsumerMonitorTask(),
          talosConsumerConfig.getReportMetricIntervalMillis(),
          talosConsumerConfig.getReportMetricIntervalMillis(), TimeUnit.MILLISECONDS);
    }
  }

  private void pushMetricData() {
    JsonArray jsonArray = new JsonArray();
    for (Map.Entry<Integer, PartitionFetcher> entry : partitionFetcherMap.entrySet()) {
      jsonArray.addAll(entry.getValue().getFalconData());
    }
    falconWriter.pushFaclonData(jsonArray.toString());
  }
}

redpajama_set_name: RedPajamaGithub


Forecasting employee benefit costs for the upcoming plan year is vital for any organization because it helps to secure budgets. Although it may sound complex, it does not have to be a difficult process to complete. It can be done in a fairly simple manner, but this does not mean that it should be done lackadaisically. The more in-depth the forecast is, the more prepared the company will be, especially when it comes to dealing with the Affordable Care Act mandates.
Learn how to put a reasonable number on your costs for the upcoming year, with these expert tips.
The largest costs to budget for include the Cadillac Tax, which affects high-value health care plans and will have the biggest impact by 2018. The tax will be as much as 40 percent levied on all plans that exceed statutory limits of $10,200 for self-only plans and $27,000 for full family coverage plans. and employees will likely share this cost.
Other common benefits provided by employers to their employees include dental plans, long-term disability insurance, tuition reimbursement, dependent care assistance and retirement plans. So, when you add it all up, the employer will spend anywhere from $60,000 to $72,000 on an employee who has a $50,000 annual salary and benefits.
Forecasting employee benefit costs is important for companies because they need to meet ACA regulatory compliance once the new regulations and policies are activated. Putting money aside is important for companies, so they have the opportunity to pay for any fines or penalties incurred if they decide against offering benefits. The money set aside will also help to pay for added benefits for employees as required by the ACA. Companies do not want to deal with any surprises when it comes to spending money on benefits, which is why planning ahead is very important.
One of the first steps a company must take in forecasting for benefits in the coming year is to determine which employees are designated as full-time. This will help the company understand how many employees are required to have benefits as defined by the ACA. Once this number is determined, the company can begin to analyze its spending on benefits.
Now the company can determine if it will cost more to provide employees with benefits or to pay the penalties incurred by violating the provisions of the ACA. For some companies, it might be more affordable to pay the penalties than to pay for benefits for full-time employees.
The next step in the process is to review the benefits package the company currently provides to its employees. Your human resources department needs to determine if the package is good enough for your employees or if something needs to be added. If the package is missing one or two items that you want employees to have, make sure that you add the item(s) as you budget for the coming year, so you know you have enough money in the bank.
Other aspects of a benefits package include from work, 401(k) retirement savings plans, flexible spending accounts, voluntary benefit programs, bonuses and commissions, wellness perks, and much more. All of these items do not have to be offered by the company but should be considered when putting together a budget for employee benefits for the coming year.
Whenever a company runs into some trouble with employee benefits, such as planning for the coming years, it should consult with an advisor. An advisor will be able to answer any questions the company might have when it comes to employee benefits. An advisor can be someone who works for your company as a contractor, which means he or she will be accessible quite often. Working with an advisor can help to make the budgeting process much easier for companies.
Once the employee benefits budget has been created, it then needs to be presented to the executives of the company. They will review the budget, make any additions or subtractions, and then provide approval so it can be put into action in the coming year.


Cold pasta salad is the epitome of side dish perfection during the warmer months, so this Balsamic Chicken and Prosciutto Pasta Salad is just what your tastebuds are waiting for. The freshness of the tangy balsamic pairs effortlessly with the heirloom tomatoes and mozzarella, all while accentuating the savory chicken and Prosciutto di Parma. This prosciutto pasta salad is a great accompaniment to grilled summer dishes, or can easily stand alone as a main dish. Serve with a refreshing glass of lemonade or take a look at some of our favorite Prosciutto di Parma wine pairings to complete the meal.
In a large non-stick skillet over high heat, cook prosciutto until crispy, about 5-7 minutes. Set aside.
In a large serving bowl combine olive oil, vinegar, mustard, kosher salt and pepper until blended.
Add cooked pasta, bocconcini, artichoke hearts, chicken, heirloom tomatoes, sundried tomatoes and basil tossing until evenly coated.
Top with reserved crispy prosciutto just before serving.


On February 28–March 2, 2019, Stonebriar will once again partner with Feed My Starving Children (FMSC), a non-profit Christian organization committed to feeding God's children in nearly 70 countries around the world. Volunteers will be needed to prepare and hand-pack meals specially formulated for starving children. This is a great opportunity to serve as an individual, family, or small group. Childcare is not available for this event.
If you've served at the BigPack Frisco before and are ready for new challenge, join the Stonebriar crew or parking team! Instead of packing meals, you will help with a variety of tasks that help keep the event running smoothly. Choose the time slot and role that fits your schedule and interests, and sign up to help us make a difference!
Stonebriar Community Church is located at 4801 Legendary Drive, Frisco, Texas 75034. Park on the west side of campus off Parkwood Boulevard. Enter through the doors under the stained glass windows. Volunteers will greet and direct you to the orientation area.
What will I be packing?
Feed My Starving Children (FMSC) has worked to develop a food mixture that would be easy and safe to transport, simple to make with only boiling water, and culturally acceptable worldwide.
• Rice, the most widely accepted grain around the world.
• Extruded soy nuggets, providing maximum protein at lowest cost.
• Vitamins, minerals, and a vegetarian chicken flavoring to give growing children the critical nutritional elements they need.
• Dehydrated vegetables for flavor and nutrition. Packaged in small pouches, each provides six highly nutritious meals. While the formula was designed to save the lives of severely malnourished and starving children, the ingredients also improve the health, growth, and physical well-being of children who are no longer in immediate danger of starvation. A single bag of food provides meals for six children.
Our goal is to pack up to 1,000,000 meals.
• 4001 volunteers packed both Friday and Saturday (a total of 21 packing hours).
• Together, we packed 1,207,656 meals.
• Our 5591 boxes of food were distributed in Haiti, El Salvador, Mexico, and the Dominican Republic.
• 3308 children are being fed for a full year!
If you have any questions, please reach out to Jean Allen at jeana@stonebriar.org.


text:
Q: How to store MySQL database in Google App Engine Cloud SQL? Im doing a project in Android in my College. I have a MySql database and i need to move this database in to Google Cloud Sql from accessing from my Android app. HOw can i achieve this?
i have only 3 tables in my database. can any one tell me a step by step procedure to handle this. i saw something from google app engine docs. i can't understand it.
im using servlet.
i need anyones guiding to fix this. Thanks in advance.

A: Your question is too broad but here are the steps you need to follow:

*

*Create a Cloud SQL account

*Import the data and scheme to it (Cloud SQL support import)

*Create an AppEngine Application

*Allow the AppEngine app id access to the Cloud SQL

*Create an application that android can access which talk to your cloud sql

redpajama_set_name: RedPajamaStackExchange


text:
October 10, 2009 by JP
AUTO UNDERDOG AMC | WALLY BOOTH'S GROWLIN' GREMLIN STREET CRED
AMC Pro Stock press for Wally Booth & his Gremlin X
That's right, it's a Gremlin– without a doubt one, of the ugliest, least respected, aerodynamically-challenged cars ever produced on American soil. Wisconsin-based AMC had never been known for beautiful design or muscle, and so their entry into the muscle car market in the 1970s was seen as a classic tale of– a day late & a dollar short. When AMC signed Wally Booth to head the AMC Pro Stock effort, despite that there were virtually no aftermarket components for AMG engines, he and engine-building partner Dick Arons transformed the brand's staid grocery-getter reputation from the ground up into that of a genuine performance powerhouse– all from scratch. Needless to say, everyone on the racing scene quickly took notice, as the red-headed stepchild to America's "Big Three" automakers worked tirelessly with the little they had, and started to kick some serious tail.
Wally Booth's Gremlin X
From AN AMERICAN LONGSHOT – THE AMC FACTORY PRO STOCK EFFORT–
"The AMC engine was no different than any other in that it had its share of problems," Dick Maskin (cyllinder head guru) said. "It obviously wasn't designed to be a race engine but it won a few races in its day. It won some NASCAR and on the Trans-Am circuit. The engine was pretty good and they had some special blocks for those programs that we got our hands on. The cylinder heads were the largest problems. We just started making our own with AMC's blessings with their suppliers and tooling. We basically didn't have a motorsports center, we had a guy that we'd call and it wasn't any sweat for them to issue a part number."
Wally Booth, ca. 1970s. That hair is outta sight, man. Great style all around -- love the paisley printed shirt.
Wally Booth began with a Tom Smith-built Gremlin X while Maskin and while Maskin and original partner Jim Gilbert started with one, they were the first to convert to a Hornet. The aerodynamic difference between the two body styles was as clear as night and day. Neither were sleek air-cutters, but the Hornet did have an advantage and that came to light in an April 1973 test session when identical engines were ran in each car.
"The Gremlin was about three and a half miles per hour and a tenth of a second slower than the Hornet," said Booth. "After that, I ordered a new Hornet from Smith that we debuted at the Spring Nationals in June, and we started to run better."
Wally Booth's Gremlin X launching
The AMC team had worked tirelessly to bring the combination up to speed and their first victory came at the 1974 Gatornationals in Gainesville, Fla.
"There had been some personnel changes at AMC," said Booth. "Swaim and the other people backing the program had been shifted to other parts of the company, and it was all but official that they were going to put their resources elsewhere. The Gatornationals win absolutely saved the program, and Swaim's replacement, Bob Wheat, was instrumental in capitalizing on the win. He had been hired to promote racing, and after the Gatornationals, he finally had something to promote.
"It certainly would have been tragic if it had ended then since we had gone from nothing to the winner's circle in just slightly over two years."
Cylinder head technology, now Maskin's money-maker, was discovered to be the key to making the AMC cars run quickly. Booth drove his Hornet to the top qualifying spot at the 1975 U.S. Nationals.
Wally Booth and his Gremlin X
The following year, Maskin reached four winner's circles (Springnationals, U.S. Nationals, Fallnationals, World Finals) and finished runner-up once en route to a third place finish in the championship point standings.
That season was the one that almost didn't happen for the AMC team as Booth said that NHRA tech director Jack Hart had notified him that their cylinder heads would be illegal for 1976. Since much of his funding had fallen through, he raced Pomona with a Vega that he'd leased from Andy Mannarino. He lost in the first round at that event. That early loss would come back to haunt him, as well as an early departure in Gainesville. Booth lost the championship that year to Larry Lombardo by six rounds.
The program reached its highest point in 1976 when Booth met Dave Kanners (driver for Maskin) in the final round during the NHRA Finals at Ontario, Ca. Booth won.
"Between myself, Wally and Dick, we made a lot of progress in the five years we had to work on the program," Maskin said. "Wally won a lot of races and was fast. At the end of the deal, we were fast, too. We made it to the finals a few times but never won a national. We did win some points races though. The glory day was the final round when Wally beat us in the finals. We were low et and top speed of every round."
AMC Pro Stock Hornet X. AMC Pro Stock wa also well-known for their bold red, white & blue graphics.
"The energy crisis came along and we lost most of our backing. I had another sponsor, who was going to give me a great deal of money as well. I lost a couple of hundred thousand dollars of sponsorship in two phone calls. We continued on self-funded because we already had everything there."
Booth and Maskin ran a few more seasons and finally closed up shop in 1979. Maskin went on to create Dart cylinder heads and Booth returned to his engine building business.
"I was racing some on my own money that year," Booth said. "I was running over 160 mph in test at Orange County (Int'l Raceway) two weeks before the Winternationals which was real good at the time. We broke my good motors during those tests though, and I showed up at Pomona with garbage under the hood. At that point I felt like I was done, but I ran the rest of the races anyway to meet my obligations with the sponsors. After the year was over, that was it. I retired from racing."
A 1973 factory stock AMC Gremlin
Back in the day (this ad from '72) you could get an AMC Gremlin with a denim interior by Levi's.
This entry was posted in American, autos, denim, design, history, Icons, motor, sports, vintage and tagged 1970s, amc, American, auto, drag racing, dragster, engine, Gremlin, history, Levi Strauss, Levi's, motor, muscle car, NHRA, Pro Stock, racing, Wally Booth. Bookmark the permalink.
JACK NICHOLSON IN REBEL ROUSERS | SPRINGERS & STRIPES
BOB WILLOUGHBY, GREAT AMERICAN PHOTOGRAPHER | JAZZ LEGENDS
6 thoughts on "AUTO UNDERDOG AMC | WALLY BOOTH'S GROWLIN' GREMLIN STREET CRED"
partypants says:
um wanted to let you know that amc gremlins were actually ahead of there time. do a little research on them and you can discover so unique design cues that were light years ahead of the big 3. Keep up the good work.
OK, partypants– fill me in on what you know about the Gremlin….
A.J. says:
The Gremlin was über-cool at the time, and those Levi seats had red tags to boot.
The only problem was if you were delegated to the back seat your knees would be digging into your chin, that is if you fit back there in the first place.
And next to the Duster's google-eyed twister, Gremlin had the best logo character.
Pingback: MID-ENGINE DUEL THAT NEVER WAS | THE 390 AMX/3 VS. THE 351 PANTERA « The Selvedge Yard
Collin McLaughlin says:
The Gremlin was like a Hornet kicked in the butt.
My parents bought a Gremlin X Levi edition with the six banger.Got great gas mileage and actually rode good for it's size.It did out weigh both the Vega and Pinto.
My folks also owned a Hornet and a Hornet Sport about wagon with rally pack (V8,twin grip,rally wheels and stripes).It was a wagon my mother honestly loved.
I think all of those cars including the Gremlin shared the basic same design on the inside,which was a sporty dash and gauges.
I can remember going to King's Island near Cinn. Ohio with my Mom,Grandmother,brother,and sister all in the Gremlin.
Oh,I rode in the spacious cargo area.
The police would be thrilled about that seating arrangement these days !
Love AMCs. Wally Booths first Gremlin he built himself and his second Gremlin was built by Ron Fournier of Race Craft in Detroit, Then Wally ran the Hornet built by Tom Smith of Wolverine Chassis for 6 years. Maskin NEVER won a National event, The events listed in this story were won by Wally Booth.


text:
Basel police nearly lose suspect after being locked in Tesla
23 September 2022, by Jan de Boer
In what can only be described as a comedy of errors, a recent leak given to Primenews has revealed that the Swiss police nearly lost a suspect after they couldn't open the doors of their Tesla patrol car. Despite the incident, authorities in the city of Basel still want to use the vehicles.
Tesla police cars used in Swiss city of Basel
It all started so well. When Teslas were given to the police of Canton Basel-Stadt in December 2018, they were given much praise by locals and the media. The seven electric cars were described as "the most beautiful police cars" ever seen, according to 20 minuten, with one car lover telling authorities to "arrest me now."
Now, a police log from 2020, leaked to Primenews, has shown that the doors of the new Teslas broke down during an arrest. The report said that the incident started when police in Basel asked two cyclists to stop and submit to a drugs check. When one of them refused and took off, the emergency services wanted to get out of the moving car to pursue the suspect on foot.
Tesla's doors failed when trying to catch a suspect
However, both automatic vehicle doors were blocked, making it impossible to get out. Noticing the calamity, the suspect leisurely cycled around the car at "walking pace" while mocking the police officers, according to Blick. Even when officers stopped the vehicle in an area free of obstruction, the front doors wouldn't budge.
Luckily for the police, the mocking cyclist was taken out by his own hubris, after he nearly lost control of his bike trying to show off, and in the end, actually crashed into the immobilised police car. "After the collision, it was no longer possible to open the passenger door," Primenews noted.
In the end, a police officer managed to climb out of a 60-centimetre gap made by opening the gull-wing backseat door, while another climbed out through the passenger window. The suspect was eventually held by the two officers, who found drugs on his person.
Basel police to continue to use Teslas as police cars
When asked by Blick, Swiss police said that the incident was not of concern, as it occurred two years ago when the cars were new. Authorities noted that the Teslas also have a special exit that can be used while driving, making the vehicles safe for use.
However, according to 20 minuten, this isn't the first time Basel's Tesla police cars have been in the news. Just a few weeks after their launch, the vehicles had to be withdrawn temporarily due to "privacy reasons." In February 2019, the business audit commission of Basel's Grand Council found that authorities' "approach to the replacement procurement of the emergency vehicles must be described as unlawful", as they had not followed proper procedures in buying the vehicles.
Basel enlists falcons and buzzards to tackle pesky pigeons
Man in Switzerland arrested after attempting "armed" robbery with a croissant
Air France pilots come to blows while taking off from Geneva Airport
Swiss high school student brings Basel to court over allegations of plagiarism
Woman pays 1.300 francs a night to sleep in Basel shop window
Basel business offers overnight stay in shop window for 3.300 francs a night
Father and son team fined for importing illegal vegetables to Switzerland


The first all-female psychobilly band from Eastern Europe? Wow, I'm already interested. Wait, they're from Ukraine? Honestly I even couldn't think that Ukrainian rock scene had something like this in 1990s. The music is a bit generic and forgettable, but the very fact of existence of such band is interesting.


Irish Times Training is delighted to partner with the University of Derby Online Learning (UDOL) to offer high quality, part-time and 100% online study options.
The affiliation offers clients flexibility and access to a range of over 50 online Bachelors and Masters programmes that are particularly suited to busy professionals. All UDOL online degrees are subject to the same rigorous quality standards as on-campus courses with many accredited by professional bodies such as the British Psychological Society and Chartered Management Institute. This further demonstrates the practical relevance of the courses and reassurance of an industry recognised qualification.
Learning materials are presented in an interactive and engaging way encompassing live web chats, Skype sessions, café forums and wikis. While studying a UDOL degree you'll be learning alongside a global network of likeminded professionals, allowing you to discover and share cultural differences and innovations within your subject area.
If you've already studied at another institution, completed a training course or have experience equivalent to one or more modules on your chosen course, you may be able to translate this prior learning into credits. These credits are put towards your course modules so that you don't have to study them again.
Choosing to study online, in some respects, can be challenging as it requires self-motivation, good organisational skills and a dedication to completing your studies. However, it also offers flexibility to study at times which suit you and eliminates the need to travel to campus.


text:
Doctor Who: The Trial of a Time Lord - Parts 1 to 4: The Mysterious Planet
In 'The Mysterious Planet', The Doctor (Colin Baker) is on trial for his life. Plucked out of time and space by the Time Lords, he is charged with transgressing the First Law of Time. He must defend himself against the sinister prosecutor Valeyard. The trial begins as the Time Lords review events of the recent past where the Doctor and Peri find themselves caught in the conflict between a warrior tribe, a pair of intergalactic con-men, and a god-like robot... Followed by "Mindwarp" (Parts 5-8), "Terror of the Vervoids" (Parts 9-12) and "The Ultimate Foe" (Parts 13-14).
Genre: TV Cult, TV Sci-Fi / Fantasy / Horror
Director: Nicholas Mallett
Starring: Colin Baker, Nicola Bryant
Rating: PG - Contains violence.
Location in store: Cult (TV)
View my queue
For in-store pickup reservations please call 03 3650 615
ALICE ALSO SUGGESTS:
Doctor Who: The Deadly Assassin (1976)
Gallifrey. Planet of the Time Lords. The Doctor has finally come home, but not by choice. Summoned b...
Doctor Who: The Masque of Mandragora (1976)
After an encounter with the deadly Mandragora Helix, the Doctor and Sarah Jane land in 15th Century...
Doctor Who: Four to Doomsday (1981)
Whilst trying to return Tegan to Heathrow Airport, the Doctor instead lands the TARDIS on a seemingl...
Doctor Who: Planet of Evil (1975)
When a scientific team on the planet at the edge of the universe is attacked, the Doctor (Tom Baker)...
Doctor Who: Davros Collection - Volume 1 (1975)
Volume 1 of 2 of this huge Davros collection follows the Doctor (in various forms) in his relationsi...
Doctor Who: The Invasion of Time (1978)
The Doctor (Tom Baker) is behaving very oddly. After signing a treaty with enemy aliens, he returns...
Doctor Who: The Trial of a Time Lord - Parts 5 to 8: Mindwarp (1986)
In 'Mindwarp', the second of the season-long continuity "The Trial of a Time Lord," the Doctor (Coli...
Doctor Who: The Trial of a Time Lord - Parts 9 to 12: Terror of the Vervoids (1986)
In 'Terror of the Vervoids', The Doctor (Colin Baker), in a desperate bid to clear his name, present...
Doctor Who: The Trial of a Time Lord - Parts 13 to 14: The Ultimate Foe (1986)
In 'The Ultimate Foe', the Doctor (Colin Baker) is still on trial for violating the laws of space an...
Doctor Who: Full Circle (The E-Space Trilogy Part 1) (1980)
While heading toward Gallifrey to answer an urgent summons, the TARDIS passes through a CVE (Charged...
Doctor Who: The War Games (1969)
The TARDIS has materialised in a world of trench warfare, barbed wire and poison gas: the Western Fr...