সকল লেখার তালিকা

গেম অব লাইফ

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

১৯৭০ সালে গেমটি উদ্ভাবন করেন ব্রিটিশ গণিতবিদ জন হর্টন কনওয়ে (২৬ ডিসেম্বর ১৯৩৭ – ১১ এপ্রিল ২০২০)। ফাইনাইট গ্রুপ (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 ভ্যারিয়েবলের মান পরিবর্তন করে অন্য কিছু বা ফাঁকা স্ট্রিং দিলেই হবে (লাইন ৮২)।

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

Facebook Comments

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

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

এই পর্বের সবচেয়ে দরকারি জিনিস হচ্ছে .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 ফন্টের সমন্বয়ে আমার বর্তমান ভিম।

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

Facebook Comments

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

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

প্রথমেই দেখা যাক নেভিগেশন। ফাইলের মধ্যে ডানে-বাঁয়ে, ওপরে-নিচে যাওয়ার জন্য সাধারণভাবে অ্যারো কি ব্যবহার করা যায়। এছাড়া কমান্ড মোডে 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 কমান্ড ব্যবহার করুন।

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

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

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

Facebook Comments

ভিম : পরিচিতি

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

ভিম (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 দিয়ে একইসঙ্গে সেভ করা এবং ভিম থেকে বের হওয়া যাবে

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

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

Facebook Comments

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

ক্রন (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।

ওপরে চারটি কলামে * চিহ্নের মানে হচ্ছে কলামগুলো সব সময় এক্সিকিউট হবে। ক্রন জবটি প্রতি ঘণ্টার 25তম মিনিটে এক্সিকিউট হবে। আমরা যদি চাই যে এপ্রিল মাসের 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

মোশারফ হোসেন

Facebook Comments

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

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

  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

Facebook Comments

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

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

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

প্রোগ্রামিং

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

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

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

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

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

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

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

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

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

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

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

Facebook Comments

লিনাক্স কেন ব্যবহার করব?

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

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

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

Tux, the Linux mascot.
টাক্স, লিনাক্সের মাসকট

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

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

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

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

বলা হয়ে থাকে যে লিনাক্স প্রোগ্রামারদের জন্য প্রোগ্রামারদের দ্বারা তৈরি। তাই প্রোগ্রামিং-সংক্রান্ত কাজগুলো লিনাক্সে খুব সহজ ও স্বাভাবিকভাবে করা যায়। সি/সি++ বা পাইথনের মতো ভাষায় কাজ করতে গেলে বিভিন্ন সময় বিভিন্ন লাইব্রেরি ব্যবহার করতে হয়। লিনাক্সে এগুলো ইনস্টল ও ব্যবহার করা একেবারে সহজ। লিনাক্স থেকে ওয়েব প্রযুক্তির সাথে সংশ্লিষ্ট সকল ধরনের অ্যাপ্লিকেশন ও সফটওয়্যার ব্যবহার করা তুলনামূলক সহজ। অপরদিকে উইন্ডোজে কোনো লাইব্রেরি ইনস্টল করা যেমন ঝামেলার, ব্যবহারও ঝামেলার (ব্যাপারটি অবশ্য আপেক্ষিক)।

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

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

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

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

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

Facebook Comments

সিঙ্গাপুরে ক্যারিয়ার – ১ম পর্ব

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

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

এখন আসা যাক, সিঙ্গাপুরে কী কী বড় কোম্পানী আছে, যেখানে সফটওয়্যার প্রকৌশলীরা কাজ করতে পারে? প্রথমত, গুগল (Google), ফেসবুক (Facebook), টুইটার (Twitter) ও পেপালের (Paypal) ডেভেলাপমেন্ট সেন্টার। তারপরে আছে স্ট্রাইপ (Stripe), ইনডিড (Indeed.com), জেনডেস্ক (ZenDesk) ও অটোডেস্কের (AutoDesk) মতো প্রতিষ্ঠান। প্রতিষ্ঠিত স্টার্টআপগুলোর মধ্যে আছে গ্র্যাব (Grab), শপি (Shopee), গো-জ্যাক (GoJek), ট্রাভেলোকা (Traveloka) ইত্যাদি। এছাড়াও আরো অনেক ছোট-বড় কোম্পানী সেখানে রয়েছে, যারা হন্যে হয়ে প্রোগ্রামার খুঁজছে (মানে খুব ভালো মানের প্রোগ্রামার আর কী)।

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

সিঙ্গাপুরের ভালো প্রতিষ্ঠানগুলোতে চাকরি পেতে হলে জোর প্রস্তুতি নেওয়া দরকার। আমি এই ভিডিওতে একটি গাইডলাইন দেওয়ার চেষ্টা করেছি –

পরবর্ত পর্বে আলোচনা করব, কেউ যদি চাকরি পেয়ে যায়, তখন তার সিঙ্গাপুরে আসার আগে কী কী কাজ করতে হবে।

Facebook Comments

প্যালিনড্রোম

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

source – https://www.deviantart.com/rose-xx-15412/art/Palindrome-Cow-364640478

একটি স্ট্রিং প্যালিন্ড্রোম কী না, সেটি পরীক্ষা করার উপায় কী? একটি উপায় হচ্ছে, স্ট্রিংটি উলটে দিয়ে আরেকটি স্ট্রিং তৈরি করা। তারপর তাদের মধ্যে তুলনা করে দেখা।

কাজটি আমরা পাইথন ব্যবহার করে খুব সহজেই করে ফেলতে পারি।

def is_palindrome(s):
    return s == s[::-1]

আবার আমরা স্ট্রিংয়ের মাঝামাঝি থেকে শুরু করে একটি একটি করে অক্ষর তুলনা করেও প্যালিনড্রেম পরীক্ষা করতে পারি।

def is_palindrome(s):
    l = len(s)
    indx1 = l // 2 - 1
    indx2 = (l + 1) // 2
    while indx1 >= 0 and indx2 < l:
        if s[indx1] != s[indx2]:
            return False
        indx1, indx2 = indx1 - 1, indx2 + 1

    return True

দুটি ফাংশনই একই উদ্দেশ্য সাধন করবে, কিন্তু একটু আলাদভাবে। এখন পাঠকদের কাছে প্রশ্ন – প্রথম ও দ্বিতীয় ফাংশনের টাইম ও স্পেস কমপ্লেক্সিটি কত?

Facebook Comments