text:
With this new 2.1 release, Groovy:
- has full support for the JDK 7 "invoke dynamic" instruction and API,
- goes beyond conventional static type checking capabilities with a special annotation for closure delegate based Domain-Specific Languages and static type checker extensions,
- provides additional compilation customization options,
- and features a meta-annotation facility for combining annotations elegantly.
Full "invoke dynamic" support
With Groovy 2.0, we introduced support for JDK 7's "invoke dynamic" bytecode instruction and API to benefit from the dedicated support and performance improvements for dynamic languages starting with JDK 7. Groovy 2.1 brings full support for "invoke dynamic" (aka"indy"), completing the work introduced in 2.0.
In Groovy 2.0, most method calls were using the "invoke dynamic" instruction, but there have been exceptions: constructor calls or "spread calls" (where you pass arguments with the "spread operator"). Groovy 2.1 completes the implementation started in 2.0. Now, code compiled with the "invoke dynamic" JAR on JDK 7 will not be using the old "call site caching" code which served us well for getting good performance for Groovy prior to JDK 7. If you are lucky enough to be using JDK 7 in production, be sure to use the Groovy 2.1 "indy" JAR to benefit from the full "invoke dynamic" support. The "indy" version is bundled with the binary download package and can be obtained via Maven (all JARs with "invoke dynamic" support are postfixed with "-indy").
GPars 1.0
Groovy 2.1's distribution bundles the recently released GPars 1.0, the one-stop shop for all your concurrency needs. This new version comes with various enhancements in the asynchronous functions, promises, parallel collections, actors, dataflow support, Google App Engine support, etc.
Be sure to check the release announcement and read the "what's new section" of the GPars user guide. You can also have a look at the detailed JIRA release notes.
@DelegatesTo annotation
Authoring Domain-Specific Languages (DSLs) has always been a sweet spot for Groovy, and the availability of closures and the malleable syntax of the language has allowed DSL implementors to build nice mini-languages like "builders", to represent configuration or hierarchical data.
Thanks to the various delegation strategies of the
groovy.lang.Closure class, a range of very powerful techniques can be used when building DSLs. Due to different implementation techniques, inferring type information within the DSL has not been straightforward. This is especially an issue when DSLs should have proper IDE support (e.g. code completion).
The very popular and powerful Gradle build automation system uses its own DSL for build script specifications. On the DSL implementation layer are various methods taking closures as arguments, and with special delegation strategies delegating to some other parameter passed to them. Providing good IDE support for Groovy DSLs — like the one in Gradle — has presented a few challenges. Hence the need for the
@DelegatesTo annotation.
Groovy 2.1 introduces the
@groovy.lang.DelegatesTo annotation as a documentation mechanism for DSL users and maintainers, as an IDE hint for providing better coding assistance, and as additional information that can be taken into account by the static type checker and static compilation introduced in Groovy 2.0. Let's see that in action with some examples.
A closure delegate based method usage might look like the following:
exec() method takes a closure as parameter, and the actual
launch() call inside that closure is delegated to some particular object (the closure delegate), instead of being dispatched to the enclosing class. The above code would only fail at runtime (not at compile-time!), as the
launch() method can not be found in the closure context. In order to delegate method calls within the closure's code block to another object instance, we need to set the closure delegate.
Setting a closure delegate is as easy as invoking
The delegate can be set to an arbitrary object instance (here, an instance of an
Executor class that has a
launch() method). When the delegate is set accordingly, we can execute the closure code.
Note that usually, to avoid odd behavior if the closure is used in multiple threads, we tend to clone that closure.
The problem with delegate objects are IDEs not knowing about them. Given our example, most IDEs will underline the
launch() method as being an unknown method in this context.
This is where
@DelegatesTo comes into play. By adding the
@DelegatesTo annotation to DSL methods like
exec(Closure), IDEs get the actual delegate type and other meta-data.
A future update might let GroovyDoc show the details about the annotation usage to help users know what methods they can call, what properties they can access, etc.
Here's what your
exec() method will look like with the annotation:
Besides specifying the actual delegate type,
@DelegatesTo can be used to hint at the actual resolve strategy. The resolve strategy determines the order in which non-closure method / property calls are looked up. In our example,
Closure.DELEGATE_FIRST will be used. This indicates the closure will attempt to resolve against the given delegate object in first place, followed by the owner object:
IDE support is not the only reason to use
@DelegatesTo. The static type checker and static compiler take the additional meta-data specified by the @DelegatesTo annotation into account. If there is a typo in the closure code block, the type checker will complain. And if you use the static compilation capability introduced in Groovy 2.0, the calls will be compiled statically.
Let's say we wouldn't call
launch() but
launchr() in the closure code block, we would get a message like:
Static type checks for custom Domain-Specific Languages is a very convenient feature in Groovy 2.1!
In addition, Groovy 2.1 features other abilities for even further type checking your DSLs, as you shall see in the following section.
Before moving on, let's mention a few closing details about
@DelegatesTo allows to specify the receiver calls are delegated to. For instance, when a delegate calls a method or property on another method parameter. Imagine our
exec() method taking the
Executor argument instance as delegate:
In this example, the information is lost that the call is delegated to the
ex parameter. Thanks to the
@DelegatesTo.Target annotation we can specify ex as target for being the delegate object:
What if we had several
Executor parameters, how would we differentiate which one we're targeting?
The delegation "target" can be specified with an arbitrary id. In the example above it is
One last very nice little feature: if you are using static type checking, you can omit the type of the parameter and
@DelegatesTo combined with "flow typing" (the ability of following the current type of an untyped variable) would still know if method calls are valid:
We've seen that the
@DelegatesTo helps documenting, tooling, and checking Domain-Specific Languages in the specific context of closure delegate based methods, but we hinted at the fact we can go beyond, in terms of static type checking for your DSLs.
Type checker extensions
Static type checking was introduced in Groovy 2.0, but Groovy 2.1 goes beyond built-in type checks and offers a way to create type checker extensions. This is great news for Groovy scripts, configuration files, or Domain-Specific Languages implementations as they can can be "type checked" with more advanced, domain-specific rules. As an example, it would be possible to create a custom DSL type checker that throws compilation errors when certain verbs of the DSL are not recognized, or tells this other noun is allowed even if it's a dynamic name bound at runtime, or type checks literal strings containing SQL code to see if the syntax is correct, and more.
Imagine a script, where we define a small robot class and instantiate it:
And we want to operate our robot in the
operate() method, but we want this method to be type checked:
The static type checker will complain as it doesn't understand where the
robot variable is coming from, as it's going through the binding of the script — note that we could teach the type checker to figure out binding-bound variables. It will throw an error telling us that the robot variable was undeclared.
But by utilizing type checker extensions, we can hook into the type checking process to teach it how to handle unresolved variables! In order to do that, we'll specify an extension script through the newly introduced
extensions annotation parameter of the
@TypeChecked annotation:
Now it's time to define the type checker extension script called
RobotMove.groovy. The type checker extension script is written by applying a new DSL — the "type checking DSL". The DSL provides various hooks for type checker extensions to register to. Going back to the example above, we register for unresolved variables using the
unresolvedVariable hook:
The type checker extension script needs to be on the classpath. If this is the case, the script gets notified during compile-time when the static type checker encounters an unresolved variable. The unresolved variable closure is handed over a
VariableExpression is an object directly from Groovy's AST (Abstract Syntax Tree). It is a representation of the unresolved variable expression. The script checks if the variable is named
robot, if this is the case, we lookup a
ClassNode representing the
Robot class, and store the type of that variable back in the AST. At the end, the
handled property is set to true, to indicate the type checker already managed that variable. As a consequence, you won't get the compilation error about that undeclared variable.
To continue the journey, let's consider the case where the user enters a wrong direction string. We could of course use an enum or some other class containing direction constants, but for the sake of the example, we'll have a look at how we can teach the type checker to inspect strings and how you can actually throw your own compilation errors.
For that purpose, let's say a robot can only move left, right, forward and backward. And now, let's change our robot move instruction to:
The robot is not allowed to move sideways, so we should instruct the type checker to throw a compilation error if it encounters a direction the robot will not be able to understand. Here's how we can achieve our goal, by adding a new event handler to our
RobotMove.groovy script:
This handler receives a
MethodCall expression. We are using the
getTargetMethod() utility method to retrieve the corresponding
MethodNode. We check that the method call is a call to our
robot, and that the name of the method corresponds to themove method. Then, we fetch the arguments passed to that method call, and if we're passed a direction in the form of a string constant, we are checking that the direction is an actual allowed direction. If this is not the case, we are adding a new static typing compilation error into the mix, so that the compiler will yell at the poor user because he used a direction which is forbidden and not understood by our robot.
This second example is also interesting in a way that it shows how you can even add compilation checks on things like literal strings on a domain-specific level, paving the way for possible checks on sprintf strings, on SQL or HQL code in strings, etc, allowing you to go even further that what the Java compiler actually checks.
The extension script can make use of various event oriented extension points and utility methods coming from the
TypeCheckingExtension class from Groovy, such as:
- unresolvedVariable
- unresolvedProperty
- unresolvedAttribute
- methodNotFound
- incompatibleAssignment
- beforeVisitMethod
- afterVisitMethod
- beforeVisitClass
- afterVisitClass
- beforeMethodCall
- afterMethodCall
- onMethodSelection
- setup
- finish
The two examples are just the tip of the iceberg, but we will work out more complete documentation of the various extension points and utility methods going forward.
Compile-time Meta-annotations
Annotations are a great way to add supplementary meta-data to classes, methods, fields, and other source code elements, thus frameworks, libraries, and even Groovy's homegrown AST transformations can take advantage of them to do some special treatments to the corresponding AST nodes. Every now and then the use case arises to reuse a combination of annotations, potentially at the expense of a galore of at-signs that obscure the general intent of that particular combination.
To group annotations together, to make the intent clearer or to streamline your code, Groovy 2.1 offers a meta-annotation system, which allows to combine other annotations into one "alias" annotation.
Imagine we are using some annotations defining constraints on properties of your class, like
@Length, or
@Pattern, which could be defined as follows:
An example of how to annotate an
ISBN property with those annotations could look like this:
For a single property, that's quite a bit of annotation overload! And it could be the case of other domain classes with properties having the same validation rules as the ISBN property, where we would need to duplicate that pattern.
As of Groovy 2.1,
@groovy.transform.AnnotationCollector can be used to solve code duplication for this use case.
@AnnotationCollector can be specified on annotation types and acts as meta-annotation. Whenever an annotation marked with it is found, it is replaced with its own annotations. Let's illustrate this with our ISBN example.
We will create a new annotation combination for the 13-digit ISBN standard, but this time, using the
@AnnotationCollector meta-annotation:
@ISBN13 as a single annotation can now be applied on code elements, instead of applying the entire annotation gang::
What is particularly interesting with such meta-annotations is that they are actually replaced at compilation time with the real annotations. So if you counted the number of annotations on the
isbn13 property, you would count 3 (
@Length and
@Pattern). Thus, your underlying framework doesn't need to know about that meta-annotation solution and act accordingly.
Alternate notation
In our example above, we annotated our meta-annotation with the annotations that are then combined together. But for annotations for which you don't need to specify arguments, you could have also passed the names of the annotations to combine as parameters to the annotation collector:
In the above case, we combine the
@Singleton and
@ToString transformation into a meta-annotation called
Passing parameters
If you need to pass some specific parameter to one of the underlying annotations which are combined, you can still do so by passing the parameter to the meta-annotation.
Let's assume we need to combine the following annotations:
We define the meta-annotation combining both the above annotations:
But we want to change the propagation strategy for the underlying
@Transactional annotation, we do so by passing the parameter to the meta-annotation:
Note that if two combined annotations share the same parameter name, the last annotation declared wins and gets the parameter passed to the meta-annotation.
Custom processor
If you need even more flexibility, meta-annotations allow you to define custom processors. The role of the custom processor is to go beyond the simple exchange of the meta-annotation with the combined annotations, to further customize the logic of that transformation.
Custom processors must be precompiled to take action, so we'll create our processor, and then evaluate our final example with
GroovyShell, but first, let's talk about the use case.
We have two validation annotations for defining a minimum and maximum value for an integer property:
If we want to define a range of values, with a lower and an upper bound, we could define a new annotation and implement the associated validation logic, or we could use custom meta-annotation processors to replace a range annotation with a minimum and a maximum one.
So instead of writing:
We could write:
With the normal replacement logic, there's no way we can map the lower and upper bound values to the minimum and maximum annotation element default values. That is where custom processors come into play.
Our meta-annotation definition will look like this:
Notice how we specify that the
@Range annotation is a combination of
@Min and
@Max, and more importantly, how we pass a processor parameter to the
@AnnotationCollector to instruct it about our custom meta-annotation processing logic.
In order to create a custom processor, you have to extend the
AnnotationCollectorTransform class and override the
visit() method:
A few words about the parameters : the
collector corresponds to the
@Range annotation definition,
usage to the actual usage of the
@Range annotation,
annotated is the annotated class, and
src is script being compiled.
We start our implementation of the processor by retrieving the numeric expressions of the bounds defined as the from and to annotation parameters, because we'll pass those values back to the underlying
@Min and
@Max combined annotations. In order to do that, we retrieve the
@Min and
@Max combined annotations thanks to the
getTargetAnnotationList() method. We then set the values of the
@Min and
@Max annotations to the expressions we've retrieved before. We remove the from and to bounds from the
@Range meta-annotation since those parameters aren't really defined on a real annotation but on a meta-annotation. And last, we return the two
@Min and
@Max annotations. If you wanted the Groovy compiler to do its usual replacement logic, you could have also called
super.visit(...), but in our case it wasn't needed.
The full example can be found in this Gist on Github: https://gist.github.com/4563430
Compilation customization
Custom base script class flag
When integrating and evaluating Groovy scripts in an application for business rules or Domain-Specific Languages, it is often valuable to define a base script class, in order to add various utility methods, properties, or interception mechanisms for missing methods or properties.
CompilerConfiguration object, that you can pass to
GroovyShell and other integration mechanisms, allows you to specify a base script class with the
setScriptBaseClass() method.
As of Groovy 2.1, we introduce the ability to define a base script class reference for your scripts via an additional command-line option
-b /
--basescript for the
groovyc command, as well as for the
groovy command.
Here's an example using a script called
In the above script, we notice two things: the usage of a
lookupRate() method, and two undeclared variables:
EUR and
USD. Neither the method, nor the variables have been defined in our script. Instead, they are provided by a base script class, which can look like the following
ExchangeRateBaseScript.groovy class:
lookupRate() method used in our script is declared in the the base class, and the two currencies are retrieved via the
getProperty() method.
Now it's time to wire them together, by instructing the groovyc compiler or the
groovy command line launcher to use our base script class for all
groovy.lang.Script descendants:
Compiler configuration script
Similarly to the
--basescript flag, there's another new option for the
groovy and
groovyc commands: the
--configscript flag. Its purpose is to let you further configure the compiler, in a configuration script, by parameterizing the
CompilerConfiguration object used for the compilation.
With a
CompilerConfiguration, you can customize the various aspects of the Groovy compilation process. For example, you can specify various compilation customizers introduced in Groovy 1.8. Imagine you want to add a new default import to your classes, like importing all
java.lang.Math functions and constants, so that your scripts and classes don't have to prefix those functions and constants all the time, and to avoid having to do that import wherever needed. Here's how you can proceed.
At first, your script,
mathFormula.groovy, contains the following lines:
For evaluating such math expressions, you wish to make the static import implicit, so that the final script will actually look like this:
If you'd run it as is, you'd get an error message saying:
We need to use
CompilerConfiguration to do add an
ImportCustomizer. We'll create ai
mportConfigurer.groovy script with the content below:
We import and then instantiate an
ImportCustomizer, on which we ask for a static star import of the methods and constants of the
java.lang.Math class. Eventually, we pass that customizer to the
configuration variable, which is an instance of
CompilerConfiguration that will be used for the compilation of your math formula.
Now, we are able to execute your formula with the following command-line:
Source-aware customizer
If you use the groovy compiler to compile all your classes, one drawback of the approach above is that the customization applies globally to all classes that are going to be compiled. You may want to add certain default imports only in certain classes (ie. scripts containing math), but you might want to do something different for other classes, like adding a
@ToString transformation to all the domain classes of your application. For that purpose, a new customizer was created, the
SourceAwareCustomizer, to let you filter which classes should be impacted by particular compilation customizations, such as filtering by class name, by file extension, or by a custom logic.
Coming back to our previous example, let's add the default import to our
mathFormula.groovy script, but add a
@ToString transformation to the
MyDomain.groovy class:
Compiler customization builder
The more complex the customization becomes, the more cumbersome the above configuration becomes to write too, that's why Groovy 2.1 also provides a builder for building these types of configurations.
The builder allows you to use a familiar declarative syntax and saves you from adding manually various imports. Let's adapt our example above with the builder:
The configuration code is easier to read and maintain, thanks to the clarity brought by thebuilder approach. But we've only seen a couple examples of customization, and you should have a look at the other customizations available in theorg.codehaus.groovy.control.customizers.builder package to learn more about them.
Other Minor Enhancements
Additonal DGM methods
There are now
leftShift and
withFormatter methods for
Appendable objects.
There are now methods for creating temporary directories and determining the total size of all files in a directory.
There is now a
collectMany for maps (has been backported to earlier versions of Groovy too).
There is now a
closeStreams() method for
Process objects.
You ca now explicitly set a file encoding.
There is support for using a "jar:" prefix when running a script from a URL, in addition to the "file:" and "http:".
XML Processing
There is a method for escaping / encoding XML entities in Strings.
There is a convenience method for serializing
Elements objects.
You can now clone
Node and
NodeList objects.
The name() method now works for all
Node objects, not just
Element objects.
Multiple environments blocks are now supported and merged.
Can now carry over annotations if desired for methods and method parameters.
You can now cache the
toString value. This is useful for immutable objects.
You can now cache the calculated hashCode value. This is useful for immutable objects.
You can now specify
knownImmutables. This is useful when you know you are using an immutable object, but its type isn't one of the known immutable types.
There is now a
AutoCloneStyle which avoids some annoyances with Java's cloning behavior from
Object. Those who need to clone Grails domain objects might find this useful.


text:
(Kampala, Lake Mburo National Park, Bwindi, Queen Elizabeth National Park, Semliki National Park, Murchison Falls)
From spotting rare mountain gorillas in the wild through the mist of dense rainforest, to witnessing herds of elephants roam over the vast savannah, you'll connect with the wild heart of Africa in every sense.
Experience the vibrancy of Ugandan city life in the country's busy capital of Kampala, and travel to the extreme center of the equator and through dense tracts of tropical rainforest in lake Mburo National Park. You'll also hike deep into Bwindi Impenetrable National Park in search of wild mountain gorillas; try to spot an elusive tree-climbing lion and track elephants, buffaloes, lions and antelopes in Queen Elizabeth National Park; explore the rainforest in Semliki National Park that's home to wild chimpanzees; watch hippos and crocodiles at the foot of Murchinson Falls; and visit the Ziwa Rhino Sanctuary for an afternoon tracking wild rhinos.
This is the ultimate trip for wildlife lovers, and your expert team of local guides, trackers and private drivers will ensure you get the most out of every experience. You'll also soak in plenty of Uganda's human culture with visits to artisan workshops and local schools where you'll receive a hero's welcome from excited students. Experience Uganda's finest food and service in a collection of world-class luxury safari camps and remote lodges.
Enjoy a personalized vacation that best suits your needs, developed by one of our experienced destination experts. Relax during your trip with our 24/7 support and expert local guidance.
Welcome to the East African primate capital, the heavily forested country of Uganda! Upon arrival to the Entebbe International Airport, a representative will meet and you load up your entire luggage and head towards the Ugandan capital city of Kampala where you will overnight.
Depart the Ugandan capital of Kampala en-route to the Lake Mburo National Park grounds. Your driver will travel in a south-westerly direction for the specific purpose of travelling to workshops of the Mpigi Drum Makers. It is here where you'll watch numerous ceremonial drums being hand-crafted using the traditional methods passed down from one generation to another. Next, you'll travel to the extreme center of the Earth, the Equator. After some time spent snapping photos, it's off to the Papyrus swamps, where tracts of dense, tropical rainforest merge seamlessly into the rolling plains of Ankole. Shortly after travelling through the swamps, you'll arrive within the confines of the Lake Mburo National Park grounds.
Your park fees are included for this day.
Enjoy a game drive to view the parks' plains, game and birds in their evening habitats, when they are usually the most active. Return to lodge in time to freshen up for dinner.
Wake up bright and early today to enjoy an exciting morning game drive around Lake Mburo. After your game drive, you'll depart the confines of the Lake Mburo National Park and head towards the Bwindi Impenetrable National Park. Often referred to as the Bwindi Impenetrable Forest, this area boast some truly thick vegetation consisting of massive evergreen trees that stretch to great heights for sunlight. It is here within the Impenetrable Forest where almost half of the world's population of Mountain Gorilla reside. The travel time between these two diverse locations is approximately 6 hours depending on weather conditions.
Bwindi is surrounded on the Buhoma side by the Bakiga community and the Batwa people community. If you like, sign up to head out with staff on a 2hr stroll through a small tea farming project. Here you can stop to meet the tea pickers and perhaps even learn how to pluck tea leaves along the way. Then visit a local beer brewery and see how they mash bananas to make a fermented brew which is mixed and distilled to make banana beer - a popular local drink in the area. From here walk a short distance to the local hospital which Sanctuary Gorilla Forest Camp supports through various projects. Learn about how it started and the work they do for the community. Continue your walk to a nearby village and visit a traditional medicine man. The knowledge of using herbs for healing has been passed on from generation to generation and he will show you some of the herbs that grow in the forest and talk about how they are used. Later, relax and enjoy a performance by the Batwa community before returning to the camp.
Pack for a Purpose, an initiative that allows travelers like you to make a lasting impact in the community at your travel destination. If you save just a few kilos of space in your suitcase and bring supplies for area schools or medical clinics in need, you'll make a priceless impact in the lives of our local children and families.
This tour is included in the cost of your stay.
In the afternoon, enjoy some time on your own to relax.
Wake up very early and depart with a picnic lunch to track the rare Mountain Gorillas (hiking boots required). The tracking may take between 5 and 8 hours. The Park Guides with you interpret the flora and fauna and the lifestyle of the Gorillas. Return in the evening for dinner and overnight at the lodge. Only persons age 15 and over are allowed to track the gorillas.
Enjoy an early game drive this morning before making your way to Queen Elizabeth National Park. You will make a stop in Ishasha where, if you are lucky, you will catch a glimpse of the famous tree climbing lion.
Enjoy time at leisure to explore at your own pace, or relax at your hotel.
Enjoy a morning game drive in Queen Elizabeth National Park. The Park has several spots stretching over 200kms of well maintained game viewing tracks. The best time for game drives is in the morning hours where there are high chances of seeing elephants, buffaloes, lion and a variety of antelopes and other wildlife.
The boat cruise on the Kazinga channel usually lasts for 2 hours and it gives visitors the opportunity to see a variety of yawning hippos in water, water birds, buffaloes, elephants, zebras, the Uganda-kobs, topis, water bucks, bush bucks, reed bucks, duiker, mongoose, swamp antelopes, spotted hyena, warthog, forest hog and in difficult routes in the south.
Enjoy an early morning game drive before setting off to Semliki National Park. The drive will take approximately 4 hours.
Enjoy a box lunch while you travel (included in tour price).
Walk down into the beautiful gallery rainforest to track wild chimpanzees. These are usually tracked at dawn or dusk due to the fact that these apes tend to disappear in the middle of the day. There are also a number of bird species which are found in this picturesque forest. Retire from the chimp tracking and then in the afternoon you may relax at the pool or go for a game drive as you watch the sun set.
Depart early this morning for Murchison Falls. On arrival at the park, you will pass over the top the falls for a great view. Approximate travel time is 7 hours.
In the cool early morning before the sun rises too high, you will see plenty of game on the Buligi, Albert and Queen's tracks north of the River Nile. The bulk of Murchison falls wildlife is concentrated to the northern bank of the Nile, and the best for game drives is the circuit of tracks that run west from the ferry jet at Paraa to the Lake Albert Delta.
Enjoy a boat excursion today from lodge to the foot of Murchison Falls. Hippos and crocodiles are abundant, and you will see elephants, buffaloes, waterbucks and birds like; Herons, Cormorants, Ducks, Bee-eaters, Fish Eagles, Kingfishers, and the rare Shoebill. The trip from Para to the Falls and back takes about three hours. A boat trip to the Delta where the Victoria Nile engorges into the Lake Albert leads through papyrus swamps. The trips takes about four to five hours and you will see a similar variety of animals and birds.
After breakfast you will depart for Kampala. En-route, you will stop at Ziwa Rhino Sanctuary for an afternoon rhino tracking venture which is approximately three hours from Murchison Falls. Kampala is an additional two hour drive from Nakasongola. Please talk to your Kensington Tours Travel Consultant if you wish to overnight at the Sanctuary. Please note lodging is simple with en-suite bathrooms.
One of the trained rangers will meet you upon arrival and give you an introduction to the Ziwa Rhino Sanctuary. Depending on where the rhinos happen to be when you arrive, you will drive to the closest location and then approach the rhinos on foot. You will then have an opportunity to observe the rhinos in their habitat at a very close, and very safe, distance. The animals are magnificent and the opportunity to see them up close is truly one not to be missed. The tracking excursion lasts on average between 1-2 hours.
Transfer from Kampala hotel to the Entebbe international airport.
Cassia Lodge is located on Buziga Hill, one of the highest hills of Kampala, close to Lake Victoria. With the environmental temperatures being cool, guest can relish in that there are very few mosquitoes around when outside of the property enjoying the astonishing view of the lake as well as the city. The lodge offers excellent international cuisine in a serene environment, with a highly trained and experienced culinary staff at the helm. The lodge itself offers guests stays in one of the twenty luxurious rooms which all feature satellite television, mini-bar and spectacular balconies with overlooking views of the lake. Guest can also enjoy use of the swimming pool during those sunny afternoon hours to cool down.
The exclusive Mihingo Lodge is a peaceful retreat which strategically sits adjacent to Lake Mburo National Park. The property features ten tented rooms which have been built on raised wooden platforms that are covered by a thatched roof. Suspended under the thatched roof is a spacious and comfortable tent which has been equipped with safari style amenities and facilities including en-suite bathrooms that produce both hot and cold running water for the shower, and flushing toilets. The property also features a large dining area and an infinity pool.
Sanctuary Gorilla Forest Camp is nestled deep inside Bwindi Impenetrable Forest, a UNESCO World Heritage Site in southwest Uganda. This camp is one of the most remote and atmospheric in Africa. The main area features a comfortable lounge and bar area as well as the main dining area while the mini spa offers a wide selection of treatments. Located within the National Park, Sanctuary Gorilla Forest Camp offers guests an unrivalled location, including the best bird and wildlife viewing in the Bwindi area. In fact, Sanctuary Gorilla Forest Camp often receives regular visits from the gorillas themselves. For the lucky guests in camp at those times, they may have the chance for a gorilla encounter without even leaving Sanctuary Gorilla Forest Camp.
Mweya Safari Lodge is located in the Queen Elizabeth National Park, which boasts numerous unique attractions, in addition to all the game viewing and ornithology, which have become synonymous with the term safari.
Semliki Safari Lodge is situated in the Semliki Valley Wildlife Reserve (formerly called Toro Game Reserve), in the Western Rift Valley. It is the only accommodation in over 500 square kilometres of wilderness, offering a truly private experience. Built out of local materials, the lodge has a feeling of traditional rustic without losing that all-important comfort.
Paraa Safari Lodge is in Murchison Falls National Park, North West Uganda. The 40 metre wide River Nile, on it's journey from its source at Lake Victoria to join Lake Albert, is suddenly compressed into a gorge only six meters wide, and cascades into a boiling pot 43 metres below. The earth literally trembles at Murchison Falls, one of the world's most powerful flows of natural water. Elevated high above the Falls on the north side of the river, the historical Paraa Safari Lodge enjoys simply astounding views. The lodge is one hour flight from Entebbe or six hours drive by road.
TiaRazon ,
May 11, 2015
"We were a group of 5 to Morocco. We were impressed at how seamless our private guided tour went. Accommodations were five star, the choice of family run hotels, beautifully appointed with Moroccan furnishings and large breakfasts, contributed to our experience. Our guide, Ishmail and driver, Abdul, made us feel like family. Ishmail showed off his country with pride, listened to our needs and was flexible to our style and speed of travel. We couldn't be happier with our Kensington experience beginning with the pre-planning in the US with Lily Baffour. Thank you very much for a memorable experience! "
JamesSmith ,
May 12, 2015
"Our guide, Chakim, was fantastic, and our driver was excellent. We were very pleased with our accommodations. Only negative comments would be the villa in Essaouira (room, food, service not good although people very nice), and, while probably not an issue for other travelers, we were disappointed that we could not relax over a glass of wine at the end of our journey because Hotel Le Doge did not offer alcoholic beverages. We are currently scheduled with Kensington Tours for India in November and we are now planning on scheduling with Kensington for all our trips - right now that would be Thailand to Mynamar, and Egypt with Dubai extension. We are extremely happy with Kensington Tours and their travel agents. We would recommend Lily Balfour to anyone. "
EarleBarnwell ,
April 08, 2015
"Kensington and its partners did not miss a single deadline, appointment or function to our total satisfaction. The result, no stress and total enjoyment."
StephenReeves ,
April 08, 2015
"Christine was absolutely superb both in helping us frame and develop a custom tour as well as in constant follow up until we left. Inevitably things will change on the ground when trips are planned in advance and Christine was consistently on top of the changes and advised us accordingly. As first time travelers to Kenya and Tanzania Christine's advice and guidance was simply excellent. Rose, in Kensington's Nairobi office was likewise superb. Totally responsive to our needs, she helped make a few final adjustments while we were there. Once again, an exceptional experience made possible by Kensington."
Sachi Gowda ,
December 15, 2014
"We are extremely happy with your service from beginning to end and we had very a memorable trip."
Ronald Jones ,
December 12, 2014
"I cannot express how fabulous our trip was!! I know it was made that way thanks to ALL the kind, knowledgable, and helpful people that you all placed in our path. Many went above and beyond to make our experience even more positive. From drivers, to guides, to hotel staff---we met some wonderful people that we can now call friends. Thank you Christine and Kensington tours for this once in a lifetime African adventure!"
RonJones ,
December 15, 2014
"Christine, our family trip was ALL we wanted it to be. The hotel accommodations in the cities were GREAT. We needed to make some room assignment adjustments but that's to be expected with a large family with children and same names.
I don't know where/how ya'll got those guides but...KEEP'EM! In both Cape Town and Joberg the guys knew their cities and environs excellently. Their English was very good...so good in fact that several got the sarcasm and even joked some. I do apologize if we over-tipped. I relied on each family to tip their own driver but, I wasn't sure of their "sense of what was right" so I followed up with something for each.
Simbavati was "PERFECT". As much as Glenda and I really liked Ngala, I do not think they could have handled a family as well...UNLESS, they had accommodations we did not see.
Please rest assured when ever I plan to travel on a multi-dimensional trip in the future, for sure with a group, or maybe just Glenda and I, I'll be calling Kensington... Christine and Donna specifically. And most definitely, anytime I can recommend a travel professional, your company and you two will be mentioned by name!
Thank you again Christine...you presented us the exact trip we dreamed about for our family and your folks on the ground made it happen! I sincerely hope you, Donna and everyone else involved have a most Blessed Christmas and a wonderful, successful New Year!"
Bruce Lundstrom ,
December 15, 2014
"Morocco has a lot to offer. Food, historic sites, craftsmen (rugs, jewelry, ceramics, furniture, etc.), natural beauty, roads and infrastructure, and a reasonably safe environment. Both Guide (Abdel) and Driver were excellent. Service-oriented, timely and easy going. Abdel was not afraid to speak his mind, offer suggestions and give us feedback on ideas. We enjoyed their company."
AlbertLind ,
December 09, 2014
"A truly wonderful trip......first class accommodations and service in each venue....the guides were knowledgable and went out of their way to insure that we could see and understand Africa. Capetown is a fascinating city, Sabi Sands an extraordinary private game preserve, and Zimbabwe with Victoria Falls and the Victoria Falls Hotel a once in a lifetime experience. For those who want to visit Africa we enthusiastically recommend Kensington Tours. And Jolene Plant stayed with us in every step during the planning of our trip and itinerary. We saw as much of Africa as much as anyone can during our two weeks vacation."
Belinda Skelton ,
December 12, 2014
"This was one of the most amazing trips that I have ever had. The custom tours and activities exceeded my expectations. I was traveling alone but felt safe and in good hands. The process of booking the trip with Lily Baffour was so easy and personal, especially with the constant communications from her up to my departure. Thank you Kensington Tours for an awesome experience. I will definitely use you for my next adventure!"
Stay in the know: Subscribe to our newsletter to have our hand-picked trips & specials delivered to you!
Please enter a destination

subset: commoncrawl


text:
Once upon a time my favorite thing to do on Thursday nights was watching NBC's Thursday night lineup, what the network called "Must See TV."
The lineup changed over the years, but included such classics as "Cheers," "Friends," "Frasier" and "ER."
I seem to remember there being other nights with an evening of strong lineups, but Thursdays stand out.
My TV viewing habits have changed considerably over the years. First, I never watch network TV. I have a handful of favorites, some of which are available on HBO ("Game of Thrones" and "True Blood"), AMC ("Breaking Bad" and "Walking Dead"), Netflix ("House of Cards" and "Orange is the New Black") and PBS ("Downton Abbey").
That sounds like a long list of programming, but at any given time only two or three have new episodes, which tend to cluster around Sunday and Monday nights, or are available on demand, which means we can watch them when we want, usually Sunday or Monday nights when other shows have gone into reruns.
The rest of the week? We don't watch TV.
TV viewing habits in my house are not unusual, and reflect the seismic shift taking place in television, away from network-controlled viewing to viewer-controlled viewing.
There's a lot of competition in this new age of household entertainment. Hulu Plus, Amazon and Apple are all trying to compete with Netflix in the genre of on-demand programming. When Sarah and I got hooked on "Downton Abbey," we were disappointed to learn that Netflix had lost the bidding war for later seasons, which meant that to watch all the previous episodes we missed, we had to subscribe to more than one streaming service.
I prefer the subscription model to the a la carte like what Apple does, charging a good chunk of change to watch a single season of one program. But by the time you add the charges for two or three streaming services to watch a season's worth of six or seven shows, a la carte almost begins to make sense.
It's going to take a while before the small screen industries stabilize into a stable platform the way it once was when networks ruled TV viewing.
Meanwhile, we are left with buying a lot more than we need for a lot more than we'd like to spend.
For example, of the hundreds of cable channels we get for a monthly charge, we only watch a dozen regularly. But we also get internet access, which enables us to get the streaming services that we've been using so heavily.
I'd be willing to pay substantially close to what I pay now just for the channels I use now and internet access, as long as it is a little less expensive than it is now.
I'd be willing to give up cable TV altogether and switch to DSL for internet access and over-the-air for local TV, if I could get HBO some other way.
It's attitudes like mine that has the television industry running scared, because options that make more sense for me are just around the corner, and they don't involve anything cable TV providers want to sell me.
Then there's another issue that arises. If I and a million others abandon traditional TV, what happens to those things about network TV that are truly worth supporting? CBS has a couple of dandies, "Sunday Morning" and "60 Minutes," two very costly programs that are worth preserving, and there are many others.
Of course there are other options, too. I could just read a book. Take a walk. Or read a newspaper.
Thanks for letting me take up some of your Sunday morning.


text: Non-Enzymatic Cell Dissociation Solution (ATCC® 30-2103™) General Information Quality Control Specifications Documentation Print Email Share Share this product Facebook Twitter Google+ Permits and Restrictions View Permits Product Format 100 mL Storage Conditions When stored at 2°C to 8°C, the product is stable until the expiration date on the label. Applications Trypsin is the most commonly used enzyme for harvesting cells in culture. A non-enzymatic approach is needed when non-protein and animal-component free materials are required. ATCC Non-Enzymatic Cell Dissociation Solution is a sterile, phenol-red free solution composed of a proprietary mixture of chelators representing an optimized alternative to protein-digesting enzymes. Comments This product is totally free of animal-derived components. Biosafety Level 1 Quality Control Specifications Lot specific results are available in the Certificate of Analysis, which is available at www.atcc.org or by contacting ATCC technical service. Test Specification Osmolality 280 to 300 mOsm/kg Appearance Clear solution Cell testing (Vero) Rate of proliferation and morphology Permits These permits may be required for shipping this product: Customers located in the state of Hawaii will need to contact the Hawaii Department of Agriculture to determine if an Import Permit is required. A copy of the permit or documentation that a permit is not required must be sent to ATCC in advance of shipment. Basic Documentation Product Sheet Certificate of Analysis SDS


text:
| Credit Card Bottle Opener
Price $0.92 - $1.88 ea.
Order as few as 125
Item #: Q16622
| Plastic Bottle Opener Key Chain
Price $0.39 - $0.49 ea.
Order as few as 250
Item #: Q8647
| Guitar Key Chain Bottle Opener
Price $0.59 - $1.16 ea.
Order as few as 125
Item #: Q17893
| Sonoma Wine Opener
Price $1.96 - $3.61 ea.
Order as few as 75
Item #: Q2817
| Mini Bottle and Can Opener/Key Ring
Price $0.45 - $0.56 ea.
Order as few as 300
Item #: Q20430
| Bordeaux Wine Opener
Price $2.76 - $4.78 ea.
Order as few as 75
Item #: Q16627
| Bartender's Vinyl Bottle Opener
Price $1.68 - $2.74 ea.
Order as few as 75
Item #: Q50637
| Aluminum Bottle Opener (Value Line)
Price $0.57 - $1.14 ea.
Order as few as 125
Item #: Q4732
| Aluminum Bottle Opener (Open Center)
Price $0.57 - $1.14 ea.
Order as few as 125
Item #: Q11635
| Stainless Credit Card Bottle Opener
Price $1.17 - $2.08 ea.
Order as few as 75
Item #: Q51786
| Promotional Aluminum Bottle Opener
Price $0.50 - $0.593 ea.
Order as few as 300
Item #: Q10547
| Personalized Aluminum Bottle Opener
Price $0.72 - $1.61 ea.
Order as few as 125
Item #: Q35483
| Credit Card Size Opener
Price $2.47 - $4.12 ea.
Order as few as 144
Item #: Q19756
| Bottle Opener Key Chain With LED Light
Price $0.87 - $1.07 ea.
Order as few as 250
Item #: Q39854
| Veneto Automatic Wine Opener
Price $32.44 - $59.18 ea.
Order as few as 6
Item #: Q15282
Bottle openers make great promotional items because they come in handy so often. Think about it: how many times have you been hanging out with friends or getting ready to eat at a family gathering when someone grabs a cold one from the cooler and asks around for a bottle opener? Even today, not every bottle comes with a twist-off cap. A bottle opener with your logo on it will help your customers be prepared--and make sure that your company's name comes to mind when they see it!
Needless to say, bottle openers are great giveaway items for a restaurant or bar. No matter where they are when they're popping open their bottles of root beer, when they use bottle openers that bear your business's logo, they'll be thinking about the fine food and drinks they enjoyed at your establishment.
Of course, you don't have to be a restaurant owner to have success using bottle openers as promotional items. Anyone who works at events where the cold drinks might be flowing--caterers, musicians, deejays--can benefit from having their contact information printed on bottle openers that guests can slip into their pockets and bring home with them.
Really, if there's going to be any kind of gathering where people expect to have fun, and your business is going to have a presence there, you can bet that bottle openers with your company's logo on them will make fine souvenirs.
Getting a booth at a local street fair? Get some bottle openers to help attendees remember your company's name. They'll be easy for festival-goers to snag from the table so they can take a look at your company logo later. Giving away thank-you gifts at the company picnic? Slip a few bottle openers into the bags so your employees can share them with friends and family. Bottle openers are like pens in that people tend to pass them along (and sometimes not return them, which is a good thing in this case--it spreads your company's info even further!).
Industry conventions give rise to all sorts of parties once the official business on the convention floor is done for the day. In this case, personalized bottle openers given away at the company booth are just the kind of promotional item that people will put to use right away, and they'll be looking at your company's logo when they do it.
Bottle openers are small and sturdy. They'll get your company's information into customers' hands and stand up to use so that customers won't forget what they saw. We've listed a few cases when bottle openers might make wonderful promo gifts, but their convenient size and their durability make them a solid choice for almost any situation. If you think that custom bottle openers can help promote your business, then give Quality Logo Products a call today.


text: In India, prostitution itself (exchanging sex for money) is not illegal, but the surrounding activities (operating brothels, pimping, soliciting sex etc) are illegal. Prostitution is currently a contentious issue in India. In 2007, the Ministry of Women and Child Development reported presence of 2.8 million sex workers in India, with 35.47 percent of them entering the trade before the age of 18 years [1][2]. The number of prostitutes has also doubled in the recent decade . According to a Human Rights Watch report, Indian anti-trafficking laws are designed to combat commercialized vice; prostitution, as such, is not illegal. A sex worker can be punished for soliciting or seducing in public while clients can be punished for sexual activity close to a public place, and the organization puts the figure of sex workers in India to be around 15 million, with Mumbai alone being home to one hundred thousand sex workers, the largest sex industry centre in Asia [4]. Over the years, India has seen a growing mandate to legalize prostitution, to avoid exploitation of sex workers and their children by middlemen and also in the wake of growing HIV/AIDS menace. Normally, girl prostitutes as categorised as common prostitutes, singers and dancers, call girls, religious prostitutes (or devdasi), and caged brothel prostitutes. Districts bordering Maharashtra and Karnataka, known as the 租evadasi beltBAD 922C have trafficking structures operating at various levels [4]. Brothels are illegal de jure but in practice they are restricted in location to certain areas of any given town and thus although the profession does not have official sanction, little effort is made to stamp it out or to take action to impede it. Sonagachi in Kolkata, Kamathipura in Mumbai, G. B. Road in New Delhi, Reshampura in Gwalior and Budhwar Peth in Pune host thousands of sex workers. They are famous red light centres in India. Earlier other centres like Dal Mandi in Varanasi, Naqqasa Bazaar in Saharanpur, Mali Sahi in Bhubaneshwar, Chaturbhuj Sthan in Muzaffarpur, Peddapuram and Gudivada in Andhra Pradesh. < Read less Read more >


text: Back Bay Location - Come to Copley Square Hotel in Boston and experience all of the intrigue and history of Boston, in one of America's oldest and most beloved cities. Located in the heart of colorful Copley Square in Back Bay, this timelessly trendy hotel lies within walking distance of exciting dining, nightlife, and entertainment options. It lies blocks away from Newbury Street, the Boston Public Library, Fenway Park, Boston Common, and countless other points of interest. Premier Boston Hotel Rooms - Our contemporary and luxurious hotel features 143 newly redesigned guest rooms and suites. Copley Square Hotel provides its guests with the best in accommodations and service at a landmark Boston address. Here, Guests will enjoy state-of-the-art facilities and amenities, in addition to our personalized, world-class service.


text:
- Magazine
- Newsletters
- Multimedia
- Store
- Buyer's Guide
- Events
- Classifieds
- Got A Question?
Vehicle paint systems are a combination of a pigmented color coat (referred to as the base coat) and a clear protective coat (clearcoat). Together, they combine to form a very durable and relatively easy to maintain surface.
A wash once a week, a good wax every month and periodic buffing to remove light scratches and blemishes will keep the clearcoat shine and luster like new for years to come. The problem is most vehicle owners don't take that formula for keeping paint maintenance to heart. Commonly, it's the people who don't brush their teeth at least twice daily who let vehicle paint maintenance go for months or even years.
Paint: A vehicle's protective armor
The color coat of vehicle paint is not near as thick as it was when single stage paints were the norm. Back then, you had 4 to 6 mils of paint to safely work with when buffing or sanding a paint imperfection.
Today, the protective clearcoat is only 1.25 to 2 mils thick. Manufacturers can void the warranty if over 0.3 - 0.5 mil of clearcoat is removed by buffing or sanding. Once the clearcoat is breached, the pigmented paint below is doomed.
So, what process explains why paint fades, oxidizes, discolors or chalks? To understand the answer it is useful to explain the ingredients to a paint or coating since the same factors figure into the loss of color and gloss on any paint system.
All pigmented paints have four basic ingredient categories:
· Binder;
· Solvent;
· Pigment; and
· Additive.
Within each category there may be more than one ingredient.
The binder is the resin or blend of resins which give the paint most of its thermal, mechanical and weathering properties. The binder is the backbone of the paint, the foundation upon which every other component is built. Typically, binders are polymeric and are chosen by the formulator to give the optimum combination of cost, quality and performance profile.
The solvent or solvents are referred to as carriers because they make the paint flow and "carry" the coating to the surface to be painted. When they are completely evaporated the paint is "cured." Solvents can be oil based, water based, or both. When a water based paint needs a co-solvent that is miscible or compatible with water or dihydrogen monoxide, the chemical name for H2O. The degree of surface tension affects adhesion.
Pigments are nothing more than finely ground minerals dispersed into paint. To be blunt, they're really just colored dirt, so it's easy to understand that when left exposed to the elements and without protection from the binder, they become the proverbial "dust in the wind."
There are two types of pigments. The prime pigments give the paint its color and the extender pigments (or fillers) impact hiding, color retention, fungal and algae resistance, and durability. They both provide color opacity to an otherwise clear or translucent binder, weather resistance (elements such as titanium dioxide in either regular grade or micro-fine particles) and corrosion resistance.
Additives are any modifiers that provide all kinds of special effects to paints, from rheology (the study of the deformation and flow of matter under the influence of an applied stress) agents that increase flow, to ultraviolet absorbers and stabilizers that give it increased resistance to sun fading. They do some wonderful things but unfortunately, not for long.
Long before a paint loses its integrity and starts to crack, peel or flake, additives are like Elvis: They've left the building. This is a result of the additive migrating to the surface and dissipating over time rather than developing bond links to the polymer core for longer term stability. Obviously, the only difference between a clearcoat and base coat is the pigmentation. Now that we know the players, we can get to the heart of the answer.
Chemical composition
If you examine a coating under a microscope you will find the polymer (binder) matrix can run the gamut from essentially straight or linear molecules (like a box of uncooked spaghetti) to highly complex molecules (like a coaxial cable wrapped inside another opposite directional coaxial cable) to anything in between. Much of their characteristics are determined by their molecular weight. Polyurethanes, like those used on cars and trucks, have a very high molecular weight. Molecular weight doesn't mean much if you don't have complete material reactivity.
In essence, reactivity is the linkages between liquid #1 and liquid #2 of a typical polyurethane coating. In fact, incomplete reactivity is the "dirty little secret" of the industry. They are always trying to get it better, but so far haven't. Think of these polymer matrixes as being chains of molecules which get their strength from the bonds that hold them together (like links in a chain used to pull a heavy object). Whether simple or complex, they have one unalterable characteristic: they are chains that are only as strong as their weakest link. That's why the reactivity is so important in urethanes.
Reactivity is the chemical process that makes those linkages. Break the link bond at any point and you begin to weaken the chain that gives a coating its protective capabilities. Un-reacted bonds are "weak links" from the beginning. Don't misunderstand: Quality polyurethanes from any name manufacturer are good coatings, just not as good as some might like you to believe.
Thermal, photo-oxidative, mechanical, chemical, and biological degradation bring about changes in physical properties in polymers. They disturb or weaken the links that give the chain its integrity. There are other stress agents like airborne pollution, salt, sand, abrasion, solvents, biological contaminants, acidic or alkaline substances, chlorides, etc. that also add stress. But, as damaging as they are, they are only contributory elements leading to bond failure, or as some call it "polymer unzipping" because of the similarity to a zipper being unfastened. The big three are sun, moisture and heat, and more important than any one of them, is how they interact with each other.
Bad for you, bad for your car
Let's start with sunlight induced damage known as photo-oxidation. Perhaps you've read about how "free radicals" are bad for you and how anti-oxidants of whatever kind (foods, vitamins, supplements) will control them and prevent damage to your body. Well, the same free radicals are part of this story as well.
It is important to understand that polymer backbones are made up of multiple elements. Key among these are hydrogen and oxygen. When the coating absorbs photons of UV radiation from sunlight, some of the energy "excites" the binder's molecules to a higher energy level and causes bond cleavage, like a hot knife through the molecule's heart, resulting in free radicals.
Free radicals are simply scavengers trying to steal an electron from a weaker molecule that has one. They react with oxygen in the air to create oxygen radicals, which then attack the polymer backbone. In doing so, hydrogen atoms break from the coating to form hydrogen radicals and more free radicals. This is where a vicious cycle begins.
The free radicals combine with oxygen again to form — you guessed it — more oxygen radicals. The cycle repeats itself over and over in a chain reaction. More and more molecular links break, leading eventually to failure of the coating's properties.
Moisture accelerates this degradation through a chemical process called hydrolysis. Once again, this process involves the splitting of a hydrogen bond causing a reaction between the hydrogen from the coating and the hydroxide from the water (H2O).
Finally, the infrared heat energy from the sun comes into play, expanding and contracting the coating during a 24-hour cycle, causing accelerating stress fatigue degradation. High temperatures also accelerate the process of link breakage outlined in photo-oxidation.
All these stress factors lead to one additional form of degradation, the porosity of the coating film. It's like having an umbrella attacked with hairpins. The holes created are small and relatively insignificant until they become so numerous that the integrity of the umbrella (coating) is compromised. Once moisture, with all the contaminants it can bring along, and oxygen (that's why they call it oxidation) gain access to the coating's weak underbelly, the coating's protective barrier (whether clearcoated or not), is attacked from inside and under to devastating effect. The paint's pallbearers with a trumpeter playing taps won't be far behind.
What to do?
For most cars and trucks, compounds and waxes are fine as a temporary and inexpensive "quick fix." And, we all know, cost is a big factor. But, look at the problem from a different perspective. We know the base coat has color but no color intensity or gloss on its own. It relies entirely on the clearcoat to give it a deep luster. Every non-clearcoated paint or fiberglass gelcoat has the same profile when it fades: dull color with diminished or no shine. So, whether clearcoated or not, the real solution is to put on a new layer of clearcoat.
I know you're thinking: It's not practical. For cars and trucks, maybe it's not. But, that doesn't change the fact that what you want to do for a badly faded surface is restore the original sphericality to the pigment(s) and replace their moisture content. That restores like new color. The clearcoat also gives the paint gloss or shine. If you want to test this notion, take something badly faded and apply an ounce of corn oil to it. It looks pretty good, doesn't it? Of course, it won't last more than a day, which just emphasizes the importance of choosing a clearcoat for long-term durability.
Think about offering your current and potential customers something new: Be their clearcoat detailer. Check supplier training, on-going support, and reputation. Use your wash bay at night when it is not making you any money. Maybe start a mobile business. Bottom line: you can make a great deal of money doing something in high demand by restoring the original color and gloss to almost every dull, faded, oxidized surface.
Bill Rice, a paint, adhesives and coatings formulator, owns Vivilon Coatings in Miami, Fl. He may be contacted at 800-VIVILON (800-848-4566) or by e-mail at: firstname.lastname@example.com


text:
This text here is based on ideas from Jochen Theodorou (see chitchat-with-groovy-compiler and ast-macros-and-mixins)
Right now, there is no good macro preprocessor for Java. Annotations somehow come close but they don't really fit the bill. In the Java VM, annotations are a runtime feature. You cannot enhance an existing class; only create new ones. This means that you cannot add setters and getters to a class.
When you look at OR Mappers, they even do this at runtime, so there is no way to see what is actually happening: When the error happens, the code which is executed can be completely different than what you see in the source. Even decompiling the class file will not help anymore because the information isn't there, yet. It's only added when the classloader reads the file.
So from a certain point of view, Sun's solution is the worst of all worlds: Your code is changed at a point in time when you can't see it anymore and you cannot move the modification in the compile cycle because the API simple doesn't allow it.
The Goal
To know where you want to go, you must have a goal. The goal here is to reduce the amount of code to write for a certain feature. Specifically, the idea is to be able to move common, repeated code into a single place and be able to reference it easily.
The code must be more flexible than a method call and easier to manage than cut&paste.
Example 1: Bound Properties
A bound property in a Java bean is a field which sends notifications to listeners when it is changed. This means it is made up of these parts:
- There is a list of listeners who are interested in changes
- The field itself
- Methods to add and remove listeners
- Setter code which changes the value and notifies the listeners if the value has changed
Example 2: Merge Java and SQL
OR Mappers will only get you so far. While they will solve many or all problems, they also introduce new ones:
- You have to learn to use the mapper
- You must still understand how a database works
- The mapper will try to connect the Java semantics to the Database semantics. This is not always straightforward. For example, a table might define a non-unique primary key. There is no way to map this to a Java map where primary keys must be unique or you will overwrite objects.
- When a mapper doesn't support a specific corner case, you're in trouble. Mappers are often quite monolithic and they shove their tendrils in many places. Usually, you can't split it apart, injecting your own code in certain places.
So what do we expect from AST Macros in this case?
- They shouldn't get in the way of the developer. If she choses to use an OR Mapper, she should be free to do so.
- It should help to manage all the cases which the OR Mapper doesn't handle well.
- It should give aid to interface the Groovy code with the OR Mapper.
- It should allow to write code which directly interfaces the DB (for example, when you have to execute some special SQL which the OR Mapper simply can't do).
Some simple examples:
- counting rows
- loading objects from a DB
Before we look at solutions, let's look at what the code ought to do in the end.
Example 1: Bound Properties
should become
- When using code completion, the additional fields and methods should be visible.
- The added code should be lean and fast
- It should not get in the way of existing user code, for example, it should be possible to define a custom setter which gets wrapped by the code above
- If a custom setter exists, it should be possible to invoke it before the comparison (so you can define setters which convert the value before assigning it)
This leads to a couple of demands which an AST Macro Processor (AMP) must met:
- It must be able to see all fields and methods, no matter if the user supplied them or an AMP added them.
- It must be able to add new methods and fields and static code to an existing class and presumably also to classes created by an AMP
- It must be able to reorder source code or at least AST Nodes.
In a perfect world, an AMP should be able to modify the code on a source level and pass it back to an IDE, for example, so that I can see (and debug) what is actually compiled (instead of only seeing the Annotation).
Example 2: Merge Java and SQL
SQL enhanced code is pretty similar to bound properties but more code is generated. The first step is to define the class which maps a database table to a Java object:
After this is compiled, I want to see a special field "SQL" which I can use to build database queries like so:
This gets converted by the compiler into:
The SQL object in Foo also gives access to the standard DAO methods like loading an object by its primary key:
In addition to the simple bound property example, the AMP must also be able to note the usage of an annotated object, so it can convert the Groovy code into SQL at compile time (and possibly check it for mistakes).
Open Issues
Java 1.4/5
Groovy 1.x must run on Java 1.4. We must decide what to do with non-macro annotations, whether we want to support a switch to generate Java 5 classfiles (so Groovy can generate code for third party APTs like Hibernate)
It seems that it is possible to write annotations into Java 1.4 classfiles (see Commons Attributes). But the questions is: Is this futile? There are only a few tools which support annotations and Java 1.4.
In this light, it makes more sense to add a switch to allow Groovy to write Java 5 classfiles, so users stuck to 1.4 can still use it and Java 5 users can upgrade when they want to.
Expand or Pass On
The compiler needs a way to decide what to do with an official Java 5 annotation like
javax.persistence.Entity which is defined in EJB3: Expand it as a macro or pass it on into the class file so a third party library/tool can process it later.
Here, the user might want to decide differently per class (i.e. handle most of these cases with Hibernate and some corner cases with her own AST macro).
For Groovy-specific macros, the solution is to add a marker interface to the macro annotation.
- Add a config file to the compiler
- Users have to use a different annotation which implements both Groovy's marker interface and
4 Comments
OK - so I have a question about how the bound properties example is meant to work.
Consider class B, which wants to access the property in class A, or register a listener. Is the idea that when you compile A, you add some extra methods to the class file, which the compiler is able to see when you compile B? Or do the extra methods get added at load time, in which case, B needs to understand the annotation in the class file.
If this is meant to work, even if B is written in Java, then I think that compiling A has to generate the extra methods in the class file, otherwise it won't work...
It might be worth looking at the following implementation of properties, which was done by one of Cay Horstmann's students:
It doesn't rely on annotations alone - I think he had to mess around with some of the internal Java compiler APIs, but I don't know how it works exactly...
There's a bit more information about it in Cay Horstmann's blog:
and some other articles about properties that might be of interest:
http://weblogs.java.net/blog/cayhorstmann/archive/2007/01/arrows_in_the_b.html http://weblogs.java.net/blog/cayhorstmann/archive/2007/01/pie_in_the_sky.html http://weblogs.java.net/blog/cayhorstmann/archive/2007/01/properties_are.html
I don't know if anyone else has managed to get an @Property annotation working in Java, but there certainly seems to have been a lot of discussion about adding some form of property support to Java...
I've posted replies to your comments on the Developer list.
I've written a @Property annotation for java 6 recently, and it works pretty well, but it's lacking IDE support. Netbeans 6.0 should have support, and when Eclipse 3.3 becomes more final, I'll look into hacking it to add support.
This page gives a brief description of how it all works:
And this is the source of the annotation processor itself:
Hope it helps you guys in figuring out how you want to do your properties for groovy.


text:
|How to preserve those fresh tomatoes in your freezer - no canning necessary!
How to Preserve Tomatoes in the Freezer
If you think this sounds yummy, I'd sure ♥ it if you'd click to pin it, tweet it, stumble it, or share it on Facebook to help spread the word - thanks!
By the way, that is an untouched photograph y'all ... aren't they just gorgeous? I might not have gotten any peppers or beans to produce this year, but I sure had some purrtaay 'maters!!
Anyhoo... I haven't gotten into the whole canning thing with home vegetable gardening. For one, I just don't have that nice pantry storage space like many of you do. For another, I only do a small kitchen garden due to limited sunny areas in my yard, so I've never had a huge garden that really produced enough to "put away." What I do have, however, is a stand-alone freezer, so I like the freezer method of putting away tomatoes because 12 bags stacked up in the freezer sure take up a lot less space than jars in the pantry.
Now, you can't use these tomatoes as a substitute for fresh - you'll have to go pick one fresh out of your garden for those kinds of recipes, but these tomatoes are perfect for use in pan sauces, soups & stews, skillet dinners and casseroles - things like that, which is really mostly what I used canned tomatoes for anyway. Now if you prefer canning, well, I am only beginning to can minor things like jams and jelly, but there are tons of tutorials out there to show you how to put up tomatoes properly. The freezer method is just one good way to preserve tomatoes, but it's a great way to put up tomatoes if you don't want to fool with canning or lack the space for those jars.
Did you know that you can freeze an entire whole tomato without even removing the skin? Just rinse them well, cut away the stem and upper core and line them on a baking sheet that has been sprayed with non-stick spray. Put them just like that into the freezer and once they are frozen, bag 'em up in a freezer bag. When you go to use them, running them under warm water will usually be enough to pull the skins off. Understand though, they are bulky to freeze like this so they'll take up more room.
I prefer to skin mine before I put them up, however, and then either bag them whole (flash freeze in the same manner), dice them, cut them up into chunks or sections, or puree them.
Skinning a tomato is super easy with a soft skin peeler, but it's only a little bit more work boiling them to remove the skins if you don't have one of those handy. Simply bring a pot of plain water to a full, rolling boil and carefully ease the tomatoes into the boiling water. You can cut a little "x" into the bottom of each tomato before putting them in the boiling water which seems to help speed up the process.
Once it comes back to a boil, just keep an eye on the tomatoes until the skin begins to split, usually about a minute or so, if that long. Remove and plunge into an ice bath to stop them from cooking.
Remove all of the skins and cut up the tomato, preparing them in the manner that you want to store them - chopped, pureed, diced. This group of tomatoes right above are Romas, and I just wanted the meat of the tomato, so I also seeded and cleaned them. These are perfect for my Angel Hair Pasta with Crab and in fact, that is exactly what they will be used for. Ya gotta try that recipe y'all - it is scrumptious!
These are ready to go! Place them into a labeled freezer bag.
I do some like this as pictured by count for skillet dinners and pasta dishes, others that are diced up or chopped are done by weight - or, you can do cups. Most canned tomatoes are about 15 or 28 ounces. I also like to flatten the bags so that they stack well on top of one another in the freezer.
That's it! Easy, simple and no managing hot glass jars.
Click here to learn how to make Creole Tomato Sauce.
How to Put up Freezer Stewed Tomatoes
Remove skin as noted, then core and cut the tomatoes into quarters. Do this over a rimmed plate so that you retain all the juices.
In a saucepan, add the tomatoes and juice, and if you'd like to add anything to your stewed tomatoes such as onion, celery, bell pepper, green chilies, or hot peppers, add those ingredients in here. Cook until tender about 10 to 15 minutes.
Once tender, remove from heat, set aside to cool, or plunge pot into a pan of iced water to speed up cooling. Label and package in freezer bags as noted.
You can, of course, can tomatoes, as well as the Creole tomato sauce, but for some you'll need to use a pressure canner. For about 7 pints of stewed tomatoes, you'll need about 4 quarts of peeled and chopped tomatoes - maybe around 25 depending on the size. Add the tomatoes along with the veggies you like - typically onion (about a cup chopped), chopped bell pepper (about 1/2 cup) and chopped celery (about 1/4 cup) - to taste. Add everything to large stockpot and stir in about 2 teaspoons of kosher salt and 1 tablespoon of granulated sugar. Bring to a boil, reduce heat and simmer for about 20 minutes, taste and adjust seasonings as needed. Ladle into sterilized jars, leaving about 1-inch headspace, add lids and bands, and process pints for 15 minutes at 10 pounds of pressure. Consult a canning source such as Ball's Blue Book for more detailed directions for pressure canning.
If you're overrun with tomatoes, if they are getting a little less than desirable in appearance, or if you just want some for on bruschetta or even as a pizza sauce, try this recipe for Slow Roasted Tomatoes. I made my Homemade Tomato Soup with them and they are incredible, even if you use less than perfect tomatoes.
☛ Are you on Facebook? If you haven't already, come and join the party! We have a lot of fun & there's always room for one more at the table.
Images and Full Post Content including Recipe ©Deep South Dish. Pinning and sharing links is welcomed and encouraged, but please do not repost or republish elsewhere such as other blogs, websites, or forums without explicit prior permission. All rights reserved.


text:
When you give the Gift Card Mall eGift, the recipient gets to choose from hundreds of the world's most popular brands. Delivery is by email so gift cards can be used online or printed out and redeemed in-store.Redemption:
Online onlyRedemption Details:
Redeeming a Gift Card Mall eGift card is easy:
1.Visit giftcardmall.com (gift card recipients will receive an email notification)
2.Choose any gift card on giftcardmall.com and add it to your shopping cart. We recommend selecting an egift card so recipients won't have to pay any shipping costs.
3.On the billing page, choose Gift Card Mall card as your method of payment and paste the Gift Card Mall card number and PIN.
The Gift Card Mall eGift by Giftcardmall.com is a prepaid gift card and is redeemable at www.giftcardmall.com only. The Gift Card Mall eGift's face value is in US Dollars. The Gift Card Mall eGift has no expiration date. If your purchase exceeds the unused balance of the Gift Card Mall eGift account, the order balance must be paid with credit card or other available payment method at the time of purchase. The Gift Card Mall eGift cannot be reloaded, resold, transferred for value, or applied to any other account. The Gift Card Mall eGift can not be redeemed for cash, except as required by applicable law. Treat the Gift Card Mall eGift as cash. If the Gift Card Mall eGift is lost, stolen, destroyed or used without authorization, it can not be replaced. The Gift Card Mall eGift is issued by Blackhawk Network, Inc., an Arizona corporation. To verify remaining balance by calling 888-321-9973, or prior to checkout and providing your Choice Card eGift # and PIN #.


text:
Terri R Fried MD
Professor of Medicine (Geriatrics)
Departments & Organizations
Yale Medical Group
Office of Student ResearchInternal Medicine: Geriatric Medicine: Dorothy Adler Geriatric Assessment Center, Claude D. Pepper Older Americans Independence Center
Research Interests
Treatment decision-making; Preferences; Advance care planning; Multiple conditions more...
- M.D., Harvard University, 1988
Selected Publications
- Thomas J, O'Leary JR, Fried TR. Clinical experience as a determinant of physicians' willingness to comply with the requests of patients at the end of life. J Gen Intern Med 2014;29:1048-54.
- Amjad H, Towle V, Fried T. Association of experience with illness and end-of-life care with advance care planning. J Am Geriatr Soc 2014;62:1304-9.
- Fried TR, Tinetti ME, Towle V, O'Leary JR, Iannone L. Effects of benefits and harms on older persons' willingness to take primary cardiovascular medication. Arch Intern Med 2011; 171:923-928. PMC3101287.


text:
Madhav V. Dhodapkar MBBS
Arthur H. Bunker and Isabel Bunker Professor of Medicine (Hematology) and Professor of Immunobiology; Chief, Section of Hematology, Department of Internal Medicine; Clinical Research Program Leader, Hematology Program, Yale Cancer Center
Departments & Organizations
Yale Combined Program in the Biological and Biomedical Sciences (BBS): Immunology | Molecular Medicine, Pharmacology, and Physiology
Yale Medical Group
Office of Student ResearchCancer Center, Yale: Hematology Program; Cancer Immunology; Dhodapkar LabImmunobiology: HTIHematology | National Gaucher Disease Treatment Center
Research Interests
Myeloma and related plasma cell disorders; Human immune system's interaction with growing tumors in patients; Preneoplastic monoclonal gammopathy and multiple myeloma, tumor and host related factors more...
- M.B.B.S., All India Institute of Medical Sciences, New Delhi, 1987
Selected Publications
- Dhodapkar K, Banerjee D, Connolly J, Kukreja A, Matayeva E, Veri MC, Ravetch JV, Steinman RM, Dhodapkar MV. Selective blockade of the inhibitory FC-receptor (Fc-RIIB) in human dendritic cells and monocytes induces a type I interferon response program. J Exp Med. 2007, 204: 1359-1369.
- Spisek R, Kukreja A, Chen L, Matthews P, Mazumder A, Vesole D, Jagannath S, Zebroski HA, Simpson AJG, Ritter G, Durie B, Crowley J, Shaughnessy Jr. JD, Scanlan M, Gure AO, Barlogie B, Dhodapkar MV. Frequent and specific immunity to the embryonal stem cell-associated antigen SOX2 in patients with monoclonal gammopathy. J Exp Med. 2007, 204: 831-840.
- Spisek R, Charalambous A, Mazumder A, Vesole DH, Jagannath, Dhodapkar MV. Bortezomib enhances dendritic cell mediated induction of immunity to human myeloma via exposure of cell surface heat shock protein 90 on dying tumor cells: Therapeutic implications. Blood. 2007, 109: 4839-4845.


text:
Wingate Sweeps Sunday DH from Softball 2-1, 9-0
February 10, 2013
MISENHEIMER, N.C. Visiting Wingate University scored the go-ahead run in the sixth inning of game one while posting a pair of four-run frame in game two to sweep Pfeiffer University 2-1 and 9-0 in non-conference softball on Sunday afternoon. The Bulldogs improve to 6-2 overall while the Lady Falcons drop to 3-5.
Tied 1-1 in the sixth of game one, Brittany Owens (Greenville, NC) started the rally with a one-out double to left-center. After a pop out to second, Shannen Adams (Ayden, NC) would lace a two-out double just inside the first base bag to give the Bulldogs their final 2-1 margin. Earlier, Owens put the visitors up 1-0 with a RBI-single up the middle while Pfeiffers Julianna Bullington (Ararat, NC) drove in Jaclyn Boever (Bostic, NC) with her single in the bottom of the inning. Stacey Houser (Mooresville, NC) got the win for the Bulldogs tossing all seven innings scattering three hits with six strikeouts.
Game two belonged from the Bulldogs at the start as Kelsey Maffucci (Rockledge, FL) sent an opposite-field laser down the right-field line to put Wingate up in the first. The first of two four-run frames came in the third as Taylor Laskey (Cherryville, NC) came up with a two-run double to cap the inning while a Laskey homer in the fifth, RBI-single from Kasey Pendley (Marion, NC) and pair of bases-loaded walks accounted for the final Bulldog runs. Starter Miranda Paul (Virginia Beach, VA) nearly had a five-inning no-hitter until pinch-hitter Deanna Crayton (Thomasville, NC) broke it up with a one-out single to left in the bottom of the fifth. Paul would allow just the one hit while strikeout out four in the win.
Pfeiffer returns home on Tuesday afternoon entertaining Catawba at 2:00 p.m.


text:
ZAGGsparq is the #1 selling portable device charger. It charges smartphones, tablets, and other USB-powered devices. It's ideal for charging on-the-go and great for emergency situations. Click here to learn more about the ZAGGsparq family.
That being said, if you find yourself without a ZAGGsparq, the video below teaches you how to charge your smartphone with fire. Of course, you'll need to buy a part first (about $10 on Amazon). We should note that you probably should not attempt this unless you have some experience with electrical wires and a fire extinguisher nearby.
Or you could just get a ZAGGsparq, and never worry about battery life again. Anyway, here's the video:


text:
Let me lead by saying that my wife and I are both non religious Irish people.
The conundrum is whether or not to lie to your children about Santa Claus. I firmly believe that we shouldn't because I always found that lying in any form was not a good way to build trust in a relationship. Having read Sam's essay, "Lying"recently I am far more convinced this is the right position to take. My wife completely agrees that there is no defense that can justify lying to children but remains undecided on the subject and we remain in open and constructive conversation on the matter.
Some of the issues that have been raised by family, friends etc are as follows:
1) The "Odd Kid Out" syndrome. Most all the other children at school will believe in Santa Claus so do we really want to in a position where we are basically creating isolation for our child? Furthermore, how would this affect the development of our child? Would the benefits of not lying be outweighed by the social inclusion factor?
2) He will believe it anyway because he will listen to the majority over the minority. The majority of children and adults he comes into contact with will be asking him if Santa is coming to him. Their influences alone given many voices over two might likely result in him believing regardless. Therefore, is there any point in going against the grain?
3) Imagination. This I can categorically tear down or so I believe but people seem to put a lot of stock behind Santa actually creating a better imagination in a child. Personally I could have done without it and I feel there are innumerable things that give imagination to children without the inclusion of this one. Is there an argument for it on this basis?
Look forward to some insights if there are those of a mind to share some
Thank you in advance.


text:
Ireland scored four second-half tries on their way to a comfortable 41-6 victory over Fiji in Dublin.
After a rather dull first half display in which Keith Earls' try was the only real highlight, Ireland stepped it up in the second half to secure a convincing win.
Earls got the first try of the game when he finished off a brilliantly worked set play after some good work by the Irish heavies in an attacking scrum.
Impressive young flyhalf Johnny Sexton nailed the resulting conversion after his earlier penalty had put the Irish in front in the 9th minute.
However, the Irish failed to kick on in what was a very disappointing first-half display from the hosts, who went in at half-time with a 13-3 lead.
Irish fans would have been hoping for an improved performance from their team in the second stanza and their team answered the call with four tries, including a second for Earls and a cameo intercept try from skipper Brian O'Driscoll.
While their work at scrum time and the Man of the Match performance from Sexton would have pleased the Irish coaching staff, their inability to truly put the islanders to the sword might be a slight cause for concern ahead of their crunch tie with the Springboks at Croke Park next week.
By Andrew Worling


text:
Shop now and get Free Value Shipping on most orders over $49 to the contiguous 48 states, DC and to all U.S. Military APO/FPO/DPO addresses.
We want to ensure that making a return is as easy and hassle-free as possible! If for any reason you decide that your purchase just isn't for you, simply return the item within 30 days of receipt and we'll cover the cost of return shipping. Learn more about our Return Policy.
Our Outdoor Connection Gun Storage Reviews happen to be an effective way to find an unbiased point of view on Outdoor Connection Gun Storage. Customer opinions are a great way to evaluate various Gun Storage from Outdoor Connection easy and quick. These customer written testimonials include consumer ratings, recommendations and feedback. Read the positives and negatives from those who have knowledge and experience using each Outdoor Connection Gun Storage. You'll find the best Outdoor Connection products here at OpticsPlanet like, Outdoor Connection Gun Storage. We understand the significance of having the knowledge and an overall understanding of everything you get, so take time to read what consumers just like you say about all of our leading Outdoor Connection Gun Storage within our on-line product reviews. Rest assured, when you shop at OpticsPlanet.com, your experience will be nothing short of excellent. If you wish to be involved in a discussion about Outdoor Connection Gun Storage, check out our OpticsPlanet discussion forum.
Connect with OpticsPlanet
Become our fan, follow us, & subscribe for the latest updates and deals
Subscribe to our email list
Sign up and receive $5 Off and get exclusive access to promotions, sales
events, pre-order sales & more!
Contact Information
Toll-Free: 800-504-5897
Intl.: 847-513-6201
Fax: 847-919-3003
Email: email@example.com
Hours of Operation
8AM-7PM CST Mon-Fri
9AM-5PM CST Sat
9AM-5PM CST Sun (Email & Chat Only)
Our Guarantees


text:
About author
AndroidGuys 4642 posts
Founded on November 5, 2007, we've enjoyed bringing you the latest in Android news and rumors. Updated daily, we strive to deliver reviews, opinions, and updates on all things related to Android.
0 Comments
No Comments Yet!
You can be first to comment this post!


text:
Red Carpet
Last Night's Look: Love It or Leave It?We can't stop talking about the leopard dress Sofia Vergara selected, Zoë Saldana's pantsuit and more outfits that stars were just spotted in! Check them out, then vote – fashion-forward or fashion fail?
Credit: Dave Kotinsky/Getty
Updated: Saturday May 18, 2013 | 06:00 AM EDT
More from PEOPLE


text:
Remember me on this computer
Sign in
"Remember me" uses a cookie. View our Cookie Policy.
Last updated:
April 28, 2013 7:28 pm
As told to Rhymer Rigby
You have viewed your allowance of free articles. If you wish to view more, click the button below.
© The Financial Times Ltd 2015
FT and 'Financial Times' are trademarks of The Financial Times Ltd.
Printed from: http://www.ft.com/cms/s/0/cfddec7e-adc8-11e2-82b8-00144feabdc0.html
Print a single copy of this article for personal use. Contact us if you wish to print more to
distribute to others.
© The Financial Times Ltd 2015 FT
and 'Financial Times' are trademarks of The Financial Times Ltd.
Privacy policy |
Terms |