Friday, 20 May 2016

Open Closed Principle (OCP)

Software entities (class, modules, functions, etc) should be open for extension but closed for modification. Here, we try to explain OCP using codebase. First we'll show a scenario that violate OCP and then we'll remove that violation.

Area Calculation (OCP violation Code) :
public class Rectangle{
 public double Width {get; set;}
 public double Height {get; set;}
}

public class Circle{
 public double Radious {get; set;}
}

public double getArea (object[] shapes){
 double totalArea = 0;

 foreach(var shape in shapes){
  if(shape is Rectangle){
   Rectangle rectangle = (Rectangle)shape;
   totalArea += rectangle.Width * rectangle.Height;
  }
  else{
   Circle circle = (Circle)shape;
   totalArea += circle.Radious * circle.Radious * Math.PI;
  }
 }
}
Now if we need to calculate another another type of object (say, Trapezium) then we've to add another condition. But from the rule's of OCP we know Software entities should be closed for modification. So it is the violation of OCP.

Ok. Let's try to solve this violation implementing OCP.
public abstract class shape{
 public abstract double Area();
}

public class Rectangle : shape{
 public double Width {get; set;}
 public double Height {get; set;}

 public override double Area(){
  return Width * Height;
 }
}

public class Circle : shape{
 public double Radious {get; set;}

 public override double Area(){
  return Radious * Radious * Math.PI;
 }
}

public double getArea (shape[] shapes){
 double totalArea = 0;

 foreach(var shape in shapes){
  totalArea += shape.Area();
 }

 return totalArea;
}
Now when we need to calculate another type of object, we don't need to change logic here (in getArea()), we just have to add another class like Rectangle or Circle..

Saturday, 14 May 2016

Single Responsibility Principle (SRP)

There should never be more than one reason for change anything in software entities (class, function, file etc). A class, function, file etc should have only one reason to change. Let's go through the problem first. Have a look at the code given below :
public class BankAccount
{             
    public BankAccount()  {}

    public string AccountNumber { get; set; }
    public decimal AccountBalance { get; set; }

    public decimal CalculateInterest()
    {
        // Code to calculate Interest
    }
}
Here, BankAccount class contains the properties of account and also calculate the interest of account. Now look at the few change Request we received from business:

1. Please add a new Property AccountHolderName .
2. Some new rule has been introduced to calculate interest.

This are totally different type of change request. One is changing on features; where as other one is impacting the functionality. We have 2 different types of reason to change one class. This violates Single Responsibility Principle.

Now let's try to implement SRP to resolved this violation. Look at the code below:
public interface IBankAccount
{
    string AccountNumber { get; set; }
    decimal AccountBalance { get; set; }
}

public interface IInterstCalculator
{
    decimal CalculateInterest();
}

public class BankAccount : IBankAccount
{
    public string AccountNumber { get; set; }
    public decimal AccountBalance { get; set; }
}

public class InterstCalculator : IInterstCalculator
{
    public decimal CalculateInterest(IBankAccount account)
    {
        // Write your logic here
        return 1000;
    }
}
Now our BankAccount class is just responsible for properties of the bank account. If we want to add any new business rule for the Calculation of Interest, we don't need to change BankAccount class.

And also InterestCalculator class requires no changes, in case we need to add a new Property AccountHolderName. So this is the implementation of Single Responsibility Principle.

We have also used Interfaces to communicate between InterestCalculator and BankAccount class. This will help us to manage dependencies between classes.

Wednesday, 1 May 2013

সর্বকালের সর্বশ্রেষ্ঠ বিজ্ঞানী আলবার্ট আইনস্টাইন

একটি ছোট ছেলে মাত্র চার কি পাঁচ বয়স। একদিন বাবা তাকে একটা কম্পাস কিনে দিলেন । তা দেখে তো সে বিস্মিত। ঘুমানোর সময়ও এইটা নিয়ে তার কৌতূহল যায় না। বাবার কাছে প্রশ্ন- আচ্ছা বাবা কম্পাস উত্তর-দক্ষিন মুখ করে থাকে কেন? বাবার উত্তর- কারণ আছে। কিন্তু উত্তর তো হল না। রাতের বেলা এই বাবুটির ঘুম হয় না। মাঝ রাতে বাবা এসে দেখে ছোট বাবু ঘুমায় নি। আর বাবাকে দেখে তার প্রশ্ন- কম্পাসের কাঁটা কেন কেবলই এক দিকে মুখ করে থাকে? বাবা গম্ভীর গলায় বলল- চৌম্বকত্ব , আর বললেন ঘুমিয়ে পড়, অনেক রাত হয়েছে। ঘুমাতে ঘুমাতে ছোট বাবুর ভাবনা-হুম!! চৌম্বকত্ব! বড় হয়ে ব্যাপারটা আরো ভালো করতে বুঝতে হবে। বড় হয়ে ঠিকই বুঝেছিলেন সেই ছোট বাবুটি। আর তাইতো তড়িৎচুম্বকীয় মূলনীতি সংস্কার করে প্রতিষ্ঠা করেছিলেন আপেক্ষিক তত্ত্ব, আর বিবেচিত হয়েছিলেন সর্বকালের সর্বশ্রেষ্ঠ বিজ্ঞানী হিসেবে। সেই দিনের ছোট বাবুটিই ১৮৭৯ সালের ১৪ই মার্চ জার্মানিতে জন্মগ্রহণ করা সর্বকালের সর্বশ্রেষ্ঠ বিজ্ঞানী আলবার্ট আইনস্টাইন।
তিনি ১৯২১ সালে পদার্থবিজ্ঞানে নোবেল পুরস্কার লাভ করেন। তার পুরস্কার লাভের কারণ হিসেবে উল্লেখ করা হয়, তাত্ত্বিক পদার্থবিজ্ঞানে বিশেষ অবদান এবং বিশেষত আলোক-তড়িৎ ক্রিয়া সম্পর্কীত গবেষণার জন্য। বিজ্ঞানের বিভিন্ন ক্ষেত্রে তার রয়েছে ব্যাপক অবদান। ৫০টিরও অধিক বৈজ্ঞানিক গবেষণাপত্র এবং কিছু বিজ্ঞান-বহির্ভূত পুস্তকে রচনা করেছেন তিনি। ১৯৯৯ সালে টাইম সাময়িকী আইনস্টাইনকে "শতাব্দীর সেরা ব্যক্তি" হিসেবে ঘোষণা করে। এছাড়া বিখ্যাত পদার্থবিজ্ঞানীদের একটি ভোট গ্রহণের মাধ্যমে জানা গেছে, তাকে প্রায় সবাই সর্বকালের সেরা পদার্থবিজ্ঞানী হিসেবে স্বীকৃতি দিয়েছেন।

Tuesday, 23 April 2013

CSS Static, Absolute, Relative, Fixed Positioning How Do They Differ ?

Static :
A STATIC positioned element is what are we get by DEFAULT.

Or

Normal positioning of objects.

Or

একটি element স্বাভাবিক (default)অবস্থায় যে অবস্থানে থাকে সেটিই তার static position ।অর্থাৎ element এ কোন position set করা না হলে default তার position static (style="position:static") । 

Relative :
Relative to it’s (element) current position, but can be moved.

Or

A RELATIVE positioned element is positioned relative to ITSELF.

Or

কোন element এর relative position হল ঐ element টির current position যা অন্য কোন element এর সাপেক্ষে নয়।কোন element এর style="position:relative; left: 20px;" এর অর্থ হল কোন element তার current position এর ডান থেকে বামে 20px সরবে। 

Fixed :
An element is fixed to the browser window.

Or

A FIXED positioned is positioned relative to THE BROWSER WINDOW.

Or

Fixed position element টি সবসময় browser window এর সাপেক্ষে তার অবস্থান পরিবর্তন করবে অন্য কোন element (div, span, body, h1, h2 ....) এর সাপেক্ষে নয়। যেমন : style="position:fixed; left: 10px; top: 50%;" অর্থাৎ element টি browser window এর top থেকে buttom এর দিকে 50% (মাঝখানে) নিচে এবং left থেকে 10px right এ থাকবে। 

Absolute :

Relative to the last relatively positioned object, if one is present, then it works like fixed.....relative to the window.

Or

An ABSOLUTE positioned element is positioned relative to ITS CLOSEST POSITIONED PARENT. if one is present, then it works like fixed.....relative to the window.

Or

কোন element এর closest(last relatively positioned element) parent এর position যদি relative হয়( style="position:relative;"), তবে ঐ element টি তার ঐ closest parent অনুযায়ী position change করবে।
<div style="position:relative"> <!--2nd parent div-->
    <div>   <!--1st parent div-->
        <div style="position:absolute;left:10px;....."> <!--Middle div-->
          Md. Arif
       </div>
    </div>
</div>

এখানে যেহেতু 2nd parent div টির position relative তাই middle div টি 2nd parent div অনুযায়ী position change করবে। যদি 1st parent div এর position relative হত তবে Middle div টি 1st parent div অনুযায়ী position change করতো। 

Reference-1 : http://www.youtube.com/watch?v=dSYg9-S-S9I

Reference-2 : http://www.youtube.com/watch?v=-pW8HZdIuEk

Saturday, 6 April 2013

"দস্যুরানী" ফুলন দেবী

হতে পারে,তার পরিচিতি দস্যুরানী হিসেবে। হয়ত বা কুখ্যাত খুনির তালিকায় তার নামটার অপব্যাখ্যা দেওয়া হয়। তবুও সেই ইতিহাসই সাক্ষ্য দেয়, প্রথম জীবনের বঞ্চনা এবং পরের জীবনের বিদ্রোহ তার প্রতি মানুষের একটা সহমর্মিতা তৈরি করছিল। তার আমৃত্যু সংগ্রাম তাকে একজন ধর্ষিতার কাতার থেকে নিয়ে এসে পরিয়েছিল জনপ্রতিনিধিত্বের বরমাল্যও।

তিনি আর কেউ নন ইতিহাসের অন্যতম বিদ্রোহী নারী,"দস্যুরানী" ফুলন দেবী। তার জন্ম ১৯৬৩ সালে ভারতের এক নিচু পরিবারে। দারিদ্র্য এবং সামাজিক কারণে জীবনের শুরু থেকেই সংগ্রামের মুখোমুখি হয় ফুলন। মাত্র এগারো বছর বয়সে বাবার বয়সী এক লোকের সঙ্গে বিয়ে হয় তার।
ফুলনের গ্রাম এবং আশপাশের একাধিক গ্রামে ঠাকুর বংশের জমিদারী ছিল। আর জমিদারের লোকেরা প্রায়ই গ্রামের দরিদ্র গ্রামবাসীর কাছ থেকে ফসল নিয়ে নিত এবং তাদের ওপর নির্যাতন চালাত। ফুলন এসবের প্রতিবাদ জানিয়ে দখলকারীদের নেতা মায়াদীনের বিরুদ্ধে আদালতে মামলা করে। এ অপমানের প্রতিশোধ নিতে ঠাকুরেরা তাকে ধরে নিয়ে যায় বেমাই নামে প্রত্যন্ত এক গ্রামে। এরপর তার ওপর চলে অমানুষিক নির্যাতন। দুই সপ্তাহ ধরে প্রতি রাতে ঠাকুর ও তার লোকেরা ফুলনকে গণধর্ষণ করে। প্রতি রাতেই ফুলন জ্ঞান না হারানো পর্যন্ত চলত এ পাশবিকতা। ১৬ দিনের মাথায় এক রাতে নির্যাতন শেষে তারা ফুলনকে মৃত মনে করে ফেলে রাখে। আর প্রায় মৃত্যুপথযাত্রী ফুলন এই সুযোগ কাজে লাগিয়ে সেখান থেকে পালিয়ে যায়।

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

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

সরকার ফুলনকে ধরার জন্য ব্যতিব্যস্ত হয়ে ওঠে। আবার ফুলনের পক্ষেও আন্দোলন হয়। শেষ পর্যন্ত ১৯৮৩ সালের ফেব্রুয়ারিতে সরকার সন্ধিপ্রস্তাব করলে ফুলন অনেকগুলো শর্ত দেন। সরকার সেই শর্ত মেনে নিলে ১০,০০০ মানুষ আর ৩০০ পুলিশের সামনে ফুলনদেবী অস্ত্র জমা দেন গান্ধী আর দুর্গার ছবির সামনে। ১১ বছর কারাভোগের পর ফুলন সমাজবাদী পার্টিতে যোগ দেন এবং ১৯৯৬ এবং '৯৯-তে পরপর দুইবার লোকসভার সদস্য নির্বাচিত হন। ২০০১ সালের ২৫ জুলাই ঠাকুর বংশের তিন ছেলের এলোপাতাড়ি গুলিতে ফুলন দেবী নিহত হন।

সেই সাথেসাথে শেষ হয়ে যায় একজন নির্যাতিতার জগতখ্যাত বিদ্রোহ।কখনও নন্দিত কখনও নিন্দিত হলেও ধরিত্রী সাক্ষ্য দিবে যুগে যুগে ফুলনদের এহেন বিদ্রোহের মূলে সমাজব্যবস্থা ও সমাজপতিরাই দায়ী। সমাজই তাদের বাধ্য করে আইন নিজের হাতে তুলে নিতে যখন একজন নির্যাতিতা বিচার চেয়ে পায় ধর্ষিতার খেতাব আর ধর্ষকরা হয় সমাজপতি যাদের পায়ে ফুল-চন্দন দিয়ে দিয়ে নমঃ নমঃ করে সমাজ।

তবুও একজন ফুলন দেবী "দেবীর" মর্যাদায়ই আসীন রবে সকল নির্যাতিতার বিদ্রোহের মূলে।সমাজের সকল অন্যায়ের বিরুদ্ধে সোচ্চার কণ্ঠস্বর হিসেবে তাদের মন্ত্রণা দিবে ফুলন দেবীর রেখে যাওয়া জীবন-ইতিহাস। [সংগৃহীত]

Wikipedia Reference : http://en.wikipedia.org/wiki/Phoolan_Devi

Tuesday, 26 March 2013

11827 - Maximum GCD

#include<stdio.h>
#define max(a,b) (a>b)?a:b

int num[100];

int gcd(int a, int b)
{
    if(a)
        return gcd(b%a, a);

    return b;
}

int main()
{
    int c,i=0,j=0,m;
    char buffer[100];
    //freopen("in.txt","r",stdin);
    scanf("%d\n",&c);
        while(c--)
        {
            gets(buffer);
            i=0,j=0;
            while(buffer[i])
            {
                num[j] = 0;
                while(buffer[i] && buffer[i]!=' ')
                    num[j] = num[j]*10 + buffer[i++]-'0';
                while(buffer[i]==' ')
                    i++;
                j++;
            }

            m=1;
            for(i=0;i<j;i++)
            {
                for(int k=i+1;k<j;k++)
                {
                    m = max(m,gcd(num[i], num[k]));
                }
            }
            printf("%d\n",m);
        }
    return 0;
}

575 - Skew Binary

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    char skem[100];
    int k = 0;
    long sum = 0;
    //freopen("in.txt","r",stdin);
    while(gets(skem))
    {
        int n = strlen(skem);
        int num = skem[0]-'0';
        if(n==1 && num == 0) break;
        for(int i=0;i<n;i++)
        {
            k=n-i;
            sum += ((skem[i]-'0')*((long)pow(2,k)-1));
        }
        printf("%ld\n",sum);
        sum = 0;
    }
    return 0;
}