• Enter Slide 1 Title Here

    This is slide 1 description. Go to Edit HTML of your blogger blog. Find these sentences. You can replace these sentences with your own words.

  • Enter Slide 2 Title Here

    This is slide 2 description. Go to Edit HTML of your blogger blog. Find these sentences. You can replace these sentences with your own words.

  • Enter Slide 3 Title Here

    This is slide 3 description. Go to Edit HTML of your blogger blog. Find these sentences. You can replace these sentences with your own words.

Tuesday, July 23, 2013

[Part 2] Finding Second Highest Frequent Characters using Java

Initial part of finding second highest frequency characters in a text was discussed previously and covered the scenarios where a single character is the most frequent. Since this is the continuation post of that, I strongly recommend you to read the first part before this. The intention of this second post is to cover the scenarios at which the previous program failed, specifically the scenarios where multiple characters are of the same frequencies.

Previous production codes can return only one character as the second most frequent. If there are multiple characters matching the criteria, the return type of the code most be modified to a character array. Along with that change, all the previous test cases must be modified to support the returned character array. When there are no matches, it is better to expect the code to return an empty array rather than null, so the test cases has to be modified to reflect that.

Similar to the previous post, new test cases are identified prior to writing any implementation code. While supporting these multiple character scenarios, both map based and sorting based programs are modified to satisfy the test cases. You can find those below in this post.

New Test Cases

1. shouldReturnCorrectWhenManyMostFrequentsAndOneSecondMostFrequent()
    > result should be this second most frequent character
2. shouldReturnCorrectWhenManyMostFrequentsAndManySecondMostFrequents()
    > result should be these second most frequent characters

Above two test cases along with the modified previous test cases are written as follows.
package com.digizol.puzzle;

import static java.lang.Character.valueOf;
import static org.junit.Assert.assertEquals;
import java.util.*;
import org.junit.*;

public class SecondFrequentCharactersTest {

private MapBasedFrequentCharacters sut;

@Before
public void setup() {
sut = new MapBasedFrequentCharacters();
// sut = new SortBasedFrequentCharacters();
}

@Test
public void shouldReturnCorrectWhenManyMostFrequentsAndOneSecondMostFrequent() {
// both i & c are the most frequent, y is the second most frequent
assertEquals(valueOf('y'),
valueOf(sut.getSecondMostFrequent("iiixiiyycbcccc")[0]));
}

@Test
public void shouldReturnCorrectWhenManyMostFrequentsAndManySecondMostFrequents() {
// both i & c are the most frequent, x & y are the second most frequent
char[] secondMostFrequents = sut.getSecondMostFrequent("iiixxiiyycbcccc");
assertEquals(2, secondMostFrequents.length);

List<Character> expected = new ArrayList<Character>();
expected.add('x');
expected.add('y');
for (int i = 0; i < secondMostFrequents.length; i++) {
expected.remove(Character.valueOf(secondMostFrequents[i]));
}
assertEquals(0, expected.size());
}

// previous test cases are modified as below

@Test
public void shouldReturnNullForEmptyText() {
assertEquals(0, sut.getSecondMostFrequent("").length);
}

@Test
public void shouldReturnNullForTextOfSameCharacter() {
assertEquals(0, sut.getSecondMostFrequent("dddddddd").length);
}

@Test
public void shouldReturnCorrectCharWhenTextHasTwoCharsOneBeingMostFrequent() {
assertEquals(valueOf('y'), valueOf(sut.getSecondMostFrequent("iiiiiyiiiii")[0]));
}

@Test
public void shouldReturnCorrectOneForATextWithOneBeingSecondMostFrequent() {
// most frequent is 'i', second most is 'd'
assertEquals(valueOf('d'),
valueOf(sut.getSecondMostFrequent("iaibicidieidif")[0]));
}
}

Production Code

Similar to previous post, map based solution is modified first followed by the sorting based one to satisfy all above test cases.

Map based solution

Previous map based solution had the character frequencies recorded in the map. At the 'second most frequent character' finding logic, two 'char' variables were used. With the new scenarios there are be multiple characters for both most frequents and second most frequents, so the char variables can be replaced with two lists as shown below.
package com.digizol.puzzle;

import java.util.*;
import java.util.Map.Entry;

public class MapBasedFrequentCharacters {

public char[] getSecondMostFrequent(String text) {

char[] charArray = text.toCharArray();

// calculate char frequencies
Map<Character, Integer> charFrequenciesMap = new HashMap<Character, Integer>();

// loop1
for (char c : charArray) {
int frequency = 1;
if (charFrequenciesMap.get(c) != null) {
frequency = charFrequenciesMap.get(c) + 1;
}
charFrequenciesMap.put(c, frequency);
}

int currentMostFrequency = 0;
int currentSecondMostFrequency = 0;
List<Character> mostFrequentChars = new ArrayList<Character>();
List<Character> secondMostChars = new ArrayList<Character>();

// find second most frequent char
Iterator<Entry<Character, Integer>> charFrequencies = charFrequenciesMap
.entrySet().iterator();

// loop2
while (charFrequencies.hasNext()) {
Entry<Character, Integer> entry = charFrequencies.next();

char currentChar = entry.getKey();
int frequency = entry.getValue();

if (frequency > currentMostFrequency) {
secondMostChars.clear();
secondMostChars.addAll(mostFrequentChars);
mostFrequentChars.clear();
mostFrequentChars.add(currentChar);
currentSecondMostFrequency = currentMostFrequency;
currentMostFrequency = frequency;
} else if (frequency == currentMostFrequency) {
mostFrequentChars.add(currentChar);
} else if (frequency > currentSecondMostFrequency) {
secondMostChars.clear();
secondMostChars.add(currentChar);
currentSecondMostFrequency = frequency;
} else if (frequency == currentSecondMostFrequency) {
secondMostChars.add(currentChar);
}
}

char[] result = new char[secondMostChars.size()];
for (int i = 0; i < secondMostChars.size(); i++) {
result[i] = secondMostChars.get(i);
}

return result;
}
}

Sorting based solution

Previous sorting based solution had sorted the list of 'Frequency' in the descending order of frequencies; and returned the second element in the list for the second most frequent. However with the new scenarios, there can be multiple most frequent characters so the second element may contain another most frequent character. Similarly, there can be multiple 'second most frequent' elements in the list. So it is required to traverse through the list from the start and extract an array of elements with the second most frequency. Following is the modified program.
package com.digizol.puzzle;

import java.util.*;

public class SortBasedFrequentCharacters {

public char[] getSecondMostFrequent(String text) {

char[] charArray = text.toCharArray();
Arrays.sort(charArray);

List<Frequency> list = new ArrayList<Frequency>();
char previous = '\u0000';
Frequency f = null;

for (int i = 0; i < charArray.length; i++) {
char c = charArray[i];

if (i == 0 || previous != c) {
f = new Frequency(1, c);
list.add(f);
previous = c;
} else {
f.count += 1;
}
}

Collections.sort(
list,
new Comparator<Frequency>() {
public int compare(Frequency fr0, Frequency fr1) {
// sort in descending order
return fr1.count - fr0.count;
}
}
);

// supporting multiple characters being most frequent

int currentFrequency = 0;
boolean secondMostFound = false;
int start = -1;
int end = -1;
for (int i = 0; i < list.size(); i++) {
Frequency frequency = list.get(i);
if (i == 0) {
currentFrequency = frequency.count;
} else if (currentFrequency != frequency.count) {
if (secondMostFound) {
end = i;
break;
} else {
secondMostFound = true;
start = i;
end = i;
}
}
}

char values[] = null;
if (secondMostFound) {
List<Frequency> secondMostFrequencies = list
.subList(start, end + 1);
values = new char[secondMostFrequencies.size()];
for (int i = 0; i < secondMostFrequencies.size(); i++) {
values[i] = secondMostFrequencies.get(i).character;
}
} else {
values = new char[0];
}
return values;
}

private class Frequency {
int count;
char character;

public Frequency(int count, char character) {
this.count = count;
this.character = character;
}
}
}

In summary, the puzzle can be solved in many ways as shown in this series of articles. One important point to note is the use of test cases to identify the scenarios before any production code. As you may have already noticed, the same set of test cases were used to test two different implementations. If you have noticed any scenarios that are not covered here, please let me know via comments section so that I can address those.

Finding Second Highest Frequent Character in a text with Java

Finding second highest frequency character in a text is last weeks Thursdays Dzone Code Puzzle. Intention of this post is to try and work out this interview oriented problem in Java with you by explaining the way I am approaching this task. In return, both you and myself can learn through a discussion. 

The requirement is to return the character that is the second most frequent. Before writing any code, it is important to break down this requirement into a simple set of test cases. As a TDD (Test Driven Development) oriented developer, I always try to approach a problem in that manner. The most correct way would be to start with one test case and proceed with the implementation code, but for the easiness in explanation, I will show four initial test cases and production code to support that requirement. Part 2 will cover additional scenarios which this program fails to support.

Initial Test Cases

1. shouldReturnNullForEmptyText()
    > result should be null character for empty string
2. shouldReturnNullForTextOfSameCharacter()
    > result should be null character for a text with the same character since there has to be at least two different characters to have a second most frequency
3. shouldReturnCorrectCharWhenTextHasTwoCharsOneBeingMostFrequent()
    > result should be the character that is not the most frequent character
4. shouldReturnCorrectOneForATextWithOneBeingSecondMostFrequent()
    > result should be the second most frequent character

Above test cases are implemented in the following manner with JUnit4. All test cases check the equality of expected values against actual.
package com.digizol.puzzle;

import static java.lang.Character.valueOf;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;

public class SecondFrequentCharacterInitialTest {

private MapBasedFrequentCharacter sut;

@Before
public void setup() {
sut = new MapBasedFrequentCharacter();
// sut = new SortBasedFrequentCharacter();
}

@Test
public void shouldReturnNullForEmptyText() {
assertEquals(valueOf('\u0000'), valueOf(sut.getSecondMostFrequent("")));
}

@Test
public void shouldReturnNullForTextOfSameCharacter() {
assertEquals(valueOf('\u0000'), valueOf(sut.getSecondMostFrequent("dddddddd")));
}

@Test
public void shouldReturnCorrectCharWhenTextHasTwoCharsOneBeingMostFrequent() {
assertEquals(valueOf('y'), valueOf(sut.getSecondMostFrequent("iiiiiyiiiii")));
}

@Test
public void shouldReturnCorrectOneForATextWithOneBeingSecondMostFrequent() {
// most frequent is 'i', second most is 'd'
assertEquals(valueOf('d'), valueOf(sut.getSecondMostFrequent("iaibicidieidif")));
}
}

Production Code

As per the test cases, production code should have a method to take the text as an input and to return a character. One approach to solve this is to use a map to record the frequencies of each character and extract the second most frequent. Another approach is to record the character frequencies in a list, then sort by the frequency and extract the second most frequent. There is another approach to record the frequencies in an array where the array index is the integer representation of the character, but size of the character set must be known prior. In this post, both map based and sort based approaches are implemented, not the array based one.

Map based solution

In the following implementation, the characters in the text is added to a map and the frequency of those are incremented. Completed production code looks as follows.
package com.digizol.puzzle;

import java.util.*;
import java.util.Map.Entry;

public class MapBasedFrequentCharacter {

public char getSecondMostFrequent(String text) {

char[] charArray = text.toCharArray();

// calculate char frequencies
Map<Character, Integer> charFrequenciesMap = new HashMap<Character, Integer>();

// loop1
for (char c : charArray) {
int frequency = 1;
if (charFrequenciesMap.get(c) != null) {
frequency = charFrequenciesMap.get(c) + 1;
}
charFrequenciesMap.put(c, frequency);
}

int currentMostFrequency = 0;
int currentSecondMostFrequency = 0;
char mostFrequentChar = '\u0000';
char secondMostChar = '\u0000';

// find second most frequent char
Iterator<Entry<Character, Integer>> charFrequencies
= charFrequenciesMap.entrySet().iterator();
// loop2
while (charFrequencies.hasNext()) {
Entry<Character, Integer> entry = charFrequencies.next();

char currentChar = entry.getKey();
int frequency = entry.getValue();

if (frequency > currentMostFrequency) {
secondMostChar = mostFrequentChar;
currentSecondMostFrequency = currentMostFrequency;
currentMostFrequency = frequency;
mostFrequentChar = currentChar;
} else if (frequency > currentSecondMostFrequency) {
currentSecondMostFrequency = frequency;
secondMostChar = currentChar;
}
}
return secondMostChar;
}
}

Above solution uses two loops to complete the operation, and number of iterations in second loop is related to size of character set. This might be considerable if the character set is larger in size e.g: UNICODE. If that is a concern, number of iterations can be reduced by combining two loops; using the frequency recording loop itself to record the second most frequent character as well.

To check this, I did a simple test only to compare the time taken by each variation of the above program against a text with over 5 million ASCII characters (5,264,279 to be exact). As per the results, two loops based program performs slightly quicker than the other. This may be due to the small size of ASCII character set. Anyway one loop variation is not shown here since it is simple enough for you to work out.

Sorting based solution

In this approach, characters in text are chronologically ordered before starting to record the frequencies. A new type is introduced named 'Frequency' to hold the character and it's frequency. After recording the frequencies, a Comparator is used to sort the list of 'Frequency' in descending order of character frequencies to facilitate the extraction of second most frequent.
package com.digizol.puzzle;

import java.util.*;

public class SortBasedFrequentCharacter {

public char getSecondMostFrequent(String text) {

char[] charArray = text.toCharArray();
Arrays.sort(charArray);

List<Frequency> list = new ArrayList<Frequency>();
char previous = '\u0000';
Frequency f = null;

for (int i = 0; i < charArray.length; i++) {
char c = charArray[i];

if (i == 0 || previous != c) {
f = new Frequency(1, c);
list.add(f);
previous = c;
} else {
f.count = f.count + 1;
}
}

Collections.sort(
list,
new Comparator<Frequency>() {
public int compare(Frequency fr0, Frequency fr1) {
// sort in descending order
return fr1.count - fr0.count;
}
}
);

char value = '\u0000';
if (list.size() > 1) {
value = list.get(1).character;
}
return value;
}

private class Frequency {
int count;
char character;

public Frequency(int count, char character) {
this.count = count;
this.character = character;
}
}
}
Both of the above production codes are not re-factored and purposefully kept it as an exercise for you.

More Test Cases

After this initial implementation, we need to consider other test cases that belongs to the requirement. As you may have already noted, above implementation does not support the scenarios where multiple characters being of the same frequencies. As an example, following test case fails against both of the above programs.
@Test
public void shouldReturnCorrectWhenManyMostFrequentsAndOneSecondMostFrequent() {
// both i & c are the most frequent, y is the second most frequent
assertEquals(valueOf('y'), valueOf(sut.getSecondMostFrequent("iiiiiyccccc")));
}
As this article is growing in length, Part 2 covers these extra scenarios.

Thursday, July 18, 2013

Firefox: Dramatic change in release version patterns

History of Firefox starts in 2002, when a new flavor of Mozilla was released under the name Phoenix. With the release of 0.6 it was renamed as as Mozilla Firebird, but it lasted only for two releases. This most popular name "Firefox" was introduced with the 0.8 release, and it continues as of the time of this post. Initially, Firefox made a major release every two years with minor releases in between.

Two yearly
Version 0.1 - 2002
Version 1.0 - 2004
Version 2.0 - 2006
Version 3.0 - 2008

However in 2011, the release pattern completely changed which resulted in major releases within every one or two months duration as shown below.

 Monthly
 4.0 - 2011/03
 5.0 - 2011/06
 6.0 - 2011/08
 7.0 - 2011/09
 8.0 - 2011/11
 9.0 - 2011/12
10.0 - 2012/01

Particularly within first 6 months of 2013, there were 5 major releases (18.0 to 22.0).

So it is worth finding the reasons for this dramatic change in the release process. As per my understanding, this change had a direct relationship with the new comer Chrome browser in 2008. First major release of Chrome (1.0) was done few months after the Firefox 3.0 release. However in early 2010 Chrome started making major releases every few months and when Firefox 4.0 was out in 2011 March, latest Chrome release available was 10.0.

Mozilla team seems to have identified a potential problem when introducing Firefox over Chrome; release number of Chrome is way beyond Firefox (which may look as related to number years of existence by someone). So Firefox releasing pattern also seemed to follow this fact track, but the latest Firefox version 22.0 while Chrome is 30.

As a side note, I think it is worth mentioning a summary on this battle.
When Firefox was so popular in around 2006, Google funded Firefox and in return became the Firefox's default search engine. Interestingly, 2008 born Google owned Chrome became the most popular browser sending once most popular Firefox into the third position behind Internet Explorer. I personally believe Google did it perfectly, they had a great plan and won the battle well ahead where as Firefox team could not resist a lot.

Monday, July 15, 2013

Saying 'Good Bye' to my long silence...

My dear regular readers are already aware that I was away from blogging for around two years; and this post is to notify all of you that I am back, starting to share knowledge again as earlier. The only reason for my silence was my master's in Computer Science, six years after my bachelors in Computer Sciences & Engineering. As I have gained a lot of experience from the industry, I decided to improve academic foundation further; and I feel the decision was correct. During my masters, I was privileged in learning so many different subject matters like distributed computing, high performance computing, wireless networking, natural language processing. Most interestingly, I selected cryptography for my research thesis, which I love the most.

My thesis project was specially on ECC (Elliptic Curve Cryptography), and I completed it as planned. Most of these topics will be discussed in details in future posts.

New domain name



While I was engaged in master's, my previous domain name (digizol.org) expired, and someone was opportunistic enough to buy that before my renewal. The same person has put it back for sale on godaddy site for a huge price (USD8,800) due to the popularity of the blog. Eventually I moved the site to digizol.com.

However with the lose of previous domain name, site traffic went down considerably from 63,000 to 10,000 as shown in the below graph.


As my domain name is lost, some of the popular external links to my site are no longer working, and I would like to request you to notify me if you notice such.

I'd like to emphasis the importance of on-time renewal of your domain names as there are people keeping an eye on the fast growing sites.

If you are a newbie, I'd like to request you to read through some articles and consider subscribing in a suitable way like Facebook, Twitter, RSS or Email.

Thursday, June 28, 2012

Http basic authentication header: Learn with Java code sample

HTTP basic authentication with headers is one of the username & password based methods of securing access to web sites, web applications and web services. Purpose of this article is to analyze the details of this approach by explaining how to encode a pair of username & password as a basic authentication header string as well as to decode the authentication string generated from the web clients like browser or soapIU; and the example is implemented with Java.

Isn't username and password send to server?

When username and password is entered into the pop-up in Web browser (or by similar manner in other web clients) those are not send to server as they are, but send after encoding in a way that the receiving server side can decode and extract the username and password to check the validity. This encoding approach is not secure as the encryption approaches like AES.

Sample request with basic authentication header for username="Aladdin" and password="open sesame" looks as below.

GET /myweb/index.html HTTP/1.1
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Web clients create a string by concatenating the username and password with a colon (":") as username:password. Then it is encoded in base 64 and is sent to the server, so that the server can do the reverse to extract username and password.

Example Program

Code example imports a class named Imported class named org.apache.commons.codec.binary.Base64 from commons-codec-1.6 available at http://commons.apache.org/codec/download_codec.cgi. Please download it yourself and add the commons-codec-1.6.jar file to the CLASSPATH.

package org.kamal.http.basicauth;

import org.apache.commons.codec.binary.Base64;

public class HttpBasicAuthenticationHeader {

public static void main(String[] args) {

final String username = "Aladdin";
final String password = "open sesame";

System.out.println("Input\t: username [" + username + "], password [" + password + "]");

final String encodedText = createEncodedText(username, password);
System.out.println("Encoded Text : " + encodedText);

final String[] userDetails = decode(encodedText);
System.out.println("Decoded\t: username [" + userDetails[0] + "], password [" + userDetails[1] + "]");

}

private static String[] decode(final String encodedString) {
final byte[] decodedBytes = Base64.decodeBase64(encodedString.getBytes());
final String pair = new String(decodedBytes);
final String[] userDetails = pair.split(":", 2);
return userDetails;
}

private static String createEncodedText(final String username, final String password) {
final String pair = username + ":" + password;
final byte[] encodedBytes = Base64.encodeBase64(pair.getBytes());
return new String(encodedBytes);
}

Output of the program:

Input : username [Aladdin], password [open sesame]
Encoded Text : QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Decoded : username [Aladdin], password [open sesame]

As you can see the above program can encode and decode as expected.

Constraints

As per the related RFC (http://www.ietf.org/rfc/rfc2617.txt); username can not contain any colons, but password has no such restrictions. So it is easy to select the username by splitting the string till the first colon is reached.

Risk involved

This encoded string is passed to the server in plain text. Even though the username and password are hidden in a way; as you may have already guessed, it is not safe at all to use http basic authentication as decoding is straightforward and quite simple. So when ever this approach is used, it is advised to use a secure channel like HTTPS rather than HTTP.

Thursday, May 24, 2012

[Wikipedia] Updated 'Terms of Use' Effective from 25th May

Wikipedia, the One-stop website for most of the queries ranging from a tiny cell to the universe has a notice on top of the site claiming the 'Terms of use' (ToU) is changing tomorrow. Even though I am a regular user of Wikipedia, was never worried to read their 'ToU'. However this noticed lead me to compare the older with the new version.

Most noticeable change is the structure ; new version is more organized under different sub-sections which makes it easier for us to pick the required information rather than reading the whole. A summary is provided at the start as
"a human-readable summary of the Terms of Use" which is quite handy.

One key point to note is the legal bindings that is added with details and the emphasis is more towards the legal information related to American laws; this make sense since the Wikipedia foundation resides in America.
See below extraction...


"If you seek to file a legal claim against us, you agree to file and resolve it exclusively in a state or federal court located in San Francisco County, California. You also agree that the laws of the State of California and, to the extent applicable, the laws of the United States of America will govern these Terms of Use, as well as any legal claim that might arise between you and us (without reference to conflict of laws principles). You agree to submit to the personal jurisdiction of, and agree that venue is proper in, the courts located in San Francisco County, California, in any legal action or proceeding relating to us or these Terms of Use."

Another change is the licensing mechanism. Wikipedia has clearly mentioned that the content is from the community, so the writers must grant the license for free distribution and reuse, but with the attribution in place. Availability of 'GNU Free Documentation License' only will not be sufficient under this new ToU.

Even though we are not quite clear about the effects from these updates in ToU for us as Wikipedia readers; someone may feel that Wikimedia Foundation has tried to avoid most of the legal issues that they may face in future (if there are any).

Sunday, October 16, 2011

Winning Plus grows and loosing Buzz dies at Google

Google has decided to shutdown Buzz in few weeks raising the closed product count to around 20. With the growing popularity of GMail, Google introduced Buzz in February 2010 as an integrated product to GMail which could easily attract users into Google's Social Networking product.

However Buzz failed to attract much users; may be because it was something in between a Twitter and a Facebook. At the early stages, Buzz faced a privacy issue causing user's to think twice because using it. Though Google resolved the privacy issues, it was too late. According to our experiences this is an expected news which Google postponed till a better replacement is found. Both Google Plus and Buzz are catering the same requirement for Google; creating a Social Networking product into Google product base.

As Google mentioned;
"We learned a lot from products like Buzz, and are putting that learning to work every day in our vision for products like Google+".

As a proof of above statement, Google Plus considered Privacy as the main concern and came up with a feature named Circle. Google Plus web interface made it simple to understand how this new privacy feature functions. Another good restriction is the age limit; only users over 18+ are allowed to create Plus accounts as Google is still working on proper safety additions.

According to early analysis, Plus is definitely growing well unlike Buzz. However Google has a long way to go, as the required user base is huge. According to social networking giant Facebook's statistics, it has 800 million user base while Google has around 40 million (within 3 months). According to statistics, 800 million is still bigger compared to Google's GMail user base; but let's wait and see.

Related: Google redirect to incorrect country domain: Fix on Firefox

Friday, October 14, 2011

Subversion 1.7 Released - Under Apache Software Foundation

Subversion 1.7, first feature release after moving to Apache Software Foundation is announced. Starting from this, Subversion will be released under Apache License, version 2 instead of the modified Apache license used by Tigris.

Interesting features

One single .svn folder

This is the most interesting feature for us. In Subversion 1.7 meta data will be stored into a single location at the root directory. As you are aware, currently there are .svn folders inside each and every folder of the working copy of your project. Instead of that there will be just one .svn directory in the root of the working copy.

New Command: svn patch

In Subversion 1.7 a new sub command is introduced named "patch" (i.e: svn patch) which can be used to apply patch files to a working copy. This command supports newly created files as well as deleted files.

Compatibility with 1.6

Older clients and servers will work fine with 1.7 even though new features will not be functional.

Download distributions

Distributions can be downloaded from following locations.

Related Articles

Thursday, October 13, 2011

Are You Leaving Office On Time or Late Continuously?

Before reading further; just try and answer the question "Are you leaving the office on-time or late continuously?" and keep the answer to yourself. Most of the employees in an organization have to follow a plan, stick to a schedule. Also there are estimates for the tasks that are pending completion. As an employee in an organization, if you are not leaving the office on time as planned, you must be spoiling the working culture of your organization. Others may feel fear to leave the office on time even if their tasks are completed. We are not discussing about getting late very rarely, but about getting late each and every day continuously.

There may be many excuses for getting late continuously. May be the estimates and schedules are not realistic, so you simply have to spend extra time to complete. May be you are not competent enough to complete those in given time frame. You may be working late to cover tasks of others since you are keen in completing the work according to the schedule. May be your house or compartment is not comfortable enough compared to the office, so you do not wish to leave soon. Or in worst case; may be you have a belief that if you leave early, the risk of getting you fired from the organization is higher.

Reasons to leave on time

Whatever excuses you make, you are harming yourself quite a lot than how much you help the organization to grow. We received a set of points regarding this from an anonymous, which is published below in blue color; with our comments in black color. Let us know if you know the author of this list so that we can give credit.

  1. Work is a never ending process. You can never finish the work.
    • True; however you must quantify the amount of work that has to be completed on a given time frame. However make sure that you complete what is agreed on time; if you do it, then you can consider that you have satisfied the expectations.
  2. Interest of a client is not more important than your family.
    • Completely agree, you should not consider the client as more important than your family at any instance. But you must know that a company must exist for you to work, and a company needs clients. So completing the promised tasks on time to keep the client's expectation is quite important; so do not let the client's expectations go down.
  3. If you fail in life your boss or client will not be the person to offer a helping hand but your family and friends.
    • Must be correct in many situations and organizations. However I have witnessed some organizations taking so many steps to help the employees as well as their families in need at the required moments. Your clients may not be there to help, but the organization will. Sadly if you are not in such a good organization, either try and get your organization to that state or just think a bit... there are plenty of organizations that require your service.
  4. Life does not mean coming to office, going home and sleeping. There is more to a life. You need time to socialize, entertainment, exercise and relaxation. Don't make your life meaningless.
    • It is better if you can read it few times and memorize. It covers almost all activities that most of you do not have time to complete. You are neglecting exercises since you do not have time; think about 24 hours of your day and see whether there is any task that you can compromise for exercising for 30 minutes.
  5. A person who sits in office still late is not a hardworking person. He is a fool who does not know how to manage work within the stipulated time. Besides, he is a loser in life who does not have personal or social life.
    • Staying late in office does not mean that you are a hard working person, but this statement may be false for few managers as they believe much in working late. If you have such a manager, may be it is the time to consider a switch (either the manager or the organization itself). Always keep in mind that productivity goes down dramatically when you work late.
  6. You did not study hard and struggle in life to be a machine and live a meaningless life.
    • An important point, if your life is like a machine where you do not have time for anything else other than your job; it is better to consider about changing the way you spend your time.
  7. If your boss forces you to work late, just forward him this article. He will try to make his life meaningful too.
    • Another good point, if your boss does not believe in leaving on time, it will not be easy for you to leave early. So first try to let him know the importance of leaving on time which will reflect soon on to the working culture. So consider sharing it with your co-workers including the boss.

What can you do to leave on time?

If you are in the habit of working late continuously, consider changing it by considering the above facts as reasons. Read Seven ways to leave the office earlier as a guide line in accomplishing this.

As the first step, set a reminder 30 minutes before the office leaving time, so by 5:30pm you will be automatically notified if you are set to leave at 6:00pm. After that reminder, you can consider winding up the task you are in and plan tasks for next day.

Most importantly, make sure to keep office tasks out of your head when you leave the office since you are leaving the office on time to gain time for you to socialize, entertain, exercise and relax.

Wednesday, October 12, 2011

Firefox Address (Location) Bar Hidden or Missing

Firefox Address bar (or Location bar) is not visible suddenly and browser looks some what similar to the image shown here. Though Navigation bar is visible; there is no space to enter a URL? Sometimes users face this issue though it is not that common. This article shows how to resolve the issue; considering the user is not an expert in configuring Firefox.

Steps:
  1. Right click on area marked as "1".
  2. Select Customize... (marked as "2").
  3. Select the "Location" item from the pop up "Customize Toolbar" dialog box.
  4. Drag and drop "Location" item to the area marked as "3".
  5. Firefox itself will place the location bar correctly as earlier.


If you wish to restore all defaults items on the Firefox browser, use the "Restore Default Set" button in "Customize Toolbar" dialog box.

Related: Google redirect to incorrect country domain: Fix on Firefox

Thursday, October 6, 2011

Steve Jobs - Most innovative genius is no more

October 5th is going to be a sad day to technology lovers. As you all are aware; Steve Jobs, co-founder of Apple Inc. has passed away at the age of 56 on 5th October 2011. As common to everybody, he also did not have a smooth flow of nicely organized stages in his life; but Steve was praising that as the most important part that created the path to his innovations. One such example is the tragedy of getting fired from the Apple company which he co-founded. You already know this fact, but how would you have responded?

You will survive if you are fired from the company that you work for!! right? But what if you are fired from the company that you built from the scratch; and interestingly by the CEO recruited by yourself? Do you have the strengths to survive which Steve had?

Steve explained this situation later as;
"The heaviness of being successful was replaced by the lightness of being a beginner again, less sure about everything. It freed me to enter one of the most creative periods of my life."

Many people would explain this as "by the sadness of being a looser", but Steve said "lightness of being a beginner again".

Young Steve Jobs introducing the Macintosh



After getting fired from Apple, he founded NeXT Computer Inc. which Apple Inc. happened to buy after another 11 years because NeXT was doing so good; and Steve became the head again. At NeXT so many innovations came out; like an email where images and videos can be shared, a web framework called WebObjects which was later used in Apple applications like Apple Store. Most importantly NeXT's NeXTSTEP evolved as Mac OS X.
Under Jobs guidance, Apple created so many attractive items like iMac, iPod, iTunes Store. The revolutionary invention of multi-touch display iPhone changed the mobile phone industry dramatically.

Does "i" stand for Innovation?

According to Apple, "i" was initially used in iMac which stands for Internet. Later Apple used it for branding all consumer machines. However I prefer to consider this "i" to stand for "Innovative"; where iPhone would mean Innovative phone.
With the death of Jobs, people has started using "i" in front of the word sad (as iSad), does it make scene?

Stanford Commencement - The great speech



Let me finish this tribute with a quote from the Stanford Commencement Speech.

"Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma - which is living with the results of other people's thinking. Don't let the noise of others' opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary."

Since this genius is a Buddhist, may Steve attain Nibbana.