Use automator to make you ready to start office at one click

For the current pandemic situation of Korona, my office has started WFH situation. The IT team did a very good a job and prepared the infastructure very quickly. They had to provide VPN connection to all of the employees. They had to ensure connectivity as well as availability of the VPN connection also. HRs or office staffs are doing a very good job on starting office pcs daily basis. So, we are doing our job from home (login into the office pc through office VPN). That’s Great, Right?

The problem I am facing now, and I am sure lots of other users will face the same issue, is to start chrome, open slack, open gmail, open teams and other required web URLs in the browser at first. So, here I built a workflow using Automator through which all of the tasks will be started automatically on one click.

As I am a MAC user, so, the script has been build on Automator (a built in software that comes with mac). The same kinda thing can be built in Mac, Unix and Windows also.


The workflow is:
* Open Chrome with UserProfile named “Profile 1” and open facebook, gmail, slack, team (one of my project) URLS
* Switch to another space
* Open Chrome with another UserProfile named “Profile 2” and open teams (another project of mine), issue tracker of that project


Attached OpenChromeWF.zip is the output of my automator. Anyone can use it by extracting the *.app, moving it to Applications folder and then use it as regular app.

To edit the workflow:
* Start “Automator”
* Click on “Open an Existing Document”
* Select “OpenChromeWF.app”
* Edit and Save

This workflow can be started from launcher, or even you can bind a keypress to initiate the workflow execution.

সফটওয়্যার ডিজাইন নীতি (Software Design Principles)

সফটওয়্যার ডেভেলপমেন্টে ডিজাইন প্রিন্সিপলস একটু বহুল আলোচিত ও গুরুত্বপুর্ন একটি শব্দ। সাধারনত ডিজাইন প্রিন্সিপালস বলতে বোঝানো হয় একগুচ্ছ গাইডলাইন বা নিয়ম কানুন যেগুলো মেনে কোড লিখলে বাজে ডিজাইন এড়ানো যায়। প্রশ্ন আসতে পারে যে একটি ডিজাইন কখন বাজে হতে পারে। ধরে নেই, কোন একটি সফটওয়্যারের ডেভেলপমেন্ট চলছে। মাঝপথে একটি নতুন ফিচার ইম্প্লিমেন্ট করতে গিয়ে দেখা গেল যে কোন একটি ক্লাসের একটি মেথডের সিগনেচার (মেথডের নাম, আর্গুমেন্ট গুলোর নাম, ডাটাটাইপ, সংখ্যা) পরিবর্তন করতে হবে। কিন্তু ইতিমধ্যে প্রায় ১০০ জায়গায় এই মেথডটি ব্যবহার করা হয়েছে। তার মানে এখন ওই ১০০ জায়গার মেথড কল করার সময় সিগনেচার পরিবর্তন করে দিয়ে আসতে হবে। অথবা ওই ক্লাসে নতুন একটি মেথড তৈরী করতে হবে। এটাকেই বাজে ডিজাইন বলা হচ্ছে। কারন নতুন একটি ফিচার ইমপ্লিমেন্ট করলে যদি আগের ইমপ্লিমেন্ট করা অন্যান্য ফিচারে বাজে প্রভাব ফেলে তাহলে ওই ডেভেলপমেন্টে সঠিক আর্কিটেকচার বা ডিজাইন মেনে কোড করা হয় নি বলেই ধরে নেওয়া হয়। রবার্ট মার্টিন (Robert Martin) নিজ লেখা বই “Agile Software Development: Principles, Patterns, and Practices” এ ডিজাইন প্রিন্সিপাল গুলো সম্পর্কে লিখেছেন।

রবার্ট মার্টিন এর মতে খারাপ বা বাজে ডিজাইন এর নিচের ৩ টি বৈশিষ্ট্য থাকে।

  • রিজিডিটি (Rigidity) : কোডে কোন অংশের পরিবর্তন যদি সিস্টেমের অন্য অনেক জায়গায় প্রভাব ফেলে তাহলে পরিবর্তন করা ব্যয়বহুল হয়ে পড়ে।
  • ফ্রা্গিলিটি (Fragility) : কোডের কোন অংশের পরিবর্তন যদি সিস্টেমের অন্য কোন ফিচার কে অনাকাঙ্খিত হবে অকেজো করে দেয়।
  • ইমোবিলিটি (Immobility) : কোডের অংশ এমনভাবে অ্যাপলিকেশন নির্ভর যে, অন্য কোন অ্যাপ্লিকেশনে কোডটুকু ব্যবহার করা কঠিন হয়।

সাধারন নিচের পাঁচটি নিয়ম মেনে কোড করলে উপরের বর্নিত সমস্যাগুলো এড়ানো যায়।
১। ওপেন ক্লোজ নীতি (Open Close Principle)
২। ডিপেন্ডেন্সি ইনভার্সন নীতি (Dependency Inversion Principle)
৩। ইন্টারফেস সেগ্রেগেশন নীতি (Interface Segregation Principle)
৪। সিঙ্গেল রেসপনসিবিলিটি নীতি (Single Responsibility Principle)
৫। লিসকভ’স সাবস্টিটিউশন নীতি (Liskov’s Substitution Principle)

পাঁচটি প্রিন্সিপালের বর্ননা পরের পোস্ট গুলোতে দেওয়া হবে। এরা প্রত্যেকেই আলাদা আলাদা পোস্টের দাবীদার। 🙂

আমার এইম ইন লাইফ

ছোট বেলায় স্বপ্ন ছিল ডাক্তার হবার। কলেজে বায়োলজি (জীববিজ্ঞান) তে A+ পাওয়া সত্বেও বুঝলাম ডাক্তারী পড়া আমার পক্ষে সম্ভব না। তারপর স্বপ্ন ছিল ইন্জিনিয়ার হওয়ার। শর্টকাটে সেটাও হয়ে গেলাম। এখন মন চায় মটরসাইকেল সার্ভিসিং সেন্টার খুলে মটরসাইকেলের এফোঁড়-ওফোঁড় করতে।

History of Modern Calendar Part-1 (Leap Year)

Background:
We, a bunch of friends, were in a tea stall and discussing about several matters. Suddenly a question was raised about why we need to add one additional day after every four years (leap years) which gives us February 29. The first answer was, “We calculate 24 hours a day, but it is not true. Actually one day is 23 hours 56 minutes and 4.1 seconds”. So, actually we are advancing 3 minutes 55 seconds and 900 milliseconds each day from solar year. So, we started calculating the total time for four years expecting that total will be same as one day which we add in leap years. We tried lots of possible ways. But all of the answers were around three days (instead of one). Instead of banging our heads to the wall, we started reading wikis and found some more information that was getting us close to the real answer.

A solar year means the time taken by earth to rotate once which is 365 days 5 hours 48 minutes 46 seconds. But our calendar year consists of only 365 days. So, we are being ahead of 5 hours 48 minutes and 46 seconds each year. As a result, after each four years, we add 6*4=24 hours or 1 day to the calendar (February 29). Note: Instead of 5 hours 48 minutes and 46 seconds, we are being ahead of 6 hours per year. After this adjustment, we are (11 minutes 14 seconds)x4 behind the solar system after each four years. In future, we will have to skip a day when this (11 minutes 14 seconds) per years becomes equal of one day.

The calendar we are using as standard through world is called Gregorian Calendar. It is named after Pope Gregory XIII, who introduced it in October 15, 1582. Before the Gregorian calendar, Julian calendar was being used. So, when we moved to Gregorian Calendar, we drifted From 4th October, 1582 (Julian) to 15th October, 1582 (Gregorian).

Leap Year:
A leap year (also known as an intercalary year or bissextile year) is a calendar year containing one additional day (or, in the case of lunisolar calendars, a month) added to keep the calendar year synchronised with the astronomical/seasonal/solar year.

Simplified version: All the years, in which we add one additional day to sync with Solar system (6×4=24 hours), are called leap year.

Leap year in Julian Calendar:
Each year which is divisible by 4 is a leap year.

Leap year in Gregorian Calendar:
if (year is not divisible by 4) then (it is a common year)
else if (year is not divisible by 100) then (it is a leap year)
else if (year is not divisible by 400) then (it is a common year)
else (it is a leap year)

Note: There are too many leap years in Julian calendar than Gregorian calendar. Fixing this error was the original intention to create a new calendar system (Gregorian) which is more accurate than the Julian calendar.

References:
https://en.wikipedia.org/wiki/History_of_calendars
https://en.wikipedia.org/wiki/Leap_year
https://www.timeanddate.com/calendar/gregorian-calendar.html

Preparation for becoming a good Software Engineer/Developer

Why I am writing this post:
I just read a post in medium about how a 19 years old girl became successful developer which got myself into share some of my knowledge too. The first thing came into my mind is to share something about getting a job as a software engineer/developer in reputed companies and how to improve own skills. So, I am going to list some of the qualities recruiters and your lead/project managers expect from you. I will divide the post in two sections:

Section 1: PREPARATION FOR GETTING A GOOD JOB
1. Solve Problems
The most important requirement is the capability of solving problems. It doesn’t specifically mean solving problems of programming contests only. This refers to the capability of solving any kind of problems in real world. As a software developer/engineer, it is the only duty to solve client’s/user’s (specifically human’s) problem. Right?

How to test or improve problem solving skills? The most easiest way is to solve problems of programming contests. Because those problems are being prepared based on real life situations and also you don’t need to learn a lot of technologies to solve them. Just choose any one of programming languages and start solving problems. You will love how they judge your solution with “Wrong Answer”, “Time Limit Exceeded”, “Runtime Exception”, “Stack Overflow” etc. It will improve not only your problem solving skill, but also it will force you to think to find the best solution among thousands of solutions. Isn’t that cool? Let’s get started:
i. UVa
ii. SPOJ

Another option is to start developing few applications (desktop/web/mobile) on your own. Find some idea that can solve human problems. Or you can choose some existing problems. Then start developing them one by one in any of your favourite technologies (Java, Javascript, C#, C++, python, Android, iOS or whatever you want).

2. Be A Smart User
You will have to be a smart user of few things like the IDE you are working on, the Google, the technology you are working on. Let me explain these three:

i. The IDE
IDE stands for Integrated development kit. The tool you are using for writing your codes. For example, if you are a C# developer, it will be Visual Studio, if you work in PHP, it will be PhpStorm or WebStorm mostly, if you are a JAVA developer, it must be Netbeans or eclipse or android studio. Right? So, whatever the IDE is, you must have to be in good relationship with it. You must know basic features and keyboard shortcuts of them. For example, I am sure you will agree with me that debugging is a way to find out what a code snippet is really doing, and it can save a lot of time when something goes wrong. Even debugging will be useful when you need to understand codes written by someone else. So, you must be skilled in debugging in any tool you are using. For example: if you are writing a web application using C# and Javascript, you must know debugging in Visual Studio and also debugging Javascript using your browser.

ii. Version Control
You must use any version controlling tool for your development. For example, Git and SVN are widely used version controlling tool now-a-days.

iii. Issue Trackers
You must have use any issue tracker also. There are lots of issue trackers out there like bitbucket, jira, redmine, gitlab etc.

iv. Keep Pace With The World
Subscribe few technology related blogs or related facebook groups which might keep you updated with latest technologies. With knowing the name of a new technology, you must also know the features, drawbacks, and why this is better from existing techs.

3. Prepare a CV
In the CV you must be focusing on your skills, programming languages you know, tools you have worked on, projects you have worked on, Apps you have developed, Solved problems in different Online Judges and any other achievements you got. CV must not be lengthy with unnecessary informations and also it should be prepared maintaining standard conventions. You can contact with me directly if you need help about preparing a standard CV.

If you practice above items, you should be able to be good software developer in near future.

Section 2: GOT A GOOD JOB ALREADY, NEED TO IMPROVE YOURSELF?
Oh, you have got a job as a software developer/engineer (title may differ but your job is to develop applications). Now it’s time to improve yourself day by day.

1. Self-Evaluation
Yeah, you read it right. You need to be a self evaluator. Don’t wait for someone else (may be your boss (Lead)) to evaluate. Although, most of the good companies have tradition to evaluate workers based on few required criteria. For example: In the company I work on, the team lead evaluates each of the team member in 3 months interval on 23 established items. But still, before someone else evaluate you, you must evaluate yourself after you have taken every single decision, or after you have written every single line of code. Ask yourself following questions:

1. Am I doing the right thing to do?
2. Am I writing the best solution?
3. What other developers are doing in this situation?
4. What type of impact it can create in the existing features?
5. Because of this change, what can happen throughout the app?
6. Did I handled all situation and taken care of all types of exceptions? etc.

If you can make this a habit, you will be able to write beautiful codes too.

2. Become Lazy
You know what, a software developer is needed to be lazy. If you are lazy person, you must hate doing same thing more than once. You must hate to re-write same codes you have already written somewhere else in this application. When writing something, you will write it in a way so that it can be REUSED.

3. Follow Conventions
You must need to follow conventions and standards of existing app when writing codes. If you are developing an app from scratch, study about folder architecture, design patterns and other best practices.

4. Online Teachers (Documentation and Google) Are The Life Savers
So, if you are writing an app using XYZ technology, you must read their documentation at first. Take an idea about what they do, how they do, what APIs they are providing etc. When developing your APP, if you face any issues or may be you need something to do, re-visit the documentation at first. If the solution you need is common, you are going to get it there, believe me. Now if you need something to know (like how to do this in XYZ tech), let’s go to Google and ask it. Read what other peoples are saying about that. You will find a lot of answers. You have to evaluate those answers and find out the best solution. It’s not impossible that, after reading their solution, you can get an idea in your mind which is far better than existing solutions. Right?

5. Communication
Communication is the key. You have to be a good communicator. You will have to communicate with your co-workers or clients on regular basis to make them know about what you are doing, how you are doing, what troubles you are facing and how you have solved them.

I believe if we can follow above instructions in your daily life, we will be a great software developer in future. And also to keep our brain sharp, we need to read books on regular basis. I am gonna add some must-read book list in this post.

Thanks for your patience and reading this.
Ujjal Suttra Dhar

আমার দেনা পাওনা (amartk.com)

যারা আমার মত লেনদেনের ভারে জর্জরিত (প্রচুর ধার দেন অথবা প্রচুর ধার নেন), ধার নিয়ে ভুলে গিয়ে পাওনাদারের কাছে গালি খান অথবা ধার দিয়ে ভুলে গিয়ে টাকা হারান তাদের জন্য ছোট্ট একটা টুল Amartk বানালাম।

যা যা করতে পারবেনঃ
১। ধার দেওয়া বা ধার নেওয়ার সময় একটা করে এন্ট্রি করে রাখবেন। এতে নাম, তারিখ, টাকার পরিমান এবং অন্যান্য বিস্তারিত তথ্য সংরক্ষন করে রাখা যাবে।
২। সকল ধার ও সকল পাওনা সবই আপনি লিস্ট আকারে দেখতে পারবেন।
৩। লিস্ট এর সব আইটেমের পাশে একটি করে বাটন থাকবে যেটা দিয়ে ধার বা পাওনা শোধ হয়েছে কিনা সেটা বলতে পারবেন।
৪। ড্যাশবোর্ডে নিচের তথ্যাদি দেখতে পারবেনঃ

  • এই মুহুর্তে আপনার ধারের পরিমান
  • এই মুহুর্তে আপনার পাওনা টাকার পরিমান
  • গত একমাসে আপনি যে পরিমান ধার নিয়েছেন ও দিয়েছেন তার একটি গ্রাফ

ভবিষৎ পরিকল্পনাঃ
১। এই মুহুর্তে মোট টাকা একসাথে শোধ বা ফেরত নিতে হবে। ভেঙ্গে ভেঙ্গে শোধ করলেও আপনি শুধু সম্পুর্ন শোধ হয়ে গেলে তখনি শোধ বলতে পারবেন। ভেঙ্গে ভেঙ্গে শোধ করলে তার হিসাব রাখার অপশন এই টুলে নেই।
২। ধার দেওয়ার সময় আপনি চাইলে একটা তারিখ ঠিক করে দিবেন। ওই তারিখের মধ্যে যদি শোধ করা না হয়, তাহলে আপনার ফোনে এবং ইমেইলে নোটিফাই করে দিবে।
৩। মোবাইল অ্যাপ

সাইটের নিরাপত্তা জনিত কারনে রেজিষ্ট্রেশন বন্ধ আছে। আপনারা যদি কেউ টেস্ট করে দেখতে চান, আপনার ইমেইল আইডি দিয়ে আমাকে মেসেজ দিন।

স্ক্রিনশটঃ

Dashboard-AmarTaka

Loans-AmarTaka

 

 

StringBuilder over String

Shovon was working on a task where he needed to traverse 1 lac of data sets and create a string appending some values from each row. But it takes 4-5 minutes just to build a string called “description” by iterating over DataSource.Rows having 1+ lacs rows in it. It shouldn’t take that much time just to iterating because processors are too much faster. So, We (me, Ananta) decided to look into the code.

Shovon implemented it in following manner:

string description = string.empty;
foreach(DataRow row in DataSource.Rows) {
description += string.Format("{0} {1} {2}", row[propA], row[propB], row[propC]);
}

So, what do you think? We are just iterating 1 lac of data and appending some values into a string. And the time increases exponentially with the number of rows.

Is this really should take that much time? My answer was “No”. It should not. Something is going wrong here which is taking this time. Ananta suddenly suggested to use StringBuilder instead of string for description field. So, we tried that in following way:

StringBuilder description = new StringBuilder();
foreach(DataRow row in DataSource.Rows) {
description.Append(string.Format("{0} {1} {2}", row[propA], row[propB], row[propC]));
}
// use as description.ToString()

Basically, instead of concatening strings, using Append method of StringBuilder here. Surprisingly, it didn’t take more than 2-3 seconds to construct that description field iterating over lac data this time. And now the taken time doesn’t increases with the increment of number of data sets.

Explanation:
Lets concatenate some string and see how it works.

string s = '01';
s += '23';
s += '45';
s += '67';

on the first concatenation it makes a new string of length four and copy “01” and “23” into it — four characters are copied. On the second concatenation it makes a new string of length six and copy “0123” and “45” into it — six characters are copied. On the third concatenation, it makes a string of length eight and copy “012345” and “67” into it — eight characters are copied. So far a total of 4 + 6 + 8 = 18 characters have been copied for this eight-character string. Keep going. Keep going till 1 lac of characters. Could you imagine how much data has been copied?

On the hand, StringBuilder doesn’t depend on copy. It actually uses mutable array, internal linked list and other mapping mechanism instead of creating doubled size array and copy. It doesn’t create copy with doubled size until it really necessary. Although the implementation of StringBuilder seems to be changed with versions and it is becoming improved day by day.
Click here if you really want to know how stringbuilder works

Git 2.10 has been released

Git 2.10 has been released with lots of new attractive and important features and bug fixes about 19 hours ago (from the time when I am writing this) from over 70 contributors. Following are some of the most interesting new features:

  • Progress reporting for pushes
  • Signature verification improvements
  • More color attributes

To check full release notes of this version, Click Here.

To fork the original git repository for git, Click Here

For details, Click Here

বুলিয়ানোলজি, বিড়ম্বনা ও শিক্ষা (Branching with if(condition) ; should have at lease one else statement)

আমার একটা বদঅভ্যাস আছে। যখন কোন কন্ডিশনাল ব্রাঞ্চিং এর মাধ্যমে কোন বুলিয়ান প্রোপার্টির ভ্যালু আপডেট করার কোড লিখি তখন শুরুতেই ওই প্রোপার্টির ভ্যালু ০ করে নেই। তারপর If() স্টেটমেন্টের মাধ্যমে প্রয়োজনীয় কন্ডিশনের উপর ভিত্তি করে প্রোপার্টির ভ্যালু আপডেট করি।
উদাহরনঃ

hasPlanToBeOut = false;

if(checkIfYouHavePlanToGoOut)
{
   hasPlanToBeOut = true;
}

এই অভ্যাসের বিড়ম্বনাঃ
আজকে বাসায় বসে বসে বিরক্ত হয়ে সন্ধ্যায় পর পর তিনজন কে মেসেজ দিলাম নিচের মত করেঃ
“বের হলে জানাইস”
উপরের কোডের মত যদি লেখি তাহলে দাড়ায়

if(jodiBerHos())
   callMe();

সবই ঠিক আছে। যখন বাইরে বের হবে তখন তারা কল দিয়ে জানাবে যে বাহির হচ্ছে। সমস্যা হয় যদি তাদের আজকে বের হওয়ার কোন প্লান না থাকে। সেক্ষেত্রে আমাকে অনন্ত কালের একটা ওয়েটিং লুপে পরে যেতে হয়। এখানেই বিড়ম্বনা। আমার ওই মেসেজ টা যদি একটু পরিবর্তন করি তাহলেই আমাকে আর এই ওয়েটিং এ পড়তে হয় না।
প্রশ্নঃ “আজকে বের হবি?”

if(jodiBerHos)
   callMe(YES);
else 
   callMe(NO);

কয়েকদিন আগেই একটা প্রজেক্টে বাগ পোস্ট হয়েছিল। বাগটা ছিল এরকম, শুরুতে ২ টা এরিয়ার কালার হলুদ থাকে। সময়ের সাথে সাথে ডাটার উপর নির্ভর করে একটার রঙ পরিবর্তন হয়ে লাল হয়ে যায়। এরপর আবার কিছু সময় পর যখন ডাটা পরিবর্তন হয়ে লাল এরিয়া টা পুনরায় হলুদ হওয়ার কথা সেটা আর হয় না। মানে একবার লাল হয়ে যাওয়ার পর ডাটা পরিবর্তন হলেও ওইটা আর কখনোই হলুদ এ ফেরত আসে না।

//init
areaA = yellow;
areaB = yellow;


//get called in a one minute interval
if(someCondition())
   areaB = red;

কোডটিতে দেখা যাচ্ছে শুরুতেই দুইটা প্রোপার্টির ভ্যালু ইয়েলো রেখে তারপর কন্ডিশন চেক করে রেড করা হচ্ছে। অর্থাৎ যদি someCondition() এর ভ্যালু true হয় তাহলে areaB রেড হয়ে যাবে। এই কন্ডিশন চেকের কোডটুকু এক মিনিট ইন্টারভালে বার বার কল হতে থাকবে। একবার রেড হয়ে গেল। এরপর কোন সময় যদি someCondition() এর ভ্যালু true না হয়ে যদি false হয় তখন আর কিন্তু areaB এর ভ্যালু পরিবর্তন হবে না। রেড ই থেকে যাবে। এই জন্য এই কোড স্নিপেট এর সঠিক রুপ এরকম হওয়া উচিত ছিলঃ

//init
areaA = yellow;
areaB = yellow;


//get called in a one minute interval
if(someCondition())
   areaB = red;
else 
  areaB = yellow;

সারমর্মঃ যেকোন if() স্ট্যাটমেন্টে কমপক্ষে একটি else ব্রাঞ্চ থাকা উচিত।

প্যারালাল প্রসেসিং এর বাস্তব উদাহরন পাওয়া অসম্ভব (Parallel processing is quite impossible in real life)

প্যারালাল প্রসেসিং নিয়ে বকবকঃ (কম্পু রিলেটেড লোকজনই শুধু পড়েন, আর্টস, কমার্সের কেউ পড়লে মাথা ঘুরাইতে পারে।)

অনেকের মধ্যেই একটা ভুল ধারনা আছে। অনেকেই মনে করে যে আধুনিক কম্পিউটারে প্যারালেলিজম সম্ভব। এর পক্ষে যুক্তি দেখানো হয় মাল্টি থ্রেডিং নিয়ে। একটা অ্যাপ্লিকেশনে ৫ টা থ্রেড চালু করা হয় যার প্রত্যেকটি থ্রেড ৫ সেকেন্ড করে সময় নেয়। তাহলে সবগুলা থ্রেড কমপ্লিট হতে ৫ * ৫ = ২৫ সেকেন্ড লাগার কথা। নিচের এই লিঙ্কটিতে এরকম ই উদাহরন দিয়ে মাল্টি থ্রেডের মাধ্যমে দেখিয়েছেন যে পাচটি থ্রেড আসলে ৫ সেকেন্ডেই শেষ হচ্ছে। এটাকেই তারা বলেছেন প্যারালাল প্রসেসিং।

https://howtoprogramwithjava.com/java-multithreading/?hc_location=ufi

প্রথমে থ্রেড নিয়েই বলি। ৫ সেকেন্ডের কাজ দিয়ে আধুনিক প্রসেসরের ক্ষমতা পর্যবেক্ষন করতে চাইলে আমার মতে সেটা হবে প্রসেসরের ক্ষমতাকে অপমান করা। প্রসেসর এতই দ্রুত একটা কাজ শেষ করে অন্য কাজ শুরু করে যা আমাদের চোখে ধরা পরার বাইরে। যেকারনে ৫ সেকেন্ড করে লাগে এমন পাচটা থ্রেড চালালে, সবগুলা থ্রেড মোটামুটি ৫ সেকেন্ডেই শেষ হয়ে যাচ্ছে। কিন্তু তারপরও পাচটা থ্রেড কিন্তু একি সাথে চলে না। টাইম শেয়ারিং এর মাধ্যমে প্রত্যেক থ্রেডের পেছনেই প্রসেসর সময় ব্যয় করে অ্যালগরিদম অনুযায়ী। সেক্ষেত্রে যে কারনে কোন থ্রেড আগে শেষ হবে, কোনটা পরে। একি সাথে ৫ টা থ্রেড শেষ হবে না। যেহেতু, ৫ সেকেন্ডের কাজ দিয়ে প্রসেসরের ক্ষমতা বোঝা যাবে না, তাই এই থ্রেড গুলোর সময় বাড়িয়ে একঘন্টা করে দেখা যেতে পারে। মানে একঘন্টা করে সময় লাগে এমন ৫ টা থ্রেড একসাথে শুরু করব এবং এবং কোন থ্রেড কখন শেষ হয় তার সময় টা নোট করব। আগ্রহীরা উপরের উদাহরনের কোডটা একটু মডিফাই করেই এই পরীক্ষা টা করে দেখতে পারেন।

এবার প্রসেস নিয়ে কথা বলি। ধরে নেই, কোর আই X প্রসেসরে ৫ টা কোর (মাইক্রো প্রসেসর) থাকে। আসলে ব্যপারটা এমন যে এই কম্পিউটারের মুল প্রসেসর ৫ টা যারা আসলেই টাস্ক প্রসেস করে। আর আমরা যেটাকে প্রসেসর বলি সেটি আসলে একটা কন্টেইনার যার ভেতর সেই মুল ৫ টা কোর প্রসেসর গুলো থাকে। এই কন্টেইনার প্রসেসরের কাজ হল যখন কোন টাস্ক আসবে তার কাছে তখন সে অ্যালগরিদমের উপর নির্ভর করে ওই সময়ের পটেনশিয়াল কোর প্রসেসরকে টাস্কটা অ্যাসাইন করবে। এখন আপনি ৫ টা প্রসেস (প্রত্যেক প্রসেস কম্প্লিট হতে সময় লাগে ৫ মিনিট)একি সময়ে স্টার্ট করলেন। প্রত্যেক কোর প্রসেসর কে একটা করে টাস্ক অ্যাসাইন করা হল। তাহলে একি সাথে সবগুলো প্রসেস কম্প্লিট হবে ৫ মিনিটেই যেখানে ৫ * ৫ = ২৫ মিনিট লাগার কথা ছিল। হ্যা, আপনার মনে হতে পারে যে এখানে প্যারালাল প্রসেসিং হল।
এটা কি সবসময় ৫ মিনিটেই হবে? ভেবে দেখুন তো। ধরেন আপনার ৫ টা কোরের মধ্যে এই মুহুর্তে ৪ টা ফ্রি আর একটা ব্যাস্ত আছে। তখন এই ৫ টা প্রসেস কম্প্লিট হতে ১০ মিনিটের বেশী সময় লাগবে ( প্রথম ৪ টা টাস্ক শেষ হবে ৫ মিনিটে। তারপর যখন কোন প্রসেসর ফ্রি হবে তখন ৫ নম্বর টাস্ক টা শুরু হবে এবং এটা শেষ হতে আরও ৫ মিনিট সময় লাগবে)। ধরেন, এখন ৪ টা কোর ই ব্যস্ত। আপনার জন্য শুধু একটা কোরই ফ্রি আছে। তখন সময় লাগবে ২৫ মিনিট।

মানুষের ব্রেইন এর নিউরন গুলো হল এক একটা কোর প্রসেসিং ইউনিট। যদিও মানুষের ব্রেইন আসলেই কিভাবে কাজ করে তা এখনো শতভাগ বের করা সম্ভব হয় নি তবে মোটামুটি একটা আইডিয়া করে সেই জিনিসটাই ইম্পলিমেন্ট করেই কম্পিউটারের প্রসেসর বানানোর চেষ্টা করা হচ্ছে।

অনেক সময় আমাদের এমন হয়, হঠাৎ কোন কিছু একটা মনে করতে চাইলাম। কিন্তু কিছুই মনে পড়ছে না (আঞ্চলিক ভাষায়, পেটে আছে, মুখে নাই)। ২-১ দিন পর অন্য কোন কাজ করছেন এমন সময় হঠাৎ করেই সেই জিনিস টা মনে পড়ে গেল। হয় না এমন? এর কারন হচ্ছে কোন একটা নিউরন ওই জিনিসটা খোজার কাজে ব্যস্ত ছিল। যখনি পেয়েছে সাথে সাথে আপনাকে জানিয়ে দিয়েছে। ওই সময়ে ওই নিউরন টা শুধু এই একটা কাজেই ব্যস্ত ছিল। মানুষের ব্রেইন আসলে মাল্টি টাস্কিং করে মাল্টিপল সংখ্যক প্রসেসর (নিউরন) দিয়ে। এখানেও প্যারালেলিজম পাওয়া যায় নি।

ভাষাগত ভুল ত্রুটি ক্ষমাসুন্দর দৃষ্টিতে দেখবেন।