Tuesday, March 7, 2017

জাভাতে 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();
        }




Sunday, February 26, 2017

কোডিং কনভেনশন (coding convention)

আমরা যে কোডগুলো লিখি সেগুলো সাধারণত হাইলেভেল(high-level) প্রোগ্রামিং ভাষায় (যেমন- জাভা)। এর প্রধাণ কারণ, হাইলেভেল প্রোগ্রামিং ভাষাগুলো মানুষের ভাষার কাছাকাছি। এতে করে আমাদের বোঝার সুবিধা হয়। একজন আরেকজনের সহজে কোড পড়তে ও বুঝতে পারে। এইকোডগুলো এজন্যই এভাবে লেখা হয়। কম্পিউটার কিন্তু আমাদের এই হাইলেভেল কোডগুলো বুঝতে পারেনা, এজন্য কম্পাইলারের দরকার হয়। আমাদের কোডগুলো কম্পাইল করার পর মেশিন যাতে বুঝতে পারে এমন কোডে রূপান্তরিত করা হয়। 

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

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

জাভা প্রোগ্রামিংয়ের জন্য এরকম বেশকিছু নিয়ম বা কনভেনশন রয়েছে। নিচে জাভা কনভেনশনের কতগুলো লিংক দেওয়া হলো- 


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


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

Monday, February 20, 2017

নাল (null in Java)

জাভাতে নাল (null) একটি সংরক্ষিত কিওয়ার্ড। আমরা জানি যে, যেকোনো অবজেক্টের একটি রেফারেন্স থাকে। একটি ক্লাস থেকে প্রথমে একটি অবজেক্ট তৈরি করা হয়। সেই অবজেক্টকে আমরা রেফারেন্স দিয়ে অ্যাকসেস করতে পারি। যেমন,

Person person1 = new Person("Bazlur", "Rahman");

এখানে new অপারেটর দিয়ে একটি Person অবজেক্ট তৈরি করা হয়েছে। person1 হচ্ছে সেই অবজেক্টের রেফারেন্স।

Person person2;

এখানে person2 একটি রেফারেন্স। কিন্তু এটি কোনো অবজেক্টকে রেফার করে না। কারণ person2 এর জন্য কোনো অবজেক্ট তৈরি করা হয় নি। এই রকম কোনো রেফারেন্স যদি কোনো অবজেক্টকে রেফারেন্স না করে, তাহলে আমরা বলি এটি একটি নাল রেফারেন্স (Null Reference)। এই রেফারন্সটি কাউকে রেফার করে না।

উপরের person2 একটি নাল (null) বা নাল রেফারেন্স (Null Reference)। এই রেফারেন্স দিয়ে কোনো কাজ করার উপায় নেই। কারণ এর মধ্যে আসলে কিছু নেই। যদি এই রেফারেন্স দিয়ে আমরা কোনো কাজ করতে চাই, তাহলে জাভা ভার্চুয়াল মেশিন NullPointerException থ্রো করবে।

if (person2 != null) {
      System.out.println(person2.getFullName());
}

এই এক্সেপশন থেকে বাঁচতে হলে একটি if স্টেটমেন্ট ব্যবহার করে যাচাই করা যেতে পারে যে, রেফারেন্সটি null কিনা।

জাভা দিয়ে ওয়েব ক্রলার (Java Web Crawler Implementation)

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

জাভা দিয়ে এটি তৈরি করার সময় বেশ কতগুলো বিষয় অর্থাৎ ডিজাইন নিয়ে চিন্তা করা যায়। যেমন -
১. এটি সিঙ্গেল থ্রেডেড (Single threaded,) ও সিনক্রোনাস (synchronous) হতে পারে।
২. মাল্টি থ্রেডেড (multi threaded ) ও কনকারেন্ট (concurrent) হতে পারে।
৩. জাভা ইনপুট/আউটপুটের(I/O) জন্যে স্ট্রিম বেইজড বা নিউআইও(NIO) এর বাফার ও চ্যানেল বেইজড হতে পারে।

শুধুমাত্র ফান প্রজেক্ট হিসেবে করতে চাইলে প্রত্যেকটি কম্বিনেশনের জন্যে আলাদা আলাদা করে তৈরি করা যেতে পারে।

সিঙ্গেল থ্রেডেড ও সিনক্রোনাস ক্রলারের তৈরি করা সহজ। এটি তৈরি করতে হলে নিচের কাজগুলো করতে হবে -
১. প্রথমে একটি ওয়েব অ্যাড্রেস থেকে HTML পেইজ ডাউনলোড করতে হবে।
২. HTML পেইজকে পার্স(parse) করতে হবে।
৩. পার্স করারপর প্রয়োজনীয় তথ্যগুলো আলাদা করতে হবে।
৪. পেইজে আরও কোনো লিংক থাকলে সেগুলো আলাদা করতে হবে।
৫. সেই লিংক থেকে আবার ১ নং এর মতো পুরো প্রক্রিয়াটি শুরু করতে হবে।

এই রকম একটি উদাহরণ পাওয়া যাবে এই লিংকে : https://goo.gl/0EiQnC

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

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

এটি রান করতে হলে আপনার মেশিনে যে যে টুলগুলো থাকবে হবে সেগুলো হলো -
১. গিট (Git)
২. গ্রাডল (Gradle)
৩. জাভা ৮

এটি একটি সংক্ষিপ্ত প্রজেক্ট যাতে ৪ টি ক্লাস রয়েছে এবং দুটি ইন্টারফেস রয়েছে।

মূল অংশ শুরু হবে নিচের ক্লাস থেকে -


এতে প্রথমে একটি বেইজ ইউআরএল দিতে হবে যে ওয়েব সাইট থেকে ক্রল শুরু করবে।

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

সোর্সকোডটি পড়ে বোঝার চেষ্টা করুন। কোনো ফিডব্যাক বা উন্নতি করার উপায় থাকলে ক্লোন করে পুল রিকোয়েস্ট পাঠাতে পারেন। 

Sunday, February 19, 2017

স্ট্রিং পুল কী (What is String Pool)

জাভা ভার্চুয়াল মেশিনে মেমোরি মডেল (Memory Model) দুই ভাবে বিভক্ত। এরা হলো হিপ এবং থ্রেড স্ট্যাক। জাভা অ্যাপ্লিকেশনে যত ধরনের অবজেক্ট তৈরি হয়, সেগুলোর সব থাকে হিপে। স্ট্রিং পুল (String Pool) জাভা হিপের একটি বিশেষ এলাকা।

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

একটি স্ট্রিং অবজেক্টে থাকে একটি ক্যারেক্টার অ্যারে এবং একটি ইন্টিজার হ্যাশ (Hash)। ইন্টিজারের জন্য দরকার হয় 4 বাইট এবং ক্যারেক্টারের জন্য দরকার হয় 2 বাইট। সুতরাং একটি স্ট্রিংয়ে যদি n সংখ্যক ক্যারেক্টার থাকে তাহলে,


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

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

String string1 = "abcd";

String string2 = "abcd";

উপরের দুটি লাইনের জন্য যদিও দুটি অবেজেক্ট থাকার কথা, কিন্তু আসলে জাভা হিপে একটি স্ট্রিং অবজেক্টই থাকবে, দুটি তৈরি হবে না।

তবে new অপারেটর ও কনস্ট্রাক্টর ব্যবহার করে স্ট্রিং তৈরি করলে তা স্ট্রিং পুলে যায় না।

String str = new String("str");

উপরের লাইনটি আসলে দুটি স্ট্রিং তৈরি করে। এটিকে এভাবে লেখা যায়,

String usingLiteral = "str"; // its in the pool

String newString = new String(usingLiteral); // not in the pool

সুতরাং দেখা যাচ্ছে যে এভাবে স্ট্রিং তৈরি করলে সবসময় অতিরিক্তি স্ট্রিং তৈরি হচ্ছে যা মোটেও কাম্য নয়। সুতরাং স্ট্রিং তৈরি করার জন্য সবসময় লিটারেল ব্যবহার করুন।

এখন যদি স্ট্রিং ইমিউটেবল না হয়, তাহলে একটি স্ট্রিং যদি পরিবর্তন করি, তাহলে আসলে অন্যান্য রেফারেন্সগুলোও পরিবর্তন হয়ে যাবে।

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

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

তাছাড়া স্ট্রিং ইমিউটেবল হওয়ায় এটি স্বাভাবিকভাবে থ্রেড সেইফ (Thread safe) এবং স্বাধীনভাবে যেকোনো থ্রেড অ্যাকসেস করে পারে। এতে করে আমাদেরকে কষ্ট করে এর থ্রেড সেইফটি নিয়ে চিন্তা করতে হয় না।