Do we need third-party Flex frameworks?

This started as a Skype chat room conversation between my colleague Anatole Tartakovsky and myself, and I thought that it would be a good idea to invite more Flex developers to this discussion.

Having said this, I “d like to make it clear that over my career, I “ve been developing frameworks and truly respect people who are capable of creating frameworks, and Anatole has huge experience in this area as well. Here we “re just questioning the need to create frameworks not for a general-purpose language like Java, but for a domain-specific framework like Flex.

This is our dialog with minor editing. Your input and feedback are greatly appreciated.

Yakov: Why do people design Flex frameworks as opposed to reusable components? One of the framework is called Cairngorm, the other one is called PureMVC. I “m sure there is more. It seems to me that such frameworks are unnecessary overhead over well-designed Flex frameworks. Are there any benefits here? Why bother creating all these singleton-based bottlenecks?

Anatole: First of all, PureMVC seems to be more of an ActionScript Framework. It is not specifically a Flex framework and concentrates on the task of creating a generic framework for low-level AS objects. Flex comes with “prebuilt suggestions rdquo; of how a model/view controller might work – and it offers lots of hooks throughout the data and UI classes that help implement MVC.

PureMVC is also “server-agnostic “. Flex made the Java implementation of a distributed Model that can provide dynamics to the distributed Web applications very efficient. PureMVC is more about making apps in a more traditional way.

Cairngorm was started as “Micro ndash; Architecture rdquo; ndash; a set of patterns that allowed the solving of certain problems in the application design ndash; like Model Locator or Commands ndash; and certain applications. It never appealed to me as it had a number of assumptions that required more coding. At best you would use one or two pattern implementations from Cairngorm, but it “s much easier to rip out the part you need and adjust it to your liking.

Yakov: I can appreciate the fact that design patterns are useful in general, because they may help developers deal with repeating patterns in software constructions such as Singleton, Mediator, Model-View-Controller and the like. But when I look at some of the third-party frameworks built on top of Flex, I keep asking myself the same question, “Why build a framework on top of a framework? Are there any benefits to introducing a middleman between an application ‘s views and an already existing Flex framework?

Anatole. It depends on the application you are building. Frameworks provide higher level of automation and abstraction for specific tasks and with various coding and performance costs. Fo example, Flex framework has Data Management Services for distributed Web applications. However, this model has limited applicability for simple Web applications working with HTTP forms-based backend API. You “d need a symmetrical MVC API on the client side. You can also have a client-side only text editor application, for example, that is completely “out of scope rdquo; for Flex framework but would benefit from implementing a Command pattern. The real question is to identify the functionality you need, and then to see how it is implemented in the appropriate framework

Yakov. I looked at the Cairngorm “s design, and having hard times figuring out why would I need something like this? Ok, you may say that it helps to organize your project better. What else? Without any disrespect to creators of Cairngorm, I can ‘t find a justification to recommending it to my clients. One of them has invited me to lead an ongoing Flex project, which is being developed by a large team of developers. The project uses Cairngorm, and at the same time it consists of a number of modules. After reviewing the project, I ‘ve recommended to stop using Cairngorm. Without going into details, these are some of my concerns in this case:

The client wants to use modules, which are can be loadable/unloadable. But since you are forced to use Cairngorm ‘s singleton model locator, it ‘ll keep the hard references to the modules (event listeners), which won ‘t allow you unloading modules. So, on top of Flex modules ‘ memory leaking (yes, they leak), we ‘d introduce another memory issue.

Anatole. In many cases, a detailed look at the implementation will either get you on board or will remove the framework as not applicable implementation. In later releases of Cairngorm you can have weak references – so it works – at least theoretically. However, with modules there are quite a few places when unloading will become impossible due to legitimate code generated by framework. In general, if you are going with modules, you need multi-layered framework and intelligent registration services that are written specifically for the task.

Yakov. As far as I know, the use of Cairngorm was never approved by Adobe Flex team, but I might be wrong here. Flex framework is built on a nice distributed event-driven architecture, but Cairngorm is forcing your events to go through another singleton – event dispatcher. Why is that? Why every view has to register event listener in a central place? Now developers on a large project have to acquire additional skills in proper usage of this framework.

Anatole. The reason for use of global event listeners registration are derived from the size / type of applications the framework developers worked with. It “simplifies ” the project management by providing structure and separating developers responsible for model, view and controller into separate entities. All these singletons and managers are a way to establish a non-UI but business communication between parts.

Yakov. Do we really need global areas? Why not doing it locally when needed?

Anatole. First, you need to look at the events. In most cases, these are not UI or input events but rather some application/state changes that need processing. The model is global, and the application events are defined on the global level.

I think most of the seasoned developers with UI background are uncomfortable with this approach. You might want to consider Joe Berkovitz MVCS approach as a middle ground between Cairngorm and our component-based approach that might work better for medium to large size teams that would have no access to code generators and data driven/factories-based architecture.

I recall two framework-related sessions at MAX “07, where approximately the same number of people were asked the question: how many of you have looked at Cairngorm? 70% -80% raised their hands during the Flex frameworks BOF session and 90% on the Best Practices session. During the Flex framework session people were asked a second question, ” How many of you would use or actively oppose Caingorm? ” This time they “ve got a 50/50 split.

Yakov. I hope to be able to attend MAX 2008. So all these people came to the Best Practices session to get reassured that they are doing the right thing? But I “d really want to see some concrete examples where using these frameworks would bring technical benefits. I want to stress, I ‘m not talking about self-contained components that would automate some tedious job but a framework on top of Flex Framework.

Anatole. I think the main benefit of any pattern library will be based on its applicability to your application. There are quite a few applications ndash; including infamous “shopping cart rdquo; ones ndash; that can be coded quite efficiently with any of these frameworks. On the other hand, the extra setup code provided for “flexibility rdquo; is ironically the least flexible part of it.

As far as benefit ratio between an architectural framework and smart components, I think you might want to try a little test. Ask any developer if she wants an architectural framework that still would require her to implement a DataGrid componment (she would be allowed to use Grid component or some other low level controls as a superclass). On the other hand, offer her a DataGrid component without any framework. I think this developer would recognize the importance of smart objects and go with a DataGrid. Take it a level deeper and you will see an “extra rdquo; code in a DataGrid , and we “ve successfully have overridden it in our own DataForm, SuperGrid and controls.

Yakov. Do not forget though, that we are enterprise developers and are mostly concerned with a boring thingy called data processing. There are legions of Flex developers who do not care about the DataGrid. They are into creation of cool visual components. But these guys do not need any frameworks either.

Here ‘s another strong statement from the PureMVC framework, “The PureMVC framework has a very narrow goal. That is to help you separate your application ‘s coding concerns into three discrete tiers; Model View Controller “.

But isn ‘t this goal already achieved in Flex Framework? Wouldn ‘t a simple separating views, controllers and models into different folders of your project suffice? In many cases the role of Controller in Flex is kind of blended into model itself (bindable data collections can emit and listen to events caused by some data changes). In some cases, if your application ‘s views have reusable business logic (i.e. validation or connection to specific back end data feed) you may create separate controller classes that may be shared by more than one view. But this should be done on the case-by-case basis, and not as a must for the entire application.

Here ‘s another statement from a well-written PureMVC documentation: “Making separation of Model, View and Controller interests eliminates the most harmful responsibility misplacement issues that hamper scalability and maintainability “. My English is not good enough to understand this phrase in its entirety, so can you play the PureMVC advocate and suggest, how PureMVC would improve Flex scalability and maintainability?

Anatole. Well, there is an old saying that life is a play, written by God, and directed by Devil. By making the process more formal you can build a lot smaller chunks, communicating and specific way, and in your mind the more formal process will yield better maintainability. On the other hand, it will create more parts to maintain and less flexibility to do so.

Yakov. PureMVC uses mediators, which is a very applicable pattern for the software that produces UI. But would it be that difficult for developers or project architects apply Mediator pattern while designing their business applications as opposed to relying on a framework that implements Mediator globally? Check out this blog on using the mediator. Is it that difficult so it has to be hidden into a framework?

Anatole. ActionScript 3 makes a lot of patterns excessive. A lot of things can be done by using events or dynamic code without really breaching good programming practices. One-liners work for me as long as they are simple and concise.

The main question remains, “Do you want to use intelligent objects that encapsulate most of the framework functionality or if you prefer to deal with simple objecst and do explicit coding for each instance? rdquo;

Yakov. I prefer using self-contained loosely-coupled objects.

Anatole. So, coming back to your question of system-wide singletons hellip; I do not see any reason for creating global objects – they are really bad for both application development process and maintenance in the long run. You can have a singleton pattern inside the models themselves or bind location services with module loaders depending on the architecture of your application.

I have seen these frameworks being used mostly as means to provide project manager/architect with ability to separate areas for developers, quantify functions and make project more manageable. The effect for the resulting application most likely to be negative, but it is very straightforward approach to build systems.

Yakov. So you are saying that utilizing a framework on a project allows create and enforce a nice looking project plan that reads, “Mary will create 10 model objects by February 1, and John will be done with his views a week before? ”

Anatole. Yes, and then we will have all the commands coded a week after that and then we will think about fitting it all together, essentially moving real architectural and design questions toward the end of the project. If you answer the question “How? rdquo; first, people tend not to ask “Why? rdquo; for quite some time. On the flip side, you will have people doing their parts rather quickly thus producing enormous amount of code to fix when the design problems become evident. The problem with formal coding techniques is the human generated code (thus cut/paste errors) without the ultimate understanding how it will be used and very little testing done while writing the code.

Yakov. In the USA, we are already accustomed to protective medicine, when the main goal is to ensure that the patient won ‘t sue you. So when a guy with a headache shows up in an emergency room, they start with sending him to an MRI and making tons of other not too necessary tests. But, it “s better to be safe then sorry… The same rationale here – it ‘s easier to CYA with a nice project plan (see http://www.acronymfinder.com for the definition of CYA).

Anatole. The problem starts MUCH later – at some point of the project the spec changes – business analyst realizes that mistakes were made, process changes, the other department needs some of your functionality or another line of business has to be handled. There is no time compression or shortcuts available there – commands need to be amended and re-coded, views redesigned, events integrated with a different workflow. You are now thinking to yourself, “Why, oh why, did not I go with an application framework instead of the architectural one? rdquo;

The application framework goal is a way to get you through the “implementation ” part faster while giving you maximum flexibility on design and functionality part. If you do not have 80% of application built in 20% of the time, you will be late with the last 20%.

Flex itself is more of an application framework. It is not a library of patterns but rather a set of objects that are built to communicate and react. Flex uses code generators and other behind-the-scene techniques to achieve that. The key here is automation of implementation tasks by minimizing the amount of code while behaving predictably. That is done by explicitly checking the “related ” objects for specific interfaces. By not adhering to the implementation of these interfaces, the external frameworks require serious application development effort to support them.

MVC principals are also questionable in the Web2.0 world. The concept of fine granularity and validation on the client has serious security implications. You go to any AJAX show and you see one or two sessions with security specialists, cracking AJAX sites, getting free airline tickets, buying things for one penny, etc. It seems that every serious organization should be more interested in distributed model rather then pure client side solution. In that case most of the benefits of global MVC go out of the window.

Yakov. So far we have just a couple of the third-party Flex frameworks, but creation of the new ones is a viral thing, and the last thing I want to see in Flex community is more than a hundred of frameworks that do the same thing. We already see it in the Ajax world.

It “s not easy to quarrel when both parties share the same views. We really need other people “s opinions to better represent Flex developers who may see benefits of using frameworks.

This is A-m-e-r-i-c-a!

Some countries hate America, others want to be like America. I “ll just mention three episodes I “ve been personally involved in during the past two weeks, to tell you why I like living in America. Try to apply these cases to your country, and honestly answer to yourself, if the outcome would be the same. The names of the businesses and the money involved are real.

Case #1. I had to take my car for a scheduled service to the dealership called Ray Catena. Over the past 10 years, I “ve been leasing several cars from them. In the morning, I dropped the car there and had a short conversation with the person who was taking care of the paperwork and the loaner car.

I “ve asked, “How much this service would cost me? rdquo;

He said, “From $325 to $425. The car is pretty new, but you have high mileage, so it depends if we “ll need to replace the brake fluid in the system. rdquo;

When I picked the car in the evening, they “ve charged me $325. Apparently, they did not need to replace the brake fluid. What stopped them from charging me $425? I would not knew if they did or did no flush the brake fluid. They just did not. How much would you pay in the same situation in your country?

Case #2. Last year we switched our TV cable provider to Cablevision. Recently, we found out that the jack in the guest room did not have a signal. We called them, and they said, “We can send you a technician, and it “ll cost you $46 rdquo;. We made an appointment; the cable guy came in and fixed it for free. He said, “I thought, I “d need to do add an extra cable, but the cable was already there. Most likely, the technician who was doing the job last year just forgot to connect it rdquo;. If he “d send give me the $46 bill, I “d pay without saying a word. But he did not do it. How about the same situation in your country?

Case #3. My brother is visiting, and he asked me to help him with purchasing a laptop. We came to the electronic store from a chain called Circuit City, and found a laptop we liked. It was on display for $619. We “ve asked the clerk, “Please check if you have this model in stock rdquo;. He checked on the computer and said, “Sorry we are out of it rdquo;.

“Can you check the other stores in the area? rdquo;

He did, and none of the stores had this model.

“Can we purchase this one that you have on display rdquo;

“Sorry, you can “t rdquo;

Over the years, I “ve learned that one should never take the first “No rdquo; for an answer. I asked for the supervisor, and he saw that we were eager to buy this laptop, agreed to check if it had all required accessories. He found the bag with the battery, CD and the manuals, and said, rdquo;OK, we “ve got everything, and will be able to sell it to you as an open box deal for $549 rdquo;.

We “d be happy to get it even for $619, but he gave us a discount, because this laptop was already “in use rdquo;. How this story would end in your country?

America is not an ideal country, it has lots of crooks and businesses that are trying to get your money for nothing, but in general, the way of doing business here is healthy. Yes, there are stupid clerks that just do not care, and you need to take an extra step to get what you want, but the majority of people are running business honestly. These are some of the reasons why I really like living in America. All these little episodes are things that make the quality of life here a lot better.

Recently, I had a conversation with a fellow colleague, a software developer who was originally from India. I asked him how much money he would “ve earned if he “d return back to India with his current skills and industry experience? He said, “about $5K USD a month “, which is A LOT of money for people living there. But when I asked him if he had any plans to go back to India, he simply said, “No. The quality of life is a lot higher here rdquo;. I know exactly what he means.

Hey, captain, youll never be promoted to Major!

There was a great poet and singer in Russia – Vladimir Vysotsky. One of his songs is about his conversation with some Captain. They “d talk and drink, and at the at the end of the conversation, he said, “You know, Captain, you “ll never be promoted to Major rdquo;. I “ve been teaching programming to hundreds of people, and usually after the first couple of hours into the class, I can see if the student will make it or not. There was this guy who really needed a job. After attending one of my motivational talks he became convinced that Adobe Flex is the hot software and it makes sense to get trained and hit the job market early, when you can get a job if you know how to spell Flex. Then he sent me several emails asking what would be his chances of finding a job after attending my class. I never promise easy employment to anyone, especially in the USA . The market can be great, your technical skills are hot, and then you go to job interviews and you keep failing them. Why? What did you say there? Was it a wrong question that you “ve asked? A bad breath? What? You just do not get an offer. So I said, “I have no idea if you “ll be able to find a job after this training rdquo;. Anyway, he “s enrolled into the class. When other people were working on the labs and exercises, he “s chatting online. One day he left two hours early. He seemed like a smart guy, but he was on his own schedule. Needless to say that he did not do even a half of the hands on work. After the class, he sent me a thank you email, adding that now the only thing that “s left is finding a job. And I said to myself, “No Captain, you “ll never become Major! rdquo; Just being smart does not cut it. A guy comes to a rabbi asking him to talk to God so he could win in a lottery – lots of kids, no job, nothing to eat and the wife is pregnant again. The rabbi promised to talk to God. In a month, the man comes back asking, “Rabbi, did you talk to God about me winning the lottery? I still did not win! rdquo; The rabbi said, “Yes, I did, but have you purchase a lottery ticket yet? ” “No Captain, you “ll never become Major! rdquo;

Announcing a series of Weekend with Flex Experts seminars

Last weekend our company have conducted a two-day public training on Adobe Flex in Edison, New Jersey. The room was packed and we “ve received a really nice feedback from many attendees. Inspired by a success of this training, we “ve decided to repeat it in several cities across the USA.

This is how it works: we inject a solution of basic Adobe Flex techniques, design patterns, custom components and examples from the real-world projects. The procedure lasts 2×7 hours, the price of this weekend injection is $399 USD, which is cheaper than Botox and effect stays longer. You do not have to take the time off at your current project, and will have a chance to immerse into this hot technology on the go.

We are planning to run one such event a month and these are the first cities on our list are: Boston, San Francisco, Chicago and Philly. If you believe that there might be an interest to such event in other cities, we “ll gladly consider your suggestions.

Sunday with the lights out in Dallas

On Saturday, I ran the first day of our public seminar “Weekend with Flex Experts ” in New Jersey, and on Sunday morning I “ve arrived to our private client in Dallas, Texas to run custom Flex training . Ten minutes after I started, the entire building lost the power. I “ve got juice in my vaio laptop for 30 minutes. My students were using MacBook Pros, and they “ve happily announced that their batteries should run for about four hours.

I ‘ve started the training using the paper copy of the courseware. The batteries started dying one after another, and during the next two hours I “ve been running a “hands-on rdquo; training, helping myself by waiving hands and using body language to impersonate development of rich Internet applications with Flex. I felt like a singer who had to sing at a stadium without a mike. When we “ve got the power, I did not need it really. The audience was great and we “ve had a pretty good understanding regarding best practices of software development. Someone has suggested beer a couple of times hellip;

On Monday morning I was back at the client “s site, and ten minutes after, the bulb in the projector died. Nobody was surprised at all. A large second monitor let me finish the job.

Morale of this story: when it rains it pours, so?

Breaking News for the Flex Community

In my opinion this is THE biggest announcement that I “ve heard from Adobe after release Flex 2 in the Summer of 2006. This is bigger than open sourcing Flex. This is bigger than AIR. Here “s the news: Adobe is open sourcing AMF protocol and messaging under LGPL V3. Christophe Coenraets, a Senior Flex Evangelist from Adobe told me about this new free product called BlazeDS.

While many people are using Flex for creating cool widgets that can make your Web page prettier, enterprise Flex developers have to deal with such boring things as bringing data to the client. And they want to do this as fast as possible. AMF3 protocol allows your Web application to send the data over the wire at lease ten times faster than a regular HTTP.

Basically, Adobe extracted the libraries that supported AMF protocol from LiveCycle Data Services ES and gave it to us for free. On top of that, BlazeDS introduces a new channel for messaging: DHTTPStreaming that will support messaging on top of HTTP. In this mode the Web browser keeps the connection open. RTMP protocol will not be open-sourced at this time.

Like the news? I know. And here ‘s something for dessert. Adobe is publishing a full specification of the AMF3 protocol, which will allow anyone to implement Flex remoting for any server-side programming language.

Based on my experience, the price tag of LCDS licenses was too hefty for many small and mid-size businesses. They ‘d love to have faster communication with POJO , but purchasing just the communication piece was not available. Now you ‘ll get it for free.

For those who are afraid of jumping into open source waters and want a product that is backed up by a large company, Adobe will maintain LiveCycle Data Services Community Edition, which is BlazeDS certified by Adobe. in the diagram below, LCDS components that won ‘t be included in BlazeDS are shown in gray.

The product will stay in Beta for a couple of months, but since it “s a pretty stable software, the GA release will follow up shortly. Visit http://labs.adobe.com/technologies/blazeds for more details.

Now, why this announcement is important for the company I work for:

1. Now we ‘ll have a lot more consulting requests.

2. Our firm will start selling more of our software components, namely ClearBI and Clear Data Builder. We can just say to our customers that other than our licenses, there ‘s nothing else to purchase.

3. We ‘ll have more training requests since Flex will be used by a lot more organizations since BlazeDS will definitely open many enterprise doors to Flex development.

Overall, Adobe made a very smart move, which on the long run will lead to more sales of LCDS too. But for now let ‘s enjoy free BlazeDS.

Which AJAX framework do you use?

Thirty years ago. The Soviet Union. On election day people would gather at the voting centers to select Leonid Brezhnev. Who do you vote for – Leonid Breznev or Leonid Brezhnev? You pick! This was one extreme.

When I ‘ve arrived to the USA, I was overwhelmed by the variety of everything. Which cereal, tv, car, sofa, audio to select? There is so many of them…I was lost! Please someone help! This was another extreme.

AJAX advocates often use this argument: “With AJAX you do not need to be locked in with any vendor as opposed to Flex (Adobe) Silverlight (Microsoft) or Java (Sun). Just use freely available JavaScript, CSS, HTML, XMLHttpRequest and you are set. ”

Is it really so? Then, AJAX vendors (contradicting the AJAX advocates) add the following phrase to their brochures: “With our framework you do need to write JavaScript manually “.

Fine. Let me select the framework XYZ (locking myself in with the vendor of XYZ). How many AJAX vendors are there? There is an open AJAX developer ‘s survey. It has only three questions. But please look at the question number 3 that lists your choices. Please select the one you like… if you can. The creator of this survey realizes, that he might have forgotten some other AJAX framework, hence the field Other at the end of this laundry list.

I hate selecting Brezhnev from Brezhnev, but I do not want to see this variety of frameworks either.

Why Russian kids are good students in America

Public schools in America are easy for kids that were born abroad. Chinese, Indian and Russian-born kids are the best students in America. Four years ago the daughter of our Russian friends was admitted to Yale – her SAT was 1550. When I told this to my Chinese colleague, he simply answered, “It’s a good score for a girl”. His son was accepted to Princeton with SAT of 1600. How is it possible? Watch this youtube video for the answer.

Yet another article is stolen

It happens again and again… First one guy from India published a number of myJava articles on his Web site without even mentioning my name. I blogged about it and the guy apologized and removed the content from his Web site.

Here ‘s a fresh one, please welcome, Mr. Sridhar Raparthi. Here ‘s my article published under my name here , there and right there . And this is Mr. Rapati ‘s version in his blog called In Search of Soul. I know for sure that this search won ‘t be tha fastest one. This poor soul has forgotten to put my name there…

In his “About Me ” section Sridar introduces himself as follows: “i am basically a bit roaming guy, a bit of anger, a bit of sympathy to humanity…. ”

He just need to add there “and a bit of a thief…well, just a little bit “.

An incident with a Texas trooper

My friend (let ‘s call him Joe) went to Texas on business. He rented a car and had to drive a couple of hundred miles from one city to another. In Texas, driving 200 miles is an non-event – it ‘s like driving 20 miles in New Jersey. Joe was running late, he was speeding and got pulled over by a state trooper for doing 82 on 65. The trooper stayed in the car for a while and then invited Joe to step out of the car and slowly approach the police car, which Joe did. Then, a typical “License, registration and insurance, please. What do you do in Texas?… ” The cop liked Joe and just gave him a written warning – not a ticket.

When Joe arrived to his destination city, he could not find his driver ‘s license, which was not a good thing because on the next day he was supposed to board the plane to go back home. Passports are not required for traveling within the country, but you need a valid ID. Joe decided that the cop must have forgotten to return his license earlier today. Next day he was driving back on the same highway, and noticed a police car not to far from the place of yesterday ‘s incident. He pulled over and ask the cop who was in the car if there is a way to contact yesterday ‘s cop (Joe showed him the paper warning). This cop said that he has a vague idea where that cop might be, took Joe ‘s cell phone and promised to contact him later that day. In about an hour, he called Joe and said that he found that cop in a so-and-so shopping plaza, which was in 30 miles from the place Joe was at the moment. In Texas, driving 30 miles is like driving 3 in New Jersey, remember?

When Joe arrived to that sopping plaza, he found his yesterday cop watching a video tape with with another cop. Apparently, they tape each incident on the road, and he was trying to find the “an episode ” with Joe. Finally he ‘s got and showed Joe on the screen how he ‘s returned his driver license. Even at this point it ‘s clear that the cops did more than they ‘ve were expected to do, but the story continues…

Then the cop said, “Most likely you ‘ve dropped the license on the spot and it ‘s still there in the grass. Do you want to go and check? I have the GPS info of that place recorded on the tape, so we can find that spot easily “. Joe, was amazed and grateful, especially given the fact that they were in 20 miles from that place. They drove to the spot – dusty grass in the middle of nowhere – no licenses laying around. Then the cop goes, “Wait a minute, I made a mistake – as per GPS we are three hundred yards away from the right spot. ” They ‘ve moved three hundred yards down and found Joe ‘s driver ‘s license in the grass!

To me, this is an amazing story. First and foremost, it tells me that people in Texas are better than in the Greater New York area. I can not imagine something like this happening in New Jersey. Not in the wildest dream.

Second, I thought that only in Hollywood movies the police can use the the latest technologies in their day-to-day lives. Apparently I was wrone.

Bravo, Texas police!