With the advent of open-source software, CIOs could comfortably avoid technology lock-in, as they could go from vendor A to B in case you did not like the support or documentation from vendor A. However, as Barbara Darrow describes in this article appearing in CIO.com, there are still some caveats that smart tech buyers should consider. Let us take a look at some of them.
When an infrastructure provider offers his own implementation of a tool but fails to submit code tweaks it takes to run that open-source tool on its own system to the broader community, then these changes will not be replicated by other infrastructure provider versions of the same tool. This will limit the businesses options.
Besides, cloud lock-in could occurs when a vendor does not share tweaks he makes to the public cloud provider's open-source software with the broader community. Open-source is "open-source" in all but name when vendor lock-in occurs i.e. when an open-source product is owned and managed by a single provider in its walled garden. This can hinder smooth migration.
Developers are happy to embrace tools which are easy to get, test and use. Therefore, it is the CIO's job to keep an eye out for problems which might occur with these same tools down the road.
Stephane Lamoureux, chief operating officer of Virtual Artifacts says that CIOs should ensure that open-source tools are shared with the community without any single vendor control – this will ensure that tools have more universal appeal. If they are "open-source" but do not share with the community, they are not open-source anymore, but proprietary.
Keep the open-source flame burning bright!
Michael Azoff, principal analyst with Ovum Research says that enlightened self-interest should stop all concerned parties from profiting from open-source. Further, open-source will die out if developers refrain from sharing their tweaks, and this will kill their own implementations as well. Lamoureux adds that non-sharers may force users to go to competitors instead.


text:
Friday, 5 October, 2007 by Nameless
D  a dragonIn the West the dragon was the natural enemy of man.  Although
preferring to live in bleak and desolate regions, whenever it
was seen among men it left in its wake a trail of destruction
and disease.  Yet any attempt to slay this beast was a perilous
undertaking.  For the dragon's assailant had to contend
not only with clouds of sulphurous fumes pouring from its fire
breathing nostrils, but also with the thrashings of its tail,
the most deadly part of its serpent-like body.
[ Mythical Beasts by Deirdre Headon (The Leprechaun Library) ]
"One whom the dragons will speak with," he said, "that is a
dragonlord, or at least that is the center of the matter.  It's
not a trick of mastering the dragons, as most people think.
Dragons have no masters.  The question is always the same, with
a dragon:  will he talk to you or will he eat you?  If you can
count upon his doing the former, and not doing the latter, why
then you're a dragonlord."
[ The Tombs of Atuan, by Ursula K. Le Guin ]
NetHack may be freely redistributed.  See license for details. (white
dragonIn the West the dragon was the natural enemy of man.  Although
NetHack may be freely redistributed.  See license for details. called
Dragley)
...}}...............
..}}............r...
..}}......D.........
..};}...............
.}}}.........r...S..
D "*yawn* I'm exhausted today ..."
.}..................
}}.......}}}}}};....
...};}}}}}....}}}};}
..}}................
..}}...........r....
..}}}...............
.}};.D........r..S..
D "Mmm, this looks like a nice spot in the sun."
Dragley falls
asleep.
...}}}}}}}....}}}}};
...;}...............
..}}}..........r....
.}}}.D.........r....
...};.............S.
}}.......}};}}}}....
...}}}}}}}....}}}}}}
..}}......r.........
..}}..............S.
..;}}...............
.}}}.D..............
...}}............S..
Dragley wakes up.
}}.......}}}}}}}....
...}}}}};}....;}}}}}
..}}..............r.
..}}}...........r...
.}}}.D............r.
...}}.......S.......
D "Oww, my back. I should have ..."
NetHack may be freely redistributed.  See license for details. (red
...;}..............r
..}}}..........r..r.
D "Gah!"
This effect may also occur after eating chilli peppers.
Dragley? sigh I hate you now.
Mordae
Apply what? q - a tin of"You know salmon, Sarge," said Nobby.
"It is a fish of which I am aware, yes."
"You know they sell kind of slices of it in tins..."
"So I am given to understand, yes."
"Weell...how come all the tins are the same size? Salmon
gets thinner at both ends."
"Interesting point, Nobby. I think-"
[ Soul Music, by Terry Pratchett ]
NetHack may be freely redistributed. See license for details. green slimeThese giant amoeboid creatures look like nothing more than
puddles of slime, but they both live and move, feeding on
metal or wood as well as the occasional dungeon explorer to
supplement their diet.
But we were not on a station platform. We were on the track ahead
as the nightmare, plastic column of fetid black iridescence oozed
tightly onward through its fifteen-foot sinus, gathering unholy
speed and driving before it a spiral, re-thickening cloud of the
pallid abyss vapor. It was a terrible, indescribable thing vaster
than any subway train -- a shapeless congeries of protoplasmic
bubbles, faintly self-luminous, and with myriads of temporary eyes
forming and unforming as pustules of greenish light all over the
tunnel-filling front that bore down upon us, crushing the frantic
penguins and slithering over the glistening floor that it and its
kind had swept so evilly free of all litter.
[ At the Mountains of Madness, by H.P. Lovecraft ]
NetHack may be freely redistributed. See license for details. named Aloe
Does this mean he'll eventually turn into a brown dragonIn the West the dragon was the natural enemy of man. Although
and disease. Yet any attempt to slay this beast was a perilous
undertaking. For the dragon's assailant had to contend
dragonlord, or at least that is the center of the matter. It's
Dragons have no masters. The question is always the same, with
a dragon: will he talk to you or will he eat you? If you can
Mordae, rofl :)
Bumped down to M for using Dragley rather than FiDo.
Feory
But FiDo was Dudley's pet dragonIn the West the dragon was the natural enemy of man. Although
NetHack may be freely redistributed. See license for details., whereas this apears to be something different, also a comic isn't more or less intrinsically funny just due to a character's name, especially when they aren't actually defined characters. Are you saying that all pet dragons in future comics should be called FiDo just because one was named that long ago?
Sorry, but that kinda bugged me.
noleti
and why wouldn't FiDo, Dudley's pet, be attacked while he is sleeping?
This normal dungeon inhabitant only behaves similar to Dudley, that's why his mom called him Dragley...
also a comic isn't more or less intrinsically funny just due to a character's name,
It most certainly can be. If a comic annoys you, it's less funny as a result.
What's so hard to understand about that?
(And borrowing a running gag from another comic is lame, 'homage' or not. Especially when said running gag was just somewhat funny, and that, only because it hadn't been done before.)
Itinerant Dragley, today, a red dragonIn the West the dragon was the natural enemy of man. Although
NetHack may be freely redistributed. See license for details., tomorrow, a memory!
SQLGuru
I see that I must come up with a submission or two.....off to be mildly funny (or for that matter, mediocrely funny -- something is better than nothing).
Excellent idea.

redpajama_set_name: RedPajamaCommonCrawl


text:
Home interior designer's website shows pictures of baby boy's body parts
HOME INTERIOR DESIGNER RYAN HAGGINS (BIO) has been found guilty of defrauding his clients out of more than $50 million in an online business scheme that targeted pregnant women and elderly people.
Mr Haggins, 39, pleaded guilty in U.S. District Court in Los Angeles on Friday to one count of wire fraud and one count each of mail fraud, identity theft and money laundering.
In court papers, prosecutors alleged Mr Haggens was a member of the group known as "The People" that recruited elderly people and women for the scheme.
He had allegedly been making payments on behalf of the scheme to women who were over 65 years old, prosecutors said.
The scheme involved arranging a monthly payment to an elderly woman in California for a baby boy and then paying for the child's burial, according to court documents.
In some cases, the baby was buried with a woman's ashes.
Prosecutors said Mr Haggs paid the woman $100 a month for the boy.
The woman told prosecutors she had been tricked into signing a false insurance contract that he signed for her and paid $30,000 in the fall of 2016.
She was a victim of fraud, the prosecution said.
Ms Haggkins' lawyers did not immediately return a message from the AP seeking comment.
The charges against Mr Haggins come amid a nationwide investigation into the scheme by the U.N. Office of the High Commissioner for Human Rights.
In June, the U and U.K. agreed to settle a civil fraud case against Mr Trump's campaign for $10 million.
Mr Trump said at the time that the payments were "disgraceful" and that he had personally signed off on the payments.


Welcome to Movie Monday! Mondays will be special here at CBFW where I will feature one movie and the wedding inspirations we could derive from it (as suggested by my sister Dette!).
For our first Movie Monday, let's take a look at the very fab, all-time-chic-movie starring Audrey Hepburn: Breakfast at Tiffany's.


#49 Made from a lovely vintage floral furnishing fabric with sturdy British racing car green handles. This is one would be perfect for a trip to the flower market.
This bag is huge at 40 cm wide and 51 cm deep with a 34 cm handle depth which is long enough to fit easily over your shoulders.


AMREF UK (African Medical Research Foundation) has launched a Emergency appeal to save lives in the aftermath of Kenya's post-election violence.
This entry was posted	on Tuesday, January 29th, 2008 at 7:40 pm	and is filed under Kenyan Democracy. You can follow any responses to this entry through the RSS 2.0 feed. You can skip to the end and leave a response. Pinging is currently not allowed.


text:
Posts tagged 'Barely Blogged'
Eaten, Barely Blogged: Portland Update January 2018
It is still slightly weird that I've been back to Oregon so many times since January 2016. Portland has its charms but I'm still wary of fully embracing them. It's not a bad place to eat, though.
Nimblefish I wasn't really impressed with Portland fave Bamboo Sushi or even Nodoguru, though that was due to more of a vibe thing than a reflection on the product, so I was curious about Nimblefish which seemed to fill the niche between generic sushi and omakase. You can walk in; it's not a big to do. You check boxes and each piece is made and placed in front of you one-by-one, which I prefer to all-at-once on a plate. It's not cheap since it's a la carte not combo-style, but not prohibitive (many nigiri are $3-$4). The menu is tightly edited and changes based on availability. I wanted to try both Hokkaido and Santa Barbara unis (which I'd seen on Instagram) but only the latter was on hand. That was fine. I ended up ordering more than I had intended–seven pieces in all–because I was fresh off of multiple happy hour vodkas at Kachka: hotate, tako, maguro, uni, akami (not pictured), chu toro, sawara. I would probably go here regularly when I get the urge for good sushi without a wait or too much fanfare.
Ate-oh-Ate I've probably said this before but Portland has an outsize Hawaiian presence. I've been told it's because a lot of Hawaiians go to University of Oregon and just stay after graduation. Maybe. I don't know. I was staying at an Airbnb and tried to acclimate to my daily 10:30am NYC work call at 7:30am, which is very West Coast. Just like the inexplicable Hawaiian thing, people start work very early on the West Coast–at least in Oregon–even if they don't do business with the East Coast. Like an 8am start time is normal. My mom, who just retired, started around 7am, I think, and her crazy husband gets to work at like 5am when he doesn't even need to. People think I'm nuts when I say I don't go to work until 10am (which is more like 10:30am but I don't want to shock them too much). Anyway, I was working "at-home" and wanted lunch delivered. The Seamless scene is kind of sad, delivery is not a thing, and extra fees abound. Ate-oh-Ate did deliver, though, and why not a plate lunch? The double starch of macaroni salad and rice always gave me pause but I'll admit it's really good together (one scoop of each is plenty, though). I completely underestimated mayo-heavy macaroni salad, here served with teriyaki beef, and a side of chili water (the middle container), which might be my new favorite condiment (it's spicy vinegar, not water).
Langbaan I still love what Langbaan is doing. On my third visit the theme was Bangkok street food (both other visits happened to be Central Thailand). Not all the dishes sounded alluring on paper (think I was just objecting to the "spinach noodles") but none turned out to be duds. The salad of oyster, tripe, trumpet mushroom, wood ear mushroom, ginger, scallion was up my alley and my favorite might have been one of the three entrees: kor muu pad kapi/pork jowl, shrimp paste, jalapeno, crispy betel leaf, which hit all my fiery, funky, fatty buttons. I discovered that the long-distance boyfriend isn't really a tasting menu person, which I kind of knew but I wanted to treat because I enjoy the experience from time to time. It can be pretentious for a server to (over)explain all of the ingredients (his complaint) but that just goes with the territory. I've been to Yarowat, Bangkok's Chinatown, but I'm not going to be a brat about someone explaining it to me in the context of a dish.
Chart House When you start your workday at 7am, you can kick off at 3pm, which is disorienting. That seems like a vast amount of free time but then you realize you can't stay up as late as you're used to. But one advantage is being able to go to happy hours, something I'm rarely able to do in NYC. Plus, happy hours are more of a thing in Portland, not just at bars but restaurants, even nice restaurants. Chart House is a "nice" restaurant in that it has a view (supposedly of all three area mountains) and it's where people go for their anniversaries and maybe 50th birthday parties. This is probably the case in all cities (it's a Landry's chain). Apparently, in its former incarnation, Hillvilla, my mom went with her eighth grade class for lunch. When I ended eighth grade, we only got to go to Oaks Park on a school bus where the kids were screaming along to John Cougar Mellencamp's "Rain on the Scarecrow" and mocking the lyrics. I would not eat at Chart House, the restaurant, but I was curious what the downstairs lounge would be like for happy hour. There is cheap wine and well spirits (the discounted cocktail are all too sweet) plus calamari, fish tacos, sliders, ahi nachos, and the like. Nothing mind-blowing. On the non-discounted menu, they featured cocktails made in those Porthole infusers made famous by The Aviary, a trickle-down effect in the wild.
Kachka I still haven't eaten a proper meal here since I've only been solo during happy hours, which are very good value. I ended up with steelhead roe with challah and smetana butter (like creme fraiche), cabbage roll stuffed with beef, pork, and lamb, plus green walnut-infused vodka, cranberry-infused vodka shot and a beer, and one more vodka that I don't even remember.
Clay's Smokehouse I wouldn't seek out barbecue in Portland, and have no desire to try the few spots that get acclaim (and even less desire to try vegan barbecue) but my vote for pizza was nixed when I discovered pies named after old-school Portland music scenesters. Farther down Division Street, it appeared that a long-time barbecue joint that I had never heard of but the companion always liked, moved across the street, so I was amenable to checking it out. The ribs were fine, I don't love home fries, I wished the Texas toast was cheese bread, and the kale with almonds in a very tangy dressing was surprisingly good. I was more enamored with the Miller High Life pony bottle.
Eaten, Barely Blogged: Vancouver BC
Wildebeest I thought horsemeat was more associated with Quebec than British Columbia (I did buy some frozen slices in a Montreal grocery store for "Chinese fondue," crammed it in my hotel's fridge and it thawed and bled all over the mini bottles) and as a Pittsburgh restaurant was just causing outrage for serving horse tartare, I couldn't resist ordering the same off a late night happy hour menu (bolstered by poutine and a beet dish that was better than everything) because I'm a tartare freak. Pretty as can be, though I didn't care for the chopped, pickled carrots and celery mixed with the meat that had a surprising funk since it added too much sourness. The hay-toasted mayo was appropriate and inappropriate at the same time, and the sous-vide egg yolk put it over the top.
Dynasty Seafood I don't usually believe anyone who says they don't like dim sum. Despite an hour wait (I shrugged off making reservations—don't be like me), I might have converted a skeptic with those sweet, pastry pork buns that were brought around immediately after we were seated and dying of hunger even though this was a modern ordering-off-the-menu place. There were spring rolls filled with a shrimp mousse that tasted like hotdogs. An order of pea shoots and squiggly hand-made udon with XO sauce appeased the skeptic. I couldn't finish the wu gok stuffed with duck and chestnuts and wrapped 1.5 pieces a napkin and stuffed it in my purse then forgot about it until I got back to Portland.
Joe Fortes Seafood and Chophouse I still don't know if the last name of this famous local figure (looked at his wikipedia page–and he was a lifeguard from Trinidad?), whom I saw also has a library named after him, is pronounced fortay, forts, or fortez. Anyway, any establishment that has chop house in its name is total catnip to me and I drank way too many happy hour old fashioneds, especially since $5 was $3.70, and ate a bunch of tiny lobster and shrimp rolls, giant shrimp tempura, and truffle fries (I know) and was too full to try and hit hot Italian-Japanese spot Kissa Tanto to finagle a table when it opened at 5:30pm. I want to be a Kissa Tanto type of woman, au courant and great to look at, but I'm 100% Joe Fortes, dated and brassy.
Maenam This could've been the best Thai food in Vancouver, or Canada, but the lack of air conditioning and the subsequent sweat wetting my hair (not from the spice level) was too distracting to enjoy the well-priced (everything was well-priced as the exchange rate equaled 25% off) tasting. I did love one of the servers', who was not young, subtle mauve-tinged hair since I had just attempted to give myself a plummy ombre effect two days before.
Bao Down I would've preferred dinner to brunch since it seemed more traditional but we can't have it all. A longanisa breakfast dish resembled no tselog (the menu didn't promise a tselog) I had ever seen but something more delicate, pretty, and dare I say, healthier, than I would expect from Filipino food. Nice.
Hon's This was a nostalgia lunch, for the boyfriend not me, and the cavernous dining room with multiple stations, yet only 10% full seemed bigger on atmosphere than food. Not that any of the things we over-ordered (roast pork and pot stickers were not necessary) were objectively not good, I'm just sure better versions could be had in the city. I was picturing a wonton noodle soup bowl like Noodletown but this portion was gigantic with practically an entire duck chopped into it and likely four recommended daily servings (if any government body dictated these things) of springy egg noodles. I did what I could, left lots of noodles (and appreciated being asked if I wanted them wrapped up since I'm a leftover freak/food hoarder, but declined) and took the fatty pork wedges for later.
Novo Pizzeria I never made it to any of the cocktail bars near our Airbnb that I'd read about or Kissa Tanto, which I couldn't get reservations for three weeks out. This wasn't an ambitious food vacation but a long-distance meetup so I set up a Door Dash (no Seamless in BC, nor Uber and Lyft) account and got a chorizo, honey, and thyme sort of pizza delivered to the apartment, which I realized too late had no intercom. I don't get to do the lazy Netflix (not saying and chill) thing with a guy usually so it was a novelty. I watched Win-Win (not my pick) and I Don't Feel Safe in this World Anymore (my pick) though I had seen both already. I did not take a photo, so you will have to enjoy a public library instead.
Eaten, Barely Blogged: Memorial Day Weekend in Oregon
Jackrabbit Meals other than dinner aren't optimal for assessing what a restaurant can do. I took my mom to the new Chris Cosentino restaurant in the Duniway Hotel for a belated Mother's Day lunch. It was sparsely populated, which could've been because it's new or it's not the type of place the average Portland person (or tourist–I couldn't believe the crowds outside clearly from out of town) goes to lunch downtown. My first impression was disappointment since they didn't have the sal de gusano (I ordered it precisely because that's a hard to source ingredient) described as the rim for my cocktail, The Crank (mezcal, Pommeau de Normandie. lime, agave, basil). The pig's ears were good, crunchy bits balanced by gelatinous strips. My mom's french onion soup looked insane, not just with the blanket of melted cheese but a hunk of marrow bone sticking out. At lunch, sandwiches are the focus so I tried a banh mi with pork belly and big fat fried oysters and wanted to die. I'll hold off on forming an opinion since I didn't sample any of the ham or large format curiosities like the pig's head with "brainaise." I still haven't been to Headwaters in the Heathman Hotel either, which I should at least for reference purposes but I'm not terribly excited about hotel dining in Portland.
Tad's Chicken 'n Dumplings a.k.a. Chic Dump per the neon sign and URL, has existed for as long as I remember in Troutdale, one town over from where I grew up, but I'd never been and when I complained to my mom about it on this trip she didn't seem surprised or to care. This is important business! I've also never eaten chicken and dumplings in my life, which seem more Midwestern than Northwestern but Oregon and Washington are lacking in a regional cuisine anyway. It's on the Sandy River where we went as hormonal teens, inner tubing and sunbathing and fended off gross guys with cut-offs and mustaches. I just listened to a Walkman and read The Boys on the Rock and imagined Simon LeBon was featured in the cover illustration. People said that the chicken and dumplings were not good. They were in my book because I like sinking my teeth into some serious carbs, but the combination of cubed, skinless chicken and wet pillowy whiteness is kind of like nursery food, soft and bland, more salty than anything. The above photo is misleading; that serving presented in a metal raised dish could feed at least three people and I can't imagine you'd use up all of the extra gravy, especially after the relish tray, salad, and big plate of chicken livers with ketchup, an unnecessary extra I ordered because they were cheap, also a bottle of Oregon Pinot Noir since 90% of them ranged from $20-$25.
13 Virtues Brewing First choice for a meetup with my mom and grandma was Iron Horse, closed on Memorial Day, then moved to SanFelipe Taqueria, also closed. Apparently this place in Sellwood has been serving cheesesteaks since the '80s (the boyfriend said he went there in high school) though at some point it re-branded to a brew pub because in Oregon everything is brew pubs and changed its name. I forget no one uses Cheez Whiz outside of Philadelphia minus a few purist spots, so I was bummed by my melted provolone.
Crackerjacks This bar/restaurant looks like it has been on the corner of Thurman and 27th forever but I had never been and don't recall its existence in my day. I liked it enough to return twice, though. Once just for drinks, the other for a cheeseburger. There is also a pizza menu though the pizza oven was broken on Memorial Day. Clearly, you're not supposed to go to restaurants on Memorial Day. I like to disparage Portland but most everyone is nicer than in NYC. I was complimented on different dresses numerous times and was told I "looked adorable" by a waitress here. I think the last time a stranger said I was cute in NYC, it was a hostess at Mesa Grill in 1999.
Bamboo Sushi Since I have been returning to Portland for close to a year-and-a-half I have avoided this popular place as it seemed like white people sushi, which is rich coming from me since I am pretty callous about the whole cultural appropriation kerfuffle that emerged when I was in town. I don't care if white people make sushi but this restaurant was exactly what I had pictured: pristine and sustainable fish choices, not quite traditionally presented, a little pricey, and sloppy service. A young woman had a new young man shadowing her and that might not have been the best pairing as I wouldn't have known she was training him if she hadn't said so. I couldn't argue with the sweet crab legs and surf clams in my $27 chirashi (not sure about the microgreens and red onions). I also managed to snap a wooden arm rest off my chair when scooting closer to the table, which has nothing to do with anything, but added to the off-kilter-ness.
Old World Deli My mother and I met my sister in Corvallis, at her suggestion, despite it in no way being the half-way point between Portland and Eugene. A cousin who works two blocks away alos joined us for lunch. I ordered first–an important point–a reuben sandwich, and then all three family members subsequently ordered the same thing even my sister who I hadn't seen eat meat since 1990. I'm usually vehemently opposed to anyone in the same party ordering the same dish, but by necessity I've become a kinder, gentler human when in Oregon, plus at a random deli that looked like a Veteran's hall, staffed by teenage boys…who cares? The sandwiches were fine, though the marble rye was too soft and stuck to everyone's teeth. That's just one reason why I'm not including any pictures of people.
Eaten, Barely Blogged: Two Meals in Astoria (Oregon not Queens)
Buoy Beer Company Everyone, if they even know what Astoria, Oregon is, says to go to the Goonie house but I don't really give a shit about Goonies. It's a weirdly millennial folly despite the movie coming out in 1985. I mean, there was an entire big spread a few summers back in Lucky Peach devoted to Goonies (which doesn't appear to be online and it's just as well because my links might be dead sooner rather than later). I was really more impressed by the seal, ship, and rainbow I captured through the window while sitting inside Buoy Beer Company.
I lucked out because it was stout month and that's my scene, not the IPAs plaguing the Pacific Northwest. And the food was surprisingly (not sure why I was surprised) good. I had an oyster pot pie, filled with super plump oysters, local, of course, with maybe the best side salad (pickled vegetables, asparagus spears, homemade croutons and dressing, a scattering of seeds) I've ever encountered. The Oregon pink shrimp cheesey bread was totally overkill but delicious, nonetheless.
Fort George Brewery Astoria was meant to be a day trip since it's only an hour-and-a-half up Route 30 from Scappoose where I saw a second branch of Itxtapa, a bar/restaurant called Hump's, and a long-closed dilapidated near-shack called Myong's Seoul Food, surprising since I can't imagine any Koreans living in this part of Oregon, but I got a motel for like $60 and decided to stay overnight.
Dinner was tricky because after dark, in winter, on Monday, the town was ghosty, the only people on the street were shouty doorway-sleepers. I wanted to go to Albatross & Co. (dungeness crab deviled eggs, oyster chowder poutine, craft cocktails, blah blah) but it wasn't open. It's not that weird to eat at two different brewpubs for two meals on the same day in Oregon. I really wanted the steak frites with blue cheese sauce, which my companion ordered, but settled for a smoked fish plate teeming with salmon, trout, pickled herring. Also smoked hazelnuts/filberts (I'm trying to bring back the latter usage). Yes, we could've shared.
Astoria, set where the Columbia River meets the Pacific Ocean, is hard to pin down. Like most Oregon Coast towns it's a bit rough and tumble but there are cutesier elements creeping in. There was just not a video store still in business downtown, but also a JCPenney and Sears in 1940s (just guessing the era) storefronts, which I didn't get to take photos of before the sun set. But also a vintage hardware shop, a hair salon called Hygge, and a modern, faux old-timey butcher, which I have a hard time imaging enough clientele to sustain it. I swear my grandma worked at a Kenny Roger's Roasters in Astoria in the '90s, but maybe that was Seaside since I never ever visited her in Astoria, and now that I say that, it seems mildly absurd like something fleeting that occurred in a dream and decades later it seems like a fact. Maybe I'll ask her about it.
Eaten, Barely Blogged: Two Meals in Eugene
Mame It took the longest time to realize this restaurant was pronounced mah-may not like mame as in Auntie. Sushi in Eugene is something I never thought I'd care to experience but I told my sister I would take her and her husband out for her birthday and she chose this place, which requires reservations weeks in advance, not typical of this town, because Mame is tiny but also because it has a good reputation.
The sushi was very good, a mix of traditional and creative. I didn't parse it. We were just drinking a well-priced Honjozo sake and having a good time. (The server animatedly described every single bottle on the menu. This would be weird in NYC–or I suppose, Tokyo–but she was just excited about the list she'd put together.) Omakase starts at a bargain rate $20 so I went wild and asked for $40 per person. The top photo illustrates what was presented for three. My fear was that Mame wasn't the best idea for my sister's vegetarian husband (both former vegans) was unfounded. Duh, it's Eugene. He was presented with tons of vegetarian sushi, a noodle dish, followed by hand rolls that he couldn't finish, and we were only charged $30 because the chef (I think the partner of the server) didn't think the ingredients merited $40. The dinner was capped off with a free red bean cheesecake for the birthday girl.
My sister, with a critical eye, said that none of the diners looked like neighborhood types. I couldn't tell because I have no idea what passes for upscale in Eugene. I had just seen a man with a hook for a hand in a bar. I guess not living under a bridge? The bathroom isn't inside the restaurant. It's outside, around the back. We were joking, after my sister returned, that a homeless guy was camped out in the bathroom and the wildly ebullient server overheard (there's no private conversations in this space) and apologized. Eugene is very earnest.
The Vintage Probably not my first choice for brunch. The website makes it seem more modern, but it's kind of fusty. Can you shoehorn a restaurant in a old house (I don't think this is only an Oregon thing but it's definitely not an NYC thing) and make it feel otherwise? I don't really even do brunch but I hadn't seen my friend from college for at least eight years and this was her pick (everyone in Eugene is more money-conscious than I'm used to in NYC, and I don't hang out with anyone rich–this friend had been at the same retail job for 15 years, making $2.25 above minimum wage–and I didn't want to inadvertently choose someplace pricey). There was a 20 minute wait for a table and another 20 minute wait for food. It's all crepes during the day and fondue at night, in a two-story old house, self-described as "quaint." Enough said.
Eaten, Barely Blogged: 48 Hours in Seoul
Gontran Cherrier This lovely matcha almond croissant prompted a Facebook friend to comment "Aren't there any local delicacies you could eat?" Uh, no. Well, French pastry is practically Korean. Hello, Paris Baguette? I didn't set out to eat absolutely no traditional Korean food (though I intentionally stayed in Itaewon, which has a lot of American and international influence) but traditional Korean food is extremely unfriendly to solo diners. The restaurant culture is super communal, social, and family-style, barring fast food and street food. I'd read stories of people being turned away at bbq joints even if they promised to order portions fit for two. Tokyo, was totally the opposite, thankfully.
I almost went to the Original Pancake House instead of Gontran Cherrier, just because it felt like my duty as a native Oregonian. Yes, the original Original Pancake House is headquartered in Portland.
Eaten, Barely Blogged: Oregon, Better Late Than Never
Mae. I was reluctant to eat at a Southern food pop-up in Portland. Who needs it? (I would be more interested in a Pacific Northwest pop-up on the South except that there isn't a distinct cuisine to speak of.) But it was one of the highlights of my trip; very vegetable-focused, light when it needed to be (chilled zucchini & buttermilk soup with sweet pepper relish, cherry tomato, and sumac-toasted pecans and lingerie beans, flame nectarine, pickled chantrelles, purslane with brown butter vinaigrette) hefty when it was required (chicken fried in three fats–no idea which). And I will never again underestimate the power of biscuits slathered with Duke's mayonnaise and topped with nothing more than heirloom tomatoes and bourbon barrel-smoked salt. At $65 (suggested donation) for ten courses (was too busy eating to take photos of them all) and BYOB I would consider it a great bargain, though in Portland that means you'll be sharing a table with some wealthy middle-aged Bergen County transplants and siblings from Eastern Oregon of mysterious means (and a dubious relationship) one whose child with a septum piercing will be going to Harvard in the fall. I was the only teenager-free diner at the table (even my boyfriend has a daughter going to the cool downtown public high school, which everyone approved of) and when the sister from Pendleton made everyone state their favorite movie, and wouldn't let up after I demurred, I was like maybe I'm a poor conversationalist? No matter, when there's pickled ramp pimento cheese to be eaten.
Nodoguru. $125 ticketed omakase that sells out in minutes. It was all right. Something about it felt off for Portland, not that I'm critiquing quality or creativity. I just couldn't get excited because I'm a jaded monster.
Pizza Vendor. Totally the break-out hit of this trip. With its straighforward name and no reason to go unless you happen to already be in Scappoose identity, it suited my needs just fine. It's the childhood pizza of your dreams, half-and-half if you please, lots of cheese, thin, chewy, and puffy cornmeal-dusted crust, except that now you can get pitchers of beer instead of root beer and I still can't figure out how what seemed like six-pints worth of some local IPA was only $6.99. Bon Appetit had recently declared Pizza Jerk, a take on East Coast pizzerias, one of America's Best New Restaurants despite it being closed due to a fire. Magically, it reopened two days before I was to head back to NYC. I had planned to hit it on the way to the airport but went back to Pizza Vendor instead.
Hat Yai. It's no secret that I'm a fan of Portland Thai food. There are all sorts of interesting niches being filled despite the Thai population being practically nonexistent. The shtick is Southern Thai in a fast-casual format with cute branding. Fried chicken, lightly battered in seasoned rice flour encrusted with fried shallots and sweet chile sauce is featured and I tried a combo with a big buttery roti and chicken curry, not exactly a light lunch. I kind of love that there are six straight liquors for $6, soda an extra $1.50 (though I'm sure that's considered overpriced since a majority of cocktails in Portland are still sub-$10) as I've been on a tequila and soda kick (so I can pretend I'm not a lame as a vodka soda-drinker). Sometimes I think I will move back to Portland and then I see middle-aged foodie dudes with goatees setting up elaborate photo shoots (was under the impression this was a blogger of some consequence) who pronounce prix fixe, pree fixay, and I'm all nope, I would just be too mean for this town.
Urdaneta. Stopped in for a snack because I was wandering around the area and recognized the name as something newish and ended up ruining my appetite for the $5 Little Bird happy hour double brie burger I had planned on later. Complimentary pimenton-spiked chickpeas and a sweetbread-topped pintxo would've suited my needs fine. The tortilla was substantial, gilded with Idiazabal and sherry aioli, and I couldn't stop eating it.
Pine State Biscuits. I've been before. It was close to my Airbnb.
Giant Drive-In. There's a shingled A-frame practically in the backyard of the apartment complex my mom and stepdude are now managing. No, it's not a destination but I would recommend the big, fun (Hawaiian!) burgers and homemade shakes even if you lived a little more than walking distance.
Cedar Plank Buffet. We gathered 10 family members for a Sunday brunch buffet at Spirit Mountain Casino because nothing is too good for my mom's 66th birthday. Fried oysters, smoked salmon, biscuits and gravy, lemon meringue pie, french toast, and bacon is just all a part of the deal.
Mountain View Sports Bar. Oh, and a late night sports reuben that I carted around from my mom's to Scappoose because I'm gross and can't toss food. I can't remember if this was before or after the mushrooms and Keno (my sister is a hippie) but it was ok because we stayed overnight, no driving.
Coyote Joe's. Weird that I would encounter biscuits three times in two days because biscuits aren't particularly Northwesty.
San Dune Pub. An oyster po' boy with local Willapa Bay oysters. See? New Orleans appropriation.
Little Big Burger. I completely forgot I ate this.
An Xuyen. Banh mi, only $1.49 more than the '90s. Best sandwich under $3. The owner/cashier was so damn chatty I thought the line of customers behind me were about to kill us, yet when I looked up no one gave a shit.
Pho Van. Part of a mini Vietnamese empire. Solid pho. No, I did not make it to Rose VL Deli.
Shut Up and Eat. My grandma is into this food truck-turned-brick-and-mortar restaurant and I'm half-convinced it's simply because of the name. The Italian sandwich contained a little more roughage than I'm accustomed to.
Ixtapa. The waiter was all, "I put habaneros in your food," I guess to get a reaction, but I was all "ok…" That's humor in Scappoose. The combos are crazy cheap and you won't feel weird for ordering a chimichanga. That's all you need to know.
Shari's. The last two times I've been (2x in one year is more than I'd been in two decades) they did not have my first choice or second choice pie. YMMV. They always have tots, however.
Eaten, Barely Blogged: French-ish, All-American, Mexican Mash-Ups
Mimi The mark of a good restaurant is one where you leave feeling better than when you arrived (despite young men good-naturedly but firmly asking you to move down six inches so their lady can have more room even though you're already arm-to-arm with the older-but-not-old man waiting for his lady on your right, being there first [the first customer period to avoid this situation because you know your limits], the isosceles triangle napkin placed by a server establishing your plot of land at the bar). That's not a lot to ask, though it's scarcer than it seems. Mimi succeeds. The sliced madai in brown butter with lemon curd and dried seaweed was like candy, or more accurately, caramel corn, fish caramel corn, which sounds dubious but is brightened by the citrus and amazing with nice bread and butter. I would go back and have this as a bar snack with sparkling wine in a second. Don't play around with it too much or else the sauce will start to cool and congeal. Peppery calves liver, rare and steak-like, is served with boudin noir-stuffed eggplant, studded with golden raisins, and also blended sweet with savory well, potent and energizing in the same way as the crudo without being heavy, matchingwith a glass of equally bold French red wine that I vowed to remember without taking a photo and promptly forgot (comped, I realized later, which occasionally is a benefit–at least at a certain type of casual-polished place–of dining on your own) Even approaching fullness, I was never bored.
Emmy Squared I forget if this is supposed to be Detroit-inspired or Detroit-style pizza (which I did try last year for the first time in a very different setting i.e. one that doesn't threaten a $25/per person fee for no-shows because you just show up and eat pizza). The slices are square, the crust thick but not Chicago deep, with crisp edges and plenty of cheese. I will take any excuse to eat Hawaiian variations in an acceptable manner. Here, that would be ham and spiced pineapple on the Lou-Wow. I'm also a sucker for pretzel buns, which hold together Le Big Matt Burger, the formerly semi-secret double-pattied, white american cheese, and sambal-spiked mayonnaise monster that's now formally on the menu. Split a burger and pizza if possible. Both are good but you'll probably leave feeling more or less the same as when you entered.
Mission Cantina is as good a spot as any to unintentionally stumble into on a weeknight. The whole operation from service to menu feels haphazard, and that's not a criticism (though I almost ordered a drink special because it was green until I parsed that it contained Midori, god no, which the server thought was cucumber liqueur). It's a perfect place to knock back micheladas and marvel at more fried chicken than would seem imaginable for $26. That would be masa-crusted, spicy, honey-drizzled, and tarted-up with pickles and pickled jalapeños in a vaguely Southern/South of the Border/Korean way. Like pretzel rolls and Hawaiian pizza, I will always order crab rangoon if I see it. There was an undercurrent of what I thought was curry powder in these fried wontons, which you have to be in the mood for, and then the next day while sweating on a walk home it hit me that the abrasive seasoning was likely Old Bay, with celery salt being the offender. Limey, lightly funky mussel tostadas, chosen instead of a side vegetable that was practically insisted upon, were more guacamole than anything.
Eaten, Barely Blogged: A Bender Just Because
When you post lots of food and drink photos (though who doesn't anymore?) there is an assumption that you're always out eating and drinking when in my reality there's a good deal of cheese and crackers, eggs and bacon, yogurt, seltzer, and other mundanities consumed at home.
But when visitors are around who think you're perpetually having fun, you might have to give them the full eight-hour bender experience, day job be damned. This is now your job. What started out as an innocent lunch break across the street at my favorite regional chain Dallas BBQ (one piña colada) resulted in a two-borough excursion that served to blow the mind (and health) of a long-distance old friend-turned-boyfriend who hadn't drank for the 25 years leading up to our reconnecting in January. I'm a horrible influence, no question.
Jimmy's Corner (one Sam Adams, two Maker's on the rocks), not just the best boxing bar in Times Square but possibly the best bar in Times Square period (this is a great recent ode) carried me into oyster happy hour territory but Cull & Pistol, where I was lured by a friend, was too crowded and I wasn't hungry anyway after ribs and fries, so Corner Bistro minus the burger (two McSorley's dark ales) became stop #3 for a little anti-Dallas BBQ atmosphere.
Yet oysters (and two $5 frozen Painkillers) ended up happening anyway at Sea Wolf, the newish beachy restaurant off the Jefferson St. L where getting off the train I came face to face with a coworker whose name I don't know and initially made me panic since I was being a truant but by 6:30pm I was in the clear. A barely perceptible nod of acknowledgement was sufficient. The point of Bushwick was to hit a few vintage stores, something I haven't done in decades, and fittingly demonstrate what the Portland of NYC looks like (equally young with free-time during the day, better educated and likely to be secretly wealthy, far dirtier and more industrial, less white, duh).
By this point, rando sushi seemed like a good idea and a sandwich board on the sidewalk worked its magic. Shared rolls (and a Sapporo) at Tomo just opened the floodgates, though, and Dorito ramen (oops, carbonara) at King Noodle, a few doors down, started seemingly like an even better idea, except I forgot that they had tempered the kitsch a while back and now the menu was more straightforward Asian, slightly SE. Oh, but thank god, and thank you, if you made it this far because the whole point of this exercise is this: ma po tofu fries!
This is my kind of junk food: melted, processed cheese and fried starch and intensely seasoned ground meat. I love salty soy (fish sauce ideally) with melted cheese and a little (a lot really) heat. Ok, the overriding theme was salt in all the dishes, in an extreme way that was too much in the Spam fried rice and Chinese broccoli with oyster sauce (a nod to health). Maybe not the lemongrass wings, which felt a little wan in comparison, probably because I'd lost all taste for subtlety at this point. (Eaten with coconut porter and a second completely unnecessary beer in a style that I don't remember since it was the eleventh drink of the day.)
Drink #10, still going strong. There's no way to make the neon lighting flattering.
Once you start binging at 1pm, you'll get tired unless you keep up a steady pace. It may seem dangerous, but the beauty is that you'll probably make it home by 10pm and get a full eight hours to digest all that sodium, fat, and alcohol and will wake up feeling only sort of like crap (but maybe not at all depending how far from middle-age you might be). To really tempt fate, you can start again the next day but two back-to-back benders is my maximum as a non-young, employed person. Most importantly, I really impressed a now-drinking, self-described Country Mouse (only if you consider Portland's outskirts country) into boxing, whose going out consists primarily of ramen with his kids, with my fortitude and disregard for work ethics and diet.
Eaten, Barely Blogged: Birds, Blood, Chile Oil
Paet Rio take two. I didn't do a very good job of selling someone who wanted Japanese noodles for lunch and isn't into Thai food because he thinks it's all sweetness and coconut milk. I said no pad thai because I'm controlling, then eased up and didn't provide enough guidance and he ended up ordering rad na, which is the weirdest, blandest, gravy-drenched Chinese-Thai noodle dish that I'm convinced only means something to people who grew up with it. So much so that I passed on a photo. I went looking for a nam tok soup replacement post-Plant Love House (Pata Paplean succeeds, but that's not a weekday affair) and received an ok rendition. It was a little wan when I was seeking something more powerful and dank.
Ivan Ramen came through on the Japanese noodle front, though accidentally, while weaving from the East Village to Chinatown, not all that hungry after green tea bun at Panya and afternoon beers and a shot at 7B. The spicy broth slicked with chile oil was softened by finely minced pork and a yolky egg fluffed into an almost-scramble. The tangle of noodles light and springy. I wouldn't consider $22 a bargain lunch special but with a can of Japanese beer and a chosen side (cucumber pickles in my case) it's as good a way as any to spend a leisurely afternoon.
Le Coq Rico is where you'd expect a prix-fixe lunch to be $38 (though I had a $27 deal because I'm a grandma, see above). The Parisian import is all about aged birds of many breeds, some more than $100 a pop. This particular week, and maybe always, the featured non-whole chicken was a 110-day aged Brune Landaise, roasted with riesling and other aromatics, ideal for the dark meat types (I'll never understand white meat-lovers), plated simply with jus and a side salad, but not necessarily revelatory. It's chicken. I'd need to taste more varieties in quick succession to better suss out this particular breed's attributes. First course was chicken livers with another salad. There is a lot of liver lurking under those leaves, plus some unexpected smears of hummus for added creaminess and richness. That île flottante, though (baked Alaska is next on my list of classics). The meringue mound surrounded a crème anglaise moat and slivered toasted almonds was the breakout star. It was practically a sext when I sent a pic of myself cradling the dish–and now, I've firmly entered middle-aged Better than Sex Cake (Better than Robert Redford Cake, if you're even more aged) territory. Wow.
And speaking of poultry offal, the shop with a three duck logo and name I can't recall because I don't think it was in English, is where to go in the New World Mall food court if you want a bowl of mild, cloudy broth full of clear bean thread noodles and bobbing slices of fried crueller and hidden cubes of duck blood, gizzards, and other, livery bits instead of the more popular hand-shaved noodle soups. It lacks the luxuriousness of fatty roast duck and the herbs to read as medicinal. I'd say the soup is restorative. When in doubt, add chile oil. It's Probably good for a hangover.
White Bear is hardly an unknown. All non-Chinese order the 12 for $5.50 #6, and I'm not one to buck that wontons with chile oil trend.


This month, 123-reg launched its industry-leading website builder, helping all businesses and web professionals to build responsive, personalised websites quickly. The launch will enable all UK businesses to build mobile optimised and dynamic websites without technical training and skills considerably shortening the time to get responsive websites live enabling all businesses to compete better online.
As part of the launch, 123-reg is sharing a report into how customers perceive different types of website functionality across small and big businesses. An online study of 2052 adults, commissioned by 123-reg and undertaken by YouGov revealed that 59% British adults who have ever purchased items online from a business website feel large business websites are generally better than small business websites and this rises to 78% for 18-24 year olds. Just 3% of respondents disagreed that offline small businesses provide a more personal service than big businesses.
Our finding are below, and if you want to lean more about how to get a personalised website check out the guide in this link..


in writing, there would be an accounting of the money raised and how and where it would be spent, I was called a naysayer who didn't want Hillary to be POTUS.
Also, votes for #JillStein were more than #HillaryClinton lost by in PA, WI and MI--the three states that decided the election.
Jill Stein's Recount Cash Pays for her Russia Legal Fees.
Also, like Trump, Stein never filed tax returns for 2016 or 2012. So we don't know her worth. Or her husband's.
But we do know she has run for some office since 2002 every other year and won none.
That's a lot of campaign money.


The Back to Black event opened a few hours ago to the public, so this seems like a good time for a final post in our series about -Hanaya- Pine Lake Camping Trip set, our brand new product for the event.
Back to Black is an an event organized by CHIC Management with the main purpose of raising awareness of mental health issues. When we were invited, we were given the theme of 'Family'. What I immediately thought about was how important it is to have your loved ones around you during troubled times. And I remembered wonderful times with my family in real life – on camping trips.
So I made something for you to spend some time interacting with your second life family. All the pieces in the image are included as part of the set.
The -Hanaya- Pine Lake Family Camping Trip set includes 8 interactive pieces of camping gear, many of which rez or give props to enhance the camping experience for the whole family. The set is packaged in an autorezzer for easy set up and includes a forest base (shown in the lower set of images). The pieces are also boxed up and provided separately.
Instead of telling you about everything it does in words, I invite you to look at the images below, which were taken in Second Life to illustrate some of the fun family activities that are part of this set.
A family shot – everyone doing something – playing guitar, roasting marshmallows, cooking and hanging out.
The tree has 2 animations for playing hide and go seek, and when you click on it, it emits gentle owl sounds.
Both the blanket and the log pile have 2 animations each – sit on the blanket and either sing along or have a little temper tantrum. Or sit on the log pile – chill or read a book. A book is rezzed when you sit.
Close up of the bbq table with a portable hibachi and bbq tools. Sit and cycle through the animations. The cooler is fun – 2 animations plus it gives wearable pop that has a open can animation as well as drink.
My fave part of the set – both chairs include 2 animations – sit and a guitar is rezzed out in your lap, and a full length song is played. Please let the song pre-load before you listen. Switch to the other animation and be offered a marshmallow on a crooked stick to roast in the fire. The fire itself has awesome sculpted flames – so much better looking that particle fires.
Pics above and below show the inside of the tent and the camp cots. Each cot has its own 2 animations – 4 animations in all. The right hand bunk rezzes a book for you to read, or a pillow. The left is perfect for restless sleepers. Lots of tossing and turning.
Below is another pic of the chair with guitar – the guitar is gorgeously detailed. It will start to play automatically when you sit in that animation. Afterwards, you can click on it to turn it on and off. It will disappear when you stand up, or switch to the other anim.
A final pic showing one of the animations in the cooler. The cooler is modeled after one I had in real life, and comes complete with sculpted melting ice cubes, melted ripply water, and pop cans.
For way more detail, please see the preceding blog posts.
Or better yet, come and visit the Back to Black event and grab your copy of this set, which is promo priced for the event. The event started today and runs until February 29th.
This entry was posted in Events, Product Announcements on February 12, 2012 by moriko.
This is the last installment in our Pine Lake Family Camping Trip album. The series of images, designed like pages in a pre-teen's photo album, were created to illustrate the components of the -Hanaya- Pine Lake Family Camping Trip set.
The set is loosely based on my real life camping experiences in wilderness camping areas in eastern Ontario, a beautiful part of Canada. Our tent was generally high tech, very light and we did not sleep on cots. But our gear, even when canoe camping, always included a guitar.
When I was first invited to be one of the vendors in CHIC Management's Back to Black event, and found out my assigned theme was Family, I immediately thought of doing something camping related. That is because most of my happy family memories center around camping.
For those of you who have never been on a backwoods camping trip, you just don't know what you are missing! There is something really special about finding an uninhabited spot of shoreline and making it your home for the weekend. Now that I live in Germany, I miss Canada's nature very much, and I hope that those of you who have yet to visit Canada will spend at least a small part of your trip exploring nature.
In the above photo, our two girls are having a rest inside their tent. Each bunk has 2 animations, and props are automatically rezzed when you sit/lie down.
The cooler also has 2 animations, as well as dispensing cans of pop when clicked. The wearable pop includes a cool 'open can then drink' animation, complete with sound and texture change from closed to open can top. Sculpted cans and melting ice cubes add realism and dimension to the cooler.
The barbeque table has a cooking and tidying up animation, and gives a spatula and tea towel prop, depending on which animation you are using.
Thank you for reading about our latest release, the -Hanaya- Pine Lake Family Camping Trip. We hope you enjoyed seeing the album – it was a fun way to demonstrate all the cool features and animations in the set, and included a bunch of our SL family in the project.
Tomorrow's blog post will give you details about the product itself and tell you a bit more about the Back to Black event.
This entry was posted in Events on February 10, 2012 by moriko.
One of the things that I really love about getting gifts is really pretty gift wrap. It has been awhile since I released a set of transferable gift boxes – so here are some.
Embellished with ribbons, sculpted hearts and roses, they are mod/transfer so you can stuff your own gift inside and give it to your sweetie. Don't forget that the gift you place inside must also be transfer!
The pack comes with 5 yummy colours of box, and there are 2 types of each.
One version includes the gift box with a built-in unwrapping animation and a MESH stool that is worn to open the gift. To use the MESH version, you need to have a viewer that allows you to view mesh (most up-to-date viewers do, including the official Linden Lab one).
The non-wearable version is simply rezzed out to open – works with any viewer.
The -Hanaya- Sweetheart Gift Boxes for Gift Giving are available for purchase at our in-world store, as well as on the Second Life Marketplace.
If you are a member of the -Hanaya- Yummy Collectibles in-world group, the pink version of the gift box was sent out on the group earlier today. Not a member yet? Join and grab yours from group notices. The group join fee is 250 L.
This entry was posted in Product Announcements on February 9, 2012 by moriko.
This is the third installment of blog posts based around a camping trip, that took place in real life in 1990, and in Second Life just last week.
The images represent pages from the photo album of my Second Life niece Miu-chan, and feature furniture and accessories from the soon-to-be-released -Hanaya- Pine Lake Family Camping Trip product.
My mom is a really great cook – but she says she prefers our gas barbecue at home to standing over smoking charcoal. Boy, did we get in trouble for leaving the cooler open. Hana and me tried to blame it on racoons, but daddy did not believe us.
Later that afternoon, I got daddy to play my favourite Brownie camping songs while Hana and aunt Mori went get more wood for the fire.
The pages in the album illustrate components of our brand new release, the -Hanaya- Pine Lake Family Camping Trip set, which will be available at a special promo price at the Back to Black event (in the Family section), starting on February 11th.
The set includes (but is not limited to) 8 interactive pieces of camping gear, many of which rez or give props to enhance the camping experience for the whole family.
For more views of the details of this product, please take a look previous blog posts.
This entry was posted in Events on February 8, 2012 by moriko.
This is a second installment of blog posts based around a camping trip, that took place in real life in 1990, and in Second Life just last week.
One of the great things is when we get to play games with my aunt Mori. Here she is sitting on the log pile, while my sister hides behind a tree. I hid in the tent and almost fell asleep!
There were all sorts of noises and stuff, so daddy left our lantern on all night. When I woke up in the morning, my pillow was on the floor – again.
This entry was posted in Events on February 7, 2012 by moriko.
The next series of blog posts are based around a camping trip, that took place in real life in 1990, and in Second Life just last week.
Every summer, my mom, dad and my sister Hana go on a family camping trip. It is fun! This year, aunt Mori came with us. Boy was the car ever full!!!!
When we got there, daddy made a fire and we sat around roasting marshmallows and sang while my daddy played his guitar. Mommy made yummy stuff to eat.
The first morning, we were all up early and went on a long hike in the woods. We didn't see any bears – phew!
Mommy made us more marshmallows and daddy got the guitar out again. Hana hardly played with me, cause she had a new book to read or something.
This entry was posted in Events and tagged back to black, camping, Pine Lake on February 6, 2012 by moriko.
So here is the gift of flowers that will melt your Valentine's heart – 12 exquisite sculpted roses and babies breath in 3 styles of bouquet.
I hope you and your sweetheart get as much enjoyment out of is as I had in making the piece.
Please stop by our in-world store, where it is on display and available for purchase.
A copy/modify version is available on request.
This entry was posted in Product Announcements on February 3, 2012 by moriko.


text:
import json
import logging
import numpy
import re
import base64

from django.http import Http404
from django.db import models
from django.utils.text import slugify
from django.apps import apps
from util import constants
from .. import formula_parser
from .. import conditions
from util.thumbnail import InChI2Thumbnail

class CommonName(models.Model):
    """
        A common name of a compound.
    """
    name = models.CharField(max_length=500)
    enabled = models.BooleanField(default=True)

    @staticmethod
    def GetOrCreate(name):
        """Attempts to fetch the CommonName object, or creates it if not present.

        Args:
            name: the name to use.

        Returns:
            A CommonName object.
        """
        try:
            n = CommonName.objects.get(name=name, enabled=True)
            return n
        except Exception:
            n = CommonName(name=name, enabled=True)
            n.save()
            return n

    def __unicode__(self):
        return self.name

    def TypeStr(self):
        if self.compound_set.count():
            return 'Compound'
        elif self.enzyme_set.count():
            return 'Enzyme'
        return ''

class ValueSource(models.Model):
    """
        The source of a particular numeric value.
    """
    # A JSON of all the relevant data.
    name = models.CharField(max_length=30)

    # A JSON of all the relevant data.
    data = models.CharField(max_length=2048)

    def __init__(self, *args, **kwargs):
        super(ValueSource, self).__init__(*args, **kwargs)
        self._data_dict = json.loads(self.data)

    def __unicode__(self):
        return self.name

    def __str__(self):
        return self.name

    def __eq__(self, other):
        """Equality operator."""
        if not other:
            return False

        if not hasattr(other, 'name'):
            return False

        return self.name == other.name

    def GetAuthorList(self):
        return ', '.join(self._data_dict.get('author', []))
    author = property(GetAuthorList)

    def GetYear(self):
        return self._data_dict.get('year', '2000 BC')
    year = property(GetYear)

    def GetTitle(self):
        return self._data_dict.get('title', None)
    title = property(GetTitle)

    def GetJournal(self):
        return self._data_dict.get('journal', '')
    journal = property(GetJournal)

    def GetURL(self):
        return self._data_dict.get('url', None)
    url = property(GetURL)

    def GetDOI(self):
        return self._data_dict.get('doi', None)
    doi = property(GetDOI)

    def GetPMID(self):
        return self._data_dict.get('pmid', None)
    pmid = property(GetPMID)

    def GetCitation(self):
        if not self.title:
            return ''
        if self.url is not None:
            return '%s. %s. %s' % \
                (self.author, self.url, self.title, self.journal)
        else:
            return '%s. %s. %s' % \
                (self.author, self.title, self.journal)
    citation = property(GetCitation)

class Specie(models.Model):
    """
        A single specie of a compound.
    """
    # The ID of the compound in KEGG.
    kegg_id = models.CharField(max_length=10)

    # The number of hydrogens in the species.
    number_of_hydrogens = models.IntegerField()

    # The number of Mg2+ ions bound to this species.
    number_of_mgs = models.IntegerField(default=0)

    # The net charge (eV).
    net_charge = models.IntegerField()

    # The standard formation energy in kJ/mol.
    formation_energy = models.FloatField()

    # The source of this value.
    formation_energy_source = models.ForeignKey(ValueSource,
                                                on_delete=models.CASCADE)

    # The phase (s, l, g, or aq)
    phase = models.CharField(max_length=10,
                             choices=constants.PHASE_CHOICES,
                             default=constants.DEFAULT_PHASE)

    def Transform(self, aq_params):
        """
            Transform this individual estimate to difference conditions.
        """

        sqrt_I = numpy.sqrt(aq_params.ionic_strength)
        pH = aq_params.pH
        pMg = aq_params.pMg
        nH = self.number_of_hydrogens
        nMg = self.number_of_mgs
        z = self.net_charge
        dG = self.formation_energy
        dG_prime = dG

        # add the potential related to the pH
        if nH > 0:
            dG_prime += nH * constants.RTlog10 * pH

        # add the potential related to the ionic strength
        dG_prime -= 2.91482 * (z ** 2 - nH) * sqrt_I / (1 + 1.6 * sqrt_I)

        # add the potential related to the Mg ions
        if nMg > 0:
            dG_prime += nMg * \
                  (constants.RTlog10 * pMg - constants.MG_FORMATION_ENERGY)

        logging.debug('nH = %d, z = %d, dG0 = %.1f --> dG0\' = %.1f' %
                      (nH, z, dG, dG_prime))
        return dG_prime

    def __unicode__(self):
        return self.kegg_id

    def __str__(self):
        return "nH = %d, nMg = %d, z = %d, dG0_f = %.2f, phase = %s" %\
            (self.number_of_hydrogens, self.number_of_mgs, self.net_charge,
             self.formation_energy, self.phase)

class SpeciesGroup(models.Model):
    """
        A set of different species (AKA pseudoisomers/protonation states) that
        a compound can have. There is a separation between SpeciesGroup and
        Compound in order to associate a compound with more than one source
        of data, e.g. Alberty vs. Component Contribution
    """
    # The ID of the compound in KEGG.
    kegg_id = models.CharField(max_length=10)

    # The species in this group.
    species = models.ManyToManyField(Specie)

    # The priority of this group.
    priority = models.IntegerField()

    # The source of these values.
    formation_energy_source = models.ForeignKey(ValueSource,
                                                on_delete=models.CASCADE)

    def __init__(self, *args, **kwargs):
        super(SpeciesGroup, self).__init__(*args, **kwargs)
        self._all_species = None

    def __str__(self):
        s = "KEGG ID = %s\npriority = %d\nformation_energy_source = %s\n" % \
            (self.kegg_id, self.priority, self.formation_energy_source)
        return s + '\n'.join([str(sp) for sp in self.all_species])

    def GetSpecies(self):
        """Gets the list of Species, potentially caching."""
        if self._all_species is None:
            self._all_species = self.species.all()
        return self._all_species
    all_species = property(GetSpecies)

    def GetPhaseSpecies(self, phase=constants.DEFAULT_PHASE):
        """
            Get a list of all species corresponding to a certain phase
        """
        return [s for s in self.GetSpecies()
                if s.get_phase_display() == phase]

    def GetSpeciesWithoutMg(self):
        """Gets the list of species without Mg bound."""
        for s in self.all_species:
            if s.number_of_mgs == 0:
                yield s
    all_species_no_mg = property(GetSpeciesWithoutMg)

    def StashTransformedSpeciesEnergies(self, aq_params):
        """
            Stash the transformed species formation energy in each one.
        """
        for species in self.all_species:
            species.transformed_energy = species.Transform(aq_params)

    def DeltaG0Prime(self, aq_params,
                     phase=constants.DEFAULT_PHASE):
        """
            Get a deltaG estimate for this group of species.

            Args:
                pH: the pH to estimate at.
                pMg: the pMg to estimate at.
                ionic_strength: the ionic strength to estimate at.

            Returns:
                The estimated delta G in the given conditions or None.
        """
        species = self.GetPhaseSpecies(phase)

        if not species:
            logging.warning('No data for this compound (%s) in this '
                            'phase (%s) and priority (%d)' %
                            (self.kegg_id, phase, self.priority))
            return None

        logging.debug('Calculating dG0\' for %s' % (self.kegg_id))
        if phase == constants.DEFAULT_PHASE:
            # Compute per-species transforms, scaled down by R*T.
            scaled_transforms = [(-s.Transform(aq_params) / constants.RT)
                                 for s in species]

            # Numerical issues: taking a sum of exp(v) for |v| quite large.
            # Use the fact that we take a log later to offset all values by a
            # constant (the minimum value).
            total = scaled_transforms[0]
            for i in range(1, len(scaled_transforms)):
                total = numpy.logaddexp(total, scaled_transforms[i])
            dg0_prime = -constants.RT * total
        else:
            if len(species) > 1:
                logging.error('only aqueous phase can have multiple species')
                raise Http404
            else:
                # compounds which are not in solution do not need to be
                # transformed since they have only one specie and there is no
                # equilibrium between pseudoisomers in that phase
                dg0_prime = species[0].Transform(aq_params)

        logging.debug('total: dG0\' = %.1f' % dg0_prime)
        return dg0_prime

    def GetSourceReferenceLink(self):
        source_name = self.formation_energy_source
        try:
            source = ValueSource.objects.get(name=source_name)
            url = source.url
        except ValueSource.DoesNotExist:
            url = "/data_refs"
        url = url or "/data_refs"
        return url

    source_reference = property(GetSourceReferenceLink)

class Compound(models.Model):
    """
        A single compound.
    """
    # The ID of the compound in KEGG.
    kegg_id = models.CharField(max_length=10, null=True)

    # InChI representation of the compound.
    inchi = models.CharField(max_length=2048, null=True)

    # The main name of the compound.
    name = models.ForeignKey(CommonName, on_delete=models.CASCADE,
                             related_name='primary_name_of')

    # A list of common names of the compound, used for searching.
    common_names = models.ManyToManyField(CommonName)

    # If present, this name should always be used.
    preferred_name = models.CharField(max_length=250, null=True)

    # A remark about this compound.
    note = models.TextField(null=True)

    # A link for detailed remarks about this compound.
    details_link = models.URLField(null=True)

    # The chemical formula.
    formula = models.CharField(max_length=500, null=True)

    # The molecular mass.
    mass = models.FloatField(null=True)  # In Daltons.

    # The number of electrons.
    num_electrons = models.IntegerField(null=True)

    # The various estimates of Delta G for this compound.
    species_groups = models.ManyToManyField(SpeciesGroup)

    # The index of this compound in the Component Contribution
    # training data. This index is needed for calcuating the uncertainty.
    index = models.IntegerField(null=True)

    # Group vector encoded as a sparse vector in dictionary format.
    # Needed for calculating uncertainty.
    group_vector = models.TextField(null=True)

    # An explanation for when no DeltaG0 estimate is available.
    no_dg_explanation = models.CharField(max_length=2048,
                                         blank=True,
                                         null=True)

    # Thumbnail image for the structure of the compound
    thumbnail = models.TextField(blank=True)

    # A single static parser
    FORMULA_PARSER = formula_parser.FormulaParser()

    def __init__(self, *args, **kwargs):
        super(Compound, self).__init__(*args, **kwargs)
        self._all_species_groups = None
        self._species_group_to_use = None
        self._priority = None

    def GetSpeciesGroupPriorities(self):
        """
            Get the priorities of species groups available.
        """
        return [sg.priority for sg in self.all_species_groups]

    def SetSpeciesGroupPriority(self, priority):
        """
            Set the priority of the species group to use.
        """
        for sg in self.species_groups.all():
            if sg.priority == priority:
                self._species_group_to_use = sg
                logging.debug('Setting priority for %s to %d' %
                              (self.kegg_id, priority))
                break

    def SetHighestPriority(self):
        """
            Set the priority to the highest one.
        """
        ps = self.GetSpeciesGroupPriorities()
        if not ps:
            return

        self.SetSpeciesGroupPriority(min(ps))

    def HasData(self):
        """
            Has enough data to display.
        """
        return self.mass and self.formula

    def FirstName(self):
        """
            Return the 'first' name of this compound.

            If a 'preferred_name' is set, returns that. Otherwise, returns
            the first name in the list of common names. Presumes that the
            list of names is in some order.
        """
        if self.preferred_name:
            return self.preferred_name

        names = list(self.common_names.all())
        return names[0].name

    def NameSlug(self):
        """Return a name with no whitespace or dashes.

        Slug will also never begin with a number to avoid
        confusing the reaction parser.
        """
        slug = 'C_%s' % slugify(str(self.FirstName()))
        return slug.replace('-', '_')

    def DeltaG0Prime(self, aq_params,
                     phase=None):
        """
            Get a deltaG estimate for the given compound.

            Args:
                pH: the PH to estimate at.
                ionic_strength: the ionic strength to estimate at.
                temp: the temperature to estimate at.

            Returns:
                The estimated delta G in the given conditions or None.
        """
        phase = phase or self.GetDefaultPhaseName()
        sg = self._species_group
        if not sg:
            return None

        dg0_prime = sg.DeltaG0Prime(aq_params, phase)
        return dg0_prime

    def WriteStructureThumbnail(self):
        self.thumbnail = 'error'

        if self.inchi is None:
            return

        th_string = InChI2Thumbnail(str(self.inchi), output_format='png')
        if th_string is None:
            return

        self.thumbnail = base64.encodestring(th_string)

    def GetAtomBag(self):
        """
            Returns a dictionary of atoms and their counts for this compound.
        """
        if not self.formula:
            logging.debug('Formula is not defined for KEGG ID %s',
                          self.kegg_id)
            return None

        atom_bag = self.FORMULA_PARSER.GetAtomBag(self.formula)

        # Wildcards are not allowed.
        if 'R' in atom_bag:
            return None

        return atom_bag

    def GetNewPriorityLink(self, max_priority):
        return self.GetLink() + '&max_priority=%d' % max_priority

    def GetLink(self):
        """Returns the link to the stand-alone page for this compound."""
        if not self.kegg_id:
            return None
        return '/compound?compoundId=%s' % self.kegg_id

    def GetKeggLink(self):
        """Returns a link to the KEGG page for this compound."""
        if not self.kegg_id:
            return None

        return 'http://kegg.jp/dbget-bin/www_bget?cpd:%s' % self.kegg_id

    def GetSmallImageUrl(self):
        """Returns the URL of a small image of the compound structure."""
        if not self.kegg_id:
            return None

        return '/compound_image?compoundId=%s' % self.kegg_id

    def GetHtmlFormattedFormula(self):
        """Returns the chemical formula with HTML formatted subscripts."""
        if not self.formula:
            return None

        return re.sub(r'(\d+)', r'\1', self.formula)

    def GetSpeciesGroupToUse(self):
        """Gets the SpeciesGroup to use, potentially caching."""
        if not self._species_group_to_use:
            self.SetHighestPriority()
        return self._species_group_to_use

    def GetSpecies(self):
        """Gets the list of SpeciesFormationEnergies, potentially caching."""
        if self._species_group_to_use:
            return self._species_group_to_use.all_species

        # TODO(flamholz): Should we return something here?
        return None

    def SpeciesJson(self, species_group=None, aq_params=None,
                    phase=None):
        """Returns JSON for the species."""
        sg = species_group or self._species_group
        aq_params = aq_params or conditions.AqueousParams()
        phase = phase or self.GetDefaultPhaseName()
        dg0_prime = sg.DeltaG0Prime(aq_params, phase)
        logging.debug('dG0\' = %.1f ' % dg0_prime)
        d = {'source': str(sg.formation_energy_source),
             'dgzero_prime': {'value': round(dg0_prime, 1),
                              'pH': aq_params.pH,
                              'ionic_strength': aq_params.ionic_strength}}
        l = []
        for s in sg.all_species:
            l.append({'nh': int(s.number_of_hydrogens),
                      'charge': int(s.net_charge),
                      'nmg': int(s.number_of_mgs),
                      'dgzero': float(s.formation_energy)})
        d['species'] = l
        return d

    def AllSpeciesGroupsJson(self, aq_params, phase=constants.DEFAULT_PHASE):
        return [self.SpeciesJson(sg, aq_params, phase)
                for sg in self.all_species_groups]

    def ToJson(self, aq_params):
        d = {'name': str(self.name),
             'KEGG_ID': self.kegg_id,
             'InChI': self.inchi,
             'mass': self.mass,
             'formula': self.formula,
             'num_electrons': self.num_electrons,
             'thermodynamic_data': self.AllSpeciesGroupsJson(aq_params),
             'note': None}
        if self.note:
            d['note'] = self.note
        return d

    def ToCSVdG0Prime(self, priority=1, aq_params=None, phase=None):
        """
            returns a list of CSV rows with the following columns:
            kegg ID, name, dG0_prime, pH, ionic_strength, T, Note
        """
        phase = phase or self.GetDefaultPhaseName()
        aq_params = aq_params or conditions.AqueousParams()
        rows = []
        for sg in self.species_groups.filter(priority=priority):
            dG0_prime = sg.DeltaG0Prime(aq_params, phase=phase)
            if dG0_prime is not None:
                dG0_prime = dG0_prime.round(1)
            rows.append([self.kegg_id, self.name, dG0_prime,
                         aq_params.pH, aq_params.ionic_strength,
                         constants.DEFAULT_TEMP, None])
        return rows

    def ToCSVdG0(self, priority=1, phase=None):
        """
            returns a list of CSV rows with the following columns:
            kegg ID, name, dG0, nH, charge, nMg, Note
        """
        phase = phase or self.GetDefaultPhaseName()
        rows = []
        for sg in self.species_groups.filter(priority=priority):
            for s in sg.GetPhaseSpecies(phase):
                nH = int(s.number_of_hydrogens)
                charge = int(s.net_charge)
                nMg = int(s.number_of_mgs)
                dG0 = round(float(s.formation_energy), 1)
                rows.append([self.kegg_id, self.name, dG0, nH,
                             charge, nMg, None])
        return rows

    def GetSpeciesGroups(self):
        """Gets the list of SpeciesGroups."""
        if self._all_species_groups is None:
            self._all_species_groups = \
                self.species_groups.all().prefetch_related('species')

        return self._all_species_groups

    def HasSpeciesGroups(self):
        """Returns true if this compound has any species groups."""
        return self.species_groups.count() > 0

    def GetUniqueSpeciesGroups(self):
        """Iterator of unique species groups."""
        sources_set = set()
        for sg in self.all_species_groups:
            source = sg.formation_energy_source
            if source not in sources_set:
                sources_set.add(source)
                yield sg

    def GetPossiblePhaseNames(self):
        possible_phases = set()
        for sg in self.all_species_groups:
            for s in sg.all_species:
                possible_phases.add(s.phase)

        return sorted(possible_phases)

    def GetDefaultPhaseName(self):
        possible_phases = self.GetPossiblePhaseNames()
        if possible_phases == [] or constants.DEFAULT_PHASE in possible_phases:
            return constants.DEFAULT_PHASE
        else:
            return possible_phases[0]

    def GetDefaultPhase(self, conc=None):
        phase_name = self.GetDefaultPhaseName()
        return conditions._BaseConditions._GeneratePhase(phase_name, conc)

    def _GetDGSource(self):
        """Returns the source of the dG data."""
        if not self._species_group:
            return None

        return self._species_group.formation_energy_source

    def _GetSubstrateEnzymes(self):
        return self.substrate_for_enzymes.all()

    def _GetProductEnzymes(self):
        return self.product_of_enzymes.all()

    def _GetCofactorEnzymes(self):
        return self.cofactor_of_enzymes.all()

    def _GetSparseGroupVector(self):
        if self.group_vector is None:
            return None
        else:
            return json.loads(self.group_vector)

    def _GetAllCommonNames(self):
        return map(lambda x: x.name, self.common_names.all())

    _species_group = property(GetSpeciesGroupToUse)
    first_name = property(FirstName)
    name_slug = property(NameSlug)
    html_formula = property(GetHtmlFormattedFormula)
    link = property(GetLink)
    kegg_link = property(GetKeggLink)
    small_image_url = property(GetSmallImageUrl)
    all_common_names = property(_GetAllCommonNames)
    all_species = property(GetSpecies)
    all_species_groups = property(GetSpeciesGroups)
    has_species_groups = property(HasSpeciesGroups)
    unique_species_groups = property(GetUniqueSpeciesGroups)
    substrate_of = property(_GetSubstrateEnzymes)
    product_of = property(_GetProductEnzymes)
    cofactor_of = property(_GetCofactorEnzymes)
    dg0_prime = property(DeltaG0Prime)
    dg_source = property(_GetDGSource)
    sparse_gv = property(_GetSparseGroupVector)

    def StashTransformedSpeciesEnergies(self, aq_params):
        """Stash the transformed species formation energy in each one."""
        for sg in self.all_species_groups:
            sg.StashTransformedSpeciesEnergies(aq_params)

    def __unicode__(self):
        """Return a single string identifier of this Compound."""
        names = self.all_common_names
        if names:
            return str(names[0])
        return str(self.formula)

    @staticmethod
    def GetCompoundsByKeggId(kegg_ids):
        """Fetch compounds from a list of KEGG IDs.

        Args:
            kegg_ids: a list of KEGG IDs.

        Returns:
            A dictionary mapping KEGG ID to Compounds.
        """
        compounds = Compound.objects.select_related().filter(
            kegg_id__in=kegg_ids)
        return dict((c.kegg_id, c) for c in compounds if c is not None)

class Reactant(models.Model):
    """A compound and its coefficient."""
    # The compound.
    compound = models.ForeignKey(Compound, on_delete=models.CASCADE)

    # The coeff.
    coeff = models.FloatField(default=1.0)

    def __init__(self, *args, **kwargs):
        super(Reactant, self).__init__(*args, **kwargs)

    @staticmethod
    def GetOrCreate(kegg_id, coeff):
        """Attempts to fetch the CommonName object, or creates it if not present.

        Args:
            name: the name to use.

        Returns:
            A CommonName object.
        """
        try:
            r = Reactant.objects.get(compound__kegg_id=kegg_id,
                                     coeff=coeff)
            return r
        except Exception:
            c = Compound.objects.get(kegg_id=kegg_id)
            r = Reactant(compound=c, coeff=coeff)
            r.save()
            return r

class CompoundWithCoeff(models.Model):
    """A compound with a stoichiometric coefficient."""

    def __init__(self, coeff, compound, phase, name=None):
        """Construct a CompoundWithCoeff object.

        Args:
            coeff: the coefficient.
            compound: the Compound object.
            name: a string of the compound name.
            concentration: the concentration (molar).
        """
        self.compound = compound
        self.coeff = coeff
        self.phase = phase
        self._name = name

    def Clone(self):
        other = CompoundWithCoeff(self.coeff, self.compound,
                                  self.phase, self.name)
        return other

    def AbsoluteCoefficient(self):
        return numpy.abs(self.coeff)

    @staticmethod
    def FromReactant(reactant):
        return CompoundWithCoeff(reactant.coeff, reactant.compound,
                                 conditions.StandardAqueousPhase(),
                                 name=reactant.compound.FirstName())

    @staticmethod
    def FromId(coeff, kegg_id, phase=None, name=None):
        d = {'kegg_id': kegg_id, 'coeff': coeff, 'phase': phase}
        if name is not None:
            d['name'] = name
        return CompoundWithCoeff.FromDict(d)

    @staticmethod
    def FromDict(d):
        kegg_id = d['kegg_id']

        if 'compound' in d:
            compound = d['compound']
        else:
            try:
                compound = apps.get_model('gibbs.Compound').objects.get(kegg_id=kegg_id)
            except Exception:
                return None

        coeff = d.get('coeff', 1)
        name = d.get('name', compound.FirstName())
        phase_name = d.get('phase', None)
        if phase_name is None:
            phase_name = compound.GetDefaultPhaseName()
        conc = d.get('conc', None)
        phase = conditions._BaseConditions._GeneratePhase(phase_name, conc)

        logging.debug('Compound = %s, name = %s, coeff = %d, %s' %
                      (kegg_id, name, coeff, phase))
        return CompoundWithCoeff(coeff, compound, phase, name)

    def ResetConcentration(self):
        if not self.phase.IsConstant():
            self.phase.SetValue(None)

    def Minus(self):
        """Returns a new CompoundWithCoeff with coeff = -self.coeff."""
        return CompoundWithCoeff(-self.coeff, self.compound, self.phase,
                                 self.name)

    def __str__(self):
        name = self.name or str(self.compound)
        return '%d %s' % (self.coeff, name)

    def ToJson(self, include_species=True):
        d = {'coeff': self.coeff,
             'KEGG_ID': self.compound.kegg_id,
             'phase': str(self.phase),
             'name': str(self.compound.first_name),
             'source_used': None}

        if self.compound._species_group is not None:
            d['source_used'] = \
                str(self.compound._species_group.formation_energy_source)

        if include_species:
            d['species'] = self.compound.SpeciesJson()

        return d

    def _GetUrlParams(self):
        return ['reactantsId=%s' % self.kegg_id,
                'reactantsCoeff=%g' % self.coeff,
                'reactantsName=%s' % self.name,
                'reactantsPhase=%s' % self.phase.PhaseName(),
                'reactantsConcentration=%s' % self.phase.Value()]

    def GetCompoundList(self):
        sg = self.compound._species_group
        species = sg.GetPhaseSpecies(self.phase.PhaseName())
        logging.debug('KEGG ID = %s' % self.kegg_id)
        logging.debug('# species in phase %s = %d' %
                      (self.phase.PhaseName(), len(species)))

        l = []
        for s in species:
            l.append({'nh': int(s.number_of_hydrogens),
                      'charge': int(s.net_charge),
                      'nmg': int(s.number_of_mgs),
                      'dgzero': float(s.formation_energy)})
        logging.debug('compound_list = %s' % str(l))
        return l

    def GetName(self):
        """Gives a string name for this compound."""
        if self.compound.preferred_name:
            return self.compound.preferred_name
        if self._name:
            return self._name
        return str(self.compound.FirstName())

    def __eq__(self, other):
        """
            Check equality with another CompoundWithCoeff.

            Args:
                other: a second CompoundWithCoeff (or like object).
        """
        if self.coeff != other.coeff:
            return False

        if self.GetKeggID() != other.GetKeggID():
            return False

        if self.phase.Name() != other.phase.Name():
            return False

        return True

    def DeltaG0Prime(self, aq_params):
        dg0_prime = self.compound.DeltaG0Prime(aq_params,
                                               self.phase.PhaseName())
        if dg0_prime is None:
            return None
        return self.coeff * dg0_prime

    def GetPhaseName(self):
        return self.phase.PhaseName()

    def GetPossiblePhaseNames(self):
        return self.compound.GetPossiblePhaseNames()

    def HasMultiplePhases(self):
        return len(self.GetPossiblePhaseNames()) > 1

    def GetPhaseSubscript(self):
        # The compound C00288 represents the group of all carbonate species
        # and CO2 and is called CO2(total). It is technically aqueous, but
        # also contains a gas component, so the phase is not well defined
        # and hence the (total) subscript. In this case, we don't need to
        # add another subscript so we return an empty string
        if self.name == 'CO2(total)':
            return ''
        return self.phase.Subscript()

    def GetPhaseValueString(self):
        return '%.8g' % self.phase.HumanValueAndUnits()[0]

    def GetPhasePrefactor(self):
        return self.phase.HumanValueAndUnits()[1]

    def GetPhaseUnits(self):
        return self.phase.HumanValueAndUnits()[2]

    def GetPhaseIsConstant(self):
        return self.phase.IsConstant()

    def GetPhaseHumanString(self):
        value, prefactor, units = self.phase.HumanValueAndUnits_letters()
        return '%g %s' % (value, units)

    def GetKeggID(self):
        return self.compound.kegg_id

    name = property(GetName)
    abs_coeff = property(AbsoluteCoefficient)
    subscript = property(GetPhaseSubscript)
    phase_name = property(GetPhaseName)
    human_string = property(GetPhaseHumanString)
    phase_value_string = property(GetPhaseValueString)
    phase_prefactor = property(GetPhasePrefactor)
    phase_units = property(GetPhaseUnits)
    is_constant = property(GetPhaseIsConstant)
    possible_phases = property(GetPossiblePhaseNames)
    has_multiple_phases = property(HasMultiplePhases)
    kegg_id = property(GetKeggID)

redpajama_set_name: RedPajamaGithub


need more information about our confidentiality agreement?
Welcome To Sobriety House, Inc.
self-worth and live a sober life. Sobriety House, Inc. is a licensed facility as well as accredited by CARF.
DEDICATED TO THE REHABILITATION OF RECOVERING MALES.
Transforming lives and building independence.
Making a difference together… today, tomorrow, for life.
Small steps forward are still steps.