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

সাধারণ ছোটোখাটো প্রজেক্ট থেকে মাঝারি সাইজের প্রজেক্টের জন্য ফ্লাস্ক (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

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

কম্পিউটার বিজ্ঞানের একটি গুরুত্বপূর্ণ বিষয় হচ্ছে প্রোগ্রামিং, যা সফটওয়্যার নির্মাণ কৌশলেরও একটি গুরুত্বপূর্ণ অংশ। এই বিষয়টি অন্যান্য লেখাপড়ার মতো নয় যে বই পড়লাম, কিছু প্রশ্নের উত্তর শিখে ফেললাম, পরীক্ষা দিয়ে সব ভুলে গেলাম। প্রোগ্রামিং হচ্ছে একটি দক্ষতা (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)। এটি সবার পড়া আবশ্যক।

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

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

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

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

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

পাইকন ঢাকা ২০১৪

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

PyCon Dhaka 2014
PyCon Dhaka 2014

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

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

সম্পূর্ণ ইভেন্টটি ভিডিও করা হবে যেন পরববর্তি সময়ে ইউটিউব থেকে আলোচনাগুলো দেখার সুযোগ থাকে।

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

পাইকন ঢাকা-এর অফিশিয়াল ওয়েবসাইট : http://dhaka.pycon.org/

ডিজিটাল ওয়ার্ল্ডে ডেভেলাপার কনফারেন্স

আগামীকাল শুক্রবার (৬ জুন) ডিজিটাল ওয়ার্ল্ডে অনুষ্ঠিত হবে সফটওয়্যার নির্মাতাদের একটি বিশেষ সম্মেলন।

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

নিচে আলোচনার বিষয় ও আলোচকদের নাম দেওয়া হলো।

1. User Experience – sell the experience, not the product by Azec Elahi, Senior UX Engineer, The Jaxara IT Ltd

2. Getting the most out of Chrome Developer Tools – M. Mahbubur Rahman , CTO, iViveLabs

3. Beyond PHP4 – The beautiful world of cutting edge PHP – Mohammad Emran Hasan , Founder and CTO, Right Brain Solutions Ltd.

4. CSS Preprocessor, Why and How – Mizanur Rahman , Development Manager, Trustpilot at GraphicPeople

5. Playing with Composer – Tareq Hasan, Founder, WeDevs

6. Introduction to Machine Learning, Nhm Tanveer Hossain Khan, Sr backend Engr at Tweek.tv

7. Power debugging and profiling – Abu Ashraf Masnun , Software Engr at AirCourt

8. Angular JS – Mafinar Khan, System Analyst at Panacea Ltd

9. Introduction to Laravel 4 – Mozammel Haque , Development Manager, Vantage labs Dhaka

10. Explore Awesomeness of Cutting Edge JS Tools by Rifat Nabi , Technical Architect, Tasawr Interactive

সুইফট – অ্যাপলের নতুন প্রোগ্রামিং ল্যাঙ্গুয়েজ

অ্যাপেল সুইফট (swift) নামে নতুন একটা প্রোগ্রামিং ল্যাঙ্গুয়েজ চালু করেছে । লিঙ্ক : https://developer.apple.com/swift/

সুইফট – অ্যাপেলের নতুন প্রোগ্রামিং ভাষা

এই শক্তিশালি প্রোগ্রামিং ল্যাঙ্গুয়েজটি অবজেক্টিভ সি (Objective-C) এর চেয়েও দ্রুত কাজ করবে এবং এটি সহজেই শেখা যাবে। সুইফট ব্যবহার করে প্রোগ্রমাররা আগের চেয়ে নিরাপদ ও নির্ভরযোগ্য কোড লিখতে পারবে বলে অ্যাপল জানিয়েছে। এতে প্রোগ্রামাররা একই সময় কোড লিখে তার আউটপুট দেখতে পারবে। সুইফট যেমন কম্পাইলড ল্যাঙ্গুয়েজের মতো শক্তিশালি ও ইফিশিয়েন্ট অন্যদিকে জনপ্রিয় স্ক্রিপটিং ল্যাঙ্গুয়েজগুলোর মতো সহজ ও ইন্টারএকটিভ। সুইফট ব্যবহার করে প্রোগ্রামাররা আগের চেয়ে সহজে আইওএস অ্যাপ্লিকেশান ডেভেলপ করতে পারবেন । সুইফট ল্যাঙ্গুয়েজ এর জন্য অ্যাপেল একটি ৫০০ পেজ এর বই তৈরি করেছে । এই বইটি অ্যাপেল এর নিজস্ব ibook store-এ পাওয়া যাবে । লিঙ্ক : https://itunes.apple.com/us/book/the-swift-programming-language/id881256329?mt=11

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

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

প্রথম পর্বের লিঙ্ক : 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;    
     }    
 }