Monday, November 19, 2012

প্রতিটি শব্দ থেকে চিহ্নিত করার উপযুক্ত বর্ণ, বর্ণাংশ বা বর্ণসমস্টি পৃথকীকরণ

বাংলার ক্ষেত্রে আমাদের চ্যালেঞ্জ ছিলো মাত্রা নিয়ে। আমাদের স্ক্যান করা পাতাটি দেখি,


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

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

এখন যেহেতু কম্পিউটার প্রতিটি শব্দের মাত্রা চিনে গেছে। সেহেতু স্রেফ সেগুলো মুছে ফেললেই মাত্রা সঙ্ক্রান্ত জটিলতা কাটিয়ে ওটা যাবে। দেখা যাক, মাত্রা মুছে ফেলার পরে কম্পিউটার পৃষ্ঠাটিকে কেমন দেখছে। 


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



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

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

যাই হোক, কাজটা সহজ হবে না। অবশ্য সহজ হলে করে মজা পেতাম না। 

Sunday, November 18, 2012

শব্দের মাত্রা নির্ণয়

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

তো এই মাত্রা নির্ণয় করতে কি করলাম একটু আগে, সেটাই এখানে লিখি।

আমাদের স্ক্যান করা পাতাটা এমন

এখান থেকে আগের পর্বে আমরা কিছু ঘসা মাজা করে একটা ইনভার্টেড সাদাকালো ছবি তৈরি করেছিলাম। ঐ ছবিটাই এই ধাপের ইনপুট।


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


ছবিটার উপর ক্লিক করে বড় করে দেখলে লক্ষ্য করবেন যে মাত্রার অংশ অন্য অংশের তুলনায় বেশি সাদা। এখন একটা নির্দিষ্ট থ্রেশহোল্ডের নিচে সবকিছুকে কালো করে দিলে পাবো


কী চমৎকার ভাবে মাত্রাগুলো পেয়ে গেছি! এখন বোঝার জন্য আমাদের আগের ইনপুটের ছবির উপর এই মাত্রাগুলো ভিন্ন রঙএ আঁকি।


বাস! হয়ে গেলো। আমরা আগের ধাপে প্রতিটি শব্দকে লাল বাক্স দিয়ে ঘিরে দিয়েছিলাম। এখন এই পার্পল দাগগুলো পেয়ে যাওয়ায়, পুরো মাত্রা ঠিক ঠিক বের করে ফেলবো। টুকি টাকি খুত এখানে কোনো বাধাই সৃষ্টি করবে না।

তার মানে এখন এই মাত্রাজ্ঞান ব্যবহার করে শব্দের বর্ণগুলোকে কেটে ফেলতে হবে। আর তার পর সেই কাটা অংশগুলো চিহ্নিত করতে পারলেই হয়ে গেল! আমাদের "দৃশ্যমান অক্ষর চিহ্নিতকরণ প্রকল্প" তার প্রোটো টাইপ স্তর পারকরবে তখন। 

তবে সাধারণ ব্যবহারকারীদের জন্য সফ্টওয়্যার হিসাবে তৈরি করতে যেতে হবে অনেকদূর। অত দূর আমি ভাবতে পারি না। 

এখন শুধু একটাই চিন্তা। পরের ধাপে কী করা যায়! 

Saturday, November 17, 2012

স্ক্যান করা বইয়ের পাতা থেকে শব্দগুলোর অবস্থান নির্ণয়

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

এ কাজে ইনপুট হিসাবে আমরা ব্যবহার করছি একটা সত্যিকারের বইয়ের স্ক্যান করা পাতা। শাহরিয়ার কবিরের লেখা জাহানারা ইমামের শেষ দিনগুলি বইটির ৬১ তম পৃষ্ঠার প্রথম প্যারা।

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


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


সবকিছু একেবারে সাদা কালোয় নিয়ে এলাম। এখানে পিক্সেলগুলোর মান হয় ২৫৫ (সাদা) অথবা ০ (কালো)। এখন লাইনগুলো আলাদা করা একেবারে সহজ।

এই ছবিতে প্রতিটি লাইনের উপরে আর নীচে একটা করে দাগ দেওয়া হয়েছে। কাজটা করতে পুরো ছবিটাকে একটা ম্যাট্রিক্স ভেবে নিয়ে সেটাকে এর প্রস্থের সমান একটা বিশেষ ভেক্টরের সাথে গুন দিইয়েছি। ভেক্টরটির প্রতিটি ইলিমেন্ট ১। ফলে আমরা আউটপুটে এই ছবির উচ্চতার সমান একটা ভেক্টর পাবো, যার প্রতিটি ইলিমেন্ট ঐ লাইন বরাবর কত্টি পিক্সেল সাদা সেটা নির্দেশ করে। সেখান থেকে লাইনগুলো বোঝা যায়। একইভাবে শব্দগুলোও নির্ণয় করে ফেলি।


এখন কোথাথেকে কতটুকুর মধ্যে শব্দগুলো আছে তা আমরা পেয়ে গেছি। এখন মূল ছবিতে শব্দগুলোকে লাল রঙের বক্সে বন্দী করে ফেলি। 

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

ভাবতেই ভালো লাগছে যে সেই বুদ্ধিটা দিতে হবে আমাকেই!

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

Wednesday, November 14, 2012

আঁকা-বাঁকা ভাবে স্ল্যান করা পাতা সোজা করার পদ্ধতি

স্ক্যান করার সময় পাতা একটু এদিক ওদিক কাত হয়ে  যেতেই পারে।
মনে করি আমাদের স্ক্যান করা পাতাটি এমন।

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

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

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


Tuesday, November 13, 2012

Installing OpenCV with Python on mac osx

There are many ways to do it and I have tried most of them but got only troubles. Only one worked for me. Lo and behold, here it is

For the record, I have Mac OS X 10.7.4

The recipe.

  1. Install Xcode from apple app store then install command line tools from xcode preference
  2. Install macports from here http://www.macports.org/install.php
  3. Open terminal put the command: sudo port selfupdate
  4. Install python26 by: sudo port install python26
  5. then: sudo port install py26-numpy
  6. (probably you don't need this step but I am recording it just because I have done it) then: sudo port install python_select 
  7. then: sudo port -v install opencv +python26
  8. it will take several hours. and install opencv-2.4.3
  9. then: sudo port select python python26
  10. this will select the newly installed python as your default. Which is absolutely necessary
  11. note, that IDLE will not work at this point. But python + opencv will. 
  12. now: sudo port install py26-tkinter
  13. this will make idle work
  14. to check it, run python from terminal and put: import cv2
  15. this should work smoothly. 
  16. do it step by step in the order stated in this recipe. Otherwise there is a high chance of falling in trouble. 
  17. now do amazing projects :) 
I have failed trying to use opencv-2.4.3 with python27. It simply does not work. If you don't want to take extra pain do it with python26 as I did. But If you really want to figure out how to use python27 check this link http://opencv.willowgarage.com/wiki/Mac_OS_X_OpenCV_Port 
And please let me know how you made it work. 


Monday, November 12, 2012

OCR Notes - 1

There are people who only appreciates the end result. Then there are people who appreciates the struggle. 

FFT can help figuring out the text orientation.

http://homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm

I wil first try to implement this.

Next step will be filters http://homepages.inf.ed.ac.uk/rbf/HIPR2/filtops.htm

tesseract-ocr looks great
http://code.google.com/p/tesseract-ocr/

This python implementation looks promising http://code.google.com/p/ocropus/

Page layout analysis

a good book on OCR problems
 Optical character recognition : an illustrated guide to the frontier / by Stephen V. Rice, George Nagy, Thomas A. Nartker.



http://libencore.nus.edu.sg/iii/encore/record/C%7CRb2109828%7CSoptical+character+recognition%7COrightresult%7CX5?lang=eng&suite=def

Installation of opencv on mac
http://www.youtube.com/watch?v=i9hYiMXLZRs

http://www.opencvpython.blogspot.sg/2011/04/welcome-to-opencv-python.html

http://opencv.willowgarage.com/wiki/InstallGuide

opencv+python+mac nightmare 

Nice blog with many functionality implemented 
http://felix.abecassis.me/2011/10/opencv-rotation-deskewing/

ওসিআর প্রোজেক্ট

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

আজকাল প্রোগ্রামিং করার জন্য হাত নিশ-পিশ করছে। প্রোটোটাইপটা তৈরি করে ফেলার তাই এখনই শ্রেষ্ঠ সময়। 

Tuesday, November 6, 2012

correlation vs. causation

Data will provide you with correlations. But figuring out the causal chain requires originality and creative thinking. 

Sunday, November 4, 2012

One thing I have learned

One thing I have learned and I don't want to forget is- you must have brave people around you. You might not meet them 'just out of luck'. You have to search for them, spot them and take action to get acquainted.

All the human difference we see, be it in brilliance or in depth of thought, be it in creativity or in throughput, boils down to who is a coward and who is not.

When something is important enough you do it even thought the odds are not in your favor.  -Elon Musk
You need people who have a mindset like this around you.

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

I look for good-hearted people which is always very very important. But goodhearted cowards amounts to nothing.



এই ভিডিওটা এখানে রেখে দিই।

Saturday, November 3, 2012

Dreams and Actions

I must not control my dreams. Dreams are meant to be free. Everything else, I must be in perfect control of. 

HOW to BECOME a GOOD THEORETICAL PHYSICIST

a nice index of resources on internet that I have found. thanks to Saeed Siam

This is a web site (still under construction) for young students - and anyone else - who are (like me) thrilled by the challenges posed by real science, and who are - like me - determined to use their brains to discover new things about the physical world that we are living in. In short, it is for all those who decided to study theoretical physics, in their own time.
http://www.staff.science.uu.nl/~hooft101/theorist.html

Friday, November 2, 2012

একটুখানি প্রোগ্রামিং (দ্বিতীয় প্রচেষ্টা) -2

Computer programming is an art form, like the creation of poetry or music. -Donald Knuth
গসাগু বের করার একটা সিউডো কোড লেখা হলো আজকে। বার বার ইংরেজী থেকে বাংলায় শিফ্ট করা মুশকিল হয়ে যাচ্ছে। ভাবছি বাংলাতেই লিখে ফেলবো। পরে পুরো অধ্যায় শেষ হলে বাংলাগুলোকে ইংরেজীতে বদলে দিতে হবে। 

১) এখন ফ্লো চার্ট। কিভাবে করা যায় সেটা দেখাবো। 
২) প্রথমে সিম্পল ডিসিশন। এর পরে লুপ দেখবো। লুপের উদাহরণে জোড় সংখ্যার যোগফল বের করা দেখাতে হবে। এটা করতে গিয়ে এ=এ+১ ধরনের লাইনের সঙ্গে পাঠককে পরিচিত করে তুলবো। লুপ কি বোঝাতে হবে। 
৩) আধুনিক প্রোগ্রামিং ভাষায় গো টু বলার বদলে কেন লুপ ব্যবহার করা হয় সেটাও বলতে হবে। 
৪) গো টুর বদলে লুপ আকারে কিভাবে জোড় সংখ্যাদের যোগ করার প্রোগ্রামটি লেখা যেত সেটা লিখতে হবে। 
৫) আমাদের গসাগু বের করার প্রোগ্রামটির ফ্লো চার্টটি দেখতে হবে। এখানে লুপ কোথায় আছে সেটা খুঁজে বের করতে হবে। তারপরে গো-টু কে লুপ আকারে লেখার উপায়টা দেখতে হবে। 
৬) কোনো সংখ্যা প্রাইম কি না সেটা পরীক্ষা করার প্রোগ্রাম দেখতে হবে। 
৭) এটাকে ফাংশন হিসাবে ব্যবহার করে, প্রথম এন টি মৌলিক সংখ্যার যোগফল বের করার প্রোগ্রাম লিখতে শেখাতে হবে।
৮) ফ্লো চার্টকে গো-টু ফর্মালিজমে না লিখে লুপ ফর্মালিজমে লেখার উপায় বের করতে হবে। সেখান থেকে কেন, লুপই সেরা বুদ্ধি সেটা বুঝিয়ে দিতে হবে। 
৯) একটা অতিরিক্ত অধ্যায় করতে হবে যেখানে পাইথন ভাষায় আমাদের এইসব সুডোকোড গুলো লিখতে শেখাতে হবে। কোনো নির্দিষ্ট প্রোগ্রামিং ভাষা শেখার সময় কি কি জিনিশ খেয়াল করতে হয় সেটা এই আলোচনায় থাকবে। অর্থাত, ঐ ভাষায় ভেরিয়েবল কিভাবে লেখে, লুপ কিভাবে লেখে অ্যারে, ফাংশন ইত্যাদি কিভাবে লেখে এসব। তবে আপাতত এই টেকনিক্যালিটি নিয়ে ভাবব না। 

১০) প্রোগ্রামিং চ্যাপ্টারটা শেষ হলে, কম্পিউটার বিজ্ঞান কী, কম্পিউতার ইঞ্জিনিয়ারিং কী, এসবের নানান শাখা প্রশাখা আর কোনটাতে কী কূল জিনিশ করা জায় সেসব লিখতে হবে। এটা হবে শুরুর দিকের চ্যাপ্টার। 

১১) নানান রকম গবেষণায় কম্পিউটার নামক চ্যাপ্টারটা প্রোগ্রামিং চ্যাপ্টারের পরে লিখতে হবে। টুকিটাকি সিমুলেশন দেখানো যেতে পারে। 

১২) কমিউনিকেশন ইনরমেশন থিওরী। 

১৩) প্রোসেসরের গঠন। লজিক। 

 ১৪) বাবা-মাদের জন্য কম্পিউটার! 




এখন আসি আমাদের কাল্পনিক কম্পিউটারটির কাছে। 
[ নীচে নোট] 

গণিতের ফাংশনের কথা আমরা জানি। $f(x,y)=x^2+xy$ যেমন একটা গাণিতিক ফাংশন। f(2,3) এর মান হবে এখানে $2^2+2*3=10$ তাই $f(2,3)=10$ মনে করি আমাদের কাল্পনিক কম্পিউটারে এরকম একটা ফাংশন আছে তার নাম rem এই rem ফাংশন দুইটি সংখ্যা ভাগ করলে কত অবশিষ্ট থাকে সেটা বের করে। অর্থাৎ $rem(16,6)$ এর মান 4। কারণ ১৬ কে ৬ দিয়ে ভাগ করলে অবশিষ্ট থাকে 4। আগের f ফাংশনটির ক্ষেত্রে হিসাবটা কিভাবে করা হয় সেটা আমরা দেখেছি। এই রেম ফাংশন গণনারও তেমন কোনো হিসাব আছে যেটা আমাদের কম্পিউটার জানে। আমরা স্রেফ জানি  $rem(a,b)$ লিখলে কম্পিউটার a কে b দিয়ে ভাগ দেবে এবং ভাগশেষ টি আমাদের জানিয়ে দেবে। 
এখন এই লাইনটা দেখি,
$c \leftarrow rem(a,b)$ 
এর মানে হলো $rem(a,b)$ মান গণনা করে c এর মধ্যে রাখ। ব্যাপারটার সাথে আমাদের প্রথম বানরের গল্পের একটা মিল দেখতে পাই। প্রহম বানরকে লাল আর সবুজ কার্ডে কোনো সংখ্যা লিখে দিলে সে তাদের ভাগশেষ জানিয়ে দিতো। এই কাজে সবুজকে ভাগ দিতো লাল কার্ডের সংখ্যা দিয়ে। আমাদের রেম ফাংশনটাও তাই করছে। প্রথম সংখ্যাটিকে ভাগ দিচ্ছে দ্বিতীয় সংখ্যা দিয়ে। তাই এখানে প্রথমটি মানে এ হচ্ছে সবুজ কার্ড। বি হচ্ছে লাল কার্ড আর সি হচ্ছে হলুদ কার্ড যেখানে ফলাফল লিখিত হয়। রেম কে আমাদের বানর ভাবতে পারি। 

অর্থাৎ কম্পিউটারের ভাষায় লিখলে
হলুদকার্ড <- nbsp="nbsp" span="span">
এই হলো আমাদের প্রথম বানরের গাণিতিক বর্ণনা! কম্পিউটার অবশ্য লাল হলুদ দিয়ে মনে রাখে না। সে মনে রাখে ফাংশনে কোন অবস্থানে কি লেখা হচ্ছে। 

যেমন আমি যদি পি <- nbsp="nbsp" span="span">

এখন মনে করুণ আমরা জিসিডি নামক একটি ফাংশন বানাতে চাই। যার কাজ ইনপুটের দুইটি সংখ্যার গসাগু (গ্রেটএস্ট কমন ডিভিজর) বের করে আমাদের জানানো। 

অর্থাৎ, 
জিসিডি(১৬, ৬) এর মান হবে ২ 
সি <- nbsp="nbsp" span="span">
এর অর্থ কম্পিউটারকে বলা, ১৬ ও ৬ এর জিসিডি বের করে সি নামক ভেরিয়েবলে লেখ। কিন্তু কম্পিউটারের মত বোকা একটা প্রাণী সেই কাজ পারবে কিভাবে? সেটাও আগে থেকে তাকে লিখে দিতে হবে। 

নিচে সেই কাজের তালিকা কম্পিউটারের ভাষায় লেখার চেষ্টা করি। 

gcd(a,b)              //returns the gcd of a and b
  1. red <- a="a" nbsp="nbsp" span="span">
  2. green <- b="b" nbsp="nbsp" span="span">
  3. clear(yellow)   //হলুদ কার্ডটি মুছে পরিষ্কার করে রাখ। 
  4. yellow <- green="green" nbsp="nbsp" red="red" rem="rem" span="span">
  5. if yellow is equal to 0. output green and stop.  //ভাগশেষ শূন্য পাওয়ার অর্থ গসাগু পেয়ে গেছি। এখানেই থামতে হবে।
  6. (else) green<-red nbsp="nbsp" span="span">
  7. red<- nbsp="nbsp" span="span" yellow="yellow">
  8. goback to step 4      //এই নতুন সংখ্যাগুলো নিয়ে আবার চতুর্থ ধাপে রেম বানরের কাছে ফিরে যাও। 

এইতো আমরা আমাদের প্রথম কম্পিউটার প্রোগ্রাম লিখে ফেলেছি! ৫ নাম্বার লাইনে অবশ্য এখনো একটা ইংরেজী বাক্য আছে। বেশিরভাগ প্রচলিত কম্পিউটার ভাষায় ঐ লাইনটা লেখা হবে, 
if (yellow == 0) return green 

এভাবে। অর্থাৎ, ব্রাকেটের মাঝখানে যে কথাটি লেখা সেটা সত্যি হলে ব্রাকেটের পরের কাজটি করো। 

চিত্র-৪ এ জিসিডি(২৪,১৫) ফাংশনটা হিসাব করার ধাপগুলো দেখানো হলো। 

Thursday, November 1, 2012

একটুখানি প্রোগ্রামিং (দ্বিতীয় প্রচেষ্টা)



But though this book does not presuppose on the part of the reader a mathematical education, it presupposes something just as rare; a capacity for absorbing and apprising ideas. -Tobias Dantzig

কম্পিউটার প্রোগ্রামিং শিখতে আগ্রহীদের প্রায়ই যে প্রশ্নগুলো করতে শোনা যায় তা হচ্ছে, "কোন ভাষাটি শিখবো? সি, জাভা, পাইথন, নাকি অন্য কিছু।" এটা ঠিক কম্পিউটারকে সফল ভাবে কোনো সমস্যা সমাধানের অ্যালগরিদম শিখিয়ে দিতে প্রোগ্রামিং ভাষা জানতেই হবে। কিন্তু কম্পিউটার প্রোগ্রামিং ব্যাপারটা ঠিক ভাষা নির্ভর নয়। অর্থাৎ কোনো ব্যক্তি যদি সি++ এ দারুণ প্রোগ্রামিং করতে পারে, সে যদি জীবনে পাইথন ভাষায় কোনো প্রোগ্রাম কখনো না লিখে থাকে, তার পরেও ঘন্টা খানেক চেষ্টা করলেই কাজ চালিয়ে নেওয়ার মত ছোটো খাট প্রোগ্রাম লিখতে পারবে। কয়েক দিনের প্রচেষ্টাতেই বড় বড় সফ্টওয়ার বানানোর প্রোজেক্টে ঐ ভাষাটি ব্যবহার করতে পারবে। কম্পিউটার ভাষা না হয়ে মানুষের মুখের ভাষা হলে ব্যাপারটা এত সহজ হতো না। তাই দেখা যাচ্ছে, কম্পিউটার প্রোগ্রামিং এর ভাষা যাই হোক না কেন এদের মধ্যে একটা অন্তর্নিহীত মিল আছে আর আছে এক ধরনের সারল্য। তাই হঠাৎ দেখায় প্রোগ্রামিং এর কোড যতই বিদঘুটে লাগুক একবার মূল ব্যাপারটা ধরে ফেললে, যে কোনো কম্পিউটার ভাষাই শিখে ফেলা যায় নিমেষে!

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

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

ভাজক) ভাজ্য (ভাগফল
          .......
          ভাগশেষ

নিঃসন্দেহে বানর বেশ বুদ্ধিমান। তো আপনি ভাবলেন, এতটুকু যেহেতু পারে একে তাহলে গসাগু বের করার নিয়মও শিখিয়ে দেওয়া যায়। তেমন কিছুই না, স্রেফ ভাগশেষ যেটা পাবে, সেটা দিয়ে আগেরবারের ভাজককে ভাগ করবে। নতুন ভাগশেষ ০ হলে গসাগু পেয়ে গেল। আর না হলে একই কাজ করতে থাকবে বার বার। [চিত্র -১] এক সময় গসাগু বের হবেই। তো মুখে বললে তো বানর শিখবে না। তাকে প্র্যাক্টিস করাতে হবে। সে জন্য আপনি লাল সবুজ আর হলুদ তিন রঙের তিনটি কার্ড, একটা পেনসিল আর ইরেজার নিয়ে বসলেন।

তো প্রথমে লাল কাগজে ভাজক (ধরিরি ৬) লিখে আর আর সবুজ কাগজে ভাজ্য (ধরি ১৬) লিখে বানরটিকে দেওয়া হলো। ধরি বানরের নাম ক! তো, ক তখন, হলুদ কাগজে লিখে দেবে ৪ যেটা কিনা আগের সংখ্যা দুটির ভাগশেষ। গসাগু নির্ণয়ের জন্য এই নতুন ভাগশেষকে দিয়ে ভাগ করতে হবে আগের ভাজক কে। তো বানরটিকে দিয়ে নতুন ভাগ করানোর জন্য সবুজ কাগজের আগের লেখা মুছে আপনি লিখে দিলেন

---------------------


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

ভাজক) ভাজ্য (ভাগফল
          .......
          ভাগশেষ
[চিত্র-১]

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

এর জন্য লাগবে লাল সবুজ হলুদ তিন রঙের তিনটি কার্ড, একটা পেনসিল আর ইরেজার।
প্রথমে মনে করুন লাল কার্ডে ৬ আর সবুজ কার্ডে ১৬ লিখে বানরটিকে দেওয়া হলো। সে হলুদ কার্ডে উত্তর দিলো ৪। আমরা জানি  ১৬ কে ৬ দিয়ে ভাগ করলে ভাগশেষ থাকে ৪। অর্থাৎ বানরটই ঠিক উত্তরই দিয়েছে। কিন্তু আমরা গসাগু বের করতে চাই, তাই এখানে থেমে গেলেই হবে না। কারণ ভাগশেষ ০ হয়নি। অর্থাৎ পরের ধাপে ৪ দিয়ে ৬ কে ভাগ করতে হবে। আর বানরকে দিয়ে সেটা করাতে হলে লাল কার্ডে ৪ ও সবুজ কার্ডে ৬ লিখে দিতে হবে। হলুদ কার্ডটিও মুছে পরিষ্কার করে দিতে হবে আমাদের। আগের কোন সংখ্যাটি মুছে পরের কোন কার্ডে লিখতে হবে সেটা [চিত্র-৩] এ দেখা যাচ্ছে। এরকম করলে এবার হলুদ কার্ডে সে ভাগশেষ লিখবে ২। যেটা অশূন্য। অর্থাৎ আরেক ধাপ করতে হবে আমাদের। এবারে, লাল<- nbsp="nbsp" p="p">
সমস্যা হলো, যে বানর ভাগ করতে শিখেছে (ধরি ওর নাম ক), ঐ কাজেই তার মানসিক ক্ষমতা সব খরচ করে ফেলেছে। ফলে আবার কখন কোন সংখ্যা, কোন কার্ড থেকে মুছে নতুন কোন কার্ডে লিখে দিতে হবে, এত সব নতুন নিয়ম শেখা তার পক্ষে প্রায় অসম্ভব। কিন্তু চাইলে আমরা এই মোছা/লেখার নিয়মটা আরেকটা বানরকে (ধরি ওর নাম খ) শিখিয়ে দিতে পারি। তখন আর আমাদের খাটাখাটি করতে হবে না। তো দ্বিতীয় বানরটিকে এক্সাক্টলি কি ট্রেনিং দেব সেটা আমরা আমাদের গবেষণা খাতায় লিখে রাখতে পারি। এখানে // দাগের পরে লেখাগুলো হচ্ছে আগে কি লিখলাম সেটা বুঝিয়ে বলার জন্য মন্তব্য। এর ফলে আমরা উপস্থিত না থাকলেও, অন্যকেউ এই গবেষণাগারে এসে বানরটিকে ঠিক কি ট্রেনিং দেওয়া হয়েছে পরিষ্কার বুঝতে পারবে।

গসাগু ট্রেইনিং
১. লাল <- nbsp="nbsp" p="p">২. সবুজ <- nbsp="nbsp" p="p">৩. হলুদ<- nbsp="nbsp" p="p">৪. কার্ডতিনটি ক বানরকে দাও।           // এই ধাপের পরে ক বানরটা ভাগশেষটা লিখে দেবে হলুদ কার্ডে। বাকিগুলোও ফেরত দেবে।
৫. হলুদ কার্ডে কি ০ লেখা? তাহলে লাল কার্ডের সংখ্যাটই নির্ণেয় গসাগু।     // কাজ শেষ।
৬. নাহলে,  সবুজ<- nbsp="nbsp" p="p">                                                   সংখ্যাটি লিখতে হবে।

৭. লাল<- nbsp="nbsp" p="p">৮. হলুদ<- nbsp="nbsp" p="p">৯. ৪ নাম্বার ধাপে যাও।                     // অর্থাৎ আবারো ক বানরকে দিয়ে ভাগ করাও। এবং পরবর্তী কাজগুলো একইভাবে
                                                     করতে থাকো। ভাগশেষ শূন্য পাওয়া গেলে ৫ নাম্বার ধাপেই পুরো প্রক্রিয়াটি থেমে যাবে। 

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

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

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


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


এখন আসি আমাদের কাল্পনিক কম্পিউটারটির কাছে।
[ নীচে নোট]

ক বানরটি যেমন নানান রঙের কার্ড চেনে। তেমনি কম্পিউটারও নানান রকম ভেরিয়েবল চেনে, ঐসব ভেরিয়েবলে আমাদের হিসাবের জন্য প্রয়োজনীয় সংখ্যাটি সে লিখে রাখে। ওগুলোকে কম্পিউটারের মধ্যে ছোট ছোট কার্ড ভেবে নিতে পারি আমরা। এইসব মেমরীকে, a, b, c এরকম নানান নাম দেওয়া যায়।

মনে করুন a, b দুইটি ভেরিয়েবল। অর্থাৎ কম্পিউটারের ভিতরে a, b নামক দুইটি যায়গায় দুইটি সংখ্যা লেখা আছে।
এখন কম্পিউটারের সাহায্যে এদের ভাগশেষ নির্নয় করে হলে লিখতে হবে a%b।