ছোট বেলায় স্বপ্ন ছিল ডাক্তার হবার। কলেজে বায়োলজি (জীববিজ্ঞান) তে 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
বুলিয়ানোলজি, বিড়ম্বনা ও শিক্ষা (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 ব্রাঞ্চ থাকা উচিত।