Showing posts with label flex. Show all posts
Showing posts with label flex. Show all posts

Sunday, August 19, 2012

Wikibrains migration to a non-flash site

A few days ago, we had a long hard talk about the future UI technology of Wikibrains. We were debating two technologies for implementing the Wikibrains graph (mind map) editor.
On the one hand, we have invested countless hours in the Adobe Flex (AKA Flash) based editor, while on the other hand, thoughts about migrating to a much lighter and brisk implementation in HTML/Javascriupt.

The first step we took was to check out the feasibility and reaction of people to the new option, but implementing a read only version of the graph view in our social sharing landing page.

It took about a day and a half to convert a JavaScript tree view by Kenneth to a graph view and making it ready for the Wikibrains graph data injection.

Once published, the reaction to the sharing page was phenomenal, and its popularity almost matched the index page.

Faster to load and better UI performance made us decide to use this structure as the next step in our editors development. not to mention the fact that it works on mobile platforms without any extra effort.

JavaScript came a log way the past years in terms of rendering engines on browsers and the results is easily noticeable in the event management and motion  rendering. And I guess, that practically made the decision for us.

So long Flex.



Friday, October 29, 2010

Multilingual Support for Flex

Some Cowboy coding techniques for supporting multilingual flex interfaces:
Instead of the usual form (from an Adobe development center post):
...text="{resourceManager.getString('resources', 'POSTDISPLAY_POST_TITLE')}"...
My label looks like:
...text="{gS['POSTDISPLAY_POST_TITLE']}"...
Which is so much shorter and nicer to read when you are coding.

The gS is actually a static object (i.e. hash map) that I load with all the key:value pairs of the language.
Once you declare gS as [Bindable] you can replace the object at runtime with other languages, resulting with the replacement of all the strings in the application.

Note: the compiler issues a warning that since you are using square brackets, the GUI object will not be able to detect changes in the data source. Well, it does.

Independent on Sundays




Sunday, October 24, 2010

AAdmin - Flex on Rails Agile Admin Application

The AAdmin is a little project I'm developing on the side, for Valueshine which in essence is a fast Administration Application based on a Ruby on Rails back-end and a Flex Web front-end.

I love fast development mainly because I'm a lazy son of a batch file and for some reason, I feel that Ruby and Rails was made just for people like me.

Having a server side application that 70% of its tasks sum up to persistence functionality just screamed scaffolding to me. the only obvious difference is that for the sake of using a flex client, i would have to skip over the default view machinery, that are generated by the rails scaffold.

Pre Programming:
I've created the alternative controller template so scaffolding command would generate an XML based web service.
to match that I've written an ActionScript client side that talks CRUD on the one side and hands out a set of a-sync methods on the other side.

The application, is based on the two elements described above, let me have a RoR restful web services that would accommodate a rich client.

The server:
I have employed a standard scaffold script generation with a tweak to the controller template. this change bypasses the standard view that is created by Rails to relay on pure XML rendering.
there is one extra controller that is utilized for configuration data purpose. I use it for authentication, and to extract the entities structure xml file.

The Client:
This part is where the quick admin app comes to play. the AAdmin client enables all CRUD functionality on a list of entities, predefined in an entity xml.
the client logs in, extracts the entity xml file, and presents the table structure and functionality according to the definitional in the file.

Screen shoots:
AAdmin Login Screen.

The CRUD Data View

The Create and Edit screen















Resources:

Wednesday, October 20, 2010

Flex for Rails Scaffolding (cont) - the controller template

I've made a little improvement  to my development process, in such a way that the scaffolding i do for creating the web services I later use for my flex client are generated in their final form without the need to adjust them.
What i did was make some changes to the controller scaffold template.
The controller.rb template file is located at: [Ruby Home]\lib\ruby\gems\1.8\gems\rails-2.3.4\lib\rails_generator\generators\components\scaffold\templates

Backup the original (or pick it up from here).
Download the modified template


The Template should end up looking like:

class <%= controller_class_name %>Controller < ApplicationController
  # GET /<%= table_name %>
  # GET /<%= table_name %>.xml
  def index
    @<%= file_name %> = <%= class_name %>.all
   render :xml => @<%= file_name %>
  end

  # GET /<%= table_name %>/1
  # GET /<%= table_name %>/1.xml
  def show
    @<%= file_name %> = <%= class_name %>.find(params[:id])
    render :xml => @<%= file_name %>
  end

  # GET /<%= table_name %>/new
  # GET /<%= table_name %>/new.xml
  def new
   @<%= file_name %> = <%= class_name %>.new
   render :xml => @<%= file_name %>
  end

  # GET /<%= table_name %>/1/edit
  def edit
    @<%= file_name %> = <%= class_name %>.find(params[:id])
   render :xml => @<%= file_name %>
  end

  # POST /<%= table_name %>
  # POST /<%= table_name %>.xml
  def create
    @<%= file_name %> = <%= class_name %>.new(params[:<%= file_name %>])
    if @<%= file_name %>.save
      render :xml => {:notice => '<%= class_name %> was successfully created.'}
    else
      render :xml => {:notice => @<%= file_name %>.errors}
    end
  end

  # PUT /<%= table_name %>/1
  # PUT /<%= table_name %>/1.xml
  def update
    @<%= file_name %> = <%= class_name %>.find(params[:id])

    if <%= file_name %>.update_attributes(params[:<%= file_name %>])
      render :xml => {:notice => '<%= class_name %> was successfully updated.'}
    else
      render :xml => {:notice => @<%= file_name %>.errors}
    end
  end

  # DELETE /<%= table_name %>/1
  # DELETE /<%= table_name %>/1.xml
  def destroy
    @<%= file_name %> = <%= class_name %>.find(params[:id])
    @<%= file_name %>.destroy

    render :xml => {:notice => '<%= class_name %> was successfully deleted.'}
  end
end

Friday, September 24, 2010

Flex For Rails Scaffold

I’ve written a little component for connecting flex with rails scaffold as close as possible.

Step 1: Create a scaffold for Card

Within your rails application run the script:
./script/generate scaffold card id:integer timeStamp:timestamp data:text

(data types with Ruby and mySQL)


Step 2: Change the Card controller


Edit the Card Controller found at: myApp/app/controllers/cards_controller.rb and remove all view elements. this will make the controller omit pure XML structures


should result with the controller looking like:


class CardsController < ApplicationController
  # GET /cards
  # GET /cards.xml
  def index
    @cards = Card.all
    render :xml => @cards
  end

  # GET /cards/1
  # GET /cards/1.xml
  def show
    @card = Card.find(params[:id])
    render :xml => @card
  end


  # GET /cards/new
  # GET /cards/new.xml
  def new
    @card = Card.new
    render :xml => @card
  end


  # GET /cards/1/edit
  def edit
    @card = Card.find(params[:id])
    render :xml => @card
  end


  # POST /cards
  # POST /cards.xml
  def create
    @card = Card.new(params[:card])
    if @card.save
      render :xml => {:notice => 'Card was successfully updated.'}
    else
      render :xml => {:notice => @card.errors}
    end

  end


  # PUT /cards/1
  # PUT /cards/1.xml
  def update
    @card = Card.find(params[:id])

    if @card.update_attributes(params[:card])
      render :xml => {:notice => 'Card was successfully updated.'}
    else
      render :xml => {:notice => @card.errors}
    end

  end


  # DELETE /cards/1
  # DELETE /cards/1.xml
  def destroy
    @card = Card.find(params[:id])
    @card.destroy
    render :xml => {:notice => 'Card was successfully updated.'}

  end
end


Step 3: Client Side


To connect to the Rails server use an intermediate adapter called ActiveResourceClient.as

For testing, use the ServiceTester.mxml


good luck

Monday, September 13, 2010

Passing a Byte Array through JSON

Its a well known issue when communicating complex structures between client and server, using the JSON encoding.
I've encountered it when attempting to transfer an encrypted Byte Array back and forth between a client and server, that communicate via JSON.

What doesn't work:
Base64 encodings and conversions to string formats

What does work:
Converting the Byte[] to a number array and back

Here is an example code in Flex (works just as well in Java / PHP / Python etc)






















Independent on Sundays

Saturday, August 14, 2010

Flex List Item Renderer Repetition

The Flex implementation of lists, data grids, and advanced data grids generate a fixed amount of item renderer components that usually match the first visible set of elements in the list.
This implementation might cause that elements in the list seem to repeat them selves once you scroll down.

This is because although the items data is different, since its display object hasn't been properly refreshed, it shows the data it has from its previous appearance.
To solve this follow these guidelines:
1. do not set data inline i.e. mx:label text="{data.text}"
2. implement the renderers updateDisplayList method to set all the data in place

that's it,
good luck

Thursday, April 1, 2010

Flex Directory Compression

Here is an example for compression and decompression of files and directories using the DEFLATE compression algorithm. 

The structure I have created for the file structure in the compressed file is arbitrary.  for each file it describes the name and data witch is a byte array of the file content. Directories do not have a data attribute, but children that recursively describe files with in.  


Download the source code here

Download the example AIR application here

 
When running the example, drag and drop a file or directory into the upper box, this will catch the link and create a compressed version of the file in the application storage directory (i.e. /AppData/Roaming/Deflator/Local Store)

To extract the file back, click on the compressed file in the list and click the extract button. This will recreate the file or directory on your desktop.




Please note: that if the original file is still on the desktop when you extract, you will have an error. so if you deflated something from the desktop, make sure you rename it before you extract

Good luck.

Friday, March 5, 2010

Protect Your Passwords! A beta release

The past month I have spent time developing a little desktop application for safe guarding web account details. This application helps in maintaining a well organized database of secret account information and free text notes, in an ordered and easy to find manner.

What makes it so safe?

This application installs on your local desktop, so the information you type into it never leaves your computer. This application encrypts everything you put into it using a high, U.S. government approved standard called AES-128 (Advanced Encryption Standard). This application uses the password you provide as part of the encryption key ensuring no one else can breach the critical information you have, unless he has your password. It’s important to remember that nothing is 100% safe, but it helps not to be the easiest pray.

This beta release includes:
· An encrypted database, using AES-128
· Managing records for web accounts, mail accounts, software registration and general notes
· Managing categories for organizing the records (including custom categories)

The next release (not a beta) will include:
· File attachments (you will be able to drag in and out files and the system will encrypt/decrypt them accordingly)
· Backups (you would be able to have temporal backups and retrieve data in case the computer got corrupted, all backups are fully protected)
· Any cool feature I get from people using it (email me for special requests: giladmanor@yahoo.com)

Installing the Protect Your Passwords! application
The installation process is very simple; and it works for all major Operating systems (i.e. windows, Mac and Linux) just follow the instructions on the badge:

To intsall this application please follow these two steps
1. Install Adobe Air
2. Download and run Protect Your Password


Or download directly and run installation manually.

 After installing you will find the following icon on your desktop:
 
Double click it, to run the application. After consenting on the disclaimer, you will be asked to enter your master password in a screen shown in figure 1

1
Figure 1: Master Password Creation.

The master password is the one password you will need to remember from now on, and better not forget. The master password is used as the key for the encryption of the file containing all the vital data. This means that the encryption is unique to you. The master password registration screen requires you to enter a password of a certain minimum length. While typing your master password the password strength indicator will let you know who safe your password is.

Using the application
Once the master password is entered, the next time you open this application you will be asked to enter your master password in order to unlock the application, see figure 2.

2
Figure 2: the login screen

Failing to provide the correct password for over 4 times locks the application, as displayed in figure 3. The reason for this is to make life harder for hackers using automation software to try and guess your password.

3
Figure 3: a locked application, no further attempts are allowed until the application is restarted

Important note: If you forget your master password, there is no way to retrieve the data, not even me, since I will have to have the correct password to decrypt the database.

After logging in, the application dashboard is opened up, where you have shortcuts to all the important features of the application, as displayed in figure 4. 

4
Figure 4: the application dashboard

From the dashboard you can:
· Search for a protected record, the search is either by a search phrase or by category
· Create a new record
· Create your own categories, delete existing categories (deleting a category doesn’t delete the records that were related to it)
· Change your master password

Not yet in this version: the settings screen for advanced configuration

Searching for Records:
To find a record you are looking for, you may either click on the category it belongs to, or click the search records button. This will move you to the search screen displayed in figure 7.
The new record button will move you to the details screen for entering a new record, displayed in figure 6

The new category button will open up a popup for entering a label for a new category as shown in the following figure 5

5
Figure 5: creating a custom category

Removing an existing category envolves right clicking on the category you would like to remove and selecting “delete”.
Clicking the change master password button on the dashboard directs you to the master password screen as displayed in figure 1. Failing to complete this form will leave you with the previous password.
Creating a new record is done by the new record screen depicted in figure 6

6
Figure 6: creating a new record

The record form is structured from two input arias, once for standard details, as displayed in figure 6, and the other is for free text notes, which is accessible by clicking on the “Notes” bar in the bottom of the details screen.

Note that when entering a new account, the details form allows you to create a random password to use on the web account. Since you don’t have to remember the special password, it’s easier to have web accounts that are even more secure. Choose the length of password you would like to have and click on the “Generate” button to render a unique password.
For convenience, you can put the web address (URL) of the site for the web account. This is saved for later quick access but is not mandatory.
The tags have no significant use for now, but in later releases, I intend to have advanced searched and categorization according to these tags, so it might be useful to start tagging your information.
Exiting the application or this screen without clicking on the save button; will result in loss of the changes.

The search screen, as shown in figure 7 allows you to look for a particular record of information either by selecting a category, or by a search phase, or a combination of both.

7
Figure 7: the search screen

Once you found the record you were looking for, there are several functionality shortcuts you can access on the record display:
· Navigate to the web account site by clicking the label. This feature is available only if you entered a valid URL in the link filed on the details form, as shown in figure 6. If you left the field empty, then clicking on the label will open the record for editing
· Copy USER NAME to clipboard, this is available to you only if you put the user in the user field in the details form
· Copy PASSWORD to clipboard, this is available to you only if you put the user in the password field in the details form.
· The little x button is for deleting the record
· The little pencil button is for opening the record for editing

Clicking on any of the category icons on the side will automatically change the search result to include the selected category.
That’s it for now, please remember that I welcome any suggestion warmly, feel free to send your suggestions to my mail at: giladmanor@yahoo.com or by posting it as a response on this blog.

Friday, February 12, 2010

Flex AS3 Multi Treading Workaround

Its well known that the current versions of Flex (using either the flash or AIR players) do not provide support for multithreading. Everything you do is loaded on the same main thread that is running the GUI too.
This restriction means that if you have to do a dutiful task, the GUI actually stops responding to the user and  your app may even get the “Not Responding” label in the title bar while its off processing.
The way to bypass this issue is to follow two guidelines
  • Break down the big process in to smaller, manageable runs. this means that if you have a loop that each iteration is taxing, you would want to call that loop one iteration at a time.
  • Call the single iteration in a way that interlaces with the GUI refresh rate.
Here is a simple GUI component that you may place on your application, to invoke calls on some other process without hampering the responsiveness of the GUI.
The method you call by this component has to be in the nature of:
public function runFunction(data:Object):Boolean

Download zip file for AsyncThreadComponent

Usage:
Paste this on your app:
<view:AsyncThreadComponent id="asyncThread" />
When you want something to be invoked, create an object and pass the method:
asyncThread.exec(theObject.runFunction,theObject);

Independent on Sundays

Friday, December 18, 2009

The TimeLabel component

The time label component is something I slapped together to show accumulated time. Its an enhanced ActionScript3 Label with a simple API for making it tick.

Input a numeric value of time in milliseconds, and the TimeLabel will display it grouped nicely in days, hours minutes and seconds.

Invoke the time label’s start/stop to make it count seconds in any direction you like.

Untitled-1

This is the image of the TimeLabel, I surrounded with the controls that operate its API.

The API is as following:

Set and retrieve the numeric value representing time in milliseconds (note; there is no numeric validation, so its up to you):

  • function set data(value:Object):void
  • function get data():Object

Start and stop the timer:

  • function start():void
  • function stop():void

Determine if the timer goes up or down:

  • function increment():void
  • function decrement():void

download source code

Monday, August 3, 2009

Suppress mouse events on child components - Flex3

A college of mine showed me that in order to suppress mouse events on children components is by the obscure property of mouseChildren = false;

I use it when i want to catch a mouse event on a container, regardless of the component within that container that was exactly under the mouse.

There is no way under the heavens to guess this is the functionality of a property with such a name.

Thanks Liran.

Wednesday, July 1, 2009

Factory Implementation in Flex AS3

The closest thing i could find for implementing a simple factory in Flex is by using the getDefinitionByName function.

Usage:

import flash.utils.getDefinitionByName;
private static const basePath:String = "..path to implementation..";
private var a:SomeClassImp;
private var b:OtherClassImp;
public static function getRendrer(className:String):Object{
var classFullName:String = basePath+ className;
var objClass:Class = getDefinitionByName( classFullName ) as Class;
return new objClass();
}

Note: The classes that the factory is suppose to generate in run time have to be explicitly stated as var’s in the factory class. this is for the compiler to know to add them into the compilation product.


Friday, June 12, 2009

Flex MDI, Always On Top window

So how does one go about and opens an “Always On Top” window, using the FlexMDI (on flexlib)?

Sadly, I wasn’t able to find any nice solution for this problem and when such frustration comes, I resort to tricks.

My trick in this case was to wrap the MDICanvas with a class of my own, and in it I had two MDI canvases one on top of the other.

I added a nice utility method for opening a window, and according to an indicator on that method I either open it in bottom layer, or the top one; hence the “always on top”.

Not perfect, but working.


Tuesday, June 9, 2009

Flex loads with a blank screen

I'm developing some complex GUI app using the Flex builder 3 (eclipse plug in) and while i was working i suddenly got a blank screen when i ran my application.

no error was printed out in the consul. it appeared that flex was loading but wasn't loading my application.

if this happens to you too, check your code to see if you are embedding a file as XML:

[Embed(source="...data.xml")]
private static var xmlData:Class;


if you are, and the file happens to be malformed (some mistake in the XML structure) you are not going to see any error from the compiler or the runtime(!)
just a peaceful, zen like, blank page.

bugger

Monday, March 16, 2009

Flex HTTP Service result formatting

when playing around with the flex HTTPService class, i got the following error:

faultCode:Client.CouldNotDecode faultString:'Error #1090: XML parser failure: element is malformed.' faultDetail:'null'

this is because i was using the default parser (i.e. “object”) for the result digestion, while the returned value from my HTTP hit was HTML.

all this is clearly explained in the adobe documentation for the HTTPService, but not that clear from the error.

when connecting to a site or external data source with an unknown structure, its easier to analyze the incoming stream when the result format is set to “text”. this returns the stream in its raw form.

the property is set as follows:

myHTTPService.resultFormat="text";

Flex Right to Left – for the Hebrew man

here is some cowboy programming for handling the text direction in flex. i found that the simplest way is to extend the text UI component (i.e. mx:TextArea or mx:TextInput) with my own class with some instrumentation.

amazingly enough, selecting the right font family is all it takes to have the UI component type the correct order in words. the font i used was Ariel.



this.setStyle("textAlign","right");
this.setStyle("fontFamily","Arial");

it gets a little bit trickier when setting or retrieving the text from the component, so I've added a set and get methods, that crudely check for the first character. if its Hebrew, i flip the order of words.

the setter and getter look like this:



public function getText():String{
return LanguageUtil.getLocalazedText(this.text);
}

public function setText(s:String):void{
this.text = LanguageUtil.getLocalazedText(s);
}

the language utility I'm using is actually the following method:



public static function getLocalazedText(message:String) :String {
var c:int = message.charCodeAt(0);
if(c>1487 && c<1515){
var resArray:Array = message.split(" ");
var resLine:String = "";
for(var i:int = resArray.length; i>0; i--){
if(i != resArray.length){
resLine += " ";
}
resLine += resArray[i-1].toString();
}
return resLine
}else{
return message;
}
}

i haven't tested this on Mac yet. but for windows it seems to be ok.

hee haw

Tuesday, January 20, 2009

Is it a bug? Is it a plane? no.. its...

last night i found a very interesting bug while running the debugger in the flex builder (version 3)

I tries to compare an XML typed object to an empty string, don't ask me why.

the debugger was watching the expression (dataSource=="").
i then noticed that when the variable dataSource was not null, and actually contained a valid XML object; the debugger was evaluating a false result in the watcher while in the code, the result was opposite.

i caught a screen shot of this anomaly:

Sunday, January 18, 2009

The white rabbit: bugs and suggestions

current version : beta 0.2 (download)

this is what i have so far in terms of open bugs and suggestions:

unresolved bugs:
  1. project and task tree collapses whenever changed
  2. session time counter display: when changing back from monthly to session, the clock keeps showing the monthly accumulation

suggestions:
  1. "coast plus" configuration for the reports; suggested by Roy Reshef. have a configuration for adding a fixed overhead on the hour report, that would express the standard extra expenses. this is useful for freelancers that need to overload extra coasts on the hourly report. this might be implemented as a conversion to monitory terms as well.
  2. add a scheduler for tasks; suggested by Tomer Ben Arie. embed a scheduler into the project and task tree, that would allow time planning for implementation
  3. go large in enterprise mode; suggested by Ori Manor. enable networking and task legation from one user to another.
  4. oops mechanism, for backtracking in case i forget to stop the clock.
  5. floating task; enable time measurement without first determining the ownership. this is a nice feature when you are presented with a problem that you cant decide where to frame it until well into the task.
  6. task list view; a simple list like view where the user may thrown in "todo" tasks, and categorize them later.

Saturday, January 17, 2009

Follow the white rabbit




A couple of months ago, two things happened; one was that I got a project for a report wizard to do in flex. The other was the need to report on the hours I spent on it.

Learning Flex was a very nice and exciting experience. The need for precise accounting of time spent on this project made me start a side task on my little white rabbit.

The white rabbit is a simple, stand-alone application that measures time spend on each task in a project. It’s not fully automated, and relays the user to start and stop the clock.

Nevertheless, it does help keep organized and it does generate a report.

Why is it called “The white rabbit”? Because of the character from Luis Carol’s Alice in wonderland, the white rabbit fellow that runs around complaining about time or the absence of it.

So here it is. A simple tool, very easy to use, fully persisted standalone application.

The application was written using the adobe flex3 builder, and the package is installable in all windows versions and Mac OS, as long as you have flash installed (get adobe air).

The application has three aspects to it:

· The task management tool, defines a tree of accounts, projects and tasks

· The activity measurement tool, double click a task, and it starts counting the time

· And the reporting tool, temporal reports in a PDF format, ready for submission


Projects and Task tree management:

I have assembled the task tree with three entities:

· An account: represents a customer. A billed entity that would be receiving the report.

· A project: an assignment with a particular scope, one may regard this is as a directory of tasks.

· A task: a single work particle. Could be regarded as anything actually.

The only restriction I’ve set into this task tree structure is that the root of any tree has to be an account.

Figure 1: the porjects management screen

































The items in the tree, regardless of their type all have the following properties:

· A title

· A description

· Status (open or closed)

· An hour estimation

· An hour restriction (fixed price tasks)

· A deadline

Note: No field is mandatory; it’s up to the user to define the data regarded as useful.

Changing a task status (open to close and vice versa) changes its availability in the activity measurement tool. However, after closing a branch, it is still possible to generate a report on it.

The data is persisted as long as the branch is not removed from the task tree.



Timer, the activity measurements

This part of the application has a very simple concept.

The same task tree is displayed but filtered to show only the open tasks. If an element is closed, all elements on the branch underneath it are restricted from this view even if some of them are still open. This is for providing a way to shut down an entire branch without tediously closing each element by itself.

Once the desired task is visible, double click to start timer.

Figure 2: the timer, double click an element on the tree, and the clock stats ticking



















While working on a task, the application will not allow shifting to another task until an explicit stop command is set on the open session.

This is done easily enough by clicking the big stop session button in the middle of the screen.

I have a distinct dislike to having too many windows open all at once on y desktop. I would like to continue the time measurement on a task without having the white rabbit application open. So it is, that the application will continue counting up the seconds and minutes even if you close the application window.

The only way to stop the time measurement session is by explicitly clicking on the stop session button.

At this case, I open up the white rabbit, and click the stop button, the moment the timer screen appears back.

A friend suggested an ‘oops’ scenario, when I might forget to close a session while I’m off for lunch or something like that. I liked that very much and probably add that for the next release.



Reporting

The reporting aspect is the same task tree GUI viewed in previous aspects. The tree includes accounts projects and tasks, and by double clicking one of them, a dialogue appears, for setting the reports parameters.

Figure 3: the report creator, generates a PDF file according to a given template


































In this dialogue, the user selects the following:

· A report template

· May edit the report title

· Define time scope of the report by start and end dates

· Set the time aggregation for the report (resolution per session, day, month or just the bottom line)

· Set the task aggregation (either an aggregation of all the branch under the selected element, or a detailed account of each task by itself)

Once these points are set, the save button triggered the report generator and a PDF document will appear on the desktop.

Figure 4: a PDF report. Nothing fancy yet.














Installation, configuration, bugs and suggestions


The beta version of the white rabbit available free, on this link

Before starting anything, make sure that the system has an installation of the adobe air player.

Download the package, and double click it to trigger the installation sequence.

This application should install without any problems on any windows desktop platform or Mac.

When the application opens up the first time, the screen you will fist see is of the task tree.

Ease your way into the settings tab to set your personal data that would be eventually embedded into the reports to generate by the system. There is no need to do these configurations to be able to start measuring time on tasks. The minimal settings required are a single account and a single task under that.

Please feel free to pour your heard and suggest anything that comes into mind. That goes without saying to any bug you find.

To send me bug information or suggestions, you might find it useful to pop open the bug sending screen. To do that, click open the help (the question mark at the top right of any screen) and there choose the “report a bug” link button.

Figure 5: reporting a bug



















It’s a resent addition, and not fancy at all, only one attachment can be handled at a time, and there is no indication that the attachment is there (yet).

I would never mind reading how wonderful the application is and how useful you find it.

Have a jolly one.