text:
This classic from the vaults of Hong Kong's illustrious Cathay Studios begins with a shot of Golden Age screen icon Grace Chang shaking her bon-bon to a Latin-flavored mambo number while wearing cute, checkered capri pants. It's already one of the best movies ever made in my book, as anything that gives us Grace Chang in classic 1950s form-fitting fashion is an ace. Not that I'm one to judge a movie solely on the merits of its leading lady's rump nor on its inclusion of what is still, in my opinion, the paramount of women's pant technology. You know me. I'm a classic guy with classic tastes, and while booty shorts and flares may be alright for some of you, I'll take the more demure and alluring look of capri pants, a nice cocktail dress, or one of those cheongsam dresses any day over the vulgar obviousness or careless sloppiness of today's fashion. But that's just me, and like I said, you can't judge a movie purely on it's willingness to cater to my retro taste in both male and female fashion or my longing for a return to the days when we wore clothing that actually fit us.
Luckily, the film that follows the rump-shaking opening is a wonderful, breezy affair from the heyday of Hong Kong cinema. It was a time when the silver screen was ruled by the likes of Linda Lin Dai and the subject of this particular movie, Grace Chang. Grace was the reigning queen of Cathay Studios, one of the greatest and most respected studios in the history of Asian film. Few and far between were the films that didn't feature Grace singing, dancing, and flashing her million dollar smile at the camera. She was the total package – a wonderful singer, a unique beauty, and an utterly captivating actress. Unfortunately, the bulk of her work – and indeed the bulk of Cathay's films in general – were unknown outside of Asia. They disappeared after their initial theatrical runs, and only a few ever showed up on any home video format. When the rare film did make it to video or DVD, it was almost always without subtitles. Thus, some of the most important films and names in Hong Kong's impressive cinematic history remained virtually unknown to new viewers.
In 2003, however, fortune smiled on fans of classic cinema from around the globe when Panorama Entertainment inked a deal to release a slew of old Cathay films on DVD complete with English subtitles. Though the deal was less trumpeted than Celestial's similar deal to tap the hitherto hidden history of the Shaw Bros. Studio for home consumption, it was certainly no less historic or important. And while the fact that most of the Cathay films are dramas, musicals, and comedies in black and white means that western Hong Kong film fans (traditionally very action film oriented) will be paying less attention to them than to the Shaw Bros. releases, any film buff worth his or her salt knows that just because a film isn't in color and doesn't feature a shirtless Ti Lung getting stabbed in the belly doesn't mean it isn't worth watching. For fans of filmmaking from the glorious decades of the 1950s and 1960s, the tapping of the Cathay well is a glorious event.
It's fitting that Panorama's Cathay releases are hitting the shelves the same time as the Shaw Bros. releases. They were, of course, the primary competition for the Shaws (and both studios shared some major stars, including the impish Peter Chan Ho and the regal Linda Lin Dai), and their history is similar to that of the Shaw Bros. Like Shaw, Cathay had its roots in Southeast Asia. Studio founder Loke Wan Tho began making films in the late 1930's when his family began establishing theaters in Singapore. As was often the case at the time, companies who made movies usually also owned their own theater chains (a practice that is coming somewhat back into vogue with the establishment of UA theaters in America. It never really went out of vogue in Asia). Loke's theaters were state-of -the-art, and after the close of World War II he cemented a deal to distribute British Rank films in South Asia. In the 1950's, Loke moved the business to Hong Kong, purchased a studio lot, and formed MP & GI, which would later change its name to Cathay.
As with the Shaw Studios, Cathay was keen on seeking out and developing new talent, then signing them to exclusive contracts. While the Shaws initially had a good balance of male and female superstars that, during the 1970s, eventually became primarily male-dominated thanks to the popularity of Shaw kungfu films, Cathay was always a woman's world that was known for a stunning array of actresses who easily overshadowed their male counterparts at nearly every moment. Cathay built its success around a core group of female stars that included Linda Lin Dai, Jeanette Lin, Julie Yeh Feng, Lucilla You, Betty Loh Ti, Li Mei, and of course Grace Chang, among others. Cathay films and stars were highly regarded by critics and fans alike, and the studio exhibited a consistently high quality in the vast majority of what it produced. But, as we all know, nothing gold can stay, especially eras.
By the mid-60's the studio began to decline. Loke died in a plane crash in 1964, and the Shaw Brothers productions began to eclipse those of Cathay. The Shaws simply had more money to throw into their projects, and they lured away a number of Cathay's biggest stars, chief among them Linda Lin Dai. By the end of the decade, the Cathay Studio had lost nearly all direction. Whimsical romantic comedies and dramas, especially in black and white, were no longer as popular as they had once been. Cathay was sold to a young upstart studio that would eventually do to the Shaw Bros. what the Shaws ultimately did to Cathay – drive it out of business. That upstart studio was Golden Harvest, the eventual home of everyone from Bruce Lee to Jackie Chan.
But there for a while, no one could match Cathay in terms of star power and picture quality. And if your studio has to have a poster girl, you can sure do a heck of a lot worse than Grace Chang. It doesn't take long to immediately fall in love with her and start putting her name atop your list of favorite actresses. There's something special about her, something unique. She's not a classic beauty, but that makes her beauty all the more memorable. Her popularity is, instead, driven by her undeniable charisma and overpowering charm. Where Hollywood (and indeed Hong Kong) was full of sultry sirens and bombshells, Grace Chang was the woman you could always trust to be your friend, to be dependable and friendly and down to earth. You could also count on her to sing you a song. Unlike many actresses who were featured prominently in Hong Kong musicals, Grace could belt out her own tunes.
Grace was born in 1934 in Nanjing but grew up in Shanghai. It was there, in what was far and away the mainland's most cosmopolitan and swinging city, that she trained in Peking Opera. After the tumult of World War II and the Chinese Civil War, Grace and her family moved to Hong Kong in 1949. She made her film debut in Seven Sisters (1953) and joined MP & GI in 1955. Her film and singing careers soared after that, and she quickly became one of the top stars of stage and screen. Her singing talent even garnered her an appearance on America's Dinah Shore Show. She married in 1964, and like most Hong Kong actresses, her marriage heralded her virtual retirement from show business. She still makes occasional appearances though, and she's left us a tremendous film legacy that new fans are only just now beginning to discover.
Mambo Girl, the first of Panorama's Cathay DVD releases (and chronologically, the earliest film), is an excellent way to get to know the work of both the studio and Grace Chang. Although for the most part it's a breezy musical comedy, unlike most films from that particularly light-hearted genre, it has a darker, more serious current running through it that allows it to make a social comment without seeming too heavy-handed. As the story of the making of the film goes, Grace was performing for troops in Taiwan and had them so enthralled with her mambo dancing that they started calling her Mambo Girl. Scriptwriter Yi Wen was then inspired by her popularity to write a quick little film around the name. Another story, as told by Grace herself, maintains that the idea for the film came during an evening at a nightclub where Cathay founder Loke was so impresses with her dancing and singing that he decided a movie should be made. Whichever version of the story is true, the fact remains that someone somewhere saw Grace singing and dancing and simply had to make a movie for her where she could do the same.
Grace stars as Li Kia-ling, the celebrated Mambo Girl as she is known on campus. She's the all-American (or All-Hong Kong, I suppose) gal who gets good grades, always treats her fellow students with equality and respect, and is a vastly talented singer and dancer. I guess they don't have students like this anymore. They've sort of gone the way of those 1950s scientists who knew everything about history, geology, astronomy, physics, and handling various handguns and rifles. I suppose its students like Grace Change who grow up to be those professional know-it-alls like John Agar, though I have a hard time imagining John Agar busting out the mambo moves. Kia-ling's life is pretty good. Aside from being the sweetheart of the campus, she has a cool little sister and a father who owns a toy store and, when neighbors come by to ask them to turn down the mambo music, tells the neighbors to take a hike. Rather than being the movie parent who attempts to crush the musical dreams of his child, he encourages her at every step and is just about the coolest movie dad you could hope for. Her father is played by Liu Enjia, probably one of the best male leads at Cathay and one of their only men to not be overshadowed by the ladies. He's a big, fat jolly guy, after all, and it's hard to overshadow big, fat jolly guys. He was Cathay's go-to man whenever they needed a solid father figure, and he's best known for his roles here and in the successful cross-cultural comedy The Greatest Civil War on Earth.
All the boys at school fawn over Kia-ling, chief among them Peter Chan Ho. If you watch enough musicals and comedies from either Cathay or the Shaw Bros., you better get used to Peter Chan Ho. He seems to star in dang near every one of them, and for a relatively average looking guy, he's managed to romance everyone from Grace Chang to Linda Lin Dai to Cheng Pei-pei. I really wish I had this guy's agent. Peter's a ubiquitous fixture in the musical films of the 60s and 70s, and he's a pretty likable guy who emanates an everyman kind of charm. He's not always believable in his roles, especially when he plays a lady killer kind of character, but he has a certain underdog charisma about him that, while not nearly as magical as Grace's, makes you root for the guy. When Peter and the boys aren't studying, and they rarely seem to study, they're following Kia-ling around and urging her to sing and dance. You know the scene. It's been in countless musicals, and in the background is always a guy I simply know as Tennis Racket Lad. If you ever seen a musical comedy set at the beach, a college campus, or a summer resort, then you've probably spied the Tennis Racket Lad. He's the guy in the chorus of nameless friends who, when song and dance breaks out, always has a tennis racket which he pretends to strum like a guitar. I've seen Tennis Racket lad in at least a dozen films, and I'm sure he shows up in a dozen more.
Kia-ling's life is turned upside down when her little sister discovers the older sibling she idolizes is in fact adopted. When she confesses this to her best friend, who also happens to be incredibly jealous of Kia-ling's popularity with the boys, the girls, the teachers, the janitors, and everyone else in Hong Kong, word gets around to Kia-ling's friends, and eventually to Kia-ling herself. Although her rival tries to make it a point to insult our darling Mambo Girl, none of her friend seem to care. She's much too charming, and her adopted parents are so cool anyway. Kia-ling, however, is upset by the revelation and wants to seek out her real mother. Along the way, she will discover the true meaning of family, and there will be many musical numbers.
Running just under the surface is a message about the many Chinese people finding themselves in Hong Kong, especially after the revolution and Mao's increasingly totalitarian (and deadly) handling of the country. Multitudes of Mainlanders suddenly found themselves separated from their motherland and seeking shelter in the arms of Hong Kong. Seeing parallel between Kia-ling and the Mainland immigrants, between her choice of biological mother or adopted parents versus mother China or the adopted homeland of Hong Kong, doesn't take a genius. But it does, as I said, lend the film a deeper quality than one usually finds in these sorts of films. Most people, however, are not going to seek out a musical comedy called Mambo Girl in hopes of gleaning insight into the mental state of Chinese people seeking to make new lives for themselves in Hong Kong. For a movie like this, what it has on the surface is just as important, if not more so, than what lies beneath. And the surface of Mambo Girl is a pure delight. Grace's performance is wonderful, and the music is catchy and enjoyable. As one would guess from the title, much of the music is infused with a Latin vibe, something that was very popular with lots of pop music from the era. Grace's mambo numbers swing, though the lyrics are just about the squarest things imaginable. I doubt Yma Sumac or other mambo legends belted out words like, "You're a lucky girl. We call you the Mambo Girl. You are the sweetheart in your family. You are the queen in the school." Not exactly lyrical spiciness to go with the beat, but the infectious tunes will stick with you regardless of how corny the words may be.
The musical numbers are nothing lavish. They're fairly well grounded in reality and most take place in nightclubs, sporting fields, or people's living rooms. The dances aren't extravagant either, but instead look like something an actual person might do. Well, make that an actual person who knows how to mambo and cha-cha. If I was the "actual" person, it'd look less like a dance and more like some old man having a seizure. The fact that movie embraces these modern dances and modern modes of dress so energetically is also a mark of distinction. Many films of the era reflect old fashioned mores regarding singing and dancing, especially as a way of life. How many movies are there where a woman falls upon hard times and is forced to eek out an existence as a nightclub singer, a profession that garners her much attention but no respect? Kia-ling's parents, on the other hand, break from tradition by enthusiastically supporting their daughter's talents and preaching the benefits to mind and body of having some good, clean fun. It is another way in which her adopted parents symbolize the new, modern Hong Kong and new, modern ideas. By contrast, Kia-ling's real mother is the type of lonely torch-singing forlorn woman we see in so many other movies. A product, if you will, of outdated thinking and ideals.
The supporting cast does their best to keep pace with the leading lady. Liu Enjia is wonderful as her father, Peter Chan Ho is likable as her boyfriend, and Kia-ling's real mother is suitably tragic in true melodrama form. For an interesting Shaw Bros connection, future Shaw empress Mona Fong (who was one of the major players as a producer at Shaw Bros, and quite possibly as powerful – if not more powerful – than the brothers who lent the studio their name) makes an appearance as a singer in a nightclub Kia-ling visits in search of her real mother. The real shining star among the supporting cast is Kitty Ting Hao as Kia-ling's younger sister. She's cute and energetic, and her performance is superb. Tragically, she was one among many of the Cathay stars who had a rocky life and ended it via suicide. She died in Los Angeles in 1967 at the age of twenty-seven. Similar sad stories seem to plague far too many of the Cathay women.
Despite that somber footnote, Mambo Girl is an energetic, fun, pluck-at-your-heartstrings musical that will win you over solely with the charm of its leading lady. It's a refreshing change of pace for people who know Hong Kong cinema primarily through kungfu films and more modern actioners. Mambo Girl takes the conventions of the Hollywood musical and integrates them seamlessly with Hong Kong sensibilities. Ultimately, you can't feel sad watching the movie, especially when the time rolls around for the big musical mambo finale. Relatively low-key in comparison to other musicals, even other black and white ones, it's a quality, retro romp that just might have you reaching for the nearest tennis racket.


text:
Yennick Trevels
May the code be with you
Wednesday, 16 October 2013
Blog moved
Hi, This blog has been moved to http://www.yennicktrevels.com/blog
Friday, 22 March 2013
JavaFx: Structuring your Application - Service and Application State layer
Hi! I've given my blog a new home at http://www.yennicktrevels.comThis post is part of a series of blog posts about structuring your JavaFx application. Here's an overview:
You can find the new version of this post here: http://yennicktrevels.com/blog/2013/10/15/javafx-structuring-your-application-service-and-application-state-layer/
You can find the new version of this post here: http://yennicktrevels.com/blog/2013/10/15/javafx-structuring-your-application-service-and-application-state-layer/
- Overview
- View layer
- Application logic layer
- Service - Application State layer(this post)
ServiceA Service is used to communicate with an external resource. This can be anything, from a webserver to a printer.
Every Service should focus on a certain resource or a subset of it (like a Service which only performs contact related REST calls).
Again, it's also important to put your Service behind an interface. By doing this you can mock it when unit testing commands, but it also allows you to create a stub implementation which you can use while the back-end developers are creating the server code and swap it with the real implementation once they have finished the backend code.
Such a service can look like this:
public interface IEventService { List<EventVO> getEvents(); EventVO getEventDetails(String id); void acceptEvent(EventVO event); void declineEvent(EventVO event, String reason); }And the stub implementation:
public class StubEventService implements IEventService { private List<EventVO> events; public StubEventService() { Calendar calendarDate = GregorianCalendar.getInstance(); calendarDate.set(2012, 4, 24, 10, 20); Date date = calendarDate.getTime(); events = new ArrayList<EventVO>(); events.add(createEvent("1", "First Event", "Paris, France", date, date, "The event will showcase the first application")); events.add(createEvent("2", "Special meeting", "Manchester, UK", date, date, "A special meeting for a special application")); events.add(createEvent("3", "Technology meetup", "Brussels, Belgium", date, date, "Geeking out with the latest technologies")); events.add(createEvent("4", "Designer Conference", "Boston, US", date, date, "Various talks by the most famous designers in the industry")); } @Override public List<EventVO> getEvents() { return events; } @Override public EventVO getEventDetails(String id) { for (EventVO event : events) { if(event.getId() == id) { return event; } } return null; } @Override public void acceptEvent(EventVO event) { } @Override public void declineEvent(EventVO event, String reason) { } private EventVO createEvent(String id, String name, String location, Date startTime, Date endTime, String description) { EventVO event = new EventVO(); event.setId(id); event.setName(name); event.setLocation(location); event.setStartTime(startTime); event.setEndTime(endTime); event.setDescription(description); return event; } }
The ModelA model is used to store and share state across your application. This allows you to react to certain state changes in multiple parts of your application.
A model is in most cases just a class with some properties that define the state (e.g. the selected contact, the list of contacts that is shown). In some cases it can contain some basic logic, but this should never be complicated (if it is, then move it to a command).
In most cases it will be a command that updates the model or takes values from it to return it to the view layer.
As always, you should put the Model behind an interface for unit testing purposes.
This is how such a model can look like:
public interface IEventSelectionModel { EventVO getSelectedEvent(); void setSelectedEvent(EventVO event); ObjectProperty<EventVO> getSelectedEventProperty(); }
And the implementation:
public class EventSelectionModel implements IEventSelectionModel { private ObjectProperty<EventVO> selectedEvent = new SimpleObjectProperty<EventVO>(this, "selectedEvent"); @Override public EventVO getSelectedEvent() { return selectedEvent.get(); } @Override public void setSelectedEvent(EventVO event) { selectedEvent.set(event); } @Override public ObjectProperty<EventVO> getSelectedEventProperty() { return selectedEvent; } }
ConclusionThis was the final article in the series.
My goal was to share my view on a fat client architecture and hopefully get the conversation started about client architectures with JavaFx. That way we can improve this architecture or even find (better) alternatives.
Monday, 18 March 2013
JavaFx: Structuring your Application - Application Logic Layer
Hi! I've given my blog a new home at http://www.yennicktrevels.comThis post is part of a series of blog posts about structuring your JavaFx application. Here's an overview:
You can find the new version of this post here: http://yennicktrevels.com/blog/2013/10/15/javafx-structuring-your-application-application-logic-layer/
You can find the new version of this post here: http://yennicktrevels.com/blog/2013/10/15/javafx-structuring-your-application-application-logic-layer/
- Overview
- View layer
- Application logic layer(this post)
- Service - Application State layer
The CommandA command is a stateless object which is executed once and then disposed of. It has a single responsibility, which clearly defines its purpose.
Such a command can for example have the responsibility to create a new contact, calculate the total amount of money a client has to pay etc.
This leads to a higher number of classes, but it has some advantages over a controller:
- A command will have less dependencies because of its single responsibility. This makes it easier to test.
- When using good class/package name conventions it's easier to find a certain piece of logic.
Running it in the backgroundBecause business logic should run in a background thread to avoid blocking the UI, I'm using a convention to make every command extend from the JavaFx Service class.
The Service class is used in JavaFx to run some code in one or more background threads. More info on this class can be found here: http://docs.oracle.com/javafx/2/api/javafx/concurrent/Service.html
This fits perfectly in my design because it makes sure that all business logic is executed in a background thread. Because it's an integral part of our application structure developers won't forget to start a new thread because it will be done transparently when creating a new instance of a command and starting it.
How it looks like in codeThis is how it looks like in code. The command has one parameter which should be set before starting the command and it has a dependency to the IEventService. When it's finished it return an EventVO instance with all the details of the event.
public class LoadEventDetailsCommand extends Service<EventVO> { @Inject public IEventService eventService; public String eventId; @Override protected Task<EventVO> createTask() { return new Task<EventVO>() { @Override protected EventVO call() throws Exception { return eventService.getEventDetails(eventId); } }; } }
And this is how you can use it in the mediator. The commandProvider is something which I'll discuss in a moment, but it basically creates a new instance of a certain command class. When you call the start() method the command will start its execution in a background thread.
LoadEventDetailsCommand command = commandProvider.get(LoadEventDetailsCommand.class); command.setOnSucceeded(new LoadEventDetailsSucceededHandler()); command.eventId = eventSelectionModel.getSelectedEvent().getId(); command.start();
And finally the succeeded handler which is just an inner class in my mediator. It gets the EventVO result from the command and asks the view to show the new details:
private class LoadEventDetailsSucceededHandler implements EventHandler<WorkerStateEvent> { @Override public void handle(WorkerStateEvent workerStateEvent) { view.updateEventDetails((EventVO) workerStateEvent.getSource().getValue()); } }
The CommandProviderThe CommandProvider is a class which I've created as sort of a Command factory, which uses a Guice injector to produce the instances. This allows us to inject dependencies in the commands.
The interface:
public interface ICommandProvider { <T extends Service> T get(Class<T> type); }
And the implementation:
public class CommandProvider implements ICommandProvider { @Inject public Injector injector; public <T extends Service> T get(Class<T> type) { return injector.getInstance(type); } }
ConclusionIn this article we've seen how you can organize the business logic in a single layer and how you can make sure that it won't block the UI. In my next and final article I'll explore the Service and Model classes which allow us to communicate with external sources and store application state.
Monday, 11 March 2013
JavaFx: Structuring your Application - View Layer
Hi! I've given my blog a new home at http://www.yennicktrevels.comThis post is part of a series of blog posts about structuring your JavaFx application. Here's an overview:
You can find the new version of this post here: http://yennicktrevels.com/blog/2013/10/15/javafx-structuring-your-application-view-layer/
You can find the new version of this post here: http://yennicktrevels.com/blog/2013/10/15/javafx-structuring-your-application-view-layer/
- Overview
- View layer (this post)
- Application logic layer
- Service - Application State layer
The ViewThis class is where you'll use the JavaFx components to build your UI. It's also responsible for displaying notifications, opening new windows or just about anything that it related to the UI (and which should happen on the UI thread).
I prefer to create my UI with pure Java code instead of using FXML. It's fast, easier to use with Guice and it's giving me more control over my code. Therefore my structure is based on this.
To keep the Views focused on their tasks, you should follow these rules.
Rule 1: Don't let your View extend JavaFx componentsThe View should never extend a JavaFx component, it should only use JavaFx components. This rule is also known as "composition over inheritance".
Our View classes will have a getView() method which will create and return the top-level component/container of that view. That way the actual view is only instantiated when the getView() method is called. This has several benefits:
- Remember from the previous post, the View classes are mapped in Guice and injected in the View classes where they will be used. By not extending a JavaFx component, the cost of creation will be lower when Guice creates and injects these Views.
- You can extend any other class you want because the design doesn't force you to extend JavaFx components.
- The API of your view will not be cluttered with all the methods of the JavaFx component
Rule 2: The View should never contain application logicThe view can contain view logic (like when to play an animation), but should never contain application logic.
Application logic can sometimes take up several 100ms. If you do this on the UI thread, then during this time the UI will not be able to update anything, so it will feel unresponsive. Therefore it's very important to run your application logic on a separate thread (which in this structure will be in a Command).
If some application logic should be executed in response to a button click, it should call the mediator to delegate this to the application logic layer.
Rule 3: Put your view behind an interfaceYou should create an interface for your View class. This interface should contain the methods that can be called by the Mediator.
Creating such an interface has several advantages:
- You create an API for your View which clearly indicates what it can do.
- The mediator can work against this API, so it isn't tied to a certain View implementation. This is especially handy when writing unit tests for your mediator because you can create a mock for the view and inject that into the mediator.
How it looks like in codeNow how does this look like in code when you apply the rules above? I'll show you some code of a view which shows a list of events. The user can select one of the events by clicking on them.
First we have the View interface:
public interface IEventListView { /** * Asks the view to update the list of events with this new list. */ void updateEventList(List<EventVO> events); }And then we have the View implementation:
public class EventListView implements IEventListView { @Inject public IEventListMediator mediator; private ListView listView; private ObservableList events; public ListView getView() { if(listView == null) { events = FXCollections.observableArrayList(); listView = ListViewBuilder.create() .items(events) .onMouseClicked(new EventListMouseClickedHandler()) .build(); listView.setCellFactory(new EventListItemRenderer()); //when the view is created, ask the mediator to load the events. mediator.loadEvents(); } return listView; } @Override public void updateEventList(List<EventVO> events) { this.events.clear(); this.events.addAll(events); } private class EventListMouseClickedHandler implements EventHandler<MouseEvent> { @Override public void handle(MouseEvent mouseEvent) { mediator.updateSelectedEvent((EventVO)listView.getSelectionModel().getSelectedItem()); } } }This view can then be used in the overview View like this:
public class EventOverviewView implements IEventOverviewView { ... @Inject public EventListView eventListView; public Pane getView() { if(view == null) { view = PaneBuilder.create() .children( eventList = eventListView.getView() ) .build(); ... } return view; } ... }
The MediatorThe Mediator is the postman between the view and the application logic. It is receiving messages (calls) from the View and it passes them on to Commands. It also passes on messages that are coming from the application logic to the view. Again, some rules apply here.
Rule 1: The mediator should not contain any application logicThe mediator runs on the UI thread, so it should not contain any application logic as this can make your application unresponsive. It should instead create a command (by using the CommandProvider class) and start the command which will then execute the application logic.
By following this rule we avoid duplicate code and make sure that application logic can always be found in one layer instead of being scattered in multiple layers, which in the end makes your application more maintainable.
Rule 2: The mediator should have an interfaceThe Mediator should have an interface which defines which actions it can perform. These methods can then be called in the view.
Rule 3: Don't do complex manipulations on your Models in your mediatorIn some cases it can be handy to inject a Model into the mediator to directly access the application state without having to write a command for it. But to avoid excessive use of this, you should only listen to changes on the model, get simple data from it or set simple things on it. If the data needs to be manipulated in any way, don't access the model directly but create a command instead which will contain this logic. So be very careful when accessing the Model from your Mediator.
How it looks like in codeWhen you apply these rules it will look like this.
First we have the mediator:
public interface IEventListMediator { void loadEvents(); void updateSelectedEvent(EventVO event); }And then we have the Mediator implementation:
public class EventListMediator implements IEventListMediator { @Inject public ICommandProvider commandProvider; @Inject public IEventSelectionModel eventSelectionModel; @Inject public IEventListView view; public void loadEvents() { LoadEventsCommand command = commandProvider.get(LoadEventsCommand.class); command.setOnSucceeded(new LoadEventsSucceedHandler()); command.start(); } @Override public void updateSelectedEvent(EventVO event) { eventSelectionModel.setSelectedEvent(event); } private class LoadEventsSucceedHandler implements EventHandler<WorkerStateEvent> { @Override public void handle(WorkerStateEvent workerStateEvent) { view.updateEventList((List<EventVO>)workerStateEvent.getSource().getValue()); } } }
ConclusionIn this post we've covered the View layer and the rules that should be followed. It also showed how the View and the Mediator communicate with each other. In the next post I'll cover the application logic layer were we'll see how heavy application logic will be offloaded to a separate thread in a consistent way.
Thursday, 7 March 2013
JavaFx: Structuring your Application - Overview
Hi! I've given my blog a new home at http://www.yennicktrevels.com
You can find the new version of this post here: http://yennicktrevels.com/blog/2013/10/15/javafx-structuring-your-application-overview/
You can find the new version of this post here: http://yennicktrevels.com/blog/2013/10/15/javafx-structuring-your-application-overview/
IntroductionJavaFx is a new rich client framework by Oracle. It allows you to create visually pleasing enterprise business applications with the Java language.
While many small demos are showing up in the community, there aren't many articles on how to structure your JavaFx application. Using a good structure makes it easier to maintain your application, add new features and improves overall stability. These are all very important in enterprise applications.
This serie of articles will try to remedy that by showing you one of many ways to structure your application. This is certainly not the only way to do it, but it will give you a starting point. Even this structure is open for improvement (as every structure is).
This serie will consist of four blog posts:
- Overview (this blog post)
- View layer
- Application logic layer
- Service - Application State layer
High-level OverviewThe structure I will describe is based on Robotlegs, an Apache Flex micro-architecture library. But instead of using events to decouple the layers, I went with for direct calls (with interfaces in-between). While events allow you to decouple the layers even more, I prefer direct calls with interfaces over events because they make it easier to follow the flow of your application.
The diagram below shows the different components and layers in my architecture. The arrows indicate the dependencies.
The diagram below shows a sample flow of an application. In this case the user clicked on a button to delete a contact in a list.
- The view asks the mediator to delete the item by calling the deleteContact(contact) method on the IContactListMediator interface.
- The mediator creates a new DeleteContactCommand and registers a success handler on it. Then it calls the start() method on the command.
- The command calls the contact service to delete the contact from the database
- The command calls a method on the model to remove the contact from the application state. It receives the updated list of contacts from the model
- The command finishes and triggers the registered success listeners. It provides the updated list of contacts to the success handlers.
- The success handler in the mediator asks the view to update the list of contacts based on the updated contact list it got from the command.
Used librariesFor my application I didn't use any framework (except for JavaFx, obviously), I wanted to create my own structure without the overhead of a framework. All I used was the JavaFx framework and Guice for dependency injection.
For those interested in build tools, I used the JavaFx Gradle plugin created by Danno Ferrin to create a build script.
Dependency Injection
Mapping your dependenciesA DI library like Guice allows you to inject instances of certain classes into other classes without you having to manually instantiate and inject them. This can greatly improve the quality of your code since you don't have to write all that yourself. Guice is basically the glue that holds your application together.
In Guice you have to create a Module class which defines all the mappings. Such a module class can look like this for a simple application:
public class EventManagerModule extends AbstractModule { @Override protected void configure() { bind(EventManagerModule.class).toInstance(this); mapViews(); mapMediators(); mapCommands(); mapServices(); mapModels(); mapInfrastructure(); } private void mapViews() { bind(IEventOverviewView.class).to(EventOverviewView.class); bind(IEventListView.class).to(EventListView.class); bind(IEventDetailView.class).to(EventDetailView.class); } private void mapMediators() { bind(IEventOverviewMediator.class).to(EventOverviewMediator.class); bind(IEventListMediator.class).to(EventListMediator.class); bind(IEventDetailMediator.class).to(EventDetailMediator.class); } private void mapCommands() { bind(ICommandProvider.class).to(CommandProvider); bind(LoadEventsCommand.class); bind(AcceptEventCommand.class); bind(DeclineEventCommand.class); } private void mapServices() { bind(IEventService.class).to(StubEventService.class); } private void mapModels() { bind(IEventSelectionModel.class).to(EventSelectionModel.class).in(Singleton.class); } private void mapInfrastructure() { bind(ITranslationProvider.class).to(ResourceBundleTranslationProvider.class).in(Singleton.class); } }So in most cases you will be mapping implementations to interfaces. Always try to use interfaces. This allows you to, for example, create a stub implementation of a service (in this case StubEventService) and a real implementation which you can then just swap by changing the Guice mapping.
Only for the Commands I didn't create interfaces because they wouldn't add that much value. They would all practically be marker services, but you'll see that in my following posts.
While this Module implementation is ok for a small application, it can quickly explode in one huge class when you're building a bigger application. This is where bootstrap classes come in handy. A bootstrap class is just a class which initializes a certain part of your application. In this case it would initialize the mappings of the views, the mediators or the commands. Such a bootstrap class would look like this:
public class MediatorMapper implements Mapper { private AbstractModule module; public MediatorMapper(AbstractModule module) { this.module = module; } public void bootstrap() { module.bind(IEventOverviewMediator.class).to(EventOverviewMediator.class); module.bind(IEventListMediator.class).to(EventListMediator.class); module.bind(IEventDetailMediator.class).to(EventDetailMediator.class); } }Your module would then look like this:
public class EventManagerModule extends AbstractModule { @Override protected void configure() { bind(EventManagerModule.class).toInstance(this) new ViewMapper(this).bootstrap(); new MediatorMapper(this).bootstrap(); new CommandMapper(this).bootstrap(); new ServiceMapper(this).bootstrap(); new ModelMapper(this).bootstrap(); new ModelMapper(this).bootstrap(); } }
Wiring it all togetherNow how do you wire all this together? Well, that is what I'm going to show you now.
In your Main class you will create a Guice Injector and with this injector you will instantiate the main view of your application. Your Main class will look like this:
public class Main extends Application { public static void main(String[] args) { Application.launch(); } @Override public void start(Stage stage) throws Exception { Injector injector = Guice.createInjector(new EventManagerModule()); EventOverviewView eventOverviewView = injector.getInstance(EventOverviewView.class); Scene scene = SceneBuilder.create() .root( eventOverviewView.getView() ).width(900) .height(700) .build(); scene.getStylesheets().add(Main.class.getResource("/EventManager.css").toExternalForm()); stage.setScene(scene); stage.show(); } }The views that are being used in the main view are also injected in the main view. Also, the mediator that is behind the main view is also injected. This patterns is used for every view.
public class EventOverviewView implements IEventOverviewView { @Inject public IEventOverviewMediator mediator; @Inject public EventListView eventListView; @Inject public EventDetailView eventDetailView; ... }Then, in the mediator, we inject the view and the commandProvider (this is a class which allows to create command instances on the fly).
public class EventOverviewMediator implements IEventOverviewMediator { @Inject public IEventOverviewView view; @Inject public CommandProvider commandProvider; ... }And in the application logic layer we inject the service/model in the command.
public class LoadEventsCommand extends Service<List<EventVO>> { @Inject public IEventService eventService; ... }
ConclusionIn this post I gave a broad overview of the structure and explained how dependency injection fits into this.
In the following posts I will go into more detail for each layer and give some best practices.
You can find the full sample application here: https://github.com/SlevinBE/JavaFx-structure-demo
Wednesday, 28 March 2012
GradleFx: What's to come (short term)
In this post I'll give you an overview of the upcoming changes (short term) in GradleFx. As you'll notice the focus will be on improving what's already in GradleFx.
Again a great improvement which follows the KISS principle (Keep It Simple, Stupid). This should allow a great deal of flexibility in which SDK you use and where you host it. You can even create your own custom SDK (e.g. with a different AIR version in it) and link to it.
I hope this update gave you a clear view of what is coming up. There are of course a lot of other features on my list, but I first wanted to polish the existing features before implementing new ones (although some of these could be seen as new ones...)
Next GradleFx releaseSo let's get started with the next release which is right around the corner. The two biggest changes will be:
- Better error and warning messages.
- Big improvements to the FlexUnit integration.
Better error and warning messagesDid you also got that nasty error when you didn't specify the FLEX_HOME environment variable when you first ran a GradleFx project? Well, you won't get that one anymore in the next version of GradleFx, including some other checks which will produce some more meaningful error and warning messages, like when you use a compiler property which is also being used by GradleFx.
FlexUnit improvementsSome major changes have been made to the FlexUnit integration. The configuration process has been greatly simplified. This is what you won't have to do anymore:
Manually download FlexUnit Specify the name of the FlexUnit ant task Create a FlexUnit Runner mxml class Update the test cases in the FlexUnit Runner
- You have to define the FlexUnit ant task as a maven dependency (the artifact should be on Maven Central shortly), so no need anymore to manually download FlexUnit.
- The FlexRunner is now created automatically
- GradleFx will scan for classes ending with Test.as in your test source folder. This pattern can be changed by overriding the flexunit.includes and flexunit.excludes properties
What will come after the upcoming GradleFx version?The features that will be implemented after this upcoming GradleFx release will revolve around automatically downloading the Flex SDK and Flash executable (used for the unit tests). This is the last step to make a GradleFx build stand on its own without needing initial configuration by the end-user.
Automatic download of the Flex SDKRight now you have to create a FLEX_HOME environment variable or specify the flexHome property which point to the Flex SDK installed on your machine. I want to improve this process by automatically downloading the Flex SDK and unzipping it to a directory which can be accessed by GradleFx. Now, how will this work? I've got the following idea in mind: Create a flexSdkUrl property to which you can specify the url to a Flex SDK zipfile, which you can specify like this:
flexSdkUrl = 'http://fpdownload.adobe.com/pub/flex/sdk/builds/flex4.5/flex_sdk_184.108.40.20628A.zip'This will then download the Flex SDK, unzip it to a %USER_HOME%/gradlefx/sdks/flexsdk-x.x folder (which will be configurable) and which will be used by GradleFx to run the compiler etc.
Again a great improvement which follows the KISS principle (Keep It Simple, Stupid). This should allow a great deal of flexibility in which SDK you use and where you host it. You can even create your own custom SDK (e.g. with a different AIR version in it) and link to it.
Automatic download of the Flash executableThis will follow the same principle as the SDK download. You will be able to specify the Flash executable download url like this:
flashExecutableUrl = 'http://download.macromedia.com/pub/flashplayer/updaters/10/flashplayer_10_sa_debug.exe'Then it will automatically download the executable and store it in a %USER_HOME%/gradlefx/flash/ directory, which will be used by GradleFx.
I hope this update gave you a clear view of what is coming up. There are of course a lot of other features on my list, but I first wanted to polish the existing features before implementing new ones (although some of these could be seen as new ones...)
Saturday, 5 November 2011
Automated Gradle project deployment to Sonatype OSS Repository
Hi! I've given my blog a new home at http://www.yennicktrevels.comThis post will walk you through the steps to deploy your gradle project to the Sonatype OSS staging repository.
You can find the new version of this post here: http://yennicktrevels.com/blog/2013/10/11/automated-gradle-project-deployment-to-sonatype-oss-repository/
You can find the new version of this post here: http://yennicktrevels.com/blog/2013/10/11/automated-gradle-project-deployment-to-sonatype-oss-repository/
- Minimum Gradle 1.0 milestone 5
- Gpg4zin, you can find the installer on this website: http://www.gpg4win.org/
Configuring your build.gradle fileFirst you'll need to configure your build script (build.gradle file). A full working build script of my GradleFx project can be found here:
These are the steps:
Apply the maven and signing plugins. The signing plugin will sign your jar and pom files, which is required for deployment to the Sonatype OSS repository.
apply plugin: 'maven' apply plugin: 'signing'Specify the group and version of your project:
group = 'org.gradlefx' version = '0.3.1'Define tasks for source and javadoc jar generation. These jars are also required for Sonatype:
task javadocJar(type: Jar, dependsOn: javadoc) { classifier = 'javadoc' from 'build/docs/javadoc' } task sourcesJar(type: Jar) { from sourceSets.main.allSource classifier = 'sources' }
Specify your artifacts:
artifacts { archives jar
archives javadocJar archives sourcesJar }Configure the signing task by specifying which artifacts to sign, in this case all the artifacts in the archives configuration. This will not yet include the pom file, which will be signed later.
signing { sign configurations.archives }Then we need to configure the generated pom file, sign the pom file and configure the Sonatype OSS staging repository.
The 'beforeDeployment' line will sign the pom file right before the artifacts are deployed to the Sonatype OSS repository.
The 'repository' part configures the Sonatype OSS staging repository. Notice the sonatypeUsername and sonatypePassword variables, these are property variables to which I'll come back to later in this post.
The 'pom.project' section configures the generated pom files, you need to specify all this information because it's required for the Sonatype repository (and Maven Central).
uploadArchives { repositories { mavenDeployer { beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { authentication(userName: sonatypeUsername, password: sonatypePassword) } pom.project { name 'GradleFx' packaging 'jar' description 'GradleFx is a Gradle plugin for building Flex and Actionscript applications' url 'http://gradlefx.github.com/' scm { url 'scm:firstname.lastname@example.com:GradleFx/GradleFx.git' connection 'scm:email@example.com:GradleFx/GradleFx.git' developerConnection 'scm:firstname.lastname@example.com:GradleFx/GradleFx.git' } licenses { license { name 'The Apache Software License, Version 2.0' url 'http://www.apache.org/licenses/LICENSE-2.0.txt' distribution 'repo' } } developers { developer { id 'yennicktrevels' name 'Yennick Trevels' } developer { id 'stevendick' name 'Steven Dick' } } } } } }That's it for the configuration of your build script.
Initial setupThere are a couple of thing you need to do before you can run the build automatically, like:
- Register your project at Sonatype
- Create a public key pair to sign your jar/pom files
- Create a gradle properties file
Register your project at SonatypeFirst you'll need to register your project at sonatype. Follow the "2. Sign Up" and "3. Create a JIRA ticket" sections on this page: https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide
Create a public key pairA public key pair is needed to sign your jar/pom files. To generate this we need to dive into command line. Follow the "Generate a key pair" and "Distributing your public key" sections on this page: https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven
This will generate a key that will be stored on your computer and on sks-keyservers.net. Remember the password because there is no way to reset or restore it when you forget it.
Create a gradle properties fileNow we'll have to create a gradle.properties file which will contain the public key and sonatype login information. Because this is sensitive information it's best to store this file in your ".gradle" directory (e.g. D:\Users\MyUsername\.gradle) and not under your project. This properties file is used by your gradle build script. The signing.* properties are used and defined by the signing task, the sonatypeUsername and sonatypePassword properties are the variables we defined earlier in our build script. So first create the "gradle.properties" file under D:\Users\MyUsername\.gradle Then add the following properties to the file and change their values:
signing.keyId=A5DOA652 signing.password=YourPublicKeyPassword signing.secretKeyRingFile=D:/Users/MyUsername/AppData/Roaming/gnupg/secring.gpg sonatypeUsername=YourSonatypeJiraUsername sonatypePassword=YourSonatypeJiraPasswordthe signing.keyId property is the public key id, you can list your keys with the "gpg --list-keys" command. With this command you'll get an output like this:
pub 2048R/A5DOA652 2011-10-16 uid MyUid sub 2048R/F66623G0 2011-10-16
That's it for the initial setup.
Deployment to the Sonatype OSS RepositoryOnce you've done all the previous steps in this post you can deploy your project with just one single command: "gradle uploadArchives"
Subscribe to: Posts (Atom)

subset: commoncrawl


text:
What Undies Do Central Minnesotans Prefer? [VIDEOS] [PICTURES]
The topic of underwear came up on the Get Up & Go Show this morning. It got me thinking. Are we brand loyal when it comes to our under garments? Does it have to be a certain cut / fit / style?


text:
|Sweetie Pies Mangrove
We visited Sweetie Pie's on a Saturday at about 2 p.m. The line was out the door but moving. We watched people coming by the carloads. There were many out of state license plates. We talked to one woman in line who had drove 4 hours from Kansas City to dine at Sweetie Pie's. There were also many Cardinals Baseball fans who dropped before the game to get a bit to eat at Sweetie Pie's which is now a major tourist attraction.
1. Be patient. This is an outing for the day.
2. Wear comfortable shoes.
3. Look your best. When you enter the doors of the restaurant you agree to be filmed on their popular reality TV series Sweetie Pie's.
4. Be prepared to wait. Did I say that already? We waited to get in the door to discover more lines inside the restaurant.
5. Flash cameras are not allowed. Have a camera ready you may be able to get a photo with one of Sweetie Pie's Reality TV Stars.
6. Take some extra moolah with you to purchase a Souvenir Sweetie Pie's T-shirt.
7. Donna recommends: Sweetie Pie's Fried Chicken and Sweet Potatoes. This is worth the wait.
8. Janice "Skychi" recommends : Sweetie Pie's Fried Catfish. This is worth the wait!
9. Customers recommend Sweetie Pie's Baked Mac 'n Cheese. It is in hot demand. Going! Going! Gone! This is worth the wait.
10. Sweetie Pie's Menu Prices are not listed on their website. We chose 1 Chicken Dinner with two sides and 1 Catfish Dinner with two sides plus Sweet Tea and Lemonade for our drink selection and 2 Peach Cobblers for dessert. Our meal tab totaled $35 for two people for lunch on a Saturday afternoon.
Oprah's visit to Sweetie Pie's has put St. Louis Grove Area on the Map. Sweetie Pie's is a Reality Show on Oprah's OWN TV Channel.
"When Robbie Montgomery – one of the original back-up singers for 1960's soul duo sensation Ike and Tina Turner – toured with the band, she poured her creative gifts into her cooking as much as her singing. After the singing stopped, Robbie took her mother's soul food recipes, passed down through generations, and created the empire known as "Sweetie Pie's," St. Louis' iconic and wildly popular soul food restaurant run by Robbie and her dynamic family. Welcome to Sweetie Pie's follows the loud, loving and still very musical Montgomery family as they struggle with the demands of expanding their family-owned business, one soulful dish at a time."
Sweetie Pie's At the Mangrove
4270 Manchester Avenue
St. Louis
(314) 371-0304
Have you dined at Sweetie Pie's?
Related Articles:


text:
Robert Thompson let his putter carry him from qualifying for the 17th Toshiba Classic to a tie for fifth following Sunday's final round at Newport Beach Country Club.
Thompson scored a bogey-free final round to finish 13-under-par 200 (68-66-66), placing four shots behind tournament champion Nick Price. Price (17-under) finished one shot ahead of Mark Wiebe for his fourth Champions Tour title. Thompson, 2010 Toshiba champion Fred Couples and Brad Bryant all finished the tournament at 13-under.
Thompson's performance was his second-best in 23 events on the tour for golfers 50 and older. The Huntsville, Texas resident tied for fourth in the 2008 Turtle Bay Championship. He had to do some work earlier in the week to get into Friday's first round.
Thompson was one of two players to qualify for the Toshiba Classic following a 68 at Goose Creek Golf Club in Mira Loma on Monday. Thompson made a par on the fourth playoff hole to join P.H. Horgan III from a group of five golfers.
"I felt like I was playing two tournaments this week," Thompson said. "I hit the ball good [at the Toshiba Classic]. I like the golf course and had a decent finish."
"[Sunday] I hit it solid all day. On two or three greens I made good up-and-downs. I nicked a tree and was 20 yards short" on the par-four seventh. Then I was 2 ½ feet above the hole." Thompson made par on No. 7.
He birdied five holes Sunday, including the par-five 15th. Then Thompson checked the leaderboard to see where Price was at. Price led Thompson by four shots when Thompson was on No. 16. Thompson made par on his final three holes – he singled out a four-footer on the par-three 17th. He led the field of 80 finishers in putting average (25.3 putts per round).
The check for more than $70,000 is Thompson's second-largest Champions Tour payday.
With the Toshiba finish, Thompson qualifies for the Mississippi Gulf Resort Classic April 1-3. Qualifying has been part of Thompson's professional life in the last four years.
He turned 50 in January 2007 and played in three Champions Tour events through 2008. In 2008 he earned medalist honors at the tour's national qualifying tournament and played 17 events in 2009.
He tallied four top-25 finishes in 2009, earning $206,996.
He made just two starts in 2010 and finished seventh in the tour's national qualifying tournament in November at TPC Eagle Trace in Coral Springs, Fla. He is not fully-exempt.
Thompson made 161 PGA Tour starts and 75 on the Nationwide Tour. His best professional finish was a tie for second in the Nationwide Tour's Ben Hogan Boise Open.
Thompson said the Newport Beach Country Club course's relative short length (6,584 yards) – the course is the second-shortest on the Champions Tour – helped.
"I'm a medium-length player, so I felt good," Thompson said. "I like the golf course.
"The golf course is tight. I drive the ball well and I'm usually a good iron player."
Thompson finished in a tie for 15th (70-69-69 – 208) in his prior Toshiba appearance in 2009.
Now it's back to Huntsville and preparing for Mississippi. Qualifying is taken care of.
When the group of Mark O'Meara, Michael Allen and Tom Pernice Jr. was on the third hole, the leaderboard looked like that from a late 1990s PGA Tour event. Price, then at 14-under, led Couples, Corey Pavin and O'Meara by three shots.
Price, Couples, O'Meara and Pavin have combined for 64 PGA Tour victories.
Price became the fourth wire-to-wire Toshiba champion and the first since Jay Haas claimed victory in 2007.
Russ Cochran tied for 12th following a seven-under 64 Sunday, the low final round. He eagled the par-five 15th hole to go with eight birdies, six pars and three bogeys. Cochran finished the tournament at 11-under (68-70-64 – 202). Cochran started the third round tied for 34th.
Cochran comes off two victories in 2010, his inaugural Champions Tour season.
He tallied 11 top-10 finishes last year.
BRYCE ALDERTON is the golf writer for the Daily Pilot. He can be reached at firstname.lastname@example.com.


text:
Lady Luck Yuna (Final Fantasy 10-2) – Cosplay of the Day
As we've said before, we totally enjoy alternate costumes here at Arcade Sushi. And one of the prime examples of a game with oodles of alternate outfits for characters is Final Fantasy 10-2, with its Dress Sphere system. One of the dresses you can switch to is the Lady Luck outfit, which Yuna is wearing as our Cosplay of the Day!
We love just how versatile the girls of Final Fantasy 10-2 can be, especially since they can switch job classes by donning different outfits. Yuna's Lady Luck outfit basically changes her into a Gambler, which is made apparent by the spade on her chest. It's our very favorite suit. Get it? Suit? Spade? And then it's an outfit -- eh, whatever.
Anyways, here is Liz, a cosplayer from Switzerland who has taken to tailoring Yuna's Lady Luck outfit and bringing it to life! We're impressed by the level of detail that went into the suit and are even more impressed with that weird little hair ornament that tops the whole outfit. The only thing she'd need now is a deck of comically large cards to hold in her hand and it'd be absolutely perfect.
Take a look at more of her work on deviantART and let us know what you think of her costumes!
Want your Cosplay to be seen? Send your info to firstname.lastname@example.com and we may feature you in our Cosplay of the Day!


text:
Sun and stars shine on Park City's mountains
February 1, 2013
No wonder the best snow sports athletes in the world like to compete in Park City. Deer Valley and Park City Mountain Resort are experts at hosting the latest in ski and snowboard competition events.
From the super-deluxe halfpipe at PCMR to the perfectly groomed moguls at Deer Valley, skiers and snowboarders have been leaping and twisting all weekend much to the delight of hundreds of spectators. It didn't hurt that the weather delivered an award-winning pattern overnight snow followed by daytime sunshine but rain or shine, the resorts' crews were prepared to offer the athletes top-notch conditions.
You could say that both resorts have been pioneers in developing the sophisticated terrain necessary to showcase the latest aerial halfpipe and slopestyle events. They have been perfecting their facilities ever since the 2010 Olympic Winter Games when these events were still in their infancy.
Since then, extreme skiing and snowboarding competitions have proliferated and have been bringing new fans to the slopes.
Most of the time, though, fans have to be satisfied with watching these feats on a flat screen. And, if you have ever seen them live, craned your neck to see them against a starry mountain sky surrounded by cheering fans, you know what they're missing, even on a jumbo screen.
Park City Mountain Resort and Deer Valley not only cater to the athletes, they have also recaptured the days when every ski race in Park City was an excuse for a party. This week's Sprint U.S. Grand Prix and FIS Freestyle Ski World Cup have been cause for celebration including up-close-and-personal spectating, fireworks and a street dance.
Recommended Stories For You
Some would say this is as good as it gets in Park City. And it is not over. Today, PCMR hosts halfpipe skiing finals from 11:30 a.m. to 1:30 p.m. in the Eagle Superpipe. Then tonight, Deer Valley will be featuring the ladies' and men's dual mogul finals from 6:30 p.m. to 7:45 p.m. All of the events are free and spectators are warmly welcomed.
The week wraps up with fireworks and a good night's sleep before the resorts, and the rest of us, start winding up for the next big event.


text:
Begin your journey to better health today.
Patients, Caregivers & Visitors
Look for a provider, location, make an appointment, pay a bill or learn about financial assistance.
Health Plan Shoppers & Members
Find Geisinger Health Plan providers or locations. Learn about health plan options.
Change healthcare through research and discovery
Referring Physicians
Access care to meet your patients' needs
We're Hiring
Join the team that America is watching


text:
!! !!
!! !! !!
£¤70 £¤70
£¤70 £¤77
Zellner Ranch Rd
Butt erly Rd
Refinery Rd
Dillard Rd
Memo rial Rd
E1690 Rd
Cimmaron Rd
Oi l City Rd
Midway Rd
W Chickasaw
Williams St
Lake View Rd
E West Rd
Crinnerville Rd
Parker Rd
N3050 Rd
E1810 Rd
Joe Brown Dr
Collins-Mill Rd
Copeland Rd
Honey Creek Dr
Madoc St
Industrial Rd
Pr Dr
Oak Tree Dr
Pinewood Trails Dr
Cindy St
N3435 Rd
Harvey Rd
Wisteria St
Creek Nation Rd
Broken Arrow Dr
Mardell St
Sandy Rd
E1860 Rd
E Gate Rd
Sharon Dr
D St NE
W 6th St
Tussy Rd
Grapevine Ln
Medical Plz
Wood St
Heubsch Loop
Royal Park Ln
Cooter Rd
W Bro adway St
Garden Ln SW
A St SW
Cedar Creek Spr
W Ardmore Ave
Fitzgerald Rd
E1840 Rd
W Oak Cir
Raytown Rd
E 185 Rd
East St
Prvt Drvway
E1730 Rd
Rock Dr
Shepherd Hills
Sioux Dr
Stardust Ln
Pueblo Dr
Un Rd
Pr Dr
N3215 Rd
Railroad St
To Oil Pump
N Santa Fe
Knipe Dr
Osage Ln
Red Bud Ct
W Sinclair StMelba Dr
N Russell St
E Hewitt St
Marietta Ave
Oak St
Main St
E 5th St
Jnj Ln
Pr Rd
E Curtis Ave
Hottel Rd
O St SE
Choctaw Ave
N3210 Rd
Cross Roads Ave
Pin e Ct
Lewis St
E1735 Rd
N Meridian Rd
Oak St
Holly St
Jones Ln
Chestnut St
P St SW
Bird St
Apricot Ln
Oak Dr
Union Dr
N3110 Rd
Sherwood Ct
Tops Rd
E1690 Rd
Gray's Rd
Woodleaf Ct
Indian Rd
Knottalotta Rd
Tayar Ln
Meadow Ln
Hill Dr
Ma ple Rd
Daves Dr
Unnamed Drvwy
Olive Ln
Phelps Dr
Quinn St
Research St
Cedar Ln
Milton Rd
Zeleniak Dr
Brentwood Cir
Sunshine Ln
11th Ave NW
E1820 Rd
J F Roberts Rd
Meridian Rd
G St NW
Oakcrest Ln
E1693 Rd
Murphy Rd
Fox St
Fore Rd
Sundown Ln
Lucille St
Canyo n Rd
E1751 Rd
Cimmaron Dr
Kingfisher St
Taylors Trl
Rungu s Rd
Clover Ln
Garner Ln
Harold B Alle n Rd
7th St
Cox Rd
Chickasaw St
Waldrup Rd
Forest Hills Dr
Carter St
Texa s St
SE 6th St
Woodworth Rd
E1945 Rd
Morton Rd
Norma Dr
R St SW
Perimeter Rd
Westgate Dr
E1910 Rd
Bristow Way
Wolfgram Dr
D1740 Rd
Shelly L n
Portland St
Dixie Ln
Tanner Rd
Denney Rd
Chapiter Rd
Loreal Ln
Case Dr
Willis Ct
Scissor Tail St
Pedler Rd
SE 3rd St
Hayward Rd
Ashland Rd
Cattlemen Rd
2nd St
Vernon Dr
Wate rwell Rd
Leming Ave
Nolan Rd
Boggy Creek Dr
Oak St
Frederick St
Lee Ln
Hill Billy Ln
Jay St
Boone Rd
Park Dr
Briarwood Dr
McGowan Rd
Wembly Ln
Rose Rd
Cason St
Russell Rd
Cedar Dr
5th Ave SE
Nobel Private Rd
4th St
High Rd
Williams Rd
Collings Rd
Little Creek Ln
Watterson Ln
Somers Ridge
Stone Bridge Ln
Mitchell Place Rd
Cathy Ln
Aster St
Fraiser Rd
Daube St
Chism L n
Blackberry Ln
Best Way
Sparrow St
Dillon Dr
E1680 Rd
Queens Dr
Cedar Springs Dr
King Ave
Pr Oil Rd
Rancho Ln
Waterford Dr
Post Oak St
Roundup Rd
S St NE
Rangler Ln
Oil Rd
Renco Rd
Tanglewood Ct
Somers Ln
Pittman Rd
Herrell Ln
Pine St
Whisper Hollow Rd
Hill Top L n
Co Rd 302
N3440 Rd
Prvt Drvwy
Blair Rd
Tara Dr
Sergent Rd
Jones Rd
Haines Dr
Quail Ridge St
W Broadway St
Big Buck Ln
Badger Rd
Barnes Rd
Priv Dr
Hillto p L n
N3460 Rd
N3180 Rd
Winding Trail Rd
Lorraine Rd
Hill Pl
Cedar St
E1760 Rd
Westgate Dr
Tracker Rd
Cemetery Rd
Quail Rd
Edwards Rd
E1800 Rd
N Durwood Rd
Cox Rd
Campus Dr
Ward Rd
Trl End
Go lf Course Rd
Geneva Ln
Autumn Hill Rd
E1990 Rd
Peanut Rd
Maple Av e
Cajun Ln
N3285 Rd
Lakeshore Dr
Wedgewood St
Westridge Cir
Aquaduct Rd
Orchard St
Green Oak St
Ash St
Pruitt City Rd
Settler Ln
Cheswick Rd
E1935 Rd
Muse Cir
Timber Grove Dr
Okie Rd
Carpenter Ln
Platinum Pl
Lowes Lake Rd
Isabel St
3rd St
Cinderwood Ln
1st Ave SW
Ross St NE
Dollar Rd
Boeing St
Pat Apala Rd
3rd St
Freedom Rd
Lahoma St
Magnolia Ln
E Cr 1680
Doyle Dickey Blvd
Welch Ave
Main Ave
Sutton Rd
E1730 Rd
Buel Green
Dixon Ave
S 6th
Foster Ln
Oxford Ln
Tim berline Ln
2nd St
Oak Crst
Vista Rd
Pecan Creek Cir
Tabor Rd
Goodman Dr
Pearl Pl
Loftis St
Gulf St
D1742 Rd
Pebble Ln
N Co Rd 3170
Ag Rd
Heath St
Mulberry St
Allen Ln
Sord Dr
Buck Horn Rd
Viking Loop
Spice Rd
4th St
Garcia Rd
Teal Rd
Howard St
9th St
E1887 Rd
Town and Country Cir
Texco Rd
Battleground Rd
Driftwood Rd
Canyon Rd
Eagle Ln
Co Rd N3265
N3200 Rd
N3265 Rd
Beddo Rd
2nd Ave NE
SE 5th St
Jeffcot Ln
N2963 Rd
2nd St
Merrick Dr
Abshire Cir
Brahman Rd
Ratchford Rd
Paradise Rd
E1650 Rd
Taylor St
N Rockford Rd
Rapier Blvd
City Sanitation Rd
Adams St
Blue Bell Rd
Raintree Ln
Prvt Drvway
Hunnington Rd
Country Estate Dr
Nugget Rd
N3440 Rd
Ind ustrial Ave
1st St
Lynch Rd
Club Lake Rd
Griffith Rd E1870 R d
Long Mountain Rd
Birch Rd
Nelson Rd
Pecan St
Sandy L n
Bluebell Rd
Locust St
Highland St
W Carter St
N3360 Rd
Haskell St
Franklin Dr
Praire View RdBasin Rd
N3160 Rd
S Union
Angel Rd
Saw Mill Rd
Dillon Ct
Locust Rd
Pooleville Rd
Goddard Dr
Fle tc her Rd
Sosebee Rd
D1853 Rd
Winberry Rd
Main St
School Rd
Rollins Cemetary RdStolfa St
Otis Rd
Jolly Ln
Upperton Ln
Cross Creek Cir
Atwood Rd
N3072 Rd
Ga yle Rd
E1700 Rd
Heritage St
Winfield Rd
B enderi m Rd
Robin Rd
Premier Rd
Malouf Rd
Thousand Oaks St
Nomans Rd
D3042 Rd
Surrey Dr
Pruitt St
Ruid osa St
Sundance Ln
N3135 Rd
Lone Star Rd
Thorn Hill Rd
Millinnium Jct
H awkins Xing
Yale Rd
E Colbert Dr
N3150 Rd
E Gate
Leisure Ln
Howard Dr
E 1680 Rd
Burnside Rd
Clay Hill Ln
N3264 Rd
Trett/slab Rd
Dollar Rd
1st St
5th St
Davis Rd
N2970 Rd
Newport Rd
Sherry Lake Addn
Site 18 Rd
W Shell St
Field Trail Rd
Four Silos Trl
Callahan St
A St
Lamb Rd
Thompson Ln
Rolling Hills Rd
Arapaho Rd
J & B Rd
F St SE
Milky Way
Jefferson St
Coffey's Rd
Washing ton St
Kepler Rd
B St
N3190 Rd
N3055 Rd
Melton Ave
W Palmer Rd
E1805 Rd
Windy Hil l Rd
Austin Rd
Savage Rd
Quail Hollow
E 1s t St
Rimrock Dr
Blackfoot Rd
E Main St
W Broadway Loop
N3290 Rd
Michen Rd
Drak e Rd
Lazy S Ranch Rd
Oak Ridge St
Rock Creek Rd
N3353 Rd
Brillo Rd
Red Cedar Ln
E Davis Ave
Case Cir
V O Perkins Rd
Turkey Crossing Rd
Poteet Rd
Quinton Rd
2nd Ave SE
S Grand Ave
United Rd
General Dr
N3278 Rd
Inman Rd
Classen Rd
N Circ le Dr
Hobble Ln
McGiboney Rd
Vango Rd
Shoffner Rd
Texaco Rd
Dove Ln
Marshal Ln
N3438 Rd
E1703 Rd
N3400 Rd
Old Hwy 70
Mobile Rd
Eades Rd
Cyrus Harris Rd
1st St
7th St
E1870 Rd
E River Bottom Rd
Cam eron St
Texaco Rd
Main St
S Durwood Rd
N2971 Rd
Elmwoo d Ln
E Atlanta Ave
Reactor Dr
Addison Rd
D3120 Rd
Hess Rd
Substation Rd
Mustang Rd
Haliburton Rd
13th Rd
Swayback Rd
N3400 Rd
Old Trail Rd
Co Rd D3385
Willard Rd
Ridge Rd
Rambler Rd
N3430 Rd
N3410 Rd
Lake Jean Neustadt Rd
Williams Rd
Westmont Rd
Charles Griffin Rd
Shearer Rd
Millcreek Rd
Harb our Dr
Ingleside Dr
Masters Rd
Woolas ton Rd
Wild Horse Rd
Hanover Rd
Farland St
N3220 Rd
E St NW
Chapman Rd
E1900 Rd
Ada Hooks St
N3070 Rd
E1920 Rd
Baum Rd
Idabel St
Ente rprise
Doc Lockwood Rd
P St SE
E Texas
Martin Rd
Williams Dr
E Tulsa Ave
Grumman St
Eagle Heights Rd
3rd St
Henderson Rd
Diamond St
Palme r Rd
Dead River Rd
Eme rson Ln
Caldwell Rd
Rose Blvd
Grider Rd
Rustic Rd
Cabin Rd
Caddo Rd
E1705 Rd
E Oklah oma Ave
Leverage Rd
W Tulsa Ave
N3160 Rd
Fred Wilson Blvd
Boarland Rd
Old Mill Rd
Faith Hill Rd
Co Rd Ew180
W Primrose
Bois D Arc Rd
McLemore Rd
Mc Cla in R d Mohawk Rd
E Co Rd 1720
Tr iple L Rd
Pat Apala Blvd
Johnston Rd
E1840 Rd
Van K irk Rd
Nebo - B ig Canyon Rd
Empire Rd
E1940 Rd
Pruitt Rd
E1740 Rd
Cactus Ln
Lake Rd
Cottage Rd
Leo Lambert Rd
S and W Rd
N3172 Rd
Rumsey Smith Blvd
Greasy Bend Loop
Ash Rd
Noble Foundation Rd
N3240 Rd
N3220 Rd
Bethel Rd
Taylor Rd
Sand Pit Rd
Joiner City Rd
Dogpen Rd
Dundee Rd
Blue Ribbon Rd
Evergreen St
Kirby Graves Rd
Church St
Express Rd
N3010 Rd
B St NW
Landmark R d
N2987 Rd
Young Rd
D1744 Rd
Bill Short Rd
Gray Fox Rd
4th Ave NW
Ridgeview Rd
Grey Fox Rd N3060 Rd
D St SE
Dozer Rd
Antwine Rd
D2975 Rd
Sanner Rd
W Shalmar Dr
E Main St
Harris St
Reactor Rd
Durango St
Resource Rd
Mercy St
N3238 Rd
Meadow Dr
Bree zewood Rd
Lowrance Rd
E1920 Rd
Check Ln
A St NE
E1700 Rd
Diamond Rd
E1990 Rd
Woods Ln
Lagoon Rd
Bob Carroll Rd
S Newport Rd
Western Rock Rd
W Colbert Dr
Country Club Rd
Guinea Rd
Cooper Dr
Old Hwy 76
Doral Rd
SW 8th St
Jay Bird Ln
W Wynnewood Ave
Cherry Rd
D1725 Rd
N3270 Rd
Katie Hwy
Sage Rd
Hewitt Rd
Price Rd
Poteet Rd
Fir Rd
Smith Rd
Red Bud Rd
3rd Ave NE
Claxton Rd
Spice Ln
Redwing Rd
H & M Rd S
Dale Faulkner Rd
Knapp Rd
N3280 Rd
N 3010 Rd
Vista Dr
Foothill Rd
Majestic Hills Rd
Mallard Rd
E Main
E Lincoln Ave
Harris-Freeman Rd
E1720 Rd
Norton Rd
High Rd
Lost Trail Rd
Rocking 4 Rd
Cedar B lue Rd
Airport Rd
S Rockford Rd
Regional Park Way
Memorial Dr
N2968 Rd
E1940 R d
N Chickasaw Trl
Holler Rd
Well Rd
Wells Rd
Valley Ranch Rd
N3140 Rd
Lawt on Ave
Mill Rd Mile Rd
Rosewood Dr
S hell Rd
W Broadway Ave
Homer Branch Blvd
Candlewood Rd
E Main St
Stw Rd
E 1690 Rd
Mount Vica Rd
Mayham Rd
Standifer Rd
Claremore Rd
Wingate Rd
County Line Rd
Norton Rd
Butler Rd
Bigbie Price Mor ris Hagood Rd
Clar emore St
Big Bear Rd
Conco rd Rd
E1910 Rd
N3030 Rd
Austin Rd
Low Rd
N3130 Rd
Riverside Rd
Old Hwy 74
89Er Rd
Bronco Rd
O W Fulsom Rd
Mobil Rd
C St SE
E1815 Rd
Pat Howell Rd
Byrde Pruitt Rd
D3175 Rd
E1830 Rd
Brya nt Blvd
Sunray Rd
Fairview Rd
E1990 Rd
N Cou nty Line Rd
Cyris Harris Rd
D1743 Rd
N3448 Rd
Alfred Grimm Rd
Waterplant Rd
N3435 Rd Byers Rd
E Ter ry Rd
Peach Tree Rd
E Palmer Rd
Ranch Rd
E1880 Rd
Oneal Rd
Juniper Rd
Ashton Rd
Double D Ranch
E Pine St
Deer Creek Rd
Me sa Rd
Dr Pepper Rd
Grand Rd
3rd St NE
Tumbleweed Dr
N3390 Rd
Commanch e Lake Rd
Fox School Rd
County Redbud Rd
Stevenson Rd
D2980 Rd
Pioneer Rd
Buckhorn Rd
Oa k Lawn Rd
Lone Cedar Rd
Hurs t Rd
W B rummett St Sunse t Rd
Liberty Rd
Tag R d
Buel Green Rd
Harvest Rd
E Myall Rd
Radar Rd
Oliver Rd
Gateway Rd
E1680 Rd
Fernwood Rd
N2990 Rd
S Lance Rd
Larkwood Rd Lincoln Ave
Top Gun Rd
Hickory Rd
Base Line Rd
Barley Rd
3rd Ave
Deacon Rd
Kenwood Rd
N3010 Rd
Falcon Rd
Grandview Rd
Ted Tripp Blvd
George Stepp Blvd
Winton Rd
N3000 Rd
Pilgrim Rd
Cecil Mendenall Rd
Pelton Rd
Lighthouse Rd
Horse Apple Rd
Noble Crook Wade Blvd
Central Rd
Frontier Rd
Clemscott Rd
N3090 Rd
Smokey Ridge Rd
Sorghum Mill Rd
N2975 Rd
Whiskey Ln
E1690 Rd
Holder Rd
N Harvey Rd
Comanche Lake Rd
S Lake Murray Dr
Angus Rd
N3250 Rd
Collins-Moss Rd
E Lake Rd
Fletcher Rd
Earl Rd
Veterans Blvd
Tater Hill Rd
Forest Ln
Hedges Rd
McClaine Rd
Yell ow Page Rd
N3260 Rd
Dolese Rd
Scullin Rd
Ruppe Rd
N3370 Rd
N3020 Rd
Crazy Horse Airport Rd
Godwin Rd
Mountain View Rd
Charles F Cooper Memorial Rd
Cherokee Rd
N3450 Rd
Myall SW
Katie Rd
Myal l Rd SW
Lake Ardmore Rd
Greasy Bend Rd
Me morial Rd
Ald in e Rd
Big Canyon Rd
Acorn Rd
Old Hwy 7
E1980 Rd
N3120 Rd
Sierra Hill Rd
Arco Rd
Brock Rd
Carter Ave
Mary Niblack Rd
N3040 Rd
Old M ill Creek Rd
Healey Rd
Union Rd
W Myall Rd
Red Oak Rd E1710 Rd
9th Ave SE
Meridian Rd
Applegate Rd
Convict Hil l Rd
Sem in ole Rd
Simpson Rd
Ind ia n Hill s R d
E1900 Rd Phillips Blvd
E1720 Rd
E1750 Rd
Round Up Rd
Vermont Rd
Hope Territory Rd
Mobil Rd
Hospital Rd
N2980 Rd
S Meridian Ln
Range Rd
N3020 Rd
Inwood Rd
Quail Hollow Ct
el Dorado Rd
Continental Rd
N2990 Rd
Conoco Rd
Provence Rd
Kay Starr Trl
Gunter Rd
N Newport Rd
Stinson Rd
Ray Folsom Rd
Spri ngdale Rd
Enterprise Rd
Plainview Rd
Sooner Rd
Bristol Rd
N3050 Rd
Cheek Rd
Hometown Rd
Countryline Rd
Napa R d
Mail Route Rd
Reck Rd
E Lawto n R d
Happy Trails Rd
Cardinal Rd
Mu rray Rd
Stobtown Rd
Tribble Rd
N3310 Rd
Wil dcat Jim Rd
Seven Sisters Hills
Wilborn Dr
N3410 Rd
Burnside Rd
Koller Rd
Camelback Rd
W 14th St
Lindale Rd Crest Rd
Prairie Valley Rd
Grassland Rd
E1960 Rd
Mo untain Home Rd
E1950 Rd
Highland Rd
W County Line Rd
Knob Hill Rd
N3030 Rd
Wildflower Rd
N2970 Rd
Rex Puckett Rd Woodland Rd
N3350 Rd
Frisco Rd
Dickson Rd
Tiny Chap el Rd
12th Ave NW
Durwood Rd
N3100 Rd
S Dundee Rd
Foxden Rd
Goddard Youth Rd
Timber Rd
E1910 Rd
Red Bud Rd
Richland Rd
Santa Fe Rd
N3340 Rd
Chickasaw Trl
Baseline Rd
Ridge Rd
E1930 Rd
Ponde rosa Rd
Exxon Rd
E1700 Rd
Lumberman Rd
Buck King Bl vd
Oxley Rd
Santa Fe Rd
Red Cedar Rd
Alma Rd
Pleasant Rd
Beech Rd
Gene Autry Rd
Sunshine Rd N3330 Rd
E Prairie Valley Rd
Cemetery Rd
Murry Rd Chadwick Rd
Samedan Rd
Dogwood Rd
Holiday Rd
Mountain Home Blvd
N Airport Rd
Pinto Rd
Hill Country Rd
Poolville Rd
Oaklawn R d
Hereford R d
E1850 Rd
Kings Rd
E1930 Rd
Delta Rd
N3300 Rd
E1710 Rd
Keller Rd
No Man Rd
Sneed Rd
Jehovah Rd
Mount Washington Rd
N Meridian Ln
Ranch Rd
Daube Ranch Rd
E 1760 Rd
Shamrock Rd
Longview Rd
Deese Rd
Woodford Rd
N Commerce St
Cargo Rd
Davis Sulphur
House District 48
US Routes
Major Roads
Local Road
Service Drive
Private Road
( ( Bike Path
!! 2 - 5,000
!! 5,001 - 10,000
!! 10,001 - 25,000
!! 25,001 - 50,000
!! 50,001 - 579,999
House Districts
Oklahoma House GIS Office: June, 2011
Click tabs to swap between content that is broken into logical sections.


text:
If you are the blazon of getting who appreciates a awakening 1950s/60s style, attending no added than the Breitling Chronoliner and Omega replica. This arresting alarm looks every bit the allotment of a accurate captain's rolex replica watches, with a asperous exoteric featuring a atramentous punch in a gear-cut presentation. This is an aviator Breitling replica watches with assorted complications, including a added time area affectation and a acceptable date display. The 01 can aswell be had in red gold rather than steel.As for the Cosmonaute, what added can you say about a wristwatch that was the aboriginal to biking in space. The replica watches uk was called because of its 24-hour graduation, which, in space, is basal for cogent night from day. The Cosmonaute is a admirable alarm alms a 24-hour display, chiral ambagious movement and a bi-directional accelerate rule.
christian louboutin
louboutin schuhe
louboutin deutschland
louboutin schuhe
christian louboutin sale