LG Optimus L9 – Short Review

After the LG Optiumus One phone, i never seen any good reviews about LG Droids.Still, I recently bought this phone for my sister, as she liked the phone very much. After looking at this phone, i thought of using it for few days, and to be frank, i am quite impressed with this phone. I am using Galaxy SL i9003 for over a year, and after using L9, my phone feels heavy in my hand, which i never felt before.

For specs : LG Optimus L9 Specs

1. Packaging
Packaging is normal, comes with mobile, Battery, Charger, User Manual, Stereo Ear Microphone, USB Data Cable. There is nothing fancy and box is little big compared to S3 ones. Also as an offer, they are giving Leather Pouch for free, with this mobile. The price of the phone in local store where i bought is 19,200 INR (which is 300INR higher compared to FK, but hey it comes with Leather Pouch. :D)

2. Build Quality

After opening the box and taking it in hand, it feels like air. Yes, it is very thin and overall look is stunning, but not as good looking as other phones out there, but i must say LG does a decent job with the design. The back cover of the phone is made of plastic, so you need to be careful while handling the phone. Apart from that, finishing is good and it looks like a premium phone, and at times, i mistake this for Note, because of the size. :D

3. Features

Even though features can be available by updating it to custom ROM’s, i don’t want to do anything because for my sister, all she need is to make/receive call, play games, Watch youtube videos, take some snaps/video. The LG UI is improved and less number of bloatwares compared to TW. Split keyboard, taking notes while speaking with someone is a nice things to consider. It comes with ICS, which is again a good thing, otherwise we have to look for updates online every now and then and i don’t expect any new phone to come with GB.

4. Performance

Installed many useful apps, and games like Temple Run, Fruit Slice, Ninjump, Air Attack HD Lite, Lets Golf 3 Free, etc and played every game for few hours and didn’t have any lag or whatever. It is running smooth and the GPU is doing fine, i guess. Also with all the apps, there is no freezing, no FC etc. Out of 1GB RAM, always 300+ MB is free. I guess 1GB RAM is taking its role in the performance and gives an lag-free UI Experience.

Installed Air Attack HD lite in my i9003 and it is working fine, but lags in middle. Hand writing recognizition is good(don’t compare with Note series), i made a call to my friend and need to note down address, so i used it and i must say, it is quite impressive. Also the split keyboard thing is good, because with such big screen i don’t need to reach the middle to type characters like G,F :D

5. Display/Video

The major thing that attracts my sister. 4.7″ IPS LCD Screen, with qHD res. Images are crisp and visibility at sunlight is good. Watching video is a treat in this phone. Copied a 720p video and it runs smooth, tried 1080p sample video and works like charm, but you need to have MX Player or some player. The default player is not able to run 1080p videos.

The colors are vivid and checked the same image with my i9003. Notable difference is there, not huge. But the images are looking sharper and crisp.

6. Camera

LG did nothing here, seriously, even my more than a year old i9003 is taking good photos ad videos w/o Flash,and this phone is nowhere near mine. I took few snaps with flash and w/o flash both at bright outdoors, and photos taken from LG where decent but with some noise/grain. It has option to record HD video recording, but if the quality is not good, there is no need for giving HD recording. Only upside is, at medium light, ambient outdoors, it is taking reasonable pictures and with flash, even that is looking dull and artificial.

7. Audio

It is upto the expectations and The included headphone is good with bass and treble and med~high volume. At low volume, you cannot feel the bass. Also, the earphone is very nice, cable length is decent. It comes with spare earbuds(:D), which make some difference.(I lost one of foam-tip and now i took foam-tip from my uncles phone who have spare earphone). The audio is clear and no complaints. Listened some Folk songs, Rock, Pop and so far no issue in providing decent music.

8. Battery

It comes with Li-Ion, 2150 mAh, which provides ample battery backup time. Eve after playing games, download apps through Wi-Fi(moderate usage), i am getting good 32hrs. Which is good considering the specs, and big screen. Big advantage is, it is not heating like mu i9003 after playing games for 15mins. For my sister’s usage pattern, it can easily last for 2 days or even more.

9. Connectivity/Browsing

Comes with WiFi Direct, 3G and BT. Used 3G network(Vodafone, Bangalore) for a while and getting good speeds. Browsing is good with this phone, because of larger screen.

10. Memory

Comes with 1GB RAM, 4GB Internal Memory and as new year offer, they provided us 16GB MicroSD for free. :D I can see plenty of free RAM even after installing so many apps, which usually eats RAM in my i9003. For me, who always see 329/486MB RAM used, this is quite a good look. Getting around 300+MB free some time.

Conclusion :

If you have strictly 19k budget and want a big screen(above 4″, not considering MMX,Karbonn etc), and to play videos, games, and lag-free UE then you might consider this phone. But if you want decent camera, a big no for this phone. Try anything from Xperia line-up.

Pros :

* Big Screen
* No-laggy User Experience
* Smooth video playback
* Nice package
* Features bundled with come in handy.
* Sexy look
* Better battery backup.

Cons :

* Below par camera (After tweaking the settings, images are coming out good, but still not excellent)
* Poor video recording

Few Images :

 

LG L9 Thickness

Thinnest phone i ever used

Phone at low light, clearly the IPS Screen is excellent

USB Port at top of the phone

Look at the big,luminous screen.

Camera and LCD is well placed on back panel and it looks good, but it doesn’t perform upto the expectations

The buttons on bottom is very responsive and placed sensibly. Not like SE phones, where sometimes, it will not respond.

Thickness again, which flattered me and make me feel like my phone is too heavy to carry around

 

Disclaimer : This review is purely based on my views and not by any influence or whatsoever.  And i am not responsible for any errors in the information or the accuracy.

Why Codeigniter?

If you want to learn new PHP framework and when you search for PHP frameworks, you will get confused easily. There are tons of FW’s out there, which looks similar and easy-to-use. But the fact is, it’s not all about easy to use, it’s about easy to handle, getting good support, and good understanding is what we need.

I learned PHP, just to create small web apps back in 2008. But after getting new job as Web Developer and started learning Spring, Hibernate, Play etc, i almost lost my touch in PHP. But recently, i had a specific requirement, that client only want it in PHP.

Years ago, i developed small sites,web apps which doesn’t contain more than 5 php pages, so i never got an issue with that. But the current project is huge, and if i start it w/o a framework i know it will be a chaos. So decided to learn one. When i google it, i come up with lot of options, from traditional CakePHP to light-weight Slim FW. Then i read, and read and implement samples and come to an conclusion.

When you are starting up things are easy, but to get going on, it’s very difficult. I liked Slim Framework much, but it is not an mature project yet and i don’t want to risk with it. Tried CakePHP, Yii, etc but finally settled with Code Igniter because of it’s ease of config. Setup the CI project within 10 mins and wrote my first method, which i didn’t do with any other frameworks. I want to mention few points mentioned in CI, which suits me.

  • You want a framework with a small footprint. – Yes
  • You need exceptional performance. – Of course
  • You need clear, thorough documentation.- Indeed
  • You prefer nearly zero configuration. – Yes, i would love to
  • You don’t want to adhere to restrictive coding rules. – Good one!
  • You don’t want to learn another template language. – Exactly
  • You prefer simple solutions to complexity. – Yes
  • You want to spend more time away from the computer. – Of course

After checking these points out, i convince myself to go with CI. So i started with login page and navigate to dashboard, and to be frank, the templating that comes with CI is awesome and one can easily create new template, which of course saves you a hell lot of time.

Finally, the documentation is very clear and straight forward, one cannot feel like they missed out something. The community is very active, so you expect to solve problems as soon as possible, which i would prefer any day. If someone want to learn a PHP FW and want it to be easy, no config kinda thing, CI is the one for you. Although Cake PHP is another option, but CI looks good, and it leaves me no doubt in it’s capability. Be it’s Controller approach or template approach, it is much clear and precise.

Read CMYK Image in Java

If you read a CMYK image format using ImageIO, you will get CMMException:Invalid image format error. Obviously, the only pure Java way of Implementation is with JPEGDecoder, which is deprecated.

So you have to use JAI to get rid of this issue. But there is no need to read images using JAI always. So i come up with this code, which will read CMYK images only if there is an error.  Some of you might already knew about this, but for starters it might save some time.

try{
storedImage = ImageIO.read(destination);
} catch(CMMException ce) {
SeekableStream seekableStream = new FileSeekableStream(destination);
ParameterBlock pb = new ParameterBlock();
pb.add(seekableStream);
storedImage = JAI.create("jpeg", pb).getAsBufferedImage();
}

get all form values using jQuery

Most of you might already know, but this is to whom doesn’t even aware of this method.

Official documentation here : http://api.jquery.com/serialize/

I stumbled upon this method a few years ago, where i had around 20 inputs in a form and want to get all the values and send to form. I used traditional $(‘#id’).val() x no-of-form-input times and ended up with big messy code.

Then i searched all over to see that this method is there for rescue. It will simply take all values as query string, which is easy to pass via ajax.

All you need to do is : $(“#form_id”).serialize() and it will display output as a=1&b=2 etc.

jQuery helps me a lot and this is one is real time saver.

HashMap in Javascript

I was searching for a way to play around with associative arrays in Javascript just like HashMap. And i found this useful link http://www.mojavelinux.com/articles/javascript_hashes.html, which exactly what i was looking for. So i thought of sharing the content with other users thought someone need it as i am. All the credits goes to the mojavelinux and i am simply replicating the content here.

Introduction

Hash tables are a permutation of associative arrays (i.e. name => value pairs). If you use PHP, then you are very familiar with this type of data structure already since all PHP arrays are associative.

The Javascript language implements very loose and somewhat limited support for associative arrays. Any JavaScript array can use other objects as keys, making it a hash, but there exists no formal constructor for initializing them and it is more or less unweildy to work with. A short example of a hash in JavaScript would be as follows:

var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;

// show the values stored
for (var i in myArray) {
	alert('key is: ' + i + ', value is: ' + myArray[i]);
}

Just as in PHP, the ‘foreach’ contruct is used to run through the array, doing something for each key => value pair. However, notice I did not do:

for (var i = 0; i < myArray.length; i++) {
	alert('key is: ' + i + ', value is: ' + myArray[i]);
}

This approach would not work in Javascript because the length property of an associative array in JavaScript is not incremented for arrays with non-numeric keys and must otherwise be explicitly assigned. Part of the reason for this goes back to the missing constructor for created associative arrays.

Fundamentals

After a brief discussion of fundamentals we will begin to focus on the core problem. In JavaScript, every variable is in fact an object. Okay, so what does this mean? Well, essentially, no matter what the variable, it can be used as though it were an instance of an object. This means it has a constructor, methods and properties. A property is just a variable that is owned by the object and thus local to that object. A property is accessed using the syntax:

myArray.one

where one is the property and the ‘.’ symbol signifies we are talking about the property of the array (or object) myArray. So the above example could be alternatively executed as:

for (var i in myArray) {
	alert('key is: ' + i + ', value is: ' + eval('myArray.' + i));
}

NOTE: In this example we have to use the function ‘eval()’ because we want to contruct the call myArray.one dynamically.

Since each object has default properties that are accessed using this very same syntax, such as length and constructor, consider the case where the key in the associative array is the same as one of these properties. This situation highlights the fundamental problem with associative arrays in JavaScript. It should be clear now why the length property is not set when we make an associative array data structure. By creating an associative array, you wipe out the original structure of the object because it is no longer possible differentiate between data keys and object properties. They become one in the same.

As a matter of fact, this is not the only conflict. Each object has a property called contructor, which is the function reference which is used to contruct the object. Ahhh, so now we see why hashes in JavaScript have no contructor. By creating an associative array, it is possible to wipe out the constructor in the process. In fact, hashes in JavaScript are somewhat useless for anything more than a very simple, static array. You have to know what it will be used for before you use it. Okay, so enough run on, what are we going to do about it?

Constructing a Hash Class

Javascript is very nice language in the sense that we can create our own classes. So what we are going to do is create a Hash() class just like the Array() class, except we are going to get around the conflicts that we are running into with this Array() class.

You might thinking, “okay, so we make a class, but how do we get around the conflicting properties problem?”. Easy, we make a property which itself is an array and call it items. Then, we can use any key we want, and store the data about the array in other properties. The trick is to move the data part of the array inside of a property of the class. The following listing is the Hash() object definition:

function Hash()
{
	this.length = 0;
	this.items = new Array();
	for (var i = 0; i < arguments.length; i += 2) {
		if (typeof(arguments[i + 1]) != 'undefined') {
			this.items[arguments[i]] = arguments[i + 1];
			this.length++;
		}
	}
}

NOTE: You should select another name for this class if you are using the prototype JavaScript library to avoid a naming conflict.

Let’s break this down a bit. Right off the bat, we create a length property, which will just be 0 to start with. Additionally, we create our items array using the Array() contructor. Next we populate that array with the key => value pairs we passed in and continue to increment the length. Ah, but JavaScript doesn’t know anything about the special syntax that say PHP uses. So we have to invent our own. What we will do is just alternate key and value arguments to the contructor (similar to Perl). A typical call to create a Hash() object would use the following syntax:

var myHash = new Hash('one', 1, 'two', 2, 'three', 3);

Already it must be nice to see a contructor…so much easier to add data to the structure!

Now, as you may recall before, we couldn’t have any properties or methods in our associative array, so besides a ‘foreach’ construct, there was not much we could do with our associative array. Now that we have the ability to add methods and properties, let’s get started! So we enhance our Hash() class.

function Hash()
{
	this.length = 0;
	this.items = new Array();
	for (var i = 0; i < arguments.length; i += 2) {
		if (typeof(arguments[i + 1]) != 'undefined') {
			this.items[arguments[i]] = arguments[i + 1];
			this.length++;
		}
	}

	this.removeItem = function(in_key)
	{
		var tmp_previous;
		if (typeof(this.items[in_key]) != 'undefined') {
			this.length--;
			var tmp_previous = this.items[in_key];
			delete this.items[in_key];
		}

		return tmp_previous;
	}

	this.getItem = function(in_key) {
		return this.items[in_key];
	}

	this.setItem = function(in_key, in_value)
	{
		var tmp_previous;
		if (typeof(in_value) != 'undefined') {
			if (typeof(this.items[in_key]) == 'undefined') {
				this.length++;
			}
			else {
				tmp_previous = this.items[in_key];
			}

			this.items[in_key] = in_value;
		}

		return tmp_previous;
	}

	this.hasItem = function(in_key)
	{
		return typeof(this.items[in_key]) != 'undefined';
	}

	this.clear = function()
	{
		for (var i in this.items) {
			delete this.items[i];
		}

		this.length = 0;
	}
}

Understanding the Implementation

We now have lots of useful methods! In JavaScript, any variable can be a reference to a function, so to add methods to the class, the easiest way to do it is to just write the function and then assign it to a property in the class. Okay, so you may be thinking, “But I can’t have the same property name as a method name.” That’s right, another limitation of JavaScript objects is that methods are properties. However, in most cases, it won’t be a problem because method names should be ‘behavior’ names and properties should be ‘state’ names.

In order to access the underlying items, we added the methods ‘setItem’, ‘removeItem’ and ‘hasItem’, and a ‘clear’ method to flush out the data. For now we will refer to each key => value pair as an item. We could create a ‘getItem’ method as well, but that is a bit slower and it doesn’t server any real useful purpose. If you would like, add it for your own class…either way works. Note that if you are using the prototype JavaScript library, the ‘hasItem’ method will return values for any of the methods that prototype adds to Array. You will also need to ensure the item found is not a function.

The most important role of our methods is to keep the length property up to date. As we can see, it takes a lot of work out of our job and we can use these nice methods to work easily with our hash. Just like a Hash in Java, the return value is a reference to the item in the Hash() that was replaced:

alert("Previous value: " + myHash.setItem('foobar', 'hey'));

If you now want to iterate through the Hash() like we did the array in the very beginning, you may do so using two different approaches:

for (var i in myHash.items) {
	alert('key is: ' + i + ', value is: ' + myHash.items[i]);
}

or

for (var i = 0; i < myHash.length; i++) {
	alert('key is: ' + i + ', value is: ' + myHash.items[i]);
}

and if you made a method for ‘getItem()’, you could also do:

for (var i = 0; i < myHash.length; i++) {
	alert('key is: ' + i + ', value is: ' + myHash.getItem(i));
}

If you are not concerned with speed down to the millisecond, then it is better to use the more formal approach of making a ‘getItem()’ method because it helps to prevent exposing the internal Array items.

Summary

Now you should go home and start using this in every JavaScript code you write because it finally makes Arrays in JavaScript useful. It is great for storing configuration data, returning multiple values from function, and the list goes on.

Now, I added a few more properties in some of my JavaScript programs to get more information out of the Hash() and so can you. In one application, I wanted to know how many integer keys the Hash() had rather than just the length of the whole Hash() and I wanted to be able to work with just the integer keys in one instance. You can do this by modifing the contrutor and methods to check for the type of the key using the function ‘typeof()’ and then setting the indexLength (as I called it) appropriately.

Raavana – Tamil Review

The much-hyped movie of the year Ravanaa is released at last and as like every other Mani rathnam fans, i was eager to watch the movie and did watch that by yesterday with my colleagues. To be frank, the movie is not upto expectations at least  for the hype it created. I was completely disappointed by the story and poor screenplay.

IMO it lost the Mani rathnam touch, that he had in his previous films. I think he is concentrating too much in Hindi and forgot to pay attention to its Tamil counterpart (I’ve heard from somewhere that Abhishek’s acting in Hindi is very poor). The introduction of Vikram is ok but the chain of events that happens after that was a complete mess and the two things that hold up the movie is Aishwarya Rai’s acting and Vikram’s. Aishwarya Rai just fit for the role and as usual Vikram out-performed others. Apart from these guys, Karthik,prabhu were added glory to the movie. The poor dialogue by Suhashini is a big down-fall for the movie.

Ok, lets come to the brighter side, the cinematography is just awesome. I swear i’d never ever seen such places in India before and the natural lighting added glory to the scenery. Also the songs are a big let-down. In fact after interval, two songs came consecutively at a gap of 5 minutes. The visualisation of songs looks cool and other characters like Priyamani,vaiyapuri did their job perfectly. I just say its not one of his kind movie for Mani Rathnam, also its not worth leaving. The best part of the movie is the last few minutes and if you really want to enjoy the movie just go after interval.

My Rating : Average

Jersey + Spring

For the past few days, i have scratched my head finding a good tutorial for Spring + Jersey integration and ebd up with nothing. So finally decided to do it on my own, and for surprise it is much easier than i expected. The simple thing is it relies with the web.xml. Nothing else. I give you a sample web.xml which i used for my project

<?xml version=”1.0″ encoding=”UTF-8″?>
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xmlns=”http://java.sun.com/xml/ns/javaee&#8221; xmlns:web=”http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&#8221; xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&#8221; id=”WebApp_ID” version=”2.5″>
<display-name>xxx</display-name>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>xxx</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-hibernate.xml,/WEB-INF/xxx-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>xxx1</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>xxx.yyy.zzz.service</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>xxx1</servlet-name>
<url-pattern>/resource/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>10</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<error-page>
<exception-type>java.lang.Exception</exception-type>
/WEB-INF/jsp/uncaughtException.jsp
</error-page>
</web-app>

Look at the servlet-name’s. We only need to differentiate the service by servlet-name but still it can be used locally by the project itself.

Simple isn’t it.

Why use Jersey?

  1. Reference Implementation JSR-311 and so lot of documentation, means lot of help from community.
  2. Clean POJO with awesome annotations.

For ex :

@Path(“/customers”)
@Singleton
@Consumes(“application/xml”)
@Produces(“application/xml”)

Simple and now you know what all these will do.

3.  Easy integration with other frameworks.

now you guys got a reason to go with Jersey. a’ight.

    Follow

    Get every new post delivered to your Inbox.