Python Fundamentals

সময় – ছয় সপ্তাহ, প্রতি সপ্তাহে ২টা ক্লাস, মোট ১২টা ক্লাস। প্রতিটি ক্লাস দেড় থেকে দুই ঘণ্টার। জুম (zoom) ব্যবহার করে অনলাইনে লাইভ ক্লাস নেওয়া হবে।

কোর্স শুরুর তারিখ (২য় ব্যাচ) – ডিসেম্বের ১৮, ২০২২।

কোর্সের উদ্দেশ্য – পাইথন প্রোগ্রামিং ভাষা ব্যবহার করে প্রোগ্রামিংয়ের একটি শক্ত ভিত্তি তৈরি করা।

ক্লাস হবে রবিবার ও মঙ্গলবার বাংলাদেশ সময় বিকাল তিনটা থেকে পাঁচটা পর্যন্ত।

কোর্স ফি – ৪০০০ টাকা (চার হাজার টাকা) অথবা ৬০ মার্কিন ডলার (যারা বাংলাদেশের বাইরে থেকে করবে)।

কোর্সের বিষয়বস্তু

Hello world, Variable, Data Type, Conditional Logic, Loop, String, Data Structures (List, Set, Tuple, Dictionary), Introduction to Problem Solving, Files, Module and Package, Class and Objects, Introduction to Pygames.

কোর্স সম্পর্কিত কিছু তথ্য – 

  • যারা প্রোগ্রামিংয়ে একেবারেই নতুন, তাদের জন্য কোর্সটি উপযোগী।
  • লাইভ ক্লাস রেকর্ড করা হবে। তবে যারা সরাসরি ক্লাসে উপস্থিত থাকতে পারবে, তারাই কোর্সটি করে লাভবান হবে।
  • কোর্সের জন্য সহায়ক বই – পাইথন দিয়ে প্রোগ্রামিং শেখা ১ম খণ্ড (তামিম শাহরিয়ার সুবিন), কিংবা pybook.subeen.com
  • কোর্সের শিক্ষার্থীদের জন্য একটি বিশেষ ফেসবুক গ্রুপ চালু করা হবে যেখানে বিভিন্ন সমস্যার উত্তর দেওয়া হবে।
  • কোর্স শেষে কোনো পরীক্ষা নেওয়া হবে না।
  • কোর্স করলে কোনো সার্টিফিকেট দেওয়া হবে না।
  • লাইভ ক্লাসে অংশগ্রহন করার পাশাপাশি প্রতি সপ্তাহে বাসায় আট-দশ ঘণ্টা প্র্যাকটিস করতে হবে। শুধু ক্লাস করলে প্রোগ্রামিং শেখা যাবে না।

পরবর্তী ব্যাচে অংশগ্রহন করতে চাইলে বিকাশের মাধ্যমে কোর্স ফি পরিশোধ করে book@subeen.com ঠিকানায় স্ক্রিনশট ইমেইল করতে হবে। বিকাশ নম্বর 01707960372 (মার্চেন্ট একাউন্ট)। যারা পেপ্যালে কোর্স ফি দিতে চায়, subeents এট জিমেইল ডট কম-এ পে করতে পারবে। তারপরে book@subeen.com-এ ইমেইল করে জানাতে হবে।

Leave a Reply

সিস্টেম ডিজাইন ইন্টারভিউ

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

কোর্স সম্পর্কিত তথ্য –

কোর্সের ব্যাপ্তীপাঁচ সপ্তাহ, সপ্তাহে এক দিন ক্লাস
কোর্সের ধরনলাইভ ক্লাস (জুম ব্যবহার করে)
ক্লাসের সময়শনিবার (বিকাল ৫টা) – প্রতিটি ক্লাস দুই ঘণ্টা
কোর্স ফি৩৮০০ টাকা কিংবা ৪৫ মার্কিন ডলার
পরবর্তী ব্যাচ শুরুর তারিখ৭ জানুয়ারি ২০২৩
যোগাযোগbook@subeen.com

কোর্সে কী কী বিষয় আলোচনা করা হবে?

  • ডিস্ট্রিবিউটেড সিস্টেম নিয়ে প্রাথমিক ধারণা
  • আমার নিজের অভিজ্ঞতা থেকে দুটি রিয়েল লাইফ সিস্টেম ডিজাইন
  • চারটি কমন সিস্টেম ডিজাইন প্রবলেম নিয়ে আলোচনা
  • সিস্টেম ডিজাইন ইন্টারভিউ টিপস

কোর্সটি কাদের জন্য?

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

পরবর্তী ব্যাচে অংশগ্রহন করতে চাইলে বিকাশের মাধ্যমে কোর্স ফি পরিশোধ করে book@subeen.com ঠিকানায় স্ক্রিনশট ইমেইল করতে হবে। বিকাশ নম্বর 01707960372 (এটি একটি মার্চেন্ট একাউন্ট)। যারা পেপ্যালে কোর্স ফি দিতে চায়, subeents এট জিমেইল ডট কম-এ পে করতে পারবে। তারপরে book@subeen.com-এ ইমেইল করে জানাতে হবে।

ইমেইলের উত্তর অনেক সময় স্প্যাম ফোল্ডারে চলে যেতে পারে, তাই সেখানে লক্ষ রাখতে হবে।

Leave a Reply

The Checklist Manifesto!

২০০৯ সালের জানুয়ারি মাসের ১৫ তারিখ। ১৫৫ জন যাত্রী নিয়ে এয়ারবাস A320 বিমানে উড়াল দিলেন দুই পাইলট – ফার্স্ট অফিসার জেফরি স্কাইলেস ও ক্যাপ্টেন চেসলি সালেনবার্গার। উড্ডয়নের পরে আকাশে বড়সর পাখির আঘাতে বিমানের দুটি ইঞ্জিনই বিকল হয়ে গেল। তখন কাছাকাছি কোনো এয়ারপোর্টে বিমান অবতরণের অবস্থা নেই, কারণ বিমান আর বেশিক্ষণ আকাশে উড়বে না। তাই পাইলটরা বিমানটি হাডসন নদীতে নামিয়ে দিলেন আর ভাগ্যক্রমে সকল যাত্রী প্রাণে বেঁচে গেলেন। ক্যাপ্টেন সালেনবার্গার তখন জাতীয় বীরে পরিণত হলেন। যদিও তিনি খুব পরিষ্কারভাবেই বলেছিলেন যে ঠিক কী উপায় অবলম্বন করে তাঁরা সফলভাবে বিমানটি অবতরণ করালেন, কিন্তু মিডিয়ার আগ্রহ সেদিকে নয়। কী ছিল সেই জিনিস যা বিকল ইঞ্জিনের বিমানের যাত্রীদের জীবন রক্ষায় গুরুত্বপূর্ণ ভূমিকা রেখেছিল?

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

  • প্রোগ্রাম কম্পাইল হচ্ছে?
  • প্রোগ্রাম স্যাম্পল ইনপুটের জন্য সঠিক আউটপুট দিচ্ছে?
  • আমরা কি সঠিক সমস্যাটির সমাধান জমা দিচ্ছি? (মানে প্রবলেম A-এর জায়গায় প্রবলেম B-এর সমাধান জমা দিয়ে ফেলছি না তো?)

সম্প্রতি আমি অস্ট্রেলিয়ার সিডনিতে সেইফটি কালচার (SafetyCulture) নামে একটি প্রতিষ্ঠানে যোগ দিয়েছি। যারা এই চেকলিস্টকে পুঁজি করেই বিলিয়ন ডলারের ব্যবসা দাঁড় করিয়ে ফেলেছে। সেখানে যোগদানের প্রথম দিনেই দেখি আমার ডেস্কে আমার পড়ার জন্য একটি বই রাখা – 

বইটি পড়লাম। ওপরের বিমান দুর্ঘটনার কথা ওই বইতেই জানলাম। বইয়ের লেখক যুক্তরাষ্ট্রের একজন প্রখ্যাত শল্যচিকিৎসক (সার্জন)। সেই সঙ্গে একজন বেস্টসেলার লেখকও বটে। ২০০৯ সালে প্রকাশিত এই বইতে উনি লিখেছেন, কিভাবে চেকলিস্ট ব্যবহার করে অপারেশনের সময় জটিলতা ও মৃত্যু কমিয়ে আনা যায়। এজন্য উনাকে দীর্ঘ পরিশ্রম করতে হয়েছিল এবং WHO (World Health Organization)-এর সহায়তায় একটি পাইলট প্রকল্পের সমাপ্তির পরেই উনারা এই চেকলিস্টের সাফল্যের ব্যাপারে নিশ্চিত হন।

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

চেকলিস্ট বিষয়টি যত সহজ, তবে মানুষকে দিয়ে এটি ব্যবহার করানোর ততটাই কঠিন। বইয়ের পরতে পরতে রয়েছে নানান ঘটনা, আর লেখকের অভিজ্ঞতার কথা। বইটি অ্যামাজন থেকে কিনে পড়া যাবে – 

Leave a Reply

গেম অব লাইফ

গেম অব লাইফ বা সংক্ষেপে লাইফ হচ্ছে একটি সেলুলার অটোমাটন। এটি একটি জিরো-প্লেয়ার গেম, অর্থাৎ এটি কারো হস্তক্ষেপ ছাড়াই প্রাথমিক একটি অবস্থা থেকে নিজে নিজে চলতে থাকে।

১৯৭০ সালে গেমটি উদ্ভাবন করেন ব্রিটিশ গণিতবিদ জন হর্টন কনওয়ে (২৬ ডিসেম্বর ১৯৩৭ – ১১ এপ্রিল ২০২০)। ফাইনাইট গ্রুপ (finite groups), নট থিউরি (knot theory), সংখ্যাতত্ত্ব, কম্বিনেটরিয়াল গেম থিউরি, কোডিং থিউরিসহ অনেক বিষয়ে তিনি কাজ করেছেন। তবে গেম অব লাইফ উদ্ভাবনের জন্য তিনি বিশেষভাবে পরিচিত।

১৯৪০-এর দশকের শেষ দিকে জন ভন নিউম্যান জীবনকে (Life) এমন একটি ‘সৃষ্টি’ হিসেবে আখ্যায়িত করেন, যা নিজেই নিজের প্রতিরূপ সৃষ্টি করতে পারে এবং একটি টুরিং মেশিনকে সিমুলেট করতে পারে। ভন নিউম্যান এর একটি বাস্তব মডেল তৈরি করতে চেয়েছিলেন, কিন্তু তৎকালীন প্রযুক্তির সীমাবদ্ধতার কারণে করতে পারেননি। তাঁর ধারণাকে সিমুলেট করতে স্তানিসোয়াফ উলাম (Stanisław Ulam) আবিষ্কার করেন সেলুলার অটোমাটা। নিউম্যান পরে সেলুলার অটোমাটন ব্যবহার করে তাঁর ডিজাইনটি তৈরি করেন।

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

গেম অব লাইফ ১৯৭০ সালে সায়েন্টিফিক আমেরিকানে প্রথম প্রকাশিত হয়।

নিয়ম

গেমটি একটি দ্বিমাত্রিক গ্রিড নিয়ে গঠিত। এই গ্রিড অসীম পর্যন্ত বিস্তৃত। গ্রিডের প্রতিটি ঘর সম্ভাব্য দুটি অবস্থার যেকোনো একটি অবস্থায় থাকে : জীবিত অথবা মৃত (অন/অফ)। প্রতিটি ঘরের সাথে তার আশেপাশের আটটি ঘরের মিথস্ক্রিয়া (interaction) হয়। আটটি ঘর হচ্ছে চারপাশের চারটি এবং কোনাকুনি চারটি।

গেমটি ধাপে ধাপে সম্পন্ন হয়। যেকোনো ধাপে নির্দিষ্ট ঘটনা একই সময়ে গ্রিডের প্রতিটি ঘরে সম্পন্ন হয়। প্রতি ধাপে নিচের চারটি ঘটনা ঘটে :

  • যেকোনো জীবিত ঘরের যদি দুটির কম জীবিত প্রতিবেশী থাকে, তাহলে ঘরটি মারা যায়।
  • যেকোনো জীবিত ঘরের যদি দুই বা তিনটি জীবিত প্রতিবেশী থাকে, তাহলে ঘরটি পরের ধাপে বেঁচে থাকে।
  • যেকোনো জীবিত ঘরের যদি তিনটির বেশি জীবিত প্রতিবেশী থাকে, তাহলে ঘরটি মারা যায় (সংখ্যাধিক্যের কারণে)।
  • যেকোনো মৃত ঘরের যদি ঠিক তিনটি জীবিত প্রতিবেশী থাকে, তাহলে ঘরটি জীবিত হয়ে ওঠে (নতুন করে জন্মায়)।

এই চারটি ধাপকে তিনটি ধাপে সংকুচিত করা যায় :

  • যেকোনো জীবিত ঘরের যদি দুই বা তিনটি জীবিত প্রতিবেশী থাকে, তাহলে ঘরটি পরের ধাপে জীবিত থাকবে।
  • যেকোনো মৃত ঘরের যদি ঠিক তিনটি জীবিত প্রতিবেশী থাকে, তাহলে ঘরটি পরের ধাপে জীবিত হয়ে উঠবে।
  • বাকি সব জীবিত ঘর পরের ধাপে মারা যাবে। মৃত ঘরগুলো মৃতই থাকবে।

এভাবে ধাপে ধাপে গেমটির একেকটি প্রজন্ম তৈরি হয়। প্রতিটি প্রজন্ম তার পূর্বের প্রজন্মের একটি ফাংশন। অর্থাৎ, পূর্বের প্রজন্মের নির্দিষ্ট বিন্যাসের জন্য পরের প্রজন্মে সব সময় একই বিন্যাস তৈরি হবে।

লাইফের নমুনা

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

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

নিচে দেওয়া প্রোগ্রামটির র‌্যানডম ভার্শন কয়েকবার চালালে প্রচুর স্টিল লাইফ ও ব্লিংকার দেখা যাবে। কপাল ভালো হলে কিছু স্পেসশিপও দেখা যাবে।

Game of life blinker.gif
চিত্র ২ : ব্লিংকার
Game of life animated glider.gif
চিত্র ৩ : গ্লাইডার
Game of life pulsar.gif
চিত্র ৪ : পালসার
চিত্র ৫ : ক্রস
কম্পিউটার সিমুলেশন

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

এখানে পাইথন দিয়ে একটি কোড দেখানো হলো। গ্রিডের আকার পরিবর্তন করতে main() ফাংশনে size ভ্যারিয়েবলটি পরিবর্তন করতে হবে (লাইন ৮১)। গসপারের গ্লাইডার গান (চিত্র ১) সিমুলেট করতে choice ভ্যারিয়েবলের মান পরিবর্তন করে অন্য কিছু বা ফাঁকা স্ট্রিং দিলেই হবে (লাইন ৮২)।

[ছবি ও তথ্য : উইকিপিডিয়া]

Leave a Reply

ভিম : কাস্টমাইজেশন

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

এই পর্বের সবচেয়ে দরকারি জিনিস হচ্ছে .vimrc ফাইল। ভিম ওপেন হওয়ার সময় এই ফাইলটি পড়ে বিভিন্ন কনফিগারেশন ঠিক করে নেয়। স্থায়ীভাবে কোনোকিছু সেট করতে আমাদের এই ফাইলে কনফিগারেশনগুলো লিখতে হবে। লিনাক্সে /etc/vim/vimrc বা /etc/vimrc ফাইলেও কনফিগারেশন থাকতে পারে। তবে সেগুলোতে হাত না দেওয়াই ভালো, যদি না আপনি জানেন যে আপনি ঠিক কী করছেন।

টার্মিনাল ওপেন করে নিচের কমান্ডটি এক্সিকিউট করুন –

$ vim ~/.vimrc

এতে .vimrc ফাইলটি খুলবে।

ধরে নিচ্ছি এই লেখা যারা পড়ছেন, তারা সবাই প্রোগ্রামার। তাই প্রোগ্রামিংসংক্রান্ত কিছু কাজ দিয়েই শুরু করা যাক। প্রথমেই আমাদের দরকার লাইন নম্বর। .vimrc ফাইলে লিখে ফেলুন –

set number

এবার ফাইলটি সেভ করে ভিম বন্ধ করুন। আবার ওপেন করুন। এখন লাইন নম্বর দেখা যাচ্ছে। কোডের সিনট্যাক্স হাইলাইটিংয়ের জন্য লিখুন –

syntax on

অটো ইনডেন্টেশনের জন্য লিখুন –

filetype plugin indent on

ভিমে ট্যাব ক্যারেক্টারের দৈর্ঘ ডিফল্টভাবে ৮ স্পেস, যা অনেকেরই পছন্দ না। আবার ট্যাব ক্যারেক্টারের বদলে স্পেস ব্যবহার করা একটি ভালো অভ্যাস। সুতরাং নিচের লাইনগুলোও লিখে ফেলুন –

set tabstop=4
set shiftwidth=4
set expandtab

এবার ফাইলটি সেভ করে নিন। প্রোগ্রামিংয়ের জন্য ভিম তৈরি হয়ে গেল।

কম্পিটিটিভ প্রোগ্রামিং যারা করে, তারা প্রায়ই দ্রুত কোড লেখার জন্য টেমপ্লেট তৈরি করে রাখে। ভিমেও এ রকম টেমপ্লেট ব্যবহার করা যায়। ধরে নিলাম আপনার সি প্লাস প্লাসের একটি টেমপ্লেট লাগবে। নিচের মতো একটি ফাইল তৈরি করুন –

#include <bits/stdc++.h>

using namespace std;

// Other macros and functions

int main()
{

    return 0;
}

ফাইলটি skel.cpp নাম দিয়ে সেভ করে ~/.vim/templates/ ডিরেক্টরিতে নিয়ে রাখুন –

$ mkdir -p ~/.vim/templates/
$ mv skel.cpp ~/.vim/templates/

এবার .vimrc ফাইলটি ওপেন করে নিচের লাইনটি যোগ করুন –

autocmd BufNewFile *.cpp 0r ~/.vim/templates/skel.cpp

ফাইলটি সেভ করে নিন। এখন থেকে .cpp এক্সটেনশনের যেকোনো নতুন ফাইল তৈরি করলে এতে টেমপ্লেট ফাইলের কোডটুকু যুক্ত হয়ে যাবে। আবার আপনি যদি চান যে ফাইল তৈরির পর কার্সর কোনো নির্দিষ্ট লাইনে থাকুক (যেমন : মেইন ফাংশনের শুরুতে), তাহলে নিচের লাইনটি .vimrc-তে যোগ করতে পারেন।

autocmd BufWinEnter *.cpp call cursor(8, 1)

এতে কার্সরটি ৮নং লাইনের শুরুতে থাকবে। আপনি আপনার টেমপ্লেট অনুযায়ী এখানে লাইন নম্বর ঠিক করে দিন। এতে নতুন ফাইল তৈরির পর নেভিগেট করে মেইন ফাংশনে যেতে হবে না, কার্সর আগে থেকেই সেখানে থাকবে। আপনি কেবল i চেপে কোড করা শুরু করবেন।

[ছোট্ট দুটি তথ্য এখানে দেওয়া দরকার বলে মনে করি। ভিমে কমান্ড মোডে o (ছোট হাতের O) চাপলে কার্সর যে লাইনে অবস্থিত, তার নিচে একটি নতুন লাইন ইনসার্ট হয়। আবার ইনসার্ট মোডে যাওয়ার জন্য i না চেপে a চাপা সুবিধাজনক।]

ভিমের ডিফল্ট কালারস্কিম পরিবর্তন করতে চাইলে কমান্ড মোডে গিয়ে লিখুন :colo, তারপর একটি স্পেস দিন, তারপর Ctrl + d চাপুন। কালারস্কিমের একটি তালিকা দেখা যাবে, নিচের ছবির মতো –

এখন পছন্দমতো একটি কালারস্কিমের নাম লিখে এন্টার চাপুন। যেমন : blue কালারস্কিম সেট করতে চাইলে লিখতে হবে :colo blue। এখানে colorscheme-কে সংক্ষেপে colo লেখা হয়েছে। পুরোটা লিখলেও হবে। কালারস্কিম স্থায়ীভাবে সেট করতে চাইলে .vimrc ফাইলের শেষে নিচের লাইনটি যোগ করতে হবে –

colorscheme blue

এখানে যদিও মাত্র কয়েকটি কালারস্কিম রয়েছে, ইন্টারনেট থেকে আরো অনেক কালারস্কিম ডাউনলোড করে নেওয়া যায়। কালারস্কিম ফাইল ~/.vim/colors ফোল্ডারে রেখে .vimrc ফাইলে ওপরের মতো করে colorscheme <name> লিখে দিলেই হলো। কালারস্কিম প্লাগইন হিসেবেও ডাউনলোড করা যায়।

ভিমের কার্যক্ষমতা বৃদ্ধি করতে শত শত প্লাগইন গিটহাবে রয়েছে। কিন্তু এগুলো নিজে নিজে ডাউনলোড করে ম্যানেজ করা কঠিন। সেজন্য একটি প্লাগইন ম্যানেজার ব্যবহার করা ভালো। ভিমের অনেকগুলো প্লাগইন ম্যানেজার রয়েছে। আমি এখানে Vundle (Vim bundle) ইনস্টল করা এবং এটি দিয়ে প্লাগইন ইনস্টল করার পদ্ধতি দেখাচ্ছি।

Vundle ইনস্টল করতে চলে যেতে পারেন এর গিটহাব পেজে। বুঝতে অসুবিধা হলে নিচের ধাপগুলো অনুসরণ করুন :

টার্মিনাল খুলে নিচের কমান্ডটি এক লাইনে লিখে (বা কপি করে) রান করুন –

$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

এবার .vimrc ফাইল খুলে ফাইলের একেবারে শুরুতে নিচের লাইনগুলো যোগ করুন –

set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'

call vundle#end()

লাইনগুলো অবশ্যই ফাইলের শুরুতে যোগ করতে হবে। ফাইলটি সেভ করে নতুন করে ভিমে প্রবেশ করুন। কমান্ড মোডে লিখুন :PluginInstall। দেখবেন নিচে Done লেখা এসেছে। তার মানে প্লাগইন ম্যানেজার সফলভাবে ইনস্টল হয়েছে। :qa লিখে ভিম থেকে বের হয়ে আসুন।

আপনি এখন চলে যেতে পারেন https://vimawesome.com/ সাইটে। এখানে প্রচুর প্লাগইন রয়েছে। মজার ব্যাপার হচ্ছে, সাইটটিতে ভিমের শর্টকাট ব্যবহার করে নেভিগেট করা যায়। যাহোক, আমি এখন gruvbox নামের একটি প্লাগইন ইনস্টল করে দেখাব। এটি মূলত একটি কালারস্কিম। একই পদ্ধতি অনুসরণ করে আপনি পরে যেকোনো প্লাগইন ইনস্টল করতে পারবেন।

.vimrc ফাইল ওপেন করে Plugin ‘VundleVim/Vundle.vim’ লাইনের পরে নিচের লাইনটি যোগ করুন (স্ক্রিনশট দেখুন) –

Plugin 'morhetz/gruvbox'

লাইনটি অবশ্যই call vundle#end() লাইনের আগে হবে। এরপর ফাইলের একদম শেষে নিচের লাইনটি যোগ করুন –

colorscheme gruvbox

এখন আবার ভিমে প্রবেশ করে :PluginInstall কমান্ড চালান। কিছুক্ষণের মধ্যে প্লাগইনটি ইনস্টল হয়ে Done লেখা আসবে। ভিম থেকে বের হয়ে যান। .vimrc ফাইলটি ভিম দিয়ে ওপেন করলে নতুন কালারস্কিমটি দেখতে পাবেন।

Vundle বিষয়ে বিস্তারিত জানতে এবং এর ব্যবহার শিখতে অবশ্যই এর গিটহাব পেজ থেকে রিডমি ফাইলটি পড়ে নেবেন। যেকোনো প্লাগইন ইনস্টলের জন্য প্লাগইনের গিটহাব পেজে চলে যেতে হবে, এবং ঠিকানা থেকে github.com/ অংশটি বাদ দিয়ে বাকি অংশ ওপরের পদ্ধতিতে .vimrc ফাইলে বসিয়ে দিতে হবে। বাকি কাজ Vundle করবে। যেমন : gruvbox-এর গিটহাব ঠিকানা হচ্ছে github.com/morhetz/gruvbox, আমরা তাই morhetz/gruvbox লিখেছি।

মোটামুটি এই ছিল আলোচনার বিষয়বস্তু। এখানে ভিমের অতি অল্প বিষয় নিয়েই আলোচনা করা হয়েছে। ভিমের যেকোনো সমস্যায় সাহায্য পাওয়া যাবে :help কমান্ড থেকে। যেমন : :help window লিখলে window সম্পর্কে সাহায্য দেখা যাবে, :help quit লিখে quit সম্পর্কে সাহায্য পাওয়া যাবে। টার্মিনালে vimtutor কমান্ড লিখলে ভিম ব্যবহারের প্রয়োজনীয় তথ্যসমৃদ্ধ একটি ম্যানুয়েল পাওয়া যায়। পুরোটা পড়তে মোটামুটি ঘণ্টাখানেক লাগে। পড়ার সময় অবশ্যই সাথে সাথে অনুশীলন করতে হবে। এছাড়া ইন্টারনেট তো আছেই সাহায্যের জন্য।

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

Solarized কালারস্কিম ও YouCompleteMe প্লাগইন ও JetBrains Mono ফন্টের সমন্বয়ে আমার বর্তমান ভিম।

—মোশারফ হোসেন

Leave a Reply

ভিম : সাধারণ লেখালেখি

প্রথম পর্বে আমাদের ভিমের সঙ্গে মোটামুটি পরিচয় হয়েছে। এই পর্বে বেশ কিছু বিষয় থাকবে, যা সাধারণ টেক্সট এডিটিং কিংবা প্রোগ্রামিংয়ের সময় কাজে লাগবে।

প্রথমেই দেখা যাক নেভিগেশন। ফাইলের মধ্যে ডানে-বাঁয়ে, ওপরে-নিচে যাওয়ার জন্য সাধারণভাবে অ্যারো কি ব্যবহার করা যায়। এছাড়া কমান্ড মোডে h (left), j (down), k (up), l (right) ব্যবহার করে নেভিগেট করা যায়। এগুলো যেহেতু সরাসরি হাতের নিচে থাকে, তাই অ্যারো কি-এর চেয়ে দ্রুত ব্যবহার করা যায়। প্রথম প্রথম এগুলো একটু ঝামেলার মনে হবে, কিছু সময় পর ঠিক হয়ে যাবে।

ওপরে বলা নেভিগেশন কি দিয়ে হয়তো এক ক্যারেক্টার বা এক লাইন করে নেভিগেট করা যায়। কিন্তু আমাদের যদি আরো দ্রুত নেভিগেশনের প্রয়োজন হয়? যেমন : কোনো ফাইলের শেষে বা শুরুতে, লাইনের শেষে/শুরুতে, কিংবা নির্দিষ্ট কোনো লাইনে যেতে হয়? এগুলোর জন্যও চমৎকার ব্যবস্থা রয়েছে ভিমে।

ফাইলের শুরুতে যেতে কমান্ড মোড থেকে টাইপ করতে হবে gg। ফাইলের শেষে যেতে চাইলে টাইপ করতে হবে G (অর্থাৎ Shift + g)। Shift + 4 ($) চাপলে কার্সর লাইনের শেষে চলে যাবে। Shift + 6 (^) চেপে যাওয়া যাবে লাইনের শুরুতে। এগুলো কিন্তু কেবল পড়ে গেলে হবে না। কোনো টেক্সট ফাইলে সবকিছু নিজে পরীক্ষা করে দেখতে হবে। শুধু পড়ে/ভিডিও দেখে কখনো শেখা যায় না, অনুশীলন করে করে শিখতে হয়।

নির্দিষ্ট কোনো লাইনে যেতে চাইলে প্রথমে ওই লাইন নম্বর লিখতে হবে, এরপর gg টাইপ করতে হবে। যেমন : ১২নং লাইনে যেতে চাইলে টাইপ করতে হবে 12gg। একদম সহজ, তাই না? আচ্ছা, এখানে একটু সমস্যা হচ্ছে বোধহয়। ভিমে লাইন নম্বর দেখা যাচ্ছে না (অনেক সিস্টেমে দেখা যেতেও পারে, বিশেষ করে ভিম প্রি-ইনস্টলড থাকলে)। লাইন নম্বর দেখা না গেলে কমান্ড মোড থেকে টাইপ করুন :set number

চমৎকার! বাঁ পাশে এখন লাইন নম্বর দেখা যাচ্ছে। ভিম থেকে একবার বেরিয়ে গেলে লাইন নম্বর আবার হারিয়ে যাবে। হারিয়ে যাওয়া কীভাবে রোধ করতে হয়, তা তৃতীয় পর্বের আলোচ্য বিষয়। ভিম থেকে না বেরিয়ে লাইন নম্বর সরিয়ে ফেলতে টাইপ করুন :set nonumber

অনেক সময় আমাদের শব্দ ধরে ধরে এগোতে হতে পারে, সাধারণ এডিটরে Ctrl + left/right arrow যা করা যায় আর কি। ভিমে সেটি আরো সহজে করা যায়। w চেপে সামনের দিকে, b চেপে পেছনের দিকে যাওয়া যায়।

ধরুন, বড় একটি ফাইলের কোথাও পরিবর্তন করেছেন, এরপর ফাইলের অন্য স্থানে গিয়ে দেখলেন আগের পরিবর্তনটি করা ঠিক হয়নি। `. (ব্যাকটিক + ডট) চেপে সরাসরি যেখানে পরিবর্তন করেছিলেন, সেখানে চলে যেতে পারেন।

অনাকাঙ্খিত পরিবর্তনের পর আনডু (undo) করতে কমান্ড মোড থেকে u চাপুন। একাধিকবার আনডু করার জন্য একাধিকবার u চাপুন। রিডু (redo) করার জন্য Ctrl + r চাপুন।

ভিমে কপি/পেস্ট বিভিন্ন রকম হতে পারে। ভিমের ভেতর থেকে কপি করে ভিমের ভেতর পেস্ট করার জন্য ভিজ্যুয়াল (VISUAL) মোডে যেতে হবে। যে জায়গা থেকে কপি করতে চান, প্রথমে সেখানে যান। এরপর কমান্ড মোড থেকে v চেপে ভিজ্যুয়াল মোডে যান। এবার সাধারণ নেভিগেশন কি (h, j, k, l, w, b, $, ^, gg, G ইত্যাদি সবই) ব্যবহার করে কাঙ্ক্ষিত টেক্সট সিলেক্ট করুন। সিলেক্ট করা হয়ে গেলে y চাপুন, টেক্সট কপি হয়ে যাবে। এখন এই টেক্সট ভিমের ভেতর যেকোনো জায়গায় পেস্ট করতে p চাপুন। লাইন ধরে সিলেক্ট করতে চাইলে Shift + v চাপুন। এতে VISUAL LINE মোড চালু হবে। Ctrl + v চেপে ভিজ্যুয়াল ব্লক মোডে যেতে পারেন। এই মোডে ব্লক আকারে টেক্সট সিলেক্ট করা যায়।

ভিমের ভেতর থেকে কপি করে বাইরে (যেমন : ব্রাউজারে) পেস্ট করার জন্য Shift চেপে ধরে মাউস দিয়ে কাঙ্ক্ষিত টেক্সট সিলেক্ট করে Ctrl + Shift + c চাপুন। উইন্ডোজে মাউস দিয়ে সরাসরি সিলেক্ট করে Ctrl + C চেপে কপি করা যাবে। এটি ভিমের নিজস্ব পদ্ধতি নয়, টার্মিনাল থেকে কপি করার পদ্ধতি। ভিমের নিজস্ব পদ্ধতি কিছু ক্ষেত্রে জটিল হতে পারে বলে এখানে এড়িয়ে যাওয়া হলো। বাইরে থেকে কপি করে ভিমে পেস্ট করতে টার্মিনালে পেস্ট করার শর্টকাট (সাধারণত Ctrl + Shift + v, উইন্ডোজে রাইট ক্লিক বা Ctrl + v) কাজ করবে। এছাড়া Shift + Insert চেপেও পেস্ট করা যায়।

ভিমে কাট (cut) আর ডিলিটের ধারণা একই। ভিমে যা কিছু ডিলিট করা হয়, তার সবই রেজিস্টারে থেকে যায়, যা পরে পেস্ট করা যায়। ভিজ্যুয়াল মোডে গিয়ে সিলেক্ট করে Delete কি বা x বা d চাপলে ডিলিট হবে। p চেপে টেক্সটকে এখন যেকোনো জায়গায় পেস্ট করা যাবে। কোনো লাইনে কার্সর রেখে dd চাপলে ওই লাইনটি ডিলিট হয়ে যাবে। কমান্ড মোডে d চাপলে ডিলিট অপারেশন শুরু হয়। এরপর নেভিগেশন কি ব্যবহার করে ডিলিট (তথা কাট) করা যায়। যেমন : লাইন ৫ থেকে লাইন ১০ পর্যন্ত কাট/ডিলিট করতে চাপতে হবে 5ggd10gg। দেখতে এটি হয়তো হিবিজিবি, কিন্তু ধারণা সহজ। 5gg চাপলে কার্সর চলে যাবে ৫নং লাইনে। এরপর d চাপলে ডিলিট অপারেশন শুরু হবে। 10gg টাইপ করার পর কার্সর চলে গেল ১০নং লাইন পর্যন্ত। মানে ৫ থেকে ১০ পর্যন্ত লাইনগুলো ডিলিট হয়ে গেল। কোনো শব্দের শুরুতে কার্সর নিয়ে dw লিখে শব্দটি ডিলিট করতে পারেন। শব্দের শেষ থেকে ডিলিট করতে db ব্যবহার করা যাবে।

কপি-পেস্ট নিয়ে মজার একটি ট্রিক বলি। যেকোনো জায়গা থেকে কোনো টেক্সট সিলেক্ট করে রেখে (কপি না করে) ভিমে এসে মাউসে মিডল ক্লিক (হুইলে চাপ দিন) করুন, সিলেক্ট করা টেক্সট পেস্ট হয়ে যাবে। এটি শুধু ভিম নয়, যেকোনো জায়গায় হবে। ভিমে যদি পেস্ট না হয়, তাহলে টার্মিনালের প্রিফারেন্স/সেটিংস ওপেন করে Middle click paste/Paste on middle click বা এ রকম কিছু চালু করে নিতে হবে। আধুনিক সব টার্মিনালে ডিফল্টভাবে এটি চালুই থাকে। উল্লেখ্য যে, এটি কেবল টার্মিনালে নয়, অন্যান্য সব জায়গায় কাজ করবে। টাচপ্যাডে তিন আঙুলে একসাথে ট্যাপ করলে মিডল ক্লিক হবে। উইন্ডোজে এটি কাজ করবে না।

এখন পর্যন্ত দেখলেন নেভিগেশন এবং কাট-কপি-পেস্ট। এবার সার্চ এবং রিপ্লেস দেখা যাক।

সার্চিংয়ের জন্য কমান্ড মোডে / (ফরওয়ার্ড সার্চ) বা ? (ব্যাকওয়ার্ড সার্চ) ব্যবহার করতে পারেন। ধরুন, আপনি hello শব্দটি খুঁজবেন। কমান্ড মোডে /hello লিখে এন্টার চাপুন। শব্দটি যেখানে প্রথম পাওয়া যাবে, কার্সর সেখানে চলে যাবে। যদি পাওয়া না যায়, তাহলে একটি এরর দেখা যাবে, Pattern not found। এখন শব্দটির পরের অবস্থানে যেতে n চাপুন। আগের অবস্থানে যেতে Shift + n চাপুন।

মনে করুন, আপনি search শব্দটিকে replace দিয়ে রিপ্লেস করবেন। কমান্ড মোড থেকে নিচের মতো টাইপ করুন,

:%s/search/replace/g

এতে search লেখাগুলো মুছে গিয়ে replace হয়ে যাবে। শেষের /g মানে হচ্ছে পুরো ডকুমেন্টে এই সার্চ এবং রিপ্লেসের ঘটনা ঘটবে। রিপ্লেস করার আগে কনফার্মেশনের জন্য c যোগ করে দেওয়া যায় –

:%s/replace/search/gc

এতে প্রতিবার রিপ্লেস করার আগে y/n দিয়ে নিশ্চিত করা যাবে।

এমন হতে পারে যে আপনি কোনো ফাইল ওপেন করেছেন, এতে কিছু পরিবর্তন করেছেন, কিন্তু সেভ না করেই বেরিয়ে যেতে চাইছেন। ভিম এক্ষেত্রে আপনাকে বাধা দেবে। জোর করে বেরিয়ে যেতে :q! ব্যবহার করুন। আবার ওপেন করা ফাইলটি হয়তো নতুন নামে সেভ করতে চাচ্ছেন (Save as-এর মতো), সেজন্য টাইপ করুন :w <filename>। এখন এই ফাইলে যা কিছু করবেন তার সবই <filename> ফাইলে সেভ হবে, মূল ফাইলটির কিছু হবে না।

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

ভিমে একটি ফাইল ওপেন করুন। Ctrl + w চেপে v চাপুন। এডিটর দুইভাগে ভাগ হয়ে যাবে। অনুভূমিকভাবে ভাগ করতে Ctrl + w চেপে s চাপুন। এখন কিছু একটা লেখার চেষ্টা করুন, দেখবেন সবগুলো অংশেই একসাথে পরিবর্তন হচ্ছে, যেহেতু একই ফাইল সবগুলো উইন্ডোতে ওপেন হয়েছে। Ctrl + w + w চেপে আপনি একে একে সবগুলো উইন্ডোতে যেতে পারেন। এছাড়া Ctrl + w + h/j/k/l ব্যবহার করে বাঁয়ে/ নিচে/ওপরে/ডানে যেতে পারবেন। কোনো উইন্ডোতে কোনো ফাইল ওপেন করতে চাইলে ওই উইন্ডোতে গিয়ে কমান্ড মোডে লিখুন :open <filename>

সাধারণভাবে উইন্ডোগুলো সমান দৈর্ঘ-প্রস্থের হবে। Ctrl + w চেপে <, >, -, + চাপলে উইন্ডোগুলোর আকার বিভিন্ন দিকে ছোট-বড় হবে। সেটি আপনি নিজে নিজে কিছুক্ষণ পরীক্ষা করে দেখে নিন। সবগুলো সমান করতে Ctrl + w চেপে = চাপুন।

কোনো নির্দিষ্ট উইন্ডো বন্ধ করতে সেখানে গিয়ে কমান্ড মোডে লিখুন :close। কোনো উইন্ডোতে :open <filename> ব্যবহার করে একাধিক ফাইল ওপেন করতে পারেন। পূর্বের ফাইলে ফিরে যেতে :bp, পরের ফাইলে যেতে :bn কমান্ড ব্যবহার করুন।

এই লেখায় মোটামুটি এই পর্যন্তই। এখানে অল্প কিছু জিনিস দেখানোর চেষ্টা করলাম। দৈনন্দিন কাজে মোটামুটি এগুলোই লাগবে। লিনাক্সে যারা নতুন, তাদের বুঝতে একটু সমস্যা হতে পারে। চেষ্টা করেছি যথাসম্ভব সহজ করে লেখার, তারপরও কঠিন হলে আপাতত কিছু করার নেই।

ভিমকে নিজের প্রয়োজন ও রুচি অনুসারে সাজিয়ে নেওয়া জরুরি। শেষ পর্বে এ নিয়ে কিছুটা লেখার চেষ্টা করেছি।

— মোশারফ হোসেন

One thought on “ভিম : সাধারণ লেখালেখি”

Leave a Reply

ভিম : পরিচিতি

(যারা ভিমের সঙ্গে কিছুটা পরিচিত, তারা সরাসরি দ্বিতীয় পর্বে চলে যেতে পারেন।)

ভিম (Vim – Vi IMproved) হচ্ছে ইউনিক্সভিত্তিক এডিটর ভি (Vi)-এর একটি উন্নত সংস্করণ। এটি অত্যন্ত শক্তিশালী, সহজ (?), হাইলি কনফিগারেবল এডিটর। এই আর্টিকেল লেখা পর্যন্ত ভিমের সর্বশেষ সংস্করণ হচ্ছে ৮.২, আমি ৮.১ ব্যবহার করছি। আপনার সিস্টেমে অন্য কোনো সংস্করণ থাকলেও সমস্যা নেই। ভিম না থাকলে ইনস্টল করে নিতে হবে। ডেবিয়ান/উবুন্টুভিত্তিক ডিস্ট্রোগুলোতে sudo apt install vim, আর্চ/মানজারোতে sudo pacman -S vim কমান্ড দিয়ে ইনস্টল করা যাবে। উইন্ডোজের জন্য ডাউনলোড করা যাবে এখান থেকে – https://www.vim.org/download.php

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

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

প্রাথমিকভাবে এই সিরিজটি আমি তিন ভাগে লিখব বলে ভাবছি –

  1. এডিটর পরিচিতি
  2. সাধারণ এডিটিং
  3. কনফিগারেশন এবং কাস্টমাইজেশন

তো পরিচিতিটা সেরে নেওয়া যাক। টার্মিনাল খুলে vim লিখে এন্টার চাপলে নিচের মতো ইন্টারফেস দেখা যাবে –

এখানে বেশ কিছু তথ্য দেখা যাচ্ছে। যেহেতু কোনো close কিংবা quit বাটন দেখা যাচ্ছে না, তাই প্রথমে আমাদের জানতে হবে যে, এখান থেকে বের হওয়া যায় কীভাবে (অবশ্যই টার্মিনাল বন্ধ না করে)। আপনি নিশ্চয়ই একটি লাইন দেখতে পাচ্ছেন – type :q<Enter> to exit

অর্থাৎ :q লিখে এন্টার চাপলে আমরা এখান থেকে বের হতে পারব। এখানে q মানে quit; চাইলে :quit লিখেও বের হওয়া যায়।

অসাধারণ! আপনি ভিমে প্রবেশ করে বের হয়ে গেলেন! এই বের হওয়াটা অনেক কঠিন, এতই কঠিন যে এ নিয়ে শত শত মিম (meme) ইন্টারনেটে ঘুরছে। তো এত কঠিন যেহেতু, এটা শেখার দরকার কী? ভালো কথা, হোঁচট খাওয়ার ভয়ে হাঁটতে না শেখার মতো।

এবার তাহলে আসল কাজ শুরু করা যাক। ভিম ব্যবহার করে একটি ফাইলে ‘hello vim’ কথাটি লিখতে হবে। সে জন্য টার্মিনালে প্রথমে নিচের কমান্ড দিয়ে একটি ফাইল তৈরি করে নিন –

$ touch hello.txt

(কমান্ডের আগে $ চিহ্নের মানে হচ্ছে এটি শেল কমান্ড। অর্থাৎ একে টার্মিনালে চালাতে হবে। টার্মিনালে লেখার সময় $ চিহ্ন বর্জন করতে হবে। # চিহ্ন থাকলে বুঝতে হবে কমান্ডটি রুট প্রিভিলেজসহ চালাতে হবে, অর্থাৎ কমান্ডের আগে sudo যোগ করে নিতে হবে।)

এতে hello.txt নামের একটি খালি (Empty) ফাইল তৈরি হবে। এবার ফাইলটি ভিমে ওপেন করতে হবে। সেজন্য নিচের কমান্ডটি লিখুন –

$ vim hello.txt

আপনার ফাইলটি ভিমে ওপেন হয়ে গেল। একটি ফাঁকা উইন্ডো দেখবেন, যার একেবারে শেষে নিচের মতো একটি লাইন থাকবে।

এখানে বেশ কিছু তথ্য রয়েছে। একেবারে বাম দিকে আছে ফাইলের নাম। তারপরে আছে 0L, 0C, মানে ফাইলটিতে বর্তমানে 0টি লাইন, 0টি ক্যারেক্টার রয়েছে, অর্থাৎ কিছুই নেই। ডান দিকে আছে কার্সরের অবস্থান, এবং ফাইলটির কতটুকু অংশ এই উইন্ডোতে দেখা যাচ্ছে। এগুলো এখনই না বুঝলেও সমস্যা নেই। শেখার সবচেয়ে ভালো পদ্ধতি হচ্ছে “ব্যবহার করতে করতে শেখা”।

এবার আমরা আমাদের লেখালেখি শুরু করতে পারি। কিবোর্ড থেকে h চাপুন, কিছু দেখতে পাচ্ছেন? না। ভিমে অনেকগুলো মোড (mode) আছে। কোনো ফাইল ওপেন করলে শুরুতে ভিম থাকে কমান্ড মোডে (একে নরমাল মোডও বলা হয়)। অর্থাৎ এই মোডে বিভিন্ন কমান্ড চালানো যায়। লেখালেখি করার জন্য আমাদের দরকার ইনসার্ট মোড। ইনসার্ট মোডে যাওয়ার জন্য কিবোর্ড থেকে ‘i’ চাপতে হবে। ‘i’ চাপার সঙ্গে সঙ্গে টার্মিনালের নিচে দেখুন ছবির মতো -- INSERT -- লেখা উঠেছে –

এখন আমরা যা ইচ্ছা তাই লিখতে পারি। চটপট hello vim লিখে ফেলুন তাহলে। এবার লেখাটি সেভ করতে হবে। সেভ করার জন্য আবার কমান্ড মোডে ফিরে যেতে হবে। কমান্ড মোডে যাওয়ার জন্য চাপতে হবে Esc কি (F1-এর বাঁ পাশে)। এবার সেভ করার জন্য নিচের কমান্ডটি লিখুন –

:write

সামনের কোলন চিহ্নটি দিতে ভুলবেন না। এটি লিখে এন্টার চাপলেই ফাইলটি সেভ হয়ে যাবে। এবার তাহলে আমাদের ভিম থেকে বের হতে হবে। কীভাবে মনে আছে তো? :quit বা :q। টার্মিনালে cat hello.txt কমান্ড দিয়ে দেখতে পারেন যে সত্যিই ফাইলটি সেভ হয়েছে কি না।

এবার আমরা নতুন একটি ফাইল তৈরি করব। আগের মতো touch কমান্ড ব্যবহার করার দরকার নেই, সরাসরি ভিম ব্যবহার করেই ফাইল তৈরি করা যায়। ফাইল ওপেন করার যে পদ্ধতি, ফাইল তৈরি করারও সেই একই পদ্ধতি। তাহলে টার্মিনালে লিখে ফেলুন –

$ vim file.txt

এতে ভিম উইন্ডো খুলবে। উল্লেখ্য যে, ফাইলটি কিন্তু এখনো তৈরি হয়নি (আসলে একটি অস্থায়ী ফাইল তৈরি হয়েছে। তবে সেটি নিয়ে আমরা পরে মাথা ঘামাব), :write লিখে সেভ করলেই ফাইলটি তৈরি হবে। এবার i চেপে এতে ইচ্ছেমতো কিছু লিখুন। এরপর Esc চেপে লিখুন :wq। কী হলো? ফাইলটি সেভ হলো, ভিমও বন্ধ হলো। :write কমান্ডটিকে সংক্ষেপে :w লেখা যায়, আর :q-এর সঙ্গে তো আগে থেকেই পরিচিত। এই দুটি কমান্ডকে সংক্ষেপে একত্রে :wq লেখা যায়। এটি লেখা সহজ ও দ্রুততর। এখন থেকে আমরা এভাবেই লিখব।

ওপরের আলোচনার সারমর্ম হলো :

  • vim <filename> দিয়ে যেকোনো ফাইল খোলা/তৈরি করা যাবে
  • লেখালেখির আগে ইনসার্ট মোডে যেতে হবে
  • কমান্ড চালানোর জন্য (যেমন : ফাইল সেভ করা) কমান্ড মোডে যেতে হবে
  • i চেপে ইনসার্ট মোড, Esc চেপে কমান্ড মোডে যেতে হবে
  • :wq দিয়ে একইসঙ্গে সেভ করা এবং ভিম থেকে বের হওয়া যাবে

পরের পর্বে রয়েছে দৈনন্দিন লেখালেখির জন্য গুরুত্বপূর্ণ কিছু বিষয়।

—মোশারফ হোসেন

ক্রন জবের ধারণা ও ব্যবহার

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

ক্রন হচ্ছে একটি ডিমন (daemon)। ডিমন হচ্ছে এক ধরনের প্রোগ্রাম যা সবসময় ব্যাকগ্রাউন্ডে চলতে থাকে, যার ওপর সাধারণ ইউজারের সরাসরি নিয়ন্ত্রণ থাকে না। ক্রন প্রতি মিনিটে ক্রনট্যাব (crontab; cron table-এর সংক্ষিপ্ত নাম) নামক একটি ফাইল পরীক্ষা করে, এবং ওই মিনিটে কোনো জব থাকলে তা এক্সিকিউট করে। ক্রনট্যাবে যেসব প্রোগ্রাম বা কমান্ড লেখা থাকে, সেগুলোকে বলে ক্রন জব।

ক্রনট্যাব হচ্ছে একটি টেক্সট ফাইল। ক্রনট্যাব এডিট করার জন্য নিচের কমান্ডটি চালাতে হয় –

$ crontab -e

প্রথমবার এটি চালালে একটি এডিটর সিলেক্ট করতে বলতে পারে। আমি এক্ষেত্রে ভিম ব্যবহার করি, আপনারা চাইলে nano ব্যবহার করতে পারেন। ফাইলটি ওপেন হলে কিছু কমেন্টেড লেখা দেখা যাবে। একেবারে শেষে নিচের মতো একটি লাইন পাওয়া যাবে –

# m h  dom mon dow   command

এটি ক্রন জব লেখার ফরম্যাট। এখানে প্রথম পাঁচটি কলাম ক্রন জব চলার সময় নির্ধারণ করে। কলামগুলো হলো :

  • m – মিনিট (0–59)
  • h – ঘণ্টা (0–23; ২৪ ঘণ্টা ফরম্যাটে)
  • dom – তারিখ (1–31)
  • mon – মাস (1–12)
  • dow – বার (0–6; 0 হচ্ছে রবিবার)
  • command – যে কমান্ড বা প্রোগ্রামটি এক্সিকিউট হবে তার পাথ।

এখানে এই m h dom mon dow command ক্রম খুব গুরুত্বপূর্ণ। তাই ওপরের লাইনটি ক্রনট্যাব ফাইলে না থাকলে নিজে যোগ করে নিতে হবে। এতে ভবিষ্যতে কোনো ক্রন জব যোগ করতে সুবিধা হবে, কলামগুলোর ক্রম মুখস্ত করে রাখতে হবে না।

এবার তাহলে পরীক্ষার জন্য আমরা একটি ক্রন জব সেট করে দেখতে পারি। আমাদের এই ক্রন জবটি “hello” লেখাটিকে একটি ফাইলে সেভ করবে। সে জন্য টার্মিনালে crontab -e কমান্ড দিয়ে ক্রনট্যাব খুলুন (যদি না খোলা থাকে)। এরপর ফাইলের একেবারে শেষে গিয়ে নিচের লাইনটি যোগ করুন (প্রয়োজনে স্ক্রিনশট দেখুন) –

34   *    *    *    *    echo "hello cron" > ~/hello

এখানে 34-এর জায়গায় আপনার কম্পিউটারের সময় দেখে বর্তমান মিনিটের চেয়ে পাঁচ মিনিট পরের সময় দিন। এখন ফাইলটি সেভ করুন। পাঁচ মিনিট পর আপনার হোম ডিরেক্টরিতে hello নামের একটি ফাইল তৈরি হবে, যেখানে লেখা থাকবে hello cron।

ওপরে চারটি কলামে * চিহ্নের মানে হচ্ছে কলামগুলো সব সময় এক্সিকিউট হবে। ক্রন জবটি প্রতি ঘণ্টার 34তম মিনিটে এক্সিকিউট হবে। আমরা যদি চাই যে এপ্রিল মাসের 22 তারিখ রাত 11টা 20 মিনিটে একটি ক্রন জব চালাব, তাহলে ক্রনট্যাবে নিচের লাইনটি যোগ করতে হবে –

20    23    22    4    *    /path/to/job

এখানে সপ্তাহের দিন * দিয়েছি, এতে 22 তারিখ যে বারই হোক না কেন, জবটি চলবে। এবং এই জবটি ক্রনট্যাবে কয়েক বছর রেখে দিলে প্রতি বছর 22শে এপ্রিল 11টা 20 মিনিটে এক্সিকিউট হবে। উল্লেখ্য যে, 22শে এপ্রিল একেক বছর একেক বার হবে।

আবার আপনি হয়তো কোনো জব প্রতি 5 মিনিট পর পর চালাতে চাচ্ছেন। তাহলে ক্রনট্যাবে নিচের মতো করে জবটি যোগ করে নিন –

*/5   *    *    *    *    /path/to/job

এই ক্রন জবটি প্রতি 5 মিনিট পর পর চলতে থাকবে। আবার আপনি হয়তো কোনো জব প্রতি ঘণ্টায় 5, 17 ও 49 মিনিটে একবার করে চালাতে চাচ্ছেন। সেক্ষেত্রে নিচের মতো করে কমা দিয়ে মিনিট উল্লেখ করে দিন –

5,17,49  *    *    *    *    /path/to/job

একইভাবে দিন, মাস ইত্যাদিও ঠিক করে দেওয়া যায়। হাইফেন দিয়ে রেঞ্জ উল্লেখ করে দেওয়া যায় –

5    6-11   *    *    *    /path/to/job

এই ক্রন জবটি সকাল ৬টা থেকে ১১টা পর্যন্ত প্রতি ঘণ্টায় চলবে (৬টা ৫, ৭টা ৫, …, ১১টা ৫ মিনিটে)।

কোনো জব যদি প্রতি ঘণ্টা/সপ্তাহ/মাস/বছরে একবার করে চালানোর প্রয়োজন হয়, তাহলে ওপরের মতো * দিয়ে সব সিলেক্ট না করে কিছু বিশেষ স্ট্রিং-ও ব্যবহার করতে পারেন। যেমন : কোনো জব যদি প্রতিবার কম্পিউটার চালু হওয়ার পর এক্সিকিউট করার প্রয়োজন হয়, তাহলে @reboot স্ট্রিং ব্যবহার করতে পারেন।

@reboot    /path/to/job

এভাবে @hourly, @daily, @weekly, @monthly, @yearly ব্যবহার করে যেকোনো ক্রন জব সেট করা যায়।

রুট হিসেবে কোনো ক্রন জব সেট করতে চাইলে রুট ইউজার হিসেবে লগ ইন করে নিতে হবে। অথবা sudo crontab -e ব্যবহার করতে হবে। অন্য কোনো ইউজারের ক্রনট্যাব এডিট করতে চাইলে –

$ crontab -u <username> -e

তো ক্রন জবের মৌলিক বিষয়গুলো আমরা মোটামুটি শিখে ফেললাম। এবার একটি প্রজেক্ট করা যাক 😉

প্রতিদিন আমরা অনেক প্রকার ফাইল ইন্টারনেট থেকে ডাউনলোড করি। সেগুলো সাধারণত Downloads ডিরেক্টরিতে গিয়ে জমা হয়। এখন আমরা একটি সহজ ব্যাশ স্ক্রিপ্ট লিখব, স্ক্রিপ্টটি Downloads থেকে মিউজিক, ভিডিও, ছবি, ডকুমেন্ট যথাক্রমে Music, Videos, Pictures ও Documents ডিরেক্টরিতে, এবং বাকি ফাইলগুলো Others ডিরেক্টরিতে নিয়ে রাখবে। এতে আমাদের ফাইলগুলো গোছানো থাকবে, প্রয়োজনের সময় খুঁজে পেতে সুবিধা হবে। স্ক্রিপ্টটি আমরা ক্রনট্যাবে যোগ করে দেব, যাতে প্রতিবার কম্পিউটার অন করার পর Downloads ফোল্ডারটি পরিষ্কার হয়ে যায়।

#!/usr/bin/env bash

# redirect standard error to a black hole ;)
exec 2> /dev/null

# create Others directory, if not present
if [[ ! -d ~/Others/ ]]
then
    mkdir ~/Others/
fi

# move files to their destination
cd ~/Downloads/
mv *.jpg *.jpeg *.png *.gif *.svg  ~/Pictures/
mv *.mp4 *.mkv *.webm              ~/Videos/
mv *.mp3 *.wav *.aac *.m4a         ~/Music/
mv *.docx *.doc *.odt *.uot *.pdf  ~/Documents/

# move the rest to ~/Others
mv *                               ~/Others/

ওপরের স্ক্রিপ্টটি লিখে (বা কপি করে) ~/.my_scripts/ ডিরেক্টরিতে নিয়ে রাখুন। ফাইলের এক্সটেনশন হবে .sh। ধরি ফাইলটির নাম cleaner.sh। এখন ফাইলটিকে এক্সিকিউশন পারমিশন দিতে হবে –

$ chmod u+x ~/.my_scripts/cleaner.sh

এবার ক্রনট্যাব ওপেন করে (crontab -e) নিচের লাইনটি যোগ করুন (আগে যোগ করা ক্রন জবগুলো মুছে ফেলতে পারেন)।

@reboot    ~/.my_scripts/cleaner.sh

ফাইলটি সেভ করে নিন। এবার সারাদিনে যা কিছুই ডাউনলোড করুন না কেন, পরেরবার কম্পিউটার অন করার পরে Downloads ফোল্ডারটি পরিষ্কার হয়ে যাবে। এতে নতুন ডাউনলোড করা ফাইলগুলো সহজে খুঁজে পাবেন। যদি প্রতিবার রিবুটে ফাইলগুলো সরাতে না চান, তাহলে @reboot-এর পরিবর্তে @weekly সেট করতে পারেন। এতে প্রতি রবিবার ফাইলগুলো যার যার নির্ধারিত ফোল্ডারে চলে যাবে।

এবার আপনার কাজ হচ্ছে রবিবারের পরিবর্তে জবটি প্রতি শুক্রবারে সেট করা। যদি করতে পারেন, তাহলে ক্রন জবের ব্যবহার আপনার কাছে পরিষ্কার, না পারলে আর্টিকেলটি কিছুক্ষণ পর আবার পড়তে পারেন।

ক্রন নিয়ে আরো জানতে চাইলে উবুন্টুর কমিউনিটি হেল্প উইকি দেখতে পারেন – https://help.ubuntu.com/community/CronHowto

মোশারফ হোসেন

Leave a Reply

দশটি কোডিং ইন্টারভিউ সমস্যা

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

  1. pow(a, n) – একটি ফাংশন তৈরি করতে হবে, যেখানে দুটি ইন্টিজার (a, n) ইনপুট দেওয়া থাকলে ফাংশনটি a^n রিটার্ন করবে। ফাংশনটির রানটাইম হতে হবে O(log n)।
  2. BST – একটি ফাংশন তৈরি করতে হবে, যেখানে একটি বাইনারি ট্রি ইনপুট দেওয়া হলে সেটি বাইনারি সার্চ ট্রি (BST) কী না, তা বের করতে হবে।
  3. Stack and Queue –  স্ট্যাক (Stack) ব্যবহার করে কিউ (Queue) তৈরি করতে হবে, অর্থাৎ কিউ এর এনকিউ (enqueue) ও ডিকিউ (dequeue) ফাংশন তৈরি করতে হবে।
  4. Triangle – একটি ইন্টিজার অ্যারে দেওয়া আছে, যার সবগুলো সংখ্যাই ধনাত্মক। ওই অ্যারে থেকে তিনটি করে উপাদান নিয়ে মোট কয়টি ত্রিভুজ বানানো যায়, সেটি গণনা করতে হবে।
  5. Difference – একটি ইন্টিজার অ্যারে দেওয়া আছে যার উপাদানগুলো ছোট থেকে বড় ক্রমে সাজানো। এখন একটি অঋণাত্মক সংখ্যা দেওয়া হলে, বলতে হবে যে, অ্যারের যেকোনো দুটি পৃথক সংখ্যার অন্তরফল ওই সংখ্যাটির সমান কী না। 
  6. 3 Sum – একটি পূর্ণসংখ্যার অ্যারেতে তিনটি করে সংখ্যা নিলে কতগুলো পৃথক ত্রয়ী পাওয়া যায়, যাদের যোগফল শূন্য (0) হবে?
  7. Substring – দুটি স্ট্রিং দেওয়া আছে – A ও s. একটি ফাংশন লিখতে হবে, যার কাজ হচ্ছে, s যদি A-এর সাবস্ট্রিং হয়, তাহলে A-এর যেই ইনডেক্স থেকে s শুরু হয়েছে, সেই ইনডেক্স রিটার্ন করতে হবে।
  8. Bit difference – একটা অ্যারেতে কতগুলো অঋণাত্মক সংখ্যা আছে। ওই সংখ্যাগুলোর মাঝে যতগুলো জোড়া (pair) আছে, তাদের মধ্যে বিটের পার্থক্যের যোগফল বের করতে হবে।
  9. Running Median – একটি অ্যারেতে বা লিস্টে শুরুতে কোনো সংখ্যা নেই। অ্যারেতে ক্রমান্বয়ে n সংখ্যক সংখ্যা যুক্ত হবে, আর প্রতিটি সংখ্যা যুক্ত হওয়ার পরে ওই অ্যারের বর্তমান সংখ্যাগুলোর মিডিয়ান বের করতে হবে।
  10. Linked List – লিঙ্কড লিস্টের শুরুর নোড (হেড নোড) দেওয়া থাকবে, আর একটা সংখ্যা দেওয়া থাকবে, ওই সংখ্যার মান যত, লিঙ্কড লিস্টের শেষ থেকে ততঘর বা ততটি নোড আগে এসে যেই নোড পাওয়া যায়, তার মান রিটার্ন করতে হবে।

এরকম 71টি প্রোগ্রামিং সমস্যা ও তাদের সমাধান নিয়ে আলোচনা করা হয়েছে “কোডিং ইন্টারভিউ – প্রস্তুতি, সমস্যা ও সমাধান” বইতে।

বইয়ের লিঙ্ক – http://dimik.pub/book/475/coding-interview-preparation-problem-solution-by-tamim-shahriar-subeen

Leave a Reply

কম্পিউটার বিজ্ঞানের পড়ালেখা

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

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

প্রোগ্রামিং

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

  • আমি কেন প্রোগ্রামিং শিখতে পারছি না, এ জন্য দশ-বিশটা কারণ খুঁজে বের করে দেশ-সমাজ-শিক্ষাব্যবস্থা ইত্যাদির ওপর দায় চাপিয়ে দিয়ে ঘুরে-বেড়ানোর পরিবর্তে নিজের প্রোগ্রামিং শেখার দায়িত্ব নিজের কাঁধেই তুলে নিতে হবে।
  • প্রোগ্রামিং মাত্র তিন ক্রেডিট কিংবা ল্যাবসহ পাঁচ-ছয় ক্রেডিটের কোর্স হলেও প্রথম সেমিস্টারের ৬০-৭০% সময় প্রোগ্রামিং বই পড়া, শেখা ও চর্চা করার পেছনে দিতে হবে। পরীক্ষার আগের রাতের পড়া দিয়ে প্রোগ্রামিং শেখা যায় না, সপ্তাহে পাঁচ-ছয় দিন নিয়মিতভাবে তিন থেকে পাঁচ ঘণ্টা প্রোগ্রামিং নিয়ে কাটাতে হবে।
  • প্রোগ্রামিং শিখতে গিয়ে নানান ধরনের বাধার সম্মুখীন হবে, অনেক জায়গায় আটকে যাবে— মনে হবে, আমাকে দিয়ে হবে না। কিন্তু হতাশ হওয়া চলবে না, পর্যাপ্ত সময় দিলে প্রোগ্রামিং শেখাটা সহজ হয়ে যাবে। তাই দিনের পর দিন ঘণ্টার পর ঘণ্টা প্রোগ্রামিং প্র্যাকটিস করতে হবে।
  • প্রোগ্রামিং কিছুটা শেখার পরেও যদি ক্লাস টেস্টে কিংবা পরীক্ষায় প্রোগ্রামিং কোর্সে রেজাল্ট খারাপ হয়, তাহলে মন খারাপ করা চলবে না। পরীক্ষায় ভালো করতে হলে শিক্ষকের ক্লাস অনুসরণ করতে হবে, প্রোগ্রামিং বেশি জানলেই যে পরীক্ষায় ভালো ফল আসবে বিষয়টি এমন নয়।
  • এক হাজার ভিডিও কিংবা পিডিএফ বই কম্পিউটারে ডাউনলোড করে সময় নষ্ট করা উচিত নয়। প্রোগ্রামিং শিখতে হাজার হাজার বই কিংবা ভিডিও টিউটোরিয়ালের দরকার নেই। দু-তিনটি বই-ই যথেষ্ট।

নন-মেজর সাবজেক্ট

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

কম্পিটিটিভ প্রোগ্রামিং

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

হ্যাকাথন, কোডস্প্রিন্ট, প্রজেক্ট

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

আগামী দিনের প্রযুক্তি

Change is the only constant in life – দার্শনিকদের এই কথাটি প্রযুক্তি বিশ্বের বেলাতে আরো বেশি সত্য। প্রতি পাঁচ বছরেই যেন বিশাল পরিবর্তন ঘটে যাচ্ছে, নতুন প্রোগ্রামিং ভাষা, নতুন ফ্রেমওয়ার্ক, নতুন ডেটাবেজ, ক্লাউড কম্পিউটিং, মেশিন লার্নিংয়ের নতুন নতুন প্রয়োগ, মোবাইল কম্পিউটিং, আইওটি—লিখে শেষ করা যাবে না। এ জন্য দেশের সফটওয়্যার ইন্ডাস্ট্রির হর্তাকর্তারা প্রায়ই বলেন, আমাদের ভার্সিটিগুলোর সিলেবাস আধুনিক করতে হবে, নতুন নতুন জিনিস শেখাতে হবে ইত্যাদি। কিন্তু তারা আসলে ভুল বলেন। আগামী দিনের প্রযুক্তি নিয়ে কাজ করার জন্য তৈরি হতে হলে, বিশ্ববিদ্যালয়ের কম্পিউটার বিজ্ঞানের শিক্ষার্থীদের জন্য নতুন প্রযুক্তির পেছনে দৌড়ানোটা বোকামি হবে। বরং নিজের ভিত্তিটা অনেক বেশি মজবুত করার পেছনেই জোর দেওয়া উচিত। পাইথন লাইব্রেরি ব্যবহার করে মেশিন লার্নিং করার চেয়ে শিক্ষার্থীদের ডেটা স্ট্রাকচার ও অ্যালগরিদমের ওপর দখল থাকটা বেশি জরুরি। প্রবলেম সলভিং স্কিল থাকাটাও অনেক জরুরি। তবে প্রবলেম সলভিং স্কিল মানে এই নয় যে যেসব প্রবলেম আগে সলভ করা হয়েছে সেগুলো আবার সলভ করতে পারা, বরং নতুন প্রবলেম সলভ করা বা নতুন সমস্যা নিয়ে চিন্তা করার দক্ষতা। সমস্যার সমাধান করতে করতেই এই দক্ষতা তৈরি হবে এবং ভার্সিটির সময়টুকুই এই দক্ষতা তৈরির শ্রেষ্ঠ সময়। তেমনি লেটেস্ট ডেটাবেজ শেখার চেয়ে রিলেশনাল ডেটাবেজের মৌলিক ধারণা আয়ত্বে আনা বেশি জরুরি, নতুন ফ্রেমওয়ার্ক শেখার চেয়ে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং শেখাটা বেশি জরুরি। মোটকথা হচ্ছে, নতুন টেকনোলজির পেছনে না দৌড়ে, কম্পিউটার সায়েন্সের মৌলিক বিষয়গুলোর ওপর জ্ঞান ও দক্ষতা তৈরি করা অনেক বেশি গুরুত্বপূর্ণ। কম্পিউটার সায়েন্সের মূল বিষয়গুলো যাদের কাছে পরিষ্কার থাকবে, তাদের পক্ষে যেকোনো সময় নতুন টেকনোলজি আয়ত্বে আনতে বেগ পেতে হবে না। মনে রাখতে হবে, ভার্সিটি থেকে পাশ করার পরে ক্যারিয়ার কিন্তু ৩০ থেকে ৪০ বছরের। প্রযুক্তি নিয়ে এই দীর্ঘ ক্যারিয়ারের জন্য একটি শক্ত ভিত্তির ওপর নিজেকে দাঁড় করানোটাই সবচেয়ে গুরুত্বপূর্ণ।

রাজনীতি-আবহাওয়া-আকাশ-বাতাস ইত্যাদি বিষয়ে দোষারোপ করে ঘুরে বেড়িয়ে লাভ হবে না। বিশ্ববিদ্যালয় জীবনে কতটুকু জ্ঞান অর্জিত হলো, কতটুকু শেখা হলো – এর ওপরই নির্ভর করবে ভবিষ্যতে নিজের জীবন কেমন হবে। তাই এর দায়িত্ব নিজে নেওয়াটাই বুদ্ধিমানের কাজ হবে। 

Leave a Reply