text:
The FightsBoxing
"They Had To Apply Electric Shock To Bring Him Back": The Decline Of Boxer David Reid, Hero Of The 1996 Olympics
joseph santoliquito
Filed to:Olympics
Republished from The Ring.
The room is small, dimly lit, but clean.
A flat-screen TV sits in the tiny parlor where the curtains are always drawn. Boxing magazines and books are splayed out across the floor and kitchen table, but the room is empty, devoid of any presence or personality.
David Reid prefers it this way. The 1996 Olympic gold medalist lives a cloistered, almost monastic life by choice. Reid rarely ventures from his modest two-bedroom apartment complex in Marquette, Mich., where he's lived for the past seven years.
His days are spent reading various magazines and books—alone. He eats alone. He works out alone. He attends church alone.
Reid feels safe in the cocoon he's created. More importantly, he knows where he is and that he can't get lost, because there was a time when Reid was lost.
There was a time the Philadelphia native, who recieved a million-dollar pro signing bonus and debuted on HBO, ate his Thanksgiving dinner in a homeless shelter. There was a time when America's Olympic hero came close to dying from heat exposure while sitting alone in his car during one of the hottest summers in Michigan's history.
Those are the dark years, a time when Reid lost faith in friends and family. All are now gone, no longer a part of his life.
Reid doesn't recall much from this time.
He doesn't remember the details of that sweltering summer day in 2005 when he sat in his car with the windows up, sweat raining down his face as he voraciously paged through his books, numb to what was happening to his overheated body.
The next thing Reid knew he was in the hospital. Reid survived and recovered, but he's not alright.
Today, Reid is about 30 pounds heavier than his fighting weight. He gets around well, but his speech comes in slow, halting starts and stops, each word measured.
He battles depression and far-ranging mood swings. Some days are good, some not so good.
It's difficult to believe this same human being was one of the biggest stories of the '96 Olympic Games in Atlanta.
Reid's come-from-behind one-punch knockout of Cuban Alfredo Duvergel instantly generated worldwide fame. Reid, the lone American gold medalist in boxing, became the toast of a U.S. squad that included Floyd Mayweather Jr., Antonio Tarver and Fernando Vargas.
Those who watched the bout on NBC will never forget Marv Albert screaming, "Down goes Duvergel, Duvergel is hurt, David Reid connecting … It's all over … David Reid has stunned Duvergel … In dramatic fashion, he has won the gold … What a moment for David Reid!"
Those who saw his ultimate triumph will never forget Reid jumping up and down all over the ring, hugging his coach and mentor, Al Mitchell, and waving a little American flag. It looked like a fairytale beginning for a good, genial kid that somehow survived the urban blight of North Philly.
Those were the good times, the moments fans thought Reid would always hold dear. However, he doesn't, not anymore. Reid has pushed away those golden memories in favor of withdrawing from the outside world.
"I … like … to … be … by … myself," Reid admitted in a halting, broken cadence. "I haven't been doing much lately. I stay in the church. That's about it and I take care of myself. I have an apartment in Marquette, Michigan, and I live. I don't do anything at all. I was working out at one point with Al, but I… I… I'm not doing anything with boxing at all.
"I wouldn't want to get into training and coaching or anything like that. I still have the eye problem and I can't fight anymore. I still love the sport. Ever since I was a kid, I fell in love with the sport. (But) I didn't get enough rewards from the sport. It's why I would rather not have anything to do with the sport.
"I don't want anything to do with the sport at all."
Reid doesn't like to look up when he speaks to people. He's self conscious about his droopy left eyelid, which looks far better than when he was fighting. He doesn't see it that way. It's one of the reasons Reid doesn't like going out.
It's why he insulates himself inside a shell filled with books and magazines.
They don't stare back.
"I'm not going to say I look good or feel good. I train to keep my body in shape, and right now, I just read," he said. "My whole take on life is not to have anything to do with boxing at all. I'm doing okay with everything else."
Jesse Hart, a young rising prospect and son of 1970s middleweight contender Eugene "Cyclone" Hart, is one of a handful still close to Reid. Despite his boxing pedigree, Hart says Reid's Olympic triumph is what inspired him to pursue an amateur career.
After each tournament he won, Hart couldn't wait to get back to the locker room, rummage through his gym bag for his cell phone to tell Reid what he just did. Reid means more to Hart-and many, aspiring young Philadelphia fighters-than just a symbol of success. He's part mentor, part big brother.
Although when Hart, who was recently signed by Top Rank, asked Reid to come out and witness his pro debut on the Manny Pacquiao-Timothy Bradley undercard in Las Vegas on June 9, Reid declined.
"It's hard seeing him this way," Hart told RingTV.com. "I know the real David Reid, but he's so self-conscious about his eye he barely goes out. He still does what he did when he used to fight. He'll get up and run in the morning. When I stayed with him last year, we used to watch some old fight films. He just doesn't talk to too many people these days. I'm one of the few people Dave still speaks with, and when I won the Olympic trials last summer, David helped me prepare for that.
"I want him to share these moments with me, and he won't. He's a guy who never wants to be seen, that's just him; it's hard for me to get through. I want to be there for Dave because he's one of the reasons why I won all of these things in the amateurs. I always looked up to Dave. It meant a lot to me to tell Dave each time that I won. I look at him more as a big brother than anything else; I love that guy. It's why it's tough seeing him like this today."
Chuck Mussachio wanted to be David Reid and live out his Olympic aspirations where Reid worked, at Al Mitchell's United States Olympic Education Center (USOEC) on the University of Northern Michigan campus in Marquette.
And though Mussachio did not realize his Olympic dreams, he pursued a professional boxing career despite earning a degree in elementary education and a master's degree in guidance counseling.
The South Jersey-based light heavyweight with Philadelphia roots still cherishes the time he got to meet and work with one of his boxing idols. At first, however, Reid, who had only fought competitively for a couple of years, was standoffish, leery of any new face that came around.
"Dave was very paranoid that everyone was after him and trying to steal from him," said Mussachio, who worked out at USOEC from January 2003 until August 2004. "It took a few months for Dave to trust me.
There was one time, I remember, when Dave misplaced his jacket and he had everything in his jacket pocket, including his wallet. A week went by and Dave still couldn't find his jacket. He had left it at the front desk of the building where we lived, but he was really agitated and wanted to go after someone.
"He would just slip like that. It was tough to watch Dave deteriorate. It wasn't like a rapid jump off the edge. He would tell me things that happened way back in his amateur days with vivid memory of specific bouts, but he would forget things on a day-to-day basis.
"I could see he lacked some organizational skills. I tried to help him as a friend because he'd get easily agitated and lose things. Sometimes he lost track of time. A lot of people said David was like that before he began boxing. I didn't know him then, but I started to see some things that weren't right. Dave would choke every time we sat down and ate, and things got progressively worse in the time I was there."
It came to a crucial state in mid-summer 2005.
Reid doesn't recall much of that day. All Mitchell could recall was that Reid locked in himself in his car during a record-heat wave in Marquette one afternoon. The windows were closed and Reid wasn't responding to anyone. Finally, someone called an ambulance in fear he would die of heat stroke.
"That's what happened to me; I was reading in a car and then I woke up in the hospital, but that was a while ago," Reid said. "If that didn't happen, I wouldn't be where I am today. That's when they found out I had depression. Treating the depression thing wouldn't have happened if they didn't find me in the car. I blacked out. I don't really remember what happened."
Mitchell was traveling when it happened, but remembers something far graver than Reid recalled.
"Dave almost died," Mitchell said. "I was away. David stayed because he doesn't like traveling anymore. But I got this call from Jeff Kleinschmidt [retired USOEC director] while I was gone. He told me they found Dave in the parking lot of his apartment complex and this woman called the police. It was one of the hottest days ever in Marquette, and Dave was just sitting there in his car with the windows rolled up, they told me. It was over 100-degrees, so it had to be at least 130-degrees in the car. Dave told me, or someone told me, they had to apply electric shock to bring him back."
Mussachio couldn't believe what he heard. He hustled back to Marquette and visited his friend, who was sitting there in a hospital gown on his bed still trying to absorb what was happening to him.
"I visited Dave in the hospital a few days after he was admitted," Mussachio recalled. "Dave was in his room and the nurse brought me in to see him. Dave was just sitting there and I asked him if he knew who I was, and Dave said 'No' with this blank stare. Then he started laughing, he was joking. Dave explained to me he was sitting in his car with his books, and the next thing he knew he was in the hospital.
"The doctor came in when I was with him and told us Dave was going to get worse. It will be gradual, but it's what's been happening. It is sad. This is someone I looked up to coming up as a fighter in Philly. He still has his Olympic gold medal and his championship belt. But I remember him telling me winning that gold medal was a blessing and a curse at the same time."
Mitchell, Hart and Mussachio all claim Reid was bilked out of hundreds of thousands of dollars by those who were supposedly close to the fighter.
"There were a lot of people that took advantage of Dave, and it kind of bothers me," Hart said. "It's a big reason why Dave trusts no one today."
"I'm on his side and I love him," Mussachio said. "I hope nothing but the best for Dave. But there were a lot of people reaching at him, and it is why he is this way today. It makes you a little sad because you won't find a better guy."
Now Reid fights a new battle.
The demons gnaw at him. It's reflected in his personality and in his words. When Hart was living with him he could tell when Reid would have a good or bad day. Reid would engage him in conversation on good days. On the bad days Reid would lock himself in his bedroom and say nothing.
"I was depressed for a while there; I have really bad depression in my family and it's a struggle every day," Reid admitted during a more lucid discourse. "I inherited it from my family. Being depressed isn't that bad right now because I take medication for it. I don't know how bad it got. I just got into a depression and I lost track of things."
Reid is only 38. He'll turn 39 in September. His professional career only lasted four years. He fought a mere 19 times, going 17-2 with seven knockouts. Mitchell resisted Reid fighting again after his punishing loss to Felix Trinidad in March 2000, when he lost the WBA 154-pound title he had won from Laurent Boudouani in only his 12th pro fight.
"Dave had a pretty remarkable career," said Mitchell. "What makes it more remarkable is he fought essentially with one eye. His left eye was far worse than anyone knew, and it's why we wanted to move Dave fast. I walked away. I wanted Dave to get out of [boxing] after he got beat by Trinidad. I didn't want the Trinidad fight. I wanted Dave to take some easy fights.
"We were lucky. The eye came down after a year or two (after turning pro). But it came down after one or two rounds in the Trinidad fight. We didn't talk for a little while there, but Dave has found his way back. He called me up and told me he wasn't doing anything at home and he's been up here [in Marquette] since 2004."
If there's been an omnipresent light in Reid's life it's been Mitchell. An old-school coach who possesses old-world values, Mitchell may be the one singular reason Reid is alive today. The trainer manages Reid's expenses, keeps the parasites away and covets and protects Reid's most prized possession, his Olympic gold medal, which sits securely in a safe.
"I worry about him when I'm not home; I'm like his only support now with everything, but my goal is for Dave to go back home and rejoin his family, to get better and be around some people we trust. We're working on that," said Mitchell, who essentially raised Reid and trained him since he was eight.
The mood swings that Reid says is hereditary may have been worsened by his boxing career.
"With boxing, you see repeated concussive blows that can increase the risk of depression," said Dr. Matthew Sacks, a licensed clinical psychologist at Joint Base Andrews Malcolm Grow Medical Clinic based in Camp Spring, Maryland. "There is no black-and-white answer as to whether or not depression is hereditary. You can have an identical twin, separated at birth and raised in completely different environments, in those types of studies, you see some differences. Your life experiences make up those differences. But research suggests you have an increased risk of chronic depression and encephalopathy, all the stuff that we see in the NFL, NHL, what everyone is talking about, when you expose yourself to repeated brain trauma.
"That can have a long-term effect. Look at the list of all the professional athletes that go through this and kill themselves. It's probably a little bit of both, heredity and boxing."
There is hope for Reid. To his credit, he doesn't shoulder should'ves, could'ves and only-ifs.
"I feel better today from the condition I was in five, six years ago," Reid said. "I'm a whole lot better. I realize I'm going to have to take medication every day for the rest of my life. Al is still a very important part of my life. But I don't talk to anyone else."
He has also cut himself off from boxing.
"I do remember winning the gold medal," Reid said. "It's the best thing that ever happened to me. I still would have fought and I think I would have done everything the same."
In the meantime, Hart will still continue pestering him about being in his corner, and Mitchell will continue worrying about him, and Mussachio will continue to keep Reid in his prayers and his thoughts.
"I won't stop until I see Dave in my corner one more time on my HBO debut," said Hart. "That's my goal for him. David Reid means too much to so many people, because he's helped so many. Now maybe it's time people start thinking about Dave."
Joseph Santoliquito is a features writer for Ring TV/Ring magazine. He also writes for CBS, CBS/MaxPreps, and CBS Philly. He can be reached at jsantoliquito@yahoo.com. Follow him on Twitter @jsantoliquito.
Photo of Jesse Hart, Al Mitchell, David Reid by Danielle Pemble.


A stunning remodel you won't want to miss! With a complete update inside and out, this neutral color palette home is ready for personal touches and furnishings to complete its new look! Enter in through the striking covered porch, large enough for patio seating or a couple of rocking chairs. Open concept Kitchen and Dining Area graced with beautiful hardwood flooring, new SS Appliances, and a large Built in Hall Tree with shelf and sitting bench. Expansive back deck overlooking large backyard is accessible from door off of Kitchen with steps leading to lower patio area off the basement. Living Room, Full Bath and a Bedroom complete the main level. Upstairs you will find 2 Bedrooms, a Full Bath and a great bonus room above the kitchen/dining space. Enjoy updated living close to town! Let's get you home for the Holidays!


This is a placeholder page for Dan Morey, which means this person is not currently on this site. We do suggest using the tools below to find Dan Morey.
You are visiting the placeholder page for Dan Morey. This page is here because someone used our placeholder utility to look for Dan Morey. We created this page automatically in hopes Dan Morey would find it. If you are not Dan Morey, but are an alumni of Linn Mar High School, register on this site for free now.


To ask the Scottish Government how being assigned VAT revenues raised in Scotland from 2019-20 will influence its economic policy making; what steps it is taking to ensure that it will maximise these revenues, and how much it expects to collect, broken down by sector.
Growing Scotland's economy continues to be a key priority, with investment to boost and support Scottish businesses set out in the budget.
The VAT Assignment Working Group expects to agree a Scottish VAT outturn assignment methodology this year. Forecasts of Scottish VAT will be produced by the Scottish Fiscal Commission and will be included in the Draft Budget for 2019-20.


Professionals from D'Arcangelo & Co., LLP, a regional certified public accounting and consulting firm, volunteered with the American Red Cross at the New York State Fair on Friday, August 31.
The American Red Cross had a parking lot set up at the New York State Fair, and professionals from D'Arcangelo & Co., LLP helped direct cars and traffic. One-hundred percent of the money that was raised will be used to respond to disasters in the community.
Just a few of the D'Arcangelo employees who volunteered with the American Red Cross.


One Direction: Is This Proof Cheryl Is Pregnant With Liam Payne's Baby?
Cheryl doesn't appear to be doing much to dispel rumors suggesting she could be pregnant with One Direction star Liam Payne's baby.
One Direction fans have been speculating in recent weeks that Cheryl may be pregnant with her and Payne's first child, and now the pregnancy rumor mill has been sent into overdrive after Cheryl made her first public appearance in months sporting what many fans are claiming looking like a baby bump.
Cheryl, who has not been photographed at a public event since June, made an appearance at L'Oreal Paris's Gold Obsession Party in Paris, France, for Paris Fashion Week on October 2, and her black jumpsuit amid the pregnancy rumors got everybody talking.
One Direction fans were quick to speculate that Cheryl seemingly confirmed that she was pregnant with Liam's baby at the big fashion event, taking to Twitter to suggest that Cheryl's attire revealed her baby bump to the world for the first time.
"If Cheryl isn't pregnant she's playing one hell of a good game with the media," Twitter user @mirrorkaty added amid the rampant speculation suggesting Cheryl may be pregnant with the One Direction star's baby.
The latest pregnancy speculation to surround Cheryl and Liam, who began dating back in February, comes just days after fans claimed that they spotted Cheryl's mom buying pregnancy and baby items in the British baby store Mothercare.
According to UnrealityTV, social media users snapped photos of Cheryl's mom inside the Silverlink branch of the parenting shop, which is pretty close to where Cheryl grew up, and claimed that she was purchasing a number of items for expectant mothers, including a pregnancy pillow.
"She had a massive pregnancy pillow which helps make your bump more comfortable when you're trying to sleep," a source claimed of Cheryl's mom's purchases, once again sparking speculation that Cheryl is expecting Payne's baby.
Just days earlier, The Mirror reported that One Directions fans were "convinced" that Cheryl, who has always sported a thinner frame since she shot to fame as one-fifth of the British girlband Girls Aloud, sported a "fuller face" in a promotional video for L'Oréal.
While Cheryl and Liam have both stayed tight-lipped as fans continue to speculate that Cheryl is pregnant, Liam did get fans talking after he seemingly dropped a hint to One Direction fans, changing his Twitter bio last month.
The Mirror also claimed back in June that, despite having only dating for a matter of months, Cheryl and Payne allegedly had big plans to get pregnant and start a family in the not too distant future.
The insider also went on to reveal that Cheryl is now making her impending divorce from soon-to-be former husband JB Fernandez-Versini a priority and wants a "fresh start" with Liam.
Do you think Cheryl is pregnant with Liam Payne's baby?


Hey everyone! November was kind of a weird one around here: we didn't go to a single event! Weird, right? Well, it turns out we probably won't be attending any events until January, actually. So in lieu of that, this month's blog post is going to be a progress report on what we've been up to an what our plans are for the short term leading up to Collapsus' release!
So, let's start with events! January is going to see us ab both Magfest's indie game showcase (we were thankful to have been invited since competition is pretty tight) and after that (the week after) we're heading back to Ohayocon! In December, however, we've been accepted into the Kinda Funny Games Showcase, which is completely digital. It's running on the 8th on the Kinda Funny Twitch channel. After all those, we're not quite sure. We know we're making our way back to Boston for PAX East in March, but other than that, we'll see where the wind takes us!
Oh yeah! The recording studio! One of our big end goals with the remodel is to have a fully functioning, professional quality recording space where we can do voice over, foley, music recording, podcasting, streaming, and more! We're even going to open the space up for outsiders to rent time for their own projects. Now, with this being said, 2019 is going to be seeing new episodes of "2 Devs and a Dude", as well as 3 other podcasts that some of our other peeps are doing. We're also planning on expanding our YouTube and streaming content, too. It's going to be great! We'll have more to say about all that as we get closer, but needless to say, we're pretty excited!
As Collapsus finishes up, we're also working on making a new improved version of Radarkanoid (called Radarkanoid+) that we hope to make into a more fleshed out game (for console maybe even). Radaranoid started out as a game jam game, and people keep asking of we're going to expand the concept, so we decided "hey, why not?!" and that was that. We're also still working on Cave Worm (in fact, it's a bit of a bet as to which "team" inside the company will finish up first, Cave Worm or Radarkanoid+) so don't worry about that. We're also deep into pre-production on Burst Lancer, but don't expect to see anything from that until Collapsus, Cave Worm, and Radarkanoid+ are all out!
Last, but certainly not least, our intern Tradd (https://twitter.com/Tradd_Cooper) is being joined this January by our newest intern, Chris (https://twitter.com/WayOfTheQuay)! It's going to be great to have him, and this year (with Collapsus and the remodel being down pretty early) it's our plan to expand our internships into new heights! We're so glad to have the both of them with us and we hope they feel the same!
Oh, before I forget, if you could, please take the time to nominate us for the "Hamilton Vision Awards" in the "Play" category, here: http://www.hamilton-ohio.com/hamilton-vision-commission and vote for us for the IndieDB "Game of the Year" (best upcoming game, of course) here: https://www.indiedb.com/games/collapsus! Both are super important to us and really help get the word out when trying to make an indie game stand out above the rest (marketing is hard, folks). So if you could take a couple minutes out of your day to do that, we'd really appreciate it!
But yeah... that's basically it around here (not that that wasn't already a LOT of stuff we have going on)! Who knows what the next post will bring. It's been one heck of a ride so far, but buckle up... it only get wilder from here!


text:
#include <curl/curl.h>
#include "mldb/arch/threads.h"
#include <chrono>
#include <thread>
#include "mldb/types/structure_description.h"
#include "curl_wrapper.h"
#include "mldb/base/exc_assert.h"
#include "mldb/ext/jsoncpp/json.h"

#include "http_rest_proxy.h"
#include "http_rest_proxy_impl.h"

using namespace std;

namespace MLDB {

static inline std::string lowercase(const std::string & str)
{
    string result = str;
    for (unsigned i = 0;  i < str.size();  ++i)
        result[i] = tolower(result[i]);
    return result;
}

/*****************************************************************************/
/* HTTP REST RESPONSE                                                        */
/*****************************************************************************/

HttpRestResponse::
HttpRestResponse()
    : code_(0), errorCode_(0)
{
}

Json::Value
HttpRestResponse::
jsonBody() const
{
    return Json::parse(body_);
}

const std::pair<const std::string, std::string> *
HttpRestResponse::
hasHeader(const std::string & name) const
{
    auto it = header_.headers.find(name);
    if (it == header_.headers.end())
        it = header_.headers.find(lowercase(name));
    if (it == header_.headers.end())
        return nullptr;
    return &(*it);
}

const std::string &
HttpRestResponse::
getHeader(const std::string & name) const
{
    auto p = hasHeader(name);
    if (!p)
        throw MLDB::Exception("required header " + name + " not found");
    return p->second;
}

/*****************************************************************************/
/* HTTP REST CONTENT                                                         */
/*****************************************************************************/

HttpRestContent::
HttpRestContent()
    : data(0), size(0), hasContent(false)
{
}

HttpRestContent::
HttpRestContent(const std::string & str,
                const std::string & contentType)
    : str(str), data(str.c_str()), size(str.size()),
      hasContent(true), contentType(contentType)
{
}

HttpRestContent::
HttpRestContent(const char * data, uint64_t size,
                const std::string & contentType)
    : data(data), size(size), hasContent(true),
      contentType(contentType)
{
}

HttpRestContent::
HttpRestContent(const Json::Value & content,
                const std::string & contentType)
    : str(content.toString()), data(str.c_str()),
      size(str.size()), hasContent(true),
      contentType(contentType)
{
}

HttpRestContent::
HttpRestContent(const RestParams & form)
{
    for (auto p: form) {
        if (!str.empty())
            str += "&";
        str += urlEncode(p.first) + "=" + urlEncode(p.second);
    }

    data = str.c_str();
    size = str.size();
    hasContent = true;
    contentType = "application/x-www-form-urlencoded";
}

std::string
HttpRestContent::
urlEncode(const std::string & str)
{
    std::string result;
    for (auto c: str) {

        if (isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~')
            result += c;
        else result += MLDB::format("%%%02X", c);
    }
    return result;
}

std::string
HttpRestContent::
urlEncode(const Utf8String & str)
{
    // Encode each character separately
    std::string result;
    for (auto c: str.rawString()) {

        if (isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~')
            result += c;
        else result += MLDB::format("%%%02X", c);
    }
    return result;
}

/*****************************************************************************/
/* HTTP REST PROXY                                                           */
/*****************************************************************************/

struct HttpRestProxy::Itl {
    Itl(std::string serviceUri, HttpRestProxy * owner)
        : serviceUri(std::move(serviceUri)), noSSLChecks(false), debug(false),
          owner(owner)
    {
    }

    /** URI that will be automatically prepended to resources passed in to
        the perform() methods
    */
    std::string serviceUri;

    /** SSL checks */
    bool noSSLChecks;

    /** Are we debugging? */
    bool debug;

    HttpRestProxy * owner;

    /** Lock for connection pool. */
    mutable std::mutex lock;

    /** List of inactive handles.  These can be selected from when a new
        connection needs to be made.
    */
    mutable std::vector<Connection> inactive;

    std::vector<std::string> cookies;

    HttpRestProxy::Connection
    getConnection() const
    {
        std::unique_lock<std::mutex> guard(lock);

        if (inactive.empty()) {
            return Connection(new ConnectionHandler, owner);
        }
        else {
            Connection res(std::move(inactive.back()));
            inactive.pop_back();

            // Set proxy to this, so when it's destroyed it's put on our list
            ExcAssert(res.proxy == nullptr);
            res.proxy = owner;
            return res;
        }
    }

    void doneConnection(ConnectionHandler * conn)
    {
        std::unique_lock<std::mutex> guard(lock);
        conn->reset();

        // Put a Connection with a null handler on the list so it's
        // destroyed when done
        inactive.emplace_back(conn, nullptr);
    }
};

HttpRestProxy::
HttpRestProxy(const std::string & serviceUri)
    : itl(new Itl(serviceUri, this))
{
}

HttpRestProxy::
~HttpRestProxy()
{
}

void
HttpRestProxy::
init(const std::string & serviceUri)
{
    itl->serviceUri = serviceUri;
}

void
HttpRestProxy::
setCookieFromResponse(const Response& r)
{
    itl->cookies.push_back("Set-Cookie: " + r.getHeader("set-cookie"));
}

void
HttpRestProxy::
setCookie(const std::string & value)
{
    itl->cookies.push_back("Set-Cookie: " + value);
}

HttpRestResponse
HttpRestProxy::
post(const std::string & resource,
     const Content & content,
     const RestParams & queryParams,
     const RestParams & headers,
     double timeout,
     bool exceptions,
     OnData onData,
     OnHeader onHeader) const
{
    return perform("POST", resource, content, queryParams, headers,
                   timeout, exceptions, onData, onHeader);
}

HttpRestResponse
HttpRestProxy::
put(const std::string & resource,
    const Content & content,
    const RestParams & queryParams,
    const RestParams & headers,
    double timeout,
    bool exceptions,
    OnData onData,
    OnHeader onHeader) const
{
    return perform("PUT", resource, content, queryParams, headers,
                   timeout, exceptions, onData, onHeader);
}

HttpRestResponse
HttpRestProxy::
get(const std::string & resource,
    const RestParams & queryParams,
    const RestParams & headers,
    double timeout,
    bool exceptions,
    OnData onData,
    OnHeader onHeader,
    bool followRedirect,
    bool abortOnSlowConnection) const
{
    return perform("GET", resource, Content(), queryParams, headers,
                   timeout, exceptions, onData, onHeader, followRedirect,
                   abortOnSlowConnection);
}

HttpRestResponse
HttpRestProxy::
perform(const std::string & verb,
        const std::string & resource,
        const Content & content,
        const RestParams & queryParams,
        const RestParams & headers,
        double timeout,
        bool exceptions,
        OnData onData,
        OnHeader onHeader,
        bool followRedirect,
        bool abortOnSlowConnection) const
{
    string responseHeaders;
    string body;
    string uri;
    RestParams curlHeaders = headers;

    try {
        responseHeaders.clear();
        body.clear();

        Connection connection = getConnection();

        CurlWrapper::Easy & myRequest = *connection;

        uri = itl->serviceUri + resource + queryParams.uriEscaped();

        myRequest.add_option(CURLOPT_CUSTOMREQUEST, verb);

        myRequest.add_option(CURLOPT_URL, uri);

        if (itl->debug)
            myRequest.add_option(CURLOPT_VERBOSE, 1L);

        if (timeout != -1)
            myRequest.add_option(CURLOPT_TIMEOUT, timeout);
        else myRequest.add_option(CURLOPT_TIMEOUT, 0L);

        myRequest.add_option(CURLOPT_NOSIGNAL, 1L);
        myRequest.add_option(CURLOPT_CONNECTTIMEOUT, 20L);

        if (abortOnSlowConnection) {
            // abortOnSlowConnection SPECIFICATION *** /
            myRequest.add_option(CURLOPT_LOW_SPEED_LIMIT, 1024 * 10);
            myRequest.add_option(CURLOPT_LOW_SPEED_TIME, 5);
        }

        if (itl->noSSLChecks) {
            myRequest.add_option(CURLOPT_SSL_VERIFYHOST, 0L);
            myRequest.add_option(CURLOPT_SSL_VERIFYPEER, 0L);
        }

        if (followRedirect) {
            myRequest.add_option(CURLOPT_FOLLOWLOCATION, 1L);
            myRequest.add_option(CURLOPT_MAXREDIRS, 20);
        }

        CurlWrapper::Easy::CurlCallback onWriteData = [&] (char * data, size_t ofs1, size_t ofs2) -> size_t
            {
                if (itl->debug)
                    cerr << "got data " << string(data, data + ofs1 * ofs2) << endl;

                if (onData) {
                    if (!onData(string(data, data + ofs1 * ofs2)))
                        return ofs1 * ofs2 + 1; //indicate an error
                    return ofs1 * ofs2;
                }

                body.append(data, ofs1 * ofs2);
                return ofs1 * ofs2;
            };

        bool afterContinue = false;

        Response response;
        bool headerParsed = false;

        CurlWrapper::Easy::CurlCallback onHeaderLine = [&] (char * data, size_t ofs1, size_t ofs2) -> size_t
            {
                if (headerParsed && followRedirect) {
                    responseHeaders.clear();
                    headerParsed = false;
                }
                ExcAssert(!headerParsed);

                string headerLine(data, ofs1 * ofs2);

                if (itl->debug)
                    cerr << "got header " << headerLine << endl;

                if (headerLine.find("HTTP/1.1 100 Continue") == 0) {
                    afterContinue = true;
                }
                else if (afterContinue) {
                    if (headerLine == "\r\n")
                        afterContinue = false;
                }
                else {
                    responseHeaders.append(headerLine);
                    if (headerLine == "\r\n") {
                        response.header_.parse(responseHeaders);
                        headerParsed = true;

                        if (onHeader)
                            if (!onHeader(response.header_))
                                return ofs1 * ofs2 + 1;  // indicate an error
                    }
                }
                return ofs1 * ofs2;
            };

        myRequest.add_callback_option(CURLOPT_HEADERFUNCTION, CURLOPT_HEADERDATA, onHeaderLine);
        myRequest.add_callback_option(CURLOPT_WRITEFUNCTION, CURLOPT_WRITEDATA, onWriteData);

        for (auto & cookie: itl->cookies)
            myRequest.add_option(CURLOPT_COOKIELIST, cookie);

        if (content.data) {
            myRequest.add_option(CURLOPT_POSTFIELDSIZE, content.size);
            myRequest.add_data_option(CURLOPT_POSTFIELDS, content.data);
            curlHeaders.emplace_back(make_pair("Content-Length", MLDB::format("%lld", content.size)));
            curlHeaders.emplace_back(make_pair("Content-Type", content.contentType));
        }
        else {
            myRequest.add_option(CURLOPT_POSTFIELDSIZE, 0L);
            myRequest.add_option(CURLOPT_POSTFIELDS, "");
        }

        myRequest.add_header_option(curlHeaders);

        CURLcode code = myRequest.perform();
        response.body_ = body;
        if (code != CURLE_OK) {
            if (!exceptions) {
                response.errorCode_ = code;
                response.errorMessage_ = curl_easy_strerror(code);
                return response;
            }
            else {
                throw CurlWrapper::RuntimeError("performing HTTP request",
                                                code);
            }
        }

        myRequest.get_info(CURLINFO_RESPONSE_CODE, response.code_);

        double bytesUploaded;

        myRequest.get_info(CURLINFO_SIZE_UPLOAD, bytesUploaded);

        //cerr << "uploaded " << bytesUploaded << " bytes" << endl;

        return response;
    } catch (const CurlWrapper::RuntimeError & exc) {
        if (exc.whatCode() == CURLE_OPERATION_TIMEDOUT)
            throw;
        cerr << "libCurl returned an error with code " << exc.whatCode()
             << endl;
        cerr << "error is " << curl_easy_strerror(exc.whatCode())
             << endl;
        cerr << "verb is " << verb << endl;
        cerr << "uri is " << uri << endl;
        //cerr << "query params are " << queryParams << endl;
        cerr << "headers are " << responseHeaders << endl;
        cerr << "body contains " << body.size() << " bytes" << endl;
        throw;
    }
}

HttpRestProxy::Connection
HttpRestProxy::
getConnection() const
{
    return itl->getConnection();
}

void
HttpRestProxy::
doneConnection(ConnectionHandler * conn)
{
    itl->doneConnection(conn);
}

std::ostream &
operator << (std::ostream & stream, const HttpRestProxy::Response & response)
{
    return stream << response.header() << "\n" << response.body() << "\n";
}

} // namespace MLDB

redpajama_set_name: RedPajamaGithub


text:
Q: xmlrpc - dynamically choosing port number I have a python program which starts another executable as a subprocess. The sub-process, in turn, starts an XML-RPC server to which the parent process connects as a client.
I don't want to fix the port number as sometimes the port might not be available because of another instance of the same program being run on the same machine.
I can leave it to the parent process to choose the port number and pass that information as an argument or through Unix environment variable.
But in the worst case there is a possibility that the port number became unavailable from the time parent checked and then sub-proc tried to acquire.
We can let the sub proc first acquire the port number and then tell it to the parent. The sub-process prints a huge amount of data which is redirected to a file. Is there any better way than having to parse the stdout? something like the Unix Env variable but modifying the caller's environment.
Another way is for the parent to have an xml-rpc server and pass on the address to the sub proc. The sub proc would make a call and inform what is its server's address.
Is there any better way?

A: Not sure your OS, if it is ubuntu, then your parent could find the port by using child processid and netstat.
netstat -antlp | grep processid

Another way by read stdout from sub process:
#parent
import subprocess

proc=subprocess.Popen(['./test_python_xmlrpc_server.py'], stdout=subprocess.PIPE,close_fds=True)

line = proc.stdout.readline()
print line

And the child process, using a port of 0 so a free port with be chosen. Then print out the port:
#!/usr/bin/python
#./test_python_xmlrpc_server.py
from SimpleXMLRPCServer import SimpleXMLRPCServer

server = SimpleXMLRPCServer(("0.0.0.0", 0)) #pick a free port
print server.server_address
#
#

REF:
How to kill a process on a port on ubuntu
Stop reading process output in Python without hang?
xmlrpc getting auto-assigned server port number

redpajama_set_name: RedPajamaStackExchange


Defend your castle! Move you mouse to aim and press left mouse button to shoot.
Press SPACE to repair your castle. Move you mouse to aim and press left mouse button to shoot.
Press SPACE to repair your castle (costs $1000).


Sparky Web Directory is a web pages directory of the SparkyLinux project, which is a part of Linuxiarze.pl group. It is created and running in English for private people and companies of all around the world. Sparky Web Dir is located on different IP address then Katalog Linuxiarzy web directory, what makes it more attractive in the net. Highly positioned SparkyLinux's project's web site makes the Sparky Web Dir very attractive and very well visible, and makes all stored web pages hight positioned in the internet. We welcome you for adding your web pages to the Sparky Web Directory.


Have you taken one of the quizzes from Women.com on Facebook lately? Been impressed with your brilliance…got 100% on the quiz?
Well, maybe you ARE brilliant, and maybe you DID get 100%. But if you have a creepy feeling you've been used–you're unfortunately right.
Women.com has been putting up a number of quizzes lately where, if you get anywhere close to most of the answers correct, it'll report you as getting 100%. Why would they do this?
Well…so you'll share it on Facebook. If you scored 65%, you probably wouldn't be proud enough to share it. So, by faking your score to make you look like a rockstar, they greatly increase the chance you'll share their quiz on your timeline.
I've done this quiz (and a couple of others they've run), and deliberately answered 3-4 questions incorrectly, and still….100%. I then tried answering all of them deliberately wrong, and didn't show 100%. I'm guessing they did this to make it look legit for someone who either was testing them, or knew they knew hardly any of the right answers.
They're using you, by deception, to market their site for them on Facebook, for free.


What would happen if a group of Pre-Heresy Space Marines from a Traitor Legion found themselves in the current timeline? Say from a mishap during Warp travel?
Would they be executed on sight, be imprisoned, or forced to join the Deathwatch. These are marines still loyal to the Emperor and the Imperium.
They would probably be executed on sight, or if they were lucky taken in for years of lengthy interrogation at the hands of the Inquisition. Most likely though, their ship would be blown out of the void the moment an Imperial Navy patrol found them.
Example of The Fallen proves that it is possible to not only survive, but to build their own mini-state somewhere on the outskirts of Imperium.
But they would still be considered traitors, and be forced to live as pirates/corsairs.
Don't forget that knowledge about Horus Heresy is a very restricted knowledge. How many Imperial commanders know how Pre-Heresy World Eaters armor looks? Without Chaos/Khorn symbols?
They might not recognize the armour, but their codes would be antiquated as f*ck not to mention their dialect of High Gothic.
But with so many chapters operating on the fringes of the galaxy codes and dialect could be easily overlooked.
I understand that if the Inquisition got them there would be years of interrogation to make certain they are not tainted, or Chaos infiltrators.
But what would happen to them afterwards?
During tne heresy the emperor odred the founding of the grey knights. Some of the founding members were from legions that had went over to chaos. the emperor himself trusted them still.
In hammer and bolter 1 there was the story of a force of iron warriors who remained loyal, fought their traitor bothers and played a vital role in saving terra from the chaos invasion.
IF such a band of pre heresy loyal marines reached tne imperium in 40,000 and managed to survive very long and IF they came to the attention of an inquisitor who knew the whole truth about tne heresy and the fact that some members of traitor legions remained loyal he would likeky race to reach them because they were vital sources of information and archaeotech from the pre heresy era. Plus these men lived when he emperor lived and a lot of people would like to know what they knew. Also they may have information about tne traitor legions that would serve the imperium well.
Also the thought of getting their claws on an intact pre heresy ship and other tech would have some admech types oiling under their robes.
Let's see how long it takes a certain pompous troll to snarkcrap on this post then run crying to a mod when i slap him because i'm tired of his abuse.
This was what I kinda envisioned. A group of Pre-Heresy marines that were lost to the warp for 10,000 years re-emerging. Unaware of the Heresy, and the betrayal of their Primarch. Depending on whom they run into first could set the stage for a long and adventurous campaign.
I can imagine Chaos, the Mechanicum, and the Inquisition all dying to get their hands on the archeotech this ship has. Especially the Inquisition, with these marines knowledge of their former legions practices, tactics, etc, and possible first hand knowledge of the Emperor.
Although the Emperor was not seen as a god in those times. Which could cause some issues between them and the Inquisition.
If someone snaps this up for a campaign idea, that's fine. Lord knows I've trolled sites looking for ideas in RPG'so and for miniatures conversions. But if I post it, I always give credit where it is due and mention who/where the idea comes from. Hope they give me the same courtesy.
It's another one of those issues where the imperium buries the truth because it would be diofficult to deal with. The fact is some members of traitor legions did remain loyal and even became heroes of the imperium during the HH. Of course we can't let the mindless masses know this as they might begin to think there was some good on the 'other side' and that could lead to more heresy. Better to keep 'em ignorant of the truth.
BTW, to put it in more modern terms, i wonder if any of the tiger claws remained loyal to the imperium and what happened to them if they escaped badab and made it into imperial space. gave vital data on the traitor chapter to the imperium and were absolved? One hopes.
Personally, if I was a loyalist from a traitor legion, then first thing I'd do is repaint my armor and pretend to be some little known chapter. Nobody really knows how many where created (except for a book about the 2nd founding, that gives a number, but doesn't list any names!) Nobody would know and less people would dare ask.
Inquisitor: "What primarch is your chapters' genefather?"
Capt. Graves (ex Night lords, now Corpse Ravens) : Konr- Errr Corax. yeah definatly Corax. Look at our lanky dark hair.
Inquisitor: "Where have you and your men been all this time? and when where the Corpse Ravens founded anyway? We have absolutly no record of your chapter's creation."
Graves: " We are a crusading chapter plying the cold dark of the void. Allas our librarium and all records were lost when our Flagship Krummavisur was destroyed in combat with Eldar Pirates."
Inquisitor: "Hmm I'm not quite conviced."
Graves: "Look,my Corpse Ravens are loyal to the core! You want 600 loyal marines or not? We're ready to take the fight to Horus and his allies!"
* Well Guilliman is back, so I guess they would feel a bit at home again.
I'm sure some of the second founding chapters were former loyal marines from traitor legions. Would explain why a couple were fleet based with no home world.
And as far as the Tiger Claws go. The Lamentors, and Mantis Warriors were eventually absolved, so it's possible they would be too. Although, since it would probably be very few marines, they would most likely have to join the Deathwatch as Black Shields.
I am going to use the absolute **** out of this after the current campaign I am running comes to an end. This is amazing.
Thanks. I hope it plays well for you.


These hygienic hand wipes are perfect for travel, to keep in the car and when visiting family and friends.
Enriched with Aloe and Vitamin E, the wipes come in a resealable pack of 10 and feature a fresh scent.
I like these compact wipes. They are great for travelling and I keep a pack beside my computer to refresh my hands occasionally.


We finally got to tick the gorgeous Assembly House in Norwich off the wishlist thanks to Victoria & Chris. These two were awesome to work with – always up for a laugh and ready to smooch at a moments notice (not that we had to ask). Spot the cute moment that Chris locks eyes on Vic and she gives him a cheeky little wave as she walks down ther aisle. Later in the afternoon we were busy filming all the gorgeous details in the room when we spotted the new Mr & Mrs M canoodling on the balcony without warning! Thanks to our lightning reaction we managed to capture the moment without the need for a take 2. Awesome as always to work with James Rouse Photography too.


text:
import {ConstantPool} from '../../constant_pool';
import {AttributeMarker} from '../../core';
import {AST, ASTWithSource, BindingPipe, BindingType, Interpolation} from '../../expression_parser/ast';
import * as o from '../../output/output_ast';
import {ParseSourceSpan} from '../../parse_util';
import {isEmptyExpression} from '../../template_parser/template_parser';
import * as t from '../r3_ast';
import {Identifiers as R3} from '../r3_identifiers';

import {hyphenate, parse as parseStyle} from './style_parser';
import {ValueConverter} from './template';
import {getInterpolationArgsLength} from './util';

const IMPORTANT_FLAG = '!important';

/**
 * A styling expression summary that is to be processed by the compiler
 */
export interface StylingInstruction {
  reference: o.ExternalReference;
  /** Calls to individual styling instructions. Used when chaining calls to the same instruction. */
  calls: StylingInstructionCall[];
}

export interface StylingInstructionCall {
  sourceSpan: ParseSourceSpan|null;
  supportsInterpolation?: boolean;
  allocateBindingSlots: number;
  params: ((convertFn: (value: any) => o.Expression | o.Expression[]) => o.Expression[]);
}

/**
 * An internal record of the input data for a styling binding
 */
interface BoundStylingEntry {
  hasOverrideFlag: boolean;
  name: string|null;
  unit: string|null;
  sourceSpan: ParseSourceSpan;
  value: AST;
}

/**
 * Produces creation/update instructions for all styling bindings (class and style)
 *
 * It also produces the creation instruction to register all initial styling values
 * (which are all the static class="..." and style="..." attribute values that exist
 * on an element within a template).
 *
 * The builder class below handles producing instructions for the following cases:
 *
 * - Static style/class attributes (style="..." and class="...")
 * - Dynamic style/class map bindings ([style]="map" and [class]="map|string")
 * - Dynamic style/class property bindings ([style.prop]="exp" and [class.name]="exp")
 *
 * Due to the complex relationship of all of these cases, the instructions generated
 * for these attributes/properties/bindings must be done so in the correct order. The
 * order which these must be generated is as follows:
 *
 * if (createMode) {
 *   styling(...)
 * }
 * if (updateMode) {
 *   styleMap(...)
 *   classMap(...)
 *   styleProp(...)
 *   classProp(...)
 * }
 *
 * The creation/update methods within the builder class produce these instructions.
 */
export class StylingBuilder {
  /** Whether or not there are any static styling values present */
  private _hasInitialValues = false;
  /**
   *  Whether or not there are any styling bindings present
   *  (i.e. `[style]`, `[class]`, `[style.prop]` or `[class.name]`)
   */
  public hasBindings = false;
  public hasBindingsWithPipes = false;

  /** the input for [class] (if it exists) */
  private _classMapInput: BoundStylingEntry|null = null;
  /** the input for [style] (if it exists) */
  private _styleMapInput: BoundStylingEntry|null = null;
  /** an array of each [style.prop] input */
  private _singleStyleInputs: BoundStylingEntry[]|null = null;
  /** an array of each [class.name] input */
  private _singleClassInputs: BoundStylingEntry[]|null = null;
  private _lastStylingInput: BoundStylingEntry|null = null;
  private _firstStylingInput: BoundStylingEntry|null = null;

  // maps are used instead of hash maps because a Map will
  // retain the ordering of the keys

  /**
   * Represents the location of each style binding in the template
   * (e.g. `<div [style.width]="w" [style.height]="h">` implies
   * that `width=0` and `height=1`)
   */
  private _stylesIndex = new Map<string, number>();

  /**
   * Represents the location of each class binding in the template
   * (e.g. `<div [class.big]="b" [class.hidden]="h">` implies
   * that `big=0` and `hidden=1`)
   */
  private _classesIndex = new Map<string, number>();
  private _initialStyleValues: string[] = [];
  private _initialClassValues: string[] = [];

  // certain style properties ALWAYS need sanitization
  // this is checked each time new styles are encountered
  private _useDefaultSanitizer = false;

  constructor(private _elementIndexExpr: o.Expression, private _directiveExpr: o.Expression|null) {}

  /**
   * Registers a given input to the styling builder to be later used when producing AOT code.
   *
   * The code below will only accept the input if it is somehow tied to styling (whether it be
   * style/class bindings or static style/class attributes).
   */
  registerBoundInput(input: t.BoundAttribute): boolean {
    // [attr.style] or [attr.class] are skipped in the code below,
    // they should not be treated as styling-based bindings since
    // they are intended to be written directly to the attr and
    // will therefore skip all style/class resolution that is present
    // with style="", [style]="" and [style.prop]="", class="",
    // [class.prop]="". [class]="" assignments
    let binding: BoundStylingEntry|null = null;
    let name = input.name;
    switch (input.type) {
      case BindingType.Property:
        binding = this.registerInputBasedOnName(name, input.value, input.sourceSpan);
        break;
      case BindingType.Style:
        binding = this.registerStyleInput(name, false, input.value, input.sourceSpan, input.unit);
        break;
      case BindingType.Class:
        binding = this.registerClassInput(name, false, input.value, input.sourceSpan);
        break;
    }
    return binding ? true : false;
  }

  registerInputBasedOnName(name: string, expression: AST, sourceSpan: ParseSourceSpan) {
    let binding: BoundStylingEntry|null = null;
    const prefix = name.substring(0, 6);
    const isStyle = name === 'style' || prefix === 'style.' || prefix === 'style!';
    const isClass = !isStyle &&
        (name === 'class' || name === 'className' || prefix === 'class.' || prefix === 'class!');
    if (isStyle || isClass) {
      const isMapBased = name.charAt(5) !== '.';         // style.prop or class.prop makes this a no
      const property = name.substr(isMapBased ? 5 : 6);  // the dot explains why there's a +1
      if (isStyle) {
        binding = this.registerStyleInput(property, isMapBased, expression, sourceSpan);
      } else {
        binding = this.registerClassInput(property, isMapBased, expression, sourceSpan);
      }
    }
    return binding;
  }

  registerStyleInput(
      name: string, isMapBased: boolean, value: AST, sourceSpan: ParseSourceSpan,
      unit?: string|null): BoundStylingEntry|null {
    if (isEmptyExpression(value)) {
      return null;
    }
    name = normalizePropName(name);
    const {property, hasOverrideFlag, unit: bindingUnit} = parseProperty(name);
    const entry: BoundStylingEntry = {
      name: property,
      unit: unit || bindingUnit, value, sourceSpan, hasOverrideFlag
    };
    if (isMapBased) {
      this._useDefaultSanitizer = true;
      this._styleMapInput = entry;
    } else {
      (this._singleStyleInputs = this._singleStyleInputs || []).push(entry);
      this._useDefaultSanitizer = this._useDefaultSanitizer || isStyleSanitizable(name);
      registerIntoMap(this._stylesIndex, property);
    }
    this._lastStylingInput = entry;
    this._firstStylingInput = this._firstStylingInput || entry;
    this._checkForPipes(value);
    this.hasBindings = true;
    return entry;
  }

  registerClassInput(name: string, isMapBased: boolean, value: AST, sourceSpan: ParseSourceSpan):
      BoundStylingEntry|null {
    if (isEmptyExpression(value)) {
      return null;
    }
    const {property, hasOverrideFlag} = parseProperty(name);
    const entry:
        BoundStylingEntry = {name: property, value, sourceSpan, hasOverrideFlag, unit: null};
    if (isMapBased) {
      if (this._classMapInput) {
        throw new Error(
            '[class] and [className] bindings cannot be used on the same element simultaneously');
      }
      this._classMapInput = entry;
    } else {
      (this._singleClassInputs = this._singleClassInputs || []).push(entry);
      registerIntoMap(this._classesIndex, property);
    }
    this._lastStylingInput = entry;
    this._firstStylingInput = this._firstStylingInput || entry;
    this._checkForPipes(value);
    this.hasBindings = true;
    return entry;
  }

  private _checkForPipes(value: AST) {
    if ((value instanceof ASTWithSource) && (value.ast instanceof BindingPipe)) {
      this.hasBindingsWithPipes = true;
    }
  }

  /**
   * Registers the element's static style string value to the builder.
   *
   * @param value the style string (e.g. `width:100px; height:200px;`)
   */
  registerStyleAttr(value: string) {
    this._initialStyleValues = parseStyle(value);
    this._hasInitialValues = true;
  }

  /**
   * Registers the element's static class string value to the builder.
   *
   * @param value the className string (e.g. `disabled gold zoom`)
   */
  registerClassAttr(value: string) {
    this._initialClassValues = value.trim().split(/\s+/g);
    this._hasInitialValues = true;
  }

  /**
   * Appends all styling-related expressions to the provided attrs array.
   *
   * @param attrs an existing array where each of the styling expressions
   * will be inserted into.
   */
  populateInitialStylingAttrs(attrs: o.Expression[]): void {
    // [CLASS_MARKER, 'foo', 'bar', 'baz' ...]
    if (this._initialClassValues.length) {
      attrs.push(o.literal(AttributeMarker.Classes));
      for (let i = 0; i < this._initialClassValues.length; i++) {
        attrs.push(o.literal(this._initialClassValues[i]));
      }
    }

    // [STYLE_MARKER, 'width', '200px', 'height', '100px', ...]
    if (this._initialStyleValues.length) {
      attrs.push(o.literal(AttributeMarker.Styles));
      for (let i = 0; i < this._initialStyleValues.length; i += 2) {
        attrs.push(
            o.literal(this._initialStyleValues[i]), o.literal(this._initialStyleValues[i + 1]));
      }
    }
  }

  /**
   * Builds an instruction with all the expressions and parameters for `elementHostAttrs`.
   *
   * The instruction generation code below is used for producing the AOT statement code which is
   * responsible for registering initial styles (within a directive hostBindings' creation block),
   * as well as any of the provided attribute values, to the directive host element.
   */
  buildHostAttrsInstruction(
      sourceSpan: ParseSourceSpan|null, attrs: o.Expression[],
      constantPool: ConstantPool): StylingInstruction|null {
    if (this._directiveExpr && (attrs.length || this._hasInitialValues)) {
      return {
        reference: R3.elementHostAttrs,
        calls: [{
          sourceSpan,
          allocateBindingSlots: 0,
          params: () => {
            // params => elementHostAttrs(attrs)
            this.populateInitialStylingAttrs(attrs);
            const attrArray = !attrs.some(attr => attr instanceof o.WrappedNodeExpr) ?
                getConstantLiteralFromArray(constantPool, attrs) :
                o.literalArr(attrs);
            return [attrArray];
          }
        }]
      };
    }
    return null;
  }

  /**
   * Builds an instruction with all the expressions and parameters for `classMap`.
   *
   * The instruction data will contain all expressions for `classMap` to function
   * which includes the `[class]` expression params.
   */
  buildClassMapInstruction(valueConverter: ValueConverter): StylingInstruction|null {
    if (this._classMapInput) {
      return this._buildMapBasedInstruction(valueConverter, true, this._classMapInput);
    }
    return null;
  }

  /**
   * Builds an instruction with all the expressions and parameters for `styleMap`.
   *
   * The instruction data will contain all expressions for `styleMap` to function
   * which includes the `[style]` expression params.
   */
  buildStyleMapInstruction(valueConverter: ValueConverter): StylingInstruction|null {
    if (this._styleMapInput) {
      return this._buildMapBasedInstruction(valueConverter, false, this._styleMapInput);
    }
    return null;
  }

  private _buildMapBasedInstruction(
      valueConverter: ValueConverter, isClassBased: boolean,
      stylingInput: BoundStylingEntry): StylingInstruction {
    // each styling binding value is stored in the LView
    // map-based bindings allocate two slots: one for the
    // previous binding value and another for the previous
    // className or style attribute value.
    let totalBindingSlotsRequired = 2;

    // these values must be outside of the update block so that they can
    // be evaluated (the AST visit call) during creation time so that any
    // pipes can be picked up in time before the template is built
    const mapValue = stylingInput.value.visit(valueConverter);
    let reference: o.ExternalReference;
    if (mapValue instanceof Interpolation && isClassBased) {
      totalBindingSlotsRequired += mapValue.expressions.length;
      reference = getClassMapInterpolationExpression(mapValue);
    } else {
      reference = isClassBased ? R3.classMap : R3.styleMap;
    }

    return {
      reference,
      calls: [{
        supportsInterpolation: isClassBased,
        sourceSpan: stylingInput.sourceSpan,
        allocateBindingSlots: totalBindingSlotsRequired,
        params: (convertFn: (value: any) => o.Expression | o.Expression[]) => {
          const convertResult = convertFn(mapValue);
          return Array.isArray(convertResult) ? convertResult : [convertResult];
        }
      }]
    };
  }

  private _buildSingleInputs(
      reference: o.ExternalReference, inputs: BoundStylingEntry[], mapIndex: Map<string, number>,
      allowUnits: boolean, valueConverter: ValueConverter,
      getInterpolationExpressionFn?: (value: Interpolation) => o.ExternalReference):
      StylingInstruction[] {
    const instructions: StylingInstruction[] = [];

    inputs.forEach(input => {
      const previousInstruction: StylingInstruction|undefined =
          instructions[instructions.length - 1];
      const value = input.value.visit(valueConverter);
      let referenceForCall = reference;
      let totalBindingSlotsRequired = 1;  // each styling binding value is stored in the LView

      if (value instanceof Interpolation) {
        totalBindingSlotsRequired += value.expressions.length;

        if (getInterpolationExpressionFn) {
          referenceForCall = getInterpolationExpressionFn(value);
        }
      }

      const call = {
        sourceSpan: input.sourceSpan,
        allocateBindingSlots: totalBindingSlotsRequired,
        supportsInterpolation: !!getInterpolationExpressionFn,
        params: (convertFn: (value: any) => o.Expression | o.Expression[]) => {
          // params => stylingProp(propName, value)
          const params: o.Expression[] = [];
          params.push(o.literal(input.name));

          const convertResult = convertFn(value);
          if (Array.isArray(convertResult)) {
            params.push(...convertResult);
          } else {
            params.push(convertResult);
          }

          if (allowUnits && input.unit) {
            params.push(o.literal(input.unit));
          }

          return params;
        }
      };

      // If we ended up generating a call to the same instruction as the previous styling property
      // we can chain the calls together safely to save some bytes, otherwise we have to generate
      // a separate instruction call. This is primarily a concern with interpolation instructions
      // where we may start off with one `reference`, but end up using another based on the
      // number of interpolations.
      if (previousInstruction && previousInstruction.reference === referenceForCall) {
        previousInstruction.calls.push(call);
      } else {
        instructions.push({reference: referenceForCall, calls: [call]});
      }
    });

    return instructions;
  }

  private _buildClassInputs(valueConverter: ValueConverter): StylingInstruction[] {
    if (this._singleClassInputs) {
      return this._buildSingleInputs(
          R3.classProp, this._singleClassInputs, this._classesIndex, false, valueConverter);
    }
    return [];
  }

  private _buildStyleInputs(valueConverter: ValueConverter): StylingInstruction[] {
    if (this._singleStyleInputs) {
      return this._buildSingleInputs(
          R3.styleProp, this._singleStyleInputs, this._stylesIndex, true, valueConverter,
          getStylePropInterpolationExpression);
    }
    return [];
  }

  private _buildSanitizerFn(): StylingInstruction {
    return {
      reference: R3.styleSanitizer,
      calls: [{
        sourceSpan: this._firstStylingInput ? this._firstStylingInput.sourceSpan : null,
        allocateBindingSlots: 0,
        params: () => [o.importExpr(R3.defaultStyleSanitizer)]
      }]
    };
  }

  /**
   * Constructs all instructions which contain the expressions that will be placed
   * into the update block of a template function or a directive hostBindings function.
   */
  buildUpdateLevelInstructions(valueConverter: ValueConverter) {
    const instructions: StylingInstruction[] = [];
    if (this.hasBindings) {
      if (this._useDefaultSanitizer) {
        instructions.push(this._buildSanitizerFn());
      }
      const styleMapInstruction = this.buildStyleMapInstruction(valueConverter);
      if (styleMapInstruction) {
        instructions.push(styleMapInstruction);
      }
      const classMapInstruction = this.buildClassMapInstruction(valueConverter);
      if (classMapInstruction) {
        instructions.push(classMapInstruction);
      }
      instructions.push(...this._buildStyleInputs(valueConverter));
      instructions.push(...this._buildClassInputs(valueConverter));
    }
    return instructions;
  }
}

function registerIntoMap(map: Map<string, number>, key: string) {
  if (!map.has(key)) {
    map.set(key, map.size);
  }
}

function isStyleSanitizable(prop: string): boolean {
  // Note that browsers support both the dash case and
  // camel case property names when setting through JS.
  return prop === 'background-image' || prop === 'backgroundImage' || prop === 'background' ||
      prop === 'border-image' || prop === 'borderImage' || prop === 'filter' ||
      prop === 'list-style' || prop === 'listStyle' || prop === 'list-style-image' ||
      prop === 'listStyleImage' || prop === 'clip-path' || prop === 'clipPath';
}

/**
 * Simple helper function to either provide the constant literal that will house the value
 * here or a null value if the provided values are empty.
 */
function getConstantLiteralFromArray(
    constantPool: ConstantPool, values: o.Expression[]): o.Expression {
  return values.length ? constantPool.getConstLiteral(o.literalArr(values), true) : o.NULL_EXPR;
}

export function parseProperty(name: string):
    {property: string, unit: string, hasOverrideFlag: boolean} {
  let hasOverrideFlag = false;
  const overrideIndex = name.indexOf(IMPORTANT_FLAG);
  if (overrideIndex !== -1) {
    name = overrideIndex > 0 ? name.substring(0, overrideIndex) : '';
    hasOverrideFlag = true;
  }

  let unit = '';
  let property = name;
  const unitIndex = name.lastIndexOf('.');
  if (unitIndex > 0) {
    unit = name.substr(unitIndex + 1);
    property = name.substring(0, unitIndex);
  }

  return {property, unit, hasOverrideFlag};
}

/**
 * Gets the instruction to generate for an interpolated class map.
 * @param interpolation An Interpolation AST
 */
function getClassMapInterpolationExpression(interpolation: Interpolation): o.ExternalReference {
  switch (getInterpolationArgsLength(interpolation)) {
    case 1:
      return R3.classMap;
    case 3:
      return R3.classMapInterpolate1;
    case 5:
      return R3.classMapInterpolate2;
    case 7:
      return R3.classMapInterpolate3;
    case 9:
      return R3.classMapInterpolate4;
    case 11:
      return R3.classMapInterpolate5;
    case 13:
      return R3.classMapInterpolate6;
    case 15:
      return R3.classMapInterpolate7;
    case 17:
      return R3.classMapInterpolate8;
    default:
      return R3.classMapInterpolateV;
  }
}

/**
 * Gets the instruction to generate for an interpolated style prop.
 * @param interpolation An Interpolation AST
 */
function getStylePropInterpolationExpression(interpolation: Interpolation) {
  switch (getInterpolationArgsLength(interpolation)) {
    case 1:
      return R3.styleProp;
    case 3:
      return R3.stylePropInterpolate1;
    case 5:
      return R3.stylePropInterpolate2;
    case 7:
      return R3.stylePropInterpolate3;
    case 9:
      return R3.stylePropInterpolate4;
    case 11:
      return R3.stylePropInterpolate5;
    case 13:
      return R3.stylePropInterpolate6;
    case 15:
      return R3.stylePropInterpolate7;
    case 17:
      return R3.stylePropInterpolate8;
    default:
      return R3.stylePropInterpolateV;
  }
}

function normalizePropName(prop: string): string {
  return hyphenate(prop);
}


text:
Cambodia's Anti-press Campaign Turns Sordid with Leaked Pornography Allegations
David Boyle
Sun Narin
Yeang Sothearin (L) and Uon Chhin (R), in undated photos.
PHNOM PENH —
Cambodia's crackdown on critical news media has taken a sordid turn with the publication of pictures purportedly showing a former Radio Free Asia (RFA) reporter filming and participating in pornographic videos.
The photos were posted last weekend on the websites of two pro-government news outlets, whose editors say the images were provided to them by police.
Prime Minister Hun Sen, whose government has already dissolved the country's main opposition, warned Thursday that journalism that threatens the government will be targeted. He did not address the release of the compromising images.
"The royal government of Cambodia will not allow the use of freedom in anarchic and illegal means to stage a color revolution to topple the legitimate royal government," he said, invoking an accusation that is now routinely deployed against any government critic.
Fresh News, which posted the lewd images first, said an anonymous police official had unearthed the material during a raid last week on an allegedly unlicensed karaoke video filming studio set up by former RFA reporter Uon Chhin.
He and former colleague Yeang Sothearin, who also goes by the pen name Yeang Socheameta, have been in custody, accused of continuing to work for RFA after the U.S. government-funded broadcaster shut down its offices in early September citing the government's "relentless crackdown on independent voices."
The two were charged with espionage under a vaguely defined law that criminalizes passing on information that could be deemed harmful to national security to a foreign state. If found guilty they could be sentenced to up to 15 years.
RFA responds to allegations
RFA spokesperson Rohit Mahajan said in an emailed statement that the broadcaster had not had a relationship, contractual or otherwise, with the two reporters since the Phnom Penh office was shut on Sept. 12. VOA has been unable to contact Uon Chhin for a comment on the photos while he is in custody.
The photos emerged soon after the arrests. Pro-government website Swift News published uncensored versions of the photographs, though later removed them from the website. But they remain in its Facebook instant news feed.
Fresh News still has pixilated versions of the photos on its site. CEO and founder Lim Cheavutha defended his decision to publish the photos saying his decision to blur the character's genitalia showed he followed an ethical code.
"As the news outlet, I get information from the government and police and I published it by confirming from the police. It is not related to the false report but it is just what the police gave [me]," he said.
Journalists sign petition
At least 80 local journalists have thumb-printed a petition calling for the release of Sothearin, who had worked as a news editor and office coordinator, and Chhin — a widely respected and popular veteran video journalist.
The Cambodian Club of Journalists (CCJ) and the Union of Journalist Federations of Cambodia (UJFC) both have refrained from making public statements in defense of the two reporters.
As head of the UJFC, an undersecretary of state at the Ministry of Interior and the head of news at television network CTN, Huy Vannak is in a unique position to view these events.
Vannak, who said he also informally advises Swift News and Fresh News on content strategy, stressed he was trying to stay neutral by providing legal support rather than opinions, but recalled some impressions of his former student Uon Chhin when pressed repeatedly.
"He spoke less. He was very soft but like I said, before and now is different. Like you are confused about Pol Pot," he said, pointing out that the former Khmer Rouge leader often came across as a smiling and caring person, even as his regime implemented policies blamed for the deaths of almost 2 million people during the late 1970s. "It is very hard for me to say and to judge personality," Vannak said.
Handling leaked news
Concerning the ethics of posting the naked photos, Vannak said he did not judge personally but behind closed doors had told those involved what was right and what was wrong.
"I explained to them leaked news is a tactic but as a journalist you would consider with a high morals what story you should run and then they decided to drop their decision."
He could not provide clear guidelines as head of the UJFC to journalists about how they could avoid committing "espionage" under the vaguely worded law, but said citizens needed to know "the value and frame of your rights" and exercise awareness.
"I tried to be very clear that if you consider, they are journalists and then what grounds to defend them because RFA denied that they [are] no longer working for RFA — then who they going to work for?" said Vannak, who himself used to work for RFA.
Sothearin's uncle-in-law, Lim Sim, said his nephew had stopped working for RFA before the arrest and had merely gone to the guesthouse where Chhin was apprehended to act as a witness - resulting in his own arrest.
"I don't understand the case," he said.
What Can Cambodia Take From Zimbabwe's Power Transition?
US Opens Bidding for $2M Eastern Cambodia Demining Survey
International Sanctions Loom After Cambodia Dissolves Opposition

redpajama_set_name: RedPajamaCommonCrawl


Touska, F.; Sattler, S.; Malsch, P.; Lewis, R.J.; Reeh, P.W.; Zimmermann, K. Ciguatoxins Evoke Potent CGRP Release by Activation of Voltage-Gated Sodium Channel Subtypes NaV1.9, NaV1.7 and NaV1.1. Mar. Drugs 2017, 15, 269.
Touska F, Sattler S, Malsch P, Lewis RJ, Reeh PW, Zimmermann K. Ciguatoxins Evoke Potent CGRP Release by Activation of Voltage-Gated Sodium Channel Subtypes NaV1.9, NaV1.7 and NaV1.1. Marine Drugs. 2017; 15(9):269.
Touska, Filip; Sattler, Simon; Malsch, Philipp; Lewis, Richard J.; Reeh, Peter W.; Zimmermann, Katharina. 2017. "Ciguatoxins Evoke Potent CGRP Release by Activation of Voltage-Gated Sodium Channel Subtypes NaV1.9, NaV1.7 and NaV1.1." Mar. Drugs 15, no. 9: 269.


text:
Home Events Short List Event Picks Tattoos, wine, theater and...water?
Tattoos, wine, theater and...water?
Our picks for cool things to do this week
by CityBeat Staff
Photo by Madeline Barr Photography
Nat Diego
While tattoos and wine don't have much in common, we do know that San Diego likes them both. Long gone are the stigmas when it comes to the former, and judging by the number of wine bars that have popped up over the last decade, the local appetite for the latter is right up there with sunshine and craft beer.
Two annual events, with a week's worth of fun between them, aim to appeal to each crowd. The focus will be on organic, natural and sustainable product at Nat Diego, an annual, weekend-long event that emphasizes nonindustrial farming and ancestral practices of winemaking.
"Nat Diego is focused on the fun of drinking good wine with friends and it's a unique opportunity to meet the talented people who are changing the way we enjoy wine," says co-organizer Katie Fawkes-Moore, noting that patrons will "taste the difference."
The third annual festival kicks off on Friday, June 28 with a series of seminars on producing natural wine at Vino Carta (2161 India St., Little Italy), followed by an opening party at The Rose in South Park (2219 30th St.) from 7 to 10 p.m. which includes tastings from women-run wineries. Saturday features a grand tasting event at Bread & Salt in Logan Heights (1955 Julian Ave.) from noon to 4 p.m. and then a closing party back at Vino Carta. Full details and ticket prices (which range from $20 to $60) are at natdiego.com.
Started last year, the San Diego Tattoo Invitational aims to showcase some of the most talented artists in the industry, with over 150 inkers from all over the world scheduled to make an appearance. The convention was started and is hosted by Full Circle Tattoo's Bill Canales and includes workshops, booths and yes, on-site tattooing. It happens from 2 to 10 p.m. Friday, June 28, noon to 10 p.m. Saturday, June 29 and noon to 7 p.m. on Sunday, June 30 at the San Diego Golden Hall Concourse (202 C St.) in Downtown. Tickets range from $25 to $60 at the door and more info on the event and artists can be found at sandiegotattooinvitational.com.
Photo courtesy of No Limits
THE SILENT TREATMENT
Twenty-three years ago, Dr. Michelle Christie founded No Limits, a nationwide nonprofit organization for deaf children and their families. Next week, in a continuation of its grassroots efforts to raise awareness, No Limits will present Silent NO MORE, a theatrical documentary that features a series of live monologues. Ten cast members share their own struggles and victories of living with hearing loss. Highlights from the cast include five-time American Comedy Award nominee Kathy Buckley and acclaimed author Rebecca Alexander. Silent NO MORE will be in San Diego for one night only on Saturday, June 29 at 5 p.m. at the Lyceum Theatre (79 Horton Plaza). Stick around after the performance for a Q & A, meet and greet, and book signing with cast members. Tickets are $25. More info on nolimitsfordeafchildren.org.
There's no doubt that the issue of water is one of the most underreported and contentious issues our state currently faces. The journalist, writer and son of Central Valley farmers, Mark Arax grew up understanding what a precious commodity water is and just how antiquated and potentially dangerous California's distribution system can be. He explores this and the lives it affects in The Dreamt Land: Chasing Water and Dust Across California, his follow-up to the award-winning The King of California. His new book combines old-school reportage, history and memoir to tell the stories of those most affected by California's water system, from the rich farmers to the day laborers. He'll discuss and sign The Dreamt Land at an appearance at The Book Catapult (3010-B Juniper St.) on Thursday, June 27 at 7:30 p.m.


Nii Dodoo Otoo is a musician, a designer, a promoter of creativity and most importantly, a humanitarian who offers help to people living with depression and addiction mostly through outreach programs and counselling.
With his work, he aims at changing the things he can for the better and teaching the people around him to do the same. He has spent a lifetime on the things he is most passionate about; making music, designing, marketing creativity and helping people with disorders.
He believes his country Ghana, has a lot of untapped potential safe spaces and is also of the view that creatives should make their safe spaces available to other creatives to help them grow to the point where the world at large becomes a safe space.
Success to him means crossing one check point and looking forward to crossing the next one. On a lighter note, it could also mean his friends can be able to afford a Bugatti if he can.
Nii disclosed to us in a Twitter conversation last week while discussing safe spaces for youth in the creative industry that he overcame his addiction for drugs through music and he just released a song to mark this milestone. The song he says was composed from lyrics of "a breakup letter" he wrote to his addictions concerning the depression and trust issues that come with it. Listen to his song here.
Previous Post What #SafeSpaces4Youth Means To Billy The Business and Fashion Guru Next Post Nadia Owusu represents STA AFRICA at the AU Young African Thinkr's Convention!
Proud of you bro, you're truly an inspiration. Keep up the great work!


A new Blender book is being prepared by the Blender Foundation and they still have some space left for input by YOU! Read on to find out more about it and see how you could contribute to it.
With the wild increase in popularity of our favorite Open Source 3D application, a lot of new users are coming to Blender. Some are completely new to 3D, while some are looking to add Blender skills to their existing production pipelines and resumes. Still others are considering Blender for classroom use. Although the online documentation for Blender is great, many of these new (and existing!) users prefer to have a physical book on their desk while they learn. That's why the Blender Foundation is producing a new book called Blender Basics.
The book can be used as a full introduction to 3D art and Blender, or as a reference for people already experienced with other applications. Each chapter consists of a tutorial section and theory section, meant to speak to new users and give them a grounding in the solid basics needed to succeed with Blender.
We are currently in the active production stage of the book, with several chapters already written and authors joining up as we go. Like so many Blender endeavors, this one too lives on the strength of the community. If you haven't been contacted to help, don't let that discourage you and please don't be offended! If you consider yourself a good (or great) Blender artist and can put a couple of sentences together in a reasonable fashion, we still need your help. If you want to help contribute to Blender's future in very a tangible way that won't cost you a penny, please email me at blenderbasics at harkyman dot com.
We'll keep you posted as the project develops.
If you can use some of this BSoD tutorial on using the GE, that would help a lot more 3D artists discover this great aspect of Blender.
Hmmm... Blender Basics.... This reminds me of the VHS tutorial video's of the same name. Anyone remember those?
One of the things I didn't like in ANY of the 'official' Blender Books (1.5, 2.0, 2.3) is that about 1/3 of the volume is taken up by the reference manual. Will this be the case here too?
Blender books are always welcome! What I'd really like to see is one that I can place open on my desk as I work... That probably means that I'd like it to be ring bound. The 2.3 book was excellent, but being such a hefty tome it refused to stay open at the page I wanted whilst I worked :( Is this binding format a possiblilty, or would it hike the costs through the roof? Just a thought, it's something that I always wish for where reference books are concerned.
: ) I'm one of those new blender users you were talking about. One of the ones who was totally new to 3d when I found this wonderfull program. I was really close to buying the old blender manual for the 2.3 releases of blender but I decided to wait for a newer revision. This makes me very excited to hear and I will be purchusing this as soon as its available. Although I am learning very quickly through the vast amount of online tutorials and such.
This will not be a reference manual. It's a series of tutorials and discussions designed to get people familiar with the most-useful parts of the toolset and to hopefully assist in their transition to thinking in "The Blender Way(tm)".
In some of the work that's been done already (like Materials and Texturing), we've found that indeed a whole book could be written just on that subject! This book won't be a substitute for an in-depth look at a topic like Tony Mullen's character animation book (http://www.amazon.com/dp/0470102608), but is meant to give new users a solid foundation in Blender so they can start to tackle the more advanced tutorial and reference material out there.
hmmm, yet another yummy book full fo blender knowledge to add to my collection. Think I'm gonna need a bigger bookshelf soon.
Don´t forget to talk about how to make precise rigging. Bones and objects orientations need more atention. There is a lot of wonderfull tutorials about how to set up an animation without a word about this kind of subject (how to set up clear orientations). Thats important because you can loose a lot of animation work when another version cames out.
There is also a very important subject without cover: character rigging for games. For artists there is not a clear path for it yet. There is a lot of talk about Collada integartion, etc but we are far away from having something closer to a standard.
I think a "basics" book is an excellent idea. I've been wanting something like this for years. However, I do agree with Mike that if your going to go in-depth on a particular area, that should be given it's own book. Like he said, there's a lot there to absorb.
What I'd like to see with this book is better editing. I know this will be produced in The Netherlands, and English isn't your first language. Obviously, you do have people who have a good working knowledge of English, improvements still need to be made regarding grammar and syntax, IMO. I've lost count on the number of such errors I've found in the 2.0 and 2.3 books. You need someone who is well versed in English in it's written form.
And speaking of the 2.3 book, PLEEEEASE make sure the screenshots are in color and not washed out. Yeah, I was one of the lucky ones who got one of the first-run issues.
Finally, will the book eventually be posted to the Website like the 2.3 guide?
I think an important word here is basic. If we really want to help the average person the use Blender it must start basic. I think even the traditional Gingerbread man tutorial might be a little too complicated to start out with. For instance, I have developed a simpler method that even my third grade students can follow. Also, methodologies have changed with the advent of the mirror function. This book can take advantage of those things now.
Maybe, if demand is high, after this book there could be a "Blender Advanced" book, or series of specialized books.
Sounds like what I tried to do with my book... Like to see it cover a few more areas than mine. Now I won't have to keep mine up-to-date!
Oh great! a Blender basics book is just what I need. There have been those times when I think i need some more understanding of Blender. But who knows, I already know the BASICs of Blender, I think.
JimC should be one of the ones helping to write this book I think. When I can't personally teach someone about Blender, I always pass on that book.
Heh. Actually, I'm not only a native English speaker, but I'm an Ivy League educated (writing major) American who wrote something like 60,000 words myself last year. I've also been part of professional editing and book production pipelines before. From a style and proofing perspective, the written word content of this book will compare favorably with (and, imho, surpass) the quality of content of any of our "competitions" books that are on shelves at this very moment.
Now forgive me if this is off-color but...(don't you just hate that!) with all the 'other' 3D programs out there wouldn't it be great to have a translation or two for those of use that have started elsewhere first? (Just the Big Boy's) The learning curve is one of those things that will keep many a future 'Blender-Head' away.
And remember the words of George Orwell, "..less is more". If a topic is tackled take it to the finish, or just leave it alone for a supplement. I for one would have loved one on Animating with IKA's and Bones that left me feeling better than I do today!
Oh, and by the way...I just can not get over that everyday there IS something new about Blender on your sight! Great job!!
Sweet, just what the world needs!
I actually taught yr9 and yr10 at my school cause I had some spare time in between studying for my exams. I pinched and slightly modified some tutorials on basic modelling and textring from some german guy to help teach the kids.
Would you guys want the tutorials that I (half) wrote?
And will the cd included with the book (I think there is one as one is shown in the pic) have sample .blend files? I made some to go with the tutorials.
FromTheDark: One thing I haven't mentioned about the book yet is that it IS intended to be used by people coming from other 3D applications. Once a user has read the basic interface and object manipulation chapters, they should be able to bounce around to whatever topic they need to learn at the moment. In that sense, the chapters are atomic for people with previous 3D experience. Also, the back of the book will contain (if I can pull it off) an index for each of the popular 3D apps (Maya, 3DSMax, Lightwave, etc.) with their major features listed, followed by what it's called in Blender and on what page you can find how to do it.
Oh, good to hear about the editing Harky. I was gonna donate my time to proofreading after having been irritated at the errors in the last one. It's all I could donate, since I am a poor newb at Blender, but am a good proofreader. However, seems like you have things well in hand. I'll definitely be getting one of these to hopefully become at least mediocre.
>>Maybe, if demand is high, after this book there could be a "Blender Advanced" book, or series of specialized books.
For some reason my post above was lost in space, most annoying!
Unsettlingsilence, I had suggested something like this to Roland in an email suggestion for the book. I considered perhaps creating 3 volumes (not necessarily bu him), beginner, intermediate, and advance. I suggested that his, and the suggested other volumes, should perhaps better serve users if they were PROJECT books, each containing a complete project from start to finish, showing how to use blender in a "real-world" scenario, as opposed to having a series of disparate tutorials. For instance, in the advanced version of such a book, Elephants Dream could be used as the project. I believe this might be a better approach to learning blender, as it focus on creating a cohesive understanding of blender's toolset.
Unfortunately due to the nature of his resources this approach is a not a viable one for th eproduction of this book. This is understandable, and I wish him and his contributers the best inthe creation of this book.
Harkyman, that sounds great and I for one hope you can pull that off! Once the rest of the '3D' world really gets a good face-to-face with Blender, get ready for the flood.
Sounds great, hopefully the content new guide will be different, not like the 2.3 guide, some of the content are could be found from manual reference.
i really like the idea of a "dictionary" for other 3D apps users coming from 3DS, maya or lightwave b/c i know of people in my circle who are using those programs. it would help me translate their technical lingo to blender.
i agree with samtheeagle to design the book in a way that it stays open when used as a reference. maybe there's a possibility to split the book in several volumes???
are you guys planning on an alternative to the printed version like a downloadable one (eg. in PDF format) although it might be a huge download? or how about a handbook on CD? it would probably be much cheaper anyway aside from saving trees, saving postage, and what not. i personally would definitely purchase either one. another advantage, i could print out only the sections that i would be learning from and could add my own scribblings without feeling guilty of ruining a nice handbook.
The perfect combination would be to have a basics book similar to Jim C's book and a CDROM or DVD with Video Tutorials similar to Neal Hirsig's video tutorials at the Tufts University's site. Jim C's book is an excellent basics book that helped me learn a great deal about blender when starting out. Neal's tutorials are neat packets of information.
Jim, being in education myself I totally understand.
As for this book, if I might make a suggestion, I like the concept Vidrazor set forth of a series leading to a completed project. However, I understand this would be a huge undertaking. Perhaps an easier theme for this book could be: "Creating a Portfolio".
As 3d people know part of the road to success is in creating a reusable portfolio of objects and materials. Simple objects like glasses and materials such as realistic metals and glass could help people gain a working understanding of blender, while the creation of say a nice looking fork could make for a simple tutorial to follow. Each simple object could be designed to cover another aspect of modeling. A person would end up with something reusable and a sense of accomplishment. Textures would be swappable and objects appendable to say a final dinner table scene, or something like that. A person could fail a tutorial without feeling like they can't do anything. Also, from the start there should be an emphasis on work flow since it is essential in completing a project in a timely manner without feeling lost. If I were creating a book all of these themes would be in every section: Usable and reusable interface setup, usable and reusable props and materials, and good work flow all contributive to an achievable goal. A solid understanding of the buttons window and menus are also important since it is easy to forget hot keys. This would be my beginning book.
I also have the Blender 2.3 guide and used it quite a lot in the beginning. The one thing I found annoying as a beginner was the fact that the greyscale images (obviously) did not contain colour - and the colour in some of the diagrams sometimes matter - especially when you are a beginner.
I know colour printing would cost more, but can't one print at least some of the key diagrams in colour - without resorting to glossy paper? When I was unsure, I had to resort to the web (colour) diagrams.


This is exciting to have gotten down nearly 25 pounds in 40 days. But, I have about 32 days to go before the Great American Fitness Challenge 5K event and my hope is to be at 400 pounds by that day. So, I will need to push a bit harder to get there. Not gonna stop!
David and sweetheart Julianne. The best mother I know.
As I mentioned, yesterday was Mother's Day. It was a day for church and hanging with my sweetheart. Made it a day of rest.
We had a brief nap…actually never got to sleep…and then some of the grandkids came over to wish their sweet grandmother a happy Mother's Day. Always fun to have those sweet kids around. Then we had a nice dinner that she and I worked on together and then we called it a day.
Before bed Julianne focused on getting us some juice and salads for Monday. Starting it off again to push for more weight loss and healthy eating this week! May the next 40 days commence!
Happy Mother's day to your beautiful Julianne, who is the best partner you could ever have, I do believe. She's gorgeous, she supports you, she's looking after herself too; what more could anyone want? I am thrilled to see your numbers steadily dropping, and I'm serious when I say you are inspiring me to a healthier lifestyle, and hopefully weight loss as well. If you can do it, then maybe I can do it, and you Can do it, so I can too? Win win!! 😀 Heyyyyyy…maybe see you at Woodflock, eh?
Yes…indeed…you WILL see me at Woodflock!! And I'll be doing the "Woodflock Walk" everyday (just made that up)!!


Some people are surprised to learn that there is a difference between assisted living and independent living. The reason for the confusion is because many senior living facilities now offer both assisted and independent living services in the same building. Some seniors start off living independently and then move to assisted living where they can get more help with daily activities.
Let's learn more about these two types of living arrangements and the benefits to each.
Independent living. Independent living is a great option for older adults who can live on their own but enjoy having access to help when needed. Independent living facilities provide their residents with access to dining, medical care, entertainment and more. Housekeeping services, meals and laundry are usually offered for an extra cost.
Assisted living. Assisted living is good for seniors who need help with daily activities such as cleaning, laundry and preparing meals. Seniors in assisted living can still lead an independent life, but support is available. Housekeeping and meals are typically included with assisted living, but some other services (i.e., medication management, help with showering) may cost extra.
When is Independent or Assisted Living an Option?
Not all older adults age in the same way, but generally speaking, the pattern looks like this. A senior remains in the home for as long as they can, usually because this is what they want and it's the most cost effective option. As families see their loved one needs a little "extra", they either hire an in-home care provider or are moved to a senior living facility.
Assisted living and independent living facilities assess residents before placing them. Those who live in the independent housing are, for the most part, completely independent. Those who are placed in assisted living need more help from the start. No matter how the individual progresses, there will be services there to support these needs.
Because assisted living centers are a major investment, many families do try to keep their loved ones in their homes for as long as possible. There is no right or wrong decision – it's about choosing what is right for your loved one and your family. The most important part is that your loved one is receiving the right care for their needs.
To learn more about the private senior home services offered by Family Private Care, call us today. We're able to help many older adults remain in their homes while giving them the care and attention they deserve.
Whether you are looking for joyful companionship to assist with everyday activities so you can continue your independent lifestyle, or you need more advanced personal care or medical assistance in your home, Family Private Care can match you with a caregiver who will help you achieve your goals and provide you and your family with peace of mind.