Thursday 24 October 2013

Java Producer-Consumer example using wait and notify

An example in java for Producer-Consumer problem using wait() and notify() :
/**
 * 
 * @author vikky.agrawal
 */

public class Threads {

 public static void main(String args[]) {

  Semaphore mutex = new Semaphore();
  Producer producer = new Producer(mutex);
  Consumer consumer = new Consumer(mutex);
  System.out.println("Main starts");
  producer.start();
  consumer.start();

  try {
   consumer.join();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  System.out.println("Main Stop");
 }
}

class Consumer extends Thread {

 Semaphore mutex;

 Consumer(Semaphore mutex) {

  super("Consumer");

  this.mutex = mutex;

 }

 @Override
 public void run() {

  for (int i = 0; i < 50; i++) {
   try {
    sleep(1000);
    mutex.down();
   } catch (InterruptedException e) {
    e.printStackTrace();

   }
  }
 }
}

class Producer extends Thread {

 Semaphore mutex;

 Producer(Semaphore mutex) {
  super("producer");
  this.mutex = mutex;
 }

 @Override
 public void run() {

  for (int i = 0; i < 100; i++) {
   mutex.up();
   try {
    sleep(10);
   } catch (InterruptedException e) {

   }
  }
 }
}

class Semaphore {

 static int value = 0;
 boolean available = false;

 public synchronized void down() {

  while (!available) {
   try {
    wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   // System.out.println("Consumer woke up from waiting");
  }
  value--;
  System.out.println("Consumed now value : " + value);
  available = false;
  notify();
 }

 public synchronized void up() {

  while (available) {
   try {
    wait();
    // System.out.println("Producer Got a notification and available is now: "+available);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   // System.out.println("Producer woke up from waiting");
  }
  value++;
  System.out.println("Produced now value :" + value);
  available = true;
  notify();
 }
}

Wednesday 23 October 2013

How HashMap works in Java.


HashMap works on the principle of hashing. A HashMap stores keys and associated values.
Using hashcode keys are assigned bucket(array index) and both key and value gets stored in it.
HashMap allows null key as well as null value(s).

HashMap implementation ensures that its array length is always equal to at least max( size, capacity ) / load_factor. Default load factor for HashMap is 0.75 and default capacity is 16. So, the default (new HashMap<>()) size of array of entries is 16 / 0.75 = 21.33 ~ 22.
In case this size fills HashMap doubles it's size and rehashes all the entries.
Equals method implies Hashcode i.e.  equals() => hashcode().(equals and hashcode contract)

public V put(K key, V value)
Associates the specified value with the specified key in this map. If the map previously contained a mapping for the key, the old value is replaced.

How get() method works in HashMap?
Using key as input HashMap calculates its hashcode() and then locates the key and its associated value in bucket.

Connecting question is: What if two keys have same hashcode()?
Two keys having same hashcode() will land in same bucket.
So if you know Hashing it's a matter of collision resolution, in case of a collision in HashMap, key-value pairs are stored in a linked array, so once there is a collision one needs to locate the bucket using hashcode() and then using equals() method locate key and return its associated value.

hashcode() => locate bucket => equals() => identify key based on equals() and return its associated value.

Internally HashMap implements a static class Entry:
transient Entry <K,V> [] table;

Data structure for storing Key-value pairs:

static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        int hash;

        /**
         * Creates new entry.
         */
        Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
        }
//other code emitted


So whenever there is a collision it stores key-value pair(s) in a new Entry and gives reference of already stored key-value to the 'Entry<K,V> next' variable.
bucketindex calculated based on the hash of key and then key-values are stored based on this calculation.
code snippet:

Entry<K,V> e = table[bucketIndex];  //if there is already an entry at bucketIndex then reference it to next
table[bucketIndex] = new Entry<>(hash, key, value, e); 

//new Entry code
 Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
        }

Monday 14 October 2013

Java program to count prime numbers for a given range.

import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author Vikky Agrawal
 */

public class PrimeCount {

    public static void main(String[] args) {

        int input = 1000000;
        ArrayList<Integer> prime = new ArrayList<Integer>();
        prime.add(3);
        prime.add(5);
        int primes = 3;
        // long start=System.currentTimeMillis();
        long startTime = new Date().getTime();
        boolean temp = false;

        for (int i = 7; i <= input; i += 2) {
            temp = false;
            int index = 0;
            int j = prime.get(index);
            int sqrt = (int) (Math.floor(Math.sqrt(i)));

            for (; j <= sqrt;) {
                int k = i % j;
                if (k == 0) {
                    temp = true;
                    break;
                }
                j = prime.get(++index);
            }

            if (!temp) {
                if (i < (input / 2)) {
                    prime.add(i);
                }
                primes++;
            }

        }

        long endTime = new Date().getTime();
        long duration = endTime - startTime;
        System.out.println("Time taken is : " + duration + " milliseconds");
        System.out.println("Number of prime count for input : " + input
                + " is : " + primes);
    }
}

How I made my android advertisement free.!

To make android device advertisement free, one need to root android device.
There are plenty of guides available on internet to root your device so follow anyone.

Once android is rooted then follow these simple steps:

1. Install fiddler on your computer.(To capture web traffic from android)
    Download it from here: Fiddler 2
    Go to tools fiddler options and select the options as given in figure:
    Accept the notification if any.






2. Install proxydroid from google play and give it super user access.
    Now enter your ip address (using cmd and ipconfig /all) in proxydroid app.
    and then click on enable proxy switch. This will route all the traffic from your android to your system and fiddler will be able to capture it.

3. Now next step could be completed in two ways:
    We need to update hosts file provided inside /system/etc/hosts
  one way is to use adb commands, pull update and then push this file.
 other easy way is to use any root application for android which could transfer files from one location to other.

I am using second approach as it's easy and convenient.

So download File Explorer and also download root access for it.

Once it's operational copy hosts file from /system/etc/hosts to /mnt/sdcard so you can download it to your computer using data cable.

Once hosts file available on computer use all the host address(advertisers which you got from step 2) to redirect to localhost.
A sample hosts file I created and using on my android (contains some adservers URL from adfree application)

# Ad server list for use with hosts files to block ads

127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
 
127.0.0.1 ads.mopub.com
127.0.0.1 android.bonzai.mobi
127.0.0.1 d.applovin.com
127.0.0.1 a.applovin.com
127.0.0.1 applovin.com
127.0.0.1 netspiderads.indiatimes.com
127.0.0.1 netspiderads2.indiatimes.com
127.0.0.1 netspiderads3.indiatimes.com
127.0.0.1 media.admob.com
 # 127.0.0.1 your advertiser hosts to block


Add your hosts in above line and remove comment.

Now we need to push this file on android, so copy the same on your sdcrad using data cable and then using file explorer with root access replace this file at /system/etc/hosts.

Switch off and restart your phone.

Now most of the applications will be adfree.
Enjoy. :)


Note:
Android should be rooted for the whole process and proper care should be taken.
These are my views and no responsibility taken for any harm or anything wrong happens while following this process.

Tuesday 2 July 2013

Pascle Triangle in Java

/**
 *
 * @author Vikky Agrawal
 */
public class PascalTriangle {

    int arr[];
    private int N;

    public static void main(String arg[]) {

        PascalTriangle obj = new PascalTriangle(5);
        int output[] = obj.fillUsingPermutation();
        for (int a : output) {
            System.out.println(a);
        }
    }

    public PascalTriangle(int N) {
        this.N = N;
        this.arr = new int[this.getSize(N)];
    }

    private int getSize(int N) {
        int i = 0;
        while (N > 0) {
            i += N--;
        }
        return i;
    }

    private int[] fillUsingPermutation() {

        int k = 0;
        for (int n = 0; n < N && k < arr.length; n++) {
            int r = 0;
            while (r <= n) {
                arr[k] = fact(n) / (fact(r) * fact(n - r));
                r++;
                k++;
            }
        }
        return this.arr;
    }

    public int fact(int n) {

        if (n == 0) {
            return 1;
        } else {
            return n * fact(n - 1);
        }
    }
}