এক ঘণ্টার পাইথন কোডিং

পাইথন হচ্ছে একটি প্রোগ্রামিং ভাষা। বর্তমান তথ্যপ্রযুক্তির দুনিয়ায় এর ব্যবহার দিন দিন বাড়ছে। প্রফেশনাল কাজের পাশাপাশি প্রোগ্রামিং শেখার জন্যও পাইথন খুবই জনপ্রিয়। পাইথন নিয়ে বিস্তারিত জানা যাবে এই লেখায়: পাইথন কী?
তো সামনে “কম্পিউটার বিজ্ঞান শিক্ষা সপ্তাহ” উদযাপনের একটি গুরুত্বপূর্ণ অংশ হচ্ছে “আওয়ার অব কোড“। সারা পৃথিবীর সাথে সাথে বাংলাদেশেও এটি বেশ ঘটা করে পালন করার উদ্যোগ নিয়েছে বিডিওএসএন, আর সাথে গত দুই বছরের মতো এবারেও আছে দ্বিমিক কম্পিউটিং। অনুষ্ঠানের বিস্তারিত জানা যাবে এই ওয়েবসাইটে : http://cseweek.bdosn.org
বেশিরভাগ মানুষই code.org ওয়েবসাইটে যেই গেমটি দেওয়া আছে, সেটি ব্যবহার করে ‘আওয়ার অব কোড’ পালন করবে। তবে সবার জন্য এটি উপভোগ্য কিংবা উপকারি না ও হতে পারে। বাংলাদেশের প্রেক্ষাপটে কেউ যদি ষষ্ঠ শ্রেণী বা তার ওপরের ক্লাসের শিক্ষার্থীদের নিয়ে এক ঘণ্টার কোডিং করতে চান, আমার পরামর্শ হবে পাইথন ভাষা ব্যবহার করে কয়েকটি প্রোগ্রাম লিখে দেখানোর।
প্রথমেই শিক্ষার্থীদের বলতে হবে, প্রোগ্রামিং কেন শিখবে। তাদের সাথে প্রোগ্রামিং ও প্রোগ্রামারদের নিয়ে গল্প করতে হবে। গল্প-স্বল্প বলা শেষ হলে শুরু করতে হবে এক ঘণ্টার পাইথন কোডিং
১) প্রথম কাজ হচ্ছে সবার কম্পিউটারে পাইথন সফটওয়্যার ইনস্টল করা। ইনস্টলার আগে থেকে ডাউনলোড করে রাখতে হবে (যদি উইন্ডোজ অপারেটিং সিস্টেম হয়, লিনাক্সে এটি এমনিতেই ইনস্টল করা থাকে)। সবাই নিজে নিজে কম্পিউটারে পাইথন ইনস্টল করবে।
২) দ্বিতীয় কাজ হচ্ছে “Hello World” প্রোগ্রাম লেখা। এটি যে প্রোগ্রামিং সংস্কৃতির একটি অংশ, সেটি শিক্ষার্থীদের জানাতে হবে।
৩) 1 থেকে 100 পর্যন্ত সমস্ত পূর্ণসংখ্যা প্রিন্ট করার প্রোগ্রাম দেখাতে হবে। প্রথমে কেবল while লুপ ব্যবহার করে। তারপর for লুপ এবং range() ফাংশন ব্যবহার করে। লুপের ধারণা দিতে হবে। ফাংশন নিয়েও কিছু কথা বলতে হবে। তবে বেশি কথা বলে শিক্ষার্থীদের বিরক্ত করা যাবে না।
৪) এবারে লুপ নিয়ে আরো খেলাধূলা করতে হবে। 1, 3, 5, …, 99 প্রিন্ট করা ও 2, 4, 6, …, 98, 100 প্রিন্ট করার প্রোগ্রাম দেখাতে হবে। তবে এর আগে শিক্ষার্থীদের ১০-১৫ মিনিট সময় দিলে ভালো হয় যেন তারা নিজেরা কাজটি করার চেষ্টা করে। তারপর সংখ্যাগুলোকে বড় থেকে ছোট ক্রমেও প্রিন্ট করার প্রোগ্রাম দেখাতে হবে। শুধু লুপ ব্যবহার করে একবার দেখাতে হবে, তারপর range() ফাংশন ব্যবহার করে।
৫) এবারে কন্ডিশনাল লজিকের ধারণা দিতে হবে। এর জন্য আবার 1 থেকে 100 পর্যন্ত জোড়সংখ্যা ও বিজোড় সংখ্যা প্রিন্ট করার প্রোগ্রাম দেখাতে হবে।
৬) 1 থেকে 1000 এর মধ্যে সমস্ত পূর্ণবর্গ সংখ্যা (1, 4, 9, 16 …) প্রিন্ট করার প্রোগ্রাম দেখাতে হবে। প্রোগ্রামটি একাধিকভাবে লিখে দেখাতে হবে।
৭) লিস্টের ব্যবহার দেখাতে হবে। এর জন্য নিচের তিনটি প্রোগ্রাম দেখালে ভালো হয়:
day = raw_input()
if day in ["Friday", "Saturday"]:
   print day, "is holiday"
else:
   print day, "is not a holiday"
name = raw_input()
if name in ["Rose", "Tulip", "Lily", "Daffodil"]:
   print name, "is a flower"
elif name in ["Mango", "Jackfruit", "Guava", "Papaya"]:
   print name, "is a fruit"
else:
   print "I don't know!"
while True:
   name = raw_input()
   if name == "Exit":
      break
   if name in ["Rose", "Tulip", "Lily", "Daffodil"]:
      print name, "is a flower"
   elif name in ["Mango", "Jackfruit", "Guava", "Papaya"]:
      print name, "is a fruit"
   else:
      print "I don't know!"
৮) সময় থাকলে ডিকশনারির ব্যবহারও দেখানো যায়। দেশের নাম ইনপুট দিলে রাজধানীর নাম আউটপুট দিবে, এমন একটি প্রোগ্রাম লিখতে হবে। তবে খেয়াল রাখতে হবে যে অনুষ্ঠানের কোডিংয়ের অংশ কোনোভাবেই এক ঘণ্টার বেশি করা যাবে না।
সবাইকে অংশগ্রহনের জন্য সার্টিফিকেট দিলে সবাই হয়ত উৎসাহ পাবে।
পাইথনের জন্য কিছু লিঙ্ক:
১) হুকুশ-পাকুশের প্রোগ্রামিং শিক্ষা : http://hukush-pakush.com
২) Hour of Python : https://hourofpython.com
৩) পাইথনের ওপর ফ্রি ভিডিও লেকচার: http://pyvideo.subeen.com
৪) পাইথনের ওপর বাংলায় লেখা বই : http://bit.ly/pybook (প্রোগ্রামিংয়ে একেবারে নতুনদের জন্য উপযোগি নয়)।

সফটওয়্যার ইন্ডাস্ট্রিতে আসার আগে

তোমরা যারা কম্পিউটার সায়েন্স বা কাছাকাছি কোনো বিষয়ে পড়ছ এবং শীঘ্রই বিশ্ববিদ্যালয়ের গণ্ডি অতিক্রম করে যাবে, তাদের বেশিরভাগই কাজ খুঁজে নেবে সফটওয়্যার ইন্ডাস্ট্রিতে। কম্পিউটার বিজ্ঞানের মৌলিক ধারণার ওপর শক্ত ভিত্তি ও প্রোগ্রামিংয়ে যথেষ্ট দক্ষতা থাকা সত্ত্বেও তোমাদের অনেকের মধ্যেই অনেক দুশ্চিন্তা কাজ করে, আর কী কী শিখতে হবে, কিভাবে শিখব, কতটুকু শিখব এরকম অনেক প্রশ্ন উঁকি দেয় মনে। আজকে আমি পাঁচটি জিনিসের কথা বলব, যেগুলো আমি প্রত্যাশা করি একজন নতুন কম্পিউটার সায়েন্স গ্রাজুয়েট আগে থেকেই জেনে আসবে। যদিও আমি নিজে যখন পাশ করি, তখন এসব জানতাম না, তবে সেটা অনেক অনেক বছর আগের কথা। বর্তমান সময়ে এগুলো না জানলেই নয়।
১) ভার্শন কন্ট্রোল সিস্টেমের ব্যবহার: তোমরা নিশ্চয়ই গিট বা গিটহাবের নাম শুনেছ, না শুনে থাকলে git ও github লিখে গুগলে খোঁজা শুরু কর। খুব সহজ কথায় বললে, গিট হচ্ছে এমন একটি সফটওয়্যার যার মাধ্যমে ভার্শন নিয়ন্ত্রনের কাজটি বেশ সহজে করা যায় এবং সেকারণে অনেকে মিলে একসাথে একটি প্রজেক্ট কাজ করতে সমস্যা হয় না। আর গিটহাব হচ্ছে ওয়েবভিত্তিক একটি সার্ভিস যেখান থেকে বিনামূল্যে গিট ব্যবহার করা যায়। তো গিটহাবে গিয়ে একটু সময় কাটালেই তোমরা এর ব্যবহার শিখে নিতে পার। এছাড়া এই ওয়েবসাইটে গিয়ে তোমরা গিটের ব্যবহার সহজে শিখতে পারবে : https://try.github.io/। আর বাংলা ভাষায়ও বেশ ভালো ভিডিও টিউটোরিয়াল তৈরি করা আছে এখানে :http://git.certainly.rocks/
২) ডকুমেন্টেশন: ডকুমেন্টেশন দুই পর্যায়ে করতে হয়, একটি হচ্ছে কোডের ভেতরে, আরেকটি হচ্ছে কোডের বাইরে। প্রতিটি ফাংশন ও ক্লাসের সাথে খুব অল্প কথায় সেটি কী কাজ করছে, এটি লিখে দেওয়ার অভ্যাস থাকা ভালো। আর কোডের বাইরে সিস্টেমের ডকুমেন্টেশন, এপিআই ডকুমেন্টেশন এগুলোও লিখতে জানতে হবে। ডকুমেন্টেশন শেখার জন্য সবচেয়ে ভালো উপায় হচ্ছে বিভিন্ন ওপেন সোর্স প্রজেক্টের ডকুমেন্টেশন দেখা। গিটহাবে এরকম প্রচুর প্রজেক্ট হোস্ট করা আছে।
৩) ইউনিট টেস্ট: ইউনিট টেস্ট হচ্ছে প্রোগ্রামের ভেতরে প্রতিটি ফাংশনের জন্য পৃথক টেস্ট কোড। এর মাধ্যমে প্রতিটি ফাংশন টেস্ট করা হয়। সফটওয়্যার ডেভেলাপমেন্ট সহজ করতে এবং বাগ নিয়ন্ত্রণে রাখতে এটি একটি পরীক্ষিত ও কার্যকর উপায়। আর এই ইউনিট টেস্ট করাটা কিন্তু প্রোগ্রামারদেরই কাজ। বর্তমানে প্রোগ্রামিং ভাষার বইগুলোতে সেই ভাষায় কিভাবে ইউনিট টেস্ট করতে হয় সেটির ওপর আলাদা অধ্যায় থাকে, পড়ে নিতে পার।
৪) ওয়েবের ধারণা: তুমি সফটওয়্যারের যে বিভাগে বা যে ধরণের সফটওয়্যার নিয়েই কাজ কর না কেন, বর্তমানে তোমার ওয়েবের শক্ত ধারণা থাকার কোনো বিকল্প নেই। ওয়েব কীভাবে কাজ করে সেটা তোমার জানতে হবে। বিভিন্ন অংশের কাজের ওপর স্বচ্ছ ধারণা থাকতে হবে। ওয়েবের ধারণা অর্জনের জন্য দ্বিমিক কম্পিউটিংয়ের ওয়েব কনসেপ্টস কোর্সটিই সেরা, এবং এটি বিনামূল্যে করা যাবে এই ঠিকানা থেকে: https://dimikcs.appspot.com/WEB100/। আর হ্যাঁ, কোর্সটি সম্পূর্ণ বাংলায়।
৫) এপিআই ব্যবহার: বিভিন্ন এপিআই ব্যবহার করতে জানতে হবে, সেটা তুমি মোবাইল ডেভেলাপার হতে চাও কিংবা ওয়েব ডেভেলাপার। ফেসবুক, টুইটার, গুগল ইত্যাদি কোম্পানীগুলো অনেক এপিআই তৈরি করে রেখেছে যেগুলো তুমি তোমার অ্যাপ্লিকেশন (ডেস্কটপ, ওয়েব কিংবা মোবাইল)-এ ব্যবহার করে অনেক চমৎকার সব জিনিস তৈরি করতে পার। বিভিন্ন এপিআই-এর ডকুমেন্টেশন খুব ভালোভাবে লেখা থাকে। তাই সেগুলো পড়ে নিজের কোডে সেটা ব্যবহার করতে পারতে হবে, এর জন্য তোমাকে অফিসে যদি তিন দিন প্রশিক্ষণ দেওয়া লাগে তাহলে কিন্তু মুশকিল।
নতুন দিনের প্রোগ্রামারদের জন্য শুভকামনা।

মেমক্যাশড

মেমক্যাশড কী? মেমক্যাশড-এর ওয়েবসাইটে লেখা আছে :
Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.
memcached_banner75
এটা না বুঝলে সমস্যা নাই। সহজ ভাষায় মেমক্যাশড হচ্ছে কি-ভ্যালু স্টোর। কি-ভ্যালু স্টোর আবার কী? জিনিসটা আসলে হ্যাশটেবল, ম্যাপ বা পাইথনের ডিকশনারি-এর মতো। প্রতিটা ডাটার একটা কি থাকবে, সেই কি দিয়ে সহজেই ডাটা একসেস করা যাবে। একটা কি দিয়ে একটা ডাটা (ভ্যালু) পাওয়া যাবে, আবার একটা ভ্যালুর জন্য একটা কি থাকবে। যেমন প্রতিটি দেশের একটি তিন অক্ষরের কোড থাকে, আমরা চাইলে সেই কোড দিয়ে দেশের নামটা জেনে নিতে পারে। এক্ষেত্রে কোড হচ্ছে কি, আর দেশের নাম হচ্ছে ভ্যালু। পাইথনে যদি আমরা একটি ডিকশনারি তৈরি করি, তাহলে এরকম হবে:
alpha_code = {“BGD”: “Bangladesh”, “AUS”: “Australia”, “DEU”: “Germany”, “SGP”: “Singapore”}
এখন print alpha_code[“BGD”] লিখলে Bangladesh প্রিন্ট হবে।
আমরা যদি চাই, আমাদের প্রোগ্রাম বন্ধ হয়ে গেলেও ডাটা যেন হারিয়ে না যায়, তাহলে উপায় কী? সহজ উপায় হচ্ছে ফাইল ব্যবহার করা। আর বেশি ডাটার ক্ষেত্রে উপায় হচ্ছে ডাটাবেজ ব্যবহার করা। এখন ফাইল ব্যবহার করলে ফাইল ওপেন করা, ফাইল থেকে রিড করা, ফাইল ক্লোজ করা – এসব কাজে কিছুটা সময় ব্যায় হয়। তেমনি ডাটাবেজের জন্যও কানেকশন তৈরি করা, কুয়েরি করা, কুয়েরি থেকে রেজাল্ট পড়া, এতেও সময় ব্যায় হয়। উভয় ক্ষেত্রেই ডাটা হার্ড ডিস্কে থাকে। এখন এই ডাটা যদি হার্ড ডিস্কে না রেখে রেমে রাখার ব্যবস্থা করা যেত, তাহলে খুব দ্রুত সেই ডাটা পড়া যেত। কারণ হার্ড ডিস্ক একসেস করার চেয়ে মেমোরি একসেস করার কাজটি প্রসেসর অনেক দ্রুত করতে পারে। তাই বলে সব ডাটা তো আর রেমে রাখা যাবে না, যেসব ডাটা খুব ঘনঘন একসেস হচ্ছে সেসব ডাটা মেমোরিতে রাখা যায়। এই মেমোরিতে ডাটা রাখার ব্যবস্থাটি সহজ করে দিয়েছে মেমক্যাশড।
ক্যাশ করা মানে হচ্ছে ডাটা তৈরি করে রাখা। ধরা যাক, টুইটারের মতো একটি ওয়েবসাইটের একটি ফিচার হচ্ছে ট্রেনডস্ যেখানে সবচেয়ে আলোচিত দশটি বিষয় থাকে এবং এটি দশ মিনিট পরপর আপডেট করা হয়।
Screen Shot 2015-07-11 at 3.46.51 pm
এখন এই দশ মিনিটের ভেতরে কিন্তু কোটি কোটি ব্যবহারকারি টুইটারের ওয়েবসাইট একসেস করছে। তো প্রতিবার যদি টুইটার ডাটাবেজে একটা কুয়েরি চালাত সেরা দশটি আলোচিত বিষয় খুঁজে বের করার জন্য, তাহলে কিন্তু সার্ভারের ডাটাবেজে লোড অনেক বেড়ে যেত আর সেই লোড সামলানো মোটামুটি অসম্ভব হয়ে পড়ত। আর প্রত্যেকের জন্য কিন্তু একই ফলাফল। তাই সেটা যদি মেমোরিতে রেখে দেওয়া যায়, আর সার্ভারে কোনো রিকোয়েস্ট আসলে মেমোরি থেকেই সেটা পড়ে ফেলা যায়, তাহলে দারুণ ব্যাপার হয়। আর সার্ভারে একটা স্ক্রিপ্ট চলবে যেটা দশ মিনিট পরপর মাত্র একটা কুয়েরি চালাবে আর ডাটাবেজে থেকে ডাটা এনে মেমোরিতে রেখে দিবে।
আরেকটি উদাহরণ দেওয়া যাক। ধরা যাক, আমরা কোনো পরীক্ষার ফল প্রকাশ করার জন্য একটি ওয়েবসাইট বানাবো। সবার পরীক্ষার ফলাফল ডাটাবেজে সংরক্ষিত আছে। এখন ওয়েবসাইটে ফল প্রকাশ করার কয়েকমিনিটের মধ্যে বা কয়েকঘণ্টার মধ্যে হাজার হাজার (লাখ লাখও হতে পারে) শিক্ষার্থী ও তাদের অভিভাবক ওয়েবসাইটে এসে হুমড়ি খেয়ে পড়বেন ফলাফল দেখার জন্য। এখন সব ফলাফল যদি ডাটাবেজ থেকে সিলেক্ট কুয়েরি করে দেখাতে হয়, তাহলে কিন্তু ডাটাবেজ সেই লোড সামলাতে পারবে না। কথা হচ্ছে, পরীক্ষার ফল যখন তৈরি হয়ে যায়, তখন কিন্তু সেটি পরিবর্তনের সম্ভাবনা খুবই কম। তাই ফলাফল যদি মেমোরিতে রেখে দেওয়া হয় এবং সার্ভারে রিকোয়েস্ট আসলে সেখান থেকেই জবাব দিয়ে দেওয়া যায়, তাহলে ডাটাবেজের লোড অনেকখানি কমিয়ে দেওয়া সম্ভব। তাহলে আমাদের অ্যালগরিদম হবে এরকম :
১) পরীক্ষার্থীর রোল নাম্বার ইনপুট দেওয়া হলো।
২) রোল নাম্বারটি সার্ভার একটি কি-ভ্যালু স্টোরের মধ্যে খুঁজে দেখতে হবে রোল নাম্বারটি কি হিসেবে ব্যবহার করলে সেটির জন্য কোনো ভ্যালু তৈরি করা আছে কী না। যদি থাকে তাহলে ৫ নম্বর ধাপে যেতে হবে (এটিকে বলে ক্যাশ হিট) আর যদি না থাকে তবে ৩ নম্বর ধাপে যেতে হবে (একে বলে ক্যাশ মিস)।
৩) ডাটাবেজে কুয়েরি করে রেজাল্ট আনতে হবে।
৪) রেজাল্ট ক্যাশে (মেমোরিতে) সংরক্ষণ করতে হবে। যাতে পরবর্তি সময়ে কেউ আবার এই রোল নাম্বারের জন্য রেজাল্ট জানতে চায়, তাহলে আর ডাটাবেজে কুয়েরি করার দরকার পরবে না।
৫) ক্লায়েন্টকে রেজাল্ট রিটার্ন করতে হবে।
মেমক্যাশের মাধ্যমে কাজটি খুব সহজে করা যায়।
এখন মেমক্যাশড এর বৈশিষ্ট্য কী? মেমক্যাশড হচ্ছে আসলে একটা প্রসেস, সেটা সার্ভার-এ সবসময় চলতে থাকবে। মেমক্যাশডের ক্লায়েন্ট সার্ভার দুইটা পার্ট আছে। মেমক্যাশড এর প্রথম বৈশিষ্ট্য হচ্ছে এটা একটা সিম্পল কি-ভ্যালু স্টোর, এটা আমরা আগেই জেনেছি।
তারপর “Smarts half in client, half in server.” এখানে কিন্তু ক্লায়েন্ট এবং সার্ভার দুইটা অংশ আছে। মেমক্যাশড-এ একটা সার্ভার চলতে থাকে, সেই সার্ভার-এর মধ্যে ডাটাগুলা থাকে (আসলে সার্ভার সমস্ত ডাটা মেমরি (RAM)-এর মধ্যে রাখে)। আর ক্লায়েন্ট কী করে? ক্লায়েন্ট সিদ্ধান্ত নেয় যে এখন অমি যে ডাটা আনার জন্য সার্ভারকে কল করব, কোন কি (Key) দিয়ে কল করব?
তারপর আরেকটা মজার ব্যাপার হচ্ছে যে ক্লায়েন্ট কিন্তু একটা না, অনেকগুলা সার্ভার এর সাথেই কমিউনিকেট করতে পারে। খুব বড় অ্যাপ্লিকেশনে আমাদের অনেকগুলা সার্ভার নিয়ে কাজ করতে হয় ও লোড ব্যালেন্সিং করতে হয়। মেমক্যাশড আমাদেরকে একাধিক সার্ভারে ডাটা রাখার সুবিধা দেয়। মেমক্যাশড্ অনেকগুলা সার্ভার এ রেখে দেওয়ার সুবিধা হচ্ছে, যে “Servers are disconnected from each other”, মানে একটা সার্ভার এর সাথে আরেকটা সার্ভার এর কোন সম্পর্ক নাই। তাহলে আমাদের সুবিধা যেটা, যে আমরা যখন নতুন কোন সার্ভার যুক্ত করব তখন বাকীদের সাথে synchronization বা crosstalk বা নিজেদের মধ্যে ব্রডকাস্ট এর কোন ব্যাপার নাই। আবার যখন কোনো সার্ভার বাদ দিয়ে দিব তখন শুধু ওই সার্ভারে যে ডাটাগুলা আছে সেগুলাই শুধু ক্যাশ খুঁজে পাবে না। বাকী সার্ভার-এর ডাটা যেমন ছিল তেমনি থাকবে। আর আমরা নিজেরা কিন্তু প্রোগ্রামিং করার সময় ঠিক করে দিতে পারব না যে ডাটা কোন সার্ভার এর ক্যাশ এ থাকবে? (সেটা কোন সার্ভার এর ক্যাশ এ সেটা জানতে চাইলে আমরা telnet দিয়ে হিট করে দেখতে পারি আসলে এটা কোন ক্যাশ এ আছে, ক্যাশ এর key টা দিয়ে)।
আর সবচেয়ে বড় সুবিধা হচ্ছে O(1) এ আমরা সবকিছু নিয়ে আসতে পারি। (এটা না বুঝলে হাম্মাদ আলী স্যারের ডিসক্রিট ম্যাথ কোর্সটা করে ফেলতে হবে)।
আরেকটা হচ্ছে “Forgetting data is a feature”, আমরা ভ্যালুর এক্সপায়ার টাইম ঠিক করে দিতে পারি। সেই সময় পরে ডাটা ক্যাশ থেকে আপনাআপনি মুছে যাবে। এটা খুব গুরুত্বপূর্ণ ও সুন্দর একটা ফিচার।
তারপরের ফিচারটা হচ্ছে “Cache invalidation is trivial”। আসলে কম্পিউটার সাইন্স এ নাকি দুইটা প্রবলেম খুবই হার্ড প্রবলেম হিসেবে চিহ্নিত করা হয়। প্রথম প্রবলেম হচ্ছে naming প্রবলেম। যে আমরা কোনকিছুর নাম ঠিক করে দিতে পারি না, এটা সবসময়ই হার্ড (কঠিন) প্রবলেম। দ্বিতীয় হার্ড প্রবলেম হচ্ছে ক্যাশিং ভেলিডেশন। এটাও হার্ড প্রবলেম, মানে আমরা যখন ক্যাশটাকে ইনভেলিড করি তখন অনেক জায়গায় অনেক রকম ঝামেলার সৃষ্টি হতে পারে। তো মেমক্যাশড্ এ এই জিনিসটা অনেকটা সহজ হলেও ব্যবহার করার সময় আমাদের নিজেদের কিছু সতর্কতার প্রয়োজন। একটা ডাটা কিন্তু অনেকগুলা ক্যাশ কি-তে রাখতে পারি বিভিন্ন প্রয়োজনে। তখন আমরা যেটা করব তখন আমাদের মাথায় রাখতে হবে প্রোগ্রামিং করার সময় বা ডিজাইন করার সময় যে এখন যদি অমি একটা জিনিস আপডেট (update) করব বা বাদ দিব (invalid করব), তখন সাথে সাথে সংশ্লিষ্ট আর কোথায় কোথায় আমাদের সেই কাজটি করতে হবে। কোনো একটা জায়গায় ভুলে গেলে কিন্তু ঝামেলা হয়ে যাবে। তখন এমন হতে পারে যে ওয়েবসাইটের হোমপেজে দেখাচ্ছে তামিম ইকবাল আউট কিন্তু স্কোরবোর্ডে সেটা দেখাচ্ছে না!
মেমক্যাশড নিয়ে মুক্তসফটে অনেক বছর আগে একটি প্রেজেন্টেশন দিয়েছিলাম, সেটির ভিডিও দেখা যাবে এখানে :
আর স্লাইডগুলো পাওয়া যাবে এখানে
আর আরো জানতে হলে মেমক্যাশডের অফিশিয়াল ওয়েবসাইট-এ যেতে হবে।
মেমক্যাশডের সঠিক ব্যবহার ডেভেলাপার ও ব্যবহারকারীদের জীবনে শান্তি বয়ে আনুক।

সি দিয়ে ওয়েব সার্ভার

এসো নিজে করি : ওয়েব সার্ভার
লেখক : ওমর শেহাব
এটি একটি শিশুতোষ লেখা। যারা মাত্র সি প্রোগ্রামিং শেখা শুরু করেছে তাদের জন্য এটি লিখছি যাতে তারা সি ল্যাংগুয়েজের সামর্থ্য সম্পর্কে কিছুটা ধারণা পায়।
আজকে থেকে এগার বছর আগের কথা। আমি তখন শাবিপ্রবি কম্পিউটার বিজ্ঞান ও প্রকৌশল বিভাগে তৃতীয় বর্ষে পড়ছি। আমাদের একটা কোর্স ছিল সিএসই ৩৫০। এই কোর্সে একটি সফটওয়্যার বানাতে হত। তখন আমার শিক্ষক শাহরিয়ার ভাইয়ের কাছ থেকে সি ল্যাংগুয়েজ দিয়ে একটি ওয়েব সার্ভার বানানোর আইডিয়া পেলাম।
ওয়েব সার্ভার বানানো নতুন কোন ব্যাপার না। ইতিমধ্যেই বাজারে তখন ফ্রি ওপেনসোর্স অ্যাপাচি সার্ভার পাওয়া যেত। শাহরিয়ার ভাই একই বছর অপারেটিং সিস্টেম ক্লাশে মালটিথ্রেড প্রোগ্রামিং, থ্রেড স্কেজ্যুলিং এসব পড়িয়েছিলেন। তার মতে এই প্রজেক্ট করলে আমি যা থিওরী পড়েছি সেগুলো হাতে কলমে নাড়াচাড়া করতে পারব। আমার মনে হল বুদ্ধিটা খারাপ না।
সেই কোডটি এই লিংকে (http://bit.ly/1GEzoX7) পাওয়া যাবে। আমি ভাবলাম যারা মাত্র সি শেখা শুরু করেছে তাদের কেউ কেউ এই ব্যাপারে আগ্রহী হতে পার। আমি একটু একটু করে এই কোডের ব্যাপারগুলো ধরিয়ে দিব। একটি জিনিস মনে রাখতে হবে আমি তখনও ছাত্র ছিলাম এ কারণে কোডের মান খুব বেশি আহামরি না।
তাহলে শুরু হোক! আমি একটি একটি করে ব্লক দিব আর তার নিচে ওই ব্লক নিয়ে কথা বলব।

/*
 * Course Code 350
 *
 * A Multithreaded Tiny HTTP Server
 * Demonstrating Thread Pool Management
 * Following the Thread Pool Management
 * Outline from Unix Network Programming Vol 1
 * by W. Richard Stevens.
 *
 * Project accomplished by: Abu Mohammad Omar Shehab Uddin Ayub
 * Reg No. 2000 330 096
 * Section B
 * 3rd Year 2nd Semester
 * Dept of CSE, SUST
 *
 * Idea and guided by: Mahmud Shahriar Hussain
 * Lecturer
 * Dept of CSE, SUST
 *
 * Course Instructor: Rukhsana Tarannum Tazin
 * Lecturer
 * Dept of CSE, SUST
 */
যারা ইতিমধ্যে প্রোগ্রামিং শুরু করেছ তারা নিশ্চয়ই জান যেকোন কোডের আগে কমেন্টে এই কোডের উদ্দেশ্য ও প্রোগ্রামারের নাম দেয়া স্বাভাবিক ভদ্রতা।
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
সি ল্যাংগুয়েজের নিজস্ব যে ফিচার বা সাপোর্ট আছে সেগুলো বিভিন্ন হেডার ফাইলে কোড করা থাকে। যেমন আমি পোসিক্স থ্রেড নিয়ে কাজ করতে চাই কাজেই পিথ্রেড.এইচ ফাইলটি ব্যবহার করছি।
#define MAX_CLIENT 5
#define MAX_THREAD 3
#define MAX_REQ_HEADER 10
#define MAX 10
#define MAX_LENGTH 6
#define MIME_LENGTH 20
এখানে আমি আগে থেকে কিছু জিনিস ঠিক করে নিচ্ছি। যেমন: আমি চাই এক সাথে পাঁচটির বেশি ব্রাউজার (ফায়ারফক্স, ক্রোম এগুলোকে ব্রাউজার বলে) আমার সার্ভারের পেজ ব্রাউজ করতে পারবে না কাজেই আমি MAX_CLIENT 5 দিয়েছি।
এর পর আমি আমার পছন্দ মত কিছু ডেটা স্ট্রাকচার ঠিক করে নিব।
typedef struct {
   pthread_t threadID;
   long threadCount;
}Thread;
যেমন থ্রেড সম্পর্কিত তথ্য রাখার জন্য আমি থ্রেড নামে একটি স্ট্রাকচার ব্যবহার করছি।
typedef struct {
   char hostName[100];
   char filePath[100];
}Request;
কোন ব্রাউজার থেকে যখন কেউ একটি ওয়েবপেইজ দেখার অনুরোধ সার্ভারের কাছে পাঠাবে সেই অনুরোধটিকে রিকোয়েস্ট নামে একটি স্ট্রাকচারে রাখব। এখানে কোন সার্ভার থেকে অনুরোধটি এসেছে এবং কোন ওয়েব পেজটি দেখতে চাচ্ছে এই তথ্যগুলো থাকবে।
typedef struct{
   int code;
   char date[30];
   char server[30];
   char last_modified[30];
   long content_length;
   char content_type[10];
   char file_path[80];
}Reply;
যখনই কোন ব্রাউজার ব্যবহার করে কেউ একটি পেজ দেখতে চাইবে তার জন্য ঠিকঠাক মতো জবাব তৈরি করা হবে। পেজটি থাকলে সেটি পাঠানো হবে আর না থাকলে বলা হবে পেজ নেই। এর জন্য বেশ কিছু তথ্য পাঠাতে হয়। এগুলো রিপ্লাই নামে একটি স্ট্রাকচারের মাধ্যমে গুছিয়ে পাঠানো হয়।
Thread thrdPool[MAX_THREAD];
Request request[MAX_THREAD];
Reply reply[MAX_THREAD];
int clntConnection[MAX_CLIENT], clntGet, clntPut;
এখানে আমি আমার সার্ভারের লোড নেবার সামর্থ‌্য ঠিক করে দিচ্ছি। লোড মানে সে একসাথে কয়জন ওয়েব ব্যবহারকারীর রিকোয়েস্ট সামলাতে পারবে।
thread_mutex_t clntMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t srvrMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t srvrMutex2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t emitMutex2 = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t clntCondition = PTHREAD_COND_INITIALIZER;
মিউটেক্স জিনিসটা হল মালটিথ্রেডেড প্রোগ্রামিংয়ে অনেকটা ছিটকিনির মত কাজ করে। একটি ওয়েবসার্ভারের কাছে যখন কোন পেজ দেখার রিকোয়েস্ট আসে তখন সে সেটি নিয়ে সারাক্ষণ ব্যস্ত থাকে না। সে কি করে একটি থ্রেড তৈরি করে সেই থ্রেডের কাছে সেই রিকোয়েস্টের দায়িত্ব দিয়ে নিজে নতুন রিকোয়েস্টের জন্য অপেক্ষা করতে থাকে। নতুন রিকোয়েস্ট আসলে সেটিকে নতুন আরেকটি থ্রেডের কাছে পাঠিয়ে দেয় আর আবারো সে আরেকটি রিকোয়েস্টের জন্য অপেক্ষা করতে থাকে। থ্রেডগুলো অপারেটিং সিস্টেমের সাহায্য নিয়ে নিজের মত করে রিকোয়েস্ট পরে পরে যে ওয়েবপেজটি দেখতে চাওয়া হয়েছে সেটি পাঠিয়ে দেয়। একটি থ্রেড কখনও জানতে পারে না অন্য থ্রেডের ভিতরে কি চলছে। তাদের সবার নিজস্ব জগৎ থাকে। তবে সবগুলো থ্রেডকে লাইনে রাখার জন্য কিছু কোড আছে, কিছু ভ্যারিয়েবল আছে। সেই ভ্যারিয়েবলগুলো সব থ্রেড দেখতে পারে। এখন একই ভ্যারিয়েবল নিয়ে যদি একাধিক থ্রেড একই সময়ে কাজ করতে চায় তাহলে তো ভজঘট লেগে যাবে। এখানেই মিউটেক্স কাজে আসে। কোন থ্রেড যখন কোন শেয়ারড ভ্যারিয়েবল নিয়ে কাজ করে মিউটেক্স বা ছিটকিনি তুলে দেয়। অন্য থ্রেড যখন কাজ করতে গিয়ে দেখে ছিটকিনি তোলা তখন তারা চুপচাপ অপেক্ষা করে। শেয়ারড ভ্যারিয়েবল নিয়ে কাজ শেষ হলে সেই থ্রেড ছিটকিনি বা মিউটেক্স নামিয়ে দেয়। তখন অপেক্ষা করতে থাকা অন্য থ্রেড কাজ শুরু করে আর আবারও ছিটকিনি তুলে দেয়।
static int numThreads;
void *request_handler(void *arg);
int find_method (char *req);
Request parse_request(char *rbuff);
Reply prepare_reply(int code, Request rq);
char *getMimeType(char *str);
void emit_reply(int conn, Reply rply);
একটু গুছিয়ে কাজ করার জন্য পুরো কোডটিকে আমি কিছু ফাংশনে ভাগ করেছি। এখানে সেগুলো ডিক্লেয়ার করলাম।
int main(void)
{
মেইন ফাংশন শুরু হল অর্থাৎ প্রোগ্রামের মূল অংশটি শুরু হচ্ছে।
int i, serverSockfd, clientSockfd;
int serverLen, clientLen;
struct sockaddr_in serverAddress, clientAddress, tempAddress;
কাজের সুবিধার জন্য কিছু ভ্যারিয়েবল দরকার।
//defining number of threads
 numThreads = MAX_THREAD;
// initializing queue parameters
 clntGet = clntPut = 0;
একবারে একসাথে কয়টি রিকোয়েস্ট নিয়ে কাজ করা যাবে অর্থাৎ সার্ভারের সামর্থ ঠিক করে দিচ্ছি।
//creating all the threads
for(i = 0; i < numThreads; i++)
{
    pthread_create(&thrdPool[i].threadID, NULL, &request_handler, (void *) i);
} // end of for loop
যখনই কোন রিকোয়েস্ট আসবে একটি করে থ্রেড তার দায়িত্ব নিবে। রিকোয়েস্ট আসার পরপর নতুন থ্রেড তৈরি করতে গেলে প্রোগ্রাম স্লো হয়ে যায় তাই আগেই কিছু তৈরি করে রাখি।
//creating the socket descriptor
serverSockfd = socket(AF_INET, SOCK_STREAM,0);
if(serverSockfd < 0)
{
   error("\nError opening socket");
   exit(1);
}
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(80);
serverLen = sizeof(serverAddress);
if(bind(serverSockfd, (struct sockaddr *)&serverAddress, serverLen) < 0)
{
   printf("\nError in binding.");
   exit(1);
}
অন্য যেকোন ওয়েবসার্ভারের মত আমার সার্ভারও কম্পিউটারের ৮০ নম্বর পোর্টে কান পেতে রাখবে। এখন আমার জানা জরুরী যে ইতিমধ্যে এই পোর্ট অন্য কোন সফটওয়্যার দখল করে ফেলেছে কিনা। সাবধানের মার নাই!
listen(serverSockfd, 10);
আমি কাআআআন পেতেএএএ রইইই!
for( ; ; )
{
   fflush(stdout);
   //printf("\nWaiting for clients...");
   clientLen = sizeof(tempAddress);
   //printf("\n\nBlocked on accept()");
   clientSockfd = accept(serverSockfd, (struct sockaddr *)&clientAddress, &clientLen);
   //printf("\nAllocated client descriptor# %d", clientSockfd);
   pthread_mutex_lock(&srvrMutex);
   clntConnection[clntPut] = clientSockfd;
   if(++clntPut == MAX_CLIENT)
   clntPut = 0;

   if(clntPut == clntGet)
   {
      printf("\nCan't handle any more request...\nTerminating...");
      exit(1);
   }

   pthread_cond_signal(&clntCondition);
   pthread_mutex_unlock(&srvrMutex);
   fflush(stdout);

} // end of infinite for loop
ইনফিনিটি লুপ খুব একটা ভাল জিনিস না। এটি আরো ভাল ভাবে করতে পারা উচিৎ। এখানে আমি যখনই কোন রিকোয়েস্ট পাচ্ছি ছিটকিনি তুলে দিয়ে একটি থ্রেড ধরে এনে তাকে রিকোয়েস্টের দায়িত্ব দিয়ে দিচ্ছি। যদি দেখি যে ইতিমধ্যে অনেক রিকোয়েস্ট জমে গেছে ভদ্রভাবে না করে দিচ্ছি। তারপর আবার ছিটকিনি বা মিউটেক্স নামিয়ে দিচ্ছি।
} // end of main
মেইন ফাংশন শেষ!
কোন থ্রেড যখন একটি রিকোয়েস্ট পায় তখন রিকোয়েস্ট হ্যান্ডলার নামে একটি ফাংশনের মাধ্যমে সেটি সামলায়। এখন আমরা সেই ফাংশনটি দেখব।
void *request_handler(void *arg)
{
রিকোয়েস্ট ‌হ্যান্ডলার শুরু হল।
int connfd;
char *reqBuff;
fflush(stdout);
//printf("\nThread %d starting", (int) arg);
এক আধটু ভ্যারিয়েবল সব জায়গাতেই লাগে!
for( ; ; )
{
   pthread_mutex_lock(&clntMutex);
   //printf("\nMutex locked by thread# %d.", (int) arg);
   while(clntGet == clntPut)
   pthread_cond_wait(&clntCondition, &clntMutex);
আবারও ইনফিনিটি লুপ ব্যবহার করছি, দু:খিত! আমি এখন শেয়ারড ভ্যারিয়েবলগুলো ব্যবহার করছি কাজেই মিউটেক্স বা ছিটকিনি লাগছে।
connfd = clntConnection[clntGet];
if(++clntGet == MAX_CLIENT)
clntGet = 0;
সার্ভার ওভারলোড হয়ে যাচ্ছে কিনা সেটাও খেয়াল রাখতে হচ্ছে।
// thread operation
// printf("\nIn between mutex lock-unlock. Thread# %d, Connection# %d", (int) arg, connfd);
reqBuff = (char *) malloc (1000);
read(connfd, reqBuff, 1000);
এক একটি রিকোয়েস্টের জন্য কি পরিমাণ রেম (RAM) খরচ হবে সেগুলো ঠিক করছি।
int temp;
temp = find_method(reqBuff);
কোন ব্রাউজার যখন রিকোয়েস্ট পাঠায় তার ভিতরে মেথড বলে একটি জিনিস বলা থাকে। এটি গেট মেথড হতে পারে, পুট মেথড হতে পারে অথবা বাজে ব্রাউজার হলে অর্থহীন কিছু পাঠাতে পারে। এই মেথডটি কি সেটি আমি বের করছি। আমার সার্ভার শুধু গেট মেথড সামলাতে পারে, অন্য কোন মেথড হলে ভদ্রভাবে না করে দেয়।
if(temp == 0)
{
   //printf("\nfind_method returned 0");
   request[(int)arg] = parse_request(reqBuff);
   //printf("\nHost: %s\nFile Path: %s", request[(int)arg].hostName, request[(int)arg].filePath);
   reply[(int)arg] = prepare_reply(200, request[(int)arg]);
   printf("\n\nprinting the reply structure");
   //printf("\nCode: %d\nDate: %s\nServer: %s\nlast_modified: %s\ncontent_length: %ld\ncontent type: %s\nfile path: %s",   reply[(int)arg].code, reply[(int)arg].date, reply[(int)arg].server, reply[(int)arg].last_modified, reply[(int)arg].content_length, reply[(int)arg].content_type, reply[(int)arg].file_path);
   emit_reply(connfd, reply[(int)arg]);
}
এটি গেট মেথড তাই কাজে নেমে পড়ছি।
else if(temp == 1)
{
   printf("\nfind_method returned 1");
   reply[(int)arg] = prepare_reply(501, request[(int)arg]);
   emit_reply(connfd, reply[(int)arg]);
}
এটি পুট বা অন্য কোন স্বীকৃত মেথড যার সাপোর্ট আমি দিইনি। দু:খিত!
else
{
   printf("\nfind_method returned -1");
   reply[(int)arg] = prepare_reply(400, request[(int)arg]);
   emit_reply(connfd, reply[(int)arg]);
}
আজগুবি মেথড।
pthread_mutex_unlock(&clntMutex);
//printf("\nMutex unlocked by thread# %d.", (int) arg);
thrdPool[(int) arg].threadCount++;
ছিটকিনি!
   // shahriar bhai told that closing the connection formally is not so important
   // good performance achieved @ closing it formally
   close(connfd);
}
যখনই কোন রিসোর্স ব্যবহার করব না তখনই সেটি মেমোরি থেকে সরিয়ে নিব।
} // end of request_handler function
ফাংশন শেষ!
ব্রাউজারকে ওয়েবসার্ভার যখন উত্তর পাঠায় সেই উত্তরগুলোতে কি কি তথ্য থাকবে সেটি এমিট রিপ্লাই ফাংশনটি সামলায়।
void emit_reply(int conn, Reply rply)
{
ফাংশন শুরু হল।
//pthread_mutex_lock(&emitMutex2);
if(rply.code == 200)
{
ইয়াহু! পেজটি সার্ভারে পাওয় গেছে!
char *ok_code = "HTTP/1.1 200 OK\r\n";
write(conn, ok_code, strlen(ok_code));
সুখবরের একটি কোড আছে। সেটি সেট করি।
char *date;
date = (char *)malloc(100);
strcpy(date, "Date: ");
strcat(date, rply.date);
strcat(date, "\r\n");
write(conn, date, strlen(date));
তারিখ সেট করি।
char *server;
server = (char *)malloc(100);
strcpy(server, "Server: ");
strcat(server, rply.server);
strcat(server, "\r\n");
write(conn, server, strlen(server));
কে উত্তর পাঠাচ্ছে সেটি জানাই।
char *last_modified;
last_modified = (char *)malloc(100);
strcpy(last_modified, "Last-Modified: ");
strcat(last_modified, rply.last_modified);
strcat(last_modified, "\r\n");
write(conn, last_modified, strlen(last_modified));
ওয়েবপেজটি সর্বশেষ কবে আপডেট করা হয়েছে তা জানাই।
char *content_length;
content_length = (char *)malloc(100);
strcpy(content_length, "Content-Length: ");
int decpnt, sign;
char *p;
p = (char *)malloc(20);
p = ecvt(rply.content_length, 15, &decpnt, &sign);
//printf("\nConversion-- %s %d %d", p, decpnt, sign);
 
strncat(content_length, p, decpnt);
strcat(content_length, "\r\n");
write(conn, content_length, strlen(content_length));
ওয়েবপেজ কত বাইট সেটি জানাই।
char *content_type;
content_type = (char *)malloc(100);
strcpy(content_type, "Content-Type: ");
strcat(content_type, rply.content_type);
strcat(content_type, "\r\n");
write(conn, content_type, strlen(content_type));
এটি ছবি, ভিডিও না শুধু লেখা সেই তথ্যটি জানাই।
write(conn, "\r\n", 2);
 
int b;
char c;
FILE *fp;
fp = (FILE *) malloc(sizeof(FILE));
fp = fopen(rply.file_path, "rb");
while(!feof(fp))
{
   c = getc(fp);
   if(!feof(fp))
   {
      //printf("%c", c);
      write(conn, &c, 1);
   }
}
এবার পেজটি পাঠাই।
//pthread_mutex_unlock(&emitMutex2);
return;
}
ফাংশন শেষ!
else if(rply.code == 400)
{
   char *ok_code = "HTTP/1.1 400 Bad Request\r\n";
   write(conn, ok_code, strlen(ok_code));
   
   char *date;
   date = (char *)malloc(100);
   strcpy(date, "Date: ");
   strcat(date, rply.date);
   strcat(date, "\r\n");
   write(conn, date, strlen(date));
   char *server;
   server = (char *)malloc(100);
   strcpy(server, "Server: ");
   strcat(server, rply.server);
   strcat(server, "\r\n");
   write(conn, server, strlen(server));
   write(conn, "\r\n", 2);
   
   char *error_400;
   error_400 = (char *)malloc(300);
   strcpy(error_400, "<html><head><title>Error No: 400. Bad Request.</title></head><body><h2>The server cannot parse the request.</h2><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><hr>For further info mail to shehab_sust@yahoo.com.</body><html>");
   write(conn, error_400, strlen(error_400));
}
যদি পেজটি পাওয়া না যায় তাহলে দু:সংবাদ জানিয়ে দেই।
else if(rply.code == 501)
{
   char *ok_code = "HTTP/1.1 501 Method Not Implemented\r\n";
   write(conn, ok_code, strlen(ok_code));

   char *date;
   date = (char *)malloc(100);
   strcpy(date, "Date: ");
   strcat(date, rply.date);
   strcat(date, "\r\n");
   write(conn, date, strlen(date));

   char *server;
   server = (char *)malloc(100);
   strcpy(server, "Server: ");
   strcat(server, rply.server);
   strcat(server, "\r\n");
   write(conn, server, strlen(server));
   write(conn, "\r\n", 2);

   char *error_501;
   error_501 = (char *)malloc(300);
   strcpy(error_501, "<html><head><title>Error No: 501. Method Not Implemented.</title></head><body><h2>The server only resolves the GET method.</h2><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><hr>For further info mail to shehab_sust@yahoo.com.</body><html>");
   write(conn, error_501, strlen(error_501));
}
এর মানে হল রিকোয়েস্টে কোন সমস্যা নেই কিন্তু যে মেথডে চাওয়া হয়েছে সেটির সাপোর্ট আমি এখনও দেই নি। দোষ আমারই।
else if(rply.code == 404)
{
   char *ok_code = "HTTP/1.1 404 File Not Found\r\n";
   write(conn, ok_code, strlen(ok_code));
   
   char *date;
   date = (char *)malloc(100);
   strcpy(date, "Date: ");
   strcat(date, rply.date);
   strcat(date, "\r\n");
   write(conn, date, strlen(date));

   char *server;
   server = (char *)malloc(100);
   strcpy(server, "Server: ");
   strcat(server, rply.server);
   strcat(server, "\r\n");
   write(conn, server, strlen(server));
   
   write(conn, "\r\n", 2);

   char *error_404;
   error_404 = (char *)malloc(300);
   strcpy(error_404, "<html><head><title>Error No: 404. File Not Found.</title></head><body><h2>The server could not found the requested url.</h2><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><hr>For further info mail to shehab_sust@yahoo.com.</body><html>");
   write(conn, error_404, strlen(error_404));
}
এর মানে হল ওয়েবসার্ভারে অনুরোধকৃত পেজের কোন অস্তিত্ত্বই নেই।
else if(rply.code == 403)
{
   char *ok_code = "HTTP/1.1 403 Forbidden\r\n";
   write(conn, ok_code, strlen(ok_code));

   char *date;
   date = (char *)malloc(100);
   strcpy(date, "Date: ");
   strcat(date, rply.date);
   strcat(date, "\r\n");
   write(conn, date, strlen(date));

   char *server;
   server = (char *)malloc(100);
   strcpy(server, "Server: ");
   strcat(server, rply.server);
   strcat(server, "\r\n");
   write(conn, server, strlen(server));

   write(conn, "\r\n", 2);

   char *error_403;
   error_403 = (char *)malloc(300);
   strcpy(error_403, "<html><head><title>Error No: 403. Forbidden.</title></head><body><h2>You are not authorized to access this url.</h2><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><hr>For further info mail to shehab_sust@yahoo.com.</body><html>");
 
   write(conn, error_403, strlen(error_403));
}
এর মানে হল পেজটি আছে কিন্তু দেখানো যাবেনা।
} //end of emit_reply
ফাংশন শেষ!
ওয়েবসার্ভারে যে শুধুমাত্র পেজের রিকোয়েস্টই আসে তা নয়। এটি একটি ছবির রিকোয়েস্ট হতে পারে, ভিডিওর রিকোয়েস্ট হতে পারে বা অন্যকিছুও হতে পারে। রিকোয়েস্ট থেকে সেটি বুঝে নিয়ে আবার রিপ্লাইতে বলে দিতে হয় কি ধরনের ডেটা পাঠানো হচ্ছে। গেটমাইমটাইপ নামে একটি ফাংশন এটি সামলায়।
char *getMimeType(char *str)
{
   printf("\nentered mime type");
   int i;
   //defined here the file extension
   char *fileExt[MAX];
   fileExt[0] = "html";
   fileExt[1] = "htm";
   fileExt[2] = "txt";
   fileExt[3] = "gif";
   fileExt[4] = "jpg";
   fileExt[5] = "qt";

   //defined here the mime type
   char *mType[MAX];
   mType[0] = "text/html";
   mType[1] = "text/html";
   mType[2] = "text/plain";
   mType[3] = "image/gif";
   mType[4] = "image/jpeg";
   mType[5] = "video/quicktime";

   for(i = 0; i < 6; i++)
   {
      if(strcmp(str, fileExt[i]) == 0)
      {
         printf("\nmatched");
         return mType[i];
      }
   } //end of for loop
   printf("\nreturning ERROR");
   char *er = "ERROR";
   return er;
} //end of getMimetype
ফাংশনটির আইডিয়া খুব সহজ। রিকোয়েস্ট থেকে মাইমটাইপ পড়ে সে অনুযায়ী রিপ্লাইয়ের মাইমটাইপ ঠিক করে দিবে।
রিপ্লাই হিসেবে যে বাইটগুলো পাঠানো হয় সেগুলো গুছানোর জন্য প্রিপেয়ার রিপ্লাই নামে একটি ফাংশন ব্যবহার করা হয়।
Reply prepare_reply(int code, Request rq)
{
ফাংশন শুরু হল।
// extracting the file extension
char *drive, *direc, *fname, *ext;

drive = (char *) malloc (3);
direc = (char *) malloc (66);
fname = (char *) malloc (9);
ext = (char *) malloc (5);

Reply rpl;
শুরুতে মেমোরীতে কিছু জায়গা গুছিয়ে নেই।
if(code == 200)
{
এর মানে হল আমরা ওয়েবসাইট ভিজিটরকে জানাতে যাচ্ছে যে পেজটি সার্ভারে পাওয়া গেছে।
rpl.code = 200;
 
time_t lt;
lt = time(NULL);
strcpy(rpl.date, ctime(&lt));
rpl.date[strlen(rpl.date) - 1] = '\0';
 
strcpy(rpl.server, "TinyThreadedServer/0.1a");
কিছু খুচরো তথ্য গুছিয়ে নেই।
char dir[100];
getcwd(dir, 100);
//printf("\ncurrent dir is %s", dir);
//printf("\nfile path is %s", rq.filePath);
strcat(dir, "/");
strcat(dir, rq.filePath);
//printf("\nabsolute file path is %s", dir);
char *path, *p;
path = (char *) malloc (80);
p = (char *) malloc (80);
path = strtok(dir, "/");
strcpy(p, "/");
strcat(p, path);
do{
   path = strtok('\0', "/");
   if(path)
   {
      strcpy(ext, path);
      strcat(p, "/");
      strcat(p, path);
   }
} while(path);
//printf("\nthe c++ file path %s", p);
হার্ডডিস্কে কোথায় ফাইলটি আছে খুঁজে নেই।
char *e;
e = (char *)malloc(10);
e = strtok(ext, ".");
e = strtok('\0', ".");
//printf("\nfile extension is %s", e);
ফাইলের এক্সটেনশনটি জেনে নেই।
FILE *fp;
fp = (FILE *) malloc(sizeof(FILE));
if((fp = fopen(p, "r")) == NULL)
{
   printf("\nFILE NOT FOUND.\nERROR CODE 404");
   rpl.code = 404;
   return rpl;
}
ফাইলটি পড়া যায় কিনা দেখি।
struct stat buff;
stat(p, &buff);
//printf("\nSize: %ld\ntime of last modification: %s", buff.st_size, ctime(&buff.st_mtime));

strcpy(rpl.last_modified, ctime(&buff.st_mtime));
rpl.last_modified[strlen(rpl.last_modified) - 1] = '\0';
ফাইলটি সর্বশেষ কবে আপডেট করা হয়েছে সেই তথ্যটি টুকে নেই।
rpl.content_length = buff.st_size;
ফাইলের সাইজ কত সেই তথ্যটি নেই।
if(strcmp(getMimeType(e), "ERROR") == 0)
{
   rpl.code = 403;
   fclose(fp);
   return rpl;
}
ফাইলটি পড়ার পারমিশন আছে কিনা দেখি।
   strcpy(rpl.content_type, getMimeType(e));
   strcpy(rpl.file_path, p);
   fclose(fp);
}
আরো কিছু তথ্য নেই।
else if (code == 400)
{
   rpl.code = 400;

   time_t lt;
   lt = time(NULL);
   strcpy(rpl.date, ctime(&lt));
   rpl.date[strlen(rpl.date) - 1] = '\0';

   strcpy(rpl.server, "TinyThreadedServer/0.1a");
}
এর মানে হল ফাইলটি পাওয়া যায় নি।
else if (code == 501)
{
   rpl.code = 501;

   time_t lt;
   lt = time(NULL);
   strcpy(rpl.date, ctime(&lt));
   rpl.date[strlen(rpl.date) - 1] = '\0';
   
   strcpy(rpl.server, "TinyThreadedServer/0.1a");
}
এর মানে হল ফাইলটি আছে কিন্তু পড়ার পারমিশন নেই।
   return rpl;
} //end of prepare_reply
ফাংশন শেষ।
কোন ব্রাউজার যখন রিকোয়েস্ট পাঠায় তখন সেখানে অনেক ধরণের তথ্য থাকে। সেগুলো ধরে ধরে বুঝার জন্য পারস রিকোয়েস্ট ফাংশনটি ব্যবহার করা হয়।
Request parse_request(char *rbuff)
{
   char *fileName;
   char *hostName;
   int j, k, l, m, n;
   Request r;
ফাংশন শুরু হল।
fileName = (char *) malloc (100);
hostName = (char *) malloc (100);
মেমোরীতে একটু জায়গা নেই।
for(j = 5, k = 0; ;j++, k++)
{
   if(rbuff[j] == ' ') break;
   fileName[k] = rbuff[j];
} //end of for loop
fileName[k]= '\0';
//printf("\nThe valid file path is %s", fileName);
strcpy(r.filePath, fileName);
কোন ওয়েবপেজ দেখতে চায় সেটি জেনে নেই।
//finding the host
char *p;
p = strstr(rbuff, "Host: ");

for(l = 0; l < 6; l++)
{
   p++;
} //end of for loop

for(m = 0, n = 0; ; m++, n++)
{
   if(*p == '\r' || *p == '\n') break;
   hostName[n] = *p;
   p++;
} //end of for loop
hostName[n]= '\0';

fflush(stdout);
strcpy(r.hostName, hostName);
রিকোয়েস্টটি কোন কম্পিউটার থেকে এসেছে জেনে নেই।
   return r;
} // end of parse_request
ফাংশন শেষ।
একটি ওয়েব পেজ দেখার রিকোয়েস্টে অনেক ধরণের মেথড থাকতে পারে, যেমন, গেট, পুট ইত্যাদি। আমার এই সার্ভার শুধু মাত্র গেট সাপোর্ট করে। এই ব্যাপারগুলো সামলানোর জন্য ফাইন্ড মেথড ফাংশনটি ব্যবহার করা হয়।
int find_method (char *req)
{
   pthread_mutex_lock(&srvrMutex2);
   //printf("\nin the find_method function\n%s\nthe size of the request is: %d", req, strlen(req));

   char *method_list[6];
   method_list[0] = (char *) malloc (10);
   strcpy(method_list[0], "PUT");
   method_list[1] = (char *) malloc (10);
   strcpy(method_list[1], "HEAD");
   method_list[2] = (char *) malloc (10);
   strcpy(method_list[2], "POST");
   method_list[3] = (char *) malloc (10);
   strcpy(method_list[3], "DELETE");
   method_list[4] = (char *) malloc (10);
   strcpy(method_list[4], "TRACE");
   method_list[5] = (char *) malloc (10);
   strcpy(method_list[5], "CONNECT");
 
   int i, j = 0;
   char *r;
   r = (char *) malloc (10);
   for(i = 0; i < strlen(req); i++)
   {
      if(req[i] == ' ') break;
      r[i] = req[i];
   } //end of for loop
   r[i] = '\0';
   //printf("\nExtracted method is %s", r);

   if(strcmp(r, "GET") == 0)
   {
      //printf("\nit's a GET method !!!");
      pthread_mutex_unlock(&srvrMutex2);
      return 0;
   }
 
   for(i = 0; i < 7; i++)
   {
      if(strcmp(r, method_list[i]) == 0)
      {
         printf("\n%s matched with %s", r, method_list[i]);
         j = 1;
         break;
      }
   } //end of for loop

   if(j == 1)
   {
      pthread_mutex_unlock(&srvrMutex2);
      return 1;
   }
   else
   {
      pthread_mutex_unlock(&srvrMutex2);
      return -1;
   }
} // end of find_method
গেট মেথড হলে আমি আগাবো না হলে স্যরি বলে দিব।
কোড এখানেই শেষ! পড়ার জন্য ধন্যবাদ! এখন একটু মাথা খাটিয়ে বের করা আমার ওয়েব সার্ভারের সোর্স কোডের ফাইলের নাম allizom রেখেছি কেন?

টাওয়ার অফ হ্যানয়

maya-organic-1-tower-of-hanoi-puzzle-400x400-imadx6hgmxvqvpdk
টাওয়ার অফ হ্যানয় , কম্পিউটার বিজ্ঞানের মানুষদের কাছে খুবই পরিচিত একটি সমস্যার নাম। রিকার্শন দিয়ে সাধারণত আমরা এই সমস্যার সমাধান করে থাকি। এটি মূলত একটি গাণিতিক খেলা বা পাজল, যেখানে তিনটি খুঁটি এবং ছোটবড় বিভিন্ন আকারের অনেকগুলো চাকতি বা ডিস্ক দেয়া থাকে। খেলাটি হলো প্রথম খুঁটি থেকে তিন নাম্বার খুঁটিতে  সবগুলো চাকতি নিয়ে যাওয়া।
মনে হতে পারে চাকতি সরানো আর এমন কী ব্যাপার! কিন্তু সহজ হলে তো আর খেলার মজা থাকে না। চাকতি গুলো সরানোর জন্য রয়েছে তিনটি শর্ত। শর্তগুলো হলোঃ
১. চাকতিগুলো থেকে একবারে একটি করে চাকতি অন্য খুঁটিতে স্থানান্তর করতে হবে। একের অধিক চাকতি একবারে নেয়া যাবে না।
২. সবসময় সবার উপরে যে চাকতিটি থাকবে সেই চাকতিটিই সরিয়ে নিতে হবে, এবং যে খুঁটিতে স্থানান্তর করা হবে সেখানেও সবার উপরের স্থানেই তার জায়গা হবে।
৩. কখনোই ছোট চাকতির উপর বড় চাকতি রাখা যাবে না।
১৮৮৩ সালে ফরাসি গণিতবিদ, এ্যাডুইয়ার্ড লুকাস , টাউয়ার অফ হ্যানয় পাজল্‌টি আবিষ্কার করেন। টাওয়ার অফ হ্যানয়ের রয়েছে মজার একটি গল্প। জনশ্রুতি যে ভারতের কাশি বিশ্বনাথে একটি মন্দিরের একটি বিশাল কক্ষে ৬৪টি স্বর্ণের চাকতিসহ তিনটি স্তম্ভ আছে। একজন ব্রাহ্মণ পুরোহিত ব্রহ্মার নির্দেশ অনুসারে সেই চাকতিগুলোকে ক্রমাগত নিয়ম মেনে আদিকাল থেকে স্থানান্তর করে যাচ্ছে। কিংবদন্তীদের মতে যখন পাজলের ৬৪টি চাকতির শেষ চাকতিটি সফলভাবে স্থানান্তর করা যাবে, তখন পৃথিবী ধ্বংস হয়ে যাবে!
এডুইয়ার্ড লুকাস
এডুইয়ার্ড লুকাস
মজার ব্যাপার হচ্ছে যদি কিংবদন্তীদের কথা সত্যি হয়, এক সেকেন্ডে নিয়ম মেনে একটি চাকতি সঠিকভাবে সরানো গেলেও পুরোহিতের সময় লেগে যাবে ২৬৪-১ সেকেন্ড মানে ২৪৫ বিলিয়ন বছর!
গল্পটি বিভিন্নভাবে প্রচলিত আছে। কোথাও বলা আছে, একটি বৌদ্ধদের আশ্রম এবং ভিক্ষুদের কথা। মন্দির বা আশ্রমের অবস্থান নিয়েও রয়েছে মতভেদ। কারো মতে মন্দিরটি ভারতে আবার কারো মতে আশ্রমটি ভিয়েতনামের রাজধানী হ্যানয়ে। আবার  অনেকের ধারণা টাওয়ারটি পৃথিবীর শুরু থেকেই আছে এবং পুরোহিতেরা রোজ একটি করে চাকতি সরিয়েই যাচ্ছেন।
কম্পিউটার বিজ্ঞানে রিকার্শন ধারণাটি ব্যবহার করে সাধারণত আমরা টাওয়ার অফ হ্যানয় সমস্যার সমাধান করে থাকি। সহজ বাংলায় রিকার্শন মানে হচ্ছে পুনরাবৃত্তি। রিকার্শন হচ্ছে এমন একটি পদ্ধতি যেখানে একটি ফাংশনকে এমনভাবে ব্যবহার করা হয় যেন ফাংশনটি নিজেই নিজের কাজে ব্যবহৃত হয় বা নিজের নাম ধরে নিজেই নিজেকে ডাকে। রিকার্শনের সাহায্যে বারবার একই কাজ করে একটা সমস্যার সমাধানে পৌঁছানো যায়।
টাওয়ার অফ হ্যানয়ের ক্ষেত্রে n  সংখ্যক চাকতির জন্য 2-1 সংখ্যক স্থানান্তরc(Move) হয়ে থাকে। সবচেয়ে সহজ টাওয়ার অফ হ্যানয় সমস্যায় তিনটি চাকতি থাকে।   
N সংখ্যক চাকতির জন্য টাওয়ার অফ হ্যানয়ের এ্যালগোরিদমটি নিম্নরূপঃ
TOWER (N, BEG, AUX, END)
  1. If N=1, then:
    1. Write: BEG—>END
    2. Return
  2. Call TOWER (N-1, BEG, END, AUX)
  3. Write: BEG—>END
  4. Call TOWER(N-1, AUX,BEG,END)
  5. Return
ধরা যাক, খুটি তিনটি যথাক্রমে A, B, C এবং N=3 ( যেহেতু আমরা তিনটি চাকতির জন্য সমাধান করবো।) সেক্ষেত্রে আমাদের স্থানান্তর সংখ্যা হবে 23 -1 = 7  . একদম শুরুতে আমাদের চিত্রটি হবে এমনঃ
n=3 এর জন্য টাওয়ার অফ হ্যানয়।
n=3 এর জন্য টাওয়ার অফ হ্যানয়।

 এখানে A , B এবং C যথাক্রমে BEG, AUX এবং END.  এ্যালগোরিদম এর ফাংশন মতে আমরা লিখতে পারি, TOWER (3, A, B, C) . যেহেতু আমাদের N এর মান 1 এর থেকে বেশি তাই এ্যালগোরিদমের 1 নাম্বার পয়েন্ট আপাতত আমাদের কাজে লাগবে না। আমরা চলে যাই এ্যালগরিদমের 2,3 এবং 4 নাম্বার পয়েন্টের কাছে। সহজ  এবং নির্ভুলভাবে টাওয়ার অফ হ্যানয় সমস্যাটি সমাধান করা জন্য আমরা নিচের তিনটি জিনিস মাথায় রাখবো।
Call Tower (N-1, BEG, END, AUX)
Write:  BEG—>END
Call Tower (N-1, AUX, BEG, END)
যেকোন সংখ্যক চাকতির জন্য কতগুলো স্থানান্তর(movement) এবং স্থানান্তরের ক্রম বের করার জন্য TOWER (N, BEG, AUX, END) এর ডানদিকে আমরা রাখবো TOWER (N-1, BEG, END, AUX ) স্টেটমেন্টটিকে এবং বামদিক রাখবো TOWER (N-1, AUX, BEG, END) .  এটার বেসিক স্ট্রাকচারটি হবে নিম্নরূপঃ
Untitled
 প্রতিবারেই আমাদের আউটপুট হবে BEG —> END . এক্ষেত্রে লক্ষণীয় ব্যাপার হচ্ছে এখানে BEG,  AUX, END এগুলো জায়গা বদলালে এদের নাম বদলাবে। যেমনঃ বামদিকে TOWER (N-1, AUX, BEG, END)  এ AUX কিন্তু আসলে BEG হয়ে গেছে কারণ সে প্রথমে।
এখন N=3 এর জন্য আমরা পাইঃ
matha
 উপরের চিত্রের প্রতিবার TOWER ফাংশন থেকে আমরা BEG—->END হিসেবে আউটপুট পাবো, যেটা হবে আমাদের টাওয়ার অফ হ্যানয় সমস্যার এক একটি স্থানান্তর। যেমনঃ
TOWER (3, A, B, C) ————————————— BEG —-> END —– A—>C
TOWER (3-1, B, A, C) = TOWER (2, B, A, C) ———- BEG—->END —– B—>C
ঠিক এভাবে N = 1 না হওয়া পর্যন্ত TOWER  ফাংশনটি কাজ করেই যাবে। শেষ পর্যন্ত আমরা নিম্নরূপ আউটপুট পাবো যেগুলো প্রত্যেকটি টাওয়ার অফ হ্যানয়ের এক একটি স্থানান্তর। এভাবে প্রতিবার টাওয়ার অফ হ্যানয়ের এ্যালগরিদম ব্যবহার করে আমরা নিম্নোক্ত সমাধান পাইঃ
DSC02719
 এই ছবিটিতে যে “MOVE” গুলো দেখা যাচ্ছে সেগুলো উপর থেকে নিচ পর্যন্ত পরপর সাজালেই আমরা তিনটি চাকতির জন্য টাওয়ার অফ হ্যানয়ের স্থানান্তরগুলো পেয়ে যাবো
টাওয়ার অফ হ্যানয় সমস্যার সমাধানের ক্ষেত্রে এই নিয়মটি দ্বারা N এর যেকোন মানের জন্য খুব সহজেই এর স্থানান্তর (Movement) বের করা সম্ভব।
 লেখক : তামান্না নিশাত রিনি

রাস্পবেরি পাই


পাঠ্যবিষয়কে সহজবোধ্য এবং বাস্তবরূপে শিক্ষার্থীদের কাছে পৌঁছে দেয়ার জন্য স্মার্ট ক্লাসরুমের ধারণা আজকাল খুব জনপ্রিয়। একটি স্মার্ট ক্লাসরুমে মাল্টিমিডিয়া প্রজেক্টর এবং কম্পিউটারের মাধ্যমে কাগুজে পাঠ্যবিষয়কে ডিজিটাল রূপে উপস্থাপন করা হয়। বিশ্ববিদ্যালয় পর্যায়ে স্মার্ট ক্লাসরুম বহুল প্রচলিত হলেও স্কুল পর্যায়ে এটি আমাদের দেশে খুব একটা প্রচলিত না। একটি বিদ্যালয়ের জন্য আমাদের দেশের প্রেক্ষাপটে স্মার্ট ক্লাসরুম তৈরি করা অত্যন্ত ব্যয়বহুল। তাহলে কি আমাদের দেশের বিদ্যালয়গুলোতে স্মার্ট ক্লাসরুম তৈরি করা সম্ভব না? এক্ষেত্রে আমরা বলতে পারি যুক্তরাজ্য ভিত্তিক Raspberry  Pi  Foundation  এর তৈরি মিনি কম্পিউটার Raspberry  Pi  এর কথা।
রাস্পবেরী পাই কীঃ
রাস্পবেরী পাই হচ্ছে ক্রেডিট কার্ড আকৃতির সিঙ্গেল বোর্ড কম্পিউটার। যুক্তরাষ্ট্রের রাস্পবেরি পাই ফাউন্ডেশন কর্তৃক এই মিনি কম্পিউটারটি মূলত তৈরি করা হয় স্কুলের বাচ্চাদের বেসিক কম্পিউটার বিজ্ঞানের সাথে পরিচিত করার জন্য। ক্রেডিট কার্ড সাইজের এই কম্পিউটারকে মনিটর , মাউস এবং কি-বোর্ডের সাথে সহজেই যুক্ত করে কাজ করা যায়।
রাস্পবেরি পাই কম্পিউটার
রাস্পবেরি পাই কম্পিউটার
রাস্পবেরি পাই একটি সাধারণ ডেস্কটপ কম্পিউটারের মতোই, এটি দিয়ে ইন্টারনেট ব্রাউজ করা ছাড়াও গেম খেলা, ওয়ার্ড প্রসেসিং ইত্যাদি কাজ করা যায়। আর প্রোগ্রামিং শেখার জন্যও এটি বেশ উপযোগি, কারণ পাইথন, স্ক্রাচ, সি ইত্যাদি প্রোগ্রামিং ভাষায় এতে প্রোগ্রামিং করা যায়। রাস্পবেরি পাই কম্পিউটারের মূল আকর্ষণীয় দিক হচ্ছে, এর মূল্য সাধারণের একদম হাতের নাগালে, মাত্র ৩৫ ডলারে পাওয়া যায় ক্ষুদে এই কম্পিউটারকে।
ইতিহাসঃ
স্কুলের বাচ্চাদের জন্য ছোট্ট এবং স্বল্পমূল্যের কম্পিউটার তৈরির চিন্তা-ভাবনা শুরু হয় ২০০৬ সালে। তখন ইবেন আপটন, রব মুলিন্স, জ্যাক ল্যাং এবং এ্যালান মাইক্রফট্‌ ক্যামব্রিজ বিশ্ববিদ্যালয়ের কম্পিউটার ল্যাবরেটরিতে কাজ করার সময় লক্ষ্য করেন যে “এ লেভেল” শ্রেণীতে পড়ুয়া ছাত্রছাত্রীদের কম্পিউটার বিজ্ঞান সম্পর্কে জানার আগ্রহ এবং কম্পিউটার সায়েন্সের দক্ষতা দিন দিন হ্রাস পাচ্ছে। যেখানে নব্বই দশকের আবেদনকারী ছাত্রছাত্রীদের মধ্যে অধিকাংশই ছিল শখের অভিজ্ঞ প্রোগ্রামার , সে পরিস্থিতি বিবেচনার ২০০০ সালের দিকে ক্যামব্রিজে আবেদনকারীর অধিকাংশই সামান্য ওয়েব ডিজাইন ছাড়া কিছুই জানত না। তখন হোম কম্পিউটার জনপ্রিয় হওয়ায় এবং স্কুলের আইসিটি কারিকুলামের আমূল পরিবর্তন হওয়ায় বাচ্চারা গেমস, ওয়ার্ড, এক্সেল, টুকটাক ওয়েবপেজ ডিজাইনের দিকে বেশি ঝুঁকে পরে। ফলে কমোডোর 64, স্পেকট্রাম জেডএক্স, বিবিসি মাইক্রো ইত্যাদি যেসব মেশিন দিয়ে পূর্বে প্রোগ্রামিং এর চর্চা হতো সেগুলোর জনপ্রিয়তা কমতে থাকে।
কম্পিউটার সায়েন্সের জনপ্রিয়তা স্কুল পর্যায়ে বৃদ্ধি করার জন্য ২০০৬ সাল থেকে ২০০৮ সাল পর্যন্ত রাস্পবেরী পাই এর বিভিন্ন প্রোটোটাইপ তৈরি করা হয়। ২০০৮ সালে যখন মোবাইলে ডিভাইসের জন্য ব্যবহার উপযোগী প্রসেসর শক্তিশালী এবং সহজলভ্য হয়, তখন ক্যামব্রিজ বিশ্ববিদ্যালয়ের কম্পিউটার ল্যাবরেটরীর চার বিজ্ঞানী  ইবেন, রব, জ্যাক ও অ্যালান,  হার্ডওয়্যার প্রস্তুতকারক কোম্পানি নরকট টেকনোলজির ব্যবস্থাপনা পরিচালক পিটে লোমাস এবং বিবিসি মাইক্রো গেম এলিটের সহ প্রণেতা ডেভিড ব্রাবেন একসঙ্গে মিলে ২০০৮ রাস্পবেরী পাই ফাউন্ডেশন প্রতিষ্ঠা করেন। রাস্পবেরী পাই ফাউন্ডেশন প্রতিষ্ঠার তিন বছর পর রাস্পবেরি পাই মডেল বি ব্যাপকভাবে প্রস্তুত করা শুরু হয় এবং দুই বছরে রাস্পবেরি পাই এর এই মডেলটি দুই মিলিয়নেরও বেশি বিক্রি হয়।
রাস্পবেরি পাই বি মডেল
রাস্পবেরি পাই বি মডেল
বৈশিষ্ট্যঃ
রাস্পবেরি পাই এর প্রথম সংস্করণ রাস্পবেরি পাই বি এর ছিলো ৫১২ মেগাবাইট র‍্যাম, দুটি ইউএসবি পোর্ট এবং ১০০ মেগাবিট ইথারনেট পোর্ট। ২০১৪ সালের জুলাই মাসে রাস্পবেরি পাই বি+ বাজারে আসে। যেটিতে রয়েছে আগের মডেলের থেকে অতিরিক্ত ইউএসবি পোর্ট, মাইক্রো এসডি কার্ড স্লট, উন্নত শব্দ এবং ৩.৫ মিলিমিটার ভিডিও জ্যাক।
প্রয়োজনীয় সকল সংযোগসহ একটি রাস্পবেরি কম্পিউটার
প্রয়োজনীয় সকল সংযোগসহ একটি রাস্পবেরি কম্পিউটার
রাস্পবেরি পাই কম্পিউটারের মূল বৈশিষ্ট্য হলো এর মোবিলিটি। কার্ড সাইজের আকৃতি হওয়ায় এই কম্পিউটারকে অনায়সে পকেটে করে বহন করা যায়। প্রয়োজনমত মনিটর, মাউস, কিবোর্ডের সাথে যুক্ত করলেই হয়ে যায় ডেস্কটপ কম্পিউটার। শিক্ষার্থীদের কম্পিউটারের কার্যপদ্ধতি বোঝানোর জন্য রাস্পবেরি পাই তৈরি করা হলেও ইনপুট/আউটপুট  পোর্ট থাকার কারণে একে আরডুইনো উনোর বিকল্প হিসেবে রোবটিক্স এ ব্যবহার করা যায়।
একই সাথে একে পোর্টেবল পিসি ও প্রোগ্রামেবল আই সি হিসেবে ব্যাবহার  করা যায় বলে রাস্পবেরি পাই  হ্যাকারদের কাছে অসীম সম্ভবনার দরজা খুলে দেয়। লিনাক্সভিত্তিক অপারেটিং সিস্টেম হওয়ায় এর অপারেটিং সিস্টেমের জন্য বাড়তি কোনো মূল্যও পরিশোধ করতে  হয় না, কারণ লিনাক্সভিত্তিক অপারেটিং সিস্টেম একটি মুক্ত ও বিনামূল্যে প্রাপ্ত অপারেটিং সিস্টেম। আর অপারেটিং সিস্টেম মুক্ত হওয়ায় আমরা এর পরিবর্তন ও পরিমার্জনও করতে পারি সহজেই। মজার ব্যাপার হচ্ছে এই রাস্পবেরি পাই-এর মনিটর হিসেবে টেলিভিশনও ব্যবহার করা যায়।
২০১৫ সালে বাজারে এসেছে রাস্পবেরি পাই ২। রাস্পবেরি পাই কম্পিউটারের  এই সংস্করণের কোয়াড কোর এআরএম প্রসেসর পূর্বের সংস্করণের চেয়ে ৬ গুন বেশি শক্তিশালী। রাস্পবেরি পাই এর আগের সংস্করণ রাস্পবেরি পাই বি+ এর কিছু ফিচার পরিবর্তনের পাশাপাশি এই সিরিজে পাওয়া যাবে চারটি ইউএসবি পোর্ট এবং মাইক্রো এসডি কার্ড স্লট। এছাড়াও রাস্পবেরি পাই ২ সংস্করণ কিনলে সাথে বিনামূল্যে পাওয়া যাবে উইনডোজ ১০ অপারেটিং সিস্টেম।

রাস্পবেরি পাই মডেল বি এবং রাস্পবেরি পাই মডেল বি+
রাস্পবেরি পাই মডেল বি এবং রাস্পবেরি পাই মডেল বি+
 বাংলাদেশে রাস্পবেরি পাইঃ
বাংলা পাই প্রকল্পঃ
হার্ভার্ড বিশ্ববিদ্যালয়ের ফলিত গণিত ও কম্পিউটার কৌশল বিভাগের বাংলাদেশি ছাত্র তারিক আদনান বাংলা পাই প্রকল্পের মাধ্যমে তৃতীয় বিশ্বের শিক্ষার্থীদের জন্য একটি স্বল্পমূল্যের কম্পিউটার তৈরির জন্য কাজ করে যাচ্ছেন। প্রাথমিকভাবে বাংলা পাই প্রকল্পের কম্পিউটারে রাস্পবেরি পাই ব্যবহার করা হয়েছে যেটির রয়েছে ৯০০ মেগাহার্টজ্‌ গতির প্রসেসর এবং ৫১২ মেগাবাইট র‍্যাম। শিক্ষার্থীদের প্রয়োজনীয় সকল কাজ এই বাংলা পাই কম্পিউটার দিয়ে করা সম্ভব। এতে রয়েছে লেখালেখির সফটওয়্যার, প্রোগ্রামিং শেখার স্ক্র্যাচ সিস্টেম, পাইথনের কম্পাইলার, গান ও ভিডিও চালানোর সফটওয়্যার, বেশ কযেকটি গেমস এবং ওয়েবসাইট দেখার সফটওয়্যারসহ নানা কিছু। বাংলা পাই কম্পিউটারের মনিটর হিসেবে ব্যবহার করা হয়েছে কাঠের ফ্রেম ও ১০.১ ইঞ্চি এলসিডি প্যানেল। সমগ্র এই কম্পিউটার ব্যবস্থা তৈরিতে খরচ হয় মাত্র ৬,২০০ টাকা ।
রাস্পবেরি পাই ক্লাস্টার কম্পিউটারঃ
গত মাসে (মে ২০১৫) রাস্পবেরি পাই দিয়ে বাংলাদেশে প্রথমবারের মত ক্লাস্টার কম্পিউটার তৈরি করেছেন সিলেটের মেট্রোপলিটন বিশ্ববিদ্যালয়ের একদল শিক্ষক-শিক্ষার্থী।
রাস্পবেরি পাই দিয়ে ক্লাস্টার কম্পিউটার তৈরি প্রকল্পের সুপারভাইজার ছিলেন মেট্রোপলিটন বিশ্ববিদ্যালয়ের ইলেকট্রিক্যাল অ্যান্ড ইলেক্ট্রনিক ইঞ্জিনিয়ারিং বিভাগের লেকচারার সৈয়দ রেজওয়ানুল হক নাবিল।
মেট্রোপলিটন বিশ্ববিদ্যালয়ের গবেষক দলটি স্বল্প খরচে ক্লাস্টার কম্পিউটার তৈরি করেছে। এখানে ৪টি রাস্পবেরি পাই কম্পিউটার একত্রিত করে ক্লাস্টার কম্পিউটারটি বানানো হয়েছে। তবে চাইলে ৩২টি কম্পিউটার একসঙ্গে করা যাবে।
রাস্পবেরি পাই দিয়ে তৈরি ক্লাস্টার কম্পিউটার
রাস্পবেরি পাই দিয়ে তৈরি ক্লাস্টার কম্পিউটার
বর্তমানে রাস্পবেরি পাই দিয়ে তৈরি এই ক্লাস্টার কম্পিউটারটি মেট্রোপলিটন বিশ্ববিদ্যালয়ের ইনোভেশন ল্যাবে ব্যবহার করা হচ্ছে।
রাস্পবেরি পাই সিঙ্গেল বোর্ড কম্পিউটারটি বাংলাদেশে এখন বেশ সহজলভ্য। বিভিন্ন অনলাইন মার্কেটে এটি পাওয়া যাচ্ছে । এছাড়াও ফেসবুকে রাস্পবেরি পাই নিয়ে উৎসাহী লোকজনদের জন্য রাস্পবেরি পাই বাংলাদেশ নামক একটি পেজ রয়েছে যেখানে রাস্পবেরি পাই কম্পিউটার সংক্রান্ত বিষয়াদি সম্পর্কে জানা যাবে সহজেই।
লেখক : তামান্না নিশাত রিনি।

রং অ্যানসার

যারা বিভিন্ন প্রোগ্রামিং সমস্যা সমাধানের ওয়েবসাইটে কেবল চর্চা করা শুরু করেছ, তাদের জন্য সবচেয়ে সাধারণ ব্যাপার হচ্ছে এই রং অ্যানসার (Wrong Answer)। “স্যাম্পল ইনপুট-আউটপুটের সাথে তো আমার মিলে, তাহলে অনলাইন জাজ কেন রং অ্যানসার দিচ্ছে”?
58306615নমুনা ইনপুট-আউটপুট (Sample Input-Output) মিললেই হবে না। ধরা যাক, কোনো একটা প্রাইম নাম্বার বের করার প্রোগ্রামে নমুনা ইনপুট দেওয়া আছে 3, 5, 7 যার জন্য আউটপুট হচ্ছে প্রাইম। এখন এটা দেখে কেউ যদি এমন প্রোগ্রাম লেখে যে বিজোড় সংখ্যা মাত্রই প্রাইম, তাহলে তো হবে না, তাই না? তাই নিজে নিজে টেস্ট কেইস তৈরি করে আগে নিজে বের করতে হবে যে আউটপুট কী হবে। তারপরে প্রোগ্রামের আউটপুটের সাথে মিলিয়ে দেখবে।
আরেকটা ব্যাপার হচ্ছে আউটপুট ফরম্যাটিং। প্রতিটা টেস্ট কেইসের শেষে নিউলাইন (“\n”) দিতে হবে, যেটা আসল বলে দেওয়া থাকে না। আর দেখতে হবে নমুনা আউটপুটের সাথে যেন হুবুহু মিলে। ছোটহাত-বড়হাতের অক্ষর (Uppercase / lowerse) এবং স্পেস ক্যারেক্টার ঠিকমতো মিলতে হবে। যেমন প্রবলেমের আউটপুটে যদি Case লিখতে বলে আর তুমি case লিখ, তাহলে হবে না। আবার Case 1: লিখতে বললে তুমি যদি Case 1 : লিখ (: এর আগে একটি স্পেস), তাহলেও রং অ্যানসার।
কর্ণার কেস টেস্ট করতে হবে। ধরা যাক তোমাকে বলা হল, a ^ n -এর মান বের করতে। এখন তুমি চট করে প্রোগ্রাম লিখে ফেললে যেটা খুব সহজেই কাজটি করে দেয়। স্যাম্পল আউটপুট তো মিলেই, তুমি নিজেও যেসব ইনপুট-আউটপুট তৈরি করে টেস্ট করলে, সেগুলোও মিলে যায়। কিন্তু এখানে n-এর মান 0 হলে কী হবে? আর ঋণাত্মক হলেই বা কী হবে? এগুলোও কিন্তু তোমার প্রোগ্রামে ঠিকঠাক আউটপুট দিতে হবে।
আরেকটি কারণ হচ্ছে সমস্যার বর্ণনা ঠিকমতো বুঝতে না পারা। আমরা অনেক সময় একবার বা দুবার পড়ে ঠিকঠাক বুঝতে পারি না। তাই রং অ্যানসার হলে সমস্যার বর্ণনা আবার মনোযোগ দিয়ে পড়তে হবে। অনেক সময় দেখবে তখন তুমি উপলব্ধি করবে যে প্রোগ্রাম লেখার সময় তুমি সমস্যাটি ঠিকঠাক বুঝতে পারো নি।
অনেক সময় ফ্লোটিং পয়েন্ট নাম্বার নিয়ে ক্যালকুলেশনের সময় ঝামেলা হয়। সবকিছু ঠিকঠাক থাকলেও ফ্লোটিং পয়েন্ট ক্যালকুলেশনের কারণে তুমি রং অ্যানসার পেতে পার। তাই এই কাজটি ঠিকঠাক করতে হবে। নিচে একটি উদাহরণ দিচ্ছি (পাইথন কোড) :
>>> 2.1 – 1.9
0.20000000000000018
তাই ফ্লোটিং পয়েন্ট নিয়ে কাজ করার সময় সাবধান।
আরেকটা কারণ হচ্ছে ভুল অ্যালগরিদমের ব্যবহার। এটাও আসলে সমস্যার বর্ণনা ঠিকভাবে বুঝতে না পারার ফলেই ঘটে থাকে।
এসব সমস্যা থেকে পরিত্রাণ পাওয়ার উপায় হচ্ছে রং অ্যানসার খেলে সেটা যে তোমারই ভুল, এটা স্বীকার করে নেওয়া (মাঝে-মধ্যে জাজেরও ভুল হতে পারে, তবে সেটা খুবই কম ঘটে)। নিজে আরো চিন্তাভাবনা করা, না পারলে বন্ধুদের সাথে সেটা নিয়ে আলাপ করা। তাতেও কাজ না হলে অনলাইন ফোরাম ঘেঁটে দেখা যে আগে কেউ এরকম সমস্যায় পরেছে কী না এবং সেটা কিভাবে সমাধান হয়েছে।

শেরিল স্যান্ডবার্গ

সামাজিক যোগাযোগের অন্যতম জনপ্রিয় মাধ্যম ফেসবুক। এই ফেসবুকের পরিচালনা পরিষদের প্রথম নারী সদস্যের নাম “শেরিল স্যান্ডবার্গ”, যিনি প্রযুক্তি দুনিয়ার প্রভাবশালী নারীদের মধ্যে অন্যতম। ২০১২ সালে তিনি প্রথম এবং একমাত্র নারী হিসেবে ফেসবুকের পরিচালনা পরিষদে যোগদান করেন।
শেরিল স্যান্ডবার্গ
শেরিল স্যান্ডবার্গ
শেরিল ক্যারা স্যান্ডবার্গ, ১৯৬৯ সালের ২৮ আগস্ট যুক্তরাষ্ট্রের ওয়াশিংটন ডিসিতে এক ইহুদী পরিবারে জন্মগ্রহণ করেন। এ্যাডলি এবং জোয়েল স্যান্ডবার্গ দম্পতির তিন সন্তানের মধ্যে তিনি ছিলেন সবার বড়। শেরিলের বাবা জোয়েল স্যান্ডবার্গ ছিলেন একজন চুক্ষরোগ বিশেষজ্ঞ এবং মা এ্যাডলি স্যান্ডবার্গ ছিলেন ফরাসী এবং ইংরেজি ভাষার শিক্ষিকা।
শেরিলদের পরিবারের ঐতিহ্য ছিল সোভিয়েত ইহুদিদের সাহায্য করা। সেই সময় সোভিয়েত ইহুদীদের ইসরাইলে অভিবাসনের নিষেধাজ্ঞার প্রতিবাদে আন্দোলন চলছিল। শেরিলদের বাসায় সেসময় আন্দোলনকারীদের সভা বসতো এবং প্রতি সপ্তাহান্তে র‍্যালি বের করা হতো।
মা-বাবা, ভাইবোনের সাথে শেরিল স্যান্ডবার্গ (বামে)
মা-বাবা, ভাইবোনের সাথে শেরিল স্যান্ডবার্গ (বামে)
শেরিলের দুই বছর বয়সের সময় তাদের পরিবার ওয়াশিংটন ডিসি থেকে ফ্লোরিডার নর্থ মায়ামী বিচ্‌ এ চলে আসে। সেখানকার নর্থ মায়ামী বিচ্‌ হাই স্কুলে শেরিলের পড়াশোনার হাতেখড়ি হয়। তিনি বরাবরই মেধাবী ছাত্রী ছিলেন। স্কুলে সবসময় প্রথম স্থানটি ছিলো শেরিলের দখলে। পড়াশোনার পাশাপাশি তিনি অন্যান্য সহ-শিক্ষা কার্যক্রমের সাথেও যুক্ত ছিলেন। ১৯৮০ সালে শেরিল যখন হাইস্কুলের ছাত্রী তখন তিনি তাঁর স্কুলে অ্যারোবিকস্‌ শেখাতেন। সেই সময় তিনি ন্যাশনাল অনার সোসাইটির সাথেও যুক্ত হন। ১৯৮৭ সালে শেরিল নবম স্থান অধিকার করে ৪.৬৪৬ সিজিপিএ নিয়ে কলেজ গ্রাজুয়েট হন।
১৯৮৭ সালে শেরিল হার্ভার্ড বিশ্ববিদ্যালয়ের অর্থনীতিতে বি.এ ভর্তি হন।সেখানে পড়াকালীন সময়ে তিনি এবং কয়েকজন মিলে “ওইমেন ইন ইকোনোমিক্স এ্যান্ড গভর্নমেন্ট” নামে একটি সংস্থা প্রতিষ্ঠা করেন। এই সংস্থার উদ্দেশ্য ছিলো সরকার এবং অর্থনীতি নিয়ে পড়াশোনায় মেয়েদের সংখ্যা বৃদ্ধি করা। ১৯৯১ সালে শেরিল গ্রাজুয়েট হন এবং গ্রাজুয়েটদের মধ্যে শীর্ষস্থান দখল করার পুরষ্কার স্বরূপ স্যার জন উইলিয়ামস্‌ পুরষ্কার অর্জন করেন।
শেরিল-হার্ভার্ড থেকে ডিগ্রী নেয়ার সময়।
শেরিল-হার্ভার্ড থেকে ডিগ্রী নেয়ার সময়।
হার্ভার্ডে শেরিলের থিসিস সুপারভাইজার এবং গুরু ছিলেন প্রফেসর ল্যারি সামার। ল্যারি সামারের গবেষণা-সহকারী হিসেবে হার্ভার্ডের পড়াশোনা শেষ করার পর বিশ্ব ব্যাংকে যোগদান করেন। বিশ্ব ব্যাঙ্কের অধীনে ভারতীয় স্বাস্থ্য প্রকল্পে শেরিল এক বছরের মত কাজ করেন।
১৯৯৩ সালে শেরিল আবার হার্ভার্ড বিজনেস স্কুলে ভর্তি হন এমবিএ করার জন্য। সেখান থেকে সর্বোচ্চ সম্মানসূচক উপাধি নিয়ে তিনি ১৯৯৫ সালে এমবিএ ডিগ্রী লাভ করেন।
এমবিএ ডিগ্রী অর্জন করার পর, ১৯৯৫ সালে শেরিল স্যান্ডবার্গ ব্যবস্থাপনা পরামর্শক হিসেবে ম্যাককিংসি এ্যান্ড কোম্পানিতে যোগদান করেন । সেখানে একবছর চাকরি করার পর তিনি আবার প্রফেসর ল্যারি সামারের সাথে ইউনাইটেড স্টেটস্‌ অফ দ্যা ট্রেজারির অধীনে তৎকালীন আমেরিকার প্রেসিডেন্ট বিল ক্লিনটনের কোষাগারের দায়িত্ব পালন করা শুরু করেন। সেখানে শেরিলের কাজ ছিল এশিয়ান অর্থনৈতিক সঙ্কটের সময় ঋণ গ্রহীতা দেশগুলো ঋণ মওকুফ করা। ২০০১ সালের জর্জ ডাব্লিউ বুশ প্রেসিডেন্ট হওয়ার আগ পর্যন্ত শেরিল এই ইউনাইটেড স্টেটস্‌ অফ দ্যা ট্রেজারির দায়িত্বে ছিলেন।
সরকারি চাকরী ছেড়ে দেবার পর শেরিল স্যান্ডবার্গ সিলিকন ভ্যালিতে চলে আসেন। তিনি চাচ্ছিলেন টেকনোলজিক্যাল কোন কোম্পানিতে যোগদান করতে। ২০০১ সালে শেরিল স্যান্ডবার্গ গুগল ইনকর্পোরেট-এ ভাইস প্রেসিডেন্ট হিসেবে যোগদান করেন। তিনি গুগলের মিশনকে বর্ণনা করেন “বিশ্বের সকল তথ্যকে সহজলভ্য করা। শেরিল গুগলের অনলাইন সেলস্‌ এ্যান্ড অপারেশন বিভাগের ভাইস প্রেসিডেন্ট হিসেবে ২০০৮ সাল পর্যন্ত কর্মরত ছিলেন।
২০০৭ সালের শেষের দিকে বড়দিনের এক পার্টিতে শেরিলের সাথে মার্ক জাকারবার্গের দেখা হয়। জাকারবার্গ সেসময় ফেসবুকের জন্য কোন সিওও এর প্রয়োজনীয়তা অনুভব করেননি, কিন্তু চিন্তা এই পদের জন্য যোগ্য হিসেবে শেরিলের কথাই তিনি চিন্তা করেছিলেন। ২০০৮ সালে, সুইজারল্যান্ডে ওয়ার্ল্ড ইকোনোমিক ফোরামে আবার শেরিল এবং জাকারবার্গের সাক্ষাৎ হয়। সেসময় মার্ক শেরিলকে ফেসবুকের একজন অভিভাবক হিসেবে যোগদান করার জন্য আমন্ত্রণ জানান। জাকারবার্গের আমন্ত্রণকে শেরিল স্যান্ডবার্গ আনন্দের সাথে গ্রহণ করে ফেসবুকে যোগদান করেন।
শেরিল ফেসবুকে যোগদানের পর ফেসবুককে লাভজনক করার দিকে বিশেষ মনোযোগ দেন। তিনি ফেসবুকের সেলস্‌, মার্কেটিং, ব্যবসায় উন্নয়ন, মানব সম্পদ, পাবলিক পলিসিসহ বিভিন্ন বিষয়ের প্রতি নজর দেন। ফলশ্রুতিতে ২০১০ সালের মধ্যে তিনি ফেসবুককে লাভজনক অবস্থায় নিতে সক্ষম হন।
২০১২ সালে শেরিল ফেসবুক পরিচালনা পরিষদের অষ্টম  এবং প্রথম নারী সদস্য হিসেবে নির্বাচিত হন।
২০১৩ সালের ১১ মার্চ শেরিল স্যান্ডবার্গের প্রথম বই “লিন ইনঃ উইমেন, ওয়ার্ক এ্যান্ড দ্যা উইল টু লিড” প্রকাশিত হয়। বইটি ২০১৩ সালের “বেষ্ট সেলার” যেটি ১ মিলিয়ন এর বেশি কপি বিক্রি হয়। বর্তমানে এই বইটির কাহিনীকে চলচিত্র করার চিন্তাভাবনা চলছে।  লিন ইন বইয়ে শেরিল বলেনঃ
“সত্যিকারের সমঅধিকারের বিশ্ব তখনই হবে যখন মেয়েরা দেশের এবং দেশের প্রতিষ্ঠানের অর্ধেক দায়িত্ব নিয়ে নিবে ও পুরুষেরা নিবে সংসারের কাজের অর্ধেক দায়িত্ব।”
শেরিল স্যান্ডবার্গ ১৯৯১ সালে ব্রিয়ান ক্র্যাফ নামক এক ব্যবসায়ীকে বিয়ে করলেও একবছর পরেই তাদের ডিভোর্স হয়ে যায়। পরে ২০০৪ সালে তিনি তৎকালীন ইয়াহো! এক্সিকিউটিভ ডেভ গোল্ডবার্গকে (পরবর্তীতে সার্ভেমাঙ্কির সিইও) বিয়ে করেন। এই দম্পতির একটি ছেলে এবং একটি মেয়ে রয়েছে।
স্বামী ডেভের সাথে শেরিল
স্বামী ডেভের সাথে শেরিল
শেরিল লিন ইন বইটিতে তাঁর স্বামী ডেভ সম্পর্কে বলেনঃ
“একজন মেয়ের জীবনের সবচেয়ে গুরুত্বপূর্ণ সিদ্ধান্ত হচ্ছে তাঁর জীবনসঙ্গী থাকবে কিনা এবং কে হবে সেই জীবনসঙ্গী। আমার জীবনের শ্রেষ্ঠ সিদ্ধান্ত হলো ডেভকে বিয়ে করা।”
২০১৫ সালের ১ মে ডেভ গোল্ডবার্গ মেক্সিকোতে পারিবারিক ছুটি কাটাতে গিয়ে হঠাৎ করেই মারা যান ।
শেরিল স্যান্ডবার্গ ২০১২ সালে টাইম ম্যাগাজিনের ১০০ জন প্রভাবশালীর তালিকায় আসেন । তিনি ফোর্বস ম্যাগাজিনের প্রভাবশালী নারী ব্যক্তিদের মধ্যেও জায়গা করে নেন। ফোর্বস ম্যাগাজিনের তথ্য অনুসারে শেরিল বর্তমানে ১.০৬ বিলিয়ন ইউএস ডলার সম্পত্তির মালিক। ফেসবুক ছাড়াও তিনি দ্যা ওয়াল্ট ডিজনি কোম্পানি, উইমেন ফর উইমেন ইন্টারন্যাশনাল, সেন্টার ফর গ্লোবাল ডেভেলপমেন্ট এবং ভি-ডে এর পরিচালনা পরিষদের সদস্য।
ঘরে বাইরে সবক্ষেত্রে সমান সফল হওয়া সত্ত্বেও শেরিলের সমালোচকের অভাব নেই। অনেক সমালোচকদের মতে তিনি অনেক অভিজাত জীবনযাপন করেন এবং কর্মক্ষেত্রে নারীদের সংগ্রাম করা ব্যাপারটি নিয়ে তিনি নিশ্চুপ থাকেন। ২০১৩ সালে টাইম ম্যাগাজিন শেরিল স্যান্ডবার্গকে তাদের প্রচ্ছদে স্থান দেয়। সেই টাইম ম্যাগজিনের শিরোনাম ছিলোঃ “তাকে ঘৃণা করো না, কারণ সে সফল”।
লেখক : তামান্না নিশাত রিনি।

লারাভেল ফ্রেমওয়ার্ক

লারাভেল অত্যন্ত জনপ্রিয় একটি ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্ক। এটি পিএইচপি প্রোগ্রামিং ল্যাংগুয়েজের মাধ্যমে লেখা হয়েছে।
প্রথমেই প্রশ্ন আসে ফ্রেমওয়ার্ক কী? যারা ওয়েব ডেভেলপমেন্টের সাথে জড়িত, তাদের প্রায় প্রত্যেকটা অ্যাপ্লিকেশন তৈরির সময়ই কিছু কমন জিনিস বার বার লিখতে হয়। যেমন, ইউজারের অথেনটিকেশন, সেসন হ্যান্ডেলিং, ক্যাশ-কুকি হ্যান্ডেলিং, ডেটাবেজ স্কিমা তৈরি করা, বিভিন্ন ডেটাবেজ অপারেশন ইত্যাদি। এখন যেহেতু এ কাজগুলো প্রায় প্রত্যেকটা অ্যাপ্লিকেশনেই করতে হয়, তাই ডেভেলপাররা একটা অ্যাপ্লিকেশন বয়েলারপ্লেট ব্যবহার করে, যেখানে আগে থেকেই এ কাজগুলো করা থাকে।  এটিই আসলে ফ্রেমওয়ার্ক নামে পরিচিত।
laravel-architecture-simple
লারাভেল আর্কিটেকচার
বিভিন্ন প্রোগ্রামিং ভাষার জন্য বিভিন্ন ফ্রেমওয়ার্ক রয়েছে, যেমন- পাইথনের জন্য জ্যাঙ্গো(Django), রুবির জন্য রুবি অন রেইলস, জাভার জন্য হাইবারনেট, স্প্রিং ইত্যাদি। পিএইচপি ল্যাংগুয়েজের জন্যও অনেকগুলো ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্ক রয়েছে, যেমন- কোডইগনিটার, লারাভের, সিম্ফোনি, জেন্ড ফ্রেমওয়ার্ক, ফ্যালকন, ই(Yii) ইত্যাদি। এগুলো সবই জনপ্রিয় ফ্রেমওয়ার্ক। এগুলো ছাড়াও প্রচুর ফ্রেমওয়ার্ক আছে পিএইচপিতে যেগুলো আসলে ততটা জনপ্রিয় নয়।
এখন কথা হচ্ছে, এতগুলো ফ্রেমওয়ার্ক মধ্যে আমরা কোনটা শিখবো? এক্ষেত্রে আমার পরামর্শ হচ্ছে লারাভেল শেখা। যদিও লারাভেল তুলনামূলক নতুন ফ্রেমওয়ার্ক, তবুও এর অসাধারণ কিছু বৈশিষ্ট্য রয়েছে, যার কারনে খুব অল্পদিনের মধ্যেই লারাভেল জনপ্রিয়তার শীর্ষে চলে এসেছে। জনপ্রিয় ডেভেলপার ম্যাগাজিন, সাইটপয়েন্ট এর জরিপে ২০১৫ সালের সেরা ফ্রেমওয়ার্ক নির্বাচিত হয়েছে লারাভেল।
সেরা ফ্রেমওয়ার্ক লারাভেল
সেরা ফ্রেমওয়ার্ক লারাভেল
চলুন একনজরে চোখ বুলিয়ে নেই লারাভেলের কিছু উল্লেখযোগ্য বৈশিষ্ট্য –
– লারাভেল মডার্ন পিএইচপির ফিচারগুলো ব্যবহার করে তৈরি করা হয়েছে। লারাভেল তৈরি করা হয়েছে কম্পোজার নামক ডিপেন্ডেন্সি ম্যানেজারের উপর ভিত্তি করে। পিএইচপি কমিউনিটিতে উল্লেখযোগ্য প্যাকেজগুলো যেমন- কার্বন, সিম্ফোনী এইচটিটিপি ফাউন্ডেশন, মনোলগ, ফ্লাইসিস্টেম, সুইফটমেইলার ইত্যাদি ব্যবহার করে লারাভেল তৈরি করা হয়েছে।
– লারাভেলে অত্যন্ত শক্তিশালী একটা কমান্ড লাইন টুল আছে যার নাম আর্টিসান। এর মাধ্যমে কোড জেনারেট, এনভায়রনমেন্ট পরিবর্তন, টেস্টিং, ডেপ্লয়মেন্টসহ বহু কাজ কমান্ড লাইন থেকেই করে ফেলা যায়।
– ডেটাবেজ স্কিমা তৈরি, পরিবর্তন, এবং ডেটাবেজ প্রিপপুলেটেড ডেটা দেয়ার জন্য রয়েছে চমৎকার মাইগ্রেশন এবং সিডিং এপিআই।
– লারাভেলের রয়েছে অত্যন্ত সহজ এবং সুন্দর সিনট্যাক্স যা সহজেই মনে রাখা যায়।
– লারাভেল রয়েছে অত্যন্ত চমৎকার রাউটিং লাইব্রেরি, যা সিম্ফোনির রাউটিং কম্পোনেন্টের উপর ভিত্তি করে তৈরি করা। এটি রেস্টফুল রাউটিং সাপোর্ট করে।
– লারাভেলে রয়েছে অত্যন্ত চমৎকার কোয়েরি বিল্ডার এবং অবজেক্ট রিলেশনার ম্যাপার(ORM) লাইব্রেরি। এই ওআরএম ইলোকোয়েন্ট নামে পরিচিত। এটি একটিভ রেকর্ডস প্যাটার্ন অনুসরণ করে তৈরি করা হয়েছে। এটি বাই-ডিফল্ট মাইসিক্যুয়েল, সিক্যুয়ালাইট, পোস্টগ্রেস এবং মাইক্রোসফটের সিক্যুয়েল সার্ভার সাপোর্ট করে। এছাড়া কম্পোজার প্যাকেজের মাধ্যমে আপনি অন্যান্য স্কিমালেস নোসিক্যুয়াল ডেটাবেজ যেমন মংগোডিবিও ব্যবহার করতে পারবেন।
– লারাভেলে রয়েছে খুবই চমৎকার কিউ সিস্টেম। এর মাধ্যমে আপনি আপনার যে কোন প্রসেসকে ব্যাকগ্রাউন্ডে পাঠিয়ে ইউজার ইন্টারঅ্যাকশন বাড়িয়ে আপনার অ্যাপ্লিকেশনকে আরো বেশি কার্যকর করতে পারবেন।
– লারাভেলে আপনি খুব সহজেই ইমেইল পাঠাতে পারবেন। এটি ইমেইল পাঠানোর জন্য জনপ্রিয় সুইফটমেইলার লাইব্রেরি ব্যবহার করে।
– রেস্টফুল এপিআই তৈরির জন্য লারাভেল একদম পারফেক্ট। এটি যে কোন ডেটাবেজ কোয়েরি, পিএইচপি এরে বা অবজেক্ট অটোমেটিক জেসনে রিটার্ন করতে পারে। সিঙ্গেল পেজ অ্যাপ্লিকেশন তৈরির জন্য লারাভেল হবে বেস্ট চয়েস।
– লারাভেলে রয়েছে অত্যন্ত চমৎকার টেমপ্লেটিং লাইব্রেরি যেটার নাম ব্লেড। এটির চমৎকার এক্সপ্রেসিভ সিনট্যাক্স আপনার এইচটিএমএল কোডকে সুন্দর এবং রিডেবল করবে।
– লারাভেলের রয়েছে ফ্রন্টএন্ড রিসোর্স ম্যানেজ করার জন্য ইলিক্সির নামে চমৎকার একটি ইউটিলিটি টুল। এর মাধ্যমে আপনি আপনার সিএসএস, জাভাস্ক্রিপ্ট ফাইলগুলোকে আরো সুন্দরভাবে ম্যানেজ করতে পারবেন।
– লারাভেলের আছে খুবই সুন্দর এবং বিশাল একটি কমিউনিটি। আপনি বিভিন্ন টিউটোরিয়াল, ভিডিও পাবেন এর উপর। এছাড়া কোন সমস্যায় পড়লে আপনি গুগলে সার্চ করলেই সমাধান পেয়ে যাবেন।
– লারাভেলের চাকুরির বাজারে খুব কদর আছে। আপনি লারাভেল শিখলে চাকুরি পেতে পারবেন খুব সহজেই।
তাহলে আর দেরি কেন? এক্ষুনি শুরু করে দিন লারাভেল শেখা।
লেখক : নুরুজ্জামান মিলন, লারাভেল পিএচইপি ফ্রেমওয়ার্ক বইটির লেখক।

লিনাস টরভাল্ডস্

লিনাক্স– একটি শক্তিশালী এবং নির্ভরযোগ্য অপারেটিং সিস্টেমের নাম। ১৯৯১ সালে ইউনিক্স ভিত্তিক অপারেটিং সিস্টেম “মিনিক্স” নিয়ে ঘাঁটাঘাঁটি করতে করতে ফিনল্যান্ডের হেলসিংকি বিশ্ববিদ্যালয়ের কম্পিউটার বিজ্ঞানের দ্বিতীয় বর্ষের এক ছাত্র তৈরি করে ফেলে একটি অপারেটিং সিস্টেম কার্নেল। সেই ছাত্রের নাম লিনাস টরভাল্ডস্‌।
লিনুস টরভাল্ডস্‌
লিনাস টরভাল্ডস্‌
লিনাস বেনেডিক্ট টরভাল্ডস্‌ ১৯৬৯ সালের ২৮ ডিসেম্বর ফিনল্যান্ডের হেলসিংকি শহরে  সাংবাদিক বাবা-মার পরিবারে জন্মগ্রহণ করেন। নোবেল পুরষ্কার বিজয়ী তাত্ত্বিক রসায়নবিদ লিনাস পাউলিং এর নামানুসারে তাঁর নামকরণ করা হয় লিনাস। নিজের নাম রাখা প্রসঙ্গে তিনি বলেনঃ
 “আমার মনে হয় আমার নাম বিজ্ঞানী লিনাস এবং কার্টুন চরিত্র পিনাটস্‌ এই দুটো মিলিয়ে রাখা হয়েছে, যেটি আমাকে একই সাথে নোবলে পুরষ্কার বিজয়ী রসায়নবিদ এবং কম্বলবাহী কার্টুন চরিত্রে পরিণত করেছে।”
লিনাসের পরিবারের বেশিরভাগ সদস্যই ছিলেন সাংবাদিকতা পেশায় নিয়োজিত। লিনাসের বাবা নীলস্‌ টরভাল্ডস্‌ বেতার সাংবাদিকতার সাথে যুক্ত ছিলেন এবং তাঁর মা অ্যানা টরভাল্ডস্‌ ফিনল্যান্ডের একটি সংবাদপত্রের অনুবাদক ও সংবাদ গ্রাফিক্সের সাথে যুক্ত ছিলেন। লিনাসের বাবা-মা দুজনেই ১৯৬০-এর দশকে হেলসিঙ্কি বিশ্ববিদ্যালয় ক্যাম্পাসে প্রগতিশীল রাজনীতিতে জড়িত ছিলেন। বাবা-মা ছাড়াও লিনাসের দাদা ছিলেন ফিনল্যান্ডের একটি সংবাদপত্রের প্রধান সম্পাদক এবং চাচা ছিলেন টিভি সাংবাদিকতার সাথে যুক্ত। যদিও তাঁদের পরিবার ফিনল্যান্ডের সুইডিশ ভাষী সংখ্যালঘু জনগোষ্ঠীর অংশ যারা ফিনল্যান্ডের জনসংখ্যার মাত্র ৫.৫%।
আর দশটা বাচ্চার মতই আনন্দে কাটছিলো লিনাসের রঙিন শৈশব। তাঁর যখন দশ বছর বয়স তখন তাঁর বাবা-মার বিবাহবিচ্ছেদের কারণে তাঁর শৈশব কিছুটা ম্লান হয়ে যায়। বাবা-মায়ের বিচ্ছেদের পর লিনাস মায়ের সাথে চলে আসেন তাঁর নানার বাড়িতে। সেই নানার বাড়িতেই ছোট্ট লিনাসের প্রথম পরিচয় হয় কম্পিউটারের সাথে।
লিনাসের নানা, হেলসিংকি বিশ্ববিদ্যালয়ের পরিসংখ্যানের অধ্যাপক লিও টরেংভেস্ট, সেইসময় শিশু লিনাসের উপর সবচেয়ে বেশি প্রভাব বিস্তার করেন। ১৯৭০ সালের মাঝামাঝি সময়ে টরেংভেস্ট কমোডর ভিক-২০ নামক পারসোনাল কম্পিউটার কিনে নিয়ে আসেন। ছোট্ট লিনাস সেটি নিয়ে সময় কাটানো শুরু করে। কিন্তু খুব কম সংখ্যক প্রোগ্রাম থাকার কারণে লিনাসের সেই কম্পিউটারের প্রতি খুব দ্রত আগ্রহ উবে যায়। সেই সময় লিনাস চিন্তা করলেন, এই কম্পিউটারের জন্য কিছু নতুন প্রোগ্রাম বানালে কেমন হয়? যেই ভাবা সেই কাজ। বেসিক (BASIC) নামক প্রোগ্রামিং ভাষায় লিনাস কমোডর ভিক-২০ এর জন্য প্রথম সফল প্রোগ্রাম লিখে ফেললেন। তখন তাঁর বয়স মাত্র ১১ বছর। তারপর লিনাস শুরু করলেন কঠিন কিন্তু অত্যন্ত শক্তিশালী এ্যাসেম্বলি ভাষায় প্রোগ্রাম লেখার কাজ। সেই থেকে প্রোগ্রামিং এবং গণিত হয়ে উঠলো লিনাস টরভাল্ডস্‌ এর নেশা।
টরভাল্ডস্‌ এর শখ ছিল নিজের একটি কম্পিউটারের। নিজের শখ পূরণের জন্য ১৯৮৭ সালে তাঁর জমানো টাকা দিয়ে তিনি তাঁর প্রথম কম্পিউটার সিনক্লেয়ার কিউএল (Sinclair QL) কিনেন। কিন্তু এটির প্রতিও তিনি খুব দ্রুত আগ্রহ হারিয়ে ফেলেন কারণ এটি পুনরায় প্রোগ্রাম করা সম্ভব ছিলো না এবং এই কম্পিউটারের দরকারি সফট্‌ওয়্যারও ফিনল্যান্ডে সহজলভ্য ছিলো না।
ফিনল্যান্ডের স্কুল-কলেজের পড়াশোনার পার্ট শেষ করে, বাবা-মার পদাঙ্ক অনুসরণ করে লিনাস টরভাল্ডস্‌ ১৯৮৮ সালে কম্পিউটার বিজ্ঞানে ইউনিভার্সিটি অফ হেলসিংকি-তে ভর্তি হন। কিন্তু প্রথম বর্ষের পরই তাঁর বিশ্ববিদ্যালয়ের পড়াশোনায় কিছুটা ছেদ পরে। ফিনল্যান্ডের প্রতিটি নাগরিকের মিলিটারি প্রশিক্ষণ নেয়া বাধ্যতামূলক হওয়ার  প্রথম বর্ষের পর ১৯৮৯ সালে লিনাস সেই প্রশিক্ষণ নেয়ার জন্য ফিনিস আর্মির “উজিমা” ব্রিগেডে যোগদান করেন। ক্ষেপণাস্ত্র সম্পর্কীয় হিসাবের সাথে তিনি সেই ব্রিগেডে যুক্ত থেকে ১১ মাসের প্রশিক্ষণ শেষে সেকেন্ড ল্যাফটেনেন্ট পদ অর্জন করেন। সেই সময় লিনাস, প্রফেসর এ্যান্ড্রু ট্যানেনবামের লেখা অপারেটিং সিস্টেমঃ ডিজাইন এন্ড ইমপ্লিমেন্টেশন বইটি কিনে শখের বসে পড়া শুরু করেন। বইটিতে ইউনিক্স অপারেটিং সিস্টেমের ছোট্ট ভার্সন মিনিক্স নিয়ে বিস্তারিত আলোচনা ছিলো। এই বইটি লিনাসের জীবনে আমূল পরিবর্তন নিয়ে আসে। ইউনিক্সের খুঁটিনাটি জানতে পেরে তিনি মুগ্ধ হন।
যুবক লিনুস
যুবক লিনাস
১৯৯০ সালে লিনাস আবার কম্পিউটার বিজ্ঞানের একাডেমিক পড়াশোনায় ফিরে আসেন। তিনি হেলসিংকি বিশ্ববিদ্যালয় থেকে স্নাতক এবং স্নাতকোত্তর ডিগ্রী অর্জন করেন। লিনাসের স্নাতকোত্তরের গবেষণার শিরোনাম ছিল লিনাক্স- অ্যা পোর্টেবল অপারেটিং সিস্টেম। ধারণা করা হয় এই বিশ্ববিদ্যালয়ে তিনি ১৯৮৮ থেকে ১৯৯৬ সাল পর্যন্ত পড়াশোনা করেছেন।
১৯৯১ সালের প্রথমদিক লিনাস আইবিএম এর ইন্টেল ৩৮৬ প্রসেসরসমৃদ্ধ একটি পারসোনাল কম্পিউটার ক্রয় করেন। ইন্টেলের আগের অন্য সব চিপস্‌ এর থেকে এটির চিপস্‌ অনবদ্য হওয়ার কারণে লিনাসের মনে জায়গা করে নেয় এই কম্পিউটারটি। এই কম্পিউটারের জন্য মিনিক্স কপি পাওয়ার আগে কয়েক সপ্তাহ প্রিন্স অব পারসিয়া খেলে কাটান তিনি যেটি তাঁকে পরবর্তীকালে লিনাক্স নিয়ে কাজ শুরু করতে সাহায্য করেছিল। কিন্তু এমএস ডস অপারেটিং সিস্টেম এই কম্পিউটারে থাকার  কারণে লিনাস হতাশ হন। তিনি ঠিক করেন ইউনিক্সের নতুন ভার্সন তৈরি করে তিনি তাঁর কম্পিউটারের জন্য ব্যবহার করবেন।
নতুন একটি অপারেটিং সিস্টেম তৈরি করতে যেয়ে লিনাস পড়লেন বিপদে। তিনি ৫০০০ ডলারের নিচে কোন অপারেটিং সিস্টেমের মূল অংশটুকুও পেলেন না। তখন লিনাস সিদ্ধান্ত নিলেন তাঁর নতুন অপারেটিং সিস্টেমটি হবে মিনিক্স এবং ইউনিক্সের মিশেলে তৈরি।
১৯৯১ সালে ইউনিভার্সিটি অফ টেকনোলজিতে লিনাস এবং মুক্ত সফট্‌ওয়্যার আন্দোলনের গুরু রিচার্ড স্টলম্যানের সাক্ষাৎ হয়। সেখান থেকেই লিনাস স্টলম্যানের গনু প্রকল্পে কাজ করা শুরু করেন। তাঁর লিনাক্স কার্নেল ভার্সনের জন্য তিনি স্টলম্যানের জেনারেল পাবলিক লাইসেন্স ব্যবহার করেন এবং গনু কম্পাইলার কালেকশনের সোর্স কোডও লেখেন।
১৯৯৭ সালে লিনাস ফিনল্যান্ড থেকে ক্যালিফোর্নিয়ায় চলে আসেন। সেখানে ট্রান্সমেটা কর্পোরেশানে তিনি ২০০৩ সাল পর্যন্ত কর্মরত ছিলেন। পরবর্তীতে সেখান থেকে তিনি ওপেন সোর্স ডেভেলপমেন্ট ল্যাবে যোগ দেন, যেটি পরে ফ্রি স্টান্ডার্ড গ্রুপের সাথে যুক্ত হয়ে লিনাক্স ফাউন্ডেশনে রূপ নেয়।
এমআইটি টেকনোলজি রিভিউ টিআর১০০ ১৯৯৯ সালে লিনাস টরভাল্ডস্‌-কে বিশ্বের ১০০ জন আবিষ্কারকের মধ্যে প্রথম হিসবে সম্মানিত করে।
২০০৫ সালের ৩ এপ্রিল লিনাস এবং লিনাক্স কার্নেলের ডেভেলপাররা মিলে “গিট” নামক ডিস্ট্রিবিউটেড রিভিশন কন্ট্রোল সিস্টেম উদ্ভাবন করেন।
১৯৯৩ সালে টভ নামের এক জাতীয় কারাটে চ্যাম্পিয়ানের সাথে লিনুসের পরিচয় হয়। পরবর্তীতে তাঁরা বিয়ে করেন। বর্তমানে লিনাস এবং টভ তিন কন্যাসন্তানের জনক-জননী।
ব্যক্তিগত জীবনে লিনাস টরভাল্ডস্‌ নিরিবিলি থাকতেই পছন্দ করেন। তাই ক্যালিফোর্নিয়ার সিলিকন ভ্যালি ছেড়ে পরিবার নিয়ে তিনি এখন বসবাস করেন পোর্টল্যান্ডে। তাঁর ভাষ্যমতে পোর্টল্যান্ডের পরিবেশ তাঁর শৈশবের হেলসিংকি শহরের মত।
লিনাসের ব্যাক্তিগত মাসকট হচ্ছে একটি পেঙ্গুইন যার ডাকনাম টাক্স, যেটি লিনাক্স কার্নেলের মাসকট হিসেবে লিনাক্স সম্প্রদায়ের কাছে ব্যাপকভাবে গ্রহনযোগ্যতা পেয়েছে।
অনেক ওপেন সোর্স আইকনের থেকে ভিন্নতাস্বরূপ লিনাস সব সময় নিজেকে আড়ালে রাখেন এবং অন্যান্য প্রতিযোগী সফটওয়্যার পণ্য নিয়ে মতামত দান থেকে সবসময় দূরে থাকেন। যদিও টোরভাল্ডস বিশ্বাস করেন যে “সফটওয়্যার তৈরির সর্বোত্তম পন্থা হচ্ছে মুক্ত সফটওয়্যার পদ্ধতি”। তারপরও মালিকানাভিত্তিক সফটওয়্যার হলেও তিনি কাজের জন্য সবথেকে ভাল টুলস ব্যবহার করেন । এজন্যই লিনাক্স কার্নেলে মালিকানাভিত্তিক ভার্সন কন্ট্রোল সফটওয়্যার বিটকিপার ব্যবহার এবং তার পক্ষাবলম্বনের জন্য তিনি সমালোচিত হয়েছেন।  লিনুসের একটি হলুদ রঙের মার্সিডিজ গাড়ি আছে, যেটির পিছনে লেখা “মিঃ লিনাক্স কিং অফ গিকস্‌”।
লিনুসের গাড়ির লাইসেন্স প্লেট
লিনুসের গাড়ির লাইসেন্স প্লেট
অরিগনের ওপেন সোর্স ডেভেলপমেন্ট গবেষণাগারে লিনাক্স কার্নেল নিয়ে তাঁর গবেষণা করেই  কাটছে লিনুস টরভালডস্‌ এর  বর্তমান দিন।
লেখক : তামান্না নিশাত রিনি।