টপিকঃ হিজিবিজি কথাবার্তা - ০১ (প্রোগ্রামিং, ম্যাটল্যাব, সাহায্য দরকার)
(লেখাটা বটগাছ বিভাগেও যেতে পারে, পড়াশোনাতেও হয়তো যেতে পারতো; কিন্তু আমার মনে হয়, শেষ পর্যন্ত আলোচনা প্রোগ্রামিং-এই সীমাবদ্ধ হয়ে যাবে তাই 'প্রোগ্রামিং' ফোরামে দেয়া।)
৮ বছর হল শিক্ষকতা করি। আমার কাজ ও শেখানোর বিশেষায়িত ক্ষেত্র হল পানি পরিশোধণ, সরবরাহ ব্যবস্থা, বর্জ্য পরিশোধণ, পয়ঃনিষ্কাশন, তরল ও কঠিন বর্জ্য ব্যবস্থাপনা, পরিবেশগত প্রতিক্রিয়া ইত্যাদি। এর সাথে সেঁচ ব্যবস্থার কোর্সটাও নিতাম। আগ্রহ আছে পানি সম্পদ ব্যবস্থাপনার কোর্স তথা হাইড্রলজি, ওপেন চ্যানেল ফ্লো বিষয়ে।
কিছুদিন আগে কর্মক্ষেত্র পরিবর্তন করে বাসা এবং বাচ্চার স্কুলের কাছাকাছি জায়গায় চলে এসেছি। যেখানে যোগ দিয়েছি সেখানকার সিভিল ইঞ্জিনিয়ারিং বিভাগটা নতুন শুরু হয়েছে। তাই আমার জন্য যুতসই বিষয়গুলো এখনো পাওয়া যাচ্ছে না (ওগুলো ৩য়+৪র্থ বর্ষের জিনিষ)। কিন্তু সিভিল ইঞ্জিনিয়ারিং বিষয়ে বুয়েট থেকে বিএসসি পাশ করে যদি এই বিষয়ের অন্য কোর্সগুলো না পড়াতে পারি তাহলে সেটা হাস্যকর শোনাবে। সদ্য পাশ করে শিক্ষকতায় আসা লোকজনও এই কোর্সগুলো পড়িয়ে যাচ্ছে – আর প্রায় সেইম সিলেবাসে পাশ করে এবং এ্যাতবছরের কাজ এবং শিক্ষকতার অভিজ্ঞতা নিয়ে আমি সেগুলো পড়াতে পারবো না!?!?
যা হোক, গতবার ক্যাড কোর্সের ল্যাব নিয়েছিলাম। ক্যাডে আমি নিজে যথেষ্ট আত্মবিশ্বাসী হলেও, শিক্ষাপ্রতিষ্ঠানে প্রচলিত ধারণা ‘অটোক্যাড’ নামক সফটওয়্যার শিখতে বা শিখাতে হবে। আমি নিজে এই সফটওয়্যারে বেশ দক্ষ হলেও এটার উচ্চমূল্য + আমার অপারেটিং সিস্টেমের সাথে যায় না বলে ব্যবহার করি না। বিকল্প ক্যাড সফটওয়্যার ব্যবহার করে আমার নিজের কনসালটেন্সির কাজ করি --- অর্থাৎ আমি একাধিক ক্যাড সফটওয়্যারে দক্ষ। আমাদের ছাত্রাবস্থায় এই কোর্সটা বুয়েটে ছিল না, কিন্তু এখন আছে; কাজেই ফ্রেশ গ্রাজুয়েটরাও এই বিষয়টা পড়াতে পারবে - যদিও ব্যবহারিক বিষয় পড়াতে বাস্তব প্রয়োগের অভিজ্ঞতা খুব দরকারী একটা বিষয়।
এবার ‘ইঞ্জিনিয়ারিং ড্রইং’ নামের ল্যাব কোর্সটা নিচ্ছি। এটাতে সরাসরি বড় কাগজে আঁকাআঁকি হাতে ধরে শিখাতে হয়। স্কেল ধরে সোজা লাইন টানাও যে কারো জন্য কঠিন কাজ সেটা শিখাতে গিয়ে টের পেলাম। একদিকের দৃশ্য দেখে অন্যদিক থেকে সেটা কেমন দেখাবে সেটা আঁকা এটাতে একটা বাধ্যতামূলক বিষয় – এই কাজটার জন্য কল্পনাকে প্রসারিত করতে হয়। মানুষের কল্পনা শক্তিকে প্রসারিত করা যথেষ্ট কঠিন কাজ বলেই মনে হচ্ছে। হঠাৎ বুঝতে পারলাম আমরাও আমাদের শিক্ষকদের একই রকম পেইন দিয়ে এসেছি।
এবার আমি কোর্সগুলোর মধ্য থেকে ‘নিউমেরিকাল অ্যানালাইসিস এন্ড কম্পিউটার প্রোগ্রামিং’ নামে একটা কোর্স পড়াবো বলে ঠিক করলাম। এটা সিলেক্ট করার কারণ, আমার একজন কলিগ এটা পড়াতো - এখন উচ্চশিক্ষার্থে বিদেশে চলে গেল। এটার সাথে প্রোগ্রামিং-এর আরেকটা ল্যাব কোর্সও আছে। খেয়াল করলাম যে এই কোর্সেটা পড়াতে অনেকেই আগ্রহ পায় না – হয়তো প্রোগ্রামিং বিষয়টা অনেকেরই অপছন্দের। বুয়েটের সিলেবাস ফলো করে এই কোর্সে ম্যাটল্যাব নামক একটা সফটওয়্যার শিখাতে হয়। অবশ্য কিছুদিন আগে নাকি বুয়েটে এই কোর্সে সি অথবা সি++ শিখাতো। আমাদের সময়ে এই কোর্সে ForTran77 নামক ল্যাঙ্গুয়েজ শিখিয়েছিল।
ম্যাটল্যাব কখনো দেখিনি। কিন্তু তাতে কি! ফোরট্রান তো ভালই পারতাম। এছাড়া আমার আন্ডারগ্রাড থিসিস ছিল কিউবেসিক ল্যাঙ্গুয়েজে করা একটা প্রোগ্রাম: এটার জন্য নগদে QBasic ল্যাঙ্গুয়েজটা শিখেছিলাম। এই প্রোগ্রামটা কিছু স্ট্রাকচারাল অ্যানালাইসিস করতে পারতো এবং গ্রাফিকাল আউটপুট দিত। বেশি না, ফাংশন টাংশন সহ সব মিলিয়ে দেড় হাজার লাইনের চেয়ে একটু বেশি কোডিং ছিল সেটাতে! সেটা ব্যবহার করে আমার সুপারভাইজার স্যার একটা কনসালটেন্সির কাজও করেছিলেন বলে জেনেছি পরবর্তীতে।
বুয়েটে ভর্তির আগে গাঁটের পয়সা খরচ করে ‘ফক্সপ্রো’ নামে একটা প্রোগ্রামিং শিখেছিলাম। এটা দিয়ে ডেটাবেস টাইপের কাজ করা যেত। ফক্সপ্রো’র একটা চমৎকার গ্রাফিকাল ইউজার ইন্টারফেসও (GUI) ছিল – সেটা দিয়েও দারুন কাজ করা যেত; তবে আমি শিখেছিলাম প্রোগ্রামিং। ফক্সপ্রো বহু আগেই মার্কেটে হারিয়েছে, এমনকি মাইক্রোসফটের অধিকারে যাওয়ার পরও। প্রায় একইরকম ‘মাইক্রোসফট অ্যাকসেস’ ব্যবহার করেছিলাম একসময়। সম্ভবত ‘ওরাকল’ নামক ডেটাবেস প্রোগ্রামের সাথে ফক্সপ্রো পেরে উঠেনি।
নিজের আগ্রহে html নামক একটা জিনিস শিখেছিলাম বহু আগে। কাজেও লাগিয়েছিলাম: বিয়ের প্রস্তাব পাঠানোর সময়ে নিজের বায়োডাটা একটা html ফাইল বানিয়ে ফ্লপি ড্রাইভে ভরে পাঠিয়েছিলাম। সেখানে বামদিকে নিজ পরিবার, শিক্ষা, মায়ের দিকের আত্মীয়স্বজন, বাপের দিকের আত্মীয় স্বজন ইত্যাদির লিস্টের মত ছিল; ক্লিক করলে ডানদিকের প্যানেলে সেটা খুলতো। প্যানেলের পেছনে টাইল ব্যাকগ্রাউন্ড ছিল। এছাড়া একটা মিডি ফাইলে থাকা মিউজিক বাজতো ব্যাকগ্রাউন্ডে! আমার শ্বশুর সাহেব আত্মীয়-স্বজনদেরকে সম্ভাব্য জামাইয়ের প্রোফাইল দেখাতে - সেটা থেকে দেখে আবার টিপিকাল একটা সিভি টাইপ করে নিয়েছিলেন।
পরবর্তীতে .. .. অনেক দিন পর, কয়েক বছর আগে একটা শখ জাগলো যে অনলাইনে একটা ক্যালকুলেটর টাইপের জিনিষ বানাবো। এখন তো রিসোর্স অনেক সহজলভ্য। নেট ঘেটে php নামক ল্যাঙ্গুয়েজের টিউটোরিয়াল ঘাটতে থাকলাম। তখন একজন বললো - আরে ভাই, আপনি জাভাস্ক্রিপ্ট শেখেন; php ব্যাকএন্ডে সার্ভারে ডেটাবেজ রাখে, আপনার দরকার পুরাটা ব্রাউজারে রান করানো জিনিষ, যেটা জাভাস্ক্রিপ্ট করে। তাই এবাউট টার্ন করে জাভাস্ক্রিপ্টের কোড দেখে শেষে একটা দাঁড় করিয়ে ফেললাম। ব্লগস্পটে আমার ব্লগে সেই কোড দিতেই যা চাইছিলাম তা হয়ে গেল। সেটা ছিল সেপটিক ট্যাংক ক্যালকুলেটর - এখনো সেটা চমৎকার চলছে।
এছাড়া নিয়মিত ভাবেই স্প্রেডশিট প্রোগ্রামে কোড লিখতে হয়। আগে এক্সেলে আর এখন লিব্রেঅফিসক্যালক-এ। ভাল এক্সেল জানে দাবী করা লোকজনও স্প্রেডশিটে আমার করা প্রোগ্রামগুলো দেখে ইমপ্রেস্ড হয়। আগের উল্লেখিত সেপটিক ট্যাংক ক্যালকুলেটরও প্রথমে একটা প্রিন্টরেডি স্প্রেডশিট প্রোগ্রাম ছিল (আছে এখনও)। বিশেষত সিভিল ইঞ্জিনিয়ারদের স্প্রেডশীট ছাড়া পেশাগত জীবন অচল – অন্ততপক্ষে ডিজাইনের কাজ যারা করে। নিজে না করলেও কোনো বড়ভাইয়ের করা এক্সেল শীট দিয়ে সারাজীবন ডিজাইন করে খাচ্ছে এমন ইঞ্জিনিয়ারও আছে।
এ্যাতগুলো প্রোগ্রাম করার ব্যাপক (!!) অভিজ্ঞতা থাকায় সাহস করে এবার ম্যাটল্যাবের ল্যাব কোর্সটা পড়ানোর জন্য নিয়েই ফেললাম। ছাত্রদের কাছে আমার সহজ স্বীকারোক্তি – আমি ম্যাটল্যাব পারিনা; সবাই একসাথে এটা শিখবো। অবশ্য এখনকার বিশ্ববিদ্যালয়ে পড়ানোর ধারণাটাও এরকমই। শিক্ষক পড়ায় আর ছাত্ররা শিখে – ব্যাপারটা এমন নাই। এখানে সবাই শিখে; শিক্ষকের কাজ হল শিখতে সাহায্য করা = ফ্যাসিলিটেটর।
মুশকিল হল, ম্যাটল্যাবও একটা মালিকানাধীন সফটওয়্যার। এমনকি এটার ছাত্র-ভার্সনও দাম দিয়ে কিনতে হয়। তাই বিকল্প হিসেবে এর সাথে অকটেভ (GNU Octave) নামক ফ্রী-সফটওয়্যারটাও শেখা জরুরী - কারণ এটার প্রায় ৯৫% কমান্ডই ম্যাটল্যাবের মত কাজ করে। দুইটা ল্যাব রুম ব্যবহার করে ভিন্ন ভিন্ন সময়ে ক্লাসগুলো নিতে হয়। ইউনিভার্সিটির একটা ল্যাবে দেখি MatLab ইনস্টল করাই আছে (অবশ্যই পাইরেটেড), আরেকটাতে কিচ্ছু নাই। সেই কিচ্ছু-নাইয়েরটাতে কবে ওনারা ম্যাটল্যাব ইনস্টল করবে, এই ভেবে অকটেভ ইনস্টল করে নিলাম – আসলে ইনস্টল বলতে যা বুঝায় সেটা করার দরকার হয়নি; কারণ যেই ফাইলটা ডাউনলোড হয়েছে সেটা পোর্টেবল সফটওয়্যার!
এখন যে বিষয়ে সাহায্য দরকার সেটা হল – শেখানোর জন্য ছোট ছোট প্রোগ্রামের আইডিয়া (উদাহরণের মত করে)। তার সাথে এসাইনমেন্ট দেয়ার জন্য প্রোগ্রামের আইডিয়া দরকার। আমার করা প্রোগ্রামগুলো এখন ওদের হজম হবে না, কারণ এগুরলোর দরকারী সূত্রগুলো ৩য়/৪র্থ বর্ষের আগে শেখার তেমন কোন সুযোগ নাই। ইতিমধ্যে কয়েকটা প্রোগ্রাম করিয়েছি কিংবা করাবো বলে ঠিক করেছি সেগুলো এখানে দিলাম –
১। সূত্র দিয়ে, ইনপুট নেয়া আর আউটপুট দেয়ার প্রোগ্রাম। পরে এর কোড আর ধাপগুলো দিলাম (BMI)।
২। একটা সংখ্যা মৌলিক সংখ্যা কি না সেটা বের করার প্রোগ্রাম
৩। একটা রেঞ্জের মধ্যে সবগুলো মৌলিক সংখ্যা বের করার প্রোগ্রাম
৪। নিউমেরিকালের বাইসেকশন, সেকান্ট মেথডের প্রোগ্রাম। এটাতে ক্যারেক্টার ইনপুটকে ইকুয়েশন হিসেবে নেয়া শেখে।
৫। ট্রাপেজয়ডাল রুল আর সিম্পসনস রুল ব্যবহার করে ইন্টিগ্রেশন প্রোগ্রাম।
যা যা করানো হবে/হচ্ছে:
ক) লজিকাল অপারেটরের ব্যবহার। if elseif else end, switch ইত্যাদি।
খ) লুপ কমান্ড। for, while লুপের ব্যবহার।
গ) পলিনোমিয়ালের রুট বের করা। (মূলত: এক লাইনেই হয়)
ঘ) মেট্রিক্সের সাহায্যে কয়েকটা ভ্যারিয়েবল একবারে সলভ করা। (মূলত: এক লাইনেই হয়)
ঙ) ২ডি, ৩ডি গ্রাফ আঁকা : প্লট, সাবপ্লট, এক্সিস, রং দেয়া ইত্যাদি
চ) ইন্টারপোলেশন
ছ) লিস্ট স্কয়ার কার্ভ ফিটিং
স্যাম্পল প্রোগ্রাম: BMI বের করার প্রোগ্রাম (BMI = kg/m^2)।
- প্রথম ধাপে এতে শুধু ইনপুট নেয়া আর আউটপুট দেয়া শেখে।
- পরবর্তী ধাপে If else end … বা if elseif else … end দিয়ে রেজাল্টের উপরে মন্তব্য করা শেখে। সাথে ক্যারেক্টার স্ট্রিং দিয়ে মন্তব্য বানানোও শেখে।
- পরবর্তী ধাপে ভুল ইনপুট রিজেক্ট করে আবার ইনপুট চায় – এতে প্রথমে for লুপ আর পরে while লুপ দেখানো হয়।
শুরু হয় এই কোড দিয়ে
kg=input('Please insert your weight in Kg = ');
m=input('Please insert your height in meters = ');
bm=kg/m^2
ধাপে ধাপে একই প্রোগ্রাম শেষে এই কোডে রূপান্তরিত হয়:
clear
clc
disp('This is a program to calculate the Body Mass Index (BMI)')
disp('========================================================')
kg=input('Please insert your weight in Kg = ');
% Check the if the value is OK or not
while 1
if kg<=0
disp('Your Weight is too low for such calculations ...')
kg=input('Please correctly enter your weight in kg = ');
elseif kg>150
disp('You have entered an abnormally high value of weight ...')
kg=input('Please correctly enter your weight in kg = ');
else
disp(' ')
break
end
end
% Now the value is OK
d1=['Your weight is = ',num2str(kg),' kg(s)'];
m=input('Please insert your height in meters = ');
% Check the if the value of m is OK or not
while 1
if m<0.3
disp('Your Height is too low for such calculations ...')
m=input('Please insert your height in meters = ');
elseif m>2.5
disp('You have entered an abnormally high value of height ...')
m=input('Please insert your height in meters = ');
else
disp(' ')
break
end
end
% Now the value is OK
d2=['Your height is = ',num2str(m),' m(s)'];
% Next line is the main calculation of the program!!
bm=kg/m^2;
d3=['Your BMI is = ',num2str(bm)];
% Comments on the results
if bm<18.5
d4='BMI < 18.5 ; You are Under-Weight.';
elseif bm<25
d4='Wow! 18.5 < BMI < 25 ; Your BMI is in normal range.';
elseif bm<30
d4='25 < BMI < 30 ; You are Over-Weight.';
else
d4='BMI > 30 ; You have Obesity.';
end
% displaying final output
disp('============Results============')
disp(' ')
disp(d1)
disp(' ')
disp(d2)
disp(' ')
disp(d3)
disp(' ')
disp(d4)
disp(' ')
disp('==============End==============')