Saturday, November 11, 2017

How to get PMP certified

The PMP® is recognized the world over as the gold standard in project management certification for project managers. In this post I am sharing my experience on how to prepare for the PMP exam.

Steps to get PMP certified

There are three main steps to get PMP certified viz.
Step 1 – Get 35 contact hours by attending a training conducted by PMI approved R.E.P. (Registered Education Provider).
Step 2 – Fill the application form to apply for the certification. PMI will review and approve your candidature.
Step 3 – Fix an exam date and take the test.

How to prepare for the exam

The PMP exam is not easy! You cannot pass the same without putting serious efforts. If you have are able to put effort of around 1-2 hours every day then it would take around 3 months from start to finish. Your aim should be to pass in the first attempt as it is really difficult to go over the same thing again and again. Also unlike some other certifications, the exam fees are also very high (approx. $550) so you should do it right the first time. Following is the strategy I followed to prepare for the exam

1)     Attended 5 day training by a Registered Education Provider (R.E.P.).

2)      Started reading “PMP Exam Prep” book by Rita Mulcahy.

a.      Read all the chapters in the book thoroughly. During this first reading, I did not attempt the questions given at the end of each chapter. Time taken was around 1 month (Roughly 1 hour a day & 5-6 hours on weekends). It is a really good book to understand Project Management in real life. I believe it is a great book to read for any project manager even if there is no plan to take the PMP certification exam.
b.      Read Rita's book one more time. Took notes of important points.
c.      Attempted all questions at the end of each chapter. I score more than 80% in almost all chapters.

3)     Started using travel time to go through practice questions using the free mobile apps.
a.      I liked the questions in the app PMP Exam Prep. Lot of good situational type questions.
b.      I also used the app PMP Exam Mentor. This focuses more on BoK, ITTO type questions.

4)      Skimmed through the course content given by the R.E.P.  However I felt that it didn't add much value, could have skipped it.

5)      Skimmed through the PM BoK. However I felt that it didn't add much value.

6)      In my initial preparation I did not look at the ITTO (i.e. Inputs, Tools and Techniques, Outputs) at all. I was still able to solve the questions based on the overall understanding of the process.

7)      Started giving full length mock tests provided by the R.E.P.

8)      I also started searching for good quality free mock tests on internet. During this time the main dilemma I had was at what level of scoring should I feel confident to go ahead and book the exam date. Then I came across the following article from Edward Designer where he shared his scores for commonly available mock tests. Edward’s Article on Free mock tests and benchmark scores
This really helped to get a “benchmark” to compare and feel confident to book the exam.

9)      Following are the mock tests that I gave with my scores. I completed almost all of the tests well before time. Most of the full length tests (200 Questions) I completed in the range of 2 hours 15 mins to 3 hours 15 mins.

Sr. No.
Mock Test
My score
5 mock tests of 200 questions each given by R.E.P.
Greater than 85% in each of them
Good quality questions, very similar to my actual PMP exam
120 questions at Prepcast

75 questions at Oliver Lehmann
Tough questions. The end of the test page gives links to various other exam questions. I did attempt several of them but did not record the results.
75 questions at Edwel

200 questions  at Headfirst

175 questions at Oliver Lehmann

200 questions at Simplilearn
Just before the exam
200 questions at PMStudy
Just before the exam
200 questions provided by my employers E-learning website
Just before the exam. Most boring test with some very cryptic questions.

10)   Referred to this very good article on Edward Designer’s website to clarify some easily confused terms.

11)   After feeling confident by scoring more than 80% in mock tests I booked the exam date.

Final preparation

1)      It is important that before that exam that you are not distracted by any other work/worries. Just before the exam, I took 3 days of study leave. Along with the weekend I got a total of 5 days for the final preparation.
2)      For the first 2 days I went through my notes and re-read Rita Mulcahy and resolved all questions in Rita Mulcahy. I got only marginal improvement in my scores compared to the first attempt.
3)      For the next 3 days, I solved 3 full length mock tests (already listed in the table above). Attempted these tests at the same time that my actual exam was scheduled to tune my bodyJ.

Exam Day

1)      Planned the travel to reach the exam center 1 hour before the scheduled time. I had booked the 12:30 PM slot, so I took along some lunch to eat just before entering the exam room. Wore comfortable clothes (tracks & t-shirt) with a light jacket.
2)      During the exam I took 2 breaks. 1st break after 100th question, 2nd break after 200th question.
3)      Complete the 200 questions in 3 hours. Took another 30 minutes to go through the marked questions.
4)      Pressed the ‘End Exam’ button and waited for few anxious moments before seeing the “You have passed” message on the screenJ. Also delighted to see that I scored “Above Average” in all the 5 domain areasJJ.

Lessons Learned

1)     It took me around 5 months from start to end of the whole lifecycle described above. I lost a bit of momentum in between due to personal commitments. With better planning & less distractions I feel the schedule can be compressed to 3 months.
2)    With the compressed schedule, I could have avoided 3 readings of Rita Mulcahy, it is a very big book to read. Phew!
3)   You don't need to buy any Apps or Mock tests. It is possible to get practice and certified with the free Apps and Mock tests available on the internet.

All the Best!

I hope my experience helps you in your PMP certification journey. If you have any specific questions do drop in a comment and I will try to respond at the earliest.

Monday, December 19, 2016

Improve JDBC Oracle database transaction performance in Apache-Tomcat

Method 1 – Using Only Datasource


The standard way to configure JDBC connections in Tomcat is to define a datasource resource in the “context.xml” file as  follows

 url="jdbc:oracle:thin:@hostname:port:sid "


The above resource can then be accessed in the Java code to get a Oracle Connection as follows:

import java.sql.Connection;
import javax.sql.DataSource;
import javax.naming.InitialContext;
import oracle.jdbc.OracleConnection;
/* Only connection related code snippet mentioned below */
// Initialize the variables
Connection conn = null;
OracleConnection oracleconn = null;
// Invoke the database
InitialContext jndiEnc = new InitialContext();
DataSource ds = (DataSource) jndiEnc.lookup("java:comp/env/jdbc/DBASE");
conn = ds.getConnection();
oracleconn = conn.unwrap(OracleConnection.class);


This is the way that you will find described in the Tomcat documentation and on most of the websites on internet.

The problem with the above approach is that it does not initialize the database connections when the server is started (or when the web application is deployed). The connection to the database is made only when the above code is executed. Due to this the performance is slow, which may still be okay for most of the cases. But if you need better performance then the next method is recommended.


Method 2 – Using Datasource with Factory


Using this method, the tomcat on startup creates database connections which are then readily available to be used in the program. This substantially improves the performance compared to the previous method. The resource configuration in “context.xml” is to be done as follows. The main difference compared to the earlier configuration is to add the “factory” parameter.


  username="apps" password="password" 


The above resource can then be accessed in the Java code to get a Oracle Connection as follows:

import java.sql.Connection;
import javax.sql.DataSource;
import javax.sql.PooledConnection;
import javax.naming.InitialContext;
import oracle.jdbc.OracleConnection; 
/* Only connection related code snippet mentioned below */
// Initialize the variables
Connection conn = null;
OracleConnection oracleconn = null;
/* Invoke the database */
InitialContext jndiEnc = new InitialContext();
DataSource ds = (DataSource) jndiEnc.lookup("java:comp/env/jdbc/DBASE");
conn = ds.getConnection();
/* The Connection object received is an instance of PooledConnection.
   Following line converts PooledConnection to OracleConnection. */
oracleconn = (OracleConnection) (Connection) ((PooledConnection) conn).getConnection();




Use the Method 2 to improve you application performance  while connecting to Oracle Database on Apache-Tomcat.


Saturday, October 1, 2016

Business Travel Checklist

This is a checklist for short term business travel to a foreign country. Onsite Travel Checklist

Onsite Travel Checklist

Sr. No. Item Quantity Tick Mark
1 Wheat Atta  1 Ziplock bag per 6 Days. One time cooking.  
2 Rice 1 Ziplock bag per 10 Days. Two time cooking.  
3 Split Dal for Khichdi 1/4 Quantity of rice  
4 Toor Dal 1/4 Quantity of rice  
5 Chole 1/4 Quantity of rice  
6 Black Eye Beans 1/4 Quantity of rice  
7 Moong 1/4 Quantity of rice  
8 Ghee Small Bottle for 14 Days  
9 Cooking Oil Small Bottle for 14 Days  
10 Spices and Salt As per the container, half is okay  
11 Jaggery 200 grams  
12 Corn Flakes & Meusli 1 Packet around 500 grams each for 14 Days.   
13 Khakhra 1 Dabba for 10 Days.  
13 Sweet (Jaggery Laddoo) 1 Per Day  
14 Dry Fruits & Nuts 200 gms each for 14 Days  
15 Dates 500 gms for 14 Days  
Sr. No. Item Quantity Tick Mark
1 Pressure Cooker with Flat Bottom 1 Qty (with Flat Bottom)  
2 Pressure Cooker Accessories 1 Qty (extra rubber, valve etc.)  
3 Steel Thali 1 Qty (to be used as Plate and Chakla)  
4 Rolling Pin (Belan) 1 Qty  
5 Office Tiffin Boxes & Bag 1 Qty  
Sr. No. Item Quantity Tick Mark
1 Office Wear 6 Pairs per week (includes 1 casual pair)  
2 Belts 1 Black + 1 Brown + 1 Casual  
3 Underwear 8 for a week  
4 Socks 7 Pairs (including 2 white cotton)  
5 Shoes 1 Office + 1 Casual  
6 Slipper 1 Pair  
7 Winter wear heavy jacket 1 Qty (Choose type depending on time of year)  
8 Wind Cheater / Rain jacket 1 Qty  
9 Umbrella 1 Qty  (Depending on region and rains)  
10 Thermals 2 Pair for winter season. 1 Pair for summer season  
11 Woollen Cap 1 Qty (Any time of year)  
12 Woollen Socks 1 Qty (Any time of year)  
13 Monkey Cap 1 Qty (Winter season only)  
14 Muffler 1 Qty (Winter season only)  
15 Woollen Hand Gloves 1 Qty (Winter season only)  
Cosmetics Etc.
Sr. No. Item Quantity Tick Mark
1 Body Lotion 1 Big Bottle per 3 weeks  
2 Face Lotion 1 Olay per 2 month  
3 Lip Guard 1 Qty  
4 Grooming kit (Scissor, Nail-Cutter) 1 Qty  
5 Shaving Kit 1 Qty (1 Blade per 30 Days)  
6 Bar of Soap 1 Qty for 30 Days  
7 Tooth Paste 1 Medium size for 30 Days  
8 Tooth Brush + Tongue Cleaner 1 Qty  
9 Cloth Washing Detergent 2 Small sachets per 1 week  
10 Cloth Washing Soap 1 Small Bar  
Electrical & Electronics
Sr. No. Item Quantity Tick Mark
1 Convertor Plug 1 Qty  
2 Kindle 1 Qty  
3 SIM  Card of the country 1 Qty  
4 Laptop, Charger, Mouse 1 Qty  
5 LAN Cable or Wireless modem 1 Qty (as per need)  
6 Mobile Charger (and Mobile) 1 Qty  
Sr. No. Item Quantity Tick Mark
1 Passport 1 Qty  
2 Wallet with Cash and Cards 1 Qty  
3 Ticket Printout 1 Qty  
4 LOA/Invitation Letter Prinout 1 Qty  
5 Hotel Booking Printout 1 Qty  

Friday, July 29, 2016

Difference between HTTP PUT and POST

Difference between PUT and POST

The key difference between PUT and POST is that PUT is idempotent while POST is not. No matter how many times you send a PUT request, the results will be same. POST is not an idempotent method. Making a POST multiple times may result in multiple resources getting created on the server.

Another difference is that, with PUT, you must always specify the complete URI of the resource. This implies that the client should be able to construct the URI of a resource even if it does not yet exist on the server. This is possible when it is the client's job to choose a unique name or ID for the resource, just like creating a user on the server requires the client to choose a user ID. If a client is not able to guess the complete URI of the resource, then you have no option but to use POST.

PUT http://MyService/Persons/
Won't work. PUT requires a complete URI
PUT http://MyService/Persons/1
Insert a new person with PersonID=1 if it does not already exist, or else update the existing resource
POST http://MyService/Persons/
Insert a new person every time this request is made and generate a new PersonID.
POST http://MyService/Persons/1
Update the existing person where PersonID=1

It is clear from the above table that a PUT request will not modify or create more than one resource no matter how many times it is fired (if the URI is same). There is no difference between PUT and POST if the resource already exists, both update the existing resource. The third request (POST http://MyService/Persons/) will create a resource each time it is fired.

HTTP Operations, Safe and Idempotent operations..

Operation performed on server
Read a resource.
Insert a new resource or update if the resource already exists.
Insert a new resource. Also can be used to update an existing resource.
Delete a resource .
List the allowed operations on a resource.
Return only the response headers and no response body.

A Safe operation is an operation that does not have any effect on the original value of the resource. For example, the mathematical operation "divide by 1" is a safe operation because no matter how many times you divide a number by 1, the original value will not change. 

An Idempotent operation is an operation that gives the same result no matter how many times you perform it. For example, the mathematical operation "multiply by zero" is idempotent because no matter how many times you multiply a number by zero, the result is always same. 

Similarly, a Safe HTTP method does not make any changes to the resource on the server. An Idempotent HTTP method has same effect no matter how many times it is performed. Classifying methods as Safe and Idempotent makes it easy to predict the results in the unreliable environment of the Web where the client may fire the same request again.

Wednesday, January 13, 2016

Configuration steps to start the Workflow Notification mailer in Test environments


At times, there is a need to receive the notification emails that are sent through the Oracle workflow mailer in Development and Test environments. However, these emails should not go to the mailboxes of the users of the system. Instead, they should be redirected to a common mailbox. This blog article is a step by step guide to configure the workflow mailer for the above objective.

Important Note: These steps should NEVER be performed in the production environment.


Part 1 - Configure the mail server and email sender

1)      Login using ‘SYSADMIN user and go to responsibility  ‘Workflow Administrator Web Application’ > Workflow Manager

2)     You will see Notification mailer is Down

3) Click on ‘Down’.You will find the below window.

4) To Configure Workflow Mailer, press on Edit button

5) You will find the below window

6) Set the Server Name to your Email /SMTP server. Set the ‘Reply-To-Address’ to ‘’.

7) Click on button 'Advanced'

8) Press 'Next'

9) Press 'Next'

10) Press 'Next'

11)   Update from field to ‘Workflow Mailer <Name of the Test Environment>’ for e.g. “Workflow Mailer DEV”

Part 2 - Configure the override address

Override address is the address where all the emails will redirected. This can be configured from front end also. However following are the steps to set it up from back end.

1)      Run the below sql statement

    select fscpv.parameter_value
      from fnd_svc_comp_params_tl fscpt
          ,fnd_svc_comp_param_vals fscpv
     where fscpt.display_name = 'Test Address' 
                     and fscpt.parameter_id = fscpv.parameter_id;

2) The result should be ‘NONE’

3) Now run the below sql update statement and commit

UPDATE fnd_svc_comp_param_vals fscpv 
  SET fscpv.PARAMETER_VALUE = '' --( put the email address to which all emails will be redirected)
WHERE fscpv.parameter_id 
(SELECT fscpt.parameter_id
  FROM fnd_svc_comp_params_tl fscpt
 WHERE fscpt.display_name = 'Test Address');

4) Now run the SQL in Step 1 to verify that the email address has been set as required.

5) Now start the workflow mailer by going to ‘Workflow Administrator Web Application’ > Workflow Manager.   You will see Notification mailer is Down. Click on 'Down'. On next page '1)      Select ‘Start’ from drop down list and Press on Go button.

6) After the above step the workflow notification mailer should start and the status should be 'Running'.

Part 3 - Test the setup

1) Click on 'Workflow Notification Mailer'.

2)  Click on ‘Test Mailer’

3) Select a valid user for which email address has been setup and click 'Accept' button.

Two test emails should be sent to the email address that you have setup in the Part 2 (step 3). The emails should not be sent to the actual email address that is set for the user that you have selected.

This completes the steps needed to redirect emails on your test or development environment. Enjoy!!

Thursday, July 30, 2015

Oracle Applications : Delete concurrent program & executable

The concurrent program and executable cannot be deleted from Oracle Applications front end,  instead you can only disable the concurrent program. This is because if deletion is allowed then the corresponding history of previous runs, audit records will be left with orphan records.

But sometimes during the development phase, you would want the option of deleting the concurrent program and executable. Following is the code snippet to delete a concurrent program and its executable from database.

------------------Program Short Name, Application Name 
if fnd_program.PROGRAM_EXISTS('XXWS01A',''My ABC Application') then
   fnd_program.DELETE_PROGRAM('XXWS01A',''My ABC Application');
end if;

------------------Executable Short Name, Application Name 
if fnd_program.EXECUTABLE_EXISTS('XXWS01A',''My ABC Application') then
   fnd_program.DELETE_EXECUTABLE('XXWS01A','My ABC Application');
end if;