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

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

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

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

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

প্রোগ্রামিং শেখার ১০টি লিঙ্ক

যারা প্রোগ্রামিংয়ের জগতে একেবারেই নতুন এবং বাংলা ভাষায় প্রোগ্রামিং শিখতে চায়, তাদের জন্য ১০টি দরকারি লিঙ্ক : 

১) দ্বিমিক কম্পিউটিং – অনলাইনে বাংলায় তথ্যপ্রযুক্তি বিষয়ক বিভিন্ন ফ্রি কোর্স (ভিডিও লেকচার)। নতুনদের জন্য সি প্রোগ্রামিংয়ের ওপরও একটি কোর্স রয়েছে এখানে। :http://dimikcomputing.com/

২) কম্পিউটার প্রোগ্রামিং বইটির ওয়েব ভার্শন (ফ্রি) :http://cpbook.subeen.com/

৩) কম্পিউটার প্রোগ্রামিং বইয়ের পিডিএফ ডাউনলোড : http://goo.gl/vv0kRN

cpbookimg

৪) প্রোগ্রামিং বিষয়ক বই:

কম্পিউটার প্রোগ্রামিং ১ম খণ্ড

কম্পিউটার প্রোগ্রামিং ২য় খণ্ড

৫২টি প্রোগ্রামিং সমস্যা ও সমাধান

প্রোগ্রামিং কনটেস্ট – ডাটা স্ট্রাকচার ও অ্যালগরিদম

প্রোগ্রামিং ক্যারিয়ার গাইডলাইন – এক ডজন প্রোগ্রামারের কথা

৫) কম্পিউটার প্রোগ্রামিং বইয়ের ফ্রি অ্যান্ড্রয়েড অ্যাপ

৬) প্রোগ্রামিং শেখার গাইডলাইন (তামিম শাহ্‍‍রিয়ার সুবিন)

৭) প্রোগ্রামিং শেখার গাইডলাইন (তানভীরুল ইসলাম) :http://goo.gl/M1DeIZ

৮) প্রোগ্রামাবাদ – প্রোগ্রামিং প্রশ্নোত্তরের জন্য ওয়েবসাইট : http://programabad.com

 

৯) বাংলা ভাষায় প্রোগ্রামিং সমস্যা :http://cpbook.subeen.com/p/blog-page_11.html

১০) ফেসবুক গ্রুপ :https://www.facebook.com/groups/programming.school/