সিজার সাইফার

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

ওপরের চিত্রে আমরা দেখতে পাচ্ছি, মূল টেক্সট (Plaintext)-কে এনক্রিপ্ট করলে তাকে বলে সাইফারটেক্সট (Ciphertext). আর সাইফারটেক্সট ডিক্রিপ্ট করলে আমরা আবার মূল টেক্সট অর্থাৎ প্লেইনটেক্সট পাই।

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

সিজার সাইফার পদ্ধতিতে একটি টেক্সটের সঙ্গে একটি সংখ্যা দেওয়া হয়, যাকে কি (key) বলা হয়। কি-এর মান যত, টেক্সটের অক্ষরগুলো তত ঘর পরের অক্ষর দিয়ে বদলে দেওয়া হয়। যেমন, কি-এর মান যদি 2 হয়, তখন abc-কে লেখা হবে cde (a-এর জায়গায় c, b-এর জায়গায় d, c-এর জায়গায় e)। এই কি এর মান কেবল প্রেরক ও প্রাপক জানে, যার ফলে অন্য কেউ এই টেক্সটের মর্মোদ্ধার করতে পারে না। যদিও বর্তমান প্রেক্ষিতে এটি অত্যন্ত দুর্বল একটি অ্যালগরিদম, কিন্তু ঐতিহাসিক প্রেক্ষাপট বিবেচনা করলে এটি অত্যন্ত গুরুত্বপূর্ণ এবং কম্পিউটার বিজ্ঞানের শিক্ষার্থীদের জন্য এটি অবশ্যপাঠ্য।

ধরা যাক, প্লেইনটেক্সট হচ্ছে Kill the King. আর কি হচ্ছে 1. তাহলে প্রতিটি অক্ষর ইংরেজি বর্ণমালায় তার পরবর্তী অক্ষর দিয়ে বদলে দেওয়া হবে। তখন সাইফারটেক্সট হবে Ljmm uif Ljoh. আবার কেউ যদি জানে যে কি-এর মান হচ্ছে 1, তখন সে সহজেই সাইফারটেক্সট থেকে প্লেইনটেক্সট বের করে ফেলতে পারবে।

এখন কেউ যদি এতদূর পড়ার পরে নিজেই একটি প্রোগ্রাম লিখে কাজটি করতে চায়, তার জন্য দ্বিমিক অনলাইন জাজে দুটি সমস্যা আছে –

সমস্যাগুলো সি, সিপ্লাস প্লাস, জাভা কিংবা পাইথন ব্যবহার করে সমাধান করা যাবে।

Facebook Comments

আপনার সন্তানকে কীভাবে গণিতে দক্ষ করে গড়ে তুলবেন

গণিতের দক্ষতা নিঃসন্দেহে ভালো, তবে গণিতের দক্ষতা ও সমস্যা সমাধানের দক্ষতার মধ্যে বিস্তর ফারাক রয়েছে।

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

গণিতের দক্ষতা ও সমস্যা সমাধানের দক্ষতার মধ্যে পার্থক্য কী?

আমি যদি বাংলাদেশে প্রাথমিক বিদ্যালয়ের একটি শিশুকে জিজ্ঞাসা করি, ৩৬৫-কে ৭ দিয়ে ভাগ করলে কত হবে, শিশুটি সঙ্গে সঙ্গে আমাকে ভাগফল ও ভাগশেষ বলে দিতে পারে। কিন্তু যদি জিজ্ঞাসা করি যে, এক বছরে কয়টি সপ্তাহ আছে, তখন সে প্রশ্ন বুঝতে পারে না। যদিও সে জানে যে ৩৬৫ দিনে এক বছর এবং সাত দিনে এক সপ্তাহ হয়।

প্রথম প্রশ্নটির উত্তর দিতে গণিতের দক্ষতা লাগে। দ্বিতীয়টির ক্ষেত্রে লাগে সমস্যা সমাধানের দ্ক্ষতা। এটি একটি সাধারণ উদাহরণ, আশা করি এ থেকে গণিতের দক্ষতা ও সমস্যা সমাধানের দক্ষতার পার্থক্য পরিষ্কার হয়ে গেছে।

আমাদের কোনটায় জোর দেওয়া উচিত—গণিত নাকি সমস্যা সমাধানের দক্ষতায়?

এর উত্তর হচ্ছে ‘দুটোই’। গণিত হচ্ছে সমস্যা সমাধানের একটি টুল (tool) বা যন্ত্র। আপনি যখন আপনার সন্তানকে স্কুলে যোগ, বিয়োগ, গুণ ও ভাগ শেখান, সেই সময় তাকে সমস্যা সমাধানের সঙ্গেও পরিচয় করিয়ে দিন।

শিশুকে কীভাবে সমস্যা সমাধানের সঙ্গে পরিচয় করিয়ে দেওয়া যায়?

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

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

দৈনন্দিন কার্যক্রমের মাধ্যমে সমস্যা সমাধান শেখানোর উদাহরণ

আমি এখানে কিছু উদাহরণ দিলাম।

  • একটি কলার দাম ৪ টাকা ও একটি পেয়ারার দাম ৫ টাকা হলে ঝুড়ির কলা ও পেয়ারার দাম কত? [ঝুড়িতে সত্যি সত্যি ২টি কলা ও ৪টি পেয়ারা রেখে আপনার বাচ্চাকে প্রশ্নটি করতে পারেন। অবস্থাভেদে প্রশ্নটি পরিবর্তন করে নিন।]
  • বাচ্চার পছন্দের প্রাণিদের নিয়ে প্রশ্ন তৈরি করুন। ধরা যাক, আমার বাচ্চা হাতি পছন্দ করে। আমি তাকে জিজ্ঞাসা করতে পারি যে, রাঙামাটির বনে ৫০ সদস্যের একটি হাতির দল বসবাস করতো। সেখান থেকে অর্ধেক হাতি বান্দরবান চলে গেল। খাগড়াছড়ি থেকে ১০টি হাতি রাঙামাটি গেল। রাঙামাটিতে এখন কয়টি হাতি আছে?
  • খাদ্যের ক্যালরি গণনা করতে দেওয়া একটি ভালো সমস্যা হতে পারে। এটি গাণিতিক সমস্যা সমাধানকে স্বাস্থ্যকর জীবনযাপনের সাথে যুক্ত করবে। যেমন: একবাটি ভাতে কতটুকু ক্যালরি রয়েছে, এ রকম সামান্য একটু গবেষণা বাচ্চার জন্য অনেক আনন্দদায়ক হতে পারে। বাচ্চাকে জিজ্ঞাসা করতে পারেন যে সে আজ কতটুকু ক্যালরি গ্রহণ করেছে।

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

সমস্যা সমাধান ও বিশ্লেষণী ক্ষমতা

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

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

প্রাথমিক গণিত-সংশ্লিষ্ট সমস্যা সমাধানের ধাপ

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

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

শিশুদের গণিত শেখানোর সময় সবচেয়ে বড় যে ভুলটি আমরা করি

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

শিশুর ভেতরে সমস্যা সমাধানের দক্ষতা তৈরির জন্য কিছু টিপস

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

—ড. শাহরিয়ার হোসেন

মূল লেখা – https://computing4all.com/education/the-biggest-mistake-while-teaching-kids-math/, অনুবাদ করেছেন মোশারফ হোসেন।

Facebook Comments

এসকিউলাইট – সহজ ডেটাবেজ

সহজ ডেটাবেজ এসকিউলাইট!

এসকিউলাইট (SQLite) হচ্ছে একটি রিলেশনাল ডেটাবেজ। সেই সঙ্গে এটি ফ্রি ও ওপেন সোর্স। ২০০০ সালে ডক্টর রিচার্ড হিপ এটি তৈরি করেন। এসকিউলাইট তৈরিতে সি প্রোগ্রামিং ভাষা ব্যবহার করা হয়েছে।

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

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

এসকিউলাইটের সবচেয়ে বড় সুবিধা হচ্ছে এটির ব্যবহার বেশ সহজ-সরল আর ইনস্টল করাও খুব সহজ। এটি ক্লায়েন্ট-সার্ভার আর্কিটেকচারে তৈরি করা হয় নি, তাই সফটওয়্যারের সঙ্গে এটি দিয়ে দেওয়া যায় সহজেই।

এসকিউলাইটে রিলেশনাল ডেটাবেজের প্রায় সকল বৈশিষ্ট্যই রয়েছে এবং এসকিউএল (Structured Query Language)-এর অধিকাংশ জিনিসই এখানে ব্যবহার করা হয়েছে। তাই এটি ব্যবহার করার পর কেউ যদি অন্য ডেটাবেজের ব্যবহার শিখতে চায়, তখন তার বিপদে পড়তে হবে না।

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

এসকিউলাইট ব্যবহার করতে হলে যে টার্মিনালে (কমান্ড লাইনে) ব্যবহার করতে হবে, এমন কোনো কথা নেই। অনেক ডেস্কটপ অ্যাপ্লিকেশন দিয়ে এটি ব্যবহার করা যায় (যেমন – https://sqlitebrowser.org/)।

ডেটাবেজ শেখার সময়, “মশা মারতে কামান দাগার” মতো ওরাকল বা বিশাল কোনো ডেটাবেজ সফটওয়্যার ব্যবহার না করে এসকিউলাইট ব্যবহার করলেই ডেটাবেজ শেখাটা সহজ ও কার্যকর হবে। পরবর্তী সময়ে প্রফেশনাল কাজে অন্য কিছু শেখার দরকার পড়লে সেসময় শিখে নেওয়া যাবে।

Facebook Comments

গো (Go) প্রোগ্রামিং ভাষা

গো (বা গোল্যাঙ্গ) হচ্ছে গুগলের তৈরি একটি প্রোগ্রামিং ভাষা।

গো হচ্ছে গুগলের তৈরি একটি ওপেনসোর্স প্রোগ্রামিং ভাষা। গো (Go) নামটি বেশ কমন হওয়ায় একে গোল্যাঙ্গ (Golang)ও বলা হয়। ২০০৯ সালের নভেম্বর মাসে গো প্রথম রিলিজ করা হয়।

আমি এই প্রোগ্রামিং ভাষার নাম আগে জানলেও কখনও নিজে থেকে ঘাঁটাঘাঁটি করা হয় নি। ২০১৫ সালের মাঝামাঝি যখন সিঙ্গাপুরের গ্রাব (Grab)-এ যোগ দিই, তখন দেখলাম, এখানে ব্যাকএন্ডে গো হচ্ছে মূল প্রোগ্রামিং ভাষা। তার আগো নোডজেএস (Node.JS) ব্যবহার করা হত। যাই হোক, তখন গো শেখা শুরু করলাম। আস্তে-আস্তে জানতে পারলাম যে, বিশ্বের আরো অনেক বড় বড় কোম্পানী (যেমন উবার) তাদের ব্যাকএন্ডে গো ব্যবহার করে। গত চার বছরে ওয়েব-ভিত্তিক সফটওয়্যার তৈরিতে গো-এর ব্যবহার আরো অনেক বেড়েছে। আর গুগল নিজেও এই ভাষা ব্যবহার করছে অনেক জায়গায়।

গো কেন জনপ্রিয় হয়ে উঠছে?

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

গো কেন শিখব?

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

গো কিভাবে শিখব?

আমি ধরে নিচ্ছি, যে গো শিখবে, সে ইতিমধ্যে কমপক্ষে একটি প্রোগ্রামিং ভাষায় কয়েকবছর কাজ করেছে।

প্রথমেই গো ট্যুরের ওয়েবসাইটে গিয়ে ট্যুর শেষ করে ফেলতে হবে। এটি শুরু করার জন্য চমৎকার।

তারপরে বই পড়তে চাইলে Go Programming Language বইটি পড়া যেতে পারে। বইটে বেশ ভালো এবং আমার মতে পড়া উচিত।

এখন, কেউ যদি অনলাইন কোর্স করতে স্বাচ্ছন্দবোধ করে, তাহলে কোর্সেরাতে গো-এর তিনটি কোর্স আছে, সেগুলো করে ফেলতে হবে। এই কোর্সগুলো আমি করেছি, ভালোই লেগেছে।

এরপর Go by Example ওয়েবসাইটে গিয়ে প্রতিটি উদাহরণ পড়ে বুঝতে হবে এবং সঙ্গে সঙ্গে কোড করতে হবে। দেখে কোড করলেও সমস্যা নেই, চর্চাটা তো হবে।

এরপর Effective Go পড়তে হবে। এটি পড়ার সময় ঘুম আসে, তাও পড়তে হবে। এটি ঠিকঠাক পড়ার পরে গো-তে কাজ শুরু করে দেওয়া যাবে।

কারো কারো মনে হতে পারে, একটা সহজ-সরল প্রোগ্রামিং ভাষা শেখার জন্য এত কষ্ট করব? আসলে একটু কষ্ট করে ভালোভাবে শিখে নিলে কাজের মান অনেক ভালো হবে, আর সেটা খুব গুরুত্বপূর্ণ। তাই ভালোভাবে শেখাই ভালো।

Facebook Comments

কম্পিউটার বিজ্ঞান ও প্রোগ্রামিং নিয়ে প্রচলিত কিছু ভুল ধারণা

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

এই আর্টিকেলে আমি প্রোগ্রামিং ও কম্পিউটার বিজ্ঞান সংশ্লিষ্ট কিছু ভুল ধারণা উপস্থাপন ও ব্যাখ্যা করব।

ভুল ধারণা ১: প্রোগ্রামিং শিখতে চাইলে গণিতে খুব দক্ষ হতে হবে

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

ভুল ধারণা ২: বিজ্ঞান বা প্রকৌশল বিষয়ে না পড়লে প্রোগ্রামিং শেখা যায় না

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

ভুল ধারণা ৩: প্রোগ্রামিং ভাষা জানলেই মোটা অঙ্কের টাকা কামানো যায়

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

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

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

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

ভুল ধারণা ৪: কম্পিউটার বিজ্ঞান একটি জটিল বিষয়

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

ভুল ধারণা ৫: প্রোগ্রামিং শুধু ছেলেদের জন্য

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

ভুল ধারণা ৬: কম্পিউটার বিজ্ঞান পড়লেই গেম তৈরি করতে পারব

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

এক নজরে ধারণাগুলো:

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

ড. মাহমুদ শাহরিয়ার হোসেন (সহকারী অধ্যাপক, ইউনিভার্সিটি অব টেক্সাস এট এল পেসো)-এর মূল লেখাটি পাওয়া যাবে এখানে https://bit.ly/2ENReAp। লেখাটি অনুবাদ করেছেন মোশারফ হোসেন।

Facebook Comments

সি শেখার গাইডলাইন!

বাংলা ভাষায় সি প্রোগ্রামিং ভাষা দিয়ে প্রোগ্রামিং শেখার গাইডলাইন

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

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

তারপর সি শেখা শুরু করতে হবে। প্রোগ্রামিংয়ে যারা একেবারেই নতুন, তাদের জন্য আমি “কম্পিউটার প্রোগ্রামিং ১ম খণ্ড” নামে একটি বই লিখেছি। এখানে জটিল-কঠিন-ভয়াবহ জিনিসগুলো বাদ দিয়ে বরং মৌলিক জিনিসগুলোর ওপর জোর দেওয়া হয়েছে। আশা করি, বইটি কেউ যদি দুইবার করে পড়ে ফেলে, তাহলে তার বেসিক শক্ত হয়ে যাবে। বইটি রকমারি ডট কম থেকে অর্ডার করা যাবে, এছাড়া আর কোথা থেকে পাওয়া যাব সেটি জানা যাবে দ্বিমিক প্রকাশনীর ওয়েবসাইটে। আবার বইটি ইন্টারনেটে ফ্রিও পড়া যাবে, cpbook.subeen.com ওয়েবসাইট থেকে।

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

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

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

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

প্রবলেম সলভিং করতে করতে গিয়ে মনে হবে, একটু ডেটা স্ট্রাকচার ও অ্যালগরিদম জানলে ভালো হতো। সি দিয়ে ডেটা স্ট্রাকচার ও অ্যালগরিদমের সঙ্গে পরিচিত হওয়ার জন্য আমার লেখা “কম্পিউটার প্রোগ্রামিং ৩য় খণ্ড – ডেটা স্ট্রাকচার ও অ্যালগরিদম পরিচিতি” বইটি পড়তে পারো। বই পড়ার পাশাপাশি ইউটিউবে আমার ভিডিও লেকচারগুলোও কাজে আসবে বলে আমি মনে করি।

ওপরের কাজগুলো ঠিকঠাকভাবে করলে আমি মনে করি সি প্রোগ্রামিং ভাষা দিয়ে প্রোগ্রামিং শেখা – এই পথে তুমি বহুদূর এগিয়ে যাবে। তারপরও কেউ আরেকটি বই পড়তে চাইলে আমি বলব The C Programming Language বইটি পড়ার জন্য।

লিঙ্ক –

Facebook Comments

পাইথন দিয়ে সর্টিং – ২য় পর্ব

পাইথন প্রোগ্রামিং ভাষায় সর্ট করার পদ্ধতি।

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

ধরা যাক, একটি লিস্টে বিভিন্ন ফলের নাম এবং সেই ফল কতগুলো করে আছে, সেটি দেওয়া আছে – fruits = [(‘orange’, 3), (‘apple’, 3), (‘banana’, 2), (‘mango’, 10), (‘guava’, 5)]

এখন এই লিস্টকে আমরা যদি সর্ট করি, তাহলে ফলের নাম অনুসারে সর্ট হয়ে যাবে –

>>> fruits = [('orange', 3), ('apple', 3), ('banana', 2), ('mango', 10), ('guava', 5)]
>>> print(sorted(fruits))
[('apple', 3), ('banana', 2), ('guava', 5), ('mango', 10), ('orange', 3)]

ফলের নাম অনুসারে সর্ট হওয়ার কারণ কী? ফলের সংখ্যা অনুসারেও তো সর্ট হতে পারত। এখানে প্রতিটি টাপলের প্রথম উপাদান সেই টাপলের প্রতিনিধিত্ব করে। যেমন, টাপলে আমরা যদি আগে সংখ্যা লিখতাম, তারপরে ফলের নাম লিখতাম, তাহলে সংখ্যা অনুযায়ী সর্ট হতো।

কিন্তু আমরা যদি চাই, আমাদেরকে যেই লিস্ট দেওয়া আছে সেটি ফলের নাম নয়, বরং সংখ্যা অনুসারে সর্ট করা হবে, তখন কী করতে হবে? প্রতিটি টাপলের দ্বিতীয় উপাদানটি যদি সেই টাপলের প্রতিনিধিত্ব করত, তাহলে কিন্তু আমরা কাঙ্ক্ষিত উপায়ে সর্ট করতে পারতাম। sorted() ফাংশনে key নামে একটি প্যারামিটার আছে, যার মাধ্যমে আমরা বলে দিতে পারি, কোন উপাদানটির ওপর ভিত্তি করে সর্ট করার কাজটি হবে। key-তে আসলে একটি ফাংশন দেওয়া হয়, আর যেই লিস্ট সর্ট করতে হবে, তার প্রতিটি উপাদান সেই ফাংশনের মধ্যে পাঠানো হয়। ফাংশনটি একটি উপাদান রিটার্ন করবে, যার ওপর ভিত্তি করে সর্টিং হবে। তাহলে আমরা এখানে যেই কাজটি করতে চাচ্ছি, সেখানে এমন একটি ফাংশন লিখতে হবে, যা (‘apple’, 3) ইনপুট নিবে আর 3 রিটার্ন করবে।

def compare_fnc(item):
    return item[1]

fruits = [('orange', 3), ('apple', 3), ('banana', 2), ('mango', 10), ('guava', 5)]
print(sorted(fruits, key=compare_fnc))

ওপরের কোড রান করলে দেখা যাবে ফলের সংখ্যা অনুযায়ী ছোট থেকে বড় ক্রমে সর্ট করা হয়ে গিয়েছে।

[('banana', 2), ('orange', 3), ('apple', 3), ('guava', 5), ('mango', 10)]

বড় থেকে ছোট ক্রমে সর্ট করতে চাইলে লিখতে হবে sorted(fruits, key=compare_fnc, reverse=True).

পাইথনে operator মডিউলে একটি ফাংশন আছে itemgetter, যেটি ব্যবহার করে আমরা ওপরের কাজটি আরো সহজে করতে পারি, আমাদের নিজেদের কষ্ট করে ফাংশন তৈরি করতে হবে না।

from operator import itemgetter

fruits = [('orange', 3), ('apple', 3), ('banana', 2), ('mango', 10), ('guava', 5)]
print(sorted(fruits, key=itemgetter(1)))

ওপরের কোডে itemgetter(1) এর বদলে itemgetter(0) লিখলে ফলের নাম অনুযায়ী সর্ট হয়ে যাবে। এখন আমরা যদি চাই, প্রথমে ফলের সংখ্যা অনুযায়ী সর্ট হবে, তারপরে যেসব ফলের সংখ্যা সমান, তাদের মধ্যে নাম অনুযায়ী সর্ট হবে, তাহলে কী করতে হবে? মানে আমাদের আউটপুট (‘orange’, 3′), (‘apple’, 3) ক্রমে না এসে (‘apple’, 3), (‘orange’, 3) ক্রমে আসবে। কাজটি সহজেই করা যায় এভাবে –

>>> fruits = [('orange', 3), ('apple', 3), ('banana', 2), ('mango', 10), ('guava', 5)]
>>> print(sorted(fruits, key=itemgetter(1, 0)))
[('banana', 2), ('apple', 3), ('orange', 3), ('guava', 5), ('mango', 10)]

এখান আমরা itemgetter(1, 0) ব্যবহার করেছি। কিন্তু এখন আমরা যদি চাই, ফলের সংখ্যার বড় থেকে ছোট ক্রমে সর্ট হবে আর যেসব ফলের সংখ্যা সমান, তারা নাম অনুযায়ী ছোট থেকে বড় ক্রমে সর্ট হবে, তখন কী করতে হবে? তাহলে দুইবার সর্ট করার কাজটি করতে হবে –

>>> fruits = [('orange', 3), ('apple', 3), ('banana', 2), ('mango', 10), ('guava', 5)]
>>> print(fruits)
[('orange', 3), ('apple', 3), ('banana', 2), ('mango', 10), ('guava', 5)]
>>> fruits = sorted(fruits, key=itemgetter(0))
>>> print(fruits)
[('apple', 3), ('banana', 2), ('guava', 5), ('mango', 10), ('orange', 3)]
>>> fruits = sorted(fruits, key=itemgetter(1), reverse=True)
>>> print(fruits)
[('mango', 10), ('guava', 5), ('apple', 3), ('orange', 3), ('banana', 2)]

ওপরের পদ্ধতি কাজ করে, কারণ পাইথনের sorted() ফাংশন stable সর্ট করে। sort()-এর ক্ষেত্রেও একই কথা প্রযোজ্য।

Facebook Comments

পাইথন দিয়ে সর্টিং – ১ম পর্ব

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

>>> li = [1, 3, 4, 5, 6, 2, 3]
>>> li.sort()
>>> print(li)
[1, 2, 3, 3, 4, 5, 6]

প্রোগ্রামটি রান করলে দেখা যাচ্ছ যে, লিস্টের সংখ্যাগুলো ছোট থেকে বড় ক্রমে সাজানো হয়ে গিয়েছে। এখন, কেউ যদি চায় যে, সে বড় থেকে ছোট ক্রমে সাজাবে, তাহলে sort() মেথডের ভেতরে reverse নামে একটি প্যারামিটার আছে, সেখানে True পাঠাতে হবে –

>>> li = [1, 3, 4, 5, 6, 2, 3]
>>> li.sort(reverse=True)
>>> print(li)
[6, 5, 4, 3, 3, 2, 1]

একটি স্ট্রিংয়ের লিস্টকেও একইভাবে সর্ট করা যায়। যেমন –

>>> countries = ["Bangladesh", "Japan", "Australia", "Canada", "Singapore"]
>>> countries.sort()
>>> print(countries)
['Australia', 'Bangladesh', 'Canada', 'Japan', 'Singapore']

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

>>> li = [1, 3, 4, 5, 6, 2, 3]
>>> nums = sorted(li)
>>> print(nums)
[1, 2, 3, 3, 4, 5, 6]
>>> print(li)
[1, 3, 4, 5, 6, 2, 3]

sorted() ফাংশনটি কেবল লিস্ট না, অন্য ইটারেবলের (iterable) ওপরও কাজ করে। যেমন, আমরা চাইলে একটি টাপলকে সর্ট করতে পারি। ফলাফল হিসেবে একটি লিস্ট রিটার্ন করা হবে।

>>> tpl = (3, 8, 1, 4, 6, 2)
>>> result = sorted(tpl)
>>> result
[1, 2, 3, 4, 6, 8]
>>> tpl
(3, 8, 1, 4, 6, 2)

sorted() ফাংশনেও উল্টো ক্রমে সর্ট করতে চাইলে reverse প্যারামিটার ব্যবহার করা যাবে।

>>> li = [1, 3, 4, 5, 6, 2, 3]
>>> nums = sorted(li, reverse=True)
>>> print(nums)
[6, 5, 4, 3, 3, 2, 1]
>>> print(li)
[1, 3, 4, 5, 6, 2, 3]

পাইথনের এই বিল্টইন সর্ট করার ফাংশনটিতে আসলে Timsort নামক একটি অ্যালগরিদম ব্যবহার করা হয়।

পাইথনের সর্টিং নিয়ে পরবর্তী লেখায় আমরা আরেকটু জটিল ডেটা স্ট্রাকচার কীভাবে সর্ট করতে হয়, সেটি দেখব।

Facebook Comments

অ্যারে থেকে ডুপ্লিকেট বাদ দেওয়া – প্রোগ্রামিং ইন্টারভিউ সমস্যা ১৬

সমস্যা – একটি অ্যারে দেওয়া থাকবে যার প্রতিটি উপাদান একটি ইন্টিজার এবং অ্যারের সংখ্যাগুলো ছোট থেকে বড় ক্রমে সাজানো আছে। ওই অ্যারেতে যেসব সংখ্যা একাধিকবার আছে, সেসব সংখ্যা একটি রেখে অতিরিক্তগুলো বাদ দিতে হবে। আর এজন্য অতিরিক্ত কোনো অ্যারে ব্যবহার করা যাবে না, অর্থাৎ ইনপুট অ্যারেতেই কাজ করতে হবে। যেমন, ইনপুট যদি হয় [1, 1, 1, 2, 3, 3], তাহলে ডুপ্লিকেট (duplicate)-গুলো বাদ দিলে অ্যারেটি হবে [1, 2, 3, …]. এক্ষেত্রে প্রথম তিনটি সংখ্যার পরে বাকিগুলো কী হবে, সেটি বিবেচনা করা হবে না। আর অ্যারেটি পরিবর্তন করার পরে অ্যারেতে মোট কয়টি উপাদান আছে সেটি রিটার্ন করতে হবে। অর্থাৎ এই ইনপুটের জন্য অ্যারেটি পরিবর্তন করার পরে 3 রিটার্ন করতে হবে।

সমাধান – সমস্যাটিতে যদি বলা হত অতিরিক্ত অ্যারে ব্যবহার করা যাবে, তাহলে আমরা কী করতাম? একটি নতুন অ্যারে তৈরি করে সেখানে সংখ্যাগুলো এমনভাবে রাখতাম যেন কোনো সংখ্যা একবারের বেশি না আসে।

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

def remove_duplicates(nums):
    unique_nums = []
    unique_nums.append(nums[0])
    
    n = len(nums)
    for i in range(1, n):
        if nums[i] != nums[i-1]:
            unique_nums.append(nums[i])

    return len(unique_nums)

প্রোগ্রামটি আরেকভাবে ইমপ্লিমেন্ট করা যায় –

def remove_duplicates(nums):
    unique_nums = list(set(nums))
    unique_nums.sort()
    return len(unique_nums)

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

def remove_duplicates(nums):
    n = len(nums)
    unique_nums = [0] * n
    unique_nums[0] = nums[0]
    current_index = 1
    for i in range(1, n):
        if nums[i] != nums[i-1]:
            unique_nums[current_index] = nums[i]
            current_index += 1

    return current_index

এই ফাংশনটি ভালোভাবে লক্ষ করলে বুঝে ফেলা উচিত যে, unique_nums ব্যবহার না করলেও চলে। বুঝতে না পারলে একটু চিন্তা করতে হবে, তাহলেই বুঝে ফেলা উচিত।

আর ইন্টারভিউতে কিন্তু স্পেশাল কেস ঠিকভাবে হ্যান্ডেল করতে হবে। যেমন, এই প্রোগ্রামে ইনপুট যদি ফাঁকা অ্যারে বা লিস্ট হয়, তখন প্রোগ্রামটা 0 রিটার্ন করার বদলে ক্র্যাশ করবে, এটি ঠিক করতে হবে।

আশা করি নিচের দুটি সমস্যা সমাধান করতে তেমন বেগ পেতে হবে না –

https://leetcode.com/problems/remove-duplicates-from-sorted-array/

https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/

Facebook Comments

একটি লিস্টে দ্বিতীয় লিস্টের সকল উপাদানের উপস্থিতি – প্রোগ্রামিং ইন্টারভিউ সমস্যা ১৫

সহজ প্রোগ্রামিং ইন্টারভিউ সমস্যা।

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

সমাধান – সমাধান খুবই সহজ। দ্বিতীয় লিস্টের প্রতিটি উপাদান প্রথম লিস্টে আছে কী না, সেটি পরীক্ষা করতে হবে। যদি না থাকে, তাহলে False রিটার্ন করতে হবে, আর যদি সব উপাদানই প্রথম লিস্টে পাওয়া যায়, তাহলে True রিটার্ন করতে হবে।

def is_sublist(listA, listB):
    for item in listB:
        if item not in listA:
            return False
    return True

এখন প্রশ্ন হচ্ছে, ওপরের কোডের কমপ্লেক্সিটি কত? অতিরিক্ত কোনো মেমোরি ব্যবহার করা হচ্ছে না, তাই স্পেস কমপ্লেক্সিটি হচ্ছে O(1)। আর টাইম কমপ্লেক্সিটি হচ্ছে O(n * m), যেখানে n হচ্ছে listA-এর উপাদান সংখ্যা আর m হচ্ছে listB-এর উপাদান সংখ্যা। অনেকেই এখানে ভুল করে টাইম কমপ্লেক্সিটি বলবে O(n), কিন্তু item not in listA – এখানে কিন্তু লিস্টের সকল উপাদান পরীক্ষা করতে হতে পারে, তাই শুধু এই কাজটির টাইম কমপ্লেক্সিটি হচ্ছে O(m)।

পরবর্তী প্রশ্ন হচ্ছে, ওপরের কোডটি কীভাবে আরো ইফিশিয়েন্ট করা যায়? এজন্য সেট (set) ব্যবহার করা যেতে পারে। প্রথমে listA-কে সেটে রূপান্তর করতে হবে। তারপরে কোড আগের মতোই। আমি আর এখানে কোড লিখে দেখালাম না, এটি নিজে লিখতে হবে।

লিস্টে যদি n সংখ্যক উপাদান থাকে, তাহলে এটিকে সেটে রূপান্তর করার কমপ্লেক্সিটি হচ্ছে O(n)। আর তারপরে যেই হোড হবে, সেটি ঠিকঠাকমতো লিখলে তার কমপ্লেক্সিটি হবে O(m)। কারণ একটি উপাদান সেটে আছে কী না, সেটি পরীক্ষা করার জন্য O(1) সময় লাগে। তাহলে প্রোগ্রামটির টাইম কমপ্লেক্সিটি হবে O(n) + O(m)। তবে সেট ব্যবহার করায় কিন্তু এই প্রোগ্রামের স্পেস কমপ্লেক্সিটি বেড়ে যাচ্ছে, স্পেস কমপ্লেক্সিটি কত সেটি পাঠকের জন্য কুইজ (কমেন্টে উত্তর দেওয়া যাবে)।

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

Facebook Comments