Thursday, 21 November 2013

Installing Git on CentOS from sources


Installing Git on your Linux machine is very simple. Simply run sudo yum install git for Fedora/Centos or apt-get install git for Debian based systems or any package management tool you are using.

I am using CentOS Release 6.4 and the reason I am writing this post is that the version of git present in the repository is 1.7.1 whereas current version(as of 21/11/2013) is 1.8.4.3(Latest Stable Release). Thats a huge gap between versions.


Problem I faced was that I checked out HornetQ source from GitHub and then tried to import it in my Intellij IDEA. Project was imported but it failed to index it due to compatibility issues with git version.
Every time I loaded the project I got the following error -

2:53:27 PM Unsupported Git version
           The configured version of
Git is not supported: 1.7.1.0.
           The minimal supported
version is 1.7.1.1. Please update.

So I was left with no option but to download the sources and build it myself. Here is how I did it.

Firstly we need to download some tools needed for compilation and build. Simply execute the following command in your console -

sudo yum groupinstall "Development
Tools"

For git to build and run we also need dome extra dependencies. To install these dependencies run following on your console

sudo yum install zlib-devel
perl-ExtUtils-MakeMaker asciidoc xmlto openssl-devel

Now you will have to download the got source. You can do this in two ways

  1. Go to https://github.com/git/git and manually click download ZIP button than appears on the right mid of the page. OR
  2. You can use command line utility wget. Simply type following and execute in console

  Download the sources in a separate folder. Your console will look something like below



Now unzip the .zip file and navigate to master directory.

unzip git.zip
cd git-master


Now run the following commands on your console to build and install your latest git.

make configure
./configure --prefix=/usr/local
make all doc
sudo make install install-doc
install-html

Note : Generating docs may take some time.


Now you are all set with the latest git version. You can check your version executing following command on your console

git --version



For the sake of logically concluding this post which I wrote because of the problem arising in Itellij IDEA let me explain configuration changes needed in the IDE. Screen shot provided below -



Go to Files->Settings->Version Control->Git

and change the value of Path to Git Executable to /usr/local/bin/git

Where did we get /usr/local/bin/git from?

A natural question that would follow. Answer is simple. When we build our git from sources we provided an argument –prefix=/usr/local after ./configure. You can cross verify this. Simple execute the following in console

which git

This gives the location where git is installed. For me it gives -

[root@localhost aniket]# which git
/usr/local/bin/git

This path should be same for you unless you give some custom path while building sources. 


For installing git on Windows as well as knowing the basic commands you can refer to following post -


Related Links



Wednesday, 20 November 2013

Reverse a LinkedList in Java?

Java has a built in functionality to reverse Linked List. This function is available in Collections class and the method name is reverse(). It is a static function so you can simply call it using Collections.reverse(yourLinkedList);


Code :

import java.util.LinkedList;
/**
 * Created with IntelliJ IDEA.
 * User: aniket
 * Date: 11/20/13
 * Time: 5:20 PM
 */
public class LinkedListReversal {
    public static void main(String args[]){
        LinkedList<String> myLList = new LinkedList<String>();
        myLList.add("A");
        myLList.add("B");
        myLList.add("C");
        myLList.add("D");
        System.out.println("Original LL : " + myLList);
        Collections.reverse(myLList);
        System.out.println("Revered LL : " + myLList);
    }
}


Output :

Original LL : [A, B, C, D]
Revered LL : [D, C, B, A]

This shows you are aware of Java APIs but ultimately interviewer will get to the logic part as of how this is exactly done. or to put it in other words how is the method Collections.reverse() exactly implemented?

You can view the source code to know the exact method but as far as our LinkedList reversal problem is concerned we do the following -

Code : 


import java.util.LinkedList;
import java.util.ListIterator;
/**
 * Created with IntelliJ IDEA.
 * User: aniket
 * Date: 11/20/13
 * Time: 5:20 PM
 */
public class LinkedListReversal {
    public static void reverse(LinkedList<String> linkedList) {
        ListIterator<String> forwardIterator = linkedList.listIterator();
        ListIterator<String> backwardIterator = linkedList.listIterator(linkedList.size());
        for(int i = 1;i<=(linkedList.size()/2);i++){
            String tempString = forwardIterator.next();
            forwardIterator.set(backwardIterator.previous());
            backwardIterator.set(tempString);
        }
    }
    public static void main(String args[]){
        LinkedList<String> myLList = new LinkedList<String>();
        myLList.add("A");
        myLList.add("B");
        myLList.add("C");
        myLList.add("D");
        System.out.println("Original LL : " + myLList);
        LinkedListReversal.reverse(myLList);
        System.out.println("Revered LL : " + myLList);
    }
}

Output : 



Original LL : [A, B, C, D]

Revered LL : [D, C, B, A]


Note : LinkedList data structure in Java is in fact a doubly linked list and hence we could use previous() on the list iterator. If you look at the LinkedList class you will find Node structure as follows


    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }


If you notice we have both next and prev nodes which implies it is a doubly Linked List.

For java code of reversing a linkedlist from very basics(from creating using Node data structure) you can refer to How to reverse a LinkedList in Java? )

Tuesday, 19 November 2013

Java Program to print all permutation of a String?

Interviewer may start with a very basic question as to what is number of permutations of a string with n characters. In case repetition is not allowed then it would be n!  i.e  [n*(n-1)*(n-2*....*!)]  . if repetition is allowed it would be n^n i.e [n*n*...n times].

Next would be to code it actually. Generally language is not a concern. What interviewer looks is how candidate thinks(his solving ability) and whether he is able to complete error free and working code. Following is a Java code that will print permutations of a given String along with the number of permutations possible.

Example :



Code : 


/**
 * Created with IntelliJ IDEA.
 * User: aniket
 * Date: 11/19/13
 * Time: 3:16 PM
 */
public class PermutationsPrinter {
    private int noOfPermutation;
    public void permute(char[] line,int start, int end){
        int j;
        if(start == end){
            noOfPermutation++;
            System.out.println(line);
        }
        else {
            for(j=start;j<=end;j++){
                char[] newLine = getSwappedString(line, start, j);
                permute(newLine,start+1,end);
            }
        }
    }


    private char[] getSwappedString(char[] characters,int i,int j ){
        String newLine = String.valueOf(swap(characters,i,j));//Create New String
        swap(characters,i,j);//restore original String
        return newLine.toCharArray();
    }


    private char[] swap(char[] characters,int i,int j){
        char temp = characters[i];
        characters[i] = characters[j];
        characters[j] = temp;
        return characters;
    }


    public int getNoOfPermutation() {
        return noOfPermutation;
    }


    public static void main(String args[]){
        String line = "ABC";
        PermutationsPrinter permuter = new PermutationsPrinter();
        permuter.permute(line.toCharArray(), 0, line.length() - 1);
        System.out.println("Number Of Permutations made : " + permuter.getNoOfPermutation());
    }
}

Output  : 


ABC
ACB
BAC
BCA
CBA
CAB
Number Of Permutations made : 6

(3! = 6 as expected)


More better example where you don't have to swap again to restore string is provided in the Interview questions git repo -

Friday, 15 November 2013

Program to reverse a stack "in place" using recursion?

Code :


import java.util.Stack;
/**
 * Created with IntelliJ IDEA.
 * User: aniket
 * Date: 11/15/13
 * Time: 3:30 PM
 */

public class InPlaceStackReversal {
    public static void reverse(Stack<String> stack){
        String element = stack.pop();
        if(stack.size() != 1) {
            reverse(stack);
        }
        pushToBottomOfStack(element,stack);
    }


    private static void pushToBottomOfStack(String data, Stack<String> stack){
        String element = stack.pop();
        if(stack.size() != 0){
            pushToBottomOfStack(data, stack);
        }
        else {
            stack.push(data);
        }
        stack.push(element);
    }

    public static void main(String args[]) {
        Stack<String> myStack = new Stack<String>();
        myStack.push("A");
        myStack.push("B");
        myStack.push("C");
        myStack.push("D");
        System.out.println("Original Stack : " + myStack);
        InPlaceStackReversal.reverse(myStack);
        System.out.println("Revered Stack : " + myStack);

    }
}

Output :


Original Stack : [A, B, C, D]
Revered Stack : [D, C, B, A]

Tuesday, 12 November 2013

Troubleshooting steps when Android device is detected but not recognized by Eclipse ADT.

If your device is not detected at all by Eclipse ADT then go though the article on Troubleshooting steps when Eclipse ADT does not recognizing your Android device.

Sometimes it does happen when your device is detected but is not recognized by your Eclipse ADT.  Each Android device has a Development Device ID which is used to uniquely identify your android device. You can view this ID by going to

System settings -> Developer options -> Development Device ID

(It is right below option to enable USB debugging)
Screenshot for the same is provided below(It is of my device running Android 4.0.4/ICS).

Now coming back to our main problem.Whenever it occurs you will see your prompt asking for device as follows -

You will see something like ???? which means your device is detected but is not recognized. You can check this issue by going to adt-bundle-windows-x86\sdk\platform-tools and typing the following command

adb.exe devices (Windows)
./adb devices   (Linux)

 In both cases you will see an entry in list of devices but again some ????? with no permissions . All you need to do to get things to work again is restart your server. Detailed steps to do so and it's effect before and after is provided in a snapshot below.

Note that the device is now listed properly. Another interesting thing to note here is when you kill the server a reconnect thread is started in your Eclipse ADT. It will continuously try to reconnect to the server and will stop once server is up. Screenshot for the same is given below.

After this you are all set. Your USB debugging will work perfectly.


t> UA-39527780-1 back to top