text:
Company: Unilever
View Company Scorecard | Contact Company
Brand: Iglo
Ad Title: Asian
Business Category: Packaged Foods
Media Outlets: Television
Agency: McCann
Target: Mainstream
The first campaign anywhere in the world built entirely around a gay couple in Germany comes out with a flamboyant flourish.
Although the happy, middle-class domestic couple are shown getting along well together -- making meals is a game for them instead of tedious, like for the rest of us -- Holger and Max are the picture of gay stereotypes.
This particular example is least focused on the gay stereotypes compared to others in the campaign but simply makes up for that with Asian stereotypes.
Still, it is remarkable that an entire ad campaign is dedicated to these two men, with an otherwise supportive portrayal of a same-sex couple. The intent was to leverage the idea that gay men are tastemakers.
Guenter Sendlmeier, general manager of McCann in Hamburg, told Euromarketing, "We all know that gay couples are long accepted in our society and they have become the substitute for good taste, particularly in the fashion and art world. They are known for their sense of good food. Even very conservative women agree."
Peter Stachowiak, a spokesman for Iglo, told Agence France Presse, "We're trying to sell a new generation of products, upmarket food, aimed at the housewife. We thought the image of the gourmet homosexual living in an elegant interior fitted the mood of the times."
A newspaper in Germany, Frankfurter Allgemeine Zeitung. reported of the ads: "In the beginning, the creators of the campaign were not quite certain whether they had judged the degree of social acceptance correctly, or whether they were asking too much of their audience. They were afraid that their own perception might be blurred, 'because there are many openly gay men in the media scene.'
The agency carried out a market survey to make sure. The results proved that housewives, pensioners, young people, working men and women unanimously agreed: Homosexual men are affectionate, helpful, well dressed, appreciative of good food and have good taste. Almost all of those questioned said that they know gay men personally.
Now, Volker Nickel, secretary of the German Advertising Federation, expects that other advertising agencies will follow suit and feature homosexual couples as well.
The paper also reported that Volker Beck, the Greens' parliamentary spokesman on legal affairs and a board member of the Lesbian and Gay Association of Germany, wrote a note of thanks to ad agency McCann-Erickson. The gay community is glad about any commercials that show "gay normality," a spokeswoman of the organization said.
As it turns out, the actor who plays Holger also plays a straight father in a cough syrup commercial.
Be the first to comment on this ad!
Brand: All (laundry detergent)
Brand: AXE
Region: North America, Europe, Asia, Latin/South America, Australia/New Zealand
Year: 1998, 1999, 2000, 2001, 2002, 2003
Gangster of Love 2
Brand: Click/Axe
Gangster of Love
Region: Latin/South America
Brand: Cornetto
Make Over Millionaire
Brand: Cream Silk
Tested on Real Curves
Brand: Dove
Region: North America, Europe
The Apprentice - Cucumber
© 2001 - 2020 AdRespect Advertising Education Program. All rights reserved.
Other works which appear on this site are the property of their various owners and are used for educational purposes, with no commercial intent.
Legal Statement and Terms of Use
Designed & Powered by Videotex


Mori Lee has made a name within the world of bridal fashion for more then three generations of creative designers, their experience is that made this label be very popular among the future brides.
If you want to shop for a Mori Lee wedding gown short sleeve, it means that you really want to confer your look a special image that cannot be seen with many brides nowadays, many of them preferring the strapless bodice style of dress. But short sleeved wedding dresses have their own charm and elegance and if you plan to marry in a colder season, then this choice is moreover successful.
When you take a look inside Mori Lee collections of bridal attire you will be fascinated by the subtlety the design of a Mori Lee wedding gown short sleeve confers to the silhouette and the roundness of the shoulders.
One can only guess what lies behind those delicate lines of the sleeves covering the shoulders, and this feature is what brings the wedding gown a special look. You can find styles of A-line dresses, empire dress, and also the neat lines of a classic tea length wedding dress with short sleeved bolero worn on top of it.
There are as well styles of short sleeves designed for Mori Lee wedding dresses, some coming in plain short style, other in the form of cap sleeves gently covering the roundness of the shoulder, and others with the length of the sleeve just reaching above the elbow. As to the style of dresses, you can find almost every available style of a wedding dress to hold as well the inclusion of short sleeve, some more spectacular than others.


text:
Q: How do I cancel cloning a Git repository from Git Bash? I am currently using Git Bash to clone a large repository that has over 100,000 commits. The cloning process has been going on for over half an hour, and it still hasn't finished receiving objects.
Is it possible to cancel a git clone command from Git Bash?
(For reference, I am using Git 2.17.0 (64 bit) on Windows 7 Professional).

A: Ctrl+C should send a SIGINT or similar (signal for graceful exit) to the git process; if this does not help you can issue a SIGQUIT with Ctrl+\; last but not least you can always kill the process using the Windows Task Manager.
The directory you're cloning into may not be in a consistent state as a result of killing the git executable so you may wish to delete it before attempting to clone again, if git doesn't do so for you. When you try again, you can use the flag --depth=N to fetch only the last N commits.

redpajama_set_name: RedPajamaStackExchange


DAP Group have successfully secured planning permission for Conversion of the 2 flats back into a single family dwelling house. Project : Conversion of the 2 flats back into a single family dwelling house. Location : 49 And 49A The Avenue, London, NW6 7NR Council : Brent Planning permission granted at : 49 And 49A The Avenue, London, NW6 7NR Need Planning Permission? Call us today on 0208 202 3665 to talk to one of expert consultant and learn how we can help you get Planning Permission.


text:
Wilkinson, Norman
Poster produced for London, Midland & Scottish Railway (LMSR) promoting train services to Aberdeen. The poster shows the red 'Royal Highlander' travelling across a coastal landscape leaving a stream of prominent white smoke. The sea and cliffs are visible in the distance. Artwork by Norman Wilkinson, who studied art at Portsmouth and Southsea Schools of Art. A famous marine painter, he designed posters for the London & North Western Railway (LNWR), the London & Midlands Railway (LMR) and Southern Railway (SR) and organised the Royal Academy series of posters for the London & Midlands Railway (LMR) in 1924. Dimensions: 1016 mm x 1270 mm.
'The North Wales Coast from the Great Orme', LMS poster, 1923-1947.
'The Mersey from Runcorn Bridge', LMS poster, 1923-1947.
'Come to Ulster', LMS poster, c 1930s.
'The Birthplace of Robert Burns', LMS/LNER poster, 1923-1947.
'Sedburgh School, Yorkshire', LMS poster, 1923-1947.
'The Coronation Scot Ascending Shap Fell', LMS poster, 1937.
'Ireland for Holidays - The Giant's Causeway', LMS poster, 1923-1947.
'Rock of Cashel', LMS poster, c 1930s.

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: Type problems with native Java classes I have the following problem, maybe someone can help me (or explain, where my mistake
is). Given are a trait and a class:
trait TextAttr[T <: {def setText(s:String); def getText : String}] {
  val obj : T
  def txt_= (s:String) = obj.setText(s)
  def txt = obj.getText
}

class ScalaText {
  private var t = ""
  def setText(s:String) = t = s
  def getText = t
}

Now I create a new class using both of them:
class ScalaTextUser extends TextAttr[ScalaText] {
  override val obj = new ScalaText
}

That's okay. But if I want to create something like that with the class
org.eclipse.swt.widgets.Text (or any other pure Java class) I get an error. Here the code:
class SwtTextUser(parent:Composite) extends TextAttr[Text] {
  override val obj = new Text(parent, 0)
}

And this is the error:
type arguments [org.eclipse.swt.widgets.Text] do not conform to trait TextAttr's type
parameter bounds [T <: AnyRef{def setText(String): Unit; def getText: String}]
Has anybody an idea?
Thanks, Chris.

A: Try changing the trait declaration to the following:
trait TextAttr[T <: {def setText(s: String); def getText(): String}] {

Scala has a subtly-different treatment for methods with and without parentheses.  When in doubt, add the parens and let the compiler sort things out.


The Onitsuka Tiger Mexico 66 (Ivory/ Taupe) (D4J2L-0212) shoes is a new fashion Collection. The nice style is a factor for people to love. The Onitsuka Tiger Shoes can let everyone to show their personal charming of beauty. The cool style and look of the Onitsuka Tiger shoe allows it to be mixed and matched with about anything. You can be careful to choose style which you favor. Here you can enjoying best service and free shipping.


You won't say that I hold the present too high, and if I do not despair of it, it is only because its desperate situation fills me with hope.
Ground Zero Redux brings together new and recent work by six unique Vancouver artists to explore the complex conceptual, narrative and material trajectories of the term "Ground Zero." This exhibition – featuring photography, drawing, digital video projection, text and bookwork, assemblage, painting and kinetic sculpture – looks across a diverse range of artistic practice to explore the creative efficacy of Ground Zero, reevaluating the enduring legacy of this term as it relates to our current moment.
Ground Zero was first used as a name for the areas directly below atomic explosions (beginning with the Trinity Test Site, Nagasaki and Hiroshima in 1945), later signifying reinvention or rebirth through acts of leveling, collapse, total destruction or reduction to essences and tabula rasa-like states. While the violent creative/destructive essentialism of these scenarios has been critically derided across a variety of fields, Ground Zero mythologies continue to influence both the nebulous terrain of political policy, environmental discourse and philosophical inquiry, and the often urgent, definitive nature of our global socio-economic realities and ecological situation. The ongoing spectre of 9-11 – its place in our present narratives of protection, justification and preemption, and the resulting fallout of the actualization of these ideas – is a grave example of this. As this exhibition suggests, notions of Ground Zero can also persist in what philosopher Giorgio Agamben has called "bare life"—the reduction of people to Ground Zero-like states through incarceration, expulsion from political community, denial of rights and resources, torture and extreme poverty.
With these complications in mind, artists in this exhibition enact a variety of experiments with ideas of Ground Zero that are not strictly deconstructive, archeological or ironic. Instead, the works choose to critically engage the possibilities of starting over, and restoring points of departure to consciousness.
Martha González Palacios is originally from Mexico, where she obtained an architecture degree in 1995 and worked as an architect. She received her BFA from the Emily Carr Institute in 2001 and her MLIS from the University of British Columbia in 2007. Her work has been shown in Vancouver, Bellingham, and Washington DC.
Jeremy Isao Speier is a Japanese-Canadian interdisciplinary artist who graduated from the Emily Carr Institute in 1992. He works in film/video, kinetic sculpture and sound, and installation and has shown extensively across Canada in solo and group exhibitions. In 2008, he will be exhibiting at Elissa Cristall Gallery and Blim.
Nick Lakowski is a Vancouver artist primarily working with paint. He received a BFA from the Emily Carr Institute in 2004 and was a founding and active member of the counterpublics collective from 2003-6.
Gwenessa Lam received a BFA from the University of British Columbia and an MFA from New York University. She has taught at New York University, Emily Carr Institute, University of British Columbia, and the Art Institute of Vancouver. Her work has been shown in Canada and the USA, including the Bronx Museum of the Arts and the Queens Museum of Art. She has also been awarded residencies at Skowhegan and MacDowell.
Marlene Yuen received her Bachelor's in Studio Art in 1998 from the University of British Columbia. Marlene has exhibited at galleries, artist-run centres, and cultural events in Canada and Japan. Although she is a multidisciplinary artist, her current focus is on handmade books. She is an active member of the Canadian Bookbinders & Book Artist Guild and the Alcuin Society. Marlene is currently preparing for her forthcoming artist residency at the Klondike Institute of Art & Culture in Dawson City, Yukon. Please send her cookies.
Jeremy Todd is an interdisciplinary artist, teacher, curator and musician whose work has been shown, published and screened in Vancouver and beyond. He was the Director/Curator for the Helen Pitt Gallery from 2003-05, and in 2007 acted as the interim Director/Curator of the Richmond Art Gallery. He is currently teaching at UBC while developing a second feature-length experimental film.
Click here for a PDF version of the curatorial essay.


How to manage Roaming Users' desktops using Desktop Central?
This document provides steps to manage roaming users' desktops using Desktop Central.
Whenever these roaming users connect to Internet, the agent residing in their computers will contact the Desktop Central server and access the available configurations. The agent will periodically contact the server, based on the communication interval you specified while creating the remote office. The default communication interval is 2 minutes.
You can now manage desktops of roaming users.


text:
NYT Confirms Ukraine Didn't Know U.S. Froze Aid at Time of July 25 Call: 'Can't Have Quid Pro Quo With No Quo'
SAUL LOEB/AFP/Getty Images
Edwin Mora
24 Oct 2019 Washington, DC
The New York Times unwittingly confirmed the veracity of the GOP argument that there could be no quid pro quo because Ukraine did not know the United States had delayed the release of aid for the Eastern European country at the time of the July 25 call.
In an article on Wednesday, the newspaper actually tried to discredit the argument but ended up confirming it instead.
House Democrats pursuing the impeachment inquiry are trying to determine if President Donald Trump abused his power by allegedly coercing Ukraine during the July 25 call to investigate corruption allegations against Joe Biden and his son, Hunter, in exchange for aid.
Echoing the testimony of impeachment inquiry witnesses, the Times acknowledged Wednesday that Ukraine was not aware the United States was withholding aid until days after the July 25 call, in August.
In other words, Trump did not threaten to withhold aid during the infamous conversation between him and his Ukrainian counterpart Volodymyr Zelensky on July 25.
Zelensky himself has acknowledged that "there was no blackmail" during the call, citing as evidence that he "had no idea the military aid was held up" at the time of his July 25 phone conversation with Trump, the Times conceded.
The Times article is just the latest sign that Democrats and their liberal mainstream media backers are trying to move beyond the July 25 call that triggered the impeachment.
On Wednesday, the newspaper reported:
To Democrats who say that President Trump's decision to freeze $391 million in military aid was intended to bully Ukraine's leader into carrying out investigations for Mr. Trump's political benefit, the president and his allies have had a simple response: There was no quid pro quo because the Ukrainians did not know assistance had been blocked.
Word of the aid freeze had gotten to high-level Ukrainian officials by the first week in August, according to interviews and documents obtained by The New York Times. … The communications did not explicitly link the assistance freeze to the push by Mr. Trump and [his private lawyer Rudy] Giuliani for the investigations [into the Bidens].
Impeachment probe evidence provided by former U.S. Special Envoy for Ukraine Kurt Volker in the form of texts also suggests the Ukrainians did not find out the U.S. had frozen the security assistance until weeks after the call, through an August 28 Politico article based on leaked information.
"I did not discuss the hold with my Ukrainian counterparts until the matter became public in late August," Volker added his written testimony prepared for his impeachment probe deposition earlier this month. "The position was indeed reversed, and assistance allowed to continue, within a few weeks after that."
"American and Ukrainian officials have asserted that Ukraine learned that the aid had been held up only around the time it became public through a news article at the end of August," the Times acknowledged.
Politico's article on the U.S. holding up aid came after the "whistleblower" filed the complaint on August 12, accusing Trump of coercing Zelensky to investigate Biden and his son in exchange for aid.
Rep. Adam Schiff's (D-CA) office spoke to the "whistleblower" before he or she filed the complaint, based on hearsay.
Democrats and deep state actors may have coordintaed the leak of U.S. withholding aid to fit the impeachment narrative. The "whistleblower's" allegation is at the center of the impeachment probe.
The Times article's headline —Ukraine Knew of Aid Freeze by Early August, Undermining Trump Defense — admitted that the Ukrainians did not find out about the United States holding up security assistance until days after the call.
Citing Rep. John Ratcliffe (R-TX), Trump tweeted on Wednesday, "Neither he (Taylor) or any other witness has provided testimony that the Ukrainians were aware that military aid was being withheld. You can't have a quid pro quo with no quo."
Neither he (Taylor) or any other witness has provided testimony that the Ukrainians were aware that military aid was being withheld. You can't have a quid pro quo with no quo." Congressman John Ratcliffe @foxandfriends Where is the Whistleblower? The Do Nothing Dems case is DEAD!
Ratcliffe was present for Taylor's deposition.
On Wednesday, Rep. Mark Meadows (R-NC), who has also witnessed the impeachment inquiry depositions, added, "We've heard Ukraine wasn't even aware aid was being withheld until a month after the phone call."
He added, "So you're telling me POTUS imposed leverage over something Ukraine didn't know about? Got it."
This is not a "new talking point"—we've been emphasizing it for weeks, because it's true. We've heard Ukraine wasn't even aware aid was being withheld until a month AFTER the phone call.
So you're telling me POTUS imposed leverage over something Ukraine didn't know about? Got it https://t.co/p7d30fxlCO
— Mark Meadows (@RepMarkMeadows) October 23, 2019
At least two impeachment inquiry witnesses — Volker and Taylor — explicitly testified in their leaked opening remarks that Ukraine was not aware the United States was withholding aid until days after the July 25 call.
Taylor noted in his remarks that Ukraine did not express concerns about the U.S. withholding aid until after the Politico published its story on the matter in late August.
It was not until September 1, more than a month after the July 25 call, that Taylor said he found out the security assistance "was conditioned on the investigations."
Ivan Pentchoukov, the deputy chief editor at the Epoch Times, tweeted on Thursday that Taylor told lawmakers, "Amazingly, news of the hold did not leak out until August 29."
"Amazingly, news of the hold did not leak out until August 29," William Taylor, who knew that aid to Ukraine was on hold, told lawmakers.
Amazingly, Taylor met Adam Schiff's staffer in Ukraine on August 25, four days prior to Politico publishing the leak. pic.twitter.com/uZxOhL9Fao
— Ivan Pentchoukov (@IvanPentchoukov) October 24, 2019
Republicans say Taylor's claim of a quid pro quo linked to Ukraine "collapsed" when lawmakers questioned him during his deposition.
The transcript of the July 25 call does not explicitly mention anything about freezing aid until Ukraine investigates the Bidens.
"No mention of security assistance was made in the readouts either, and I said so in my press remarks on July 27, 2019, in Kyiv," Volker added in his opening remarks.
U.S. aid to Ukraine was ultimately released on September 11, although the Eastern European country had not launched an investigation into the Bidens.
London / EuropePoliticsDonald TrumpHunter BidenimpeachmentJoe BidenJohn RatcliffeQuid Pro QuoUkraineVolodymyr Zelensky


A great place to see what's happening on the local arts scene.
This site will give you the schedule of all the dance events the Dance Council is sponsoring. Check here for performances.
Want to know what's happening in the dance culture of PGH? This calendar, produced by our very own Jessica Marino, has everything from classes to workshops to performances that are happening!


text:
Nella mitologia greca,  Daita  con il fratello Tieste erano due abitanti dell'isola di Lesbo di cui si raccontano le gesta.

Il mito
I due fratelli vengono ricordati per aver tenuto cura di un uovo, da cui nacque un uomo devoto al dio del divertimento Dioniso. Il ragazzo si chiamava Enorco ed eresse un tempio.

Pareri secondari
Viene ricordato anche per essere il padre di Machereo, il sacerdote di Delfi, ma potrebbe trattarsi di omonimia.

Bibliografia

Moderna

Voci correlate
Enorco
Dioniso

 Personaggi della mitologia greca

redpajama_set_name: RedPajamaWikipedia


Make phonics fun using The Big Book of Phonics for grades K-3. This 352-page book features reproducibles, activities, and songs that cover blends, digraphs, vowel combinations, and prefixes and suffixes. Each unit includes a lesson plan, word lists, a song page, worksheets, and suggested games and activities. The book supports Reading First and NCTE standards.
The sound of a child reading is like music to a parent's ears—so get your child started early with Spectrum® Phonics for kindergarten! This best-selling language arts workbook uses progressive lessons, strategies, and practice to help children form words with letter sounds, pairs, and blends.
Understanding letter sounds is an essential piece to the reading proficiency puzzle. Spectrum Phonics for kindergarten guides children through letter recognition, consonant sounds, short vowel sounds, and alphabetical order. Filled with engaging exercises in a progressive format, this series provides an effective way to reinforce early language arts skills.
The sound of a child reading is like music to a parent's ears—so get your child started early with Spectrum® Phonics for grade 1! This best-selling language arts workbook uses progressive lessons, strategies, and practice to help children form words with letter sounds, pairs, and blends.
Understanding letter sounds is an essential piece to the reading proficiency puzzle. Spectrum Phonics for grade 1 guides children through consonant pairs, vowel pairs, end sounds, and vowel sounds. Filled with engaging exercises in a progressive format, this series provides an effective way to reinforce early language arts skills.
Brand : THE CRITICAL THINKING CO.
Finally, a fun, colorful, easy-to-use phonics program that is comprehension centered! This 320-page book is based on the scientific findings of the National Reading Commission. It emphasizes sound/spelling patterns, vocabulary, and comprehension, not memorization. The colorful game-like activities engage students through listening, thinking, speaking, and reading.
Fun-Time Phonics! teaches students that spoken words are composed of individual sounds (phonemes), and those sounds are written with letters. Armed with this understanding of how print works as a code, reading becomes much easier than other more complicated approaches. This program ensures complete phonemic awareness mastery by focusing on vowel isolation, which is often the most challenging—but most important—part of learning to read. Once students grasp how vowels influence the sound of the consonants and control the meaning of the words, they are only a step away from fluency.
This must-have resource for primary teachers includes dozens of fun activities that help children listen to language and play with sounds- essential readiness skills for phonics instruction. Activity cards can be cut out and laminated to create a handy reference file of fun ideas. A wide selection of reproducibles such as picture cards, word cards, and manipulatives are included. 128 pages.
Unique snap-together flip charts are an engaging, hands-on way to teach and reinforce basic phonics skills. Comprehensive set includes eleven modules that can be snapped together in multiple configurations to build key skills. Three modules with consonants, two with vowels, one with vowel pairs, one with beginning blends (br, gl, sn, etc.), one with ending blends (ck, nd, st, etc.), two sets with digraphs, and one set with r-controlled vowels (ar, er, ir, or, ur). Combine in any number of ways for a variety of word, spelling, and phonics activities. Charts are 6" x 4". Includes activity guide.
Provide explicit, systematic phonics instruction and practice in just 15 to 20 minutes a day! Daily Phonics, Grade 1 helps students in first grade—including students learning English—develop the phonics skills necessary to become proficient, on-grade-level readers.
Provide explicit, systematic phonics instruction and practice in just 15 to 20 minutes a day! Daily Phonics, Grade 2 helps students in second grade—including students learning English—develop the phonics skills necessary to become proficient, on-grade-level readers.
Daily Phonics, Grade 3 helps struggling readers and English learners develop the phonics skills necessary to become proficient, on-grade-level readers. Students first learn basic phonics skills typically mastered in grades 1 and 2, and then they progress to skills taught in grade 3. Lessons and activities are designed with age-appropriate formats that respect the older learner.
Daily Phonics, Grades 4-6+ helps struggling readers and English learners develop the phonics skills necessary to become proficient, on-grade-level readers. Students learn basic phonics skills typically mastered in grades 1, 2, and 3. Lessons and activities are designed with age-appropriate formats that respect the older learner.
Meet your needs for supplemental phonics practice with this series of four books. The Basic Phonics Skills series is a sequential presentation of phonics skills from phonemic awareness to structural analysis. Basic Phonics Skills, Level A (Grades PreK-K) features 239 reproducible skill sheets and 26 reproducible Little Alphabet Readers.
Alphabetic Awareness: reproducibles provide practice in forming the letters of the alphabet. Activity sheets are in both traditional and modern manuscript.
Basic Phonics Skills, Level B (Grades K-1) features 238 reproducible skill sheets and 20 reproducible Little Phonics Readers.
Learning centers are a motivating way for students to practice important skills. The activities in Take It to Your Seat Phonics Centers reinforce phonics skills with full-color centers that contain directions, task cards, and record forms.


text:
Home National Criticizing Turkey's religious authority means supporting 'crusaders,' far-right MP says
topheadline
Criticizing Turkey's religious authority means supporting 'crusaders,' far-right MP says
A deputy from Turkey's far-right Nationalist Movement Party (MHP), an ally of the ruling Justice and Development Party (AKP), stated during budget talks that criticizing the Directorate of Religious Affairs amounts to providing support for what he called "crusaders," in reference to a destructive, anti-Muslim mentality.
According to a report by the Birgün daily on Thursday, MHP Deputy Chairman Yaşar Yıldırım commented on criticism directed at Turkey's Religious Affairs Directorate by opposition figures, saying that criticizing "the most important institution in the fight against the crusaders" amounts to showing support for them.
"That said, of course, the directorate has some shortcomings. Everybody in it, from the directorate president to the individual imams, should be careful about their behavior and attitude. This is because they represent Islam and Muslims everywhere they go," Yıldırım added.
Yıldırım's remarks came after Burak Erbay, an MP from the main opposition Republican People's Party (CHP), reminded lawmakers that Turkey's Religious Affairs Directorate has a budget of TL 13 billion ($1.6 billion), which is higher than that of seven ministries.
"Pfizer, which operates in 175 countries, has around 96,000 employees and BioNtech has 300,000. The Religious Affairs Directorate, on the other hand, has 131,789 employees," Erbay added, comparing the directorate's expenditures on employees to the well-known pharma companies.
The opposition MP also referred to the TL 90 million ($11.6 million) Harput Islamic-Ottoman social complex currently being built in eastern Elazığ province, asking why Turkey needs such a complex while the construction of houses for people who lost their homes in earthquakes has not yet been finished.
Erbay also mentioned an expertise center built by the directorate for TL 40 million ($5.1 million). "It has a [Turkish] bath and a steam room. You allocated TL 2.7 million ($348,000) just for the landscaping."
The directorate has been criticized a number of times by opposition figures for its extravagant spending that contradicts Islam, which promotes modesty.
It has also attracted criticism for following mainstream Hanafi Sunni Islam and being "indifferent to the diversity of Turkish Islam" and for mixing religion with politics and openly supporting the policies of the ruling Justice and Development Party (AKP) over the past few years.
Previous articleErdoğan breaks YouTube's resistance
Next articleJournalist speaks out on abuse in Turkish prison after launch of social media campaign against strip-searches


BMW will be the first automaker to have laser headlights on a production vehicle, the German automaker announced this morning. The laser headlights will be available on the BMW i8 hybrid supercar this fall as an option.
"The optional laser boost feature additionally ensures a high beam range of up to 600 metres. This means that the already high illumination range of the modern LED high beam is doubled. Thanks to the new laser technology, it is possible to increase energy efficiency by a further 30 per cent compared to already highly power-saving LED light," BMW said in a press release.
In a direct stab at Audi, which is a leader in innovative headlight design, BMW's laser lights are lighter and more efficient than the LEDs currently used on its cars.The headlights will come with a camera-aided headlight assistant to ensure oncoming cars aren't blinded.
Audi unveiled its own laser headlights on its Sport Quattro concept at the Consumer Electronics Show in January, but it is unclear when the new headlights will make it into production.
Audi preparing a Tesla Model X rival?


text:
SCH Out Of State or Country Hunting
Out of State Hunting
Utah's 2012 Big Game Drawing
Posting for Top Buck -
It's almost time to apply for Utah's 2012 big game hunts. This year, there's one big change to keep in mind: the general-season buck deer hunt will take place in 30 hunting units, rather than five. To see a map of the areas and learn more about the changes, please visit http://go.usa.gov/ncx . A larger printed map of all the units is also available at Division offices and license agents.
Utah's online big game application runs from February 1 to March 1, 2012. If you aren't looking for a permit this year, but would like to build your bonus and preference points, you'll have until March 8 to apply. We thank you for your support and interest in Utah wildlife.
Utah Division of Wildlife Resources


The conference took place on the 14th and 15th February 2019, in London and online and now you can watch all of the content for only £100.
Every session topic has been chosen to enable you to future-proof your skills and competencies. Our line-up of incredible speakers will inspire you, they will share their incredible expertise and knowledge, and they will give you real and practical guidance that will help you add value within your organisation as a modern-day Assistant.
Download all of the sessions and watch on-demand for three months.
The Office Is Dead! Now What?
What are the new ways of working for Assistants?
We need the right meetings!


Spandau halts Szolnok 15-game unbeaten run.
Upset of the day: Spandau (GER) beat title-holder Szolnok (HUN) in Berlin with a goal scored 23 seconds from time. Olympiacos (GRE) overcame Brescia (ITA) in a huge fight with a last-gasp game-winner while Barceloneta (ESP) blew away OSC (HUN) with surprising ease. After three rounds only Recco (ITA) stands with three wins in as many matches.
Every big run comes to an end once but Szolnok's great march in the Champions League was halted in a somewhat unexpected place. In Berlin, underdog Spandau handed the Hungarians their first defeat since May 2016.
The title-holders jumped to a 1-3 lead but three straight goals from the Germans signed that it wouldn't be an easy cruise for the visitors. In fact, they were 4-6 down early in the third before they replied with three connecting goals, still, it stood 8-8 before the last period. Spandau took the lead again, then came six scoreless minutes with plenty of missed chances (including three man-ups from Szolnok) before Gergo Zalanki scored his third from a free-throw with 52 seconds to go.
But it was Spandau which had the last laugh, hero of the evening, Mateo Cuk (brother of Milos who played in the opposite side) netted an action goal, his 4th, with just 23 seconds remaining. It means that the title-holder side lost its first encounter after it remained unbeaten in 15 consecutive Champions League matches.
The other Hungarian team in Group B was entangled in a big tussle too. Eger had to settle for a draw in Herceg Novi (MNE). It was an enormous physical battle, defenses were outstanding, both goalies did a great job. Jadran took a 1-0 lead, the visitors needed 9:38 minutes to score their first goal but then with two penalties they went 1-3 up by the middle of the third. Jadran, scoring again after 13:56 minutes, could equalize before the last break and even took the lead in the fourth but Eger could go even.
Despite having 5:15 more minutes neither side could win the game, the Hungarians offense looked a bit weak, they netted only four in their second straight match but at least they earned a point, unlike three weeks ago against Recco (ITA).
The Italian giant didn't have any trouble with beating newcomer Steaua (ROU). With a 5-0 rush in the first, Recco put the encounter on the right track though, a bit unusually, they conceded four goals in an action-packed second quarter. Still, their win was never in danger and by the end of the third day, they remained the only side with three wins in the entire field.
In the clash of the two sides without points, Sabadell (ESP) overcame Alphen (NED) in a great fight. The Dutch were keeping up till late in the third but after 7-7 the Spaniards netted three connecting goals and Alphen could not come closer than two in the remaining 3:28 minutes.
Group A saw three one-sided matches and a thriller. The latter one was produced by Brescia (ITA) and Olympiacos (GRE) – the Greeks got the better start and went 0-2 up but the hosts responded with three straight goals in the second. The Italians held on and seemed to be en route to another nailbiting win after beating Barceloneta 6-5 on Day 2, but this time their visitors had more in the tank.
Brescia led 6-5 once more with 3:26 till the end but Paulo Obradovic equalized soon. In a dramatic finish, he then converted a man-up, securing a crucial win for Olympiacos with 4 seconds time left.
Barceloneta (ESP) played a perfect match against group leader OSC (HUN) and simply blew the Hungarians away. The hosts were 9-2 up after three periods, OSC could pull back a couple of goals after 11-3 but it didn't impede on the hosts celebrating their first win.
Jug (CRO) didn't leave any chance to Hannover (GER) as they rushed to a 3-7 lead and never looked back. Though they couldn't score in the third but returned with five more in the last period, a kind of proof that they had left their opening round embarrassment in Moscow behind.
Dynamo (RUS) also recovered from the defeat they had in Piraeus – still,the Russians faced a tough challenge in Belgrade. The young Partizan side was trailing by a single goal before the last period (9-10) but ran out of gas for the final eight minutes. They missed crucial powerplays, four alone in this quarter, while Dynamo netted four goals and earned three valuable points.


These Reliance Controls Pro/Tran 2 manual transfer switch kits are designed for fast installation in residential and commercial applications. The flexible conduit whip attaches easily to the load center and all wires are clearly marked. Simply select the circuits in your load center needed in an emergency and connect them to the wire leads. Each kit includes a power inlet and power cord. Models starting with an "A" include a 30A double pole circuit breaker.


text:
Siasat.com/News/Practice kapalbhati for next 10 years: Ramdev to Oppn as Modi begins 2nd term
Practice kapalbhati for next 10 years: Ramdev to Oppn as Modi begins 2nd term
Sameer| Updated: 31st May 2019 7:44 am IST
New Delhi [India]: Soon after Narendra Modi took oath as Prime Minister again for a second consecutive term on Thursday, yoga guru Baba Ramdev took a potshot at Opposition leaders and said that they should practice 'Kapalabhati' for the next 10 to 15 years to control stress.
"Under the leadership of Prime Minister Narendra Modi, the country will get freedom from economic, conceptual and cultural penury… All the ministers who have taken oath today, including Amit Shah, Piyush Goyal and Nitin Gadkari among others will live up to people's expectations. In the next five years, they will do hard work," Ramdev told ANI.
"I believe that for the next 10 to 15 years, the Opposition leaders need to do a lot of 'Kapalabhati' and 'Anulom Vilom', only then they will be able to control their stress," he added.
The 58-member council of ministers were administered the oath of office and secrecy by President Ram Nath Kovind in the forecourt of the Rashtrapati Bhavan on Thursday evening before a gathering of over 6,000 guests that included heads of governments and states, political leaders and captains of the industry, Bollywood and other film celebrities and diplomatic representatives.
Of the new Council of Ministers, there are 24 cabinet ministers besides the Prime Minister, 9 Ministers of State with independent charge and 24 Ministers of State.
"The country has expressed its confidence in the Prime Minister and the ideology of the BJP. I want to thank the Prime Minister for providing me with an opportunity to work with him as a part of the Union Cabinet," said Gajendra Singh Shekhawat, who won from Jodhpur Lok Sabha seat.
Mahendra Nath Pandey, who has also been included in the Cabinet, said, "I want to thank the Prime Minister and the people, who voted for me."
Baba Ramdev Gajendra Singh Shekhawat Narendra Modi Opposition Prime Minister
Get the news updates on WhatsApp & Telegram by subscribing to our channels. For all the latest India updates, download our app Android and iOS.


text:
Q: problems with xlsxwriter "workbook.close()" python library I am having problems the following problem with the generation of an excel file: "[Errno 2] No such file or directory: 'Reportes/ Reportes_enviados_20180806.xls" where the "Reports" folder exists, and has all the permissions. When I get to the woorbook.close() is where this problem occurs, any idea where the error might be?
def generarReporte(regsCurRegx):
    escribirLog("***Se Inicia la Generación del Excel***")

    #Crea a sobreescribe el excel en la ruta especificada
    workbook = xlsxwriter.Workbook('/sysx/proyectos/afore/felicitacioncumpleafoauto/Reportes/Reportes_enviados_'+time.strftime("%Y")+time.strftime("%m")+time.strftime("%d")+'.xls')
    worksheetReg = workbook.add_worksheet(u'Reportes_enviados')

    #Crea la cabecera del excel
    cabReg = ('Fecha', 'Nombre', 'Apellido paterno', 'Apellido materno', 'CURP', 'NSS',
            'Correo', u'Contactación', 'Forma de envio', u'Motivo no contactación')

    cont_reg = 0

    #Da estilo a la cabecera
    formatTitle = workbook.add_format()
    formatTitle.set_font_size(10)
    formatTitle.set_font_name('Arial')
    formatTitle.set_bold()
    formatTitle.set_align('center')
    formatTitle.set_align('vcenter')
    formatTitle.set_bg_color('green')
    formatTitle.set_font_color('white')

    #Da estilos a las celdas
    format = workbook.add_format()
    format.set_font_size(10)
    format.set_font_name('Arial')
    format.set_align('center')

    worksheetReg.set_column(0, 0, 17)
    worksheetReg.set_column(1, 10, 30)
    worksheetReg.set_row(0, 20)
    # Se inicia desde la primera celda. Las filas y columnas son inicializadas en cero
    row = 0
    col = 0

    # for para escribir el encabezado
    for nomCol in (cabReg):
        worksheetReg.write(row, col, nomCol, formatTitle)
        col += 1

    escribirLog("Se escribe el encabezado en el excel")

    row+=1
    col=0

    for fecha,nombre,paterno,materno,curp,nss,correo,enviocorreo,formaenvio,causa in regsCurRegx.fetchall():

        #LLena las celdas del excel
        worksheetReg.write(row, 0, fecha, format)
        worksheetReg.write(row, 1, nombre.decode('latin-1'), format)
        worksheetReg.write(row, 2, paterno.decode('latin-1'), format)
        worksheetReg.write(row, 3, materno.decode('latin-1'), format)
        worksheetReg.write(row, 4, curp, format)
        worksheetReg.write(row, 5, nss, format)
        worksheetReg.write(row, 6, correo, format)
        if enviocorreo == 0:
            worksheetReg.write(row, 7, "NO", format)
        else:
            worksheetReg.write(row, 7, "SI", format)
        worksheetReg.write(row, 8, formaenvio.decode('latin-1'), format)
        worksheetReg.write(row, 9, causa.decode('latin-1'), format)
        row+=1

    escribirLog("Se escribe toda la información en el excel. No. de Registros[%i]" % row)
    workbook.close()

    escribirLog("***Termina la generación del Excel***")


text:
require.config({
    paths: {
        "jquery": "/plugins/jquery/2.1.3/jquery.min",
        "semantic": "/plugins/semantic-ui/2.0/semantic.min",
        "lc4e": "/js/lc4e/jquery-extend",
        "se-accordion": "/plugins/semantic-ui/2.0/components/accordion.min",
        "se-api": "/plugins/semantic-ui/2.0/components/api.min",
        "se-breadcrumb": "/plugins/semantic-ui/2.0/components/breadcrumb.min",
        "se-checkbox": "/plugins/semantic-ui/2.0/components/checkbox.min",
        "se-dimmer": "/plugins/semantic-ui/2.0/components/dimmer.min",
        "se-form": "/plugins/semantic-ui/2.0/components/form.min",
        "se-dropdown": "/plugins/semantic-ui/2.0/components/dropdown.min",
        "se-modal": "/plugins/semantic-ui/2.0/components/modal.min",
        "se-nag": "/plugins/semantic-ui/2.0/components/nag.min",
        "se-popup": "/plugins/semantic-ui/2.0/components/popup.min",
        "se-progress": "/plugins/semantic-ui/2.0/components/progress.min",
        "se-rating": "/plugins/semantic-ui/2.0/components/rating.min",
        "se-search": "/plugins/semantic-ui/2.0/components/search.min",
        "se-shape": "/plugins/semantic-ui/2.0/components/shape.min",
        "se-sidebar": "/plugins/semantic-ui/2.0/components/sidebar.min",
        "se-site": "/plugins/semantic-ui/2.0/components/site.min",
        "se-state": "/plugins/semantic-ui/2.0/components/state.min",
        "se-sticky": "/plugins/semantic-ui/2.0/components/sticky.min",
        "se-tab": "/plugins/semantic-ui/2.0/components/tab.min",
        "se-table": "/plugins/semantic-ui/2.0/components/table.min",
        "se-transition": "/plugins/semantic-ui/2.0/components/transition.min",
        "se-video": "/plugins/semantic-ui/2.0/components/video.min",
        "se-visibility": "/plugins/semantic-ui/2.0/components/visibility.min",
    },
    shim: {
        'lc4e': ['jquery', 'semantic'],
        'semantic': ['jquery'],
        "se-accordion": ['jquery'],
        "se-api": ['jquery'],
        "se-breadcrumb": ['jquery'],
        "se-checkbox": ['jquery'],
        "se-dimmer": ['jquery'],
        "se-form": ['jquery'],
        "se-dropdown": ['jquery'],
        "se-modal": ['jquery'],
        "se-nag": ['jquery'],
        "se-popup": ['jquery'],
        "se-progress": ['jquery'],
        "se-rating": ['jquery'],
        "se-search": ['jquery'],
        "se-shape": ['jquery'],
        "se-sidebar": ['jquery'],
        "se-site": ['jquery'],
        "se-state": ['jquery'],
        "se-sticky": ['jquery'],
        "se-tab": ['jquery'],
        "se-table": ['jquery'],
        "se-transition": ['jquery'],
        "se-video": ['jquery'],
        "se-visibility": ['jquery'],
    }
});

require(['jquery', 'lc4e', 'semantic'], function ($) {
    $.lc4e.index = {
        ready: function () {
            var getArticles;
            $('#menu .ui.dropdown.item').dropdown({
                action: "nothing",
                transition: "scale",
                on: 'click'
            });
            $('#searchSite').on('focus', function () {
                $(this).addClass('expended');
            }).on('blur', function () {
                $(this).removeClass('expended')
            });

            $('#expendHeader').on('click', function () {
                $('#menu').toggleClass('expended');
            });

            $('#menu .column div:first a').on('click', function () {
                $('#menu>.column>.allmenus').transition({
                    animation: "fly down",
                    duration: 500,
                    onComplete: function () {
                        $('#menu>.column>.allmenus').toggleClass('menuhidden').removeClass("transition visible hidden").attr('style', '');
                    }
                });
            });

            $('#config-tool-options .angle.double.left.icon').on('click', function () {
                if ($($('#config-tool-options .ui.animated.selection.list:not(.hidden)').transition('fade left').attr('data-parent')).transition('fade left').attr('id') == 'menu1') {
                    $(this).addClass('transition hidden');
                }
            });

            $("#config-tool-options .ui.list .item[data-target^='#']").on('click', function () {
                $(this).parent().transition('fade left');
                $($(this).attr('data-target')).transition('fade left');
                $('#config-tool-options .angle.double.left.icon').removeClass('transition hidden');
            });

            $('#config-tool-cog').on('click', function () {
                $('#config-tool').toggleClass('closed');
            });
            var timer;
            $('#menuheader').visibility({
                offset: -1,
                continuous: true,
                onTopPassed: function () {
                    $.requestAnimationFrame(function () {
                        $('#menu').addClass('fixed');
                    })
                },
                onTopPassedReverse: function () {
                    clearTimeout(timer);
                    timer = setTimeout(function () {
                        $.requestAnimationFrame(function () {
                            $('#menu').removeClass('fixed');
                        })
                    }, 300);
                }
            });
            $('#GTTop').visibility({
                offset: -1,
                once: false,
                continuous: false,
                onTopPassed: function () {
                    $.requestAnimationFrame(function () {
                        $('#GTTop').transition('fade');
                    });
                },
                onTopPassedReverse: function () {
                    $.requestAnimationFrame(function () {
                        $('#GTTop').transition('fade');
                    });
                }
            });

            $('#userItem img.ui.image').popup({
                position: 'bottom center',
                transition: "horizontal flip",
                popup: $('#userCardPop'),
                exclusive: false,
                hideOnScroll: false,
                on: 'click',
                closable: true
            });

            $('#config-tool-options .ui.checkbox').checkbox();

            $('#fixFooter').checkbox({
                onChange: function (e) {
                    $('#content').toggleClass('footerFixed');
                    $('.ui.footer').toggleClass('fixed');
                }
            });

            $('#boxedLayout').checkbox({
                onChange: function (e) {
                    $('#articlelist').toggleClass('nobox');
                }
            });

            $('#announce').shape();
            setInterval(function () {
                $('#announce').shape('flip down');
            }, 4000);

            var page = parseInt($("#articlelist").attr("page"));
            window.onpopstate = function (e) {
                console.log(e);
            }
            $.Lc4eAjax({
                url: "/Articles",
                cjson: false,
                type: "get",
                dataType: "html",
            }).success(function (data) {
                $('#articlelist>.ui.divided.items').append(data);
                $('#articlelist>.ui.divided.items>.item').
                    transition({
                        animation: 'fade up',
                        duration: 500,
                        interval: 100,
                        onComplete: function () {
                            $('#articlelist>.ui.divided.items>.item').find('.ui.fluid.image img').popup();
                            $("#articlelist").attr("page", page);
                        }
                    })
            })

            $.get('/TopHots').done(function (data) {
                $('#todayHot>.ui.divided.items,#yesterdayHot>.ui.divided.items').empty().append(data);
                $('#todayHot>.ui.divided.items>.item,#yesterdayHot>.ui.divided.items>.item').
                    transition({
                        animation: 'fade right',
                        duration: 300,
                        interval: 80,
                    })
            });

            $('#GTTop').on('click', function (e) {
                e.preventDefault();
                $('html').animatescroll({
                    scrollSpeed: 1000,
                    easing: 'easeOutBounce'
                });
            });

            $('#prePage,#nextPage').on('click', function () {
                var page = parseInt($("#articlelist").attr("page")) + 1;
                $.Lc4eAjax({
                    url: "/Articles",
                    cjson: false,
                    type: "get",
                    dataType: "html"
                }).success(function (data) {
                    $('#articlelist>.ui.divided.items').empty().append(data);
                    $('#articlelist>.ui.divided.items>.item').
                        transition({
                            animation: 'fade up',
                            duration: 500,
                            interval: 100,
                            onComplete: function () {
                                $('#articlelist>.ui.divided.items>.item').find('.ui.fluid.image img').popup();
                                $("#articlelist").attr("page", page);
                            }
                        })
                })
            })
        }
    };
    $(function () {
        $.lc4e.index.ready();
    })
})

redpajama_set_name: RedPajamaGithub


text:
Michibayashi Rio / ミチバヤシリオ
Birthday: September 6, 1991
Joined: April 15, 2012 (Original BiS)
Left: September 22, 2013
"Gross" member
Lyrics written: BLEW, CHELSEA
PERSONAL LIFE:
She got married on May 20, 2018. [x] Ex-BiS members Pour Lui and First Summer Uika attended the wedding.
IDOL HISTORY:
She was always open about now wanting to be an idol forever. She agreed with Watanabe when joining BiS that she would only continue on until reaching her early 20s, as she wanted to work on establishing a career for herself. [x]
Despite leaving BiS, she did return to the stage to perform at the BiS final disbanding live in 2014.
On March 23, 2016, she was involved in Hirano Nozomi's solo song titled, どうせ消えてしまう命なら… The song itself and music video, featured ex-BiS members First Summer Uika, Tentenko, and Kamiya Saki. [x] The song features of BILLIE IDLE's EP '"4 in 1″ THE OFFICIAL BOOTLEG'
After Pour Lui started her YouTube career, she featured in some videos alongside her and other Ex-BiS members. [x]
COMPLETE HISTORY:
• Original BiS – Main Group – April 15, 2012 – September 22, 2013
• Full Discography
• Solo Interviews
• Group Interviews


Once again I've decided to take my prompt for the flag from the animated world. Last year I did the world flag from Futurama, but 10 points to anyone out there that knows what this flag is from?
In case you don't know, this is a flag from one of my favourite animated shows ever, The Simpsons. It's from the episode where Bart and Lisa are paired up together on a trip to Capital City and end up designing a new state flag. Lisa designs one that say "to fraternal love", and then unbeknownst to her, Bart redesigns it before the reveal to the parliamentarian to say "learn to fart".


text:
Mr Hublot est un court métrage d'animation franco-luxembourgeois réalisé et produit en 2013 par Laurent Witz et  coréalisé  par Alexandre Espigares avec les personnages du sculpteur belge Stéphane Halleux. En 2014, il remporte l'Oscar du meilleur court métrage d'animation lors de la  des Oscars.

Synopsis
Le film se déroule dans un univers urbain futuriste. Monsieur Hublot est un homme chauve habillé d'une chemise blanche, d'une cravate rouge sombre et d'une veste en cuir marron, qui porte d'énormes lunettes épaisses et qui a sur le front quatre trous carrés par lesquelles défilent des chiffres comme s'il comptait quelque chose. Monsieur Hublot présente plusieurs symptômes de trouble obsessionnel compulsif (TOC) : il éteint puis rallume plusieurs fois les lumières avant de se mettre au lit, passe régulièrement du temps à redresser les cadres des tableaux suspendus aux murs de sa maison.

Un jour, monsieur Hublot aperçoit dans une boîte un tout petit robot en forme de chiot qui grelotte de froid. Il le récupère avant que la boîte ne soit mise aux ordures. Il élève dans sa maison le chiot qui grandit et devient bientôt énorme. Le chien finit par causer beaucoup de dégâts dans la maison. Monsieur Hublot se dirige alors vers lui un tournevis à la main.

Après une ellipse, on retrouve monsieur Hublot et le chien qui ont déménagé dans l'entrepôt voisin, beaucoup plus spacieux que sa précédente maison. Ils vivent heureux, monsieur Hublot toujours victime de ses TOC.

Fiche technique
 Titre : Mr Hublot
 Réalisation : Laurent Witz et Alexandre Espigares
 Personnages  : Stéphane Halleux
 Musique originale : François Rousselot
 Image : Laurent Witz
 Direction artistique : Pascal Thiebaux
 Production : Laurent Witz
 Studios de production : ZEILT productions, WATT frame
 Distribution : Premium Films (diffusion en salles, France, 2014)
 Pays : France, Luxembourg
 Date de sortie : 2013
 Format : numérique, couleur
 Durée : 11 minutes

Genèse du projet
En 2008, Laurent Witz découvre l'œuvre du sculpteur belge Stéphane Halleux. Il remarque notamment une statuette, réalisée à partir de matériel de récupération, représentant Mr Hublot. Séduit par l'univers visuel du sculpteur, Witz lui propose de réaliser un court métrage d'animation mettant en scène ses personnages. Un premier scénario est écrit par Stéphane Halleux, responsable de la caractérisation au personnage de Mr Hublot, mais le scénario ne permet pas de financer le film. Un nouveau scénario est alors écrit par Laurent Witz. Trois ans sont nécessaires à la réalisation du film.

Production
Mr Hublot est coproduit par le studio d'animation ZEILT productions, fondé par Laurent Witz et installé à Mondercange au Luxembourg, et la société de production WATT frame, basée à Thionville en Lorraine. Le budget du film s'élève à  euros. Il est financé à 48 % par le Film Fund (fonds d'aide luxembourgeois), à 18 % par Laurent Witz, à 12 % par le CNC, à 12 % par la région Lorraine et à 10 % par Arte.

Sortie
La première a lieu en . Le film remporte plusieurs récompenses dans les festivals internationaux. En 2014, il est primé aux 3D & Advanced Imaging Society's Creative Arts Awards, consacré aux productions 3D. Lors de la  des Oscars, Mr Hublot remporte l'Oscar du meilleur court métrage d'animation.

Références

Liens externes

 ZEILT productions
 WATT frame

Film français sorti en 2013
Film luxembourgeois sorti en 2013
Court métrage d'animation français
Court métrage d'animation luxembourgeois
Film de science-fiction français
Film de science-fiction luxembourgeois
Court métrage de science-fiction
Film d'animation et de science-fiction
Film d'animation en images de synthèse
Oscar du meilleur court métrage (animation)
Film mettant en scène un chien
Film de science-fiction mettant en scène un robot
Film sonore sans dialogue


text:
import math
import numbers
import os

import numpy as np
import taichi.lang
from taichi._kernels import (tensor_to_image, vector_to_fast_image,
                             vector_to_image)
from taichi._lib import core as _ti_core
from taichi.lang.field import Field, ScalarField

import taichi as ti

# For window creation and drawing in the original ti.GUI system.
class GUI:
    """Taichi Graphical User Interface class.

    Args:
        name (str, optional): The name of the GUI to be constructed.
            Default is 'Taichi'.
        res (Union[int, List[int]], optional): The resolution of created
            GUI. Default is 512*512. If `res` is scalar, then width will be equal to height.
        background_color (int, optional): The background color of created GUI.
            Default is 0x000000.
        show_gui (bool, optional): Specify whether to render the GUI. Default is True.
        fullscreen (bool, optional): Specify whether to render the GUI in
            fullscreen mode. Default is False.
        fast_gui (bool, optional): Specify whether to use fast gui mode of
            Taichi. Default is False.

    Returns:
        :class:`~taichi.misc.gui.GUI` :The created taichi GUI object.

    """
    class Event:
        """Class for holding a gui event.

        An event is represented by:

        + type (PRESS, MOTION, RELEASE)
        + modifier (modifier keys like ctrl, shift, etc)
        + pos (mouse position)
        + key (event key)
        + delta (for holding mouse wheel)
        """
        def __init__(self):
            self.type = None
            self.modifier = None
            self.pos = None
            self.key = None
            self.delta = None

    # Event keys
    SHIFT = 'Shift'
    ALT = 'Alt'
    CTRL = 'Control'
    ESCAPE = 'Escape'
    RETURN = 'Return'
    TAB = 'Tab'
    BACKSPACE = 'BackSpace'
    SPACE = ' '
    UP = 'Up'
    DOWN = 'Down'
    LEFT = 'Left'
    RIGHT = 'Right'
    CAPSLOCK = 'Caps_Lock'
    LMB = 'LMB'
    MMB = 'MMB'
    RMB = 'RMB'
    EXIT = 'WMClose'
    WHEEL = 'Wheel'
    MOVE = 'Motion'

    # Event types
    MOTION = _ti_core.KeyEvent.EType.Move
    PRESS = _ti_core.KeyEvent.EType.Press
    RELEASE = _ti_core.KeyEvent.EType.Release

    def __init__(self,
                 name='Taichi',
                 res=512,
                 background_color=0x0,
                 show_gui=True,
                 fullscreen=False,
                 fast_gui=False):
        show_gui = self.get_bool_environ('TI_GUI_SHOW', show_gui)
        fullscreen = self.get_bool_environ('TI_GUI_FULLSCREEN', fullscreen)
        fast_gui = self.get_bool_environ('TI_GUI_FAST', fast_gui)

        self.name = name
        if isinstance(res, numbers.Number):
            res = (res, res)
        self.res = res
        self.fast_gui = fast_gui
        if fast_gui:
            self.img = np.ascontiguousarray(
                np.zeros(self.res[0] * self.res[1], dtype=np.uint32))
            fast_buf = self.img.ctypes.data
        else:
            # The GUI canvas uses RGBA for storage, therefore we need NxMx4 for an image.
            self.img = np.ascontiguousarray(
                np.zeros(self.res + (4, ), np.float32))
            fast_buf = 0
        self.core = _ti_core.GUI(name, core_veci(*res), show_gui, fullscreen,
                                 fast_gui, fast_buf)
        self.canvas = self.core.get_canvas()
        self.background_color = background_color
        self.key_pressed = set()
        self.event = None
        self.frame = 0
        self.clear()

    def __enter__(self):
        return self

    def __exit__(self, e_type, val, tb):
        self.close()

    def __del__(self):
        self.close()

    def close(self):
        """Close this GUI.

        Example::

            >>> while gui.running:
            >>>     if gui.get_event(gui.PRESS, ti.GUI.ESCAPE):
            >>>         gui.close()
            >>>     gui.show()
        """
        self.core = None  # dereference to call GUI::~GUI()

    # Widget system

    class WidgetValue:
        """Class for maintaining id of gui widgets.
        """
        def __init__(self, gui, wid):
            self.gui = gui
            self.wid = wid

        @property
        def value(self):
            return self.gui.core.get_widget_value(self.wid)

        @value.setter
        def value(self, value):
            self.gui.core.set_widget_value(self.wid, value)

    @staticmethod
    def get_bool_environ(key, default):
        """Get an environment variable and cast it to `bool`.

        Args:
            key (str): The environment variable key.
            default (bool): The default value.
        Return:
            The environment variable value cast to bool. \
            If the value is not found, directly return argument 'default'.
        """
        if key not in os.environ:
            return default
        return bool(int(os.environ[key]))

    def slider(self, text, minimum, maximum, step=1):
        """Creates a slider object on canvas to be manipulated with.

        Args:
            text (str): The title of slider.
            minimum (int, float): The minimum value of slider.
            maximum (int, float): The maximum value of slider.
            step (int, float): The changing step of slider. Optional and default to 1.

        Return:
            :class:`~taichi.misc.gui.GUI.WidgetValue` :The created slider object.
        """
        wid = self.core.make_slider(text, minimum, minimum, maximum, step)
        return GUI.WidgetValue(self, wid)

    def label(self, text):
        """Creates a label object on canvas.

        Args:
            text (str): The title of label.

        Return:
            :class:`~taichi.misc.gui.GUI.WidgetValue` :The created label object.

        """
        wid = self.core.make_label(text, 0)
        return GUI.WidgetValue(self, wid)

    def button(self, text, event_name=None):
        """Create a button object on canvas to be manipulated with.

        Args:
            text (str): The title of button.
            event_name (str, optional): The event name associated with button.
                Default is WidgetButton_{text}

        Return:
            The event name associated with created button.

        """
        event_name = event_name or f'WidgetButton_{text}'
        self.core.make_button(text, event_name)
        return event_name

    # Drawing system

    def clear(self, color=None):
        """Clears the canvas with the color provided.

        Args:
            color (int, optional): Specify the color to clear the canvas. Default
                is the background color of GUI.

        """
        if color is None:
            color = self.background_color
        self.canvas.clear(color)

    def cook_image(self, img):
        """Converts an img to range [0, 1] for display.

        The input image is stored in a `numpy.ndarray`, if it's dtype
        is `int` it will be rescaled and mapped into range [0, 1]. If
        the dtype is `float` it will be directly casted to 32-bit float type.
        """
        if img.dtype in [np.uint8, np.uint16, np.uint32, np.uint64]:
            img = img.astype(np.float32) * (1 / np.iinfo(img.dtype).max)
        elif img.dtype in [np.float16, np.float32, np.float64]:
            img = img.astype(np.float32)
        else:
            raise ValueError(
                f'Data type {img.dtype} not supported in GUI.set_image')

        if len(img.shape) == 2:
            img = img[..., None]

        if img.shape[2] == 1:
            img = img + np.zeros((1, 1, 4), np.float32)
        if img.shape[2] == 3:
            zeros = np.zeros((img.shape[0], img.shape[1], 1), np.float32)
            img = np.concatenate([img, zeros], axis=2)
        if img.shape[2] == 2:
            zeros = np.zeros((img.shape[0], img.shape[1], 2), np.float32)
            img = np.concatenate([img, zeros], axis=2)

        assert img.shape[2] == 4, "Image must be grayscale, RG, RGB or RGBA"

        res = img.shape[:2]
        assert res == self.res, "Image resolution does not match GUI resolution"
        return np.ascontiguousarray(img)

    def get_image(self):
        """Return the window content as an `numpy.ndarray`.

        Returns:
            :class:`numpy.array` :The image data in numpy contiguous array type.
        """
        self.img = np.ascontiguousarray(self.img)
        self.core.get_img(self.img.ctypes.data)
        return self.img

    def set_image(self, img):
        """Sets an image to display on the window.

        The image pixels are set from the values of `img[i, j]`, where `i` indicates
        the horizontal coordinates (from left to right) and `j` the vertical coordinates
        (from bottom to top).

        If the window size is `(x, y)`, then `img` must be one of:
            - `ti.field(shape=(x, y))`, a gray-scale image
            - `ti.field(shape=(x, y, 3))`, where `3` is for `(r, g, b)` channels
            - `ti.field(shape=(x, y, 2))`, where `2` is for `(r, g)` channels
            - `ti.Vector.field(3, shape=(x, y))` `(r, g, b)` channels on each component
            - `ti.Vector.field(2, shape=(x, y))` `(r, g)` channels on each component
            - `np.ndarray(shape=(x, y))`
            - `np.ndarray(shape=(x, y, 3))`
            - `np.ndarray(shape=(x, y, 2))`

        The data type of `img` must be one of:
            - `uint8`, range `[0, 255]`
            - `uint16`, range `[0, 65535]`
            - `uint32`, range `[0, 4294967295]`
            - `float32`, range `[0, 1]`
            - `float64`, range `[0, 1]`

        Args:
            img (Union[:class:`taichi.field`, `numpy.array`]): The color array \
                representing the image to be drawn. Support greyscale, RG, RGB, \
                and RGBA color representations. Its shape must match GUI resolution.
        """

        if self.fast_gui:
            assert isinstance(img, taichi.lang.matrix.MatrixField), \
                "Only ti.Vector.field is supported in GUI.set_image when fast_gui=True"
            assert img.shape == self.res, \
                "Image resolution does not match GUI resolution"
            assert img.n in [3, 4] and img.m == 1, \
                "Only RGB images are supported in GUI.set_image when fast_gui=True"
            assert img.dtype in [ti.f32, ti.f64, ti.u8], \
                "Only f32, f64, u8 are supported in GUI.set_image when fast_gui=True"

            vector_to_fast_image(img, self.img)
            return

        if isinstance(img, ScalarField):
            if _ti_core.is_integral(img.dtype) or len(img.shape) != 2:
                # Images of uint is not optimized by xxx_to_image
                self.img = self.cook_image(img.to_numpy())
            else:
                # Type matched! We can use an optimized copy kernel.
                assert img.shape \
                    == self.res, "Image resolution does not match GUI resolution"
                tensor_to_image(img, self.img)
                ti.sync()

        elif isinstance(img, taichi.lang.matrix.MatrixField):
            if _ti_core.is_integral(img.dtype):
                self.img = self.cook_image(img.to_numpy())
            else:
                # Type matched! We can use an optimized copy kernel.
                assert img.shape == self.res, \
                    "Image resolution does not match GUI resolution"
                assert img.n in [2, 3, 4] and img.m == 1, \
                    "Only greyscale, RG, RGB or RGBA images are supported in GUI.set_image"

                vector_to_image(img, self.img)
                ti.sync()

        elif isinstance(img, np.ndarray):
            self.img = self.cook_image(img)

        else:
            raise ValueError(
                f"GUI.set_image only takes a Taichi field or NumPy array, not {type(img)}"
            )

        self.core.set_img(self.img.ctypes.data)

    def circle(self, pos, color=0xFFFFFF, radius=1):
        """Draws a circle on canvas.

        Args:
            pos (Union[List[int], numpy.array]): The position of the circle.
            color (int, Optional): The color of the circle. Default is 0xFFFFFF.
            radius (Number, Optional): The radius of the circle in pixel. Default is 1.
        """
        self.canvas.circle_single(pos[0], pos[1], color, radius)

    def circles(self,
                pos,
                radius=1,
                color=0xFFFFFF,
                palette=None,
                palette_indices=None):
        """Draws a list of circles on canvas.

        Args:
            pos (numpy.array): The positions of the circles.
            radius (Number, optional): The radius of the circles in pixel. Default is 1.
            color (int, optional): The color of the circles. Default is 0xFFFFFF.
            palette (list[int], optional): The List of colors from which to
                choose to draw. Default is None.
            palette_indices (Union[list[int], ti.field, numpy.array], optional):
                The List of indices that choose color from palette for each
                circle. Shape must match pos. Default is None.

        """
        n = pos.shape[0]
        if len(pos.shape) == 3:
            assert pos.shape[2] == 1
            pos = pos[:, :, 0]

        assert pos.shape == (n, 2)
        pos = np.ascontiguousarray(pos.astype(np.float32))
        # Note: do not use "pos = int(pos.ctypes.data)" here
        # Otherwise pos will get garbage collected by Python
        # and the pointer to its data becomes invalid
        pos_ptr = int(pos.ctypes.data)

        if isinstance(color, np.ndarray):
            assert color.shape == (n, )
            color = np.ascontiguousarray(color.astype(np.uint32))
            color_array = int(color.ctypes.data)
            color_single = 0
        elif isinstance(color, int):
            color_array = 0
            color_single = color
        else:
            raise ValueError(
                'Color must be an ndarray or int (e.g., 0x956333)')

        if palette is not None:
            assert palette_indices is not None, 'palette must be used together with palette_indices'

            if isinstance(palette_indices, Field):
                ind_int = palette_indices.to_numpy().astype(np.uint32)
            elif isinstance(palette_indices, list) or isinstance(
                    palette_indices, np.ndarray):
                ind_int = np.array(palette_indices).astype(np.uint32)
            else:
                try:
                    ind_int = np.array(palette_indices)
                except:
                    raise TypeError(
                        'palette_indices must be a type that can be converted to numpy.ndarray'
                    )

            assert issubclass(
                ind_int.dtype.type,
                np.integer), 'palette_indices must be an integer array'
            assert ind_int.shape == (
                n,
            ), 'palette_indices must be in 1-d shape with shape (num_particles, )'
            assert min(
                ind_int
            ) >= 0, 'the min of palette_indices must not be less than zero'
            assert max(ind_int) < len(
                palette
            ), 'the max of palette_indices must not exceed the length of palette'
            color_array = np.array(palette, dtype=np.uint32)[ind_int]
            color_array = np.ascontiguousarray(color_array)
            color_array = color_array.ctypes.data

        if isinstance(radius, np.ndarray):
            assert radius.shape == (n, )
            radius = np.ascontiguousarray(radius.astype(np.float32))
            radius_array = int(radius.ctypes.data)
            radius_single = 0
        elif isinstance(radius, numbers.Number):
            radius_array = 0
            radius_single = radius
        else:
            raise ValueError('Radius must be an ndarray or float (e.g., 0.4)')

        self.canvas.circles_batched(n, pos_ptr, color_single, color_array,
                                    radius_single, radius_array)

    def triangles(self, a, b, c, color=0xFFFFFF):
        """Draws a list of triangles on canvas.

        Args:
            a (numpy.array): The positions of the first points of triangles.
            b (numpy.array): The positions of the second points of triangles.
            c (numpy.array): The positions of the third points of triangles.
            color (Union[int, numpy.array], optional): The color or colors of triangles.
                Can be either a single color or a list of colors whose shape matches
                the shape of a & b & c. Default is 0xFFFFFF.

        """
        assert a.shape == b.shape
        assert a.shape == c.shape
        n = a.shape[0]
        if len(a.shape) == 3:
            assert a.shape[2] == 1
            a = a[:, :, 0]
            b = b[:, :, 0]
            c = c[:, :, 0]

        assert a.shape == (n, 2)
        a = np.ascontiguousarray(a.astype(np.float32))
        b = np.ascontiguousarray(b.astype(np.float32))
        c = np.ascontiguousarray(c.astype(np.float32))
        # Note: do not use "a = int(a.ctypes.data)" here
        # Otherwise a will get garbage collected by Python
        # and the pointer to its data becomes invalid
        a_ptr = int(a.ctypes.data)
        b_ptr = int(b.ctypes.data)
        c_ptr = int(c.ctypes.data)

        if isinstance(color, np.ndarray):
            assert color.shape == (n, )
            color = np.ascontiguousarray(color.astype(np.uint32))
            color_array = int(color.ctypes.data)
            color_single = 0
        elif isinstance(color, int):
            color_array = 0
            color_single = color
        else:
            raise ValueError(
                '"color" must be an ndarray or int (e.g., 0x956333)')

        self.canvas.triangles_batched(n, a_ptr, b_ptr, c_ptr, color_single,
                                      color_array)

    def triangle(self, a, b, c, color=0xFFFFFF):
        """Draws a single triangle on canvas.

        Args:
            a (List[Number]): The position of the first point of triangle. Shape must be 2.
            b (List[Number]): The position of the second point of triangle. Shape must be 2.
            c (List[Number]): The position of the third point of triangle. Shape must be 2.
            color (int, optional): The color of the triangle. Default is 0xFFFFFF.
        """
        self.canvas.triangle_single(a[0], a[1], b[0], b[1], c[0], c[1], color)

    def lines(self, begin, end, radius=1, color=0xFFFFFF):
        """Draw a list of lines on canvas.

        Args:
            begin (numpy.array): The positions of one end of lines.
            end (numpy.array): The positions of the other end of lines.
            radius (Union[Number, numpy.array], optional): The width of lines.
                Can be either a single width or a list of width whose shape matches
                the shape of begin & end. Default is 1.
            color (Union[int, numpy.array], optional): The color or colors of lines.
                Can be either a single color or a list of colors whose shape matches
                the shape of begin & end. Default is 0xFFFFFF.

        """
        assert begin.shape == end.shape
        n = begin.shape[0]
        if len(begin.shape) == 3:
            assert begin.shape[2] == 1
            begin = begin[:, :, 0]
            end = end[:, :, 0]

        assert begin.shape == (n, 2)
        begin = np.ascontiguousarray(begin.astype(np.float32))
        end = np.ascontiguousarray(end.astype(np.float32))
        # Note: do not use "begin = int(begin.ctypes.data)" here
        # Otherwise begin will get garbage collected by Python
        # and the pointer to its data becomes invalid
        begin_ptr = int(begin.ctypes.data)
        end_ptr = int(end.ctypes.data)

        if isinstance(color, np.ndarray):
            assert color.shape == (n, )
            color = np.ascontiguousarray(color.astype(np.uint32))
            color_array = int(color.ctypes.data)
            color_single = 0
        elif isinstance(color, int):
            color_array = 0
            color_single = color
        else:
            raise ValueError(
                'Color must be an ndarray or int (e.g., 0x956333)')

        if isinstance(radius, np.ndarray):
            assert radius.shape == (n, )
            radius = np.ascontiguousarray(radius.astype(np.float32))
            radius_array = int(radius.ctypes.data)
            radius_single = 0
        elif isinstance(radius, numbers.Number):
            radius_array = 0
            radius_single = radius
        else:
            raise ValueError('Radius must be an ndarray or float (e.g., 0.4)')

        self.canvas.paths_batched(n, begin_ptr, end_ptr, color_single,
                                  color_array, radius_single, radius_array)

    def line(self, begin, end, radius=1, color=0xFFFFFF):
        """Draws a single line on canvas.

        Args:
            begin (List[Number]): The position of one end of line. Shape must be 2.
            end (List[Number]): The position of the other end of line. Shape must be 2.
            radius (Number, optional): The width of line. Default is 1.
            color (int, optional): The color of line. Default is 0xFFFFFF.

        """
        self.canvas.path_single(begin[0], begin[1], end[0], end[1], color,
                                radius)

    @staticmethod
    def _arrow_to_lines(orig, major, tip_scale=0.2, angle=45):
        angle = math.radians(180 - angle)
        c, s = math.cos(angle), math.sin(angle)
        minor1 = np.array([
            major[:, 0] * c - major[:, 1] * s,
            major[:, 0] * s + major[:, 1] * c
        ]).swapaxes(0, 1)
        minor2 = np.array([
            major[:, 0] * c + major[:, 1] * s,
            -major[:, 0] * s + major[:, 1] * c
        ]).swapaxes(0, 1)
        end = orig + major
        return [(orig, end), (end, end + minor1 * tip_scale),
                (end, end + minor2 * tip_scale)]

    def arrows(self, orig, direction, radius=1, color=0xffffff, **kwargs):
        """Draw a list arrows on canvas.

        Args:
            orig (numpy.array): The positions where arrows start.
            direction (numpy.array): The directions where arrows point to.
            radius (Union[Number, np.array], optional): The width of arrows. Default is 1.
            color (Union[int, np.array], optional): The color or colors of arrows. Default is 0xffffff.

        """
        for begin, end in self._arrow_to_lines(orig, direction, **kwargs):
            self.lines(begin, end, radius, color)

    def arrow(self, orig, direction, radius=1, color=0xffffff, **kwargs):
        """Draws a single arrow on canvas.

        Args:
            orig (List[Number]): The position where arrow starts. Shape must be 2.
            direction (List[Number]): The direction where arrow points to. Shape must be 2.
            radius (Number, optional): The width of arrow. Default is 1.
            color (int, optional): The color of arrow. Default is 0xFFFFFF.

        """
        orig = np.array([orig])
        direction = np.array([direction])
        for begin, end in self._arrow_to_lines(orig, direction, **kwargs):
            self.line(begin[0], end[0], radius, color)

    def rect(self, topleft, bottomright, radius=1, color=0xFFFFFF):
        """Draws a single rectangle on canvas.

        Args:
            topleft (List[Number]): The position of the topleft corner of rectangle.
                Shape must be 2.
            bottomright (List[Number]): The position of the bottomright corner
                of rectangle. Shape must be 2.
            radius (Number, optional): The width of rectangle's sides. Default is 1.
            color (int, optional): The color of rectangle. Default is 0xFFFFFF.

        """
        a = topleft[0], topleft[1]
        b = bottomright[0], topleft[1]
        c = bottomright[0], bottomright[1]
        d = topleft[0], bottomright[1]
        self.line(a, b, radius, color)
        self.line(b, c, radius, color)
        self.line(c, d, radius, color)
        self.line(d, a, radius, color)

    def text(self, content, pos, font_size=15, color=0xFFFFFF):
        """Draws texts on canvas.

        Args:
            content (str): The text to be drawn on canvas.
            pos (List[Number]): The position where the text is to be put.
            font_size (Number, optional): The font size of the text.
            color (int, optional): The color of the text. Default is 0xFFFFFF.

        """

        # TODO: refactor Canvas::text
        font_size = float(font_size)
        pos = core_vec(*pos)
        r, g, b = hex_to_rgb(color)
        color = core_vec(r, g, b, 1)
        self.canvas.text(content, pos, font_size, color)

    @staticmethod
    def _make_field_base(w, h, bound):
        x = np.linspace(bound / w, 1 - bound / w, w)
        y = np.linspace(bound / h, 1 - bound / h, h)
        base = np.array(np.meshgrid(x, y))
        base = base.swapaxes(0, 1).swapaxes(1, 2).swapaxes(0, 1)
        return base.reshape(w * h, 2)

    def point_field(self, radius, color=0xffffff, bound=0.5):
        """Draws a field of points on canvas.

        Args:
            radius (np.array): The pattern and radius of the field of points.
            color (Union[int, np.array], optional): The color or colors of points.
                Default is 0xFFFFFF.
            bound (Number, optional): The boundary of the field. Default is 0.5.

        """
        assert len(radius.shape) == 2
        base = self._make_field_base(radius.shape[0], radius.shape[1], bound)
        radius = radius.reshape(radius.shape[0] * radius.shape[1])
        self.circles(base, radius=radius, color=color)

    def arrow_field(self,
                    direction,
                    radius=1,
                    color=0xffffff,
                    bound=0.5,
                    **kwargs):
        """Draw a field of arrows on canvas.

        Args:
            direction (np.array): The pattern and direction of the field of arrows.
            color (Union[int, np.array], optional): The color or colors of arrows.
                Default is 0xFFFFFF.
            bound (Number, optional): The boundary of the field. Default is 0.5.

        """
        assert len(direction.shape) == 3
        assert direction.shape[2] == 2
        base = self._make_field_base(direction.shape[0], direction.shape[1],
                                     bound)
        direction = direction.reshape(direction.shape[0] * direction.shape[1],
                                      2)
        self.arrows(base, direction, radius=radius, color=color, **kwargs)

    def show(self, file=None):
        """Shows the frame content in the gui window, or save the content to an
        image file.

        Args:
            file (str, optional): output filename. The default is `None`, and
                the frame content is displayed in the gui window. If it's a valid
                image filename the frame will be saved as the specified image.
        """
        self.core.update()
        if file:
            self.core.screenshot(file)
        self.frame += 1
        self.clear()

    # Event system

    class EventFilter:
        """A set to store detected user events.
        """
        def __init__(self, *e_filter):
            self.filter = set()
            for ent in e_filter:
                if isinstance(ent, (list, tuple)):
                    e_type, key = ent
                    ent = (e_type, key)
                self.filter.add(ent)

        def match(self, e):
            """Check if a specified event `e` is among the detected events.
            """
            if (e.type, e.key) in self.filter:
                return True
            if e.type in self.filter:
                return True
            if e.key in self.filter:
                return True
            return False

    def has_key_event(self):
        """Check if there is any key event registered.

        Returns:
            bool: whether or not there is any key event registered.
        """
        return self.core.has_key_event()

    def get_event(self, *e_filter):
        """Checks if the specified event is triggered.

        Args:
            *e_filter (ti.GUI.EVENT): The specific event to be checked.

        Returns:
            bool: whether or not the specified event is triggered.
        """
        for e in self.get_events(*e_filter):
            self.event = e
            return True
        else:
            return False

    def get_events(self, *e_filter):
        """Gets a list of events that are triggered.

        Args:
            *e_filter (List[ti.GUI.EVENT]): The type of events to be filtered.

        Returns:
            :class:`~taichi.misc.gui.GUI.EVENT`: A list of events that are triggered.
        """
        e_filter = e_filter and GUI.EventFilter(*e_filter) or None

        while True:
            if not self.has_key_event():
                break
            e = self.get_key_event()
            if e_filter is None or e_filter.match(e):  # pylint: disable=E1101
                yield e

    def get_key_event(self):
        """Gets keyboard triggered event.

        Returns:
            :class:`~taichi.misc.gui.GUI.EVENT`: The keyboard triggered event.
        """
        self.core.wait_key_event()

        e = GUI.Event()
        event = self.core.get_key_event_head()

        e.type = event.type
        e.key = event.key
        e.pos = self.core.canvas_untransform(event.pos)
        e.pos = (e.pos[0], e.pos[1])
        e.modifier = []

        if e.key == GUI.WHEEL:
            e.delta = event.delta
        else:
            e.delta = (0, 0)

        for mod in ['Shift', 'Alt', 'Control']:
            if self.is_pressed(mod):
                e.modifier.append(mod)

        if e.type == GUI.PRESS:
            self.key_pressed.add(e.key)
        else:
            self.key_pressed.discard(e.key)

        self.core.pop_key_event_head()
        return e

    def is_pressed(self, *keys):
        """Checks if any key among a set of specified keys is pressed.

        Args:
            *keys (Union[str, List[str]]): The keys to be listened to.

        Returns:
            bool: whether or not any key among the specified keys is pressed.
        """
        for key in keys:
            if key in ['Shift', 'Alt', 'Control']:
                if key + '_L' in self.key_pressed or key + '_R' in self.key_pressed:
                    return True
            if key in self.key_pressed:
                return True
        else:
            return False

    def get_cursor_pos(self):
        """Returns the current position of mouse as a pair of floats
        in the range `[0, 1] x [0, 1]`.

        The origin of the coordinates system is located at the lower left
        corner, with `+x` direction points to the right, and `+y` direcntion
        points upward.

        Returns:
            The current position of mouse.
        """
        pos = self.core.get_cursor_pos()
        return pos[0], pos[1]

    @property
    def running(self):
        """Returns whether this gui is running or not.

        Returns:
            bool: whether this gui is running or not.
        """
        return not self.core.should_close

    @running.setter
    def running(self, value):
        """Sets the running status of this gui. `True` for running
        and `False` for stop.

        Args:
            value (bool): `True/False` for running/stop.
        """
        if value:
            self.core.should_close = 0
        elif not self.core.should_close:
            self.core.should_close = 1

    @property
    def fps_limit(self):
        """Gets the maximum fps of this gui.

        Returns:
            int: the maximum fps.
        """
        if self.core.frame_delta_limit == 0:
            return None
        return 1 / self.core.frame_delta_limit

    @fps_limit.setter
    def fps_limit(self, value):
        """Set the maximum fps for the gui. This is the maximum number of
        frames that the gui can show in one second.

        Args:
            value (int): maximum fps.
        """
        if value is None:
            self.core.frame_delta_limit = 0
        else:
            self.core.frame_delta_limit = 1 / value

def rgb_to_hex(c):
    """Converts rgb color format to hex color format.

    Args:
        c (List[int]): The rgb representation of color.

    Returns:
        The hex representation of color.
    """
    def to255(x):
        return np.clip(np.int32(x * 255), 0, 255)

    return (to255(c[0]) << 16) + (to255(c[1]) << 8) + to255(c[2])

def hex_to_rgb(color):
    """Converts hex color format to rgb color format.

    Args:
        color (int): The hex representation of color.

    Returns:
        The rgb representation of color.
    """
    r, g, b = (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff
    return r / 255, g / 255, b / 255

def core_veci(*args):
    if isinstance(args[0], _ti_core.Vector2i):
        return args[0]
    if isinstance(args[0], _ti_core.Vector3i):
        return args[0]
    if isinstance(args[0], tuple):
        args = tuple(*args)
    if len(args) == 2:
        return _ti_core.Vector2i(int(args[0]), int(args[1]))
    if len(args) == 3:
        return _ti_core.Vector3i(int(args[0]), int(args[1]), int(args[2]))
    if len(args) == 4:
        return _ti_core.Vector4i(int(args[0]), int(args[1]), int(args[2]),
                                 int(args[3]))
    assert False, type(args[0])

def core_vec(*args):
    if isinstance(args[0], _ti_core.Vector2f):
        return args[0]
    if isinstance(args[0], _ti_core.Vector3f):
        return args[0]
    if isinstance(args[0], _ti_core.Vector4f):
        return args[0]
    if isinstance(args[0], _ti_core.Vector2d):
        return args[0]
    if isinstance(args[0], _ti_core.Vector3d):
        return args[0]
    if isinstance(args[0], _ti_core.Vector4d):
        return args[0]
    if isinstance(args[0], tuple):
        args = tuple(*args)
    if _ti_core.get_default_float_size() == 4:
        if len(args) == 2:
            return _ti_core.Vector2f(float(args[0]), float(args[1]))
        if len(args) == 3:
            return _ti_core.Vector3f(float(args[0]), float(args[1]),
                                     float(args[2]))
        if len(args) == 4:
            return _ti_core.Vector4f(float(args[0]), float(args[1]),
                                     float(args[2]), float(args[3]))
        assert False, type(args[0])
    else:
        if len(args) == 2:
            return _ti_core.Vector2d(float(args[0]), float(args[1]))
        if len(args) == 3:
            return _ti_core.Vector3d(float(args[0]), float(args[1]),
                                     float(args[2]))
        if len(args) == 4:
            return _ti_core.Vector4d(float(args[0]), float(args[1]),
                                     float(args[2]), float(args[3]))
        assert False, type(args[0])

__all__ = [
    'GUI',
    'rgb_to_hex',
    'hex_to_rgb',
]