Thursday, September 27, 2007

To AJAX or Not to AJAX? That is the question!

When faced with a new web project these days you typically hear the clients listing AJAX as one of the must haves in their brand new web application. Pretty cool as you might be accustomed yourself to AJAX to the extent that you can hardly imagine returning back to the page reload per click days. But, if you are more sensible (or better yet, your clients are so) you would think twice before entirely abandoning the normal site browsing model for an AJAX based one.


Why? I hear you say. Many reasons, including the fact that we live in the early 21st century, where – get ready for this – not all Internet access devices are equipped with state of the art browsers that can consume your AJAX interfaces or whatever Javascript or CSS magic you throw at them. Many mobile phones (millions to say the least) can hardly parse plain old HTML, some can do CSS but not Javascript


Ok, you tell me. “I will have to do two versions, one that is full of AJAX effects and one old boring HTML only version.” STOP IT, I say, you can't be more wrong. Thank God there could be more elegant solutions to the problem than just writing another application around the same database. I present to you my humble take on the problem. Using the Ruby on Rails Framework (you can apply similar thoughts in other frameworks if you like, and many ideas can be copied easily as they only involve Javascript)

First off, the controllers. The controllers are responsible for receiving requests and sending responses. What we need to do is make them intelligent enough to understand different types of requests and respond accordingly. This is done using Rails magical method “respond_to”

class IssuesController < ApplicationController
def index
...
respond_to do |format|
format.html { # do something }
format.js { # do another thing }
format.json { # and another thing }
format.xml { # ok, enough }
end
end
...
end

In the above example we see that each format will have a different response. This is great for a start, that way we can implement slightly varying responses for the AJAX and the none AJAX calls. To make things easier on us we will implement a very simple case of AJAX. Each rhtml view is rendered in a DIV tag within an rhtml layout. In the none AJAX model, pages are rendered by rendering both the layout and the inner view. In the AJAX model, only the inner view is rendered and is sent back to the browser to replace whatever resides in the content DIV.

So, our controllers will work as follows:

class IssuesController < ApplicationController
def index
...
respond_to do |format|
format.html # will render index.rhtml
format.js { render :layout => false }
# the above line will render index.rhtml but without the layout
end
end
...
end

The above lines made our controller ready to respond to normal or AJAX requests (given that AJAX requests will have the .js format). In the former case it will return back the whole page but in the latter it will omit rendering the layout and only send the content.

Ok, but what we still need two views. I hear you, and fear not, you will have to change nothing. Actually it's only a trivia to adapt your views to this model. Let's see how this can be done.

Here's a normal view code sample, and pardon me, I won't use the link_to helper method for clarity purposes:

...
<div id=”content”>
...
<ul>
<li><a href=”url1”>Link1</a></li>
<li><a href=”url2”>Link2</a></li>
<li><a href=”url3”>Link3</a></li>
</ul>
...
<form target=”url4”>
...
<input type=”submit”>
</form>
...
</div>
...

The above fragment shows a list of links and a form. All should behave in the normal way and reload the page when clicked. Now let's imagine that the user is using a Javascript capable browser. What effect could this coming fragment have on his experience?


<!-- Warning, this fragment requires prototype.js -->
<script>
function ajaxifyLinks(){
// check if there is AJAX support
if(!Ajax.getTransport())return false;
// loop on all links
$$('a').each(function(link){
// attach an event observer to each link's 'onclick' event
Event.observe(link, 'click', function(event){
// call the original url (with .js added) with AJAX
new Ajax.Updater('content',link.href+”.js”);
// stop the browser from following the link
return false;
});
});
// loop on all forms
$$('form').each(function(form){
// attach an event observer to each form's 'onsubmit' event
Event.observe(form, 'submit', function(event){
// send the form contents via AJAX
new Ajax.Updater('content',form.action+”.js”,
{params:Form.serialize(form),
method:'post'});
// stop the browser from submitting the form
return false;
});
});
}
</script>

The above code will transform EVERY link and form in the page to AJAX, that is, in case that the browser supports both Javascript and AJAX. Otherwise links and forms will remain untouched and they will behave as usual.

Of course this is a minimalistic example. We knowingly avoided touching on any special case but, in another installment of this article we will get more intimate with the subject and may be we can handle more aggressive ... techniques!

Sunday, July 22, 2007

Zimbra, violating Open Source terms

Not all pretenders are Open source... This is true for zimbra at least which claims it is open source, but actually I see everythg they r doing is against open source. check this for detailed discussion abt zimbra as open source.
I am still in my battle field working on Zimbra.
We upgraded to the new zimbra version now....
In this new version I found sthg in the code that made my nerves; all variables are written in this format "_158", "_140".
I found this hilarious...

Tuesday, July 17, 2007

Java vs. C++ - Part Two

These are some more differences between Java and C++.

JavaC++
Class attributes and behaviors Attributes are "instance variables".
Behaviors are "methods"
Attributes are "data members".
Behaviors are "member functions"
Extending Class Object Every class is a subclass of Object and so inherits the 11 methods defined by class object, you never create a class from scratch. Even if a class doesn't explicitly use extends in its definition, it implicitly extends Object You can create classes from scratch. A class will inherit attributes and behaviors of a base class ONLY when its declaration explicitly implies that it should.
Packages Every class belongs to a package even if not explicitly specified it will be the default package ( the current directory ) Classes do not have packages. Their containing header files are simply included in source files in which they are to be used
Constructor name Methods other than the constructor of a class ARE ALLOWED to have the same name as the class AND to specify return types but these are not constructors and won't be called when an object is created. It is NOT ALLOWED for any member function other than the constructor to have the same name as the class name AND it is INVALID to specify a return type for any constructor.
Initializing attributes Instance variables CAN be initialized where they are declared IN THE CLASS BODY, by the class's constructor, or they can be assigned values by "set" methods. Instance variables that are not explicitly initialized by the programmer are initialized by the compiler (primitive numeric variables are set to 0, booleans are set to false and references are set to null). Data members can be initialized ONLY by the class's constructor, or they can be assigned values by "set" methods. Instance variables that are not explicitly initialized by the programmer are NOT automatically initialized (they will have whatever values that happened to be stored in their allocated memory space).
Accessing hidden attributes An instance variable hidden by a local variable (having the same name) can be accessed in a method by:
this.variableName
(this is a reference to the current object)
Such a hidden data member can be accessed in the member function by:
ClassName::variableName
or
this->variableName
(this here is a pointer to the current object)
Access modifiers Each instance variable or method declaration in a Class definition must be preceded by an access modifier. Access modifiers are followed by a colon and apply to all following member declarations until overridden by another access modifier. If they were omitted they are implicitly applied by the compiler:
for classes: members are private by default.
for structs: members are public by default.
Package access Members that have no access modifier preceding their declaration are accessible to all the classes included in the same package. Members are either public or private and the only way that another class could access a non-public member of a different class is by inheritance of protected members or by being declared as a friend class of that class.
Memory leaks Are less likely to occur because Java performs automatic garbage collection to help return memory back to the system. When an object is no longer used in a program ( there are no references to the object e.g. if null was assigned to the objects reference ) it is marked for garbage collection. Before the garbage collector returns memory resources to the system it calls the finalize method of the object to be destroyed. Are common because memory is not automatically reclaimed to the system it is the programmer's responsibility to do that himself by freeing the memory in the Class destructor when its task is over.
Multiple inheritance Is not supported but interfaces are supported that allow a class to acquire multiple functionalities from any number of interfaces Is supported.
Over-ridden superclass methods Can be accessed from the subclass by:
super.methodName();
Such an over-ridden base-class member function can be accessed by the derived class by:
BaseClassName::functionName();
Calling superclass constructor To explicitly call the superclass Parent constructor from the subclass Child constructor:
public Child( int a, int b )
{
super( a );
x = b;
}
The calling statement must be the first statement in the subclass constructor
To do the same thing here it goes like this:
Child( int a, int b )
: Parent( a )
{
x = b;
}
here we use the member initializer ( : ) to call the Parent constructor before the body of the constructor is executed
Polymorphism and dynamic binding Applies automatically.
When a reference to a subclass object is assigned to a superclass reference which is then used to invoke a superclass method that is overridden in the subclass definition the java compiler only checks that the class of the reference really has that method and the java interpreter calls the method of the actual data type of the object at execution time.
Does NOT apply automatically.
When a pointer to a derived-class object is assigned to a base-class pointer which is then used to invoke a base-class member function that is overridden in the derived class definition the compiler treats the object exactly as an object of the base-class and the base-class member function is called for the object. This is overcome by declaring the function to be a vertual one and in this case the compiler generates code that would at run time access the appropriate version of the function for the actual object's data type.
final methods and final classes

A method that is declared final cannot be overridden in a subclass.

A class that is declared final cannot be a superclass( cannot have subclasses).

Does not have an equivalent in C++
const functions Java has no equivalent for C++'s const functions A member function can be declared as const, indicating that calling that member function does not change the object.
Abstract classes Are declared by using abstract and have one or more abstract mehtods
public abstract ClassName {
private int instanceVariable;
public int someMethod1()....
public void someMethod2()...
public abstract int method();
//abstract method
}
Must have one or more pure virtual functions
class ClassName {
public:
virtual int someFunction1()...
virtual int someFunction2()...
virtual int function() = 0;
// pure virtual funtion
private:
int dataMember;
...
};
GUI support Normally has packages that support frames, windows, Graphical User Interface components. Does not normally support them. Appropriate third party libraries must be obtained to offer their support.

Saturday, June 30, 2007

The fall of MS fan

For most of life, I have been a Microsoft user. I wasn't a MS' fan. But I didn't find it not so bad working on Window, and it was fair enough for me, although it is not perfect.

I had great passion to try the Vista out, the long delayed version, 6 years or sthg. We all read abt it for many years, and how much it will be sthg fascinating and a new..bla..bla..bla
When I tried it on my PC, i was expecting sthg that could dazzle me.

finally, I got Vista business. I was totally wrong, I regret the day i installed Vista.

well, it is beautiful, the 3-D desktop switcher looks nice.
I faced many problems with Drivers. the problem is not that they r not verified by Vista. the problem that from time to time, I had to redefine the drivers.
my network card kept to be disconnected. I couldn't stay online for couple of hours. the stupid thing that when it disconnects, i have to press by myself "diagnose and repair" then should press "get a new IP" to ask the Vista to get another IP. What is this stupidity!!! didn't I define that already in the connection properties!! the answer to that question is the "ALLOW" :))
If u run sthg on vista, and precipitate away from ur PC, don't expect it is working.

u should wait because u will have to answer "Continue with getting a new IP?", "continue with opening this executable file"..etc I really hate this stupid thg in vista. i don't think i have to press 3 clickes just to run exe file..

The gadgets are terrible, I have never turned them on. they are not innovative and poor.

fighting to have a network connection really annoyed me.
this Vista eats the processor and the Memory. it slows down ur PC. without any tasks running ur RAM usage can be 512 MB. to use a PC now, u have to add $X to buy extra RAM for the Vista and $Y extra to more powerful processor, don't forget that u will pay for the Vista too :)
Vista price is too high. despite the license price is the almost the same since many old versions of windows, it is too high comparing with HW costs these days. Windows license can exceed 20% of ur costs!!!!

the only thg that may keep windows alive is that majority of mobile tools need windows to sync, and some softwares are not still available for MACs.

anyway, I didn't like the Vista thg.
Not friendly, no performance, no stability...nothing.

Thursday, June 28, 2007

Improve your Company using Workflow System

Work flow,
Business Process Management,
Business Process Modeling,
Methodologies,
Work Procedures

All these related words can come together to build an understandable vision of the workflow system.

The Business Process is a group of logically related tasks that come together to form a methodology to implement work procedures.
So companies try to automate these procedures using a workflow system to gain its benefits.

You can find more about workflow here.

So why do we need workflow system?
Some of the benefits we can get by using workflow can be briefed by the following

  • Improved efficiency - automation of many business processes results in the elimination of many unnecessary steps
  • Better process control - improved management of business processes achieved through standardizing working methods and the availability of audit trails
  • Improved customer service – consistency in the processes leads to greater predictability in levels of response to customers
  • Flexibility – software control over processes enables their re-design in line with changing business needs
  • Business process improvement - focus on business processes leads to their streamlining and simplification

How to implement a workflow system for our company?

Well, Thanks god we didn't have to pay for a license to build a system using Microsoft workflow foundation.

We have JBPM (Java Business process management) which is a flexible, extensible workflow management system build on Java and it is an Open source project.

A lot of open source projects are developed like (Open Business Engine The Open for Business Workflow Engine OpenWFE WfMOpen XFlow Micro-Flow JFlower YAWL Zebra Apache Agila Antflow Beexee Dalma Swish etc...)

I believe that RunaWFE is one of the best.

RUNA WFE is an environment for JBoss jBPM workflow engine.
It is a cross-platform end user solution for business process development and execution.

Together RUNA WFE and JBoss jBPM provide an easy to use business process management system.

RUNA WFE provides:

  • an end user GUI to define business processes without any coding: draw flowcharts, define roles and variables, lay out forms
  • an end user GUI to load and execute processes
  • an administrative interface to create and remove users/groups and grant rights
  • a possibility of writing automatic "bots" that can participate in business processes
  • a possibility to code new GUI elements, variable types, organizational structure functions etc. that extend existing RUNA WFE components and will be available to end users through the GUI

Then How to integrate our workflow system with other software?

Integrating RunaWFE with MySQL Database:

Simply, do the following steps:

  1. Add The File mysqldb-ds.xml to your jboss deploy folder "server\default\deploy".
  1. In server\default\conf\hibernate.cfg.xml Change

connection.datasource = java:/MYSQLDS
Dialect = net.sf.hibernate.dialect.MySQLDialect

  1. Important Note : Don't forget to add "com.mysql.jdbc.Driver" to your library This is done by adding "mysql-connector-java-3.1.14.jar" to the lib Folder.

Integrating RunaWFE with LDAP:

Unfortunately integrating RunaWFE with LDAP can be done to a certain level,

In any workflow system you have to define your users, their groups and also their permissions and Roles.

So you can authenticate through LDAP but you still has to add your ldap users in your workflow system so you can define their groups and Roles.

So what we will do now is to authenticate using our LDAP and also import our LDAP users into RunaWFE to manage their groups, Permissions and Roles.

Fortunately RunaWFE helps us in doing both the importing and the authentication.

To Add LDAP Authentication To RunaWFE Do the Following:

  1. Add the LDAPPasswordLoginModule to src\af\logic\ru\runa\af\authentication
public boolean login() throws LoginException {  

SERVER_URL= LDAPImporterResources.getServerURL();

if (callbackHandler == null)

throw new LoginException("No CallbackHandler provided.");

Callback[] callbacks = new Callback[2];

callbacks[0] = new NameCallback("actor name: ");

callbacks[1] = new PasswordCallback("password: ", false);

ExecutorDAO executorDAO = null;

try {

callbackHandler.handle(callbacks);

String actorName = ((NameCallback) callbacks[0]).getName();

if (actorName == null)

throw new LoginException("No actor name was provided.");

char[] tmpPasswordChars = ((PasswordCallback) callbacks[1]).getPassword();

if ((tmpPasswordChars == null) || (tmpPasswordChars.length == 0))

throw new LoginException("No password was provided.");

String password = new String(tmpPasswordChars);

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.ldap.LdapCtxFactory");

env.put(Context.PROVIDER_URL, SERVER_URL);

env.put(Context.SECURITY_AUTHENTICATION, "simple");

env.put(Context.SECURITY_PRINCIPAL, "uid="+ actorName +

",ou=people,"+ LDAPImporterResources.getDC());

env.put(Context.SECURITY_CREDENTIALS, password);

DirContext ctx = new InitialDirContext(env);

ctx.close();

executorDAO = DAOFactory.getInstance().createExecutorDAO();

actor = executorDAO.getActorCaseInsensitive(actorName);

succeeded = true;

return succeeded;

} catch (IOException e) {

throw new LoginException(e.toString());

} catch (UnsupportedCallbackException e) {

throw new LoginException(e.getMessage());

} catch (NamingException e) {

throw new LoginException(e.getMessage());

} catch (InternalApplicationException e) {

throw new LoginException(e.getMessage());

} catch (ExecutorOutOfDateException e) {

throw new LoginException(e.getMessage());

} catch (RuntimeException e) {

throw new LoginException(e.getMessage());

} finally {

try {

DAOHelper.close(executorDAO, true);

} catch (InternalApplicationException e) {

throw new LoginException(e.getMessage());

}

}

}

  1. Modify the LDAP importer Configuration File ldap-importer.properties in server/conf to point to your LDAP server.
  2. Change login-module.properties in server/conf to the LDAPPasswordLoginModule.

#ru.runa.af.authenticaion.NTLMLoginModule=SUFFICIENT
#ru.runa.af.authenticaion.InternalDBPasswordLoginModule=SUFFICIENT
#ru.runa.af.authenticaion.ADPasswordLoginModule=SUFFICIENT
#ru.runa.af.authenticaion.KerberosLoginModule=SUFFICIENT
ru.runa.af.authenticaion.LDAPPasswordLoginModule
=SUFFICIENT

  1. You have to modify some constant variable in class LDAPImporter to accommodate with your LDAP settings.
private static final String OBJECT_CLASS_ATTR_USER_VALUE = "user";
private static final String DISPLAY_NAME = "name";
  1. Run the LDAP importer Tool which will import your users to the ldap users group in the Executors list of Runa.
  2. If you changed the Administrator login password don't forget to change it in the LDAPimporter script.

Finally to create your own processes you can use the Graphical Process Designer which helps design your processes in a very simple way.

Enjoy your Automated Workflow System and your process improvement.

Java vs. C++ - Part One

These are only some of the differences between Java and C++ that I found so far that drew my attention and I think are worth mentioning.

JavaC++
Compiling source codeWhen we compile a source file a .class file is generated in java byte-codes ( machine independent = portability ) that is not translated into machine language instructions until in the run time when interpreted by the Java Virtual Machine
( machine dependent ).
A source file is compiled and linked to produce an .exe file in machine language that is ready to be executed when the file is loaded into memory and run by the operating system.
Function definitions All function definitions and variable declarations are inside Classes even main(). Nothing is allowed to be outside a class except imports and package names.Function definitions are outside class definitions. They have prototypes whose place decides function scope
Including classesImporting a package.* just directs the compiler to the location of classes used in the code so that only these classes are included not the whole package. while in C++ I think that including a header file means that all classes in that header file will be compiled and linked to the source file.
Ending class definitionsClass definitions end with } without a semicolon.Class definitions end with };
Creating objectsAll objects must be created with new, so they are all dynamically allocated in the heap.
Only primitive data types can be allocated on the stack.
Objects can also be created and allocated without new so they are put on the stack in the scope of their declaration.
Declaring a reference:Declaring a reference to an object without using new to allocate the object only reserves space for the reference and no object is created in memory until new is used and the resulting object is given to the reference to point to it.Declaring an object without initializing it makes the compiler call the default constructor for the object's class and memory is allocated for the object in the stack.
Calling static methodsClassName.methodName( args.. );ClassName::functionName( args.. );
or ObjectName.functionName( args..);
Wrapper classesJava has wrapper classes for primitive data types that contains static methods for handling them
e.g. String string = Integer.toString( intVariable );
C++ doesn't normally have them in its standard libraries
Array declaration and memory allocation:An array is considered an object that has to be allocated by new.
   int c[];

declares the array reference

   c = new int[ 12 ];

allocates the array and automatically initialize its elements to zero for numeric primitive types, false for boolean, null for references ( non-primitive types)
or

   int c[] = new int[ 12 ];
// in one step

you can never specify the number of elements in the [] in a declaration unlike C++.

For multiple array declarations:

   double a[], b[];        

a = new double[ 100 ];
b = new double[ 27 ];

or

double a[] = new double[ 100 ],
b[] = new double[ 27 ];
or
double[] a, b;

a = new double[ 100 ];
b = new double[ 27 ];

or

double[] a = new double[ 100 ],
b = new double[ 27 ];

Elements of an array of a primitive data type contain values of that data type.
While elements of an array of a non-primitive data type contian "references" to objects of that data type.

( they have the value null by default )

Allocating and initializing arrays in declarations:

   int n[] = { 32, 27, 64, 18, 95,
14, 90, 70, 60, 37 };
// initializer list

Array size is determined by the number of elements in the list. Here new operator is provided by the compiler and the array object is also dynamically allocated.

When a Java program is executed. the Java interpreter checks array element subscripts to be sure they are valid. If there is an invalid subscript, Java generates an exception: ArrayIndexOutOfBoundsException.

   int c[ 12 ];

declares and allocated memory for 12 int elements without initializing them also memory is not dynamically allocated but instead it is preserved from the start and is allocated in the stack I presume.
For multiple array declaration:

   double a[ 100 ],
b[ 27 ];

Elements of an array of any data type contain values or objects of that data type.
Objects for which an array can be declared must have a default constructor to be called for every element when the array is declared.

initializing arrays in declarations:

   int n[ 10 ] = { 0 };

initialize elements of array n to 0

   int n[] = { 1, 2, 3, 4, 5 };

array size determined by the number of elements in the list

No checking for array bounds is done by the compiler so the programmer must be very carful not to exceed the array length

Multiple subscripted arrays

Doesn't directly support multiple-subscripted arrays but allows the programmer to specify single-subscripted arrays whose elements are also single-subscripted arrays, achieving the same effect.
i.e. arrays of arrays:

   int b[][] = { { 1, 2 },
{ 3, 4, 5 } };

b[ 0 ] is a reference to an array of 2 elements
b[ 1 ] is a reference to an array of 3 elements

   int b[][];
b = new int[ 3 ][ 3 ];

3 by 3 array allocated

   int b[][];
b = new int[ 2 ][];

allocates rows

   b[ 0 ] = new int[ 5 ];

allocates columns for row 0

   b[ 1 ] = new int[ 3 ];

allocates columns for row 1

Directly supports multiple-subscripted arrays and their elements are placed consecutively in memory row after row and the elements are actually located by pointer arithmetic.

   int b[][] = { { 1, 2 },
{ 3, 4, 5 } };

causes an error in C++ "error: declaration of 'b' as multidimensional array must have bounds for all dimensions except the first."

   int b[][ 3 ] = { { 1, 2 },
{ 3, 4, 5 } };

declares and preserves memory for a 2 by 3 multidimensional array b and initializes missing element in the list b[ 0 ][ 2 ] by 0.

Passing arguments

Java does not allow the programmer to decide whether to pass an argument call-by-value or call-by-reference:
Primitive data type variables are always passed call-by-value.
Objects are not passed to methods; references to objects are passed
(call-by-value just like pointers in C++ are) so the method can manipulate the object directly.

You can pass primitive data types or objects either call-by-value or call-by-reference ( using pointers or references to them ).

Returns

When returning information from a method via a return statement:

Primitive data type variables are always returned by value (a copy is returned).
Objects are always returned by reference - a reference to the object is returned.

Objects and primitive data type variables can be returned by value or by reference

Constant variables

Constant variables ( read only variables ) are declared using final.

They are declared using const.

Tuesday, June 19, 2007

Erlang Vs Object Oriented

I think that in the future the functional programming community will be at peak. currently I think that the functional communities are too small to beat the Java community.

the functional is easier to any person. any one can write a functional code. Erlang for example has a light VM that can make profit of multiprocessors availability. this doesn't depend on certain compiler that enables parallelism in Java or C.
if you don't care about performance, think about parallelism as simpler way to structure software in a domain where there is a lot of natural concurrency.

I read a paper "Structured Programming Using Processes" in which the author tried to prove that the Erlang was capable to support a personal accounting software application. Maybe you can take a look to it later.

also, I like to point to Yaws, Yaws is a HTTP high performance 1.1 webserver particularly well suited for dynamic-content webapplications. I ma really amazed by its performance.

well, but why Erlang is not widely used till now?
Well the world likes Java. the type safe language. Security in distributed Erlang is “all or nothing,” so when a node is authenticated to another, it can perform any operation.
process isolation is not complete, a process can flood another process with messages, or it can steal all the CPU cycles by entering into an infinite loop.