text:
namespace viewer {
namespace detail {

template <typename KeyType, typename ElementType>
class FrameTree {
 public:
  FrameTree(const KeyType& root_id) {
    root_id_ = root_id;
    adjacency_[root_id];
  }

  struct Edge {
    KeyType child_key;
    SE3 parent_from_child;
  };

  void add_child(const KeyType& key, const Edge& edge, const ElementType& child) {
    // TODO: Come up with a better way to support multiple references to the same mesh
    // Right now, we pass through the same submesh many times

    // assert(adjacency_.count(edge.child_key) == 0);
    adjacency_.at(key).push_back(edge);
    elements_[edge.child_key] = child;
    adjacency_[edge.child_key];
  }

  using VisitorFunc = std::function<void(const KeyType& parent_key,
                                         const ElementType& parent,
                                         const Edge& child_from_parent,
                                         const ElementType& child)>;
  void traverse(const VisitorFunc& visitor) const {
    std::stack<KeyType> to_visit;
    to_visit.push(root_id_);
    while (!to_visit.empty()) {
      const KeyType parent_key = to_visit.top();
      to_visit.pop();

      const auto& parent = elements_.at(parent_key);
      for (const auto& edge : adjacency_.at(parent_key)) {
        const ElementType& child = elements_.at(edge.child_key);
        visitor(parent_key, parent, edge, child);
        to_visit.push(edge.child_key);
      }
    }
  }

  const std::map<KeyType, ElementType>& elements() const {
    return elements_;
  }

  const std::map<KeyType, std::vector<Edge>>& adjacency() const {
    return adjacency_;
  }

 private:
  KeyType root_id_;

  std::map<KeyType, ElementType> elements_;
  std::map<KeyType, std::vector<Edge>> adjacency_;
};

}  // namespace detail

class SceneTree final : public Primitive {
  using KeyType = std::string;

 public:
  SceneTree() : tree_("root") {
  }

  void draw() const override;

  void set_world_from_root(const SE3& world_from_root) {
    const std::lock_guard<std::mutex> lk(draw_mutex_);
    world_from_root_ = world_from_root;
  }

  void add_primitive(const KeyType& parent,
                     const SE3& parent_from_child,
                     const KeyType& child_key,
                     const std::shared_ptr<Primitive> primitive) {
    const std::lock_guard<std::mutex> lk(draw_mutex_);
    tree_.add_child(parent, {child_key, parent_from_child}, primitive);
  }

  template <typename PrimitiveType, typename... Args>
  std::shared_ptr<PrimitiveType> add_primitive(const KeyType& parent,
                                               const SE3& parent_from_child,
                                               const KeyType& child_key,
                                               const Args&... args) {
    const std::lock_guard<std::mutex> lk(draw_mutex_);

    auto ptr = std::make_shared<PrimitiveType>(args...);
    tree_.add_child(parent, {child_key, parent_from_child}, ptr);
    return ptr;
  }

 private:
  void traverse(const KeyType& key) const;

  mutable std::mutex draw_mutex_;

  using FrameTreeType = detail::FrameTree<KeyType, std::shared_ptr<Primitive>>;
  FrameTreeType tree_;

  SE3 world_from_root_;
};
}  // namespace viewer

redpajama_set_name: RedPajamaGithub


This image gallery named as Waterproof Fabric Shower Curtain Home The Honoroak might be ideal solution for your decoration. As the author has insert this image into Elegant White Shower Curtains post section, would ease you to find the perfect match of you decor desire.
It does not necessarily mean that people cannot make use of the custom made vanity cabinet whenever they've got the shower with substantial space. They could explore the wide likelihood of this dressing table cabinet which can aid them create the shower which is suitable the many with their expectation and dream.
The iron frame wrapped in pure abaca rope creates this type of shore chandelier appears easy but nevertheless magnificent. In addition, it feature using eight pairs of bulbs. Thus, within this age you are able to mix and fit the chandeliers with your shower concept. Most interiors designer create various design of chandeliers for your beautiful shore shower themed. So, decide the shower themed to choose the proper waterproof fabric shower curtain home the honoroak.
Shower vanity cabinets give a simple entry for property owners for everything kept from the shower, even the cupboards are this kind of gold chance to do home organization and decrease clutter. Both you obtain the cabinets online or offline, they always come with widths ranging from 18 inches to 48 in.. They are also 6″ in increments. If you would rather purchase waterproof fabric shower curtain home the honoroak at stores that are online, you want to visit stores providing shower dressing table in number of fashions, styles, and measurements.
Overlook your bathtub when you have shower in your smaller shower. Use your tubing walls to generate walkin bathtub more spacious. Stretches round the shower rear from the smallest wall, and this walkin bath offer much of pampering look without overwhelming your space. Ongoing with marble shower wall and tile floors build cohesive scene that A DD more space appearance. You are also able to create greater dimension with seamless glass enclosure. The translucent barrier in waterproof fabric shower curtain home the honoroak can make space stretching illusion.


text:
Summer Fancy Food Show, Part I
Today was day one of the Summer Fancy Food Show in New York City. I wish I'd have taken pictures yesterday when our sales manager Joanne and I were there to set up and hand out ad boards -- it's like being backstage at a musical or play. You walk the aisles (very carefully! You don't want to get run over by a an electronic cart or cherry-picker!) and see booths in every stage of set-up. As of 12:30, there were booths complete with product displayed, counters draped and ready for the show opening, and there were booths that were still empty, except for a few boxes and crates marked with the company name. Boxes and storage crates of every size and shape were piled around the show floor -- I think it takes seeing the show in that stage to really get an appreciation of what goes into each and every booth on the floor.
Anyway, the first day of the show was great! I made the mistake of starting out up on the first floor, just like everybody else and their mothers. I wandered the 400-1000 aisles for a bit before heading downstairs. Here's a few of the companies I came across today:
The Cooperstown Cookie Company offers baseball-shaped shortbread cookies in officially licensed Major League Baseball packaging. New this year are the Baseball Hall of Fame vintage tins and classic Stadium Tins, including a favorite from my hometown, Wrigley Field. Now baseball fans can hang in through the seventh inning stretch with the Tube of Bunts, a cylindrical tin featuring logos from teams such as the Boston Red Sox, the New York Yankees and of course, the Chicago Cubs. More info at www.cooperstowncookie.com.
New to the Fancy Food Show, Somebody's Mother's Chocolate Sauce (www.somebodysmothers.com) was sampling their Chocolate Sauce, Caramel Sauce (nominated for a 2009 Sofi award) and White Chocolate with Pear William Sauce, which they sampled drizzled over some vanilla ice cream -- delish! Lynn Lasher and her three children, Reese, William and Hayden, were were manning the booth and dishing out samples of all three sauces. Good luck on the nomination, Lasher family!
Local brownie bakers, Mari's of New York (www.marisny.com) was also at the show, featuring "simply marvelous" brownies. These moist little bites come packaged in a coral gift box that you might just see in an upcoming Fancy Food gift guide. The company offers seasonal brownie offers, such as Holiday Cheer and L'Orange.
Tune in tomorrow for more updates from the 2009 Summer Fancy Food Show!
Posted by Fancy Food & Culinary Products blog at 10:33 PM |
Labels: brownies, cookies, Cooperstown Cookie, dessert, Mari's, Somebody's Mother, Summer Fancy Food Show
Editor's Choice: Funky Chunky Inc.
It's been busy over here at Fancy Food & Culinary Products while we try to get ready for the Summer Fancy Food Show. I've got an extensive list of booths to visit and people to see. Much of my time will be spent sampling new products and talking to owners of new companies, but there are some companies that I will always take a few moments to visit, even if they aren't introducing any new flavors. One such company is FunkyChunky Inc.
Mother-daughter team Ronni L. Feuer and Erica Feuer-Kopilenko are the masterminds behind an absolutely addictive confection that starts with buttery caramel popcorn. Then layers of milk, dark and white chocolate are drizzled on and glazed whole almonds, pecans and cashews are thrown into the mix for good measure. They also have a pretzel version, drizzling chunks of pretzel in milk, white and dark chocolate, caramel and adding pecans. I can't decide which I like better, and at shows I find myself in front of their booth, gazing over the little sample cups, torn between taking the biggest sample I can find and the hard-learned wisdom of pacing with samples at the show. As it usually happens, this is a moment where caution is thrown into the wind and I end up trying whatever they're offering.
Added incentive for stopping by the FunkyChunky booth however comes in the form of a bar. This summer, the company is launching a brand new line of chocolate bars in four flavors: Chocolate, which blends milk chocolate with dried berries, graham crackers, pecans, crispy rice and chocolate sandwich cookies. The entire bar is then drizzled with white chocolate; Licorice, which packs dark chocolate with chewy caramel and soft red licorice pieces, then is finished with a white chocolate drizzle; Peanut Crunch, jammed with salty, fresh-roasted peanuts and crunchy chocolate puffs smothered in milk chocolate, topped with drizzles of chocolate and peanut butter confection; and Graham Cracker, which melds dark chocolate, fluffy marshmallows and caramel together, then tops the combination with a graham cracker drizzled with dark, milk and white chocolates. Is your stomach growling yet?
The new bars are packaged in a clear acetate bag topped with a black bow and hang tag to best display the premium ingredients used in the small-batch, handcrafted confections. If you're going to the Summer Fancy Food Show, these delightful new products can be found at booth #4734. Otherwise, check back with the website, www.funkychunkyinc.com, after July 1, which is when the bars will be available to ship.
-Stephanie
Editor's Choice: Peanut Shop of Williamsburg
For me, one of the most exciting parts of eating is discovering a food I previously disliked – or at least wasn't over the moon for – can be new and interesting. I experienced this when I opened up the can of Praline Glazed Georgia Pecan from The Peanut Shop of Williamsburg, made using a traditional Southern recipe. I was happy to discover that the nut I'd long associated with a scene from When Harry Met Sally was in fact light, sweet and delicious.
Most of my run-ins with pecans are limited to dessert, and I can imagine the Praline Glazed Georgia Pecans as a delightful addition to vanilla ice cream. However, what I like most about these pecans is that I'm able to enjoy a handful and they're delicious without anything added. Not too sweet and not dry either. Chopped up, the Praline Pecans can add a sweet topping to a salad served with a light vinaigrette.
The company doesn't limit itself to flavors from the South. The Peanut Shop gets creative with its Yin & Yang Peanuts, a mix of honey roasted peanuts and wasabi peanuts. And, I'm pretty pumped about the New Pecan Trio. With Roasted & Salted, Praline Coated and Sugar & Spice in one 18-oz. tin, it's a three-way combo of sweet and salty delights.
To see more of The Peanut Shop of Williamsburg's nutty products, candy and sauces, check out www.thepeanutshop.com.
I'd like to welcome Mary to the staff of Fancy Food & Culinary Products! Mary Gerlach, editor of Fancy's sister publication Baby & Kids will now also be contributing to Fancy Food & Culinary Products. Nice job on your first Editor's Choice, Mary!
Summer Fancy Food Show Sofi Award Finalists
Finalists for Outstanding New Product 2009 and Outstanding Product Line
The judging is now complete to select Silver Finalists in all 33 categories of this year's sofi awards for the outstanding specialty foods and beverages of 2009. This year's panel of nine judges -- from The Pasta Shop and The Fresh Market to Pier 1 Imports, Meijer and the Myriad Restaurant Group -- met last week to select finalists for Outstanding New Product and Outstanding Product Line. Gold award judging will take place at the Summer Fancy Food Show. The 33 winners will be crowned at a special ceremony June 29 hosted by noted chef Ming Tsai.
Finalists for Outstanding New Product 2009:
Belle Chevre - Belle & The Bees Breakfast Cheese
Chex Finer Foods - Laurel Hill Tortilla Chips - Olive and Caper
Clotho Corp. - Haddrell's of Cambridge Rewarewa Honey
European Imports Ltd.- Cucina Viva Roasted Red Tomatoes
Grafton Village Cheese Co. - Grafton Duet
Koppert Cress USA - Mustard Cress Single Retail Unit
New England Herbal Foods - Danielle Fruit Chips - Roasted Coconut
Sonoma Syrup Co. - Acai Black Currant Superfruit Syrup
The Gracious Gourmet - Dilled Carrot Tomato Tapenade
Theo Chocolate – Theo Limited Edition Collection
Vinnedge Distributing Inc. - Vergnano Italian Organic Blood Orange Soda
Finalists for Outstanding Product Line:
Bellwether Farms – Bellwether Farms
De Medici Imports, Ltd. – A L'Olivier
Sarabeth's Kitchen – Sarabeth's Product Line
Silver Moon Desserts – Silver Moon Ice Cream and Sorbet
The Rogers Collection – Les Moulins Mahjoub
This year's Sofi competition was robust. Members entered 1,997 products across all 33 categories, including 414 products for Outstanding New Product and 172 for Outstanding Product Line.
Don't miss a chance to cheer for your colleagues at the Sofi awards ceremony at the Summer Show. To purchase tickets to the ceremony, visit www.fancyfoodshows.com. This event is an "education session."
Organized Retail Theft On the Rise
NRF Organized Retail Crime Survey Finds Criminals View Global Recession as Opportunity to Abuse Retailers and Consumers
--Organized Retail Crime Activity Jumps by 8%, According to NRF Survey--
Washington, June 10, 2009 – As another illustration of the wide effect of the down economy, retailers and consumers are increasingly being victimized by organized retail crime groups. According to NRF's fifth annual Organized Retail Crime survey, nine out of ten retailers (92%) report that their companies were victims of organized retail crime during the past year, up eight percent from 2008. Nearly three-fourths (73%) of retailers also reported the level of organized retail crime activity has increased over the past 12 months, an increase of 11 percent from 2008. Loss prevention executives from 115 companies, including department, discount, drug, grocery, restaurant and specialty retailers, completed the survey last month.
"The unfortunate economic events of the past year have played an intricate role in how criminals continue to rip off the retail industry," said Joe LaRocca, NRF Senior Asset Protection Advisor. "Organized retail crime rings have realized that tough economic times present new business opportunities by stealing valuable items from retailers and turning around to sell the merchandise to consumers looking for bargains."
Even with the economy forcing retailers to cut staff and do more with less, 42 percent of retailers say their company is allocating additional resources to address organized retail crime. According to the survey, the average retailer spends approximately $215,000 annually just on labor costs to fight organized retail crime. Some retailers surveyed spend far more, with six percent of respondents spending more than $1 million dollars a year to employ loss prevention executives devoted to organized retail crime.
The fight against organized retail crime would be futile without the support of top management. According to the survey, nearly half (49%) of respondents believe senior management in their company understands the seriousness of the issue. For the first time in the survey's history, NRF also asked loss prevention executives whether they felt law enforcement had a firm grasp on the issue; 38 percent agreed that police officers, detectives and federal law enforcement understood the complexity and severity of organized retail crime.
Thanks to the new partnerships formed with Federal and local law enforcement officials, retailers have had some success identifying stolen merchandise or gift cards at physical fence locations such as pawn shops and temporary stores (60%) and through online e-fencing operations (60%), where stolen merchandise is sold through online auction sites.
Organized retail crime is not only an isolated problem in a handful of areas across the country. According to the survey, a staggering 72 percent of retailers have identified organized retail crime syndicates who are exporting goods outside of the U.S. or across state lines. Additionally, 28 percent found that criminal groups under current investigation have connections to street gangs with international connections.
When asked how they would rank organized retail crime as a threat to their company, nearly one-third (29%) of retailers gave organized retail crime a "four" or "five" rating, identifying the problem as severe or significant. On average, retailers gave organized retail crime a rating of 2.87 on a five-point scale.
NRF will address organized retail crime and many other loss prevention issues such as return fraud and counterfeiting at its annual Loss Prevention Conference and EXPO at the Los Angeles Convention Center, June 15-17. Law enforcement officials and retailers are eligible for complimentary EXPO Hall passes. Visit NRF's LP Conference website for more information.
The National Retail Federation is the world's largest retail trade association, with membership that comprises all retail formats and channels of distribution including department, specialty, discount, catalog, Internet, independent stores, chain restaurants, drug stores and grocery stores as well as the industry's key trading partners of retail goods and services. NRF represents an industry with more than 1.6 million U.S. retail establishments, more than 24 million employees - about one in five American workers - and 2008 sales of $4.6 trillion. As the industry umbrella group, NRF also represents more than 100 state, national and international retail associations. www.nrf.com.
(Press release courtesy of the National Retail Federation, www.nrf.com)
Labels: industry news, organized retail theft
Have We Caught Your Fancy?
Niman Ranch CEO Jeff Swain (with Editorial Coordinator Barbara Wujcik) holds a copy of Fancy Food & Culinary Products at a recent chef dinner at Gibson's Steakhouse here in Chicago. Niman Ranch and its family farmers raise livestock traditionally, humanely, and sustainably to deliver the finest tasting meat in the world. More information on Niman Ranch and its products can be found at www.nimanranch.com.
Labels: have we caught your fancy, Niman Ranch
Editor's Choice: Galison
As the stationery editor at one of Fancy Food's sister publications, Giftware News, I constantly receive samples of the latest designs in greeting cards, note sets and other related items. Although many of the samples in my storage cabinet admittedly go unused (because honestly, I never plan on sending a birthday card with a giant cat on the front), I did receive one item in particular that I brought home and put to use right away. I immediately saw the utility in this product, and I have no doubt that it will be a saving grace for many of your customers.
Accordion organizers from Galison, a company known for its trend-forward stationery and office accessories, are the ideal solution for savvy shoppers who are currently clipping coupons to save money on groceries and other household items. These miniature books, which retail for less than $10 each, are portable filing systems that include six divider pockets to store coupons and ads; a notepad and an elastic pencil holder are also included inside, which makes it easy to keep grocery lists and menu plans on hand while shopping.
What's even more exiting is that the hardcover organizers come in colorful patterns and designs from an array of famous artists (the organizer shown is a classic Andy Warhol option; the spine of the book even features a Warhol quotation). No longer do shoppers have to use boring, bland or flimsy plastic organizers; these sturdy little books truly bring a sense of style to the newly trendy frugal lifestyle.
To see more of Galison's accordion organizers, as well as other coordinating kitchen and office accessories, visit www.galison.com.
Labels: coupon organizer, editor's choice, gifts
Editor's Choice: Nutorious Nut Confections
This week's editor's choice comes to you straight from the pages of our July issue's Snacking All Stars feature. (Consider it a sneak peek!) The snack starts off innocently enough (after all, their tagline is "Innocently addictive"), with a mix of walnuts, almonds and pecans, but then comes the other stuff. In this case, for Cha Cha Chipotle, the other stuff includes sugar and spices, transforming the once good-for-you nut mix into an indulgent crunchy treat that is just plain good. I've got my reservations on how innocent the mixes from Nutorious Nut Confections really are, since they are so darn addictive. I was first hooked back when they were promoting their Cherry Vanilla Va-Voom, featuring cherries and just the right touch of vanilla. Since then, they have expanded the line to include Cranberry Orango Tango, Cha Cha Chipotle and Blueberry Lemon Merengue, which has been nominated for a Sofi award at this year's Summer Fancy Food Show. And of course, there's always simply the Ooo La La Original.
What's even better about these addicting nut mixes is that the company will be introducing the 2-oz. snack packs shown above at the Summer Fancy Food Show this year. This is particularly exciting for people like myself, who could take down a whole 8-oz. bag in one sitting if left unsupervised! Check out the Nutorious Nut Confections story and product details at www.nutoriousnuts.com or visit them at the Summer Fancy Food Show booth #5215.
Labels: editor's choice, NASFT, Nutorious Nut Confections, snacks, Summer Fancy Food Show
June Top Shelf Advice
What kind of staging or promotions do you create in your store?

redpajama_set_name: RedPajamaCommonCrawl


Snohomish County Executive Dave Somers. Photo courtesy of Snohomish County.
Snohomish County Executive Dave Somers has preemptively declared an emergency, effective Friday, February 8, 2019, at 8:00 am, as the community braces for what weather experts say may be a pair of powerful winter storms.
"It's a good idea to plan to stay home," Biermann said.
Snohomish County Snow and Ice Response: https://www.snohomishcountywa.gov/2113/Snow-and-Ice-Response.
What to do if the electricity goes out: https://www.snopud.com/home/powerout.ashx?p=1120.
Mill Creek Snow and Ice Route Map. Image courtesy of City of Mill Creek.


Dundalk RFC lost their third match of the season to Enniscorthy at Mill Road on Saturday afternoon.
Two of the defeats have now come in the league and they enter the Christmas break sitting in seventh position and face a relegation battle in the new year.
The league leaders, Enniscorthy also knocked Dundalk out of the All-Ireland Junior Cup recently and they produced a dominant performance here to prevail comfortably.
Mike Walls' men struggled to string consistent phases of attack together against a well-organised Enniscorthy rear-guard, despite their scrum, once again, dominating.
They fell behind in the first half and trailed by seven points at half-time. Eighteen-year-old wing Ronan Greene was the shining light for Dundalk and on debut, he scored two tries, the first coming before the break.
Kicking duties were left to Paddy Reilly on the other wing and while he missed the conversion attempt, he added to their tally from a penalty as Dundalk closed the opening period on eight points.
But a third quarter blitz proved telling in Enniscorthy's favour and entering the dying embers the Wexford natives held a 32-11 advantage, rounding off their four-try effort, with a Reilly penalty all Dundalk could muster in response.
The hosts recovered some pride before full-time. Reilly broke through for their second major with the extras attempt being successful prior to Greene making it a day to remember with his second try. The resultant conversion was off target, as Dundalk missed out on a losing bonus point.
They face Wicklow in early January where avoiding a seventh loss of the campaign will have to be the aim.


Chat with thousands of people in Maple who are online right now!
I'm a rather simple girl. Just looking for someone thats real.
funy, loves to be social, creative, makes you better on ur not so good days!
Hey! So my name is Zainy, and i'm 18 years old! i'm in Maple High School, for my last year!
Divorced 3 yrs ,looking for female friend to share life with. have 3 bdrm home in maple i lease and live alone. Fun guy to be with.


Last May, Sister Margaret McBride was "automatically excommunicated" from the Catholic community after approving a life-saving abortion at an Arizona Catholic hospital.
Now, six months later, the sister is receiving an award. Call to Action, a Catholic group that believes in non-traditional Catholic stances like female priests, gay marriage and other issues considered anathema to the doctrine, has chosen to honor McBride for her stance. "Call To Action recognizes Sister Margaret's careful work with a complex issue, her courage in a time of censorship and public pressure, and her witness to the need to stand firm in the face of opposition while striving to protect life in all its venues," a group spokesperson said.
According to the bishop in charge of the hospital, McBride's excommunication was automatic the moment she approved an abortion for a mother of three brought into the hospital with severe hypertension. The condition, which becomes more dire in pregnant women due to additional blood in the body and other physical stresses, was already becoming unmanageable in her 11th week of pregnancy.
The hospital doctors decided to terminate the pregnancy, which Sister McBride agreed to as the religious representative involved. But because the mother's life wasn't in direct danger at that moment, the termination was considered preventative and hence elective. Abortion can only be performed in the Catholic faith if the mother's life is in direct peril and the fetus is lost during intervention to save her life.
McBride reportedly has been allowed back into the church, having made her confession, which absolves her of the sin. In the meantime, the church withdrew its Catholic sponsorship of the hospital. Perhaps now women might have a chance to terminate a pregnancy before they put their own lives at risk.
Monica K nailed it. I am an ex-catholic notice the EXpart and proud to have left for good.
Such a shame that she'd *want* to go back into the belly of the beast. She confessed and was absolved of the "sin" of allowing doctors to save a woman's life?!? SICK!!!! How the monotheists can even tell their god from their devil is a big mystery to me, they both seem hell-bent on destroying all that is best in humanity, causing maximum degradation, suffering & woe.
I was baptized as an infant, and as an adult had them remove me from their "book of life" (hahaha) I wanted them to excommunicate me, but they wouldn't do it, or even tell me what I could do to get excommunicated.
I think God will understand even if the Church does not. A brave woman and a religious that I would be proud to know.
This is so stupid we have catholic priests molesting young children and they cant gey a handle on it.
A nun saves a womans life and she gets ex comunicaited for it Personally I would give the nun an award for her actions knowing that it was against her failth probably knowing her punishment prior to saving this womans life.
It just goes to show just how corrupt the priesthood has become from the pope on down through the entire male section of that church.
And they wonder why people are turning away from organised religeon shame on them all .
A 'Catholic woman' makes about as much sense as a 'Republican hispanic' - I guess some people just don't mind being abused. And before you get all abusive, I know what I'm talking about, my family on both sides has been Catholic since at least the 16th century. The Catholic church hates and fears women, it always has and it always will. They, however, are not alone in this, most organized religion sees women as the source of all sin, the seducers, the traffickers with the devil, the ones who must be kept under control so that they don't lead men away from the 'path of righteousness'. Delude yourself as you will, if you're a woman, your church doesn't love you.


DESCRIPTION: The Yukon Review newspaper seeks an ambitious, creative individual to sell display advertising. We are one of the largest non-daily newspapers in Oklahoma but need to find the right person to increase both revenues and page count.
Successful candidate will have a sales background, preferably with previous publication experience.
Position requires contacting business clients both by phone and in person to sell advertising in a twice weekly community newspaper and specialty publications.
Position includes a base salary and an excellent commission; pay is negotiable depending on qualifications.
Posted on Mon, December 22, 2008 by Yukon Review, Inc.


text:
iJAC
International Journal of Advanced Corporate Learning (iJAC)
Nov 06, 2009 Volume 2, Number 4
David Guralnick
Third Place Learning Environments: Perspective Sharing and Perspective Taking
Mara Alagic, Wichita State University, United States; Tatiana Orel, York University, Canada
In this paper we deliberate on intercultural and global communication strategies of perspective sharing and perspective taking, and potential perspective transformation. Consideration to these... More
Students' Attitudes toward Using Innovative Information Technology for Learning Based on Theory of Planned Behavior
Feng Chiang, Doctor candidate, Taiwan; Heinz Wuttke, Senior Researcher, Germany; Rainer Knauf, Associate Professor, Germany; Chung Sun & Tai Tso, Professor, Taiwan
The main purpose of this study was to explore how IT is integrated into teaching and learning in German bachelor curriculum, and explore the university students' attitude toward the use of... More
Adult Education and Lifelong Learning. The case of GSAE (General Secretary for Adult Education) in Greece
Michail Kalogiannakis, University of Crete, Greece; Kostas Vassilakis, TEI of Crete, Greece; Constantinos Alafodimos, TEI of Piraeus, Greece; Stamatis Papadakis, Teacher in High School in Aghia Barbara, Heraklion, Crete, Greece; Dimitris Papachristos, TEI of Piraeus, Greece; Evi Zafeiri, Teacher, Aghia Barbara High School, Heraklion, Greece
The participation rates in adult education in Greece are low in comparison with other European countries. Within the framework of the present research an effort has been undertaken in order to... More
Online Instructional Design Approaches Utilizing a Tablet PC
Pam Lowry, Lawrence Technological University, United States
Online students can experience what instructional strategies can be utilized using a Tablet PC in online courses. This paper summarizes how inking in Word, Powerpoint, and Windows Journal can be... More
Development and Evaluation of a Prototype of Learning Support System for Honorific Forms in Japanese
Minoru Nakayama, CRADLE, Tokyo Institute of Technology, Japan; Keisuke Morita, Tokyo Institute of Technology, Japan
Most Japanese encounter difficulty using the honorific form. A prototype of a web-based learning support system for Japanese honorific forms was developed in response to the results of a needs... More
Potential Pedagogical Benefits and Limitations of Multimedia Integrated Desktop Video Conferencing Technology for Synchronous Learning
Maurice Schols, Fontys University of Applied Sciences, Netherlands
As multimedia gradually becomes more and more an integrated part of video conferencing systems, the use of multimedia integrated desktop video conferencing technology (MIDVCT) will open up new... More
Designing E-Learning Services: A Case Study
Shanshan Yang & Mike Joy, University of Warwick, United Kingdom
Recently, increasing numbers of e-learning tools have been developed. However, the benefits of these tools cannot be fully used as they typically operate separately and do not communicate with each... More
Cost-Effective Strategies for Developing Formative Assessments in Online Workplace Training
Terry Mackey, David Derr & Ellie O'Connor, Information Experts, Inc., United States
In the context of asynchronous online learning, formative assessments can offer amazing flexibility and support a wide range of learning strategies. While some versions do involve a considerable... More
Case Study of BELL E-learning: Award-Winning, Interactive E-learning on a Nonprofit Budget
Matthea Marquart & Zora Rizzi, BELL (Building Educated Leaders for Life), United States
BELL (Building Educated Leaders for Life) is a nonprofit organization offering academic tutoring to elementary school children from low-income, urban communities. BELL launched a blended learning... More


text:
package org.kuali.kra.proposaldevelopment.web.struts.action;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.kuali.kra.bo.KcPersonExtendedAttributes;
import org.kuali.kra.bo.Unit;
import org.kuali.kra.infrastructure.Constants;
import org.kuali.kra.infrastructure.KraServiceLocator;
import org.kuali.kra.proposaldevelopment.bo.*;
import org.kuali.kra.proposaldevelopment.document.ProposalDevelopmentDocument;
import org.kuali.kra.proposaldevelopment.hierarchy.service.ProposalHierarchyService;
import org.kuali.kra.proposaldevelopment.printing.service.ProposalDevelopmentPrintingService;
import org.kuali.kra.proposaldevelopment.questionnaire.ProposalPersonQuestionnaireHelper;
import org.kuali.kra.proposaldevelopment.questionnaire.ProposalPersonQuestionnaireHelperComparator;
import org.kuali.kra.proposaldevelopment.rule.event.AddKeyPersonEvent;
import org.kuali.kra.proposaldevelopment.rule.event.CalculateCreditSplitEvent;
import org.kuali.kra.proposaldevelopment.rule.event.ChangeKeyPersonEvent;
import org.kuali.kra.proposaldevelopment.rule.event.SaveKeyPersonEvent;
import org.kuali.kra.proposaldevelopment.rules.ProposalDevelopmentYnqAuditRule;
import org.kuali.kra.proposaldevelopment.service.ProposalPersonService;
import org.kuali.kra.proposaldevelopment.web.struts.form.ProposalDevelopmentForm;
import org.kuali.kra.questionnaire.answer.AnswerHeader;
import org.kuali.kra.questionnaire.answer.QuestionnaireAnswerService;
import org.kuali.kra.questionnaire.print.QuestionnairePrintingService;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.KualiRuleService;
import org.kuali.rice.krad.util.GlobalVariables;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;

import static java.util.Collections.sort;
import static org.apache.commons.lang.StringUtils.*;
import static org.kuali.kra.infrastructure.Constants.*;
import static org.kuali.kra.infrastructure.KraServiceLocator.getService;
import static org.kuali.kra.logging.BufferedLogger.info;
import static org.kuali.kra.logging.FormattedLogger.debug;
import static org.kuali.kra.logging.FormattedLogger.warn;
import static org.kuali.rice.krad.util.KRADConstants.METHOD_TO_CALL_ATTRIBUTE;

/**
 * Handles actions from the Key Persons page of the
 * {@link org.kuali.kra.proposaldevelopment.document.ProposalDevelopmentDocument}
 *
 * @author $Author: gmcgrego $
 * @version $Revision: 1.63 $
 */
public class ProposalDevelopmentKeyPersonnelAction extends ProposalDevelopmentAction {
    private static final String MISSING_PARAM_MSG = "Couldn't find parameter '%s'";
    private static final String ROLE_CHANGED_MSG  = "roleChanged for person %s = %s";
    private static final String ADDED_PERSON_MSG  = "Added Proposal Person with proposalNumber = %s and proposalPersonNumber = %s";
    private static final String INV_SIZE_MSG      = "Number of investigators are ";
    private static final String EMPTY_STRING = "";
    private static final String ROLODEX_PERSON = "Unknown";

    private static final String ERROR_REMOVE_HIERARCHY_PI = "error.hierarchy.personnel.removePrincipleInvestigator";
    private static final String ERROR_FIELD_REMOVE_HIERARCHY_PI ="document.developmentProposalList[0].proposalPersons[%s].delete";
    /**
     * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#execute(ActionMapping, ActionForm, HttpServletRequest,
     *      HttpServletResponse)
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

        ActionForward retval = super.execute(mapping, form, request, response);
        prepare(form, request);

        return retval;
    }

    public void preSave(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        boolean rulePassed = getKualiRuleService().applyRules(new SaveKeyPersonEvent(EMPTY_STRING, pdform.getProposalDevelopmentDocument()));
        if (rulePassed) {
            super.preSave(mapping, form, request, response);
        }
    }

    public ActionForward moveDown(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        List<ProposalPerson> keyPersonnel = ((ProposalDevelopmentForm) form).getProposalDevelopmentDocument().getDevelopmentProposal().getProposalPersons();
        swapAdjacentPersonnel(keyPersonnel, getLineToDelete(request), MoveOperationEnum.MOVING_PERSON_DOWN);

        return mapping.findForward(MAPPING_BASIC);
    }

    public ActionForward moveUp(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        List<ProposalPerson> keyPersonnel = ((ProposalDevelopmentForm) form).getProposalDevelopmentDocument().getDevelopmentProposal().getProposalPersons();
        swapAdjacentPersonnel(keyPersonnel, getLineToDelete(request), MoveOperationEnum.MOVING_PERSON_UP);

        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     *
     * This method will save answers to a questionnaire after the proposal has been routed for approval.
     * It should not be available after the proposal has been approved.
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     */
    public ActionForward completeQuestionnaireAfterRouting(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        boolean rulePassed = true;
        rulePassed &= getKualiRuleService().applyRules(new SaveKeyPersonEvent(EMPTY_STRING, pdform.getProposalDevelopmentDocument()));
        if(rulePassed) {
            List<AnswerHeader> answerHeadersToSave = new ArrayList<AnswerHeader>();
                //doing this check to make sure the person wasn't automatically deleted after adding.
                ProposalPersonQuestionnaireHelper helper2 = pdform.getProposalPersonQuestionnaireHelpers().get(this.getSelectedLine(request));
                if(helper2 != null) {
                    if (pdform.getProposalDevelopmentDocument().getDevelopmentProposal().getProposalPersons().contains(helper2.getProposalPerson())) {
                        helper2.preSave();
                        answerHeadersToSave.addAll(helper2.getAnswerHeaders());
                    }
                }
            if (!answerHeadersToSave.isEmpty()) {
                this.getBusinessObjectService().save(answerHeadersToSave);
            }
        }
        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     * Common helper method for preparing to {@link #execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse)}
     * @param form ActionForm
     * @param request HttpServletRequest
     */
    void prepare(ActionForm form, HttpServletRequest request) {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        request.setAttribute(NEW_PERSON_LOOKUP_FLAG, EMPTY_STRING);
        ProposalDevelopmentDocument document=pdform.getProposalDevelopmentDocument();
        List<ProposalPerson> proposalpersons=document.getDevelopmentProposal().getProposalPersons();
        for (Iterator<ProposalPerson> iter = proposalpersons.iterator(); iter.hasNext();) {
            ProposalPerson person=(ProposalPerson) iter.next();
            if (person.getRole() != null) {
                person.getRole().setReadOnly(getKeyPersonnelService().isRoleReadOnly(person.getRole()));
            }
        }
        for (ProposalPersonQuestionnaireHelper helper : pdform.getProposalPersonQuestionnaireHelpers()) {
            helper.prepareView();
            for (int i = 0; i < helper.getAnswerHeaders().size(); i++) {
                helper.updateChildIndicator(i);
            }
        }
        //need to set this based on route status, permissions...
        pdform.populatePersonEditableFields();
        handleRoleChangeEvents(pdform.getProposalDevelopmentDocument());

        debug(INV_SIZE_MSG, pdform.getProposalDevelopmentDocument().getDevelopmentProposal().getInvestigators().size());

        try {
            boolean creditSplitEnabled = this.getParameterService().getParameterValueAsBoolean(ProposalDevelopmentDocument.class, CREDIT_SPLIT_ENABLED_RULE_NAME)
                && pdform.getProposalDevelopmentDocument().getDevelopmentProposal().getInvestigators().size() > 0;
            request.setAttribute(CREDIT_SPLIT_ENABLED_FLAG, new Boolean(creditSplitEnabled));
            pdform.setCreditSplitEnabled(creditSplitEnabled);
        }
        catch (Exception e) {
            warn(MISSING_PARAM_MSG, CREDIT_SPLIT_ENABLED_RULE_NAME);
            warn(e.getMessage());
        }

    }

    /**
     * Called to handle situations when the {@link ProposalPersonRole} is changed on a {@link ProposalPerson}. It
     * does this by looping through a {@link List} of {@link ProposalPerson} instances in a
     * {@link ProposalDevelopmentDocument}
     *
     * @param document {@link ProposalDevelopmentDocument} instance with {@link List} of
     * {@link ProposalPerson} instances.
     */
    private void handleRoleChangeEvents(ProposalDevelopmentDocument document) {
        int index = 0;
        for (ProposalPerson person : document.getDevelopmentProposal().getProposalPersons()) {
            debug(ROLE_CHANGED_MSG, person.getFullName(), person.isRoleChanged());

            if (person.isRoleChanged()) {
                if (document.getDevelopmentProposal().isParent()) {
                    GlobalVariables.getMessageMap().putError(String.format(ERROR_FIELD_REMOVE_HIERARCHY_PI, index), "error.hierarchy.unexpected", "Personnel Roles cannot be changed in a Hierarchy Parent Proposal");
                }
                else {
                    changeRole(person, document);
                }
            }
            index++;
        }
    }

    /**
     * Takes the necessary steps to change a role of a {@link ProposalPerson} instance.

     *

     * This includes:
     *

     *
Updating investigator flag on {@link ProposalPerson}

     *
Removing or adding to the investigators {@link List} in the
     *   {@link ProposalDevelopmentDocument}

     *
Adding credit split defaults for investigators

     *
Deleting units and credit splits from key persons

     *

     *

     * This method is typically called from {@link #handleRoleChangeEvents(ProposalDevelopmentDocument)
     *
     * @param person
     * @param document
     * @see {@link #handleRoleChangeEvents(ProposalDevelopmentDocument)}
     */
    private void changeRole(ProposalPerson person, ProposalDevelopmentDocument document) {
        getKeyPersonnelService().populateProposalPerson(person, document);
    }

    /**
     * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#refresh(ActionMapping, ActionForm, HttpServletRequest,
     *      HttpServletResponse)
     */
    @Override
    public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalPerson person = null;

        if (!isBlank(pdform.getNewRolodexId())) {
           // person = getKeyPersonnelService().createProposalPersonFromRolodexId(pdform.getNewRolodexId());
            person = new ProposalPerson();
            person.setRolodexId(Integer.parseInt(pdform.getNewRolodexId()));
            getPersonEditableService().populateContactFieldsFromRolodexId(person);
        }
        else if (!isBlank(pdform.getNewPersonId())) {
          //  person = getKeyPersonnelService().createProposalPersonFromPersonId(pdform.getNewPersonId());
            person = new ProposalPerson();
            person.setPersonId(pdform.getNewPersonId());
            getPersonEditableService().populateContactFieldsFromPersonId(person);
        }

        if (person != null) {
            person.setProposalNumber(pdform.getProposalDevelopmentDocument().getDevelopmentProposal().getProposalNumber());
            person.setProposalPersonRoleId(pdform.getNewProposalPerson().getProposalPersonRoleId());
            pdform.setNewProposalPerson(person);
            request.setAttribute(NEW_PERSON_LOOKUP_FLAG, new Boolean(true));
        }

        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     * Locate from Spring the {@link KualiRuleService} singleton
     *
     * @return KualiRuleService
     */
    @Override
    protected KualiRuleService getKualiRuleService() {
        return getService(KualiRuleService.class);
    }

    /**
     * Action for inserting a {@link ProposalPerson} into a {@link ProposalDevelopmentDocument}
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward insertProposalPerson(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();
        GlobalVariables.getMessageMap().removeFromErrorPath("document.proposalPersons");

        if (isNotBlank(pdform.getNewProposalPerson().getProposalPersonRoleId())) {
            if (pdform.getNewProposalPerson().getProposalPersonRoleId().equals(PRINCIPAL_INVESTIGATOR_ROLE) || pdform.getNewProposalPerson().equals(CO_INVESTIGATOR_ROLE)) {
                pdform.getNewProposalPerson().setOptInUnitStatus("Y");
                pdform.getNewProposalPerson().setOptInCertificationStatus("Y");
                pdform.setOptInCertificationStatus("Y");
            } else {
                pdform.getNewProposalPerson().setOptInUnitStatus("N");
                pdform.getNewProposalPerson().setOptInCertificationStatus("N");
                pdform.setOptInCertificationStatus("N");
            }
        }
        // check any business rules
        boolean rulePassed = getKualiRuleService().applyRules(new AddKeyPersonEvent(pdform.getProposalDevelopmentDocument(), pdform.getNewProposalPerson()));

        // if the rule evaluation passed, let's add it
        if (rulePassed) {

            ProposalPerson proposalPerson = pdform.getNewProposalPerson();

            Map<String, String> keys = new HashMap<String, String>();
            keys.put("personId", proposalPerson.getPersonId());
            KcPersonExtendedAttributes kcPersonExtendedAttributes = (KcPersonExtendedAttributes) this.getBusinessObjectService().
                findByPrimaryKey(KcPersonExtendedAttributes.class, keys);
            if (kcPersonExtendedAttributes != null) {
                ProposalPersonExtendedAttributes proposalPersonExtendedAttributes = new ProposalPersonExtendedAttributes(
                        proposalPerson, kcPersonExtendedAttributes);
                proposalPerson.setProposalPersonExtendedAttributes(proposalPersonExtendedAttributes);
            } else {
                ProposalPersonExtendedAttributes proposalPersonExtendedAttributes = new ProposalPersonExtendedAttributes(proposalPerson);
                proposalPerson.setProposalPersonExtendedAttributes(proposalPersonExtendedAttributes);
            }
            document.getDevelopmentProposal().addProposalPerson(proposalPerson);

            info(ADDED_PERSON_MSG, pdform.getNewProposalPerson().getProposalNumber(), proposalPerson.getProposalPersonNumber());
            // handle lead unit for investigators respective to coi or pi
            if (getKeyPersonnelService().isPrincipalInvestigator(pdform.getNewProposalPerson())) {
                getKeyPersonnelService().assignLeadUnit(proposalPerson, document.getDevelopmentProposal().getOwnedByUnitNumber());
            } else {
                // Lead Unit information needs to be removed in case the person used to be a PI
                ProposalPersonUnit unit = proposalPerson.getUnit(document.getDevelopmentProposal().getOwnedByUnitNumber());
                if (unit != null) {
                    unit.setLeadUnit(false);
                }
            }
            if(proposalPerson.getHomeUnit()!=null){
                ProposalPersonService proposalPersonService = KraServiceLocator.getService(ProposalPersonService.class);
                String divisionName = proposalPersonService.getProposalPersonDivisionName(proposalPerson);
                proposalPerson.setDivision(divisionName);
            }
            else
            {
                proposalPerson.setDivision(ROLODEX_PERSON);
            }
            if (proposalPerson.getProposalPersonRoleId().equals(PRINCIPAL_INVESTIGATOR_ROLE) || proposalPerson.getProposalPersonRoleId().equals(CO_INVESTIGATOR_ROLE)) {
                if (isNotBlank(proposalPerson.getHomeUnit()) && isValidHomeUnit(proposalPerson,pdform.getNewProposalPerson().getHomeUnit())){
                    getKeyPersonnelService().addUnitToPerson(proposalPerson,getKeyPersonnelService().createProposalPersonUnit(proposalPerson.getHomeUnit(), proposalPerson));
                }
            }
            getKeyPersonnelService().populateProposalPerson(proposalPerson, document);
            sort(document.getDevelopmentProposal().getProposalPersons(), new ProposalPersonComparator());
            sort(document.getDevelopmentProposal().getInvestigators(), new ProposalPersonComparator());

            ProposalPersonQuestionnaireHelper helper = new ProposalPersonQuestionnaireHelper(pdform, proposalPerson);
            pdform.getProposalPersonQuestionnaireHelpers().add(helper);
            sort(pdform.getProposalPersonQuestionnaireHelpers(), new ProposalPersonQuestionnaireHelperComparator());

            pdform.setNewProposalPerson(new ProposalPerson());
            pdform.setNewRolodexId("");
            pdform.setNewPersonId("");

            List<AnswerHeader> answerHeaders = this.getQuestionnaireAnswerService().getQuestionnaireAnswer(helper.getModuleQnBean());
            helper.setAnswerHeaders(answerHeaders);

        }

        return mapping.findForward(MAPPING_BASIC);
    }

    protected QuestionnaireAnswerService getQuestionnaireAnswerService() {
        return KraServiceLocator.getService(QuestionnaireAnswerService.class);
    }

    /**
     * Clears the {@link ProposalPerson} buffer
     *
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward clearProposalPerson(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        pdform.setNewProposalPerson(new ProposalPerson());
        pdform.setNewRolodexId("");
        pdform.setNewPersonId("");
        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     * Add a degree to a {@link ProposalPerson}
     *
     * @return ActionForward
     */
    public ActionForward insertDegree(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();

        int selectedPersonIndex = getSelectedPersonIndex(request, document);
        ProposalPerson person = document.getDevelopmentProposal().getProposalPerson(selectedPersonIndex);
        ProposalPersonDegree degree = pdform.getNewProposalPersonDegree().get(selectedPersonIndex);
        degree.setDegreeSequenceNumber(pdform.getProposalDevelopmentDocument().getDocumentNextValue(Constants.PROPOSAL_PERSON_DEGREE_SEQUENCE_NUMBER));

        // check any business rules

        boolean rulePassed = getKualiRuleService().applyRules(new ChangeKeyPersonEvent(document, person, degree,selectedPersonIndex));

        if (rulePassed) {
            person.addDegree(degree);
            degree.refreshReferenceObject("degreeType");
            pdform.getNewProposalPersonDegree().remove(selectedPersonIndex);
            pdform.getNewProposalPersonDegree().add(selectedPersonIndex,new ProposalPersonDegree());
        }

        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     * Add a unit to a {@link ProposalPerson}
     *
     * @return ActionForward
     */
    public ActionForward insertUnit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();

        int selectedPersonIndex = getSelectedPersonIndex(request, document);
        ProposalPerson person = document.getDevelopmentProposal().getProposalPerson(selectedPersonIndex);
        ProposalPersonUnit unit = getKeyPersonnelService().createProposalPersonUnit(pdform.getNewProposalPersonUnit().get(selectedPersonIndex).getUnitNumber(), person);

        // check any business rules
        boolean rulePassed = getKualiRuleService().applyRules(new ChangeKeyPersonEvent(document, person, unit,selectedPersonIndex));

        if (rulePassed) {
            getKeyPersonnelService().addUnitToPerson(person, unit);

            pdform.getNewProposalPersonUnit().remove(selectedPersonIndex);
            pdform.getNewProposalPersonUnit().add(selectedPersonIndex,new Unit());
        }

        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     * Remove a {@link ProposalPerson} from the {@link ProposalDevelopmentDocument}
     *
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward deletePerson(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();
        DevelopmentProposal proposal = document.getDevelopmentProposal();
        if (proposal.isParent()) {
            GlobalVariables.getMessageMap().putError("newProposalPerson", "error.hierarchy.unexpected", "Cannot remove Personnel from the Parent of a Hierarchy");
        }
        else {
            ProposalPerson parentPi = null;
            if (proposal.isChild()) {
                parentPi = KraServiceLocator.getService(ProposalHierarchyService.class).getParentDocument(document).getDevelopmentProposal().getPrincipalInvestigator();
            }
            int index = 0;
            for (Iterator<ProposalPerson> person_it = proposal.getProposalPersons().iterator(); person_it.hasNext(); index++) {
                ProposalPerson person = person_it.next();
                if (person.isDelete()) {
                    pdform.getProposalPersonsToDelete().add(person);
                    if (parentPi != null && parentPi.equals(person)) {
                        GlobalVariables.getMessageMap().putError(String.format(ERROR_FIELD_REMOVE_HIERARCHY_PI, index), ERROR_REMOVE_HIERARCHY_PI, person.getFullName());
                    }
                    else {
                        person_it.remove();
                        proposal.getInvestigators().remove(person);
                        proposal.removePersonnelAttachmentForDeletedPerson(person);
                        ProposalPersonQuestionnaireHelper helper = new ProposalPersonQuestionnaireHelper(pdform, person);
                        pdform.getAnswerHeadersToDelete().addAll(helper.getAnswerHeaders());
                    }
                }
            }
        }
        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     * Remove a {@link ProposalPersonUnit} from a {@link ProposalPerson}
     *
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward deleteUnit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();
        int selectedPersonIndex = getSelectedPersonIndex(request, document);
        ProposalPerson selectedPerson =  document.getDevelopmentProposal().getProposalPerson(selectedPersonIndex);
        ProposalPersonUnit unit = selectedPerson.getUnit(getSelectedLine(request));
        selectedPerson.getUnits().remove(unit);

        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     * Remove a {@link ProposalPersonDegree} from a {@link ProposalPerson}
     *
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward deleteDegree(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();

        ProposalPerson selectedPerson = getSelectedPerson(request, document);
        selectedPerson.getProposalPersonDegrees().remove(getSelectedLine(request));

        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     *
     * This method is to recalculate credit split
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward recalculateCreditSplit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();
        boolean rulePassed = getKualiRuleService().applyRules(new CalculateCreditSplitEvent(EMPTY_STRING, document));
        if(rulePassed){
            prepare(form, request);
        }

        return mapping.findForward(MAPPING_BASIC);
    }

    @Override
    public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        boolean rulePassed = true;

        updateCurrentOrdinalPositions(((ProposalDevelopmentForm) form).getProposalDevelopmentDocument().getDevelopmentProposal().getProposalPersons());

        // check any business rules
        rulePassed &= getKualiRuleService().applyRules(new SaveKeyPersonEvent(EMPTY_STRING, pdform.getProposalDevelopmentDocument()));

        // if the rule evaluation passed, then save. It is possible that invoking save without checking rules first will
        // let the document save anyhow, so let's check first.
        if (rulePassed) {
            //save the answer headers
            List<AnswerHeader> answerHeadersToSave = new ArrayList<AnswerHeader>();
            for (ProposalPersonQuestionnaireHelper helper : pdform.getProposalPersonQuestionnaireHelpers()) {
                //doing this check to make sure the person wasn't automatically deleted after adding.
                if (pdform.getProposalDevelopmentDocument().getDevelopmentProposal().getProposalPersons().contains(helper.getProposalPerson())) {
                    helper.preSave();
                    answerHeadersToSave.addAll(helper.getAnswerHeaders());
                }
            }
            if (!answerHeadersToSave.isEmpty()) {
                this.getBusinessObjectService().save(answerHeadersToSave);
            }

            /**
             * Simply deleting pdform.getAnswerHeadersToDelete() causes an OLE, with the error saying that OJB thinks
             * the object has already been deleted or modified by another user.  This avoids that situation.
             */
            if (!pdform.getAnswerHeadersToDelete().isEmpty()) {
                List<AnswerHeader> freshHeaders = new ArrayList<AnswerHeader>();
                for (AnswerHeader header : pdform.getAnswerHeadersToDelete()) {
                    Map primaryKeys = new HashMap();
                    primaryKeys.put("QUESTIONNAIRE_ANSWER_HEADER_ID", header.getAnswerHeaderId());
                    AnswerHeader ah = (AnswerHeader) this.getBusinessObjectService().findByPrimaryKey(AnswerHeader.class, primaryKeys);
                    if (ah != null) {
                        freshHeaders.add(ah);
                    }
                }
                if (!freshHeaders.isEmpty()) {
                    this.getBusinessObjectService().delete(freshHeaders);
                }
                pdform.getAnswerHeadersToDelete().clear();
            }

            List<ProposalPerson> keyPersonnel = pdform.getProposalDevelopmentDocument().getDevelopmentProposal().getProposalPersons();
            List<ProposalPerson> personsToDelete = pdform.getProposalPersonsToDelete();
            /**
             * There is a key constraint error the happens when the Propoal Person and the Proposal Person Extended attribute objects are saved
             * at the same time.  In repository.xml the auto-update attribute is set to false on ProposalPerson.proposalPersonExtendedAttributes,
             * and we manually save them in correct order here. This may be a bug in how it's set up, but this works well, so we are going with it.
             * Please feel free to to fix if you like.
             */
            List peopleObjectsToSave = new ArrayList();
            for (ProposalPerson proposalPerson : keyPersonnel) {
                this.getBusinessObjectService().save(proposalPerson);
                if (proposalPerson.getProposalPersonExtendedAttributes() != null) {
                    peopleObjectsToSave.add(proposalPerson);
                    peopleObjectsToSave.add(proposalPerson.getProposalPersonExtendedAttributes());
                    //this.getBusinessObjectService().save(proposalPerson.getProposalPersonExtendedAttributes());
                }
            }
            this.getBusinessObjectService().save(peopleObjectsToSave);

            for (ProposalPerson person : personsToDelete) {
                if (person.getProposalPersonExtendedAttributes() != null) {
                    this.getBusinessObjectService().delete(person.getProposalPersonExtendedAttributes());
                }
            }
            pdform.setPropsoalPersonsToDelete(new ArrayList<ProposalPerson>());

            return super.save(mapping, form, request, response);
        }
        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     *Adds the unit Details for the keyperson
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward addUnitDetails(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();
        int selectedPersonIndex = getSelectedPersonIndex(request, document);
        ProposalPerson person = document.getDevelopmentProposal().getProposalPerson(selectedPersonIndex);
        if (isNotBlank(person.getHomeUnit()) && isValidHomeUnit(person,person.getHomeUnit())){
            getKeyPersonnelService().addUnitToPerson(person,getKeyPersonnelService().createProposalPersonUnit(person.getHomeUnit(), person));
        }
        person.setOptInUnitStatus("Y");
        pdform.setOptInUnitDetails("Y");
        getKeyPersonnelService().populateProposalPerson(person, document);
        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     * Removes the unit Details for  keyperson
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward removeUnitDetails(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();
        ProposalPerson selectedPerson = getSelectedPerson(request, document);
        pdform.setOptInUnitDetails("N");
        selectedPerson.setOptInUnitStatus("N");
        selectedPerson.getUnits().clear();
        document.getDevelopmentProposal().getInvestigators().remove(selectedPerson);
        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     *Adds the Certification Question for the keyperson
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward addCertificationQuestion(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();
        ProposalPerson selectedPerson = getSelectedPerson(request, document);
        pdform.setOptInCertificationStatus("Y");
        selectedPerson.setOptInCertificationStatus("Y");
        getKeyPersonnelService().populateProposalPerson(selectedPerson, document);
        return mapping.findForward(MAPPING_BASIC);
    }
    /**
     * Removes the Certification Question for the keyperson
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward printCertification(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();
        ProposalPerson selectedPerson = getSelectedPerson(request, document);
        ProposalDevelopmentPrintingService printService = KraServiceLocator.getService(ProposalDevelopmentPrintingService.class);
        Map<String,Object> reportParameters = new HashMap<String,Object>();
        reportParameters.put(ProposalDevelopmentPrintingService.PRINT_CERTIFICATION_PERSON, selectedPerson);
        AttachmentDataSource dataStream = printService.printProposalDevelopmentReport(document.getDevelopmentProposal(),
                ProposalDevelopmentPrintingService.PRINT_CERTIFICATION_REPORT, reportParameters);
        streamToResponse(dataStream, response);
        return null;
    }

    /**
     * Prints the Certification Questions for the keyperson
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward removeCertificationQuestion(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();
        ProposalPerson selectedPerson = getSelectedPerson(request, document);
        pdform.setOptInCertificationStatus("N");
        selectedPerson.setOptInCertificationStatus("N");
        selectedPerson.getProposalPersonYnqs().clear();
        return mapping.findForward(MAPPING_BASIC);
    }

    /**
     * Parses the method to call attribute to pick off the line number which should have an action performed on it.
     *
     * @param request
     * @param document the person is selected on
     * @return ProposalPerson
     */
    protected ProposalPerson getSelectedPerson(HttpServletRequest request, ProposalDevelopmentDocument document) {
        ProposalPerson retval = null;
        String parameterName = (String) request.getAttribute(METHOD_TO_CALL_ATTRIBUTE);
        if (isNotBlank(parameterName)) {
            int lineNumber = Integer.parseInt(substringBetween(parameterName, "proposalPersons[", "]."));
            retval = document.getDevelopmentProposal().getProposalPerson(lineNumber);
        }

        return retval;
    }

    protected int getSelectedPersonIndex(HttpServletRequest request, ProposalDevelopmentDocument document) {
        int selectedPersonIndex = -1;
        String parameterName = (String) request.getAttribute(METHOD_TO_CALL_ATTRIBUTE);
        if (isNotBlank(parameterName)) {
            selectedPersonIndex = Integer.parseInt(substringBetween(parameterName, "proposalPersons[", "]."));
        }

        return selectedPersonIndex;
    }

    /**
     * Determines whether the person has valid unit
     *
     * @param proposalperson
     * @return boolean
     */
    @SuppressWarnings("unchecked")
    protected boolean isValidHomeUnit(ProposalPerson person, String unitId){
        Map valueMap = new HashMap();
        valueMap.put("unitNumber", unitId);
        Collection<Unit> units = getBusinessObjectService().findMatching(Unit.class, valueMap);

        return CollectionUtils.isNotEmpty(units);
    }

    @Override
    protected BusinessObjectService getBusinessObjectService() {
        return getService(BusinessObjectService.class);
    }

    private void swapAdjacentPersonnel(List<ProposalPerson> keyPersonnel, int index1, MoveOperationEnum op) {
        ProposalPerson movingPerson = keyPersonnel.get(index1);

        if ((op == MoveOperationEnum.MOVING_PERSON_DOWN && movingPerson.isMoveDownAllowed()) || (op == MoveOperationEnum.MOVING_PERSON_UP && movingPerson.isMoveUpAllowed())) {
            int index2 = index1 + op.getOffset();
            keyPersonnel.set(index1, keyPersonnel.get(index2));
            keyPersonnel.set(index2, movingPerson);
        }
    }

    private enum MoveOperationEnum {
        MOVING_PERSON_DOWN (1),
        MOVING_PERSON_UP(-1);

        private int offset;

        private MoveOperationEnum(int offset) {
            this.offset = offset;
        }

        public int getOffset() { return offset; }
    };

    private void updateCurrentOrdinalPositions(List<ProposalPerson> keyPersonnel) {
        Integer index = 0;
        for(ProposalPerson person: keyPersonnel) {
            person.setOrdinalPosition(index++);
        }
    }

    /**
     * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#reload(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    @Override
    public ActionForward reload(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        ActionForward returnValue = super.reload(mapping, form, request, response);
        clearProposalPerson(mapping, form, request, response);
        return returnValue;
    }

    public ActionForward printQuestionnaireAnswer(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        // TODO : this is only available after questionnaire is saved ?
        ActionForward forward = mapping.findForward(MAPPING_BASIC);
        Map<String, Object> reportParameters = new HashMap<String, Object>();

        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();

        final int personIndex = this.getSelectedLine(request);

        ProposalPerson person = document.getDevelopmentProposal().getProposalPerson(personIndex);
        ProposalPersonQuestionnaireHelper helper = new ProposalPersonQuestionnaireHelper(pdform, person);
        AnswerHeader header = helper.getAnswerHeaders().get(0);

        // TODO : a flag to check whether to print answer or not
        // for release 3 : if questionnaire questions has answer, then print answer.

        reportParameters.put("questionnaireId", header.getQuestionnaire().getQuestionnaireIdAsInteger());
        reportParameters.put("template", header.getQuestionnaire().getTemplate());

        AttachmentDataSource dataStream = getQuestionnairePrintingService().printQuestionnaireAnswer(person, reportParameters);
        if (dataStream.getContent() != null) {
            streamToResponse(dataStream, response);
            forward = null;
        }

        return forward;
    }

    protected QuestionnairePrintingService getQuestionnairePrintingService() {
        return KraServiceLocator.getService(QuestionnairePrintingService.class);
    }

    public ActionForward updateAnswerToNewVersion(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        ProposalDevelopmentForm pdform = (ProposalDevelopmentForm) form;
        ProposalDevelopmentDocument document = pdform.getProposalDevelopmentDocument();

        final String formProperty = getFormProperty(request,"updateAnswerToNewVersion");

        if (StringUtils.contains(formProperty, ".proposalPersonQuestionnaireHelpers[")) {
            int selectedPersonIndex = Integer.parseInt(formProperty.substring(36, formProperty.length()-1));

            ProposalPerson person = document.getDevelopmentProposal().getProposalPerson(selectedPersonIndex);
            ProposalPersonQuestionnaireHelper helper = pdform.getProposalPersonQuestionnaireHelpers().get(selectedPersonIndex);

            helper.updateQuestionnaireAnswer(getLineToDelete(request));
            getBusinessObjectService().save(helper.getAnswerHeaders().get(getLineToDelete(request)));

            return mapping.findForward(MAPPING_BASIC);

        } else {
            throw new RuntimeException(String.format("Do not know how to process updateAnswerToNewVersion for formProperty %s",formProperty));
        }
    }
}


I have had the most extraordinary season of art shows this past summer. With just a little over a year's worth of experience into the fiber medium I've been exploring through wet and needle felting I have been surprised no less than two times with awards from two regional shows.
A Merit Award from the Art in Speed Park, Sellersburg, IN.
Mind you, I'm not really sure what either of these two prizes means, nor why they were specifically given to my work – they don't tend to tell you these things, but I was floored and delighted each time it happened.
But that isn't what this blog post is about!
All summer long I was awarded an amazing series of prizes from the folks who entered my booth. I want to share two such situations with you.
The first happened about 2 weeks ago at the Woodland Art Fair in Lexington, KY. A young girl (maybe 9 or 10) waltzed into my booth (as only young girls can) and absolutely 'fell in love' (her words) with one after another of my soft sculptures. I will tell you now, this happens a lot. My soft sculptures are from the world of cute and soft and little girls are very attracted to both those characteristics. Generally what happens next is the parent takes a gander at the price tag, whispers something to the little girl and out they skidaddle.
That's not what happened here. The mom asked the LG what she liked about each individual sculpture to help her pinpoint her favorite. She got stuck in a loop and they decided to walk around and come back later. Guess what usually happens in a case like this. Usually 'out of sight – out of mind' enters the scene and life goes on. That's not what happened this time. This mom and daughter revisited these pieces at least 5 more times that afternoon. Evening came and as I was closing down the booth I sort of remembered they hadn't reappeared and chalked it up to an 'oh well'.
But Sunday morning came and guess who arrived with it! Yep, the same little girl and her mom. She still wasn't quite ready to choose so they walked back out yet again. By this time I was enjoying myself eavesdropping on their conversations and marveling at the patience of the mom as she helped her young one suss through the decision making process. In the middle of the afternoon they were back and this time it was announced "We have something to tell you!". She had decided! I said "Well I can't wait to see who it is – because for the life of me I can't tell!". She thought that was funny and pointed to one high up on a shelf that I hadn't even realized she had been considering!
I can't begin to tell you how honored I felt at that moment. To have been so carefully selected by this young art appreciator out of not just everything in my booth from from everything gorgeous, colorful and exquisite throughout the entire art fair – was an amazing moment for me. I'm not exaggerating when I tell you it was an award winning moment. I told her so. I hope she believed me.
The following week another wonderful moment arrived. Another little girl. This time she was with her mom and her sister. Her sister fell in love with and selected a mini felted wall piece from my display as the one mom-funded item from the art fair. That is awesome in and of itself. Her sister who had already selected and been given something from another booth nevertheless found one she said she couldn't live without, but her mom reminded her, she had already gotten her one purchase.
The mom asked me if I could hold the piece for her for a half an hour to see if this little girl might be able to move on from needing to own it. Of course. So you can imagine my surprise when they came back a short while later and the little girl announced she would buy this work of art with the remainder of her precious Birthday Money! She could have a bought a new Barbie or many little kawaii somethings from a toy store – but instead bought and paid for a small work of art.
In both these and many other exchanges with customers through the season I am reminded how special it is to make something another person treasures. When we meet like this and I am present to witness the desire it always feels really great! Look, I'd be kidding if I told you it doesn't also feel great to win a prize from your peers which is what those ribbons and checks represent – but that is an honor you can't prepare or plan for. A nice moment, a feel-good experience for sure – but these others given by people who step up and wish to claim ownership of a piece is an exceptionally prized experience and why I work hard towards achieving excellence in each individual piece I make. I LOVE it when they find such happy homes!
you are soooooo right Marti. i did antiques on the bluff last sunday and sold a sofa and chair that i had literally breathed new life into. truly, it was wending it's way to the curb when i bought it at auction for a song. elbow grease and tlc and it SOLD to a guy who wanted to know everything about it. he didn't even balk at the price. he loved it. it was the high point of my day. to think that it could have been landfill…..


Content is the king, online as well as offline. By content, we mean text, images, audio and visual presentations. MeliSEO's content development expertise aims to provide key-word rich and optimized on-page and off-page content. We drive phenomenal value for our clients by developing content that really sells.
MeliSEO's content development strategy takes into consideration each business' competition, product and service portfolio, quality and competency aspects. We ensure that the proportion of content that is developed for paid search and organic search is in accordance with the custom SEO strategy of each business.
As part of our on-page optimization process, we offer support on website content and Meta content. We ensure that the Meta content/tags are in alignment with the webpage content. Our off-page optimization aims to develop content for blogs, forums, social media postings, articles and others.
Our content development and marketing services also includes support on all marketing collaterals: Company Profiles, Brochures, Case Studies, Flyers, Leaflets, and handouts.
We also specialize in voice-overs and AV presentations, that are specially made for corporate and businesses. Businesses can upload our audio-visual presentations on the website(s), share them on social media (Facebook, Twitter etc) or use them for internal and external presentations.
High scalability to keep pace with technology: We impart the needful scalability to each Merchant's eCommerce platform, which means not only preparing the client's businesses for the frequent changes in eCommerce, but also enabling profitable businesses through mCommerce.


If there's one thing boys love, it's a pocket. With two or more pockets, boys' cargo pants are popular with kids who want plenty of places to hide rocks, small toys, and other little treasures. Kids can't resist filling up pockets with flaps that sit half-way up the leg on most pairs of cargo pants. You'll adore cargo pants for their versatility. Pair them with a t-shirt or hoodie for a casual look. Matched up with a cardigan or button-up, the cargo pants convey a dressier vibe.
As boys' casual pants go, it's hard to beat the fit and style of cargo pants. Shop for an elastic waistband if your child begs for comfortable pants. If you need pants for a dressier occasion, look for cargo pants with a button and fly instead of an elastic waistband. On cargo pants that have a button and fly, you usually also find belt loops, making it possible to wear a belt. Styles for toddler sizes, such as 2T through 5T, may include an adjustable waistband to allow you to customize the fit to your child's waist.
Some cargo pants offer an adjustable length. For example, they may have elastic around the bottom, preventing them from falling over a kid's shoe onto the ground. You can also find boys' cargo pants with straps on each leg that allow you to roll the ends and hold them up. These convertible-style cargo pants easily change from long pants to boys' cargo shorts.
When shopping for cargo pants, check out the many colors and patterns that are available. Khaki is a very popular color for cargo pants. It's easy to find cargo pants in a palette of browns, olive greens, and grays. But you don't have to stick to neutral, basic colors. Brands such as Gap, OshKosh B'Gosh, and Gymboree sometimes offer cargo pants in lively spring colors such as royal blue, Kelly green, and sunny yellow. You can also find cargo pants in camouflage.
For smaller boys' sizes, you may find cargo pants with scattered embroidery accents featuring trains, cars, alligators, and palm trees. Boys in elementary school may like cargo pants with a few cool patches.
With brands like Levi's, you get cargo pants that are durable and comfortable. They're made to tolerate the stress and mess of little boys and their adventures. Popular cargo pant styles include twilled cotton, fleece, and knit.
Regardless of the occasion, drawstring cargo pants are always in style. If your little man is heading to the jungle gym, a buddy's house, school, a birthday party, or a fancy occasion, you can't wrong by setting out some cargo pants for him to wear. With the wide selection of boys' cargo pants available at thredUP, you can plan your child's entire wardrobe without worrying about your budget.


Deep within us all lies a passion, a calling, a potential and a purpose. Our success as individuals and societies lies upon our ability to recognise and nurture our talents, then utilise them to benefit ourselves and our communities. However without guidance and motivation it is easy to become lax in our affairs and responsibilities as our hearts fall into a desensitised slumber.
Join As-Suffa Institute at our Annual Conference for an evening of inspiration designed to stir and awaken the hearts into action!


text:
4:45 PM, Paris, Summer, 1985
Slightly frayed but none the less beautiful the upholstery of the luxurious compartment number 6 sighed its familiar welcome to the Comtesse Lamoureux as she eased into it. The porter, nearly as ancient as she and by now an old friend set a Lalique crystal glass half full of Frapin Cuvee 1888 on the table before her.
"Merci Ramon." She began to pluck off her gloves then delicately placed them on the table next to the cognac one upon the other as always. She looked out the window onto the platform of the Gare de Lyon. "This is a most important trip," she said softly. "for both of us."
"Qui Madame la Comtesse, the last run of this great train."
She smiled. "I think for a change, tonight I shall take a late supper in the grand salon."
Ramon bowed and left the Countess looking out the window toward the patch of fading afternoon blue where the iron station opened onto beige Paris and the south.
The coach barley lurched and began to inch into the last journey of Le Train Bleu.
The great iron and glass roof of the station opened as the train picked up speed and Paris slid away, like so many playing cards falling from a gaming table. The countess was transfixed on her reflection in the glass. What she saw there was no longer familiar, it was a young woman, herself sixty years in the past on her way to Nice for the first time.
She was not the most beautiful girl on the Côte d'Azur but perhaps the prettiest to arrive in the middle of the années folles. As she stepped down onto the platform of the station in her Chanel summer whites. The fragrance of the south hit her like a new lover's scent. In fact, she had come south in the mad flush of new love. His name was Pete, he was an American saxophone player who had captivated her one night when she and her boyfriend of the moment René, had stumbled upon the Casanova Club. There he was. The most beautiful black man she had ever seen, playing the most beautiful music, she had ever heard.
Pete never called her by her first name that summer of 1925 as they romped the Côte d'Azur from Marselle to Menton. He simply called her "Countess". Sleeping till four in the afternoon after nights of Jazz and cocktails. Romping on the beach at dawn. Caviar and eggs for breakfast. By the last days of September, She was ready to give up everything for him.
He went back to America that winter. Sporting a bruised heart she went home to Pairs on The Blue Train.
The trip south the winter of 1939 was to escape the cold of the city. But not long after her arrival in Monte Carlo, things began to look grim. People were heading south not to escape winter but to try and outrun the fear of what was coming to Paris, what was devouring Europe. She stayed on to help friends and then soon strangers as well find refuge. After the fall of Pairs that summer of 1940 her villa in the hills above Monaco became a meeting place for young men and women of the Resistance against the German occupation and the Vichy government.
His name was Axel Barre. He was first and foremost a freedom fighter and secondly, perhaps the love of her life. He died in a ditch, executed by a German firing squad.
At 56 she was the picture of polished, poised, elegance the summer of 1961. The train trip south was marred by nothing except the incessant snoring of the man in compartment number 7. The Countess sat up all night with cotton stuffed in her ears trying to read "Heaven Has No Favorites". It was useless. Each time he ceased his rumble she closed the book, put out the light and removed the cotton from her ears, he would start up again.
The following morning she went to an early breakfast in the Grand Salon and found herself sitting across the table from a Monsieure Jean Lucien Dubeau. He said good morning and from the timber of his voice she knew at once that he was the cause of her sleepless night. She gave him a scowl, he gave her a dazzling smile, a wink, and ordered a bottle of champagne for both of them. They were married in a miniscule country church near Saint-Jean-Cap-Ferrat the following Spring. She never really got a good nights sleep from then on.
On this final journey of Le Train Bleu the Countess sat up all night thinking about the journey behind her and what little of it remained before her. It had been a good ride for the most part. There were many things along the way she had enjoyed and much she had endured, wild young love gone wrong, A world torn by war and loss, and finally the love of a good man whose ashes she now carried to the villa in the blue-green hills above Monte Carlo.
As she stepped from the train onto the platform in her black and white Chanel suit the fragrance of the south enveloped her like the warm hug of an old friend.
L'Heure Bleue created by Jacques Guerlian in 1912 has come to symbolize the end of the Belle Epoch in France just before the beginning of World War I. It has been called a farewell to a romantic era, a melancholy remembrance of things lost to time, not to be found ever again. The cap on the bottle is an inverted heart that symbolically captures that past in perfume form from the bottle it encapsulates thus preserving within its transparent heart the memories of lost love and departed friends.
All of this is true. But for me there is more, something deeper in L'Heure Bleue. It is the perfume of a complete lifetime held in memories of youth and the passing of time into maturity. It is not melancholy as one would expect such memories to be, but rather reflective of life, a contented quiet and very personal joy.
Who can wear L'Heure Bleue? Anyone who has the daring to be in a space beyond the ordinary. Someone not only with an appreciation of history by someone who also has a past both intriguing and perhaps slightly tainted with scandal. A past worth writing about in a diary one hopes to be found fascinating by others if found at all. In short it is suited to both men and women of taste and sophistication.
It opens quite classically as one would expect such a perfume of this vintage and from this particular house to do. Notes of anise, coriander, neroli, bergamot, and lemon spark and fizz but momentarily like the flicker of old movies, a editing of cinematic notes mixed with music, that quickly collapse into the unfolding beauty of the middle composition.
Here we get the classic powder and Guerlainade that was established with Jicky in 1889. The bergamot, rose, tonka, vanilla. Jasmin, and animalic and resinous accords make up this signature, a DNA of the house so to speak. It is a kind of Jicky through the looking glass. Notes in the middle comprised of Rose, cloves, Jasmine, tuberose and Geranium hit my nose with the most power. Undertones of ylang ylang and violet play supporting roles to this old world glamour. This phase lasts about three to four hours.
In the dry down we get the full force of the powder and seduction there in of this fragrance that lingers well into the sixth hour. The animalic accords are here along with the swirling hypnotic benzoin note. This combined with the iris, vanilla, sandalwood, and vetiver create an incense accord that is incensual (if I may create a word that sums up my love of perfumes that are smoky, exotic, and mysterious) This is where the fragrance carries its key to our memories. It is as magical, romantic, and epic as a journey to the Cote Azure on the long lost Le Train Bleu.
Categories: FRAGRANCE, GUERLAIN, Men's cologne, uni-sex fragrance, Women's Perfume . Tags: 1920's South of France, 1940's south of France, 1960's south of france, cote azure, FRAGRANCE, fragrance for men, fragrance review, GUERLAIN, le train blue, Men's cologne, PARIS, Perfume, PERFUME REVIEW . Author: laniersmith . Comments: 14 Comments


It all started in 1988...when I was born. Then I got a little older. And a little more. And actually, I find I'm still getting older every day.
At home I got a brother (Chris), born in '93, and Dad, who copied my first name, thus making me a "junior" (though he prefers "Michael" to "Mike," unlike me). My mom, Angela, passed away back in '03...which was rough, I'm not gonna lie, but...I still got a bunch of friends and family for whom I'm grateful.
Oh--I like chocolate (especially dark), a sense of humor (it's required), peaceful dinners (I can sorta cook), and long walks on the beach (it does wonders for your ankles).
But too much of a good thing is, in fact, bad. I make sure I don't burn out on games by pursuing other hobbies. These include (but aren't limited to) writing, reading, drawing, singing and recording music, playing instruments (ever heard of an ocarina?), physical activity (like tennis), and just hanging out with friends with no particular aim in mind.
So as your accomplished gamer/game developer/artist/musician/writer who is also humble, I'd like to thank you for reading all this. Go on and enjoy the rest of the site, and don't hesitate to drop me a line at feedback@mikebelotti.com for any particular reason.


ght things, holding back his true thoughts and feelings.
e the quarterback might be most dangerous.
to the active roster with its corresponding move Wednesday.
ow D'Antoni sought to bring out the best in his players.


text:
Q: Taking screenshots with PIL I'm working on script that take screenshot every 1 min but there is one problem that when I save it gives me invalid argument and I don't know why that is.
Code:
from PIL import ImageGrab
from PIL import Image
import time
import datetime
import os

def screenShot():
    while True:
        try:
            date = str(datetime.date.today())
            hour=str(datetime.datetime.now().strftime("%H"))
            os.makedirs("D:/mine/" + date + "/" + hour)
        except OSError,e:
            if e.errno != 17:
                raise
            time.sleep(1)
            pass
        while True:
            date = str(datetime.date.today())
            hour = str(datetime.datetime.now().strftime("%H"))
            date_time = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
            img = ImageGrab.grab()
            FILES_DIR = 'mine'
            SAVE_PATH = "D:/"
            LOGFILE_NAME = "%s.png" % date_time
            LOGFILE_PATH = os.path.join(SAVE_PATH, FILES_DIR, LOGFILE_NAME)
            img.save(LOGFILE_PATH)
            break
        time.sleep(60)

screenShot()

This is the error I'm getting:
IOError: [Erno 22] Invalid argument: 'D:/mine\\2016-12-02 20:24:37.png'

I searched a lot and I found this code and it worked but I can't see different between this code and my code.
import os
import sys
import time
from PIL import ImageGrab
from PIL import Image
from os import environ
import random
n = -1
while True:
    n += 1
    # generate a random time between 120 and 300 sec
    random_time = random.randrange(1,2)
    # wait between 120 and 300 seconds (or between 2 and 5 minutes)
    print "Next picture in: %.2f minutes" % (float(random_time) / 60)
    time.sleep(random_time)
    img = ImageGrab.grab()
    FILES_DIR = 'mine'
    SAVE_PATH = "D:/"
    #SAVE_PATH = os.path.expanduser("~")    #It is cross-platform
    LOGFILE_NAME = "test{n:0>5}.png".format(n = n)
    LOGFILE_PATH = os.path.join(SAVE_PATH, FILES_DIR, LOGFILE_NAME)
    print LOGFILE_PATH
    img.save(LOGFILE_PATH)

I'm forgetting something but I don't know what is it.

A: Make sure the SAVE_PATH and FILES_DIR are valid meaning they exist in your hard drive and the path should be absolute path. for example in linux it would be ~/D/mine in your case it should be D:\mine instead of D:/mine also strftime("%Y-%m-%d %H:%M:%S") should be strftime("%Y-%m-%d %H.%M.%S")

A: D:/mine\2016-12-02 20:24:37.png. You must have formatted something wrong if it has "/" and "\". And also, same as the other people: you can't create files with colons.

redpajama_set_name: RedPajamaStackExchange