Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Friday, August 18, 2017

ArrayList ও LinkedList মধ্যে পার্থক্য কী? (Difference between ArrayList and LinkedList in Java)

ArrayListLinkedList ক্লাস দুটি লিস্ট ইন্টারফেসকে ইমপ্লিমেন্ট করে। যার ফলে এদের মেথড ও ফলাফল একইরকম হলেও ইম্প্লিমেন্টেশনের দিক থেকে এদের মধ্যে বেশ কিছু পার্থক্য রয়েছে। পার্থক্যগুলো নিয়ে আলোচনা করার আগে লিস্ট ইন্টারফেসের প্রধান মেথডগুলো দেখা যাক-
 
1
2
3
4
5
6
public interface List{
  public E get(int index);
  public void add(E element);
  public void add(E element, int index);
  public void remove(int index);
}

উপরের এই মেথডগুলোর ইমপ্লিমেন্টেশন অ্যারেলিস্ট ও লিংকডলিস্ট দুটো ক্লাসেই রয়েছে। ব্যবহারের দিক থেকে এই মেথডগুলোর কোনো পার্থক্য নেই। উদাহরণ-

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class TemplateService {
    public static void main(String[] args) {
        //using LinkedList
        List<String> countries = new ArrayList<>();
        //adding elements to the ArrayList
        countries.add("Bangladesh");
        countries.add("India");
        countries.add("Bhutan");
        countries.add("Pakistan");

        // searching element by index
        String bangladesh = countries.get(0);

        //adding element by index
        countries.add(2, "Indonesia");

        //removing element
        countries.remove(4);

        //using LinkedList
        List<String> cities = new LinkedList<>();
        //adding elements to the LinkedList
        cities.add("Dhaka");
        cities.add("London");
        cities.add("Beijing");

        // searching element by index
        String dhaka = cities.get(0);

        //adding element by index
        cities.add(3, "Islamabad");

        //removing element
        cities.remove(3);
    }
}

ইমপ্লিমেন্টেশনের দিক থেকে ArrayList উপাদানগুলো রাখার জন্য একটি অ্যারে ব্যবহার করে এবং অ্যারের সাইজ প্রয়োজন অনুযায়ী বড় করতে পারে। অন্যদিকে LinkedList ডাবলি-লিকংডলিস্ট ডেটা স্ট্রাকচার ব্যবহার করে ইমপ্লিমেন্ট করা হয়ছে।

এবার উপরের মেথডগুলোর টাইম কমপ্লেক্সিটি দেখা যাক -

মেথডের নাম

অ্যারেলিস্ট

লিংকডলিস্ট

E get(int index)

O(1)

O(n)

void add(E element)

O(1) amortized 

O(1)

void add(E element, int index)

O(n)

O(1)

void remove(int index)

O(n)

O(1) 


উপরের চার্ট থেকে দেখতে পারি যে, অ্যারেলিস্ট থেকে কোনো উপাদান খুব দ্রুত খুঁজে বের করা যায় লিংকলিস্টের চেয়ে। এর কারণ, অ্যারেলিস্ট উপাদানগুলো রাখার জন্য একটি অ্যারে ব্যবহার করে যা থেকে কোনো উপাদানের ইনডেক্স জানা থাকলে কনস্ট্যান্ট টাইমে বের করে আনা যায়। অপর দিকে লিংকলিস্ট যেহেতু ডাবলি-লিংকলিস্ট ডেটা স্ট্রাকচার ব্যবহার করে, তাই কোনো উপাদান খুঁজে বের করতে সবগুলো উপাদান খুঁজতে হয়। এজন্যে লিংকলিস্টে কোনো উপাদান অ্যাকসেস করার সময় সময় O(n)।

অ্যারেলিস্টে ডাইনামিক অ্যারে ব্যবহার করা হয়। আমরা জানি যে অ্যারে একটি নির্দিষ্ট দৈর্ঘ্যের (length) উপাদান রাখতে পারে। তবে ডাইনামিক অ্যারের দৈর্ঘ্য প্রয়োজন মতো বাড়ানো বা কমানো যায়। এটি করার পদ্ধতিটি হলো - প্রথমে একটি নির্দিষ্ট দৈর্ঘ্যের অ্যারে তৈরি করা হয়। অ্যারেটি উপাদান পূর্ণ হয়ে গেলে একটি নতুন দৈর্ঘ্যের অ্যারে তৈরি করা হয় যা আগের অ্যারের দৈর্ঘ্যের চেয়ে বড়। আগের অ্যারে থেকে উপাদানগুলো কপি করে নতুন অ্যারেতে রাখা হয় এবং এতে যে অতিরিক্ত ফাঁকা ঘরগুলো রয়ে যায় সেগুলোতে নতুন উপাদান রাখা হয়। এভাবে আবার অ্যারিটি পুর্ণ হয়ে গেলে নতুন দৈর্ঘ্যের অ্যারে তৈরি করা হয়। তবে নতুন দৈর্ঘ্য একটি চিন্তা ভাবনা করে নেওয়া হয় যাতে প্রতিবার নতুন উপাদান যুক্ত করার জন্য অ্যারের দৈর্ঘ্য বৃদ্ধি করার প্রয়োজন না পারে। যেমন- প্রতিবার অ্যারের দৈর্ঘ্য বৃদ্ধির সময় আমরা আগের দৈর্ঘ্যের চেয়ে দিগুণ নেওয়া পারে। এর ফলে প্রতিবার নতুন উপাদান যুক্ত করার সময় নতুন অ্যারে তৈরি এবং আগের অ্যারে থেকে কপি করার কাজ করতে হয় না, বরং এটি একটি নির্দিষ্ট সময় পর পর প্রয়োজন হয়।

অ্যারেলিস্টের অ্যারেতে প্রথমে একটি 10 দৈর্ঘ্যের অ্যারে থাকে। এটি পূর্ণ হয়ে গেলে নতুন অ্যারে তৈরি করা হয় যা আগের অ্যারে থেকে দেড় গুণ হয়। এই অ্যারের দৈর্ঘ্যের বৃদ্ধির ফরমুলা হলো -

int newCapacity = oldCapacity + (oldCapacity >> 1);

এখানে capacity হচ্ছে অ্যারেলিস্টের ভেতরের অ্যারের দৈর্ঘ্য।


অর্থাৎ আমরা যদি 10 টি উপাদান অ্যারেতে যুক্ত করতে চাই, তাহলে এই অ্যারের দৈর্ঘ্য বৃদ্ধি করার প্রয়োজন নেই। তবে যদি n টি উপাদান যুক্ত করতে চাই, তাহে বেশ কতবার দৈর্ঘ্য বৃদ্ধি করা ও আগের অ্যারে থেকে উপাদান কপি কররে আনার প্রয়োজন পরবে।

তাহলে n সংখ্যক উপাদান যুক্ত করার সময় O(n) + মাঝে মধ্যে কপি অপারেশন (একটি লুপের মাধ্যমে আগের n আইটেম কপি করা)আমরা সাধারণভাবে বলতে পারি, গড়ে এর টাইম কমপ্লেক্সিটি (amortized) O(1)

অ্যারেলিস্টের শেষে যুক্ত না করে মাঝে কেনাে উপাদান যুক্ত করতে হলে যেই উপাদান থেকে পরের উপাদানগুলো শিফট (কপি করে এক ঘর সরানো) করার প্রয়োজন হবে। একদম শুরুতে যদি উপাদান যুক্ত করতে হয় তাহলে সবগুলো উপাদান প্রথমে থেকে ডান দিকে শিফট করতে হবে সেক্ষেত্রে এর কম্প্লিক্সিটি হবে O(n)

অ্যারেলিস্ট থেকে কোনো উপাদান রিমুভ করতে হলেও এই শিফ্টিং বা কপি করার প্রয়োজন পরে। অ্যারের লিস্টের মাঝ থেকে কোনো উপাদান রিমুভ করতে হলে, মাঝ থেকে পরবর্তি উপাদানগুলো কপি করে একঘর সামনে আনতে হয়। উপাদানটি যদি প্রথমে হয়, তাহলে সবগুলো উপাদান কপি করে সামনে আনতে হয়। তবে শেষ থেকে উপাদান রিমুভ করলে এর টাইম কমপ্লেক্সিটি হয় O(1) কারণ এতে কোনো কপি বা শিফটিংয়ের প্রয়োজন হয় না।

সুতরাং দেখা যাচ্ছে যে, অ্যারেলিস্ট থেকে কোনো উপাদান রিমুভ করার করার কমপ্লেক্সিটি সাধারণভাবে O(n)

অপরদিকে লিংকলিস্টে কোনো উপাদান যুক্ত করার সময় O(1) । লিংকলিস্ট যেহেতু ডাবলিলিংকলিস্ট ডেটা স্ট্রাকচার ব্যবহার করে তাই এর প্রত্যেকটি নোড এর আগের এবং পরের নোডের রেফারেন্স ধরে রাখে। এক্ষেত্রে কোনো উপাদান যুক্ত করার ক্ষেত্রে কোনো কপি বা শিফটিংয়ের প্রয়োজন নেই, বরং শুধুামাত্র দুটি পয়েন্টারের পরিবর্তন ছাড়া।

একইভাবে লিংকলিস্ট থেকে কোনো উপাদান রিমুভ করার ক্ষেত্রে কোনো কপি বা শিফটিংয়ের প্রয়োজন নেই, শুধুমাত্র দুটি রেফারেন্সের পরিবর্তন হয়। তাই এর টাইম কমপ্লেক্সিটি O(1)।

এখন প্রশ্ন হচ্ছে তাহলে কখন কোনটি ব্যবহার করা উত্তম।

সাধারণভাবে আমরা সব কাজেই অ্যারেলিস্ট ব্যবহার করে থাকি। তবে কোনটি করা উচিৎ তা নির্ভর করে কী কাজ করছি তার উপর। যেমন- উপাদান যুক্ত করার চেয়ে অনেক বেশিবার অ্যাকসেস করার প্রয়োজন হলে অথবা আগে থেকেই কতগুলো উপাদান রাখার প্রয়োজন হবে তা সম্পর্কে ধারণা থাকলে অ্যারেলিস্ট ব্যবহার করা উচিত। 

অন্যদিকে আমাদের যদি অ্যাকসেস করার চেয়ে অনেক বেশি উপাদান যুক্ত বা রিমুভ করার প্রয়োজন হয় তাহলে লিংকলিস্ট ব্যবহার করা উত্তম।
-->

Saturday, July 1, 2017

জাভাতে toString() এর কাজ কী? (Use of toString() Method in java)

জাভাতে toString() এর কাজ কী?

কোনো জাভা অবজেক্টেকে স্ট্রিংয়ে রূপান্তর করতে চাইলে toString() মেথড কল করা হয়। এটি নানা কাজে বিশেষ করে ডিবাগিং কাজে ব্যবহার করা হয়। 

নিচের ক্লাসটি খেয়াল করুন-


1
2
3
4
5
6
7
8
9
public class Employee {
   private String name;
   private int age;

   public Example(String name, int age) {
      this.name = name;
      this.age = age;
   }
}

এবার একটি অবজেক্ট তৈরি করে toString()মেথড কল করা যাক। 


1
2
3
4
public static void main(String[] args) {
   Employee employee = new Employee("Rahim", 27);
   System.out.println(employee.toString());
}


এটিকে রান করলে -


যেহেতু Employee ক্লাসটিতে toString() মেথডটি ওভাররাইড করা হয়নি, তাই এটি Object ক্লাসের toString()মেথডটি কল হয় যা ক্লাস নামের সঙ্গে হ্যাশকোড যুক্ত করে রিটার্ন করেন। 

অর্থপূর্ণ কোনো কিছু রিটার্ন করতে হলে চলুন এটিকে ওভাররাইড করি।


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public class Employee {
   private String name;
   private int age;

   public Employee(String name, int age) {
      this.name = name;
      this.age = age;
   }

   @Override
   public String toString() {
      
      return name + ": " + age;
   }

   public static void main(String[] args) {
      Employee employee = new Employee("Rahim", 27);
      System.out.println(employee.toString());
   }
}

এটিকে রান করলে আউটপুট পাওয়া যাবে -

Rahim: 27

Sunday, June 11, 2017

ল্যামডা এক্সপ্রেশনঃ পর্ব তিন (Lambda Expression: Part 3) - ফাংশন বনাম মেথড

মেথড বনাম ফাংশন ( Function vs.  Method)

ল্যমাডা এক্সপ্রেশন ফাংশনাল প্রোগ্রামিংয়ের একটি মৌলিক ধারণা। অন্যদিকে জাভা একটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ল্যাংগুয়েজ। এতে ফাংশনাল প্রোগ্রামিংয়ের এই বিশেষ ধারণাটি নিয়ে আসার কারণগুলো বুঝতে হলে ও ল্যামডা কী ও এটি নিয়ে কাজ করার জন্য ফাংশনাল প্রোগ্রামিং কী তা জেনে নেওয়া জরুরী। এই অংশে ফাংশনাল প্রোগ্রামিংয়ের কতগুলো মূলনীতি নিয়ে আলোচনা করা যাক। 

যে কোনো প্রেগ্রামিং ল্যাংগুয়েজের একটি মৌলিক উপাদান হলো মেথড বা ফাংশন। ব্যবহারিক দিক থেকে অবজেক্ট ওরিয়েন্টেড ও ফাংশনাল প্রোগ্রামিং এই দুটি প্যারাডাইমেই ফাংশন বা মেথড এই শব্দ দুটি একে অপরের স্থলে ব্যবহার করা হলেও এদের মধ্যে মূলনীতিগতভাবে সামান্য পার্থক্য রয়েছে। এই প্রার্থক্যটুকু উপলব্ধি করতে হলে একটু প্রেগ্রামিং ল্যাংগুয়েজের ইতিহাস ও মূলনীতিগুলোর দিকে তাকাতে হবে। 

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

মেথডের ধারণাটি এসেছে প্রোসিডিউরাল প্রোগ্রামিং ল্যাংগুয়েজ (ফোরটার্ন, প্যাসকেল, এবং সি ইত্যাদি) থেকে। এগুলোতে মেথড বা প্রোসিডিউরগুলো একটি নির্দিষ্ট ক্রমানুসারে(order) কল করতে হয় এবং এগুলো ডেটার পরিবর্তন করতে পারে। এই পদ্ধতিতে কোনো একটি কাজ করতে হলে প্রোগ্রামারকে একটি প্রোগ্রাম ধাপে ধাপে লিখতে হয়। কীভাবে প্রোগ্রামটি এক্সিকিউট হবে, এক্সিকিউট হলে কী আউটপুট হবে, ভ্যারিয়েবলগুলোর পরিবর্তন কীভাবে হবে ইত্যাদি প্রোগ্রামারকে বিস্তারিত পুঙ্খানুপুঙ্খভাবে (in great detail) বলে দিতে হয়। এই পদ্ধতির আরেকটি নাম ইম্পারেটিভ(imperative)প্যারাডাইম। এই পদ্ধতিতে প্রোসিডিউর বা মেথডের ক্রম খুবই গুরুত্বপূর্ণ। 

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ল্যাংগুয়েজ যেমন- সি++, স্মলটক, আইফেল এবং জাভা এই প্রোসিডিউরাল পদ্ধতি অনুসরণ করে তৈরি করা হয়েছে। এতে ডেটা এবং প্রোসিডিউর(মেথড) একটি অবজেক্টের মধ্যে আঁটি বাঁধার মতো করে সংযুক্ত করা হয়েছে। তবে মেথডের ধারণাটি একই থাকছে। এটি ডেটার (নিজস্ব ডেটা অর্থাৎ অবজেক্টের স্টেট বা ফিল্ড, অথবা আর্গুমেন্ট আকারে যে ডেটা দেওয়া হয়) উপর কাজ করে তবে ডেটা পরিবর্তনও করতে পারে। 

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

ফাংশনাল ল্যাংগুয়েজ গুলো ডিক্লেয়ারেটিভ(declarative) হয়। এতে একটি প্রোগ্রাম কী কাজ করবে তা লেখা হয়, কীভাবে নয়। এতে প্রোগ্রামের ফাংশন কলের ক্রম গুরুত্বপূর্ণ নয়। এদে দুটি বিষয়, অর্থাৎ কী এবং কীভাবে, আলাদা থাকে। এতে একজন প্রোগ্রামার কী করতে চায় তা বর্ণনা করে। এই চাওয়ার ইমপ্লিমেন্টেশন অন্য জায়গায় থাকে (ইমপ্লিমেন্টেশন প্রোগ্রামিং ল্যাংগুয়েজে ইন-বিল্ট থাকতে পারে কিংবা প্রোগ্রামার নিজেও লিখতে পারে)। যেহেতু ফাংশনগুলো ডেটার পরিবর্তন করে না, তাই এদের ক্রম যেকোনো রকম হতে পারে। এতে করে একটি প্রোগ্রাম লিখে কী সম্পাদন করা যাচ্ছে তা আলাদা করা যাচ্ছ। 

উপরের আলোচনা থেকে তাহলে আমরা এতটুকু বুঝতে পারি যে, জাভাতে আমরা মেথড লিখি। এগুলো ডেটা পরিবর্তন করতে পারে, এবং এরা যেহেতু ডেটার পরিবর্তন করতে পারে, তাই এদের ক্রম গুরুত্বপূর্ণ (মেথড কল আগে পরে কল করলে ডেটার পরিবর্তনের ক্রম পরিবর্তন হয়ে যেতে পারে, বিভিন্ন বিন্যাসে বিভিন্ন ফলাফল হতে পারে)। এতে কী সম্পাদন করতে চাই তার সঙ্গে কীভাবে তা সম্পাদিত হবে তাও লিখে দিতে হয়। অন্যদিকে আমরা পিওর ফাংশনও জাভাতে লিখতে পারি। জাভা ৮ এর আগে এই পিওর ফাংশনগুলো অ্যানোনিমাস ইনার ক্লাসের মাধ্যমে লেখা হতো। তবে এখন এগুলো ল্যামডা এক্সপ্রেশনের মাধ্যমে লেখা যায়। ল্যামডা এক্সপ্রেশন যদি ডেটার পরির্বতন না করে, তাহলে এগুলোকে পিউর ফাংশন বলা যায়। 

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

সাইড ইফেক্ট

প্রোগ্রামের একটি স্টেট(state) থাকে। অবজেক্ট ওরিয়েন্টেট প্রোগ্রামিংয়ে একটি ক্লাসের বেশ কতগুলো ফিল্ড থাকে। স্ট্রাকচারড প্রোগ্রামিংয়ে গ্লোবাল ভ্যারিয়েবল থাকে। কোনো একটি ফাংশন কলের ফলে যদি এই ফিল্ড বা গ্লােবাল ভ্যারিয়েবলের কোনো পরিবর্তন হয় তাহালে সেই ঘটনাকে সাইড ইফেক্ট বলা হয়। একটি ফাংশন বা মেথডের নিজস্ব স্কোপ থাকে। ফাংশন বা মেথডের নামের পর কার্লি ব্রেস শুরু থেকে শেষ পর্যন্ত এর স্কোপ। এই স্কোপের বাইরে কোনো কিছর পরিবর্তন করলেই তা সাইড ইফেক্ট হিসেবে গণ্য হবে। উদাহরণ- কোন ফাংশন বা মেথড চলাকলিন সময়ে কোনো কিছু স্ক্রিনে প্রিন্ট করতে পারে। 

এই সাইড ইফেক্ট না থাকার অনেকগুলো অর্থ হয়। কোনো ফাংশন কলের ফলে নিচের কাজগুলো হবে না - 
১. কোনো ভ্যারিয়েবল পরিবর্তন হবে না। 
২. কনসোল বা স্ক্রিনে কোনো কিছু প্রিন্ট হবে না। 
৩. ডাটাবেইজ, নেটওয়ার্ক বা অন্যকোনো ডিভাইসে ডেটা রাইট হবে না। 
৪. কোনোরকম এক্সেপশন থ্রু করবে না। 
ইত্যাদি



-->

Monday, June 5, 2017

জাভাতে কীভাবে ক্লাস লোড করা হয়


একটি জাভা ক্লাসকে(.java) কম্পাইল করলে একটি ক্লাস(.class) ফাইল তৈরি হয়। এই ক্লাস ফাইলে বিভিন্নরকম ফিল্ড, ইনহেরিট্যানস সম্পর্কিত তথ্য, অ্যানোটেশন ও মেটাডেটা থাকে। এটি জাভা ভার্চুয়ালে মেশিনের একটি টাইপ নির্দেশ করে। এই ক্লাস ফাইল একটি একটি নির্দিষ্ট স্ট্যান্ডার্ড মেনে তৈরি করা হয় এবং এতে সবরকম তথ্য থাকে যা জাভা ভার্চুয়াল মেশিনের এক্সিকিউট করতে হলে প্রয়োজন হয়। একটি প্রোগ্রামের এই ক্লাস সবচেয়ে ছোট অংশ। একটি ক্লাস থেকে অবজেক্ট তৈরি এবং তা এক্সিকিউট করতে হলে জাভা ভার্চুয়াল মেশিনকে ক্লাস ফাইলটিকে প্রথমে লোড করতে হয়। এরপর একে লিংকড করতে হয় এবং খুব ভালোভাবে পরীক্ষা-নিরীক্ষা(verify) করে দেখতে হয়। পরীক্ষার পর প্রত্যেকটি ক্লাস ফাইলের জন্য একটি করে ক্লাস(Class) অবজেক্ট তৈরি হয়। এটি রানটাইম সিস্টেমে একটি টাইপকে প্রতিনিধিত্ব করে। 

একটি ক্লাস ফাইলে বাইটকোড থাকে। এই বাইটকোড হলো বিশেষ ইন্সট্রাকশন যা জাভা ভার্চুয়াল মেশিন এক্সিকিউট করে। তাহলে এই বাইটকোডগুলোকে এক্সিকিউট করতে হলে জাভা ভার্চুয়াল মেশিনকে এই বাইটকোড প্রসেস করতে হয়। এই প্রসেসের প্রক্রিয়া শুরু হয় লোডিং ও লিংকিং (loading and linking) এর মাধ্যমে।

এবার এই ক্লাস লোডিং ও লিংকিং প্রক্রিটি দেখা যাক - 

ক্লাস লোডিং (Class Loading)

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


লিংকিং (Linking)

ক্লাস লােড হওয়ার পরের ধাপ হলো লিংকিং। এই ধাপ সংগঠিত হয় তিনটি ধাপে। এগুলো হলো - 
১. ভ্যারিফিকেশন (Verification)
২. প্রিপারেশন (Preparation)
৩. রেজ্যুলুশন (Resolution)

ভ্যারিফিকেশন প্রক্রিয়া দেখা হয় কোনো ক্লাসের ফরম্যাট ঠিক আছে কিনা, বা এটি রানটাইমে কোনো প্রকার সমস্যা তৈরি করবে কিনা। ভ্যারিফিকেশনে সবকিছু ঠিকঠাক থাকলে ক্লাসটি ব্যবহারের জন্য তৈরি করা হয়। একটি ক্লাসে অন্য ক্লাসের রেফারেন্স থাকতে পারে। এরপরের ধাপে যে ক্লাসগুলো রেফারেন্স করা হয়েছে সেগুলো জাভা রানটাইমের কাছে পরিচিত কিনা তা দেখা হয়। 

ভ্যারিফিকেশন (Verification)

এটি বেশ জটিল একটি প্রক্রিয়া। এটি বেশকতগুলো ধাপে সংগঠিত হয়। 

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


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

প্রিপারেশন (Preparation)

এ প্রক্রিয়ায় ক্লাসে কোনো স্ট্যটিক ফিল্ড থাকলে সেগুলোকে তৈরি করা ও ইনিশিয়ালাইজ করা হয়। কিন্তু এ ধাপে জাভা ভার্চুয়াল মেশিনে কোনো বাইটকোড ইন্সট্রাকশন এক্সিকিউট হয় না। 

রেজ্যুলুশন (Resolution) 

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

এই ধাপ সম্পন্ন হওয়ার পর একটি ক্লাস ব্যবহারের জন্য তৈরি হয়ে যায়।



-->

Saturday, April 8, 2017

ইনমেমোরী ফাইল সিস্টেম (In memory file system in java)

ফাইল সিস্টেম হলো এক ধরণের ডেটা স্ট্রাকচার ও পদ্ধতি যার মাধ্যে অপারেটিং সিস্টেম ডিস্কে যে বিভিন্নরকম ফাইল রাখা হয় তার ট্র্যাক রাখে। 

অনেক সময়ই বিভিন্ন ইন্টারভিউতে ইন মেমোরী ফাইল সিস্টেম তৈরি করতে বলে। প্রশ্নটি এমন থাকে যে, একই ইন মেমোরী ফাইল সিস্টেম তৈরি রকতে হলে আপনি কীভাবে ডিজাইন করবেন এবং কী কী ডেটা স্ট্রাকচার ব্যবহার করবেন। সম্ভব হলে কিছু কোড লিখে দেখান। (Explain the data structures and algorithm that  you would use to design an in-memory file system. Illustrate with an example in code if possible. )

অনেকই ফাইল সিস্টেমের নাম শুনেই ভয় পেয়ে যায়, মনে করে এটি অনেক লো লেভেল (low level) অর্থাৎ অপারেটিং সিস্টেমের সঙ্গে সম্পর্কিত। কিন্তু সহজ-সরল ডিজাইন কিন্তু খুব কঠিন কিছু নয়। অবজেক্ট ওরিয়েন্টেড ডিজাইন ব্যবহার করেই এটি সমাধান করে ফেলা যায়। 

একটি ফাইল সিস্টেমে থাকে কতগুলো ফাইল এবং ডিরেক্টরী। এরা বেশ কিছু বৈশিষ্ট্য শেয়ার করে। যেমন - এদের নাম থাকে, এদের পাথ থাকে, এগুলোর কখন তৈরি করা হয়েছে, কখন মোডিফাই করা হয়েছে, কবে শেষবার অ্যাকসেস করা হয়েছে ইত্যাদি। এই বৈশিষ্ট্যগুলো নিয়ে আমরা একটি অ্যাবস্ট্রাক্ট সুপার ক্লাস তৈরি করতে পারি। 


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public abstract class Node implements Comparable<Node> {
    private Directory root;
    private String name;
    private LocalDateTime created;
    private LocalDateTime lastUpdated;
    private LocalDateTime lastAccessed;

    public Node(String name) {
        this.name = name;
        this.created = LocalDateTime.now();
        this.lastUpdated = LocalDateTime.now();
        this.lastAccessed = LocalDateTime.now();
    }

    public boolean isDirectory() {
        return this instanceof Directory;
    }

    public String getPath() {
        return root != null ? root.getPath() + "/" + name : name;
    }

    public Node getParent() {
        return root;
    }

    public abstract long getLength();

    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Node o) {
        return this.getName().compareTo(o.getName());
    }

    public void setRoot(Directory root) {
        this.root = root;
    }

    public LocalDateTime getCreated() {
        return created;
    }

    public LocalDateTime getLastUpdated() {
        return lastUpdated;
    }

    public LocalDateTime getLastAccessed() {
        return lastAccessed;
    }

    @Override
    public String toString() {
        return "root=" + root +
                ", \nname='" + name + '\'' +
                ", \ncreated=" + created +
                ", \nlastUpdated=" + lastUpdated +
                ", \nlastAccessed=" + lastAccessed;
    }
}


এখানে কম্পেয়ারেবল ইন্টারফেইস ইমপ্লিমেন্ট করার কারণ হলো, যাতে আমরা সর্ট করতে পারি।

প্রত্যেকটি ফাইলের একটি করে রুট থাকে। রুট না থাকলে সে নিজেই রুট। এই নোডকে এক্সটেন্ড করে একটি ফাইল তৈরি করে ফেলা যাক -


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class File extends Node {
    private String content; // for simplicity

    public File(String name, String content) {
        super(name);
        this.content = content;
    }

    public File(String name) {
        super(name);
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public long getLength() {
        if (content != null) {
            return content.getBytes().length;
        }
        return 0;
    }
}


প্রত্যেকটি ফাইল কিছু কন্টেন্ট রাখে। সহজভাবে বুঝানোর জন্য এতে আপরা স্ট্রিং রেখেছি।
এবার ডিরেক্টরী স্ট্রাকচার তৈরি করা যাক -


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Directory extends Node {
    private Set<Node> nodes;
    public Directory(String path) {
        super(path);
        nodes = new TreeSet<>();
    }

    public void add(Node node) {
        node.setRoot(this);
        nodes.add(node);
    }

    public Set<Node> getNodes() {
        return nodes;
    }

    @Override
    public long getLength() {
        long length = 0;
        for (Node node : nodes) {
            length += node.getLength();
        }
        return length;
    }

    public int numberOfFiles() {
        int count = 0;
        for (Node node : nodes) {
            if (node instanceof Directory) {
                count++;/// Directory counts as a file
                Directory directory = (Directory) node;
                count += directory.numberOfFiles();
            } else if (node instanceof File) {
                count++;
            }
        }

        return count;
    }
}


প্রত্যেকটি ডিরেক্টরীতে অারও অনেকগুলো করে ফাইল বা ডিরেক্টরী থাকতে পারে। এক্ষেত্রে ডিরেক্টরীতে একটি ট্রিসেটে (TreeSet) রাখা হয়েছে যা সেই ফাইল বা ডিরেক্টরীগুলো ধরে রাখে।

ডিরেক্টরী স্ট্রাকচারকরে সুন্দর করে প্রিন্ট করার জন্য কতগুলো মেথড যুক্ত করা যেতে পারে । যেমন-


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void printTree() {
    int indent = 0;
    StringBuilder sb = new StringBuilder();
    printDirectoryTree(this, indent, sb);
    System.out.println(sb.toString());
}

private void printDirectoryTree(Node node, int indent, StringBuilder sb) {
    sb.append(getIndentString(indent));
    sb.append("+--");
    sb.append(node.getName());
    sb.append("/");
    sb.append("\n");
    if (node.isDirectory()) {
        Directory directory = (Directory) node;
        for (Node file : directory.getNodes()) {
            printDirectoryTree(file, indent + 1, sb);
        }
    }
}

private static String getIndentString(int indent) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < indent; i++) {
        sb.append("|  ");
    }
    return sb.toString();
}


এবার একটি মেইন মেথড থেকে এগুলোকে ব্যবহার করা যাক -


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Main {
    public static void main(String[] args) {
        Directory root = new Directory("root");
        File file = new File("profile.jpg");
        root.add(file);

        Directory movie = new Directory("movie");
        root.add(movie);

        Directory englishMovie = new Directory("english");
        englishMovie.add(new File("IronFist.mp4"));
        englishMovie.add(new File("The Shawshank Redemption.mp4"));
        englishMovie.add(new File("ZotaPia.mp4"));
        File despicableMe = new File("DespicableMe.mp4");
        englishMovie.add(despicableMe);

        movie.add(englishMovie);

        Directory banglaMovie = new Directory("Bangla");
        banglaMovie.add(new File("The Clay Bird.mp4"));
        banglaMovie.add(new File("Jibon Thekey Neya.mp4"));
        movie.add(banglaMovie);

        root.printTree();

        System.out.println("name: " + movie.getName());
        System.out.println("Created: " + movie.getCreated());
    }
}

এটিকে রান করলে নিচের আউটপুটটি পাওয়া যাবে-


+--root/
|  +--movie/
|  |  +--Bangla/
|  |  |  +--Jibon Thekey Neya.mp4/
|  |  |  +--The Clay Bird.mp4/
|  |  +--english/
|  |  |  +--DespicableMe.mp4/
|  |  |  +--IronFist.mp4/
|  |  |  +--The Shawshank Redemption.mp4/
|  |  |  +--ZotaPia.mp4/
|  +--profile.jpg/

name: movie
Created: 2017-04-08T02:26:38.341


সম্পূর্ণ কোডটি পাওয়া যাবে এখানে: https://gist.github.com/rokon12/d3c83562c785de6d1a483a5585205b92

Saturday, March 25, 2017

জাভা মেইন থ্রেড (Java Main Thread)

জাভা ভার্চুয়াল মেশিন যখন চলা শুরু করে, তখন এটি একটি থ্রেড তৈরি করে। একে মেইন থ্রেড বলা হয়। আমরা জাভাতে যে কোডগুলো করি সেগুলোকে মেইন থ্রেড রান করে। আমরা জানি যে প্রত্যেকটি জাভা প্রোগ্রামের একটি এন্ট্রি পয়েন্ট থাকে আর সেটি হলো মেইন মেথড (static void main(String[] args))। এই মেইন থ্রেড শুরুতেই এই মেইন মেথডটি খুঁজে। এই মেইন মেথড থেকেই প্রোগ্রাম চলা শুরু করে। উদাহরণ-


1
2
3
4
5
6
7
8
public class MainThreadDemo {

 public static void main(String[] args) {

  Thread thread = Thread.currentThread();
  System.out.println("Current Thread: " + thread.getName());
 }
}


এই প্রোগ্রামটি রান করলে আউটপুট আসবে- 

Current Thread: main

এথেকে বোঝা যাচ্ছে যে, জাভাতে আমরা যে কোডগুলো এক্সিকিউট করি সেগুলো কোনো না কোনো থ্রেড রান করে থাকে। 

Try-with-resource statement in java

প্রোগ্রামের কাজ শেষ হয়ে গেলে যে অবজেক্টগুলোকে ক্লোজ করে দেওয়া অত্যাবশ্যক সেগুলোকে রিসোর্স (Resource) বলা হয়। যেমন, FileOutputStream, BufferRedear। এই ক্লাসগুলো java.io.Cloasble ই্ন্টারফেসকে ইমপ্লিমেন্ট করে।


উপরের ইন্টারফেসটিতে দেখা যাচ্ছে যে close() মেথডটি IOException থ্রো করে যা একটি চেকড এক্সেপশন। চেকড এক্সেপশন সবসময় হ্যান্ডেল করতে হয়। এর অর্থ হচ্ছে, এই মেথডটি কল করতে গেলে অবশ্যই try-catch ব্লকের ভেতরে তা কল করতে হবে। উদাহরণ হিসেবে নিচের মেথডটি খেয়াল করা যাক,


উপরের মেথডটিতে close() মেথডটি finally ব্লকের মধ্যে কল করা হয়েছে। এর কারণ প্রোগ্রামটির কাজ শেষ হলেই আমরা রিসোর্স ক্লোজ করতে পারি। এই কোড ব্লক দেখেই মনে হচ্ছে কাজটুকু খুবই বিরক্তিকর। একটি ছোট কাজের জন্য অনেক কোড লিখতে হচ্ছে। এই বিরক্তি দূর করতে জাভা 7 এ নতুন একটি ফিচার সংযুক্ত করা হয়েছে যাকে বলে try-with-resource স্টেটমেন্ট। উপরের মেথডটিকে try-with-resource স্টেটমেন্ট ব্যবহার করে লিখলে দাঁড়ায়,



দুটি কোড মেথড যদিও একই কাজ করে, কিন্তু নিচের মেথডটিকে কম সংখ্যক লাইন কোড রয়েছে উপরের মেথডটি থেকে এবং এতে close() মেথডটি কল করা হয়নি।

এবার নিচের লাইনটি ভালো করে লক্ষ করা যাক,

try (FileInputStream fis = new FileInputStream("file.txt"))

এটি একটি try-with-resource স্টেটমেন্ট। FileInputStream এর ভ্যারিয়েবলটি try কিওয়ার্ডের ভেতরে ডিক্লেয়ার করা হয়েছ এবং ইনস্ট্যানসিয়েট করা হয়েছে। এখানে যখন এই try ব্লক শেষ হয়ে যাবে তখন FileInputStream রিসোর্সটি নিজে থেকেই ক্লোজ হয়ে যাবে। এটি সম্ভব হবে কারণ FileInputStream ক্লাসটি AutoCloseable ইন্টারফেসকে ইমপ্লিমেন্ট করে। যে সব ক্লাসগুলো এই ইন্টারফেসকে ইমপ্লিমেন্ট করে, তাদের প্রত্যেকের ক্ষেত্রে এই try-with-resource স্টেটমেন্ট ব্যবহার করা যাবে।

একাধিক রিসোর্সের ক্ষেত্রেও এই try-with-resource স্টেটমেন্ট ব্যবহার করা যায়। যেমন,


এক্ষেত্রে FileInputStream এবং BufferInputStream দুটি ক্লাসই try ব্লক শেষ হওয়ার সঙ্গে সঙ্গেই ক্লোজ হয়ে যাবে।

Thursday, March 23, 2017

জাভা থ্রেড প্রোগ্রামিংঃ পর্ব- এক (Java threading: part -1 )

বর্তমানে সব ধরণের কম্পিউটারই একই সঙ্গে একাধিক কাজ করে থাকে অর্থাৎ অনেকগুলো প্রোগ্রাম রান করে। প্রত্যেকটি আলাদা আলাদা প্রোগ্রামের জন্য অপারেটিং সিস্টেম একটি করে প্রসেস রান করে। প্রসেসগুলো একে অপরের থেকে স্বাধীন এবং ভিন্ন হয়। এগুলোর নিজস্ব এক্সিকিউশন এনভাইরনমেন্ট ও মেমোরি স্পেস থাকে। প্রসেসগুলো একইসঙ্গে পাশাপাশি চলতে থাকে। উদাহরণসরূপ- আমরা একইসঙ্গে ইউটিউবে গান শুনতে পারি ও ওয়ার্ড প্রসেসরে ডকুমেন্ট টাইপ করতে পারি। 

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

আধুনিক প্রায় সব প্রোগ্রাম বা সফটওয়্যারগুলো মাল্টিথ্রেডেড। মাল্টিথ্রেডেড প্রোগ্রামিংকে কনকারেন্ট প্রোগ্রামিংও বলা হয়। কারণ এতে কোনো প্রোগ্রামের বিভিন্ন অংশ কনকারেন্টলি(concurrently) বা একইসঙ্গে চলে। জাভা প্রোগ্রামিং ল্যাংগুয়েজ ব্যবহার করে মাল্টিথ্রেডেড প্রোগ্রাম লেখা খুব সহজ। 

জাভাতে থ্রেড প্রোগ্রামিংয়ের ক্ষেত্রে Thread ক্লাসটি ব্যবহার করা হয়। জাভাতে দুইভাবে এই ক্লাসটি ব্যবহার করা যায়। 

১. Thread ক্লাসটিকে এক্সটেন্ড করে।
২. Runnable ইন্টারিফেস ব্যবহার করে। 

প্রথমে আমরা Thread ক্লাসটিকে এক্সটেন্ড করে একটি উদাহরণ দেখি-




উপরের প্রোগ্রামটিতে Thread ক্লাসটিকে ইনহেরিট করে একটি MyThread নামে একটি ক্লাস লেখা হয়েছে। Thread ক্লাসটি run() নামে একটি মেথড রয়েছে। এই মেথডটিতে ওভাররাইড করে এতে কিছু কোড লেখা হয়েছে। এই কোড অংশটুকু আমরা কনকারেন্টলি রান করতে চাই। এখানে একটি লুপ লেখা হয়েছে এবং এতে একটি প্রিন্ট মেথড রয়েছে। 

এরপর থ্রেড ক্লাসের একটি স্ট্যাটিক মেথড sleep() ব্যবহার করে কিছুক্ষণের জন্য প্রোগ্রামটিকে থামিয়ে দেওয়া হয়েছে। এই মেথড আর্গুমেন্ট হিসেবে একটি সংখ্যা নেয়। যে সংখ্যাটি দেওয়া হবে, ঠিক ততো মিলি সেকেন্ড এই থ্রেডটি বন্ধ হয়ে থাকেবে এবং আবার শুরু করবে। একটি সংখ্যা প্রিন্ট করতে মোটেও কোনো সময় লাগে না, এটি শুধুমাত্রে বোঝার সুবিধার্থে ব্যবহার করা হয়েছে যে, যাতে মনে হয় থ্রেডটি বেশ কিছুক্ষণ কাজ করছে। এই মেথডটি একটি চেকড এক্সেপশন থ্রো করে, এজন্য একে ট্রাই ক্যাচ ব্লকের মধ্যে রাখা হয়েছে। 

এবার এই ক্লাসটিকে একটি মেইন মেথড থেকে ব্যবহার করা যাক-





এখানে MyThread ক্লাসটির দুটি ইনস্ট্যান্স তৈরি করা হয়েছে। থ্রেড রান করা জন্য এর start() মেথডটি কল করতে হয়। 

এই প্রোগ্রামটি রান করলে যে আউটপুট আসবে তা হলো - 

0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9

এর অর্থ হলো দুটি লুপই পাশাপাশি রান করছে। 

এবার দ্বিতীয় উপায়টি অর্থাৎ Runnable ইন্টারফেইস ব্যবহার করে একটি উদাহরণ দেখা যাক- 






এখানে MyRunnable ক্লাসটি Runnable ইন্টারফেইসকে ইমপ্লিমেন্ট করেছে। এই ইন্টারফেইসটিতে একটি মাত্র মেথড run() রয়েছে। যে কোড অংশটুকু কনকারেন্টলি রান করার প্রয়োজন সেই কোড অংশটুকু এই মেথডে লিখতে হয়। এই ক্লাসটিকে ব্যবহার করতে হলে- 





এখানে প্রথমে একটি MyRunnable ক্লাসের ইনস্ট্যান্স তৈরি করা হয়েছে। এরপর Thread ক্লাসের কনস্ট্রাক্টরে এই ইনস্ট্যান্সটি আর্গুমেন্ট হিসেবে দিয়ে Thread ক্লাসের ইনস্ট্যান্স তৈরি করা হয়েছে। এরপর থ্রেডটিকে রান করার জন্য start() মেথডটি কল করা হয়েছে। 


এখানে একটি বিষয় মনে রাখতে হবে যে, যদিও যে কোড অংশটুকু কনকারেন্টলি রান করার প্রয়োজন তা রান মেথডের মধ্যে লিখতে হয়, কিন্তু থ্রেড রান করার জন্য এই মেথডটি ব্যবহার করা হয় না। এই মেথডটি থ্রেড নিজে ব্যবহার করে থেকে। থ্রেড রান করার জন্য start() মেথডটি কল করতে হয়। 


চলবে...

Tuesday, March 7, 2017

জাভাতে কালেকশন ফ্রেমওয়ার্ক কী এবং এর প্রয়োজনীয়তা কী?

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

একটা সময় ছিল যখন প্রোগ্রামারদেরকে বেসিক ডেটা স্ট্রাকচার তৈরি করতে এবং এদেরকে নিয়ে কাজ করানোর মতো অবস্থায় নিয়ে আসতে অনেক বেশি সময় ব্যয় করতে হতো। যেমন - যদি একটি সেট(Set) এর দরকার হয়, তাহলে স্ক্র্যাচ থেকে একটি সেট তৈরি করতে হতো। যদি একটি লিস্ট (List) বা ম্যাপ (Map) দরকার হতো, প্রচুর সময় এদের পেছনে ব্যয় করতো হতো। সবচেয়ে বড় সমস্যা ছিল যেটি ছিল যে- এগুলো সবসময় এররপ্রুন হতো। এতে করে একটি রিয়েল লাইফ সমস্যা সমাধান করতে গিয়ে প্রোগ্রামাদেরকে বেসিক সমস্যা নিয়ে বেশি মনযোগী হতে হতো।

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

আর এই কমন ক্লাসগুলো নিয়েই কালেকশন ফ্রেমওয়ার্ক।

জাভাতে Declare type এবং Actual type কী?

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

Animal animal; 

এখানে animal একটি ভেরিয়েবল। যার টাইপ হচ্ছে Animal। এখন new কিওযার্ড ব্যবহার করে এতে একটি অবজেক্ট তৈরি করে এই ভেরিয়েবলে অ্যাসাইন করতে পারি।

Animal animal = new Animal(); 

এখানে animal ভেরিয়েবলটি একটি Animal এর একটি অবজেক্টের একটি রেফারেন্স ধরে রাখে। এক্ষেত্রে এই অবজেক্টের টাইপও এখানে Animal।

সাধারণভাবে ভেরিয়েবল টাইপ এবং অবজেক্ট টাইপ একই হলেও কখনো কখনো ভিন্ন হতে পারে। ধরা যাক, এই Animal ক্লাসকে এক্সটেন্ড করে আরেকটি ক্লাস তৈরি করা হলো, Dog. তাহলে new Dog দিয়ে যে অবজেক্ট তৈরি হবে তার টাইপ হবে  Dog.

Animal animal = new Dog(); 

উপরের উদাহরণটি খেয়াল করুন। এখানে ভেরিয়েবল টাইপ এবং অবজেক্ট টাইপ ভিন্ন। কিন্তু এই স্টেটমেন্টটি বৈধ। এর কারণ হলো - যেকোনো ভেরিয়েবলের টাইপের যেকোনো সাব-ক্লাসের অবজেক্টের রেফারেন্স রাখতে পারে। এর মানে হচ্ছে এই animal ভেরিয়েবলে যেকোনো Animal ক্লাসের সাব-ক্লাসের ইনস্ট্যান্স বা অবজেক্টের রেফারেন্স রাখতে পারি।

ঠিক একইভাবে, কোনো মেথডের প্যারামিটার যদি সুপার টাইপ হয়, সেখানে এর যেকোনো একটি সাবটাইপ এর অবজেক্ট এর রেফারেন্স আর্গুমেন্ট হিসেবে পাস করা যায়।

তাহলে এভাবেও বলতে পারি, ভেরিয়েবল টাইপ হচ্ছে ডিক্ল্যায়ার টাইপ। আর অবজেক্ট টাইপ হচ্ছে একচুয়াল টাইপ।

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

Wednesday, March 1, 2017

Largest known prime number

সবচেয়ে বড় মৌলিক সংখ্যাটি কতো ?

এখন পর্যন্ত খুঁজে পাওয়া সবচেয়ে বড় মৌলিক সংখ্যাটি হলো - 2^57,885,161 -1।
এই লিংকে এ সম্পর্কে আরও বিস্তারিত জানা যাবে।

এতে 17,425,170 টি সংখ্যা রয়েছে। এই সংখ্যাটি দেখতে চাইলে ঝটপট একটি জাভা প্রোগ্রাম লিখে ফেলা যায়। এর জন্য জাভার BigInteger ক্লাসটি প্রয়োজন হবে।

import java.math.BigInteger;

public class LargestPrimeNumber {
    public static void main(String[] args) {
        BigInteger two = BigInteger.valueOf(2);
        BigInteger largest = two.pow(57_885_161);
        BigInteger largestPrimeNumber = largest.subtract(BigInteger.ONE);
        System.out.println(largestPrimeNumber);
    }
}

এটি প্রিন্ট হতে বেশ খানিকটা সময় নেবে।


ফাইলে স্টোর করতে চাইলে নিচের কোড অংশটুকু যুক্ত করুন-
try {
            Files.write(Paths.get("prime.txt"), largestPrimeNumber.toString().getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }




Wednesday, February 22, 2017

প্রোগ্রামিং আড্ডা: জাভা প্রোগ্রামিং ও অ্যান্ড্রয়েড: দশটি প্রশ্নের উত্তর

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


আড্ডাটির ইউটিউব ভিডিও লিংকটিও নিচে দেওয়া হলোঃ




প্রশ্নঃ বাংলাদেশে তো জাভাতে কাজ করে এমন সফটওয়্যার ফার্মের সংখ্যা কম, সুতরাং জাভা শিখে কী লাভ আছে ?
উত্তরঃ বাংলাদেশে মোটেও জাভাতে কাজ করে এমন সফটওয়্যার ফার্মের সংখ্যা কম নয়। জাগবিডিতে একটা সার্ভে করা হয়েছিল তাতে যে সংখ্যা পাওয়া যায়, তার সংখ্যা মোটেও কম নয়। তাছাড়া সামগ্রিকভাবে বাংলাদেশের সফটওয়ার ইন্ডাস্ট্রি এতো বড় নয়। সার্ভেটির লিংক এখানে পাওয়া যাবে- https://goo.gl/O9mJf5


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

প্রশ্নঃ অ্যান্ড্রয়েড অ্যাপ্লিকেশন তৈরির জন্য কী কী মৌলিক ধারণা জানা লাগবে?
উত্তরঃ অ্যান্ড্রয়েড যেহেতু জাভা প্রোগ্রামিং ল্যাংগুয়েজ ব্যবহার করে, সুরতাং জাভার স্ট্যান্ডার্ড এডিশনের আদ্যোপান্ত জানতে হবে। জাভা প্রোগ্রামিং ল্যাংগুয়েজের সিনট্যাক্স থেকে শুরু করে অবজেক্ট ওরিয়েন্টেড কনসেপ্ট, জেনেরিক্স, এক্সেপশন হ্যান্ডেলিং, আইও, কালেকশন ফ্রেমওয়ার্ক ইত্যাদি। অ্যান্ড্রয়েড অ্যাপ্লিকেশন বিল্ড করার জন্য একটি বিল্ডটুল ব্যবহার করে থাকে। এর নাম গ্রাডল। সুতরাং বিল্ডটুল কীভাবে কাজ করে তাও জানতে হবে। এছাড়াও সাধারণত সবধরণের অ্যান্ড্রয়েড অ্যাপ্লিকেশন মূলত ক্লায়েন্ট অ্যাপ হয়ে থাকে, মূল প্রসেসিং রিমুট সার্ভারে হয়ে থাকে। তাই রিমুট সার্ভারের সাথে কীভাবে যোগাযেগা করতে হয় তা জানতে হবে। এক্ষেত্রে অনেকগুলো হেইচটিটিপি(HTTP) ক্লায়েন্ট ব্যবহার করা শিখতে হবে। যদি সার্ভারের অংশটুকুতেও কাজ করতে হয় তাহলে কীভাবে সার্ভারের জন্য ব্যাকএন্ড (back-end) প্রোগ্রামিং করতে সেগুলোও জানতে হবে।


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


প্রশ্নঃ সি না শিখে কী জাভা শেখা যায়।
উত্তরঃ সংক্ষিপ্ত উত্তর, হ্যা। তবে সি প্রোগ্রামিং আপানাকে প্রোগ্রামিংয়ের ধারণা তৈরি করতে সাহায্য করে। এ নিয়ে ধারণা পেতে হলে যেতে পারেন এই লিংকে: http://cpbook.subeen.com/


প্রশ্নঃ অ্যান্ড্রয়েড প্রোগ্রামিংয়ের জন্য জাভার কোন ভার্সনটি মাথায় রাখা উচিৎ?
উত্তরঃ অ্যান্ড্রয়েড জাভা ৭ এর সবগুলো ফিচার সাপোর্ট করে। জাভা ৮ এর সবগুলো না হলেও একটা বড় অংশ সাপোর্ট করে। জাভা ৮ এর নতুন ফিচারগুলো সাপোর্ট করার জন্য অ্যান্ড্রয়েড একটি নতুন কম্পাইলার ব্যবহার করে নাম Jack. বিস্তারিত পাওয়া যাবে এই লিংকে: https://developer.android.com/guide/platform/j8-jack.html


প্রশ্নঃ জাভার এন্টারপ্রাইজ এডিশন কী?
সাধারণত অনেক বড় ধরণের ব্যবসা প্রতিষ্ঠানে ব্যবহৃত অ্যাপ্লিকেশনগুলোতে এন্টাপ্রাইজ শব্দটি ব্যবহার করা হয়। বর্তমানে করপোরেট ইনভাইরনমেন্টে এন্টারপ্রাইজ অ্যাপ্লিকেশন বলতে খুব জটিল, ডিস্ট্রিবিউটেড, কম্পোনেন্ট বেইজড এবং মিশন ক্রিটক্যাল (mission-critical) অ্যাপ্লিকেশন বোঝায়। মিশন ক্রিটিক্যাল অ্যাপ্লিকেশন হলো সেগুলো, যেগুলো কোনো একটি বিশেষ ব্যবসায়িক উদ্দেশ্যে অ্যাপ্লিকেশনটি ব্যবহার করা হয়, যার উপর সম্পূর্ণ ব্যবসাটি নির্ভর করছে। কোন কারণে অ্যাপ্লিকেশনটি কাজ না করলে ব্যবসাটি ক্ষতিগ্রস্থ হয়। এগুলো বিভিন্ন ধরণের প্লাটফর্মের জন্য তৈরি করা হয়, এবং করপোরেট নেটওয়ার্কস, রেসট্রিকটেড নেটওয়ার্কস, ইন্টারনেটের মাধ্যমে ব্যবহার করা হয়, এগুলো খুব ইউজার ফ্রেন্ডলি, ডেটাসেন্ট্রিক, সিকিউরড, এডমিনিস্ট্রটিভ হয় এবং সহজে ম্যানিপুলেট করা যায়। মোটকথা এন্টাপ্রাইজ অ্যাপ্লিকেশন হলো খুব কমপ্লেক্স অ্যাপ্লিকেশন। যেমন- ডাটা স্টোরেজ করা এবং ইউজার রেসট্রিকটেড করা, কাস্টোমার ইনভয়েস, ফ্লাইট বুকিং করা, ব্যাংকিং সিস্টেম অটোমেশন, হেল্থ কেয়ার সিস্টেম এগুলো এন্টারপ্রাইজ অ্যাপ্লিকেশনের উদাহরণ। এগুলোর মাল্টিপল ইন্টারফেজ থাকে পারে, রিমুট কমিউনিকেশন করতে পারে, উন্নত ধরণের গ্রাফিক্যাল ইউজার ইন্টারফেজ থাকে। এটি জাভা স্ট্যান্ডার্ড এডিশনের উপর ভিত্তি করে তৈরি ওয়েব এবং অনেক বড় মাপের এন্টারপ্রাইজ অ্যাপ্লিকেশন তৈরি করার জন্য যে সব কম্পোনেন্ট দরকার হয় তার একটি বিশাল প্যাকেজ। এগুলোকে আলাদা করে নাম দেওয়া হয়েছে জাভা এন্টারপ্রাইজ এডিশন (JEE)। উদাহরণস্বরূপ এর কম্পোনেন্টগুলো হলো-
  • Servlets
  • Java Server Pages (JSP)
  • Java Server Faces (JSF)
  • Enterprise Java Beans (EJB)
  • Java Transaction API (JTA)
  • Java Persistence API (JPA)
  • RESTful Web Services (JAX-RS)
  • Bean Validation
  • Unified Expression Language (EL)
  • Context and Dependency Injection (CDI)
  • Java Message Service message queue API's (JMS)
  • Java WebSocket
  • JSON Processing API (JSON-P)
  • etc.

কিছু এন্টারপ্রাইজ অ্যাপ্লিকেশনের উদাহরণ হলো -

  • কাস্টোমার রিলেশনশিপ ম্যানেজমেন্ট
  • এন্টাপ্রোইজ রিসোর্স প্ল্যানিং
  •  কর্পোরেট আইডেন্টি ম্যানেজমেন্ট
  • কল সেন্টার ও কাস্টোমার সাপোর্ট অ্যাপ্লিকেশন
  • হেল্থ ইনফরমেশন সিস্টেম
  • অটোম্যাটেড বিলিং সিস্টেম
  • ফিনান্সিয়াল, অ্যাকাউন্টিং অ্যাপ্লিকেশন
  • এন্টাপ্রোইজ কন্টেন্ট ম্যানেজমেন্ট
  • বিসনেস প্রসেস ম্যানেজমেন্ট
  • বিসনেস ইন্টেলিজেন্স সফটওয়্যার
  • হিউমেন রিসোর্স ম্যানেজমেন্ট
  • ডকুমেন্ট ম্যানেজমেন্ট সিস্টেম
  • ইন্টারনেট পোর্টাল
ইত্যাদি।
জাভা এন্টারপ্রাইজ এডিশন নিয়ে দ্বিমিকের এই কোর্সটি দেখা যেতে পারে। লিংক: http://dimikcomputing.com/course/javaee-online-course/

প্রশ্নঃ জাভা প্রোগ্রামিং বইয়ে কী কী আছে ?
উত্তরঃ একজন নতুন শিক্ষার্থীর জাভা প্রোগ্রামিং ভাষার যে যে বিষয়গুলোর দিকে নজর দেওয়া উচিৎ সে বিষয়গুলোই এই বইয়ে আলোকপাত করার চেষ্টা করা হয়েছে। বইটি মূলত যারা ইতিমধ্যে একটি প্রোগ্রামিং ভাষা যেমন সি প্রোগ্রামিং ভাষার কিছুটা ধারণা আছে এবং নতুন একটি প্রোগ্রামিং ভাষা বিশেষ করে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভাষা শিখতে চায় তাদের উদ্দেশ্য করে লেখা হয়েছে। এতে অনেকগুলো বিষয় খুবই গুরুত্বপূর্ণ হওয়া সত্যেও বাদ দেওয়া হয়ছে। যেমন - থ্রেড (Thread), জাভা মেমোরি মডেল (Java Memory Model), অ্যানোটেশন প্রসেসিং (Annotation Processing), ল্যামডা এক্সপ্রেশন (Lambda Expression), নেটওয়ার্কিং (Networking) ইত্যাদি। তবে এগুলোর সবগুলো এডভান্স জাভা প্রোগ্রামিংয়ের জন্য প্রয়োজন হয়। পরবর্তী খণ্ডে যুক্ত করার ইচ্ছা পোষণ করছি।
বইটি সম্পর্কে আরো বিস্তারিত পাওয়া যাবে এই লিংকে: https://goo.gl/FpfSvO 

প্রশ্নঃ ওয়েব প্রোগ্রামিংয়ের ক্ষেত্রে জাভার গুরুত্ব কতটুকু?
উত্তরঃ বর্তমানে সব সফ্টওয়্যারগুলোই মূলত ওয়েব বেইজড হয়ে থাকে। ওয়েব বেইজ অ্যাপ্লিকেশন গুলোর দুটো অংশ থাকে। এক- ব্রাউাজারে রিপ্রেজেন্টেশন যাকে ক্লায়েন্ট সাইড বলা হয়। দুই- ব্যাকএন্ড প্রোগ্রামিং। ক্লায়েন্ট প্রোগ্রামিংয়ের জন্য জাভাস্ক্রিপ্ট ছাড়া আর কোনো উপায় এখনো বের হয়নি। সুতরাং আপনি যদি ওয়েব প্রোগ্রামিং ক্ষেত্রে ক্লায়েন্ট সাইডে কাজ করতে চান, তাহলে জাভাস্ক্রিপ্টের প্রতি গুরুত্ব দিতে হবে। জাভা মূলত ব্যবহার হয় ব্যাকএন্ড প্রোগ্রামিংয়ের ক্ষেত্রে। উপরের একটি প্রশ্নের উত্তরে জাভার ব্যবহার উল্লেখ রয়েছে। এছাড়া জাভা কেনো শেখা উচিৎ বা কোথায় কোথায় ব্যবহার হয় তার জন্যে আগের একটি পোস্ট দেখে নিতে পারেন। লিংক: http://www.bazlur.com/2017/01/why-should-we-learn-java.html


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