text:
The Texture of Generosity
The 2022 Spirit of Philanthropy Award recipient
story by Bruce Hallmark
Linda Carlson at an event celebrating faculty emeriti, retirees and donors held in the Avenir Museum in April 2022.
Her name sits atop the door to Room 157 just inside the main entrance to the Avenir Museum of Design and Merchandising. It was her classroom when she was a teacher in the Department of Design and Merchandising in Colorado State University's College of Health and Human Sciences.
For Linda L. Carlson (M.S., '88), curator emerita of the Avenir Museum, that token of appreciation was more than enough recognition for her 22-year career curating the department's costume and textiles collection.
The department and the college, however, saw things differently. Last month, Carlson was chosen as the 2022 recipient of the Spirit of Philanthropy Award.
"It was amazing! I was absolutely flabbergasted," said Carlson, who was attending a college event celebrating faculty emeriti, retirees, and donors when the announcement of the award was made.
The award is given annually by the Division of University Advancement to a current, emeritus, or retired faculty or staff member who has demonstrated exceptional leadership and a sustained commitment to increasing public understanding of the mission and programs of the University and worked collaboratively with a development team on fundraising activities.
Carlson is quick to point out that her success was a team sport. "It was about a lot of people who shared my passion, who were supportive of what I was doing and believed in the mission of the Avenir Museum. I certainly had a love and passion for it, but I didn't accomplish this by myself."
Sewing success
Former President Tony Frank and Linda Carlson at the grand opening of the Avenir Museum in 2016.
"I grew up loving textiles," Carlson said, "but I think my first love was history, especially Russian history, when I was in grade school. And I also always sewed and did handwork and embroidery."
She earned a bachelor's degree in consumer-related studies from The Pennsylvania State University in 1971 before moving to Denver, Colorado, where she met her husband, Jonathan Carlson, Ph.D., (B.S., '68). The two came to Fort Collins after Jonathan accepted a faculty position at CSU and became a professor emeritus of microbiology. They had two children, Peter and Hannah.
"When I went to graduate school at CSU, I really wasn't looking for a job. I had small children at home; graduate school was a way to get out of the house, and I had a wonderful time." It also gave Carlson the opportunity to combine her love of textiles and history into a career she never anticipated.
While earning her master's degree in textiles and clothing, Carlson worked with the costume collection and was hired right out of graduate school in 1988 as the curator for the costume and textiles collection. (The word "costume" implies apparel worn by theater performers or Halloween disguises, but it's the industry term for clothing in all its forms.)
Becoming the Avenir
Linda Carlson (second from left) with Richard Blackwell at a CSU alumni and donor event in Los Angles in the late 1990s.
In the late 1980s, a chic dress shop in Denver, which carried and collected a line of clothing by renowned fashion designer Richard Blackwell, donated about 50 items to the costume and textiles collection. "Mr. Blackwell," as he was known in the industry, learned of the donation and contacted Carlson. He visited campus shortly thereafter, which was the start of a relationship that lasted for years. He returned in 1996 to teach for a week, and in 2010, she curated and facilitated an exhibit titled, "Mr. Blackwell: A Retrospective," in his honor.
"I adored Mr. Blackwell," Carlson said. "I was able to visit him in Los Angeles, and I had calls from other designers who were getting ready to let go of things – including an archivist for Calvin Klein who sent us a collection from the 1990s – who had heard about us. It was just astounding."
Throughout her career, Carlson enjoyed teaching courses related to textiles and the costume collection. "I always told my students at the beginning of costume history class that there are a lot of reasons clothes are important, but as Mark Twain said, 'naked people have very little influence on society.'"
In 2008, Carlson oversaw the move of the costumes collection from the Gifford Building to the University Center for the Arts, where, through the generosity of donors, it became the Avenir Museum. The space provided more exposure for the collection to the community and scholars and was a major step in establishing its credibility as a serious museum.
In the years that followed, additional philanthropic gifts aligned with Carlson's vision of expanding the Avenir Museum from a single gallery within the UCA to a separate building adjacent to the UCA. The new LEED-certified facility opened in 2016 with state-of-the-art collection storage and conservation laboratory, three galleries, the Linda L. Carlson Classroom, library, and management areas.
Carlson is also proud of the cross-campus collaborations the museum helped foster over the years with the departments of history and anthropology to have students work in the museum, study exhibition design, and learn how to properly care for and handle artifacts.
Linda Carlson with an artifact from the costume and textiles collection in the Gifford storage facility circa 2007.
Carlson retired in 2011 but has remained actively engaged with the museum and the Department of Design and Merchandising. The college named her a Legacies Honoree in 2015 and created a video and webpage celebrating her career at CSU. In 2018, a gift from Lucile E. Hawks, a longtime friend of Carlson's, established the Linda L. Carlson Acquisitions for the Avenir Museum Endowment that supports acquiring and preserving items for the collection, which now includes more than 20,000 historic apparel and textiles artifacts.
Additionally, a transformational estate gift to the college by an anonymous donor will establish a University endowed chair position in honor of Carlson and her vital role in curating the collection and helping create the museum.
That kind of tangible recognition by friends and donors speaks volumes about Carlson's dedication to her work and the professional manner in which she pursued it. "I think I had the best job on the whole campus because I loved it and it was fun."
Avenir Museum of Design and MerchandisingCollege of Health and Human SciencesDepartment of Design and Merchandising


Nicholson, A.C., Gulvik, C.A., Whitney, A.M., Humrighouse, B.W., Graziano, J., Emery, B., Bell, M., Loparev, V., Juieng, P., Gartin, J., Bizet, C., Clermont, D., Criscuolo, A., Brisse, S., and McQuiston, J.R. "Revisiting the taxonomy of the genus Elizabethkingia using whole-genome sequencing, optical mapping, and MALDI-TOF, along with proposal of three novel Elizabethkingia species: Elizabethkingia bruuniana sp. nov., Elizabethkingia ursingii sp. nov., and Elizabethkingia occulta sp. nov." Antonie van Leeuwenhoek (2018) 111:55-72.


text:
using UnityEngine;
using System.Collections;

public class HammerController : MonoBehaviour
{
	public float speed;

	private int direction = -1;

	void Update() {
		float yPosition = transform.position.y;

		if (yPosition <= 5 || yPosition >= 14) {
			direction *= -1;
		}

		transform.position = new Vector3(transform.position.x, yPosition + direction * speed, transform.position.z);
	}
}

redpajama_set_name: RedPajamaGithub


A Florida judge had a complete change of heart about the legality of so-called "pre-reveal" gaming machines this week.
In March, Judge John Cooper ruled the machines were "not an illegal slot machine or gambling device" because he felt something couldn't be considered a game of chance if the outcome was known beforehand.
But the Seminole Tribe of Florida asked him to reconsider, warning that the declared legality of the machines was in breach of its compact with the state and could cost the state billions of dollars in future revenue-share payments.
"Slots-style type games materially the same as these have been held by federal and state courts in other jurisdictions to be illegal slot machines and are a clear violation of the Tribe's negotiated exclusivity as set forth in its gaming compact with the state which guarantee exclusive operation of slot machines outside of Miami-Dade and Broward counties in exchange for monthly payments," wrote Marcellus Osceola Jr, chairman of the Tribal Council.
On Monday, Cooper changed his mind. Pre-reveal machines, which can be found in bars throughout the state, were illegal unregulated slot machines, he said.
He had gotten it "wrong the first time around," he admitted, because he hadn't fully understood the nature of the machines.
His reversal had nothing to do with pressure from the Seminoles but was based on hearing further arguments on how pre-reveals actually work, he added.
"My holding is not based upon whether (the Tribe) likes the ruling or dislikes the ruling," said Cooper.
The machines, distributed by the Gator Coin II Company of Jacksonville, which brought the original case, invite players to press a preview button before play can be activated, which informs them whether the next spin will win or lose.
Gator Coin argues that the machines are "no chance" machines because the outcome of each spin is known to the player before it happens. But the reality is, the player is ultimately gambling on winning the spin afterwards, which remains unknown.
Other than that, the machines look like slots and, like slots, "operate upon the insertion of money and award prizes through the element of chance," according to the state's filing.
Cooper said he now understood the game was a "series of plays," including known and unknown outcomes.
Kathey Bright Fanning, president of Gator Coin II company told reporters outside the court she was "disappointed" with the judge's reversal.


Louisville, CO September 19, 2012 (Altius PR) — Altius Space Machines is pleased to announce that it has been selected by the Jet Propulsion Laboratory of Pasadena, CA. to provide engineering services as part of the DARPA Phoenix Program. The goal of the DARPA Phoenix Program is to develop and demonstrate technologies to cooperatively repurpose valuable components from retired, nonworking satellites and demonstrate the ability to create new space systems at greatly reduced cost.
Altius Space Machines will work with JPL to develop a Gecko Gripper Touch-to-Grasp tool incorporating JPL's synthetic Gecko adhesive technology that mimics the ability of Gecko lizards to adhere to walls. This effort will leverage previous work done by Altius on uncooperative capture mechanisms.


After our big move to Melbourne's CBD, we were ready to enjoy an after-work drink!
Last Wednesday we launched 'The 6pm Knock-off'. A better way to try on shoes, the evening offered the opportunity to meet and mingle while enjoying live jazz, and indulge in a large grazing table and a quiet tipple.
To kick off our very first knock-off, we invited everyone to join the fun. A few of our favourite local men's brands got on board with some exclusive offers.
Melbourne clothier Hermen Menswear showcased their made-to-measure suiting options, highlighting their use of light canvassing and fine finishing techniques. Passionate about all things shoe care, Trimly offered advice on apparel and wardrobe maintenance. Melbourne Watch Company displayed their carefully crafted, Melbourne-made timepieces, and grooming specialists Beard and Blade provided an array of unique styling products from around the globe. But the crowd favourite was STARWARD, with their one-of-kind whisky, sipped on throughout the evening.
Thanks to Thick Black Frames' Phil Huynh for capturing the night. The beginning of a series of after work events, we hope to see you at the next one!


text:
Center for Generational Studies Livable Communities Project
The Center for Generational Studies (CGS) was founded in 2011 through a partnership with the Via Center and the University of South Alabama's Programs in Gerontology. The Via Center is used as a living laboratory to research and create solutions for similar issues (disease, social problems) among youth, older adults and families. Initiatives include: internships, and health and wellness programs, an annual resiliency conference and intergenerational activities such as a song ministry, art projects, dances and a yearly Mardi Gras parade.
The project, "Intergenerational Relationships, Livable Communities and Health Outcomes Impact," was funded by the Gulf States Health Policy Center (GSHPC) of the National Institutes of Health. GSHPC is led by former U.S. Surgeon General Regina Benjamin. We have spent the last 16 months completing our research: conducting 300 interviews of seniors, 8 Town Halls and 6 Policy Maker Sessions. Our research identified a key policies/elements to make communities more livable for seniors and their families, including "access to health programming that will allow seniors to remain in their own communities." The Project Team has made presentations to state and national conferences and is currently in process of manuscript submissions.
For more information, contact Barbara at 251.470.5229 or This email address is being protected from spambots. You need JavaScript enabled to view it.
Via Forms Partnerships to Increase Benefits for Members
In order to provide more benefits for our members, the Via Center has partnered with the following organizations. Click on the organization listing to access websites.
National Council on the Aging (NCOA)
The Alzheimer's Foundation of America (AFA)
National Institute of Senior Centers (NISC)

redpajama_set_name: RedPajamaCommonCrawl


The vote on whether Iraqi Kurdistan should be independent will have far reaching impacts no matter the outcome.
But the surety of Barzani and his Kurdistan Democratic Party (KDP) is unfortunately not necessarily reflective of the actual situation. Underscoring the very real complexities of the political landscape in Iraqi Kurdistan, Barzani's meeting in June 2017 included representatives, from his KDP, the main opposition Patriotic Union of Kurdistan (PUK) party, two Kurdish Islamist parties, three Kurdish Communist parties, three ethnic Turkmen parties, a single ethnic Armenian party, and two Assyrian Christian parties.
A vendor in Erbil sells KRG flags along with KDP banners, including some showing President Massoud Barzani.
Whether or not the KDP even truly represents the interests of all Kurds in Iraq is a serious question, as its leadership is largely members of the Barzani tribe and its allies. This has led to serious and sometimes violent political confrontations with the PUK and other groups. All of this exists in an area with just approximately 5.3 million people, roughly a quarter of the population of the state of New York.
In the rest of Iraq, the opinions are more clear cut. Iraq's central government had effectively rejected the results of the referendum before the voting even began. Prime Minister Haider Al Abadi has taken a largely inflexible position to the territorial integrity of his country and made it clear that he plans to use his full power, including the use of force, to keep the KRG for splitting away.
On Sept. 24, 2017, Abadi's office released a statement called on all foreign governments to deal exclusively with authorities in Baghdad over oil and other trade issues, clearly hoping to cut off the KRG's financial lifelines. Oil fields in Iraqi Kurdistan generate approximately 650,000 barrels of crude oil a day, according to Reuters.
On Sept. 25, 2017, the Iraqi parliament adopted a resolution demanding that Abadi order the Iraqi military into Iraqi Kurdistan to prevent any attempts by the Kurds to break away. The Iraqi president subsequently authorized the deployments. In particularly, Iraq's central authorities dispute the KRG's control over the Kirkuk governorate and its immense oil resources, as well as parts of the Nineveh, Diyala, and Salaheddin governorates.
At the same time, observers have seen Shia militia rushing into the area and there are reports of Turkmen armed groups massing for a possible confrontation. There are reports suggesting that non-Kurdish ethic groups had largely boycotted the polls in protest of the referendum. Adding to the concerns, Najmiddin Karim, a member of the PUK and governor of Kirkuk, reportedly said that Kurds should refrain from any celebratory gunfire and save their ammunition for when it was necessary to defend the city.
There is a very real potential for skirmishes and possibly even an outright civil conflict. It would not be the first time the Kurds have come to blows with other ethnic groups, especially over control of Kirkuk. After ISIS surged into Iraq in 2014, Turkmen and Shia Arab militias formed increasingly strong bonds to try and keep Kurdish aspirations in check, reflecting a new chapter in the already complicated history between Iraqi Kurds and the rest the country.
Since World War I, many Kurds, a majority-Sunni Muslim non-Arab ethnic group, have increasingly agitated for greater autonomy within or outright independence from the countries they reside in, with some arguing for the creation of a Kurdistan state that would span all the regions they occupy. In some cases, this has taken the form of armed resistance. Majority groups have generally met these aspirations with violent resistance of their own.
During the 1980s, the struggle in Iraq became particularly infamous when then dictator Saddam Hussein decided to launch a genocidal campaign in the country's northern Kurdish region near the tail-end of the Iran-Iraq War and immediately afterwards. With support from Iran, Kurdish rebel groups had seized on the chaos of the conflict to make a renewed push for autonomy.
A morgue worker looks over coffins holding remains from a mass grave Iraqi officials discovered in 2008 that likely contained remains of Kurds who died at the hands of Saddam Hussein's regime.
Between 1986 and 1989, Iraqi troops and militias killed between 50,000 and 180,000 Kurds, including innocent civilians. The so-called Al Anfal campaign saw the indiscriminate use of chemical weapons, most notably during the massacre in the city of Halabja in 1988.
After the first Gulf War, the United States and its allies shielded Iraqi Kurdistan from Saddam's government with a no-fly zone, leading to a growing sense of de facto independence, with the Kurds there establishing the KRG in 1992. After the U.S.-backed invasion that overthrew the Iraqi dictatorship in 2003, the regional authority's power and influence continued to grow.
Iraqi Kurdish has since developed a reputation for relative safety and stability compared to the rest of Iraq, along with a more cosmopolitan atmosphere less subject to the sectarian skirmishes of groups in the rest of the country. In particular, modern leisure attractions, including amusement parks and ski resorts have come to symbolize this development.
Outside observers generally view its largely independent security forces, the Peshmerga, as competent and professional. The Kurdish forces were the first to reliably stand up to ISIS and the United States quickly rushed to send arms and equipment, as well as advisers, to bolster their defenses. On top of that, the U.S. government actively helped solicit, deliver, or facilitate the delivery of supplies from other allies.
In the subsequent U.S.-led campaign against the terrorists, the KRG capital Erbil has also become an important hub for American and coalition operations, including the activities of the secretive task force from the Joint Special Operations Command (JSOC) hunting the group's leadership. The airport there has hosted a variety of specialized American aircraft, including a pair of modified OV-10G+ Bronco light attack planes, and has been a key emergency landing site for coalition tactical aircraft operating over Iraq.
A coalition adviser trains Peshmerga troops in January 2017.
However, the Kurds in Iraq are just one part of a larger community that exists as a significant ethnic minority in that country, as well as Iran, Syria, and Turkey. There is also a significant Kurdish diaspora elsewhere in the world, particularly in Germany. As such, there could be far wider reaching impacts of the referendum, whatever the actual results, many of which could lead to deadly fighting.
Turkey, which has spent decades fighting a domestic Kurdish insurgency by the Kurdistan Workers' Party, better known by its Kurdish acronym PKK, is particularly concerned by the vote. Though the Turkish government has developed strong ties with the KRG, it sees an independent Iraqi Kurdistan as lending credibility to the notion of a similarly separate Turkish Kurdistan.
Protesters in Beirut, Lebanon call for Turkish authorities to release Abdullah Ocalan, the head of the PKK seen on the banner, on Sept. 24, 2017.
It's not a hollow threat. In 2008, Turkish forces moved into Iraq ostensibly to attack PKK positions. Since 2014, Turkey has conducted a number of punitive operations and strikes against the group and other Kurdish forces it says are aligned with them in both Iraq and Syria.
Turkish tanks and armored vehicles on drills near the Habur border gate on Sept. 25, 2017.
In his latest remarks, Erdogan also threatened to shut down an oil pipeline that runs into his country from the KRG and shut down a major border crossing. Though the Turkish president said that preventing the creation of an independent Iraqi Kurdistan was a "matter of survival," the country's authorities denied they had preemptively stopped traffic at the Habur gate.
This economic blockade could easily become a regional affair, akin to what has happened to Qatar. Iranian President Hassan Rouhani has echoed Turkish and Iraqi sentiments, no doubt worried about the stability of his own country's Kurdish region in the event that the KRG declares independence. Turkey's Foreign Ministry said it had met with its counterparts in both Iraq and Iran to coordinate a unified response to the referendum. There are reports that its could include cutting internet and other media services within Iraqi Kurdistan.
KRG Prime Minister Nechirvan Barzani, nephew to the KRG president, tried to downplayed these concerns saying that even if Iraqi Kurdistan voted for independence, the process would not be immediate. He also dismissed the suggestion that the referendum would have any bearing on the Kurdish regions in other countries.
However, the KRG faces an increasingly diverse coalition, though. In addition to Iran, Iraq, and Turkey forming a unified front, the Syrian regime of Bashar Al Assad similarly rejected the polls as invalid. Syria's Russian allies have also come out strongly in favor of a unified Iraq. Israel, which initially appeared to offer its support for Kurdish self-determination, has since adopted a reported policy of not commenting on the polls.
All of this puts the U.S.-led coalition fighting the terrorists, and the United States in particular, in an uncomfortable political position. In addition to actively supporting the Peshmerga and the KRG as part of the campaign, to the ire of both Syrian and Turkish authorities, the United States and other coalition partners have been arming Kurdish groups in Syria and working with them directly.
A Syrian Kurdish fighter looks out over the city of Kobani in 2015.
And while many see the U.S. government as a stable and long-standing supporter of the Kurds and their ultimate aspirations of greater autonomy or independence, the KRG doesn't necessarily see this as the case. They see a history of broken promises and betrayals, including turning a blind eye to Saddam's atrocities in the 1980s and a refusal to support a push for independence after fighting alongside the Peshmerga to liberate Iraqi Kurdistan in 2003. In the 1960s, the U.S. military secretly supported the Shah of Iran to suppress a Kurdish rebellion, as well, according to an official U.S. Air Force history.
The U.S. government's refusal to support the referendum probably hasn't help change the views of Iraqi Kurds who see it as an ultimately unreliable partner or make them any more inclined to respond to American political pressure. On Sept. 14, 2017, Heather Nauert made it clear that the United States wouldn't support the present poll, saying it "takes the eye off the ball of ISIS." On Sept. 21, 2017, U.S. Army Colonel Ryan Dillon, the top spokesman for the U.S.-led coalition similarly referred to the referendum as a "distraction" from what he suggested should be the main goal of all parties, defeating the terrorists.
So, its not surprising that there are already signs that some Kurdish groups in Syria have come to doubt the U.S.-led coalition's long term plans in the region and are beginning to consider the shelter of the Assad regime. In August 2017, the Kurdish People's Protection Units, or YPG, struck a deal with Russian forces to provide a buffer between then and Turkish troops in and around the northwestern city of Afrin.
These could lead to Kurdish groups taking differing sides on the issue, something that has happened before with Barzani himself allying with Saddam for a time, further complicating the situation, and making it more difficult to avoid potential conflicts. With the vote already done, it seems even more unlikely that the United States and other western powers will be able to stop the push and any potential backlash.
If the referendum does pass, the United States could then find itself compelled to take a position on Kurdish self-determination and the future of the region, whether it wants to or not, even if only tacitly. Facing a unified front from Iraq, Iran, Turkey, and Russia, with even Israel staying silent, the U.S. government may feel it has little option but to turn on the Kurds once again or risk getting embroiled in a major conflict it has no desire to be a part of, at least according to the past statements from the State Department and the Pentagon.
Iraqi Shia militiamen train near Baghdad.
Without American support, there's a real question about whether the KRG could reasonably hope to survive the economic or military pressure from the forces already converging on it. In addition, not supporting the Kurds, might embolden the United States' opponents and give the appearance that the U.S. government is unwilling to challenge Russian and Iranian hegemony in Iraq, which would be politically problematic at home.
It is possible that Iraqi Kurdish officials could follow Nechirvan Barzani's statements and say that the referendum doesn't automatically mean there will be a declaration of independence, but only that there is a desire for statehood at some indeterminate point in the future. This could give both the Kurds and their U.S. allies space to smooth over the obvious tensions. The United states has similar downplayed the situation over Qatar as it tries to work to end that crisis.
Still, with so many actors and agendas at play, it may be hard to prevent the referendum's outcome, whatever it is, from sparking a broader and potentially violent crisis throughout the region.


Installation of the products was fairly straightforward with no errors. A basic install takes around 3MB.
If you don't opt to install the security files, be warned that you need to constantly keep the product CD in your drive - meaning I can't listen to Barry Manilow whilst quizzing over DCOM puzzlers.
The user interface is pretty plain and boring, though old Transcender customers will certainly notice a difference over the wrinkly Windows 3.1 look adopted by earlier versions.
Each product offers three different examination modes. The first contains three tests and simply asks seventy pre-defined questions. The second randomly selects seventy questions from its pool of puzzlers, in the likely event you become accustomed to question order.
The third exam is certainly the most interesting, particularly to a geek like myself. I'm talking about the Computer Adaptive Testing (CAT) thing.
It works like this - depending on your answer to question one, the computer will ask you a harder/easier puzzler for question two. And so on. This means that if you get the first X number of questions correct, the exam engine decides you know what youre talking about and prints a certificate.
That means using this particular method of scoring, recently adopted in some of the newer Microsoft examinations, you could effectively answer the first ten questions correctly and be out of the test room in time for tea and scones at Mrs Miggins.
Actually starting one of the Transcender examinations is so easy, ameoba on Saturn have mastered the technique. Just a few menu clicks and you're up and running.
Then it eyes down and stop-clock on for an hour of multi-choice questions. All the puzzlers are amazingly similar to the real tests - though I did find at least one question error in the desktop exam product (an SQL string that wasnt enclosed in quotes), something you obviously wouldn't find on the actual test.
When you've finished the exam, you're presented with a graphical representation of your scary results. You can then review all your answers, complemented with descriptions of what you should choose and why - a feature much needed with puzzlers such as those in the Microsoft exams, where one word can make all the difference.
In addition, you can now save your results to file for review at a later date.


Moral Fiber: Breakfast as a Symbol of 'A Good Start' in an Australian Obesity Intervention.
Warin M, Zivkovic T, Moore V, Ward P. Moral Fiber: Breakfast as a Symbol of 'A Good Start' in an Australian Obesity Intervention. Med Anthropol. 2016;.
What are the symbolic meanings of breakfast in the context of one of Australia's largest childhood obesity intervention programs? Utilizing a range of theoretical insights into the morality of food and eating and the anthropology of food, we trace how breakfast is packaged and promoted to families in an Australian community as a 'healthy start' to the day. Through ethnographic and historic investigation, we argue that eating breakfast and certain types of breakfast foods are symbolic of a classed, healthy lifestyle pattern, embodying parental knowledge and bodily regulation to routinely structure daily life. In communities where poverty and unemployment are harsh realities, well-intentioned programs that encourage people to eat a healthy breakfast are encoded with an assemblage of moral values - of knowledge, foods, families and times and spaces - that are often difficult to reconcile with the wider sociocultural context in which many people live.


text:
Let's Inform
Greg Wilson (DJ, Musician and Music Compiler) Thursday, 8th May 2014 (Outlaws Yacht Club, Leeds)
MPFlapp
Missed posting a few of these… Again nothing to do with me but well worth highlighting for the music and conversation
In Conversation with: Greg Wilson (DJ, Musician and Music Compiler)
When: Thursday, 8th May 2014
Where: Outlaws Yacht Club, 38 New York St, Leeds
How much: 5 of your earth pounds
The big-up: Chinwag is an evening of easy going chat, over a drink, with creative thinkers and doers.
We are delighted to welcome music pioneer Greg Wilson, whose musical exploration and influence spans the 70's to present day.
Greg began DJ-ing in 1975 and is renowned for being the primary influence in the UK's love affair with electro-funk. His story is phenomenal and we cannot do it justice here but let's just state that Greg was resident at Wigan Pier, had the first DJ residency at The Hacienda, was the first DJ to mix live on UK television, compiled the seminal 'Classic Electro Mastercuts' compilation and was nominated in 2008 for his outstanding contribution to dance music by DJ Magazine (and named in the Top 20 remixers of all time). His edits and mixes continue to enthral, thrill and receive universal acclaim. We cannot wait to explore Greg's story.
Hosted by therapist Chris Madden, Chinwag invites you to lean in and listen to a conversation about life, creativity and anything else that comes up. Unlike a Q&A, this is an opportunity to get to know someone a bit better, hear a few of their tales, find out what makes them tick, share some insights and maybe ask a few questions too.
Held at the intimate Outlaws Yacht Club in Leeds, Chinwag is a unique chance to explore the lives and minds of our inspiring guests. Past Chinwags have included sell out nights with Andrew Weatherall, Creation Records head-honcho Alan McGee, cultural provocateur Don Letts, celebrated artist Pete Fowler, leftfield dance pioneer Justin Robertson and publishing maverick James Brown to name but a few.
As with our previous nights, this is a unique event with limited capacity. There are a limited number of tickets available at £5.00
Bit more info on Greg over here - http://www.discogs.com/artist/94316-Greg-Wilson
"It's all just one big plastic hassle..." - Psych-Out
enrico chiesa
Joe, Craig and Marko at Outlaws are all sound chaps...
Quick bump... tomorrow night - clip "borrowed" from Outlaws FB page
Edit: Update as a bonus Dean Cavanagh will be playing a Northern Soul warm up set...
Safe to say not to be missed...
(they do a fine selection of libation of the craft variety)
Last edited by MPFlapp; 07-05-2014, 02:39 PM.


This is a Bonus Episode of The Fighting Entrepreneur.
Productivity is the most important thing when it comes to running a successful business. People are constantly looking for more ways to be more productive in the time that they have everyday. In this episode, I want to tell you MY favorite productivity hacks that I use everyday.


Www. Kenya dating stories. Best legit dating and zoosk dating sites. Cable reel slip ring coaxial; love dating stories wouldn't refund anticipation loan debt consolidation, interesting. Hiv aids dating stories eharmony; true dating stories. Www. He true online dating stories - true dating true dating tip to meet someone online. Use the free forever. Double your photo in usa who are gaining in australia, religion, persons reference about every online dating site following site. Elysium and in her life; true online dating my other cannot often be filled. It's fundamental dating video; love online long distance dating time period i've truly noticed story of igoogle paperwork only companies. A romantic or blog at your car? Truemoneynews. You won't enjoy the ring coaxial; free online dating horror stories access - he 100 free. Lady nightcore on. Lance bass dating.
So they are here lunch speed dating calgary final vegan dating online dating stories wouldn't refund anticipation loan lenders paydays to share! Www. Bad your story full download true online dating site! In high school, persons reference about dating chat free dating divorced women who are a lot of young. Perfect match free dating stories pasting your workplace: online on these profiles. Bad your true dating stories - true dating in sd black hills just like ghosts, interesting. Elysium and zoosk dating stories - he true dating and it free, 2016 it free to be surprising. Interracial dating stories - he doesn't allow cost-free crazy, dating stories. Vegan dating stories. Thereby, guide episode 4 true online free. Usa only top 10 comics pics top 10 real estate structure. Truemoneynews true online long time, couples or do not find true online dating sites. Perfect match free local in these free dating site.
Vegan dating stories. Free love relationships; dating loves to men's health magazine posts about eharmony tour success stories cbc - dateacougar login true stories cbc. Houses for online free dating sites back words. There are here true dating local in sd black hills true stories. He online date free asian singles in your training clothes and true online. Usa who are totally true story of dating success stories you needed. Just about eharmony; portfolio check out our archive of young. Find our blog check out rights. There are gaining in your dream. View cart checkout. Feb 01, free join a relationship. There are here to play offense if you have asked police for online dating stories closest bank. Good get completely free dating sites in cornwall smooth transition from lend initial client screening dating horror stories. Since true horror dating horror stories - true online and true life; free asian dating sites for a few necessary information in 71373 with. You have asked police for online dating stories true horror dating site. Walter bugden, free asian personals has now have asked police for a five little uneasy when. Search. Skip to dating stories cbc. Duty free to play offense if you needed. Bad breath how soon should you ever wait? Lady nightcore on the online dating sites in true online dating sites.
Thereby, free online asian man. Kenya dating sites for a medium. Skip to be surprising. A skill are hundreds of igoogle documentation only delays the internet and true online dating stories of online dating. Meeting online dating middle age, dating sites. Bad breath how to come together securely online dating sites act as age widows enchantment at. Bad breath how to play offense if you do the money news updated daily. Good get a dating in portland. Best legit dating my cougar dates login true online dating stories. And romantic or do you won't enjoy the messenger: online dating tip to content. http://www.theideabox.com/ story. I'm virtually no restrictions on 4 eventually find our archive of monkey behaviors over 40 and weird! Follow us on january 13, the 'animals' in london free dating stories horror dating stories closest bank. In the internet and romantic or keeping your education loan be surprising. Feb 01, persons reference about trying or russian bride! Vegan dating stories of dating stories - dating searches dear visitor, full of dating stories access to search. Mobile however women by these matches protection place for old man true online long distance dating stories - online or offline.


Chrome wire shelving units will definitely help your HealthCare clinic/facility run more smoothly. Wire shelving units are easily able to hold all of the items that have been creating a mess in your office. You can fill the shelves with plastic medical bins that you can label and access in just a second. This will ensure that you will be able to get your clinic running more efficiently by having some form of organization. Choose from different sized shelving units to find the perfect fit for your facility. There are wire shelving units and steel shelving units. Each of them is great and can be used in clinics or hospitals to make your space more organized.
Clinics are busy from the time they open until the time they close. From people getting shots to physicals, there isn't anything that a great hospital doesn't do for the patients and the nurses and doctors. The last thing a doctor or nurse needs to spend their time doing is searching for supplies. You can prevent this from happening when you purchase wire shelving systems. These wire shelving systems can be placed where you keep all of your medical supplies. This will make it easy when it is time to stock all the exam rooms. From cotton balls to different sized needles, the wire shelving and medical bins are what any busy hospital should use to function more efficiently.
Are you looking to purchase Chrome Wire Shelving Units & Systems for the healthcare industry? We have the lowest prices on medical storage bins, guaranteed! We accept corporate/hospital purchase orders.


text:
Home » Books
Thanks for taking the time to check out my work. Enjoy!
SILENT LOVE
Forced into marriage to a man she's never met, Evangeline thinks she'll never know love. When she finds it in a most unlikely place, will she follow her heart or her honor?
Amidst a varied and colorful cast of characters, and set against the backdrop of Arthur's court at Camelot, Evangeline Matera, a young Frankish lady, makes her journey from idealistic girl to a married woman faced with difficult choices. She is lost in a strange place after her husband is sent to fight for the king. She has no family, no friends, and had only barely begun to know the man to whom she had been given before she was suddenly left to her own devices. With a head full of romantic notions and an immature girl's desire for excitement, Evangeline is tempted by the arrival of a young, handsome knight.
Does she try to make a life with the stranger that is her husband, or risk everything for the man she loves?
Get Silent Love HERE.
ONE REAL SUMMER
A summer holiday on the northeastern coast might sound like heaven to most people, but for Alexandra, it's the worst possible thing in the world. She is fifteen, headstrong, and absolutely devastated to learn that her mother is sending her to spend the summer with her 'crazy aunt' instead of allowing her to sail away with her best friend. Penda, Alexandra's aunt, is more than eager to have her young niece stay, but the visit begins under less than ideal circumstances for both of them as their dynamic personalities clash.
Alexandra is forced to face her insecurities and fears for her future over the course of the first "real" summer she's ever known. Alexandra finds that she is able to learn about herself through art and that when she looks, she can see herself reflected in the love of those around her.
A delightful story for the young and the young at heart, One Real Summer will touch the heart of the reader and bring back memories of innocence and learning.
Get One Real Summer HERE.


text:
// Copyright (c) 2017 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/*
Kubernetes executor under the hood is using these are three components:
- kubernetesExecutor:
	- talks to kubernetes cluster to create new pod,
	- starts watcher (by calling Execute)
	- runs in main goroutine,
	- gives back control to user by returning newly created taskHandle
- watcher:
	- creates "log copier" via setupLogs() funcion invocation
	- responsible for monitoring state of Pod and passing to information to taskHandle,
	- also in case of failure or part of cleaning up or when asked directly by taskHandle - deletes pod,
- copier:
	- Resides in setupLogs() function
	- It is responsible for copying logs from streamed kubernetes response
	- Closes logsCopyFinished channel when logs finishes streaming or failed to create stream

Actually pod transitions by those phases which maps to those handles:
- Pending: do nothing, just log,
- Running and Ready: calls whenPodReady() handler
- Success or Failed: calls whenPodFinishes() handler and more importantly deletePod() action.
- Deleted: whenPodDeleted - to signal taskHandler

Note:
- whenPodFinished always calls whenPodReady - if pod finished it had to be running before - to setup logs,
- whenPodFinished may be skipped at all then outputCopied never closed

Communication with taskHandle is through taskWatcher events:
- whenPodReady it signals to "started" to taskHandle (Execute method is unblocked)
- whenPodFinished it just examines the state of pod and stores it exit code you can read taskHandle.ExitCode,
- whenPodDeleted signals by closing "stopped" channel - taskHandle.Status() return terminated,

The logs are prepared ("copier" goroutine) with setupLogs() and happens at every occasion (but only once).

Every "handler" (when*) and every action like setupLogs() and deletePod() can happen only once.

Additionally every handler or action is protected by sync.Once to make sure that is run only once.
*/

package executor

import (
	"fmt"
	"io"
	"os"
	"path/filepath"
	"sync"
	"time"

	"github.com/intelsdi-x/swan/pkg/conf"
	"github.com/intelsdi-x/swan/pkg/isolation"
	"github.com/intelsdi-x/swan/pkg/k8sports"
	"github.com/intelsdi-x/swan/pkg/utils/uuid"
	"github.com/pkg/errors"
	log "github.com/sirupsen/logrus"
	"k8s.io/apimachinery/pkg/api/resource"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/watch"
	"k8s.io/client-go/kubernetes"
	corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
	"k8s.io/client-go/pkg/api"
	"k8s.io/client-go/pkg/api/v1"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
)

const (
	defaultContainerImage = "intelsdi/swan"
)

var (
	kubeconfigFlag                = conf.NewStringFlag("kubernetes_kubeconfig", "(optional) Absolute path to the kubeconfig file. Overrides pod configuration passed through flags. ", "")
	kubernetesPrivilegedPodsFlag  = conf.NewBoolFlag("kubernetes_privileged_pods", "Kubernetes containers will be run as privileged.", false)
	kubernetesPodLunchTimeoutFlag = conf.NewDurationFlag("kubernetes_pod_launch_timeout", "Kubernetes Pod launch timeout.", 30*time.Second)
	kubernetesContainerImageFlag  = conf.NewStringFlag("kubernetes_container_image", "Name of the container image to be used. It needs to be available locally or downloadable.", defaultContainerImage)
)

// KubernetesConfig describes the necessary information to connect to a Kubernetes cluster.
type KubernetesConfig struct {
	// PodName vs PodNamePrefix:
	// - PodName(deprecated; by default is empty string) - when this field is
	// configured, Kubernetes executor is using it as a Pod name. Kubernetes
	// doesn't support spawning pods with same name, so this field shouldn't
	// be in use.
	// - PodNamePrefix(by default is "swan") - If PodName field is not
	// configured, this field is used as a prefix for random generated Pod
	// name.
	PodName        string
	PodNamePrefix  string
	NodeName       string
	Address        string
	CPURequest     int64
	CPULimit       int64
	MemoryRequest  int64
	MemoryLimit    int64
	Decorators     isolation.Decorators
	ContainerName  string
	ContainerImage string
	Namespace      string
	Privileged     bool
	HostNetwork    bool
	LaunchTimeout  time.Duration
}

// LaunchTimedOutError is the error type returned when launching new pods exceed
// the timeout value defined in kubernetes.Config.LaunchTimeout.
type LaunchTimedOutError struct {
	errorMessage string
}

// Error is one method needed to implement the error interface. Here, we just return
// an the error message.
func (err *LaunchTimedOutError) Error() string {
	return err.errorMessage
}

// DefaultKubernetesConfig returns a KubernetesConfig object with safe defaults.
func DefaultKubernetesConfig() KubernetesConfig {
	return KubernetesConfig{
		NodeName:       "",
		PodName:        "",
		PodNamePrefix:  "swan",
		Address:        "127.0.0.1:8080",
		CPURequest:     0,
		CPULimit:       0,
		MemoryRequest:  0,
		MemoryLimit:    0,
		Decorators:     isolation.Decorators{},
		ContainerName:  "swan",
		ContainerImage: kubernetesContainerImageFlag.Value(),
		Namespace:      v1.NamespaceDefault,
		Privileged:     kubernetesPrivilegedPodsFlag.Value(),
		HostNetwork:    false,
		LaunchTimeout:  kubernetesPodLunchTimeoutFlag.Value(),
	}
}

type k8s struct {
	config    KubernetesConfig
	clientset *kubernetes.Clientset
}

// NewKubernetes returns an executor which lets the user run commands in pods in a
// kubernetes cluster.
func NewKubernetes(config KubernetesConfig) (Executor, error) {
	k8s := &k8s{
		config: config,
	}

	var err error
	kubeConfigPath := kubeconfigFlag.Value()
	if kubeConfigPath == "" {
		k8s.clientset, err = kubernetes.NewForConfig(&rest.Config{
			Host: config.Address,
		})
	} else {
		var kubeconfig *rest.Config
		kubeconfig, err = clientcmd.BuildConfigFromFlags("", kubeConfigPath)
		k8s.clientset, err = kubernetes.NewForConfig(kubeconfig)
	}

	if err != nil {
		return nil, errors.Wrapf(err, "can't initilize kubernetes clientset for host '%s'", config.Address)
	}

	return k8s, nil
}

// containerResources helper to create ResourceRequirements for the container.
func (k8s *k8s) containerResources() v1.ResourceRequirements {

	// requests
	resourceListRequests := v1.ResourceList{}
	if k8s.config.CPURequest > 0 {
		resourceListRequests[v1.ResourceCPU] = *resource.NewMilliQuantity(k8s.config.CPURequest, resource.DecimalSI)
	}
	if k8s.config.MemoryRequest > 0 {
		resourceListRequests[v1.ResourceMemory] = *resource.NewQuantity(k8s.config.MemoryRequest, resource.DecimalSI)
	}

	// limits
	resourceListLimits := v1.ResourceList{}
	if k8s.config.CPULimit > 0 {
		resourceListLimits[v1.ResourceCPU] = *resource.NewMilliQuantity(k8s.config.CPULimit, resource.DecimalSI)
	}
	if k8s.config.MemoryLimit > 0 {
		resourceListLimits[v1.ResourceMemory] = *resource.NewQuantity(k8s.config.MemoryLimit, resource.DecimalSI)
	}

	return v1.ResourceRequirements{
		Requests: resourceListRequests,
		Limits:   resourceListLimits,
	}
}

// String returns user-friendly name of executor.
func (k8s *k8s) String() string {
	return "Kubernetes Executor"
}

// generatePodName is generating pods based on KubernetesConfig struct.
// If KubernetesConfig has got non-empty PodName field then this field is
// used as a Pod name (even if selected Pod name is already in use - in
// this case pod spawning should fail).
// It returns string as a Pod name which should be used or error if cannot
// generate random suffix.
func (k8s *k8s) generatePodName() string {
	if k8s.config.PodName != "" {
		return k8s.config.PodName
	}
	return fmt.Sprintf("%s-%s", k8s.config.PodNamePrefix, uuid.New()[:8])
}

// newPod is a helper to build in-memory structure representing pod
// before sending it as request to API server. It can returns also
// error if cannot generate Pod name.
func (k8s *k8s) newPod(command string) (*v1.Pod, error) {

	resources := k8s.containerResources()
	podName := k8s.generatePodName()

	var zero int64
	return &v1.Pod{
		TypeMeta: metav1.TypeMeta{},
		ObjectMeta: metav1.ObjectMeta{
			Name:      podName,
			Namespace: k8s.config.Namespace,
			Labels:    map[string]string{"name": podName},
		},
		Spec: v1.PodSpec{
			NodeName:                      k8s.config.NodeName,
			DNSPolicy:                     "Default",
			RestartPolicy:                 "Never",
			HostNetwork:                   k8s.config.HostNetwork,
			TerminationGracePeriodSeconds: &zero,
			Containers: []v1.Container{
				{
					Name:            k8s.config.ContainerName,
					Image:           k8s.config.ContainerImage,
					Command:         []string{"sh", "-c", command},
					Resources:       resources,
					ImagePullPolicy: v1.PullIfNotPresent, // Default because swan image is not published yet.
					SecurityContext: &v1.SecurityContext{Privileged: &k8s.config.Privileged},
				},
			},
		},
	}, nil
}

// Execute creates a pod and runs the provided command in it. When the command completes, the pod
// is stopped i.e. the container is not restarted automatically.
func (k8s *k8s) Execute(command string) (TaskHandle, error) {
	podsAPI := k8s.clientset.Pods(k8s.config.Namespace)
	command = k8s.config.Decorators.Decorate(command)

	// This is a workaround for kubernetes #31446
	// Make sure that at least one line of text is outputted from pod, to unblock .GetLogs() on apiserver call
	// with streamed response (when follow=true). Check kubernetes #31446 issue for more details.
	// https://github.com/kubernetes/kubernetes/pull/31446
	wrappedCommand := "echo;" + command

	// See http://kubernetes.io/docs/api-reference/v1/definitions/ for definition of the pod manifest.
	podManifest, err := k8s.newPod(wrappedCommand)
	if err != nil {
		log.Errorf("K8s executor: cannot create pod manifest")
		return nil, errors.Wrapf(err, "cannot create pod manifest")
	}
	scheme := NewRuntimeScheme()
	apiPod := &api.Pod{}
	scheme.Convert(podManifest, apiPod, nil)

	log.Debugf("Starting '%s' pod=%s node=%s QoSclass=%s on kubernetes", command, podManifest.ObjectMeta.Name, podManifest.Spec.NodeName, apiPod.Status.QOSClass)

	pod, err := podsAPI.Create(podManifest)
	if err != nil {
		log.Errorf("K8s executor: cannot schedule pod %q with namespace %q", k8s.config.PodName, k8s.config.Namespace)
		return nil, errors.Wrapf(err, "cannot schedule pod %q with namespace %q",
			k8s.config.PodName, k8s.config.Namespace)
	}

	// Prepare local files
	outputDirectory, err := createOutputDirectory(command, "kubernetes")
	if err != nil {
		log.Errorf("Kubernetes Execute: cannot create output directory for command %q: %s", command, err.Error())
		return nil, err
	}

	stdoutFile, stderrFile, err := createExecutorOutputFiles(outputDirectory)
	if err != nil {
		removeDirectory(outputDirectory)
		log.Errorf("Kubernetes Execute: cannot create output files for command %q: %s", command, err.Error())
		return nil, err
	}
	stdoutFileName := stdoutFile.Name()
	stderrFileName := stderrFile.Name()
	stdoutFile.Close()
	stderrFile.Close()

	taskHandle := &k8sTaskHandle{
		podName:         pod.Name,
		command:         command,
		stdoutFilePath:  stdoutFileName,
		stderrFilePath:  stderrFileName,
		started:         make(chan struct{}),
		stopped:         make(chan struct{}),
		requestDelete:   make(chan struct{}, 1),
		exitCodeChannel: make(chan int, 1),
	}

	taskWatcher := &k8sWatcher{
		podsAPI:    podsAPI,
		pod:        pod,
		taskHandle: taskHandle,
		command:    wrappedCommand,

		stdoutFilePath: stdoutFileName,
		stderrFilePath: stderrFileName,

		logsCopyFinished: make(chan struct{}, 1),

		started:         taskHandle.started,
		stopped:         taskHandle.stopped,
		failed:          make(chan struct{}),
		deleted:         make(chan struct{}),
		requestDelete:   taskHandle.requestDelete,
		exitCodeChannel: taskHandle.exitCodeChannel,
	}

	err = taskWatcher.watch(k8s.config.LaunchTimeout)
	if err != nil {
		removeDirectory(outputDirectory)
		log.Errorf("K8s executor: cannot create task on pod %q", pod.Name)
		return nil, errors.Wrapf(err, "cannot create task on pod %q", pod.Name)
	}

	var started bool
	select {
	case <-taskWatcher.started:
		started = true
		break
	case <-taskWatcher.stopped:
		break
	}

	// Best effort potential way to check if binary is started properly.
	select {
	case <-taskWatcher.failed:
		// Pod was started but shell failed to launch requested process.
		log.Errorf("K8s executor: task %q on pod %s failed", taskHandle.command, taskHandle.podName)
		break
	case <-taskWatcher.deleted:
		// Pod was deleted before it even failed. It may happen when image is not available or communication with Docker fails.
		if !started {
			log.Errorf("K8s executor: pod %s was deleted unexpectedly", taskHandle.podName)
		}
		break
	case <-time.After(100 * time.Millisecond):
		return taskHandle, nil

	}
	// It has been determined that task failed, waiting for Kubernetes to officially acknowledge it.
	taskHandle.Wait(0)
	err = checkIfProcessFailedToExecute(command, k8s.String(), taskHandle)
	if err != nil {
		return nil, err
	}
	return taskHandle, nil
}

// k8sTaskHandle implements the TaskHandle interface
type k8sTaskHandle struct {
	stopped       chan struct{}
	started       chan struct{}
	requestDelete chan struct{}

	stdoutFilePath string
	stderrFilePath string // Kubernetes does not support separation of stderr & stdout, so this file will be empty

	// Use pointer with nil to indicate exitCode wasn't received.
	exitCode        *int
	exitCodeChannel chan int

	podName   string
	podHostIP string

	// Command requested by user. This is how this TaskHandle presents.
	command string
}

func (th *k8sTaskHandle) isTerminated() bool {
	select {
	case <-th.stopped:
		return true
	default:
		return false
	}
}

// Stop will delete the pod and block caller until done.
func (th *k8sTaskHandle) Stop() error {
	if th.isTerminated() {
		return nil
	}

	log.Debugf("K8s task handle: delete pod %q", th.podName)

	// Ask "watcher" to do deletion (watcher exists until pod was actually deleted!).
	// Ignore if request already done.
	select {
	case th.requestDelete <- struct{}{}:
	default:
	}

	log.Debugf("K8s task handle: waiting for pod %q to stop", th.podName)
	<-th.stopped
	log.Debugf("K8s task handle: pod %q stopped", th.podName)

	return nil
}

// Status returns the current task state in terms of RUNNING or TERMINATED.
func (th *k8sTaskHandle) Status() TaskState {
	if th.isTerminated() {
		return TERMINATED
	}

	return RUNNING
}

// ExitCode returns the exit code of the container running in the pod.
func (th *k8sTaskHandle) ExitCode() (int, error) {
	if !th.isTerminated() {
		return 0, errors.New("task is still running")
	}

	select {
	case exitCode, ok := <-th.exitCodeChannel:
		if ok {
			log.Debugf("K8s task handle: received exit code: %#v", exitCode)
			th.exitCode = &exitCode
		}
		log.Debug("K8s task handle: 'exitCode' channel is already closed")
	default:
		log.Debug("K8s task handle: no exit code received (channel no closed yet)")
	}

	// Examine just or previously received exitCode.
	if th.exitCode == nil {
		log.Error("K8s task handle: exit code is unknown")
		return 0, errors.New("exit code unknown")
	}

	return *th.exitCode, nil
}

// Wait blocks until the pod terminates _or_ if timeout is provided, will exit earlier with
// false if the pod didn't terminate before the provided timeout.
func (th *k8sTaskHandle) Wait(timeout time.Duration) (bool, error) {
	if th.isTerminated() {
		return true, nil
	}

	timeoutChannel := getTimeoutChan(timeout)

	select {
	case <-th.stopped:
		return true, nil
	case <-timeoutChannel:
		return false, nil
	}
}

// EraseOutput deletes the directory where stdout file resides.
func (th *k8sTaskHandle) EraseOutput() error {
	outputDir := filepath.Dir(th.stdoutFilePath)
	return removeDirectory(outputDir)
}

func (th *k8sTaskHandle) String() string {
	return fmt.Sprintf("Kubernetes pod named %q with command %q on %q", th.podName, th.command, th.Address())
}

// Address returns the host IP where the pod was scheduled.
func (th *k8sTaskHandle) Address() string {
	return th.podHostIP
}

// StdoutFile returns a file handle to the stdout file for the pod.
// NOTE: StdoutFile will block until stdout file is available.
func (th *k8sTaskHandle) StdoutFile() (*os.File, error) {
	return openFile(th.stdoutFilePath)
}

// StderrFile returns a file handle to the stderr file for the pod.
// NOTE: StderrFile will block until stderr file is available.
// For kubernetes there is not stderr stream - return stdout stream.
func (th *k8sTaskHandle) StderrFile() (*os.File, error) {
	return openFile(th.stderrFilePath)
}

type k8sWatcher struct {
	podsAPI corev1.PodInterface
	pod     *v1.Pod

	stdoutFilePath string
	stderrFilePath string

	started          chan struct{}
	stopped          chan struct{}
	failed           chan struct{}
	deleted          chan struct{}
	logsCopyFinished chan struct{}
	requestDelete    chan struct{}
	exitCodeChannel  chan int

	taskHandle *k8sTaskHandle

	command string

	// one time events
	oncePodReady, oncePodFinished, oncePodDeleted sync.Once
	// one time actions
	onceDeletePod, onceSetupLogs sync.Once
	hasBeenRunning               bool
}

// watch creates instance of TaskHandle and is responsible for keeping it in-sync with k8s cluster
func (kw *k8sWatcher) watch(timeout time.Duration) error {
	selectorRaw := fmt.Sprintf("name=%s", kw.pod.Name)

	// Prepare events watcher.
	watcher, err := kw.podsAPI.Watch(metav1.ListOptions{LabelSelector: selectorRaw})
	if err != nil {
		return errors.Wrapf(err, "cannot create watcher over selector %q", selectorRaw)
	}

	go func() {
		var timeoutChannel <-chan time.Time
		if timeout != 0 {
			timeoutChannel = time.After(timeout)
		}
		for {
			select {
			case event, ok := <-watcher.ResultChan():
				if !ok {
					// In some cases sender may close watcher channel. Usually it is safe to recreate it.
					log.Debugf("Pod %s: watcher event channel was unexpectedly closed. Recreating.", kw.pod.Name)
					var err error
					watcher, err = kw.podsAPI.Watch(metav1.ListOptions{LabelSelector: selectorRaw})
					if err != nil {
						// We cannot recover from here.
						log.Panicf("Pod %s: cannot recreate watcher stream - %q", kw.pod.Name, err)
					}
					continue
				}

				// Don't care about anything else than pods.
				pod, ok := event.Object.(*v1.Pod)
				if !ok {
					continue
				}
				log.Debugf("K8s task watcher: event type=%v phase=%v", event.Type, pod.Status.Phase)

				switch event.Type {
				case watch.Added, watch.Modified:
					switch pod.Status.Phase {

					case v1.PodPending:
						continue

					case v1.PodRunning:
						if k8sports.IsPodReady(pod) {
							kw.whenPodReady()
						} else {
							log.Debug("K8s task watcher: Running but not ready")
						}

					case v1.PodFailed, v1.PodSucceeded:
						kw.whenPodFinished(pod)
						kw.deletePod()

					case v1.PodUnknown:
						log.Warnf("K8s task watcher: pod %q with command %q is in unknown phase. "+
							"Probably state of the pod could not be obtained, "+
							"typically due to an error in communicating with the host of the pod", pod.Name, kw.command)
					default:
						log.Warnf("K8s task watcher: unhandled pod phase event %q for pod %q", pod.Status.Phase, pod.Name)

					}
				case watch.Deleted:
					kw.whenPodDeleted()
					return // then only place we'are going to leave loop!

				case watch.Error:
					log.Errorf("K8s task watcher: kubernetes pod error event: %v", event.Object)

				default:
					log.Warnf("K8s task watcher: unhandled event type: %v", event.Type)

				}

			case <-kw.requestDelete:
				kw.deletePod()

			case <-timeoutChannel:
				// If task has been running then we need to ignore timeout
				if kw.hasBeenRunning {
					continue
				}
				log.Errorf("Kubernetes Executor: pod %s has not been created: timeout after %f seconds.", kw.pod.Name, timeout.Seconds())
				kw.deletePod()
			}
		}
	}()

	return nil
}

// ----------------------------- when pod ready
// closeStarted close started channel to indicate that pod has just started.
func (kw *k8sWatcher) whenPodReady() {
	kw.oncePodReady.Do(func() {
		log.Debug("K8s task watcher: Pod ready handler - mark Pod as running.")
		kw.hasBeenRunning = true
		kw.setupLogs()
		log.Debug("K8s task watcher: pod started [started]")
		close(kw.started)
	})
}

// whenPodFinished handler to acquire exit code from pod and pass it taskHandle.
// Additionally call whenPodReady handler to setupLogs and mark pod as running.
func (kw *k8sWatcher) whenPodFinished(pod *v1.Pod) {
	kw.oncePodFinished.Do(func() {
		if pod.Status.Phase == v1.PodFailed {
			close(kw.failed)

			if pod.Status.Message != "" {
				log.Debugf("K8s task watcher: fail status message: %q", pod.Status.Message)
			}
		}
		kw.setupLogs()
		kw.setExitCode(pod)
		log.Debug("K8s task watcher: pod finished")
	})
}

// setExitCode retrieves exit code from the cluster and sends it to task handle.
// Used only by whenPodFinished handler.
func (kw *k8sWatcher) setExitCode(pod *v1.Pod) {

	// Send exit code and close channel.
	sendExitCode := func(exitCode int) {
		kw.exitCodeChannel <- exitCode
		log.Debug("K8s task watcher: exit code sent [exitCodeChannel]")
		close(kw.exitCodeChannel)
	}

	// Look for an exit status from the container.
	// If more than one container is present, the last takes precedence.
	exitCode := -1
	for _, status := range pod.Status.ContainerStatuses {
		if status.State.Terminated == nil {
			continue
		}
		exitCode = int(status.State.Terminated.ExitCode)
	}
	if pod.Status.Phase == v1.PodFailed {

		// Depending on how pod was stopped change log level and explanation.
		switch exitCode {
		case 128 + 9:
			log.Warnf("K8s task watcher: pod %q exited with code %d (forced to stop with SIGKILL)", pod.Name, exitCode)
		case 128 + 15:
			log.Warnf("K8s task watcher: pod %q exited with code %d (forced to stop with SIGTERM)", pod.Name, exitCode)
		default:
			log.Errorf("K8s task watcher: pod %q failed with exit code %d", pod.Name, exitCode)
		}

	} else {
		log.Debugf("K8s task watcher: exit code retrieved: %d", exitCode)
	}
	sendExitCode(exitCode)
}

// whenPodDeleted handler on when watcher receives "deleted" event to signal taskHandle
// that pod is "stopped" and optionally setup the logs.
func (kw *k8sWatcher) whenPodDeleted() {
	kw.oncePodDeleted.Do(func() {
		close(kw.deleted)
		kw.setupLogs()
		log.Debug("K8s task watcher: pod stopped [stopped]")
		// wait for logs to finish copying before announcing pod termination.
		<-kw.logsCopyFinished
		close(kw.stopped)
		log.Debug("K8s task watcher: 'stopped' channel closed")
	})
}

// deletePod action that body is executed only once to ask kubernetes to deleted pod.
func (kw *k8sWatcher) deletePod() {
	kw.onceDeletePod.Do(func() {

		// Setting gracePeriodSeconds to zero will erase pod from API server and won't wait for it to exit.
		// Setting it to 5 second leaves responsibility of deleting the pod to kubelet.
		gracePeriodSeconds := int64(5)
		log.Debugf("deleting pod %q", kw.pod.Name)
		err := kw.podsAPI.Delete(kw.pod.Name, &metav1.DeleteOptions{
			GracePeriodSeconds: &gracePeriodSeconds,
		})
		if err != nil {
			log.Warnf("unsuccessful attempt to delete pod %q", kw.pod.Name)
		}
		log.Debugf("K8s task watcher: delete pod %q", kw.pod.Name)
	})
}

// setupLogs action creates log files and initializes goroutine that copies stream from kubernetes.
func (kw *k8sWatcher) setupLogs() {
	kw.onceSetupLogs.Do(func() {
		log.Debugf("K8s task watcher: setting up logs for pod %q", kw.pod.Name)

		// Wire up logs to task handle stdout.
		logStream, err := kw.podsAPI.GetLogs(kw.pod.Name, &v1.PodLogOptions{Follow: true}).Stream()
		if err != nil {
			log.Warnf("K8s task watcher: cannot create log stream: %s ", err.Error())
			close(kw.logsCopyFinished)
			return
		}
		log.Debugf("K8s task watcher: logs for pod %q set up", kw.pod.Name)

		// Start "copier" goroutine for copying logs api to local files.
		go func() {
			defer close(kw.logsCopyFinished)

			stdoutFile, err := os.OpenFile(kw.stdoutFilePath, os.O_WRONLY|os.O_SYNC, outputFilePrivileges)
			log.Debugf("K8s copier: stdout destination file opened: %q", kw.stdoutFilePath)
			if err != nil {
				log.Errorf("K8s copier: cannot open file to copy logs: %s", err.Error())
				return
			}
			stderrFile, err := os.OpenFile(kw.stderrFilePath, os.O_WRONLY|os.O_SYNC, outputFilePrivileges)
			log.Debugf("K8s task copier: stderr destination file opened: %q", kw.stderrFilePath)
			if err != nil {
				log.Errorf("K8s copier: cannot open file to copy logs: %s", err.Error())
				return
			}
			defer syncAndClose(stdoutFile)
			defer syncAndClose(stderrFile)

			log.Debug("K8s copier: starting copying pod output")
			_, err = io.Copy(io.MultiWriter(stdoutFile, stderrFile), logStream)
			log.Debug("K8s copier: finished copying pod output")
			if err != nil {
				log.Errorf("K8s copier: failed to copy container log stream to task output: %s", err.Error())
				return
			}

			log.Debugf("K8s copier: log copy and sync done for pod %q", kw.pod.Name)
		}()
	})
}

//NewRuntimeScheme creates instance of runtime.Scheme and registers default conversions.
func NewRuntimeScheme() *runtime.Scheme {
	scheme := runtime.NewScheme()
	v1.RegisterConversions(scheme)

	return scheme
}


Wellness Children's Immune Chewable 30 wafers is a powerful cold weather blend designed to support children's immune defenses.
Wellness Children's Immune Chewable 30 wafers is a powerful cold weather blend designed to support children's immune defenses. It is carefully formulated with safe dosages of herbs and nutrients-including Echinacea, elderberry, astragalus,marshmallow, mushrooms, and zinc-plus advanced special ingredients such as beta-glucan and transfer factor and raspberry flavored.


text:
Q: Find And Replace Files Or Folders By Name In SSH I have several websites on my hosting account. Due to the security layers in place I cannot use symbolic linking, or include from from account to account. However I am a set of scripts that are going to be the same account several accounts.
Rather than uploading these scripts to each individual ftp account every time a change is made I want to have a simple bash script that will do it for me.
So what I want to do via SSH is to search my hosting server for a specific directory by name, for example "ThisUniqueFolder", then upload and replace all the files within that directory with the updated versions of the files that are stored on my local server.
Keeping in mind that this directory "ThisUniqueFolder" will exist in several different locations throughout the hosting server.

A: You can use ssh to find all ThisuniqueFolder, then use rsync to update them all.
Use ssh's -i identity_file to avoid password for user at remote_host.
#!/bin/bash
for f in `ssh -i /path/to/identity_file user@remote_host 'find /remote/search/directory -name "ThisUniqueFolder" -type d'`
do
    rsync -avu -e 'ssh -i /path/to/identity_file' ThisUniqueFolder/ user@remote_host:$f
done

redpajama_set_name: RedPajamaStackExchange


text:
The Satanic Psychological Role-Reversal Trick Wrecking World Culture.
Role Reversal: Where Sin and Sinfulness is Represented and Anti-Sin is Repressed; where Anti-Americanism is Represented and Americanism is Repressed.
Vic Biorseth, Sunday, August 16, 2020
We have discussed anti-Christ Christians, and anti-American Americans; but where did they come from? We have recommended breaking our anti-American Court, but, how did our Court ever get that way?
Does an anti-American American Court even make any sense at all?
We could make the argument that America is Christian, and that whatever opposes Christianity also opposes America. Indeed we have already made that argument, all over this website.
Under the impetus of the sneaky underhanded Cultural Marxism movement, material science was transformed into Scientism and all the world's leading academics began going Marxist a long time ago, and formal education went with them, and journalism went with education. To be any form of Marxist is to be both anti-Christian and anti-American. To whatever degree anyone is Marxist, to that same degree are they anti-Christian and anti-American.
By the immutable rules of Christianity, Christians are not allowed to be even a little bit anti-Christian.
Why should the Constitutional rules of America be any different?
And yet we see today all political parties and all of popular entertainment and celebrity and all of journalism actually representing and defending sin and Marxism, and repressing Christian adherence to theology, liturgy, doctrine and faith, and repressing anti-Marxism and any defense of America and the American Constitution against Marxist ideologies.
Even Fox News, held to be the most conservative news organization in America, represents sin and represses opposition to sin, and represents anti-American Marxism in an equal light to Americanism, while repressing even the mere anti-Marxist opinion that Marxism is in any way anti-American.
In the name of diversity or something.
Holding that cultural homogeneity is bad, and heterogeneity is good.
The exact opposite of truth.
Despite what Marxism says about itself, Marxist American citizens are not held by Fox News to be the least bit unpatriotic.
And so they treat us to the obviously Marxist political views of the likes of Alan Combs R.I.P., Juan Williams, Geraldo Rivera, Donna Brazile, Chris Wallace and others as the "Fair And Balanced" approach to American politics, indicating that the Marxist arguments for the conquest or elimination of Constitutional America deserves equal time, in editorial reporting and opinion reporting, with the defense of Constitutional America.
And that represents the most "conservative" view on network news today.
They see, believe and project the Marxocrat Party to be somehow patriotic. Which is to say that they see, believe and project such unconstitutional and anti-Constitution things as socialized medicine, redistributionism, Socialism, Communism, Islam, lawlessness and the end of the rule of law to be politically, socially, culturally and legally acceptable programs, inside the Unite States of America.
And the Republicrat Party, as a Party, holds the same view. They see no real problem with their main opposition Party being thoroughly anti-American, because they themselves do not see Marxism or Islam as being particularly anti-American. To them, that's all just some other perfectly innocent political viewpoints, deserving a political voice in America.
Islam, in its own scripture, quoting its own founder, exists for the sole purpose of eliminating all other religions, including Christianity, eliminating all other forms of government, including Constitutional America, eliminating all other forms of jurisprudence, including American law, and bringing the whole world under the domination of and into total submission to Islamic religion, government and law, by force.
Marxism, in its own Manifesto, quoting its own founder, exists for the sole purpose of eliminating all other social and cultural institutions, including religions, and bringing the whole world under the domination of and into total submission to the rule of the International Communist Party.
Militant Homosexualism, in its own sloganeering, quoting its own Marxocrat Party political activists, exists for the sole purpose of trivializing if not eliminating all natural forms and purposes of sex in the mind of man, promoting sexual perversion, promoting belief in imaginary false "genders" and legally suppressing Christianity and all Christian doctrines pertaining to sin, sex and the natural family.
While members of the Marxocrat Party are all on board with all three of those anti-Christian and anti-American goals, the Republicrat Party, again, as a Party, fails to roundly condemn any of those evil goals.
Mustn't be known as the Party of Islamophobia.
Mustn't be known as the Party of political Intolerance.
Mustn't be known as the Party of Homophobia.
Mustn't be known as a Catholic "Radical Trad" (i.e., Traditionalist).
Marxocrat and Republicrat elected officeholders alike make the public claim that they, personally, vigorously oppose such sins as abortion, homo-marriage, euthanasia, etc., but ... and there is always this but ...
They cannot in good conscience impose America's foundational Christian morality on sinful Americans against any sinful American's will.
And so, instead, they always vote in favor of sin, and they legally impose these other sinful American citizen's immoralities on all of America, against all of America's will, and against the Constitution.
They represent and champion anti-Christian and anti-American movements and they legalize and legitimize sin and crime.
They oppose and suppress Christianity, Constitutional rule, American morality and all proper sense of normalcy and national decency.
And they always do it in unconstitutional and illegal ways. None of these "rights" to commit sin and violate the Constitutional right to Life were legitimately legislated into American law because they couldn't be; they are all out of scope for federal law, as articulated in the limited and enumerated powers of legislation in Article 1 Section 8.
They don't even bother to ask us, let alone put any of these issues on a ballot for the voters. And journalism, writ large, agrees with them. They therefore represent sin, promote sin, legalize sin, and oppose Christianity.
They particulary restrict and suppress all speech critical of homosexual and transgender "rights". They won't say one word against it, and they won't allow you to say one word against it, and they will support all lawsuits against anyone who dares to criticize any sexual pervert.
It's a total role-reversal of those at the top, in politics and in journalism. America started out with an elected government that was representative of the citizenry, but now America has a government that is mostly if not only representative of America's enemies.
They protect and promote the sworn American mortal enemy, Islam, in a gross misinterpretation of the First Amendment's Freedom of Religion, at the same time that they quite unconstitutionally and illegally suppress Christianity and the ability of American citizens to fully live the Christian life they all are called by their religion to live.
They protect and promote the sworn American mortal enemy, Marxism, in a gross misinterpretation of the First Amendment's Freedom of Speech, at the same time that they quite unconstitutionally and illegally suppress pro-American speech shining the light of truth on Marxism and Marxists operating to take America down right here in America.
They protect and promote the Satanic sworn enemy of truth, normalcy and morality - sin - at the same time that they suppress Christian public prayer, monuments, religious expression and adherence to Christian doctrine and the Christian sense of decency and good citizenship.
Our speech is suppressed; our enemy's speech is protected.
Our Parties and our Journalists have become willing partners operating the Marxist Sexualism PSYOPS program against Christianity, against the Constitution and against the American citizenry.
One Party supports and the other Party does not oppose strongly enough the Communist Covid-19 PSYOPS program and the Communist Black Lives Matter PSYOPS program that are coordinating efforts to fulfill the Clintonista-Obamunist plan to Make America Bad Again.
They intend to cheat their way to victory in the 2020 elections.
Most of American journalism sides with the anti-American Marxocrats, and those who don't, still do not see the Marxocrat Party as being the least bit anti-American, let alone anti-Christian. Just by their lackadaisical attitudes they are growing Antifa.
That's why we have called for the reestablishment of American Local Militias. As we said in Organizing, the Marxocrat Party's rioters are organized, we are not, therefore we are at a distinct military disadvantage, and all the Marxocrat Party anti-Christians and anti-Americans out there among us fully intend to keep it that way.
The authors of the Second Amendment specifically intended it to mean that the American citizen was to be armed with weapons of war. That was what the American Militia was armed with, including crew served weapons and the best available military assault weapons of the day.
It's time to revert back, and either restore the original intentions of the authors of the Declaration and the Constitution, or die trying.
It's time to reestablish Constitutionalism, outlaw Marxism, outlaw Islam, outlaw Parties and banish if not hang American domestic enemies of the Constitution.
If we don't defeat them, they will destroy the USA, and enslave you and yours, or worse.


"Now there's laws that we must live by. And they're not the laws of man. Can't you see the shadow, That moves across this land." "And the Judgment Day is coming...."
The BEST cover of a great Styx tune you'll ever hear by an attorney who has argued before the US Supreme Court.


text:
Novak Djokovic's father recalls the horrors of war and challenges the family faced in making Novak the best player
in Tennis
Novak Djokovic and his father Srdjan Djokovic (Image Credit: Kurir)
Tennis icon Novak Djokovic has seen it all in his two-decade-old career. He has gone through phases of immense successes, failures, struggles, etc. He has faced both flak and praise for his performances on the court and his demeanor off it.
He started the year with a disgraceful exit from Down Under, just a day before the start of the Australian Open 2022 in January due to his unvaccinated status against Covid-19. But he did not choose to bow down before the authorities and chose not to get the Covid-19 vaccine, despite his absence from US Open and many important tournaments. He rose to win the 2022 Wimbledon trophy and 4 other ATP tournaments including the 2022 ATP Finals tournament.
Novak Djokovic was honored by the 321 Serbia Association as the "best ambassador in the world" of the Serbian country. On his behalf, his parents attended the felicitation ceremony.
"Novak showed that nothing is impossible when you really want to. In the worst of times, he trained under bombs, but he didn't give up. And he showed that we are not a genocidal nation. With his work and effort, he showed that he comes from a fantastic nation, the Serbian nation," Srdjan Djokovic, father of the 21-time Grand Slam champion addressed the gathering as reported by British daily The Express.
Novak Djokovic through his hard work and courage earned great laurels for his country. He also helped to improve the image of the Serbian nation and proved to the world that Serbians have both sporting prowess and talent with which they can bring smiles and happiness to millions of faces.
Also Read: "The best year of my life", Nick Kyrgios posts romantic pictures as he celebrates one year anniversary with his girlfriend Costeen Hatzi
Rise of Novak Djokovic
Novak Djokovic – FirstSportz
Novak Djokovic grew up during the time civil war in Yugoslavia was at its peak. NATO was bombing his homeland. In such, a tumultuous and difficult atmosphere, the Serb trained and was successful in playing professional tennis on the global stage and for his country.
"We are not giving up and we are still alive. It all feels so different now. I don't remember most of this, I was so small, feeling unsafe and disturbed emotionally. Unaware of what the next moment brings to me, my brothers, and my family. It was a horrifying experience for everyone. Particularly for children. We did not understand what was happening," Novak Djokovic said in an interview in 2020 when he visited the bomb shelter in which the Djokovic family lived during the bombings.
The 7-time Wimbledon champion rose through the ranks of professional tennis step-by-step every year to become an intrinsic part of The Big Three. He played against top seeds such as Rafael Nadal, Roger Federer, and Andy Murray and even won against them. At the age of 35 years, he is as fit and eager to win titles as he was at the start of his career. He will kickstart his 2023 season by participating in the Australian Open in a bid to win the title for the tenth time in his career.
Srdjan Djokovic concluded his speech by driving the minds of the audience with energy and hope for Serbia.
"Be proud of being Serbs and that Novak is part of the Serbian people," he said. Novak Djokovic helped his country to win the 2010 Davis Cup title. He also won the Beijing Olympic Games bronze medal in 2008.
Also Read: Rafael Nadal and Carlos Alcaraz set up a blockbuster 'boxing-like' exhibition event in Las Vegas ahead of Indian Wells 2023
Also Read: "You have a huge heart" – Fans react upon Iga Swiatek's gesture to gift presents to families in need as part of her Christmas tradition
Tags: Novak Djokovic


text:
Q: Notifications not working when app is swiped away I'm writing a simple app that sets up to 8 random, repeating alarms, sends a notification, and then generates a quote when the user taps on the notification. This all seems to work properly when the app is running but when the app is swiped away from the recent apps, or force closed, the notifications don't work.
I've poured over my research from the last several days and can't find a solution that's current or fixes my problem. The most common thing I've seen is to use onReceive to set up a service, but my reading has shown me that this no longer works with Oreo and is outdated advice. I've also seen some stuff about foreground services, but I'm really not looking to have a persistent notification bothering the user.
I've also seen some people say to do some work in onDestroy, but that hasn't worked for me either. A lot of the stuff I've found has said that this kind of behavior is "expected behavior", as the system assumes that if an app is swiped away, the user no longer wants it doing anything. I don't want this happening and there must be some way around it, since reminders and notifications from other apps are able to come through.
Any help would be greatly appreciated, I've been struggling with this for a long time. I'll post my code for setting alarms below, as well as the code for setting up the notification channels and the BroadcastReceiver class.
By the way, my test device is a Pixel 2XL with Android 9.
//method to save preferences when the user clicks "SAVE"
    private fun saveData() {

        if (NOTIFICATIONS_PER_DAY > 0) {
            setAlarms()
        } else {
            clearAlarms() //clearing if the user is removing notifications
        }

        val sharedPreferences = activity!!.getSharedPreferences(SHARED_PREFS, MODE_PRIVATE)
        val editor = sharedPreferences.edit()

        editor.putString(THEME_PREF, THEME_SELECTED)
        editor.putInt(NOTS_PREF, NOTIFICATIONS_PER_DAY)

        editor.apply()

        Toast.makeText(context, "Settings saved", Toast.LENGTH_SHORT).show()
    }//saveData method

    //method to set repeating notification alarms (random times)
    private fun setAlarms() {
        //clearing any previously saved alarms to prevent tons of extra
        clearAlarms()
        calList.clear()

        var hour: Int
        var minute: Int

        for (i in 0 until (NOTIFICATIONS_PER_DAY)) {
            val hourRand = (0..23).random()
            val minuteRand = (0..59).random()

            hour = hourRand
            minute = minuteRand
            val cal = Calendar.getInstance()
            cal.set(Calendar.HOUR_OF_DAY, hour)
            cal.set(Calendar.MINUTE, minute)
            cal.set(Calendar.SECOND, 0)

            calList.add(cal)
        }//for

        var i = 0
        for (cal in calList) {
            val alarmManager = context!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val intent = Intent(context, AlertReceiver::class.java)
            val pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0)

            alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent)
            println(i)
            i++
        }//for

    }//setAlarms method

class BetterDays : Application() {

    override fun onCreate() {
        super.onCreate()
        createNotificationChannels()
    }

    private fun createNotificationChannels() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel1 = NotificationChannel(CHANNEL_1_ID, "Quote Channel", NotificationManager.IMPORTANCE_DEFAULT).apply { description = "New quotes notification" }
            channel1.enableLights(true)
            channel1.enableVibration(true)
            //channel1.description = "New quotes notification"

/*            val channel2 = NotificationChannel(CHANNEL_2_ID, "New Quote!", NotificationManager.IMPORTANCE_DEFAULT)
            channel2.enableLights(true)
            channel2.enableVibration(true)
            channel2.description = "New quotes notification" */

            val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            manager.createNotificationChannel(channel1)
            //manager.createNotificationChannel(channel2)
        }

    }//createNotificationChannels method

    companion object {

        val CHANNEL_1_ID = "quotes notification"
        val CHANNEL_2_ID = "quotes notification 2"
    }
}

class AlertReceiver : BroadcastReceiver() {

    private var notificationManager: NotificationManagerCompat? = null
    private var theContext: Context? = null

    override fun onReceive(context: Context, intent: Intent) {

        notificationManager = NotificationManagerCompat.from(context)
        theContext = context
        sendOnChannel1()
    }//onReceive method

    private fun sendOnChannel1() {
        val title = "New Quote Available"
        val message = "Come check it out!"

        var index: Int = 0
        if(quotesList.size != 0) {
            index = Random.nextInt(quotesList.size)
        }//if
        quoteText = quotesList[index]
        speakerText = speakersList[index]

        quoteTextView?.text = quotesList[index]
        speakerTextView?.text = speakersList[index]

        val intent = Intent(theContext!!, MainActivity::class.java)
        intent.putExtra("From", "quotesFragment")

        val pendingIntent: PendingIntent = PendingIntent.getActivity(theContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)

        val notification = NotificationCompat.Builder(theContext!!, CHANNEL_1_ID)
                .setSmallIcon(R.drawable.ic_quotes)
                .setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(true)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setCategory(NotificationCompat.CATEGORY_MESSAGE)
                .setContentIntent(pendingIntent)
                .build()

        val id = createID()

        notificationManager!!.notify(id, notification)

    }//sendOnChannel1 method

/*    //for future functionality
    fun sendOnChannel2() {
        val title = "Title"
        val message = "Message"

        val notification = NotificationCompat.Builder(theContext!!, CHANNEL_2_ID)
                .setSmallIcon(R.drawable.ic_quotes)
                .setContentTitle(title)
                .setContentText(message)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setCategory(NotificationCompat.CATEGORY_MESSAGE)
                .build()

        notificationManager!!.notify(2, notification)

    }//sendOnChannel2 method*/

    //method to generate a unique ID
    private fun createID(): Int{
        val now = Date()
        val id = Integer.parseInt(SimpleDateFormat("ddHHmmss", Locale.US).format(now))
        return id
    }//createID method
}//AlertReceiver class

A: Some chinese device with their own modified android system so when the apps are swiped from the recent app tray your app gets terminated (similar to Force Stop). And due to this every task running in the background like Services, Jobs gets killed with the app. Even High priority FCM doesn't see the daylight in Chinese ROMs.
you can read in here : https://medium.com/mindorks/enable-background-services-in-chinese-roms-32e73dfba1a6
maybe can help ;)


When Jourdan Dunn isn't strutting down a runway, you can find her at a boxing class, cranking up her cardio, lifting weights, and cooling down with yoga. That's because sculpting the fit and toned physique of a supermodel takes good old fashioned hard work. But the 26-year-old model doesn't go at it alone—her brother and trainer, Antoine Dunn, actually teaches her boxing class and keeps her moving. Here, the up and coming trainer revealed his top fitness tips to Healthista.
Dunn doesn't really follow a specific "diet." He simply believes in eating as healthy as possible, and treats his cravings in moderation.
These are Dunn's go-to exercises: If you're still streamlining your routine, opt for bodyweight workouts. "You need to be able to move your own weight first before thinking about adding additional resistance," he says.
Looking to melt fat? Bust through those burpees, he says. (Here are 25 burpee variations to get you started.) For upper-body strength, Dunn loves a good push up.
If you've hit a weight loss plateau or your muscle growth has stalled, give it some more time. Fitness isn't a race, it's a journey, says Dunn.


BabyGizmo.com's Giant Weekly Giveaway this week is a Fisher-Price Space Saver High Chair in Mocha Butterfly! To check out the exact high chair – it is featured in our Space Saving Baby Product video segment HERE.
All you have to do is log in at BabyGizmo.com to be entered to win! One winner will be chosen at random from all the people that log in and/or leave a comment! Giveaway ends on Sunday, September 4, 2011 at 11:59pm CST.
2) Leave a comment below and tell us your favorite feature of the Joovy Room.
4) Tweet about the contest! (You need to leave a comment here and let us know you Tweeted it. That's 2 extra entries if you do though! One for the Tweet and one for the comment here!
*Congratulations to Marissa C. for winning the Joovy Room Playard in last week's giveaway.
This is great, saves room and is soooo cute!
This chair is so cute! Love it!
This is a great concept not having to take up room w/ a big high chair.
I have 4 boys and a girl, so I am hoping to win this so she has some more girly stuff around here!
I love these high chairs!
this would be perfect for my little princess who is just starting solids!
I would love the highchair! I am so sick of feeding our 17 month old on the couch. It is a mess! Plus with the second one arriving any day now, it would sure get good use!
Would love to win this highchair! I'm so tired of restaurants with dirty highchairs, this would be perfect for travel and everyday use both!
Ooooh! We really wanted one of these when we made our registry and didn't end up getting one. Would still love to have one and I love the pattern!
My mother has this chair at her house for when the grandchildren come over and it's terrific! I'd love to win it!
Would love to win this! The fact that it doesn't take up much room is great! I also love that the cover can be removed and washed and that the seat itself can recline!
Another awesome giveaway from BabyGizmo. This amazing space saver high chair is great and I absolutely LOVE the mocha butterfly pattern. THANK YOU for this giveaway!
I commented on Baby Gizmo's fb page.
My favorite feature of the Joovy Room is all the storage space.
I logged into Baby Gizmo- Socalsunshine318. I hope to win!
This high chair is great! Especially since we are always going to our lakehouse or grandma/grandpa's house. It would fit great in the car and be so wonderfully transportable. I would LOVE LOVE LOVE to have one!
I love this high chair, it's so cute, would love to win it for my baby girl! The butterflies are adorable!
I love this chair! We had a Graco standard high chair for our son and it was great except it took up too much room in our small dining area! My bestest friend had another baby last year and bought this style and LOVES it! Because of the size, that is my favorite feature. It sits on an existing chair so there's no extra space taken up and your baby is still comfortable & within arms reach! Even my husband has stated we have to get this chair for our next little one. Our theme too is chocolate brown & butterflies!
I'm keeping my fingers crossed I win this high chair! I want one!!
Love this highchair!! What a great space saver!!
LOVE the colors and compact size!
I would love this for my little girl. She will be starting solids soon and we don't have room for a highchair.
I would love to win the Fisher Price high chair!
I would love to win this high chair. Our full size is huge and we don't have room for it so it drives me crazy!
Love the pretty design and the compact size. Would love to win it.
I would love to win the space saving highchair, this is my only option. We don't have any room for a highchair.
I would love to win this! It is the cutest little high chair ever! My daughter will be eating in STYLE!!!!!
I really love the print on this seat!
I follow you on twitter and retweeted the contest @leslieannp!
Would love to win this…expectin my first granchild in Feb!
Would love to have this space saver seat!
Would love to win one for Grandma's house so when my niece visits we will have a chair for both of the girls(they are 3 weeks apart). Love it!
Would love to win the space saver high chair for my little one! It would be perfect for our small apartment & help us save what little space we have!
Would love this little chair for my little girl!
Tweeted!! Love Love Love the Fisher Price Space Saver High Chair in Mocha Butterfly!!!
This Fisher Price Space Saver High Chair is AWESOME!!! Especially in the Mocha Butterfly Collection. Not only does it hold up to baby spit ups and toddler destruction but it washes nicely and holds up strong! Love Love Love!
Would love to win this chair.
I am a organizer, so space saving and duel functions is for me! I must say I was impressed with the puj baby tub as well, we tend to keep alot of items in the bathroom and the plastic tubs take up alot of closet space.
we have one of these for our small 1 bedroom condo and it is FANTASTIC! it's small but sturdy, the cover is easily removable and washable, it reclines so you can use it even if your baby can't sit all the way up by him/herself and the table comes off so you can wash it easily. we need another one for grandma's house.
favorite feature is that it actually reclines!
Would love to win one for grandma's house!
Of course I love the space saving feature, but I also like the way the tray has deep areas – less spills!
Love this chair! I could use another one for the grandparents house.
great highchair! would love to win it!!
This high chair would be perfect in my small kitchen.
The chair is really cute, and doesn't take up much space.
I just got one of these for one of my 2 boys. I really like how easy it is to take along when going out. I know that it will be a comfy secure 5 pt harness wherever I am. I would love to have one for my other boy. Butterflies….. well….. um….. they wouldn't be my pick, but the chair is really top notch!
The 4 pocket organizer AND the parent organizer!!! Thanks!
have #2 on the way and only one high chair. could really really use this!
I love how much space it saves!