text:
WINNER of CHALLENGE "BLACK and WHITE Only"
Perfect shot!!
Thanks Deborah…don't do many B&W, but I'm happy with this one
– Jim Cumming
Amazing! The detail, shadow, everything!
Thanks very much akfphotography
– Jim Cumming
Great action!
Oh Wow once in a life time shot Brava!
Thanks very much LaFleureRouge1
– Jim Cumming
Congratulations for the top ten placement with this sublime photo and great tones! A fav!
Cheers :)
Thanks very much Yannik
– Jim Cumming
wow, excellent moment! congrats on its success!
Thanks alot Ellen
– Jim Cumming
WOW! Fantastic shot!!! Congratulations on your recent well deserved challenge win!
Thank you ctheworld
– Jim Cumming
congrats on the win Jim, well done, top shot
Thanks very much Alex
– Jim Cumming
Please add this award winning image to the DeeZ 5Cs Award Showcase Group HERE
Thanks, DeeZ!
(Reminder, only works that receive this banner can be added to this group – I'm giving awards out to six works for each member at a time so be sure to submit all six!)


text:
Shopping Cart
Need Help?
Nov 2014 |
Doc #FI252656 |
James Wester
This IDC Financial Insights Perspective covers the Money20/20 conference held at the ARIA Resort & Casino in Las Vegas on November 2–5, 2014. In its third year, Money20/20 brought together an estimated 7,000 attendees from multiple industries, ...
Nov 2014 |
Doc #252683 |
Pete Lindstrom,
Stephen Clifford,
Michael Versace
This IDC update offers a video in which Pete Lindstrom and Mike Versace take a look at the future of the password and multifactor authentication. This Q&A includes:
Nov 2014 |
Doc #M55W |
IDC Presentation
Nina Bonagura
This IDC Presentation covers 3Q14 developments in Europe across the industry, services, consumer, retail, and construction sectors, focusing on the current economic situation and developments over the past 12 months. In particular, an analysis ...
Nov 2014 |
Doc #252382 |
Pivot Table
Eileen Smith
This IDC Pivot Table contains the forecast for U.S. and the rest of the world (ROW) business analytics (BA) markets by vertical and company size for the 2013–2018 period. Segmentations are provided for the following six services markets:
Nov 2014 |
Doc #252315 |
IDC FutureScape
Scott Lundstrom,
Michael Araneta,
Andrei Charniauski,
Li-May Chew,
Marc DeCastro,
Karen Massey,
Jerry Silva,
Michael Versace,
James Wester
This IDC study presents the top 10 decision imperatives for the financial services industry. Each decision imperative is shaped by a common set of key drivers that provides a planning tool for technology leaders and their line-of-business ...
Nov 2014 |
Doc #AP250858 |
Business Strategy
Michael Yeo,
Sui-Jon Ho
This IDC Financial Insights report looks at the emerging trend of gamification being used in financial services. Although these efforts have become more visible recently, gamification as a concept within the finance realm has been on the ...
Nov 2014 |
Doc #JP2578605X |
Customer Needs and Strategies
Seiichiro Yoshii
This IDC study, which is a translation of the Japan document IDC #J14290103, analyzes the results of a questionnaire-based survey conducted by IDC among CIOs of user companies in April ...
Nov 2014 |
Doc #IN250844 |
IDC Presentation
Rahil Maniyar,
Aparna Sree
This IDC Presentation provides a cross-vertical demand-side perspective on the cloud services market in India in 2014.
IDC conducts an annual survey on cloud services across all countries in Asia/Pacific. This Presentation is based ...
Nov 2014 |
Doc #CEMA21665 |
Pivot Table
Shai Horovitz
This IDC Pivot Table and accompanying presentation provide a detailed overview of IT spending trends and forecasts for 17 vertical markets (or sectors) and nine product and service categories in Israel for 2013–2018. In addition, the tables ...
Nov 2014 |
Doc #ID250845 |
Agus Kurniadi
This IDC Financial Insights Perspective is a brief of the local market dynamics and conditions that drive investments by Indonesian banks on their datacenters. This summary is based on a Banking Roundtable session in June 2014 hosted by ...
Nov 2014 |
Doc #FI252331 |
Pivot Table
Jessica Goepfert,
Karen Massey,
Michael Versace,
Jerry Silva,
James Wester,
Marc DeCastro
This IDC Financial Insights Pivot Table presents two pivot table worksheets for:
Nov 2014 |
Doc #AU250835 |
Pivot Table
Emilie Ditton,
Bonnie Li
This IDC Pivot Table provides ICT spending data for the Australia Market Model for 1H14. It includes ICT spending from 2013 to 2018 and five-year forecasts. It provides segmentation of the market by product category according to IDC's standard ...
Oct 2014 |
Doc #CEMA21654 |
Pivot Table
Jozsef Bakk,
Gabor Balicza
This IDC Pivot Table and accompanying presentation provide a detailed overview of IT spending trends and forecasts for 17 vertical markets (or sectors) and nine product and service categories in Hungary from 2013 to 2018. In addition, the ...
Oct 2014 |
Doc #252245 |
Pivot Table
David Lantsman,
Natalya Yezhkova
This IDC Pivot Table contains the worldwide and U.S. disk storage 2013–2018 forecast by vertical market and company size.
This Pivot Table contains segmentations for the following standard 18 IDC verticals:
Oct 2014 |
Doc #prSG25226114 |
Research Press Release
Oct 2014 |
Doc #prUS25223214 |
Research Press Release
Oct 2014 |
Doc #FI252132 |
IDC MarketScape
Michael Versace,
Li-May Chew
This IDC Financial Insights report assesses nine vendors offering products and services within the credit risk analytics solutions market. Vendors featured in this report are FICO, Fiserv, IBM Risk Analytics, Misys, Moody's Analytics, Oracle, ...
Oct 2014 |
Doc #CA8EMC14 |
Market Analysis
Tim Wilson,
Mark Schrutt
This IDC study provides the Canadian IT spending and growth forecast over 17 individual vertical markets for the period from 2013, our base year, to 2018. IDC Canada has revised its market assessment upward slightly since our last published ...
Oct 2014 |
Doc #HI251884 |
Pivot Table
Sven Lohse,
Scott Lundstrom,
Lynne Dunbrack,
Judy Hanover,
Nina Bonagura,
Giuliana Folco,
Silvia Piai,
Gary Koch,
Sash Mukherjee,
Emilie Ditton,
Nino Giguashvili,
Hana Chmelova,
Mark Yates,
Roman Maceska
This IDC Health Insights Pivot Table presents our best estimates and forecasts for the worldwide healthcare industry IT opportunity. This Pivot Table provides IT spending forecasts for the provider and payer markets by key subindustries. ...
Oct 2014 |
Doc #AU250827 |
IDC Presentation
Emilie Ditton
In this report, we present the major findings uncovered by IDC's Australian CXO research on intentions, priorities, deployment plans, and IT spending expectations. In 2014, this research is framed around the concept of the 3rd Platform and ...
Oct 2014 |
Doc #AP250848 |
Best Practices
Li-May Chew
This IDC Financial Insights report delineates findings from the 2014 Barometer Survey conducted onsite at our 7th Asian Insurance Congress (AIC) in September. It discusses consolidated results and correlated implications based on respondents' ...
Oct 2014 |
Doc #252059 |
IDC Presentation
Jessica Goepfert
This IDC Presentation includes data from IDC's 2014 Vertical IT and Communications Survey. Key mobility buyer behavior data points are provided to give vendors a quick look at market indicators such as:
Oct 2014 |
Doc #FI251938 |
Business Strategy
Marc DeCastro
This IDC Financial Insights report discusses FinovateFall 2014, with a focus on the companies whose solutions are geared toward retail banking services. FinovateFall is a great way to get a glimpse into live systems that are either looking ...
Oct 2014 |
Doc #lcUS25204714 |
IDC Link
Michael Versace
Oct 2014 |
Doc #CEMA21655 |
Pivot Table
Sergei Yakovlev,
Vasily Agapov,
Zarina Kamytbaeva,
Victor Pratusevich,
Alexander Prokhorov
This IDC Pivot Table and accompanying presentation provide a detailed overview of IT spending trends and forecasts for 17 vertical markets (or sectors) and nine product and service categories in Russia for 2013–2018. In addition, the tables ...

subset: commoncrawl


text:
Vote up!+10
Vote down!
do what ever it takes to win, losing is no longer an option
Submitted by pkristopher on Thu, 05/03/2012 - 14:56. Permalink
We need to kick out the old establishment guard, these neocons threaten not only our well being but the worlds well being. You need to overwhelm them with people. I sincerely hope the Ron Paul supporters outnumber them by a factor of 5:1 ...
- Login to post comments


text:
Jeffrey Goldberg
Carla Cohen, of Politics & Prose, Dies
A pillar of Washington, D.C., intellectual life
Sundown: Freeze and Talks Face-off
Plus the worst-named limousine service ever, and more
Chávez Listens to The Boss
Castro's philo-Semitism is contagious!
Sundown: Our Man in Havana
Plus ground control to Mayor Rahm? and more
Goldberg Goes To Cuba
Photo of the day
Sundown: Blair Steps Up for Israel
Plus, they are women, hear them chant, and more
'Ah, There's Another One'
Hitchens and Amis on English anti-Semitism
Sundown: Charities Reluctant on Pakistan
Plus those crazy L.A. 'Persians,' and more
Bomb Bomb Bomb, Bomb Bomb Iran?
Others react to Goldberg's report
'Atlantic' Reports Likelihood of Israeli Attack
Goldberg examines Iranian nuclear issue


text:
- Narrow by:
- Curtains
- Blinds
- Window Shades
- Drapes
- Vertical Blinds
- See More
California > Lancaster Yellow Pages > Home and Garden > Window Coverings: Drapes Lancaster
3 Day Blinds
(888) 288-1512
Service Area:
Lancaster, CA| Map
3 Day Blinds Promise to You Personalized Experience Backed by the 3 Day Blinds team, your Des... More>
Matching: Drapes
Monarch Carpet & Hard Surfaces
Wide Selection of Carpet, Drapes & Upholstery in LA. Call Us Today!
Avalon Shutters
Window Shutter Store for 28+ Years. Call Us for a Free Consultation.
A-1 Carpet Care
BBB-Accredited Rug Cleaning Company. Call Us in Monrovia Today!
The Cornice Store
(623) 556-5713
Service Area:
Lancaster, CA| Map
Cornices are an excellent way to bring color to a room using fabric. They can be used over blinds... More>
Matching: Drapes
updating results
You are currently searching
Lancaster Drapes.Try other nearby locations.
- Los Angeles |
- Long Beach |
- Oxnard |
- Glendale |
- Santa Clarita


text:
Special Effects Secrets from Scarlett Johansson's 'Lucy'
Kaley Cuoco Shows Off Her Tennis Skills
The Worst Superhero Movies You've Never Seen
10 Infuriatingly Bad Endings to Good Movies
10 Actresses Who Would Be Perfect As 'Captain Marvel'
The Real Lorde Sings South Park's Lorde Parody Song and I's Amazing
14 Shows We Wish Were Still On Air
7 Things You Didn't Know About 'The Big Bang Theory'
A New Batman and New Batmobile for 2016 Movie
10 Female Athletes Who've Got Better 'Back' Than Kim K
'Furious 7' First Trailer Released: Video
Gia Giudice Speaks Out About Teresa Giudice's Prison Sentence
What The Average American Male's Body Looks Like
10 Superheroes Who Won't Get Their Own Movie
10 Actors Who Should Really Play James Bond
Sonja Morgan's RHONY Salary Revealed
The 5 Most Disappointing Series Finales in TV History
Kella Ripa Cracked The Best Dirty Joke On Live TV
8 Historical Facts That Will Change Your Concept of Time Forever
Batman v Superman: Dawn of Justice Photos Revealed
Dina Manzo's Extreme Diva Behavior on Set
Big Bang Fans: The Sad Truth?
Batfleck: One Year After
Watch Russell Brand Get Kicked Off Of Fox News
The Labyrinth of Grisaia Sequel Visual Novel Gets Manga
Your Favorite Wrestler Has Joined James Bond!
Extended Trailer for Avengers: Age of Ultron Brings Even More New Footage!
Selena Gomez and Nat Wolff are Behaving Badly
10 Tricks to Instantly Look More Attractive in Photos
Brandi Glanville Physically Attacks Kim Richards During RHOBH Filming


text:
Photo Credit: FLYNETPICTURES.COM
Jennifer Aniston and Justin Theroux are making a home together. The couple, who took their romance public in June, were rumored to have been living at one another's apartments -- and now they've upgraded to a shared house in Los Angeles.
People reports that Aniston, 42, and Theroux, 40, have signed the lease on a cozy two-bedroom home in the Hollywood Hills. While the house is for sale, they're only renting together -- for now.
"They decided to rent a house together while they keep searching for the perfect (one) to buy," a source tells People. "Jen and Justin are very excited about living together in their new home."
The Horrible Bosses actress and Iron Man 2 scribe have reportedly been looking at houses since July, when Aniston sold her $38 million Beverly Hills mansion in an effort to "simplify." The new house is smaller but still has some of the expected luxuries: hardwood floors, an ozone pool, a "viewing deck," and a high-ceilinged master suite with French doors leading into the yard.
Not only are Jen and Justin getting settled, but they're also getting more affectionate in public -- an eyewitness says they "kissed at the table" during a dinner at the Chateau Marmont last week.
And then there are the rumors that the couple are looking to start a famil. Life & Style reports that Aniston has already consulted a fertility doctor, and has given up bad habits like alcohol, cigarettes and even caffeine. Maybe she's just trying to get healthy -- but after 10 years of Jennifer Aniston pregnancy rumors, it would be exciting if they started being true!


text:
Shockingly, my efforts to complete the documentation on StructureMap 3 have taken much, much longer than I had hoped — but there's some real progress worth talking about. This time around, I'm adopting the idea of "living documentation" where the code samples are taken directly out of the code in the main GitHub repository at publishing time so that the documentation never gets out of sync with the code. For the most part, I'm using unit test code to demonstrate API usage in the documentation with the thinking there that the resulting documentation is much less ambiguous and again, cannot be out of sync with how the code actually works as long as those unit tests are passing.
If you're curious, I've been using our (now abandoned) FubuDocs project with FubuMVC.CodeSnippets to author and publish the documentation. All the documentation is in GitHub in the StructureMap.Docs project (and yes, I certainly take pull requests).
The new documentation has moved to GitHub pages hosting at http://structuremap.github.io. I'm not sure what's going to happen to the old structuremap.net website yet.
Some highlights of the documentation so far:
- A Gentle Quickstart
- The Registry DSL
- Resolving Services
- Object Lifecycles
- Diagnostics
- Nested Containers
- Auto-Registration
I'm committed to finishing the documentation, but I'm obviously not sure when it will be complete. I'd like to say it's "done" before starting any significant new OSS project and I'm using that to force myself to finally finish;)
TL;DR: I've used a form of "strong typed configuration" for the past 5-6 years that I think has some big advantages over the traditional approach to configuration in .Net. I still like this approach and I'm seeing something similar showing up in ASP.Net vNext as well. I'm NOT trying to sell you on any particular tool here, just the technique and concepts.
What's Wrong with Traditional .Net Configuration?
About a decade ago I came late into a project where we were retrofitting some sort of new security framework onto a very large .Net codebase.* The codebase had no significant automated test coverage, so before we tried to monkey around with its infrastructure, I volunteered to create a set of characterization tests**. My first task was to stand up a big chunk of the application architecture on my own box with a local sql server database. My first and biggest challenge was dealing with all the configuration needs of that particular architecture (I'm wanting to say it was >75 different items in the appSettings collection).
As I recall, the specific problems with configuration were:
- It was difficult to easily know what configuration items any subset of the code (assemblies, classes, or subsystems) needed in order to run without painstakingly tracing the code
- It was somewhat difficult to understand how items in very large configuration files were consumed by the running code. Better naming conventions probably would have helped.
- There was no way to define configuration items on the fly in code. The only option was to change entries in the giant web.config Xml file because the code that used the old System.Configuration namespace "pulled" its configuration items when it needed configuration. What I wanted to do was to "push" configuration to the code to change database connections or file paths in test scenarios or really any time I just needed to repurpose the code. In a more general sense, I called this the Pull, Don't Push rule in my CodeBetter days.
From that moment on, I've been a big advocate of approaches that make it much easier to both trace configuration items to the code that consumes it and also to make application code somehow declare what configuration it needs.
Strong Typed Configuration with "Settings" Classes
For the past 5-6 years I've used an approach where configuration items like file paths, switches, url's, or connection information is modeled on simple POCO classes that are suffixed with "Settings." As an example, in the FubuPersistence package we use to integrate RavenDb with FubuMVC, we have a simple class called RavenDbSettings that holds the basic information you would need to connect to a RavenDb database, partially shown below:
public class RavenDbSettings { public string DataDirectory { get; set; } public bool RunInMemory { get; set; } public string Url { get; set; } public bool UseEmbeddedHttpServer { get; set; } [ConnectionString] public string ConnectionString { get; set; } // And some methods to create in memory datastore's // or connect to the specified external datastore }
Setting aside how that object is built up for the moment, the
DocumentStoreBuilder class that needs the configuration above just gets this object through simple constructor injection like so:
new DocumentStoreBuilder(new RavenDbSettings{}, ...);. The advantages of this approach for me are:
- The consumer of the configuration information is no longer coupled to how that information is resolved or stored in any way. As long as it's giving the RavenDbSettings object in its constructor, DocumentStoreBuilder can happily go about its business.
- I'm a big fan of using constructor injection as a way to create traceability and insight into the dependencies of a class, and injecting the configuration makes the dependency on configuration from a class much more transparent than the older "pull" forms of configuration.
- I think it's easier to trace back and forth between the configuration items and the code that depends on that configuration. I also feel like it makes the code "declare" what configuration items it needs through the signature of the Settings classes
Serving up the Settings with an IoC Container
I'm sure you've already guessed that we just use StructureMap to inject the Settings objects into constructor functions. I know that many of you are going to have a visceral reaction to the usage of an IoC container, and while I actually do respect that opinion, it's worked out very well for us in practice. Using StructureMap (I think most of the other IoC containers could do this as well) we get a couple big benefits in regards to default configuration and the ability to swap out configuration at runtime (mostly for testing).
Since the Settings classes are generally concrete classes with no argument constructors, StructureMap can happily build them out for you even if StructureMap has no explicit registration for that type. That means that you can forgo any external configuration or StructureMap configuration and your code can still work as long as the default values of the Settings class is useful. To use the example of RavenDbSettings from the previous section, calling
new RavenDbSettings() creates a configuration that will connect to a new embedded RavenDb database that stores its data to the file system in a folder called /data parallel to the project directory (you can see the code here).
The result of the design above is that a FubuMVC/FubuTransportation application was completely connected to a working RavenDb database by simply installing the FubuMVC.RavenDb nuget with zero additional configuration.
I demoed that several times at conferences last year and the audiences seemed to be very unimpressed and disinterested. Either that's not nearly as impressive as I thought it was, too much magic, I'm not a good presenter, or they don't remember what a PITA it used to be just to install and configure everything you needed just to get a blank development database going. I still thought it was cool.
The other huge advantage to using an IoC container to deliver all the configuration to consumers is how easy that makes it to swap out configuration at runtime. Again going to the RavenDbSettings example, we can build out our entire application and swap out the RavenDb connection at will without digging into Xml or Json files of any kind. The main usage has been in testing to get a clean database per test when we do end to end testing, but it's also been helpful in other ways.
So where does the Setting data come from?
Alright, so the actual data has to come from somewhere outside the codebase at some point (like every developer of my age I have a couple good war stories from development teams hard coding database connection strings directly into compiled code). We generally put the raw data into the normal appSettings key/value pairs with the naming convention "[SettingsClassName].[PropertyName]." The first time a Settings object is needed within StructureMap, we read the raw key/value data from the configuration file and use FubuCore's model binding support to create the object and do all the type coercion necessary to create the Settings object. An early version of this approach was described by my former colleague Josh Flanagan way back in 2009. The actual mechanics are in the FubuMVC.StructureMap code in the main fubumvc repository.
Some other points:
- The data source for the model binding in this configuration setup was pluggable, so you could use external files or anything else that could be exposed as key/value pairs. We generally just use the appSettings support now, but on a previous project we were able to centralize the configuration files to a common location for several related processes
- The model binding is flexible enough to support deep objects, enumerable properties, and just about anything you would need to use in your Settings objects
- We also supported a model where you could combine key/value information from multiple sources, but layer the data in precedence to enable overrides to the basic configuration. My goal with that support was to avoid making all customer or environment specific configuration be in the form of separate override files without having to duplicate so much boilerplate configuration. In this setup, when the Settings objects were bound to the raw data, profile or environment specific information just got a higher precedence than the default configuration.
- As of FubuMVC 2.0, if you're using the StructureMap integration, you no longer have to do anything to setup this settings provider infrastructure. If StructureMap encounters an unknown dependency that's a concrete type suffixed by "Settings," it will try to resolve it from the model binding via a custom StructureMap policy.
Programmatic Configuration in FubuMVC
We also used the "Settings" configuration idea to programmatically specify configuration for features inside the application configuration by applying alterations to a Setting object like this code from one of our active projects:
// Sets up a custom authorization rule on any diagnostic // pages AlterSettings<DiagnosticsSettings>(x => { x.AuthorizationRights.Add(new AuthorizationCheckPolicy<InternalUserPolicy>()); }); // Directs FubuMVC to only look for client assets // in the /public folder AlterSettings<AssetSettings>(x => { x.Mode = SearchMode.PublicFolderOnly; });
The DiagnosticSettings and AssetSettings objects used above are injected into the application container as the application bootstraps, but only after the alterations show above are applied. Behind the scenes, FubuMVC will first resolve the objects using any data found in the appSettings key/value pairs, then apply the alternation overrides in the code above. Using the alteration lambdas instead of just injecting the Settings objects directly allowed us to also embed settings overrides in external plugins, but ensure that the main application overrides always "win" in the case of conflicts.
I'm still happy with how this has turned out in real usage and I've since noticed that ASP.Net vNext uses a remarkably similar mechanism to configure options in their IApplicationBuilder scheme (think SetupOptions<MvcOptions>(Action<MvcOptions>)). I'm interested to see if the ASP.Net team will try to exploit that capability to provide much better modularity than the older ASP.Net MVC & Web API frameworks.
Other Links
- There's something similar in Windsor
- I've heard good things about TypeSafe's config project from folks who code in Scala
* That short project was probably one of the strongest teams I've ever been a part of in terms of talented individuals, but it also spawned several of my favorite development horror stories (massive stored procedures, non-coding architects, the centralized architect team anti-pattern, harmful coding standards, you name it). In my career I've strangely seen little correlation between the technical strength of the development team (beyond basic competence anyway) and the resulting success of the project. Environment, the support or lack thereof from the business, and the simple wisdom of doing the project in the first place seem to be much more important.
** As an aside, that effort to create characterization tests as a crude regression test suite did pay off and we it did find some regression errors after we started making the bigger changes with that test suite. I think the Feathers' playbook for legacy systems, where I got the inspiration for those characterization tests, is still very relevant some 10+ years later.
TL;DR – We built unit of work and transactional boundary mechanics into our RavenDb integration with FubuMVC (with StructureMap supplying the object scoping) that I'm still happy with and I'd consider using the same conceptual design again in the future.
Why write this now long after giving up on FubuMVC as an OSS project? We still use FubuMVC very heavily at work, I'm committed to supporting StructureMap as long as it's relevant, and RavenDb is certainly going strong. I've seen other people trying to accomplish the same kind of IoC integration and object scoping that I'm showing here on other frameworks and this might be useful to those folks. Mostly though, this post might benefit some of our internal teams and almost every enterprise software project involves some kind of transaction management.
Transaction Boundaries
If you're working on any kind of software system that persists state, you probably need to be consciously aware of the ACID rules (Atomicity, Consistency, Isolation, Durability) to determine where your transaction boundaries should be. Roughly speaking, you want to prevent any chance of a system getting into an invalid state because some database changes succeeded while other database changes within the same logical operation fail. The canonical example is transfering money between two different bank accounts. For that use case, you're probably making at least three different changes to the underlying database:
- Subtract the amount of the transfer from the first account
- Add the amount of the transfer to the second account
- Write some sort of log record for the transfer
All three database operations above need to succeed together, or all three should be rolled back to prevent your system from getting into an invalid state. Failing to manage your transaction boundaries could result in the bank customer either losing some of their funds or the bank magically giving more money to the consumer. Following the ACID rules, we would make sure that all three operations are within the same database transaction so that they all have to succeed or fail together.
Using event sourcing and eventual consistency flips this on its head a little bit. In that case you might just capture the log record, then rebuild the "read side" views for the two accounts asynchronously to reflect the transfer. Needless to say, that can easily generate a different set of problems when there's any kind of lag in the "eventual."
The Unit of Work Pattern
Historically, one of the easier ways to collect and organize database operations into transactions has been the Unit of Work pattern that's now largely built into most every persistence framework. In RavenDb, you use the IDocumentSession service as the logical unit of work. Using RavenDb, we can just collect all the documents that need to be persisted within a single transaction by calling the
Delete() or
Store() methods. When we're ready to commit the entire unit of work as a transaction, we just call the
SaveChanges() method to execute all our batched up persistence operations.
One of the big advantages to using the unit of work pattern is the ability to easily coordinate transaction boundaries across multiple unrelated classes, services, or functions — as long as each is working against the same unit of work object. The challenge then is to control the object lifecycle of the RavenDb IDocumentSession object in the lifecycle of a logical operation. While you can certainly use some sort of transaction controller (little 'c') to manage the lifecyle of an IDocumentSession object and coordinate its usage within the actual workers, we built IDocumentSession lifecycle handling directly into our FubuMVC.RavenDb library so that you can treat an HTTP POST, PUT, or DELETE in FubuMVC or the handling of a single message in the FubuTransportation service bus as a logical unit of work and simply let the framework itself do all your transaction boundary kind of bookkeeping for you.
IDocumentSession Lifecycle Management
First off, FubuMVC utilizes the StructureMap Nested Container feature to create an isolated object scope per HTTP request — meaning that any type registered with the default lifecyle that is resolved by StructureMap within a request (or message) will be the same object instance. In the case of IDocumentSession, this scoping means that every concrete type built by StructureMap will have the same shared instance of IDocumentSession.
To make it concrete, let's say that you have these three classes that all take in an IDocumentSession as a constructor argument:
public class RavenUsingEndpoint { private readonly IDocumentSession _session; private readonly Worker1 _worker1; private readonly Lazy<Worker2> _worker2; public RavenUsingEndpoint(IDocumentSession session, Worker1 worker1, Lazy<Worker2> worker2) { _session = session; _worker1 = worker1; _worker2 = worker2; } public string post_session_is_the_same() { _session.ShouldBeTheSameAs(_worker1.Session); _session.ShouldBeTheSameAs(_worker2.Value.Session); return "All good!"; } } public class Worker1 { public IDocumentSession Session { get; set; } public Worker1(IDocumentSession session) { Session = session; } } public class Worker2 : Worker1 { public Worker2(IDocumentSession session) : base(session) { } }
When a FubuMVC request executes that uses the
RavenUsingEndpoint.post_session_is_the_same() method, FubuMVC is creating a
RavenUsingEndpoint object, a
Worker1 object, a
Lazy<Worker2> object, and one single
IDocumentSession object that is injected both into
RavenUsingEndpoint and
Worker1. Additionally, if the
Lazy<Worker2> is evaluated, a
Worker2 object will be created from the active nested container and the exact same
IDocumentSession will again be injected into
Worker2. With this type of scoping, we can use
Worker1, and
Worker2 in the same logical transaction without worrying about how we're passing around
IDocumentSession or dealing with any sort of less efficient transaction scoping tied to the thread.
So step 1, and I'd argue the hardest step, was making sure that the same
IDocumentSession object was used by each handler in the request. Step 2 is to execute the transaction.
Utilizing FubuMVC's Russian Doll model, we insert a new "behavior" into the request handling chain for simple transaction management:
public class TransactionalBehavior : WrappingBehavior { private readonly ISessionBoundary _session; // ISessionBoundary is a FubuMVC.RavenDb service // that just tracks the current IDocumentSession public TransactionalBehavior(ISessionBoundary session) { _session = session; } protected override void invoke(Action action) { // The 'action' below is just executing // the handlers nested inside this behavior action(); // Saves all changes *if* an IDocumentSession // object was created for this request _session.SaveChanges(); } }
The sequence of events inside a FubuMVC request using the RavenDb unit of work mechanics would be to:
- Determine which chain of behaviors should be executed for the incoming url (routing)
- Create a new StructureMap nested container
- Using the new nested container, build the entire "chain" of nested behaviors
- The
TransactionalBehaviorstarts by delegating to the inner behaviors, one of which would be…
- A behavior that invokes the
- The
TransactionBehaviorobject, assuming there are no exceptions, executes all the queued up persistence actions as a single transaction
- At the end of the request, FubuMVC will dispose the nested container for the request, which will also call
Dispose()on any
IDisposableobject created by the nested container during the request, including the
How does the TransactionalBehavior get applied?
In the early days we got slap happy with conventions and the simple inclusion of the FubuMVC.RavenDb library in the applications bin path was enough to add the
TransactionBehavior to any route that responded to the PUT, POST, or DELETE http verbs. For FubuMVC 2.0 I made this behavior "opt in" instead of being automatic, so you just had to either include a policy to specify which routes or message handling chains needed the transactional semantics:
public class NamedEntityRegistry : FubuRegistry { public NamedEntityRegistry() { Services(x => x.ReplaceService(new RavenDbSettings { RunInMemory = true})); // Applies the TransactionalBehavior to all PUT, POST, DELETE routes Policies.Local.Add<TransactionalBehaviorPolicy>(); } }
You could also use attributes for fine grained application if there was a need for that.
Explicit Transaction Boundaries
I fully realize that many people will dislike the API usage with the nested closure below, but it's worked out well for us in my opinion — especially when it's rarely used as the exception case rather than the normal every day usage.
All the above stuff is great as long as your within the context of an HTTP request or a FubuTransportation message that represents a single logical transaction, but that leaves plenty of circumstances where you need to explicitly control transaction boundaries. To that end, we've used the ITransaction service in FubuPersistence to mark a logical transaction boundary by again executing a logical transaction within the scope of a completely isolated nested container for the operation.
Let's say you have a simple transaction worker class like this one:
public class ExplicitWorker { private readonly IDocumentSession _session; public ExplicitWorker(IDocumentSession session) { _session = session; } public void DoSomeWork() { // do something that results in writes // to IDocumentSession } }
To execute the
ExplicitWorker.DoSomeWork() method in its own isolated transaction, I would invoke the
ITransaction service like this:
// Just spinning up an empty FubuMVC application // FubuMVC.RavenDb is picked up automatically by the assembly // being in the bin path using (var runtime = FubuApplication.DefaultPolicies().StructureMap().Bootstrap()) { // Pulling a new instance of the ITransaction service // from the main application container var transaction = runtime.Factory.Get<ITransaction>(); transaction.Execute<ExplicitWorker>(x => x.DoSomeWork()); }
At runtime, the sequence of actions is:
- Create a new StructureMap nested container
- Resolve a new instance of
ExplicitWorkerfrom that nested container
- Execute the
Action<ExplicitWorker>passed into the
ITransactionagainst the newly created
ExplicitWorkerobject to execute the logical unit of work
- Assuming that the action didn't throw an exception, submit all changes to RavenDb as a single transaction
- Dispose the nested container
Use this strategy when you need to execute transactions outside the scope of FubuMVC HTTP requests or FubuTransportation message handling, or anytime when it's appropriate to execute multiple transactions for a single HTTP request or FT message.
Building an EventStore with User Defined Projections on top of Postgresql and Node.js
I did an internal talk on the tooling and concepts in this post at our Salt Lake City office a couple months ago. The recording, for what it's worth, is here. I'm assuming that you're at least somewhat familiar with the concepts of Event Sourcing and CQRS, but if you're not, there are links to descriptive explanations of these concepts in the body of the post.
For most of the 2000's my goto strategy for application persistence was to use some sort of object relational mapping to persist and read the object structures that I wanted to work with in my code. Sometimes I used hand rolled code to do the mapping, and other times my teams used NHibernate. In the past couple years I've been on projects that used the RavenDb document database with mixed success. I've also worked on a couple codebases that used an event sourcing strategy to persist meaningful business events, sometimes with RavenDb as the underlying storage engine and another project that uses an older version of NEventStore with Sql Server as the storage mechanism.
For various reasons, we've chosen to use a Node.js based stack to rewrite an old WPF application that is a suitable candidate for event sourcing on the backend (Corey Kaylor explained his take on this decision in a blog post). Since we already wanted to replace Sql Server (and probably RavenDb) with Postgresql in the long run, at Corey's suggestion I have been working on and off to try leveraging to create a new event store suitable for Node.js development that supports user-defined projections. Lacking all originality, I'm calling this new library "pg-events." You can find pg-events hosted under my GitHub account (my very first foray back into OSS post-FubuMVC).
Feature Set
- Support the basic event sourcing pattern by appending the raw business events as JSON to the event store
- Track events by a "stream" of related events that probably relates directly to some kind of business concept or workflow
- Support user-defined projections of the raw event data to create "read side" views for clients
- Support aggregated views of a stream (really just another projection). Use a basic snapshotting strategy of the aggregate state for efficiency
- Build time tooling to initialize a postgresql database with the custom schema objects and import javascript libraries to postgresql
- A crude, partial implementation of CommonJS that runs within postgresql
Conceptual Architecture
So far, I think the end state is going to consist of these four pieces:
- Postgresql Database
- Custom schema objects largely based on Greg Young's Building an Event Store paper to store events and stream metadata.
- Tables to persist projected views. Most projection views will be persisted to separate tables instead of one giant "pge_views" table for better query performance
- Stored procedures to update and query data in the event storage tables, mostly using postgresql's Javascript support
- Executes and updates aggregate snapshots and synchronous projections. More on that in the following section.
- A Node.js Client
- Exposes methods to append events to the store
- Exposes methods to query for projected views, aggregate snapshots, and raw event stream data
- See https://github.com/jeremydmiller/pg-events/wiki/Client for more information
- Admin CLI Tool
- Build the necessary schema objects into a Postgresql
- Loads the user defined projections and other pg-events libraries into the database
- Can reset the event storage and projected view tables to an empty state for testing
- Eventually, this tool will also support "recapitulation" to rebuild projection data from the raw events when the definition of a projection changes
- Background Projection Runner
- Executes and updates projected views in a background process. This is my very next coding adventure. I'm going to build it out first with Node.js, then try my hand at implementing it again with a standalone Golang executable that uses an embedded V8 engine to execute the projections. Expect my twitter feed to be entertaining when I'm able to start that work. I'll blog about this later when I know what it's going to actually look like;)
User Defined Projections
We looked at EventStore at first and I definitely liked their first class support for user defined projections. Our implementation of projections is very obviously influenced by EventStore's.
I think that the event sourcing efforts I've been a part of have been successful overall, but "projecting" the raw event stream into a persisted read side or view model has been challenging. For pg-events, we're expressing the projections with simple transformation functions that will take in the initial state and the raw event data and simply return the new state (it's a logical fold left operation for the projections that work across multiple events).
For a sample event sourcing domain, I've been using the idea of a quest from the way too many fantasy books I've read over my lifetime. During a quest, our heroes might record events like "QuestStarted", "MembersJoined", "MembersDeparted", or "TownReached." To know or understand the exact composition of a quest party at any time, we need to replay some of the change events (Gandalf stayed behind to fight the Balrog, Boromir was killed, Frodo and Sam ran off, Gollum joined up, etc.) for the quest.
Say we write a projection for a new view across the events in a single quest called "Party" just to understand the membership. From the unit tests, that projection looks like:
require("../../lib/projections") .projectStream({ name: 'Party', stream: 'Quest', mode: 'sync', $init: function(){ return { active: true, traveled: 0, location: null, members: [] } }, QuestStarted: function(state, evt){ state.active = true; state.location = evt.location; state.members = evt.members.slice(0); state.members.sort(); }, TownReached: function(state, evt){ state.location = evt.location; state.traveled += evt.traveled; }, EndOfDay: function(state, evt){ state.traveled += evt.traveled; }, QuestEnded: function(state, evt){ state.active = false; state.location = evt.location; }, MembersJoined: function(state, evt){ state.members = state.members.concat(evt.members); state.members.sort(); }, MembersDeparted: function(state, evt){ state.location = evt.location; for (var i = 0; i < evt.members.length; i++){ var index = state.members.indexOf(evt.members[i]); state.members.splice(index, 1); } state.members.sort(); } });
You'll notice that there's a field called "mode" with a value of "sync." Using the portability of Javascript, we're planning for these modes:
- sync – A 'sync' projection will be executed synchronously inside postgresql within the same transaction as the event capture
- async – In progress. An 'async' projection will be calculated in a background process instead of at event capture time (Eventual Consistency).
- live – Forthcoming. These projections will only be calculated upon demand. I'm not yet sure if we'll do the actual projection transformations within the database or the Node.js client. I guess we could allow two different "live" modes if there's value in doing that.
So, eventual consistency killing you in your current event sourcing efforts because you hit errors by querying off of stale data? Opt for synchronous projections. Have lots of writes, but relatively few reads? Use asynchronous or even live projections that are only calculated on demand. Have lots of reads but very few writes? I think I would again opt for synchronous projections.
I worked on a system a couple years ago in a failed startup that ran projections in a browser to do historical point in time simulations. I don't see any reason why we couldn't do something similar in pg-events if that is ever valuable.
Believe it or not, I have a decent start on documenting the projection support at https://github.com/jeremydmiller/pg-events/wiki/Projections.
Why Postgresql?
Postgresql is the people pleaser of database engines. Want all the normal RDBMS capabilities? Would you be more productive using Postgresql as a document database? Want to write stored procedures with a language that closely resembles Oracle's PL/SQL (no, a thousand times no, never again)? Would you even want to use Javascript inside the database itself? Regardless of how you answered any of those questions, Postgresql is trying really hard to be what you want. In our case, I like that we can use postgresql as an event store, a document database for things that don't fit into the event sourcing model, and a classic RDBMS if that's what we want in some circumstances.
Mostly though, we like that Postgresql has a proven track record and we suspect that the DevOps support tools will be more effective than we've experienced with other OSS database tools.
Of course, the only reason why pg-events is viable in the first place is that postgresql has outstanding JSON support and the ability to author stored procedures with Javascript using Google's V8 engine. With our project timeline, it's also safe to assume that Postgresql 9.4 with its significant improvements to the JSON storage will be available before we go live to production.
Why CQRS isn't crazy
I'll feely admit that the first time I saw Greg Young talking about the Command Query Responsibility Segregation (CQRS) style of architecture in 2008 I thought it was nuts. Specifically, I was afraid that doing the transformations between the "write side" model and the "read side" model consumed by the clients would lead to far too much repetitive "left hand, right hand" code. The reality is, of course, is that I was already doing a lot of work to map database tables to object graphs, transforming domain model objects to DTO's to send over the wire, and crafting database views to transform our raw data into something more conducive to reporting requirements. In a way, CQRS just explicitly calls out a large part of software development efforts that is often overlooked. If we simply accept the idea that different consumers and producers of the persisted state in our system naturally have different needs as far as how the same information is written, structured, and consumed, CQRS isn't really "crazy talk" or extra work. One of the biggest differences is that with event sourcing + CQRS you probably try to pre-build and persist the read side views instead of trying to create views or DTO's on the fly from the "one true database model."
Some thoughts on Relational Databases
I'm very much in the camp that says that the database is strictly for persistence and your business logic and/or user interface should never be tightly coupled to whatever the database is, so the idea of just consuming the raw database tabular data in business logic code is a non-starter for me — not to mention that a flat database table structure is very rarely the exact structure that you'd want in your business logic code outside of CRUD-centric applications. I've been a part of technical arguments with database-centric folks for so long that I'm simply happy to say "agree to disagree" on these issues and let us all go on our way.
There's a tremendous amount of inertia and investment in tooling in our industry in regards to the usage of relational databases as the de facto standard for just about all persistence needs. Additionally, most developers, testers, and even the business people seem to naturally understand the relational database model. Even so, as alternative models like document or graph databases build up more tooling, acceptance, and developer familiarity, I think that relational databases will eventually be consigned to reporting applications or pure CRUD applications (but even then I prefer document databases).
That being said, I think that the future really is "polyglot persistence" and that our children are going to laugh at us in decades to come when we explain how we built systems against relational databases.
I pushed a new minor release version 3.1 of the StructureMap, StructureMap.Web, StructureMap.AutoMocking, StructureMap.AutoMocking.Moq, and StructureMap.AutoFactory packages to Nuget.org this morning. You can see a list of the closed issues in this release here.
Thank you to Matt Honeycutt, Marco Cordeiro, and Jimmy Bogard for their help in making this incremental release.
Future Plans
- The documentation is still in flight and will probably be so for quite some time. What little is there so far is up at http://structuremap.github.io.
- Xamarin support. StructureMap 3.0 is already built with PCL compliance and runs on WP8, so getting it to run on Xamarin runtimes should be a piece of cake, right? Right?
- Continue to make bug fix releases as needed. I hate how many bugs have popped up since the 3.0 release, but at least it's much easier to make incremental releases in the Nuget era than it was with Sourceforge back in the day.
I'm still holding the line on not strong naming StructureMap unless someone does the pull request to support multiple signed and unsigned versions of the Nuget. I'm starting to get asked about a signed version every couple weeks and I still don't want to do that. You're always welcome to just clone the repository and sign the code yourself.
Building with IContext.Root
A couple StructureMap users have asked over the years to support contextual resolution of injected loggers with tools like log4net or NLog. While StructureMap 2.5+ supported this pattern, some of the support got lost in the big restructuring work for 3.0 and this release brings it back.
Say you're using a logging tool that allows you to specify different logging rules and mechanisms by namespaces, types, or assemblies. Your logging tool probably has some construct like the following code to build the right logger for a given type:
public static class LogManager { // Give me a Logger with the correctly // configured logging rules and sources // matching the type I'm passing in public static Logger ForType(Type type) { return new Logger(type); } }
Now, let's say that you want StructureMap to inject a Logger into constructor arguments of the objects it's going to build. If you want to create a Logger that's suitable for the topmost concrete type being built by a service location request to StructureMap. You could use code similar to this:
// IContext.RootType is new for 3.1 var container = new Container(_ => { _.For<Logger>() .Use(c => LogManager.ForType(c.RootType)) .AlwaysUnique(); });
If you wanted to build the Logger individually to match each type in the object graph being created, use this code instead:
// Resolve the logger for the type one level up container = new Container(_ => { _.For<Logger>().Use(c => LogManager.ForType(c.ParentType)) .AlwaysUnique(); });
AlwaysUnique() lifecycle is important here to force StructureMap to create a new Logger instance every time one is necessary in the object graph to prevent the very first Logger created from being shared throughout the entire object graph. This is one of the very few use cases for the "unique" lifecycle.
Child Containers
New for StructureMap 3.0 are "child containers," which should not be confused for nested containers — and all of that would be much more clear if I'd ever get around to writing the big blog post on nested container behavior that I've promised a half dozen people this year. Child containers are meant for stateful client development where you might want to pop a child container for a region, pane, or specific view of the application to override some of the main application services while being able to gracefully fallback to the application container for everything else.
Better IEnumerable<T>/IList<T>/T[] Support
Since at least version 2.5, if StructureMap encounters constructor or setter arguments of IEnumerable<T>, IList<T>, or T[] in a concrete type where the dependency is not explicitly configured, those arguments will be fulfilled by creating an enumerable of all configured instances of the type T in the container in the order in which they were registered. Great, and it was valuable in several usages within FubuMVC, but other folks are wanting to resolve the enumeration types directly or as Lazy<IList<T>> or Func<T[]>. StructureMap 3.1 will now resolve enumeration types that are not explicitly configured by returning all the known configured instances of the type T. To make that concrete, see the acceptance tests for this behavior.
I'm getting to work with Node.js for the first time and generally enjoying the change of pace from .Net — especially the part where my full Mocha test suite that includes integration tests runs faster than my souped up i7/SSD box can compile even the simplest .Net library. For my part, I've been playing with a new library to support event sourcing user defined with projections by leveraging Postgresql's native JSON features and embedded Javascript support (not much to see yet, but the code is here if you're curious).
Since it is Node.js, every action you do that touches the database or file system really wants to be asynchronous. I started by using promises with the Bluebird library, and it was okay for simple cases. However, the code became very hard to follow when I started chaining more than 3-4 operations together. Just this week I finally got a chance to try out the usage of the new ES6 generators feature with my codebase in the places where I was having to combine so many asynchronous operations and I'm very happy with the results so far.
To my eyes, generators are a big improvement in readability over promises. Consider two versions of the same method from my event store library. First up, this is the original version using promises to execute a stored procedure in Postgresql (yep, I said sproc) then transform the asynchronous result to return to the calling client:
append: function(){ var message = this.toEventMessage(arguments); return pg.connectAsync(this.options.connection).spread(function(client, release){ return client.queryAsync('select pge_append_event($1)', [message]) .finally(release); }) .then(function(result){ return Promise.resolve(result.rows[0].pge_append_event); }); },
Now, see the newer equivalent method using generators with some help from the postgres-gen library:
append: function(){ var message = this.toEventMessage(arguments); return this.db.transaction(function*(t){ return (yield t.query('select pge_append_event(?)', message)).rows[0].pge_append_event; }); },
I'm going to claim that the generator version on the bottom is cleaner and easier to write and understand than the version that only uses promises above. Some of that is due to my usage of the postgres-gen library to smooth out the interaction with Postgresql, but I think that not having to nest Javascript functions is a big win (yes I know that Coffeescript or arrow functions with Traceur would help too by making the inline function syntax cleaner, but I'd still rather avoid the nesting anyway).
The biggest difference to me came when I wanted to start dynamically composing several asynchronous operations together. As I said earlier, I'm trying to build an event store library with user defined projections. To test the projection support I needed to repeatedly store a sequence of events and then fetch and evaluate the value of the calculated projection to verify the new functionality. I very quickly realized that embedding the original promise mechanics into the code was making the tests laborious to write and hard to read. To that end, I built a tiny DSL just for testing. You can see the raw code in Github here, but consider this sample:
scenario('can update a view across a stream to reflect latest', function(x){ var id = uuid.v4(); // stores several pre-canned events to the event store x.append(id, 'Quest', e1_1, e1_2, e1_3); // does an assertion that the named view for the event // stream above exactly matches this document x.viewShouldBe(id, 'Party', { active: true, location: 'Baerlon', traveled: 16, members: ['Egwene', 'Mat', 'Moiraine', 'Perrin', 'Rand', 'Thom'] }); // do some more events and check the new view x.append(id, e1_4, e1_5); x.viewShouldBe(id, 'Party', { active: true, location: 'Shadar Logoth', traveled: 31, members: ['Egwene', 'Mat', 'Moiraine', 'Perrin', 'Rand'] }); });
Every call to the
append() or
viewShouldBe() methods requires an asynchronous operation to either post or query data from the underlying Postgresql database. Originally, I implemented the testing DSL above by creating an empty promise, then running that promise through all the "steps" defined in the scenario to chain additional promise operations. Earlier this week I got a chance to switch the testing DSL to using generators underneath the language and that made a big difference.
The first thing to know is that you can embed a generator function inside another generator by using the
yield* keyword to designate that you want an inner generator function to be executed inline. Knowing that, the way that I implemented the testing DSL shown above was to create an empty array called
steps as a member on a scenario object. In the testing expression methods like the
append(), I just pushed a new generator function into the
steps array like this:
this.append = function(){ var message = client.toEventMessage(arguments); self.lastId = message.id; // Adding a new generator function // to the steps array this.steps.push(function*(){ yield client.append(message); }); }
After the scenario is completely defined, my testing DSL just executes the steps as a single generator function as shown in the code below:
// I'm using the Bluebird Promise.coroutine() // method to treat this single aggregated // generator method as a single promise // that can be happily executed and tracked // by the Mocha test harness this.execute = function(client){ return Promise.coroutine(function*(){ this.steps.forEach(function(s){ yield* s; }); }); }
You can see the commit diff of the code here that demonstrates the difference between using just promises and using a generator to compose the asynchronous operation. The full implementation for the "scenario" testing DSL is here.
As an aside, if you're playing Design Pattern Bingo at home, my testing DSL uses Fowler's Nested Closure pattern to first define the steps of a test specification in a nested function before executing the steps. I've used that pattern successfully several times for little one off testing tools and seen plenty of other folks do similar things.
Using generators as a composable Russian Doll Model with Koa.js
My organization settled on a Node.js based stack for a rewrite of an older .Net system, but when we first started discussing a possible new platform Node.js was almost summarily dismissed because of its callback hell problems. Fortunately, I got a tip on twitter to look at the Koa.js framework and its support for generators to avoid the older callback hell problems and I was sold. Since our timeline is long enough that we feel safe betting on ES6 Harmony features, we're starting with Koa.js.
One of the things I feel was successful in FubuMVC was our use of what I've always called the Russian Doll model. In this model, we could compose common behaviors like validation, authorization, and transaction management into reusable "behaviors" that could be applied individually or conventionally to the handlers for each HTTP route in a similar manner to aspect oriented programming (but with object composition instead of IL weaving or dynamic proxies). One of the things that appeals to me about Koa.js is their usage of generators as a middleware strategy that's conceptually equivalent to FubuMVC's old behavior model (the current Connect middleware is "single pass" where the Russian Doll model requires nesting the middleware handlers to do optional before and after operations).
At some point I'd like to experiment with building the FubuMVC "BehaviorGraph" model of configuring middleware per route for better fine grained control, but that's a ways off.
tl;dr: I'm not completely sure about React.js yet just because it's such a different approach, but I really appreciate how easy it is to use it in conjunction with other client side tools.
My shop is looking very hard at moving to React.js for new development and I'm scrambling a bit to catch up as I've been mostly on the server side for years. Partially as a learning experience, I've been using React.js to rebuild the UI for our FubuMVC.Diagnostics package in FubuMVC 2.0 as a single page application. While my usage of React.js on the diagnostics is mostly about read only data displays, I did hit a case where I wanted a "typeahead" type search bar. While a google search will turn up a couple nascent projects to build typeahead type components purely with React.js, none looked to me to be nearly as mature and usable as the existing typeahead.js query plugin*.
Fortunately, it turns out to be very easy to use jquery plugins inside of React classes so I just used typeahead.js as is. For the StructureMap diagnostics, I wanted a search bar that allowed users to search for all the assemblies, namespaces, and types configured in the main application container with typeahead recommendations. Since I was going to want to reuse that search bar on a couple different little screens, I did things the idiomatic way React wants to be used anyway and created the small component shown below:
In the not unlikely chance that the code below is mangled and unreadable, you can find the source code in GitHub here.
var SearchBox = React.createClass({ componentDidMount: function(){ var element = this.getDOMNode(); $(element).typeahead({ minLength: 5, highlight: true }, { name: 'structuremap', displayKey: 'value', // Just a little object that implements the necessary // signature to plug into typeahead.js source: FubuDiagnostics.StructureMapSearch.findMatches, templates: { empty: '<div class="empty-message">No matches found</div>', suggestion: _.template('<div><p><%= display%> - <small><%= type%></small></p><p><small><%= value%></small></p></div>') } }); // Behind the scenes, this is just delegating to Backbone's router // to 'navigate' the main pane of the page to a different view $(element).on('typeahead:selected', function(jquery, option){ var url = 'structuremap/search-results/' + option.type + '/' + option.value; FubuDiagnostics.navigateTo(url); }); }, componentWillUnmount: function(){ var element = this.getDOMNode(); $(element).typeahead('destroy'); }, render: function(){ return ( <input type="search" name="search" ref="input" className="form-control typeahead structuremap-search" placeholder="Search the application container" /> ); } });
There really isn't that much to the code above, but the salient points are:
- The
componentDidMount()method fires just after React.js renders the component, giving me the chance to apply the typeahead jquery plugin to the DOM element.
- In this case the component is a single HTML element, so I could just use the
getDOMNode()method to get at the actual HTML DOM element. In more complicated components you can also use the refs collection.
- I cleaned up and deactivated the typeahead plugin in the
componentWillUnmount()method whenever React.js is tearing down the component to clean up after myself
To use the component above, I just embedded it into another component as more or less a custom tag in the jsx markup:
var Summary = React.createClass({ render: function(){ var items = []; this.props.assemblies.forEach(function(assem, i){ items.push(AssemblySummaryItem(assem)); assem.namespaces.forEach(function(ns){ items.push(NamespaceSummaryItem(ns)); }); }); return ( <div> // This is all you have to do to include it <SearchBox /> <hr /> <ul className="list-group"> {items} </ul> </div> ); } });
So what do I think of React.js so far?
Um, well, React is interesting. I know that my initial reaction was similar to many others: "you seriously want me to embed HTML markup directly into JavaScript?" Once you get past that, it's been very easy for straight forward usages of rendering JSON from the server into HTML displays. I won't make any permanent judgement of React.js until I use it on something with much more complicated user interactions.
To speak to one of React.js's major design philosophies, I've never liked two way model binding in any user interface technology I've ever used because I think it so easily obfuscates the behavior of screens and causes unexpected side effects. I'm not completely sure how well the one way data flow thing is going to work out in bigger applications, but I'm at least initially on board with the React.js team's basic design philosophy.
One thing to consider is that React.js is much more of a library that you'd use as opposed to an all encompassing framework like Angular.js or Ember.js that you have to wrap your application around. The downside of that is that React.js doesn't really do anything to encourage separation of concerns or help you structure your application beyond the view layer, but the old presentation patterns that came out of older technologies still apply and are still useful if you just treat React.js as the view technology. You're just on your own to do your own thinking. The upside of React.js being just a library is how easy it is to use it in conjunction with other tools like the entire jquery ecosystem or bits of Backbone.js or even as something within frameworks like Angular or Ember.
I've also done a little bit of a proof of concept of using React.js as the view layer in a possible rewrite of the Storyteller UI into a pure web application. That work will probably generate much more interesting blog posts later as it's going to require much deeper hierarchies of components, a lot more complicated user interaction, and will push us into exploring React.js usage with separated presentation patterns and much more unit testing.
At least in the circles I run in, there's been a bit of a meme the past couple years that Functional Programming is the one true path to software programming and a corresponding parallel backlash against almost everything to do with OOP. If React.js becomes more popular, I think that it might help start a rediscovery of the better ways to do OOP. Namely a focus on thinking about responsibilities, roles, collaboration patterns, and object composition as a way to structure complicated React.js components instead of the stupid "Class-centric," inheritance laden, data-centric approach to OOP that's been so easy for the FP guys to caricature.
* I'm not really working much on the client side, so what do I really know? All the same, I think the backlash against jquery feels like a bit of throwing the baby out with the bathwater. Especially if you're constraining the DOM manipulation to the purely view layer of your code.


text:
FHA Introduces Lower Cost Reverse Mortgage Saver Program for Senior Homeowners more
Compare Low Mortgage RatesGet Home Loan Offers In Minutes more
Welcome - Citizens First Bank more
Visit our South Central Bank website 24 hours for your online banking needs. more
Welcome - Citizens First Bank more
Check Into Cash makes it fast and easy for you to get the cash you need online or at our Glasgow, KY stor... more
Advance America in Kentucky offers, payday loans, Purpose® Visa Prepaid Debit Cards, MoneyGram® money ord... more
Welcome - Citizens First Bank more
Lincoln County based bank providing mortgage services and deposit products. Now also serving Catawba, Gas... more
Welcome - Citizens First Bank more
Top Trending Articles
Tips on Getting a Mortgage for a Home Purchas...
Making a home purchase can be exciting. Learn about way... more
How to Pay Off Your Mortgage Early and Save M...
Paying off your home mortgage early can offer some sign... more
How to Get a Mortgage Loan Even With Bad...
Learn how you can get a mortgage despite bad credit. Le... more
Is it a Smart Move to Pay Off Your Mortgage E...
The thought of paying off your mortgage loan early can ... more
Is it Better to Have Money in the Bank or Tie...
Is it better to put your money in a savings account or ... more
© 2014 Local Corporation - US Patent 7,231,405
Some data provided by Acxiom. Questions and Comments? Send us your feedback!


text:
our mailing list. It's so wizard.
by Scott MP3 Rowland
18 April, 2010@12:36 pm
0 comments
18 April, 2010@12:36 pm
0 comments
New track from Three 6 Mafia, featuring Project Pat and Billy Wes. For now this track can be found on the new Juicy J mixtape Convicted Felon, but could end also up on the new Three 6 Mafia album later this year. Check it out below.
LISTEN: Three 6 Mafia + Project Pat + Billy Wes – "Keep My Name Out Yo Mouth"
Related Articles
Facebook comments:
Leave a Reply
Search HipHopSite.com
News on the D.L.
- Joey Bada$$ – "B4.DA.$$" Trailer & Release Date
- E-40 – "Sharp On All 4 Corners" Parts 1 & 2 (Album Cover Art + Tracklist)
- PRhyme (Royce Da 5'9 + DJ Premier) – "Raiders of the Lost Art (Documentary)" (Part One)
- J. Cole – "2014 Forest Hills Drive" Album Cover Revealed
- Maino – "KOB2″ Deluxe Cover Artwork & Tracklisting
- Juvenile Signs With Cash Money Records
New Joints
Recently Commented On
- Ghostface Killah - "Double Cross" (feat. AZ)
Commented on by blacqmanta777
- Game - "Blood Moon: Year Of The Wolf" - @@1/2 [Review]
Commented on by Chad
- Hot 97: Fergie Interview
Commented on by yungplex
- Hot 97: Fergie Interview
Commented on by ItlnStln
- Joey Bada$$ – "B4.DA.$$" Trailer & Release Date
Commented on by Justmarv
- Cuepoint: Making Peace With Big Bank Hank by Grandmaster Caz
Commented on by Mitch 3K


text:
What's Hot in Small Business – Chris Crum
|Chris Crum has been a featured writer with the WebProNews.com team and the iEntry Network of B2B Publications since 2003. Chris writes for Small Business Resources about social media, search, and what's new for small business. Hundreds of publications link to Chris' articles including the Wall Street Journal, USA Today, LA Times and the New York Times.
Study Finds People Check Facebook before Shopping at Small Businesses
BIA/Kelsey recently revealed that it estimates spending on local media by small to medium-sized businesses (SMBs) to reach $50.4 billion next year. This would represent 35.8% of total local media spending.
The firm believes SMBs will allocate $37.7 billion of their local media spend to traditional media and $12.4 billion of it to digital media.
Interestingly, this would all put SMB spending in the same class as national brands, which are expected to spend $50.5 billion on local media in 2015. That would be 35.9% of their total local media spending. Another $39.8 billion in local media spending is expected from local brands that aren't SMBs.
The firm's five-year forecast estimates SMB local media spending to reach $59.7 billion by 2019. SMBs and national brands are expected to increase spending by 18% between 2015 and 2019.
Each of the three local advertiser segments are expected to increase their local media spend by double-digit percentages. In all, local media spending is expected to increase to $163.4 billion in 2019.
BIA/Kelsey has shifted its forecast timing to follow the natural budgeting cycle companies go through each year. It says clients have indicated the info is more valuable at the beginning of the fall when they're initiating budget planning for the upcoming year.
Beyond local media spending, LocalVox shares some interesting stats about local business marketing.
For one, 66% of small businesses are maintaining or increasing their spend on digital marketing, according to AT&T Small Business. 70% are using social media to improve their SEO, according to SEO.com.
60% of local businesses don't even have their phone number listed on their websites, according to BIA/Kelsey, while 50% have seen listings for their business that aren't accurate, according to Constant Contact.
National brands that focus on integrated processes for local marketing are expected to increase revenue 10-15%, according to Gartner.
One thing seems clear from all of this. SMBs will only face greater competition from national brands on their home turf, and that means they can't afford to not invest more heavily in their own local marketing efforts. Beyond media spending, SMBs need to take care of their digital presence, including making sure all listings are up to date, and that websites have the information potential customers would look for.


text:
Order by Phone - 7 Days:
(877) 703-1143
or Int
+1 (718) 667-4713
- 8am - 11:30pm EST
My Account
My Cart: 0
Photo Jewelry
Medical ID
Locket Necklaces
Photo Necklaces
Religious Necklaces
Sports Necklaces
Engravable Neckalces
Name Necklaces
Graduation Necklaces
Initial Necklaces
US State Necklaces
Awareness Necklaces
Fingerprint Necklaces
Medical Necklaces
Locket Rings
Photo Rings
Religious Rings
Signet Rings
Police & Fire Rings
Wedding Bands
Family Rings
Mothers Rings
Initial Rings
School Rings
Design Your Own Rings
Promise Rings
Locket Bracelets
Photo Bracelets
Religious Bracelets
Id Bracelets
Monogram Bracelets
Medical Bracelets
Wind & Fire Bracelets
Specialty Jewelry
Top Categories:
Police & Firefighter Jewelry
Fingerprint/Thumbprint Jewelry
Family Jewelry
US State Pendants
Wedding Bands
Wind & Fire Bracelets
Dog Breed Jewelry
Promise Rings
Chinese Symbol Jewelry
School Rings
View More Specialty Jewelry >>>
All Jewelry
Signet Rings
Women's Signet Rings
45 of 45
1. Item Review
2. Message Engraving
3. Add to Cart
Ships in 1-2 Days
Prefer to order by phone:
(including Money Orders)
US Toll Free:
(877) 703-1143
+1 (718) 667-4713
8am - 11:30pm EST, 7 days a week
Catalog ID: PG79625
Pictures are not actual size, refer to sizes listed
Click images to enlarge
Sterling Silver Solid Fancy Ring
click to view Shipping Estimates
Click to read Item Description
Top of the Ring Measures 2/3 Inch x 1/2 Inch
Step 1 a. Item Selection
- Sterling Silver Signet Ring
Currency Converter
Ring Sizer
Step 1 b. Select Item Options
Womens Ring Size
Ring Size: 3
Ring Size: 4
Ring Size: 4.5
Ring Size: 5
Ring Size: 5.5
Ring Size: 6
Ring Size: 6.5
Ring Size: 7 - +$10.00
Ring Size: 7.5 - +$10.00
Ring Size: 8 - +$15.00
Ring Size: 8.5 - +$15.00
Ring Size: 9 - +$20.00
Ring Size: 9.5 - +$20.00
Ring Size: 10 - +$25.00
Customize & Add to Cart >>
Catalog ID:
Step 2. Message Engraving -
We can engrave standard text (block or script) or monogram
Message Engraved on the FRONT side
add + $15.00
Engraving is a Set Price and includes as many characters allowed
Note: This picture is for display purposes only and may not be the same image of the item you are ordering.
Select Message Format:
Select Font Style:
Enter engraving text
To go to the next line, hit enter on your keyboard.
MONOGRAM or INITIAL, from 1 to 3 letters
Traditional Monogram:
1. first name inital
2. last name inital larger letter in the middle
3. middle/maiden name initial, e.g. John Oliver Smith -
Click button below to preview engraving:
Click For Engraved Messages Ideas
<< Back to Step 1
Continue to Step 3 >>
Catalog ID:
Step 3. Add To Cart
Do you have Any Special Instructions to your order?
Please don't put the text you want to be engraved,
this field is for Order Instructions/Comments only
Your Email:
<< Back to Step 2
Adding to Cart.. Please Wait..
Click below to
View Entire Collection of:
Women's Signet Rings
All Signet Rings
This Item Comes With:
Free Jewelry Gift Box is included
Ask a Question
Email To A Friend
Item Description
Shipping Estimates
We can add your monogram, initial or family crest.
To order a family crest simply order the ring of your choice
and let us know in provided "special instructions" box that
you would like to add the family crest.
Then email the crest with the order number to:
The price is an additional $35 that we'll add to your order ourselves
Item can be engraved with message, names, dates or monogram.
Engraving doesn't delay your shipment.
Sterling Silver - Top Measures 2/3 Inch x 1/2 Inch
Sterling Silver
5.4 grams
All Sterling Silver is protected with a tarnish resistance to help it last for years without tarnishing
Order Options:
Personalized Message Engraving.
Add Special Instructions to your order
Orders require
from 1 to 2 business days
for production, before shipping.
view US Ground Transit Time Map
Shipping method
Transit Time
Receive Your Order Within...
Pick Up at Our New York City Location
0 b.days
1 - 2
business days
FREE Shipping (w/insurance)
Available for Orders
over $75.00
1-5 b.days
2 - 7
business days
UPS Ground W/ Insurance
1-5 b.days
2 - 7
business days
UPS 2nd Day Air w/ Insurance
2 b.days
3 - 4
business days
UPS Next Day Air w/ Insurance
Orders placed before 3pm EST will be shipped the same day for next day delivery
1 b.days
business days
UPS Next Day Air
W/ Saturday
Orders placed before 3pm EST will be shipped the same day for next day delivery
1 days
Economy Priority International Shipping
Available for Orders
under $200.00
3-8 b.days
3 - 8
business days
Canada Fedex Express (1-2 Bus. Days)
1-2 b.days
1 - 2
business days
UK Fedex International Express (1-3 b.days)
1-3 b.days
1 - 3
business days
Fedex International Shipping (All Other Countries)
1-3 b.days
1 - 3
business days
We Ship to Military Addresses
Return/Exchange Policy
US Ground Transit Time Map
Customers Reviews
"I just receive the St. Florian medal I had ordered. When you say one day shipping you are not kidding. I ordered this on Wednesday morning 12/21 and it was delivered on Thursday 12/22. The medal is absolutely beautiful. I had this done in Sterling Silver and when I opened the box I was totally blown away. Everything from the engraving to the medal itself is just magnificent. I have a firefighter friend that I am giving this medal to for Christmas. I know he will absolutely love it. Thank you so much for the service as well as the beautiful medal. Happy holidays to all of you."
-- Renee
"Just a note - The numbered earrings were perfect. In fact much better than the photo on the website. I was concerned they would be too big. Not the case. Plus they arrived so quickly at the normal UPS rate. Great job and thank you."
-- John
"Take a bow, because you are everything you say you are. Great workmanship. Great service. My late daughter is looking down from heavena and saying dad you did good. Mom is so happy."
-- Dennis M.
"Just received my bracelet. It is beautiful and unique
and I LOVE IT. I now have an everlasting image of
my precious schnauzer, Sadie. This bracelet will always be my most cherished piece of jewelry."
-- Marie
"Two days after ordering, the sterling silver oval four photo locket, Catalog II-4003 was received in a beautiful box. I'm impressed that it could get here so soon as it was engraved. The locket is an anniversary present from my husband -- it's the first time he's actually given me an anniversary present before the actual day! Did I mention it's gorgeous? Couldn't be happier with the quality."
-- Karla
"I have purchased photo engraved lockers and could not believe the quality of the locket or the clairity of the pictures and for a great price. I have also purchased medical bracelets and I'D bracelets all were first class."
-- Daryl
"14K White and Yellow Gold Miraculous Medal: I have worn this 3/4 inch medal everyday for approximately two years. The bail is already wearing a little on the sides, so I know I will eventually need to replace it, or may just keep it to show it's age. Anyway, I absolutely love it I am go grateful for having found it and yes, shipping was so easy I would recommend this site to anyone looking, because they HAVE the best prices with the largest selection And remember everyone, the price of gold is so high If you are wanting a really thick piece then you need to expect to pay more. While mine may be small and delicate, it was exactly what I was looking for, thank you God bless"
"Danial, when my daughter passed away and I got in touch with you to make me a two in. heart with her picture on it. Well it turned out beautiful and the picture is so life like. You did a beautiful job and now my daughter will always be close to my heart. Thank you so much."
-- Vanessa L.
"My children purchased a photo engraving for me on silver of my Yellow Lab for Christmas. This is one of the most wonderful presents I have ever received and I will cherish this long after she has passed on. Thank you!"
-- Helen B.
"My locket came today, and it is absolutely GORGEOUS It was exactly what I wanted and I had been looking for over a year. The locket is amazing and the picture looks incredible. I can not wait to order more pieces for my sisters and grandchildren. Your work is AMAZING"
-- Julia
Read All Customers Reviews
Your Name
Your Email
Your Question
(877) 703-1143
Live Chat


text:
Skillet - It's Not Me It's You - Guitar cover - Music Videos
Embed kyle92 753 views 2012-09-23T18:59:57 My guitar cover of "It's Not Me It's You" by Skillet.
this song is easy, but still fun to play. I play the second verse a little different from the original recording, just to put my own spin on it.
this song is easy, but still fun to play. I play the second verse a little different from the original recording, just to put my own spin on it.
More Music Videos
- The incredible testimony behind the song Dance Again by LIFE WorshipInspirational Videos
- Awe-Inspiring Version Of 'Mary, Did You Know?' Will Leave You SpeechlessMusic Videos
- You'll FEEL God's Arms Of Love On This Heartfelt Performance With An AMAZING Endin...Music Videos
- 1 Woman's Anointed Voice Sings 'At The Cross (Love Ran Red).' And Now My Goosebump...Music Videos
- Family Sings Hilarious Thanksgiving Song 'All About That Baste'Comedy Videos
- Tim Hawkins - Losing Our Minds TogetherComedy Videos
- 11-Year-Old Sings 'Amazing Grace' and She Sounds Like a Chorus of AngelsMusic Videos
- Miss Kay Wanted To End Her Life. Until Her Son Did THIS – WOW, I'm Speechless!Inspirational Videos
- New Hope Oahu - Hope Is AliveMusic Videos
- At First, These Cello Players Were Getting BOO'ED. But Then They Did THIS!Music Videos
- These Adorable Triplets Are About To Brighten Your Day! How Precious Is THIS!Cute Videos
- Garth Brooks Just Turned This Amazing Story About Moms Into A Song. And It's Got E...Inspirational Videos
No playlists found for this account.


text:
- 1 Arizona beats San Diego State 61-59 in Maui final
- 2 Best of the worst Scum Devils trash talk
- 3 Tips on getting deals during Black Friday blitz
- 4 Different island, same result: Wildcats top SDSU again
- 5 KVOA News 4 Tucson announces new anchor
- 6 Play of Wildcats' Johnson no surprise to Fisher
- 7 Hansen: Time right for Territorial Cup's return to relevance
- 8 UA football: Solomon officially questionable for Territorial Cup
- 9 Motorcycle crash with serious injuries
- 10 UA-SDSU pregame: Chol, Aztecs aim to end Wildcats' streak
Guest Opinion
The Arizona Daily Star welcomes original guest opinions that are sent exclusively to the Star for first publication. These pieces of up to 600 words should express ideas, viewpoints, criticism and news analysis that encourage discussion on issues with an impact on the community. When writing, authors should fully disclose their relationship with an issue and their expertise on the topic. This is particularly relevant when writing about a political campaign or candidate.
Facts must be annotated. Pieces containing information that cannot be easily verified, libelous statements or name calling will be rejected.
We suggest you write, edit and save a copy of your letter before copying it into the form.
Any author may have a letter or guest opinion no more than every 30 days. Submissions may be edited for clarity or length. All submissions become the property of the Arizona Daily Star.
Please include a head-and-shoulders photograph, first saved as a high resolution jpg and then attached to the form.
Most Popular
Follow the Arizona Daily Star
Featured businessesView more...
Deals, offers & eventsView more...
$99 Move in Special - Call for details
Mountain Shadows Apartments
In need of some summer activities for the kids, Toscana Studio & Gallery hosts a kid's summer camp, call us today for details!
Toscana Studio & Gallery is a beautiful and colorful, yet …
Rustic Accent Credenza now available at Sam Levitz Furniture in Tucson
Rustic accent credenza features 2 drawers and a shelf on the b…
Call Leigh H. Bernstein for Conservatorship issues!
Leigh H. Bernstein is one of Tucson's Elder Law Specialist
Join our Equine Wellness Program and receive savings on horse health care! Reata Equine Veterinary Group is here for you and your horse 24/7! 520-749-1446 Click here for details!
We love to reward our loyal customers, so join our Equine Well…


text:
Featured News
Happy Halloween!
Hope everyone enjoyed their Halloween this year, it was certainly a great way to end the work week! KP Washington celebrated the spooky holiday with homemade treats and great costumes!
From the Blog
Best Apps to Keep You Organized & More Productive
There are new apps created every day today that you can use to become your most productive self. Using any one of these can offer some of the best ways to make your work even faster and more efficient. Here's a list of the top 25 that we found to be most helpful!25. UberconferenceConference calling is
WBBA Communicators Event
All members of the WBBA are invited to attend an upcoming event that KP will be co-sponsoring: WBBA Communicators Kick Off Event: The New Campaign – What Works in the Communications and Marketing Mix Date: April 24, 2014 Time: 5:30-7:30 PM Place: Agora Conference Center, 1551 Eastlake Ave. E, Seattle If you are looking for
USPS Releases 2014 Promotions Calendar
The Postal Service is planning seven mail promotions in 2014 to help build interest in integrating mobile technology and other innovative techniques with direct mail, providing customers opportunities to be more successful with traditional marketing campaigns. To help mailers prepare earlier, USPS has published the 2014 USPS Mailing Services Promotions Calendar. Click image to enlarge
REACH Magazine
There's no getting away from the fact that our industry has changed dramatically the past few years. Marketing managers and directors have had to learn, implement, manage and measure a wide range of new tactics, channels and technologies – from Facebook to Twitter to blogs to e-blasts to digital campaigns to segmented and targeted direct


text:
We're sorry, we need more information to run your search. Please enter a last name (adding more details will improve your results).
Lillian Castillo can be found easily if you know where to look. PeopleFinders.com has all the details you need on Lillian Castillo such as age, recent addresses, phone numbers, and relatives and/or associates. Could this the person you've been searching for? Lillian Castillo was born in [YOB] and is 50 years old. Lillian's recent address is located in Anaheim, CA. Our database reveal that relatives of Lillian's include [RELATIVES], among others.
Locate the correct Lillian Castillo quickly by scanning all of the initial search results we provide. By scanning details like relatives, previous residences, and known aliases - you'll be able to easily track down the exact Lillian you want. If you don't find the right Lillian right away, try entering more criteria, like date of birth, into the search box.
Using the search filter above makes it easier to find more relevant results. Insert additional information about Lillian Castillo such as first name, middle name, last name, city, state and/or age to find the right Lillian Castillo swiftly. As soon as you've found Lillian Castillo, you'll be able to peruse all public records we have on file.


text:
Baking Sheets
A flat metal pan used for baking cookies bread etc.
stained-glass star cookies
The translucent stained glass in these holiday cookies is melted butterscotch candies. Be sure to bake the cookies on parchment paper so the can easily be removed from the cookie sheets .
Giant Christmas Card Cookies
These cookies are so big you can fit only one or two on a cookie sheet . Decorate them with a special icing message and give them away just like Christmas cards.
Quick-Roasted Winter Vegetables
For weeknight meals, you can speed up the process of roasting winter vegetables by cutting them into thin slices. For a medley like this one, roast the different vegetables on separate baking sheets , so each one gets the right amount of cooking time.
Cooking with Kids: Meringue Cookies
them in the traditional way, meringues can be placed on baking sheets in a preheated 350-degree oven, then the oven is turned ..... like squeezing the bag to form dollops of meringue on the cookie sheet . We put then put the cookies them in a barely warm oven
Two Crust-y Solutions
Add a couple of tablespoons of extra virgin olive oil, toss well and spread evenly on a baking sheet , avoiding overcrowding (use two baking sheets if necessary): Bake 20-30 minutes, turning in pan one time while baking: Voila--croutons
25 Days of Christmas Cookies: Cream Cheese Christmas Trees
a lusciously moist cookie that's perfect for the holidays. We also love how the green-tinted dough is piped onto the cookie sheet alongside the plain for cookies that are practically decorated as soon as they come out of the oven. Baking them with lollipop
Banana Cake Balls
balls and I've placed them on a wax paper-lined rimmed baking sheet . So, let me show you an easy way to shape these. I am ..... coat those. Roll it right off onto our wax paper-lined cookie sheet . You want to keep your hands clean because right away youinto 1-inch balls and I've placed them on a wax paper-lined rimmed baking sheet . So, let me show you an easy way to shape these. I am using a cookie scoop. And, all you do is
The Pioneer Woman Cooks - Petite Vanilla Bean Scones
re not eating treatments. never and look at me I'm at baking sheet and just vacant for a little bit and then will reportedly. I take this down and and I think about the cookie sheet Leonard want to rack. And then clay then I just that theeating treatments. -- never -- -- and look at me I'm at baking sheet and just vacant for a little bit and then will reportedly. I take this down and and I think about the cookie sheet Leonard -- want to rack. And then -- clay then I just that the cooling rack back on top of the C
How to Make Tender Sugar Cookies
dusting of the sugar, and then place it on an ungreased cookie sheet , place them about 2 inches apart, and then when I'm done ..... this wire rack. We don't want them to keep cooking on a baking sheet . Here they are. You can notice what I was talking aboutthis wire rack. We don't want them to keep cooking on a baking sheet . Here they are. You can notice what I was talking about. See how the tops have kind of crackled and so have
Food Blogs We Love
Cool DIY Project: How to Make Permanent Marker Mugs
Supplies Plain ceramic mugs (colored or white is fine) A baking tray (we used a pie plate) Sharpies Procedure Preheat the oven ..... on the curved surface! Place the mug in the center of a baking sheet or pie plate and put in the preheated oven. "Bake" for
Shortbread Cookie Truffles Recipe
First, prepare a baking sheet like so: lay a sheet ..... Place them on the baking sheet . If you're lazy ..... chill them. Place the baking sheet into the refrigerator ..... heat, and take your baking tray out of the refrigerator
Pillsbury Bake-Off Countdown: Very Vanilla Lemon Tarts
400°F. Line 2 cookie sheets with parchment paper ..... Place 4 wedges on each cookie sheet . Spoon 1 tablespoon ..... center of each wedge on cookie sheets ; top with 1 tablespoon ..... minutes; remove from cookie sheets to cooling rack
How To
How to Make Sugar Cookies
remaining 1/4 cup sugar. Place 2 inches apart on ungreased cookie sheets . Bake about 15 minutes or until tops are slightly crackled ..... on parchment paper so they can be removed easily from the cookie sheets . Swirled Mint Cookies Dainty, colorful cookies make a light
How to Make Stuffing
pepper, freshly ground 2-3 cups chicken or turkey stock Directions Preheat oven to 350 degrees F. Toast bread cubes on baking sheets until slightly crusty, approximately 10 to 12 minutes. Cool and transfer to a large mixing bowl. In a large heavy saute
How to Make Pancakes
placing them on a cooling rack set over a baking sheet in a 200-degree oven. Perfect Pancakes ..... 180 degrees F and place a foil-lined baking sheet inside. Heat a griddle or large pan ..... seconds to 1 minute. Transfer pancakes to baking sheet in warm oven; repeat with remaining