PowerBuilder developer needs some direction

I ‘ve received a very well written email titled “PowerBuilder developer needs some direction “. Here ‘s what the author (let ‘s call him Joe) wrote:

Yakov, I have been a PB developer for the last 12 years. I ‘m hoping since you were a PB programmer awhile back that you can help me understand what the fuss is about with web development and/or point me in the right direction to better understand this. In the past few years, our department is doing less developing in PB and more focus is on developing web applications in Java. The applications are used within the company so there is no requirement to be able to access the applications from the internet. I also should mention that most of the business logic was in Oracle stored procedures and now the focus is on having the business logic in Java and using hibernate to talk to Oracle.

I usually thrive at learning new technology but I ‘m really having a hard time with convincing myself that this is the way to go. For me, PB is so much faster at building GUIs. It also made more sense to me to keep the business logic on the Oracle server so we wouldn ‘t have a network bottleneck issue. And dealing with only PB and stored procedures made maintaining the applications real easy. Now I have so many parts in applications like JSF, Spring, Hibernate, Java workflows, Log4J and XML configuration files that it ‘s not as simple to maintain these applications anymore. Also, since internet access is not required for these applications, I don ‘t understand why we have to go this route and make these applications so complex.

I ‘m hoping you can shed some light on this because I really need to get past this.

I swear, I did not change a word in this email. I want to shed some light, but I really do not know what to say – the author is absolutely right – it ‘s really hard to explain why majority of the business applications have to be so painfully difficult. I ‘ll probably repeat myself, but let me say it again,

Using Web technologies in enterprise development is abused. At least fifty percent of the Web applications in any given corporation could have remained Client-Server using PowerBuilder or Visual Basic as a front end.

Can anyone explain why all these HR applications has to be on the Web? Why your order management system is written in Java and requires developers that know Java, JSF, HTML, JavaScript, Spring, Hibernate, XML, XPath, XSLT, Shell scripting, JDBC, Servlets, JSP and a couple of other buzzwords? Any PowerBuilder or VB developer who knows SQL could have created such applications in half time for half money. Why hire expensive Java Swing gurus to display data in a simple datagrid? Why hire even more expensive AJAX gurus to achieve even half of the functionality that any mid-level PowerBuilder developer gets off the shelf with an excellent DataWindow control that I ‘ve been using more than ten years ago?

Why overcomplicate programming? Guys, 90% of corporate programmers do not need to be computer scientists. Unless you are working in the algorithmic trading modeling area or have to calculate a trajectory of an object moving in space, PowerBuilder or VB is more than enough! Having a MS in Applied Math, I have to admit that during the last 15 years I did not need to use even a bubble sort algorithm. If you know how to write nested if-statements and a little of SQL you should be able to write majority of the modern enterprise business applications. And business users will be much more happier than they are now with this pletora of technologies!

So what can I say to Joe? You have to learn Java and JSF and Spring and Hibernate to survive and feed your kids. They will proudly announce how dependency injection (also known as inversion of control) helps. I ‘ll tell you a secret – if you are doing PowerBuilder you already know all this – it ‘s just sending custom events to a non-visual user object with all the data that this object needs. But hush! We do not want to make all these gurus angry. You ‘d better read all these article of smart programmers who will explain you how to make your life easier wit their XYZ framework. Someone pushed you in the corner in the first place for no reason, and now they are happy to suggest you how to make your life “even easier ” than before.

All these technologies scared an average American away from CS majors, and friendly Indians are happy to help without having any idea why such superpower as AMERICA can not find people to program an Order Management System of a shipping company?

Joe, I ‘m sorry I can not give you any better explanation. Just surrender and learn all that they want you to know – you need to raise kids and take you wife to a nice one week vacation to Carribean. Just do not forget to put the Hibernate book into the garment bag right next to the swimming trunks and shades. They say writing Select lastName, firstName from customers is bad, and you need to create a Java class and an XML mapping to get the last and first name from a database table.

As one stand-up comedian recently said, “There is no difference between I ‘m sorry and I apologize unless you are attending a funeral “. PowerBuilder is dead, and I am really sorry.

Mac or PC, RIA with Adobe or Microsoft?

My Dell laptop is dying and I had to make a choice – which small screen laptop tp buy next. After having two issues with motherboards Dell is out, and I was choosing between Lenovo X60 (12 “) and MacBook Pro (13 “) with dual boot – OSX or Windows. As a professional enterprise developer I was inclined to stay with PC, and these couple of youtube videos have confirmed my decision – Wintel notebook.

But I ‘m still waiting till Lenovo will start shipping their notebooks with Windows Vista (today ‘s the first official Vista day). That ‘s why I decided to look at the Windows Vista home page . It shows a nice little presentation on Vista using…Flash Player from their rival Adobe. This is a clear indication that Flash Player is a de-facto standard when it comes to delivering multimedia. FLash Player ‘s ubiquity forced Microsoft bite the bullet and use it instead of their Windows Media Player.That ‘s why Adobe Flex and not WPF/E is a tool of choice for rich internet application development…at least for another couple of years.

Object-Oriented programming in ActionScript 3 vs Java

Several years ago I wrote an article on using abstract classses and interfaces in Java . Back than I was absolutely sure that writing object-oriented code is a must. These days, I ‘m using yet another language called ActionScript 3 (AS3), which supports all OOP paraphenalia plus has provisions for dynamic data types. This article illustrates my up to date vision of OOP with and without interfaces. OK, let ‘s go.

You know the drill: a language is called object-oriented if it supports inheritance, encapsulation and polymorphism. The first two notions can be easily defined:

bull; Inheritance allows you to design a class by deriving it from an existing one. This feature allows you to reuse existing code without doing copy and paste. AS3 provides the keyword extends for declaring class inheritance, for example:

package com.theriabook.oop{

public class Person {

var name:String;

}

}

package com.theriabook.oop{

public class Consultant extends Person{

var dailyRate:Number;

}

}

package com.theriabook.oop{

public class Employee extends Person{

var salary:Number;

}

}

Listing 1. The ancestor and two descendents

bull; Encapsulation is an ability to hide and protect data. AS3 has access level qualifiers such as public, private, protected and internal to control the access class variables and methods. In addition to a Java-like public, private, protected and package access levels, in AS3 you can also create namespaces that will give you yet another way of controlling access to properties and methods. However, if Java enforces object-oriented style of programming, this is not the case with AS3, because it “s based on the scripting language standard. Object-oriented purists may not like the next code snippet, but this is how HelloWorld program may look in AS3:

trace( “Hello, world “);

That “s it. No class declaration is required for such a simple program, and the debug function trace() can live its own class-independent life, as opposed to Java “s println() doubly-wrapped in the classes System and PrintStream. You can write your own functions, attach them to dynamic objects and pass them as parameters to other functions. AS3 supports regular inheritance chain as well as so-called prototype inheritance when you can add new properties to the class definitions, and they will be available to all instances of this class. Moreover, you can disable validation of the properties and methods during compilation by turning off “strict rdquo; mode. In Java, behind every object instance there is an entity of type Class. This is not an object itself, but it “s placed in memory by class loaders.

Program Design with Interfaces and Polymorphism

As in Java, AS3 interfaces are special entities that define the behavior (methods) that can be implemented by classes using the keyword implement. After explaining crucial for OOP interfaces, we “ll discuss how to write generic code even without their.

To illustrate how you can design AS3 programs with interfaces, let ‘s work on the following assignment:

A company has employees and consultants. Design classes to represent people working in this company. The classes may have the following methods: changeAddress, giveDayOff, increasePay. Promotion can mean giving one day off and raising the salary by a specified percentage. For employees, the method increasePay should raise the yearly salary and, for consultants, it should increase their hourly rate.

First, we “ll add all common methods that are applicable to both employees and consultants to the class Person.

package com.theriabook.oop {

public class Person {

var name:String;

public function changeAddress(address: String): String {

return “New address is ” + address;

}

private function giveDayOff(): String {

return “Class Person: Giving an extra a day off “;

}

}

}

Listing 2. The Ancestor class: Person

In the next step, we “ll add a new behavior that can be reused by multiple classes: an ability to increase the amount of a person “s paycheck. Let “s define an interface Payable:

package com.theriabook.oop

{

public interface Payable

{

function increasePay(percent:Number): String;

}

}

Listing 3. Interface Payable

More than one class can implement this interface:

package com.theriabook.oop

{

public class Employee extends Person implements Payable

{

public function increasePay(percent:Number):String {

// Employee-specific code goes here hellip;

return “Class Employee:Increasing the salary by “+ percent + “%\n “;

}

}

}

Listing 4. AS3 class Employee implementing Payable interface

package com.theriabook.oop

{

public class Consultant extends Person implements Payable {

public function increasePay(percent:Number): String{

// Consultant-specific code goes here hellip;

return “Class Consultant: Increasing the hourly rate by ” + percent + “%\n “;

}

}

}

Listing 5. Class Consultant implementing Payable

When the class Consultant declares that it implements interface Payable, it “promises rdquo; to provide implementation for all methods declared in this interface – in our case it “s just one method increasePay(). Why is it so important that the class will “keep the promise rdquo; and implement all interface “s methods? An interface is a description of some behavior(s). In our case the behavior Payable means existence of a method with the signature

boolean increasePay(int percent).

If any other class knows that Employee implements Payable, it can safely call any method declared in the Payable interface (see the interface example in class Promoter).

In Java, besides method declarations, interfaces can contain final static variables, but AS3 does not allow in interfaces anything but method declarations.

Interfaces is yet another workaround for the absence of multiple inheritance. A class can “t have two independent ancestors, but it can implement multiple interfaces, it just needs to implement all methods declared in all interfaces. One of the way to implement multiple ingeritance (we often use but do not recommend ndash; use at your own risk) is to use “include rdquo; statement with complete implementation in all classes implementing interface:

public class Consultant extends Person implements Payable {

include “payableImplementation.as rdquo;

}

public class Employee extends Person implements Payable {

include “payableImplementation.as rdquo;

}

For example, a class Consultant can be defined as follows:

class Consultant extends Person

implements Payable, Sueable { hellip;}

But if a program such as Promoter.mxml (see below) is interested only in Payable functions, it can cast the object only to those interfaces it intends to use, for example:

var emp:Employee = new Employee();

var con:Consultant = new Consultant();

var person1:Payable = emp as Payable;

var person2:Payable = con as Payable;

Now we “ll write a MXML program Promoter, which will use classes Employee and Consultant defined in the Listing 4 and 5. On the button click it “ll create an array with a mix of employees and consultants, iterate through this array and cast it to Payable interface, and then call the method increasePay() on each object in this collection.

lt;?xml version= “1.0 ” encoding= “utf-8 “? gt;

lt;mx:Application xmlns:mx= “http://www.adobe.com/2006/mxml ” layout= “absolute ” gt;

lt;mx:Label y= “10 ” text= “Inheritance, Interfaces and Polymorphysm ” width= “398 ” height= “35 ” fontWeight= “bold ” horizontalCenter= “-16 ” fontSize= “16 “/ gt;

lt;mx:Button x= “93 ” y= “66 ” label= “Increase Pay ” width= “172 ” fontSize= “16 ” click= “startPromoter() ” id= “starter “/ gt;

lt;mx:TextArea x= “26 ” y= “114 ” width= “312 ” height= “133 ” id= “output ” wordWrap= “true ” editable= “false ” borderStyle= “inset “/ gt;

lt;mx:Script gt;

lt;![CDATA[

import com.theriabook.oop.*;

function startPromoter():void{

output.text= “Starting global promotions…\n “;

var workers:Array = new Array();

workers.push(new Employee());

workers.push(new Consultant());

workers.push(new Employee());

workers.push(new Employee());

for(var i: int = 0; i lt; workers.length; i++) {

// Raise the compensation of every worker using Payable

// interface

var p: Payable = workers[i] as Payable;

output.text+= p.increasePay(5);

//p.giveDayOff(); would not work. Payable does not know

// about this function

}

output.text+= “Finished global promotions… “;

}

]] gt;

lt;/mx:Script gt;

lt;/mx:Application gt;

Listing 6. Promoter.mxml

The output of this program will look as follows:

The line p.increasePay(5); in the listing above may look a little confusing: how can we call a concrete method increasePay on a variable of an interface type? Actually we call a method on a concrete instance of the Employee or a Consultant object, but by casting this instance to the type Payable we are just letting the AVM know that we are only interested in methods which were declared in this particular interface.

bull; Polymorphism ndash; when you look at our Promoter from Listing 6, it looks like it calls the same method increasePay() on different types of objects, and it generates different output for each type. This is an example of polymorphic behavior.

In the real world, array workers would be populated from some external data source. For example, a program could get the person “s work status from the database and instantiate an appropriate concrete class. The loop in Promoter.mxml will remain the same even if we ‘ll add some other types of workers inherited from the class Person! For example, to add a new category of a worker – a foreign contractor, we “ll have to create a class ForeignContractor that implement the method increasePays and might be derived from the class Person. Our Promoter will keep casting all these objects to the type Payable during the run-time and call the method increasePay of the current object from the array.

Polymorphism allows you to avoid using switch or if statements with the type checking operator is. Below is a bad (non-polymorphic) alternative to our loop from Promoter.mxml that checks the type of the object and calls type-specific methods increaseSalary() and increaseRate() (assuming that these methods were defined):

for(var i: int = 0; i lt; workers.length; i++) {

var p: Person = workers[i] as Person;

if (p is Employee){

increaseSalary(5);

} else if (p is Consultant) {

increaseRate(5);

}

}

Listing 7. A bad practice example

You “d need to modify the code above each time you add a new worker type.

Polymorphism without interfaces

If this would be a Java article, I could have patted myself on the back for providing a decent example of polymorphism. But I ‘d like to step into a little bit dangerous territory: let “s think of a more generic approach ndash; do we even need to use interfaces to ensure that a particular object instance has a required function like increasePay? Of course not. Java has a powerful introspection and reflection mechanism, which allows to analyze which methods exist in the class in question. It “s important to remember though, that in Java object instances have only those methods that were defined in their classes (blueprints). This is not the case with AS3.

There is yet another urban myth that reflection is slow, and you should use it only if you have to. But this consideration is not valid for programs that run on the client “s PCs, because we do not have to worry about hundreds of threads competing for a slice of time of the same server “s CPU(s). Using reflection on the client is fine. Even on the server, a proper combining of reflection with caching allows avoiding any performance penalties.

AS3 provides very short and elegant syntax for introspection, and I “d like to spend some time illustrating polymorphism without typecasting and strict Java-style coding.

Let “s re-visit our sample application. Workers have pay and benefits and vacations, consultants have hourly pay. But retirees may have some other forms of receiving pension, board of directors might have pay with no benefits – are they workers? No they are not, and their objects may not necessarily implement Payable interface, which means that the typecasting from Listing 6 would cause a run-time exception.

How about raising the compensation of every Person even if it does not implement Payable? If one of these objects will sneak into the array of workers, simple casting to Payable show below will throw an exception

Payable p = Payable(workers[i]);

Let “s re-write the loop from Listing 6 as follows:

for(var i:uint = 0; i lt; workers.length; i++) {

var p:* = workers[i][ “increasePay “];

output.text+=p==undefined? rdquo;no luck rdquo;:p(5);

}

This short loop deserves explanations. First, we “ve declared a variable p of type *. Using an asterisk a bit more open than var p:Object; as it allows the variable p to have a special value of type undefined, which is used in the above code sample.

Let “s dissect the following line:

var p:* = worker[i][ “increasePay “];

It means, “Get a reference to the function increasePay() from the array element workers[i]. You may ask, why do you use brackets around the increasePay instead of the dot notation? The reason being that dot notation would ask the compiler to find and validate this function, while the brackets tell compiler not to worry about it: the program will take care of this little something inside the brackets during the runtime.

Basically, this single line above performs the introspection and gets a pointer to the function increasePay for the future execution in the next line:

output.text+=p ==undefined? rdquo;no luck “:p(5);

If this particular element of the workers array does not have increasePay defined (its class must be declared as dynamic), add “no luck rdquo; to the text field, otherwise execute this object “s version of increasePay passing the number five as its argument. The line above still has a potential problem if the class does not have the function increasePay, but has a property with the same name. The bulletproof version looks like this:

output.text+=!(p is Function)? “no luck “:p(6);

Let “s emphasize again: this method increasePay does not have be defined in any interface.

Java programmers would call this a wild anarchy. Of course, adhering to strict rules and contracts in Java leads to more predictable code and less surprises during the run-time. But modern Java moves toward dynamic scripting, added implicit typecasting, run-time exceptions, etc. Overuse of interfaces, private, protected and other “nice and clean object-oriented techniques rdquo; does not promote creative thinking of software developers. By the way, protected variables is another weird thing in OOP.

Now raise your hand if you are a Java programmer and after reading this article is thinking to yourself, “Hmm, may be ActionScript 3 is not too bad and I should take a look at it ? “. Now, stand up if you are thinking, “Java rules, the rest of programming languages sucks “. ActionScript 2 programmers can remain seated, but might want to reconsider the way they program.

Fortune Magazines list of 100 best companies

Fortune Magazine ‘s list of 100 best companies to work for. Who ‘s the number one?

Thake a guess…Three…Two…One…Google .

Check out this youtube video. I wonder who pays for this happiness? Let ‘s take a typical boring floor at a large corporation with a smelly carpet and a cafeteria that serves hamburgers and grills frozen Philly cheesestakes charging $5 for each. Say, a gross salary of an average employee in this boring place is $80K a year. This average employee here is… well an average person. I ‘ve heard that Google salaries are lower than you might expect. But their approach to HR is very smart. Say, thay pay a person $70K and use the remaining $10K to offer “free ” food, “free ” gym, and “free ” laundry and car wash, and most importantly, promotion of Google ‘s work culture. It ‘s smart, and they know how to do it right. If you noticed, one girl on this youtube video said that she likes to spend time at Google more than in her family…She hit the nail right on the head:

Google has built a place were lonely geeks having no personal lives can hang out

These are some sample interview questions if you want to apply for job there.

And this is a description of the intervewing with Google by one person, and here ‘s another one .

So where do you want to be – in your old boring cube making $80K or in a bright colorful place making $70K? If you are young, pick the latter.

Unusual Medical experiments on me

Last week I was on my annual skying vacation. I was a part of a large group of people who went to this resort. There were several medical doctors in our group, and one of them asked me at the dinner, “give me your hand “. She asked me to form an O-shape with my thumb and middle finger of one hand while the finger of my other hand was pointed at my heart. Then she tried to spread my O-fingers apart. I resisted and she was not able to do it. Then she said, you heart is healthy, now point at your lung, then liver and so on. An experiment was going on, and at some point, while pointing at one of my organs, whe was able to spread my fingers apart (to prevent stupid questions and joke, let me just say that this was an internal organ) . She said, “you ‘ve got some problems there. Now take a glass of beer in your other hand “. This time she also was able to tear my finges apart. She concluded that beer is not too good for me. With Jack Daniels my fingers were even weaker… I said, that most likely it ‘s happening because my fingers were tired and could not resist as strong as in the beginning of these tests. She responded, “OK, form the O and point at your heart again “. This time I also was able to keep my O together!

A number of people started screaming “me too, me too “, and she said to one lady not to eat apples, the other one should have removed oranges from her diet…

She explained that she ‘s practitioning a Japanese methodology called Bidigital O-ring (she ‘s licensed american MD), and using this method she successfully helps patients in diagnosys of the internal diseases and creating special diet using food supplements.

Other doctors from my our group remained sceptical and did not believe that this was a valid methodology. But it was really an interesting experiment.

Some useful Windows keyboard shortcuts

There is this Windows key right by the Ctrl on my keyboard. You may not know of some handy shortcuts with this button:

1. WindowsKey + R – Opens the Run command window

2. WindowsKey + L – Locks your desktop

3. WindowsKey + E – Opens Windows Explorer

4. WindowsKey + M – Minimizes all open windows

If you know of any other useful shortcuts, please share it with us.

My 15th anniversary in the USA

I have arrived to the USA on January 24, 1992. Today, I tried to recall things that seemed unusual, different or surprising. No comments, just the list. Each of these items deserves a separate blog, which I “ll write later. Anyway, let “s start.

– “How are you? rdquo; is not a question and you do not have to answer it.

– The usage of the phrase “You got it rdquo;

– You can improve any word by breaking it in the middle and inserting the word f..king there. The classical example from Pretty Woman is Cindef..kingrella.

– Kneeling buses ndash; disabled passengers are not second class citizens

– It “s very important to have good teeth.

– People can have different opinions and remain friends.

– The fact that you can buy speakers at WallMart for $10 does not mean that the speakers for $800 are good. There are also speakers for $8000 and for $80000.

– Computer programming is the best profession from the return on investment perspective. Six to twelve months of training can secure you $50K a year.

– If a patient is diagnosed with a terminal disease, he “ll be the first one to know about it, hot the relatives.

– Divorce for a man is extremely expensive.

– Too many lawyers per person.

– Having an American passport is not enough to prove your identity while applying for a renewal of a driver license.

– If you are driving a car and someone hits you from behind, it “s a good thing.

– Buy one get one free deals. If you buy what you don “t want, we “ll give you what you don “t need for free.

– If an interviewer asks you to evaluate your skills on the scale of 1 to 10, add 2-3 points ndash; the person who asks will subtract them anyway.

– If some one greets you with “How are you rdquo;, the only right answer is “Great rdquo;.

– If someone greets you with “What “s up? rdquo;, the only two right answers are “Nothing rdquo; or “Not much rdquo;.

– The word “friend rdquo; is not actually a friend. The “close friend rdquo; is a friend.

– You can “t and shouldn “t try to bribe the policeman that is about to write you a ticket.

– All toys are made in China.

– They call football soccer.

– In America, the English speaking country, you have to press 1 if you want to continue in English.

– American dream is not to buy a house, but to have money for downpayment for a house.

– These to block is a safe area to live, the next block is dangerous, and than it “s safe again.

– In December, you can see a Christmas tree next to Hanukah candles in every store ndash; business is business.

– Lots of people around the world do not like America because they want their country to be like America.

– If you want to turn a friend into an enemy, lend him money.

– People are the same in every country, but Americans are lucky to be born in the society and smart enough to maintain the society that is very close to the needs of a regular Joe.

– The best quote ever( by Henry Ford): “If you think you can do a thing or think you can ‘t do a thing, you ‘re right “.

I travel a lot and have seen places were I “d like to live for a year or so, but overall, the USA is the best country for me. What a country!

A bunch of Flex Builder plugins is almost ready

I wanted to take a moment and share with you what ‘s cooking in the secret underground labs of Farata Systems. We are about to release Beta versions of several commercial plugins for Flex Builder, namely: Flex2Ant, Logger, DaoFlex, Flex2Doc and FlexBI. In this blog I ‘ll show you some screenshots from the first three.

1. Flex2Ant

This plugin will automatically create an Ant build file from your Flex Builder project. Just right-click on your project ‘s name and select the option Generate Ant build file:

In a couple of seconds you ‘ll find two new files in your project – flex2ant-build.xml and flex2ant-config.xml:

Now, either right-click on the build file and perform the Ant build as shown below, or do it from a command line. Easy.

2. The Logger

Not only you do not need to depend on using trace() or running the debug version of Flash Player, production support of your enterprise Flex applications becomes a lot easier and a lot less expensive. I ‘m not even sure if Java developers accustomed to log4j have such a plugin yet? Check it out. The logger has a pluggable view panel. You don ‘t like this one, no biggie – create your own.

Our Logger plugin automatically inserts the mxml tags or ActionScript code required for logging by using hot keys shown at the right bottom corner of the screen below:

And this is my favorite part. Visualize myself sitting with my laptop by the beach somewhere in Florida – I ‘m a proud member of the production support team for a Flex application deployed by my global client across the world. Jennifer, the user from Alaska calls me saying that there is a problem with her application in production. I ask her to press Ctrl-Shift-Backspace, which pops up the Logger panel screen shown below.

Now I ask Jennifer (the end user) to change the default level to Debug and check off a couple of check boxes by the suspicious class names. At the bottom of the screen select Remote Logging option, enter the name of the destination (in this case RemoteLoggingPrivate) and the password and to start working with her application again. The next step for me is to put my glass with Margarita aside and watch Jennifer ‘s log messages directed at the specified destination (that ‘s right, RemoteLoggingPrivate).

Oops…What ‘s this? Dear corporate production managers, please stop throwing money at us. The logger is about to enter Beta. I know, it ‘ll save you tons of money…Just give us another month or so.

3. The DaoFlex plugin

After seeing a huge success of our command line code generator utility DaoFlex for Flex and Java, we ‘ve decided to productionize it and create a Flex Builder plugin. Take a look:

Configure your database connection in the screen above in your Java project in Eclipse. This project has a pretty simple Java class, say Employee.java that includes an SQL Select statement to be used in your CRUD Flex/Java application and a couple of more tags. The server deployment parameters are configured pretty easy (it ‘s Tomcat in our sample):

DaoFlex is a part of Java compilation/code generation process like Flex that spawns “generated ” helper classes upon build to do mandane work, and this plugin will not only generate all required artifacts (Java classes, xml configuration files ActionScript and MXML), but will deploy the Java Web application under the specified server. We ran the Flex client of our CRUD Employee application right in Eclipse.

By default, DAOFlex plugin generates two sets of MXML (and configured destinations) – one if you want to use RemoteObject, and the other if you prefer to use the DataService tag. It took me longer to write this short description of DaoFlex plugin then generate the entire application.

That ‘s all for today. How much? We ‘ll announce the prices of the above components next month, but I can just say that they ‘ll be very inexpensive for individual Flex developers, more expensive for Enterprise customers, but still cheaper than purchasing a Flex Builder license.

A blog on Flex2Doc – plugin and community site for documentation generator/context search on Flex projects from IDE/Eclipse help generator is coming tomorrow. And I can ‘t wait till February, when we ‘ll start showing off our most advanced reporting designer/databound control editor FlexBI.

What an iPhone and a pretty girl have in common

I ‘ve heard about iPhone from my twelve year old son shortly after Steve Jobs had announced it. My son already wants it badly for his next birthday. He ‘s planning to save money…

The iPhone is probably the topic of the week in the blogosphere, and every blog has the same title, “O man, it ‘s so cool, I want it now “. I am a blogger too, and will join the crowd, but the title of my blog is a bit different. If you spent this week in the rain forest, deep in the coal mine, or in Turkmenistan, where only about 300 people have access to the Internet , you may not know that iPhone is a little thingy of the size of iPod that combines the iPod, cell phone with no keys, and an Internet browser. The software runs under the OS X system.

Steve Jobs did an amazing job with iPod and wants to pull it off again. Those people who had a chance to play with it often say “It feels amazing in your hand “. From a practical point of view, it may not make much sense to pay $600 for an advanced iPod with only 8Gb of space, and a phone services by Cingular, but I ‘m sure people will be camping out for several days by the stores when THE DATE will be announced. These annoying guys from Cisco sue Apple over the iPhone name , but Steve will give them some cash to make them happy.

And the reason is simple. People like nice looking and fashionable things, regardless of if it makes practical sense or not.

I see a clear analogy between why people will buy iPhone and why men like to date and marry pretty women. She looks so beautiful, everyone turn their heads when they see us, she ‘s blond, long legs, and she feels amazing in your hands…From the functional perspective she ‘s not the best choice – I ‘ve already hired a housekeeper and we are ordering Chinese or pizza every other day, but who cares – when I come home from work I ‘ll see her sitting on the couch in front of the TV in this mini skirt after visiting a beauty salon… She ‘s smiling at me….She ‘s ready whenever I am…And she ‘s mine…I ‘m in control…I ‘m the man!

That ‘s why people will go and purchase this pretty thing called iPhone. It does not matter that you ‘ll need to take a second mortgage on the house to get it – your bank offers installments… You want it, and you want it now. Consume!