twitter
    Continuous Learning... Continous Improvement...

New Version 3.1 of ExpressionOasis Released

New version 3.1 of ExpressionOasis has been released.

Release Notes: 

  1. Grammar class is made configurable now. Developers can implement custom Grammar class and can specify this in configuration. ExpressionOasis will pick this at runtime. 
  2. Made grammar.xml path configurable by exporting it to config.xml
  3. Improved code of ExpressionFactory to improve the performance
  4. Defined new way to add function definition by providing new API in Grammar interface 
  5. Exposed Grammar through ExpressionEngine Class, so that user can get the metadata if required and also can add specific metadata like custom function identification etc
  6. Added three new String operation expressions > startsWith, endsWith, contains (Contribution by Girish Kumar) 
  7. Made config.xml path configurable from System Property (Contribution by Girish Kumar)
  8. Improved documentation
Download:
In case of any issue or any new requirement, please log it here. If you are extending the framework to add new features, please consider to contribute these back to the project. It will help everybody whosoever is using the ExpressionOasis.

Follow us:

How to Design Spring Application to Work with Multiple DataSources

Finally back to blogging. It was a long journey to get ready, pick the pen (i.e. computer) and start writing again. Writing is a matter of habit.

Today we are going to discuss about using multiple data sources with Spring Transaction Management. Scenario is,

  • Application is having lot of legacy code
  • Application needs to work with more than one databases
  • There are some legacy methods in application which are supposed to work with any one of the database depending upon use case. Same method could be invoked with different data source context for other transaction.
  • Application is using Spring Transaction Management
  • Requirement of Spring Transaction Management is to declare data sources and associated transaction manager with application context (1 to 1 relation)

What would be the initial design considerations. 
  • Define all required data sources in application context
  • Define corresponding transaction managers too
  • Use any of the Persistent Template to implement the DAOs.
  • Define desired transaction behavior on service methods

We are done with basic infrastructure code. In above steps, missing part is how to tell application code about which data source to be used from multiple data sources defined in context. It can be done by specifying the specific transaction manager with Service transactional attributes. Transaction manager can be defined either at class level or at method level. Or a good approach could be to use Transactional advice and define the transaction manager in context configuration with a pattern to identify the methods. 

Now, whenever any service method will be called using Spring Framework, Spring will see if there is any transaction proxy available for that method. If yes, transaction proxy will get invoked. It will work with defined transaction manager and will start a new or use existing transaction (based on transaction attributes). It will also try to attach the connection with the current transaction (thread local based implementation). Connection will be retrieved from the data source which is associated with the transaction manager. This connection will be linked with current transaction as synchronized resource. Please note, that connection may be attached lazily in case of 'LazyConnectionDataSourceProxy'. In this way, Spring enables the scenario to use multiple data sources in application based on specified transaction manager.  All the methods invoked during the service call, or from nested methods will go to the database which is associated with current transaction manager (and the data source).

What is Functional Programming - II

In previous article, we have discussed about basic concept of Functional Programming in brief. Continuing with same, today we shall discuss more about it.

Although there are many concept in Functional Programming which are different than Imperative programming style. However, following four points are very important and differentiating factors. These are:

  • True Functions
  • First Class Functions
  • High Order Functions
  • Focus on result, rather than on structure and procedure to do it

True functions, we have already discussed in previous article. These are the functions without any side effect and is a main building block for functional programming. These makes the parallel and concurrent programming easier.

First Class functions are the functions which can be presented anywhere in a program, like a variable. These can be passed as argument to any function, can be returned as value from function, can be assigned to a variable or can be stored in a data structure. These functions are the basic building block in functional programming. Java like languages does not have this feature. One possible similarity can be an anonymous class only, which can be passed as argument to any function in Java, but that is also quite limited in scope.

High Order functions are the functions which can take First Class functions as parameter or can return these as return value.

Combining above two type of function, we can write very dynamic programs. Imagine, a variable is passed to a function with another logic definition and hence added all possible dynamic behavior in same method. We can do this in Java also, by passing some commands or executors etc. But it is not that flexible. In Java, anyhow, we need to write a class even when we only need an behavior. Functional programming allows to define the functions directly without thinking about class structure and allow to pass these to other methods. A much easier and quick implementation.  

Fourth and important point is that functional programming advocates the focus on result, rather than on procedure of implementation or structure. Following this concept, Functional Programming languages provides a lot of abstract implementations for various repetitive tasks, like for iterating over collection, for parsing and reading any element from XML etc. In a language like Java, our focus used to be on good Object structure and the implementation logic. While iterating over a list, we plan whether we should use index based iteration or should use iterator. For XML parsing, we plan which parser we should use and so on. However, functional programming languages hide these implementation details from the programmer and provides high level syntax for performing such functions. Now if implementation is hidden from programmer, and is being taken over by language itself, it means that any programmer can implement the program much faster in functional programming. However, it means we are banking upon language capability to make a good decision or logic to perform these actions.

Doesn't this feel like loosing control to the language. Like in Java, we have control over every piece of code. We can open the source code and can see how List.add is working. If we are not happy with it, let us extend the list and write a custom logic to add the items in List. Hence a complete control what we want to do. So is that OK to loose all control to language and just use the high level language syntax. A big doubtful point  from a programmer working with Java kind of language, hard to digest. What if language is not perfect, or having bugs.

However, let us see the positive side of this approach. If programming language is providing the abstraction for such repetitive tasks and implementation logic, it means lesser coding for a feature implementation. Less coding also means lesser issues in implementation and more outcome, more focus on business code and hence the result. Further, in most of the cases, implementation done by language can be much better than ours. We may not be expert in all logic implementation. And as and when language implementation will improve its implementation logic for functions, our program will be benefited automatically. Any improvement in code means improvement for our application also without making any change.   Eventually languages will try to have better and better implementation with almost zero bugs and better performance. Hence if language implementation is that good, do we really need to have control on these basic logic implementation. Shouldn't we focus our energy on writing something more meaningful for business i.e. the business application functionality. Lets put all our efforts for business features.

For a Java programmer, the program structure given by functional programming languages is hard to digest. It is a altogether new structure with much different organization of objects, and classes etc. But if we think, it is just another way of writing the program and it is good if we are getting more work done by writing lesser piece of code. For example, if we are interacting with computer or machines, we always want to get more work done by machine in smallest possible instructions. If we need to send an email, we always like a single command like 'Send Email to ABC with following contents', rather than to write a complete low level program to interact with mail server. Functional languages are only that kind of step for programming approach. These can make programming much easier task if used properly. And eventually we can reach to a point when one line of instruction will perform all required functions, for which we used to write a whole 2000 line class in Java. Actually Java is also evolving in that direction with many new utilities, AOP, lambda expressions etc. So this will be the requirement of future and is worth to embrace.

I hope it will help. We shall keep discussing more concept about Functional Programming. 

Solution - 'gem install mysql2' Fails

Today I spent some good hours to debug the issues while installing 'mysql2' gem. It was failing again and again stating that 'libmysql' not found (even after applying the solution I mentioned in previous blog). To share, I am mentioning all the steps from previous blog with today findings.

  1. Install 'MySQL' on your machine. Choose the installation depending upon your machine architecture i.e. 32 or 64 bits
  2. Have devkit installed on your machine. It can be download from 'http://rubyinstaller.org/downloads/'
    1. Download right installer for your machine i.e. 32 or 64 bits
  3. Install devkit by following instructions at 'https://github.com/oneclick/rubyinstaller/wiki/Development-Kit'
  4. Go to <MySQL installation dir>/lib and copy the 'libmysql.dll' to <ruby installation dir>/bin
  5. Try running gem install mysql or mysql2
  6. It should install now. However, if you still face problem, follow steps given below
  7. Try specifying the --with-mysql-lib and --with-mysql-include options with gem command by specifying the mysql installation respective directories
  8. If it still fails to load the 'libmysql', ensure that you don't have space in the path of MySQL installation directory. 
  9. Simple solution could be to copy the lib and include folders to a simple path like C:/mysql and specify the path of include and lib folder with gem command using --with-mysql-lib and -include options
  10. Hopefully it should resolve the issue
Hope it will help. 

What is Functional Programming

Today we shall discuss about Functional Programming in brief. Functional Programming is a different paradigm than Imperative style programming. Imperative programming includes change in states with functions, however, Functional programming advocates functions without any side effect, i.e. no effect on any of the state. This is a big difference in programming approach with many other implementation level differences.

Let us understand bit in detail, what is Functional Programming and how is that different than Imperative Programming.

For development using Java like language, we mostly follow Imperative style programming. Where a Class like data structure contains some state or represents state. Functions are implemented to work on this state. Functions make changes in states based on current state or passed parameters. End result is, once functions are executed, the shared states may be changed.

Functional Programming supports the concept of Pure functions. It states that function implementation should not have any side effects. It means that functions will not modify any state. These will only act on the parameters and will return the result. No state will be changed anywhere else. This also means that does not matter, how many times, you call these functions; if parameters are same then result will always be same.  This is one of the biggest difference in approach.

Let us discuss, how does this difference matter. With above understanding for Imperative style programming, if we want to support concurrent execution, we can apply concurrent programming concepts using threads and locks to safeguard the simultaneous update of states by multiple threads. We use different kind of locks, synchronized blocks etc to support the concurrent programming. Although with mature API support like java.util.concurrent, concurrent programming is getting much simpler now; but still it needs lot of care and knowledge to implement a perfect program. Moreover, we understand many scenarios only when program actually runs on multiple processors and scenarios changed with number of concurrent streams. So testing the concurrent programs is hard.

However, what if there is no shared state to modify through functions like in 'Functional Programming'. Then there is nothing to safeguard in concurrent or parallel processing. There is no overhead of locks and hence the concurrent scenarios testing. Results will always be same from a function irrespective of whether it is being executed by one or multiple threads by multiple processors. Functions just act on the passed parameters and return the result. Isn't that a big relief. Certainly, it can make parallel programming a lot more easier. Programmers can focus on business logic implementation instead of managing the concurrent programming scenarios. Further, it is entirely feasible and easy to process different functions in parallel on parallel processing units. Different implementation functions can be submitted to different processors. As there is no shared state to access or modify, so there is nothing for the processors to compete for. These can work parallel in harmony. So with proper designing, results can be utilized later from different processing units to form the final result.

From above discussion, it would be becoming clearer that Functional Programming is having edge when it comes to parallel processing and make it comparatively very easy to manage. This is one of the major difference in programming style and the benefits. That is why Functional Programming languages like Scala are getting popular. Why not, demand is for parallel processing after all.

There are many other differences also. Like, Functional Programming supports the concept of 'First Class' and 'Higher Order functions'. 'First Class' functions are, which can be presented in a program anywhere like any other first class member can present, for example anywhere like a Number type member, or as parameter or return value of a function. High order functions are, which can take other functions as parameter or can return these as return value.

We shall discuss  more for these implementation level differences and other concepts with coming articles. 

Vedic Math - Cube Roots

Today, we are taking a next level of topic i.e. finding the cube root. With normal approach, finding cube root is bit complex. However, using Vedic Math techniques, it becomes interesting and fast too. This amazing technique will help you to find out the cube root of a  4 or 5 or 6 digits number quickly and all using mind power only. Technique specified in this article will work for perfect cubes only, not for other numbers (that we shall discuss in forthcoming articles). Lets start learning.

We know that, cube of a 2-digit number will have at max 6 digits (99³ = 970,299). This implies that if you are given with a 6 digit number, its cube root will have 2 digits. Further, following are the points to remember for speedy calculation of cube roots (of perfect cubes).
  1. The lowest cubes (i.e. the cubes of the fist nine natural numbers) are 1, 8, 27, 64, 125, 216, 343, 512 and 729.
  2. They all have their own distinct endings; with no possibility of over-lapping (as in the case of squares).
  3. The last digit of the cube root of an exact cube is obvious:
    • 1³ = 1    > If the last digit of the perfect cube = 1, the last digit of the cube root = 1
    • 2³ = 8    > If the last digit of the perfect cube = 8, the last digit of the cube root = 2
    • 3³ = 27  > If the last digit of the perfect cube = 7, the last digit of the cube root = 3
    • 4³ = 64  > If the last digit of the perfect cube = 4, the last digit of the cube root = 4
    • 5³ = 125 > If the last digit of the perfect cube = 5, the last digit of the cube root = 5
    • 6³ = 216 > If the last digit of the perfect cube = 6, the last digit of the cube root = 6
    • 7³ = 343 > If the last digit of the perfect cube = 3, the last digit of the cube root = 7
    • 8³ = 512 > If the last digit of the perfect cube = 2, the last digit of the cube root = 8
    • 9³ = 729 > If the last digit of the perfect cube = 9, the last digit of the cube root = 9
  4. In other words,
    • 1, 4, 5, 6, 9 and 0 repeat themselves as last digit of cube.
    • Cube of 2, 3, 7 and 8 have complements from 10 (e.g. 10's complement of 3 is 7 i.e. 3+7=10) as last digit.
  5. Also consider, that 
    • 8's cube ends with 2 and 2's cube ends with 8 
    • 7's cube ends with 3 and 3's cube ends with 7
If we observe the properties of numbers, Mathematics becomes very interesting subject and fun to learn. Following same, let’s now see how we can actually find the cube roots of perfect cubes very fast.

Example 1:  Find Cube Root of 13824

Step 1:
Identify the last three digits and make groups of three digits from right side. That is 13824 can be written as          
   13  ,   824
 
Step 2: 
Take the last group which is 824.  The last digit of 824 is 4.
Remember point 3, If the last digit of the perfect cube = 4, the last digit of the cube root = 4
Hence the right most digit of the cube root  = 4

Step 3:
Take the next group which is 13.
From point 3, we see that 13 lies between 8 and 27 which are cubes of 2 and 3 respectively. So we will take the cube root of the smaller number i.e. 8 which is 2.
So 2 is the tens digit of the answer.

We are done and the answer is '24'

Isn't that easy and fun..

Design for Server Side Pagination

In previous article, we have discussed about various type of pagination and that how these work. We have seen that in most of the scenarios, server side pagination is better than client side pagination. Client side pagination can be used only if data, i.e. the number of records, are limited. In that case, we can consider to load all data on client side and may divide the data in pages while showing on screen. However, if data is large, we would prefer the server side pagination.

In this article, we shall discuss how we can design the server side pagination component. At first, let us summarize the requirements for server side pagination.

Requirements
  • Data is large enough to support the needs of server side pagination implementation, as discussed in previous article.
  • Only current page of data (or may be 1-2 more pages) should be loaded from data repository (DB), so we want to reduce the need to load large amount of data from data repository. The same or lesser amount of data should be loaded on client side.
  • User can navigate  through the pages using next, previous, first or last page kind of actions. 
  • User can also perform 'sort' and 'search' kind of operation on the data.  
With above requirements, let us design the Pagination Component now. 

Analysis and HLD

After analysis of above requirements, following are the main design requirements:
  1. Client - Any software program which needs to retrieve the large amount of data, but want to present this to end user (or application) in pages. Client can be a UI which is showing listing of data to end user, or may be a command line tool to show the data. 
  2. We need a component which 
    1. Can maintain the state for each client. Various states needs to be maintained are: 
      1. Current Page for which data is returned last time to client
      2. Number of records to be returned for one page
      3. Various data retrieval attributes required for fetching the page data from Data Repository, using data access component. These can be 
        1. Criteria to select the desired data 
        2. Sort criteria
        3. Search criteria
        4. etc
    1. Can work as a channel to retrieve the data from repository using data access components
    2. Can provide utility methods to client for accessing the data pages based on user requests like, next | previous | first | last | specific page number
    3. Can provide methods to client using which client can change various data retrieval attributes. This is to support the scenario, when end user change the search or sort criteria at UI.
  1. We need an abstract data access layer (can call it pagination data provider), which can understand the  language of pages and can return the filtered, and sorted data for specified page. 
  2. This component can be named as 'Pagination Manager' 

Vedic Math - Square Root-2

In this article, we shall continue discussing the remaining part of discussion 'how to find the Square Root using Vedic Math'. In last article , we discussed the technique for 4-digit numbers, In this article, we shall discuss the another technique which is useful for bigger numbers. In this method, we shall use "Duplex" (mentioned in General Squaring).

So, First observation:
  • if number is 69563217 then n=8, Digits in the square root is 8/2=4, pairing is 69'56'32'17 and the first digit will be 8(82=64)
  • if number is 764613731 then n=9, Digits in the square root is (9+1)/2=5, pairing is 7'64'61'37'31 and the first digit will be 2 (22=4)

Recall "Duplex"
• for a single digit 'a', D = a2. e.g. D(4) = 16
• for a 2-digit number of the form 'ab', D = 2( a x b ). e.g. D(23) = 2(2x3) = 12
• for a 3-digit number like 'abc', D = 2( a x c ) + b2. e.g. D(231) = 2(2x1) + 32 = 13
• for a 4-digit number 'abcd', D = 2( a x d ) + 2( b x c ) e.g. D(2314) = 2(2x4) + 2(3x1) = 22
• for a 5-digit number 'abcde', D = 2( a x e ) + 2( b x d ) + c2 e.g. D(14235) = 2(1x5) + 2(4x3) + 22 = 38  and so on.

As we know how to calculate the duplex of a number, now we learn how to use it in calculating the square root of a number?
We will explain using an example.

Example:  734449

Step1: n=6, Digits in the square root is 6/2=3, pairing is 73'44'49. Rearrange the numbers of two-digit groups from right to left as follows:
         | 73 :  4  4  4  9
.|    :
-----------------
.|    :
     As you see, in above representation, we provide spaces in front of the numbers to perform straight division, if required.

Step2: Now, find the perfect square less than the first group 73 i.e 64 and its square root is 8. Write down this 8 and the reminder 9 (73-64=9) as shown below:
         | 73 :   4   4   4   9
     16| 64 :9
     ------------------
         | 8  :

     We also calculate twice of number '8' (i.e. 8 x 2 = 16), and put that number to the left of the "|" on the second line as shown above. Here, number '16' is the divisor and which is always double of the quotient (here, quotient is 8).

Step3: Next is the gross dividend, the number which we have written after the colon on the second line appended in front of the next digit of the square. Thus, our gross dividend is 94.
 
     Since there are no digits to the right of the " " on the answer line, we will not subtract anything here. If there are any digits on the answer line to the right of the " ", then we calculate duplexes for that digit and subtract it from dividend. But here, without subtracting anything from the gross dividend, we divide 94 by the divisor 16 and put down the second Quotient digit 5 and the second reminder 14 in their proper place.
  

Vedic Math - Square roots

Earlier we discussed "Squaring numbers near base" and "General Squaring through Duplex Process" and now we will find out how to calculate the square root of numbers. To understand this, let us first learn basic rules for finding the square root.

(1). The given number is first arranged in two-digit groups from right to left. If on left hand side, a single digit is left, that will also be counted as a group.
(2). The number of digits in the square root will be the same as the number of groups derived from the number. Examples are:
  • 25 will be having one group as '25', hence square root should be of one digit.
  • 144 will be having two groups as '44' and '1', hence the square root should be of two digits.
  • 1024 will be having two groups as '24' and '10', hence the square root should be of two digits.
(3). If the given number has 'n' digits then the square root will have n/2 or (n+1)/2 digits
(4). The squares of the first nine natural numbers are 1,4,9,16,25,36,49,64, and 81. All of these squares end with 1, 4, 5, 6, 9, 0. This means
  • An exact square never ends in 2, 3, 7 or 8
  • If a number ends in 2, 3, 7 or 8, its square root will always be an irrational number
  • If an exact square ends in 1, its square root ends in 1 or 9
  • If an exact square ends in 4, its square root ends in 2 or 8
  • If an exact square ends in 5, its square root ends in 5
  • If an exact square ends in 6, its square root ends in 4 or 6
  • If an exact square ends in 9, its square root ends in 3 or 7
(5). If a perfect square is an odd number, the square root is also an odd number
(6). If a perfect square is an even number, the square root is also an even number
(7). A whole number, which ends with an odd numbers of 0's, can never be the square of a whole number
(8). An exact square never ends in a 6 if the penultimate digit(digit that is next to the last digit) is even (eg. exact squares can not end in 26, 46, 86, etc.)
(9).An exact square never has an odd penultimate digit unless the final digit is a 6 (thus, exact squares can not end in 39,71, etc.)
(10).An exact square never ends with an even number when the last two digits taken together are not divisible by 4 (thus, no exact square can end in 22, 34 and other non-multiples of 4 if the last digit is even)

Firstly, we use "The First by the First and the Last by the Last" technique to solve the square root.

(1). 6889
     There are two groups of figures, '68' and '89'. So we expect 2-digit answer.
     Now see since 68 is greater than 64(82) and less than 81(92), the first figure must be 8.

     So, 6889 is between 6400 and 8100, that means, between 802 and 902.
     Now look at the last figure of 6889, which is 9.
     Squaring of numbers 3 and 7 ends with 9.
     So, either the answer is 83 or 87.
     There are two easy ways of deciding. One is to use the digit sums.
     If 872 = 6889
     Then converting to digit sums
     (L.H.S. is 8+7 = 15 -> 1+5 -> 6 and R.H.S. is 6+8+8+9 -> 31 -> 3+1 -> 4)
     We get 62 -> 4, which is not correct.
     But 832 = 6889 becomes 22 -> 4, so the answer must be 83.
     The other method is to recall that since 852 = 7225 and 6889 is below this. 6889 must be below 85. So it must be 83.

Note: To find the square root of a perfect 4-digit square number we find the first figure by looking at the first figures and we find two possible last figures by looking at the last figure. We then decide which is correct either by considering the digit sums or by considering the square of their mean.

(2). 5776
     The first 2-digit(i.e. 57) at the beginning is between 49 and 64, so the first figure must be 7.
     The last digit (i.e. 6) at the end tells us the square root ends in 4 or 6.
     So the answer is 74 or 76.
     742 = 5776 becomes 22 -> 7 which is not true in terms of digit sums, so 74 is not the answer.
     762 = 5776 becomes 42 > 16 -> 7, which is true, so 76 is the answer.
     Alternatively to choose between 74 and 76 we note that 752 = 5625 and 5776 is greater than this so the square root must be greater than 75. So it must be 76.

Second technique is useful for bigger numbers and in this method, we use "Duplex". In the next article, we shall continue to discuss this second technique. Until then, good luck and happy computing!!


If you like the article, you may contribute by:
  • Posting your comments which will add value to the article contents
  • Posting the article link on Social Media using the Social Media Bookmark bar
  • Connecting with 'VedantaTree' on Facebook (https://www.facebook.com/VedantaTree)

Vedic Math - Fourth Power of 2 Digit Numbers


We discussed the cube of 2-digit number in previous article. In this article, we shall describe the fourth power of 2-digit numbers using the same formula.

The Algebraic Expression of (a + b)4

 (a + b)4 = a4 + 4a3b + 6a2b2 + 4ab3 + b4

 We can rewrite the above equation as:
           a4       a3b          a2b2           ab3        b4
                   3a3b        5a2b2          3ab3
So, apply the same rule which we applied in previous article, while finding cubic of the number. Consider the first term as a4 and the remaining terms get multiplied by b/a with the previous term.
The Difference comes in second row, in fourth power, we multiply 2nd and 4th term by 3 and 3rd term by 5.

Example: 114

            1    1    1    1    1
                 3    5    3
          -------------------------
            1    4    6    4    1
          -------------------------

Example: 324
         
            81     54      36     24     16
                   162    180     72
          -------------------------------------
          104      8       5        7       6
          -------------------------------------

The "Binomial Theorem" is thus capable of practical application more comprehensively in Vedic Math. Here it is been utilised for splendid purpose as described above, with Vedic Sutras.

If you like the article, you may contribute by:

  • Posting your comments which will add value to the article contents
  • Posting the article link on Social Media using the Social Media Bookmark bar
  • Connecting with 'VedantaTree' on Facebook (https://www.facebook.com/VedantaTree)