History of Modern Calendar Part-1 (Leap Year)

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.


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:

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.

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 বানালাম।

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

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

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

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






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.

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;

   hasPlanToBeOut = true;

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


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


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

areaA = yellow;
areaB = yellow;

//get called in a one minute interval
   areaB = red;

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

areaA = yellow;
areaB = yellow;

//get called in a one minute interval
   areaB = red;
  areaB = yellow;

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

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

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

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


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

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

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

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

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

রেগুলার এক্সপ্রেশনঃ উপকারিতা ও ব্যবহারিক প্রয়োগ (Importance and practical use of Regular Expression)

রেগুলার এক্সপ্রেশনঃ
নাম থেকেই বোঝা যাচ্ছে যে, রেগুলার এক্সপ্রেশন (রেজেক্স বা RegEx) আসলে কতগুলো সুনির্দিষ্ট ক্যারেকটারের (Char) সমষ্টি। এই একগুচ্ছ ক্যারেকটারের সমষ্টি একত্রে কোন নির্দিষ্ট প্যাটার্ন প্রকাশ করে যা দিয়ে কোন বিশাল প্যারাগ্রাফ থেকে কোন নির্দিষ্ট প্যাটার্নের অংশ খুঁজে বের করতে পারে। একটি সহজ উদাহরন দেখে নেওয়া যাক। যেমন ধরি, একটি ৫০০ শব্দের প্যারাগ্রাফ থেকে এমন সব শব্দ খুঁজে বের করতে হবে যেগুলোর প্রথম অক্ষর ‘N’, শেষের অক্ষর ‘L’ এবং মাঝে কমপক্ষে একটি ‘H’ থাকবে। যদি ট্র্যাডিশনাল প্রোগ্রামিং দিয়ে এ কাজটি করতে চাই তাহলে কি কি করতে হবে তা নিচে লেখা হলঃ

ধাপ ১ঃ প্যারাগ্রাফ এর প্রথম ক্যারেকটার থেকে শুরু করে একটা একটা করে সামনে আগাতে হবে।
ধাপ ২ঃ কোন শব্দের প্রথম অক্ষর যদি ‘N’ হয় তাহলে এই ইনডেক্সে একটি পয়েন্টার রাখতে হবে। এরপর এই ইনডেক্স থেকে আবার সামনে আগাতে হবে। যদি শব্দটির শেষ অক্ষরে পৌছানোর আগে ‘H’ পাওয়া যায় এবং শেষ অক্ষরটি যদি ‘L’ হয় তাহলে এটা একটি কাঙ্খিত শব্দ। এই শব্দটি কে একটি স্ট্রিং টাইপ অ্যারে তে স্টোর করে রাখি।
ধাপ ৩ঃ যদি এমন হয় যে আমরা শব্দটির শেষ অক্ষরে পৌছে গেছি কিন্তু উপরের দেওয়া প্যাটার্ন ম্যাচ করেনি তাহলে আবার ‘N’ দিয়ে শুরু হওয়া নতুন শব্দ না পাওয়া পর্যন্ত সামনে আগাতে হবে। যদি কোন শব্দের প্রথম অক্ষর ‘N’ হয় তাহলে ধাপ ২ এ ফিরতে হবে।
ধাপ ৪ঃ প্যারাগ্রাফটির শেষ অক্ষর ভিজিট হয়ে গেলে প্রোগ্রামটি বন্ধ হয়ে যাবে।

অবশেষে একটি স্ট্রিং টাইপ অ্যারেতে ওই নির্দিষ্ট প্যাটার্নের সকল শব্দ জমা হবে। উপরে অ্যালগোরিদমটির সংক্ষেপ বর্ননা দেওয়া হল। কিন্তু এই অ্যালগরিদমটির ইমপ্লিমেন্টেশন টা করতে গেলে যাযা লাগবে তা নিচে দেওয়া হলঃ
১। কমপক্ষে ৩ টি ভ্যারিয়েবল যা ফ্ল্যাগ হিসেবে ব্যবহার করা হবে বিভিন্ন ইনডেক্স স্টোর করে রাখার জন্য।
২। একটি For লুপ।
৩। অসংখ্য if-else ব্রাঞ্চিং।
৩। একটি ক্যারেকটার টাইপ স্ট্রিং যেটাতে খুজে পাওয়া কাঙ্খিত সকল শব্দ থাকবে।

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

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

রেজেক্সওয়ান ডট কম থেকে মাত্র এক থেকে দুই ঘন্টা দেখলেই রেগুলার এক্সপ্রেশন সহজে শেখা যাবে। ছোট ছোট সাইজের লেসন এর সাথেই রয়েছে সরাসরি প্র্যাকটিস করার সুযোগ।

রেজেক্সওয়ানিজরোওয়ান ডট কম একটি অনলাইন টুল যা ব্যবহার করে খুব সহজেই কাঙ্খিত রেগুলার এক্সপ্রেশনটি জেনারেট করা যায়।

উদাহরন ও ব্যবহারিক প্রয়োগঃ
যাদের জুমলা ও ভার্চুমার্ট কমপোনেন্ট সম্পর্কে ধারনা আছে তারা নিশ্চয়ই জানি যে, ভার্চুমার্টে যখন কোন প্রোডাক্ট আপলোড হয় তখন ওই প্রোডাক্টের ইমেজ আপলোড করে এবং রিসাইজ করে একই ইমেজের একটি রিসাইজইড ভারসন তৈরী করে। ডাটাবেজের XX_virtuemart_media নামক টেবিলে file_url এবং file_url_thumb নামক কলামে যথাক্রমে মুল ইমেজ ও রিসাইজড ইমেজের পাথ স্টোর করে রাখে। ২০১২ সালের দিকে আমি জুমলার একটি মডিউল বানিয়েছিলাম যেটা একটা নির্দিষ্ট ক্যাটেগরী থেকে কিছু নির্দিষ্ট বৈশিষ্ট্যের সকল প্রোডাক্টের লিস্ট ডিসপ্লে করে। মডিউল টির নাম mod_votecounter যেটি বর্তমানে মডিউলটি এখানে সাইটে রানিং আছে। লিস্ট এ ডানপাশে যে ইমেজ গুলো দেখছেন সেগুলো রিসাইজড ভার্সন ইমেজ। ইমেজের নাম ও পাথ ডাটাবেজের XX_virtuemart_media টেবিলের file_url_thumb কলাম থেকে img ট্যাগ এর মাধ্যমে দেখানো হয়েছে। কিছুদিন আগে সাইটটির মালিক বা আমার ক্লায়েন্ট জুমলা ও ভার্চুমার্ট এর ভার্সন আপগ্রেড করে। এর পর থেকে ওই লিস্টটিতে ডানদিকে আইটেমের ইমেজ দেখাচ্ছিল না। অ্যানালাইসিস করে যা জানলাম, তার সারমর্ম হল এরকম, প্রোডাক্ট ইমেজ আপলোড করার সময় ভার্চুমার্ট কম্পোনেন্ট টি ওই একি ইমেজের রিসাইজ্ড ইমেজ তৈরী করে একই পাথে resized নামক ফোল্ডার এ নির্দিষ্ট নেমিং কনভেনশন ফলো করে রাখে। এই কারনে ভার্চুমার্ট এর লেটেস্ট ভার্সন গুলোতে file_url_thumb টি ফাঁকা থাকে। যেহেতু file_url কলাম থেকেই ওই ইমেজের এবং সেটার রিসাইজড ভার্সনের পাথ পাওয়া সম্ভব তাই ভার্চুমার্ট এখন আর file_url_thumb এ কোন পাথ রাখে না। যদি রিসাইজড ইমেজ টি কোন কারনে ওভাররাইট করা হয় শুধুমাত্র সেক্ষেত্রে file_url_thumb এ ওভাররাইট করা ইমেজের পাথ স্টোর করে রাখে।

তাহলে লেটেস্ট ভার্সনে file_url_thumb ফাঁকা। আমাকে file_url থেকেই রিসাইজড ইমেজের পাথ জেনারেট করতে হবে। নিচে মুল ইমেজের পাথ ও রিসাইজড ইমেজের পাথ কেমন হবে তার একটি উদাহরন দেওয়া হলঃ

মুল ইমেজ ঃ /images/stories/virtuemart/product/product_photo.jpg
রিসাইজড ইমেজঃ /images/stories/virtuemart/product/resized/product_photo_200x200.jpg

রিসাইজড ইমেজের বোল্ড করা অংশটুকু দেখেই পার্থক্য বোঝা যাচ্ছে। অর্থাৎ আমাকে এখন এমন একটি রেগুলার এক্সপ্রেশন বানাতে হবে যেটা দিয়ে মুল ইমেজ পাথকে ৩ টা ভাগে ভাগ করা যায়। ভাগ গুলো নিম্নরুপঃ
প্রথম অংশ ঃ /images/stories/virtuemart/product/
দ্বিতীয় অংশঃ product_photo
তৃতীয় অংশঃ .jpg
রেজেক্স ইন্জিন কে যদি এই রেগুলার এক্সপ্রেশন ও মুল ইমেজ পাথ টা দেই তাহলে ইন্জিনটি আমাদের কে উপরের মত করে তিনটা আলাদা স্ট্রিং রিটার্ন করবে। এরপর আমরা নিচের মত করে রিসাইজড ইমেজ পাথ জেনারেট করব।

তাহলে এখন আমরা এমন একটি মেথড লিখব যা ইনপুট হিসেবে মুল ইমেজের পাথ নিবে এবং রিসাইজড ইমেজের পাথ রিটার্ন করবে।

* @param $media String file_url of product image of virtuemart
* @return $thumb_url string automatically generated thumb url
function generateThumbUrl($media = false){
$thumb_url = preg_replace("/(((w+)/)+)(.+)(.jpg)/i", "$1resized/$4_200x200$5", $media);
return $thumb_url;

এই কোডটিতে “(((w+)/)+)(.+)(.jpg)” করা অংশটুকুই একটি রেগুলার এক্সপ্রেশন যে একটা ইমেজ পাথ কে পুর্বের নিয়ম অনুযায়ী তিনটি গ্রুপে ভাগ করবে। preg_replace একটি PHP মেথড যা তিনটি প্যারামিটার ইনপুট হিসেবে নেয়। প্রথমটি হবে রেগুলার এক্সপ্রেশন, দ্বিতীয়টি নতুন স্ট্রিং টির প্যাটার্ন এবং তৃতীয়টিতে মুল স্ট্রিং যেটা থেকে নতুন স্ট্রিং জেনারেট করতে হবে। উপরের কোডটিতে preg_replace মেথডটি $media এর উপর রেগুলার এক্সপ্রেশন (((w+)/)+)(.+)(.jpg) এক্সিকিউট করে অনেকগুলো নেস্টেড ভাগে ভাগ করে যেখানে $1 এ থাকে মুল ইমেজের প্রথম অংশ, $4 এ থাকে দ্বিতীয় অংশ এবং $5 এ থাকবে শেষ অংশ। তাহলে আমাদের নতুন স্ট্রিংটির প্যাটার্ন হবে $1resized/$4_200x200$5

regex101.com এর টুলটি ব্যবহার করে সরাসরি নির্দিষ্ট প্যাটার্নের জন্য রেগুলার এক্সপ্রেশন জেনারেট করা যায়।

এই পোস্টটিতে শুধুমাত্র রেগুলার এক্সপ্রেশনের সম্পর্কে ধারনা দেওয়া হল। বিস্তারিত জানতে উপরে উল্লিখিত সাইটে যেতে হবে।

বাংলায় অবজেক্টিভ-সি, সুইফ্ট এবং আইওএস অ্যাপ ও গেম ডেভেলপমেন্ট

বাংলায় অবজেক্টিভ-সি এর ধারনা ভাগা-ভাগি মূলক সিরিজ পোস্ট পুরোদমে চলছে। আশা করি এই সিরিজের ১০ চ্যাপ্টার শেষে আরেকটি সিরিজ শুরু হবে “রিয়াল আইফোন অ্যাপ্লিকেশন ডেভেলপমেন্ট উইথ ইউজার ইন্টারফেস – ১০ চ্যাপ্টার”
কেউ এই মাল্টি সিরিজের লেখক হয়ে দুই একটি চ্যাপ্টার নিয়ে লিখতে চাইলে যোগাযোগ করতে পারেন কমেন্টে।
গরম থাকতে থাকতেই ৪টি ম্যাজর সেকশন (Obj-C, iOS-GUI, Game, Publish&Marketing) সম্বলিত একটি পূর্ণ বাংলা কাগুজে বই আসতে পারে। যত বেশি Crowd Authors ততো কম ভুল এবং সঠিক তথ্যের শেয়ারিং

সেকশন ১ঃ অবজেকটিভ সি এর বেসিক ধারনা

UploaDrop [A Dropbox based File Uploading Solution of large files]

What is it?
UploaDrop is a dropbox based upload script which is used for uploading files and folders to dropbox instead of server storage.

Most of the time, we, the developers, must have to manipulate large files on the website like videos, audios or other documents. If the unit size of files is small, then its okey. There is no big deal to handle these files of small size. But when the application requires to upload files of large size like 5GB on each upload, we need to consider the reliablity of the upload script. We need to consider the maximum size of files which can be uploaded. We need to consider the maximum bandwidth we can use at a time. We have to take the burden of server optimization.

To get rid of these headache, we can handle this file manipulation tasks to other 3rd party who is already established with the service of file manipulation.

Dropbox is cloud based file hosting server in which users can upload their files and can download when needed. Dropbox has provided lots of features including large file uploading with optimized way.

Dropbox has also provided an api which is highly user-friendly so that any developer can use that.

To develop a script in which visitors/users of the application can upload file via drag drop or choosing. Instead of the hosting space, these files will be uploaded on dropbox space of the owner of the application. Then these files can be used for different purposes.

1. Multiple files uploading at a time
2. File uploading to owner’s dropbox storage
3. No need to have headache about file manipulation, storage, bandwidth of file uploading.
4. Recrsively finds every files from all folders and uploads to dropbox

First of all I would like to thank the Dropbox Team for providing this awesome service.

Then I thank Mr. Nuhil Mehdy (nuhil.net) to give me the idea.

Lets start the development of an simple application called UploaDrop by which end user will upload something to your website, and instead of your host, it will be uploaded on dropbox.

When you are a Developer
The first task is to create an app on your Dropbox account using developer account.

1. Go to https://www.dropbox.com/developers/apps and Click on “Create app” button.

2. Fill these given fields as the picture shows.

3. After completing the creation of your app you will see the details of your app by going https://www.dropbox.com/developers/apps and click on the App Name ‘UploaDrop’.

See the rounded area which provides app key and app secret. These two key defines the access of your dropbox account for uploading from outside.

4. Now open composer.json for editing and set these keys on this like the picture shows.

5. OK, In this step you are all set. Now lets get the access key. Execute getAccesskey.php on the browser which returns a url like

6. Copy this url and paste on the browser. It will ask for permission to create a folder named app name on the dropbox account.

Click on “Allow”

7. An access key will be displayed like the given screenshot.

Save the Access key on some secured place.

8. Open index.php and and edit the $accesskey field on line 10.

Open processupload.php and do the same task on line 5.

Here, developer’s work is finished. All configuration is finished.

Front End behavior
1. Hit “index.php” on the browser, the front end page will be arrived.

2. In the drag&drop area, user can drag&drop their files and folders. A progress bar will be shown for each of the files when uploading. After completation of uploading of all files click on “Finish Uploading”.

This is the simple app. Actually, It is a brief instruction of how to use Dropbox Core Api.

Future Works
1. In the top area, all existing files are being displayed in recursive structure which is coded by me. In dropbox core api, there are options to create download link of each files, Editing, Deleting etc. These 3 features can be achieved in future.

2. If any compressed file is drop on the drag&drop area, it doesnt extract the compressed file. In future, it can be an issue.

Source Code (Github)
Watch Demo