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।

Monday, October 29, 2012

The message I needed


Reaching a wider audience is not worth sacrificing your content.  - Edmund Carpenter 
May be more people will hear you but what you actually want to say will be lost.  - Vi Hart


Saturday, October 27, 2012

Quantum Teleportation

Physicists passed a milestone in the development of a 'quantum internet' by transmitting quantum states between telescopes on La Palma and Tenerife – a record distance of 143km. The visible laser beam was used to stabilise the telescopes sending and receiving the quantum signal. In theory, 'quantum teleportation' will enable the exchange of messages with greater security, and allow calculations to be performed much more efficiently than is currently possible source:

http://www.guardian.co.uk/science/gallery/2012/oct/26/month-space-quantum-teleportation-pictures#/?picture=398163891&index=9

সময় নষ্ট এবং...

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