Friday, December 27, 2019

IntelliJ “Annotate” option is not working


Your VCS is not enabled. For that reason, this issue is raised. Solution is given below:

  1. From menu bar, Click on the VCS option
  2. Enable VCS  
  3. Select your version control. For my case it is “Git”
  4. Done. Now you will be able to use the annotate option

Thursday, December 12, 2019

3 Lock Key in Keyboard

There are 3 locks in keyboard.

  1. Caps Lock --> Toggle Key. It is used to switch lowercase to uppercase in your keyboard.
  2. Scroll Lock --> Toggle Key. It is used to scroll the contents using the arrow key.
  3. Num Lock --> Toggle Key. It is mainly used for partial numeric keypad. In some keyboard, there is a numeric section for right side. It is mainly used for [Home, Page Up, Page Down, End and 4 rows]. If Num Lock is on, those keys will be used for numerical value.


Monday, December 9, 2019

Why choose Jira Software over Azure DevOps (formerly VSTS/TFS)?

Why choose Jira Software over Azure DevOps (formerly VSTS/TFS)?

1. Out-of-the-box agile support
Jira Support for Scrum, Kanban, and any framework in between. Teams can begin with a lightweight approach and then progressively add more features.
Azure DevOps Supports Kanban, Scrum and CMMI. No ability switch between.

2. Simply powerful project configuration
Teams can easily customize their project workflow, issue types, and fields for the board they want and need, without affecting another project’s customizations.

3. Built-in roadmaps
Quickly create a timeline of your plans, update your priorities as they change, visualize dependencies, and communicate the status of work to your stakeholders.

4. Customizable dashboard - "both in Jira and Azure DevOps"
Create custom dashboards in Jira Software that contain all the information you need to effectively plan and track your work.

5. Comprehensive agile reporting
Teams have access to more than a dozen reports with real-time, actionable insights into how their team is performing sprint over sprint.

6. Powerful search
Jira Software comes with advanced search capabilities powered by Jira Query Language that offers teams detailed views into their work.

7. Developer environment agnostic
Jira Software works with every type of developer environment, meaning no team member will ever be forced to use any tool they don't want to.

8. Native mobile support
With Jira Software for iPhone and Android, your single source of truth is always in your pocket.

9. Marketplace with 1,000+ plug-and-play add-ons
Over 1,000 plug-and-play add-ons from the Atlassian Marketplace extend Jira Software to fit any use case or development process.

10. Enterprise-ready - "both in Jira and Azure DevOps"
Jira Software provides high availability, performance at scale and advanced security features like encryption at rest.

Resource Link: https://www.atlassian.com/software/jira/comparison/jira-vs-azure-devops

Azure DevOps Vs Jira

What is Azure DevOps?
Azure DevOps provides unlimited private Git hosting, cloud build for continuous integration, agile planning, and release management for continuous delivery to the cloud and on-premises. Includes broad IDE support.

What is Jira?
Jira's secret sauce is the way it simplifies the complexities of software development into manageable units of work. Jira comes out-of-the-box with everything agile teams need to ship value to customers faster.

Why do developers choose Azure DevOps?
1. Complete and powerful
2. Flexible and powerful
3. Huge extension ecosystem
4. One Stop Shop for Build server, Project Mgt, CDCI
5. Azure integration
6. Everything I need. Simple and intuitive UI
7. Integrations
8. Support Open Source
9. GitHub Integration
10. Crap
11. Jenkins Integration


Why do developers choose Jira?
1. Powerful
2. Flexible
3. Easy separation of projects
4. Run in the cloud
5. Code integration
6. Easy to use
7. Run on your own
8. Great customization
9. Easy Workflow Configuration
10. REST API
11. Great Agile Management tool
12. Integrates with virtually everything
13. Confluence
14. Sentry Issues Integration
15. Complicated

Cons of Azure DevOps:
1. Not a requirements management tool
2. Poor Jenkins integration
3. Capacity across cross functional teams not visible
4. Half Baked
5. Jack of all trades, master of none
6. Still dependent on C# for agents

Cons of Jira:
1. Rather expensive
2. Large memory requirement

I use Jira because
It's used widely as the best SW dev tool
It's so easy to use
Flexible to configure
Great for tracking of tickets while leading meetings
Accessible from Everywhere
In overall, especially for large projects, Confluence is must. On the other hands, for small-mid size projects, Trello is also great due to visualization power.

Resource Link: [Azure DevOps Vs Jira](https://stackshare.io/stackups/azure-devops-vs-jira)

Comments of Aaron Ibanez Werthermann:(https://www.itcentralstation.com/users/aaron-ibanez-werthermann)
-------------------------------------
The biggest difference between Jira vs Microsoft Azure Devops is that you need to know how Bitbucket and Bamboo in deep and how these tools work together. Prepare a DevOps environment with these Atlassian tools took me for about 3 times more than Azure Devops, because you need to create and configure your Bamboo agents by using a script.

Microsoft Azure is a more intuitive and practical solution to perform DevOps quickly, and also it lets you monitor the health of your application by using Application Insights at any time in any component.

Regarding the advantage in time and effort that Microsoft Azure has over Atlassian, many companies choose Atlassian because the cost is less expensive than Microsoft Azure. For me it is not a good reason to select a tool.

Comments of Jody Chmielewski:(https://www.itcentralstation.com/users/jody-chmielewski)
-----------------------------
My recommendation would be to identify your requirements (what features do you need), create a short RFP with specific requirements for what you would like to see in the tool and ask the vendors to show you how their product satisfies your requirements. This doesn't have to be a prolonged process but truly only the vendors can show you the possibilities with their tools. Most tools are only partially implemented...providing a biased viewpoint on their value. Any comments I would have would be specific to the functionality I have used in the tools and not a complete picture.

Any software solution purchase depends on what tools a client already owns (what they need to integrate), their business process, their budget their needs and their expertise.

Resource Link: https://www.itcentralstation.com/products/comparisons/jira_vs_microsoft-azure-devops

Sunday, December 8, 2019

Intellij Error: “Usage of API documented as @since 1.8+..”

Solution#1:

Add Java version in properies section of pom.xml
    <properties>
        ......
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
   
Solution#2:

You have to add build configuration in your pom.xml
    <build>
        .....
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

Solution#3: For IntelliJ users, add the following configuration.
Use both Solution#1 and Solution#2, Then add settings like below:

File -> Project Structure -> Project Settings -> Modules -> "Your Module Name" -> Sources -> Language Level

and change to your desired level i.e 1.8 or others.

Thursday, December 5, 2019

What is refresh token? How to retrieve google refresh token? What is the expiration time?

Refresh Token:

Refresh tokens are the credentials that can be used to acquire new access tokens. The lifetime of a refresh token is much longer compared to the lifetime of an access token. When current access tokens expire or become invalid, the authorization server provides refresh tokens to the client to obtain new access token.

Resource Link: https://www.tutorialspoint.com/oauth2.0/refresh_token.htm

I have also got a full blog post here: Google Refresh Tokens : Answers to Some Common Questions  It is really awesome. So I keep it in my blog as it is. So that I can read it again.

Google refresh tokens are used to generate an access token, even when the user is not available at the browser (the user is "offline"). Web applications typically save the refresh token of the user when he authorizes the Google application. The application can later use this refresh token to generate an access token, and make API calls on behalf of the user directly from the server.
The most popular use of a refresh token is during the execution of a cron job at the server. For example, a cron script would use the refresh token to generate a Google Analytics report for the user at a specific time.
Typically developers have some questions over the usage of Google refresh tokens. This article contains some of the common questions asked.

I got a refresh token previously, but now Google stopped sending refresh token

For the first time when the user authorizes your application he will see a consent screen. Through the consent screen he allows the application to get access to his data via API calls. Typically after the first time, user will not see a consent screen.
It is through this consent screen, you get a refresh token. No consent screen means no refresh token.
To force the application to show a consent screen, set prompt=consent in the Google OAuth url. This will ensure that Google returns a refresh token.
https://accounts.google.com/o/oauth2/v2/auth?
client_id=client_id&
scope=API_SCOPE&
redirect_uri=REDIRECT_URL&
response_type=code&
access_type=offline&
prompt=consent

I got a new refresh token. Does it mean that my older refresh token will not work ?

The older refresh token will work too. However Google imposes a limit of 50 refresh tokens per user for each application. If this limit is reached, creating a new token automatically will invalidate the oldest token without warning.
This means that for the first 50 times, you will get a new refresh token, and all the 50 refresh tokens will work.
However when the 51st refresh token comes, the first refresh token becomes invalidated. The 52nd refresh token will invalidate the 2nd refresh token. And so on.
Also the limit of 50 is not a fixed one. For Google Analytics API is is set to 25. The exact limit can be found in the documentation of the API. The documentation of each Google API typically has a section "Authorization". In this section, you can find the exact limit. If the limit is not listed, it is safe to consider it as 50.
In general it is not a good idea to request a refresh token each time when the user logs in. A refresh token is returned each time when the Google OAuth url contains the parameter prompt=consent. Setting prompt=none would not return a refresh token.
In the worst case, when your application is forced to get a new refresh token each time, make sure that your application is saving the latest refresh token, and removing the older refresh token.

When does a refresh token expire ?

Refresh tokens do not expire, unless there are few special conditions :
  1. The user has removed your Google application.
  2. The refresh token has not been used for six months.
  3. The user changed password and the refresh token contained Gmail scopes.
    This means that the refresh token will be invalidated only when he had previously given the permisions for managing his Gmail, and then later changed his password.
    For the rest of Google services like Youtube, Calendar etc, a changed password will not invalidate the refresh token.
  4. The application generated a new refresh token for the user for more than 50 times.
    See the above question I got a new refresh token. Does it mean that my older refresh token will not work for more information.

Is it a good idea to get a new refresh token from the user every time he logs-in to my Google application ?

No. As discussed above there is a limit of 50 refresh tokens for each user. This does not mean that Google will not return a refresh token after the 50th API call. A refresh token will be returned, but the older refresh token will be invalidated. See the question I got a new refresh token. Does it mean that my older refresh token will not work for more information on this.

How can we test google oauth2 using curl?

Answer is available in this link with full description:

https://github.com/jhanley-com/google-oauth-2-0-testing-with-curl

What is Access Token, ID Token? How can we retreive User info from Access Token or ID Token?

What is an Access Token?
An Access token is a Bearer token that you will have to add in all request headers to be authenticated as a concrete user.

Resource Link: https://stackoverflow.com/questions/25838183/what-is-the-oauth-2-0-bearer-token-exactly/25843058

What is an ID Token?


An ID Token is a JWT (JSON Web Token), that is, a cryptographically signed Base64-encoded JSON object. Normally, it is critical that you validate an ID token before you use it, but since you are communicating directly with Google over an intermediary-free HTTPS channel and using your client secret to authenticate yourself to Google, you can be confident that the token you receive really comes from Google and is valid. If your server passes the ID token to other components of your app, it is extremely important that the other components validate the token before using it.

Since most API libraries combine the validation with the work of decoding the base64 and parsing the JSON, you will probably end up validating the token anyway as you access the fields in the ID token.

An ID token's payload
An ID token is a JSON object containing a set of name/value pairs. Here’s an example, formatted for readability:

{
  "iss": "accounts.google.com",
  "at_hash": "HK6E_P6Dh8Y93mRNtsDB1Q",
  "email_verified": "true",
  "sub": "10769150350006150715113082367",
  "azp": "1234987819200.apps.googleusercontent.com",
  "email": "jsmith@example.com",
  "aud": "1234987819200.apps.googleusercontent.com",
  "iat": 1353601026,
  "exp": 1353604926,
  "nonce": "0394852-3190485-2490358",
  "hd": "example.com"
}

Resource Link: https://developers.google.com/identity/protocols/OpenIDConnect#obtainuserinfo

How can we retreive User info from Access Token or ID Token?

Answer is available in this link: https://www.oauth.com/oauth2-servers/signing-in-with-google/verifying-the-user-info/

Resource Link:

  1. https://stackoverflow.com/questions/16501895/how-do-i-get-user-profile-using-google-access-token
  2. https://stackoverflow.com/questions/22516693/how-to-get-user-profile-on-google-api-using-the-java-library

Saturday, November 9, 2019

Microsoft SQL Server Installation and Configuration Step by Step

  1. Microsoft SQL Server 2017 Installation - Step By Step Process To Install SQL Server: https://www.youtube.com/watch?v=yasfZuou3zI
  2. How to Create MS SQL Database Using SQL Server Management Studio - For Beginners: https://www.youtube.com/watch?v=zqo2ZBxxn6M
  3. Getting Exception:
    The TCP/IP connection to the host localhost, port 1433 has failed error, need assistance

    Solution: https://stackoverflow.com/questions/33590030/the-tcp-ip-connection-to-the-host-localhost-port-1433-has-failed-error-need-as
  4. how to restart the sql server in windows?
    https://www.isunshare.com/sql-server/how-to-operate-sql-server-service.html

Thursday, October 17, 2019

Builder Design Pattern

Java Builder Pattern:

1. Primary Builder Pattern Example:
--------------------------------
https://github.com/davidmoten/java-builder

2. Java Builder Pattern tricks - you must know:
--------------------------------------------
https://github.com/davidmoten/java-builder-pattern-tricks


Pattern Builder:
----------------
Builder pattern is a creational design pattern as Factory Pattern and Abstract Factory Pattern. This pattern was introduced to solve some of the problems with Factory and Abstract Factory patterns when the Object contains a lot of attributes. This pattern deals with a static nested class and then copy all the arguments from the outer class to the Builder class. The sample code where we have a Computer class and ComputerBuilder to build it are available in the package com.builder.Computer. Here's a test program showing how to use Builder class to get object.

import com.builder.Computer;

public class TestBuilderPattenr{
  public static void main(String[] args){

      Computer comp = new Computer.ComputerBuilder(
      "500 GB","2 GB").setBluetoothEnabled(true)
      .setGraphicsCardEnabled(true).build(); // -)
      )
  }

}
There are really various implementations of this pattern in JDK : java.lang.StringBuilder#append() (unsynchronized) java.lang.StringBuffer#append() (synchronized) .

Resource Link: https://github.com/sdmg15/Java-design-patterns

https://github.com/sanketgupta07/DesignPattern/tree/master/src/pattern

Monday, September 9, 2019

Deploy spring boot web application in Azure as App Service

Deploy spring boot web application in Azure as App Service


  1. https://www.youtube.com/watch?v=7gJVMzfjHpQ

Spring Boot WAR file is not working after tomcat deployment in Microsoft azure:

Jar is working fine. But if I create war file, then it is not working.

For Maven Users:
================


for creating war file, I need to change the following.

1. In pom.xml file, add [packaging] tag file.
<packaging>war</packaging>

2. Add start-class in properties section of pom.xml file
<properties>     
    <start-class>mypackage.App</start-class>
</properties>

3. Main Application class should look like below:
@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    /**
     * Used when run as JAR
     */
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    /**
     * Used when run as WAR
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }
}
Resource Link:


  1. https://stackoverflow.com/a/39445027


For Gradle Users:


1. Add plugin to build.gradle

apply plugin: 'war'

2. Add provided dependency to tomcat

dependencies {
    // other dependencies
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

Friday, June 28, 2019

Mid Level Interview Questions


  1. Singleton, Young and old generation garbage collection, Make 2 HTTP request with completable future and merge 2 response. give some code to fix it
  2. Redis related - is it persistent? 
  3. master-slave Redis cluster - if data missed in master what it will return
  4. different HTTP method and how it used?
  5. what is the purpose of the OPTION method?
  6. is restful API state-full or stateless? and why?
  7. is singleton thread safe or not? how to make it threadsafe?
  8. serialization? where it used?
  9. if any class have 5 property and if they want to make 4 property serialized, how can I do it?
-----------------------------------------------
  • What is synchronization?
  • Recursion related multiple issue understanding and related code optimization.


Tuesday, May 28, 2019

এই জীবন যদি জীবন হয় তাহলে আসল জীবন কোথায়?

এই জীবন যদি জীবন হয় তাহলে আসল জীবন কোথায় : আবদুল্লাহ আবু সায়ীদ
০৭ এপ্রিল ২০১৯, ১২:১৬
প্রথম আলো
ইনডিপেনডেন্ট ইউনিভার্সিটি, বাংলাদেশের সমাবর্তনে বিশ্বসাহিত্য কেন্দ্রের প্রতিষ্ঠাতা অধ্যাপক আবদুল্লাহ আবু সায়ীদ। গত ২৮ মার্চ ইনডিপেনডেন্ট ইউনিভার্সিটি, বাংলাদেশের (আইইউবি) সমাবর্তনে বক্তা ছিলেন তিনি।
আমি প্রথমেই একটা ছোট্ট গল্প দিয়ে আমার কথার শুরু করি। গল্পটা এ রকম যে, এক হাসপাতালে পেটে প্রচণ্ড ব্যথা নিয়ে এক রোগী এল। সঙ্গে সঙ্গে তার এক্স-রে করা হলো। কিন্তু একি! রোগীর পেটের মধ্যে শত শত চায়ের চামচ দেখা গেল। তখন জিজ্ঞাসা করা হলো, ‘তোমার পেটে এত চায়ের চামচ এল কী করে?’ সে তখন কাঁদতে কাঁদতে উত্তর দিল, ‘স্যার, ওই যে বিখ্যাত ডাক্তার কাদির সাহেব, এফসিপিএস, এমআরপিএস বলেছেন দিনে দুই চামচ করে তিনবার খেতে।’
তো আমরা এই ডাক্তার কাদির সাহেবের মতো মানুষ দ্বারাই আসলে পরিচালিত হই। তারা যা বলেন, আমরা তা-ই করি। আমরা কখনো দেখি না চায়ের চামচ খাওয়া ভালো, না খারাপ। এটা আমরা ভাবি না। এতে আমাদের কোনো ভালো-খারাপ কিছু হয় কি না, সেটা আমরা বুঝতে পারি না। আমাদের জীবনে এই ডাক্তার কাদির কারা? এই কাদির হচ্ছেন আমাদের অভিভাবক, আত্মীয়, আমাদের বন্ধুবান্ধব, পাড়া-প্রতিবেশীসহ গোটা পৃথিবী। তারা আমাদের যা করতে বলেন আমরা তা-ই করি। যেমন: আমার আব্বার কাছে শুনেছি যে তারা যখন বিশ্ববিদ্যালয়ে পড়ত তখন বলা হতো যে গণিত আর দর্শনই সেরা বিষয়। তাই এ দুটো পড়তে হবে। আমরা যখন বিশ্ববিদ্যালয়ে পা দিলাম, তখন যুগ পাল্টে গেল। তখন সেরা হলো ডাক্তারি, ইঞ্জিনিয়ারিং। আবার মানবিকের শিক্ষার্থী হলে ইংরেজি অথবা অর্থনীতি। কারণ ওই দুটো দিয়ে সিএসপি হওয়ার সুবিধা ছিল। তারপর আরও সময় পার হলো। এখন এসে দাঁড়িয়েছে বিবিএ, এমবিএ। একের পর এক চাপের মধ্যে আমরা পিষ্ট হয়ে যাচ্ছি। কিন্তু আমরা এর বিরুদ্ধে কিছুই করতে পারছি না। কোনোকালেই আসলে কেউ কিছু করে উঠতে পারেনি। আমি কী চাই, আমি কী করতে ভালোবাসি, আমার প্রাণ কী চায়, আমার জীবনের আনন্দ কোথায়—এই খবর কেউ নিতে আসে না। ফলে আমরা সারা জীবন ধরে আমাদের হৃদয়ের সঙ্গে এক রক্তক্ষয়ী যুদ্ধ চালিয়ে যাই।
আমরা আমাদের কোনো দিন চিনতে পারি না। নিজেদের কোনো দিন খুঁজে বের করতে পারি না। আমরা আমাদের আনন্দজগৎকে তাই কোনো দিন আত্মস্থ করতে পারি না। অবশ্য এ রকম হওয়ার কারণ আছে। কেন আমাদের এসব বলা হয়? একটা কারণ হলো দারিদ্র্য। আমাদের দেশে কিছুসংখ্যক মানুষ ছাড়া বাকি সব মানুষ দারিদ্র্যসীমার এত নিচে থাকে যে নিজের ইচ্ছামতো কিছু করার ক্ষমতা থাকে না। নিজের প্রাণের খোরাক জোগানোর সুযোগ আমরা কমই পাই। সুতরাং যেখানে অর্থ আছে, যেখানে টাকা আছে সেখানে আমাদের চলে যেতে হয়। সেটা আমাদের ভালো লাগুক আর না-ই লাগুক।
আরেকটা সমস্যা হলো আমাদের বাবা–মাকে নিয়ে। যেমন আমরা ১১ ভাইবোন ছিলাম। আমার দাদারা ছিলেন মাত্র ১৮ ভাই এবং ১৪ বোন। এত ছেলে-মেয়ে সেকালে থাকত যে বাবা-মা তাদের ঠিক দেখেশুনে রাখতে পারত না। তাই তাদের নিয়ে তেমন কোনো চাপ ছিল না। তারা নিজেদের যা ইচ্ছা তাই হতে পারত। কিন্তু আজকে ছেলেমেয়ের সংখ্যা ২–এ নেমে এসেছে। সব সময় বাবা-মায়ের তীক্ষ্ণ দৃষ্টি যে তাঁর ছেলেমেয়ে কী করছে। আজকের ছেলেমেয়েরা যেন বন্দিশালাতে আটকে আছে। সর্বদা নজরদারির কড়া শিকলে বন্দী তারা। আজকের মতো অত্যাচারিত শিশু আমাদের দেশে কখনো ছিল না। সবচেয়ে বড় কথা, বাবা-মা যা হতে পারেননি, ওই ১-২ জন ছেলেমেয়ে দিয়ে তারা তার প্রতিশোধ নেওয়ার চেষ্টা করেন। এটা তো বড় কঠিন কাজ। এই বাচ্চা ছেলেমেয়ে কীভাবে এই বড় দায়িত্ব পালন করবে।
এরপর এল চাকরি। চাকরি এক মজার জায়গা। এখানে বাণিজ্যিক প্রভুরা তাঁদের মর্জি চালান। তিনজন মানুষ লাগবে। নেবে একজন। তাকে আবার বেতন দেবে দুজনের। তাতে টাকার পরিমাণ বাড়ে। সাথে যে চাকরি পেল সে নিজেও এত টাকা পেয়ে খুশি হয়। কিন্তু সকাল আটটায় অফিসে ঢুকে রাত ১০টা নাগাদ বাসায় ফেরার পর তার মনে আর কোনো শান্তি থাকে না। বাড়ির টেলিভিশনের সামনে টাইটা খুলে দিয়ে সে ক্লান্ত হয়ে বসে পড়ে। এই দৃশ্যটা দেখতে মোটেও ভালো লাগে না। তাদেরকে চিপে, পিষে তাদের সমস্ত রক্ত আমরা নিয়ে যাচ্ছি। ঊনবিংশ শতাব্দীতেই এটা নিয়ে আন্দোলন হয়েছিল। তখন কবি বলেছিলেন,
‘হোয়াট ইজ লাইফ ইফ ফুল
অব কেয়ার
উই হ্যাভ নো টাইম টু স্ট্যান্ড
অর স্টেয়ার’
এই যে ঊর্ধ্বশ্বাস জীবন, এই যে কাজ, এই যে ব্যস্ততা—এসব মিলিয়েই কি আমাদের জীবন? আমরা কি একটু দাঁড়াতে পারব না? আমরা কি একবার এই চারপাশের সুন্দর পৃথিবীর দিকে তাকানোর সুযোগ পাব না? এত অসাধারণ–অবিশ্বাস্য পৃথিবীতে আমরা যে এসেছি, সেটার কোনো আনন্দ কি আমরা নিতে পারব না? কেন এই কথা হয়েছিল? ১৮১৯ সালের দিকে ইংল্যান্ডে একটা আইন পাস হয়েছিল। কাউকে ২০ ঘণ্টার বেশি কাজ করানো যাবে না। কী রকম মারাত্মক আইন আপনি চিন্তা করুন। তখন হয়তো ২২ ঘণ্টা খাটানো হতো। হয়তো কর্মীকে তারা ঘুমাতেই দিত না। এ রকম ভয়ংকর নির্যাতনও সেই সময়ে করা হয়েছে মানুষের ওপর। এই যে ‘মে ডে’তে শিকাগোতে শ্রমিকদের ওপরে গুলি করা হয়েছিল। শ্রমিকেরা কী চেয়েছিল? শুধু ৮ ঘণ্টা কাজ, ৮ ঘণ্টা ঘুম আর ৮ ঘণ্টা আনন্দ করার সুযোগ চেয়েছিল। কিন্তু প্রভুরা বলেছিল যে ৮ ঘণ্টা আনন্দ করা চলবে না। সেটার ভেতর ৬ ঘণ্টা তাদের জন্য কাজ করতে হবে। এই নিয়ে শেষ পর্যন্ত এ রকম দুঃখজনক ঘটনা ঘটেছে।
আমি আরেকটা ছোট্ট গল্প দিয়ে শেষ করি। পথে যেতে যেতে একজন যুবকের সঙ্গে দেখা হলো অপূর্ব এক সুন্দরীর। সুন্দরীকে দেখেই সে প্রেমিক যুবক বলে বসল, ‘আমি তোমাকে বিয়ে করতে চাই।’ আবার সুন্দরীরও এই যুবককে অপছন্দ নয়। তারও ভালো লেগেছে। কিন্তু সে বলল, ‘আমি একটু অসুবিধায় আছি। আমার বাড়ি হলো সাত সমুদ্রের ওপারে। আমি আমার বাবার সঙ্গে সেখানে যাচ্ছি। এখন তো আর আমাদের বিয়ে সম্ভব নয়। তুমি সেখানে এসো। তখন আমি এই বিষয়ে ভেবে দেখব।’
যুবক তো আর অপেক্ষা করতে পারল না। কিছুদিন পরেই সে সুন্দরীর জন্য সাত সমুদ্রের উদ্দেশে পাড়ি জমাল। প্রথম সমুদ্রের পাড়ে সে যখন গেল, সেখানে এক খেয়া মাঝি সাগর পার করে দেবে। সেই খেয়া মাঝি তাকে বলল, ‘আমি চাইলেই তোমাকে এই সমুদ্র পার করে দিতে পারি। কিন্তু এ জন্য তোমাকে তোমার হৃৎপিণ্ডের সাত ভাগের এক ভাগ দিয়ে দিতে হবে।’ সে ভাবল যে তার এত গভীর প্রেম। প্রেমের জন্য না হয় একটু ত্যাগ স্বীকার সে করলই। সে রাজি হয়ে যায় মাঝির কথায়। পার হলো সে প্রথম সাগর। দ্বিতীয় সাগরের খেয়া মাঝিও একই কথা বলল। এভাবে দিতে দিতে সাত সমুদ্র সে যখন পার হলো তখন দেখা গেল তার মাঝে হৃদয় বলে আর কিছুই নেই। তার হৃদয় খণ্ড খণ্ড হয়ে হারিয়ে গেছে।
এই যে আমাদের সময়ের ওপর যে নিষ্পেশন, যে টানাপোড়া চলে এই আমাদের ব্যস্ত জীবন নিয়ে, সেটা আমাদের জন্য কোনো সুফল বয়ে আনে না। আমাদের জীবন যে আনন্দের এক নতুন উৎস, সেটা আমাদের মনে রাখতে হবে। জীবনের এই আনন্দ আমরা খুঁজে পাই সময়ের কাছ থেকে। কেউ যদি আমাদের কাছ থেকে এই সময়কেই কেড়ে নেয়, তাহলে আমরা কীভাবে সুখী হয়ে বেঁচে থাকব? আমরাও যদি আমাদের সময়কে অন্য কাউকে দিয়ে দিতে থাকি, তাহলে আমাদের জীবন কোথায়? কীভাবে আমরা আমাদের ভেতরের মানুষকে গড়ে তুলব?
নাসিরুদ্দিন হোজ্জার একটা গল্প আছে যে এটা যদি বিড়াল হয় তাহলে কাবাব কোথায়। আবার এটাই যদি কাবাব হয় তাহলে বিড়ালটা কোথায়। তো এই জীবন যদি জীবন হয় তাহলে আসল জীবন কোথায়? তাই আমি এই তরুণদের কাছে বলব রবীন্দ্রনাথের একটি কথা:
‘বিশ্বরূপের খেলাঘরে কতই
গেলেম খেলে,
অপরূপকে দেখে গেলেম
দুটি নয়ন মেলে।’
এই যে অপরূপ বিশ্ব—তা আমাদের চোখ দিয়ে, আমাদের ইন্দ্রিয় দিয়ে আমাদের জীবন দিয়ে যদি উপভোগ না করে যাই তাহলে আর এই জীবনের মানে কী? আমি সবাইকে অনুরোধ করব এই বিষয়গুলো নিয়ে ভাবতে। কেননা তোমরা এখন জীবনের পথে অগ্রসর হতে যাচ্ছ। তোমাদের এখনই ভাবার সময়। পরে আর এসব ভেবে কোনো লাভ হবে না। তোমাদের আগামী সময়ের জন্য শুভকামনা রইল। সকলকে ধন্যবাদ

Friday, May 10, 2019

PMP - In a nutshell

PMP at a glance:

https://worldofprojectmanagement.com/pmp/ -


Out of 200 questions, there will be 25 pretest questions and they would not affect your score. 

PMI does not disclose total passing score for any candidate but to pass the exams, according to an assessment by experienced trainers, you must correctly answer at least 61% of 175 live questions. There are no negative marks for wrong answers, so don't leave any question unanswered.


Resource Link:

  1. https://www.tutorialspoint.com/pmp-exams/pmp_exams_overview.htm

3P Consulting Limited

Foyezur Rahman, RMP, PMP, PRINCE2
https://www.linkedin.com/in/foyezur/
https://www.facebook.com/3PCLTD/videos/1226866784145259/

Saturday, April 13, 2019

Companies in Bangladesh


  1. Enterprises
  2. Polymers
  3. Chemicals
  4. Hatcheries
  5. Resorts
  6. Industries
  7. Marbles
  8. Cosmetics
  9. Soft-Tech

Finance, Insurance and World Bank

Sunday, February 10, 2019

Monday, January 28, 2019

Sunday, January 6, 2019

null vs undefined vs not exists objects in react native

Check the property existence
Fortunately, JavaScript offers a bunch of ways to determine if the object has a specific property:
  1. obj.prop !== undefined: compare against undefined directly
  2. typeof obj.prop !== 'undefined': verify the property value type
  3. obj.hasOwnProperty('prop'): verify whether the object has an own property
  4. 'prop' in obj: verify whether the object has an own or inherited property
My recommendation is to use in operator. It has a short and sweet syntax. in operator presence suggests a clear intent of checking whether an object has a specific property, without accessing the actual property value.
  1. https://www.hacksparrow.com/javascript-check-object-property-is-defined.html
  2. https://www.jstips.co/en/javascript/differences-between-undefined-and-null/

I have also got clarification from [Arup Hore] answer here:
Please read the following carefully. It shall remove all your doubts regarding the the difference between null and undefined in JavaScript. Also you can use the utility function given below to exactly determine types.
In JavaScript we can have following types of variables.
  1. Undeclared Variables
  2. Declared but Unassigned Variables
  3. Variables assigned with literal undefined
  4. Variables assigned with literal null
  5. Variables assigned with anything other than undefined or null
Following explains each of these cases one by one
  1. Undeclared Variables: Following holds true for undeclared variables
    • Can only be checked by typeof() which returns string 'undefined'
    • Cannot be checked with == or === or by if or conditional operator ? (throws Reference Error)
  2. Declared but Unassigned Variables
    • typeof returns string 'undefined'
    • == check with null returns true
    • == check with undefined returns true
    • === check with null returns false
    • === check with undefined returns true
    • if or conditional operator ? returns false
  3. Variables assigned with literal undefined: These variables are treated similarly as the Declared But Unassigned Variables.
  4. Variables assigned with literal null
    • typeof returns string 'object'
    • == check with null returns true
    • == check with undefined returns true
    • === check with null returns true
    • === check with undefined returns false
    • if or conditional operator ? returns false
  5. Variables assigned with anything other than undefined or null
    • typeof returns one of the following strings: 'string','number','boolean','function''object','symbol'
Following provides the algorithm for correct type checking of a variable:
  1. Check for undeclared/unassigned/assigned with undefined using typeof. return if string 'undefined' is returned.
  2. Check for null using ===. return 'null' if true.
  3. Check for actual type using typeof. return type if not equal to 'object'
  4. Call Object.prototype.toString.call(o) to determine actual object type. It shall return a string of type '[object ObjectType]' for all the built in Javascript or DOM defined Objects. For user defined objects it returns '[object Object]'
You can also use the following utility function for determining types. It currently supports all ECMA 262 2017 types.
function TypeOf(o,bReturnConstructor)
 {
   if(typeof o==='undefined') return 'undefined'
   if(o===null) return 'null'   
   if(typeof o!=='object') return typeof o

   var type=Object.prototype.toString.call(o)
  switch(type)
  {
     //Value types:4
     case '[object Number]': type='number';break;
     case '[object String]': type='string';break;
     case '[object Boolean]': type='boolean';break;
     case '[object Date]': type='date';break;


   //Error Types:7
     case '[object Error]': type='error';break;
     case '[object EvalError]': type='evalerror';break;
     case '[object RangeError]': type='rangeerror';break;
     case '[object ReferenceError]': type='referenceerror';break;
     case '[object SyntaxError]': type='syntaxerror';break;
     case '[object TypeError]': type='typeerror';break;
     case '[object URIError]': type='urierror';break;


    //Indexed Collection and Helper Types:13
     case '[object Array]': type='array';break;
     case '[object Int8Array]': type='int8array';break;
     case '[object Uint8Array]': type='uint8array';break;
     case '[object Uint8ClampedArray]': type='uint8clampedarray';break;
     case '[object Int16Array]': type='int16array';break;
     case '[object Uint16Array]': type='uint16array';break;
     case '[object Int32Array]': type='int32array';break;
     case '[object Uint32Array]': type='uint32array';break;
     case '[object Float32Array]': type='float32array';break;
     case '[object Float64Array]': type='float64array';break;
     case '[object ArrayBuffer]': type='arraybuffer';break;
     case '[object SharedArrayBuffer]': type='sharedarraybuffer';break;
     case '[object DataView]': type='dataview';break;

    //Keyed Collection Types:2
     case '[object Map]': type='map';break;
     case '[object WeakMap]': type='weakmap';break;

    //Set Types:2
     case '[object Set]': type='set';break;
     case '[object WeakSet]': type='weakset';break;

    //Operation Types
    case '[object RegExp]': type='regexp';break;
    case '[object Proxy]': type='proxy';break;
    case '[object Promise]': type='promise';break;

    case '[object Object]': type='object';
             if(bReturnConstructor && o.constructor) type=o.constructor.toString().match(/^function\s*([^\s(]+)/)[1];
         break;
    default:
        type=type.split(' ')[1]
        type=type.substr(0,type.length-1)   

   }
    return type 
}