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.
রবার্ট মার্টিন এর মতে খারাপ বা বাজে ডিজাইন এর নিচের ৩ টি বৈশিষ্ট্য থাকে।
সাধারন নিচের পাঁচটি নিয়ম মেনে কোড করলে উপরের বর্নিত সমস্যাগুলো এড়ানো যায়।
১। ওপেন ক্লোজ নীতি (Open Close Principle)
২। ডিপেন্ডেন্সি ইনভার্সন নীতি (Dependency Inversion Principle)
৩। ইন্টারফেস সেগ্রেগেশন নীতি (Interface Segregation Principle)
৪। সিঙ্গেল রেসপনসিবিলিটি নীতি (Single Responsibility Principle)
৫। লিসকভ’স সাবস্টিটিউশন নীতি (Liskov’s Substitution Principle)
পাঁচটি প্রিন্সিপালের বর্ননা পরের পোস্ট গুলোতে দেওয়া হবে। এরা প্রত্যেকেই আলাদা আলাদা পোস্টের দাবীদার।
]]>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
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
যা যা করতে পারবেনঃ
১। ধার দেওয়া বা ধার নেওয়ার সময় একটা করে এন্ট্রি করে রাখবেন। এতে নাম, তারিখ, টাকার পরিমান এবং অন্যান্য বিস্তারিত তথ্য সংরক্ষন করে রাখা যাবে।
২। সকল ধার ও সকল পাওনা সবই আপনি লিস্ট আকারে দেখতে পারবেন।
৩। লিস্ট এর সব আইটেমের পাশে একটি করে বাটন থাকবে যেটা দিয়ে ধার বা পাওনা শোধ হয়েছে কিনা সেটা বলতে পারবেন।
৪। ড্যাশবোর্ডে নিচের তথ্যাদি দেখতে পারবেনঃ
ভবিষৎ পরিকল্পনাঃ
১। এই মুহুর্তে মোট টাকা একসাথে শোধ বা ফেরত নিতে হবে। ভেঙ্গে ভেঙ্গে শোধ করলেও আপনি শুধু সম্পুর্ন শোধ হয়ে গেলে তখনি শোধ বলতে পারবেন। ভেঙ্গে ভেঙ্গে শোধ করলে তার হিসাব রাখার অপশন এই টুলে নেই।
২। ধার দেওয়ার সময় আপনি চাইলে একটা তারিখ ঠিক করে দিবেন। ওই তারিখের মধ্যে যদি শোধ করা না হয়, তাহলে আপনার ফোনে এবং ইমেইলে নোটিফাই করে দিবে।
৩। মোবাইল অ্যাপ
সাইটের নিরাপত্তা জনিত কারনে রেজিষ্ট্রেশন বন্ধ আছে। আপনারা যদি কেউ টেস্ট করে দেখতে চান, আপনার ইমেইল আইডি দিয়ে আমাকে মেসেজ দিন।
স্ক্রিনশটঃ
]]>
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
To check full release notes of this version, Click Here.
To fork the original git repository for git, Click Here
For details, Click Here
]]>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 ব্রাঞ্চ থাকা উচিত।
]]>অনেকের মধ্যেই একটা ভুল ধারনা আছে। অনেকেই মনে করে যে আধুনিক কম্পিউটারে প্যারালেলিজম সম্ভব। এর পক্ষে যুক্তি দেখানো হয় মাল্টি থ্রেডিং নিয়ে। একটা অ্যাপ্লিকেশনে ৫ টা থ্রেড চালু করা হয় যার প্রত্যেকটি থ্রেড ৫ সেকেন্ড করে সময় নেয়। তাহলে সবগুলা থ্রেড কমপ্লিট হতে ৫ * ৫ = ২৫ সেকেন্ড লাগার কথা। নিচের এই লিঙ্কটিতে এরকম ই উদাহরন দিয়ে মাল্টি থ্রেডের মাধ্যমে দেখিয়েছেন যে পাচটি থ্রেড আসলে ৫ সেকেন্ডেই শেষ হচ্ছে। এটাকেই তারা বলেছেন প্যারালাল প্রসেসিং।
https://howtoprogramwithjava.com/java-multithreading/?hc_location=ufi
প্রথমে থ্রেড নিয়েই বলি। ৫ সেকেন্ডের কাজ দিয়ে আধুনিক প্রসেসরের ক্ষমতা পর্যবেক্ষন করতে চাইলে আমার মতে সেটা হবে প্রসেসরের ক্ষমতাকে অপমান করা। প্রসেসর এতই দ্রুত একটা কাজ শেষ করে অন্য কাজ শুরু করে যা আমাদের চোখে ধরা পরার বাইরে। যেকারনে ৫ সেকেন্ড করে লাগে এমন পাচটা থ্রেড চালালে, সবগুলা থ্রেড মোটামুটি ৫ সেকেন্ডেই শেষ হয়ে যাচ্ছে। কিন্তু তারপরও পাচটা থ্রেড কিন্তু একি সাথে চলে না। টাইম শেয়ারিং এর মাধ্যমে প্রত্যেক থ্রেডের পেছনেই প্রসেসর সময় ব্যয় করে অ্যালগরিদম অনুযায়ী। সেক্ষেত্রে যে কারনে কোন থ্রেড আগে শেষ হবে, কোনটা পরে। একি সাথে ৫ টা থ্রেড শেষ হবে না। যেহেতু, ৫ সেকেন্ডের কাজ দিয়ে প্রসেসরের ক্ষমতা বোঝা যাবে না, তাই এই থ্রেড গুলোর সময় বাড়িয়ে একঘন্টা করে দেখা যেতে পারে। মানে একঘন্টা করে সময় লাগে এমন ৫ টা থ্রেড একসাথে শুরু করব এবং এবং কোন থ্রেড কখন শেষ হয় তার সময় টা নোট করব। আগ্রহীরা উপরের উদাহরনের কোডটা একটু মডিফাই করেই এই পরীক্ষা টা করে দেখতে পারেন।
এবার প্রসেস নিয়ে কথা বলি। ধরে নেই, কোর আই X প্রসেসরে ৫ টা কোর (মাইক্রো প্রসেসর) থাকে। আসলে ব্যপারটা এমন যে এই কম্পিউটারের মুল প্রসেসর ৫ টা যারা আসলেই টাস্ক প্রসেস করে। আর আমরা যেটাকে প্রসেসর বলি সেটি আসলে একটা কন্টেইনার যার ভেতর সেই মুল ৫ টা কোর প্রসেসর গুলো থাকে। এই কন্টেইনার প্রসেসরের কাজ হল যখন কোন টাস্ক আসবে তার কাছে তখন সে অ্যালগরিদমের উপর নির্ভর করে ওই সময়ের পটেনশিয়াল কোর প্রসেসরকে টাস্কটা অ্যাসাইন করবে। এখন আপনি ৫ টা প্রসেস (প্রত্যেক প্রসেস কম্প্লিট হতে সময় লাগে ৫ মিনিট)একি সময়ে স্টার্ট করলেন। প্রত্যেক কোর প্রসেসর কে একটা করে টাস্ক অ্যাসাইন করা হল। তাহলে একি সাথে সবগুলো প্রসেস কম্প্লিট হবে ৫ মিনিটেই যেখানে ৫ * ৫ = ২৫ মিনিট লাগার কথা ছিল। হ্যা, আপনার মনে হতে পারে যে এখানে প্যারালাল প্রসেসিং হল।
এটা কি সবসময় ৫ মিনিটেই হবে? ভেবে দেখুন তো। ধরেন আপনার ৫ টা কোরের মধ্যে এই মুহুর্তে ৪ টা ফ্রি আর একটা ব্যাস্ত আছে। তখন এই ৫ টা প্রসেস কম্প্লিট হতে ১০ মিনিটের বেশী সময় লাগবে ( প্রথম ৪ টা টাস্ক শেষ হবে ৫ মিনিটে। তারপর যখন কোন প্রসেসর ফ্রি হবে তখন ৫ নম্বর টাস্ক টা শুরু হবে এবং এটা শেষ হতে আরও ৫ মিনিট সময় লাগবে)। ধরেন, এখন ৪ টা কোর ই ব্যস্ত। আপনার জন্য শুধু একটা কোরই ফ্রি আছে। তখন সময় লাগবে ২৫ মিনিট।
মানুষের ব্রেইন এর নিউরন গুলো হল এক একটা কোর প্রসেসিং ইউনিট। যদিও মানুষের ব্রেইন আসলেই কিভাবে কাজ করে তা এখনো শতভাগ বের করা সম্ভব হয় নি তবে মোটামুটি একটা আইডিয়া করে সেই জিনিসটাই ইম্পলিমেন্ট করেই কম্পিউটারের প্রসেসর বানানোর চেষ্টা করা হচ্ছে।
অনেক সময় আমাদের এমন হয়, হঠাৎ কোন কিছু একটা মনে করতে চাইলাম। কিন্তু কিছুই মনে পড়ছে না (আঞ্চলিক ভাষায়, পেটে আছে, মুখে নাই)। ২-১ দিন পর অন্য কোন কাজ করছেন এমন সময় হঠাৎ করেই সেই জিনিস টা মনে পড়ে গেল। হয় না এমন? এর কারন হচ্ছে কোন একটা নিউরন ওই জিনিসটা খোজার কাজে ব্যস্ত ছিল। যখনি পেয়েছে সাথে সাথে আপনাকে জানিয়ে দিয়েছে। ওই সময়ে ওই নিউরন টা শুধু এই একটা কাজেই ব্যস্ত ছিল। মানুষের ব্রেইন আসলে মাল্টি টাস্কিং করে মাল্টিপল সংখ্যক প্রসেসর (নিউরন) দিয়ে। এখানেও প্যারালেলিজম পাওয়া যায় নি।
ভাষাগত ভুল ত্রুটি ক্ষমাসুন্দর দৃষ্টিতে দেখবেন।
]]>