text:
US abstains as UN demands end to Israeli settlements
By: Melissa Hudson Facebook | Twitter
Posted: Dec 23, 2016 7:46 PM EST | Updated: Dec 23, 2016 7:57 PM EST
By Stephen Collinson, David Wright and Elise Labott CNN
WASHINGTON (CNN) -- The United States on Friday allowed a UN Security Council resolution condemning Israeli settlement construction to be adopted, defying extraordinary pressure from Prime Minister Benjamin Netanyahu's government in alliance with President-elect Donald Trump.
The Security Council approved the resolution with 14 votes, with the US abstaining. There was applause in the chamber following the vote, which represented perhaps the final bitter chapter in the years of antagonism between President Barack Obama's administration and Netanyahu's government.
In an intense flurry of diplomacy that unfolded in the two days before the vote, a senior Israeli official had accused the United States of abandoning the Jewish state with its refusal to block the resolution with a veto.
Trump had also inserted himself in the diplomatic drama, in defiance of the convention that the United States has only one president at a time, by calling on the Obama administration to wield its Security Council veto.
Israel's UN ambassador, Danny Danon, reacted angrily to the vote and issued a sharp parting shot at the Obama administration's role.
"It was to be expected that Israel's greatest ally would act in accordance with the values that we share and that they would have vetoed this disgraceful resolution. I have no doubt that the new US administration and the incoming UN Secretary General will usher in a new era in terms of the UN's relationship with Israel," he said.
In a statement, Netanyahu's office accused the Obama administration of "colluding" with the UN and said it looked forward to working with Trump, as well as Israel-friendly members of Congress, "to negate the harmful effects of this absurd resolution."
The US ambassador to the UN, Samantha Power, raised her hand to abstain in the chamber when the resolution was put to a vote.
Power argued after the vote that opposing settlement expansion was consistent with the bipartisan consensus accepted by every single US president of both parties since Ronald Reagan, in comments that could be seen as a criticism of Trump's position.
"This resolution reflects trends that will permanent destroy the two state solution if they continue on their current course," Power said in a speech before the chamber.
"Our vote today does not in any way diminish the United States' steadfast and unparalleled commitment to the security of Israel," Power said.
The Palestinians were delighted by their rare diplomatic coup.
"This is a victory for the people and for the cause, and it opens doors wide for the demand of sanctions on settlements," said Mustafa Barghouti, a Palestinian leader.
"This is a bias towards justice and international law."
But Trump -- who has vowed to move the US embassy in Israel from Tel Aviv to Jerusalem, and has nominated an ambassador in David Friedman who is supportive of settlers -- pledged that the Palestinians would no longer have a platform at the UN when he is inaugurated next month.
"As to the U.N., things will be different after Jan. 20th," Trump wrote on Twitter.
The United States and most other nations consider Israeli settlements in the West Bank and east Jerusalem as an obstacle to the hopes of a two-state solution between Israelis and Palestinians.
The Obama administration, which mounted two failed efforts to broker Middle East peace, became increasingly angry about continued Israeli settlement expansion over its eight years in the White House. The Palestinians accuse Israel of trying to establish facts on the ground by building on land they view as part of their future state.
"Today, the United States acted with one primary objective in mind: to preserve the possibility of the two state solution, which every US administration for decades has agreed is the only way to achieve a just and lasting peace between Israelis and Palestinians," Secretary of State John Kerry said in a statement, adding that the US does not "agree with every aspect" of the resolution.
He added: "We cannot in good conscience stand in the way of a resolution at the United Nations that makes clear that both sides must act now to preserve the possibility of peace."
'Secretly cooked up'
Hours before the UN Security Council vote, the Israelis made clear their intense disappointment with the US over the resolution, which calls on Israel to "immediately and completely cease all settlement activities in the occupied Palestinian territory, including East Jerusalem."
"President Obama and Secretary Kerry are behind this shameful move against Israel at the UN," a senior Israeli official told CNN.
"The US administration secretly cooked up with the Palestinians an extreme anti-Israeli resolution behind Israel's back which would be a tailwind for terror and boycotts and effectively make the Western Wall occupied Palestinian territory," a senior Israeli official said.
Before the vote, a Palestinian official said, "We have nothing to say about this. No President has troubled Palestinians in the UN more than President Obama."
The New York Times reported this week that Obama's advisers did not disclose a position on how the US would vote and were holding out until the vote to see how the matter developed. Ben Rhodes, Obama's deputy national security advisor, told reporters Friday that he wasn't sure if Obama and Trump had spoken about this issue and added he was not aware of any particular conversation.
Rhodes said Obama made the decision this morning, adding that "there's one president at a time."
US and Palestinian officials denied the Israeli accusation of colluding on the UN vote. The resolution was originally put forward by Egypt but it was withdrawn under pressure from the Israelis. Four countries, New Zealand, Venezuela, Malaysia and Senegal, brought it up again for a vote on Friday.
A senior Obama administration official said, "To be clear: from the start, this was an Egyptian resolution. The Egyptians authored it, circulated it, and submitted it for a vote on Wednesday evening before asking for a delay and subsequently removing their sponsorship.
"Contrary to some claims, the administration was not involved in formulating the resolution nor have we promoted it."
A senior Palestinian official told CNN they were not informed how the US would handle the Security Council vote when a delegation was in town earlier this month to urge the administration to support it. The Palestinian official said they did not know how the US would vote and called the Israeli allegation "totally untrue."
Two senior US officials involved in this process vehemently also denied the Israel accusation and also said that the US itself didn't really know how it was going to vote until Thursday morning. The official said Kerry himself was surprised that the Egyptians put the resolution forward so quickly. He was left scrambling to finish his speech and then left scrambling again when the Egyptians delayed the vote on Thursday.
"A veto means support of settlement activities," Saeb Erekat, the Palestinian negotiator, said after the resolution was pulled, according to the Times. "A veto means abandoning the two-state solution and peace efforts."
The UN resolution -- which calls on Israel calls on Israel to "immediately and completely cease all settlement activities in the occupied Palestinian territory, including East Jerusalem" -- was delayed by Egypt after Israeli pressure.
Raises tensions
The resolution exacerbated divisions between the outgoing Obama administration and incoming Trump administration.
The Obama administration had been weighing whether to support the UN measure or abstain from voting, which would have been a break from the US's traditional practice of shielding Israel at the UN and other international organizations.
The Obama administration has grown increasingly frustrated by Israeli settlement construction and it has repeatedly warned it could foreclose the possibility of a two-state solution with the Palestinian people. The admission of an internal debate about the UN resolution illustrated how unhappy the administration is with the Israeli government.
Israel -- concerned by the outgoing administration's ambivalence -- reached out to Trump for support. An Israeli official told CNN that his country approached the Trump team after it felt that it had failed to persuade the Obama administration to veto the planned vote.
The official said that Israel "implored the White House not to go ahead and told them that if they did, we would have no choice but to reach out to President-elect Trump."
Trump subsequently put out a statement opposing the resolution.
"As the United States has long maintained, peace between the Israelis and the Palestinians will only come through direct negotiations between the parties, and not through the imposition of terms by the United Nations," Trump said. "This puts Israel in a very poor negotiating position and is extremely unfair to all Israelis."
Egyptian President Abdel Fattah Al-Sisi also spoke with Trump by phone about the UN Security Council vote, according to a diplomatic source familiar with the call and an aide Trump. The call was first reported by Reuters.
CNN's Allie Malloy contributed to this report.


← Literacy levels – bit of a rant!
YOGA boosts your brain power!
I love yoga. The archived news clip above proves how powerful it can be, in a positive way. So I was dismayed to read an article a few weeks ago, called 'How Yoga Can Wreck Your Body', in the New York Times. This article's content was drawn from a book published earlier this year, called 'The Science of Yoga, The Risks and Rewards' by William J Broad. William J Broad is a senior science writer for The Times. His claims created a debate in the media, (and I'd guess that the publicity will have done no harm to the promotion of his book).
If you're a writer and a yoga fan, I'd love to hear if you think it helps you with your writing.
This entry was posted in Yoga and tagged Adho Mukha Svanasana, author, brain power, healthy-living, New York Times, Science journalism, Times, United States, William Broad, William J Broad, writing, yoga. Bookmark the permalink.
4 Responses to YOGA boosts your brain power!
I love yoga and I was disappointed in the artice in the new york times. People who don't practice yoga at all have made comments to me about how yoga can be dangerous. It's like this article has given people the false feeling of knowing about the practice and the right to talk about the risks. what about the benefits?
I love the yoga haze you referred to. I call it yoga brain. I'm not a writer (except for my blog!) but I am an elementary school teacher and the calm feeling I get from yoga is definitely beneficial to my students as well as myself!
Thank you for your comment. I am pleased to hear that you feel passionate about yoga, as I do. I've been practising yoga for about 30 years, and can honestly say it has always done me enormous good, never harm! All the best, Rosie.
Hi Rosalie, I agree that yoga helps in all areas of life, including writing. Also after a walk in the local woodlands I find I can write better.
Hi Susan, thank you for your comment which I have only just found (sorry, only excuse is I've been offline abroad for several weeks)! There was a programme called Tales from the Wild Wood on BBC 4 last Wednesday, where one of the themes was the healing properties of woodlands, so you are definitely not alone in finding woodlands inspirational!


This beautifully built colonial exudes plenty of natural sunlight into much of the open floor plan. (12.83 acre parcel included and appraised at $26k). Vaulted ceilings/skylights, dark stained beadboard ceilings, gas fireplace for those cozy nights, first floor master suite, beamed ceilings, breakfast bar, large fenced in yard. Large loft used as an office/library. Large stained deck, extra large horseshoe driveway. Basement waiting for your finishing touches. Quiet neighborhood yet near Ex 16.Passed all inspections! $1000 credit at closing if in contract by 4/1.


text:
Share this Story: Human Rights Watch says Bolsonaro a threat to democracy in Brazil - report
PMN Environment
PMN Crime
Human Rights Watch says Bolsonaro a threat to democracy in Brazil - report
BRASILIA — This year's general elections in Brasil will be a test for the country's democracy due to threats by far-right President Jair Bolsonaro who has questioned the validity of its voting system, Human Rights Watch said on Thursday.
In it annual report on rights abuses around the world, the Washington-based group urged Brazil's Supreme Court, Congress and other democratic institutions to remain vigilant and resist any attempt by Bolsonaro to undermine the October elections.
Human Rights Watch says Bolsonaro a threat to democracy in Brazil - report Back to video
"President Bolsonaro tried to weaken the pillars of democracy, attacking the judiciary and repeating baseless allegations of electoral fraud,' said Maria Laura Canineu, Human Rights Watch director in Brazil.
His government has promoted policies contrary to human rights in various areas, including indigenous peoples' rights, women's rights, people's rights with disabilities and freedom of expression, the report said.
The president's office did not answer a request for comment on the rights report. Bolsonaro plans to seek re-election in October, though he has not formally declared his candidacy.
Police lethality reached a record in 2020 in Brazil, with the highest number of deaths resulting from police action since the indicator started to be monitored, and about 80 percent of the victims were black, HRW said.
Bolsonaro has encouraged police violence and defended a bill to make it harder to hold police officers accountable for abuses, it added.
His government pursued criminal investigations against critics, including with the use of the National Security Law of the 1964-1985 military dictatorship that he defends, it said.
Bolsonaro has promoted bills to deny the right of many indigenous peoples to their traditional lands and, in practice, legalize illegal mining in those territories.
During his administration, deforestation in the Amazon has skyrocketed to the highest level since 2006, as shown by the government's own data, Human Rights Watch said. (Reporting by Anthony Boadle; Editing by Sandra Maler)

redpajama_set_name: RedPajamaCommonCrawl


text:
Siege of Petersburg Resources > Official Records > Volume XLVI > Part 1 (Serial Number 95) > Siege of Petersburg Reports (95) > OR XLVI P1 #181: Reports of Major…
OR XLVI P1 #181: Reports of Major General John B. Gordon, commanding Second/ANV, Feb 6 and Mar 25, 1865
in Siege of Petersburg Reports (95)
No. 181. Reports of Major General John B. Gordon, C. S. Army, commanding Second Army Corps, of operations February 6 and March 25.1
HDQRS. SECOND CORPS, ARMY OF NORTHERN VIRGINIA,
February 9, 1865.
COLONEL: I have the honor to submit the following brief report of the fighting on the west side of Hatcher's Run on the 6th instant:
On the morning of that day Pegram's division moved out from camp to reconnoiter, one brigade moving near the run and the others farther to the right and along the Vaughan road. In these positions the brigades were vigorously attacked by both cavalry and infantry in heavy force. They were pressed slowly back, bravely resisting the enemy's advance. Gordon's division, Brigadier-General Evans commanding, sent forward in support, formed on Pegram's left, charged and drove the enemy before it, but was finally forced by superior numbers to retire. It was readily reformed near the enemy's lines, and again advanced wit spirit, while Pegram charged on the right. The enemy was again driven back, but General Pegram, who was riding immediately with his troops, being killed, and Colonel Hoffman, commanding brigade, severely wounded, a portion of the line was thrown into confusion. The battle had been obstinately contested for several hours, when Mahone's division arrived and was placed in position to fill a gap between Evans and Pegram. The whole line now advanced to the attack and drove the enemy in confusion to his works along the bank of the creek.
I am, colonel, very respectfully, your obedient servant,
J. B. GORDON,
Major-General, Commanding.
Lieutenant Colonel W. H. TAYLOR, A. A. G., Army of Northern Virginia.
[Indorsement.]
February 11, 1865.
I respectfully forward a report from General Gordon of the operations of the infantry west of Hatcher's Run on the 6th instant, which is more full than my dispatch of that date.
R. E. LEE,
I desire to bring to the attention of the commanding general the admirable conduct of Colonel H. P. Jones, commanding artillery on my line, and the officers and men of his command, during the action at Hare's Hill, on the morning of the 25th instant. Colonel Jones at the front, personally superintending the management of the artillery, and a select body of officers and men, under the command of Lieutenant-Colonel Stribling, charged the enemy's breast-works with the sharpshooters of this corps, and at once turned upon the enemy the captured guns.
Colonel W. H. TAYLOR,
Assistant Adjutant-General, Army of Northern Virginia.
The War of the Rebellion: A Compilation of the Official Records of the Union and Confederate Armies, Volume XLVI, Part 1 (Serial Number 95), pp. 390-391 ↩
Tagged as: battle of fort stedman, battle of hatcher's run, february 6 1865, march 25 1865, Official Records, war of the rebellion
Previous post: OR XLVI P1 #180: Returns for the Army of Northern Virginia, Jan 10, 26-31, 31, Feb 10, 20, Feb 24-Mar 1, 1865
Next post: OR XLVI P1 #182: Report of Colonel William R. Peck, York/Evans/Second/ANV, February 5-7, 1865


There's no doubt that wedding dress styles, though steeped in tradition (and much of this due to precedent set by Queen Victoria), change according to the prevailing modes of the time. This was just as much true between the 1880s-1930s as it is today. In honor of the recent marriage between Prince Harry and Meghan Markle on May 19, Femme Fashion Forward will showcase wedding dresses throughout the years of the FFF timeline with stylistic notes.


At the moment, it's Ace Attorney.
How many google docs have you created this month?
What is your least favorite letter in the alphabet?
Fast Food or Fair Food?
Sweet potato fries or regular fries?
In 'n' Out or Taco Bell?
Favorite thing to order from dairy queen?
Has the snow melted yet where you are?
...We never got snow in the first place, dammit.
Do you snowboard or ski?


Rise Of The Tiki God, Page 4 – Catbeard the Pirate!
NINJA! The legendary nemesis of the pirate!
I've been teasing the appearance of ninja in the comic since the very beginning, and they're FINALLY HERE. What will happen?! Come back Wednesday to see what these black-pajama-clad hoodlums have in store for Catbeard and crew!


This fourth lesson discusses timers and how to use them to generate delays and waveforms on I/O-pins. The modes of operation are Timebase, Output Compare and PWM. Also using the SysTick timer is discussed. All of these modes of operation are supplied with example code.


text:
Q: Not able to build project with Flash Builder 4.6 When ever I am doing build or clean build, I am getting following error:
An internal error occured during:"Searching for Markers"

Using Flash Builder 4.6 on Windows 7 with 8 GB RAM.

A: Have you tried Project > Clean...? I get internal build errors all the time and even odder errors where a half dozen or so images won't embed without removing the @Embed('') bits from the source property. Project > Clean... fixes it pretty much every time. The few times it hasn't, unfortunately, I've ended up having to reinstall Flash Builder, which is a royal pain.
EDIT: Woops. This may be what you were referring to with a "clean build". I was thinking it was a vanilla project you were trying to build that was failing. My mistake.

redpajama_set_name: RedPajamaStackExchange


You may book your hotel online either following your congress registration or by clicking on this link.
All information regarding sessions, chairs, scientific works and abstracts is constantly being kept up-to-date on our website and can be found under "Program".
All abstracts for freepaper sessions and poster session have been published as online supplement of the journal "Der Ophthalmologe".
The Estrel combines hotel and congress center and offers room for more than 1.000 guests in its adjoining hotel. With meeting, accommodation and exhibition under one roof, the DOG 2017 offers its participants proximity and comfort.
The Congress Newsletter will give you regular updates on important topics and organizational details.


Clever Cutter Stainless Steel Clever Cutter 2-in-1 Knife & Cutting Board is the fast, easy way to chop vegetables, fruits, meats, cheese and more. Stainless steel blades easily cut through the toughest meats and slice perfectly thin foods for simple, elegant serving. Now you can easily slice, chop and carve foods for the perfect salad, kabobs, stir fry and much more. Deluxe Clever Cutter comes with premium, stay-sharp Stainless Steel blade.
Deluxe Clever Cutter comes with premium, stay-sharp German Stainless Steel blade.


text:
Conveyancing Calculator
CONVEYANCING TARIFF CALCULATOR
MORTGAGE BOND COSTS
CONVEYANCING TARIFF CALCULATOR (INCLUDING FEES & TRANSFER DUTY)
Please enter the value of the property and submit.
* Accurate up to a value of R20 000 000,00
NATURAL PERSON LEGAL ENTITY
Recommended Fee
Transfer Duty
Deeds Office
Rates Cert.
Sectional Title
This calculator is based on the recommended costs published in the Government Gazette and was last updated in April 2011. It is accurate up to a value of R20 million, but does not reflect charges for any additional components and registrations such as exclusive use areas, and should be used as a guide only.
SCHEDULE OF MORTGAGE BOND COSTS(INCLUDING FEES & STAMP DUTY)
Please enter the value of the mortgage bond and submit
*Accurate up to a capital sum of R20-million
(excluding banks raising and administration charges).
This calculator is based on the recommended tariff published in the Government Gazette and was last updated in April 2011. It is accurate for costs of the registration of a bond of up to R20-million, but does NOT include any charges which may be raised by the financial institution. The figures should therefore be used as a guide only.
King-Essack & Associates Incorporated initially started out as King & Associates when Adrian King commenced practice for his own account in 1986. Roger Jenkins joined the practice as a partner in 1989 and Derek Wright joined as a partner in 1992.
Information required to enable us to draw up a Sale Agreement
Transfer and Bond Costs
Bond Repayment Calculations
Steps in the transfer process
Information required to enable us to draw up a will Instructions
Feel free to get intouch with us today! To find out how we can assist you further with your legal requirements.
Tel: + 27 (0)31 7011561
Email: info@kingassoc.co.za
Website: www.kingassoc.co.za
Copyright © 2014 King Essack & Associates | Web Design By SWD


text:
He Tried Not to Spill His Drink. Now He's in a 'Nightmare'
Jamie Harron, 27, accidentally brushed against a man's hip in Dubai
By Linda Hervieux, Newser Staff
Posted Oct 9, 2017 10:30 AM CDT
Updated Oct 14, 2017 8:56 AM CDT
Tourists take a selfie in front of Burj Khalifa, the world's tallest tower, in Dubai. (AP Photo/Kamran Jebreili)
He was trying not to spill his drink. That's what a Scottish tourist says led to his arrest in Dubai for touching a man's hip, the BBC reports. Jamie Harron, 27, says he was walking with a drink in the crowded Rock Bottom Cafe when he put out his hand "to avoid impact" with a patron, per the Press Association. The incident happened July 15 after the electrician stopped off in Dubai for a couple days en route to a job in Afghanistan. Police arrested Harron on charges of public indecency and drinking alcohol, casting the electrician in an "outrageous" saga that shows no signs of ending, says Radha Stirling of the Detained in Dubai NGO. "This is another example of how vulnerable tourists are to arrest and detention in Dubai," she says.
Harron was locked up for five days and his passport was seized so he couldn't leave the country while the case is pending. Stirling says Harron "is under immense pressure and stress." He lost his job and has so far racked up more than $39,000 in legal bills and expenses for what he calls a "cultural misunderstanding," per the Sun. His parents say their son has never been in trouble before. "We can't believe that this nightmare has gone on for three months. Jamie is a good boy," says dad Graham Harron. The legal troubles have left the family finances in shambles, and mom Patricia Harron desperate with worry. "There's no chance of sleep," she says. Jamie Harron says he has witnesses ready to back up his version in court. (A woman was jailed in Dubai after reporting a rape.)


text:
History of Researches on Indian Buddhism
By: Narendranath Bhattacharyya
The present work of the veteran Indologist Dr. N.N. Bhattacharyya is intended to acquaint the young researchers, teachers and students with the main trends of the studies and researches on different aspects of Indian Buddhism and also with the problems and intricacies involved therein. The results of researches covering a period of no less than 150 years (1825-1975) have been so outlined as to convey to the readers a complete and coherent idea of what has been done and what remains to be done in different branches of Buddhalogical studies. The special merit of this work lies not in the vast bibliographical materials collected in it, but in the author's consistent and lucid interpretation of the views of eminent Buddhalogists and different schools of Buddhist studies on vital questions connected with the understanding of the subject. Like other works of Dr. Bhattacharyya the present one is also expected to evoke much interest among the readers. Printed Pages: 248.
Title: History of Researches on Indian Buddhism
Author Name: Narendranath Bhattacharyya
Categories: India, Buddhism and Buddhist Studies,
Publisher: New Delhi, India, Munshiram Manoharlal Publishers Pvt. Ltd.: 1981
Size: 14 Cms x 23 Cms
Keywords: Indian Buddhism Buddhist Buddha
Pancatantra: Recent Researches In Indian Archaeology: Dr Channabasappa S.Patil Commemoration Volume: Set of 2 Vols.
By: K.M.Suresh, C.T.M.Kotraiah and S.Y.Somashekhar (eds.)
Recent Researches in Buddhist Studies :Festschrift in Honour of Pr. A.K. Chatterjee
By: C.D> Sebastian (ed.)
Recent Researches in Geology: Volume 3
By: V.J. Gupta (co-Ordinating editor)
Origin and Nature of Ancient Indian Buddhism
By: K.T.S. Sarao
A History of Indian Buddhism
By: S.R. Goyal
Recent Researches in Indian Art and Iconography
By: Bhagwant Sahai (Chief Editor)
Indian Buddhism after the Buddha
A History of Zen Buddhism
By: Heinrich Dumoulin, S.J.
History of Indian Buddhism
By: T.W. Rhys Davids
Progress of Historical Researches in Bihar: 1912-1985
By: B.P. Sinha
Researches in Indian and Buddhist Philosophy: Essays in Honour of Professor Alex Wayman
By: Ram Karan Sharma (ed.)


Veritas Academy of Tucson exists to assist parents in their role of training children in the way they should go, raising them to love and glorify God, and to love others by: 1. Helping to preserve and strengthen the God-ordained family relationship. 2. Teaching children to think critically and creatively via the classical education model. 3. Offering students the opportunity to achieve a high degree of academic excellence through the University-Model® of education.
Thanks to sponsors: TUCSONTOPIA, Oracle Capital, ACSTO, Southern Arizona Endodontics, HomeLink Professional Realty Network, Skyline Pediatrics, Leber Orthodontics, and Mohr Smiles Dentistry!


Auburn Hills, Mich. (June 22, 2017) - DESTACO, the industrys leading global provider of high-performance automation, workholding and containment solutions, recently received "Tooling Components Vendor of the Year" honors from MSC Industrial Supply Co., a premier distributor of Metalworking and Maintenance, Repair and Operations products and services to industrial customers throughout North America.
The award recognizes DESTACO for excellence in sales performance, profitability, product innovation, marketing, field support, operational performance and outstanding customer service in 2016. DESTACO is the inaugural winner of MSCs Vendor of the Year award in the tooling components category as a supplier of manual and pneumatic clamps.
"MSC works hard to bring deep expertise and insight to help our manufacturing customers keep their operations up and running and improve their efficiency and performance. Our supplier partners play a critical role in bringing value to customers in this way," said Ryan Esposito, Vice President-Metalworking Product Management for MSC. "The DESTACO team did an outstanding job of bringing economic value to our customers in 2016 and we are pleased to recognize their efforts with our Vendor of the Year award in the tooling components category."
"Collaboration is the key component to the success we saw with MSC," said Stefan Eggers, DESTACOs Vice President of Global Sales and Service. "In pairing our entire team with MSCs tooling components team, we were able to work proactively and provide additional value with faster service, special product needs and local assistance, which enabled us to overcome customer support challenges quickly and effectively."
DESTACO offers the industrys most comprehensive workholding product line across the globe. Committed to customer success, DESTACOs technical experts anticipate evolving markets to create custom solutions that overcome individual challenges for a wide range of applications. For more information on DESTACOs customized solutions, visit destaco.com.
DESTACO, a Dover company, is a global leader in the design and manufacture of high-performance automation, workholding and remote-handling solutions. The company serves customers in a variety of end-markets, including the automotive, life sciences, consumer goods, packaging, aerospace and nuclear sectors.
Built on a legacy of more than 100 years, DESTACO offers a comprehensive portfolio of products designed to engineer precise movement, placement and control solutions that drive productivity and uptime for manufacturers around the world. The DESTACO family of products consists of industry-leading brands such as DESTACO Manual and Power Clamps, End Effectors, CAMCO™ and Ferguson™ Indexers, Robohand™ Grippers and CRL™ Manipulators and Transfer Ports.
DESTACO is based in Auburn Hills, MI, and operates globally through approximately 800 employees across 13 locations.
The Dover Corporation is a diversified global manufacturer with annual revenues of $7 billion. The company delivers innovative equipment and components, specialty systems and support services through four major operating segments: Energy, Engineered Systems, Fluids, and Refrigeration & Food Equipment. Headquartered in Downers Grove, IL, Dover trades on the New York Stock Exchange under "DOV."


Mushrooms as meat. We're always into it! When we're not pressing or foraging, we're checking out what other bloggers are doing with them. Here are some of our favorite #freefromanimals creations we're loving and that are perfect for fall. The only thing that's being killed here are shrooms, shrooms and more shrooms!
Victoria over at My Perfect Greens stuffed this ravioli with wild mushrooms and walnuts to create this hearty dish. And they are gluten free!
Thomas over at Full of Plants sauteed, sauced and simmered these shrooms and stuffed them into tacos! Check out his post for the wicked gorgeous finished dish.
We're obsessed with these wicked amazing dumplings by Connie over at Girl Meets Radish. Check out her post to see what she stuffed them with!
Last but not least is this creamy mushroom risotto by Alissa over at Connoisseurus Veg. Risotto is so easy and Alissa shows how it's done!
Now we're starving! Embrace the spring and all of the wicked awesome food that comes with it!


text:
6.23.2017 Day in History
June 23, 2017 Daily Links
Today is International Widow's Day and United Nations Public Service Day, as well as a moment for traditional Midsummer's celebration day in multiple traditions, and a Day of Remembrance for Victims of Terrorism in Canada; in the vast chaos of China's hegemony on much of human culture a thousand seven hundred eighty-eight years ago, a learned and clever young man of power in the Central Yangtze River region, Sun Quan, successfully declared himself as Emperor of the Eastern Wu, a suzerainty that would last well over twenty years; in Japan just slightly more than ninety-six decades later, in 1180, the opening of the Samurai conflict that would 'militarize' imperial rule, the Genpei War, unfolded; exactly a century hence, in 1280, the Granadian Emirate for a time forestalled further advances in the Spanish Reconquista with its victory at the Battle of Moclin; on his fourth voyage to what is now Canada, Henry Hudson faced a fiercely mutinous crew on this day four hundred six years before the here and now, which resulted in his son and seven loyal shipmates' accompanying him aboard an open boat, adrift in what is now the frozen waters of Hudson Bay, where they all disappeared without a discernible trace; seventy-two years subsequently, in 1683, a thousand miles South in the British colonies, leader of Pennsylvania William Penn signed a friendship treaty with the Lenni Lenape Indians of that realm; three decades henceforth on the dot, in 1713, back in Canada French
CC BY-NC by romaryka
Nova Scotians, who called themselves Acadians—hence the moniker, a Cajun—received a year's notice to swear allegiance to England or abscond with themselves to other parts of the wide world; forty-four year afterward, in 1757, during one of the first worldwide capitalist meltdowns that led to planetary military conflict, a relatively small force of British troops routed a much larger Indian force at the Battle of Plassey; two hundred twenty-three years back, Russia's Second Queen Catherine deigned to permit Jewish residents to settle in Kiev; eighteen years subsequently, in 1812, Britain sought to forestall war with the United States by equalizing trade relations; two dozen years after that point, in 1836, the political economist James Mill, whose 'accomplishments' included a history of India that scoffed at the notion of a Subcontinental civilization, drew a final breath; twelve years beyond that conjunction, in 1848, across the English Channel in yet another upheaval between aristocratic righteousness and new ways of doing business, the June Days uprising unfolded in Paris; an additional twelve years hence, in 1860, across the Atlantic in Washington, the United States established the Government Printing Office;eight years later, in 1868, a patent issued in the United States for a workable type-writer; just shy of two decades later still, in 1887, Canada's Rocky Mountains Park Act created the country's first National Park in the Banff area; seven more years closer to now, in 1894, the Kinsey family welcomed a boy who would become the renowned sexologist, Alfred Kinsey, and across the Atlantic, the International Olympic Committee takes its modern form in Paris; sixteen additional years along time's arc, also in France in 1910, the male infant uttered a firs cry who would grow up as the surrealist playwright Jean Anouilh; seven hundred thirty-one days more along time's arc, in 1912, another baby boy joined his mother and father, the Turings, on his way to life as the math and computer
CC BY-ND by avaragado
wizard, Alan Turing; a year thereafter, in 1913, in a prelude to World War, the Greeks defeated the Bulgarians in actions that occurred during the Second Balkan War; three hundred sixty-five days more in the direction of today, in 1914, Mexican leader Pancho Villa's forces successfully took control of the Zacatecas region from the oversight of coup-master and assassin Victoriano Huerta; twelve years afterward, in 1926, the College Board administered the first Scholastic Aptitude Test; three years on the dot after that, in 1929, a baby girl came bouncing into the Carter Family midst whose destiny was to sing and write as June Carter until she married Johnny Cash; nine years down the pike from there, in 1938, the U.S. formed its Civil Aeronautics Authority; two years yet later on, in 1940, Adolf Hitler began his victory tour of the captured city of Paris; seven thousand miles West the next year, in 1941, a male infant gave an initial look about en route to his iconic life as the lyricist and rocker of the Grateful Dead, Robert Hunter; a mere year more on time's forward march, in 1942, a vile event unfolds on a train from France to Auschwitz, with the first 'selection' of victims for the gas chamber at the death camp; an additional three hundred sixty-five days beyond that, in 1943, in a much more hopeful eventuality, a baby boy was born who would mature as 'father-of-the-Internet,' and leader of the Defense Advance Research Projects Agency, Vincent Cerf; three years exactly after that point, in 1946, one upshot of World War Two manifested itself as the victory of the National Democratic Front in Indian elections; three hundred sixty five days later precisely, in 1947, around the world in the United States Senate joined the House of Representatives in helping to crush the U.S. Labor movement with a divide-and-conquer Southern strategy by upholding Truman's veto of the Taft- Hartley Act; four years afterward, in 1951, a baby boy entered the world who would grow up as Angelo Falcón and found what would become the Latin American Policy Institute; half a decade subsequent to that passage, in 1956, France's National Assembly enabled the protocols that would begin an erstwhile 'French Commonwealth' and neocolonial enclave in West Africa; three years yet later still, in 1959, convicted Manhattan Project spy and traitor Klaus Fuchs got off much easier than the Rosenbergs when he left prison after 9
CC BY-NC by washington_area_spark
years to emigrate to East Germany and continue his scientific career; a year after that point, in 1960, the first oral contraceptive came onto the market; a year farther along the temporal arc, in 1961, the world's 'powers' agreed that Antarctica would never be a site of military presence and instead would serve as a 'laboratory for humanity;' half a dozen years onward toward today, in 1967, Lyndon Johnson and Soviet Foreign Minister Alexei Kosygin met in New Jersey to seek some semblance of rapprochement and real politick over such matters as Vietnam and the Six Day Way; two years even closer to the current context, in 1969, International Business Machines announced that it would thereafter sell computer units and operational programs separately, thereby initiating the modern software industry; another thousand ninety-six days down the road, in 1972, Richard Nixon could've used some contraceptive advice when he elected to record his plans with his Chief of Staff to obstruct the FBI investigation into the Watergate break-in, and the Civil Rights Act's ninth Title first started its prohibition of academic sexual discrimination; five years afterward, in 1977, the Occupational Safety and Health Administration finally promulgated standards in regard to cotton dust that might at least make less likely Byssinosis—or Brown Lung Disease—among some 600,000 workers at risk; half a decade further down the road, in 1982, in Metropolitan Detroit, Vincent Chin succumbed to injuries that he received when two unemployed autoworkers, mistaking him for Japanese, beat him mercilessly in an unprovoked attack; five years past that instant, in 1987, a vastly more potent engagement with the class war against workers took place with the initial deployment of thousands of Jobs With Justice members on the picket lines of an Eastern Airlines strike action in Miami; a decade still more proximate to the present pass, in 1997, Betty Shabazz, who had married and born six daughters with Malcolm X, drew her final breath; just two years henceforth, in 1999, the majority of five thousand mill workers in Kannapolis, North Carolina, at last had the chance to affirm their intention to form a union; fifteen years thereafter, in 2014, the final batch of Syria's acknowledged chemical weapons shipped out to designated facilities for destruction.
Previous Post6.22.2017 Daily LinksNext Post6.23.2017 Doc of the Day


text:
import sys

import gdspy
import numpy as np

import phidl
from phidl.device_layout import (
    CellArray,
    Device,
    DeviceReference,
    Layer,
    Path,
    Polygon,
    _rotate_points,
)

_SUBPORT_RGB = (0, 120, 120)
_PORT_RGB = (190, 0, 0)

try:
    from PyQt5 import QtCore, QtGui
    from PyQt5.QtCore import (
        QCoreApplication,
        QLineF,
        QPoint,
        QPointF,
        QRect,
        QRectF,
        QSize,
        QSizeF,
        Qt,
    )
    from PyQt5.QtGui import QColor, QPen, QPolygonF
    from PyQt5.QtWidgets import (
        QApplication,
        QGraphicsItem,
        QGraphicsScene,
        QGraphicsView,
        QLabel,
        QMainWindow,
        QMessageBox,
        QRubberBand,
    )

    PORT_COLOR = QColor(*_PORT_RGB)
    SUBPORT_COLOR = QColor(*_SUBPORT_RGB)
    OUTLINE_PEN = QColor(200, 200, 200)
    qt_imported = True
except ImportError:
    QMainWindow = object
    QGraphicsView = object
    qt_imported = False

_quickplot_options = dict(
    show_ports=True,
    show_subports=True,
    label_aliases=False,
    new_window=False,
    blocking=False,
    zoom_factor=1.4,
    interactive_zoom=None,
)

def _zoom_factory(axis, scale_factor=1.4):
    """returns zooming functionality to axis.
    From https://gist.github.com/tacaswell/3144287"""

    def zoom_fun(event, ax, scale):
        """zoom when scrolling"""
        if event.inaxes == axis:
            scale_factor = np.power(scale, -event.step)
            xdata = event.xdata
            ydata = event.ydata
            x_left = xdata - ax.get_xlim()[0]
            x_right = ax.get_xlim()[1] - xdata
            y_top = ydata - ax.get_ylim()[0]
            y_bottom = ax.get_ylim()[1] - ydata

            ax.set_xlim([xdata - x_left * scale_factor, xdata + x_right * scale_factor])
            ax.set_ylim([ydata - y_top * scale_factor, ydata + y_bottom * scale_factor])
            ax.figure.canvas.draw()
            # Update toolbar so back/forward buttons work
            fig.canvas.toolbar.push_current()

    fig = axis.get_figure()
    fig.canvas.mpl_connect(
        "scroll_event", lambda event: zoom_fun(event, axis, scale_factor)
    )

_qp_objects = {}

def _rectangle_selector_factory(fig, ax):
    from matplotlib.widgets import RectangleSelector

    def line_select_callback(eclick, erelease):
        x1, y1 = eclick.xdata, eclick.ydata
        x2, y2 = erelease.xdata, erelease.ydata
        left = min(x1, x2)
        right = max(x1, x2)
        bottom = min(y1, y2)
        top = max(y1, y2)
        ax.set_xlim([left, right])
        ax.set_ylim([bottom, top])
        ax.figure.canvas.draw()
        # Update toolbar so back/forward buttons work
        fig.canvas.toolbar.push_current()

    rs = RectangleSelector(
        ax,
        line_select_callback,
        drawtype="box",
        useblit=True,
        button=[1, 3],
        minspanx=5,
        minspany=5,
        spancoords="pixels",
        interactive=False,
    )
    return rs

def set_quickplot_options(
    show_ports=None,
    show_subports=None,
    label_aliases=None,
    new_window=None,
    blocking=None,
    zoom_factor=None,
    interactive_zoom=None,
):
    """Sets plotting options for quickplot()

    Parameters
    ----------
    show_ports : bool
        Sets whether ports are drawn
    show_subports : bool
        Sets whether subports (ports that belong to references) are drawn
    label_aliases : bool
        Sets whether aliases are labeled with a text name
    new_window : bool
        If True, each call to quickplot() will generate a separate window
    blocking : bool
        If True, calling quickplot() will pause execution of ("block") the
        remainder of the python code until the quickplot() window is closed.  If
        False, the window will be opened and code will continue to run.
    zoom_factor : float
        Sets the scaling factor when zooming the quickplot window with the
        mousewheel/trackpad
    interactive_zoom : bool
        Enables/disables the ability to use mousewheel/trackpad to zoom
    """
    if show_ports is not None:
        _quickplot_options["show_ports"] = show_ports
    if show_subports is not None:
        _quickplot_options["show_subports"] = show_subports
    if label_aliases is not None:
        _quickplot_options["label_aliases"] = label_aliases
    if new_window is not None:
        _quickplot_options["new_window"] = new_window
    if blocking is not None:
        _quickplot_options["blocking"] = blocking
    if zoom_factor is not None:
        _quickplot_options["zoom_factor"] = zoom_factor
    if interactive_zoom is not None:
        _quickplot_options["interactive_zoom"] = interactive_zoom

def quickplot(items):  # noqa: C901
    """Takes a list of devices/references/polygons or single one of those, and
    plots them. Use `set_quickplot_options()` to modify the viewer behavior
    (e.g. displaying ports, creating new windows, etc)

    Parameters
    ----------
    items : PHIDL object or list of PHIDL objects
        The item(s) which are to be plotted

    Examples
    --------
    >>> R = pg.rectangle()
    >>> quickplot(R)

    >>> R = pg.rectangle()
    >>> E = pg.ellipse()
    >>> quickplot([R, E])
    """

    try:
        from matplotlib import pyplot as plt

        matplotlib_imported = True
    except ImportError:
        matplotlib_imported = False

    # Override default options with _quickplot_options
    show_ports = _quickplot_options["show_ports"]
    show_subports = _quickplot_options["show_subports"]
    label_aliases = _quickplot_options["label_aliases"]
    new_window = _quickplot_options["new_window"]
    blocking = _quickplot_options["blocking"]

    if not matplotlib_imported:
        raise ImportError(
            "PHIDL tried to import matplotlib but it failed. PHIDL "
            + "will still work but quickplot() will not"
        )

    if new_window:
        fig, ax = plt.subplots(1)
        ax.autoscale(enable=True, tight=True)
    else:
        if plt.fignum_exists(num="PHIDL quickplot"):
            fig = plt.figure("PHIDL quickplot")
            plt.clf()  # Erase figure so toolbar at top works correctly
            ax = fig.add_subplot(111)
        else:
            fig, ax = plt.subplots(num="PHIDL quickplot")

    ax.axis("equal")
    ax.grid(True, which="both", alpha=0.4)
    ax.axhline(y=0, color="k", alpha=0.2, linewidth=1)
    ax.axvline(x=0, color="k", alpha=0.2, linewidth=1)
    bbox = None

    # Iterate through each each Device/DeviceReference/Polygon
    if not isinstance(items, list):
        items = [items]
    for item in items:
        if isinstance(item, (Device, DeviceReference, CellArray)):
            polygons_spec = item.get_polygons(by_spec=True, depth=None)
            for key in sorted(polygons_spec):
                polygons = polygons_spec[key]
                layerprop = _get_layerprop(layer=key[0], datatype=key[1])
                new_bbox = _draw_polygons(
                    polygons,
                    ax,
                    facecolor=layerprop["color"],
                    edgecolor="k",
                    alpha=layerprop["alpha"],
                )
                bbox = _update_bbox(bbox, new_bbox)
            # If item is a Device or DeviceReference, draw ports
            if isinstance(item, (Device, DeviceReference)) and show_ports is True:
                for name, port in item.ports.items():
                    if (port.width is None) or (port.width == 0):
                        new_bbox = _draw_port_as_point(ax, port)
                    else:
                        new_bbox = _draw_port(ax, port, is_subport=False, color="r")
                    bbox = _update_bbox(bbox, new_bbox)
            if isinstance(item, Device) and show_subports is True:
                for sd in item.references:
                    if not isinstance(sd, (gdspy.CellArray)):
                        for name, port in sd.ports.items():
                            new_bbox = _draw_port(
                                ax,
                                port,
                                is_subport=True,
                                color=np.array(_SUBPORT_RGB) / 255,
                            )
                            bbox = _update_bbox(bbox, new_bbox)
            if isinstance(item, Device) and label_aliases is True:
                for name, ref in item.aliases.items():
                    ax.text(
                        ref.x,
                        ref.y,
                        str(name),
                        style="italic",
                        color="blue",
                        weight="bold",
                        size="large",
                        ha="center",
                        fontsize=14,
                    )
        elif isinstance(item, Polygon):
            polygons = item.polygons
            layerprop = _get_layerprop(item.layers[0], item.datatypes[0])
            new_bbox = _draw_polygons(
                polygons,
                ax,
                facecolor=layerprop["color"],
                edgecolor="k",
                alpha=layerprop["alpha"],
            )
            bbox = _update_bbox(bbox, new_bbox)
        elif isinstance(item, Path):
            points = item.points
            new_bbox = _draw_line(
                x=points[:, 0],
                y=points[:, 1],
                ax=ax,
                linestyle="--",
                linewidth=2,
                color="b",
            )
            bbox = _update_bbox(bbox, new_bbox)

    if bbox is None:
        bbox = [-1, -1, 1, 1]
    xmargin = (bbox[2] - bbox[0]) * 0.1 + 1e-9
    ymargin = (bbox[3] - bbox[1]) * 0.1 + 1e-9
    ax.set_xlim([bbox[0] - xmargin, bbox[2] + xmargin])
    ax.set_ylim([bbox[1] - ymargin, bbox[3] + ymargin])

    # When using inline Jupyter notebooks, this may fail so allow it to fail gracefully
    try:
        if _use_interactive_zoom():
            _zoom_factory(ax, scale_factor=_quickplot_options["zoom_factor"])
        # Need to hang on to RectangleSelector so it doesn't get garbage collected
        _qp_objects["rectangle_selector"] = _rectangle_selector_factory(fig, ax)
        # Update matplotlib toolbar so the Home button works
        fig.canvas.toolbar.update()
        fig.canvas.toolbar.push_current()
    except Exception:
        pass

    plt.draw()
    plt.show(block=blocking)

def _use_interactive_zoom():
    """Checks whether the current matplotlib backend is compatible with
    interactive zoom"""
    import matplotlib

    if _quickplot_options["interactive_zoom"] is not None:
        return _quickplot_options["interactive_zoom"]
    forbidden_backends = ["nbagg"]
    backend = matplotlib.get_backend().lower()
    usable = not any([(fb.lower() in backend) for fb in forbidden_backends])
    return usable

def _update_bbox(bbox, new_bbox):
    if bbox is None:
        return new_bbox
    if new_bbox[0] < bbox[0]:
        bbox[0] = new_bbox[0]  # xmin
    if new_bbox[1] < bbox[1]:
        bbox[1] = new_bbox[1]  # ymin
    if new_bbox[2] > bbox[2]:
        bbox[2] = new_bbox[2]  # xmin
    if new_bbox[3] > bbox[3]:
        bbox[3] = new_bbox[3]  # ymin
    return bbox

def _get_layerprop(layer, datatype):
    # Colors generated from here: http://phrogz.net/css/distinct-colors.html
    layer_colors = [
        "#3dcc5c",
        "#2b0fff",
        "#cc3d3d",
        "#e5dd45",
        "#7b3dcc",
        "#cc860c",
        "#73ff0f",
        "#2dccb4",
        "#ff0fa3",
        "#0ec2e6",
        "#3d87cc",
        "#e5520e",
    ]

    _layer = Layer.layer_dict.get((layer, datatype))
    if _layer is not None:
        color = _layer.color
        alpha = _layer.alpha
        if color is None:
            color = layer_colors[np.mod(layer, len(layer_colors))]
    else:
        color = layer_colors[np.mod(layer, len(layer_colors))]
        alpha = 0.6
    return {"color": color, "alpha": alpha}

def _draw_polygons(polygons, ax, **kwargs):
    from matplotlib.collections import PolyCollection

    coll = PolyCollection(polygons, **kwargs)
    ax.add_collection(coll)
    stacked_polygons = np.vstack(polygons)
    xmin, ymin = np.min(stacked_polygons, axis=0)
    xmax, ymax = np.max(stacked_polygons, axis=0)
    bbox = [xmin, ymin, xmax, ymax]
    return bbox

def _draw_line(x, y, ax, **kwargs):
    from matplotlib.lines import Line2D

    line = Line2D(x, y, **kwargs)
    ax.add_line(line)
    xmin, ymin = np.min(x), np.min(y)
    xmax, ymax = np.max(x), np.max(y)
    bbox = [xmin, ymin, xmax, ymax]
    return bbox

def _port_marker(port, is_subport):
    if is_subport:
        arrow_scale = 0.75
        rad = (port.orientation + 45) * np.pi / 180
        pm = +1
    else:
        arrow_scale = 1
        rad = (port.orientation - 45) * np.pi / 180
        pm = -1
    arrow_points = (
        np.array([[0, 0], [10, 0], [6, pm * 4], [6, pm * 2], [0, pm * 2]])
        / 35
        * port.width
        * arrow_scale
    )
    arrow_points += port.midpoint
    arrow_points = _rotate_points(
        arrow_points, angle=port.orientation, center=port.center
    )
    text_pos = np.array([np.cos(rad), np.sin(rad)]) * port.width / 3 + port.center
    return arrow_points, text_pos

def _draw_port(ax, port, is_subport, color):
    xbound, ybound = np.column_stack(port.endpoints)
    # plt.plot(x, y, 'rp', markersize = 12) # Draw port midpoint
    arrow_points, text_pos = _port_marker(port, is_subport)
    xmin, ymin = np.min(np.vstack([arrow_points, port.endpoints]), axis=0)
    xmax, ymax = np.max(np.vstack([arrow_points, port.endpoints]), axis=0)
    ax.plot(xbound, ybound, alpha=0.5, linewidth=3, color=color)  # Draw port edge
    ax.plot(
        arrow_points[:, 0], arrow_points[:, 1], alpha=0.8, linewidth=2, color=color
    )  # Draw port edge
    ax.text(
        text_pos[0],
        text_pos[1],
        port.name,
        horizontalalignment="center",
        verticalalignment="center",
        fontsize=14,
        color=color,
    )
    bbox = [xmin, ymin, xmax, ymax]
    return bbox

def _draw_port_as_point(ax, port, **kwargs):
    from matplotlib import pyplot as plt

    x = port.midpoint[0]
    y = port.midpoint[1]
    plt.plot(x, y, "r+", alpha=0.5, markersize=15, markeredgewidth=2)  # Draw port edge
    bbox = [
        x - port.width / 2,
        y - port.width / 2,
        x + port.width / 2,
        y + port.width / 2,
    ]
    ax.text(port.midpoint[0], port.midpoint[1], port.name, fontsize=14)
    return bbox

class ViewerWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setGeometry(QRect(100, 100, 800, 600))
        self.setWindowTitle("PHIDL quickplot")

        # Create "grid size = 40.0" label
        self.gridsize_label = QLabel("ABCDEF", self)
        self.gridsize_label.setFont(QtGui.QFont("SansSerif", 10))
        self.gridsize_label.move(0, 200)
        self.gridsize_label.setAlignment(Qt.AlignLeft)
        self.gridsize_label.setStyleSheet("color: gray")
        self.gridsize_label.setFixedWidth(120)
        self.gridsize_label.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)

        # Create "X=40.001, Y = 70.183" label
        self.position_label = QLabel("ABCDEF", self)
        self.position_label.setFont(QtGui.QFont("SansSerif", 10))
        self.position_label.move(50, 200)
        self.position_label.setAlignment(Qt.AlignRight)
        self.position_label.setStyleSheet("color: gray")
        self.position_label.setFixedWidth(240)
        self.position_label.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)

        # Create "Press ? for help" label
        self.help_label = QLabel("ABCDEF", self)
        self.help_label.setFont(QtGui.QFont("SansSerif", 10))
        self.help_label.move(50, 200)
        self.help_label.setAlignment(Qt.AlignCenter)
        self.help_label.setStyleSheet("color: gray")
        self.help_label.setFixedWidth(200)
        self.help_label.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)

        # Create label useful for debugging
        self.debug_label = QLabel("", self)
        self.debug_label.setFont(QtGui.QFont("SansSerif", 10))
        self.debug_label.move(200, 200)
        self.debug_label.setAlignment(Qt.AlignCenter)
        self.debug_label.setStyleSheet("color: gray")
        self.debug_label.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)

        # Create QGraphicsView
        self.viewer = Viewer(
            gridsize_label=self.gridsize_label,
            position_label=self.position_label,
            help_label=self.help_label,
        )
        self.setCentralWidget(self.viewer)

        # Reorder widgets
        self.gridsize_label.raise_()
        self.position_label.raise_()
        self.debug_label.raise_()
        self.help_label.raise_()
        self.show()

class Viewer(QGraphicsView):
    def __init__(self, gridsize_label, position_label, help_label):
        QGraphicsView.__init__(self)

        self.gridsize_label = gridsize_label
        self.position_label = position_label
        self.help_label = help_label

        # Create a QGraphicsScene which this view looks at
        self.scene = QGraphicsScene(self)
        self.scene.setSceneRect(QRectF())
        self.setScene(self.scene)

        # Customize QGraphicsView
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setInteractive(False)
        self.scale(1, -1)  # Flips around the Y axis
        # Use OpenGL http://ralsina.me/stories/BBS53.html
        #        self.setViewport(QtOpenGL.QGLWidget())
        self.rubberBand = QRubberBand(QRubberBand.Rectangle, self)
        self.pen = QPen(QtCore.Qt.black, 0)
        self.portpen = QPen(PORT_COLOR, 3)
        self.portpen.setCosmetic(True)  # Makes constant width
        self.portfont = QtGui.QFont("Arial", pointSize=14)
        self.portfontcolor = PORT_COLOR
        self.subportpen = QPen(SUBPORT_COLOR, 3)
        self.subportpen.setCosmetic(True)  # Makes constant width
        self.subportfont = QtGui.QFont("Arial", pointSize=14)
        self.subportfontcolor = SUBPORT_COLOR

        # Tracking ports

        # Various status variables
        self._mousePressed = None
        self._rb_origin = QPoint()
        self.zoom_factor_total = 1

        # Grid variables
        self.gridpen = QPen(QtCore.Qt.black, 0)
        self.gridpen.setStyle(QtCore.Qt.DotLine)
        self.gridpen.setDashPattern([1, 4])
        self.gridpen.setColor(QtGui.QColor(0, 0, 0, 125))
        #        self.gridpen = QPen(QtCore.Qt.black, 1)
        #        self.gridpen.setCosmetic(True) # Makes constant width
        self.scene_polys = []

        self.initialize()

    def add_polygons(self, polygons, color="#A8F22A", alpha=1):
        qcolor = QColor()
        qcolor.setNamedColor(color)
        qcolor.setAlphaF(alpha)
        for points in polygons:
            qpoly = QPolygonF([QPointF(p[0], p[1]) for p in points])
            scene_poly = self.scene.addPolygon(qpoly)
            scene_poly.setBrush(qcolor)
            scene_poly.setPen(self.pen)
            self.scene_polys.append(scene_poly)
            # Update custom bounding box
            sr = scene_poly.sceneBoundingRect()
            if len(self.scene_polys) == 1:
                self.scene_xmin = sr.left()
                self.scene_xmax = sr.right()
                self.scene_ymin = sr.top()
                self.scene_ymax = sr.bottom()
            else:
                self.scene_xmin = min(self.scene_xmin, sr.left())
                self.scene_xmax = max(self.scene_xmax, sr.right())
                self.scene_ymin = min(self.scene_ymin, sr.top())
                self.scene_ymax = max(self.scene_ymax, sr.bottom())

    def reset_view(self):
        # The SceneRect controls how far you can pan, make it larger than
        # just the bounding box so middle-click panning works
        panning_rect = QRectF(self.scene_bounding_rect)
        panning_rect_center = panning_rect.center()
        panning_rect_size = max(panning_rect.width(), panning_rect.height()) * 3
        panning_rect.setSize(QSizeF(panning_rect_size, panning_rect_size))
        panning_rect.moveCenter(panning_rect_center)
        self.setSceneRect(panning_rect)
        self.fitInView(self.scene_bounding_rect, Qt.KeepAspectRatio)
        self.zoom_view(0.8)

        self.update_grid()

    def add_port(self, port, is_subport=False):
        if (port.width is None) or (port.width == 0):
            x, y = port.midpoint
            cs = 1  # cross size
            pn = QPointF(x, y + cs)
            ps = QPointF(x, y - cs)
            pe = QPointF(x + cs, y)
            pw = QPointF(x - cs, y)
            qline1 = self.scene.addLine(QLineF(pn, ps))
            qline2 = self.scene.addLine(QLineF(pw, pe))
            port_shapes = [qline1, qline2]
        else:
            point1, point2 = port.endpoints
            point1 = QPointF(point1[0], point1[1])
            point2 = QPointF(point2[0], point2[1])
            qline = self.scene.addLine(QLineF(point1, point2))
            arrow_points, text_pos = _port_marker(port, is_subport)
            arrow_qpoly = QPolygonF([QPointF(p[0], p[1]) for p in arrow_points])
            port_scene_poly = self.scene.addPolygon(arrow_qpoly)
            # port_scene_poly.setRotation(port.orientation)
            # port_scene_poly.moveBy(port.midpoint[0], port.midpoint[1])
            port_shapes = [qline, port_scene_poly]
        qtext = self.scene.addText(str(port.name), self.portfont)
        qtext.setPos(QPointF(text_pos[0], text_pos[1]))
        qtext.setFlag(QGraphicsItem.ItemIgnoresTransformations)
        port_items = port_shapes + [qtext]

        if not is_subport:
            [shape.setPen(self.portpen) for shape in port_shapes]
            qtext.setDefaultTextColor(self.portfontcolor)
            self.portitems += port_items
        else:
            [shape.setPen(self.subportpen) for shape in port_shapes]
            qtext.setDefaultTextColor(self.subportfontcolor)
            self.subportitems += port_items

    #        self.portlabels.append(qtext)

    def add_aliases(self, aliases):
        for name, ref in aliases.items():
            qtext = self.scene.addText(str(name), self.portfont)
            x, y = ref.center
            qtext.setPos(QPointF(x, y))
            qtext.setFlag(QGraphicsItem.ItemIgnoresTransformations)
            self.aliasitems += [qtext]

    def set_port_visibility(self, visible=True):
        for item in self.portitems:
            item.setVisible(visible)
        self.ports_visible = visible

    def set_subport_visibility(self, visible=True):
        for item in self.subportitems:
            item.setVisible(visible)
        self.subports_visible = visible

    def set_alias_visibility(self, visible=True):
        for item in self.aliasitems:
            item.setVisible(visible)
        self.aliases_visible = visible

    def initialize(self):
        self.scene.clear()
        self.polygons = {}
        self.portitems = []
        self.subportitems = []
        self.aliasitems = []
        self.aliases_visible = True
        self.ports_visible = True
        self.subports_visible = True
        self.mouse_position = [0, 0]
        self.grid_size_snapped = 0
        self.setMouseTracking(True)
        self.scene_bounding_rect = None
        self.scene_polys = []
        self.scene_xmin = 0
        self.scene_xmax = 1
        self.scene_ymin = 0
        self.scene_ymax = 1

    def finalize(self):
        self.scene_bounding_rect = QRectF(
            QPointF(self.scene_xmin, self.scene_ymin),
            QPointF(self.scene_xmax, self.scene_ymax),
        )
        # self.scene_center = [self.scene_bounding_rect.center().x(), self.scene_bounding_rect.center().y()]
        self.scene_size = [
            self.scene_bounding_rect.width(),
            self.scene_bounding_rect.height(),
        ]
        self.create_grid()
        self.update_grid()

    # ==============================================================================
    #   Grid creation
    # ==============================================================================
    def update_grid(self):
        grid_pixels = 50
        grid_snaps = [1, 2, 4]

        # Number of pixels in the viewer
        view_width, _ = self.rect().width(), self.rect().height()
        # Rectangle of viewport in terms of scene coordinates
        r = self.mapToScene(self.rect()).boundingRect()
        width, height = r.width(), r.height()
        xmin, ymin, _, _ = r.x(), r.y(), r.x() + width, r.y() + height

        grid_size = grid_pixels * (width / view_width)
        exponent = np.floor(np.log10(grid_size))
        digits = round(grid_size / 10 ** (exponent), 2)
        digits_snapped = min(grid_snaps, key=lambda x: abs(x - digits))
        grid_size_snapped = digits_snapped * 10 ** (exponent)

        # Starting coordinates for gridlines
        x = round((xmin - 2 * width) / grid_size_snapped) * grid_size_snapped
        y = round((ymin - 2 * height) / grid_size_snapped) * grid_size_snapped

        for gl in self.gridlinesx:
            gl.setLine(x, -1e10, x, 1e10)
            x += grid_size_snapped
        for gl in self.gridlinesy:
            gl.setLine(-1e10, y, 1e10, y)
            y += grid_size_snapped
        self.grid_size_snapped = grid_size_snapped
        self.update_gridsize_label()

    def update_gridsize_label(self):
        self.gridsize_label.setText("grid size = " + str(self.grid_size_snapped))
        self.gridsize_label.move(QPoint(5, self.height() - 25))

    def update_mouse_position_label(self):
        self.position_label.setText(
            "X = {:0.4f} / Y = {:0.4f}".format(
                self.mouse_position[0], self.mouse_position[1]
            )
        )
        self.position_label.move(QPoint(self.width() - 250, self.height() - 25))

    def update_help_label(self):
        self.help_label.setText('Press "?" key for help')
        self.help_label.move(QPoint(self.width() - 175, 0))

    def create_grid(self):
        self.gridlinesx = [
            self.scene.addLine(-10, -10, 10, 10, self.gridpen) for n in range(300)
        ]
        self.gridlinesy = [
            self.scene.addLine(-10, -10, 10, 10, self.gridpen) for n in range(300)
        ]
        self.update_grid()

    # ==============================================================================
    #  Mousewheel zoom, taken from http://stackoverflow.com/a/29026916
    # ==============================================================================
    def wheelEvent(self, event):
        # Zoom Factor
        zoom_percentage = 1.4

        # Set Anchors
        self.setTransformationAnchor(QGraphicsView.NoAnchor)
        self.setResizeAnchor(QGraphicsView.NoAnchor)

        # Save the scene pos
        oldPos = self.mapToScene(event.pos())

        # Zoom
        mousewheel_rotation = (
            event.angleDelta().y()
        )  # Typically = 120 on most mousewheels
        zoom_factor = zoom_percentage ** (mousewheel_rotation / 120)
        zoom_factor = np.clip(zoom_factor, 0.5, 2.0)

        # Check to make sure we're not overzoomed
        min_width = 0.01
        min_height = 0.01

        window_width = self.rect().width()
        window_height = self.rect().height()
        scene_upper_left_corner = self.mapToScene(QPoint(0, 0))
        scene_bottom_right_corner = self.mapToScene(QPoint(window_width, window_height))
        scene_width = (scene_bottom_right_corner - scene_upper_left_corner).x()
        scene_height = (scene_upper_left_corner - scene_bottom_right_corner).y()

        max_width = self.scene_bounding_rect.width() * 3
        max_height = self.scene_bounding_rect.height() * 3

        if ((scene_width > max_width) and (scene_height > max_height)) and (
            zoom_factor < 1
        ):
            pass
        elif ((scene_width < min_width) and (scene_height < min_height)) and (
            zoom_factor > 1
        ):
            pass
        else:
            self.zoom_view(zoom_factor)

        # Get the new position and move scene to old position
        newPos = self.mapToScene(event.pos())
        delta = newPos - oldPos
        self.translate(delta.x(), delta.y())

        self.update_grid()

    def zoom_view(self, zoom_factor):
        old_center = self.mapToScene(self.rect().center())
        self.scale(zoom_factor, zoom_factor)
        self.centerOn(old_center)
        self.zoom_factor_total *= zoom_factor

    def resizeEvent(self, event):
        super(QGraphicsView, self).resizeEvent(event)
        if self.scene_bounding_rect is not None:
            self.reset_view()
        self.update_gridsize_label()
        self.update_mouse_position_label()
        self.update_help_label()

    def mousePressEvent(self, event):
        super(QGraphicsView, self).mousePressEvent(event)
        # ==============================================================================
        #  Zoom to rectangle, from
        #  https://wiki.python.org/moin/PyQt/Selecting%20a%20region%20of%20a%20widget
        # ==============================================================================
        if event.button() == Qt.RightButton:
            self._mousePressed = Qt.RightButton
            self._rb_origin = QPoint(event.pos())
            self.rubberBand.setGeometry(QRect(self._rb_origin, QSize()))
            self.rubberBand.show()
        # ==============================================================================
        # Mouse panning, taken from
        # http://stackoverflow.com/a/15043279
        # ==============================================================================
        elif event.button() == Qt.MidButton:
            self._mousePressed = Qt.MidButton
            self._mousePressedPos = event.pos()
            self.setCursor(QtCore.Qt.ClosedHandCursor)
            self._dragPos = event.pos()

    def mouseMoveEvent(self, event):
        super(QGraphicsView, self).mouseMoveEvent(event)

        # # Useful debug
        # try:
        #     self.debug_label.setText(str(itemsBoundingRect_nogrid().width()))
        # except Exception:
        #     print('Debug statement failed')

        # Update the X,Y label indicating where the mouse is on the geometry
        mouse_position = self.mapToScene(event.pos())
        self.mouse_position = [mouse_position.x(), mouse_position.y()]
        self.update_mouse_position_label()

        if not self._rb_origin.isNull() and self._mousePressed == Qt.RightButton:
            self.rubberBand.setGeometry(
                QRect(self._rb_origin, event.pos()).normalized()
            )

        # Middle-click-to-pan
        if self._mousePressed == Qt.MidButton:
            newPos = event.pos()
            diff = newPos - self._dragPos
            self._dragPos = newPos
            self.horizontalScrollBar().setValue(
                self.horizontalScrollBar().value() - diff.x()
            )
            self.verticalScrollBar().setValue(
                self.verticalScrollBar().value() - diff.y()
            )

    #            event.accept()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.RightButton:
            self.rubberBand.hide()
            rb_rect = QRect(self._rb_origin, event.pos())
            rb_center = rb_rect.center()
            rb_size = rb_rect.size()

            if abs(rb_size.width()) > 3 and abs(rb_size.height()) > 3:
                viewport_size = self.viewport().geometry().size()

                zoom_factor_x = abs(viewport_size.width() / rb_size.width())
                zoom_factor_y = abs(viewport_size.height() / rb_size.height())

                new_center = self.mapToScene(rb_center)

                zoom_factor = min(zoom_factor_x, zoom_factor_y)
                self.zoom_view(zoom_factor)
                self.centerOn(new_center)

            self.update_grid()

        if event.button() == Qt.MidButton:
            self.setCursor(Qt.ArrowCursor)
            self._mousePressed = None
            self.update_grid()

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Escape:
            self.reset_view()

        if event.key() == Qt.Key_F1:
            self.set_alias_visibility(not self.aliases_visible)

        if event.key() == Qt.Key_F2:
            self.set_port_visibility(not self.ports_visible)

        if event.key() == Qt.Key_F3:
            self.set_subport_visibility(not self.subports_visible)

        if event.key() == Qt.Key_Question:
            help_str = """
            Mouse control:
              Mousewheel: Zoom in and out
              Right-click & drag: Zoom to rectangle
              Middle-click & drag: Pan

            Keyboard shortcuts:
              Esc: Reset view
              F1: Show/hide alias names
              F2: Show/hide ports
              F3: Show/hide subports (ports in underlying references)
            """
            QMessageBox.about(self, "PHIDL Help", help_str)

def quickplot2(item_list, *args, **kwargs):
    if not qt_imported:
        raise ImportError(
            "PHIDL tried to import PyQt5 but it failed. PHIDL will"
            + "still work but quickplot2() may not.  Try using"
            + "quickplot() instead (based on matplotlib)"
        )

    global app
    if QCoreApplication.instance() is None:
        app = QApplication(sys.argv)
    if "viewer_window" not in globals():
        global viewer_window
        viewer_window = ViewerWindow()
    viewer = viewer_window.viewer
    viewer.initialize()
    if not isinstance(item_list, (list, tuple)):
        item_list = [item_list]
    for element in item_list:
        if isinstance(
            element,
            (
                phidl.device_layout.Device,
                phidl.device_layout.DeviceReference,
                gdspy.CellArray,
            ),
        ):
            # Draw polygons in the element
            polygons_spec = element.get_polygons(by_spec=True, depth=None)
            for key in sorted(polygons_spec):
                polygons = polygons_spec[key]
                layerprop = _get_layerprop(layer=key[0], datatype=key[1])
                viewer.add_polygons(
                    polygons, color=layerprop["color"], alpha=layerprop["alpha"]
                )
            # If element is a Device, draw ports and aliases
            if isinstance(element, phidl.device_layout.Device):
                for ref in element.references:
                    if not isinstance(ref, gdspy.CellArray):
                        for name, port in ref.ports.items():
                            viewer.add_port(port, is_subport=True)
                for name, port in element.ports.items():
                    viewer.add_port(port)
                    viewer.add_aliases(element.aliases)
            # If element is a DeviceReference, draw ports as subports
            if isinstance(element, phidl.device_layout.DeviceReference):
                for name, port in element.ports.items():
                    viewer.add_port(port, is_subport=True)
        elif isinstance(element, (phidl.device_layout.Polygon)):
            layerprop = _get_layerprop(
                layer=element.layers[0], datatype=element.datatypes[0]
            )
            viewer.add_polygons(
                element.polygons, color=layerprop["color"], alpha=layerprop["alpha"]
            )
    viewer.finalize()
    viewer.reset_view()
    viewer_window.setVisible(True)
    viewer_window.show()
    viewer_window.raise_()
    return viewer

redpajama_set_name: RedPajamaGithub


It's no secret I came across the Paleo way of eating completely by accident. That accident, however, totally changed my life and without it I'm sure I'd still be the 300 pound, extremely unhealthy and unhappy person I was prior. I would still be eating all the grains, having pain in my joints and increasing my jean size each year.
When I first started removing the processed foods from my daily diet, I had no idea what I was doing really. I had never truly dieted before and even at 300 pounds I knew I didn't want to start either. This blog was far from being a baby idea in my brain and I really thought soy was a health food. I came across Paleo after completing my first round of Whole30.
I felt so good, and knew I had so much work to do in the way of changing my habits (i.e. binge eating and emotional relationship with food). After all, I'd been in this cycle for years since childhood. Even from a young age I struggled with childhood obesity and emotional eating, 30 days wasn't gonna cut it. I started looking for something similar by searching things like "unprocessed natural food diet", "no calorie counting real food diet" and "whole food recipes" and realized what I was looking for had a name.
I'll say it again. I really had no idea what I was doing in the grand scheme of things. But I know whatever it was was working better for me than what I was doing previously. So I dedicated myself to learning and committing to it.
Through the months that followed I gained a lot of nutrition knowledge, lost a lot of weight and made a few mistakes along the way. Many of them helped me to learn more, understand myself better and make adjustments to my new way of eating when necessary. But, that being said, some of the mistakes are ones I (and you) could easily have avoided.
Being born to a mother who grew up when low-fat and fat-free was all the rage, I naturally inherited the same idea too. Growing up, our milk was skim, our butter wasn't real and our cookie packages had a large fat free stamp on the packaging. So when I started only eating real food it was a huge adjustment to be eating so many fats and frankly, it made me worried.
As I started to realize that I'm eating a ton of food each day and getting hungrier than I should, I started to add in more healthy fats. I added half an avocado to my breakfasts, dressed my salads in healthy oils, opted for nuts or the other half of the avocado later in the day and stopped being so concerned with only using minimal amounts of animal fats, ghee or oil when cooking my meals.
Healthy Fats in Homemade Dressings!
I learned pretty quickly that I should have been doing this all along. I felt GREAT, had so much energy and was *gasp* still losing weight. If you're not getting enough healthy fats you may be feeling hungry again soon after eating, experiencing low energy levels or an inability to concentrate – AKA brain fog. Try upping your intake of healthy fats throughout the day.
Check out my list of favorite Paleo resources for fore science-y information!
I didn't tell anyone I was doing this when I started out. You know how some people are like, really, really into telling anyone who will listen about their new diet? Yeah, I was exactly the opposite. I avoided the topic like the plague. I was extremely embarrassed of the state of my current health, and in my mind I thought if I told people they would secretly be thinking, "Ummm good idea. You probably should have done this a long time ago." Between that, and not wanting everyone I told to know if I failed when I didn't actually follow through with it, I decided to just keep it to myself.
And I did. It wasn't until everyone started commenting on my weight loss that it became public knowledge that I was eating differently. While it worked out okay for me, keeping quiet was definitely a mistake I made that first year.
I wish now that I would have had people I could count on for support when I needed it. Having people in your corner to cheer you on, encourage you or even to vent to would have made making the adjustment from eating what every other person is eating (the S.A.D., Standard American Diet) to going against the grain (literally) and doing a total 180. I know now that if I would have mentioned it to my friends and family, many of them would have even joined me – which would have really helped back then when it was all so new and challenging.
Found My Support System and Community on Instagram!
Getting support in any lifestyle change is so crucial. Reach out to someone you trust, join some Facebook groups or hop on Instagram to find a community to lift you up. Starting my Instagram was the best thing I've done for myself. The love, community and friendships that have come out of that are just unbelievably positive.
Through the first year of eating Paleo, I had to get real honest with myself about the foods that were still problematic for my binge eating, emotional eating and bad habits. Even if the food choices were Paleo. For a while during that first year, I totally used the, "it's Paleo so it's okay" excuse and ignored the fact that I'm eating this dried mango by the pound.
Your body processes sugar from dried fruit differently when it's consumed without the water content of normal fruit. And, you can quickly and easily consume WAY more dried fruit in a sitting than you'd be able to eat if it was a whole fruit. I mean, can you eat 5 mangos or apples in one sitting? Probably not. But in dried fruit you sure can.
Also, because this isn't just about the nutritional value or lack of when it comes to dried fruit, and it's also about substituting one habit for another – your brain doesn't differentiate between cravings being a Paleo choice or not. I used to have a habit of eating peanut butter right out of the jar standing in the kitchen. That habit didn't go away because I started eating Paleo. I just ended up using almond butter in the same exact manner.
So long story short, the mistake here is that I made the choice to ignore the foods that we're mentally healthy for me even though the fell into the Paleo template. Paleo is just that, a template. To avoid making this mistake, honor yourself first and Paleo rules second. If you eat a pound and a half of Paleo breaded and fried BBQ chicken wings without thinking or stopping, don't tell yourself it's fine because it's Paleo. The dried mango lesson applies to you too.
I'm a very all or nothing person in general. So when I saw the results that eating unprocessed foods based on just meats, veggies and fruit was having on my health and happiness, I doubled down on it. Hard. Because I was super duper strict Paleo girl, I never did a real reintroduction to find out which foods truly didn't agree with my body. I knew that this was working and why rock the boat, right?
Well, I should have experimented and played around a bit with having things like gluten free items and high quality cheese if for nothing else but to just know for sure that those things are foods I could or couldn't eat if I wanted to every once in a while.
Because I didn't do that, I was wrapped up in being 100% Paleo, 100% of the time. While that really helped me a) get healthy and b) change my food habits, it also gave me a whole different set of habits that might not have been the most balanced. I went from being totally out of control with my eating at 300 pounds, to loving the control I had with my eating and not letting anything interfere.
I wish I would have taken a little bit of time during that first year to develop a mindful balance and tailored the Paleo template to work for me. After all, the Paleo template is a set of guidelines, not a strict rule book. I'd suggest really taking your time, making adjustmenets and making Paleo work for you, not the other way around!
While this was both a positive thing, and only kind of a mistake I made, I do wish I would have put myself in situations where I would have had to come up with strategies and solutions to deal with social engagements. Instead, I avoided all temptation and in the process isolated myself a bit that first year. Unless I could control the situation, I wasn't going. Which, in hindsight, was okay for me because going to the bar and thinking I'd make a good choice would probably not have been a good idea back then. I've since come up with lots of strategies, tools and best practices on how to eat out and not be a total recluse because I eat so differently than the normal American.
That being said, if you're finding yourself avoiding family things, I'd start small (aka, don't go to a favorite pizza joint where everyone will be having beers and pizza until 2 am) and start with people you know really well and are comfortable with. From there you'll start getting comfortable with how to explain what you're doing to people, work on making adjustments to your order at a restaurant and begin learning how to deal with uncomfortable conversations with food pushers (ya know, the people who won't let you out of their sight until you just have the caramel double chocolate brownies they made special for you!) at family events.
It gets easier with practice, and now that I've had lots of it, I can navigate these social engagements with ease, but I wish I would have started learning and practicing them sooner!
Overall, these "mistakes" could also be looked at as learning experiences and yours will be different than mine. Looking back, I know I could have done things differently or "better", but they all served a purpose into helping me learn more about myself, about Paleo and healthy eating habits in general.
Hey there , I just found your blog (probably a ton of people did) from being featured on whole 30 this week. :). I have been reading for over an hour. You are a very relatable writer and I am enjoying your story so much! I am 44 and weigh 273…. again. Four years ago I went from 280 to 140. I have roller coaster dieted more than once. That's time I did medifast, and man did I loose and starve. I related so much to your ten things you didn't think you would have to deal with and the excess skin. The excess skin became my downfall and I just never felt comfortable. The mirror told me a story that I let drag me down. I have since gained it all back and have been thinking of whole 30 and real good. I feel like a huge part of my downfall was having a "perfect weight" goal that had to be met. I have loved Reading how well you have been able to work through so many issues, highs and lows on the journey. It's awesome that you are so young. Never let go of knowing you are worth every moment of joy and health from this journey.
Thank you so much for your kind message. I truly appreciate it. And I'm glad it's relatable, but sorry you're struggling. Dieting, and diet culture in general, is so mentally difficult. I also totally understand where you're coming from with the excess skin. It was (and is) really difficult for me, but on the bad days, I just try to remind myself that I get to live a fuller, healthier life WITH it, than I did without it at 300 pounds. The excess skin never holds me back from having experiences, the weight always did.
You are an amazing writer. I found one of your recipes on Pinterest and next thing I knew I had read several of your articles and wanted to keep reading more.


Yesterday I had the pleasure of speaking at the superb European Ruby Conference in Barcelona. It was fascinating seeing the enthusiasm of the audience for Ruby and the technologies presented. I also got to talk to several attendees about their own Ruby efforts. The most interesting chats that I had were reminders of how device capabilities on mobile are constantly expanding. This will be a constant thread and area of continued development and innovation for Rhomobile.
For example, I talked to Bart ten Brinke and other developers from Nedap Healthcare about their mobile home healthcare monitoring and timekeeping software. It runs via the builtin RFID on the nurse's mobile. They swipe the patients card over the phone to check in and check out during their visit. Right now it's only J2ME based for Nokia's Series 40 RFID-embedded featurephones. But the forthcoming RFID support in various smartphones, including several accessories for the iPhone, plus support for RFID in Rhodes, would enable a much more powerful (far beyond just timekeeping with patients) suite of similar apps for the iPhone.
I also talked with Jason Goecke of AdHearsion after he did a superb talk on voice-enabling apps. I really like following great speakers as they get the audience woken up and ready to process even more information (this phenomenon contributed to our mutual five star ratings). Like Rhodes, AdHearSion is a Ruby-based framework that makes it easy to buid server apps that do voice and IVR processing for apps such as phone-based customer support systems.
The possibilities of doing interesting applications with data on the smartphone but allowing the user to voice drive a backend app via a smartphone are pretty extensive. Imagine the customer/user interface for a CRM or issue tracking system and then invoking "reach out via voice" totally within context that you've selected via your smartphone. With the IVR systems I've used I think you'd save at least "voice menu options", which I would imagine would make customer satisfaction skyrocket in such systems.
I'm sure there are developers using Rhodes and AdHearSion today without our knowledge given our common customer base of early adopter Ruby developers. But regardless, I'm excited about about demonstrating the potential of data-oriented smartphone apps (aka Rhodes apps) to accelerate and alleviate interaction with backend IVR systems (such as those built with AdHearSion) in at least one of our sample apps.


text:
Q: How to make a UL have infinite scroll? I have a super long list that don't fit on the screen and I'm try to do add an auto scroll top to bottom of the ul elements and to be infinitive, I was able to do the following  code but it does the whole page and only want the ul.

I tried replacing
html with #top
and
body with#bottom

Lorem ipsumQuis nostrud exercitation

Test 17Test 17

Test 9Test 9

Test 10Test 10

Test 11Test 11

Test 12Test 12

Test 13Test 13

Test 14Test 14

Test 15Test 15

Test 18Test 18

Test 2Test

Test 16Test 16

Test 19Test 19

Test 3Test

Test 20Test 20

Test 21Test 21

 Nam libero temporeCum soluta nobis est

Test 5Test

Test 6Test

 Et harum quidemTemporibus autem quibusdam

Test 23Test 23

Test 22Test 22

Lorem ipsumQuis nostrud exercitation

Test 17Test 17

Test 9Test 9

Test 10Test 10

Test 11Test 11

Test 12Test 12

Test 13Test 13

Test 14Test 14

Test 15Test 15

Test 18Test 18

Test 2Test

Test 16Test 16

Test 19Test 19

Test 3Test

Test 20Test 20

Test 21Test 21

 Nam libero temporeCum soluta nobis est

Test 5Test

Test 6Test

 Et harum quidemTemporibus autem quibusdam

Test 23Test 23

Test 22Test 22

Lorem ipsumQuis nostrud exercitation

Test 17Test 17

Test 9Test 9

Test 10Test 10

Test 11Test 11

Test 12Test 12

Test 13Test 13

Test 14Test 14

Test 15Test 15

Test 18Test 18

Test 2Test

Test 16Test 16

Test 19Test 19

Test 3Test

Test 20Test 20

Test 21Test 21

 Nam libero temporeCum soluta nobis est

Test 5Test

Test 6Test

 Et harum quidemTemporibus autem quibusdam

Test 23Test 23

Test 22Test 22

A: *

*Scroll just one div, not the whole page

*You need to restrict the height of container with list

See the code below

$("#autoscroll").animate({ scrollTop: $(document).height() }, 4000);

setTimeout(function() {
    $('#autoscroll').animate({scrollTop:0}, 4000);
},4000);

setInterval(function(){
    $("#autoscroll").animate({ scrollTop: $(document).height() }, 4000);
    setTimeout(function() {
    $('#autoscroll').animate({scrollTop:0}, 4000);
    },4000);

},8000);

blah blah

Lorem ipsumQuis nostrud exercitation

Test 17Test 17

Test 9Test 9

Test 10Test 10

Test 11Test 11

Test 12Test 12

Test 13Test 13

Test 14Test 14

Test 15Test 15

Test 18Test 18

Test 2Test

Test 16Test 16

Test 19Test 19

Test 3Test

Test 20Test 20

Test 21Test 21

 Nam libero temporeCum soluta nobis est

Test 5Test

Test 6Test

 Et harum quidemTemporibus autem quibusdam

Test 23Test 23

Test 22Test 22

Lorem ipsumQuis nostrud exercitation

Test 17Test 17

Test 9Test 9

Test 10Test 10

Test 11Test 11

Test 12Test 12

Test 13Test 13

Test 14Test 14

Test 15Test 15

Test 18Test 18

Test 2Test

Test 16Test 16

Test 19Test 19

Test 3Test

Test 20Test 20

Test 21Test 21

 Nam libero temporeCum soluta nobis est

Test 5Test

Test 6Test

 Et harum quidemTemporibus autem quibusdam

Test 23Test 23

Test 22Test 22

Lorem ipsumQuis nostrud exercitation

Test 17Test 17

Test 9Test 9

Test 10Test 10

Test 11Test 11

Test 12Test 12

Test 13Test 13

Test 14Test 14

Test 15Test 15

Test 18Test 18

Test 2Test

Test 16Test 16

Test 19Test 19

Test 3Test

Test 20Test 20

Test 21Test 21

 Nam libero temporeCum soluta nobis est

Test 5Test

Test 6Test

 Et harum quidemTemporibus autem quibusdam

Test 23Test 23

Test 22Test 22

blah blah


text:
Q: Unable to connect to the Octopus Deploy server We have restriction on our Firewall and added a rule to allow only below range as suggested by Microsoft:
IP V4 ranges    IP V6 ranges
13.107.6.0/24   2620:1ec:4::/48
13.107.9.0/24   2620:1ec:a92::/48
13.107.42.0/24  2620:1ec:21::/48
13.107.43.0/24  2620:1ec:22::/48

https://learn.microsoft.com/en-us/azure/devops/organizations/security/allow-list-ip-url?toc=%2Fazure%2Fdevops%2Fsecurity-access-billing%2Ftoc.json&bc=%2Fazure%2Fdevops%2Fsecurity-access-billing%2Fbreadcrumb%2Ftoc.json&view=azure-devops
But still unable to connect. Can someone please guide me what other range to allow in our firewall to let Azure Devops make a connection to OctopusDeploy Server.