Monday, October 3, 2016

Java 8 - Writing asynchronous code with CompletableFuture


You probably already know about Futures

A Future represents the pending result of an asynchronous computation. It offers a method — get — that returns the result of the computation when it's done.

The problem is that a call to get is blocking until the computation is done. This is quite restrictive and can quickly make the asynchronous computation pointless.

Sure — you can keep coding all scenarios into the job you're sending to the executor, but why should you have to worry about all the plumbing around the logic you really care about?

This is where CompletableFuture saves the day

Beside implementing the Future interface, CompletableFuture also implements the CompletionStage interface.

A CompletionStage is a promise. It promises that the computation eventually will be done.

The great thing about the CompletionStage is that it offers a vast selection of methods that let you attach callbacks that will be executed on completion.

This way we can build systems in a non-blocking fashion.

public <U,V> CompletableFuture<V> thenCombineAsync(CompletableFuture<? extends U> other, BiFunction<? super T,? super U,? extends V> fn, Executor executor)

The simplest asynchronous computation

Let's start with the absolute basics — creating a simple asynchronous computation.
CompletableFuture.supplyAsync(this::sendMsg);

It's as easy as that.
supplyAsync takes a Supplier containing the code we want to execute asynchronously — in our case the sendMsg method.

If you've worked a bit with Futures in the past, you may wonder where the Executor went. If you want to, you can still define it as a second argument. However, if you leave it out it will be submitted to the ForkJoinPool.commonPool().

Methods that do not take an Executor as an argument but end with ...Async will use ForkJoinPool.commonPool() (global, general purpose pool introduces in JDK 8).

This applies to most methods in CompletableFuture class. runAsync() is simple to understand, notice that it takes Runnable, therefore it returns CompletableFuture<Void> as Runnable doesn't return anything. If you need to process something asynchronously and return result, use Supplier<U>:

final CompletableFuture<String> future = CompletableFuture.supplyAsync(new Supplier<String>() {
    @Override
    public String get() {
        //...long running...
        return "42";
    }
}, executor);

lambdas:
final CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    //...long running...
    return "42";
}, executor);

methods:
final CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> longRunningTask(params), executor);

Creating and obtaining CompletableFuture

Factory Methods:
   static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier);
   static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor);
   static CompletableFuture<Void> runAsync(Runnable runnable);
   static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor);

Attaching a callback

Our first asynchronous task is done. Let's add a callback to it!
The beauty of a callback is that we can say what should happen when an asynchronous computation is done without waiting around for the result.
In the first example, we simply sent a message asynchronously by executing sendMsg in its own thread.
Now let's add a callback where we notify about how the sending of the message went.

CompletableFuture.supplyAsync(this::sendMsg).thenAccept(this::notify);
thenAccept is one of many ways to add a callback. It takes a Consumer — in our case notify — which handles the result of the preceding computation when it's done.

Chaining multiple callbacks

Transforming and acting on one CompletableFuture (thenApply):

<U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn);
<U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn);
<U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn, Executor executor);

CompletableFuture<String> f1 = //...
CompletableFuture<Integer> f2 = f1.thenApply(Integer::parseInt);
CompletableFuture<Double> f3 = f2.thenApply(r -> r * r * Math.PI);

lambdas:
   CompletableFuture<Double> f3 = f1.thenApply(Integer::parseInt).thenApply(r -> r * r * Math.PI);

Running code on completion (thenAccept/thenRun)

CompletableFuture<Void> thenAccept(Consumer<? super T> block);
CompletableFuture<Void> thenRun(Runnable action);

   future.thenAcceptAsync(dbl -> log.debug("Result: {}", dbl), executor);
   log.debug("Continuing");
...Async variants are available as well for both methods, with implicit and explicit executor. I can't emphasize this enough: thenAccept()/thenRun() methods do not block (even without explicit executor). Treat them like an event listener/handler that you attach to a future and that will execute some time in the future. "Continuing" message will appear immediately, even if future is not even close to completion.

Combining two CompletableFuture together

Combining (chaining) two futures (thenCompose())
<U> CompletableFuture<U> thenCompose(Function<? super T,CompletableFuture<U>> fn);

CompletableFuture<Document> docFuture = //...


CompletableFuture<CompletableFuture<Double>> f = docFuture.thenApply(this::calculateRelevance);
CompletableFuture<Double> relevanceFuture = docFuture.thenCompose(this::calculateRelevance);
//...
private CompletableFuture<Double> calculateRelevance(Document doc)  //...

Transforming values of two futures (thenCombine())

<U,V> CompletableFuture<V> thenCombine(CompletableFuture<? extends U> other, BiFunction<? super T,? super U,? extends V> fn)

CompletableFuture<Customer> customerFuture = loadCustomerDetails(123);
CompletableFuture<Shop> shopFuture = closestShop();
CompletableFuture<Route> routeFuture = customerFuture.thenCombine(shopFuture, (cust, shop) -> findRoute(cust, shop));
//...
private Route findRoute(Customer customer, Shop shop) //...

Notice that in Java 8 you can replace (cust, shop) -> findRoute(cust, shop) with simple this::findRoute method reference:
    customerFuture.thenCombine(shopFuture, this::findRoute);

If you want to continue passing values from one callback to another, thenAccept won't cut it since Consumer doesn't return anything.
To keep passing values, you can simply use thenApply instead.
thenApply takes a Function which accepts a value, but also return one.

To see how this works, let's extend our previous example by first finding a receiver.

CompletableFuture.supplyAsync(this::findReceiver).thenApply(this::sendMsg).thenAccept(this::notify);

Now the asynchronous task will first find a receiver, then send a message to the receiver before it passes the result on to the last callback to notify.

Building asynchronous systems

When building bigger asynchronous systems, things work a bit differently.

You'll usually want to compose new pieces of code based on smaller pieces of code. Each of these pieces would typically be asynchronous — in our case returning CompletionStages.

Until now, sendMsg has been a normal blocking function. Let's now assume that we got a sendMsgAsync method that returns a CompletionStage.

If we kept using thenApply to compose the example above, we would end up with nested CompletionStages.

// Returns type CompletionStage<CompletionStage<String>>
CompletableFuture.supplyAsync(this::findReceiver).thenApply(this::sendMsgAsync);

We don't want that, so instead we can use thenCompose which allows us to give a Function that returns a CompletionStage. This will have a flattening effect like a flatMap.

// Returns type CompletionStage<String>
CompletableFuture.supplyAsync(this::findReceiver).thenCompose(this::sendMsgAsync);

This way we can keep composing new functions without losing the one layered CompletionStage.

Callback as a separate task using the async suffix

Until now all our callbacks have been executed on the same thread as their predecessor.

If you want to, you can submit the callback to the ForkJoinPool.commonPool() independently instead of using the same thread as the predecessor. This is done by using the async suffix version of the methods CompletionStage offers.

Let's say we want to send two messages at one go to the same receiver.
CompletableFuture<String> receiver  = CompletableFuture.supplyAsync(this::findReceiver);
receiver.thenApply(this::sendMsg);
receiver.thenApply(this::sendOtherMsg);

In the example above, everything will be executed on the same thread. This results in the last message waiting for the first message to complete.

Now consider this code instead.
CompletableFuture<String> receiver = CompletableFuture.supplyAsync(this::findReceiver);
receiver.thenApplyAsync(this::sendMsg);
receiver.thenApplyAsync(this::sendMsg);

By using the async suffix, each message is submitted as separate tasks to the ForkJoinPool.commonPool(). This results in both the sendMsg callbacks being executed when the preceding calculation is done.
The key is — the asynchronous version can be convenient when you have several callbacks dependent on the same computation.

What to do when it all goes wrong

As you know, bad things can happen. And if you've worked with Future before, you know how bad it could get.
Luckily CompletableFuture has a nice way of handling this, using exceptionally.

CompletableFuture.supplyAsync(this::failingMsg).exceptionally(ex -> new Result(Status.FAILED)).thenAccept(this::notify);

exceptionally gives us a chance to recover by taking an alternative function that will be executed if preceding calculation fails with an exception.
This way succeeding callbacks can continue with the alternative result as input.
If you need more flexibility, check out whenComplete and handle for more ways of handling errors.

Error handling of single CompletableFuture

CompletableFuture<Integer> safe = future.handle((ok, ex) -> {
    if (ok != null) {
        return Integer.parseInt(ok);
    } else {
        log.warn("Problem", ex);
        return -1;
    }
});

lambdas:
CompletableFuture<String> safe = future.exceptionally(ex -> "We have a problem: " + ex.getMessage());

handle() is called always, with either result or exception argument being not-null. This is a one-stop catch-all strategy.

Callback depending on multiple computations

Sometimes it would be really helpful to be able to create a callback that is dependent on the result of two computations. This is where thenCombine becomes handy.

thenCombine allows us to register a BiFunction callback depending on the result of two CompletionStages.

To see how this is done, let’s in addition to finding a receiver also execute the heavy job of creating some content before sending a message.

CompletableFuture<String> to = CompletableFuture.supplyAsync(this::findReceiver);
CompletableFuture<String> text = CompletableFuture.supplyAsync(this::createContent);

to.thenCombine(text, this::sendMsg);

First, we've started two asynchronous jobs — finding a receiver and creating some content. Then we use thenCombine to say what we want to do with the result of these two computations by defining our BiFunction.

It's worth mentioning that there is another variant of thenCombine as well — called runAfterBoth. This version takes a Runnable not caring about the actual values of the preceding computation — only that they're actually done.

Callback dependent on one or the other

Ok, so we've now covered the scenario where you depend on two computations. Now, what about when you just need the result of one of them?

Let’s say you have two sources of finding a receiver. You’ll ask both, but will be happy with the first one returning with a result.

CompletableFuture<String> firstSource = CompletableFuture.supplyAsync(this::findByFirstSource);
CompletableFuture<String> secondSource = CompletableFuture.supplyAsync(this::findBySecondSource);

firstSource.acceptEither(secondSource, this::sendMsg);

As you can see, it's solved easily by acceptEither taking the two awaiting calculations and a Function that will be executed with the result of the first one to return.

Waiting for both CompletableFutures to complete

<U> CompletableFuture<Void> thenAcceptBoth(CompletableFuture<? extends U> other, BiConsumer<? super T,? super U> block)
CompletableFuture<Void> runAfterBoth(CompletableFuture<?> other, Runnable action)

Imagine that in the example above, instead of producing new CompletableFuture<Route> you simply want send some event or refresh GUI immediately. This can be easily achieved with thenAcceptBoth():
customerFuture.thenAcceptBoth(shopFuture, (cust, shop) -> {
    final Route route = findRoute(cust, shop);
    //refresh GUI with route
});

I hope I'm wrong but maybe some of you are asking themselves a question: why can't I simply block on these two futures? Like here:
Future<Customer> customerFuture = loadCustomerDetails(123);
Future<Shop> shopFuture = closestShop();
findRoute(customerFuture.get(), shopFuture.get());

Waiting for first CompletableFuture to complete

Another interesting part of the CompletableFuture API is the ability to wait for first (as opposed to all) completed future. This can come handy when you have two tasks yielding result of the same type and you only care about response time, not which task resulted first. API methods (...Async variations are available as well):
 CompletableFuture<Void> acceptEither(CompletableFuture<? extends T> other, Consumer<? super T> block)
 CompletableFuture<Void> runAfterEither(CompletableFuture<?> other, Runnable action)

CompletableFuture<String> fast = fetchFast();
CompletableFuture<String> predictable = fetchPredictably();
fast.acceptEither(predictable, s -> {
    System.out.println("Result: " + s);
});

Transforming first completed

<U> CompletableFuture<U> applyToEither(CompletableFuture<? extends T> other, Function<? super T,U> fn)
   CompletableFuture<String> fast = fetchFast();
   CompletableFuture<String> predictable = fetchPredictably();
   CompletableFuture<String> firstDone = fast.applyToEither(predictable, Function.<String>identity());

Combining multiple CompletableFuture together

static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs)
static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs)

allOf() takes an array of futures and returns a future that completes when all of the underlying futures are completed (barrier waiting for all). anyOf() on the other hand will wait only for the fastest of the underlying futures.


Linux Utilities


Shellinabox

Reference Links:
https://pkgs.org/download/shellinabox
http://linoxide.com/tools/web-remote-your-server/

$ wget http://dl.fedoraproject.org/pub/epel/7/x86_64/s/shellinabox-2.19-1.el7.x86_64.rpm
$ service shellinaboxd start
$ sudo netstat -nap | grep shellinabox
$ netstat -nap | grep shellinabox


Subscription Manager Workaround:

[root@sv2lxmkpdi10 ~]# yum install shellinabox
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
There are no enabled repos.
 Run "yum repolist all" to see the repos you have.
 You can enable repos with yum-config-manager --enable <repo>
[root@sv2lxmkpdi10 ~]#


Tuesday, November 3, 2015

Mongo Queries

Mongo Queries

Admin Queries

CRUD Queries:

# Update all document in a collection satisfying a condition of attribute in that collection.
Eg: add {"partner":true} in a collection provider if customers array contains one or more element.
>>>   db.provider.update({"customers": {"$ne": [], "$exists": true}}, {"$set": {"partner": true}}, {"multi": true})



# monthly counts of all records
>>>
db.ping.aggregate([
  {
    $group : 
    {
   _id: { month: { $month: "$created_date" }, year: { $year: "$created_date" }},
   count: { $sum: 1 }
    }
  }
]);



# Distinct query:
>>> db.provider.distinct('region');



# Distinct multiple attribute query:
>>>
db.provider.aggregate([
  {"$group" : {"_id" : {region_code: "$region_code" , region: "$region"}}}
]);



# Flatened Query:
db.region.aggregate (
{ $project: {"code":1, "description":1, "metro.code":1,  "metro.description":1 , "metro.ibx.name":1,  "metro.ibx.description":1, _id:0}},
{ $unwind: '$metro'},
{ $unwind: '$metro.ibx'}
);


# empty & null check
1. {"description" : {"$exists" : true, "$ne" : ""}}
2. {$and: [{description : {$exists : true}}, {description : {$ne : ""}}, {description : {$ne : null }}]}
3. {"$and": [{"description" : {"$exists" : true}}, {"description" : {"$ne" : ""}}, {"description" : {"$ne" : null }}]}

# Array Empty Check
1. { pictures: { $exists: true, $not: {$size: 0} } }
2. { pictures: { $exists: true, $ne: [] } } /* mongodb don't use index if $size is involved */
3. { pictures: { $gt: [] } }

# Regex Queries:
{$or : [{ibx_a: {$regex: /FR/}}, {ibx_b: {$regex: /FR/}}]}

# Persa Ibx:
{"manual_provider_id": {"$ne": null}, "accounts.ibxs.ibx_code" : {"$in": ['RJ1', 'RJ2', 'RJ3', 'SP1', 'SP2', 'SP3', 'SP4']}}

# find duplicate records whose count is greater than 1:
db.provider.aggregate(
    {"$group" : { "_id": "$provider_account_name", "status":{$first:"$status"}, "manual_provider_id": {"$first" : "$manual_provider_id"},"parent_sfdc_id": {"$first" : "$parent_sfdc_id"}, "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1}, "status" : {"$eq": "ACTIVE"}, "manual_provider_id": {"$eq" : null} } },
    {"$project": {"name" : "$_id", "_id" : 0} }
)

# total count
db.provider.aggregate(
    {"$group" : { "_id": "$provider_account_name", "status":{$first:"$status"}, "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1}, "status" : {"$eq": "ACTIVE"} } },
    { $group: { _id: null, count: { $sum: 1 } } }
)

db.provider.aggregate(
    {"$group" : { "_id": "$provider_account_name", "status":{$first:"$status"}, "manual_provider_id": {"$first" : "$manual_provider_id"},"parent_sfdc_id": {"$first" : "$parent_sfdc_id"}, "count": { "$sum": 1 } } },
    {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1}, "status" : {"$eq": "ACTIVE"}, "manual_provider_id": {"$eq" : null} } }
)

Thursday, February 26, 2015

Multiple version of Node NVM or/ 'Home Brew'.

There are 2 ways to install Node: 
  1. Manually: use archive from Node web site.
    1. maintain version using NVM (Node version Manager).
  2. HomeBrew (Package Manager): '/usr/local/Cellar' with Base location: '/usr/local/'.
    1. Brew versions for node and other packages / formulas.

Manually Install: NVM - Node version manager

Step 1: Run following Command, by end of this command NVM will be installed
curl https://raw.githubusercontent.com/creationix/nvm/v0.11.1/install.sh | bash
Close and open your terminal, it's not necessary to log out, we just need to make sure changes nvm made to your part is actually reflected, by running following command:
$ source ~/.profile

Alternatively run the command suggested on output of script:
$ nvm ls-remote
Should you see the error, -bash: nvm: command not found it may be because git is not installed.

Go ahead and install git and return the script:
$ apt-get install git

Step 2: 
And you will be shown a list of all the available versions of node.js. You can always find out the latest stable release by heading to the node.js website, where it's printed in the center of the page.

To install version 0.10.13 (the latest as of this writing) type:
$ nvm install 0.10.13

If you type:
$ node --version

You will now see that node v0.10.13 is installed and active. If you had an older node app that only works with node v0.8.16, and wanted to downgrade, then you would input:
$ nvm install v0.8.16

To install and switch to v0.8.16.
When you're done and want to switch back to v0.10.13, you can do so with nvm's use command:
$ nvm use v0.10.13

Nvm is great and makes switching between node versions easy and convenient. However, there's one caveat. If you type:
$ which node


Home Brew (Package Manager)

Step 1:
LM-SJN-00874861:Library anudixit$ brew tap homebrew/versions
LM-SJN-00874861:0.12.0 anudixit$ brew tap homebrew/boneyard
Cloning into '/usr/local/Library/Taps/homebrew/homebrew-boneyard'...
remote: Counting objects: 747, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 747 (delta 0), reused 0 (delta 0), pack-reused 744
Receiving objects: 100% (747/747), 181.57 KiB | 156.00 KiB/s, done.
Resolving deltas: 100% (348/348), done.
Checking connectivity... done.
Tapped 74 formulae
LM-SJN-00874861:0.12.0 anudixit$ 


Step 2:
LM-SJN-00874861:0.12.0 anudixit$ brew versions node
Warning: brew-versions is unsupported and will be removed soon.
You should use the homebrew-versions tap instead:
  https://github.com/Homebrew/homebrew-versions
0.12.0   git checkout 1580f8b /usr/local/Library/Formula/node.rb
0.10.36  git checkout 06b10bc /usr/local/Library/Formula/node.rb
0.10.35  git checkout 51c3f4d /usr/local/Library/Formula/node.rb
0.10.34  git checkout 656117c /usr/local/Library/Formula/node.rb
0.10.33  git checkout 13848bb /usr/local/Library/Formula/node.rb
0.10.32  git checkout 72d9b70 /usr/local/Library/Formula/node.rb
0.10.31  git checkout 51dbf0b /usr/local/Library/Formula/node.rb
0.10.30  git checkout fa636a8 /usr/local/Library/Formula/node.rb
0.10.29  git checkout 7b968c6 /usr/local/Library/Formula/node.rb
0.10.28  git checkout f7d75de /usr/local/Library/Formula/node.rb
0.10.26  git checkout 0901e77 /usr/local/Library/Formula/node.rb
0.10.25  git checkout bae051d /usr/local/Library/Formula/node.rb
0.10.24  git checkout 8c47ff7 /usr/local/Library/Formula/node.rb
0.10.23  git checkout 5ab4328 /usr/local/Library/Formula/node.rb
0.10.22  git checkout 72f61d1 /usr/local/Library/Formula/node.rb
0.10.21  git checkout f8e98c8 /usr/local/Library/Formula/node.rb
0.10.20  git checkout 653960e /usr/local/Library/Formula/node.rb
0.10.19  git checkout 7973d20 /usr/local/Library/Formula/node.rb
0.10.18  git checkout b74c1c9 /usr/local/Library/Formula/node.rb
0.10.17  git checkout f7bbdcc /usr/local/Library/Formula/node.rb
0.10.16  git checkout 1782834 /usr/local/Library/Formula/node.rb
0.10.15  git checkout 89e0a43 /usr/local/Library/Formula/node.rb
0.10.14  git checkout dbc76e5 /usr/local/Library/Formula/node.rb
0.10.13  git checkout f88d5b8 /usr/local/Library/Formula/node.rb
0.10.9   git checkout ec5f331 /usr/local/Library/Formula/node.rb
0.10.8   git checkout ee99542 /usr/local/Library/Formula/node.rb
0.10.7   git checkout e44f345 /usr/local/Library/Formula/node.rb
0.10.6   git checkout 8583540 /usr/local/Library/Formula/node.rb
0.10.5   git checkout 3b589c5 /usr/local/Library/Formula/node.rb
0.10.4   git checkout 10e219d /usr/local/Library/Formula/node.rb
0.10.3   git checkout 71fd5b1 /usr/local/Library/Formula/node.rb
0.10.2   git checkout 91636ea /usr/local/Library/Formula/node.rb
0.10.1   git checkout bfb5239 /usr/local/Library/Formula/node.rb
0.10.0   git checkout 687062f /usr/local/Library/Formula/node.rb
0.8.22   git checkout 3c4a714 /usr/local/Library/Formula/node.rb
0.8.21   git checkout a3ef032 /usr/local/Library/Formula/node.rb
0.8.20   git checkout 9f95fff /usr/local/Library/Formula/node.rb
0.8.19   git checkout 4824d7c /usr/local/Library/Formula/node.rb
0.8.18   git checkout 07783c3 /usr/local/Library/Formula/node.rb
0.8.17   git checkout 59c35b9 /usr/local/Library/Formula/node.rb
0.8.16   git checkout 8aeaf15 /usr/local/Library/Formula/node.rb
0.8.15   git checkout fc6441e /usr/local/Library/Formula/node.rb
0.8.14   git checkout 11b5459 /usr/local/Library/Formula/node.rb
0.8.12   git checkout 3ae0e38 /usr/local/Library/Formula/node.rb
0.8.11   git checkout f24a5f5 /usr/local/Library/Formula/node.rb
0.8.10   git checkout 4c0b143 /usr/local/Library/Formula/node.rb
0.8.9    git checkout fb8447d /usr/local/Library/Formula/node.rb
0.8.8    git checkout 52bdfa1 /usr/local/Library/Formula/node.rb
0.8.7    git checkout ae6acb4 /usr/local/Library/Formula/node.rb
0.8.6    git checkout bfc71f7 /usr/local/Library/Formula/node.rb
0.8.5    git checkout 7b00c66 /usr/local/Library/Formula/node.rb
0.8.4    git checkout 7b2f682 /usr/local/Library/Formula/node.rb
0.8.3    git checkout 31f8d9f /usr/local/Library/Formula/node.rb
0.8.2    git checkout 50ae8e4 /usr/local/Library/Formula/node.rb
0.8.1    git checkout 9ff0a1d /usr/local/Library/Formula/node.rb
0.8.0    git checkout 01f8006 /usr/local/Library/Formula/node.rb
0.6.19   git checkout 83988e4 /usr/local/Library/Formula/node.rb
0.6.18   git checkout 653fb77 /usr/local/Library/Formula/node.rb
0.6.17   git checkout a3ecde3 /usr/local/Library/Formula/node.rb
0.6.16   git checkout ed17582 /usr/local/Library/Formula/node.rb
0.6.15   git checkout e18b02f /usr/local/Library/Formula/node.rb
0.6.14   git checkout 30813c8 /usr/local/Library/Formula/node.rb
0.6.13   git checkout 3b771d0 /usr/local/Library/Formula/node.rb
0.6.12   git checkout 0e8ea8a /usr/local/Library/Formula/node.rb
0.6.11   git checkout 3eec1f4 /usr/local/Library/Formula/node.rb
0.6.10   git checkout 7e202eb /usr/local/Library/Formula/node.rb
0.6.9    git checkout f752570 /usr/local/Library/Formula/node.rb
0.6.8    git checkout 74bff39 /usr/local/Library/Formula/node.rb
0.6.7    git checkout 9a52dcf /usr/local/Library/Formula/node.rb
0.6.6    git checkout 97fce9a /usr/local/Library/Formula/node.rb
0.6.5    git checkout 911726f /usr/local/Library/Formula/node.rb
0.6.4    git checkout 67a2615 /usr/local/Library/Formula/node.rb
0.6.2    git checkout 05b94b9 /usr/local/Library/Formula/node.rb
0.6.1    git checkout b6eb4fc /usr/local/Library/Formula/node.rb
0.6.0    git checkout 6bec7fc /usr/local/Library/Formula/node.rb
0.4.12   git checkout 3eea412 /usr/local/Library/Formula/node.rb
0.4.11   git checkout b6aa338 /usr/local/Library/Formula/node.rb
0.4.10   git checkout 523d360 /usr/local/Library/Formula/node.rb
0.4.9    git checkout 10b3ded /usr/local/Library/Formula/node.rb
0.4.8    git checkout 8d45d93 /usr/local/Library/Formula/node.rb
0.4.7    git checkout cb6a4b4 /usr/local/Library/Formula/node.rb
0.4.6    git checkout 7c0f0d9 /usr/local/Library/Formula/node.rb
0.4.5    git checkout 8241b81 /usr/local/Library/Formula/node.rb
0.4.4    git checkout 83753a9 /usr/local/Library/Formula/node.rb
0.4.3    git checkout f4a925d /usr/local/Library/Formula/node.rb
0.4.2    git checkout 0476235 /usr/local/Library/Formula/node.rb
0.4.1    git checkout 8a60de4 /usr/local/Library/Formula/node.rb
0.4.0    git checkout b4497ec /usr/local/Library/Formula/node.rb
0.2.6    git checkout 8602eee /usr/local/Library/Formula/node.rb
0.3.2    git checkout 168cb3d /usr/local/Library/Formula/node.rb
0.2.5    git checkout f55f417 /usr/local/Library/Formula/node.rb
0.2.4    git checkout 89438ae /usr/local/Library/Formula/node.rb
0.2.3    git checkout 730f311 /usr/local/Library/Formula/node.rb
0.2.2    git checkout 981bb41 /usr/local/Library/Formula/node.rb
0.2.1    git checkout c963a35 /usr/local/Library/Formula/node.rb
0.2.0    git checkout fbb93d9 /usr/local/Library/Formula/node.rb
0.1.104  git checkout ed51a5b /usr/local/Library/Formula/node.rb
0.1.103  git checkout f3e7c1b /usr/local/Library/Formula/node.rb
0.1.20   git checkout 2baa60c /usr/local/Library/Formula/node.rb
0.1.17   git checkout ab7697f /usr/local/Library/Formula/node.rb
0.1.14   git checkout a82e823 /usr/local/Library/Formula/node.rb
LM-SJN-00874861:0.12.0 anudixit$

Step 3:
LM-SJN-00874861:0.12.0 anudixit$ cd $( brew --prefix )
LM-SJN-00874861:local anudixit$ pwd
/usr/local


Step 4:
LM-SJN-00874861:local anudixit$ git checkout fa636a8 /usr/local/Library/Formula/node.rb

Step 5:
LM-SJN-00874861:local anudixit$ brew install node
Error: node-0.12.0 already installed
To install this version, first `brew unlink node'
LM-SJN-00874861:local anudixit$

Step 6:
LM-SJN-00874861:local anudixit$ brew unlink node
Unlinking /usr/local/Cellar/node/0.12.0... 8 symlinks removed
LM-SJN-00874861:local anudixit$

Step 7:
LM-SJN-00874861:local anudixit$ brew install node
==> Downloading https://homebrew.bintray.com/bottles/node-0.10.30.mavericks.bottle.2.tar.gz
curl: (22) The requested URL returned error: 404 Not Found
Error: Failed to download resource "node"
Download failed: https://homebrew.bintray.com/bottles/node-0.10.30.mavericks.bottle.2.tar.gz
Warning: Bottle installation failed: building from source.
==> Downloading http://nodejs.org/dist/v0.10.30/node-v0.10.30.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/node/0.10.30 --without-npm
==> make install
==> Downloading http://registry.npmjs.org/npm/-/npm-1.4.9.tgz
######################################################################## 100.0%
==> make install
==> /usr/local/bin/npm update npm -g --prefix /usr/local
  /usr/local/Cellar/node/0.10.30: 1547 files, 19M, built in 2.4 minutes
LM-SJN-00874861:local anudixit$

Step 8:
LM-SJN-00874861:local anudixit$ cd /usr/local/Cellar/node
LM-SJN-00874861:node anudixit$ ls
0.10.30 0.12.0

Step 9:
LM-SJN-00874861:local anudixit$ brew unlink node
Unlinking /usr/local/Cellar/node/0.10.30... 5 symlinks removed
LM-SJN-00874861:local anudixit$ git checkout -- Library/Formula/node.rb
LM-SJN-00874861:local anudixit$ brew install node
Warning: node-0.10.30 already installed, it's just not linked
LM-SJN-00874861:local anudixit$ brew link node
Linking /usr/local/Cellar/node/0.10.30... 5 symlinks created
LM-SJN-00874861:local anudixit$ node -v
v0.10.30
LM-SJN-00874861:local anudixit$

Step 10: Switch Versions
LM-SJN-00874861:node anudixit$ brew switch node 0.12.0
Cleaning /usr/local/Cellar/node/0.10.30
Cleaning /usr/local/Cellar/node/0.12.0
6 links created for /usr/local/Cellar/node/0.12.0
LM-SJN-00874861:node anudixit$ node -v
v0.12.0
LM-SJN-00874861:node anudixit$ brew switch node 0.10.30
Cleaning /usr/local/Cellar/node/0.10.30
Cleaning /usr/local/Cellar/node/0.12.0
5 links created for /usr/local/Cellar/node/0.10.30
LM-SJN-00874861:node anudixit$ node -v
v0.10.30




Sunday, January 18, 2015

Application Specific Password - "iphone : imap.gmail.com is incorrect"

How to fix Gmail incorrect password/user name error on iPhone?

Sometimes the iPhone mail app will intermittently stop getting Gmail and the dialog box below will appear. The message "The user name or password for imap.gmail.com is incorrect" can show up even if you have made no changes to your Gmail account settings on the iPhone.

Here are instructions on how to fix this problem should it occur on your device:

  1. Quit all mail clients that are accessing the affected Gmail account. This means the Mail app on the iPhone and any other place you are accessing your Gmail from such as a computer.
  2. Open Safari on the affected iPhone and navigate to this page: http://www.google.com/accounts/DisplayUnlockCaptcha to create application specific password.
  3. Enter your full Gmail address, password and type the characters you see in the picture. Touch the unlock button to verify your account.
  4. Open the Mail app and your Gmail access should be restored.


Tips:

  1. Disable iCloud (Apple) and configure Gmail from Setting > Email .. to get your contact & Calendar from Google Account (you need to setup google's "Application Specific Password").

Sunday, January 11, 2015

No separate schema definition for p-namespace and c-namespace.



  1. p-namesapce (Parameter namespace)
  2. c-namespace (Constructor namespace)

p-namesapce (Parameter namespace)

p-namespace simplifies the setter-based dependency injection code by enabling you to use the parameters to be injected as attributes of bean definition instead of the nested <property> elements.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="addr1" class="com.ixi.samples.spring.cpns.Address">
        <property name="houseNo" value="2106"/>
        <property name="street" value="Newbury St"/>
        <property name="city" value="Boston"/>
        <property name="zipCode" value="02115-2703"/>
    </bean>
    <bean id="constArgAnotherBean" class="com.pfl.samples.spring.cpns.Person">
        <property name="firstName" value="Joe"/>
        <property name="lastName" value="John"/>
        <property name="age" value="35"/>
        <property name="address" ref="addr1"/>
    </bean>
</beans> 

with p-namespace, you can write this as:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="addr1" class="com.ixi.samples.spring.cpns.Address" 
             p:houseNo="2106" 
             p:street="Newbury St" 
            p:city="Boston" 
            p:zipCode="02115-2703"/>
    <bean name="person1" class="com.ixi.samples.spring.cpns.Person" 
            p:firstName="Joe" 
            p:lastName="John" 
            p:age="35" 
           p:address-ref="addr1"/>     
</beans>  

It is simple! All you need to do is

  1. Add the p namespace URI (xmlns:p="http://www.springframework.org/schema/p") at the configuration xml with namespace prefix p. Please note that it is not mandatory that you should use the prefix p, you can use your own sweet namespace prefix :)
  2. For each nested property tag, add an attribute at the bean with name having a format of p:<property-name> and set attribute value to the value specified in the nested property element.
  3. If one of your property is expecting another bean, then you should suffix -ref to your property name while constructing the attribute name to use in bean definition. For eg, if you property name is address then you should use attribute name as address-ref

c-namespace (Constructor namespace)

c-namespace is similar to p-namespace but used with constructor-based dependency injection code. It simplifies the constructor-based injection code by enabling you to use the constructor arguments as attributes of bean definition rather than the nested <constructor-arg> elements.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 <bean id="addr1" class="com.pfl.samples.spring.cpns.Address">
  <constructor-arg name="houseNo" value="2106"/>
  <constructor-arg name="street" value="Newbury St"/>
  <constructor-arg name="city" value="Boston"/>
  <constructor-arg name="zipCode" value="02115-2703"/>
 </bean>
 <bean id="constArgAnotherBean" class="com.pfl.samples.spring.cpns.Person">
  <constructor-arg name="firstName" value="Joe"/>
  <constructor-arg name="lastName" value="John"/>
  <constructor-arg name="age" value="35"/>
  <constructor-arg name="address" ref="addr1"/>
 </bean>  
</beans> 

and with c-namespace, it can be written as
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="addr1" class="com.pfl.samples.spring.cpns.Address"
        c:houseNo="2106" c:street="Newbury St"
        c:city="Boston" c:zipCode="02115-2703"/>
    <bean name="person1" class="com.pfl.samples.spring.cpns.Person"
        c:firstName="Joe" c:lastName="John"
        c:age="35" c:address-ref="addr1"/>
</beans>    

It is same as p-namespace. All you need to do is
Add the c namespace URI (xmlns:c="http://www.springframework.org/schema/c") at the configuration xml with namespace prefix c. The prefix is not mandatory like p-namespace
For each nested constructor-arg eleemnt, add the attribute with name c:<argument-name> to the bean definition and set the actual argument value as attribute value.
If one of your constructor argument is expecting another bean, then you should suffix -ref to your argument name while constructing the attribute name to use in bean definition (like p-namespace). For eg, if you argument name is address then you should use address-ref

Well, the above code has an issue though. It is using the constructor argument names and that will be available only if the code is compiled with debug enabled which may not be the case with production code. So, you will have to use the index rather than the argument names. With index, we can rewrite the above code as follows.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="addr1" class="com.pfl.samples.spring.cpns.Address">
        <constructor-arg index="0" value="2106"/>
        <constructor-arg index="1" value="Newbury St"/>
        <constructor-arg index="2" value="Boston"/>
        <constructor-arg index="3" value="02115-2703"/>
    </bean>
    <bean id="constArgAnotherBean" class="com.pfl.samples.spring.cpns.Person">
        <constructor-arg index="0" value="Joe"/>
        <constructor-arg index="1" value="John"/>
        <constructor-arg index="2" value="35"/>
        <constructor-arg index="3" ref="addr1"/>
    </bean>
</beans> 

With c-namespace:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="addr1" class="com.pfl.samples.spring.cpns.Address"
        c:_0="2106" c:_1="Newbury St"
        c:_2="Boston" c:_3="02115-2703"/>
    <bean name="person1" class="com.pfl.samples.spring.cpns.Person"
        c:_0="Joe" c:_1="John"
        c:_2="35" c:_3-ref="addr1"/>
</beans> 

You may notice that there is not much difference rather than using index in the place of argument name. Also, the index should be prefixed by _(underscore) to make it as a valid xml attribute name.

You can use both p-namespace and c-namespace in together in bean definition( see below):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">     
    <bean name="person3" class="com.pfl.samples.spring.cpns.Person" 
         c:_0="Mary" 
         c:_1="Joe" 
         c:_2="30" 
         p:address-ref="address2"/>
</beans> 

You may also have noticed that there is no separate schema definition for p-namespace and c-namespace.

Saturday, January 10, 2015

AOP - Aspect Oriented Programming

AOP basics: Before discussing Spring’s AOP implementation, we cover the basics of AOP as a technology. Most of the concepts covered in this section are not specific to Spring and can be found in any AOP implementation.

  • Types of AOP: There are two distinct types of AOP: static and dynamic. In static AOP, like that provided by AspectJ’s (http://eclipse.org/aspectj/) compile-time weaving mechanisms, the crosscutting logic is applied to your code at compile time, and you cannot change it without modifying the code and recompiling. With dynamic AOP, such as Spring AOP, crosscutting logic is applied dynamically at runtime. This allows you to make changes to the AOP configuration without having to recompile the application. These types of AOP are complementary, and, when used together, they form a powerful combination that you can use in your applications.
  • Spring AOP architecture: Spring AOP is only a subset of the full AOP feature set found in other implementations such as AspectJ. In this section, we take a high-level look at which features are present in Spring, how they are implemented, and why some features are excluded from the Spring implementation.
  • Proxies in Spring AOP: Proxies are a huge part of how Spring AOP works, and you must understand them to get the most out of Spring AOP. In this section, we look at the two kinds of proxy: the JDK dynamic proxy and the CGLIB proxy. In particular, we look at the different scenarios in which Spring uses each proxy, the performance of the two proxy types, and some simple guidelines to follow in your application to get the most from Spring AOP.
  • Using Spring AOP: In this section, we present some practical examples of AOP usage. We start off with a simple “Hello World” example to ease you into Spring’s AOP code, and we continue with a detailed description of the AOP features that are available in Spring, complete with examples.
  • Advanced use of pointcuts: We explore the ComposablePointcut and ControlFlowPointcut classes, introductions, and the appropriate techniques you should employ when using pointcuts in your application.
  • AOP framework services: The Spring Framework fully supports configuring AOP transparently and declaratively. We look at three ways (the ProxyFactoryBean class, the aop namespace, and @AspectJ-style annotations) to inject declaratively defined AOP proxies into your application objects as collaborators, thus making your application completely unaware that it is working with advised objects.
  • Integrating AspectJ: AspectJ is a fully featured AOP implementation. The main difference between AspectJ and Spring AOP is that AspectJ applies advice to target objects via weaving (either compile-time or load-time weaving), while Spring AOP is based on proxies. The feature set of AspectJ is much greater than that of Spring AOP, but it is much more complicated to use than Spring. AspectJ is a good solution when you find that Spring AOP lacks a feature you need.

AOP Concepts

  • Joinpoints: A joinpoint is a well-defined point during the execution of your application. Typical examples of joinpoints include a call to a method, the method invocation itself, class initialization, and object instantiation. Joinpoints are a core concept of AOP and define the points in your application at which you can insert additional logic using AOP.
  • Advice: The code that is executed at a particular joinpoint is the advice, defined by a method in your class. There are many types of advice, such as before, which executes before the joinpoint, and after, which executes after it.
  • Pointcuts: A pointcut is a collection of joinpoints that you use to define when advice should be executed. By creating pointcuts, you gain fine-grained control over how you apply advice to the components in your application. As mentioned previously, a typical joinpoint is a method invocation, or the collection of all method invocations in a particular class. Often you can compose pointcuts in complex relationships to further constrain when advice is executed.
  • Aspects: An aspect is the combination of advice and pointcuts encapsulated in a class. This combination results in a definition of the logic that should be included in the application and where it should execute.
  • Weaving: This is the process of inserting aspects into the application code at the appropriate point. For compile-time AOP solutions, this weaving is generally done at build time. Likewise, for runtime AOP solutions, the weaving process is executed dynamically at runtime. AspectJ supports another weaving mechanism called load-time weaving (LTW), in which it intercepts the underlying JVM class loader and provides weaving to the bytecode when it is being loaded by the class loader.
  • Target: An object whose execution flow is modified by an AOP process is referred to as the target object. Often you see the target object referred to as the advised object.
  • Introduction: This is the process by which you can modify the structure of an object by introducing additional methods or fields to it. You can use introduction AOP to make any object implement a specific interface without needing the object’s class to implement that interface explicitly.



Static AOP: in static AOP, the weaving process forms another step in the build process for an application. In Java terms, you achieve the weaving process in a static AOP implementation by modifying the actual bytecode of your application, changing and extending the application code as necessary. This is a well-performing way of achieving the weaving process because the end result is just Java bytecode, and you do not perform any special tricks at runtime to determine when advice should be executed.
The drawback of this mechanism is that any modifications you make to the aspects, even if you simply want to add another joinpoint, require you to recompile the entire application. AspectJ’s compile-time weaving is an excellent example of a static AOP implementation.


Dynamic AOP: Dynamic AOP implementations, such as Spring AOP, differ from static AOP implementations in that the weaving process is performed dynamically at runtime. How this is achieved is implementation-dependent, but as you will see, Spring’s approach is to create proxies for all advised objects, allowing for advice to be invoked as required. The drawback of dynamic AOP is that, typically, it does not perform as well as static AOP, but the performance is steadily increasing. The major benefit of dynamic AOP implementations is the ease with which you can modify the entire aspect set of an application without needing to recompile the main application code.


Advice Name:
1. Before: org.springframework.aop.MethodBeforeAdvice
2. After-returning: org.springframework.aop.AfterReturningAdvice
3. After (finally): org.springframework.aop.AfterAdvice
4. Around: org.aopalliance.intercept.MethodInterceptor
5. Throws: org.springframework.aop.ThrowsAdvice
6. Introduction:org.springframework.aop.IntroductionInterceptor