Art of Clean Code - Logging




 "In some ways, programming is like painting. You start with a blank canvas and certain basic raw materials. You use a combination of science, art, and craft to determine what to do with them." - Andrew Hunt

My first lesson for importance of logging was in 2001-02, from my manager and coach Puneet Agarwal. We were building a framework for Data Bound Swing Components which can be used to design any application using a custom Net Beans kind of IDE, to enable rapid application development.


Design was to extend Swing Components, attach metadata for data source/s in context and pass it across component hierarchy using component life cycle events like add/removeNotify, and extend paint/print functions to render the components using data. This seems like a simple design flow, but had complex implementation due to hierarchical nature of UI elements. Data needs to be passed (and cleaned too) from parent to children and vice versa. Which means, any break in this recursive flow or any small miss (ex: even mishandling of data loading in repeated rendering events trigger by Swing) could cause issue in data loading, in rendering, memory management, and on focus kind of user facing features also.

The only savior to debug in such complex recursive programming environment was 'art of logging'. This is when my manager taught me the importance of logs, including right level of logs with right level of information and easy to understand format. I still remember that lesson and follow it that,

Logging is an Art

Fast forward today, we have much advanced features in IDE, ex: breakpoints, debug mode etc. These are making debugging much easier with live runtime data and control on start, restart and stop of events. Having said that, when there is issue in server or distributed environments, logs are very useful to understand the issue in one go by looking at logged data. Even in local dev environment also, it is much easier to see the whole system state by reading the properly crafted logs in one go.

Hence an effective logging is very important for clean code, a code which can be maintained easily for long, a code which can run in production without causing distress in nights for developers / ops / users and is easy to debug and fix quickly if there is any issue.

Let's talk about few of the important basics to make logging effective, and hence to write a clean effective code.


Have a common understanding of 'Format of Logs'

Yes, it is important. Refer to previous blog here about clean code, where we discussed about having standard formatting for codebase in a team, as it makes reading code easy. Same principle applies to logs also. If there are different kinds of log formatting, and patterns, it takes time to understand, and makes sense of it.

We should be able to read logs like a Story . A story narrating the state of system in simple words

Art of Clean Code




 If someone ask me who is my Guru for Java, I would say 'Sun Microsystem' and 'Apache Foundation'.

I am from a generation, where most of the programming learning was by reading Java source code. Internet was not a big store of many rich blogs or forums, and hence reading through code was the best resource. Moreover, kind of components we built, were not possible without understanding the behavior of system we are extending. Hence reading through code was almost mandatory for building right extension, and the products.

One notable thing, I still remember and admire about Java and Apache kind of products source code is, clarity of code constructs and rich documentation, code which speaks its intention very clearly. That made the code reading experience enjoyable and easy like a story book. I remember reading tons of code of Swing, Concurrent library, Collections and Apache Axis etc like a novel. Much of the credit of reading such large codebase was to that effective coding and documentation style, which developers followed to write such code.

Fast forward today, we are in era where doing more by writing lesser code is sought after style. With availability of functional language, many abstract language constructs and lambada expression kind of support, it makes all the sense and makes code less bulky too.

Yesterday or today, then or now, basic principles of writing clean code are same and equally required. Ultimately it is all about art of writing readable code, clean code, a code which speaks of its intention clearly, where it is hard for bugs to hide, a code which can tell about any dysfunction loudly.

What is clean code:

Any fool can write code that a computer can understand. Good programmers write code that humans can understand - Martin Fowler

  • A code which can be read easily by anyone and everyone other than its original author.
  • A code which speaks of its intention clearly, either with write naming convention or with documentation as relevant
  • A code where it is hard for bugs to hide
  • A code which can tell about any dysfunction in system loudly itself
  • Let us talk in brief about some of key enabler principles for clean code.


Meaningful Names - Names which reveals intention

If I need to choose one most important thing for clean code, I will pick this. That is its importance for code readability and maintainability.

Picking right name, which can reveal its intention of existence is very important. It takes time to pick right name, however, that effort and time are worth it as it could save hours of efforts later to understand the code or any issue.

Story of Story Points

"Let's use Story Points

Why?

We are following agile now

Yayy.. story points!

How many hours these epics, stories will take?

But we are using story points..

Yeah, but we still need to plan. Hours are better for that. 1 SP - 5 hours. ok?"

Heard this story of story points many times.

-----

It is important to understand why do we need Story Points? Is it mandatory for being agile? Are hours prohibited?

The key motive for story points or hours is that we need to estimate the work, so we can tell what can be achieved in given time. Hence, we try to estimate. Hours are used since long because time is easy measure for us, and we can quantify easily, 'accurately'.

However, it become challenging when we found that even after best try, it is hard to estimate the time. It is more and more true in non-mechanical activities, where outcome depends on many intangible factors like skills, information available, mood, motivation, environment and so on.

If estimates can not be done accurately, then why to estimate. Let us just keep working and ship whatever is done. And this is also one of the philosophy and may work in specific setup. However, most still need a roadmap with understanding of possibilities which feed into overall plan of business.

'Possibility' is the key word here. We gradually understood that accurate estimate is not semantically and practically right. However, we can try to have best guess based on available information, which reflects the possibilities. As long as, we accept this fact, that we are talking about possibilities, hours or story points or tshirt size or anything else works.

If we consider this, ultimately, it boils down to 'common understanding'. Common understanding that when we are estimating, we are talking about possibility. If we all are good with this, any unit can be used for estimation.

Building up on this understanding, let us talk about common understanding. How easy or difficult is it to have common understanding with many people of different skills set, experiences, background, motives, different stakes and responsibilities. There are so many psychological factors, which makes it difficult to have this common understanding, more so if unit of measurement (hours) is traditionally used for accurate outcome. As soon as, we say x hours, it triggers a mental understanding of accurate number and then we want to see that getting materialized. People usually understand that estimates are just estimates. But as soon as we attach it with Hours kind of definitive measure, it build up expectations of accuracy. This is the key challenge to address.

Daily Stand-Up - Not Just a Ritual

Here is a brief write-up about Daily Stand-up ritual of 'Being Agile' journey. 

Motive is to give quick overview about this ceremony, sharing some of the learning. For detail reading, I would recommend the link given at the end of this article.  

What is the purpose of daily stand-up:
  • Shared understanding of goals and current status 
  • Plan your day (self-management)
  • Coordinate efforts, ask for help, offer help
  • Ensure team communication
  • Identify as a Team

What are daily stand-up basics, and these are designed for important purpose (refer to links given at the end):
  • Fix time
  • Fix place
  • Must not be more than 15 min
  • Whole team gather themselves
  • Everyone derive her/his status following three scrum magical questions. Important: It is all about sharing plan, not the task names. Focus should be, what I am doing to contribute to delivery.
  • Breakout session at the end or later, if anyone need to discuss more
  • Share plan which makes sense to team in bigger context for delivery, It is not about status sharing.
  • Only PIGs are allowed to speak. Chickens can join as listener although (refer to scrum pig/chicken story please)

NOT to do:
  • Not being regular
  • Coming without preparation
  • Story telling 
  • Problem solving
  • Using it as reporting or tracking meeting, 
  • Reporting to a Leader or to SM or to Manager. It is all about team communication.
  • Work assignment - Mostly, it is done during sprint plan and weekly scrum. There could be few exceptions like helping anyone or any critical work, which team can take call.
  • Running across locations (Soln: break in co-located teams. Share the brief in Teams space – only if day to day work is too interdependent - which is neither ideal, nor productive)

What Great Leaders Do - Continuing

Covering rest of the two points which I promised in previous post

4. Create a sense of Belonging and Purpose

An important feeling for all of us is feeling of 'I belong here'. This feeling is everything. It defines the comfort for us, for team. It defines the efforts, real contributions, and the results. It defines how much team is connected with the Organization.  

Fostering this feeling is not easy. Leaders helps to create, nourish, and empower the environment which can help in fostering this feeling.

'Promote Environment for Being thyself' - This is the big contributor to feeling of Belonging. If people feels, they are accepted for what they are and need not to change just to fit in, they feel comfortable. It is not about being rigid, or averse to change or learning. Rather it is more helpful to promote learning. Learning comes from adaptability and adaptability starts with being comfortable with oneself, without being defensive or faking any of the trait just to fit in. Once people are comfortable in being what they are, they are actually better aligned to learn and improve to next level, while being connected to the Organization. 

One of the mistake we can do is to have one mold to make everyone perfect and fit in our own world. That is a trap which seems like working at first, and is very well doable with all the great powers, but it will eventually stop people from learning and to use their genuine talent. Eventually they either just 'fit in' or don't belongs to the place. In both the cases, we loose the talent.

Leaders accept their team for who they are, however, have genuine interest to help them to learn, grow and become better version of themselves.

What Great Leaders Do

'What Great Leaders Do' - I don't buy the greatness of 'Great' word, it is simply a search keyword :) 

Whenever I think what leaders do, few flashbacks always help me, when I heard following advice from my mentors.
  • 'Let us see how we can solve this problem yours way'
  • 'Show people what you think, so they know what you think, and your management style'
  • 'Understanding context, Respecting everyone, Integrity in words and actions are important ingredients to manage the talent'
Adding some observations and learning, I experienced so far. Promising, will not make it a long list, but explanation for each point could be long. 

1. Ensure that People feel safe

This is the first priority for the leaders. They reflect this in all of their actions, and words. They work on it day in, day out. 

Why does this has to be a day in, day out job. Because once you are in leadership role, every action impact the masses. The way you communicate, listen and respond, write emails, body language, how you respond to conflicts, how you react to mistakes and failures, all these are followed closely by the team. Every single action is a clue for team, to deduce that how safe they are around you.

Why does feeling safe so important. Let us understand it from neurological perspective. 

When Human being faces threat (physical or mental), our self-defense mechanism kicks in and make us ready for 'fight or flight'. Result, arteries get tightened and tensed to pump more blood to body elements. Heart works rapidly and hard. When body is working so hard to manage the threat, naturally our brain can not focus on creativity, executive functions or social engagements. 

Hence, if team is not feeling safe, we loose Creativity, Executive thought process and most importantly Social Engagements which is the basis of team work. Loosing these means, loosing the team and organizational goals as well.

Next, important point is how to ensure this safety net.

Monolithic vs Decoupled Schema


Let us understand what we mean by Monolithic and Decoupled architecture, Schema with an example.

Setting up a library

Let us take example of library. A new library is opening up. It would have many books, may be on various subjects. First task for librarian is, to store the books in library.

Librarian started with obvious approach first, i.e. start putting all books in shelf, one after other. It was quick. She puts all the books quickly in the shelves; and created an index to search any book.  




Benefits:
  • It was quick, easy, and less work. Just one simple storing strategy, every new book will go to next available space.
  • You have all sort of books at one place, which means just keep updating one index for every new book – no need to maintain separate indexes.
  • Readers can find all sort of books at one place for all of their tastes. They need not to go to multiple places. Just iterate over and you will find what you need.
  • For librarian, access management is easy. Anyone having access to library, can access any book easily. Less time spent on management.
  • It is easy for readers to refer any other related book also. For ex: if you reading astronomy book, and need to refer a math book. It might just be somewhere in same row.

All setup done. Things started rolling. All good so far. Eventually library become popular and started getting more readers and requirements for new books. Librarian started ordering more and more books on various subjects.

Challenges:

However, as volume of books increased, Librarian started observing few issues. Like:

Own the Problem and Solve It

Problems are problematic and sometime so much problematic that this demand last pint of efforts from us and still challenge us more. But, problems are part of life and will continue to be there. Hence only way to deal with problems is to 'Deal' with these.

One of the common phoenomenon I found is, we are more worried by thinking about problem than actually by the problem. We keep on thinking about problem, by doing all permutation and combination for all possible scenarios, outcomes, what if situations, and get defeated multiple times even before facing the actual problem. Seems, this is more problematic than actual problem. This mentality or habbit (quite common, you are not special) creates more pain for us than what actual Problem can do. We keep on struggling with these problematic thoughts for days,  months or years sometime, but won't take a step to solve it. Result, many a times, we are making a Mountain out of a Molehill or a Bigger Mountain from a small mountain, or pushing our head against that Mountain rather than to take a step to side and walk around this.

Why we do this. What is the solution.

Let us address it step wise. We do this because many a times, we stuck in a loop of thinking, anticipating, visualizing, fearing and the repeating all again. We don't take even a single step considering that result won't be good. We have high inertia.

What is the solution. Solution is to take first step towards solution. We all have solution. It may not be perfect, or may not be the right one.  But we all have capacity to think about solution. So taking step towards solution is the only way out. It is perfectly fine to make a wrong decision. However, it is good as long as we have courage to review it and change our course of action. But what absolutely wrong is, if we don't even take a step. So the solution is to own the problem, think about solution, pick the best from your options, and start executing. If it is right, your problem will be solved. If it is not right, at least you will learn to take next step.

Problems are part of life, and will continue to be there till we exist. Problem free life is not a reality and is not going to be happen. However, a life with solutoins for problem is feasible. So strive for that. And only way out is, Own the problem and take first step to solve it.

What is In-Memory Database Management System

In Memory Database is a fascinating field for a programmer, for an architect, and for technology leaders. Let us try to understand in this article, what is In-Memory DB and why are these so useful. 

As a programmer, designer or architect, whenever I work with traditional databases, one major area to be conscious about is, that database access should be designed carefully. This is because traditional database system store everything on disk, and hence any access or update to this data could be one of the slowest operations in application flow. Undoubtedly, a lot of research and improvements have been done to improve the performance of disk based database systems with improved storing, searching and retrieving logic. Still, disk access, being mechanical operation, always have limitations. And this is one of the important reasons to be fascinated about in-memory database systems. 

Visualize a system where all data (or all data required for curernt context) is sitting in memory. Which means, we can expect a lot more efficient and faster access to data. Database software can have much simpler logic to manage the data, as there is no need to manage the loading/unloading of pages in memory. There is no need to work on time taking locking mechanism to safeguard the data on disk, as access in memory is much faster and chances of conflicts are extremly small which change the way we design database system algorithms. It also means that we can exploit the best available CPU power (which is increasing continuously) to process the data available in memory, having no limitation of disk access. This could also mean that there is no need of another layer of caching system. Rather, database itself will be working like in-memory cache. There are many more benefits if we design the system considering in-memory database system. 

Let us understand what is In-Memory Database System (IMDS). It is a DBMS which maintain all data primarily in Main Memory. Data will be loaded in memory even if it is in GB or TB. A few highlights:

    With 64 bits computer architecture, systems are capable to address 16 EB of data (1 TB * 1000 * 1000). 82% of the enterprise application’s databases are below 1 TB, growing with an average speed of 10% per year, which means that In-Memory database systems can cater to most of the applications now and in coming future as well.  
    Does not need write or read to Disk, hence no dependency on mechanical parts and their performance limitations. When all data is stored in single address space, it reduces the complexity of storage algorithms, no need now of loading and unloading the pages in memory
    Much faster than Disk based traditional DBMS. Having all data in memory means that data is available at our finger tips, only microseconds or nanoseconds away.
    And it supports ACID properties of Database, including D (durability) 

Attitude Builds the Great Products

During starting years of my career, I was interviewed by a start-up company. Recruitment manager (read CTO) explained me some complex product idea and asked, "Can you implement it". I was not able to understand those complex pieces completely (being slow by nature in new writings :) ). I replied, "I am not very through with whole thing. However, if it is logically feasible, we can do it for sure." And I was hired.

The product concept and the technologies were very new for the team. It was a uphill learning task. Team average experience was around 5 years (excluding the manager). Still team had done wonderful job. With a team of 10 people, we developed a beautiful product with many complex and feature rich components that also in months’ time frame. Whole system was developed on self-validating test workflows, following TDD kind of advance methodologies which were very new and challenging for that 'junior' team. We challenged our every existing belief and drew new lines on learning graph every day, while producing some very interesting product pieces. Definitely, there were many environmental factors which contributed to this wonderful work. However, one of the main factors was the right attitude and willingness to accomplish.

Later, I asked my manager that how he selected me without even asking much technical question. He replied, "I have looked for right attitude in all the candidates and that paid us well".

Other experience: I was working with another project team, a very experienced team having much bigger resource pool. Team was enhancing and managing an accounting product. Product was having some issues in core implementation, due to which we were getting lot of bugs around the years. Course of action was to patch the data or correct the current broken flow of application by temporary fixes. Team was spending many hours in this exercise. Although team had great skills and experience, however, nobody was willing to fix the core issue. Reason, that would need complete rewrite of that component; a critical piece of the product. And it was comparatively easy and less risky to make fixes. Hence, due to lack of right attitude and driving force, we kept on putting hours of efforts in fixing the bugs only.

By now, we already know the difference between first and second example. It is not (only) about skills and experience, but, it is more about right attitude. In second example, team was much experienced and bigger. Many of the members were skilled enough to do right things and do the things right. However, differentiating factor was the right 'attitude'. It needs a high level of 'can do' and risk taking attitude to say, "Let’s build something better even if it mean scrapping existing piece of code. Let’s write a good product, where team can spend time adding value to the product instead of fixing issues and doing plumbing work around the year. Let sit and figure out, how we can improve the things".

Finding skills and experience could be easy, however, finding and developing right attitude needs a lot of efforts. Also it does not end with the attitude of individuals, rather attitude of leaders also play a big role in developing this whole eco-system. In first example, it was the leader who has given weightage to the right attitude over skills, education and experience. It was the leader who has promoted the attitude to take the risk and to challenge the stagnant beliefs to improve the product.

When right attitude is mixed with right set of environment, people take action. They become passionate for the goals, for the things which they are doing. They go extra mile to build what they believe in. A very important element in producing great products is the attitude of people working on it.

It takes whole village to build a good product and a successful Organization, however, it takes a right set of attitude of team and the leader to build and groom that village.

What is your experience for role of 'attitude' in building great products, what are your examples?

Thank You Mentors

When I started moving in professional career, I came to know about term 'Mentor'. Wondering what it is, I found that many of the people were talking about being mentored by various great personalities. And it is said to be a great opportunity to learn and grow. I was not even aware about it, hence I started feeling insecure and kind of left out. Am I not worthy enough or I am not looking for one. Why I haven't found one so far..

However, eventually I found that it is not always the single person who comes in formally, wearing a hat of 'Mentor' and bestow her blessings. Rather, it could be more than one people who keep sharing their wisdom and experience informally with us, either intentionally taking interests in us or casually just sharing few hints from their wisdom and life experiences.

At the age of 19, when I joined my first job to manage a mechanical workshop of 20 people, I found it very difficult to deal with people who are much older and experienced than me. Then my senior 'Dinesh Sharma' hold my hand and said, "You have to be bold and confident to deal with them. Also, Understanding their context, Respecting everybody and Integrity in yours 'words and action' is an important ingredient to manage the talent". And that lecture worked for me.

My few first days as Software Engineer, I was completely lost in a whole new world. People around me were using terminologies which were unknown to me. I was feeling like I don't know anything, especially when anybody comes to you and said, "Hey, you are working on this since morning.. that is 2 hour job if you use xxxxx". I got a supportive voice from Vikas Joshi who came and sat next to me, saying, "Let us see how we can solve this problem your way". He made me aware about new terminologies, and at the same time assured me that there is not only one, but multiple ways to define and solve any problem. A specific terminology can be good to communicate, but is not the core of solution. He encouraged me to keep learning and keep working steadily and sincerely.

There are even more. My mother who keeps sharing her priceless hard earned experience of life with me, who keeps on mentoring me since childhood and taught to face the life 'seeing in eyes of challenges'. Many of my friends, who shared one or other important lesson with me at every foot step. Many of the great writers, who have shared their valuable experiences in form of great books. One taxi driver, who met me one morning and shared important lesson of life saying, "Life gives us hints about next path. It is we, who want to stick with existing roots or beliefs. Best is to recognize the hints of nature, accept it and move on". There are many more ranging from my childhood teachers to my office cleaner who shared few dews of wisdom from their life experiences unknowingly and unconditionally.

So I feel confident now that I got so many mentors in life which shaped my thought process, the way I am. And what more, life gives us what we wish for, when we need it. Recently I got Ramesh Dharma as my first formal mentor. Since last one year, he is listening to me with all good patience and sharing his fine tuned experience with me. I don't know when I crossed the formal lines and even started reflecting my emotional side also. But he is managing every aspect maturely and is sharing his best of life experience to shape a new path for my journey.

Thanks to all of my great mentors for shaping my life, my journey..

#ThankYouMentor

Inclusive Leadership - An Effective Leadership

On a Friday evening, I was working late in office. I was struggling to fix an issue. That was a complex issue, and I was not finding any solution even after spending many hours on it. I thought to take a break, and decided to work on it after having dinner. I was about to go, when my manager walk over to me, and
He asked: 'Hey mohit, how is it going'.
I said: 'Not that good. We are not reaching anywhere. This issue would take time'.
He said: okkk. But, this is very critical issue and you are not leaving today without fixing it.
Bang.. ! Those words didn't sound good. I thought in my mind 'I can't leave, I am not free to leave..'. I felt bad.
I closed my laptop and told my manager, 'It is 9 pm already. I am tired now. I can't work more today. CU tomorrow..' After saying that, I left the office (sadily)
I reached home. I was very sad. I thought, I could have reacted differently. I was feeling bad, as I never behaved like that with my manager earlier.. I was tensed. I believe my manager would have also felt bad.
Overall, it was an unpleasant experience for both..

.............................
Moving to another incidence..

Few months later, in another project, we had similar kind of scenario. Whole team was packing the bags to leave from office on a Friday evening. Our manager came to our area
and said, 'Hey guys, I have a situation here to discuss and I need your help'.
'Help', that word sounds good to ears. As a normal reaction, we asked, 'ok, tell us please'.
He said 'One of the critical functionality is having issue and client is incurring loss due to this. We need to fix it asap'.
As soon as he said this, we understood that we need to stay back. Our mind started thinking of our plans for evening, like movie, outing etc. However, then our manager add more to his previous sentence.
He said 'I know it is already late and you might have some plans already, however, this issue is important and we have to find a solution as a team for this situation. Still if anyone has any commitment which is more important, do let me know. We can discuss and manage that'.

Everyone in team accepted to stay back. Even few of us came forward with different innovative ideas to fix the issue. Bonus point was, manager stayed whole night with us.. cracking jokes, arranging food for us and so on. We stayed there for 30 hours appx and left next day after fixing the issue. We were tired but were not sad. Rather, we enjoyed with each other, and took all the ownership to get the work done.

What was the difference between these two incidents.

In both stories, manager's intention was to get the work done; which was critical for project or organization. There was nothing wrong in that. However, there was a difference..

In first case, manager had made the decision and tried to force that to team. He had not shown the emotional consideration towards the feelings of his team.
In second incident, if you noticed, 'We' word was used more than 'I' or 'you'. Manager explained the situation along with its impact. He tried to involve everyone in the decision and pulled them on a common platform to take a collective call. Moreover, he conveyed it effectively that he understood 'what team is sacrificing i.e. their personal time' and he openly acknolwedged that.

In both the situations, managers were clear that they need team to stay back and work late to control the situation. But how they conveyed the message, that had made a big difference.

The way we communicate, and involve others in decision making has a big impact. It can make the whole environment tensed or can make people work even for 30 hours happily. Supporting your team, making everybody feel involved in decision making and that their opinion is respected, they are valued, is a big trait of successful people managers. When employees feel included at work, they become better team players and more likely to go above and beyond expectations, suggesting new ideas of getting work done. This, for sure, boost overall organizational performance also.

And this is not only applicable in office, but also in our personal life, in day to day dealings.

Good thing is, we have the options to choose. We can choose either first experience or can go for second leadership style. Choose the best..

Design Considerations for Audit Trail Implementation

Auditing the operations in any application is a very common requirement for security and auditing purpose. Auditing can be done at various levels with varying level of details. Overall prime requirements for Audit Trail are:
  • Collect enough information to determine, 
    • Who has done the changes, 
    • What are the changes, 
    • When these changes have been done, Locale etc
    • What user scenario was in action, i.e. the operation context
  • To capture all user actions, even if some of these are not reaching to DB or would be interacting with external services directly (rare, but happens in some cases)
  • Successful and unsuccessful logons or other security related operations
  • Management of collected audit data, which could be very large. 
  • Search operations on collected data
  • Display the collected data to Users in presentable format as and when demanded 

Considering above requirements, there are various design approaches to implement the audit trail in system. Few of these are given below (considering a JEE application, however, many of these are generic)

  1. Implement DB triggers to capture any change in data states and log in audit tables
  2. Log audit data in business services, which means collecting the required data in each business service operation and log it using some abstract Audit service to some data store
  3. Using generic logging framework like Log4J to log the auditing information to desired format and data store and later parse these logs to extract the required data
  4. Interceptors based approach to intercept all operations, collect the data and log it through Audit service. Here interceptors can be of DAO layer interceptors like Hibernate Interceptors or Service level interceptor using AOP.

All of these approaches have their own pros and cons. As obvious, one approach can not be fit for all. Application state, project requirements and scope can define the right set of implementation. So lets discuss the pros and cons of each of these approaches to understand it more.

Database triggers

Database triggers can do really well and nothing can escape from the triggers. Once these are set carefully on all levels, all changes are bound to pass through these and hence will be captured in audit tables.

Pros:

  • Whether it is simple user operation, or any change is being done by DB admin; all kind of changes will be captured by triggers.
  • A comparatively simple approach, in aspect, that no code change is required and it can be implemented directly at database level without disturbing the code.

How to Stream Media from Window PC to Xbox One


XBox One provides features to stream media from your PC and to enjoy the media on common entertainment box i.e. XBox. Below are simple instructions to setup the streaming of media contents from PC to XBox one, along with solution for one commonly faced problem. Hope it will help.

Note: Instructions are given considering window 7 PC.

On XBox One:

  1. Make sure that Xbox One is connected to your home network, either via wired or wireless connection.
  2. Download the ‘Media Player’ app from Xbox Store. This will help you to explore the media on PC remotely. 
  3. Go to into the “Preferences” option through the user settings menu. Make sure that the “PlayTo” streaming option is checked. 




On PC:

  1. Switch over to your PC. 
  2. Go to Start menu and click on “Devices and Printers”.
  3. Use ‘Add a device’ and add Xbox one as one Device. 
  4. Open Window Media Player
  5. Go to ‘Stream’ menu and enable the ‘Allow Remote Control of my Player’ and ‘Automatically Allow Devices to play my Media’ options. 

Leading by Example - An Interesting Approach to Lead

Albert Einstein once said “Setting an example is not the main means of influencing others, it is the only means.”

To compliment this quote, let me tell you a story. Story begins 16 years back when I started working as shop supervisor in a mechanical workshop. Workshop had around 25 skilled technicians. Most of them were in age group of 30s to 50s. It was a challenging job for a 19 year old boy to manage these experienced and skilled workers. Hence I had various wonderful learnings during this job. Following is one of such interesting learning.

Very first day, when I entered in the workshop, I found it very unclean and untidy. There were some obvious reasons for being dirty. Like being a mechanical workshop, there was lot of scrap production daily. Lot of oil was being used for lubrication along with various coolants also. However, still there were good reasons to believe that it can be comparatively cleaner. I felt a need to change or improve. Being very new to the Organization, I decided to wait for sometime. Eventually I started discussing with team members about cleaning the place. One day I got a simply reply from few workers for not cleaning the workshop, that was, "Either we can clean the workshop or can complete our day job. You tell us what we need to do". Sound familiar :). Even today sometimes I heard similar reasoning that, "Either we can improve the code/process, or can make the delivery". I understood the problem and gave it some more time.

One morning, I thought that I should clean my place at least. My place comprised of one table, chair, cupboard, some documents and lot of dirt. I spent 3-4 hours and cleaned it completely. All the workers were looking at me quite surprisingly. At the end of the day, I was happy that I did what I liked and what I should have done. There was no expectation around. Next morning, 2-3 of the workers came to my seat and told me that they also wanted to clean their place. They asked, can I manage the time break for cleaning. I took the responsibility and told that I shall manage it. They called all other workers and discussed with them. That day, all the them worked as a team and cleaned the workshop for 4-5 hours. Results were obviously pleasant. Workshop was completely changed, air was purified. All of the co-workers were appreciating the change themselves. Earlier they had to find a clean place to have their tea, now whole workshop was cleaned enough to sit anywhere.

Vedic Math - Divsion by 9

Note: Vedic Math Blog has been moved to http://vedicmath.vedantatree.com/. Please bookmark the new address for new and existing blogs.

Let us learn, how to do 'Division' operation using 'Vedic Math'. Conventionally, we do it like following:

Divisor ) Dividend ( Quotient
                ---------
                ---------
             _________
             Remainder

However, in the Vedic process, the format is
Divisor ) Dividend
                --------
           __________________
           Quotient | Remainder

Let us first start with one of the special case of division i.e. Division By 9, a very interesting and simple technique.

When dividing by 9, the remainder is always the digit sum of the original number.

For 2-digit number divided by 9 
To divide ab by 9 : Rewrite ab as a | b . The quotient is a, and the remainder is simply a + b.

    a  |  b
        |  a
    ---------
    a  | a + b

Examples: 

12 divided by 9
Here quotient = 1 and remainder = 1+2 = 3

23 divided by 9
Here quotient = 2 and remainder = 2+3 = 5

70 divided by 9
Here quotient = 7 and remainder = 7+0 = 7

Now, let us discuss the cases when remainder is greater than 9 :-

86 divided by 9
Here quotient = 8 and remainder= 8+6 = 14 ( >9 )
So we add one in the quotient and becomes 9 ; and
remainder becomes 5, after subtracting 9 from 14

New quotient =  9 and New remainder = 5

75 divided by 9
Here quotient = 7 and remainder = 7+5 = 12 ( >9 )
So, New quotient =  8 and New remainder = 3 (12-9=3)

Also, notice here, that the new remainder is just the digit sum of the old remainder.

For 3-digit number divided by 9

      ab  |  c
        a  | a + b
   ---------------
 ab + a | a + b + c

Quotient: ab + a ; Remainder: a + b + c. However, remember that the remainder should be less than 9. And if remainder is greater than 9; we add 1 to quotient and subtract 9 from the remainder.

Vedic Math - Cube Roots of more than 6-Digit Number - Part III

Note: Vedic Math Blog has been moved to http://vedicmath.vedantatree.com/. Please bookmark the new address for new and existing blogs.

In this article, we are going to learn an interesting Mathematical technique to find, if the given number is a perfect cube or not. It is very important step while computing cube roots. Infact, before applying any method to find the cube root, we have to check whether it is perfect cube or not and then accordingly we choose the technique. For example, following scenario tells us the importance of finding perfect cube step while computing the cube root.

Example : 1728 has cube root 12 since two groups are 1 and 728. From 728, we derive last digit as                 2 from 1 (first group), we derive first digit as 1.
               So, cube root of 1728 is 12.
 But now, if number is 1278, which again has two groups: 1 and 278. It can derive the same last digit as 2 and first digit as 1 , which implies that cube root of 1278 is 12, which is not true because technique stands true for perfect cube root only.

There is a simple technique to check whether the number is perfect cube or not. For this, we add the digits of the number. See the below chart in which we add the digits of cubes from 1 to 10.

Above example shows that sum of digits of a perfect cube is either 1, 8 or 9. However, it is not true that all numbers which sum to 1,8 or 9, will be perfect cube.

For example,
Sum of digits of 1728 and 1278 are same i.e.(1+7+2+8) = (18) = 9 . But 1278 is not a perfect cube.

Hence if sum of digits of a number is not 1,8 or 9, we are very sure that the number is not a perfect cube. However, a number may not be perfect cube root even if sum of digits is 1,8 or 9. To scrutinize that, we need to apply factorisation. If number is small like 1278, factorisation is good method. See below:


For bigger numbers, factorisation could be time consuming technique. Hence, for large numbers, we shall apply general method of finding the cube of root.

Case 2 : Cube root for all the cubes, whether perfect cubes or not.    (Case 1 discussed in last two articles)
From last two articles, we conclude about the sequence of digits (a+b+c)³ as:
(1) The first place by a³
(2) The second place by 3a2b
(3) The third place by 3ab2+3a2c
(4) The fourth place by 6abc+b³
(5) The fifth place by 3ac2+3b2c
(6) The sixth place by 3bc2
(7) The seventh place by c³ ; and so on.

In 'General Technique', we find Dividends(D), Quotients(Q), and Remainders(R). Steps involved as:
(1) First determine D, Q and R
(2) From the second dividend, no deduction is to be made.
(3) From the third, subtract 3ab2
(4) From the fourth, deduct 6 abc+b³
(5) from the fifth, subtract 3ac2+3b2c
(6) from the sixth, deduct 3bc2
(7) from the seventh, subtract c³. ; and so on.

(a) Quotient(Q) is closest minimum exact cube to the first cube i.e. 'F' term used in last two articles.
(b) And, Reminder(R) is the difference between the first group and closest minimum exact cube.
(c) Dividend(D) is found by multiplying the 'Square of Quotient(Q)' by 3 (Q2*3)

Vedic Math - Cube Roots of more than 6-Digit Number - Part II

Note: Vedic Math Blog has been moved to http://vedicmath.vedantatree.com/. Please bookmark the new address for new and existing blogs.

In last article, we have discussed the method to find cube root of more than 6-digit numbers; especially the odd numbers. Today we shall discuss the procedure for even numbers. In this procedure, only two extra steps are added, one in the beginning and other at the end. Rest all is same.

Procedure: As first added step, we keep on dividing the number by 8 till we get an odd cube. Following it, same method of successive elimination of the digits will apply. At the end, multiply the cube root by 8 to obtain the cube root of the original number.

Example :  2840362499528
First, we continue without using those two additional steps, which will help you to understand the problems arises while dealing with even cubes.

The cube root of the cube 2,840,362,499,528      (say, F + J + H + M + L )
Here,  N=5       (means that cube root will be of 5 digits number)
L=2                  (i.e. 2³=8, matching with the last digit of the last group '528')
and F=1            (i.e, 1³=1, nearest cube of first group '1')

Step1 : L=2 & L³=8. Subtracting this,              
Step2 : 3L2M=12M (substituting L = 2)
            Hence, 12M = Number ending with 2
    Here M is either '1' or '6'      (ambiguous values)
            Lets take 6  (pure gamble)
     
    Now, Deducting 3L2M = 12M = 72  
Step3 : 3LM2+3L2H = 12H + 216 (substituting L = 2, M = 6)
            12H + 216 = Number ending with 8
      12H = Number ending with 2                                    
            Here H is either '1' or '6'                                      
    Lets take 1 (again gamble)

    Now, Subtract 3LM2+3L2H = 12H + 216
                                                         = 228
Step4 : 3L2J+6LMH+M³ = 12J+12+216          
                                             = 12J+228
        12J+228 = Number ending with 6
12J = Number ending with 8
        Here J is either '4' or '9'
        Lets take J = 4  

Since we already know 'F' , so no need to know the expansion of (F+J+H+M+L)³ 
Therefore, cube root is 14162        (F=1, J=4, H=1, M=6, L=2)

Vedic Math - Cube Roots of more than 6-Digit Number - Part I

Note: Vedic Math Blog has been moved to http://vedicmath.vedantatree.com/. Please bookmark the new address for new and existing blogs.

Back after a long break. In previous article, we learn how to find the cube root of 4 or 5 or 6 digits perfect cubes. Let us continue it further and discuss how to find the cube root of perfect or imperfect cubes.

In this article, we shall learn to find the cube roots for:
1. Cube root of perfect cubes, for any number of digits.
2. Cube root for all the cubes, whether perfect cubes or not.

To summarize what we have learned till now for cube root:

Arrange the given number in three-digit groups, starting from right to left. A single digit, if any left over at the left hand side, is counted as a simple group itself. The number of  digits in the cube root will be the same as the number of digit-groups  in the given  number itself.

  • 169 will count as 1 group 
  • 1 258 will count as 2 groups 
  • 43 781 will count as 2 groups
  • 2 154 890 will count as 3 groups

If the given number has 'n' digits, its cube root will be having n/3 or (n+1)/3 digits. Also remember few other points from previous article:

The Cubes  of the first nine natural numbers    
1³ = 1        2³ = 8        3³ =27        4³ = 64        5³ = 125        6³ = 216        7³ = 343        8³ = 512         9³ = 729        10³ = 1000
From it, we understand that

  • 1,4,5,6,9,0 numbers repeat themselves in the ending of their cubes
  • 2,3,7 and 8 have their complements from 10, at the end of their cube

Let us start with actual technique now. Any number can be written in an algebraic expression. For example, if arithmetical number is 'dcba', it can be written in algebraic form as:
Algebraic Expression is: a + 10b + l00c + 1000d.

Now if we need to find the cube of a number 'cba', algebraically we can expand it like  (a+10b+102c)3. Let us expand it:
(a+10b+102c) 3 =  a3 + 10 (3a2b) + 102 (3ab2+3a2c) + 103 (b3+6abc) + 104 (3ac2+3b2c) + 105 (3bc2) + 106 (c3)

Now removing the powers of ten and putting the result in algebraic form, it tells us the formation of cube as:
(1) The units' place is determined by a³.
(2) The tens' place is contributed by 3 a2b
(3) The hundreds' place is contributed to by 3ab2 + 3a2c
(4) The thousands' place is formed by b³ + 6abc
(5) The ten thousands' place is given by 3ac2 + 3b2c
(6) The hundred thousands' (lakhs') place is constituted of 3bc2 ; and
(7) The millions' place is formed by c³.

The number of zeroes in the various coefficients of the expanded Algebraic Expression are the basis of the formula / analysis.

Case1 :  Cube root of perfect cubes for any number of digits

Suppose we have a cube number n of any number of digits. To find its cube root, find following:
- The number of groups (N) in cube (as we discussed above to make the sets of 3 digits)
- First digit of cube root denoted as 'F' (Nearest cube root of first group from left)
- Last digit of cube root denoted as 'L' (Cube root of last group from left)
- Middle numbers of cube root(i.e. 'M' or 'H' or 'J'....), we shall find using the procedure.

Following are the steps for the procedure:
(i) From the units' place of given number, subtract the L³ (i.e. a³, refer to algebraic expression above); and that eliminates the last digit of the number.
(ii) From the ten's place, we subtract 3L2M (i.e. 3a2b) and thus eliminate the second last digit (penultimate digit).
(iii) From the hundreds' place, we subtract 3LM2 + 3L2F (i.e. 3ab2 + 3a2c) and hence eliminate the pre-penultimate digit.
and so on

Spring RoutingDataSource to Work with Multiple DataSources - II

In previous article, we have discussed about using Spring 'AbstractRoutingDataSource' to dynamically routing the database call to desired database (i.e. data source). This is very handy feature and useful in various scenarios. 

One important use case can be in multi-tenant application. In multi-tenant application, one of the database design consideration can be to use separate database for each tenant. It helps to keep the data of each tenant separate, and would be good for performance also. And, good design would require to use the same application layer code to work with all tenant and their specific database. In this scenario, use of 'AbstractRoutingDataSource' can help to achieve these design considerations. Extend the AbstractRoutingDataSource to create a custom 'MultiTenantRoutingDataSource'. Use a thread local application context state holder to maintain the tenant state for current flow. Use this thread local context in extended 'MultiTenantRoutingDataSource' to return the tenant specific data source. Again keep in consideration please, that Routing Data Source will be invoked by TransactionManager before starting the transaction only. Once transaction is started, data source can not be changed. 

Let us see the example of data source definition in Context for dynamically switching between OLTP and Reporting Database: 

<bean id="dataSourceOltp" name="oltpDataSource" class="..PooledDataSource">
<property name="targetDataSource">
<jee:jndi-lookup jndi-name="jdbc/DB" cache="true" />
</property>
</bean>


<bean id="dataSourceReportDb" name="dataSourceReportDb" class="..PooledDataSource">
<property name="targetDataSource">
<jee:jndi-lookup jndi-name="jdbc/ReportDB" cache="true" />
</property>
</bean>

<bean id="customDataSource" class="com.a.b.common.db.DBCustomRoutingDataSource ">
<property name="targetDataSources">
<map key-type="com.a.b.util.DataSourceConstants">
<entry key="OLTP_DB" value-ref="dataSourceOltp"/>
<entry key="REPORT_DB" value-ref="dataSourceReportDb"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSourceOltp"/>
</bean>

<bean id="txAwareCustomDS" name="txAwareCustomDS" class="org.springframework.jdbc.datasource.Transac tionAwareDataSourceProxy">
<property name="targetDataSource" ref="customDataSource">
</property>
</bean>

<bean id="CustomTxManager" class="org.springframework.jdbc.datasource.DataSou rceTransactionManager">
<property name="dataSource" ref="txAwareCustomDS" />
</bean>


In above context definition, we may define data sources for multiple tenants in place of OLTP or Reporting Database. To extend the design further for multiple tenants, definition can be made dynamic.

Important Note:

If you are using TransactionAwareDataSourceProxy with DataSourceTransactionManager, it should always be the outer most wrapper in the hierarchy. Keep data sources hierarchy as following:

TransactionAwareDataSourceProxy > Routing Data Source > Lazy Data Source > Pooled Data Source

Reason is, DataSourceTransactionManager will never work with TransactionAwareDataSourceProxy, rather it picks the wrapped data source to work upon. DataSourceTransactionManager has special handling for TransactionAwareDataSourceProxy to work with actual DataSource wrapped in it. So it is important to keep the TransactionAwareDataSourceProxy as outer most layer. Or otherwise, DataSourceTransactionManager will not be able to handle the transactions properly. Read more at following links:

Java Technology Enthusiasts - How to set Transaction Manager Programatically
Spring Forum - Problem in Managing Managing Transaction with AbstractRoutingDataSource

------------------------------------------------------------------------------------------------------------
Hope it will help. Please share comments for addition. You may contribute by:
  • Posting your comments which will add value to the article contents
  • Posting the article link on Social Media using 'Social Media Bookmark' bar
  • Consider joining us at 'Java Technology Enthusiasts' linkedin group to participate in discussions
  • Connecting with 'VedantaTree' on Facebook