কম্পিউটারের মেমোরি

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

তোমরা তো ইতিমধ্যেই জেনে গিয়েছ যে কম্পিউটার যে হিসাবনিকাশ করে, সেগুলো যত বড় বড় হিসেবই হোক না কেন, শেষ পর্যন্ত কম্পিউটার কেবল শূণ্য আর এক ব্যবহার করে হিসেব করে (এই হিসেব করাটাকেই আমরা প্রসেস করা বলছি মাঝে মাঝে)। তো এই 0 এবং 1-গুলো রাখার জন্য আমাদের জায়গা দরকার। সেই জায়গাটি দেয় কম্পিউটারের মেমোরি। এই 0 আর 1, এগুলো হচ্ছে একেকটি বিট (ইংরেজিতে bit)। একটি বিট যে কোনো এক রকমের হবে, হয় শূণ্য (0) না হয় এক (1)। তাহলে একটি বিট দিয়ে দুটি আলাদা জিনিস প্রকাশ করা সম্ভব, যখন বিটটি হবে 0 তখন এক রকম, আবার যখন 1 তখন আরেক রকম। তাহলে পাশাপাশি দুটি বিট দিয়ে কয়টি আলাদা জিনিস রাখা যায়? তোমরা একটু চিন্তা করো তো। চিন্তা করা শেষ হলে নিচের টেবিলটি দেখো:

১ম বিট

২য় বিট

0

0

0

1

1

0

1

1

তাহলে দুটি বিট পাশাপাশি রাখলে চারটি আলাদা জিনিস রাখা যায়, 00, 01, 10 11। এবারে তোমার জন্য কাজ। খাতাকলম নিয়ে বসে পরো এবং তিনটি ও চারটি বিটের ক্ষেত্রে কতটি করে আলাদা জিনিস রাখা সম্ভব সেটি বের করো। উত্তর হবে যথাক্রমে 8 16। তাহলে দাঁড়াচ্ছে 2, 3 4টি করে বিটের ক্ষেত্রে যথাক্রমে 4, 8 16টি পৃথক জিনিস রাখা যায়। তাহলে তোমাদের যেহেতু বুদ্ধিশুদ্ধি বেশি, তোমরা সহজেই বলে দিতে পারবে, 5টি বিটের জন্য 32, 6টি বিটের জন্য 64, 7টি বিটের জন্য 128টি পৃথক জিনিস রাখা সম্ভব। তাহলে 8টি বিটের জন্য কত? উত্তর হবে 256। আর যাদের সামান্য একটু গাণিতিক বুদ্ধি আছে, তারা কিন্তু এতক্ষণে মনে মনে একটি সূত্র বের করে ফেলেছো। nটি বিট থাকলে 2n টি পৃথক জিনিস রাখা সম্ভব।

বাইট শব্দটি নিশ্চয়ই তোমরা শুনেছ? ইংরেজিতে byte। তবে এই শব্দের মানে কিন্তু কামড় নয়, সেটির ইংরেজি bite। আটটি বিট পাশাপাশি রেখে তৈরি হয় একটি বাইট। তাহলে এক বাইটে কতটি আলাদা জিনিস রাখা যায়? আমি জানি তোমরা চট্ করে বলে দিতে পারবে, 256টি।

তোমরা সবাই ক্যারেক্টার টাইপের (char) ভেরিয়েবলের সাথে পরিচিত। তাহলে এখন তোমরা নিশ্চয়ই বুঝতে পারছ যে একটি ক্যারেক্টার টাইপের ভেরিয়েবলে 256টি আলাদা জিনিস রাখা সম্ভব। এজন্যই আমরা বিভিন্ন অক্ষর, সংখ্যা, চিহ্ন এগুলোকে ক্যারেক্টার টাইপের ভেরিয়েবলের মধ্যে রাখি। প্রতিটি অক্ষরের একটি মান রয়েছে যাকে সংখ্যা দিয়ে প্রকাশ করা যায়। যেমন a-এর মান 97, b-এর মান 98, c-এর মান 99, এভাবে z-এর মান 122। আবার A-এর মান 65, B-এর মান 66, C-এর মান 67, এভাবে Z-এর মান 90, 0 থেকে 9 পর্যন্ত চিহ্নগুলোর মান যথাক্রমে 48 থেকে 57। এই মানগুলোকে বলে ASCII মান। ASCII হচ্ছে American Standard Code for Information Interchange-এর সংক্ষিপ্তরূপ। ইংরেজি সমস্ত অক্ষর, চিহ্ন সবগুলোরই ASCII মান রয়েছে। এখন তোমার মনে প্রশ্ন জাগতে পারে, পৃথিবীর বাকী ভাষাগুলো কী দোষ করল? তাদের সব অক্ষরের জন্য ASCII মান নেই কেন? আসলে 8 বিটে আমরা তো মোটে 256টি জিনিস রাখতে পারি, তাই সবার জায়গা দেওয়া সম্ভব হয় নি। অন্য সব ভাষার জন্য রয়েছে Unicode

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

আমাদের প্রথম প্রোগ্রামঃ

#include <stdio.h>

int main()

{

    int i;

    for (i = 33; i <= 126; i++) {

        printf(“ASCII code for %c is %dn”, i, i);

    }

    return 0;

}

আমাদের দ্বিতীয় প্রোগ্রামঃ

#include <stdio.h>

int main()

{

    char small_letter, capital_letter;

    printf(“Please enter a small letter: “);

    small_letter = getchar();

    capital_letter = small_letter – 32;

    printf(“The capital letter is: %cn”, capital_letter);

    return 0;

}

এখন তোমার কাজ হবে একটি ফাংশন লেখা, যেটি প্যারামিটার হিসেবে একটি ক্যারেক্টার টাইপের ভেরিয়েবল নিবে এবং সেটি যদি কোনো অঙ্ক (digit) হয়ে, তবে 1রিটার্ণ করবে, আর না হলে 0 রিটার্ণ করবে। কাজ শেষ হলে চলো, আমরা মেমোরি নিয়ে আলাপআলোচনায় ফেরত যাই।

ইন্টিজার টাইপের ভেরিয়েবলের আকার হচ্ছে চার বাইট, মানে 32 বিট। এই 32 বিটে আমরা 232টি বা 4294967296টি সংখ্যা রাখতে পারি। এখন আমরা যদি কেবল ধনাত্মক সংখ্যা রাখতে চাই, তাহলে 0 থেকে 4294967295 পর্যন্ত রাখা যাবে। এ ধরণের ভেরিয়েবলকে বলে unsigned ভেরিয়েবল। আর যেসব ভেরিয়েবলে ধনাত্মক ও ঋনাত্মক – উভয় প্রকারের সংখ্যা রাখা যায়, তাকে বলে signed ভেরিয়েবল, তবে এক্ষেত্রে আলাদাভাবে সেটির উল্লেখ থাকে না। তাহলে আমরা বুঝতে পারলাম কেনো int টাইপের ভেরিয়েবলে -2147483648 থেকে 2147483647 পর্যন্ত সংখ্যা রাখা যায় আর কেনো unsigned int টাইপের ভেরিয়েবলে 0 থেকে 4294967295 পর্যন্ত সংখ্যা রাখা যায়।

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

100

101

102

103

104

105

106

107

108

109

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

এবারে নিচের প্রোগ্রামটা ঝটপট টাইপ করে রান করো। কম্পাইল করার সময় ওয়ার্নিং দেখাবে, সেটিকে এড়িয়ে যাবে এবং প্রোগ্রামটি রান করবে।

#include <stdio.h>

int main()

{

    char ch1 = ‘A’, ch2 = ‘B’;

    int n1 = 100, n2 = 100000;

    unsigned int address1 = &ch1;

    unsigned int address2 = &ch2;

    unsigned int address3 = &n1;

    unsigned int address4 = &n2;

    printf(“%c, %un”, ch1, address1);

    printf(“%c, %un”, ch2, address2);

    printf(“%d, %un”, n1, address3);

    printf(“%d, %un”, n2, address4);

    return 0;

}

আউটপুট কী? একেক জনের আউটপুট একেক রকম হবে, কারণ মেমোরির কোন জায়গায় কোন ভেরিয়েবল থাকবে, তার কোনো ঠিক নেই। এখন তোমরা লক্ষ করো, কোনো ভেরিয়েবল যদি n হয়, তবে তার এড্রেস হচ্ছে &n। একারণের আমরা scanf ফাংশন ব্যবহার করে কোনো ভেরিয়েবল ইনপুট নেওয়ার জন্য ভেরিয়েবলের নামের আগে & চিহ্ন ব্যবহার করি। কিন্তু অ্যারের বেলাতে সেটি করতে হয় না, কারণ অ্যারের নামটিতেই অ্যারের শুরুর এড্রেসটি থাকে। অর্থাৎ কোনো অ্যারে যদি হয় int ara[10], সেখানে ara-এর মান প্রিন্ট করলেই অ্যারের এড্রেস পাওয়া যায়।

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

#include <stdio.h>

int main()

{

    int ara[5] = {50, 60, 70, 80, 90};

    printf(“%d, %d, %d, %d, %dn”, ara[0], ara[1], ara[2], ara[3], ara[4]);

    printf(“%un”, ara);

    printf(“%un”, &ara[0]);

    printf(“%un”, &ara[1]);

    return 0;

}

প্রোগ্রামটির প্রথম লাইনে প্রিন্ট হবে অ্যারের উপাদানগুলো। দ্বিতীয় লাইন প্রিন্ট হবে অ্যারের শুরুর এড্রেস। একেক জনের কম্পিউটারে আউটপুট একেক রকম হবে। দ্বিতীয় লাইনে যা প্রিন্ট হবে, তৃতীয় লাইনে ঠিক তাই প্রিন্ট হবে, কারণ অ্যারের শুরুর এড্রেস আর অ্যারের প্রথম উপাদানের এড্রেস একই জিনিস। চতুর্থ লাইনে অ্যারের দ্বিতীয় উপাদানের এড্রেস প্রিন্ট হবে, যা প্রথম উপাদানের এড্রেসের চেয়ে চার বেশি। কারণ প্রথম উপাদান পরপর চারটি বাইট দখল করবে। যদিও তোমার মনে হতে পারে, 50 কেনো চার বাইট জায়গা নেবে, এক বাইটেই তো লিখা যায়, কিন্তু যখনই তুমি ডাটা টাইপ int বলে দিবে, তখনই চার বাইট জায়গা দখল হয়ে যাবে।

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

#include <stdio.h>

int main()

{

    int num;

    char ch;

    double d_num;

    float f_num;

    printf(“%lun”, sizeof(int));

    printf(“Size of int: %dn”, sizeof(num));

    printf(“Size of char: %dn”, sizeof(ch));

    printf(“Size of double: %dn”, sizeof(d_num));

    printf(“Size of float: %dn”, sizeof(f_num));

    return 0;

}

এখন চলো জেনে নিই, কম্পিউটারে কয় ধরনের মেমোরি আছে।

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

কম্পিউটারের প্রসেসরের মধ্যেও কিন্তু মেমোরি আছে, প্রসেসরের সবচেয়ে কাছে থাকে রেজিস্টার, আর তার পরেই থাকে ক্যাশ মেমোরি। সি ল্যাঙ্গুয়েজে আমরা চাইলে কোনো ভেরিয়েবলকে রেজিস্টারে রাখার জন্য এভাবে ডিক্লেয়ার করতে পারি: register int number;। সেসব ভেরিয়েবলকেই আমরা রেজিস্টারে রাখার চেষ্টা করবো যেগুলো প্রোগ্রামের ভেতরে সবচেয়ে বেশি ব্যবহার করা হয়। তবে আজকাল রেজিস্টারে এভাবে না রাখলেও চলে, কম্পাইলারগুলো নিজেরাই বুঝে নেয় কোন ভেরিয়েবল কোথায় রাখতে হবে। রেজিস্টারের চেয়ে ক্যাশ মেমোরির আকার বড়, মানে বেশি তথ্য ধারণ করতে পারে, তবে গতি একটু কম। তারপরে আসে RAMRAM প্রসেসরের বাইরে মাদারবোর্ডে সংযুক্ত থাকে। ক্যাশের তুলনায় RAM-এর আকার বেশ বড়, তবে গতিও কম। এখন তোমরা প্রশ্ন করতে পারো, রেজিস্টার আর ক্যাশের আকার আরো বেশি হলে কী সমস্যা ছিল? শুধু শুধু RAM-এর ব্যবহার কেন করছি? আসলে রেজিস্টার মেমোরি তৈরিতে খরচ সবচেয়ে বেশি, তারপরে ক্যাশ মেমোরি। RAM তাদের তুলনায় বেশ সস্তা। RAM-এর পরে আসে ভার্চুয়াল মেমোরি। RAM-এ যখন জায়গা হয় না, তখন হার্ডডিস্কের একটা অংশকে কম্পিউটারের অপারেটিং সিস্টেম মেমোরি হিসেবে ব্যবহার করতে দেয় প্রোগ্রামগুলোকে। সেটা অবশ্যই RAM-এর তুলনায় ধীর গতির। নিচের ছবিটির দিকে একবার চোখ বুলিয়ে নাওঃ

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

 

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

উবুন্টুতে ফ্লাস্ক ইনস্টল করার প্রক্রিয়া

সাধারণ ছোটোখাটো প্রজেক্ট থেকে মাঝারি সাইজের প্রজেক্টের জন্য ফ্লাস্ক (Flask) একটি চমৎকার পাইথন ফ্রেমওয়ার্ক। আমি রেস্টফুল এপিআই তৈরির জন্য ফ্লাস্ক রেস্টফুল (Flask-RESTful) ব্যবহার করি। ডেভেলাপমেন্টের জন্য আমি ম্যাক ও উবুন্টু (Ubuntu) দুটোই ব্যবহার করি, আর সার্ভারে উবুন্টু। এখানে আমি উবুন্টুতে ফ্লাস্ক প্রজেক্ট ডেপ্লয় করার জন্য যা যা দরকার, সেগুলো লিখে রাখবো, যাতে পরবর্তি সময়ে আমার কিংবা অন্যদের সুবিধা হয়। কমান্ডগুলো উবুন্টু ১৪.০৪ ব্যবহার করে পরীক্ষা করা হয়েছে।

প্রথমে চেক করতে হবে কম্পিউটারে উবুন্টুর সব প্যাকেজ হালনাগাদ করা হয়েছে কী না। না হলে আপডেট করে নিতে হবে। এর জন্য সহজ কমান্ড হচ্ছে :
sudo apt-get update && sudo apt-get upgrade

এখন পাইথন ও পিপ (pip) ইনস্টল করবো :

sudo apt-get install build-essential python-dev python-pip

তারপরের কাজ হচ্ছে ভার্চুয়াল এনভারনমেন্ট ইনস্টল করা।
sudo pip install virtualenv

এটি দরকারি এজন্য যে একেক প্রজেক্ট একেক সময়ে করা হয়, তাই সেই প্রজেক্টের জন্য দরকার মডিউল আলাদা করে ফেলা উচিত, যাতে পরবর্তি সময়ে অন্য প্রজেক্টে কাজ করার সময় কনফ্লিক্ট তৈরি না হয়।

এখন যেই ডিরেক্টরিতে অ্যাপ্লিকেশনটি রাখা হবে, সেটি তৈরি করে ফেলা যাক :

sudo mkdir -p /var/www/myapp

এখন পারমিশন পরিবর্তন করতে হবে। আমার ক্ষেত্রে ইউজার আইডি হচ্ছে www-data, ইউজার গ্রুপও হচ্ছে www-data। আপনার ক্ষেত্রে সেটি অন্যরকম হতে পারে। লক্ষ্য রাখতে হবে যে অনেক সময় ফাইল পরিবর্তন করলে সেটি রুট বা অন্য ইউজার-এর হয়ে যায়, তাই পরীক্ষা করতে হবে যে myapp ডিরেক্টরির সব ফাইল এবং সাব-ডিরেক্টরির পারমিশন ঠিক আছে কী না।
sudo chown -R www-data:www-data /var/www/myapp
cd /var/www/myapp

এখন ভার্চুয়াল এনভারমেন্ট তৈরি করি।
virtualenv venv --no-site-packages

ভার্চুয়াল এনভারমেন্ট একটিভেট করে সেখানে ফ্লাস্ক ইনস্টল করি।
source venv/bin/activate
pip install flask

এখানে আমরা আমাদের ফ্লাস্ক অ্যাপটি রাখবো।

লক্ষ্য রাখতে হবে যে হোস্ট সেট করতে হবে 0.0.0.0 তে (127.0.0.1-এ নয়)। আর অ্যাপ্লিকেশনের শুরুটা রাখতে হবে if __name__ == ‘__main__’: ব্লকের ভিতরে।

এরপরের কাজ হচ্ছে ওয়েব সার্ভার ইনস্টল করা (যদি ইনস্টল করা না থাকে)। আমি সাধারণত ইঞ্জিন-এক্স ব্যবহার করি। আর ইনস্টল করার আগে ভার্চুয়াল এনভারমেন্ট ডিএকটিভেট করে নিতে হবে এই কমান্ড দিয়ে :
deactivate
sudo apt-get install nginx

এখন আমি uwsgi ইনস্টল করবো, এটি ইঞ্জিনএক্স ও আমার ফ্লাস্ক অ্যাপ্লিকেশনের মধ্যে একটি যোগসূত্র তৈরি করে দিবে, মানে এটিই আমার ফ্লাস্ক অ্যাপ্লিকেশনকে চালাবে। এর ব্যবহার বাধ্যতামূলক নয়, তবে ব্যবহার করলে ভালো। 🙂

sudo apt-get install uwsgi uwsgi-plugin-python

এখন একটা সকেট ফাইল তৈরি করা লাগবে যার মাধ্যমে ইঞ্জিনএক্স, uwsgi-এর সাথে যোগাযোগ করবে।
cd /tmp/
touch mapp.sock

ফাইলের পারমিশন পরিবর্তন করতে হবে যাতে ইঞ্জিনএক্স সেটি চালাতে পারে।
sudo chown www-data:www-data myapp.sock

এরপর ইঞ্জিনএক্সের কনফিগারেশন ফাইল তৈরি করতে হবে। এর জন্য প্রথমে /etc/nginx/sites-available ডিরেক্টরিতে যেতে হবে নিচের কমান্ড দিয়ে :
cd /etc/nginx/sites-available

তারপরে ডিফল্ট যেই কনফিগারেশন ফাইল আছে, সেটি মুছে ফেলতে হবে বা সরিয়ে রাখতে হবে।
sudo mv default _default

এবারে নতুন কনফিগারেশন ফাইল তৈরির জন্য আমরা নিচের কমান্ড ব্যবহার করতে পারি :
sudo vi myapp
এটি vi এডিটর দিয়ে খুলবে, চাইলে অন্য এডিটরও ব্যবহার করা যায়।

এখন নতুন ফাইলে নিচের জিনিসগুলো পেস্ট করতে হবে :

server {
    listen 80;
    server_tokens off;
    server_name myapp.com;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/myapp.sock;
    }

    location /static {
        alias /var/www/myapp/static;
    }
}

এখানে লক্ষ্যণীয় যে static ফাইলগুলো রাখার জন্য /var/www/myapp/static ডিরেক্টরি ব্যবহার করা হয়েছে। আপনি আপনার প্রয়োজনমতো ডিরেক্টরি তৈরি করে সেই লোকেশন এখানে লিখবেন।

যেই কনফিগারেশন ফাইলটি তৈরি করলাম, তার একটি লিঙ্ক তৈরি করতে হবে /etc/nginx/sites-enabled ডিরেক্টরিতে। এর জন্য নিচের কমান্ড দিতে হবে :
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/myapp

এবারে uwsgi এর জন্যও একটি কনফিগারেশন ফাইল তৈরি করা লাগবে, লোকোশনসহ ফাইলটি হচ্ছে /etc/uwsgi/apps-available/myapp.ini

ফাইলে নিচের জিনিসগুলো লিখতে হবে:

[uwsgi]
vhost = true
socket = /tmp/myapp.sock
venv = /var/www/myapp/venv
chdir = /var/www/myapp
module = api
callable = app

মডিউল হচ্ছে পাইথন স্ক্রিপ্ট যেই ফাইলে আছে তার নাম আর কলেবল হচ্ছে ওই স্ক্রিপ্টে যেই ফ্লাস্ক অবজেক্ট তৈরি করা হয়েছে। উদাহরণস্বরূপ নিচের স্ক্রিপ্টটি আমরা দেখি:

from flask import flask
app = Flask(__name__)

@my_app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0')

এটি যদি api.py নামের ফাইলে সেভ করা হয়, তাহলে কনফিগারেশন ফাইলে module = api এবং callable = app লিখতে হবে।

তারপর নিচের কমান্ড দিয়ে লিঙ্ক করতে হবে:
sudo ln -s /etc/uwsgi/apps-available/myapp.ini /etc/uwsgi/apps-enabled/myapp.ini

সবশেষে nginx ও uwsgi আবার চালু করতে হবে।
sudo service nginx restart
sudo service uwsgi restart

সবকিছু ঠিকঠাক হয়ে থাকলে ফ্লাস্ক অ্যাপ্লিকেশনটি এখন কাজ করবে।

পাইকন ঢাকা নিয়ে বিস্তারিত

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

banner

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

2

অনুষ্ঠানটি শুরু হয় সকাল ৯:৩০ মিনিটে। অনুষ্ঠানটি পরিচালনা করেন তামিম শাহরিয়ার সুবিন। অনুষ্ঠানটিতে ছিল মোট দুটি প্রেজেন্টেশন সেশন। প্রতি সেশনে ৫টি করে ভিন্ন ভিন্ন পাইথন লাইব্রেরী নিয়ে বক্তারা আলোচনা করেন। প্রথম সেশন শুরু হয় বেলা ১০:০০ টায়। এই সেশনের প্রথম বক্তা মাফিনার খান। তিনি বর্তমানে প্যানাসিয়া সিস্টেমস লিমিটেড এ প্রডাক্ট ম্যানেজার হিসেবে কর্মরত আছেন। তিনি আলোচনা করেন পাইথন প্রোগ্রামিং ভাষার আকর্ষণীয় সব ফিচার নিয়ে।

4

পরবর্তি প্রেজেন্টেশন এর বিষয় ছিল রেস্ট এপিআই (REST API)। ‘টেস্ট ইওর রেস্ট এপিআই’ শীর্ষক এই প্রেজেন্টেশনের বক্তা মুক্ত সফটওয়্যার লিমিটেড এর ব্যাবস্থাপনা পরিচালক তামিম শাহরিয়ার সুবিন। রেস্ট এপিআইয়ের পরে পাইথনের লাইব্রেরী বিউটিফুলসুপ (BeautifulSoup) এর উপরে প্রেজেন্টেশন প্রদান করেন নর্থ সাউথ বিশ্বিবিদ্যালয়ের শিক্ষার্থী ইনাম মিজবাহ নূর। তিনি তার বক্তব্যে দেখান কিভাবে বিউটিফুলসুপ ব্যবহার করে HTML পার্সিং করা যায়। ওয়েব ক্রলিং ও স্ক্র্যাপিংয়ের জন্য বিউটিফুলসুপ একটি জনপ্রিয় লাইব্রেরী।

8

‘জ্যাঙ্গো ইন লার্জ স্কেল অটোমেশন’ শিরোনামে পরবর্তি প্রেজেন্টেশন উপস্থাপন করেন মুক্ত সফটওয়্যার লিমিটেড এর সিটিও মাহফুজুর রহমান মাসুম। জ্যাঙ্গো হচ্ছে পাইথনে তৈরী জনপ্রিয় একটি ওয়েব ডেভেলপমেন্ট ফ্রেমওয়ার্ক যার সাহায্যে অনেক সহজে খুব বড় স্কেলের প্রজেক্ট তৈরী করা যায়।

9

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

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

10

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

12

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

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

11

5

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

1314

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

banner-logo

অনুষ্ঠানে অংশগ্রহণকারী সকলকে স্পনসরদের পক্ষ থেকে টি-শার্ট, গিফট প্যাক ও দুপুরের খাবার সরবরাহ করা হয়। পাইকন ঢাকা ২০১৪-এর স্পন্সর ছিলো নিউজক্রেড, ওয়াইডস্পেস, বিডিজবস, মুক্তসফট, ফাইন্ডার এলবিএস, অনলাইন কেনাকাটা, ট্রান্সেনডিও ও নেসক্যাফে। অনুষ্ঠানের সমাপ্তি ঘোষনা করে আয়োজকরা বলেন, ‘বাংলাদেশে এই প্রথমবারের মত আমরা পাইথন ডেভেলপারদের জন্য আন্তর্জাতিক ভাবে স্বীকৃত পাইকন ঢাকা ২০১৪ করেছি। অনুষ্ঠানে উপস্থিত সকলের উৎসাহ ও উদ্দীপনা দেখে আমরা অভিভূত’। তারা ভবিষ্যতে পাইথন প্রোগ্রামারদের আরো বড় সম্মেলন আয়োজন করার ইচ্ছা ব্যাক্ত করেন। তারা আরো জানান, dhaka.pycon.org ইউআরএল এ ইভেন্টের বিস্তারিত তথ্য জানা যাবে।

6

উন্নয়নশীল দেশের জন্যে ফেসবুকের অ্যান্ড্রয়েড অ্যাপে পরিবর্তন

facebook-645x250

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

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

  • অ্যাপটি চালু হতে ৫০ শতাংশ কম সময় নিবে
  • অ্যাপটি ৫০ শতাংশ কমে ইন্টারনেট ডাটা খরচ করবে
  • ফেসবুকে অ্যাপের ইমেজ লোড ব্যর্থতার পরিমাণ ৯০ শতাংশ হ্রাস করবে
  • অ্যাপটির আকার ৬৫ শতাংশ পর্যন্ত হ্রাস করা হয়েছে

এই সকল ক্ষেত্রে উন্নত করতে ফেসবুককে নানা ধরনের সমাধানের আশ্রয় নিতে হয়েছে। যার মধ্যে আছে গুগলের নতুন ইমেজ ফরম্যাট ওয়েবপি এর ব্যবহার যা কিনা ইতোমধ্যে গুগল ক্রোম এবং অপেরা ম্যাক্স ব্রাউজারে ব্যবহার করা হয়। এই ইমেজ ফরম্যাট ব্যবহারের ফলে ফেসবুকে ইমেজ ক্ষেত্রে ডাটা বাচবে প্রায় ২৫-৩৫ শতাংশ জেপিজি এর তুলনায় এবং পিএনজি এর তুলনায় ৮০ শতাংশ। আর এর সবকিছুই সম্ভব হবে ছবির মানের উপর কোন প্রকার খারাপ প্রভাব না ফেলে।

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

এছাড়া ইমেজ লোডিং ব্যর্থতার মান কমাতে তারা নতুন নেটওয়ার্ক কনসেপ্ট তাদের মোবাইল অ্যাপে ব্যবহার করা শুরু করেছে। যা হল OkHttp।

ফেসবুকের ইঞ্জিনিয়ারিং ম্যানেজার এলেক্স সৌরভ এ বিষয়ে বলেন, “আমাদের উদ্দেশ্য শুধুমাত্র উচ্চমানের স্মার্টফোন এবং উন্নত এলটিই নেটওয়ার্কে ভাল অভিজ্ঞতা দেয়া নয়। আমরা চাই ফেসবুক সকলের জন্যে কাজ করুক- তা যেই অঞ্চল হোক না কেন, নেটওয়ার্ক এর অবস্থা যাই হোক না কেন এবং যেই মোবাইল ফোনই হোক না কেন।”

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

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

প্রোগ্রামিং কনটেস্ট

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

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

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

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

প্রোগ্রামিং প্রতিযোগিতায় আসলে কী হয়? এসিএম আইসিপিসি বা এই ধরনের প্রতিযোগিতায় তিনজন প্রোগ্রামার মিলে একটি দল হিসেবে অংশগ্রহন করে। প্রতিটি দলকে দেওয়া হয় একটি কম্পিউটার, এক সেট প্রোগ্রামিং সমস্যা (৯ থেকে ১২ টি) এবং সেগুলো সমাধানের জন্য ৫ ঘণ্টা সময়। নির্দিষ্ট সময়ের মধ্যে যেই দল সবচেয়ে বেশি সংখ্যক সমস্যার সমাধান করতে পারে, সেই দল বিজয়ী হয়। সমান সংখ্যক সমস্যার সমাধান করলে যারা কম সময়ে করেছে এবং পেনাল্টি কম (সমাধান ভুল হলে ২০ মিনিট পেনাল্টি হয়), তারা rank-list-এ ওপরে থাকে। সমস্যাগুলোর মধ্যে একটি সমস্যা এমন দেওয়া হয় যেন সেটি সব দলই সমাধান করতে পারে, আরেকটি থাকে এমন যাতে কোনো দলই সমাধান করতে না পারে।

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

প্রোগ্রামিং প্রতিযোগিতায় অংশ নিতে কী জানা লাগবে? প্রথমেই একটি প্রোগ্রামিং ভাষায় উপর ভালো দখল প্রয়োজন। সি (C) বা সি প্লাস প্লাস (C++) এক্ষেত্রে সবচেয়ে ভালো। কারণ এ দুটি ভাষা মোটামুটি সব ধরণের প্রোগ্রামিং প্রতিযোগিতায় ব্যবহার করা হয়। অনেকক্ষেত্রে জাভাও ব্যবহার করা যায়, তবে কিছু কিছু সমস্যার সমাধান জাভা দিলে লেখা হলে সেগুলো রান করতে বেশি সময় লাগে। সি এর চেয়ে সি প্লাস প্লাস ব্যবহার করা বুদ্ধিমানের কাজ এই জন্য যে সেখানে এসটিএল (STL : স্ট্যান্ডার্ড টেমপ্লেট লাইব্রেরি) বলে খুব কার্যকরী লাইব্রেরি আছে, যেটির ব্যবহার কিছু কিছু ক্ষেত্রে অনেক সময় বাঁচিয়ে দেয়। তবে সি এবং সি প্লাস প্লাস-এর মধ্যে মিল অনেক বেশি এবং সি দিয়ে প্রোগ্রামিং শেখা শুরু করলে সি প্লাস প্লাস শিখতে খুব একটা সময় লাগবে না। প্রোগ্রামিং প্রতিযোগিতায় যারা অংশগ্রহন করতে ইচ্ছুক, তাদের কথা মাথায় রেখে অনলাইনে একটি প্রোগ্রামিং কোর্স তৈরি করা হয়েছে, সেটিতে অংশ নেওয়ার জন্য যেতে হবে এখানে : http://dimikcomputing.com/course/introduction-to-programming-online-course/ , কোর্সটি সবার জন্য বিনামূল্যে দেওয়া আছে এবং নিজের সুবিধামতো সময়ে সেটি করা যাবে। তারপর কোর্সটি করা শেষ হলে কিংবা প্রোগ্রামিং ভাষা মোটামুটি শেখা হলে প্রবলেম সলভ করা শুরু করতে হবে। শুরুটা করার জন্য এখানে কিছু প্রোগ্রামিং সমস্যা আছে যেগুলোর বর্ণনা বাংলাতে লেখা : http://goo.gl/wsJPQV

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

CodeForces (http://codeforces.com/)
TopCoder (http://www.topcoder.com/)
CodeChef (https://www.codechef.com/)
SPOJ (http://www.spoj.com/)
LightOJ (http://lightoj.com)

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

বিভিন্ন ওয়েবসাইটে প্রবলেম সলভ করার সময় অনেকে একই রকম অনেক প্রবলেম সলভ করে। সেটি না করে বিভিন্ন রকম প্রবলেম সলভ করার পেছনে সময় দেওয়াটাই শ্রেয়। অনেক সময় কঠিন কিছু প্রবলেমের পেছনে বেশ কয়েকদিন লেগে থাকতে হয়। সমস্যা সমাধানের জন্য এই লেগে থাকার ব্যাপারটা বিরক্তিকর ঠেকালেও হতাশ হওয়া চলবে না।

প্রোগ্রামিং ল্যাঙ্গুয়েজ শেখার পরে শিখতে হবে ডাটা স্ট্রাকচার আর অ্যালগরিদম। এগুলো ভালো বুঝার জন্য আবার ডিসক্রিট ম্যাথ বা বিচ্ছিন্ন গণিতের উপর ভালো দখল থাকা চাই। ডিসক্রিট ম্যাথ বিশ্ববিদ্যালয়গুলোর কম্পিউটার বিজ্ঞান বিভাগের সিলেবাসে আছে। আর নিজে নিজে শিখতে চাইলে বইয়ের সাহায্য নেওয়া যায় কিংবা অনলাইনে ডিসক্রিট ম্যাথের উপর একটি ফ্রি কোর্স আছে, সেটিতে অংশ নেওয়া যায় : http://dimikcomputing.com/course/discrete-mathematics-online-course/। ডাটা স্ট্রাকচার এবং  অ্যালগরিদম শেখার সময় বেশ কয়েকটি বই পড়তে হবে। আর প্রতিটি অ্যালগরিদম শেখার পরে সেই অ্যালগরিদম ব্যবহার করে কয়েকটি সমস্যা সমাধান করে ফেলতে হবে। ইন্টারনেটে এরকম কিছু তালিকা পাওয়া যায় যে একটি অ্যালগরিদম দিয়ে কোন কোন ওয়েবসাইটে কোন কোন সমস্যাগুলো সমাধান করা যায়। অ্যালগরিদম ছাড়াও গণিতের বেশ কিছু বিষয়ে ভালো দখল থাকতে হবে। যেমন : জ্যামিতি, সংখ্যাতত্ত্ব, কম্বিনেটরিক্স। তবে এগুলো আলাদাভাবে না শিখে এই সংক্রান্ত প্রবলেম সলভ করতে করতে শেখাটাই বেশি কার্যকরি – এমন মতামত দিয়েছেন মীর ওয়াসি আহমেদ, যিনি বুয়েটে সিভিল ইঞ্জিনিয়ারিংয়ের ছাত্র থাকাকালীন অংশ নিয়েছেন এসিএম আইসিপিসি’র চূড়ান্ত পর্বে (২০১২ সালে)। তাঁর মতে প্রথমে একটি সমস্যা নিয়ে সেটি নিজে সমাধানের চেষ্টা করতে হবে। যথেষ্ট সময় চেষ্টা করার পরে সেটি সমাধান করতে না পারলে, সেটির সমাধান দেখে শিখে নিতে হবে। নিজে কোড লেখার পাশাপাশি অন্যের লেখা কোড পড়ে বোঝাটাও অনের দরকারি।

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

ব্যক্তিগত দক্ষতা অর্জনের পরে নজর দিতে হবে দলীয় দক্ষতা বাড়ানোর প্রতি। যেহেতু তিনজন মিলে একটি দল এবং সেই দলের জন্য একটি মাত্র কম্পিউটার ও একসেট প্রশ্ন, তাই দলের সদস্যদের মধ্যে চমৎকার বোঝাপড়া থাকা চাই। দল হিসেবে বিভিন্ন অনলাইন প্রতিযোগিতায় অংশ নিতে হবে। সেখানে অংশ নেওয়ার সময় খেয়াল রাখতে হবে যে তিনজন মিলে যেন একটি কম্পিউটার ব্যবহার করে। সমস্যাগুলোও একসেট প্রিন্ট করে সেটি ব্যবহার করা উচিত। দলের প্রত্যেক সদস্যের অপর সদস্যদের শক্তি ও দুর্বলতা সম্পর্কে জানতে হবে। যেই বিষয়ের উপর যে দক্ষ, সেই বিষয়ের সমাধানের দায়িত্ব তার উপরই দেওয়া উচিত। আর অনেক সময় একটি প্রবলেম নিয়ে দুজন মিলে আলোচনা করলে দ্রুত সমাধান চলে আসে। প্রোগ্রামিং কনটেস্টের দলগত কৌশলের ব্যাপারে একটি চমৎকার লেখা আছে, টিমওয়ার্ক ইন প্রোগ্রামিং কনটেস্ট (লিঙ্ক : http://goo.gl/wBPBON)। এটি সবার পড়া আবশ্যক।

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

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

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

বি.দ্র. আমার এই লেখাটি প্রথম আলো’র প্রজন্ম ডট কম পাতায় প্রকাশিত হয় ২০ জুন ২০১৪ তারিখে।

প্রোগ্রামিং প্রতিযোগিতার প্রস্তুতির জন্য দ্বিমিক প্রকাশনীর তিনটি বই –

ওয়েবসাইট বিপর্যয় ও মুক্তির উপায় – পর্ব ২

প্রথম পর্বের লিঙ্ক : http://subeen.com/?p=28

 

২০১১ সালের ডিসেম্বর মাসে সাস্ট (SUST) থেকে শিক্ষক রুহুল আমিন সজীবের নেতৃত্বে একটি দল ঢাকায় আসে প্রায় দুই সপ্তাহের জন্য। মিশন জাতীয় বিশ্ববিদ্যালয়ের ভর্তি পরীক্ষার ফলাফল প্রসেস করে রেজাল্ট তৈরি করা। চার লক্ষ পরীক্ষার্থীর জন্য এই কাজটি এক বিশাল আয়োজন। এর মধ্যে একটি ছোট্ট অংশ হচ্ছে রেজাল্ট তৈরি করার পরে সেটি ওয়েবসাইটে প্রকাশ করা।

 

সজীবকে বললাম, ‘সজীব, চল ওয়েবসাইটটা ক্লাউডে হোস্ট করি, আর এমনভাবে করি যেন সেটা ডাউন না হয়।

সজীব উত্তর দিল, ‘আরে সুবিন ভাই, সব ব্যবস্থা করে ফেলছি, রেকস্পেস ক্লাউড সাইটে ওয়েবসাইট হোস্ট করবো, সেটা অনেক লোড সামলাতে পারবে

– ‘লোড সামলাতে পারলে ভালো, কিন্তু সেটা তো যথেষ্ট নয়। ডাটাবেজ কানেকশনতো একটা মূল ইস্যু।

– ‘তাহলে কী করতে বলেন?’

– ‘মেমক্যাশ (memcached) ব্যবহার করি।

– ‘কোনো সমস্যা হবে না?’

– ‘না, সমস্যা নাই, সবার রেজাল্ট মেমোরিতে ক্যাশ করা থাকবে, আর কোনো কারণে সেটা ফেইল করলে মাইএসকিউএল ডাটাবেজ থেকে রেজাল্ট আনা হবে।

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

 

আমি খুশিমনে তিনদিনের জন্য ওদের সাথে থেকে গেলাম।

 

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

 

এখন আমরা যে আটটি সার্ভার ব্যবহার করবো, সেখানে কখন কোন সার্ভারে রিকোয়েস্ট যাবে, সেটা নির্ধারণ করা হবে কীভাবে? আমরা সহজ একটা সিদ্ধান্তে আসলাম। একটা ভেরিয়েবল N নেই। N-এর মান ৮। N ভেরিয়েবল হওয়ার সুবিধা হচ্ছে আমরা ইচ্ছামতো সার্ভার মূল সিস্টেমে যুক্ত করতে পারবো, আবার বাদও দিতে পারবো। এখন পরীক্ষার্থীদের রোল নাম্বারকে ৮ দিয়ে মড করা হবে (মড করলে সেটা হবে ০ থেকে ৭এর ভিতরে)। মড করলে যেই সংখ্যাটি পাওয়া যাবে তার সাথে ১ যোগ করে তত নম্বর সার্ভারে রিকোয়েস্ট করা হবে। তাহলে প্রতিটি সার্ভারকে গড়ে ৫০ হাজার স্টুডেন্টের ফলাফল প্রসেস করতে হবে, যেহেতু মোট পরীক্ষার্থী ৪ লক্ষ! লোড অনেক কমে গেলো।

cloud-arch1

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

 

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

 

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

 

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

ওয়েবসাইট বিপর্যয় ও মুক্তির উপায় – পর্ব ১

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

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

webarch

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

এই সমস্যা থেকে মুক্তি পাওয়ার উপায় কী? উপায় হচ্ছে ডিসট্রিবিউটেড কম্পিউটিং (distributed computing), যা ক্লাউড কম্পিউটিং (cloud computing) ব্যবহার করে সহজে করা যায়। আগামী পর্বে লিখব ২০১১-২০১২ সালের জাতীয় বিশ্ববিদ্যালয়ের ভর্তি পরীক্ষার ফল প্রকাশের ওয়েবসাইটের জন্য  ক্লাউড কম্পিউটিং ব্যবহারের অভিজ্ঞতার কথা।

দ্বিতীয় পর্ব পড়তে এখানে ক্লিক করুন

ওয়েব ডেভেলাপমেন্ট-এ ক্যারিয়ার

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

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

ডিজাইনের পরবর্তি কাজ হচ্ছে মার্ক-আপ। মানে ডিজাইনার যেই ডিজাইনটি করেছেন, সেটি থেকে এইচটিএমএল (HTML → Hyper Text Markup Language) ফাইল তৈরি করা। তবে শুধু HTML এর কাজই যথেষ্ট নয়। সাথে দরকার CSS (Cascading Style Sheet)। সিএসএস ব্যবহার করে এইচটিএমএল ফাইলে স্টাইল আনা যায় যাতে ওয়েবসাইট দেখতে হুবুহু তার ডিজাইনের মতো হয়। এই কাজগুলো করেন মার্ক-আপ ইঞ্জিনিয়ার।

বড় কোম্পানীগুলোতে মার্ক-আপ ইঞ্জিনিয়ার এর আলাদা পোস্ট থাকে, তবে অনেক জায়গাতেই সেই কাজটা করতে হয় ফ্রন্ট এন্ড (front end) ইঞ্জিনিয়ারের। তবে ফ্রন্ট-এন্ড ইঞ্জিনিয়ারের মূল কাজ হচ্ছে জাভাস্ক্রিপ্টে। জাভাস্ক্রিপ্ট একটি প্রোগ্রামিং ভাষা যেটি ব্যবহার করে প্রোগ্রাম লিখলে সেটি ব্রাউজার থেকে চলে। ইন্টারএকটিভ ওয়েবসাইগুলোর জন্য জাভাস্ক্রিপ্ট অপরিহার্য। এই ভাষাটি জানতে হয় ফ্রন্ট এন্ড ইঞ্জিনিয়ারের। সাথে কয়েকটি ফ্রেমওয়ার্কও। যেমন জেকুয়েরি (jQuery), ইএক্সটিজেএস (ext-js), প্রটোটাইপ (prototype) ইত্যাদি। এসব জানার পাশাপাশি ওয়েব টেকনোলজির নানা বিষয় সম্পর্কেও স্বচ্ছ ধারণা থাকা দরকার। যেমন এক্সএমএল (XML), জেসন (JSON), এজাক্স (Ajax), ক্লায়েন্ট-সার্ভার ইন্টারএকশন ইত্যাদি।

ওয়েবসাইটে ব্যবহারকারির দেওয়া ইনপুটের উপর ভিত্তি করে বিভিন্ন কাজ হয়। যেমন ফেসবুকে কেউ একটা স্ট্যাটাস দিলো, সেটি তার ফেসবুক বন্ধুতালিকার সবাই দেখতে পাবে, আর পাবলিক হলে ফলোয়ারদের নিউজফিডেও চলে যাবে। এই কাজটি করার জন্য সার্ভারে কিছু কোড লেখা লাগে। আবার ধরা যাক, কেউ অনলাইনে কেনাকাটা করছে, সেখানেও সার্ভারে বেশ কিছু কোড রান করে। সার্ভারে এই প্রোগ্রামগুলো যিনি তৈরি করেন, তাকে বলা হয় ব্যাক-এন্ড ইঞ্জিনিয়ার (back-end engineer)। ব্যাক-এন্ডের কাজের জন্য জনপ্রিয় প্রোগ্রামিং ভাষা হচ্ছে পিএইচপি (PHP), পাইথন (Python), রুবি (Ruby), জাভা (Java) ইত্যাদি। একজন ভালো ব্যাক-এন্ড ইঞ্জিনিয়ারের কেবল প্রোগ্রামিং করতে পারাটাই যথেষ্ট নয়, সেই সাথে ওয়েব নিরাপত্তা, ডাটাবেজ, ওয়েব আর্কিটেকচার এরকম নানান বিষয়ে গভীর জ্ঞান থাকা দরকার। আবার ওয়েবসাইটকে স্কেলেবল (scalable) করাটাও তার কাজের মধ্যে পড়ে। একটি উদাহরণ দিই। প্রতি বছর বিভিন্ন পাবলিক পরীক্ষার ফলাফল যখন প্রকাশ হয়, ওয়েবসাইটে ঢুকলে মনে হয় সাইট হ্যাং হয়ে আছে – কোনো কাজ করছে না। তার মূল কারণ হচ্ছে এসব ওয়েবসাইট যেভাবে তৈরি করা হয়েছে, সেগুলো স্কেলেবল নয়। হয়ত ১০০ ব্যবহারকারির জন্য ওয়েবসাইট কাজ করছে, কিন্তু যখনই দশ হাজার কিংবা এক লক্ষ মানুষ সেই ওয়েবসাইটে হিট করছে, তখন ওয়েবসাইট আর কাজ করছে না, কারণ এত লোড সে সামলাতে পারছে না। একজন ভালো ব্যাক-এন্ড ইঞ্জিনিয়ারের পক্ষে এই সমস্যাটির সমাধান সম্ভব।

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

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

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

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

পুনশ্চ : ওয়েবের উপর ধারণা আরো পাকাপোক্ত করতে এই ফ্রি অনলাইন কোর্সটি করে ফেলুন : http://dimikcomputing.com/course/web-concepts/। কোর্সটি সম্পূর্ণ বাংলায়।

জাভা দিয়ে ছোট্ট ওয়েব ক্রলার

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


কাজের ধাপ:

১) ব্যবহারকারীর কাছ থেকে ইনপুট হিসেবে ওয়েব সাইটের এড্রেস (ইউআরএল) নিতে হবে।

২) ওই ইউআরএল-এর এইচটিএমএল সোর্স কোড পড়তে হবে বা বের করতে হবে (getUrlContent(url))।

৩) এইচটিএমএল সোর্স কোড থেকে সব হাইপার-লিঙ্কগুলো বের করতে হবে (getHyperlinks(content))।

৪) প্রতিটি ইউআরএল-এর জন্য এইচটিএমএল সোর্স কোড বের করতে হবে এবং সেই সাথে এইচটিটিপি রেসপন্স কোডও বের করতে হবে (getHTTPResponseCode(url))।

 

সম্পূর্ণ সোর্স কোড নিচে দেওয়া হলো :

 import java.io.BufferedReader;    
 import java.io.IOException;    
 import java.io.InputStreamReader;    
 import java.io.FileWriter;    
 import java.io.BufferedWriter;    
 import java.net.HttpURLConnection;    
 import java.net.URL;    
 import java.net.SocketTimeoutException;    
 import java.net.UnknownHostException;    
 import java.util.ArrayList;    
 import java.util.regex.Matcher;    
 import java.util.regex.Pattern;    
 public class Checker {    
     public static void main(String args[]) throws Exception    
     {    
         String url = null;    
         if (args.length > 0) {    
             url = args[0];    
             System.out.println(url);    
         }    
         else {    
             System.out.println("Please enter the URL as a command line parameter.");    
             return;    
         }    
         String content = getUrlContent(url);    
         ArrayList<String> links = getHyperlinks(content);    
         FileWriter fstream = new FileWriter("out.txt");    
         BufferedWriter out = new BufferedWriter(fstream);    
         int status;    
         for (int i = 0; i < links.size(); i++) {    
             url = (String) links.get(i);    
             System.out.println(url);    
             status = getHTTPResponseCode(url);    
             if (status != 200) {    
                 if (status > 0) {    
                     out.write(url + ", HTTP Response Code: " + status + "n");    
                 }    
                 else {    
                     out.write(url + ", Unknown Errorn");    
                 }    
             }                
         }    
         out.close();    
     }    
     private static ArrayList<String> getHyperlinks(String html)    
     {    
         ArrayList<String> links = new ArrayList<String>();    
         Pattern p = Pattern.compile("<a [^<>]*?href="(http.*?)"");    
         Matcher m = p.matcher(html);    
         while(m.find()) {    
             links.add(m.group(1));    
         }    
         p = Pattern.compile("<a [^<>]*?href='(http.*?)'");    
         m = p.matcher(html);    
         while(m.find()) {    
             links.add(m.group(1));    
         }    
         return links;    
     }    
     private static String getUrlContent(String targetUrl) throws Exception    
     {    
         HttpURLConnection connection = null;    
         BufferedReader br = null;    
         StringBuilder sb = null;    
         String line = null;    
         String content = null;    
         URL target = null;    
         try {    
             target = new URL(targetUrl);    
             connection = (HttpURLConnection)target.openConnection();    
             connection.setRequestMethod("GET");    
             connection.setReadTimeout(30 * 1000); // timeout 30 seconds    
             connection.connect();    
             br = new BufferedReader(new InputStreamReader(connection.getInputStream()));    
             sb = new StringBuilder();    
             while ((line = br.readLine()) != null) {    
                 sb.append(line);    
             }    
             content = sb.toString();    
         } catch (SocketTimeoutException e) {    
             System.out.println("Timed Out!");                
         } catch (UnknownHostException e) {    
             System.out.println("Unknown Host");    
         } catch (Exception e) {    
             System.out.println("Unknown Error");    
         }    
         finally {    
             connection.disconnect();    
             br = null;    
             sb = null;    
             connection = null;    
         }    
         return content;    
     }    
     private static int getHTTPResponseCode(String targetUrl) throws Exception    
     {    
         HttpURLConnection connection = null;    
         int response;    
         URL target = null;    
         try {    
             target = new URL(targetUrl);    
             connection = (HttpURLConnection)target.openConnection();    
             connection.setRequestMethod("GET");    
             connection.setReadTimeout(10 * 1000); // timeout 10 seconds    
             connection.connect();    
             response = ((HttpURLConnection) connection).getResponseCode();    
         } catch (SocketTimeoutException e) {    
             response = -100;    
         } catch (UnknownHostException e) {    
             response = -101;    
         }catch (Exception e) {    
             response = -102;    
         }    
         finally {    
             connection.disconnect();    
             connection = null;    
         }    
         return response;    
     }    
 }    

সিএসই বিভাগের ক্লাস শুরুর আগে

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

screen-shot-2016-12-02-at-9-17-16-am

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

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

ক্লাশ শুরু হওয়ার পরে বইগুলো আবার পড়বে (হ্যাঁ, প্রোগ্রামিং বই কেবল একবার পড়ার জন্য নয়)। তারপরে “কম্পিউটার প্রোগ্রামিং ২য় খণ্ড” বইটি পড়া শুরু করে দাও। বইতে প্রোগ্রামিং ও সি ল্যাঙ্গুয়েজের বেশ কিছু জটিল ও গুরুত্বপূর্ণ বিষয় নিয়ে আলোচনা করা হয়েছে।

cpbook2pp         52_book_cover

(বইগুলো রকমারি ডট কম ছাড়াও daraz.com.bd এবং ঢাকায় নীলক্ষেতের হক লাইব্রেরি ও মানিক লাইব্রেরি-তে পাওয়া যায়।)

নিচের দুইটা বই অপশনাল – পড়তেই হবে এমন কোনো কথা নেই, তবে পড়লে শিক্ষার্থীরা উপকৃত হবে।

rokimg_20150817_102370

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

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

প্রোগ্রামিং যাত্রা শুভ ও আনন্দময় হোক।