বাংলা ফন্ট দেখতে সমস্যা হচ্ছে?

যেভাবে সমাধান করবেনঃ 

আপনার ব্রাউজার যদি google chrome হয়-

স্টেপ-১ঃ
সিয়াম রূপালি ফন্টটি ডাউনলোড করুন। পাবেন এখানে (Download)। ডাউনলোড করা ফাইলটির উপর ডাবল ক্লিক করে এর ‘ইনস্টল’ বাটনে ক্লিক করে ফন্টটি ইনস্টল করে নিন।

স্টেপ-২ঃ
google chrome এর সেটিংস অপশনে যান। খুঁজে পাবেন ছবিতে মার্ক করা বাটনে ক্লিক করার পর।

স্টেপ-৩ঃ
তারপর ক্রমের ‘সেটিংস’ থেকে ‘শো অ্যাডভান্সড সেটিংস’ সিলেক্ট করুন। 
স্টেপ-৪ঃ
ওয়েব কনটেন্ট’ মেন্যুতে  খুঁজে নিন। ‘ ‘Customize Fonts’ এ ক্লিক করুন। ক্লিক করলে ফন্ট মেন্যু আসবে।



স্টেপ-৫ঃ 
এখান থেকে ‘Standard Font’, ‘Serif Font’ ,  ‘Sans-serif Font’ 
ও 'Fixed-width font পরিবর্তন করে ‘Siyam Rupali’ নির্বাচন করে ‘Done’ বাটনে ক্লিক। খেলা শেষ!!! 

পথ নির্দেশনা : চাকরির প্রস্তুতি গ্রহন

মূল লিখাটি শ্রদ্ধেয় ইমতিয়াজ হোসেন ইমু ভাই এর। পরিবর্তন-পরিবর্ধনের কাজ করেছেন এই অধম।

ভূমিকা:

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

কি টেকনোলজি চলছে, কোনটা স্ট্যাবল, কি তাদের স্কোপ, প্লাটফর্ম সব বিষয় বিবেচনা করতে হবে। অনেকেই ভাববে ভাই ফ্রেশার হয়ে ঢুকবো। ছুঁচ হয়ে ঢুকে ফাল হয়ে বের হবো। সমস্যা হলো মার্কেটে অনেক কোম্পানির (ভার্সিটির) সূঁচ আছে। ধারালো তাদের আগা। আপনি চেষ্টা করলেও সবসময় পেরে উঠবেন না। অফিস পলিটিক্স, কলিগ, পরিবেশ, ওয়ার্ক ইনভায়রোনমেন্ট অনেক কিছুই প্রতিকূলতা সৃষ্টি করতে পারে। এজন্য কিছু বিষয়ে আগে থেকেই জ্ঞান থাকা দরকার। 


কি কি প্ল্যাটফর্ম অাছে?:

কি কি প্ল্যাটফর্ম অাছে সেটি দেখার সবচেয়ে সহজ উপায় হচ্ছে কোনো একটি জব পোর্টালে চোখ রাখা। বাংলাদেশের সবচেয়ে বড় জব পোর্টাল বিডিজবস কে ফলো করলে কয়েকটাইপের জব দেখতে পাবেন। যেমনঃ-
  • Web developer 
    • Frontend 
    • Backend 
    • FullStack 
    • DevOps 
  • SQA ( software quality assurance) 
  • UI Developer 
  • UX Developer 
  • Software Architect 
  • Graphics Designer 
  • Game Developer 
  • iOS - Android 
  • Javascript Developer 
  • Business Analyst 
  • Network Engineer 
  • Database Administrator (DBA) 
  • Data Scientist 
  • Telecom Sector 


কোনটার স্কোপ কি?:

নীচে ধারাবাহিকভাবে সব কয়টি টেকনোলোজির সংক্ষিপ্ত আলোচনা করা হয়েছে।


Web developer:

সবাই ক্যরিয়ারের শুরুতে এটাকেই মূল চাকরির উপায় ধরে নেয়। আমিও ব্যাতিক্রম না। ওয়েবে কয়েক ধরণের আবার ভাগ আছে। সেটা উপরে বলেছিই। ওয়েব ডেভেলপমেন্ট হচ্ছে একটা ওয়েব এ্যপ্লিকেশন বানানো থেকে শুরু করে এই ইন্টারনেটে এ্যাবেইল্যাবল করার সব কাজ। এখন এ ওয়েব ডেভেলপার বলতে কি বুঝি? ওয়েব রিলেটেড যা কিছু মোটামুটি যত কাজ আছে, ওয়েব ডেভেলপারের কাজ হচ্ছে সেগুলো করা। যেমনঃ কন্টেন্ট ম্যানেজম্যান্ট সিস্টেম, ইনভেন্টরি, POS, সোশ্যাল মিডিয়া ব্লা ব্লা। একটা ওয়েব এ্যাপ্লিকেশনের এই কাজগুলোকে দুই ভাগে ভাগ করা হয়।
  • Frontend
  • Backend

এই ওয়েব এ্যপ্লিকেশন গুলো বানানো হয় কি দিয়ে? অনেক ল্যাঙ্গুয়েজ আছে। বিভিন্নটার কাজ বিভিন্ন। সহজলভ্যতার কথা যদি চিন্তা করি তবে প্রথমেই বলতে হবে PHP এর নাম। এরপরে আরো অনেক আছে। হাইলেভেলের কথা যদি বলি তবে Java, C#। স্ক্রিপ্টিং এ Python, PHP, Ruby। স্ক্রিপ্টিং ল্যাঙ্গুয়েজের সাথে জাভা বা সিশার্পের পার্থক্য খুঁজে আপনারাই খুঁজে নিন।



Backend:

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

PHP
  • Laravel (বর্তমানে বেশ জনপ্রিয়)
  • Codeigniter
  • CakePHP
  • Symphony
  • Zend
Java
  • Spring
  • Struts
  • JSF
  • Hibernate (Hibernate কে বলা হয় RDMS tool)
Python
  • Django
  • Flask
  • DRF
Ruby
  • Rails
C#
  • .NET MVC
  • EntityFramework

এই ফ্রেমওয়ার্ক কি?

সহজ ভাষায় আপনার কাজ সহজ করার জন্য একটা টুল। যেমন ধরেন: আপনি RAG ডে এর জন্য গেঞ্জি বানাবেন। এখন গেঞ্জির ডিজাইন যখন দোকানদারকে দেন তখন সে কিন্তু প্রত্যেক গেঞ্জির জন্য বারবার ওই ডিজাইনের ছাঁচ বানাবে না। সে ওই ছাঁচ বানাতে প্রয়োজনীয় উপকরণ নিয়ে একটা ইউনিভার্সাল ছাঁচ বানাবে যা সব ওই গেঞ্জির criteria কে fulfill করবে। অর্থাৎ ১০ গেঞ্জি বানালেও যে ছাঁচ তেমনি ১০০০ গেঞ্জি বানালেও একই ছাঁচ। ফ্রেমওয়ার্ক অনেকটা এরকম। সবকিছু প্যাকেট করা আছে। প্রয়োজন মতো নিবেন আর প্যাকেট খুলে সারপ্রাইজড হবেন। এই আনালজির সাথে মিলালে আমরা বলতে পারি Java'র Spring MVC Framework হচ্ছে MVC বেইজড ওয়েব এ্যপ্লিকেশন বানানোর একধরনের ছাঁচ বা টেম্পলেট। আপনি ওদের কনভেনশন অনুযায়ী ফাইল স্টাকচার বানাবেন এবং কোড করবেন, একটি ওয়েব এ্যপ্লিকেশন হয়ে যাবে।

কোন ল্যাঙ্গুয়েজ শিখবেন বা কোন ফ্রেমওয়ার্ক? এটা জানার জন্য আপনাকে প্রথমে বুঝতে হবে আপনার প্রজেক্ট কত বড়, প্রজেক্টের স্কোপ কি। সব কাজ যদি এক ল্যাঙ্গুয়েজে হতো তবে এতো ল্যাঙ্গুয়েজের দরকার হতো না। ফেসবুক PHP তে এটা ঠিক না। এর বিভিন্ন লেয়ারে বিভিন্ন ল্যাঙ্গুয়েজের ব্যবহার রয়েছে। python আছে, scala আছে। গিটহাবের মতো ভার্সন কন্ট্রোল সিস্টেম Ruby on Rails এ বানানো। ব্যাংকিং সফটওয়্যারগুলোর অধিকাংশই জাভা, C# এর দ্বারা তৈরী। বড় অ্যাপ্লিকেশনের জন্য জাভার কোড ভালো মেইনটেইন করা যায় যায়। এজন্য প্রায়োরিটি বেশি। বাংলাদেশে C# এর ভালো চাহিদা আছে। ফ্রেশার হিসেবে জাভাতে বাংলাদেশে স্ট্রাগল করতে হয় বেশি।



Frontend?:

সহজে বলি, আপনার ওয়েব অ্যাপ্লিকেশনের ব্যবহারকারিরা যা দেখে তাই ফ্রন্টএন্ড। ফেসবুকের যা দেখছেন তা ফ্রন্ট এন্ড। আপনার নটিফিকেশন আসছে এটা আপনি যে সুন্দর করে দেখছেন সেটা ফ্রন্টএন্ড, আপনার কাছে যে নটিফিকেশন আসছে সেটার ডাটা পাঠাচ্ছে ব্যাকএন্ড।
মূলত ফ্রন্টএন্ড বলতে আমরা বুঝি HTML, CSS, Javascript ইত্যাদি। আসলে এদেরও অনেক ফ্রেমওয়ার্ক আছে। যেমন ধরেন CSS এ Bootstrap, SASS. Javascript এ তো A-Z দিয়ে সব বর্ণেই প্রায় ফ্রেমওয়ার্ক আছে। বাজারে চলছে কি? বাজারে চলছে Fogg. না ভাই Fogg না চলছে AngularJS, ReactJS, EmberJS, MeteorJS, BackboneJS, NodeJs (serverside), AureliaJS, VueJs

কোনটা শিখবেন তাই তো? AngularJS, ReactJS কড়া ফর্মে আছে। React ফেসবুকের আর লার্ণিং কার্ভ খুব সহজ। ডকুমেন্টেশন ভালো, স্ট্যাবল রিলিজ আছে। অন্যদিকে Angular গুগলের, লার্ণিং কার্ভ শুরুতে সহজ, তারপরে হার্ড। অ্যাংগুলার ১ বেশ স্ট্যাবল কিন্তু deprecated হয়ে যাবে। মানে সাপোর্ট থাকবে না। অন্যদিকে Angular 2 অন্যসব কিছুর চেয়ে ফাস্ট। কিন্তু স্ট্যাবল না, ১ থেকে পুরোপুরি চেঞ্জ ২ নাম্বার ভার্সন। সুতরাং যারা ১ করেছে তাদের নতুন করে শিখতে হবে ২ একটা নতুন ফ্রেমওয়ার্ক হিসেবে। VueJs নিয়ে PHP মহলে বেশ নামডাক আছে।

ব্যবহার করবেন কিভাবে সেটা ভাবছেন তো? আজকাল সব ওয়েব অ্যাপ্লিকেশন গুলো হয়ে যাচ্ছে API বেইসড। API জিনিসটা হলো একটা কন্ট্রাক্ট পেপার। সেখানে লেখা থাকে যে আপনার কি কি জিনিস আছে, তাদের কে কিভাবে আপনি হস্তগত করবেন, কিভাবে ব্যবহার করবেন। অর্থাৎ API এ ওয়েব অ্যাপের বিভিন্ন ফিচারগুলো একটা লিস্ট আছে। আপনি কল করবেন আর পাবেন। কিভাবে কল করা হয়? API প্রোভাইডার এর কাছে আপনি API এন্ড পয়েন্ট(URL) পাবেন, এবং প্রয়োজনীয়া ডাটা সহ এই এন্ড পয়েন্টে হিট করবেন। ঠিক যেমন কন্ট্রাক্ট করবেন আর মালামাল নেবেন। API বেইসড অ্যাপের সুবিধা কি? সুবিধা হলো API শুধু আপনাকে ডাটা দিচ্ছে, কোনো ধরনের ভিউ(Html বা অন্যান্য UI) পাঠাচ্ছে না। এই কারণে একই API একই ওয়েব অ্যাপ, মোবাইল অ্যাপ সব জায়গায়ই ব্যবহার করতে পারবেন। C# দিয়ে বানানো API আপনি আপনার Java বা Php যে কোনো ধরনের এ্যাপ্লিকেশনে ব্যবহার করতে পারছেন। এখন, API হলো কোন ধরণের ভিউ ছাড়া। তাহলে ইউজার কল করবে কিভাবে? এখানেই আসে আমাদের Frontend Framework. সে আপনার ভিউ হিসেবে কাজ করে। তারপরে এই API এর URL কে কল করে। যা ডাটা আসে তা আবার Frontend Framework ইউজারকে দেখায়। মোবাইলেও একই। মোবাইলেও সব কিছু API এর মাধ্যমে হয়।



UX Developer:

এদের বাজারে ভালো চাহিদা আছে। এই কাজের জন্য দরকার প্রচুর Imaginary Power. আপনাকে বিভিন্ন সাইট/পেজ ঘুরতে হবে। বুঝতে হবে ইউজার কি চায়। সে অনুযায়ী প্রোডাক্ট লেআউট বানাতে হবে। এগুলার জন্য বিশেষত ট্যুল ব্যবহার করতে হয়। Adobe Photoshop/Illustrator. এরা Brochure, Flyer, Visiting Card, Web Template, Logo এসব বানায়॥ এদের স্বর্গভুমি হলো: 99designs.com



UI Developer:

সবাই এদের তুচ্ছ জ্ঞান করে। এরা আসলে একেকটা মাল। এদের উপর আপনার কাজের সবকিছু নির্ভর করে। কারণ এদের বানানো জিনিসই ইউজার খাবে। আপনি ব্যাকএন্ডে কেমনে ডাটা সেভ করতেছেন সেটা ইউজারে মাথা ব্যাখা না। তার মাথাব্যাথা হলো যে বাটনে ক্লিক করলে ডাটাটা সেভ করছেন সেটা কেন হাতের কাছে নেই। এই হাতের কাছে আনার দায়িত্ব এই ব্যাটার। ইউজাররে সুন্দর একটা বাটন তার হাতের নাগালে HTML, CSS, JS দিয়ে তুলে ধরাই এদের কাজ। অর্থাৎ একজন UX developer একটা ওয়েবসাইটের টেমপ্লেট .psd ফরম্যাটে বানায়া দিলো। এখন UI developer এর কাজ হবে এটাকে responsive করে মানে সব ডিভাইসের জন্য compitable করে HTML, CSS, JS লেখা। বাংলাদেশে যেহেতু সবাই এদের তুচ্ছ জ্ঞান করে সেহেতু স্যালারি কম এদের।



SQA Engineer (Software Quality Assurance Engineer):

বাংলাদেশে সব মাঝারি থেকে বড় কোম্ম্পানিতে এদের চাহিদা আছে। কাজটা কি? ধরেন উপরে বর্র্ণিত ডেভেলপাররা ফেসবুক বানিয়েছেন। এখন এর সবকিছু ঠিকমতো কাজ করছে কিনা তা টেস্ট করে তারপরে মার্কেটে ছাড়তে হবে। বাটন কাজ করছে কিনা, ফ্রেন্ড রিকু পাঠালে আরেকজন পাচ্ছে কিনা। এই টেস্ট গুলো করার কাজ করেন এই ভদ্রলোকেরা। Blackbox test, White Box testt, Salenium test, Unit test, Automotion test এবং সবার শেষে Manual test। আজকাল সব বড় ল্যাঙ্গুয়েজই তাদের ফ্রেমওয়ার্কে Test code লেখার অপশন দেয়। এটাকে বলে automated testing. ডেভেলপাররাই তাদের ফিচারের কোড টেস্ট করার জন্য টেস্স্ট কোড লিখবে। আগে টেস্ট কোড পরে ফিচার কোড লেখার অভ্যাস বা সিস্টেম হলো TDD। SQA দের কি ধরনের দক্ষতা লাগে? বেসিক প্রোগ্রামিং জ্ঞান তো অবশ্যই লাগবে। এর সাথে সাথে টেস্টিং নিয়ে ভালো আইডিয়া থাকতে হবে। কোনটা কোন ধরনের টেস্টিং, কোন ধরনের টেস্টিং এ এ কি ধরনের কাজ হয়। টেস্ট কেস কি, কিভাবে টেস্ট কেস লিখতে হয় এই সব।



Android Developer:

ঢাকায় যেকোন একটা প্রাইভেট ইউনিভার্সিটির নিচের একটা গাছ ধরে ঝাঁকি দেবেন, পাতার বদলে অনেকগুলা Android ডেভেলপার বের হবে। দক্ষ কজন তা নিয়ে যথেষ্ট সন্দেহ আছে। কোড করবেন Java দিয়ে। নরম্যাল HTML, CSS এর বদলে ব্যবহার করবেন GridView, LayoutView, ListView. আমি কখনো এ প্লাটফর্মে কাজ করি নি। তবে বলতে পারি যে বাংলাদেশে সবাই Andorid SDK দিয়ে Hello World লিখতে পারলেই নিজেকে Android Dev ভাবা শুরু করে। ফিল্ড টা অনেক ভাস্ট। বাজারে চাহিদাও আছে। কিন্তু উপযুক্ত লোকের খুব অভাব। কিছুদিন আগে Android ডেভেলপমেন্টের জন্য গুগল তার নিজস্বঃ ল্যাঙ্গুয়েজ Kotlin নিয়ে আসছে।



iOS Developer:

Aristocrat মানুষের জিনিস। কোড করবেন Objective C অথবা Swift এ। আগে মানুষ Titanium এ করতো। কিন্তু হঠাৎ করে titanium কমার্শিয়াল হয়ে গেলো। বাদ। Swift is good. Library rich. মানুষ কোড করছে। বাংলাদেশে কাজও হচ্ছে বেশ। বাজারে চাহিদা আছে ডেভেলপারদের। অ্যাপস্টোরে অ্যাপের চাহিদা আছে। Android এর মতো অপ্রয়োজনীয় অ্যপ দিয়া মার্কেটপ্লেস ভরা না। তাই মর্যাদার সাথে ডেভেলপার এবং ইউজার ব্যবহার করছে।



BA(Business Analyst):

সফটওয়্যার ইন্ডাস্ট্রিতে যেখানে অন্যান্য প্লাটফর্মগুলোর সুনির্দিষ্ট Carrier Path ও Job Description আছে, BA দের ক্ষেত্রে ভিন্ন ভিন্ন কোম্পানির জন্য Carrier Path ও Job Description ভিন্ন ভিন্ন হতে পারে। একজন তুখোড় BA ক্লায়েন্টের রিকয়ারমেন্টগুলো তাদের থেকে বুঝে নিয়ে তার টিমের সফটওয়্যার ডেভোলপারদের বুঝিয়ে দেন। তাই বলা যায় একজন BA হচ্ছেন ক্লায়েন্ট এবং টেকনিক্যাল লোকজনের মধ্যে ব্রিজ সরূপ। BA দের প্রধান দক্ষতা হতে হয় যোগাযোগের দক্ষতা, যার কমিউনিকেশনের স্কিল যত ভালো তার ভালো করার সম্ভবনা তত বেশি। এই গোত্রের লোকজনদের ইংরেজিতে খুবই দক্ষ হতে হয়। এই কারণে দেখা যায় প্রথম সারির কোম্পানিগুলো BA নিয়োগের ক্ষেত্রে ইংরেজি মাধ্যমে যারা পড়াশুনা করেছেন তাদের প্রাধ্যান্য দেন। আমি যে কোম্পানিতে এখন আছি এখানকার প্রায় ৯৮ ভাগ BA দের পড়াশুনার মাধ্যম ছিল ইংরেজি।



DevOps:

এদের চল বাংলাদেশে এখনো হয়ে উঠেনি। তবে উন্নত দেশে এদের আকাশচুম্বি দাম। এদের কাজ সব সার্ভারে। এরা আপনার কোড বেইস ডেভেলপমেন্ট স্টেজ থেকে নিয়ে প্রোডাকশনে দেবে। তার জন্য সার্ভারে যে যে কাজ করা দরকার তা করবে। কোন একস্ট্রা সার্ভিস, যেমন ধরেন আপনার সফটওয়্যারটি একই সাথে কত মানুষের লোড নিতে পারবে সেটা অনুযায়ূী সে লোড ব্যালেন্সার সার্ভিস কনফিগার করবে। ডাটাবেস যদি কোন কারণে মরে যাওয়ার সম্ভাবনা থাকে তবে তার ব্যাকআপ নেয়ার দায়িত্বও এই লোকের। FullStack: এরা ভাই মানুষ না। পশু। এরা সব পারে। মানে যখন দরকার সে Frontend Dev, দরকারে সে Backend Dev, দরকারে সে DevOps. সমস্যা হলো বাংলাদেশে সবাই এতোই ট্যালেন্ট যে এরা এদের স্বল্প জ্ঞান নিয়েই FullStack Dev.



Software Architect:

সত্যি বলতে বাংলাদেশে গুটিকয়েক আছে। এদের কাজের লেভেল অন্য গ্রহের। আমার কাছে এরা CSE এর রকেট সাইন্টিস্ট। আমি এদের সম্পর্কে বলে নিজে ছোট হতে চাচ্ছি না, নাম দেখে ফলে পরিচয়। অভিজ্ঞতা আর একাগ্রতা একজন Software Architect হয় উঠার চাবিকাঠি।



Data Scientist:

কঠিন টার্ম। কঠিন ফিল্ড। হার্ড ওয়ার্ক করতে করতে জীবন শেষ। ডাটা স্ক্রাপিং, ডাটা ক্লিনিং করতে করতে জীবন শেষ। ভাববেন বুঝি এই শেষ। এই শেষ শেষ না, কষ্ট সবে শুরু। এর পরে ভিজ্যুয়ালাইজেশন, ইমপিউটেশন, মেশিন লার্ণিং, স্ট্যাটিসটিকস, ম্যাথ, অ্যালগোরিদম কি নাই। হতাশ হওয়া যাবে না। সামনে এরই যুগ। আপনি আগায় থাকেন। কষ্ট হবে। কেষ্ট পাবেন পরে। বাংলাদেশে টেকনোলজি আসে ৩ বছর দেরীতে। ২০১৩ সালে পাইথনের Django ফ্রেমওয়ার্ক বাজার কাপাইছি ওয়েস্টার্ণ ওয়ার্ল্ডে। সেখানে আমরা ২০১৬ এর মাঝামাঝি এসে পাইথন নিয়া লাফানো শুরু করেছি। এই ফিল্ডে আপনার জন্য সবচেয়ে বেশি যেটা লাগবে সেটা হলো Python, R. Data Scraping এর জন্য পাইথনের জুড়ি মেলা ভার। আর R ব্যবহার করে ডাটার উপর অ্যানালাইসিস চালাবেন। দুর্দান্ত সার্ভিস। বাংলাদেশে হাতে গোণা কয়েকটা কোম্পানি বিগ ডাটা নিয়ে কাজ করে। Hadoop এর যুগ শেষ প্রায়, এখন Apache Spark এর যুগ। Scala ও কম যায় না। আমি টার্ম বলে যাবো। পড়া লেখার দায়িত্ব আপনার। বাজার বিচার আপনারে করতে হবে। কিছু কোম্পানি চুপেচাপে কিছু কাজ করছে। সেটাও লোকমুখে শোনা। পৃথিবীতে সবেচেয়ে বেশী বেতন নেওয়া পোস্ট হচ্ছে Data Scientist



DBA(Database Administrator):

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



এছাড়াও কিছু আরো কাজ আছে।

  • (১) Cross-platform Mobile Application: এদের মানে হলো, এমন একটা অ্যাপ বানানো যেটা একই সাথে iOS এবং Android এবং Windows ফোনে চলে। এটার জন্য আপনার কাছে অনেক অপশন আছে। বহুল প্রচলিত হলো, Ionic (Angular1,2), NativeScript (Angualr 2), Xamarin
  • (২) রিসার্চার: সবাই এটা হতে পারেনা। এটা সবার জন্যও না। অনেক ধৈর্য পড়ার ক্ষমতা থাকতে হবে। বিশ্লেষণী ক্ষমতা থাকতে হবে। আমার এতো ক্ষমতা নেই। আমি এই কাজে তাই পা বাড়াইনি। তবে Natural language Processing নিয়ে একটা কাজ করেছিলাম ব্যাচমেট রাতুলের সাথে। ডাটা অ্যানালাইসিস এর একটা কাজ। তখন তো এতো কিছু জানতাম না। নাহলে হয়তো কিছু একটা করা যেতো।
  • (৩) বাজারে অনেকেই Hype driven development করে। যেমন: বলবে OOP এর যুগ শেষ, এখন Functional programming এর যুগ। Elixir শিখো। Clozure শিখো। কেউ বলবে Go lang দেখো। খুব Promising. কানেও নিবেন না। সব কথার উর্ধে একটা কথাই। কোড করতে হবে বাছা। ঘাড় গুঁজে প্রোগ্রামিং করতে হবে। কন্টেস্ট করতে হবে। যেটা মনে চায় কর বাপ, কিন্তু কোডিং বাদ দিস না। পেট আপনা আপনি চলবে। একটা কথা বলি, “kids, don't buy drugs. Become a pop star, and they give you them for free!” তেমনি পেটের দায়ে কোড কইরো না বাচ্চারা, কোডার হও দেখবা ওরাই পেটের জিনিস দিয়া যাইতেছে।

অনেক কথা বললাম, অনেক ভুল বলেও থাকতে পারি। মনে নেয়ার কিছু নাই। Happy Coding.


জাভাঃ String ক্লাসের গল্প

জাভা String ক্লাস বোধহয় জাভার বহূল ব্যাবহৃত ক্লাস।  প্রোগ্রামের চিপা-চাপা প্রায় সব জায়গাতে আপনি এই ভদ্রলোককে খুজে পাবেন। চিন্তা করুন, প্রোগ্রামে যত বার String ব্যাবহার করেছেন আপনার মাথায় ততগুলো চুল আছে?

String ক্লাস হচ্ছে জাভার java.lang প্যাকেজের সদস্য। এই ক্লাস "ক্যারেক্টার স্ট্রিং" কে রিপ্রেজেন্ট করে।

কিভাবে String ক্লাসের অবজেক্ট বানাব?

String যেহেতু ক্লাস। যত গুলো স্ট্রিং আপনি প্রোগ্রামে ডিক্লেয়ার করেন তারা এই ক্লাসের অবজেক্ট। যেমন এখানে ("letters" , "the quick brown") দুইটি String ক্লাসের অবজেক্ট আছে।

আমরা new অপারেটর ব্যাবহারের মাধ্যমে, এ্যাসাইনমেন্ট অপারেটরের(=) মাধ্যমে বা কোটেশনের ("") মাধ্যমে String ডিক্লেয়ার করতে পারি। যেমনঃ

String str1 = new String("good boy");
String str2 = "bad boy";
System.out.println("Hello world!");
আপনি overloaded কনস্টাক্টরের মাধ্যমেও String ডিক্লেয়ার করতে পারেন। যেমনঃ
String str1 = new String( "John Snow" );
char[] name = new char[]{ 'J', 'o', 'h', 'n', ' ', 'S', 'n', 'o', 'w' };
String lordCommander = new String( name );
(String কনস্ট্রাক্টর,  যেটি Character Array কে প্যারামিটার হিসেবে নেয়)
StringBuilder sb = new StringBuilder( "String Builder" );
String str1 = new String( sb );
(String কনস্ট্রাক্টর,  যেটি StringBuilder অবজেক্ট কে প্যারামিটার হিসেবে নেয়)
StringBuffer  sbf = new StringBuffer( "String Buffer" );
String str2= new String( sbf );
(String কনস্ট্রাক্টর,  যেটি StringBuffer অবজেক্ট কে প্যারামিটার হিসেবে নেয়)

String ক্লাস immutable?
হ্যাঁ String ক্লাস immutable। এটি মনে রাখার মত একটি পয়েন্ট। ভূলবেন না কিন্তু। immutable বলতে বুঝায় একবার অবজেক্ট তৈরী হয়ে যাওয়ার পর এর কন্টেন্ট কোনো ভাবে পরিবর্তন করা যাবে না। যেমনঃ
String str1= "winter is coming";
অবজেক্ট str1 এর কন্টেন্ট "winter is coming" এর কোনো একটি ক্যারেক্টার কোনো ভাবেই replace/remove কোনো কিছুই করা যাবে না, কোনো modification সম্ভব না।

আপনি বলতে পারেন String ক্লাসের তো replace(), concat(), remove(), toUpper(), toLower() ইত্যাদি ইত্যাদি মেথড আছে।  এগুলো স্ট্রিং অবজেক্টের কন্টেন্টকে modify করে না, তারা আপনার স্ট্রিং অবজেক্ট থেকে নতুন একটি অবজেক্ট বানায় এবং সেটি রিটার্ণ করে।
String  s1= "hello world";
String s2 = s1.replace( "world", "WORLD" );
System.out.println( s1 );  // this will print hello world
System.out.println( s1 );  // this will print hello WORLD
এখানে ছবিতে String ক্লাসের মেথড গুলোকে বিভিন্ন ক্যাটাগরিতে ভাগ করা হয়েছে যাতে আপনি আরো ভাবে মেথডগুলোর অপারেশন বুঝতে পারেন।

charAt():
আপনি charAt(int index) এই মেথডের মধ্যমে index পজিশনের ক্যারেকক্টার
retrive করতে পাববেন। যেমনঃ
String name = new String( "John Poul" );
System.out.println( name.charAt( 0 ) );
জিরো(0) পজিশনে ক্যারেক্টার আছে J, এই স্টেটমেন্ট সেটি প্রিন্ট করবে। একইভাবে নীচের স্টেটমেন্ট u প্রিন্ট করবেঃ
System.out.println( name.charAt(7) )
কারণ 7 ইনডেক্সে আছে u

substring():
substring() মেথড দুই ধরনের কাজ করতে পারে। প্রথমটি হচ্ছে আপনি একটি পজিশন উল্লেখ করে দিলেন। substring() মেথড ঐ পজিশন থেকে String এর শেষ পর্যন্ত নিয়ে একটি String রিটার্ণ করবে।

আরেকটি হচ্ছে আপনি শুরুর এবং শেষের পজিশন উল্লেখ করে দিলেন, substring() মেথড শুরুর index এর character থেকে শেষের index এর আগ পর্যন্ত String রিটার্ণ করবে। যেমনঃ
String exam = "Oracle";
String sub = exam.substring( 2 );
System.out.println( sub ); // this will print acle
String exam = "Oracle";
String result = exam.substring( 2, 4 );
System.out.println( result ); // this will print ac
মনে রাখবেন দ্বিতীয় ক্ষেত্রে ২য় প্যারামিটারের আগের index এর ক্যারেক্টার পর্যন্ত নিয়ে Sub String রিটার্ণ করবে।

trim():
trim() মেথড String এর আগের ও পরের স্পেস remove করে বাকী String রিটার্ণ করবে। যেমনঃ
String var = "   john denver   ";
System.out.print( ":" )
System.out.print( var ) ;
System.out.print( ":" )
আউটপুট হবে :   john denver   :

আমরা যদি trim() মেথড এ্যাপ্লাই করি
String var = "   john denver   ";
System.out.print( ":" )
System.out.print( var.trim() ) ;
System.out.print( ":" )
আউটপুট হবে :john denver: 

replace():
এই মেথড কোনো String থেকে কোনো একটি ক্যারেক্টারকে অন্য একটি ক্যারেক্টার দিয়ে replace করে String টি রিটার্ণ করবে। ক্যারেক্টারের পরিবর্তে "সিকুয়েন্স অফ ক্যারেক্টার" কে আরেকটি "সিকুয়েন্স অফ ক্যারেক্টার" replace করবে।যেমনঃ
String word = "INTANGIBLE";
System.out.println( word.replace('G', 'g') ); //this will print INTANgIBLE
System.out.println( word.replace('TANG', 'tang') ); // this will print INtangIBLE
মনে রাখবেন প্যারামিটার দুটি হয় ক্যারেক্টার অথবা "সিকুয়েন্স অফ ক্যারেক্টার" হতে হবে। দুটি দুই রকমের হলে কম্পাইল হবে না। যেমন নীচের দুটি প্রিন্ট স্টেটমেন্ট কম্পাইল হবে না।
String letters = "ABCBA";
System.out.println(letters. replace('B', "b") );
System.out.println( letters.replace("B", 'b') );
আরেকবার বলছি মেথড নতুন একটি String রিটার্ণ করছে, আমাদের আগের String আগের মতই আছে। যেমনঃ
System.out.println( letters );
এটি ABCBA প্রিন্ট করবে।

length() :
lenght() মেথড String এর দৈর্ঘ্য রিটার্ণ করবে। String এর দৈর্ঘ্য তার শেষ index নাম্বারের চেয়ে ১ বেশি হয়। যেমনঃ
System.out.println("ali ashik".length() );
এটি 9 প্রিন্ট করবে।

startsWith() এবং endsWith():
startsWith() মেথড চেক করে একটি String একটি নির্দিষ্ট prefix দিয়ে শুরু হয় কিনা? যদি শুরু হয় তাহলে এটি true রিটার্ণ  করবে, নইলে false রিটার্ণ করবে। prefix টি আপনি প্যারামিটারে প্রোভাইড করে দিবেন।

মনে রাখবেন এই চেকিং শুরু হবে জিরো (0) index থেকে। আপনি ইচ্ছা করলে চেকিং কোন index থেকে শুরু হবে সেটি নির্দিষ্ট করে দিতে পারেন। যেমনঃ
String letters = "ABCAB";
System.out.println(letters.startsWith("AB")); // this will print true
System.out.println(letters.startsWith("a")); // this will print false 
System.out.println(letters.startsWith("A", 3) ); // cheching form index 3 
endsWith() মেথড চেক করে একটি String একটি নির্দিষ্ট suffix দিয়ে শেষ হয় কিনা? যদি শেষ হয় তাহলে এটি true রিটার্ণ  করবে, নইলে false রিটার্ণ করবে। যেমনঃ
String letters = "ABCAB"
System.out.println( letters.endsWith("CAB") );
System.out.println( letters.endsWith("B") );
System.out.println( letters.endsWith("b", 3) );
একটু খেয়াল করে, startsWith() এবং endsWith() এ প্যারামিটার সবসময় String কিন্তু Character না।

আজকে এই পর্যন্ত। বিদায়, টাটা। আপনাদের জন্য দুইটা কাজ রেখেছি। নীচে দেখুন।

কাজ-১ঃ
নীচের কোড দেখি। এটাকে বলা হয় method chainingExecution বাম থেকে শুরু হয় ডানে যাবে।
আউটপুট কি?
String result = "Sunday   ".replace( ' ', 'z' ).trim().concat( "M n" );
কাজ-২ঃ
নীচের কোডের জন্য কোনটি সঠিক?
String letters = "ABCAB";
System.out.println( letters.substring(0,2) ).startsWith( 'A' );
(a) true(b) false
(c) AB(d) ABC
(e) Compilation error
 class MyClass{
}

জাভাঃ জাভার বর্নমালা | Encapsulation ও Access Modifier

Encapsulation কিঃ
সোজা কথায় Encapsulation হচ্ছে কোন কিছুকে ক্যাপসুলের ভিতরে আবদ্ধ করে তাকে রক্ষা করা। ধরুন আপনি বিশ্ববিদ্যালয়ের হলে থাকেন, আপনার জাম্বো সাইজের "টুথপেস্ট" পুরো হলের জনগণের কাছে সরকারি সম্পত্তি। প্রতি ১৫ দিনে নতুন টুথপেস্ট কেনার হাত থেকে বাঁচার জন্য বাজার থেকে লোহার একটা খাঁচা এনে আপনার মহামূল্যবান জিনিসগুলোকে ঐ খাঁচায় (টুথপেস্ট সহ) রেখে তালা মেরে দিলেন। তাহলে আপনার টুথপেস্ট Encapsulated গেল এখন আসুন জাভাতে Encapsulation কি এবং কেন? ওকে উপরের এনালজির সাথে মিলিয়ে দেখি। আপনি কোড করছেন সে কোডকে আপনি সরকারি সম্পত্তি হতে দিতে চান না। এ জন্য আপনি কোন একটি টেকনিক ব্যাবহার করে আপনার কোডকে তালাবদ্ধ করে রাখলেন বাহিরের জগৎ থেকে। তাহলে জাভাতে আমরা কি টেকনিক ব্যাবহার করতে পারি? জাভাতে Encapsulation এর জন্য ত্রাণকর্তার রূপে সামনে এসেছে Access Modifier

Access Modifier এর গোমর ফাঁসঃ
উপরের আলোচনা থেকে এতক্ষনে ধারনা করে ফেলেছেন, Access Modifier কোনো ক্লাসের কোডকে অন্য কোনো ক্লাস যেন ব্যাবহার/এক্সেস করতে না পারে সেটি দেখে। এর প্রয়োজনীতা কি? ধরুন "কাশেম ব্যাংক" একটি সফটওয়্যার আপনি বানিয়েছেন। এখন অন্যকেউ যদি এই সফটওয়্যার এর Account ক্লাসের balance মেম্বার(Instance variable) কে এক্সেস করতে পারে, তাহলে কি হবে ভেবে দেখেছেন?
class Account{
    private double balance;
    ..................
}

আমরা Account ক্লাসের balance নামের Instance variable কে Private Access যুক্ত করে দিয়েছি তাই Account ক্লাসের বাহিরে অন্য কোনো ক্লাস একে এক্সেস করতে পারবে না। "সো নো হাঙ্কি পাঙ্কি উইথ মাই এ্যাকাউন্ট"।

Access Modifier কয় ধরনের আছে?
জাভা পৃথিবীতে Access Modifier আছে চার ধরনের-
  • public 
  • protected 
  • default 
  • private 

ক্লাসের মেম্বার চারটি Access Modifier যুক্ত হতে পারলেও ক্লাসের নিজের সাথে শুধুমাত্র দুইটি Access Modifier যুক্ত হয় এটিই শেষ না। যখন কোনো ক্লাসে বা ক্লাসের মেম্বারের সাথে কোনো Access Modifier যুক্ত না থাকে তখন সেটি default এক্সেস যুক্ত। default ছাড়া অন্য Access Modifier যুক্ত হতে হলে অবশ্যই তাদের সাথে সংশ্লিষ্ট কিওয়ার্ড থাকতে হবে। নিচের কোডে দেখি-

class Poo
{
   private int a;
   private int b;
   protected int c;
   int d;
}

দেখুন উপরের ক্লাস Poo তে "d" মেম্বারটি default এক্সেস যুক্ত। অন্যগুলোর এক্সেস কি আমরা কিওয়ার্ড থেকে দেখতে পাচ্ছি।

সিতা কার বাপ? এক্সেস করতে পারে এই কথার মানে কি
আমরা জানি Rahim দের ঘরে Karim এর এক্সেস/প্রবেশাধিকার থাকলে তিনি Rahim দের ঘরে কি কি আছে তা দেখতে পারবেন এবং কোনো একটা জিনিস ব্যাবহার করতেও পারবেন। যার Rahim দের ঘরে এক্সেস নেই তার ধরে দেখা তো দূরের থাক ঘরে ঢুকাও অসম্ভব। একইভাবে ক্লাস A যদি ক্লাস B কে এক্সেস করতে পারে তাহলে B এর মেম্বার(ঘরের জিনিসপাতি) ক্লাস A এর কাছে ভিজিবল/দর্শনীয়।

যখন কোনো ক্লাস অন্য ক্লাস বা তার মেম্বারকে এক্সেস করার সুযোগ নেই কিন্তু এক্সেস করার চেষ্টা করে তাহলে কি হবে? কম্পাইলার কানের নিচে একটা দিয়ে বলবে, নে বাবা "একটা কম্পাইলেশন এরর" খা।

কোনো ক্লাসের মেম্বার গুলোকে দু ভাবে অন্য ক্লাস থেকে এক্সেস করা হয়-

  • এক ক্লাসের কোড অন্য ক্লাসের মেম্বারকে অবজেক্টের রেফারেন্স দিয়ে ডট(.) অপারেটরের মাধ্যমেএক্সেস করে। 
  • কোনো সাব ক্লাস এর সুপার ক্লাসের কোনো মেম্বারকে Inherit করার মাধ্যমে এক্সেস করে।
প্রথম ধরনের এক্সেস ঘটে আমরা বলেছি, যখন কোনো ক্লাসের মেথডের ভিতরে আরেকটি ক্লাসের মেম্বারকে ডট অপারেটর (.) এর মাধ্যমে এক্সেস করা হয়। নিচের কোড দেখি-

class Hospital{
   public String Descripton(){
      return "good";
   }
}
class People{ 
   public void Investigate(){ 
      Hospital h = new Hospital(); 
      System.out.println( h.Descripton() ); 
   } 
} 

(Inheritance এখনো পর্যন্ত যাদের মাথার উপর দিয়ে যায় তারা এই অংশটি স্কিপ করতে পারেন, আগের Inheritance শিখে নিন)

কোনো সাব ক্লাস এর সুপার ক্লাসের কোনো মেম্বারকে Inherit করার মাধ্যমে ঐ মেম্বারকে নিজস্ব সম্পত্তি মনে করে। যেমন নিচের CorruptOfficial ক্লাসের Spend() মেথড People ক্লাসের মেম্বার money কে নিজের মত করে ব্যাবহার করেছে, যেমনটা তার নিজের মেম্বার ownMember কে ব্যবহার করেছে। যেন money, CorruptOfficial ক্লাসের মধ্যে ডিক্লেয়ার করা হয়েছে।

class People{ 
   public int money; 
}
class CorruptOfficial extends People{
   int ownMember = 400; 
   public void Spend(){ 
      System.out.println(money); 
      System.out.println(ownMember); 
   } 
} 

তাহলে সাব-ক্লাস(sub class) কোন কোন মেম্বারগুলোকে নিজের মনে করে এক্সেস করতে পারবে? এটি কিভাবে ঠিক করে দেওয়া হয়? মেম্বারের আগে Access Modifier দিয়ে এটি ঠিক করে দেওয়া হয়।

এখানে আরেকটি কথা মনে রাখুন যদি একটি ক্লাস অন্য আরেকটি ক্লাসকে এক্সেস করতে না পারে, তাহলে সেটার মেম্বারকে কোনো ভাবেই এক্সেস করতে পারবে না। বিষয়টি অনেকটি এইরকম, আপনি ঘরে ঢুকতে না পারলে সোফায় বসবেন কিভাবে? কোনো ক্লাসকে যদি এক্সেস করা যায় কেবল মাত্র তখন ঐ ক্লাসের মেম্বারকে এক্সেস করা যাবে।

তাহলে কোনো ক্লাস অন্য কোনো ক্লাসের মেম্বারতে এক্সেস করতে চাইলে আমরা আমরা সব ক্ষেত্রে ২ টি প্রশ্ন করব- 

  • যে ক্লাসের মেম্বারকে এক্সেস করতে চাই, ঐ ক্লাসকে এক্সেস করা যায় কিনা? 
  • মেম্বারটিকে এক্সেস করা যায় কিনা? 

Public এক্সেসঃ
public এর কথা বলতে হলে সবার আগে বলতে হয়, এটি সরকারি মাল। public কিওয়ার্ড যুক্ত করে একে সরকারি করে দেওয়া হয়েছে। যে কোনো ক্লাসের যে কোনো কোড, একটি ক্লাসের public মেম্বার গুলোকে এক্সেস করতে পারে। কেউ রাগ করে না, এমনকি public হওয়ায় কম্পাইলারও কিছু বলে না। 

যাই হোক এখন থেকে "মাইর কম আওয়াজ বেশী"। নীচে দেখুন Poo নামের একটি ক্লাস আছে -

package pagcage1;
public class Poo{
   public int age;
      public int getAge(){
      return age;
   }
}

অবজেক্ট রেফারেন্স দিয়ে ডট (.) অপারেটরের মাধ্যমে আরেকটি ক্লাস Moo, Poo ক্লাসের মেম্বারগুলোকে এক্সেস করতে পারবে কিনা? উত্তর হচ্ছে হ্যাঁ পারবে । এই ক্ষেত্রে প্রথম দেখতে হবে, ক্লাস Moo, ক্লাস Poo কে এক্সেস করতে পারে কিনা? ক্লাস Poo, public এক্সেস যুক্ত হওয়ার কারণে এটি যে প্যাকেজে থাকুক না কেন ক্লাস Moo একে এক্সেস করতে পারবে।

package package2;
class Moo{
   public void Check(){
      Poo refVar = new Poo();
      refVar.age = 20;
      System.out.println( refVar.getAge() );
   }
}

তাহলে আমরা শিখলাম public ক্লাসের public মেম্বারকে যে কোনো প্যাকেজের যে কোনো ক্লাস থেকে এক্সেস করা যাবে। তাহলে উপরের কোড কোনো এরর দেখাবে না।

কিন্তু আমাদের ক্লাস Poo যদি public না হয়ে default এক্সেস যুক্ত হয়? সেক্ষেত্রে ক্লাস Moo এবং ক্লাস Poo একই প্যাকেজ ভুক্ত হলে কোনো সমস্যা হবে না কিন্তু এদের প্যাকেজ যদি আলাদা হয়, ক্লাস Moo, ক্লাস Poo কে খুজে পাবে না। ক্লাসকে খুজেই যদি না পেল তাহলে তার public মেম্বারকে কিভাবে এক্সেস করবে? নীচের ক্ষেত্রে এরর দেখাবে -

package pagcage1; 
class Poo{ 
   public int age; 
   public int getAge()
   { 
      return age; 
   } 
}
package package2; 
import package1; 
class Moo{ 
   public void Check()
   { 
      Poo refVar = new Poo(); 
      refVar.age = 20; System.out.println( refVar.getAge() ); 
   } 
} 

এখন আমরা দেখব ক্লাস Moo যদি ক্লাস Poo কে Inherit করে তাহলে ক্লাস Poo এর public মেম্বারগুলোকে এক্সেস করতে পারে কিনা। আগের মত, ক্লাস Poo ডিফল্ট (default) এক্সেস যুক্ত হলে এবং ক্লাস দুটো ভিন্ন প্যাকেজে থাকলে, ক্লাস Moo একে খুজে পাবে না। তাই ক্লাস Poo এর পাবলিক (public) মেম্বারগুলোকে নিজের মনে করা "আনপসিবল"। একই প্যাকেজে থাকলে কোনো সমস্যা নেই। আবার ক্লাস Poo পাবলিক (public) এক্সেস যুক্ত হলে এটি যে প্যাকেজে হোক না কেন, কোনো সমস্যা হবে না।

package pagcage1; 
class Poo{ 
   public int age; 
   public int getAge(){ 
      return age; 
   } 
} 
package package2; 
import package1.Poo; 
class Moo extens Poo{ 
   public void Check(){
      age = 85; // error 
   } 
}
উপরের ক্ষেত্রে এরর দেখাবে কারণ ক্লাস Poo ডিফল্ট(Default) এক্সেস যুক্ত। নিচের ক্ষেত্রে এরর দেখাবে না কারণ ভিন্ন প্যাকেজে হলেও ক্লাস Poo পাবলিক (public) এক্সেস যুক্ত।

package pagcage1; 
public class Poo{
   public int age; 
   public int getAge(){ 
      return age;
   } 
} 
package package2; 
import package1.Poo; 
class Moo extens Poo{ 
   public void Check(){
      age = 85; 
   } 
}

তাহলে উপরের আলোচনার সারাংশ হচ্ছে, কোনো ক্লাস যখন (default) এক্সেস যুক্ত হয় তখন শুধুমাত্র একই প্যাকেজের অন্য ক্লাস থেকে ঐ ক্লাসের পাবলিক (public) মেম্বারগুলোকে এক্সেস করা যাবে। ভিন্ন প্যাকেজের অন্য ক্লাস থেকে এক্সেস করা যাবে না। 

private এক্সেসঃ 
private হচ্ছে সবচেয়ে বেশি ঘাউরা। যখন কোনও ক্লাসের private মেম্বার ঐ ক্লাস ভিন্ন অন্য যে কোনো ক্লাসের মেথড এদের এক্সেস করতে পারবে না। যেমন ধরুন আপনার বেডরুমের সবকিছুই প্রাইভেট এমনকি "হোয়াইট হাউজ" বা "বঙ্গভবন" এর কোনো বাসিন্দার সেখানে নাক গলানোর সুযোগ নেই। তাহলে কোনো ক্লাস একই প্যাকেজ এ থাকুক বা ভিন্ন প্যাকেজে থাকুক অন্য ক্লাস থেকে একে ডট(.) অপারেটরের মাধ্যমে এক্সেস করা যাবে না।  

package pagcage1; 
public class Poo{ 
   private int numOfLove; 
} 
package package2; 
import Poo; 
class MasterShifu{
   public void Check(){
      Poo refVar = new Poo();
      refVar.numOfLove = 100; 
   } 
}

আমরা প্রথমে দেখব ক্লাস Poo কে ক্লাস MasterShifu এক্সেস করতে পারে কিনা। এরা ভিন্ন প্যাকেজে হলেও ক্লাস Poo পাবলিক(public) এক্সেস যুক্ত হওয়ায় যে কোনো প্যাকেজের যে কোনো ক্লাস একে এক্সেস করতে পারবে। কিন্তু ক্লাস Poo ডিফল্ট(default) এক্সেস যুক্ত হলে ভিন্ন প্যাকেজের কোনো ক্লাস একে এক্সেস করতে পারবে না। 

এখানে ক্লাস MasterShifu এর মেথড Check(), ক্লাস Poo এর মেম্বার(Instance Variable) numOfLove কে ডট(.) অপারেটরের মাধ্যমে এক্সেস করতে চাইলে এরর দেখাবে কারণ numOfLove এর Access modifier হচ্ছে private। ক্লাস Poo এবং ক্লাস MasterShifu একই প্যাকেজে হলেও একই ঘটনা ঘটত। private এক্সেস যুক্ত হওয়ায় ক্লাস MasterShifu ক্লাস Poo এর numOfLove নামে নামে কোনো Instance variable আছে সেটিও জানতে পারবে না। 

Inheritance এর মাধ্যমে এক্সেস করতে পারবে কিনা? উত্তর হচ্ছে না, পারবে না। যে প্যাকেজে ক্লাস গুলো থাকুক না কেন, কখনো Inheritance এর মাধ্যমে কোনো ক্লাসের private মেম্বারকে এক্সেস করা যায় না। নীচের কোড গুলো দেখি। এখানে ক্লাস MasterShifu থেকে ক্লাস Poo কে Inherit করে এর প্রাইভেট(private) মেম্বারকে এক্সেস করার চেষ্টা করা হয়েছে এবং প্রত্যেক ক্ষেত্রে এরর কম্পাইলার এরর দেখাবে।

package pagcage1; 
public class Poo{ 
   private int numOfLove; 
}
package package1; 
import Poo; 
class MasterShifu extens Poo{
   public void Check(){ 
      numOfLove = 100; 
   } 
} 
A(I): numberOfLove প্রাইভেট, দুই ক্লাস একই প্যাকেজেA(II): ৫ নাম্বার লাইনে এরর দেখাবে
package pagcage1; 
public class Poo{ 
   private int numOfLove; 
}
package package2; 
import Poo; 
class MasterShifu extens Poo{
   public void Check(){
       numOfLove = 100; 
   } 
} 
B(I): numberOfLove প্রাইভেট, দুই ক্লাস আলাদা প্যাকেজেB(II): ৫ নাম্বার লাইনে এরর দেখাবে
package pagcage1; 
class Poo{ 
   private int numOfLove; 
}
package package1; 
import Poo; 
class MasterShifu extens Poo{ 
   public void Check(){
      numOfLove = 100; 
   } 
} 
C(I): Poo ক্লাস defult, দুই ক্লাস একই প্যাকেজেC(II): ৫ নাম্বার লাইনে এরর দেখাবে
package pagcage1; 
class Poo{ 
   private int numOfLove; 
}
package package2; 
import Poo; 
class MasterShifu extens Poo{ 
   public void Check(){ 
      numOfLove = 100; 
   } 
} 
D(I): Poo ক্লাস defult, দুই ক্লাস আলাদা প্যাকেজেD(II): ৩ নাম্বার লাইনে এরর দেখাবে

প্রোটেক্টেড (protected) ও ডিফল্ট (default) এক্সেসঃ 
প্রোটেক্টেড (protected) ও ডিফল্ট (default) এক্সেস মডিফায়ার প্রায় একই রকম। পার্থক্য শুধু এক জায়গায়, কোনো ক্লাসের ডিফল্ট (default) এক্সেস যুক্ত মেম্বারগুলোকে শুধু মাত্র একই প্যাকেজের ক্লাস থেকে এক্সেস করা যাবে। অন্যদিকে কোনো ক্লাসের প্রোটেক্টেড (protected) এক্সেস যুক্ত মেম্বারগুলোকে ভিন্ন প্যাকেজের তার সাবক্লাস (subclass) থেকেও এক্সেস করা যাবে। যেমন নীচের কোডে দেখুন-

Default এক্সেসঃ দুইটি ক্লাস একই প্যাকেজেprotected এক্সেসঃ দুইটি ক্লাস একই প্যাকেজে
package pagcageA; 
public class Poo{ 
   int numOfLove; 
} 

package packageA; 
class MasterShifu extends Poo{
   public void Check(){
      numOfLove = 100; 
   } 
}
package B; 
public class Poo{
   protected int numOfLove; 
}

package packageB; 
class MasterShifu extends Poo{ 
   public void Check(){
      numOfLove = 100; 
   }
} 
একই প্যাকেজের default মেম্বারকে inherit করা যায়, তাই কোনো এরর দেখাবে নাএকই প্যাকেজের protected মেম্বারকেও inherit করা যায়, তাই এখানেও কোনো এরর দেখাবে না

আমি যা বলার বলে দিয়েছি। এবার আপনি চিন্তা করুন দুই ক্ষেত্রে ক্লাস Poo পাবলিক(public) না হয়ে ডিফল্ট(default) এক্সেস যুক্ত হত, তাহলে কি কোনো এরর দেখাত? ডিফল্ট(default) এক্সেস যুক্ত ক্লাস শুধুমাত্র একই প্যাকেজের অন্য ক্লাসের কাছে ভিজিবল, অন্য প্যাকেজের কোনো ক্লাস এদের খুজে পাবে না। এই জন্য ডিফল্ট(default) এক্সেস কে প্যাকেজ এক্সেসও বলা হয়। 

দয়া করে এবার নিচের কোডের দিকে তাকাই-

Default এক্সেসঃ দুইটি ক্লাস ভিন্ন প্যাকেজেprotected এক্সেসঃ দুইটি ক্লাস ভিন্ন প্যাকেজে
package alibaba; 
public class Poo{ 
   int numOfLove; 
} 

package fortyThief; 
class MasterShifu extends Poo{
   public void Check(){
      numOfLove = 100; 
   } 
}
package earth; 
public class Poo{
   protected int numOfLove; 
}

package moon; 
class MasterShifu extends Poo{ 
   public void Check(){
      numOfLove = 100; 
   }
} 
ভিন্ন প্যাকেজের default মেম্বারকে inherit করা যায় না, তাই numOfLove = 100 এর জন্য এরর দেখাবেভিন্ন প্যাকেজের protected মেম্বারকে inherit করা যায়, তাই numOfLove = 100 এর জন্য কোনো এরর দেখাবে না

আগের বার বলে দিলেও এবার বলছি না। এখন বলুন দুই ক্ষেত্রে ক্লাস Poo পাবলিক(public) না হয়ে ডিফল্ট(default) এক্সেস যুক্ত হত, তাহলে কি কোনো এরর দেখাত? 

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

একই প্যাকজের কোনো ক্লাসের ডিফল্ট(default) বা প্রোটেক্টেড(protected) মেম্বারকে ঐ প্যাকেজের আরেকটি ক্লাস থেকে অবজেক্ট রেফারেন্সের দিয়ে ডট(.) অপারেটরের মাধ্যমে এক্সেস করা যাবে। আসুন কোড দেখি-

Default এক্সেসঃ দুইটি ক্লাস একই প্যাকেজেprotected এক্সেসঃ দুইটি ক্লাস একই প্যাকেজে
package com.main.packageA; 
public class Poo{ 
   int numOfLove; 
}

package com.main.packageA; 
class MasterShifu extends Poo { 
   public void Check() { 
      Poo refVar = new Poo(); 
      refVar.numOfLove = 100; 
   } 
}
package com.main.packageB; 
public class Poo{ 
   protected int numOfLove; 
}

package com.main.packageB; 
class MasterShifu extends Poo { 
   public void Check() { 
      Poo refVar = new Poo(); 
      refVar.numOfLove = 100; 
   } 
}
একই প্যাকেজের default মেম্বারকে ডট(.) অপারেটর দিয়ে এক্সেস করা যায়একই প্যাকেজের protected মেম্বারকেও ডট(.) অপারেটর দিয়ে এক্সেস করা যায়

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

Default এক্সেসঃ দুইটি ক্লাস ভিন্ন প্যাকেজেprotected এক্সেসঃ দুইটি ক্লাস ভিন্ন প্যাকেজে
package com.main.sky; 
public class Poo{ 
   int numOfLove; 
}

package com.main.ground; 
class MasterShifu extends Poo { 
   public void Check() { 
      Poo refVar = new Poo(); 
      refVar.numOfLove = 100; 
   } 
}
package com.main.water; 
public class Poo{ 
   protected int numOfLove; 
}

package com.main.oil; 
class MasterShifu extends Poo { 
   public void Check() { 
      Poo refVar = new Poo(); 
      refVar.numOfLove = 100; 
   } 
}
ভিন্ন প্যাকেজের default মেম্বারকে ডট(.) অপারেটর দিয়ে এক্সেস করা যায় না, তাই refVar.numOfLove = 100 এর জন্য এরর দেখাবেভিন্ন প্যাকেজের protected মেম্বারকেও ডট(.) অপারেটর দিয়ে এক্সেস করা যায় না, তাই refVar.numOfLove = 100 এর জন্য এরর

কুমিরের খাঁজকাটা খাঁজকাটা গল্পের মত আবারো একই প্রশ্ন। যদি Poo পাবলিক(public) না হয়ে ডিফল্ট(default) এক্সেস যুক্ত হত, তাহলে কি কোনো এরর দেখাত? উত্তর নিহিত এই লাইনে "ডিফল্ট(default) এক্সেস যুক্ত ক্লাস শুধুমাত্র একই প্যাকেজের অন্য ক্লাসের কােছ ভিজিবল, অন্য প্যাকেজের কোনো ক্লাস এদের খুজে পাবে না।" 

একটি জিনিস কি খেয়াল করেছেন, আমরা যখন ভিন্ন প্যাকেজ প্রোটেক্টেড(protected) মেম্বারকে এক্সেস করেছি। শুধুমাত্র সাব-ক্লাস(Sub class) থেকে এক্সেস করা সম্ভব হয়েছে। তাহলে আমরা সিদ্ধান্তে আসতে পারি "সাব-ক্লাস-আউটসাইড-দ্যা-প্যাকেজ" থেকে শুধুমাত্র Inheritance এর মাধ্যমে প্রোটেক্টেড(protected) মেম্বারকে এক্সেস করা যায় আর কোনো ভাবে এক্সেস করা যায় না। Inheritance এর মাধ্যমে প্রোটেক্টেড(protected) মেম্বারকে এক্সেস করা যায় আর কোনো ভাবে এক্সেস করা যায় না।

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

পি.ডি.এফ. ডাউনলোড করতে চাইলে ক্লিক করুনঃ  ডাউনলোড

জাভাঃ IS-A রিলেশন এবং HAS-A রিলেশন

ভূমিকাঃ
চাকরির ভাইভাতে গেলেন, আপনাকে বলা হল IS-A এবং HAS-A রিলেশন কি তা বলে আপনার সামনে বসা বসদের বাধিত করতে। আপনি তো শুনেই তব্দা। এইটা খায় না মাথায় দেয়। হয়ত চাকরির ভাইভাতে এই প্রশ্ন নাও পেতে পারেন, তবে আপনি যদি OCA বা OCP পরীক্ষা দিতে চান, সেখানে অবশ্যই আসবে।
আরেহ ব্যাপার না। আপনি IS-A এবং HAS-A রিলিশনের অনেক কাজ করেছেন শুধু বই এর ভাষায় জানের না, এই যা। ওকে এক মিনিটে সমাধান।
IS-A রিলেশনঃ
IS-A রিলেশনের কনসেপ্ট হচ্ছে Inheritance এর কনসেপ্ট। IS-A দিয়ে বুঝায়, This thing is a type of that thing। যেমনঃ “সব ক্ষারকই ক্ষার”।ওকে ওয়েট, স্যরি।
যেমনঃ
  1. Potato IS-A Vegetable (আহামরি উদাহরণ না, তবে কাজ চলে)
  2. Apple IS-A Food
  3. MBW IS-A Car 
কোডে দেখি - 
public class Car{
}
public class BMW extends Car{
}
IS-A রিলেশন প্রকাশ করার জন্য দুটো কিওয়ার্ড ব্যাবহার করা হয়। Class Inheritance এর ক্ষেত্রে extends এবং Interface Implementation এর ক্ষেত্রে implements

HAS-A রিলেশনঃ
HAS-A রিলেশনশিপ কোনো ক্লাসের রেফারেন্সকে অন্য ক্লাসে ব্যাবহারের উপর ভিত্তি করে করা হয়। অন্য কথা বলা যায়, ক্লাস X HAS-A Y । যদি ক্লাস X তে Y ক্লাসের কোনো রেফারেন্স ভেরিয়েবল থাকে।


যেমনঃ
  1.   A Horse HAS-A Owner
  2.   Human HAS-A Kidney 
তাহলে- 
public class Human{
   private Kidney kidneyRefVar;
}
public class Kidney{
}
তাহলে এই লাইনটি কোডে অনুবাদ করুন।
A Horse IS-A Animal. A Horse HAS-A Owner

সারাংশঃ
IS-A রিলেশনশিপ হয় Base ক্লাস এবং Derived ক্লাসের মধ্যে। যেমনঃ
  • Programmer IS-A Person
  • Manager IS-A Person
HAS-A রিলেশনশিপ হয় দুটি ক্লাসের মধ্যে যেখানে একটি ক্লাসের রেফারেন্স অন্য ক্লাসের মেম্বার হিসেবে থাকবে। যেমনঃ
  • Mobile HAS-A Battery
  • University HAS-A Library
এই পোস্টের পি.ডি.এফ ডাউনলোড করতে চাইলেঃ ডাউনলোড