- After the fresh install do a 'yum -y update'. This will ensure every thing's up-to-date
- Add my user name to the sudoers file. Edit the /etc/sudoers file and add the following line after the Defaults section. The Defaults section is a bunch of lines starting with the word Defaults. When you edit the /etc/sudoers file add the following line to it:
<username> ALL=(ALL) ALL. This will enable the sudo command with all sudo permissions to username. Not the most secure, but the most convienient. - Install synergy
- Install the rpmfusion repositories for yum using the command:
sudo yum localinstall --nogpgcheck http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm - Run the following commands:
- sudo yum install kdenlive
- sudo rpm -ivh adobe-release-i386-1.0-1.noarch.rpm
- sudo yum install flash-plugin nspluginwrapper.x86_64 nspluginwrapper.i686 alsa-plugins-pulseaudio.i686 libcurl.i686
- sudo yum install tiger*vnc*server*
- sudo yum -y update
I use this as a Blog and a Wiki to share and record my thoughts and events as they happen.
Tuesday, January 22, 2013
Setting up FC after a fresh install
Sunday, October 24, 2010
Removing Linux from a dual boot system
I've had to remove Linux on some systems which were dual bootable with Linux. (As much as I prefer Linux, sometimes Windows is the right system to have)
In the past, I'd used the windows 98 rescue disks and the command:
fdisk /mbr
This worked well for me previously, but this time I had a system without a floppy drive and was at a loss to be able to run fdisk on Windows XP. That's when I found this site and tried the recommendation and ran the following command:
fixmbr
I was intimidated at first by all the messages I saw on the screen, but went ahead boldly and ran everything. And it worked well. I now booted straight into Windows and never went through the grub login screen!
The next step was to get into windows disk manager and drop the linux (and linux swap) partitions and reformat them to NTFS.
Once done, I now have a system free of Linux.
Thursday, April 29, 2010
Improving your Code
Composed methods
Each method does one task. This makes it granular and easy to read and understand.
Within a method all operations are at the same level, functionally.
Smaller methods also are documented by the method name. In fact, working backwards will help you to identify methods that need to be refactored. After implementing the method, change the name to reflect what the method does. Instinctively, you'll identify that the method name is too long or it does not summarise the operation correctly. This means the method needs to be refactored!
Test Driven Development
Every engineer I've spoken to has heard this term and most aren't aware what it means and how to do it. The most common question I've heard is: "What's the use of unit-testing?". I'm not going to get into that discussion here, but will summarise the benefits.
- Think like a user. The code/implementation being delivered needs to be used.
- Aids in created composed methods, because smaller atomic methods are easier to test
- Improves reliability by providing an automated regression suite
FindBugs and Checkstyle, are two tools that help in reducing common bad practices, bugs and code complexity.
Good citizenship
In other words, ensure all references have the right scope. This includes:
- Scope identifiers, viz., private, default, protected, public. My recommendation is make everything private and increase scope as and when required
- variable scope, viz., block, method, field, static. My recommendation again is to declare a variable as close as possible to it's point of usage and take it higher up only if required. Another recommendation is to rather pass values around using method parameters rather than increase a variable's scope.
KISS
Keep It Stupidly Simple! That also means, choose the simplest implementation for the current requirement. Don't go about indulging in speculative development. A lot of the times, simple things are cheap to throw away. If it gets complex you probably need a framework and should look at reusing existing ones rather than building a new one. Simple code is refactor-able and easy to change hence resulting in more agile and adaptable implementations.
Refactoring is not rework
Many times I've heard the complain:
"We had to change <insert your code here> and we wasted time in refactoring. If only we had done a little up front design we would have done it right the first time!"
But this is not true. You saved time the first time you did it without having to worry about complexity. Secondly, if you followed the principal correctly, you would have implemented something simple and hence cheap to throw away. And Thirdly, who ever got it right the first time!
If you are a Linux fan, even today there are new releases of Linux and if you are a Windows fan, Windows is at version 7.x No one got it right the first time, not even Einstein. So why do you expect yourself to be perfect. You will have to change whatever you do. If you come to terms with that, then why not be simple. Don't get attached to the code. And refactor. It's part of software engineering. It's part of implementation cost. It cannot be reduced! And hence it is not waste but part of the process.
This kind of thinking is usually triggered by managers asking: "How can we improve the process and reduce waste". Managers have to ask this. They control the budget and who doesn't want the best value for money? But we as engineers have to stop viewing refactoring as waste and something to be reduced. It is part of the software engineering process!
Ask Question
As simple as this sounds a lot of the time, questions aren't asked especially to authorities. This means you question suggestions, opinions, decisions, implementations, traditions, etc., etc. Questions will either lead to a change, hopefully for the better or will reaffirm that you've got the right implementation. So what's the harm in asking them? In today's world questions are no longer an indication that you don't know something. Quite the contrary, it's an indication whether you are paying attention and an indication of how much you've understood. I've always been of the opinion that 'There are no stupid questions, only stupid answers'. The only exception is when, you've not done your homework before asking the question or weren't paying attention. In which case, apologise for your bad behaviour' but still ask the question!
Monday, September 14, 2009
AIR on FC 11
YAY!!! Got AIR installed on my laptop!!! It's strange that Adobe refuses to publish a 64 bit version of AIR. Had to do a lot of R&D (another word for googling ;-) ) to find out the hacks required to get it working.
Adobe's official site has instructions on how to install it on FC-11 From this site got the hint to replace all *i386* packages with *i586*.
It's wierd that you need 32 packages to run AIR. What a pain!!! But it works. I got the Yammer client working, and will now once again try to get Tweetdeck working!
Update:
Tweet deck is working too! :-)
Tuesday, February 17, 2009
handling the apparent slowdown
Recently an ex-co-colleague put in an email questions that I do believe are on the minds of a number of people and that I've been asked a couple of times already...
- How do you see the current market scenario?
- Is there any opening in java/j2ee?
- Also is it advisable to switch in this time frame, when companies are doing employee cuts?
- this is the time to get that certification you've always been putting off
- this is the time to do that bit of R & D on the new technologies you've been dying to give a spin
- this is the time to join that open source project and contribute to it, not only with code, but maybe with feature suggestions, bug reports, reviews, etc.
Sunday, February 1, 2009
Design Patterns - Creational Patterns
The book is based on another well know book by the Gang of Four but with a focus on implementing the original 23 design patterns in Java. Very rightly, it starts by highlighting the importance of design patterns today as:
- Design patterns describes the communication between objects
- They are recurring solutions to recurring problems, thus enabling reuse of solutions to common problems
- Creational Patterns: Cover the cases for object creation
- Structural Patterns: Compose groups of objects into larger structures
- Behavioural Patterns: Defines communication and data flow between objects in a system
- Acceptance: You accept that it is an important part of your work. I'm past this point and that's why I'm here! ;-)
- Recognition: This is the learning stage where you begin to recognise the patterns, both the problem and solution patterns
- Internalization: This is where you apply your knowledge.
Two things to remember when using any design patterns are:
- Program to an interface and not an implementation: This principle is the at core for reducing dependence on an implementation. Programming to an interface allows implementation to change with time for any reasons, e.g., better algorithms, newer technologies, newer frameworks, etc.
- Favour Composition over inheritance: While this is not what we are taught in the OO theory, in reality favouring composition over inheritance eases up decoupling many a time. When I was first told this by one of my previous team leads (Irfan Mohammed), I thought he did not know what he was talking about! However, now I'm older (and hopefully wiser) and have realised the wisdom in his words then. I now go on preaching the same thing to everyone I meet!
Creational Patterns are used when we need to handle special cases while creating new objects. The simplest way to create objects in Java is to use the new operator. However, many a time, special cases need to be considered and Creational Patterns may be used to solve them.
These are the five Creational patterns.
Factory Pattern
Creates different implementations for an abstract class or interface based on the input parameter(s). The client is unaware of the implementation being returned. If the implementation is changed, only the factory needs to be changed and the remaining part of the client is not affected.
From a previous post, I've also highlighted the benefits of using a static factory instead of calling the constructor directly. This is a variation on the Factory Pattern and I'd like to re-iterate to use the new operator only inside a Factory.
Abstract Factory Method
The Factory pattern applied to the Factory! Creates different factories that in turn provide different implementations for an abstract class or interface based on the input parameters.
Singleton Pattern
The Singleton Pattern is probably the most well know pattern. It's aim is to create a single object for a given class. There are a number of ways to do this in Java of which I favour the following:
- Creating a static implementation
The methods and data within the class are static
This pattern doesn't create a single instance and can still fulfill the requirement of having a single point within the system.
The downside to this is that the object is not dynamic, meaning it cannot be passed around nor can it implement any interfaces. It is best suited for utility classes.
- Factory that ensures only a single instance is returned
I favour the factory pattern over using static implementations because it is a bit more flexible and reduces the static coupling that the first method mandates. The additional benefit of the latter is that it can easily be extended to provide a pool of objects or to remove the singleton requirement if found necessary later.
Builder Pattern
From what I understand, the builder pattern and the factory pattern are different parts of the same coin.
The Factory or Director is used to create the Builder objects.
When the factory creates instances that are more complex in nature and which in turn build different implementations even though the interface implemented is the same. In terms of a UI, the builder is responsible for constructing different views or different UI to represent similar data in different representation based on a slight difference in the data. The book gives an example of using the Builder Pattern to create multi-select list of items a group of checkboxes if the number of items are three or less or a multi-select listbox if there are more than three items. The Factory decides which builder is to be created based on the data sent to it.
Prototype Pattern
The Prototype Pattern is largely used to create copies of an object. This is useful when the object creation is expensive. For example a database lookup or network call is required to populate and create an object. However, the same data in the object may be required to be manipulated or represented in different ways. Again an example from the book is of creating the prototype object after a database file lookup. Then creating a copy of the data a sorted list.
The book also talks about the default Java method for creating object copies, i.e., the clone method, and rightly highlights the common pitfalls of the clone method. IMO, the first rule for the clone, method is don't use it! But there are times you can't avoid it, and one has to be extremely careful in implementing an override.
Secondly, just overriding the clone method results in a shallow copy, i.e., all mutable referenced objects are common to both the prototype and the clone. If this is not desired and one needs a deep-clone Java does not really help you and you have to implement it yourself. Up until I read this book, this meant going through the complete object graph and recursively calling clone on every referenced object. But, the book highlight a simple cheat, use serialisation! It's so neat and elegant. Use a ByteArray to serialise the prototype using the ObjectOutputStream and then deserialise the object to create a deep-clone using the ObjectInputStream. Simple! Neat! Few lines of code! But it does have it downside, viz., every object in the graph must be Serializable.
The caveats for the prototype pattern is mainly it's impact on performance. While creating the copies of the prototype relatively cheaper than creating instances of the prototypes, there still is an expense of doing a deep- pr shallow-copy. Every instance retrieved of the prototype is always a copy which in turn will have a hit on performance.
My 2 paise here, especially in cases where read-only information is required, it would make sense to return an immutable interface to the object or an immutable clone if possible. But then this is a creational pattern and the reason one would use it is to create mutable instances of objects that are expensive to create from scratch. But I couldn't resist documenting my thoughts... (after all it is my Blog...uh... Blikki) :-D
Summary
To summarise this blog entry, I've gone through the first section of the book and looked at the creational design patterns, viz.,
- Factory
- Abstract Factory
- Builder
- Singleton
- Prototype
Factory creates objects. If the objects created are factories in their own right then the top factroy is an Abstract Factory.If the objects construct something like UI etc., then the objects are Builders. A Singleton is a Factory returning only one instance of the object while a Prototype would be one that creates copies of an object.
Five creational patterns all linked with the core pattern The Factory!
Sunday, December 14, 2008
Savio's Notes: Java Book: Effective Java - Chapter 2 - Item 1
Item 1
Use static factories instead of constructors
I never thought of it in these terms, but I had always felt uneasy whenever I used the new operator in code. I always tried to never to use the new operator and have either a third utility class that returned a newly minted instance or have a static method that did the same.
But Joshua Bloch puts it more eloquently and convincingly and here are his reasons:
- Static factories unlike constructors can have more meaningful names which in turn help code readability
- Static factories unlike constuctors do need to create a new object every time. They could implement some kind of caching mechanism to enable reuse of instances
- Static factories unlike constuctors can return sub-types of their return types
- Classes without public or protected constructors cannot be sub-classed. But he goes on to state that this may be an advantage as it forces the use of composition over inheritance which is further elaborated in Item 14
- Besides the use of naming conventions there is no way to distinguish a static factory from other static methods in the class
From my part, I will now be trying this pattern more often to put in private constructors and use static factories. Maybe the convention to use would be to have the static factory name as getInstanceUsingXxxx(...)