Friday, March 24, 2017

মাল্টিথ্রেডেড ফাইল কপিয়ার (Multi-threaded file copier)

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

এই দুটি ধারণা থেকে আমরা একটি মাল্টি থ্রেডেড ফাইল কপিয়ার তৈরি করতে পারি। চলুন তাহলে লিখে ফেলা যাক- 


এক্ষেত্রে আমাদের প্রথমে একটি কপিয়ার লাগবে যা একই নির্দিষ্ট পাথ থেকে ফাইল  অন্য একটি পাথে কপি করতে পারে।


এরপর একটি থ্রেড ক্লাস তৈরি করি যা কিনা এই কপি অপারেশন সম্পন্ন করবে। 


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

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


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

এরপর থ্রেডগুলোর রেফারেন্স একটি লিস্টে রাখা হয়েছে এবং একটি লুপরের মাধ্যমে এর join মেথডটি কল করা হয়েছে। 

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

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




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

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() মেথডটি কল করতে হয়। 


চলবে...

Wednesday, March 22, 2017

জাভাতে কীভাবে ফাইল কপি করা যায়(File Copying in Java)

জাভাতে বিভিন্নভাবে ফাইল কপি করা যায়।

প্রথমে ইনপুট স্ট্রিম ব্যবহার করে ফাইল কপি করতে পারি।



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

এতে প্রথমে একটি ইনপুট স্ট্রিম ব্যবহার করা হয়েছে যা দিয়ে ফাইল থেকে ডেটা পড়া হয়, এবং একটি আউটপুট স্ট্রিম ব্যবহার করা হয়েছে যা দিয়ে ডেস্টিনেশন ফাইলে রাইট করা হয়।

ডেটা রিপ্লেস না করতে চাইলে আউটপুট স্ট্রিমকে নিচের মতো তৈরি করা যেতে পারে-

OutputStream os = new FileOutputStream(destFile, true)

এই উদাহরণটি জাভার সকল ভার্সনে চলবে।

এছাড়াও জাভা এনআইও (Java NIO) ব্যবাহার করে আরও দ্রুত ফাইল কপি করা যায়।



তবে জাভা ৭ ও এর পরবর্তীতে আরও সংক্ষিপ্তভাবে কপি করার মেথড রয়েছে।



এতে শুধুমাত্র একটি মেথড দিয়েই ফাইল কপি করা যাচ্ছে -

Files.copy(src, dest); 


সবগুলোকে রান করতে হলে -



এই সম্পর্কে আরও বিস্তারিত জানতে হলে জাভা প্রোগ্রামিং বইটির অধ্যায় ৯ ও ১০ টি পড়া যেতে পারে।

বইটি পাওয়া যাবে : রকমারি ডট কম, ফোন: ১৬২৯৭:  https://goo.gl/FpfSvO

Friday, March 17, 2017

সফটওয়্যার ডেভেলপার এবং সফটওয়্যার ইঞ্জিনিয়ারের মধ্যে পার্থক্য কী (What is the difference between software developer and software engineer)

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

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

ইঞ্জিনিয়ারদের সাধারণত একটি অ্যাকাডেমিক ইঞ্জিনিয়ারিং ডিগ্রী থাকে যেখানে অ্যাকাডেমিক সেটিংসে ৪ বছরের কোনো প্রোগ্রামে তারা যু্ক্ত থাকে। কম্পিউটার ইঞ্জিনিয়ারিংয়ের একটি শাখা হচ্ছে সফটওয়্যার ইঞ্জিনিয়ারিং। এক্ষেত্রে একজন কম্পিউটার ইঞ্জিনিয়ারও সফওয়ার ইঞ্জিনিয়ার হিসেবে কাজ করতে পারে। 

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

সহজ কথায় বলতে গেলে -

সফটওয়্যার ইঞ্জিনিয়ার = ইঞ্জিনিয়ারিং প্রিন্সিপাল + ডিসিপ্লিন + আরও অনেক কিছু + সফটওয়্যার ডেভেলপার।

সফটওয়্যার ডেভেলপারেরও এই প্রিন্সিপাল ও ডিসিপ্লিন থাকতেও পারে, সেক্ষেত্রে সেগুলো সে নিজে নিজে শিখে নিতে পারে। 

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

তবে টাইটেল নিয়ে খুব বেশি বিচলিত হওয়ার কিছু নেই। বিভিন্ন কোম্পানি বিভিন্নভাবে নামকরণ করে থাকে। 

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

এখানে একটি বিষয় মনে রাখতে হবে যে, সফটওয়্যার ইঞ্জিনিয়ারিং শুধুমাত্র প্রোগ্রামিং নয় ।

পরবর্তী পর্বে সফটওয়্যার ইঞ্জিনিয়ারিং পুরো পক্রিয়া ব্যাখ্যা করার চেষ্টা করবো।

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();
        }