until I came up with one I like. These have the dough crosses on them and a honey glaze.
Mix warmed milk, margarine and water until margarine melts.
In large bowl of mixer, combine 4 cups flour, yeast, salt, sugar and spices.
In medium bowl, dredge fruit and raisins in 1/2 cup flour. Set aside.
Using beater attachment of mixer, turn on mixer and gradually add beaten eggs.
Change to dough hook and add floured raisins and fruit and grated rind.
Mix and gradually add flour until mixture begins to form a ball.
Mix for 5 minutes or knead by hand until dough is smooth and elastic.
Place in greased bowl cover with greased plastic and a clean towel and let rise in a warm place until double in bulk.
Grease two 9 x 13 inch pans and one 9 x 9 inch pan. or 3 9 x 13 inch pans.
Form buns and place in pans.
Cover again and let rise until doubled.
Cut shortening into flour, sugar and salt.
Add water and stir well - dough should be sticky and somewhat soft.
Place dough into a piping bag with a 1/4 inch tip. Set aside.
Brush buns with 1 egg yolk whisked together with 1 tablespoon water.
Pipe crosses on, using a knife to cut off the dough from the tip.
Bake at 400 degrees F for 17- 20 minutes.
Remove to rack. Cool for 1/2 hour.
Bev, I was going to put these on .. and your recipe is nearly identical. We love them too .. my mom took great pains to put a icing X across her's. . so yummy.
I've never made these, but I thought that the crosses were made of icing... so I inwardly smiled when I saw Lovellas comment. Seeing these in the store has never really made me want to try them, but homemade, I think I will.
Yum....I love hot cross buns and everyone has a slightly different version of the same goodness. I'm with Lovella...I never heard of the dough forming the crosses. I always thought they were 'snipped' and then an icing cross placed in the 'furrows'. Grin...at least that is how I make mine.
So just maybe I will need to try these..I love buns with raisins and spices.
your food looks amazing...so glad you visited and i clicked over.
can't wait to try the buns!!
Thank you for stopping by to visit. I am so glad you liked my post on Miracles & the one with the wisteria! I love wisteria too & the smell was so sweet. Almost like a big pitcher of Koolaide. I want to come back & visit your site. It looks very interesting. My mother was raised a Mennonite in western Kansas. And you are right... Mennonite girls can cook!
oh so many good recipes to try...so little time and too little will power......they look sooo good bev!
i never made them and always thought the x was icing..hmm who knew.
This recipe looks great and I can't wait to try making it. In regards to some of the comments about the crosses on top, I have never had a hot cross bun that had frosting/icing for the cross. Its traditionally always made with the dough for the cross on top. I worked at a bakery when I was a teenager and Hot Cross Buns were a Easter time favorite, and I remember piping the dough on top before the buns went in the oven. Maybe different countries have variations.
Just so others know, I put 12/pan which resulted in 3doz largish buns :) They are in the oven now, and smell amazing!
I've made these every year since discovering the recipe, and we love them! I use currents instead of raisins though because they're smaller!


text:
USGA and University of Minnesota Announce Research Partnership
11.39am 3rd November 2015 - Management Topics
The United States Golf Association (USGA) and the University of Minnesota (UMN) announce a five-year master research partnership to study and develop solutions to golf's present and future challenges.
"Participation and growth are central issues for the health of our game, but there are many other critical and complex factors that will contribute to its long-term sustainability," said Mike Davis USGA executive director. "This agreement will further the USGA's mission to apply fact-based research and deliver tested solutions back to the industry, particularly in three areas: the game's cost, the time it takes to play and golfer enjoyment."
The partnership, which allows both parties to identify projects and assign funding on an individual basis, leverages the full assets of the University of Minnesota, recognized as one of the most comprehensive public research universities in the U.S. The College of Food, Agricultural and Natural Resource Sciences; Carlson School of Management; College of Science and Engineering; and Humphrey School of Public Affairs are among those that are expected to contribute throughout the five-year period.
"We look forward to expanding our existing interdisciplinary research to build a sustainable future for the game of golf," said Eric Kaler, University of Minnesota president. "This unique strategic partnership with the USGA will help us to identify and advance solutions through some of the university's key strengths and mission: science, research, teaching and learning, and community engagement."
The partnership will utilize the university's Les Bolstad Golf Course as a living, learning laboratory to support critical research projects, as well as a classroom for demonstrating best practices in course design, maintenance and operations. The historic layout, established in 1929, is open to the public and valued by students, faculty, staff and the surrounding community.
"We firmly believe the impact of our work will transcend golf by identifying core concepts and solutions that can be applied to all sports and public green spaces," said Rand Jerris, Ph.D., senior managing director of public services for the USGA. "This partnership accelerates learning and solution development by augmenting our own in-house research team with investigators from different disciplines, working jointly to advance core economic, environmental and social principles in the game."
With an emphasis on innovation, projects will focus on technology, resource management, best practices for facility operations and design/renovation, community and economic impact studies, and participation behaviour. In addition to conducting research on-site at the university, the partnership will utilize golf facilities nationwide for collecting data, which will be processed and analysed by UMN students and faculty working closely with USGA experts.
"In this time of significant societal change, it's important that golf remain relevant to its broad customer base," said Brian Horgan, professor in the UMN department of Horticultural Science and Extension turfgrass specialist who is leading the partnership. "A transdisciplinary approach to research will allow golf to be responsible in its consumption of resources, and help golf facilities provide an experience that is affordable, enjoyable and compatible with the time people have available for recreation."
This partnership will complement the series of studies conducted by universities nationwide that the USGA has funded since the 1920s, particularly in turfgrass and agronomic research.
The organizations will also explore the potential for online and on-campus educational programs, as well as partnership opportunities with other organizations and institutions to foster information-sharing worldwide.
USGA, visit www.usga.org
University of Minnesota, visit www.umn.edu
Read more stories about Golf Management Topics and latest list of Most-read stories
Brian Horgan • Eric Kaler • Les Bolstad Golf Course • Mike Davis • Rand Jerris • United States Golf Association • University of Minnesota • usga
Sign up for our free twice weekly golf industry news summary
You can see the latest news letter here.
Follow us on Twitter and LinkedIn.

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: Is $T_1+T_2$ planar if $T_1,T_2$ are trees with the same vertices? I have two trees $T_1=(V,E_1)$ and $T_2=(V,E_2)$.
My question is, supposing that $G=(V,E_1\cup E_2)$, can we conclude that $G$ is planar?
I think it's planar, because $G$ is created by the union of two trees.
Also i read  this post that shows union of two planer graph my not be planer.

A: A picture is worth a thousand words:

redpajama_set_name: RedPajamaStackExchange


The history of Mesopotamia is measured in millennia rather than centuries.
The first cities developed in the south around 3500 B.C. For the next 3,000 years, kingdoms rose and fell, empires expanded and contracted, outsiders conquered and were repelled. During that time, three dominant civilizations held center stage at various times: the Sumerians, the Babylonians, and the Assyrians. In brief, here is their story.


Click on play button to listen high quality(320 Kbps) mp3 of "English Conversation 05 (Learn English Speaking)". This audio song duration is 57:44 minutes. This song is sing by English Conversation 05 (Learn English Speaking). You can download English Conversation 05 (Learn English Speaking) high quality audio by clicking on "Download Mp3" button.


Insomniac, electronic music's biggest party promoter, is gearing up for the next chapter of Nocturnal Wonderland. The typical one-day event has been expanded to a weekend of fun. Save the date… September 23rd and 24th is when it all goes down. Kick off is 3 pm and we've got a pair of tickets for both days to this massive event for one lucky winner. Will that be you?
For the ballers out there, this year's VIP amenities (must be 21 t partake) include a separate entrance to the festival, an open bar (in the lounge) with a selection of beer and vodka and water and tea, a full cash bar with a view of the stage from the VIP deck, free snacks, private restrooms, access to exclusive areas, a souvenir laminate and lanyard and, of course, tickets to the show. For the big ballers (read $2500—but buy early if you're interested cuz prices will increase) there's a VIP table package. What does $2500 get you? All the previously mentioned goodies, plus eight complimentary VIP tickets, a personal velvet-roped area with plush seating at Alice's House for you and your guests, a dedicated wait staff and your own private viewing area of the main stage. It's a month away and we're already getting all giddy.
If you'd like to take a trip with Magnetic down the rabbit hole—for FREE—all you have to do to be entered in our drawing is "Like" us on Facebook, share this post with your Facebook friends, follow us on Twitter and send us an email via the contact form below with your Twitter handle and Facebook URL. That's it, very simple stuff, indeed. The winner will be announced on Friday September 9th. Good luck!


This is one of our top selling coffee tables ladies and gents! She is a beauty! Lots of storage space and comes in a few different colors. We proudly bring this beauty in from one of our favorite Canadian suppliers! She is solid wood and is built to last a life-time! We also have about 50 other coffee tables on display from around the globe in our showroom, we would love it if you could come in soon!


A new project will help local tourism operators tap into the $8 billion market for travellers with disabilities.
The $1.8 million Accessible Tourism project would deliver practical training and education for providing services to disabled tourists, said local industry boss Roger Grant.
"We want to help make the region become a better place where visitors with disabilities can enjoy a holiday with all the facilities and services they need to stay comfortably," said Mr Grant, the chief of Tourism Greater Geelong and the Bellarine.
Project coordinator Victoria Strachan said two "diversity field officers" with small-business backgrounds would work with local tourism operators.
"They'll work one-on-one … to improve physical access, education and (operators') confidence in welcoming visitors and other customers with a disability," she said.
The program offered a series of three one-hour meetings in which participants' business and workplaces would be "analysed".
The program also discussed dealing with "unconscious bias" against disabled people, Ms Strachan said.
Operators could attend a free Disability 101 information session on 13 March by phoning 5223 2588, she said.


The automated system can be used to set a time at which the lights would automatically go off. So if you are reading your book in your bed, you can set the timer and the lights would go off after the prescribed time. Also the lights can be turned off remotely and this also enables you to switch the lights from your bed without having to walk to the switch.
If the lights used are LEDs then the automated lighting system can control the brightness of the lights. There are systems that have light sensors. These systems will know when to the increase the brightness and when to dim them.
The security system can be connected to the lighting system and when a security breach takes place the system would automatically turn on the lights on the outside of the house. This will certainly cause the intruders to drop their plan and escape.
Since there is absolutely no chance of the lights remaining switched on accidently, no energy wastages are made whatsoever. These days, there are systems which can sense the presence of a person in a room and then turn the lights on. If the person leaves, the lights are turned off.
basauthor	2018-03-10T16:22:08+00:00	February 7th, 2018|Comments Off on What Are The Advantages of Installing Home Lighting Control Systems?


text:
Cravings for social contact mimic hunger in the brain, study reveals
Loneliness can trigger "cravings" for social interaction in the brain just as hunger can trigger cravings for food, according to a study led by researchers from the Massachusetts Institute of Technology (MIT).
The study, published recently in Nature Neuroscience, revealed that after only one day of isolation, the thought of social interaction stimulates the same brain region activated during hunger cravings.
Put simply, a lonely person "craves" social interactions the same way a hungry person craves food, said senior author Rebecca Saxe, a professor of cognitive neuroscience at MIT and an associate member of the McGovern Institute for Brain Research.
These findings indicate that positive social interactions are a basic human need and that acute loneliness is an "aversive state" that motivates people to address what is lacking, similar to hunger, added Saxe.
Loneliness and hunger activate the same brain region
The latest study builds off of the findings of another MIT study in 2016, which identified a cluster of neurons in the mouse brain that represents feelings of loneliness and generates a drive for social contact after isolation.
While similar feelings of loneliness can be observed in humans, the neurological basis for them is yet to be fully understood. To this end, Saxe and her colleagues recruited 40 healthy participants aged 18–40 years.
To simulate isolation, the researchers confined the participants to a windowless room at MIT for 10 hours. The participants were not allowed to use their phones except for contacting the researchers if necessary.
Saxe said they also controlled the environment such that the participants felt as isolated as possible. To do this, the researchers would make sure the bathroom was empty before allowing the participants to use it. They even delivered food to the door and only texted the participants when it was there to avoid social contact. They were just not allowed to see people, said Saxe.
Then, after the 10-hour isolation period, each participant was scanned in a magnetic resonance imaging (MRI) machine. Before the isolation period, they were trained on how to get into the machine by themselves, again to avoid social contact as much as possible. The researchers, who were gowned and masked, just stood silently by and watched.
The participants also underwent 10 hours of fasting on a different day and were scanned again in the machine. In both instances, participants were scanned in the machine while looking at images of food, social interaction and neutral ones like flowers.
Participants also had to report whether they felt lonely, longed for social interaction or craved food after either session.
The researchers found that participants reported craving foods after the fasting period and craving interaction after the isolation period. In addition, the MRI scans showed that when participants saw images of interaction after the isolation period, their substantia nigra, a structure located in the midbrain, produced a signal like the one produced when participants saw images of food after the fasting period.
Earlier studies have associated the substantia nigra with hunger and drug cravings. In the 2016 MIT study, the substantia nigra in the brains of the mice was also activated following social isolation. The stronger the feelings of hunger and loneliness, the greater the craving for food and social interaction as well.
Interestingly, Saxe and her colleagues also found that participants who reported feeling isolated months before the study had weaker cravings for social interaction compared to participants who reported having a rich social life.
Overall, the findings support the idea that acute isolation causes "social cravings" similar to how fasting causes hunger, said lead author Livia Tomova, a former postdoctoral researcher at MIT.
With this new knowledge, scientists can now begin to further explore how social isolation affects behavior and motivation.
The study was conducted between 2018–2019 before the coronavirus pandemic. It was part of a large research program that focused on the effects of social stress on people's behaviors.
But in light of the strict lockdowns and social distancing protocols still in effect in several countries, this study might shed some light on how social isolation has affected the millions of people worldwide who stayed inside their homes for the better part of the year. (Related: A prepper's guide to surviving a coronavirus lockdown.)
Learn more about the effects of loneliness and social isolation on the brain at Brain.news.
News.MIT.edu
Tagged Under: coronavirus, covid-19, cravings, lockdown, loneliness, mental health, pandemic, social isolation
Expert points out "shaky science" behind AstraZeneca's coronavirus vaccine trial results
Johns Hopkins published, then deleted, study showing COVID-19 had no measurable effect on deaths in the United States
Obama, Biden helped corrupt CCP-linked coronavirus testing firm come to the U.S.
Trump issues new regulations aimed at lowering prescription drug prices
Is Shirazi thyme essential oil effective for managing IBS symptoms?
BRAINWASHING THE YOUNG: Cry Babies dolls allow children to "vaccinate" their dolls, causing measles-looking red dots on their face to vanish
Maryland governor expands snitch line, says there is "no constitutional right" to refuse wearing masks
People with disabilities oppose Canada's proposed expansion of euthanasia law
US, UK governments to deploy cyber warfare weapons against anyone questioning the propaganda about covid-19 vaccines
Swiss doctors ask patients over 60 to sign "Do Not Resuscitate" order in advance
DAMNING proof of biased media using COVID reporting as POLITICAL weapon against states that vote 'wrong'
AstraZeneca says "dosing error" resulted in boosted vaccine trial outcome, justifying claims of "90 percent effective"
Researchers ignore scientific evidence, use obsolete data to push national mask mandate
Extracts from garlic, white onion and purple onion exert inhibitory effects against enzymes linked to diabetes and hypertension
Understanding the use of Zataria multiflora essential oil for the treatment of IBS
Understanding how niacin treats high cholesterol levels
Compounds in celery found to reduce cholesterol and prevent tumor growth in animal study
Investigating the analgesic and anti-inflammatory properties of Cassia singueana
Exploring the cardioprotective properties of lactoferrin


1600sf of newly constructed kitchen and restaurant area in this architecturally enhanced concept. Unique finishes included an overhead trellis, steel signage railings integrated within the seating area and high end lighting fixtures.
The team at Delta is a pleasure to work with. They are thoroughly professional in their management and execution. Their unwavering dedication to the project schedule and budget along with a combination of smarts, deep experience and a good sense of team play were key to the project's success.


What are the Skin Care Benefits of Rosehip Oil?
Your skin care and beauty drawer may already be full of interesting and unique beauty products, yet it isn't hard to find new products any time you decide to waltz down the aisle of your favorite department store or browse online. While you are in search of new products, you may have come across many moisturizers, serums, and toners that have rosehip oil as a key ingredient. Rosehip oil or rosehip seed oil is a very popular skin care ingredient that is used by celebrities like Duchess Kate Middleton, and Rose Bryne and they speak wonders about it. Today I'll talk about the benefits of rosehip oil and share with you why it's an important ingredient in our new organic skin care line.
Rosehip oil is extracted from the seed of rose plants. It helps in reducing redness, calm acne, reduce signs of aging, and act as a moisturizer. At least that is what celebs, bloggers, and beauty reviewers swear by. But does it really live up to the hype created by these people? According to dermatologists, it actually does.
Here is how rosehip oil benefits your skin and how you can use it as a regular part of your beauty routine.
What Exactly Is Rosehip Oil?
According to Elizabeth Geddes-Bruth, MD, Board-certified dermatologist at Westlake Dermatology in Austin, Texas, rosehip oil is extracted from the crushed seeds of a wild rose plant using a unique cold-press method. This process makes sure that the nutritional value of the oil which contains several antioxidants, fatty acids, and vitamins stays intact. These things make rosehip oil an ideal skin care product.
There are many benefits of rosehip oil on your skin, but we will focus on the 8 biggest benefits as told by dermatologists.
New Release: Our 100% Vegan and Organic Eye Serum features rosehip oil. Click the image to read more and purchase!
Because it is rich in Vitamin A (also known as retinol), rosehip oil can help reduce the signs of aging including thickening of the dermis (the deepest layer of the skin) as well as smoothing the fine lines and making the skin feel younger, firmer, and tighter. This is something board-certified surgeon Anthony Youn, MD, anti-aging expert and author of The Age Fix swears by.
Since it contains vitamin c, a natural collagen-stimulating nutrient that we use in this facial serum as well as this hemp oil and vitamin c based cream, rosehip oil can help improve the overall firmness of the skin and as well as prevent fine lines. The vitamin is also widely appreciated for its skin-brightening qualities which gives your complexion a radiant appearance.
The many antioxidants of rosehip oil contain carotenoids and tocopherols that help protect the skin from environmental damage such as oxidative stress. A review published in 2018 issue of International Journal of Molecular Sciences confirmed this. The two combine together to reduce any free radicals that damage your skin cells by donating a single electron to each of them. Dr. Youn confirms that this ultimately cancels out any skin damaging properties of the free radicals.
Moreover, rosehip oil is also rich in beta-carotene which is an antioxidant belonging to the carotenoid family. It promotes the renewal and normal growth of skin cells. According to Debra Jaliman, MD, New York-based board-certified dermatologist and author of Skin Rules, rosehip oil is great for skin.
You may be thinking how can a oil prevent acne since oily skin is the first thing that causes them. But you may have forgotten, rosehip oil has powerful anti-inflammatory properties which calm down the redness and irritation associated with acne breakouts. What's even more interesting is that the retinoids in rosehip oil are usually prescribed by doctors for acne treatments since vitamin A in the oil can speed up skin cell turnover. Moreover, according to Dr. Youn, most people will find rosehip oil noncomedogenic which means it won't clog any pores.
Fatty acids inside the rosehip oil act as an excellent skin moisturizer, according to Dr. Youn. The fatty acids offer a punch of hydration to the skin by soaking, hydrating, and soothing it while also playing an important role in ceramide formation which is a substance that keeps the walls of the skin cells strengthened so it can keep retaining moisture.
Besides the soothing and firming qualities of Vitamin A, it may also even out your skin tone especially if you have scars due to acne. Dr. Youn says that by applying rosehip oil for many months, the dark spots and scars can be controlled. Research also suggests that rosehip oil may also improve the appearance and texture of scars, perhaps due to the fact that fatty acids play an important role in how skin cells rebuild themselves after injury.
It isn't easy to miss creams in departmental stores for pregnant women who want to reduce the stretch marks on their stomachs after giving birth. If you add rosehip oil to the mix, it doubles the effectiveness. A study in 2012 published in the International Journal of Cosmetic Science found out that women who were using anti-stretch mark creams having rosehip oil as a key ingredient during their pregnancy experienced fewer stretch marks compared to those who weren't.
"The most important thing is to make sure the rosehip oil you're using was obtained by cold-press methods, as high heat can degrade some of the key, active ingredients," says Dr. Geddes-Bruce.
You need to make sure that the rosehip oil you are buying is certified organic. It must guarantee that the oil was extracted from plants grown without pesticides and herbicides and is as pure in quality as possible. There are a number of rosehip oil bottles that you can add to your beauty drawer, here are some of our favorite picks.
If everything goes according to plan, you can also add in a few drops of rosehip oil to cleansed skin before going to bed after the toner but making sure to apply it before using heavier products such as moisturizers. If your skin feels irritated, just stop using it.


This is one of my go-to salads because it is easy to make, easy to store, and great on the body. It is geared towards supporting the liver and detoxification but also has high antioxidant powers. It is rich in many vitamins and minerals such as magnesium and will feed your body and mind.
You can chop everything up by hand. I use a food processor and put everything in there and finely chop it.
You can also top it with sliced apples, pears, pomegranate fruit, pumpkin seeds, or pine nuts. But I add in whatever I want to top it off when I am ready to eat it.
I love to make it with a Pomegranate Vinaigrette Dressing: 1.	In a large measuring cup, combine Pomegranate juice, honey, vinegar, and mustard. 2.	Whisk together until well-combined. 3.	Continue to whisk as you add in olive oil to emulsify. 4.	Pour dressing into serving container and set aside.


On Wednesday February 28, 2018, at approximately 1150 hours, a 1991 Mazda pickup was traveling northbound on Myrtle Ave., north of Pigeon Pt. Dr. The driver of the Mazda pickup allowed it travel off the east roadway edge. The truck then traveled back across both lanes of traffic, collided with a guardrail along the west edge of the roadway, and continued into the southbound lane of Myrtle Ave. directly in the path of an oncoming vehicle. The Mazda pickup and a 2005 Peterbilt tractor/trailer combination collided head-on and came to rest blocking both lanes of traffic. Traffic along Myrtle Ave. was temporarily diverted to allow cleanup of debris and fluids within the lanes of traffic and reopened at approximately 1430 hours.
The driver of the Mazda pickup, a 24 year old male out of Eureka, was not wearing a seatbelt at the time of the collision. He was transported to St. Joseph's Hospital where he was later pronounced deceased. Identification of the driver of the Mazda is pending notification of next of kin by the Humboldt County Coroner's Office. A dog in the pickup appeared uninjured but was transported to a local veterinarian for an exam.
The driver of the Peterbilt tractor/trailer, Tyson Boynton of Ferndale, CA, was wearing his seatbelt at the time of the collision and was uninjured.
Alcohol or drugs as factors in this collision remains under investigation.
This collision is being investigated by the California Highway Patrol and anyone with information related to this collision is encouraged to call the Humboldt Area CHP office at 707-822-5981.


text:
package be.peopleware.jsf_II;

import java.io.IOException;
import java.security.Principal;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.NoSuchElementException;
import java.util.ResourceBundle;
import java.util.Set;

import javax.faces.FacesException;
import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.component.UIViewRoot;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.ReferenceSyntaxException;
import javax.faces.el.ValueBinding;
import javax.faces.el.VariableResolver;
import javax.faces.webapp.UIComponentTag;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.myfaces.config.ManagedBeanBuilder;
import org.apache.myfaces.config.RuntimeConfig;
import org.apache.myfaces.config.element.ManagedBean;
import org.apache.myfaces.el.VariableResolverImpl;

import be.peopleware.bean_V.CompoundPropertyException;
import be.peopleware.bean_V.PropertyException;
import be.peopleware.i18n_I.Properties;
import be.peopleware.jsf_II.i18n.JsfResourceBundleLoadStrategy;

/**
 * Utility methods that return {@link FacesContext}, {@link HttpServletRequest},
 * etc., in a robust way. This means a {@link FacesException} is thrown if they
 * cannot be found, or are not of the expected type. Failures are also logged.

 * @author Jan Dockx
 * @author PeopleWare n.v.
 */
public class RobustCurrent {

  /*
*/
  //------------------------------------------------------------------
  /** {@value} */
  public static final String CVS_REVISION = "$Revision$"; //$NON-NLS-1$
  /** {@value} */
  public static final String CVS_DATE = "$Date$"; //$NON-NLS-1$
  /** {@value} */
  public static final String CVS_STATE = "$State$"; //$NON-NLS-1$
  /** {@value} */
  public static final String CVS_TAG = "$Name$"; //$NON-NLS-1$
  /*
*/

  private static final Log LOG = LogFactory.getLog(RobustCurrent.class);

  /**
   * The {@link JsfResourceBundleLoadStrategy} used.
   */
  public static final JsfResourceBundleLoadStrategy JSF_RESOURCE_BUNDLE_LOAD_STRATEGY =
    new JsfResourceBundleLoadStrategy();

  /**
   * The current {@link FacesContext}. Exception if null.
   *
   * @result result == FacesContext.getCurrentInstance();
   * @result FacesContext.getCurrentInstance() != null;
   * @throws FatalFacesException
   *         FacesContext.getCurrentInstance() == null;
   */
  public static FacesContext facesContext() throws FatalFacesException {
    FacesContext result =  FacesContext.getCurrentInstance();
    if (result == null) {
      fatalProblem("no faces context found");
    }
    return result;
  }

  /**
   * The current {@link UIViewRoot}. Exception if null.
   *
   * @result result == facesContext().getViewRoot();
   * @result facesContext().getViewRoot() != null;
   * @except facesContext();
   * @throws FatalFacesException
   *         facesContext().getViewRoot() == null;
   */
  public static UIViewRoot uiViewRoot() throws FatalFacesException {
    UIViewRoot result =  facesContext().getViewRoot();
    if (result == null) {
      fatalProblem("no faces view root found");
    }
    return result;
  }

  /**
   * Removes the value and submitted value of all {@link UIInput} elements
   * in the UI tree.
   *
   *
{@link UIInput} elements in the UI tree, starting from {@link #uiViewRoot()},
   *   can contain a local value, that was the result of a previous request / response
   *   cycle. If the component is not used in the mean time, it will still have that
   *   local value and show it in later responses.

   *
This method sets {@link UIInput#getSubmittedValue()} and
   *   {@link UIInput#getValue()} to null, and
   *   {@link UIInput#isLocalValueSet()} to false.

   *
   * @except uiViewRoot();
   */
  public static void resetUIInputComponents() throws FatalFacesException {
    resetUIInputComponent(uiViewRoot());
  }

  /**
   * Removes the value and submitted value of all {@link UIInput} elements
   * in the UI tree with component as its root.
   *
   * Helper method for {@link #resetUIInputComponents()}.
   * Depth-first tree traversal.
   *
   * @pre  component != null;
   */
  private static void resetUIInputComponent(final UIComponent component) {
    assert component != null;
    if (component instanceof UIInput) {
      UIInput inputComponent = (UIInput)component;
      inputComponent.setSubmittedValue(null);
      inputComponent.setValue(null);
      inputComponent.setLocalValueSet(false);
    }
    // handle children
    Iterator iter = component.getChildren().iterator();
    while (iter.hasNext()) {
      UIComponent child = (UIComponent)iter.next();
      resetUIInputComponent(child);
    }
  }

  /**
   * The current {@link Locale}. Exception if null.
   *
   * @result result == uiViewRoot().getLocale();
   * @result uiViewRoot().getLocale() != null;
   * @except uiViewRoot();
   * @throws FatalFacesException
   *         uiViewRoot().getLocale() == null;
   */
  public static Locale locale() throws FatalFacesException {
    Locale result = uiViewRoot().getLocale();
    if (result == null) {
      fatalProblem("no locale found");
    }
    return result;
  }

  /**
   * The resource bundle with baseName as base name,
   * with the locale currently in the {@link UIViewRoot} ({@link #locale()}),
   * retrieved with {@link #JSF_RESOURCE_BUNDLE_LOAD_STRATEGY}. If no
   * resource bundle could be found in this way, null is returned.
   *
   * @return  RobustCurrent.JSF_RESOURCE_BUNDLE_LOAD_STRATEGY
   *            .loadResourceBundle(baseName);
   * @throws FatalFacesException
   *         locale();
   */
  public static ResourceBundle resourceBundle(final String baseName) throws FatalFacesException {
    return RobustCurrent.JSF_RESOURCE_BUNDLE_LOAD_STRATEGY.loadResourceBundle(baseName);
  }

  /**
   * The current {@link ExternalContext}. Exception if null.
   *
   * @result result == facesContext().getExternalContext();
   * @result facesContext().getExternalContext() != null;
   * @except facesContext();
   * @throws FatalFacesException
   *         facesContext().getExternalContext() == null;
   */
  public static ExternalContext externalContext() throws FatalFacesException {
    ExternalContext result =  facesContext().getExternalContext();
    if (result == null) {
      fatalProblem("no external context found");
    }
    return result;
  }

  /**
   * The current {@link Principal user principal}. Returns null if there
   * is no user principal in the {@link ExternalContext}.
   *
   * @return externalContext().getUserPrincipal();
   * @except externalContext();
   */
  public static Principal principal() throws FacesException {
    return externalContext().getUserPrincipal();
  }

  /**
   * Check whether the current {@link Principal user principal} has
   * role role. Returns false if there
   * is no user principal in the {@link ExternalContext}.
   *
   * @return externalContext().isUserInRole(role);
   * @except externalContext();
   */
  public static boolean isUserInRole(final String role) throws FacesException {
    return externalContext().isUserInRole(role);
  }

  /**
   * The session associated with the current request.
   * Exception if null.
   * Create a session now if there isn't one.
   *
   * @result result == externalContext().getSession(true);
   * @result externalContext().getSession(true) != null;
   * @except externalContext();
   * @throws FatalFacesException
   *         externalContext().getSession(true) == null;
   */
  public static Object session() throws FatalFacesException {
    Object result = externalContext().getSession(true);
    if (result == null) {
      fatalProblem("no session found");
    }
    return result;
  }

  /**
   * The {@link HttpSession} associated with the current request.
   * Exception if null or of another type.
   * Create a session now if there isn't one.
   *
   * @result result == session();
   * @except session();
   * @throws FatalFacesException
   *         ! (session() instanceof HttpSession)
   */
  public static HttpSession httpSession() throws FatalFacesException {
    HttpSession result = null;
    try {
      result = (HttpSession)session();
    }
    catch (ClassCastException ccExc) {
      fatalProblem("session is not a HttpSession", ccExc);
    }
    return result;
  }

 /**
   * The current session map. Exception if null.
   *
   * @result result == externalContext().getSessionMap();
   * @result externalContext().getSessionMap() != null;
   * @except externalContext();
   * @throws FatalFacesException
   *         externalContext().getSessionMap() == null;
   */
  public static Map sessionMap() throws FatalFacesException {
    Map result = externalContext().getSessionMap();
    if (result == null) {
      fatalProblem("no session map found");
    }
    return result;
  }

  /**
   * Redirect robustly to link.
   *
   * @post   externalContext().redirect(link);
   * @except externalContext();
   * @throws FatalFacesException
   *         ; redirect failed with an IOException
   * @throws IllegalArgumentException
   *         If the specified url is relative
   * @throws IllegalStateException
   *         If, in a portlet environment, the current response object is a
   *         RenderResponse instead of an ActionResponse.
   * @throws IllegalStateException
   *         If, in a servlet environment, the current response has already been
   *         committed
   */
  public static void redirect(final String link) throws FatalFacesException {
    try {
      externalContext().redirect(link);
    }
    catch (IOException e) {
      fatalProblem("error redirecting to link: " + link, e);
    }
  }

  /**
   * The current {@link Application}. Exception if null.
   *
   * @result result == facesContext().getApplication();
   * @result facesContext().getApplication() != null;
   * @except facesContext();
   * @throws FatalFacesException
   *         facesContext().getApplication() == null;
   */
  public static Application application() throws FatalFacesException {
    Application result =  facesContext().getApplication();
    if (result == null) {
      fatalProblem("no faces application instance found");
    }
    return result;
  }

  /**
   * The fully qualified class name of the ResourceBundle to be used
   * for JavaServer Faces messages for this application (the name of the
   * current <dfn>application resource bundle</dfn>).
   * This can be null.
   *
   * @return result == application().getMessageBundle();
   * @except application();
   */
  public static String applicationBundleName() throws FatalFacesException {
    return application().getMessageBundle();
  }

  /**
   * The current <dfn>application resource bundle</dfn>.
   * This can be null.
   *
   * @return ResourceBundle.getBundle(applicationBundleName(),
                                                     locale());
   * @except application();
   * @except locale();
   * @throws NullPointerException
   *         If baseName or locale is null.
   * @throws MissingResourceException
   *         If no resource bundle for the specified base name can be found.
   */
  public static ResourceBundle applicationBundle()
      throws FatalFacesException, MissingResourceException {
    ResourceBundle result = ResourceBundle.getBundle(applicationBundleName(),
                                                     locale());
    return result;
  }

  /**
   * The current servlet or portlet application scope variables map.
   * Exception if null.
   *
   * @result result == externalContext().getApplicationMap();
   * @result externalContext().getApplicationMap() != null;
   * @except externalContext();
   * @throws FatalFacesException
   *         externalContext().getApplicationMap() == null;
   */
  public static Map applicationMap() throws FatalFacesException {
    Map result = externalContext().getApplicationMap();
    if (result == null) {
      fatalProblem("no application scope variables map found");
    }
    return result;
  }

  /**
   * The current {@link ViewHandler}. Exception if null.
   *
   * @result result == application().getViewHandler();
   * @result application().getViewHandler() != null;
   * @except application();
   * @throws FatalFacesException
   *         application().getViewHandler() == null;
   */
  public static ViewHandler viewHandler() throws FatalFacesException {
    ViewHandler result =  application().getViewHandler();
    if (result == null) {
      fatalProblem("no faces view handler found");
    }
    return result;
  }

  /**
   * The current servlet or portlet request. Exception if null.
   *
   * @result result == externalContext().getRequest();
   * @result externalContext().getRequest() != null;
   * @except externalContext();
   * @throws FatalFacesException
   *         externalContext().getRequest() == null;
   */
  public static Object request() throws FatalFacesException {
    Object result = externalContext().getRequest();
    if (result == null) {
      fatalProblem("no request found");
    }
    return result;
  }

  /**
   * The current {@link HttpServletRequest}.
   * Exception if null or of another type.
   *
   * @result request();
   * @except request();
   * @throws FatalFacesException
   *         ! (request() instanceof HttpServletRequest);
   */
  public static HttpServletRequest httpServletRequest() throws FatalFacesException {
    HttpServletRequest result = null;
    try {
      result = (HttpServletRequest)request();
    }
    catch (ClassCastException ccExc) {
      fatalProblem("request is not a HttpServletReques", ccExc);
    }
    return result;
  }

  /**
   * The current servlet or portlet response. Exception if null.
   *
   * @result result == externalContext().getResponse();
   * @result externalContext().getResponse() != null;
   * @except externalContext();
   * @throws FatalFacesException
   *         externalContext().getResponse() == null;
   */
  public static Object response() throws FatalFacesException {
    Object result = externalContext().getResponse();
    if (result == null) {
      fatalProblem("no response found");
    }
    return result;
  }

  /**
   * The current {@link HttpServletResponse}.
   * Exception if null or of another type.
   *
   * @result response();
   * @except response();
   * @throws FatalFacesException
   *         ! (response() instanceof HttpServletResponse);
   */
  public static HttpServletResponse httpServletResponse() throws FatalFacesException {
    HttpServletResponse result = null;
    try {
      result = (HttpServletResponse)response();
    }
    catch (ClassCastException ccExc) {
      fatalProblem("response is not a HttpServletReques", ccExc);
    }
    return result;
  }

  /**
   * The current servlet or portlet request scope variables map.
   * Exception if null.
   *
   * @result externalContext().getRequestMap();
   * @result externalContext().getRequestMap() != null;
   * @except externalContext();
   * @throws FatalFacesException
   *         externalContext().getRequestMap() == null;
   */
  public static Map requestMap() throws FatalFacesException {
    Map result = externalContext().getRequestMap();
    if (result == null) {
      fatalProblem("no request scope variables map found");
    }
    return result;
  }

  /**
   * The current servlet or portlet request parameter map.
   * Exception if null.
   *
   * @result externalContext().getRequestParameterMap();
   * @result externalContext().getRequestParameterMap() != null;
   * @except externalContext();
   * @throws FatalFacesException
   *         externalContext().getRequestParameterMap() == null;
   */
  public static Map paramMap() throws FatalFacesException {
    Map result = externalContext().getRequestParameterMap();
    if (result == null) {
      fatalProblem("no request scope parameter map found");
    }
    return result;
  }

  /**
   * Look for a variable with name var in request scope,
   * session scope, and application scope, in that order. Return
   * null if no such variable is found.
   *
   * @return [ (requestMap().get(var) != null)
   *             ? (result == requestMap().get(var))
   *             : [ (sessionMap().get(var) != null)
   *                   ? (result == sessionMap().get(var))
   *                   : [ (applicationMap().get(var) != null)
   *                         ? (result == applicationMap().get(var))
   *                         : (result == null)
   *                     ]
   *               ]
   *         ]
   *
   * @except requestMap();
   * @except sessionMap();
   *         (if requestMap().get(var) == null)
   * @except applicationMap();
   *         (if requestMap().get(var) == null && sessionMap().get(var) == null)
   */
  public static Object variable(final String var) throws FatalFacesException {
    Object result = requestMap().get(var);
    if (result == null) {
      result = sessionMap().get(var);
      if (result == null) {
        result = applicationMap().get(var);
      }
    }
    return result;
  }

  /**
   * Log out the user and throw a {@link FatalFacesException}.
   *
   * This method is to be called when a fatal error occurs.
   * We invalidate the {@link HttpSession}, actually logging
   * out the user, and throw a {@link FatalFacesException}.
   * This will propagate through the entire application to the
   * container, and an error page will be shown.
   * The message is logged in {@link #LOG}
   * as fatal.
   *
   * @post false;
   * @throws FatalFacesException ffExc
   *         ffExc.getMessage().equals(message) && (ffExc.getCause() == null);
   *         A FacesException that reports the problem.
   */
  private static void fatalProblem(final String message) throws FatalFacesException {
    fatalProblem(message, LOG);
  }

  /**
   * Log out the user and throw a {@link FatalFacesException}.
   *
   * This method is to be called when a fatal error occurs.
   * We invalidate the {@link HttpSession}, actually logging
   * out the user, and throw a {@link FatalFacesException}.
   * This will propagate through the entire application to the
   * container, and an error page will be shown.
   * The message is logged in {@link #LOG}
   * as fatal.
   *
   * @post false;
   * @throws FatalFacesException ffExc
   *         ffExc.getMessage().equals(message) && (ffExc.getCause() == t);
   *         A FacesException that reports the problem.
   */
  private static void fatalProblem(final String message, final Throwable t)
      throws FatalFacesException {
    fatalProblem(message, t, LOG);
  }

  /**
   * Log out the user and throw a {@link FatalFacesException}.
   *
   * This method is to be called when a fatal error occurs.
   * We invalidate the {@link HttpSession}, actually logging
   * out the user, and throw a {@link FatalFacesException}.
   * This will propagate through the entire application to the
   * container, and an error page will be shown.
   * The message is logged as fatal.
   *
   * @post false;
   * @throws FatalFacesException ffExc
   *         ffExc.getMessage().equals(message) && (ffExc.getCause() == null);
   *         A FacesException that reports the problem.
   */
  public static void fatalProblem(final String message, final Log log) throws FatalFacesException {
    fatalProblem(message, null, log);
  }

  /**
   * Log out the user and throw a {@link FatalFacesException}.
   *
   * This method is to be called when a fatal error occurs.
   * We invalidate the {@link HttpSession}, actually logging
   * out the user, and throw a {@link FatalFacesException}.
   * This will propagate through the entire application to the
   * container, and an error page will be shown.
   * The message is logged as fatal.
   *
   * @idea (jand) this should send a mail to administrator and developers
   *
   * @post false;
   * @throws FatalFacesException ffExc
   *         ffExc.getMessage().equals(message) && (ffExc.getCause() == t);
   *         A FacesException that reports the problem.
   */
  public static void fatalProblem(final String message, final Throwable t, final Log log)
      throws FatalFacesException {
    log.fatal(message, t);
    httpSession().invalidate();
    throw new FatalFacesException(message, t);
  }

  // TODO (jand) code lower still needs to be checked; does it belong here?

  /**
   * Get the {@link Throwable#getLocalizedMessage()} from pExc,
   * using the resource bundle load strategy {@link #JSF_RESOURCE_BUNDLE_LOAD_STRATEGY}
   * and turn it into a {@link FacesMessage}; use
   * {@link #showCompoundPropertyException(CompoundPropertyException)} when
   * pExc is a {@link CompoundPropertyException}.
   *
   * The severity of the message is {@link FacesMessage#SEVERITY_INFO}.
   * @todo The JSF component id of the message will be the
   * {@link PropertyException#getPropertyName() property name found in the exception}.
   *
   * @throws FatalFacesException
   */
  public static void showPropertyException(final PropertyException pExc)
      throws FatalFacesException {
    if (pExc instanceof CompoundPropertyException) {
      showCompoundPropertyException((CompoundPropertyException)pExc);
    }
    else {
      LOG.debug("requested to create message for property exception", pExc);
      pExc.setLocalizedMessageResourceBundleLoadStrategy(JSF_RESOURCE_BUNDLE_LOAD_STRATEGY);
      String messageText =  pExc.getLocalizedMessage();
      LOG.debug("messageText = " + messageText);
      FacesMessage message =  new FacesMessage(FacesMessage.SEVERITY_INFO, messageText, null);
      LOG.debug("faces message = " + message);
      /* do we have a 1 component whose id ends in pExc.getPropertyName()?
       * the use that id for the message, else null */
      String componentId = null;
// MUDO (jand) code below creates a weird problem
//      List components  = componentsWithIdEndingIn(pExc.getPropertyName());
//      if (components.size() == 1) {
//        UIComponent component = (UIComponent)components.get(0);
//        componentId = component.getClientId(facesContext());
//      }
      RobustCurrent.facesContext().addMessage(componentId, message);
    }
  }

  /**
   * A list of all the components in the current {@link #uiViewRoot()}
   * whose {@link UIComponent#getClientId(javax.faces.context.FacesContext)}'s
   * part after the last colon is componentIdPart.
   */
  public static List componentsWithIdEndingIn(final String componentIdPart)
      throws FatalFacesException {
    if ((componentIdPart == null) || (componentIdPart.equals(EMPTY))) {
      return Collections.EMPTY_LIST;
    }
    List result = new ArrayList();
    componentsWithIdEndingIn(uiViewRoot(), componentIdPart, facesContext(), result);
    return result;
  }

  /**
   * A list of all the components in the current {@link #uiViewRoot()}
   * whose {@link UIComponent#getClientId(javax.faces.context.FacesContext)}'s
   * part after the last colon is componentIdPart.
   */
  private static void componentsWithIdEndingIn(final UIComponent current,
      final String componentIdPart, final FacesContext fc, final List acc) {
    assert current != null;
    assert componentIdPart != null;
    String clientId = current.getClientId(fc);
    String[] parts = clientId.split(":");
    if (parts[parts.length - 1].equals(componentIdPart)) {
      acc.add(current);
    }
    // handle children
    Iterator iter = current.getChildren().iterator();
    while (iter.hasNext()) {
      UIComponent child = (UIComponent)iter.next();
      componentsWithIdEndingIn(child, componentIdPart, fc, acc);
    }
  }

  /**
   * When a {@link CompoundPropertyException} is caught, mostly
   * as a result of a call to {@link be.peopleware.bean_V.RousseauBean#checkCivility()},
   * turn it into faces messages. The faces action should return null:
   * we should stay on the same page.
   *
   * @throws FatalFacesException
   */
  public static void showCompoundPropertyException(final CompoundPropertyException cpe)
      throws FatalFacesException {
    Iterator iter = cpe.getElementExceptions().values().iterator();
    while (iter.hasNext()) {
      Set propertyExceptions = (Set)iter.next();
      Iterator iter2 = propertyExceptions.iterator();
      while (iter2.hasNext()) {
        PropertyException pExc = (PropertyException)iter2.next();
        showPropertyException(pExc);
      }
    }
  }

  /**
   * Navigation string used when an expected instance has disappeared from
   * persistent storage.
   *
   * = {@value}
   *
   * @see #noInstance(Class, Log)
   */
  public static final String OUTCOME_NO_INSTANCE = "noInstance";

  /**
   * The key in the {@link #applicationBundle()} for the message
   * that reports on a disappeared object.
   *
   * = {@value}
   *
   * @see #noInstance(Class, Log)
   */
  public static final String MESSAGE_KEY_NO_INSTANCE = "noInstance";

  /**
   * This method is to be called by handlers in a situation where an expected
   * record has disappeared from the data base. We create a message about this,
   * log the occurrence, and send the user 1 page upstream (probably the previous
   * page). We agree that the navigation outcome to go 1 page upstream is
   * {@link #OUTCOME_NO_INSTANCE}.
   * The severity of the message is {@link FacesMessage#SEVERITY_WARN}.
   *
   * @pre type != null;
   * @pre log != null;
   * @except application();
   */
  public static String noInstance(final Class type, final Log log) throws FatalFacesException {
    assert type != null;
    assert log != null;
    log.info("current " + type + " not found in DB anymore; type: " + type);
    String typeLabel = Properties.i18nTypeLabel(type, false, JSF_RESOURCE_BUNDLE_LOAD_STRATEGY);
    log.debug("type label = " + typeLabel);
    addApplicationMessage(MESSAGE_KEY_NO_INSTANCE, new String[] {typeLabel},
                          FacesMessage.SEVERITY_WARN, null);
    return OUTCOME_NO_INSTANCE;
  }

  /**
   * Add a message to the faces context, based on a key,
   * looked up in the application bundle. If arguments
   * is null, no formatting is done.
   *
   * @param  key
   *         This key is used to look up a message in the current
   *         {@link #applicationBundle()}.
   * @param  arguments
   *         Arguments that can be substituted in the message if this message
   *         has parameters.
   * @param  severity
   *         The severity of the message.
   * @param  componentId
   *         The id to which the message is associated.
   * @except applicationBundle();
   * @except facesContext();
   */
  public static void addApplicationMessage(final String key, final Object[] arguments,
      final FacesMessage.Severity severity, final String componentId)
      throws FatalFacesException {
    ResourceBundle rb = applicationBundle();
    LOG.debug("bundle is: " + rb);
    String messageText;
    if (rb != null) {
      String messagePattern =  rb.getString(key);
      LOG.debug("message pattern = " + messagePattern);
      if (arguments != null) {
        messageText = MessageFormat.format(messagePattern, arguments);
      }
      else {
        messageText = messagePattern;
      }
    }
    else {
      messageText = MESSAGE_KEY_NO_INSTANCE;
    }
    LOG.debug("message text = " + messageText);
    FacesMessage fm = new FacesMessage(severity, messageText, null);
    LOG.debug("faces message = " + fm);
    facesContext().addMessage(componentId, fm);
  }

  /**
   * Returns true when the faces context contains at least one message.
   * Returns false otherwise.
   *
   * @return facesContext().getMessages().hasNext();
   * @except facesContext();
   */
  public static boolean hasMessages() throws FatalFacesException {
    return facesContext().getMessages().hasNext();
  }

  /**
   * The empty string.
   *
   * = ""
   */
  public static final String EMPTY = "";

  /**
   * Create a value binding instance with expression value,
   * and add it to the component with name name.
   *
   * @pre component != null;
   * @pre name != null;
   * @pre ! name.equals(EMPTY);
   * @except application();
   * @throws FatalFacesException
   *         ! UIComponentTag.isValueReference(value)
   * @throws NullPointerException
   *         value == null;
   * @throws ReferenceSyntaxException
   *         value has invalid syntax
   */
  public static void creatValueBinding(final UIComponent component,
      final String name, final String value)
      throws FatalFacesException, ReferenceSyntaxException {
    assert component != null;
    assert name != null;
    assert !name.equals(EMPTY);
    if (!UIComponentTag.isValueReference(value)) {
      fatalProblem("\"" + value + "\" is not a valid value reference", LOG);
    }
    ValueBinding vb = application().createValueBinding(value);
    assert vb != null;
    component.setValueBinding(name, vb);
  }

  /**
   * Return all values in the current request that correspond to the HTTP
   * request parameter with name parameterName.
   * If the parameter does not exist, null is returned.
   *
   * @param   parameterName
   *          The name of a request parameter.
   * @return  result
   *          ==
   *          externalContext().getRequestParameterValuesMap().get(parameterName);
   * @except  externalContext();
   */
  public static String[] requestParameterValues(final String parameterName)
      throws FatalFacesException {
    return (String[])externalContext().getRequestParameterValuesMap().get(parameterName);
    // exceptions cannot happen according to contract of getRequestParameterValuesMap
  }

  /**
   * The current {@link VariableResolver}
   * This cannot be null.
   *
   * @return application().getVariableResolver();
   * @except application();
   */
  public static VariableResolver variableResolver() throws FatalFacesException {
    VariableResolver result = application().getVariableResolver();
    assert result != null;
    return result;
  }

  /**
   * Retrieve the variable with name variableName using the current
   * variable resolver {@link #variableResolver()} and create a managed bean
   * from faces-config.xml if needed.
   * If the name cannot be resolved, null is returned.
   *
   * @return variableResolver().resolveVariable(facesContext(), variableName);
   * @except variableResolver();
   * @throws FatalFacesException
   *         An exception occurred when resolving variableName.
   */
  public static Object resolve(final String variableName) throws FatalFacesException {
    Object result = null;
    try {
      result = variableResolver().resolveVariable(facesContext(), variableName);
    }
    catch (NullPointerException eExc) {
      fatalProblem("The given variableName is not effective: \"" + variableName + "\"", eExc);
    }
    catch (EvaluationException eExc) {
      fatalProblem("Exception resolving variable with name \"" + variableName + "\"", eExc);
    }
    return result;
  }

  /**
   * Retrieve the variable with name variableName, without
   * creating new managed beans. Also, we do not look for the implicit
   * variables like param, header, etc.
   * If the name cannot be resolved, null is returned.
   *
   * @return (requestMap().get(variableName) != null) ?
   *            requestMap().get(variableName) :
   *            ((sessionMap().get(variableName) != null) ?
   *                sessionMap().get(variableName) :
   *                applicationMap().get(variableName));
   * @except requestMap();
   * @except sessionMap();
   * @except applicationMap();
   */
  public static ScopeEntry lookup(final String variableName) throws FatalFacesException {
    try {
      return new ScopeEntry(variableName, requestMap());
    }
    catch (NoSuchElementException nseExcR) {
      try {
        return new ScopeEntry(variableName, sessionMap());
      }
      catch (NoSuchElementException nseExcS) {
        try {
          return new ScopeEntry(variableName, applicationMap());
        }
        catch (NoSuchElementException nseExcA) {
          return null;
        }
      }
    }
  }

  /**
   * A class representing a variable in some scope.
   * Each instance of this class has 3 properties:
   *

   *
key: the name of the variable

   *
scope: a map that contains or has contained the variable under the
   *              given key

   *
value: the value of the variable

   *

   * The value that is returned by {@link #getValue()} is the current value
   * of the variable with name {@link #getKey()} in scope {@link #getScope()},
   * if that value still exists in that scope. Otherwise, it is the value
   * the variable had when we last consulted the scope
   * ({@link #getLastKnownValue()}). The scope is consulted during construction,
   * a call to {@link #getValue()}, {@link #remove()} or {@link #resetValue()}.
   *
   *
   * @invar  getKey() != null;
   * @invar  getScope() != null;
   * @invar  getLastKnownValue() != null;
   */
  public static class ScopeEntry {

    /**
     * Create a new scope entry with the given key and scope.
     *
     * @param   key
     *          The name of the variable.
     * @param   scope
     *          The map containing the variable.
     * @pre key != null;
     * @pre scope != null;
     * @post    new.getKey().equals(key);
     * @post    new.getScope().equals(scope);
     * @post    new.getLastKnownValue() == scope.get(key);
     * @throws  NoSuchElementException
     *          scope.get(key) == null;
     */
    public ScopeEntry(final String key, final Map scope) throws NoSuchElementException {
      assert key != null;
      assert scope != null;
      if (scope.get(key) == null) {
        throw new NoSuchElementException();
      }
      $key = key;
      $scope = scope;
      $lastKnownValue = scope.get(key);
    }

    /**
     * The name of the variable.
     *
     * @basic
     */
    public final String getKey() {
      return $key;
    }

    /**
     * @invar  $key != null;
     */
    private String $key;

    /**
     * The map containing the variable.
     *
     * @basic
     */
    public final Map getScope() {
      return $scope;
    }

    /**
     * @invar  $scope != null;
     */
    private Map $scope;

    /**
     * The value of the variable.
     *
     * @basic
     */
    public final Object getLastKnownValue() {
      return $lastKnownValue;
    }

    /**
     * @return (getScope().get(getKey()) != null) ? getScope().get(getKey()) : getLastKnownValue();
     * @post  new.getLastKnownValue() == getValue();
     */
    public final Object getValue() {
      resetValue();
      return $lastKnownValue;
    }

    /**
     * @post new.getLastKnownValue() == getValue();
     */
    public final void resetValue() {
      Object current = $scope.get($key);
      if (current != null) {
        $lastKnownValue = current;
      }
    }

    /**
     * @invar  $lastKnownValue != null;
     */
    private Object $lastKnownValue;

    /**
     * Remove the key from the scope.
     *
     * @post  !new.getScope().containsKey(getKey());
     * @post  new.getLastKnownValue() == getValue();
     */
    public final void remove() {
      resetValue();
      $scope.remove(getKey());
    }

    /**
     * Put the key and the value into the scope.
     *
     * @post  new.getScope().containsKey(getKey());
     * @post  new.getScope().get(key) == getValue();
     */
    public final void reput() {
      $scope.put(getKey(), getLastKnownValue());
    }

  }

  /**
   * Remove the variable with name variableName from all
   * scopes.
   *
   * @post ! requestMap().containsKey(variableName);
   * @post ! sessionMap().containsKey(variableName);
   * @post ! applicationMap().containsKey(variableName);
   * @except requestMap();
   * @except sessionMap();
   * @except applicationMap();
   */
  public static void remove(final String variableName) throws FatalFacesException {
    requestMap().remove(variableName);
    sessionMap().remove(variableName);
    applicationMap().remove(variableName);
  }

  /**
   * Create a fresh managed bean, defined in faces-config.xml,
   * with name name. If no definition for name
   * can be found, return null. The created bean is not stored in
   * any scope, but returned.
   *
   * @note This method makes this class dependent on MyFaces. The API used
   *       is not part of the general JSF API, which doesn't expose the
   *       possibility to make managed beans ourselves. A workaround would
   *       be to get the current managed bean with name name,
   *       if any, without creating a new one (by looking in all scopes
   *       directly ourselves), remove it from that scope and remember it,
   *       then ask for the variable with name name via
   *       {@link #resolve(String)}, and then putting back the original bean
   *       where we found it.
   * @note This code is based on
   *        {@link VariableResolverImpl#resolveVariable(FacesContext, String)}.
   */
  public static Object freshManagedBean(final String name) throws FatalFacesException {
    LOG.debug("request for fresh managed bean with name \"" + name + "\"");
    RuntimeConfig rtcfg = RuntimeConfig.getCurrentInstance(externalContext());
    ManagedBean mbc = rtcfg.getManagedBean(name);
    if (mbc == null) {
      return null;
    }
    ManagedBeanBuilder builder = new ManagedBeanBuilder();
    Object result = null;
    try {
      result = builder.buildManagedBean(facesContext(), mbc);
    }
    catch (Exception exc) {
      fatalProblem("error building managed bean with name \""
                    + name + "\"", exc);
    }
    LOG.debug("created new managed bean: " + result);
    return result;
    /* MyFaces independent implementation
    ScopeEntry alreadyExisting = lookup(name);
    if (alreadyExisting != null) {
      alreadyExisting.remove();
    }
    Object result = resolve(name);
    if (alreadyExisting != null) {
      alreadyExisting.reput();
    }
    return result;
    */
  }

}

redpajama_set_name: RedPajamaGithub


text:
<?php
namespace Admin\Api;

use Admin\Model\InternationalAlipayNotifyModel;
use Common\Api\Api;

/**
 * Created by PhpStorm.
 * User: an
 * Date: 2015/9/24
 * Time: 11:39
 */
class InternationalAlipayNotifyApi extends Api{
    const ADD="Admin/InternationalAlipayNotify/add";

    /**
     * getInfo
     */
    const GET_INFO="Admin/InternationalAlipayNotify/getInfo";

    protected function _init(){
        $this->model=new InternationalAlipayNotifyModel();
    }

}


text:
'Steven Universe' Season 5 Score Album Released
Posted: September 24, 2020 by filmmusicreporter in TV Music Albums
Tags: Aivi Tran, Cartoon Network, score, Soundtrack, Steven Universe, Steven Velema
WaterTower Music has released the fifth score album for the Cartoon Network animated series Steven Universe have been revealed. The album features selections of the original score from the show's fifth and final season season composed by Aivi & Surasshu (aka Aivi Tran & Steven "Surasshu" Velema). The soundtrack is now available to stream/download on Amazon and all other major digital music serveices. The label has previously released four albums featuring the composers' music from the first, second, third and fourth season. Another album featuring the composers' music from Steven Universe Future is in the works. Steven Universe is created by Rebecca Sugar and stars Zach Callison, Michaela Dietz, Estelle and Deedee Magno Hall. The series premiered between 2013 and 2019 on Cartoon Network.
Here's the track list of the album:
1. I Don't Wanna Be Alone (2:29)
2. Aquamarine Subdues Topaz (1:47)
3. The Trial: Pt. 1 (Green Zircon) (2:53)
4. The Trial: Pt. 2 (Blue Zircon) (3:48)
5. The Off Colors (2:38)
6. Lars…? (1:08)
7. Pink Lars (1:02)
8. Lion's Secret (0:53)
9. Goodbye Lars / Home At Last (0:38)
10. Lapis Leaves (1:41)
11. Family (1:06)
12. I Miss You (She Took The Barn) (0:45)
13. Shorty Squad in the Kindergarten (1:09)
14. The Train Home (1:01)
15. VROOM (2:01)
16. Kevin Party (3:55)
17. Best Friends Forever (1:40)
18. Lars of the Stars (2:01)
19. The Legend of Rose Quartz (4:16)
20. Jungle Moon (0:47)
21. Garnet & Steven Get Painted & Chase a Cat (1:51)
22. Orbservatory (0:59)
23. When I Go Back (1:08)
24. Pearl…? (1:26)
25. Find My Phone (1:18)
26. Going Deeper (3:49)
27. No One Can Know (Pearl & Pink Diamond's Secret) (2:57)
28. Sapphire's Anger (0:55)
29. The Ancient Kindergarten (1:30)
30. Rose & Pearl On Earth (1:35)
31. Ruby Alone (2:09)
32. Ruby's Decision (0:52)
33. The Question (1:38)
34. Steven the Wedding Planner (0:41)
35. I Now Pronounce You Garnet (3:45)
36. The Crystal Gems VS Blue Diamond (2:18)
37. Inner Mind / I Am Pink Diamond (4:08)
38. Diamond Reunion (1:48)
39. Healing Nephrite (1:12)
40. Launching the Legs (0:53)
41. The Pebbles (0:50)
42. Yellow Diamond's Sauna (0:56)
43. Blue Diamond's Onsen (1:48)
44. Steven and the Wolf (0:56)
45. Homeworld Waltz (1:35)
46. The Ball / Alone Together (Reprise) (1:47)
47. Watermelon Steven's Adventure (1:58)
48. I'm Not Sorry (1:58)
49. Blue Diamond's Remorse (0:51)
50. Confronting Yellow Diamond (2:47)
51. Yellow Diamond's Sorrow (0:53)
52. Falling! / Smoky Quartz (1:31)
53. Encouragement (Steven & Pearl's Fusion Dance) (0:41)
54. Rainbow Quartz 2.0 / We Fused! (0:47)
55. Integrity (Steven & Garnet's Fusion Dance) (0:46)
56. Sunstone (1:40)
57. Unity (The Crystal Gems' Fusion Dance) (0:42)
58. Obsidian (3:02)
59. White Diamond (6:25)
60. Steven Meets Pink Steven (3:03)
61. Everything's Pink (2:09)
62. The Return Home (1:50)


He yells at Daffy to stop the onslaught of spectacle, and to simply let him see what the kid can do.
Concept art of Mickey from early 1928; the sketches are the earliest known drawings of the character, from the collection of The Walt Disney Family Museum.
This was a dollar I think. I could not imagine it would be any more. I also think it was the semi-offensive name of the singer that made me buy this.
He starts to sing Laugh, Clown, Laugh and then follows suit, laughing maniacally and adding his trademarked leaps and "hoo-hoos" into the mix.
Tickets were available only to those who bought War Bonds. Former New York governor Al Smith and his wife are in the horse-drawn carriage.


Information about CSH from the state of Tennessee's website.
Our mission for Coordinated School Health of Dyer County is to emphasize the development of the "whole child" in our educational process and community. Coordinated School Health is designed to connect the child's health (physical, emotional, and social) with education. This approach improves students' health and their capacity to learn through the support of families, communities, and schools working together!
The Children of Dyer County are our future!
If you would like to be a part of a healthy school team or offer input regarding our wellness policy/wellness plan, please contact the office of Coordinated School Health.


Reese Witherspoon's Draper James for Nordstrom Fashion, Decor Must Haves!
Reese Witherspoon's Draper James for Nordstrom Fashion, Decor Must Haves!
I have long been a fan of actress/designer Reese Witherspoon. I love all of her movies, especially "Just Like Heaven", "Legally Blonde", "Sweet Home Alabama" and don't get me started on HBO's "Big Little Lies" – I was hooked! I'm also a huge fan of her fashion/decor line "Draper James" which she named after her grandparents and was inspired by her Southern roots. I've featured the brand a few times on the blog, and was so excited to see that Draper James for Nordstrom recently launched. Have you had a chance to check it out? The dresses, tops, and home decor items are all absolutely gorgeous, chic, and Southern inspired. I want everything!
Since Reese Witherspoon's Draper James for Nordstrom line is so amazing, today I'm excited to share a few fashion and home decor favorites you're sure to love (and would also make great gifts for summer).
Obsessed with this gorgeous gingham dress for spring and summer!
Fun gingham check print romper for spring and summer!
It's no secret….ruffles are an absolute must in 2017! This fab ruffle sleeve tee comes in three colors and is absolutely perfect for spring, summer and fall.
Love this trendy scallop blazer to pair over your favorite tops, shirts and blouses this spring and summer!
Obsessed with the Draper James Rosie peplum tops in Carolina blue, and in white! They're absolutely perfect for spring and summer. Don't you just love the pompom trim? So chic!
Fun Draper James for Nordstrom skirts and shorts!
These cute shorts with a sash belt (and bow detail) come in willow white or nassau navy! Don't you just love them? They're absolutely perfect for summer!
These super popular sunglasses come in quite a few different colors for spring and summer!
Fun vintage inspired cherry/gingham check placemats!
Love this cute cherry/gingham check print "Pretty Please, With A Cherry On Top" apron!
These are just a few of the trendy Draper James for Nordstrom fashion and home decor must haves available now! Be sure to head over to the Nordstrom website for even more great items you'll love from Reese Witherspoon's gorgeous collection inspired by her Southern roots and her grandparents Dorothea Draper and William James Witherspoon.
Shop White Bikinis Bottom, Candles, Printed Pants, Fashion Jewelry and more. Get this widget.


This chapter examines how the larger political context and policies enacted at different points in American history have affected the questions education researchers asked and answered. The authors argue that while education researchers are often quick to consider how their research should shape policy, they are less likely to contemplate the possible effect of policies on their scholarship. To examine whether the policy-research relationship is indeed bidirectional, the authors conducted a thorough content analysis of six of the most prominent education research journals, some of which date back to the late 19th and early 20th centuries. The goal was to consider how shifts in racial politics and educational policies may have influenced what was studied, particularly research that examined the role of race and ethnicity in education. The authors looked for shifts between education research examining race and education within a broader social context and research focused on the personal and familial deficits of individual students or families. They argue that if these shifts in research are somewhat synchronized with shifts in racial politics and policies in the United States, this is a potential indicator of the impact that the larger political milieu may have had on education research over the last 100 years. Consideration of this research-policy relationship may raise the awareness of education researchers in terms of the origins of the questions they will ask and answer in the American Educational Research Association's second century.


text:
Handicappers' Blog (12 February)
The head handicappers at the BHA review the pick of the recent action from Newbury's Betfair Hurdle day which also featured the Denman Chase and the Game Spirit Chase.
CONEYGREE CONVINCES
When Coneygree beat Dell' Arca in November in the Grade 2 Berkshire Chase at Newbury, my colleague Mark Olley was impressed enough to allocate him a 147 performance figure, the same as his hurdle rating, writes Phil Smith.
It is very rare that a 140 hurdler can replicate that level in its first chase but the time was excellent and both Dell' Arca (over hurdles) and the third horse Horatio Hornblower subsequently confirmed the form.
After Coneygree's win in the Kauto Star (Feltham) Chase at Kempton on Boxing Day, I wrote that I did not know what rating to give him as the race fell apart, but that the time compared well with that of Silviniaco Conti. I admitted that I might have been 9lb too low. The reality is that I was probably more like a stone too low.
After Saturday's win in the Betfair Denman Chase I am totally convinced. Both Houblon des Obeaux and Unioniste have solid handicap form against established mature 3m chasers and they were blown away in a stunning time. For me it was the best performance at 3m by a novice since Gloria Victis and I now have Coneygree on 166, which was the mark allocated to Gloria Victis after he won the Racing Post Chase in February 2000.
Yes, better than Denman as a novice, whose highest rating was 161 after he won the 2007 RSA Chase, which may well be Coneygree's next race.
So what can beat him if he does go there? Possibly King's Palace who remains on 156 after a marginally disappointing run at Newbury - he ran about 5lb below his best. He is clearly better than that. He has also run over fences at Cheltenham whereas Coneygree has not.
Apache Stronghold, Valseur Lido, The Young Master and Don Poli, who are all over 150, make this year's renewal of the RSA look a potentially vintage one at this stage. Should Coneygree head for the Gold Cup, however, the benchmark is set at 174, courtesy of Silviniaco Conti.
MR'S MANNING UP
Saturday's Game Spirit Chase lost its principal player when reigning champion two-miler Sire de Grugy, back from his injury-enforced absence, departed at the third fence from home, writes John de Moraville.
It was too far out to gauge how the 172-rated favourite, who had also clouted the previous obstacle, would have fared. But the race did confirm that the quirky but hugely talented winner, Mr Mole, remains firmly on the upgrade.
Despite shying away from the tape and losing ten lengths at the start, this thirteen-length defeat of Castleford Chase winner Upsilon Bleu represents another career-best performance from Mr Mole, promoting him to a new mark of 165.
By adding Newbury's Grade 2 feature to his victory in last month's Sandown handicap, Mr Mole was emulating the double achieved by his stable's former super-star Master Minded seven years ago.
Master Minded (who, incidentally, had earlier unseated in the same graduation chase that Mr Mole won at Exeter in December) went on to annex the 2008 Champion Chase by a blistering nineteen lengths. It's hard to envisage Saturday's winner basking in victory at Cheltenham come March 11th but ratings suggest that he has every chance of making the frame.
The top 2m performance of the season so far was recorded by Mr Mole's much-improved stable-mate Dodging Bullets, whose 171 in Ascot's Grade 1 Clarence House Chase last month was gained at the expense of the returning 2013 champion Sprinter Sacre (168).
Back from an even longer absence than Sire de Grugy, it would be unfair to expect Sprinter Sacre to ever match his record-breaking achievements (and rating of 188) of two years ago.
But with that Ascot race under his belt, the Henderson star is the bookmakers' favourite to emulate the mighty Moscow Flyer (2003 and 2005) by regaining the 2m chase crown in four weeks' time in what promises to be a captivating showdown.
VIOLET LEADS THEM A MERRY DANCE
Explaining all of the vagaries of our wonderful sport to a casual observer can be tricky, but the glorious uncertainty that is so addictive to those of us who love this game was typified by Saturday's events at Newbury, writes David Dickinson.
No sooner had our most successful ever jockey announced his retirement than his Betfair Hurdle mount Goodwood Mirage pulled like a train and then dumped the 19-time Champion on the turf at the very first flight. Such things might test the resolve of us normal mortals to carry on to the end of the season but that would be to judge AP McCoy by the standards that we would use for others.
With Sire de Grugy having fluffed his lines in the Game Spirit, the Gary Moore team were bound to be feeling a little deflated going into the Betfair Hurdle but Violet Dancer, in cheekpieces first time, probably courtesy of a long odds-on defeat on the all-weather in his preparation run for this, made the best of a standing start to give the yard a third success in the race.
Unlike the Greatwood earlier in the season where Garde La Victoire was able to wait in front as there was no pace in the race; there were any number of possible front runners on offer on Saturday. The guaranteed fast pace materialised but the perceived wisdom that this would help the hold-up horses on tacky ground did not. The clue from the earlier races was probably when Bygones Sovereign was allowed a clear passage at the head of affairs in the 3m handicap hurdle on the card and was never to be seen again.
Establishing a level for this race was not straightforward, the first three having finished some nine lengths in front of the fourth but with legitimate excuses for the fourth, fifth, sixth and seventh in my view. Calipto got a far from trouble free passage; Jolly's Cracked It was last going down the back straight in a race with a prominent racing bias; Arzal was probably hoping to help set the pace but was never quite in a position to do, also almost brought down at the last flight in the back straight, where Forced Family Fun was also impeded. The last-named was still there with a place chance at least, when a serious error two from home saw him briefly on the chase course.
I used Cheltenian to establish the level of rises for the first three, leaving him still with a pull with his Aintree conqueror of last April, Clondaw Kaempfer, by raising him 5lb to 146. That sees the third Activial going up 4lb to 147, a mark he might easily have run to in the Ladbroke but for a crucial mistake at the second last. The winner Violet Dancer goes up 9lb to 141, as most of the way up the home straight he looked like winning by more than the eventual three-length margin.
Some of the training plaudits for the weekend must go to Richard Phillips, whose eleven-year-old Temlett defied a 1,100-day absence to win a Warwick handicap hurdle. However, there is a reason why most handicappers have a string of anoraks hanging up in their hallways. This is the same Temlett who made all in a Cork handicap in March 2011 having not previously run since 2008. He even made a mistake at the third last that day, a feat he repeated on Saturday. He was heavily backed at Cork but was seemingly sent off relatively unconsidered at Warwick.
Handicappers Blog Archive
Sovereigns reigns supreme in July Cup
Royal Ascot 2019 review
Thursday, 27th June 2019
Seventh heaven for O'Brien
Tiger the best National winner of recent times
Aintree National meeting
Al Boum Photo lands Gold Cup for Mullins
Thursday, 21st March 2019
Cyr the best name
Clantastic King George
Thursday, 3rd January 2019
17:25 - Haydock, 1m - 7 run
17:35 - Kilbeggan, 2m 4f - 9 run
17:45 - Newmarket, 1m 2f - 7 run
18:00 - Cabourg, 1m 5½f - 15 run
18:00 - Hamilton, 1m ½f - 8 run


text:
Artificial Intelligence, Content Strategy, Digital Experience, ecommerce, GDPR, Google, Joe Pulizzi, machine learning, Personal Data, personalization
It is no secret that personalization has been a huge topic not only in the tech industry but also in any industry that concerns customer experience. For years, we have discussed the benefits of delivering personalized content and experiences but personalization technology had generated more discussion than actual results. In recent years, though, the technology has finally matured and caught up. Now, machine learning algorithms are injected into almost every platform to predict human intentions based on what the platform has learned from behavioral and historical data.
As you may already know, we as the CMS-Connected team often attend some significant tech providers' annual user conferences to capture the buzz of their events through our interviews with the attendees. No matter if the person we speak with is a user or a technology partner; everyone has been stressing the importance of the same functionality of web content management systems: personalization algorithms.
First, for those who are not very familiar with how they work; it is essentially filtering information to the extent that is deemed relevant to the user, based on a list of criteria that are set primarily for users' technological convenience. The number of clicks and viewing time are the most common factors while determining the list.
Despite the buzz around such personalization tools and algorithms, end consumers seem to have a different view on personalized experiences than what the tech industry has been fixated on. To put this into perspective, I'd like to share a little story where I had my "aha" moment during a conversation with a friend who has nothing to do with the tech industry other than being a regular consumer. He said: "I don't want my Facebook feed to consistently show me only what 10 out of my 1300 Facebook friends have been up to lately. Same thing with Instagram. I don't want a platform to decide what I want to see on my behalf without even running it by me. I might prefer to see the content only based on a chronological order, rather than based on what Facebook thinks of what I'm interested in."
In my view, he was right because what he was saying is that relevancy is such a relevant concept. We know those algorithms pick up a pattern based on many interactions - which is an amazing technology but personalizing an experience is one thing, controlling or even worse, painting a consumer into a corner is another. From where I see it, some brands have lately been mixing up these two significantly distinctive concepts while executing their marketing campaigns and tailoring digital experiences.
Given there has been an ongoing explosion in the volume of content, data, devices, and channels, having this sort of algorithm at our disposal comes in handy in the process of searching for the particular information we want to learn about. While sometimes this functionality makes us more productive, it appears that such productivity may come at a price because it also traps us into a "filter bubble." Now I am not trying to diminish the power and benefits of machine learning technology but the dangerous unintended consequence occurs when we are open to be exposed to information that could challenge or broaden our worldview. After all, getting all sides of information is essential to learning, making decisions, and forming an opinion.
When we look at this matter from a content creators' perspective, the competition for people's attention has never been more fierce. This topic has been discussed as a whole in one of my recent articles titled "How to Crack Consumer Code in the Attention Economy" but in a nutshell, the demand for consumer attention is rapidly increasing while the supply of consumer attention seems to remain the same (scientifically, it is not proven that our attention capacity is expanding within). This situation drives marketers and content creators to take advantage of consumers' obsession with their mobile devices and other online activities. While doing so, they often implement personalization algorithms to cut through the noise.
Because personalization is very powerful, it makes or breaks it for businesses. In fact, a recent research commissioned by Sitecore and conducted by Vanson Bourne found that 80% of 680 marketing and IT decision makers place a high priority on personalization while 96% of 6800 customer respondents believe many brands are in fact, providing "bad personalization." Obviously, many struggles to manage and mine customer data to both inform customer experience strategies and deliver on the promise of personalization. To go in-depth on these interesting findings and more, I sat down with Joe Henriques, Vice President of Innovation at Sitecore during Sitecore Symposium 2017 in Vegas. The full interview may be viewed, here. However, one of my biggest takeaways from the conversation was that brands should approach to personalization in a holistic manner. Their method should be almost like "utilizing a digital body language."
Do Personalization Algorithms Risk Narrowing Our Minds?
Google's CEO, Eric Schmidt, had once said about tailored online services: "The technology will be so good, it will be very hard for people to watch or consume something that has not in some sense been tailored for them." Now, it is exactly what's happening. As innovative as they are, personalization algorithms risk narrowing our minds and limit exposure to attitude-challenging information. It causes a dangerous unintended outcome which is creating a static and ever-narrowing version of people by taking them down a road of confirmation bias where what they have happened to click in the past shapes what they see next.
There is a fabulous TED Talk on this very topic delivered by Eli Pariser as he brilliantly explains because of personalization how we get trapped in a "filter bubble" and don't get exposed to information that could challenge or broaden our worldview. I highly recommend you spend 9 minutes hearing what he has to say.
Brand Journalism Brings Editorial-Like Responsibility Within
In recent years, marketers have shifted their focus from the ad-driven business model, where the only thing that matters is whether a web page stayed open long enough to make money, to content marketing, where marketers focus on cultivating a meaningful engagement with the target audience through interactive content. This extremely successful and long-lasting impact of content marketing, further drove brands to act more like publishers. In other words, marketers have become "brand journalists." They are tasked with bringing forward valuable, informative, and educational content, instead of pushing products and services onto consumers. As the Godfather of content marketing, Joe Pulizzi, said on the Magnificent Marketing Podcast, "all businesses must think of themselves as media outlets. Retail, lawn care, accounting, healthcare, insert-your-industry-here. The goal is the same: you want to deliver relevant and valuable information to your audience."
This shift toward creating content in an editorial manner gives marketers and content creators not only a new title but also brings editorial-like responsibility towards the public. In fact, based on the principles of Responsible Research and Innovation to the design, development, and appropriation of technologies, content creators and technology providers must have a corporate social responsibility to promote a healthy democratic discourse. We can also throw governments into this mix as they certainly need to step in and regulate online information sources from social networks to technology platforms built on machine learning and artificial intelligence.
Whether a website hosts third-party content like Facebook, it literally creates content like CMS-Connected, or technology companies provide content creation tools including algorithms, they should be liable to some sort of media regulations and liberal laws. Facebook Founder and CEO Mark Zuckerberg reportedly said during a live Q&A session in Italy that Facebook is a tech company, they are not a media company as they build the tools, not produce any of the content. In my view, just because an algorithm makes decisions based on user-derived data, doesn't mean the algorithm creators are not responsible for the outcome. Fortunately, the Reuters Institute stepped in and challenged Zuckerberg's statement with its findings. The institute found that digital intermediaries act as gatekeepers who exert editorial-like judgments to varying degrees as they "sort and select content to provide news which is of 'relevance' to their customers, and decide which sources of news to feature prominently." Thereby they do affect the nature and range of news content that users have access to, hence, "… they do perform important roles in selecting and channeling information, which implies a legitimate public interest in what they do."
Elon Musk, the CEO of SpaceX and Tesla, also expressed his longstanding concerns about the potential danger of artificial intelligence, warning governments at a meeting of U.S. governors this year, saying: "AI is a rare case where we need to be proactive in regulation instead of reactive because if we're reactive in AI regulation it's too late." He believes that by manipulating information such as doing fake news, spoofing email accounts, and doing fake press releases a war can begin.
As we also reported this past Friday, Marc Benioff is the latest in a long line of executives and other elites in the tech industry who have raised concerns about the dangers of technology products and services. Simultaneously being a successful CEO and socially responsible tech leader, he quite rightfully criticizes the ignorance of other CEOs and entrepreneurs in the tech industry: "I mentor a lot of CEOs and entrepreneurs and when I see that product is the number-one thing, the only thing that matters, that's a real red flag."
From a content marketing perspective, providing a personalized experience is a double-edged sword. On one hand, providing personalized content and search contributes to the efficiency of content consumers, on the other hand, the results are narrowed down without users' knowledge, awareness, and consent. There certainly are times when consumers would like to see the narrowed down options for the sake of saving time. This approach works perfectly especially in the scenarios when people have a sense of what they want and would like to get straight to the point. There are also times when they want to know what the virtual world has to offer to them.
As much as we consumers like personalized experiences and tailored search results, we need to know what our options are. In fact, 77% would trust businesses more if they explained how they're using personal information to improve their online experience. With this in mind, not to contribute to a sense of distrust, brands may take an approach where they explain why the specific content or product is being recommended. Amazon, for instance, provides a button saying "Why recommended?" alongside its personalized recommendations. When a visitor clicks on that the platform shows the triggering factors such as previous purchases or information given to them and more importantly, it also allows them to opt to not include a specific purchase or information for the future recommendations.
As HSBC's former head of marketing in EMEA Philip Mehl had once said: "Marketing used to be a creative challenge but it's a data challenge now." To me, this type of approach that Amazon has taken is not only fair and valuable for consumers but also it establishes brand's good intentions and skills in their personalization marketing strategy in such an organic way.
I understand that the engineers who created personalization algorithms might not anticipate its outcomes. However, this situation shouldn't result in the lack of transparency towards users to the extent that the options and information consumers are exposed to go beyond their ability to control. As digital transformation continues to engulf everything in its path, opportunities and challenges will equally get off the ground. These ethical disruptive outcomes are one of those serious challenges for society as due to their power, they go beyond the intended scope of use. Keep this in mind, technology providers, especially, social media companies, cannot simply absolve themselves of any responsibility in this area.
At the end of the day, by its very nature, the act of personalizing necessarily brings forward some content while excluding other content from view. We all understand that nature, and it is somewhat okay as long as a consumer says so. Otherwise, it means dictating and controlling rather than liberating. Therefore, regulations such as the General Data Protection Regulation (GDPR) going into effect in May will result in greater trust and greater transparency as this particular legislation gives brands orders to collect explicit consent from EU residents to store and use any data. If you're in a U.S.-based multinational enterprise doing business in the EU but not complying with the requirements, you will, as well, face hefty fines of up to €20 million or 4 percent of global annual revenue (whichever is greater). You can learn more about how to get ready, here, but I believe that whether it's GDPR, PIPEDA, ePrivacy Directive, or AdChoices, privacy laws and programs around the world are necessary to truly regulate the internet and banish the doubts coming from a somewhat distrusting consumer base because that way, not only will they be informed about how brands actually collect their data and what it will be used for but also they will be empowered by having an option to choose to have personalized experiences based on that data or experiences without being filtered.


text:
Hartford School Board Member Resigns
A member of the Hartford School Board abruptly resigned Thursday after he was involved in multiple clashes during Wednesday night's meeting.
Paul Keane, a former English teacher at Hartford High and 24-year veteran of the district, resigned in an email sent to School Board Chairwoman Lori Dickerson sent at 3:18 a.m.
According to the Valley News, Keane cited both "procedural baloney and petty politics" in his email as reasons for his resignation. During a regularly-scheduled school board meeting hours earlier, Keane abruptly left after a second-and final clash with fellow board members.
The first exchange came when Keane and a fellow board member hoped to discuss a new code of conduct policy the two had not yet signed. Dickerson chose to table the matter, though, to the dismay of Keane.
And finally, Keane loudly left the meeting after he objected to verbiage in discussing the district's finances he found confusing. Dickerson accepted Keane's resignation yesterday morning.