I met the charming ladies from The Whisk Fairy at one of my local fairs and although I 'thought' I didn't like macaroons (I'm reliably informed that those in the know refer to them as macarons), I was really intrigued by some of the flavour combinations on their stall. I'll try anything once, and boy was I stunned! They turned me around with the first crazy mouthful.
(much giggling) Helouise (H) – We met at work! We worked together at Kings College hospital in the research lab. Leilani was the only person I could fully understand. Because I had come directly from the States, so I was used to the accent. It was so embarrassing for me, not to be able to understand anybody!
How did the idea of The Whisk Fairy come about?
H – That's a really good question, so I was baking on a regular basis for people in the lab, and everyone was asking me for my recipes and someone suggested a blog. So one day I decided – ok I'll do a blog but I had no idea for a name, so I thought 'what am I doing, I'm doing magic', I don't have a wand but I have a whisk! As stupid as it sounds, that's how it came about.
Leilani (L) – The idea for the Whisk Fairy as a company came about because I was at a friend's wedding in Cambridge and the cocktail bar closed, we were all hungry but I couldn't find any late night food. I had a brainwave with my best friend and said 'we need to do a fried chicken truck and we need to do it in Cambridge'. Some time later we went back to Cambridge for a meeting, and the more we thought about it, we realised that there was a lot more to it than just getting a truck, and we were back to the drawing board. A little while later my friend asked Helouise what she was doing and then we all had the brainwave to do savoury macarons! By the end of the evening we were yelling out flavours 'fried chicken macaron' 'grilled cheese'!.. and I said 'stop, someone is going to take our idea'!
Did you try the fried chicken flavour?
L – No we haven't done it yet!
H – We have done a confit flavour.. its'a bird, similar!
You've chosen quite a specialist product, why macarons?
H – The big fashion for macarons in France was in 2007, that's when I started making them and then it went down. We noticed there was nothing here in England and not many people making them apart from the big macaron houses, but nothing at a more affordable level. So we thought there was an opportunity for us to enter this market.
With it being such a specialist product, It must help that the two of you are scientists because your minds work in a very precise way.
H – Baking is a science and you need to be really precise when you measure your ingredients and the way you manipulate things, like sometimes you should not stir and sometimes you should, because you might change the molecular structure, and you'll have crystals when you want to make syrup..
L – All the weights and measurements have to be spot on, because if we add slightly too much Baileys to a mixture, then we ruin the whole thing. We want our customers to have the same taste each time they buy from us, so continuity is important.
L – When we first started we thought about what was familiar, but also what's really 'out there'. So the flavours like red berries, chocolate etc. are familiar flavours, and then we wanted to do flavours that set us apart, so that's where the savoury and alcohol flavours came in… Limoncello, Baileys, Duck confit, Fois Gras, all things you wouldn't think to put in a macaron, but we thought we'd try it anyway. Also Haribo flavour!
H – She has these crazy ideas and then forces me into trying it! Over Christmas we had a conceptualisation time where we think about testing new flavours. We're also open to suggestions, so we took ideas from friends in brainstorming sessions, which really helped.
L – When we're selling at the market someone might come up to us and say they want to try Margarita flavour, and we'll give it a go if we like the idea.
H – Yes, for example, the duck confit idea is actually my boyfriend's idea, so we gave it a go, and wow!
I'm thinking Rum and Coke… (Sally) I'm thinking Marmite!
L – Yes! Ooo Marmite.. love it or hate it – I'm up for it!
What are your baking 'bibles'?
H – I don't really have a 'bible', I like to get inspiration from the internet and different places. I do have a favourite book which is Pierre Herme Ispahan. My mum gave me this for my birthday.
Give me three words that sum up The Whisk Fairy?
What does each of you bring to the partnership?
H – I would say I'm the creative one, even though I rely on science.
L – I'm the everything else! Helouise will make it and I will sell it. Organising, marketing, business development, all that behind the scenes stuff.
H – I don't know how to talk to people, I don't know how to network.. I'm a nerd and I'm shy.
L – We're a great mix!
Can you tell me about any hideous flavour disasters?
L – Yes! We tried olive tapenade. We thought it would be amazing but it was disgusting. We also got mixed feedback on our blueberry and white chocolate flavour, so we had to adjust the recipe to make it better. We're making that one today!
We break so that the ladies can start their macaron making process….
I've had the pleasure of trying a few of your more adventurous flavours, which I have to admit I was reluctant to try because I couldn't see how they could work in a macaron. But the innovation and quality of the flavours blew me away. How much testing goes into getting the flavours and combinations perfect?
L – We conceptualise them, we have a brainstorm, then we go to the kitchen and usually have one baking session and we're good to go.
H – When we have our first tasting session, at times we need to adjust something but after that it's usually the finished article. I come with an idea, I write it down and then try it. I approach it in a scientific way. Also I've been cooking since I was 4. My first cake.. I was 4 years old.
The perfect macaron is hard to master, how much science is 'really' involved?
L – It's almost like we have to be in a controlled environment. So we have to make sure it's a clean room, not too hot, not too much moisture, we then weigh out exactly what we need for each batch, not over, not under.. it has to be exact. I almost feel like I'm back in the lab doing an experiment.
H – It's exactly like being in the lab but you can actually eat the result! There's a lot of science. In fact we started out using a professional kitchen, and when we switched from there to my home, we had to re-learn everything as the kitchen was smaller and the environment was very different. The first few batches we made were terrible. In the professional kitchen we could have things on the hob and in the oven at the same time but here that isn't possible.
When you are hosting at home, do you try out your creations on your guests?
L -Yes, all the time! We'll take them to the lab and get our colleagues to try the different flavours out, which is great because there are lots of different nationalities to give a broad range of feedback.
Is there one flavour that everyone universally loves?
H – Yes, caramel! We've even sold tubs of just the caramel filling.
L – Coffee, caramel, dark chocolate and Speculoos.
H – Strawberry Haribo! But really I like them all as I only make what I like.
You both have day jobs. How many evenings are you macarooning?
L – About two nights a week. From around 6.30pm – 11pm. We'd usually make around 5 batches, so about 250 macaroons. When we have a big job, we'd increase the number of evenings to meet the need.
Apart from science and macarons, do you have any hobbies?
L – Marathon running, cross training, travelling. I'm going to the Phillipeans soon for a couple of weeks because my Grandma is turning 90. So we do take our breaks, to save our own sanity. But knowing our breaks are going to happen, we'd prepare things, making sure we have enough stock etc.
H – For me, my hobbies I've stopped as I'm so busy. I used to teach Sweedish Fit, which is a mix of aerobics and muscle building, to music, it's great and is accessible to everyone.
What's next for The Whisk Fairy?
H – Liberate!! Me from my day job! So that I can concentrate full time on The Whisk Fairy.
L – We started in May 2015, and we've found that the food markets seem to be the most successful for us, so we're concentrating on them. We'd like to do a macaron and wine pairing, possibly back in Cambridge as it has such a wide variety of people and they're really up for tasting new things.
L – We'd like to let people know that The Whisk Fairy are all about accessible macarons. Macarons can be expensive but we make them accessible to all. We just want to get out there and keep doing it, bringing it to the people. The Whisk Fairy is 'accessible sophistication'!
H – Yes we are affordable and accessible. We'd like to continue with our markets in the South London area. We really feel like we're part of South London – we started here, and we live here and feel part of the community.
So there you have it.. Authentic French macarons with a London twist!
Sally and I leave with bags of macarons in hand, that we have no intention of sharing with anyone!


Party City Promo Codes for June, 2018.647 Enjoy free ground shipping on orders Get 5 off your next order of party supplies when you enter this Party Works coupon code.CouponVario found collection of Party City coupon codes available.TechBargains has great deals, coupons and..
For visual impairment or diminished motor skills, they offer adapted electronics with enlarged switches that correspond to the tiny buttons on devices like iPods and keyboards. .My husband and I both love using our cordless, one-handed can opener from.M/onearm/Sleeve What to do with..
Which are top travel partners of Groupon with which you can book deals?Grab 25 off Local orders with this Groupon discount code.How to shop with the help of Groupon Mobile App?Additionally, users can also check the characteristics of the hotel, beauty centers, restaurants..
That was what I domestic domestic coupon code needed.
Thank you for the fast reply you guys rock.P.
Ordering online was very straightforward.
Welland ON Jan 15, 2014 'Bernard thank you for the update and on Sunday.
July 12, 2013 "Great, Thank you for the quick reply".R.Guelph ON Nov 7 2012 "Thanks The right belt is there.October 20, 2013 'Received them Saturday in good condition, thank you for responding back, I have needed this part for two years and was not sure how to get it until I found your web site.Your quick and personal answers are impressing and inspiring.Porters Lake NS July 17, 2013 "Thanks for your quick rely.Fort Nelson BC Dec 11 2012 "Berard, PayPal did not work but I tried it again on Monday and it worked.Uxbridge ON Nov 8, 2014 'Thank you very much for your assistance.
I am surely would do business with you in the future.
July 29, 2014 'Thanks for the quick reply, Bernard.
Howden MB Jan 26, 2012 "Thanks, I will order more parts from you in the future!".D.
And your now on my list for power tool parts when I need them.Much appreciated Take Care'.T.Blainville QU March 27, 2014 ' I received my parts this morning.July 31, 2013 'Thanks for the note.Tu es vraiment le king des moteurs.Will still be ordering stuff from you in the future.As a member of Shop Your Way Rewards, you'll earn Rewards every time you shop. I will check oinc travel insurance promo code the engine on the positions in your diagram.You have my business for a lot of years to come.Thanks so much for your help.


Pizza Delivery From Domino's Near 95655 - Order Domino's Now!
When you've got a hankering for a cheese-loaded slice of mouthwatering pizza, we know you're craving only the best pizza near 95655. You want a hot, delicious pizza with a flavorful tomato sauce, expertly sliced pepperoni, heaping piles of melted mozzarella and a hand-tossed crust that's crunchy, crispy, and chewy. You want to take a bite out of the perfect pizza. You want Domino's.
At Domino's near 95655, we make it easy to get exactly what you want: pizza that's fast and fresh. Order your pizza over the phone or online, or visit a Domino's near you to place a carryout order.
First, start by selecting from one of our handmade crusts, like our hand-tossed crust that's packed with buttery flavor, a crispy thin crust, a pan crust featuring two delicious layers of cheese, or even a gluten-free pizza crust! Next, pick your sauce and start piling on your favorite toppings. Don't be shy! Choose as many as you want. Whether you're a serious fan of mushrooms and spinach or love spicy pepperoni and tangy asiago cheese, you can be sure your nearest Domino's has it all.
At your Domino's near 95655, we don't take pizza delivery lightly. In fact, we'll make you a promise. We guarantee that your pizza will arrive hot and fresh, right from our toasty oven to your doorstep. Want to stay up to date on your order? Our delivery experts specifically engineered the Domino's TrackerⓇ to do just that. Enter in your phone number online and track the status of your order from the moment it's placed to the second it leaves our store for delivery... and in the meantime, try not to drool on your phone or computer.
You've probably already experienced our speedy pizza delivery skills, but did you know we're experts at pizza takeout near 95655 too? Feel free to order a delectable pie from our pizza menu or take home something completely different. Give everyone exactly what they want with one of our oven-baked sandwiches or pastas, platters of specialty chicken wings, crisp and colorful salads, and even sweet, dangerously delicious desserts like Cinna StixⓇ, chocolate cake, and cookie brownies.
Visit one of our more than 12,000 locations around the world and you'll see: we know what it means to provide great customer service and even better food quality. It's our goal to be the best pizza delivery company in the world, not only in Mather Afb, and everything we do reflects this commitment. You'll witness it in the way our delivery drivers take care of your order and you'll taste it in every bite of pizza you eat. Call your local Domino's restaurant near 95655, order online, or use our free mobile phone app for fast and delicious pizza delivery and carryout today! We aren't like every other pizza restaurant. We're your favorite pizza place near 95655!


UFO Association, Alien Contact Organizers, share the U.K. Co-Director for UFO Secret Space Groups in our Facebook Social Media Groups. Tina Bird is a UFO Enthusiast and has spent time as a researcher about life and the paranormal realm, and authors of Ufology and Alienology. She and Theresa J Morris, host of TJ Morris ET Radio are friends in social media. Tina has shared many photos in social media of her life with people in our inner circle of friends such as Erick von Daniken, Travis Walton, Graham Hancock, and been on many radio shows in our Revolution Radio in our Cosmos Radios Connection Family. We share Tina Bird came out in U.K. in 2016 and has shared her story in media such as both tv and radio. Now with our ACO Association, Alien Contact Organization, and UFO Association in our alliance with American Communications Online, ACO Club. Thomas Becker is producer, Amad Painter, Co-Host ACO Club Georgia and Skype Host, Janet Lessin, Co-Host ACO Club Hawaii, and Theresa J Morris, ACO Club Florida.


Decide when it is safe and ethical to provide medical care to close friends or coworkers.
Respond constructively to the emotional impact caused by an adverse outcome in one of your patients.
Share bad news with patients or families compassionately and effectively.
Participate in safe and efficient patient handoffs with other healthcare providers.
Recognize and respond appropriately to disruptive behavior that is endangering patient safety within the health care team.
The University of Arizona College of Medicine - Tucson designates this enduring material for a maximum of 2.00 AMA PRA Category 1 Credit(s)TM. Physicians should claim only the credit commensurate with the extent of their participation in the activity.
Leslie W. Hall, MD, FACP is the Executive Dean of the University of South Carolina School of Medicine in Columbia, SC, and the CEO of the Palmetto Health-USC Medical Group (effective February, 2015).
From 1999 – 2014, he served as a faculty member at the University of Missouri – Columbia School of Medicine. During his time on faculty at University of Missouri, he served in a number of roles including Director of the University of Missouri Health Care Office of Clinical Effectiveness (2002-2008), Chief Medical Officer for University of Missouri Health Care and Senior Associate Dean for Clinical Affairs (2008-2012), and Interim Dean of the School of Medicine (2012-2014).
Dr. Hall has developed several curricular offerings in the areas of quality improvement, patient safety and teamwork in health care. From 2005 to 2008, he served as one of two national physician advisors for Quality and Safety Education for Nurses (a Robert Wood Johnson Initiative). His research interests include analysis of the effectiveness of strategies to improve patient safety within hospitals and investigation of outcomes of quality improvement and patient safety education. Dr. Hall's clinical work is as an internal medicine hospitalist.
Disclosure: Dr. Hall states that he does not have any financial arrangements that could constitute a conflict of interest.
Kristin Hahn-Cover, MD, FACP serves as the Chief Quality Officer (CQO) of University of Missouri Health Care (MUHC). Dr. Hahn-Cover became CQO of MUHC in April 2013, after serving as Medical Director for the Office of Clinical Effectiveness. In her role as CQO, Dr. Hahn-Cover has responsibility for providing executive leadership and vision for quality improvement, patient safety/risk management, and infection control for MUC and the MU School of Medicine.
In addition to her appointment as Associate Professor in the Department of Internal Medicine, she serves as Adjunct Associate Professor, Department of Health Management and Informatics, University of Missouri Health System. A fellow of the American College of Physicians, Dr. Hahn-Cover holds an MD degree from the University of Texas Southwestern Medical Center at Dallas and is board certified by the American Board of Internal Medicine.
Disclosure: Dr. Hahn-Cover states that she does not have any financial arrangements that could constitute a conflict of interest.
Susan D. Scott, PhD, RN is the Manager of Patient Safety Coordinator and Risk Management at University of Missouri Health Care. Her duties include oversight of an electronic patient and consumer safety reporting system, coordination of safety investigations, and facilitation of root cause analyses for the health care system. Prior to assuming this position in 2005, she worked as a neonatal ICU nurse, legal nurse consultant, risk management nurse, and quality improvement specialist in the University of Missouri School of Medicine.
Dr. Scott has a long history of local, national, and international involvement in education regarding patient safety and quality improvement. She is the founder of the MU Health Care "For YOU" Team, which offers support to nurses, physicians, and other staff affected by stressful events while treating patients. This groundbreaking work led to University of Missouri Health Care receiving the national HOPE Award from the Medically Induced Trauma Support Services (MITSS) organization in 2009 and the 2011 CHEERS award from the Institute of Safe Medication Practices (ISMP).
Disclosure: Dr. Scott states that she does not have any financial arrangements that could constitute a conflict of interest.
John Harris Jr., MD, MBA is past Executive Director of the Office of CME at the University of Arizona College of Medicine. Dr. Harris has served as the Principal Investigator on multiple NIH-funded studies of online CME, and he is the author of a number of professional papers dealing with online CME.
Terrific course. Better than falling asleep in/watching a lecture.
How can physicians deal with severe frustrations related to technical issues, ie computer issues, that the administration doesn't seem to be able to correct due to cost or is unwilling to address?
Excellent course with relevant case scenarios and good information on handling the situations.
This course addresses the five most misdiagnosed conditions during the previous biennium, as well as root cause analysis, error reduction and prevention, and patient safety, as required by the Florida Board of Medicine.


tHIS PROPERTY AND MOBILE HOME NEEDS TO BE CONDEMNED!!! tHE OLD OWNER HAS LET THE YARD GO AND THE INSIDE OF THE HOUSE. hE HAD 3 DOGS LIVING INSIDE AND DID NOT LET THEM OUT SO THEY HAVE DESTROYED THE INSIDE AND HAVE USED THE BATHROOM INSIDE THE HOUSE FOR YEARS. if ANYONE KNOWS WHAT FINANCE COMPANY HAS THIS HOUSE PLEASE EMAIL ME!!!


This was a CAS card I created yesterday for the Queen For The Day challenge on SCS. Korin Sutherland, owner of Sweet 'n Sassy Stamps, has the honor of being queen stamper, so I knew I wanted to ink up this great butterfly image and sentiment from her Everyday Miracles set. I used a stipple tool to dot some Basic Gray ink then stamped an image from SU's The Art of Life over it. This created the BG for the fern die from Spellbinder's Foliage set. The butterfly was colored with Copics, sprayed with Dazzling Diamonds glimmer mist then popped on foam dots. The white panel was die cut using a new Romantic Rectangles Nestie. Easy peasy!


text:
Home › Learn More › Bookshelf
There are many great books addressing many reasons to live compassionately. On this annotated bibliography, books are listed alphabetically by author within the following categories:
Simon, David Robinson, Meatonomics: How the Rigged Economics of Meat and Dairy Make You Consume Too Much – and How to Eat Better, Live Longer, and Spend Smarter, September 2013. Available on Amazon.
This book focuses on the economics of animal food production and finds that it costs taxpayers about $414 billion/year in subsidies, healthcare costs, and environmental costs (what economists call externalities, or costs not paid for by producers). At this rate, every $1 of animal products sold imposes almost $2 on hidden costs on the rest of us. If producers paid these costs, a $4 hamburger would cost about $11. While you might choose compassionate living because of health, ethical, or environmental reasons, this book uses rigorous economic analysis to show the actual cost of using animals for food.
Most people are unaware of the detrimental environmental impact of eating animals and their fluids. Here is a sample of scientifically-researched facts about consuming animals for food:
Animal agriculture is the leading cause of species extinction, ocean dead zones, water pollution, and habitat destruction. Source: Food and Agriculture Organization of UN
Animal agriculture is responsible for more greenhouse gases emissions than all transportation combined. Source: Food and Agriculture Organization of UN
Growing feed crops for livestock consumes 56% of water in the US. Source: Worldwatch.org
One hamburger requires 660 gallons of water to produce (the equivalent of 2 months of showers). Source: EPA blog.
1,000 gallons of water are required to produce 1 gallon of milk. Source: EPA.
A farm with 2,500 dairy cows produces the same amount of waste as a city of 411,000 people (and human waste is processed through sewer systems – cows waste is not). Source: EPA.
Land required to feed one person for one year:
Vegan: 1/6 acre
Vegetarian: 6x as much as a vegan
Meat and dairy consumer: 18x as much as a vegan. Source: Earthsave.
Each day, a person who is vegan saves 1,100 gallons of water, 45 pounds of grain, 30 sq. ft. of forested land, 20 pounds of CO2 equivalent, and one animal's life. Source: Waterfootprint.org.
The books and web site below will show you the science behind these facts and how our eating choices are killing the planet.
Oppenlander, Richard, Comfortably Unaware: What We Choose to Eat is Killing Us and Our Planet, November 2012. Available on Amazon.
Food choices matter in areas of global depletion: we use natural resources that cannot be replaced because of our food choice. Richard Oppenlander shows how our daily food choices result in the depletion of fresh water, oceans, wild life, air quality, top soil, and other resources needed to sustain life on this planet. While you might choose low impact light bulbs, energy efficient shower heads, and low-flow toilets, your footprint on this earth is most affected by your daily food choices.
Oppenlander, Richard, Food Choice and Sustainablity: Why Buying Local, Eating Less Meat, and Taking Baby Steps Won't Work, November 2013. Available on Amazon.
Many writers talk about how buying local helps our environment and many of us dutifully and conscientiously purchase from local sources. However, this is simply a myth, as documented in this book by Richard Oppenlander with impressive scientific references.
Steele, Kelsey A, Good Green Vibes, September 2014, web site at www.goodgreenvibes.org .
Safe Haven volunteer (Kelsey maintains the Safe Haven Facebook page) designed and developed a web site showing the environmental impact of food choices. On her site, click the Food icon and then explore how what you eat affects our air, our water, and our hearts. The Spreading the Word area shows favorite sources of environmental information in social media sites, movies and books.
Most of us naturally abhor violence and we are sympathetic to the suffering of sentient beings who are physically weaker than us: children, older people, dogs, cats, and the animals we use as food. Somehow we rationalize our consumption of animals as either "I don't want to know what happened to the dead animal on my plate" or "This is the natural order of things … animals eat other animals." As we learn more, we come to realize that humans do not need to eat animals to survive and the amount of violence, suffering, slaughter, and pain of sentient beings needed to enjoy a dead animal on a plate is not worth it. Below are some books that explore the ethical dilemmas of eating animals and their fluids.
Colb, Sherry F., Mind If I Order The Cheeseburger?: And Other Questions People Ask Vegans, June 2013. Available on Amazon.
There are many conversations between vegans and omnivores and they often devolve into misunderstanding. Law Professor Sherry Colb takes all points seriously, such as, "Don't plant have feelings too?" and "Don't animals eat other animals?" Her answers are reasoned, respectful of both sides, and often humorous.
Dawn, Karen, Thanking the Monkey, April 2008. Available on Amazon.
Karen Dawn writes for the Washington Post and her own blog, Dawn Watch at http://www.dawnwatch.com/ . She uses humor and opinion pieces in her work as an animal activist. However, her work is well-researched and she covers such things as using animals for scientific testing of drugs and products, for entertainment, as pets, and for food.
Joy, Melanie, PhD., Why We Love Dogs, Eat Pigs, and Wear Cows. September 2011. Available on Amazon.
Professor of Psychology and Sociology at University of Massachusetts, Melanie Joy explores why we unthinkingly love some animals (think dogs and cats) while torturing, slaughtering, and eating other animals (think cows, pigs, chickens). She discusses how most human societies have 6-8 animals used for food while other animals are loved. For example, in South Korea, dogs are commonly eaten; in India, cows are never eaten.
McWilliams, James, The Modern Savage: Our Unthinking Decision to Eat Animals, January 2014. Available on Amazon.
Many economically privileged people think it is okay to eat animals and their fluids as long as they are sourced from organic, free-range, antibiotic-free, humane, small, family farms. Blogger James McWilliams challenges that assumption with his concept of the "omnivore's contradiction." Food writers will often sensitively write about animal sentience and then say they only eat "happy animals" from small farms who have had good lives and one bad day. Beautifully, sensitively, and rationally written, this book might help you understand what really goes on in both small family farms and large corporate entities. Follow McWilliams' two blogs: James McWilliams (great conversations about a variety of animal rights issues) and The Daily Pitchfork (which challenges articles in the media). You can also read a summary on our blog.
Masson, Jeffrey Moussaieff, The Face on Your Plate: The Truth About Food, April 2010. Available on Amazon.
This book presents a stark account of how the daily decisions we make to eat animal flesh and fluids affects our sense of morality, our planet, and our health. Sparing no details of the treatment of animals raised and then slaughtered for food (meat, dairy, eggs), this book refuses to sugar coat the reality of our daily choices.
Robbins, John, No Happy Cows, April 2012. Available on Amazon.
This is a series of essays by John Robbins (from the family who founded ice cream producer Baskin-Robbins). He talks about the politics of food, undercover operations in feed lots, slaughterhouses, and the relationship of humans to animals. Many long-time plant-eaters attribute John Robbins' books such as The Food Revolution and Diet for a New America, as their first sources of information about the misuse of animals and the ethical, health, and environmental consequences.
Yourofsky, Gary, see this great website at http://adaptt.org/ .
If you are looking for information about plant-based diets, you can't go wrong with Gary Yourofsky's web site. It is filled with information and even a counter of the number of animals slaughtered while you are on the site. There are many great links to talks, essays about ethics, and information about health and environmental impact of food choices. We have a link to one of his videos, "The Greatest Speech You Will Ever Hear," in our Compassionate Living>>Compassionate video section.
If you are looking for scientific, evidence-based research on the effects of diet on human health, the books listed below are among the best. The authors, with impeccable credentials, separate the myths of nutrition from the facts and help us focus on the scientifically-proven healthiest ways to eat: a whole food, plant-based diet with no added oils.
Campbell, T. Colin and Thomas M. Campbell, The China Study: The Most Comprehensive Study of Nutrition Ever Conducted And the Startling Implications for Diet, Weight Loss, And Long-term Health, May 2006. Available on smile.amazon.
This is the book that started it all! Written by T. Colin Campbell, Ph.D and Professor of Nutrition at Cornell University and his son Thomas, this book clearly explains the science of plant-based diets based on lab results, epidemiological studies, and Campbell's personal journey from providing more protein to hungry children in the Philippines to studying cancer rates in mainland China. The last third of the book is particularly interesting and addresses the question of "Why don't we all know this important, scientific information?" Visit the T. Colin Campbell Center for Nutrition Studies at http://nutritionstudies.org/ .
Campbell, T. Colin, Whole: Rethinking the Science of Nutrition, May 2014. Available on Amazon.
Ph.D. nutritionist Colin Campbell talks about "reductionist thinking" or nutritionists' habit of reducing the complexity of food into single nutrients (such as vitamin C, omega-3s, etc.). While it is easier to study and talk about single nutrients, it is well-known that food contains tens of thousands of nutrients that work together and we are better served by taking a holistic view of food. His nutritional advice is simple: eat a whole foods, plant-based diet for optimal health. However, his analysis of why we like to reduce everything to simple elements rather than the more realistic complexities of nature is compelling.
Campbell, Thomas, The Campbell Plan, May 2015. Available on Amazon.
By the son and co-author of The China Study, this book provides updates to the original research. We love the humility in the book; when the author doesn't have solid research to support his theory, he says so. He breaks food into three simple categories: animal, plant, processed plant fragments. For best health, stick to plant food.
Davis, Garth, MD., Proteinaholic: How our obsession with meat is killing us and what we can do about it, HarperOne, 2015. Available on Amazon.
Garth Davis, MD, is a leading bariatric surgeon.He deals with obese patients on a daily basis. However, he did not question the conventional nutritional information to eat more protein until his own health was at risk in his late 30s. He did exhaustive research on what science says about the healthiest people on the planet and wrote this book to share is findings. In his research and in his practice, he realized that health comes from a diet of plants, not from a diet of animal food.
Esselstyn, Caldwell B., Jr, Prevent and Reverse Heart Disease: The Revolutionary, Scientifically Proven, Nutrition-Based Cure, January 2008. Available on Amazon.
Internationally known surgeon, researcher and former clinician at the Cleveland Clinic, Caldwell Esselstyn shares the results of his 20 year study of heart patients that showed that a whole food, plant-based diet can both prevent and reverse heart disease, the number one killer of Americans (50% of Americans will die from heart disease). Esselstyn shows how heart disease is a nutritional disease resulting from the Western diet of fat and animal products. Note that Esselstyn has recently published a follow-on study involving 200 heart patients showing that diet changes have far greater and better results than any drugs or surgery for heart issues. Visit Dr. Esselstyn's Prevent and Reverse Heart Disease website at http://www.dresselstyn.com/site/ .
You can also see his wife, Ann, describe in her funny and clear way, the "whys" and "hows" of eating plant perfect here.
Greger, Michael, How Not to Die: Discover the Foods Scientifically Proven to Prevent and Reverse Disease. Available on Amazon.
By the author of the www.nutritionfacts.org web site, this book shows detailed science/evidence behind the recommendations to heat more plants.
McDougall, John, The Starch Solution: Eat the Foods You Love, Regain Your Health, and Lose the Weight for Good!, June 2013. Available on Amazon.
John McDougall, MD, has been a tireless advocate for a whole-food, plant based diet with no added oils. All of his books are excellent. In this, his most recent book, McDougall shows how carbs are not the enemy but rather how they form the basis of healthy diets around the world for tens of thousands of years. This book includes a start plan, weekly menu planner, and almost 100 recipes. Visit his website at www.drmcdougall.com for free advice and up-to-date research.
Stone, Gene (editor), T. Colin Campbell (Foreword), Caldwell B. Esseltyn (Foreword), Forks Over Knives: The Plant-Based Way to Health, June 2011. Available on Amazon.
This popular book uses simple language to show how you can protect yourself from the leading causes of death in the United States: heart disease, diabetes, and cancer. A whole-food, plant-based diet with no added oil supports health. This book includes commentary by leading experts, success stories, how-to's, and over 125 delicious recipes from famous chefs. There are several cookbooks and even a web site based on this work, http://www.forksoverknives.com/ .

redpajama_set_name: RedPajamaCommonCrawl


You'll probably do more harm than good.
From crazy cravings to crappy posture, here are some of the things the doctor might not share.
No one ever tells you this can happen after you lose a lot of weight.
Nope, we are not about this.
And the subject's story is a powerful one.
But that doesn't mean you should stop working out.
Use these expert tips to silence your inner cookie monster.
Because losing weight is just the first step.
Weight loss isn't always intentional.


text:
Nintendo NX Release Date Revealed
By Rishi Alwani | Updated: 27 April 2016 13:02 IST
After many a rumour, Nintendo has finally announced when its next console, the Nintendo NX will be available. The successor to its ill-fated Wii U can be bought in March 2017.
The news comes via the company's most recent financial statements where it says:
"For our dedicated video game platform business, Nintendo is currently developing a gaming platform codenamed "NX" with a brand-new concept. NX will be launched in March 2017 globally."
This shouldn't come as a surprise considering the spate of hints over the past few months. Both AMD and GameStop have claimed it would be expected soon.
With Sony and Microsoft heavily rumoured to announce iterative variants of their consoles by E3 2016 with a possible November launch, a March 2017 release window gives Nintendo enough time to launch with a worthy roster of games.
Speaking of which, its Zelda title for the Wii U has been delayed to 2017. The company has confirmed it for the NX as well albeit with no release window, just stating it is in development. Though we won't be surprised if it is a launch title for the console. It harkens back to the time Legend of Zelda: Twilight Princess was the last big game on the GameCube and a launch title for the Wii.
Will the NX be the successor the Wii U wasn't? We're not entirely sure. Nintendo has been extremely quiet on what to expect, apparently courting the likes of EA whilst working on a console that just might be underpowered by the time it hits the market. How much third-party support it will have remains to be seen as well, what with some developers being extremely vocal about the Kyoto-based company's silence on its plans.
Further reading: Nintendo, Nintendo GameCube, Nintendo NX, Nintendo NX release date, Wii U, Zelda NX, Zelda Wii U, NX
Moto 360 Sport Android Wear Smartwatch Launched at Rs. 19,999
Reliance Entertainment to Invest in 20 Indian Gaming Startups
Nintendo Laughed Off Microsoft's Acquisition Offer Prior to First Xbox Launch in 2001
From Zoom to Quibi: Tech Winners and Losers of 2020
Among Us Launched on Nintendo Switch as Cross-Platform Game; Console, Mobile and PC Users Can Play Together
Nintendo Switch: How to Turn Off Data Sharing via Google Analytics
Nintendo Switch Update Version 11.0.0 Released, Allows Transferring Screenshots, Videos to Smartphone, PC


The Cyclo-Index Precision Link Conveyor is designed to be a foundation for automation applications that require accurate positioning. The heart of this package is our proven Cyclo-Index Drive, which assures the highest quality and performance.
Cyclo - Index patented motion offers low peak acceleration and a smooth index.
Conveyor is available in carousel or over / under configurations.
Each system has steel mounting surfaces for tooling and equipment.
The unit employs our precision - machined link assemblies.
Each link features internal roller bearings for precise, quiet operation.
Precision cam followers assure durability, accuracy, and ease of maintenance.
Available in lengths divisible by 18 inches, up to a 12-foot center distance.
Standard pitches are 1.5-, 3-, 4.5-, and 6-inch linear travel.
+/- 0.005-inch repeatability at each station.
4000 Series DT Indexer drive system.
Quotes available for non-standard lengths and pitches.


text:
Short stories and tourist attraction reviews by Stephen Dineen
About Stephen Dineen
'Leap Years'
'Sirens' Song'
'The Driver'
'Exiles'
'Chimes'
← Six senses of Dublin
Spectator centre stage →
Posted on May 27, 2016 by stevedineen
First, the declaration of self-interest: the author is a friend, a fellow writers' group member, a personal inspiration in how to persist with the pen.
'Tony' – Michael Thurlow to me – was a cable guy and this chronicle offers us an insight into the lives of Everyman. The Marlay Man, a memoir of three decades in the cable TV business, takes us on a journey of repairing cable television connections and the accompanying adventures, in a most personal, comedic way.
From the story of a toaster and a trip switch, to the curious and numerous incidents of Gardaí stopping him for advice about how to connect to Channel 4 to watch horse racing, the cable guy has seen it all.
He was summonsed to court for obstructing Gardaí while in pursuit of a felon. He tells about the 'Tenters' of the Liberties, the disadvantaged, the affluent and sometimes the dangerous along his routes in Dublin. His rounds also brought opportunities to provide service and sympathy to the elderly in Dublin's leaflier suburbs, where insights into human loneliness are moving. It's all told visually, wryly and with atmosphere.
Humour punctuates many of the incidents. A colleague of Tony's and Gardaí call to doors in Neilstown, Clondalkin about crimes of self-connecting to cable TV. A lady opens her door.
'Wha?' she says.
'I have to tell you, madam, that you are in contravention of the 1990 Communications and Wireless Telegraphy Act,' says the chief inspector.
'Whahhh?' she repeats.
Tony's colleague tells her she's tapped into the pipe illegally. The woman looks around at them and peers out at the driver in the car. 'Is dar all?' she drawls, 'Jaysus, I tor it was something fuckin' serious.' She closes the door, then reopens it. 'Yis fuckin woke me up for dat?!'
The cable guy's career spans many companies, as one was taken over by another (Premier, Dublin Cablesystems, Cablelink, Chorus-NTL), and the evolution of technology throughout. We don't think of the wires and the frequency waves that bring pictures to our TVs but the cable guy studied, learnt and adapted to change throughout the 70s, 80s and 90s.
The primary trunk network, for example, was a super conducting network that Eircom installed (probably in the mid-80s) on part of their network. In consequence, all systems were joined together so everyone could watch the same high quality signal through a central processing centre. Signal could be sent across low-loss cable to hubs, which could insert community TV for distribution. Local aerials were removed. We never think of such developments and how they change our forms of entertainment.
Each chapter is introduced with the events of that year, a captivating way of bringing us back to the major political, social and cultural events of Ireland and the world. It places the episodes in a time tangibly, reminding us of events we might not have thought of for years.
Not only did 'Tony' repair television connections but he moved to different parts of the company, with humorous consequences such as his stint in customer service. His involvement with the trade union brought the fraught, the fiesty and the victorious episodes. Before TV, he earned his crust in bars, a flour mill and selling encyclopaedias. It's all told here.
The cable TV repair world is portrayed as boozy, full of camaraderie, empathetic for those Tony and colleagues served, coming into contact as they did with the full gamut of life. The chronicle is compelling, hilarious and insightful, characterising and re-creating a Dublin we don't seem to find so often now. This book is of equal character to the lives it brings alive in it pages.


text:
Establishment Armitage CofE Primary School
Voluntary controlled school
Rostron Avenue, Ardwick, Manchester, M12 5NP
Gaynor Stubbs
http://www.armitage.manchester.sch.uk/ Opens in new window
Outstanding (Last inspection: 22 March 2019)
Chair of governors
Philip Geldard Appointed by GB/board 01/09/2013 31/08/2020
Alexandra Smith Appointed by GB/board 03/12/2018 02/12/2022
Aneesha Parveen Rahman Appointed by GB/board 03/12/2018 02/12/2022
Douglas Allan Appointed by GB/board 03/12/2018 02/12/2022
Jean Doyle Appointed by GB/board 01/09/2013 21/09/2022
Anna Strachan Elected by school staff 14/05/2018 13/05/2022
Hamza Al-Qasmi Appointed by GB/board 19/03/2018 18/03/2022
Lydia Jane Norman Nominated by LA and appointed by GB 11/12/2017 10/12/2021
Zanaba Annan Elected by parents 27/03/2017 26/03/2021
Craig Smith Ex-officio foundation governor (appointed by foundation by virtue of the office they hold) 30/11/2015 Not recorded
Gaynor Stubbs Ex-officio by virtue of office as headteacher/principal 01/09/2009 Not recorded
Martin Jonathan Goulden Governor Appointed by GB/board 27/11/2012 21/09/2018
Lancashire and West Yorkshire
Manchester 018
Manchester 018A


text:
import { Dir, End, Point, Pole, Rot, Rail, Pier, MiniPier } from 'librail';

export interface FrontierManagerObserver {
    selectionChanged?(layout: FrontierManager, selection: End);
}

export class FrontierManager {
    private observer_: FrontierManagerObserver = null;
    private frontiers_ = [new End(Point.zero(), Dir.West, Pole.Minus)];

    get observer(): FrontierManagerObserver {
        return this.observer_;
    }

    set observer(ob: FrontierManagerObserver) {
        this.observer_ = ob;
    }

    public get frontiers(): Array<End> {
        return this.frontiers_;
    }

    public get selection(): End {
        console.log(this.frontiers);
        return this.frontiers[this.frontiers.length - 1];
    }

    private notifySelectionChanged() {
        if (this.observer) {
            if (this.observer.selectionChanged) {
                this.observer.selectionChanged(this, this.selection);
            }
        }
    }

    public selectNext() {
        let e = this.selection;
        this.frontiers_.splice(this.frontiers.length - 1, 1);
        this.frontiers_.splice(0, 0, e);

        this.notifySelectionChanged();
    }

    private toggleOpenEnd(end: End) {
        let i = this.frontiers_.findIndex(e => end.match(e));
        if (i >= 0) {
            this.frontiers_.splice(i, 1);
        } else {
            this.frontiers_.push(end);
        }
    }

    public addEnd(end: End) {
        this.toggleOpenEnd(end);
        this.notifySelectionChanged();
    }

    public removeEnd(end: End) {
        this.toggleOpenEnd(end);
        this.notifySelectionChanged();
    }
}

redpajama_set_name: RedPajamaGithub


Luxury at your fingertips. This 59 inch ALFI brand free standing acrylic soaking tub offers both versatility and elegance. With just the right blend of functionality and aesthetics, this tub is sure to compliment a variety of bathroom styles and will transform your everyday routine into a spa like escape.
Spa inspired bathtubs have become a popular choice for individuals looking to add a sculptural element to their bathroom décor. These tubs do not include features such as jets or bubbles, letting you enjoy a deep quiet soak, just like old times. Acrylic tubs retain heat well, and come in a variety of shapes and sizes, making them a great choice for easily adding a touch of sophisticated elegance with spa like appeal.
Free standing tub. Can be insalled anywhere with a floor drain outlet.
Dimensions: 59" x 28" x 22.88"


text:
Home Live Reports Mike Tramp @ Støberihallen, Hillerød (DK)
Popular Live Reports
Metal Church @ Arcada Theatre, St. Charles (US)
Overkill @ The Rave, Milwaukee (US)
Iron Reagan @ Reggies, Chicago (US)
Judas Priest @ Rosemont Theatre, Rosemont (US)
Blaze Bayley @ Brauer House, Lombard (US)
Avantasia @ Patio Theater, Chicago (US)
HOA Day 1 @ The Garden, Brande-Hörnerkirchen (DE)
Helgeåfestivalen Day 2 @ Knislinge (SE)
Mike Tramp - Capricorn - 16.04.19
Mike Tramp - Stray Away From The Flock - 16.02.19
Mike Tramp @ Zeppelin Rock Bar, Copenhagen (DK) - 03.12.18
Mike Tramp @ Templet, Lyngby (DK) - 22.09.18
Mike Tramp @ H9, Copenhagen (DK) - 05.12.17
Mike Tramp @ Støberihallen, Hillerød (DK)
Date: 29th November, 2018
Venue: Støberihallen
Tickets: 175DKK (€23/$26)
Promoter: Black Star Booking
Photos: Erika Wallberg
I did not intend to go to this one since I'd seen Mike at Zeppelin Rock Bar less than a month ago. Also, Mike Tramp is doubtless the one I've seen the most live over the last 2-3 years. Well, once hooked it's hard to not take the opportunity to see him play again. The thing is, it's always worth going to the shows since there will be differences between them. And frankly, you never know what will happen, how much Mike will talk and what stories he'll tell. Conceptually this was of course different than the one at Zeppelin Rock Bar since that was the release party for the re-issue of "Capricorn" and this was Stories & Music… I was still surprised though that the setlist was as different as it was between the shows. So yes, it's absolutely necessary to see Mike play over and over again.
Set-opener "Better Off" from "Capricorn" was featured in both sets as was fantastic "More To Life Than This" which followed. The version here, mellower than the record and also taken down in pace somewhat made it into a ballad. Something that worked really well. Last time he had help with the ambience and guitar from Oliver Steffensen. Here he was all alone and his guitar-playing is quite primitive compared to the guitarist normally surrounding him but this too worked. It didn't feel primitive or potty. The nerve and emotion he has in his performance stands on it's own. I was very happy that he kept fantastic "Bow And Obey" in the set this time too. The song is dark and moody on record and in this setup it's of course lighter but the expression still comes through in a fantastic way. Expected in between songs was to get a lot of stories. This was one of the reasons I hesitated to go, I still have quite hard to follow Danish but this time what he said came through fairly ok and I could get most of the content from the stories at least. Still, I need to catch up on the irony and jokes that shows up here and there though.
But the story-telling comes very natural, he have had his fair share of wackos showing up around him over the years. Someone claiming "Lay Down My Life For You" being written for her, as one example. Mike smiled at his own wittiness when he dedicated the lady "Goodbye Song" instead and then also added "Wait Not For Me" to the same list. I got a little stressed when "Give It All You Got" showed up, as that one ended the set at Zeppelin Rock Bar and I wasn't really done with this night yet. Luckily it wasn't over and "Time And Place" followed. With the latter of the two it was cool to hear it on guitar only, since it's a piano track on record. It works equally well in both versions but I find it really fascinating to see how things like this is solved. Mike then mumbled something about already having played it all and checked his watch when the crowd put in a demand for more. Wish granted and I doubt the promoter minded the extended set as Mike was handed a beer when he tried to leave the stage in the first place.
"Coming Home" is an absolute favourite from Mike's solo career so I was really happy that one showed up. The version in this case was significantly different compared to the full-band one I'm used to. But this surely worked, with the bare acoustic guitar to back-up the vocals I'll be damned if the emotion didn't come through even more here. Anyway, it gave me goose-bumps all over at least. That's how good it was. I was happy to see some WHITE LION songs in the set this time, "Little Fighter" showed up in the second half and after the second half-attempt to walk off stage also "When The Children Cry" showed up. Ironically, this time it was the closest to the original I've ever seen live.
Another reason to go to this show was that it was the last for the year for Mike and the last in Denmark until 'Nordic Noise Festival' in May 2019. It was definitely worth it, musically it was fantastic and I'm quite surprised how well I could follow the stories too. So now, 'Nordic Noise Festival' can't come soon enough.
Written by Erika Wallberg	Saturday, 16 February 2019 08:49


text:
Sing With Us
You are here: Home / About Us / FAQ
What kind of music do you sing?
We have a different theme each season. Our current season's theme is music by female composers and arrangers and includes works from Sweden, the Middle East, the American South, Finland, Germany, and more. Some pieces are historic, others contemporary – some are "classical" and some are folkloric.
You mean, I don't have to be a trained singer?
No, although many of our singers are highly trained. Our group functions so well because of the mix of skill levels. If you love to sing, come sing with us.
Do I need to know how to read music?
It helps, but isn't required. We provide some music literacy training.
Do you give Concerts?
Season Finales: We conclude each season with season finale concerts at the Mission Dolores Basilica in San Francisco.
Service Sings: We bring music to underserved groups by performing for no fee at venues such as hospitals, retirement homes, residential treatment centers, and developmental disability programs.
Regional Shows: We are often invited to perform at venues around the state.
Note: There is no requirement that every member sing in the concerts, but we enthusiastically recommend the experience.
Where does the Choir meet?
Rehearsals are held at St. Gregory of Nyssa Church in San Francisco (Potrero Hill).
© The Calling All Choir. San Francisco, CA. All rights reserved.


The business of health is a growing business in the United States. One of the main reasons why it is a big business is because the government does not subsidize everyone's healthcare costs like they do in other developed countries, such as Canada. Instead, the healthcare system in the United States uses private health insurance companies to help lower the costs of people's healthcare. However, the catch is that people have to pay high monthly premiums every month in order to keep their health insurance. This allows these insurance companies to make huge amounts of money. They will also look for any reason they can not to fulfill someone's insurance claim when it is filed. Before Obamacare, insurance companies used to look for preexisting conditions as an excuse not to pay somebody's claim. Now people just have high deductibles on their insurance plans, which most of them cannot afford to pay. Believe it or not, insurance companies depend on people not paying their deductibles because these companies don't have to pay any money towards the claim until the deductibles are paid. This means the companies save money and they get to maintain their high profit margin. This is the business of health in the United States.
The business of health doesn't just stop with insurance companies paying for traditional medical emergencies and doctor's visits though. There are third party companies that develop over-the-counter health treatments for a variety of health conditions and then sell them in retail stores or on television. Some of these treatments work and some are just playing on people's desperation to fix their health condition. For example, there are many infomercials on television that sell "unique" health products. You might find weight loss pills or gadgets being advertised on these infomercials with the promise that you will lose weight while only putting in a little bit of effort. These types of advertisements are clearly deceptive, but people still buy these products anyways because they want to believe it will work. As a result, these health gurus make millions of dollars off their health products that don't even work. You might wonder why they don't get shut down if it is a scam. Well, if you look closely at their commercial they will have fine print on the bottom of the screen that warns people that they have to regularly exercise and be on a strict diet in order to achieve the results advertised. The fine print may appear for five seconds before it goes away. However, this fine print is the legal technicality that allows them to get away with it. This is another example of how health has become a big business in the U.S.
People will always need healthcare. It is inevitable that we will get sick or injured at some point in our lives, which means we will need to pay for treatment to make ourselves better. But just remember that you should only purchase the type of healthcare that is actually given to you by a licensed doctor. Avoid using any gadgets or medications purchased off a television program or over the internet. That way you can spend your money wisely when it comes to your health.
Next Get Organized, Accomplish Fitness Goals!


In the last decade, there has been an increasing movement for the involvement of women in the STEM field. Women, especially women of color, tend to be the smallest demographic within technology. However, many people want to change that. Programs, like Girls Who Code and WAVE by Built By Girls, connect young girls to technology and mentors. Conferences, like Women in Tech, introduce female technicians to each other, explore potential employers, and create an accepting environment to learn. In this day, more and more resources are introduced to interest the future female generations of technicians. SDI Presence is part of this change.
Maria is studying Networking Systems and is working to create a student chapter ACM-W at Wilbur Wright College. She feels women are under-represented in this field, so this comes with the hope of enticing women into tech. The club will help provide guidance and mentorship to women who are thinking about a career in the tech field.
Yazmin Reyes is an upcoming sophomore at the University of Illinois at Chicago. She's currently majoring in Computer Science. For Yazmin, she knows that technology is always changing and advancing. Technology has so many career paths and opportunities, and its challenge to adapt is why she wants a career in this field.
As Latinas, we both understand the importance of representation in the workforce. Having others to look up to sparks hope that they would be able to reach success as well. For both, representation becomes a driving ambition towards their career goals.
Knowing about our background in IT and our motivating determination, SDI Presence assigned the us to the firm's cybersecurity team for the summer.
Over the course of the internship, we received several hands-on opportunities. Our main task, as cybersecurity interns, was to install SDI computers with the most recent security software. We learned about computer maintenance, and how essential it is to continuously maintain machines so they are protected at all times. Throughout this process, we were able to initiate cyber vulnerability assessments that included white hat testing to search for malicious activity, phishing testing, internal vulnerabilities scanning and more. Every machine within the company serves a different person for a different purpose, and we also received many chances to troubleshoot any machine issues as needed.
SDI Presence provided us with the opportunity to engage with the SDI team and see first-hand the degree to which cybersecurity impacts them as well. We traveled to different client locations throughout the Chicago area. We were also given the opportunity to work with one of SDI's portfolio of clients, Chicago Transit Authority (CTA).
CTA provided one of the more adventurous projects for us. This required us to travel everywhere in the Chicago area. We worked as part of the on-site SDI Team to implement a major IT upgrade within their internal system. Like any other computer upgrade project, we had to know the ins and outs of the new setup. We also worked alongside SDI team members through the entire project. With their mentorship and guidance, we were able to complete the transition project in less than a week.
We want to instill hope for any other women, and for all Latinas interested within the STEM field. By sharing our experience, we hope that it may be the push needed for other girls to seek opportunities like those that SDI Presence provided. We hope to see more people with diverse backgrounds fall in love with technology work, as they see all the benefits that it can provide.
We are grateful for being able to meet such amazing and talented people throughout SDI. We were welcomed with friendliness, kindness, and guidance throughout the entire internship, and so we express our appreciation for this memorable experience.
Maria is excited about her future in tech. She is fortunate to be surrounded by creative and inspiring people, who help her go beyond her limits. She is passionate about promoting other women to be innovative and to do their best work because diversity is needed in terms of gender and ethnicity in this male-dominated industry. Her excitement about new technologies that impact the world keeps her motivated to continue to develop her skills in a field that is always evolving.
Yazmin aims to complete her Bachelor of Science degree at UIC and continue to explore the variety of opportunities that technology has to offer in her future. She is also interested in participating in programs that mentor young girls interested in engineering, because she strongly believes that representation matters. Although following through with any study in technology is not very easy, being a part of someone else's journey to success is all she could ask for.


Family fun in Whistler Village! This weekend is all about Jazz, Blues 'n' Swing. Check out music by rock-a-billy jive band Cousin Harley, jazz ensembles the Jeff Van de Mark Trio and lesismore, and bluesman Wes Mackey. Dancers from Abbotsford's Suburban Swing crew along with local dancers from the Whistler Dance Academy will also be performing at various locations throughout the village. For more information call the Whistler Activity & Information Centre at 604-938-2769 or go to www.mywhistler.com.
Classic jazz standards in the elegant fireside lounge at the brand new Four Seasons Resort.
The legendary longhaired local rocks out one of his infamous Payday Friday patio parties.
Karaoke for those that dare and fun funky dance tunes by DJ Steve Jiu.
True bluesman is a one-man show – playing guitar, pedal bass and singing his authentic originals.
High energy Celtic & Irish pub favourites with the guitar and fiddle duo.
Jazzy pop tunes with the Vancouver-based singer/songwriter at the cocktail hour (4-6 p.m.) and again in the evening after 9 p.m.
Hip-hop and R&B hits with DJ Rob Banks. Doors at 10 p.m.


text:
Cambridge Zero
A Green World
Climate Challenge 2023: Concept Note Training
Wed, Feb 1 2023 , 5 - 6:30pm
Learn how to develop a concept note with Nicky Dee from Carbon13!
Climate Challenge teams will be required to submit a concept note as part of the programme - the deadline for this is 13 February. In advance of this deadline, Nicky Dee from Carbon13 will be running a training session on how to develop a concept note.
When? Wednesday 1 February, 5-6:30pm
Where? S1, Alison Richard Building
Register your interest in the Climate Challenge to receive emails and updates!
ABOUT THE CLIMATE CHALLENGE 2023
See full details on the Cambridge Zero website here: https://www.zero.cam.ac.uk/who-we-are/blog/news/climate-challenge-2023-climate-entrepreneurship-competition-just
Cambridge Zero has partnered with Cambridge Enterprise, Carbon13, the Maxwell Centre, CISL and Energy IRC, sponsored by Moda Living, to deliver this year's Climate Challenge.
Previously named the Carbon Challenge, the Climate Challenge is a climate-themed entrepreneurship competition for postgraduate and PhD students and postdoctoral researchers. Participants will have the opportunity to attend training sessions, covering topics from intellectual property rights to pitching ideas. Participants are then given the opportunity to form small teams and develop their own scalable solutions which help tackle the climate crisis and drive positive change.
Who is the Climate Challenge for?
Postgraduate and PhD students or postdoctoral researchers.
You do not need to be a seasoned entrepreneur! This is an opportunity to give entrepreneurship a go and build relevant skills.
You don't need to be a scientist or engineer to participate! We are also interested in ideas related to economic, societal and behavioural change that could lead to reductions in energy consumption and greenhouse gas emissions.
Concept notes should be submitted in small teams of 2 or 3 people. You do not need to already have a team to join the competition – you can meet others and form teams through initial sessions like the Ideas Jam or Pub Trip.
What does the Climate Challenge involve?
The Climate Challenge is a learning opportunity in entrepreneurship, with the potential to translate into a business opportunity.
We are interested in ideas in their initial conceptual stages rather than fully formed projects or products.
This year's theme: Just Decarbonisation
The theme of this year's Climate Challenge is 'just decarbonisation'. We are encouraging participants to find solutions that reduce carbon emissions in a manner that is inclusive or generates other social benefits. Proposals should consider the idea of a just transition, contemplating the social implications of decarbonisation, particularly on vulnerable populations. Examples could include reducing household energy consumption or climate change adaptations and mitigations in the Global South.
Events Audience
Explore Zero
Contact Cambridge Zero
General enquiries Media enquiries
Supported by Isaac Newton Trust
The Isaac Newton Trust is a charity established in 1988 by Trinity College. The Trust promotes learning, research and education in the University of Cambridge, primarily by providing support to early career researchers and by making research grants to departments and programmes within the University and its constituent Colleges.
© University of Cambridge


"Dear Dundas, You will perhaps hear that I had occasion to visit your neighbourhood this morning, in order to meet Mr. Tierney, in consequence of what passed between us in the House on Friday. We exchanged two shots on each side; and by the interposition of the seconds the affair ended in a way with which, I think, neither party had any reason to be dissatisfied. I am going to [Charles] Long's this evening, and will dine with you to-morrow. Yours ever, W. Pitt."
What an amusing way to make light of a duel! The duel was fought on a Sunday, which sparked some degree of outrage at the time, and also on the day before Pitt's 39th birthday. Fortunately, neither of the duellists were injured in any physical way, although Pitt was ill soon afterward.
Stanhope. (1862) Life of Pitt, Vol. 3. London: John Murray, p. 131.


text:
ERLC expresses concerns about Biden's proposed budget
April 4, 2022 By Tom Strode
WASHINGTON (BP) – President Biden's $5.8 trillion proposed budget for the next fiscal year contains elements of "deep concern," according to the Southern Baptist Ethics & Religious Liberty Commission.
In an article on its website, the ERLC expressed its consternation at the White House budget proposal's elimination of long-established, pro-life protections. It marked the second consecutive year Biden has excluded the Hyde Amendment and other prohibitions on federal funding of abortion. In its concerns, the commission also cited the proposed budget's embrace of "sexual orientation" and "gender identity" as categories to be protected in federal law.
The ERLC found areas for commendation, however. The entity welcomed the proposal's investments in rebuilding the refugee resettlement program and in addressing "food insecurity and the opioid crisis."
The president's budget, which was released March 28, is a request, not a binding document. Congress will consider it as both the Senate and House of Representatives go through the appropriations process to fund the federal government in fiscal year 2023, which begins in October.
"For the most part, the president's budget proposal in any given year is more about messaging than policy," Southern Baptist public policy specialist Chelsea Sobolik told Baptist Press in written comments. "That's true with this document. While there are a handful of areas where consensus could be achieved, there are multiple aspects that are deeply concerning.
"For the second year in a row, the White House proposal removes all longstanding, pro-life riders and provisions from the federal budget, items that were once considered untouchable," said Sobolik, the ERLC's director of public policy.
"Additionally, it includes increased funding for initiatives that advance 'gender equality' on the basis of 'sexual orientation and gender identity.' Should this blueprint actually be fully funded, it would have the effect of paving over the conscience of millions of citizens – something every American should be against."
Though Biden excluded the Hyde Amendment and other pro-life measures from his proposed budget last year, the eventual omnibus spending bill he signed this month after its passage by Congress included them. The Hyde Amendment and other pro-life protections must be approved each year as "riders" to spending bills.
Hyde, adopted each year since 1976, prohibits federal funds in Medicaid and other programs from paying for abortions. The ban is estimated to have saved the lives of about 2½ million unborn children.
Biden supported the Hyde Amendment during his 36 years in the Senate but reversed his position while running for the Democratic presidential nomination in 2019.
In the ERLC article examining Biden's proposed budget, Sobolik and Policy Associate Hannah Daniel said Hyde's "success across the generations is not due to a shared belief about abortion but precisely because those representatives and senators believed the disagreement deserved respect."
Hyde and the other pro-life riders "are essential in protecting life as well as the consciences of millions of American taxpayers," Sobolik and Daniel wrote. Pro-life riders other than Hyde they urged Congress to include in the final budget are the:
Weldon Amendment, which has barred since 2004 funding for government programs that discriminate against health-care individuals or institutions that object to abortion.
Helms Amendment, a rider first approved in 1973 that prohibits foreign aid funds from being used for abortion as a method of family planning.
Dornan Amendment, which was first adopted in 1988 and has barred in most of the years since federal and congressionally approved local funds from paying for abortions in the District of Columbia.
Kemp-Kasten Amendment, a 1985 measure that bans overseas family planning money from going to any organization that is involved in a program of forced abortion or sterilization.
Siljander Amendment, which has prohibited foreign assistance funds from covering the cost of lobbying for or against abortion since 1981.
The president's budget proposal also recommends a 40 percent increase in funds for abortion providers through the Title X family planning program, according to the ERLC.
While the pro-life riders have traditionally prevented these funds "from directly funding abortion procedures, abortion providers are still able to receive funding through [Title X] and other government funds to cover operational costs, allowing them to more easily reserve non-taxpayer dollars for abortion services," Sobolik and Daniel wrote.
In his proposed budget, Biden "includes multiple proposals that advance 'gender equity' on the basis of 'sexual orientation and gender identity,'" Sobolik and Daniel wrote. "Efforts to advance ["sexual orientation" and "gender identity"] as protected classes under federal law have explicitly included attempts to roll back religious freedom and conscience protections."
The ERLC will "advocate against the inclusion of any provision that could hinder the American conscience and religious liberty," according to the article.
"Sexual orientation" includes homosexuality, bisexuality and pansexuality, while "gender identity" refers to the way a person perceives himself regardless of his biology at birth.
In sections of Biden's budget proposal commended by the ERLC, Sobolik and Daniel said the president's proposal includes funding:
To "support the resettlement of up to [125,000] refugees;"
To permit the addition of 100 new immigration judges and support employees;
To combat the opioid crisis, especially among military veterans.


text:
from __future__ import absolute_import

from .._compat import chain_exception
from .._compat import pickle
from collections import OrderedDict
import itertools
from warnings import warn
from time import time
import pdb

from lasagne.layers import get_output
from lasagne.layers import InputLayer
from lasagne.objectives import aggregate
from lasagne.objectives import categorical_crossentropy
from lasagne.objectives import squared_error
from lasagne.updates import nesterov_momentum
from lasagne.utils import unique
import numpy as np
from sklearn.base import BaseEstimator
from sklearn.cross_validation import KFold
from sklearn.cross_validation import StratifiedKFold
from sklearn.metrics import accuracy_score
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import LabelEncoder
import theano
from theano import tensor as T

from . import PrintLog
from . import PrintLayerInfo

class _list(list):
    pass

class _dict(dict):
    def __contains__(self, key):
        return True

def _sldict(arr, sl):
    if isinstance(arr, dict):
        return {k: v[sl] for k, v in arr.items()}
    else:
        return arr[sl]

class Layers(OrderedDict):
    def __getitem__(self, key):
        if isinstance(key, (int, slice)):
            return list(self.values()).__getitem__(key)
        else:
            return super(Layers, self).__getitem__(key)

    def keys(self):
        return list(super(Layers, self).keys())

    def values(self):
        return list(super(Layers, self).values())

class BatchIterator(object):
    def __init__(self, batch_size):
        self.batch_size = batch_size

    def __call__(self, X, y=None):
        self.X, self.y = X, y
        return self

    def __iter__(self):
        bs = self.batch_size
        for i in range((self.n_samples + bs - 1) // bs):
            sl = slice(i * bs, (i + 1) * bs)
            Xb = _sldict(self.X, sl)
            if self.y is not None:
                yb = self.y[sl]
            else:
                yb = None
            yield self.transform(Xb, yb)

    @property
    def n_samples(self):
        X = self.X
        if isinstance(X, dict):
            return len(list(X.values())[0])
        else:
            return len(X)

    def transform(self, Xb, yb):
        return Xb, yb

    def __getstate__(self):
        state = dict(self.__dict__)
        for attr in ('X', 'y',):
            if attr in state:
                del state[attr]
        return state

class TrainSplit(object):
    def __init__(self, eval_size, stratify=True):
        self.eval_size = eval_size
        self.stratify = stratify

    def __call__(self, X, y, net):
        if self.eval_size:
            if net.regression or not self.stratify:
                kf = KFold(y.shape[0], round(1. / self.eval_size))
            else:
                kf = StratifiedKFold(y, round(1. / self.eval_size))

            train_indices, valid_indices = next(iter(kf))
            X_train, y_train = _sldict(X, train_indices), y[train_indices]
            X_valid, y_valid = _sldict(X, valid_indices), y[valid_indices]
        else:
            X_train, y_train = X, y
            X_valid, y_valid = _sldict(X, slice(len(X), None)), y[len(y):]

        return X_train, X_valid, y_train, y_valid

class LegacyTrainTestSplit(object):  # BBB
    def __init__(self, eval_size=0.2):
        self.eval_size = eval_size

    def __call__(self, X, y, net):
        return net.train_test_split(X, y, self.eval_size)

def objective(layers,
              loss_function,
              target,
              aggregate=aggregate,
              deterministic=False,
              get_output_kw=None):
    if get_output_kw is None:
        get_output_kw = {}
    output_layer = layers[-1]
    network_output = get_output(
        output_layer, deterministic=deterministic, **get_output_kw)
    losses = loss_function(network_output, target)
    return aggregate(losses)

class NeuralNet(BaseEstimator):
    """A scikit-learn estimator based on Lasagne.
    """
    def __init__(
        self,
        layers,
        update=nesterov_momentum,
        loss=None,  # BBB
        objective=objective,
        objective_loss_function=None,
        batch_iterator_train=BatchIterator(batch_size=128),
        batch_iterator_test=BatchIterator(batch_size=128),
        regression=False,
        max_epochs=100,
        train_split=TrainSplit(eval_size=0.2),
        custom_score=None,
        X_tensor_type=None,
        y_tensor_type=None,
        use_label_encoder=False,
        on_epoch_finished=None,
        on_training_started=None,
        on_training_finished=None,
        more_params=None,
        verbose=0,
        **kwargs
        ):
        if loss is not None:
            raise ValueError(
                "The 'loss' parameter was removed, please use "
                "'objective_loss_function' instead.")  # BBB
        if hasattr(objective, 'get_loss'):
            raise ValueError(
                "The 'Objective' class is no longer supported, please "
                "use 'nolearn.lasagne.objective' or similar.")  # BBB
        if objective_loss_function is None:
            objective_loss_function = (
                squared_error if regression else categorical_crossentropy)

        if hasattr(self, 'train_test_split'):  # BBB
            warn("The 'train_test_split' method has been deprecated, please "
                 "use the 'train_split' parameter instead.")
            train_split = LegacyTrainTestSplit(
                eval_size=kwargs.pop('eval_size', 0.2))

        if 'eval_size' in kwargs:  # BBB
            warn("The 'eval_size' argument has been deprecated, please use "
                 "the 'train_split' parameter instead, e.g.\n"
                 "train_split=TrainSplit(eval_size=0.4)")
            train_split.eval_size = kwargs.pop('eval_size')

        if y_tensor_type is None:
            y_tensor_type = T.fmatrix if regression else T.ivector

        if X_tensor_type is not None:
            raise ValueError(
                "The 'X_tensor_type' parameter has been removed. "
                "It's unnecessary.")  # BBB

        self.layers = layers
        self.update = update
        self.objective = objective
        self.objective_loss_function = objective_loss_function
        self.batch_iterator_train = batch_iterator_train
        self.batch_iterator_test = batch_iterator_test
        self.regression = regression
        self.max_epochs = max_epochs
        self.train_split = train_split
        self.custom_score = custom_score
        self.y_tensor_type = y_tensor_type
        self.use_label_encoder = use_label_encoder
        self.on_epoch_finished = on_epoch_finished or []
        self.on_training_started = on_training_started or []
        self.on_training_finished = on_training_finished or []
        self.more_params = more_params or {}
        self.verbose = verbose
        if self.verbose:
            # XXX: PrintLog should come before any other handlers,
            # because early stopping will otherwise cause the last
            # line not to be printed
            self.on_epoch_finished.append(PrintLog())
            self.on_training_started.append(PrintLayerInfo())

        for key in kwargs.keys():
            assert not hasattr(self, key)
        vars(self).update(kwargs)
        self._kwarg_keys = list(kwargs.keys())

        self.train_history_ = []

        if 'batch_iterator' in kwargs:  # BBB
            raise ValueError(
                "The 'batch_iterator' argument has been replaced. "
                "Use 'batch_iterator_train' and 'batch_iterator_test' instead."
                )

    def _check_for_unused_kwargs(self):
        names = self.layers_.keys() + ['update', 'objective']
        for k in self._kwarg_keys:
            for n in names:
                prefix = '{}_'.format(n)
                if k.startswith(prefix):
                    break
            else:
                raise ValueError("Unused kwarg: {}".format(k))

    def _check_good_input(self, X, y=None):
        if isinstance(X, dict):
            lengths = [len(X1) for X1 in X.values()]
            if len(set(lengths)) > 1:
                raise ValueError("Not all values of X are of equal length.")
            x_len = lengths[0]
        else:
            x_len = len(X)

        if y is not None:
            if len(y) != x_len:
                raise ValueError("X and y are not of equal length.")

        if self.regression and y is not None and y.ndim == 1:
            y = y.reshape(-1, 1)

        return X, y

    def initialize(self):
        if getattr(self, '_initialized', False):
            return

        out = getattr(self, '_output_layer', None)
        if out is None:
            out = self._output_layer = self.initialize_layers()
        self._check_for_unused_kwargs()

        iter_funcs = self._create_iter_funcs(
            self.layers_, self.objective, self.update,
            self.y_tensor_type,
            )
        self.train_iter_, self.eval_iter_, self.predict_iter_ = iter_funcs
        self._initialized = True

    def _get_params_for(self, name):
        collected = {}
        prefix = '{}_'.format(name)

        params = vars(self)
        more_params = self.more_params

        for key, value in itertools.chain(params.items(), more_params.items()):
            if key.startswith(prefix):
                collected[key[len(prefix):]] = value

        return collected

    def initialize_layers(self, layers=None):
        if layers is not None:
            self.layers = layers
        self.layers_ = Layers()

        layer = None
        for i, layer_def in enumerate(self.layers):

            if isinstance(layer_def[0], str):
                # The legacy format: ('name', Layer)
                layer_name, layer_factory = layer_def
                layer_kw = {'name': layer_name}
            else:
                # New format: (Layer, {'layer': 'kwargs'})
                layer_factory, layer_kw = layer_def
                layer_kw = layer_kw.copy()

            if 'name' not in layer_kw:
                layer_kw['name'] = "{}{}".format(
                    layer_factory.__name__.lower().replace("layer", ""), i)

            more_params = self._get_params_for(layer_kw['name'])
            layer_kw.update(more_params)

            if layer_kw['name'] in self.layers_:
                raise ValueError(
                    "Two layers with name {}.".format(layer_kw['name']))

            # Any layers that aren't subclasses of InputLayer are
            # assumed to require an 'incoming' paramter.  By default,
            # we'll use the previous layer as input:
            if not issubclass(layer_factory, InputLayer):
                if 'incoming' in layer_kw:
                    layer_kw['incoming'] = self.layers_[
                        layer_kw['incoming']]
                elif 'incomings' in layer_kw:
                    layer_kw['incomings'] = [
                        self.layers_[name] for name in layer_kw['incomings']]
                else:
                    layer_kw['incoming'] = layer

            for attr in ('W', 'b'):
                if isinstance(layer_kw.get(attr), str):
                    name = layer_kw[attr]
                    layer_kw[attr] = getattr(self.layers_[name], attr, None)

            try:
                layer_wrapper = layer_kw.pop('layer_wrapper', None)
                layer = layer_factory(**layer_kw)
            except TypeError as e:
                msg = ("Failed to instantiate {} with args {}.\n"
                       "Maybe parameter names have changed?".format(
                           layer_factory, layer_kw))
                chain_exception(TypeError(msg), e)
            self.layers_[layer_kw['name']] = layer
            if layer_wrapper is not None:
                layer = layer_wrapper(layer)
                self.layers_["LW_%s" % layer_kw['name']] = layer

        return layer

    def _create_iter_funcs(self, layers, objective, update, output_type):
        y_batch = output_type('y_batch')

        output_layer = layers[-1]
        objective_kw = self._get_params_for('objective')

        loss_train = objective(
            layers, target=y_batch, **objective_kw)
        loss_eval = objective(
            layers, target=y_batch, deterministic=True, **objective_kw)
        predict_proba = get_output(output_layer, None, deterministic=True)
        if not self.regression:
            predict = predict_proba.argmax(axis=1)
            accuracy = T.mean(T.eq(predict, y_batch))
        else:
            accuracy = loss_eval

        all_params = self.get_all_params(trainable=True)
        update_params = self._get_params_for('update')
        updates = update(loss_train, all_params, **update_params)

        input_layers = [layer for layer in layers.values()
                        if isinstance(layer, InputLayer)]

        X_inputs = [theano.Param(input_layer.input_var, name=input_layer.name)
                    for input_layer in input_layers]
        inputs = X_inputs + [theano.Param(y_batch, name="y")]

        train_iter = theano.function(
            inputs=inputs,
            outputs=[loss_train],
            updates=updates,
            allow_input_downcast=True,
            )
        eval_iter = theano.function(
            inputs=inputs,
            outputs=[loss_eval, accuracy],
            allow_input_downcast=True,
            )
        predict_iter = theano.function(
            inputs=X_inputs,
            outputs=predict_proba,
            allow_input_downcast=True,
            )

        return train_iter, eval_iter, predict_iter

    def fit(self, X, y):
        X, y = self._check_good_input(X, y)

        if self.use_label_encoder:
            self.enc_ = LabelEncoder()
            y = self.enc_.fit_transform(y).astype(np.int32)
            self.classes_ = self.enc_.classes_
        self.initialize()

        try:
            self.train_loop(X, y)
        except KeyboardInterrupt:
            pass
        return self

    def train_loop(self, X, y):
        X_train, X_valid, y_train, y_valid = self.train_split(X, y, self)

        on_epoch_finished = self.on_epoch_finished
        if not isinstance(on_epoch_finished, (list, tuple)):
            on_epoch_finished = [on_epoch_finished]

        on_training_started = self.on_training_started
        if not isinstance(on_training_started, (list, tuple)):
            on_training_started = [on_training_started]

        on_training_finished = self.on_training_finished
        if not isinstance(on_training_finished, (list, tuple)):
            on_training_finished = [on_training_finished]

        epoch = 0
        best_valid_loss = (
            min([row['valid_loss'] for row in self.train_history_]) if
            self.train_history_ else np.inf
            )
        best_train_loss = (
            min([row['train_loss'] for row in self.train_history_]) if
            self.train_history_ else np.inf
            )
        for func in on_training_started:
            func(self, self.train_history_)

        num_epochs_past = len(self.train_history_)

        while epoch < self.max_epochs:
            epoch += 1

            train_losses = []
            valid_losses = []
            valid_accuracies = []
            custom_score = []

            t0 = time()

            for Xb, yb in self.batch_iterator_train(X_train, y_train):
                batch_train_loss = self.apply_batch_func(
                    self.train_iter_, Xb, yb)
                train_losses.append(batch_train_loss)

            for Xb, yb in self.batch_iterator_test(X_valid, y_valid):
                batch_valid_loss, accuracy = self.apply_batch_func(
                    self.eval_iter_, Xb, yb)
                valid_losses.append(batch_valid_loss)
                valid_accuracies.append(accuracy)

                if self.custom_score:
                    y_prob = self.apply_batch_func(self.predict_iter_, Xb)
                    custom_score.append(self.custom_score[1](yb, y_prob))

            avg_train_loss = np.mean(train_losses)
            avg_valid_loss = np.mean(valid_losses)
            avg_valid_accuracy = np.mean(valid_accuracies)
            if custom_score:
                avg_custom_score = np.mean(custom_score)

            if avg_train_loss < best_train_loss:
                best_train_loss = avg_train_loss
            if avg_valid_loss < best_valid_loss:
                best_valid_loss = avg_valid_loss

            info = {
                'epoch': num_epochs_past + epoch,
                'train_loss': avg_train_loss,
                'train_loss_best': best_train_loss == avg_train_loss,
                'valid_loss': avg_valid_loss,
                'valid_loss_best': best_valid_loss == avg_valid_loss,
                'valid_accuracy': avg_valid_accuracy,
                'dur': time() - t0,
                }
            if self.custom_score:
                info[self.custom_score[0]] = avg_custom_score
            self.train_history_.append(info)

            try:
                for func in on_epoch_finished:
                    func(self, self.train_history_)
            except StopIteration:
                break

        for func in on_training_finished:
            func(self, self.train_history_)

    @staticmethod
    def apply_batch_func(func, Xb, yb=None):
        if isinstance(Xb, dict):
            kwargs = dict(Xb)
            if yb is not None:
                kwargs['y'] = yb
            return func(**kwargs)
        else:
            return func(Xb) if yb is None else func(Xb, yb)

    def predict_proba(self, X):
        probas = []
        for Xb, yb in self.batch_iterator_test(X):
            probas.append(self.apply_batch_func(self.predict_iter_, Xb))
        return np.vstack(probas)

    def predict(self, X):
        if self.regression:
            return self.predict_proba(X)
        else:
            y_pred = np.argmax(self.predict_proba(X), axis=1)
            if self.use_label_encoder:
                y_pred = self.enc_.inverse_transform(y_pred)
            return y_pred

    def score(self, X, y):
        score = mean_squared_error if self.regression else accuracy_score
        return float(score(self.predict(X), y))

    def get_all_layers(self):
        return self.layers_.values()

    def get_all_params(self, **kwargs):
        layers = self.get_all_layers()
        params = sum([l.get_params(**kwargs) for l in layers], [])
        return unique(params)

    def get_all_params_values(self):
        return_value = OrderedDict()
        for name, layer in self.layers_.items():
            return_value[name] = [p.get_value() for p in layer.get_params()]
        return return_value

    def load_params_from(self, source):
        self.initialize()

        if isinstance(source, str):
            with open(source, 'rb') as f:
                source = pickle.load(f)

        if isinstance(source, NeuralNet):
            source = source.get_all_params_values()

        success = "Loaded parameters to layer '{}' (shape {})."
        failure = ("Could not load parameters to layer '{}' because "
                   "shapes did not match: {} vs {}.")

        for key, values in source.items():
            layer = self.layers_.get(key)
            if layer is not None:
                for p1, p2v in zip(layer.get_params(), values):
                    shape1 = p1.get_value().shape
                    shape2 = p2v.shape
                    shape1s = 'x'.join(map(str, shape1))
                    shape2s = 'x'.join(map(str, shape2))
                    if shape1 == shape2:
                        p1.set_value(p2v)
                        if self.verbose:
                            print(success.format(
                                key, shape1s, shape2s))
                    else:
                        if self.verbose:
                            print(failure.format(
                                key, shape1s, shape2s))

    def save_params_to(self, fname):
        params = self.get_all_params_values()
        with open(fname, 'wb') as f:
            pickle.dump(params, f, -1)

    def load_weights_from(self, source):
        warn("The 'load_weights_from' method will be removed in nolearn 0.6. "
             "Please use 'load_params_from' instead.")

        if isinstance(source, list):
            raise ValueError(
                "Loading weights from a list of parameter values is no "
                "longer supported.  Please send me something like the "
                "return value of 'net.get_all_param_values()' instead.")

        return self.load_params_from(source)

    def save_weights_to(self, fname):
        warn("The 'save_weights_to' method will be removed in nolearn 0.6. "
             "Please use 'save_params_to' instead.")
        return self.save_params_to(fname)

    def __getstate__(self):
        state = dict(self.__dict__)
        for attr in (
            'train_iter_',
            'eval_iter_',
            'predict_iter_',
            '_initialized',
            ):
            if attr in state:
                del state[attr]
        return state

    def __setstate__(self, state):
        self.__dict__.update(state)
        self.initialize()

    def get_params(self, deep=True):
        params = super(NeuralNet, self).get_params(deep=deep)

        # Incidentally, Lasagne layers have a 'get_params' too, which
        # for sklearn's 'clone' means it would treat it in a special
        # way when cloning.  Wrapping the list of layers in a custom
        # list type does the trick here, but of course it's crazy:
        params['layers'] = _list(params['layers'])
        return _dict(params)

    def _get_param_names(self):
        # This allows us to have **kwargs in __init__ (woot!):
        param_names = super(NeuralNet, self)._get_param_names()
        return param_names + self._kwarg_keys